17 Commits

50 changed files with 609 additions and 1537 deletions

10
.gitignore vendored
View File

@@ -4,15 +4,11 @@
out out
/build /build
/builddir
/build-* /build-*
/subprojects/glfw-* *.log
/subprojects/imgui-* *tar.zst
/subprojects/sdl2-* *tar.gz
/subprojects/freetype-*
/subprojects/libpng-*
/subprojects/packagecache
*.swp *.swp
*.bak *.bak

36
.vscode/launch.json vendored
View File

@@ -5,18 +5,17 @@
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "CLI", "name": "Debug current target",
"type": "cppdbg", "type": "cppdbg",
"request": "launch", "request": "launch",
"program": "${workspaceFolder}/builddir/clrsync_cli", "program": "${command:cmake.launchTargetPath}",
"args": [ "args": [
"--apply", "--apply",
"--theme", "--theme",
"dark" "dark"
], ],
"preLaunchTask": "Build (meson)",
"stopAtEntry": false, "stopAtEntry": false,
"cwd": "${workspaceFolder}/builddir", "cwd": "${workspaceFolder}",
"environment": [], "environment": [],
"externalConsole": false, "externalConsole": false,
"MIMode": "gdb", "MIMode": "gdb",
@@ -33,34 +32,5 @@
} }
] ]
}, },
{
"name": "GUI",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/builddir/clrsync_gui",
"args": [
"--apply",
"--theme",
"dark"
],
"preLaunchTask": "Build (meson)",
"stopAtEntry": false,
"cwd": "${workspaceFolder}/builddir",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
] ]
} }

View File

@@ -1,9 +0,0 @@
{
"C_Cpp.default.compileCommands": "/home/dan/src/clrsync/builddir/compile_commands.json",
"C_Cpp.default.configurationProvider": "mesonbuild.mesonbuild",
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}/builddir",
"--completion-style=detailed",
"--header-insertion=never"
],
}

22
.vscode/tasks.json vendored
View File

@@ -1,22 +0,0 @@
{
"tasks": [
{
"type": "cppbuild",
"label": "Build (meson)",
"command": "meson",
"args": [
"compile",
"-C",
"builddir"
],
"options": {
"cwd": "${workspaceFolder}"
},
"group": {
"kind": "build",
"isDefault": true
},
}
],
"version": "2.0.0"
}

View File

@@ -1,11 +1,19 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
project(clrsync VERSION 0.1.0 LANGUAGES CXX) project(clrsync VERSION 0.1.3 LANGUAGES CXX)
include(GNUInstallDirs) include(GNUInstallDirs)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(WIN32)
set(CMAKE_INSTALL_PREFIX "C:/Program Files/clrsync")
set(CMAKE_INSTALL_BINDIR "bin")
set(CMAKE_INSTALL_LIBDIR "lib")
set(CMAKE_INSTALL_DATADIR "share")
set(CMAKE_INSTALL_FULL_DATADIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}")
endif()
set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
@@ -38,6 +46,11 @@ if(WIN32)
GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_REPOSITORY https://github.com/glfw/glfw.git
GIT_TAG 3.3.10 GIT_TAG 3.3.10
) )
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(glfw) FetchContent_MakeAvailable(glfw)
else() else()
@@ -56,9 +69,10 @@ set(CORE_SOURCES
src/core/theme/theme_template.cpp src/core/theme/theme_template.cpp
) )
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
add_library(clrsync_core SHARED ${CORE_SOURCES}) add_library(clrsync_core SHARED ${CORE_SOURCES})
target_include_directories(clrsync_core PUBLIC src SYSTEM lib) target_include_directories(clrsync_core PUBLIC src SYSTEM lib)
target_compile_definitions(clrsync_core PRIVATE target_compile_definitions(clrsync_core PUBLIC
CLRSYNC_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/clrsync\" CLRSYNC_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/clrsync\"
) )
@@ -79,9 +93,13 @@ set(GUI_SOURCES
src/gui/settings_window.cpp src/gui/settings_window.cpp
src/gui/font_loader.cpp src/gui/font_loader.cpp
) )
add_executable(clrsync_gui ${GUI_SOURCES}) add_executable(clrsync_gui ${GUI_SOURCES})
target_include_directories(clrsync_gui PRIVATE src SYSTEM lib) target_include_directories(clrsync_gui PRIVATE src SYSTEM lib)
# if(WIN32)
# set_target_properties(clrsync_gui PROPERTIES
# LINK_FLAGS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
# )
# endif()
if(WIN32) if(WIN32)
target_link_libraries(clrsync_gui PRIVATE clrsync_core glfw freetype imgui OpenGL::GL) target_link_libraries(clrsync_gui PRIVATE clrsync_core glfw freetype imgui OpenGL::GL)
@@ -117,27 +135,86 @@ target_compile_definitions(imgui PUBLIC IMGUI_ENABLE_FREETYPE)
install(TARGETS clrsync_core install(TARGETS clrsync_core
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT Core
) )
install(TARGETS clrsync_cli install(TARGETS clrsync_cli
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT CLI
) )
install(TARGETS clrsync_gui install(TARGETS clrsync_gui
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT GUI
) )
install(FILES install(FILES
example_config/config.toml example_config/config.toml
DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync
COMPONENT Core
) )
install(DIRECTORY example_config/templates install(DIRECTORY example_config/templates
DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync
COMPONENT Core
FILES_MATCHING PATTERN "*" FILES_MATCHING PATTERN "*"
) )
install(DIRECTORY example_config/palettes install(DIRECTORY example_config/palettes
DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync
COMPONENT Core
FILES_MATCHING PATTERN "*.toml" FILES_MATCHING PATTERN "*.toml"
) )
if(UNIX AND NOT APPLE)
install(FILES resources/clrsync.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
COMPONENT Core
)
endif()
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt")
set(CPACK_COMPONENTS_ALL Core GUI CLI)
set(CPACK_PACKAGE_NAME "clrsync")
set(CPACK_PACKAGE_VENDOR "Daniel Dada")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Color scheme manager")
set(CPACK_COMPONENTS_ALL Core GUI CLI)
set(CPACK_COMPONENT_CORE_DISPLAY_NAME "Core Library")
set(CPACK_COMPONENT_CORE_DESCRIPTION "clrsync core library and default configs (required)")
set(CPACK_COMPONENT_CORE_REQUIRED ON)
set(CPACK_COMPONENT_GUI_DISPLAY_NAME "GUI Application")
set(CPACK_COMPONENT_GUI_DESCRIPTION "clrsync GUI app")
set(CPACK_COMPONENT_GUI_DEPENDS Core)
set(CPACK_COMPONENT_CLI_DISPLAY_NAME "Command Line Tool")
set(CPACK_COMPONENT_CLI_DESCRIPTION "clrsync CLI app")
set(CPACK_COMPONENT_CLI_DEPENDS Core)
set(CPACK_GENERATOR "NSIS;DEB;RPM")
set(CPACK_NSIS_INSTALLED_NAME "clrsync")
set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
set(CPACK_NSIS_MODIFY_PATH ON)
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set(CPACK_NSIS_MENU_LINKS "bin/clrsync_gui.exe" "clrsync")
set(CPACK_NSIS_CREATE_DESKTOP_LINKS "bin/clrsync_gui.exe;clrsync")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Daniel Dada <dan@binarygoose.dev>")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.31), libglfw3, libfreetype6")
set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_RPM_PACKAGE_LICENSE "MIT")
set(CPACK_RPM_PACKAGE_GROUP "Applications/System")
set(CPACK_RPM_PACKAGE_URL "https://github.com/obsqrbtz/clrsync")
set(CPACK_RPM_PACKAGE_REQUIRES "freetype, glfw, fontconfig")
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "CMAKE_INSTALL_FULL_DATADIR: ${CMAKE_INSTALL_FULL_DATADIR}")
include(CPack)

View File

@@ -1,6 +1,6 @@
# Maintainer: Daniel Dada <dan@binarygoose.dev> # Maintainer: Daniel Dada <dan@binarygoose.dev>
pkgname=clrsync pkgname=clrsync
pkgver=0.1.0 pkgver=0.1.3
pkgrel=1 pkgrel=1
pkgdesc="Color scheme manager" pkgdesc="Color scheme manager"
arch=('x86_64') arch=('x86_64')

View File

@@ -2,6 +2,8 @@
A theme management tool for synchronizing color schemes across multiple applications. clrsync allows you to define color palettes once and apply them consistently to all your terminal emulators, editors, and other configurable applications. A theme management tool for synchronizing color schemes across multiple applications. clrsync allows you to define color palettes once and apply them consistently to all your terminal emulators, editors, and other configurable applications.
![Preview](assets/screenshot.png)
## Features ## Features
- **Unified Color Management**: Define color palettes in TOML format and apply them across multiple applications - **Unified Color Management**: Define color palettes in TOML format and apply them across multiple applications
@@ -36,6 +38,7 @@ meson compile -C builddir
## Installation ## Installation
After building, you'll have: After building, you'll have:
- `clrsync_cli` - CLI - `clrsync_cli` - CLI
- `clrsync_gui` - GUI - `clrsync_gui` - GUI
- `libclrsync_core` - Shared lib - `libclrsync_core` - Shared lib
@@ -165,31 +168,37 @@ Access color components using dot notation:
### CLI ### CLI
List available themes: List available themes:
```bash ```bash
clrsync_cli --list-themes clrsync_cli --list-themes
``` ```
Apply the default theme: Apply the default theme:
```bash ```bash
clrsync_cli --apply clrsync_cli --apply
``` ```
Apply a specific theme: Apply a specific theme:
```bash ```bash
clrsync_cli --apply --theme rose-pine clrsync_cli --apply --theme rose-pine
``` ```
Apply a theme from a file path: Apply a theme from a file path:
```bash ```bash
clrsync_cli --apply --path /path/to/theme.toml clrsync_cli --apply --path /path/to/theme.toml
``` ```
Show available color variables: Show available color variables:
```bash ```bash
clrsync_cli --show-vars clrsync_cli --show-vars
``` ```
Use a custom config file: Use a custom config file:
```bash ```bash
clrsync_cli --config /path/to/config.toml --apply clrsync_cli --config /path/to/config.toml --apply
``` ```
@@ -197,26 +206,17 @@ clrsync_cli --config /path/to/config.toml --apply
### GUI ### GUI
Launch the graphical editor: Launch the graphical editor:
```bash ```bash
clrsync_gui clrsync_gui
``` ```
The GUI provides: The GUI provides:
- **Color Scheme Editor**: Visual palette editor with color pickers - **Color Scheme Editor**: Visual palette editor with color pickers
- **Template Editor**: Edit template files - **Template Editor**: Edit template files
- **Live Preview**: See changes in real-time - **Live Preview**: See changes in real-time
## Example Themes
The project includes several pre-configured themes in `example_config/palettes/`:
- `dark.toml`
- `light.toml`
- `flexoki.toml`
- `flexoki-light.toml`
- `rose-pine.toml`
- `rose-pine-moon.toml`
- `rose-pine-dawn.toml`
## Acknowledgments ## Acknowledgments
This project uses the following open-source libraries: This project uses the following open-source libraries:
@@ -226,8 +226,3 @@ This project uses the following open-source libraries:
- **[toml++](https://github.com/marzer/tomlplusplus)** - Header-only TOML config file parser and serializer for C++17 - **[toml++](https://github.com/marzer/tomlplusplus)** - Header-only TOML config file parser and serializer for C++17
- **[argparse](https://github.com/p-ranav/argparse)** - Argument Parser for Modern C++ - **[argparse](https://github.com/p-ranav/argparse)** - Argument Parser for Modern C++
- **[ImGuiColorTextEdit](https://github.com/BalazsJako/ImGuiColorTextEdit)** - Syntax highlighting text editor for ImGui - **[ImGuiColorTextEdit](https://github.com/BalazsJako/ImGuiColorTextEdit)** - Syntax highlighting text editor for ImGui
Special thanks to the creators of the included color schemes:
- **[Flexoki](https://stephango.com/flexoki)** by Steph Ango
- **[Rosé Pine](https://rosepinetheme.com/)** by the Rosé Pine team

BIN
assets/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

View File

@@ -1,5 +1,5 @@
[general] [general]
default_theme = 'dark' default_theme = 'cursed'
palettes_path = '~/.config/clrsync/palettes' palettes_path = '~/.config/clrsync/palettes'
font = 'JetBrainsMono Nerd Font Mono' font = 'JetBrainsMono Nerd Font Mono'
font_size = 14 font_size = 14

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#A6D189FF'
background = '#303446FF'
border_emphasized = '#8CAAEEFF'
border_focused = '#A6D189FF'
border_window = '#51576DFF'
cursor = '#F2D5CFFF'
editor_background = '#303446FF'
error = '#E78284FF'
floating_window_background = '#414559FF'
foreground = '#C6D0F5FF'
foreground_emphasis = '#C6D0F5FF'
foreground_secondary = '#B5BFE2FF'
info = '#8CAAEEFF'
menu_option_background = '#414559FF'
outline = '#51576DFF'
popup_background = '#292C3CFF'
shadow = '#00000080'
sidebar_background = '#292C3CFF'
success = '#A6D189FF'
surface = '#292C3CFF'
surface_variant = '#414559FF'
syntax_error = '#E78284FF'
syntax_function = '#8CAAEEFF'
syntax_keyword = '#CA9EE6FF'
syntax_operator = '#99D1DBFF'
syntax_special_keyword = '#E5C890FF'
term_black = '#51576DFF'
term_black_bright = '#626880FF'
term_blue = '#8CAAEEFF'
term_blue_bright = '#8CAAEEFF'
term_cyan = '#81C8BEFF'
term_cyan_bright = '#81C8BEFF'
term_green = '#A6D189FF'
term_green_bright = '#A6D189FF'
term_magenta = '#F4B8E4FF'
term_magenta_bright = '#F4B8E4FF'
term_red = '#E78284FF'
term_red_bright = '#E78284FF'
term_white = '#B5BFE2FF'
term_white_bright = '#A5ADCEFF'
term_yellow = '#E5C890FF'
term_yellow_bright = '#E5C890FF'
terminal_gray = '#626880FF'
text_command = '#A6D189FF'
text_comment = '#737994FF'
text_disabled = '#737994FF'
text_emphasis = '#C6D0F5FF'
text_error = '#E78284FF'
text_inactive = '#838BA7FF'
text_line_number = '#737994FF'
text_link = '#8CAAEEFF'
text_main = '#C6D0F5FF'
text_selected = '#62688038'
text_selection_inactive = '#51576D38'
text_string = '#A6D189FF'
text_success = '#A6D189FF'
text_warning = '#E5C890FF'
warning = '#EF9F76FF'
warning_emphasis = '#E5C890FF'
[general]
name = 'catppuccin-frappe'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#40A02BFF'
background = '#EFF1F5FF'
border_emphasized = '#1E66F5FF'
border_focused = '#40A02BFF'
border_window = '#CCD0DAFF'
cursor = '#DC8A78FF'
editor_background = '#EFF1F5FF'
error = '#D20F39FF'
floating_window_background = '#E6E9EFFF'
foreground = '#4C4F69FF'
foreground_emphasis = '#4C4F69FF'
foreground_secondary = '#6C6F85FF'
info = '#1E66F5FF'
menu_option_background = '#E6E9EFFF'
outline = '#CCD0DAFF'
popup_background = '#DCE0E8FF'
shadow = '#00000040'
sidebar_background = '#DCE0E8FF'
success = '#40A02BFF'
surface = '#DCE0E8FF'
surface_variant = '#E6E9EFFF'
syntax_error = '#D20F39FF'
syntax_function = '#1E66F5FF'
syntax_keyword = '#8839EFFF'
syntax_operator = '#04A5E5FF'
syntax_special_keyword = '#DF8E1DFF'
term_black = '#5C5F77FF'
term_black_bright = '#6C6F85FF'
term_blue = '#1E66F5FF'
term_blue_bright = '#1E66F5FF'
term_cyan = '#179299FF'
term_cyan_bright = '#179299FF'
term_green = '#40A02BFF'
term_green_bright = '#40A02BFF'
term_magenta = '#EA76CBFF'
term_magenta_bright = '#EA76CBFF'
term_red = '#D20F39FF'
term_red_bright = '#D20F39FF'
term_white = '#4C4F69FF'
term_white_bright = '#4C4F69FF'
term_yellow = '#DF8E1DFF'
term_yellow_bright = '#DF8E1DFF'
terminal_gray = '#9CA0B0FF'
text_command = '#40A02BFF'
text_comment = '#ACB0BEFF'
text_disabled = '#ACB0BEFF'
text_emphasis = '#4C4F69FF'
text_error = '#D20F39FF'
text_inactive = '#8C8FA1FF'
text_line_number = '#ACB0BEFF'
text_link = '#1E66F5FF'
text_main = '#4C4F69FF'
text_selected = '#CCD0DA38'
text_selection_inactive = '#DCE0E838'
text_string = '#40A02BFF'
text_success = '#40A02BFF'
text_warning = '#DF8E1DFF'
warning = '#FE640BFF'
warning_emphasis = '#DF8E1DFF'
[general]
name = 'catppuccin-latte'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#A6DA95FF'
background = '#24273AFF'
border_emphasized = '#8AADF4FF'
border_focused = '#A6DA95FF'
border_window = '#494D64FF'
cursor = '#F4DBD6FF'
editor_background = '#24273AFF'
error = '#ED8796FF'
floating_window_background = '#363A4FFF'
foreground = '#CAD3F5FF'
foreground_emphasis = '#CAD3F5FF'
foreground_secondary = '#B8C0E0FF'
info = '#8AADF4FF'
menu_option_background = '#363A4FFF'
outline = '#494D64FF'
popup_background = '#1E2030FF'
shadow = '#00000080'
sidebar_background = '#1E2030FF'
success = '#A6DA95FF'
surface = '#1E2030FF'
surface_variant = '#363A4FFF'
syntax_error = '#ED8796FF'
syntax_function = '#8AADF4FF'
syntax_keyword = '#C6A0F6FF'
syntax_operator = '#91D7E3FF'
syntax_special_keyword = '#EED49FFF'
term_black = '#494D64FF'
term_black_bright = '#5B6078FF'
term_blue = '#8AADF4FF'
term_blue_bright = '#8AADF4FF'
term_cyan = '#8BD5CAFF'
term_cyan_bright = '#8BD5CAFF'
term_green = '#A6DA95FF'
term_green_bright = '#A6DA95FF'
term_magenta = '#F5BDE6FF'
term_magenta_bright = '#F5BDE6FF'
term_red = '#ED8796FF'
term_red_bright = '#ED8796FF'
term_white = '#B8C0E0FF'
term_white_bright = '#A5ADCBFF'
term_yellow = '#EED49FFF'
term_yellow_bright = '#EED49FFF'
terminal_gray = '#5B6078FF'
text_command = '#A6DA95FF'
text_comment = '#6E738DFF'
text_disabled = '#6E738DFF'
text_emphasis = '#CAD3F5FF'
text_error = '#ED8796FF'
text_inactive = '#8087A2FF'
text_line_number = '#6E738DFF'
text_link = '#8AADF4FF'
text_main = '#CAD3F5FF'
text_selected = '#5B607838'
text_selection_inactive = '#494D6438'
text_string = '#A6DA95FF'
text_success = '#A6DA95FF'
text_warning = '#EED49FFF'
warning = '#F5A97FFF'
warning_emphasis = '#EED49FFF'
[general]
name = 'catppuccin-macchiato'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#A6E3A1FF'
background = '#1E1E2EFF'
border_emphasized = '#89B4FAFF'
border_focused = '#A6E3A1FF'
border_window = '#45475AFF'
cursor = '#F5E0DCFF'
editor_background = '#1E1E2EFF'
error = '#F38BA8FF'
floating_window_background = '#313244FF'
foreground = '#CDD6F4FF'
foreground_emphasis = '#CDD6F4FF'
foreground_secondary = '#BAC2DEFF'
info = '#89B4FAFF'
menu_option_background = '#313244FF'
outline = '#45475AFF'
popup_background = '#181825FF'
shadow = '#00000080'
sidebar_background = '#181825FF'
success = '#A6E3A1FF'
surface = '#181825FF'
surface_variant = '#313244FF'
syntax_error = '#F38BA8FF'
syntax_function = '#89B4FAFF'
syntax_keyword = '#CBA6F7FF'
syntax_operator = '#89DCEBFF'
syntax_special_keyword = '#F9E2AFFF'
term_black = '#45475AFF'
term_black_bright = '#585B70FF'
term_blue = '#89B4FAFF'
term_blue_bright = '#89B4FAFF'
term_cyan = '#94E2D5FF'
term_cyan_bright = '#94E2D5FF'
term_green = '#A6E3A1FF'
term_green_bright = '#A6E3A1FF'
term_magenta = '#F5C2E7FF'
term_magenta_bright = '#F5C2E7FF'
term_red = '#F38BA8FF'
term_red_bright = '#F38BA8FF'
term_white = '#BAC2DEFF'
term_white_bright = '#A6ADC8FF'
term_yellow = '#F9E2AFFF'
term_yellow_bright = '#F9E2AFFF'
terminal_gray = '#585B70FF'
text_command = '#A6E3A1FF'
text_comment = '#6C7086FF'
text_disabled = '#6C7086FF'
text_emphasis = '#CDD6F4FF'
text_error = '#F38BA8FF'
text_inactive = '#7F849CFF'
text_line_number = '#6C7086FF'
text_link = '#89B4FAFF'
text_main = '#CDD6F4FF'
text_selected = '#585B7038'
text_selection_inactive = '#45475A38'
text_string = '#A6E3A1FF'
text_success = '#A6E3A1FF'
text_warning = '#F9E2AFFF'
warning = '#FAB387FF'
warning_emphasis = '#F9E2AFFF'
[general]
name = 'catppuccin-mocha'

View File

@@ -0,0 +1,67 @@
[colors]
# General
background = "#f5f5f5FF"
on_background = "#3d3d2fFF"
surface = "#e8e8e8FF"
on_surface = "#3d3d2fFF"
surface_variant = "#d0d0c8FF"
on_surface_varuant = "#3d3d2fFF"
border_focused = "#c9a305FF"
border = "#d0d0c8FF"
foreground = "#3d3d2fFF"
cursor = "#c9a305FF"
accent = "#b44242FF"
# Terminal
base00 = "#f5f5f5FF"
base01 = "#b44242FF"
base02 = "#95a328FF"
base03 = "#c9a305FF"
base04 = "#60928fFF"
base05 = "#7c435aFF"
base06 = "#a48b4aFF"
base07 = "#3d3d2fFF"
base08 = "#c0c0b8FF"
base09 = "#dc7671FF"
base0A = "#d4d430FF"
base0B = "#9e9052FF"
base0C = "#76c39bFF"
base0D = "#86596cFF"
base0E = "#b89a1fFF"
base0F = "#4f4f48FF"
# Semantic
success = "#95a328FF"
info = "#60928fFF"
warning = "#c9a305FF"
error = "#b44242FF"
on_success = "#f5f5f5FF"
on_info = "#f5f5f5FF"
on_warning = "#f5f5f5FF"
on_error = "#f5f5f5FF"
# Code editor
editor_background = "#f5f5f5FF"
editor_command = "#b89a1fFF"
editor_comment = "#a0a098FF"
editor_disabled = "#c0c0b8FF"
editor_emphasis = "#dc7671FF"
editor_error = "#b44242FF"
editor_inactive = "#a0a098FF"
editor_line_number = "#86596cFF"
editor_link = "#60928fFF"
editor_main = "#3d3d2fFF"
editor_selected = "#d0d0c8FF"
editor_selection_inactive = "#e0e0d8FF"
editor_string = "#5fa37bFF"
editor_success = "#95a328FF"
editor_warning = "#c9a305FF"
[general]
name = 'cursed-light'

View File

@@ -0,0 +1,54 @@
[colors]
accent = '#B44242FF'
background = '#151515FF'
base00 = '#151515FF'
base01 = '#B44242FF'
base02 = '#95A328FF'
base03 = '#E1C135FF'
base04 = '#60928FFF'
base05 = '#7C435AFF'
base06 = '#A48B4AFF'
base07 = '#C2C2B0FF'
base08 = '#3F3639FF'
base09 = '#DC7671FF'
base0A = '#E8E85AFF'
base0B = '#9E9052FF'
base0C = '#76C39BFF'
base0D = '#86596CFF'
base0E = '#CEB34FFF'
base0F = '#B0AFA8FF'
border = '#3F3639FF'
border_focused = '#E1C135FF'
cursor = '#E1C135FF'
editor_background = '#151515FF'
editor_command = '#CEB34FFF'
editor_comment = '#3F3639FF'
editor_disabled = '#3F3639FF'
editor_emphasis = '#DC7671FF'
editor_error = '#B44242FF'
editor_inactive = '#3F3639FF'
editor_line_number = '#86596CFF'
editor_link = '#60928FFF'
editor_main = '#C2C2B0FF'
editor_selected = '#3F3639FF'
editor_selection_inactive = '#2A2A2AFF'
editor_string = '#76C39BFF'
editor_success = '#95A328FF'
editor_warning = '#E1C135FF'
error = '#B44242FF'
foreground = '#C2C2B0FF'
info = '#60928FFF'
on_background = '#C2C2B0FF'
on_error = '#151515FF'
on_info = '#151515FF'
on_success = '#151515FF'
on_surface = '#C2C2B0FF'
on_surface_varuant = '#C2C2B0FF'
on_warning = '#151515FF'
success = '#95A328FF'
surface = '#1C1C1CFF'
surface_variant = '#1C1C1CFF'
warning = '#E1C135FF'
[general]
name = 'cursed'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#00AA56FF'
background = '#111318FF'
border_emphasized = '#5DB2FFFF'
border_focused = '#00AA56FF'
border_window = '#44474FFF'
cursor = '#FFFFFFFF'
editor_background = '#111318FF'
error = '#FF5F5FFF'
floating_window_background = '#282A2FFF'
foreground = '#E2E2E9FF'
foreground_emphasis = '#FFFFFFFF'
foreground_secondary = '#A8ABB3FF'
info = '#5DB2FFFF'
menu_option_background = '#282A2FFF'
outline = '#44474FFF'
popup_background = '#1E1F25FF'
shadow = '#00000080'
sidebar_background = '#1E1F25FF'
success = '#6AD68BFF'
surface = '#1E1F25FF'
surface_variant = '#282A2FFF'
syntax_error = '#FF5F5FFF'
syntax_function = '#86C9FFFF'
syntax_keyword = '#DEBCDFFF'
syntax_operator = '#A8ABB3FF'
syntax_special_keyword = '#FFC966FF'
term_black = '#111318FF'
term_black_bright = '#33353AFF'
term_blue = '#5DB2FFFF'
term_blue_bright = '#86C9FFFF'
term_cyan = '#86C9FFFF'
term_cyan_bright = '#BFEFFFFF'
term_green = '#00AA56FF'
term_green_bright = '#00CC6AFF'
term_magenta = '#DEBCDFFF'
term_magenta_bright = '#F0D6F0FF'
term_red = '#FF5F5FFF'
term_red_bright = '#FFB780FF'
term_white = '#E2E2E9FF'
term_white_bright = '#FFFFFFFF'
term_yellow = '#FFC966FF'
term_yellow_bright = '#FFD580FF'
terminal_gray = '#33353AFF'
text_command = '#00AA56FF'
text_comment = '#44474FFF'
text_disabled = '#44474FFF'
text_emphasis = '#FFFFFFFF'
text_error = '#FF5F5FFF'
text_inactive = '#A8ABB3FF'
text_line_number = '#44474FFF'
text_link = '#5DB2FFFF'
text_main = '#E2E2E9FF'
text_selected = '#FFFFFF1A'
text_selection_inactive = '#A8ABB338'
text_string = '#6AD68BFF'
text_success = '#6AD68BFF'
text_warning = '#FFC966FF'
warning = '#FFC966FF'
warning_emphasis = '#FFD580FF'
[general]
name = 'dark'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#A7C080FF'
background = '#272E33FF'
border_emphasized = '#7FBBB3FF'
border_focused = '#A7C080FF'
border_window = '#475258FF'
cursor = '#D3C6AAFF'
editor_background = '#272E33FF'
error = '#E67E80FF'
floating_window_background = '#3D484DFF'
foreground = '#D3C6AAFF'
foreground_emphasis = '#D3C6AAFF'
foreground_secondary = '#9DA9A0FF'
info = '#7FBBB3FF'
menu_option_background = '#3D484DFF'
outline = '#475258FF'
popup_background = '#2E383CFF'
shadow = '#00000080'
sidebar_background = '#2E383CFF'
success = '#A7C080FF'
surface = '#2E383CFF'
surface_variant = '#3D484DFF'
syntax_error = '#E67E80FF'
syntax_function = '#7FBBB3FF'
syntax_keyword = '#D699B6FF'
syntax_operator = '#83C092FF'
syntax_special_keyword = '#DBBC7FFF'
term_black = '#475258FF'
term_black_bright = '#4F585EFF'
term_blue = '#7FBBB3FF'
term_blue_bright = '#7FBBB3FF'
term_cyan = '#83C092FF'
term_cyan_bright = '#83C092FF'
term_green = '#A7C080FF'
term_green_bright = '#A7C080FF'
term_magenta = '#D699B6FF'
term_magenta_bright = '#D699B6FF'
term_red = '#E67E80FF'
term_red_bright = '#E67E80FF'
term_white = '#D3C6AAFF'
term_white_bright = '#D3C6AAFF'
term_yellow = '#DBBC7FFF'
term_yellow_bright = '#DBBC7FFF'
terminal_gray = '#4F585EFF'
text_command = '#A7C080FF'
text_comment = '#859289FF'
text_disabled = '#859289FF'
text_emphasis = '#D3C6AAFF'
text_error = '#E67E80FF'
text_inactive = '#7A8478FF'
text_line_number = '#859289FF'
text_link = '#7FBBB3FF'
text_main = '#D3C6AAFF'
text_selected = '#543A4838'
text_selection_inactive = '#51404538'
text_string = '#A7C080FF'
text_success = '#A7C080FF'
text_warning = '#DBBC7FFF'
warning = '#E69875FF'
warning_emphasis = '#DBBC7FFF'
[general]
name = 'everforest-dark-hard'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#A7C080FF'
background = '#2D353BFF'
border_emphasized = '#7FBBB3FF'
border_focused = '#A7C080FF'
border_window = '#475258FF'
cursor = '#D3C6AAFF'
editor_background = '#2D353BFF'
error = '#E67E80FF'
floating_window_background = '#3D484DFF'
foreground = '#D3C6AAFF'
foreground_emphasis = '#D3C6AAFF'
foreground_secondary = '#9DA9A0FF'
info = '#7FBBB3FF'
menu_option_background = '#3D484DFF'
outline = '#475258FF'
popup_background = '#343F44FF'
shadow = '#00000080'
sidebar_background = '#343F44FF'
success = '#A7C080FF'
surface = '#343F44FF'
surface_variant = '#3D484DFF'
syntax_error = '#E67E80FF'
syntax_function = '#7FBBB3FF'
syntax_keyword = '#D699B6FF'
syntax_operator = '#83C092FF'
syntax_special_keyword = '#DBBC7FFF'
term_black = '#475258FF'
term_black_bright = '#4F585EFF'
term_blue = '#7FBBB3FF'
term_blue_bright = '#7FBBB3FF'
term_cyan = '#83C092FF'
term_cyan_bright = '#83C092FF'
term_green = '#A7C080FF'
term_green_bright = '#A7C080FF'
term_magenta = '#D699B6FF'
term_magenta_bright = '#D699B6FF'
term_red = '#E67E80FF'
term_red_bright = '#E67E80FF'
term_white = '#D3C6AAFF'
term_white_bright = '#D3C6AAFF'
term_yellow = '#DBBC7FFF'
term_yellow_bright = '#DBBC7FFF'
terminal_gray = '#4F585EFF'
text_command = '#A7C080FF'
text_comment = '#859289FF'
text_disabled = '#859289FF'
text_emphasis = '#D3C6AAFF'
text_error = '#E67E80FF'
text_inactive = '#7A8478FF'
text_line_number = '#859289FF'
text_link = '#7FBBB3FF'
text_main = '#D3C6AAFF'
text_selected = '#543A4838'
text_selection_inactive = '#51404538'
text_string = '#A7C080FF'
text_success = '#A7C080FF'
text_warning = '#DBBC7FFF'
warning = '#E69875FF'
warning_emphasis = '#DBBC7FFF'
[general]
name = 'everforest-dark'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#8DA101FF'
background = '#FFF9E8FF'
border_emphasized = '#3A94C5FF'
border_focused = '#8DA101FF'
border_window = '#E6E2CCFF'
cursor = '#5C6A72FF'
editor_background = '#FFF9E8FF'
error = '#F85552FF'
floating_window_background = '#F4F0D9FF'
foreground = '#5C6A72FF'
foreground_emphasis = '#5C6A72FF'
foreground_secondary = '#939F91FF'
info = '#3A94C5FF'
menu_option_background = '#F4F0D9FF'
outline = '#E6E2CCFF'
popup_background = '#FDFCEEFF'
shadow = '#00000040'
sidebar_background = '#FDFCEEFF'
success = '#8DA101FF'
surface = '#FDFCEEFF'
surface_variant = '#F4F0D9FF'
syntax_error = '#F85552FF'
syntax_function = '#3A94C5FF'
syntax_keyword = '#DF69BAFF'
syntax_operator = '#35A77CFF'
syntax_special_keyword = '#DFA000FF'
term_black = '#E6E2CCFF'
term_black_bright = '#D8CAACFF'
term_blue = '#3A94C5FF'
term_blue_bright = '#3A94C5FF'
term_cyan = '#35A77CFF'
term_cyan_bright = '#35A77CFF'
term_green = '#8DA101FF'
term_green_bright = '#8DA101FF'
term_magenta = '#DF69BAFF'
term_magenta_bright = '#DF69BAFF'
term_red = '#F85552FF'
term_red_bright = '#F85552FF'
term_white = '#5C6A72FF'
term_white_bright = '#5C6A72FF'
term_yellow = '#DFA000FF'
term_yellow_bright = '#DFA000FF'
terminal_gray = '#D8CAACFF'
text_command = '#8DA101FF'
text_comment = '#A6B0A0FF'
text_disabled = '#A6B0A0FF'
text_emphasis = '#5C6A72FF'
text_error = '#F85552FF'
text_inactive = '#939F91FF'
text_line_number = '#A6B0A0FF'
text_link = '#3A94C5FF'
text_main = '#5C6A72FF'
text_selected = '#EAE4D938'
text_selection_inactive = '#F0EBDB38'
text_string = '#8DA101FF'
text_success = '#8DA101FF'
text_warning = '#DFA000FF'
warning = '#F57D26FF'
warning_emphasis = '#DFA000FF'
[general]
name = 'everforest-light'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#66800BFF'
background = '#FFFCF0FF'
border_emphasized = '#205EA6FF'
border_focused = '#66800BFF'
border_window = '#DAD8CEFF'
cursor = '#100F0FFF'
editor_background = '#FFFCF0FF'
error = '#AF3029FF'
floating_window_background = '#F2F0E5FF'
foreground = '#100F0FFF'
foreground_emphasis = '#100F0FFF'
foreground_secondary = '#403E3CFF'
info = '#205EA6FF'
menu_option_background = '#F2F0E5FF'
outline = '#DAD8CEFF'
popup_background = '#F2F0E5FF'
shadow = '#00000040'
sidebar_background = '#F2F0E5FF'
success = '#66800BFF'
surface = '#F2F0E5FF'
surface_variant = '#E6E4D9FF'
syntax_error = '#AF3029FF'
syntax_function = '#205EA6FF'
syntax_keyword = '#5E409DFF'
syntax_operator = '#24837BFF'
syntax_special_keyword = '#AD8301FF'
term_black = '#FFFCF0FF'
term_black_bright = '#6F6E69FF'
term_blue = '#205EA6FF'
term_blue_bright = '#205EA6FF'
term_cyan = '#24837BFF'
term_cyan_bright = '#24837BFF'
term_green = '#66800BFF'
term_green_bright = '#66800BFF'
term_magenta = '#A02F6FFF'
term_magenta_bright = '#A02F6FFF'
term_red = '#AF3029FF'
term_red_bright = '#AF3029FF'
term_white = '#100F0FFF'
term_white_bright = '#100F0FFF'
term_yellow = '#AD8301FF'
term_yellow_bright = '#AD8301FF'
terminal_gray = '#6F6E69FF'
text_command = '#66800BFF'
text_comment = '#878580FF'
text_disabled = '#B7B5ACFF'
text_emphasis = '#100F0FFF'
text_error = '#AF3029FF'
text_inactive = '#6F6E69FF'
text_line_number = '#878580FF'
text_link = '#205EA6FF'
text_main = '#100F0FFF'
text_selected = '#E6E4D938'
text_selection_inactive = '#F2F0E538'
text_string = '#66800BFF'
text_success = '#66800BFF'
text_warning = '#AD8301FF'
warning = '#BC5215FF'
warning_emphasis = '#AD8301FF'
[general]
name = 'flexoki-light'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#879A39FF'
background = '#100F0FFF'
border_emphasized = '#4385BEFF'
border_focused = '#879A39FF'
border_window = '#282726FF'
cursor = '#CECDC3FF'
editor_background = '#100F0FFF'
error = '#D14D41FF'
floating_window_background = '#1C1B1AFF'
foreground = '#CECDC3FF'
foreground_emphasis = '#E6E4D9FF'
foreground_secondary = '#B7B5ACFF'
info = '#4385BEFF'
menu_option_background = '#1C1B1AFF'
outline = '#282726FF'
popup_background = '#1C1B1AFF'
shadow = '#00000080'
sidebar_background = '#1C1B1AFF'
success = '#879A39FF'
surface = '#1C1B1AFF'
surface_variant = '#282726FF'
syntax_error = '#D14D41FF'
syntax_function = '#4385BEFF'
syntax_keyword = '#8B7EC8FF'
syntax_operator = '#3AA99FFF'
syntax_special_keyword = '#D0A215FF'
term_black = '#100F0FFF'
term_black_bright = '#6F6E69FF'
term_blue = '#4385BEFF'
term_blue_bright = '#4385BEFF'
term_cyan = '#3AA99FFF'
term_cyan_bright = '#3AA99FFF'
term_green = '#879A39FF'
term_green_bright = '#879A39FF'
term_magenta = '#CE5D97FF'
term_magenta_bright = '#CE5D97FF'
term_red = '#D14D41FF'
term_red_bright = '#D14D41FF'
term_white = '#CECDC3FF'
term_white_bright = '#E6E4D9FF'
term_yellow = '#D0A215FF'
term_yellow_bright = '#D0A215FF'
terminal_gray = '#6F6E69FF'
text_command = '#879A39FF'
text_comment = '#575653FF'
text_disabled = '#403E3CFF'
text_emphasis = '#E6E4D9FF'
text_error = '#D14D41FF'
text_inactive = '#6F6E69FF'
text_line_number = '#575653FF'
text_link = '#4385BEFF'
text_main = '#CECDC3FF'
text_selected = '#28272638'
text_selection_inactive = '#1C1B1A38'
text_string = '#879A39FF'
text_success = '#879A39FF'
text_warning = '#D0A215FF'
warning = '#DA702CFF'
warning_emphasis = '#D0A215FF'
[general]
name = 'flexoki'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#B8BB26FF'
background = '#282828FF'
border_emphasized = '#83A598FF'
border_focused = '#B8BB26FF'
border_window = '#504945FF'
cursor = '#EBDBB2FF'
editor_background = '#282828FF'
error = '#FB4934FF'
floating_window_background = '#3C3836FF'
foreground = '#EBDBB2FF'
foreground_emphasis = '#FBF1C7FF'
foreground_secondary = '#D5C4A1FF'
info = '#83A598FF'
menu_option_background = '#3C3836FF'
outline = '#504945FF'
popup_background = '#32302FFF'
shadow = '#00000080'
sidebar_background = '#32302FFF'
success = '#B8BB26FF'
surface = '#32302FFF'
surface_variant = '#3C3836FF'
syntax_error = '#FB4934FF'
syntax_function = '#83A598FF'
syntax_keyword = '#D3869BFF'
syntax_operator = '#8EC07CFF'
syntax_special_keyword = '#FABD2FFF'
term_black = '#282828FF'
term_black_bright = '#928374FF'
term_blue = '#458588FF'
term_blue_bright = '#83A598FF'
term_cyan = '#689D6AFF'
term_cyan_bright = '#8EC07CFF'
term_green = '#98971AFF'
term_green_bright = '#B8BB26FF'
term_magenta = '#B16286FF'
term_magenta_bright = '#D3869BFF'
term_red = '#CC241DFF'
term_red_bright = '#FB4934FF'
term_white = '#A89984FF'
term_white_bright = '#EBDBB2FF'
term_yellow = '#D79921FF'
term_yellow_bright = '#FABD2FFF'
terminal_gray = '#928374FF'
text_command = '#B8BB26FF'
text_comment = '#928374FF'
text_disabled = '#665C54FF'
text_emphasis = '#FBF1C7FF'
text_error = '#FB4934FF'
text_inactive = '#7C6F64FF'
text_line_number = '#7C6F64FF'
text_link = '#83A598FF'
text_main = '#EBDBB2FF'
text_selected = '#665C5438'
text_selection_inactive = '#50494538'
text_string = '#B8BB26FF'
text_success = '#B8BB26FF'
text_warning = '#FABD2FFF'
warning = '#FE8019FF'
warning_emphasis = '#FABD2FFF'
[general]
name = 'gruvbox-dark'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#B8BB26FF'
background = '#1D2021FF'
border_emphasized = '#83A598FF'
border_focused = '#B8BB26FF'
border_window = '#504945FF'
cursor = '#EBDBB2FF'
editor_background = '#1D2021FF'
error = '#FB4934FF'
floating_window_background = '#3C3836FF'
foreground = '#EBDBB2FF'
foreground_emphasis = '#FBF1C7FF'
foreground_secondary = '#D5C4A1FF'
info = '#83A598FF'
menu_option_background = '#3C3836FF'
outline = '#504945FF'
popup_background = '#282828FF'
shadow = '#00000080'
sidebar_background = '#282828FF'
success = '#B8BB26FF'
surface = '#282828FF'
surface_variant = '#3C3836FF'
syntax_error = '#FB4934FF'
syntax_function = '#83A598FF'
syntax_keyword = '#D3869BFF'
syntax_operator = '#8EC07CFF'
syntax_special_keyword = '#FABD2FFF'
term_black = '#1D2021FF'
term_black_bright = '#928374FF'
term_blue = '#458588FF'
term_blue_bright = '#83A598FF'
term_cyan = '#689D6AFF'
term_cyan_bright = '#8EC07CFF'
term_green = '#98971AFF'
term_green_bright = '#B8BB26FF'
term_magenta = '#B16286FF'
term_magenta_bright = '#D3869BFF'
term_red = '#CC241DFF'
term_red_bright = '#FB4934FF'
term_white = '#A89984FF'
term_white_bright = '#EBDBB2FF'
term_yellow = '#D79921FF'
term_yellow_bright = '#FABD2FFF'
terminal_gray = '#928374FF'
text_command = '#B8BB26FF'
text_comment = '#928374FF'
text_disabled = '#665C54FF'
text_emphasis = '#FBF1C7FF'
text_error = '#FB4934FF'
text_inactive = '#7C6F64FF'
text_line_number = '#7C6F64FF'
text_link = '#83A598FF'
text_main = '#EBDBB2FF'
text_selected = '#665C5438'
text_selection_inactive = '#50494538'
text_string = '#B8BB26FF'
text_success = '#B8BB26FF'
text_warning = '#FABD2FFF'
warning = '#FE8019FF'
warning_emphasis = '#FABD2FFF'
[general]
name = 'gruvbox-dark-hard'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#79740EFF'
background = '#F9F5D7FF'
border_emphasized = '#076678FF'
border_focused = '#79740EFF'
border_window = '#D5C4A1FF'
cursor = '#282828FF'
editor_background = '#F9F5D7FF'
error = '#9D0006FF'
floating_window_background = '#F2E5BCFF'
foreground = '#3C3836FF'
foreground_emphasis = '#282828FF'
foreground_secondary = '#504945FF'
info = '#076678FF'
menu_option_background = '#F2E5BCFF'
outline = '#D5C4A1FF'
popup_background = '#FBF1C7FF'
shadow = '#00000040'
sidebar_background = '#FBF1C7FF'
success = '#79740EFF'
surface = '#FBF1C7FF'
surface_variant = '#F2E5BCFF'
syntax_error = '#9D0006FF'
syntax_function = '#076678FF'
syntax_keyword = '#8F3F71FF'
syntax_operator = '#427B58FF'
syntax_special_keyword = '#B57614FF'
term_black = '#F9F5D7FF'
term_black_bright = '#928374FF'
term_blue = '#076678FF'
term_blue_bright = '#458588FF'
term_cyan = '#427B58FF'
term_cyan_bright = '#689D6AFF'
term_green = '#79740EFF'
term_green_bright = '#98971AFF'
term_magenta = '#8F3F71FF'
term_magenta_bright = '#B16286FF'
term_red = '#9D0006FF'
term_red_bright = '#CC241DFF'
term_white = '#7C6F64FF'
term_white_bright = '#3C3836FF'
term_yellow = '#B57614FF'
term_yellow_bright = '#D79921FF'
terminal_gray = '#928374FF'
text_command = '#79740EFF'
text_comment = '#928374FF'
text_disabled = '#D5C4A1FF'
text_emphasis = '#282828FF'
text_error = '#9D0006FF'
text_inactive = '#A89984FF'
text_line_number = '#A89984FF'
text_link = '#076678FF'
text_main = '#3C3836FF'
text_selected = '#D5C4A138'
text_selection_inactive = '#EBDBB238'
text_string = '#79740EFF'
text_success = '#79740EFF'
text_warning = '#B57614FF'
warning = '#AF3A03FF'
warning_emphasis = '#B57614FF'
[general]
name = 'gruvbox-light-hard'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#007A35FF'
background = '#FFFFFFFF'
border_emphasized = '#3399FFFF'
border_focused = '#007A35FF'
border_window = '#CCCCCCFF'
cursor = '#111318FF'
editor_background = '#FFFFFFFF'
error = '#D00000FF'
floating_window_background = '#E8E8E8FF'
foreground = '#1E1F25FF'
foreground_emphasis = '#111318FF'
foreground_secondary = '#44474FFF'
info = '#3399FFFF'
menu_option_background = '#E8E8E8FF'
outline = '#CCCCCCFF'
popup_background = '#F5F5F5FF'
shadow = '#000000FF'
sidebar_background = '#F5F5F5FF'
success = '#008833FF'
surface = '#F5F5F5FF'
surface_variant = '#E8E8E8FF'
syntax_error = '#D00000FF'
syntax_function = '#0066CCFF'
syntax_keyword = '#9933CCFF'
syntax_operator = '#44474FFF'
syntax_special_keyword = '#FF9900FF'
term_black = '#111318FF'
term_black_bright = '#888888FF'
term_blue = '#3399FFFF'
term_blue_bright = '#66B2FFFF'
term_cyan = '#0066CCFF'
term_cyan_bright = '#99DDFFFF'
term_green = '#007A35FF'
term_green_bright = '#33CC66FF'
term_magenta = '#9933CCFF'
term_magenta_bright = '#CC99CCFF'
term_red = '#D00000FF'
term_red_bright = '#FF6666FF'
term_white = '#FFFFFFFF'
term_white_bright = '#FFFFFFFF'
term_yellow = '#FF9900FF'
term_yellow_bright = '#FFCC80FF'
terminal_gray = '#CCCCCCFF'
text_command = '#007A35FF'
text_comment = '#888888FF'
text_disabled = '#CCCCCCFF'
text_emphasis = '#111318FF'
text_error = '#D00000FF'
text_inactive = '#44474FFF'
text_line_number = '#888888FF'
text_link = '#3399FFFF'
text_main = '#1E1F25FF'
text_selected = '#D6D6D6FF'
text_selection_inactive = '#888888FF'
text_string = '#008833FF'
text_success = '#008833FF'
text_warning = '#FF9900FF'
warning = '#FF9900FF'
warning_emphasis = '#FFCC80FF'
[general]
name = 'light'

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#286983FF'
background = '#FAF4EDFF'
border_emphasized = '#907AA9FF'
border_focused = '#286983FF'
border_window = '#CECACDFF'
cursor = '#575279FF'
editor_background = '#FAF4EDFF'
error = '#B4637AFF'
floating_window_background = '#F2E9E1FF'
foreground = '#575279FF'
foreground_emphasis = '#111318FF'
foreground_secondary = '#797593FF'
info = '#907AA9FF'
menu_option_background = '#F2E9E1FF'
outline = '#9893A5FF'
popup_background = '#FFFAF3FF'
shadow = '#00000020'
sidebar_background = '#FFFAF3FF'
success = '#286983FF'
surface = '#FFFAF3FF'
surface_variant = '#F2E9E1FF'
syntax_error = '#B4637AFF'
syntax_function = '#907AA9FF'
syntax_keyword = '#D7827EFF'
syntax_operator = '#797593FF'
syntax_special_keyword = '#EA9D34FF'
term_black = '#FAF4EDFF'
term_black_bright = '#DFDAD9FF'
term_blue = '#907AA9FF'
term_blue_bright = '#66B2FFFF'
term_cyan = '#56949FFF'
term_cyan_bright = '#99DDFFFF'
term_green = '#286983FF'
term_green_bright = '#33CC66FF'
term_magenta = '#D7827EFF'
term_magenta_bright = '#CC99CCFF'
term_red = '#B4637AFF'
term_red_bright = '#FF6666FF'
term_white = '#575279FF'
term_white_bright = '#111318FF'
term_yellow = '#EA9D34FF'
term_yellow_bright = '#FFCC80FF'
terminal_gray = '#CCCCCCFF'
text_command = '#286983FF'
text_comment = '#9893A5FF'
text_disabled = '#9893A5FF'
text_emphasis = '#111318FF'
text_error = '#B4637AFF'
text_inactive = '#797593FF'
text_line_number = '#9893A5FF'
text_link = '#907AA9FF'
text_main = '#575279FF'
text_selected = '#DFDAD979'
text_selection_inactive = '#79759338'
text_string = '#286983FF'
text_success = '#286983FF'
text_warning = '#EA9D34FF'
warning = '#EA9D34FF'
warning_emphasis = '#FFD580FF'
[general]
name = 'rose-pine-dawn'

View File

@@ -1,63 +0,0 @@
[general]
name = "rose-pine-moon"
[colors]
accent = "#3e8fb0FF"
background = "#232136FF"
border_emphasized = "#c4a7e7FF"
border_focused = "#3e8fb0FF"
border_window = "#56526eFF"
cursor = "#e0def4FF"
editor_background = "#232136FF"
error = "#eb6f92FF"
floating_window_background = "#393552FF"
foreground = "#e0def4FF"
foreground_emphasis = "#ffffffFF"
foreground_secondary = "#908caaFF"
info = "#c4a7e7FF"
menu_option_background = "#393552FF"
outline = "#6e6a86FF"
popup_background = "#2a273fff"
shadow = "#00000080"
sidebar_background = "#2a273fff"
success = "#3e8fb0FF"
surface = "#2a273fff"
surface_variant = "#393552FF"
syntax_error = "#eb6f92FF"
syntax_function = "#c4a7e7FF"
syntax_keyword = "#ea9a97FF"
syntax_operator = "#908caaFF"
syntax_special_keyword = "#f6c177FF"
term_black = "#232136FF"
term_black_bright = "#44415aFF"
term_blue = "#c4a7e7FF"
term_blue_bright = "#66b2ffff"
term_cyan = "#9ccfd8FF"
term_cyan_bright = "#bfefffff"
term_green = "#3e8fb0FF"
term_green_bright = "#00cc6aff"
term_magenta = "#ea9a97FF"
term_magenta_bright = "#f0d6f0FF"
term_red = "#eb6f92FF"
term_red_bright = "#ffb780FF"
term_white = "#e0def4FF"
term_white_bright = "#ffffffFF"
term_yellow = "#f6c177FF"
term_yellow_bright = "#ffd580FF"
terminal_gray = "#33353AFF"
text_command = "#3e8fb0FF"
text_comment = "#6e6a86FF"
text_disabled = "#6e6a86FF"
text_emphasis = "#ffffffFF"
text_error = "#eb6f92FF"
text_inactive = "#908caaFF"
text_line_number = "#6e6a86FF"
text_link = "#c4a7e7FF"
text_main = "#e0def4FF"
text_selected = "#56526e1A"
text_selection_inactive = "#908caa38"
text_string = "#3e8fb0FF"
text_success = "#3e8fb0FF"
text_warning = "#f6c177FF"
warning = "#f6c177FF"
warning_emphasis = "#ffd580FF"

View File

@@ -1,63 +0,0 @@
[colors]
accent = '#31748FFF'
background = '#191724FF'
border_emphasized = '#C4A7E7FF'
border_focused = '#31748FFF'
border_window = '#524F67FF'
cursor = '#E0DEF4FF'
editor_background = '#191724FF'
error = '#EB6F92FF'
floating_window_background = '#26233AFF'
foreground = '#E0DEF4FF'
foreground_emphasis = '#FFFFFFFF'
foreground_secondary = '#908CAAFF'
info = '#C4A7E7FF'
menu_option_background = '#26233AFF'
outline = '#6E6A86FF'
popup_background = '#1F1D2EFF'
shadow = '#00000080'
sidebar_background = '#1F1D2EFF'
success = '#31748FFF'
surface = '#1F1D2EFF'
surface_variant = '#26233AFF'
syntax_error = '#EB6F92FF'
syntax_function = '#C4A7E7FF'
syntax_keyword = '#EBBCBAFF'
syntax_operator = '#908CAAFF'
syntax_special_keyword = '#F6C177FF'
term_black = '#191724FF'
term_black_bright = '#403D52FF'
term_blue = '#C4A7E7FF'
term_blue_bright = '#C4A7E7FF'
term_cyan = '#9CCFD8FF'
term_cyan_bright = '#9CCFD8FF'
term_green = '#31748FFF'
term_green_bright = '#31748FFF'
term_magenta = '#EBBCBAFF'
term_magenta_bright = '#F0D6F0FF'
term_red = '#EB6F92FF'
term_red_bright = '#EB6F92FF'
term_white = '#E0DEF4FF'
term_white_bright = '#FFFFFFFF'
term_yellow = '#F6C177FF'
term_yellow_bright = '#F6C177FF'
terminal_gray = '#33353AFF'
text_command = '#31748FFF'
text_comment = '#6E6A86FF'
text_disabled = '#6E6A86FF'
text_emphasis = '#FFFFFFFF'
text_error = '#EB6F92FF'
text_inactive = '#908CAAFF'
text_line_number = '#6E6A86FF'
text_link = '#C4A7E7FF'
text_main = '#E0DEF4FF'
text_selected = '#524F671A'
text_selection_inactive = '#908CAA38'
text_string = '#31748FFF'
text_success = '#31748FFF'
text_warning = '#F6C177FF'
warning = '#F6C177FF'
warning_emphasis = '#F6C177FF'
[general]
name = 'rose-pine'

View File

@@ -1,36 +1,36 @@
# BASE COLORS (raw) # BASE COLORS (raw)
color1.raw {term_red} color1.raw {base01}
# HEX # HEX
color1.hex {term_red.hex} color1.hex {base01.hex}
color1.hex.stripped {term_red.hex_stripped} color1.hex.stripped {base01.hex_stripped}
color1.hexa {term_red.hexa} color1.hexa {base01.hexa}
color1.hexa.stripped {term_red.hexa_stripped} color1.hexa.stripped {base01.hexa_stripped}
# RGB (0255) # RGB (0255)
color1.rgb {term_red.rgb} color1.rgb {base01.rgb}
color1.r {term_red.r} color1.r {base01.r}
color1.g {term_red.g} color1.g {base01.g}
color1.b {term_red.b} color1.b {base01.b}
# RGBA (A = 01 normalized) # RGBA (A = 01 normalized)
color1.rgba {term_red.rgba} color1.rgba {base01.rgba}
color1.a {term_red.a} color1.a {base01.a}
# HSL (normalized 01 for s,l, integers for h) # HSL (normalized 01 for s,l, integers for h)
color1.hsl {term_red.hsl} color1.hsl {base01.hsl}
color1.h {term_red.h} color1.h {base01.h}
color1.s {term_red.s} color1.s {base01.s}
color1.l {term_red.l} color1.l {base01.l}
# HSLA # HSLA
color1.hsla {term_red.hsla} color1.hsla {base01.hsla}
color1.hsla_a {term_red.hsla_a} color1.hsla_a {base01.hsla_a}
# Combined custom formats # Combined custom formats
color1.r-g-b {term_red.r}-{term_red.g}-{term_red.b} color1.r-g-b {base01.r}-{base01.g}-{base01.b}
color1.r-g-b-a {term_red.r}-{term_red.g}-{term_red.b}-{term_red.a} color1.r-g-b-a {base01.r}-{base01.g}-{base01.b}-{base01.a}
color1.h-s-l {term_red.h}-{term_red.s}-{term_red.l} color1.h-s-l {base01.h}-{base01.s}-{base01.l}
color1.h-s-l-a {term_red.h}-{term_red.s}-{term_red.l}-{term_red.hsla_a} color1.h-s-l-a {base01.h}-{base01.s}-{base01.l}-{base01.hsla_a}

View File

@@ -1,32 +1,40 @@
cursor {foreground} cursor {cursor}
cursor_text_color {background} cursor_text_color {background}
foreground {foreground} foreground {foreground}
background {background} background {background}
selection_foreground {foreground_secondary} selection_foreground {on_surface}
selection_background {surface} selection_background {surface}
url_color {accent} url_color {accent}
color8 {surface_variant} # Base colors (dark variants)
color0 {background} color0 {base00}
color8 {base08}
color1 {term_red} # Red
color9 {term_red_bright} color1 {base01}
color9 {base09}
color2 {term_green} # Green
color10 {term_green_bright} color2 {base02}
color10 {base0A}
color3 {term_yellow} # Yellow
color11 {term_yellow_bright} color3 {base03}
color11 {base0B}
color4 {term_blue} # Blue
color12 {term_blue_bright} color4 {base04}
color12 {base0C}
color5 {term_magenta} # Magenta
color13 {term_magenta_bright} color5 {base05}
color13 {base0D}
color6 {term_cyan} # Cyan
color14 {term_cyan_bright} color6 {base06}
color14 {base0E}
color15 {term_white_bright} # White
color7 {term_white} color7 {base07}
color15 {base0F}

View File

@@ -3,33 +3,39 @@ vim.cmd("syntax reset")
vim.g.colors_name = "clrsync" vim.g.colors_name = "clrsync"
local palette = { local palette = {
-- TextEditor -- Editor colors
Default = "{text_main.hex}", Default = "{editor_main.hex}",
Keyword = "{syntax_keyword.hex}", Keyword = "{editor_command.hex}",
Number = "{text_warning.hex}", Number = "{editor_warning.hex}",
String = "{text_string.hex}", String = "{editor_string.hex}",
CharLiteral = "{text_string.hex}", CharLiteral = "{editor_string.hex}",
Punctuation = "{text_main.hex}", Punctuation = "{editor_main.hex}",
Preprocessor = "{syntax_special_keyword.hex}", Preprocessor = "{editor_emphasis.hex}",
Identifier = "{text_main.hex}", Identifier = "{editor_main.hex}",
KnownIdentifier = "{text_link.hex}", KnownIdentifier = "{editor_link.hex}",
PreprocIdentifier = "{text_link.hex}", PreprocIdentifier = "{editor_link.hex}",
Comment = "{text_comment.hex}", Comment = "{editor_comment.hex}",
MultiLineComment = "{text_comment.hex}", MultiLineComment = "{editor_comment.hex}",
Background = "{editor_background.hex}", Background = "{editor_background.hex}",
Cursor = "{cursor.hex}", Cursor = "{cursor.hex}",
Selection = "{text_selected.hex}", Selection = "{editor_selected.hex}",
ErrorMarker = "{syntax_error.hex}", ErrorMarker = "{editor_error.hex}",
Breakpoint = "{syntax_error.hex}", Breakpoint = "{editor_error.hex}",
LineNumber = "{text_line_number.hex}", LineNumber = "{editor_line_number.hex}",
CurrentLineFill = "{surface_variant.hex}", CurrentLineFill = "{surface_variant.hex}",
CurrentLineFillInactive = "{surface.hex}", CurrentLineFillInactive = "{surface.hex}",
CurrentLineEdge = "{border_emphasized.hex}", CurrentLineEdge = "{border_focused.hex}",
-- Semantic colors
Success = "{success.hex}",
Warning = "{warning.hex}",
Error = "{error.hex}",
Info = "{info.hex}",
} }
-- Helper function to set highlights in Neovim -- Helper function to set highlights in Neovim
@@ -59,7 +65,7 @@ set_hl("Type", { fg = palette.Keyword })
set_hl("Special", { fg = palette.PreprocIdentifier }) set_hl("Special", { fg = palette.PreprocIdentifier })
set_hl("Underlined", { fg = palette.KnownIdentifier }) set_hl("Underlined", { fg = palette.KnownIdentifier })
set_hl("Error", { fg = palette.ErrorMarker, bg = palette.Background }) set_hl("Error", { fg = palette.ErrorMarker, bg = palette.Background })
set_hl("Todo", { fg = palette.Text, bg = palette.Keyword }) set_hl("Todo", { fg = palette.Default, bg = palette.Keyword })
-- Floating windows -- Floating windows
set_hl("NormalFloat", { bg = palette.Background }) set_hl("NormalFloat", { bg = palette.Background })
@@ -70,12 +76,12 @@ set_hl("Pmenu", { bg = palette.Background })
set_hl("PmenuSel", { bg = palette.Keyword, fg = palette.Background }) set_hl("PmenuSel", { bg = palette.Keyword, fg = palette.Background })
-- Git and diagnostic highlights -- Git and diagnostic highlights
set_hl("DiffAdd", { fg = palette.Success or palette.Default, bg = palette.Background }) set_hl("DiffAdd", { fg = palette.Success, bg = palette.Background })
set_hl("DiffChange", { fg = palette.Keyword, bg = palette.Background }) set_hl("DiffChange", { fg = palette.Keyword, bg = palette.Background })
set_hl("DiffDelete", { fg = palette.ErrorMarker, bg = palette.Background }) set_hl("DiffDelete", { fg = palette.ErrorMarker, bg = palette.Background })
set_hl("DiagnosticError", { fg = palette.ErrorMarker }) set_hl("DiagnosticError", { fg = palette.Error })
set_hl("DiagnosticWarn", { fg = palette.Number }) set_hl("DiagnosticWarn", { fg = palette.Warning })
set_hl("DiagnosticInfo", { fg = palette.Keyword }) set_hl("DiagnosticInfo", { fg = palette.Info })
set_hl("DiagnosticHint", { fg = palette.PreprocIdentifier }) set_hl("DiagnosticHint", { fg = palette.PreprocIdentifier })
-- Treesitter links -- Treesitter links

View File

@@ -1,107 +0,0 @@
project('clrsync', 'cpp',
version : '0.1.0',
default_options : [
'cpp_std=c++20',
'buildtype=debug',
],
)
imgui_dep = dependency('imgui-docking',
fallback : ['imgui-docking', 'imgui_dep'],
default_options : [
'default_library=static',
'opengl=enabled',
'glfw=enabled',
]
)
imgui_dep = declare_dependency(
compile_args: ['-DIMGUI_ENABLE_FREETYPE'],
dependencies: [imgui_dep]
)
glfw_dep = dependency('glfw3', fallback : ['glfw', 'glfw_dep'])
gl_dep = dependency('gl')
freetype_dep = dependency('freetype2')
inc_dirs = include_directories('src')
lib_inc_dirs = include_directories('lib')
cpp_args = []
if host_machine.system() == 'windows'
compiler = meson.get_compiler('cpp')
if compiler.get_id() == 'msvc'
cpp_args += ['/EHsc']
endif
endif
core_sources = [
'src/core/palette/color.cpp',
'src/core/io/toml_file.cpp',
'src/core/config/config.cpp',
'src/core/utils.cpp',
'src/core/version.cpp',
'src/core/theme/theme_template.cpp',
]
text_edit_sources = [
'lib/color_text_edit/TextEditor.cpp',
]
clrsync_core = static_library(
'clrsync_core',
core_sources,
include_directories : [inc_dirs, lib_inc_dirs],
cpp_args : cpp_args,
)
clrsync_core_dep = declare_dependency(
link_with : clrsync_core,
include_directories : [inc_dirs, lib_inc_dirs],
)
clrsync_cli = executable(
'clrsync_cli',
'src/cli/main.cpp',
include_directories : [inc_dirs, lib_inc_dirs],
link_with : clrsync_core,
cpp_args : cpp_args,
)
gui_sources = [
'src/gui/main.cpp',
'src/gui/color_scheme_editor.cpp',
'src/gui/template_editor.cpp',
'src/gui/palette_controller.cpp',
'src/gui/template_controller.cpp',
'src/gui/imgui_helpers.cpp',
'src/gui/about_window.cpp',
'src/gui/settings_window.cpp',
'src/gui/font_loader.cpp',
]
clrsync_gui_link_args = []
fontconfig_dep = dependency('', required : false)
if host_machine.system() == 'linux'
fontconfig_dep = dependency('fontconfig', required : true)
clrsync_gui_link_args += ['-lX11', '-lXrandr', '-lXi']
endif
clrsync_gui = executable(
'clrsync_gui',
gui_sources,
text_edit_sources,
include_directories : [inc_dirs, lib_inc_dirs],
dependencies : [
clrsync_core_dep,
imgui_dep,
freetype_dep,
glfw_dep,
gl_dep,
fontconfig_dep,
],
cpp_args : cpp_args,
link_args : clrsync_gui_link_args
)

11
resources/clrsync.desktop Normal file
View File

@@ -0,0 +1,11 @@
[Desktop Entry]
Name=clrsync
GenericName=Color Scheme Manager
Comment=Manage and apply color schemes across applications
Exec=clrsync_gui
Icon=colorsync
Terminal=false
Type=Application
Categories=Graphics;Utility;
Keywords=color;theme;palette;scheme;
StartupNotify=true

View File

@@ -1,9 +1,14 @@
#include "config.hpp" #include "config.hpp"
#include "core/utils.hpp"
#include <core/palette/color.hpp> #include <core/palette/color.hpp>
#include <filesystem> #include <filesystem>
#include <stdexcept> #include <stdexcept>
#ifdef _WIN32
#include "windows.h"
#endif
namespace clrsync::core namespace clrsync::core
{ {
config &config::instance() config &config::instance()
@@ -23,35 +28,53 @@ void config::initialize(std::unique_ptr<clrsync::core::io::file> file)
std::filesystem::path config::get_user_config_dir() std::filesystem::path config::get_user_config_dir()
{ {
auto home = expand_user("~");
#ifdef _WIN32 #ifdef _WIN32
if (const char *appdata = std::getenv("APPDATA")) return home + "\\.config\\clrsync";
return fs::path(appdata) / "clrsync";
else
return fs::path("C:/clrsync");
#else #else
if (const char *xdg = std::getenv("XDG_CONFIG_HOME")) return home + "/.config/clrsync";
return std::filesystem::path(xdg) / "clrsync"; #endif
else if (const char *home = std::getenv("HOME")) }
return std::filesystem::path(home) / ".config/clrsync";
else std::filesystem::path config::get_data_dir()
return std::filesystem::path("/tmp/clrsync"); {
if (std::filesystem::exists(CLRSYNC_DATADIR))
return {CLRSYNC_DATADIR};
#ifdef _WIN32
char buffer[MAX_PATH];
GetModuleFileNameA(nullptr, buffer, MAX_PATH);
std::filesystem::path exe_path(buffer);
std::filesystem::path data_dir = exe_path.parent_path().parent_path() / "share" / "clrsync";
return data_dir;
#else
if (std::filesystem::exists("/usr/share/clrsync"))
return {"/usr/share/clrsync"};
if (std::filesystem::exists("/usr/local/share/clrsync"))
return {"/usr/local/share/clrsync"};
return {};
#endif #endif
} }
void config::copy_default_configs() void config::copy_default_configs()
{ {
std::filesystem::path user_config = get_user_config_dir(); std::filesystem::path user_config = get_user_config_dir();
std::filesystem::path default_dir = get_data_dir();
if (!std::filesystem::exists(user_config)) if (!std::filesystem::exists(user_config))
{ {
std::filesystem::create_directories(user_config); std::filesystem::create_directories(user_config);
std::filesystem::path default_dir = CLRSYNC_DATADIR;
std::filesystem::copy(default_dir / "config.toml", user_config / "config.toml"); std::filesystem::copy(default_dir / "config.toml", user_config / "config.toml");
std::filesystem::copy(default_dir / "templates", user_config / "templates", std::filesystem::copy(default_dir / "templates", user_config / "templates",
std::filesystem::copy_options::recursive); std::filesystem::copy_options::recursive);
std::filesystem::copy(default_dir / "palettes", user_config / "palettes", std::filesystem::copy(default_dir / "palettes", user_config / "palettes",
std::filesystem::copy_options::recursive); std::filesystem::copy_options::recursive);
return;
}
if (!std::filesystem::exists(user_config / "config.toml"))
{
std::filesystem::copy(default_dir / "config.toml", user_config / "config.toml");
} }
} }

View File

@@ -32,6 +32,7 @@ class config
void update_template(const std::string &key, void update_template(const std::string &key,
const clrsync::core::theme_template &theme_template); const clrsync::core::theme_template &theme_template);
static std::filesystem::path get_data_dir();
private: private:
config() = default; config() = default;

View File

@@ -6,49 +6,70 @@
namespace clrsync::core namespace clrsync::core
{ {
constexpr const char* COLOR_KEYS[] = { constexpr const char* COLOR_KEYS[] = {
// UI / Surfaces // General UI
"background", // main window / editor background "background",
"surface", // panels, cards "on_background",
"surface_variant", // alternate rows, subtle panels
"foreground", // main text
"foreground_secondary", // secondary text / hints
"accent", // buttons, highlights, selection
"outline", // borders, outlines
"shadow", // drop shadows / depth
"cursor", // caret / text cursor
// Editor-specific surfaces "surface",
"editor_background", "sidebar_background", "popup_background", "floating_window_background", "on_surface",
"menu_option_background",
// Editor text roles "surface_variant",
"text_main", "text_emphasis", "text_command", "text_inactive", "text_disabled", "on_surface_varuant",
"text_line_number", "text_selected", "text_selection_inactive",
// Editor / Window borders "border_focused",
"border_window", "border_focused", "border_emphasized", "border",
// Syntax highlighting "foreground",
"syntax_function", "syntax_error", "syntax_keyword", "syntax_special_keyword",
"syntax_operator",
// Semantic text colors "cursor",
"text_error", "text_warning", "text_link", "text_comment", "text_string", "text_success", "accent",
"warning_emphasis", "foreground_emphasis",
// Extra // Semantic
"terminal_gray", "success",
"info",
"warning",
"error",
// Semantic / Status "on_success",
"error", "warning", "success", "info", "on_info",
"on_warning",
"on_error",
// Terminal colors (normal) // Editor
"term_black", "term_red", "term_green", "term_yellow", "term_blue", "term_magenta", "term_cyan", "editor_background",
"term_white", "editor_command",
"editor_comment",
"editor_disabled",
"editor_emphasis",
"editor_error",
"editor_inactive",
"editor_line_number",
"editor_link",
"editor_main",
"editor_selected",
"editor_selection_inactive",
"editor_string",
"editor_success",
"editor_warning",
// Terminal colors (bright) // Terminal
"term_black_bright", "term_red_bright", "term_green_bright", "term_yellow_bright", "base00",
"term_blue_bright", "term_magenta_bright", "term_cyan_bright", "term_white_bright"}; "base01",
"base02",
"base03",
"base04",
"base05",
"base06",
"base07",
"base08",
"base09",
"base0A",
"base0B",
"base0C",
"base0D",
"base0E",
"base0F",
};
constexpr size_t NUM_COLOR_KEYS = std::size(COLOR_KEYS); constexpr size_t NUM_COLOR_KEYS = std::size(COLOR_KEYS);
} // namespace clrsync::core } // namespace clrsync::core

View File

@@ -2,6 +2,7 @@
#define CLRSYNC_CORE_PALETTE_PALETTE_MANAGER_HPP #define CLRSYNC_CORE_PALETTE_PALETTE_MANAGER_HPP
#include "core/utils.hpp" #include "core/utils.hpp"
#include <iostream>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@@ -19,6 +20,11 @@ template <typename FileType> class palette_manager
void load_palettes_from_directory(const std::string &directory_path) void load_palettes_from_directory(const std::string &directory_path)
{ {
auto directory_path_expanded = expand_user(directory_path); auto directory_path_expanded = expand_user(directory_path);
if (!std::filesystem::exists(directory_path_expanded))
{
std::cerr << "Palettes directory does not exist\n" ;
return;
}
for (const auto &entry : std::filesystem::directory_iterator(directory_path_expanded)) for (const auto &entry : std::filesystem::directory_iterator(directory_path_expanded))
{ {
if (entry.is_regular_file()) if (entry.is_regular_file())

View File

@@ -1,8 +1,8 @@
#include "theme_template.hpp" #include "theme_template.hpp"
#include "core/utils.hpp" #include "core/utils.hpp"
#include <filesystem> #include <filesystem>
#include <format>
#include <fstream> #include <fstream>
#include <iostream>
namespace clrsync::core namespace clrsync::core
{ {
@@ -45,6 +45,11 @@ void theme_template::set_output_path(const std::string &path)
void theme_template::load_template() void theme_template::load_template()
{ {
if (!std::filesystem::exists(m_template_path))
{
std::cerr << "Template file '" << m_template_path << "' is missing\n";
return;
}
std::ifstream input(m_template_path, std::ios::binary); std::ifstream input(m_template_path, std::ios::binary);
if (!input) if (!input)
throw std::runtime_error("Failed to open template file: " + m_template_path); throw std::runtime_error("Failed to open template file: " + m_template_path);

View File

@@ -13,16 +13,12 @@ void print_color_keys()
std::string get_default_config_path() std::string get_default_config_path()
{ {
auto home = expand_user("~");
#ifdef _WIN32 #ifdef _WIN32
const char *appdata = std::getenv("APPDATA"); // "C:\Users\<User>\AppData\Roaming" return home + "\\.config\\clrsync\\config.toml";
if (!appdata)
throw std::runtime_error("APPDATA environment variable not set");
return std::string(appdata) + "\\clrsync\\config.toml";
#else #else
const char *home = std::getenv("HOME"); return home + "/.config/clrsync/config.toml";
if (!home)
throw std::runtime_error("HOME environment variable not set");
return std::string(home) + "/.config/clrsync/config.toml";
#endif #endif
} }

View File

@@ -9,7 +9,7 @@ namespace clrsync::core
constexpr uint8_t VERSION_MAJOR = 0; constexpr uint8_t VERSION_MAJOR = 0;
constexpr uint8_t VERSION_MINOR = 1; constexpr uint8_t VERSION_MINOR = 1;
constexpr uint8_t VERSION_PATCH = 0; constexpr uint8_t VERSION_PATCH = 3;
const std::string version_string(); const std::string version_string();
} // namespace clrsync::core } // namespace clrsync::core

View File

@@ -2,6 +2,7 @@
#include "template_editor.hpp" #include "template_editor.hpp"
#include "color_text_edit/TextEditor.h" #include "color_text_edit/TextEditor.h"
#include "imgui.h" #include "imgui.h"
#include <iostream>
#include <ranges> #include <ranges>
color_scheme_editor::color_scheme_editor() color_scheme_editor::color_scheme_editor()
@@ -71,9 +72,21 @@ int main()
})"); })");
m_editor.SetShowWhitespaces(false); m_editor.SetShowWhitespaces(false);
const auto &palettes = m_controller.palettes();
const auto &current = m_controller.current_palette();
if (!current.colors().empty())
{
apply_palette_to_imgui(); apply_palette_to_imgui();
apply_palette_to_editor(); apply_palette_to_editor();
} }
else
{
std::cout << "WARNING: No palette loaded, skipping theme application\n";
}
}
void color_scheme_editor::notify_palette_changed() void color_scheme_editor::notify_palette_changed()
{ {
@@ -159,6 +172,7 @@ void color_scheme_editor::render_controls()
apply_palette_to_imgui(); apply_palette_to_imgui();
apply_palette_to_editor(); apply_palette_to_editor();
notify_palette_changed(); notify_palette_changed();
m_controller.select_palette(new_palette_name_buf);
new_palette_name_buf[0] = 0; new_palette_name_buf[0] = 0;
} }
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
@@ -290,40 +304,37 @@ void color_scheme_editor::render_color_table()
ImGui::Spacing(); ImGui::Spacing();
}; };
draw_table("UI / Surfaces", {"background", "surface", "surface_variant", "foreground", draw_table("General UI", {"background", "on_background", "surface", "on_surface",
"foreground_secondary", "accent", "outline", "shadow", "cursor"}); "surface_variant", "on_surface_varuant", "foreground",
"cursor", "accent"});
draw_table("Editor Surfaces", {"editor_background", "sidebar_background", "popup_background", draw_table("Borders", {"border_focused", "border"});
"floating_window_background", "menu_option_background"});
draw_table("Editor Text", draw_table("Semantic Colors", {"success", "info", "warning", "error",
{"text_main", "text_emphasis", "text_command", "text_inactive", "text_disabled", "on_success", "on_info", "on_warning", "on_error"});
"text_line_number", "text_selected", "text_selection_inactive"});
draw_table("Window Borders", {"border_window", "border_focused", "border_emphasized"}); draw_table("Editor", {"editor_background", "editor_command", "editor_comment",
"editor_disabled", "editor_emphasis", "editor_error",
"editor_inactive", "editor_line_number", "editor_link",
"editor_main", "editor_selected", "editor_selection_inactive",
"editor_string", "editor_success", "editor_warning"});
draw_table("Syntax Highlighting", {"syntax_function", "syntax_error", "syntax_keyword", draw_table("Terminal (Base16)", {"base00", "base01", "base02", "base03",
"syntax_special_keyword", "syntax_operator"}); "base04", "base05", "base06", "base07",
"base08", "base09", "base0A", "base0B",
draw_table("Semantic Text", "base0C", "base0D", "base0E", "base0F"});
{"text_error", "text_warning", "text_link", "text_comment", "text_string",
"text_success", "warning_emphasis", "foreground_emphasis"});
draw_table("Extra", {"terminal_gray"});
draw_table("Status Colors", {"error", "warning", "success", "info"});
draw_table("Terminal Colors",
{"term_black", "term_red", "term_green", "term_yellow", "term_blue", "term_magenta",
"term_cyan", "term_white", "term_black_bright", "term_red_bright",
"term_green_bright", "term_yellow_bright", "term_blue_bright",
"term_magenta_bright", "term_cyan_bright", "term_white_bright"});
} }
void color_scheme_editor::render_preview_content() void color_scheme_editor::render_preview_content()
{ {
const auto &current = m_controller.current_palette(); const auto &current = m_controller.current_palette();
if (current.colors().empty())
{
ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), "Current palette is empty");
return;
}
auto get_color = [&](const std::string &key) -> ImVec4 { auto get_color = [&](const std::string &key) -> ImVec4 {
auto it = current.colors().find(key); auto it = current.colors().find(key);
if (it != current.colors().end()) if (it != current.colors().end())
@@ -339,7 +350,7 @@ void color_scheme_editor::render_preview_content()
const ImVec4 editor_bg = get_color("editor_background"); const ImVec4 editor_bg = get_color("editor_background");
const ImVec4 fg = get_color("foreground"); const ImVec4 fg = get_color("foreground");
const ImVec4 accent = get_color("accent"); const ImVec4 accent = get_color("accent");
const ImVec4 outline = get_color("outline"); const ImVec4 border = get_color("border");
const ImVec4 error = get_color("error"); const ImVec4 error = get_color("error");
const ImVec4 warning = get_color("warning"); const ImVec4 warning = get_color("warning");
const ImVec4 success = get_color("success"); const ImVec4 success = get_color("success");
@@ -357,7 +368,7 @@ void color_scheme_editor::render_preview_content()
ImGui::PushStyleColor(ImGuiCol_ChildBg, editor_bg); ImGui::PushStyleColor(ImGuiCol_ChildBg, editor_bg);
ImGui::BeginChild("TerminalPreview", ImVec2(0, 0), true); ImGui::BeginChild("TerminalPreview", ImVec2(0, 0), true);
ImGui::PushStyleColor(ImGuiCol_Border, outline); ImGui::PushStyleColor(ImGuiCol_Border, border);
struct term_line struct term_line
{ {
@@ -385,9 +396,16 @@ void color_scheme_editor::render_preview_content()
void color_scheme_editor::apply_palette_to_editor() void color_scheme_editor::apply_palette_to_editor()
{ {
const auto &current = m_controller.current_palette(); const auto &current = m_controller.current_palette();
if (current.colors().empty())
return;
auto get_color_u32 = [&](const std::string &key) -> uint32_t { auto get_color_u32 = [&](const std::string &key, const std::string &fallback = "") -> uint32_t {
auto it = current.colors().find(key); auto it = current.colors().find(key);
if (it == current.colors().end() && !fallback.empty())
{
it = current.colors().find(fallback);
}
if (it != current.colors().end()) if (it != current.colors().end())
{ {
const auto &col = it->second; const auto &col = it->second;
@@ -404,32 +422,32 @@ void color_scheme_editor::apply_palette_to_editor()
auto palette = m_editor.GetPalette(); auto palette = m_editor.GetPalette();
palette[int(TextEditor::PaletteIndex::Default)] = get_color_u32("text_main"); palette[int(TextEditor::PaletteIndex::Default)] = get_color_u32("editor_main");
palette[int(TextEditor::PaletteIndex::Keyword)] = get_color_u32("syntax_keyword"); palette[int(TextEditor::PaletteIndex::Keyword)] = get_color_u32("editor_command");
palette[int(TextEditor::PaletteIndex::Number)] = get_color_u32("text_warning"); palette[int(TextEditor::PaletteIndex::Number)] = get_color_u32("editor_warning");
palette[int(TextEditor::PaletteIndex::String)] = get_color_u32("text_string"); palette[int(TextEditor::PaletteIndex::String)] = get_color_u32("editor_string");
palette[int(TextEditor::PaletteIndex::CharLiteral)] = get_color_u32("text_string"); palette[int(TextEditor::PaletteIndex::CharLiteral)] = get_color_u32("editor_string");
palette[int(TextEditor::PaletteIndex::Punctuation)] = get_color_u32("text_main"); palette[int(TextEditor::PaletteIndex::Punctuation)] = get_color_u32("editor_main");
palette[int(TextEditor::PaletteIndex::Preprocessor)] = get_color_u32("syntax_special_keyword"); palette[int(TextEditor::PaletteIndex::Preprocessor)] = get_color_u32("editor_emphasis");
palette[int(TextEditor::PaletteIndex::Identifier)] = get_color_u32("text_main"); palette[int(TextEditor::PaletteIndex::Identifier)] = get_color_u32("editor_main");
palette[int(TextEditor::PaletteIndex::KnownIdentifier)] = get_color_u32("text_link"); palette[int(TextEditor::PaletteIndex::KnownIdentifier)] = get_color_u32("editor_link");
palette[int(TextEditor::PaletteIndex::PreprocIdentifier)] = get_color_u32("text_link"); palette[int(TextEditor::PaletteIndex::PreprocIdentifier)] = get_color_u32("editor_link");
palette[int(TextEditor::PaletteIndex::Comment)] = get_color_u32("text_comment"); palette[int(TextEditor::PaletteIndex::Comment)] = get_color_u32("editor_comment");
palette[int(TextEditor::PaletteIndex::MultiLineComment)] = get_color_u32("text_comment"); palette[int(TextEditor::PaletteIndex::MultiLineComment)] = get_color_u32("editor_comment");
palette[int(TextEditor::PaletteIndex::Background)] = get_color_u32("editor_background"); palette[int(TextEditor::PaletteIndex::Background)] = get_color_u32("editor_background");
palette[int(TextEditor::PaletteIndex::Cursor)] = get_color_u32("cursor"); palette[int(TextEditor::PaletteIndex::Cursor)] = get_color_u32("cursor");
palette[int(TextEditor::PaletteIndex::Selection)] = get_color_u32("text_selected"); palette[int(TextEditor::PaletteIndex::Selection)] = get_color_u32("editor_selected");
palette[int(TextEditor::PaletteIndex::ErrorMarker)] = get_color_u32("syntax_error"); palette[int(TextEditor::PaletteIndex::ErrorMarker)] = get_color_u32("editor_error");
palette[int(TextEditor::PaletteIndex::Breakpoint)] = get_color_u32("syntax_error"); palette[int(TextEditor::PaletteIndex::Breakpoint)] = get_color_u32("editor_error");
palette[int(TextEditor::PaletteIndex::LineNumber)] = get_color_u32("text_line_number"); palette[int(TextEditor::PaletteIndex::LineNumber)] = get_color_u32("editor_line_number");
palette[int(TextEditor::PaletteIndex::CurrentLineFill)] = get_color_u32("surface_variant"); palette[int(TextEditor::PaletteIndex::CurrentLineFill)] = get_color_u32("surface_variant");
palette[int(TextEditor::PaletteIndex::CurrentLineFillInactive)] = get_color_u32("surface"); palette[int(TextEditor::PaletteIndex::CurrentLineFillInactive)] = get_color_u32("surface");
palette[int(TextEditor::PaletteIndex::CurrentLineEdge)] = get_color_u32("border_emphasized"); palette[int(TextEditor::PaletteIndex::CurrentLineEdge)] = get_color_u32("border_focused");
m_editor.SetPalette(palette); m_editor.SetPalette(palette);
} }
@@ -438,43 +456,46 @@ void color_scheme_editor::apply_palette_to_imgui() const
{ {
const auto &current = m_controller.current_palette(); const auto &current = m_controller.current_palette();
auto getColor = [&](const std::string &key) -> ImVec4 { if (current.colors().empty())
return;
auto getColor = [&](const std::string &key, const std::string &fallback = "") -> ImVec4 {
auto it = current.colors().find(key); auto it = current.colors().find(key);
if (it == current.colors().end() && !fallback.empty())
{
it = current.colors().find(fallback);
}
if (it != current.colors().end()) if (it != current.colors().end())
{ {
const uint32_t hex = it->second.hex(); const uint32_t hex = it->second.hex();
return {((hex >> 24) & 0xFF) / 255.0f, ((hex >> 16) & 0xFF) / 255.0f, return {((hex >> 24) & 0xFF) / 255.0f, ((hex >> 16) & 0xFF) / 255.0f,
((hex >> 8) & 0xFF) / 255.0f, ((hex) & 0xFF) / 255.0f}; ((hex >> 8) & 0xFF) / 255.0f, ((hex) & 0xFF) / 255.0f};
} }
std::cout << "WARNING: Color key '" << key << "' not found!\n";
return {1, 1, 1, 1}; return {1, 1, 1, 1};
}; };
ImGuiStyle &style = ImGui::GetStyle(); ImGuiStyle &style = ImGui::GetStyle();
const ImVec4 bg = getColor("editor_background"); const ImVec4 bg = getColor("background");
const ImVec4 sidebar = getColor("sidebar_background");
const ImVec4 popup = getColor("popup_background");
const ImVec4 menuOpt = getColor("menu_option_background");
const ImVec4 surface = getColor("surface"); const ImVec4 surface = getColor("surface");
const ImVec4 surfaceVariant = getColor("surface_variant"); const ImVec4 surfaceVariant = getColor("surface_variant");
const ImVec4 fg = getColor("foreground");
const ImVec4 fg = getColor("text_main"); const ImVec4 fgInactive = getColor("editor_inactive");
const ImVec4 fgSecondary = getColor("text_inactive");
const ImVec4 accent = getColor("accent"); const ImVec4 accent = getColor("accent");
const ImVec4 border = getColor("border");
const ImVec4 border = getColor("border_window");
style.Colors[ImGuiCol_WindowBg] = bg; style.Colors[ImGuiCol_WindowBg] = bg;
style.Colors[ImGuiCol_ChildBg] = surface; style.Colors[ImGuiCol_ChildBg] = surface;
style.Colors[ImGuiCol_PopupBg] = popup; style.Colors[ImGuiCol_PopupBg] = surface;
style.Colors[ImGuiCol_Border] = border; style.Colors[ImGuiCol_Border] = border;
style.Colors[ImGuiCol_BorderShadow] = ImVec4(0, 0, 0, 0); style.Colors[ImGuiCol_BorderShadow] = ImVec4(0, 0, 0, 0);
style.Colors[ImGuiCol_Text] = fg; style.Colors[ImGuiCol_Text] = fg;
style.Colors[ImGuiCol_TextDisabled] = fgSecondary; style.Colors[ImGuiCol_TextDisabled] = fgInactive;
style.Colors[ImGuiCol_Header] = surfaceVariant; style.Colors[ImGuiCol_Header] = surfaceVariant;
style.Colors[ImGuiCol_HeaderHovered] = ImVec4(accent.x, accent.y, accent.z, 0.8f); style.Colors[ImGuiCol_HeaderHovered] = ImVec4(accent.x, accent.y, accent.z, 0.8f);
@@ -490,9 +511,9 @@ void color_scheme_editor::apply_palette_to_imgui() const
style.Colors[ImGuiCol_FrameBgActive] = style.Colors[ImGuiCol_FrameBgActive] =
ImVec4(surfaceVariant.x * 1.2f, surfaceVariant.y * 1.2f, surfaceVariant.z * 1.2f, 1.0f); ImVec4(surfaceVariant.x * 1.2f, surfaceVariant.y * 1.2f, surfaceVariant.z * 1.2f, 1.0f);
style.Colors[ImGuiCol_TitleBg] = sidebar; style.Colors[ImGuiCol_TitleBg] = surface;
style.Colors[ImGuiCol_TitleBgActive] = surfaceVariant; style.Colors[ImGuiCol_TitleBgActive] = surfaceVariant;
style.Colors[ImGuiCol_TitleBgCollapsed] = sidebar; style.Colors[ImGuiCol_TitleBgCollapsed] = surface;
style.Colors[ImGuiCol_ScrollbarBg] = surface; style.Colors[ImGuiCol_ScrollbarBg] = surface;
style.Colors[ImGuiCol_ScrollbarGrab] = surfaceVariant; style.Colors[ImGuiCol_ScrollbarGrab] = surfaceVariant;
@@ -513,6 +534,7 @@ void color_scheme_editor::apply_palette_to_imgui() const
style.Colors[ImGuiCol_TabActive] = surfaceVariant; style.Colors[ImGuiCol_TabActive] = surfaceVariant;
style.Colors[ImGuiCol_TabUnfocused] = surface; style.Colors[ImGuiCol_TabUnfocused] = surface;
style.Colors[ImGuiCol_TabUnfocusedActive] = surfaceVariant; style.Colors[ImGuiCol_TabUnfocusedActive] = surfaceVariant;
style.Colors[ImGuiCol_TabSelectedOverline] = accent;
style.Colors[ImGuiCol_TableHeaderBg] = surfaceVariant; style.Colors[ImGuiCol_TableHeaderBg] = surfaceVariant;
style.Colors[ImGuiCol_TableBorderStrong] = border; style.Colors[ImGuiCol_TableBorderStrong] = border;
@@ -526,7 +548,7 @@ void color_scheme_editor::apply_palette_to_imgui() const
style.Colors[ImGuiCol_SeparatorHovered] = accent; style.Colors[ImGuiCol_SeparatorHovered] = accent;
style.Colors[ImGuiCol_SeparatorActive] = accent; style.Colors[ImGuiCol_SeparatorActive] = accent;
style.Colors[ImGuiCol_MenuBarBg] = menuOpt; style.Colors[ImGuiCol_MenuBarBg] = surface;
style.Colors[ImGuiCol_DockingPreview] = ImVec4(accent.x, accent.y, accent.z, 0.7f); style.Colors[ImGuiCol_DockingPreview] = ImVec4(accent.x, accent.y, accent.z, 0.7f);
style.Colors[ImGuiCol_DockingEmptyBg] = bg; style.Colors[ImGuiCol_DockingEmptyBg] = bg;

View File

@@ -87,15 +87,16 @@ void setup_main_dockspace(bool& first_time)
ImGui::SetNextWindowViewport(viewport->ID); ImGui::SetNextWindowViewport(viewport->ID);
constexpr ImGuiWindowFlags flags = constexpr ImGuiWindowFlags flags =
// ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoCollapse |
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoMove |
ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoBringToFrontOnFocus |
ImGuiWindowFlags_NoNavFocus; ImGuiWindowFlags_NoNavFocus |
ImGuiWindowFlags_MenuBar;
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 1.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0,0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0,0));
ImGui::Begin("MainDockSpace", nullptr, flags); ImGui::Begin("MainDockSpace", nullptr, flags);
ImGui::PopStyleVar(3); ImGui::PopStyleVar(3);
@@ -110,20 +111,23 @@ void setup_main_dockspace(bool& first_time)
ImGui::DockBuilderAddNode(dockspace_id, ImGuiDockNodeFlags_DockSpace); ImGui::DockBuilderAddNode(dockspace_id, ImGuiDockNodeFlags_DockSpace);
ImGui::DockBuilderSetNodeSize(dockspace_id, viewport->Size); ImGui::DockBuilderSetNodeSize(dockspace_id, viewport->Size);
ImGuiID left, right; ImGuiID center, right;
ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.45f, &left, &right); ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Right, 0.5f, &right, &center);
ImGuiID right_top, right_bottom; ImGuiDockNode* center_node = ImGui::DockBuilderGetNode(center);
ImGui::DockBuilderSplitNode(right, ImGuiDir_Up, 0.6f, &right_top, &right_bottom); if (center_node)
{
center_node->LocalFlags |= ImGuiDockNodeFlags_CentralNode;
}
ImGui::DockBuilderDockWindow("Templates", left); ImGui::DockBuilderDockWindow("Color Schemes", right);
ImGui::DockBuilderDockWindow("Color Schemes", right_top); ImGui::DockBuilderDockWindow("Templates", center);
ImGui::DockBuilderDockWindow("Color Preview", right_bottom); ImGui::DockBuilderDockWindow("Color Preview", center);
ImGui::DockBuilderFinish(dockspace_id); ImGui::DockBuilderFinish(dockspace_id);
} }
ImGui::DockSpace(dockspace_id, ImVec2{0,0}); ImGui::DockSpace(dockspace_id, ImVec2{0,0}, ImGuiDockNodeFlags_None);
ImGui::End(); ImGui::End();
} }

View File

@@ -28,14 +28,9 @@ void palette_controller::select_palette(const std::string& name)
void palette_controller::create_palette(const std::string& name) void palette_controller::create_palette(const std::string& name)
{ {
clrsync::core::palette new_palette = m_current_palette; clrsync::core::palette new_palette = m_palette_manager.load_palette_from_file(clrsync::core::config::get_data_dir().string() + "/palettes/cursed.toml");
new_palette.set_name(name); new_palette.set_name(name);
auto colors = m_current_palette.colors();
for (auto& pair : colors) {
new_palette.set_color(pair.first, pair.second);
}
auto dir = clrsync::core::config::instance().palettes_path(); auto dir = clrsync::core::config::instance().palettes_path();
m_palette_manager.save_palette_to_file(new_palette, dir); m_palette_manager.save_palette_to_file(new_palette, dir);

View File

@@ -6,8 +6,7 @@
#include <fstream> #include <fstream>
#include <ranges> #include <ranges>
template_editor::template_editor() template_editor::template_editor() : m_template_name("new_template")
: m_template_name("new_template")
{ {
TextEditor::LanguageDefinition lang; TextEditor::LanguageDefinition lang;
lang.mName = "Template"; lang.mName = "Template";
@@ -26,15 +25,23 @@ template_editor::template_editor()
"'([^']*)'", TextEditor::PaletteIndex::String)); "'([^']*)'", TextEditor::PaletteIndex::String));
m_editor.SetLanguageDefinition(lang); m_editor.SetLanguageDefinition(lang);
m_editor.SetText("# Enter your template here\n# Use {color_key} for color variables\n# Examples: {color.hex}, {color.rgb}, {color.r}\n\n"); m_editor.SetText("# Enter your template here\n# Use {color_key} for color variables\n# "
"Examples: {color.hex}, {color.rgb}, {color.r}\n\n");
m_editor.SetShowWhitespaces(false); m_editor.SetShowWhitespaces(false);
} }
void template_editor::apply_current_palette(const clrsync::core::palette &pal) void template_editor::apply_current_palette(const clrsync::core::palette &pal)
{ {
auto colors = pal.colors(); auto colors = pal.colors();
auto get_color_u32 = [&](const std::string &key) -> uint32_t { if (colors.empty())
return;
auto get_color_u32 = [&](const std::string &key, const std::string &fallback = "") -> uint32_t {
auto it = colors.find(key); auto it = colors.find(key);
if (it == colors.end() && !fallback.empty())
{
it = colors.find(fallback);
}
if (it != colors.end()) if (it != colors.end())
{ {
const auto &col = it->second; const auto &col = it->second;
@@ -51,32 +58,41 @@ void template_editor::apply_current_palette(const clrsync::core::palette& pal)
auto palette = m_editor.GetPalette(); auto palette = m_editor.GetPalette();
palette[int(TextEditor::PaletteIndex::Default)] = get_color_u32("text_main"); palette[int(TextEditor::PaletteIndex::Default)] = get_color_u32("editor_main", "foreground");
palette[int(TextEditor::PaletteIndex::Keyword)] = get_color_u32("syntax_keyword"); palette[int(TextEditor::PaletteIndex::Keyword)] = get_color_u32("editor_command", "accent");
palette[int(TextEditor::PaletteIndex::Number)] = get_color_u32("text_warning"); palette[int(TextEditor::PaletteIndex::Number)] = get_color_u32("editor_warning", "warning");
palette[int(TextEditor::PaletteIndex::String)] = get_color_u32("text_string"); palette[int(TextEditor::PaletteIndex::String)] = get_color_u32("editor_string", "success");
palette[int(TextEditor::PaletteIndex::CharLiteral)] = get_color_u32("text_string"); palette[int(TextEditor::PaletteIndex::CharLiteral)] = get_color_u32("editor_string", "success");
palette[int(TextEditor::PaletteIndex::Punctuation)] = get_color_u32("text_main"); palette[int(TextEditor::PaletteIndex::Punctuation)] =
palette[int(TextEditor::PaletteIndex::Preprocessor)] = get_color_u32("syntax_special_keyword"); get_color_u32("editor_main", "foreground");
palette[int(TextEditor::PaletteIndex::Identifier)] = get_color_u32("text_main"); palette[int(TextEditor::PaletteIndex::Preprocessor)] =
palette[int(TextEditor::PaletteIndex::KnownIdentifier)] = get_color_u32("text_link"); get_color_u32("editor_emphasis", "accent");
palette[int(TextEditor::PaletteIndex::PreprocIdentifier)] = get_color_u32("text_link"); palette[int(TextEditor::PaletteIndex::Identifier)] = get_color_u32("editor_main", "foreground");
palette[int(TextEditor::PaletteIndex::KnownIdentifier)] = get_color_u32("editor_link", "info");
palette[int(TextEditor::PaletteIndex::PreprocIdentifier)] =
get_color_u32("editor_link", "info");
palette[int(TextEditor::PaletteIndex::Comment)] = get_color_u32("text_comment"); palette[int(TextEditor::PaletteIndex::Comment)] =
palette[int(TextEditor::PaletteIndex::MultiLineComment)] = get_color_u32("text_comment"); get_color_u32("editor_comment", "editor_inactive");
palette[int(TextEditor::PaletteIndex::MultiLineComment)] =
get_color_u32("editor_comment", "editor_inactive");
palette[int(TextEditor::PaletteIndex::Background)] = get_color_u32("editor_background"); palette[int(TextEditor::PaletteIndex::Background)] =
palette[int(TextEditor::PaletteIndex::Cursor)] = get_color_u32("cursor"); get_color_u32("editor_background", "background");
palette[int(TextEditor::PaletteIndex::Cursor)] = get_color_u32("cursor", "accent");
palette[int(TextEditor::PaletteIndex::Selection)] = get_color_u32("text_selected"); palette[int(TextEditor::PaletteIndex::Selection)] =
palette[int(TextEditor::PaletteIndex::ErrorMarker)] = get_color_u32("syntax_error"); get_color_u32("editor_selected", "surface_variant");
palette[int(TextEditor::PaletteIndex::Breakpoint)] = get_color_u32("syntax_error"); palette[int(TextEditor::PaletteIndex::ErrorMarker)] = get_color_u32("editor_error", "error");
palette[int(TextEditor::PaletteIndex::Breakpoint)] = get_color_u32("editor_error", "error");
palette[int(TextEditor::PaletteIndex::LineNumber)] = get_color_u32("text_line_number"); palette[int(TextEditor::PaletteIndex::LineNumber)] =
get_color_u32("editor_line_number", "editor_inactive");
palette[int(TextEditor::PaletteIndex::CurrentLineFill)] = get_color_u32("surface_variant"); palette[int(TextEditor::PaletteIndex::CurrentLineFill)] = get_color_u32("surface_variant");
palette[int(TextEditor::PaletteIndex::CurrentLineFillInactive)] = get_color_u32("surface"); palette[int(TextEditor::PaletteIndex::CurrentLineFillInactive)] = get_color_u32("surface");
palette[int(TextEditor::PaletteIndex::CurrentLineEdge)] = get_color_u32("border_emphasized"); palette[int(TextEditor::PaletteIndex::CurrentLineEdge)] =
get_color_u32("border_focused", "border");
m_editor.SetPalette(palette); m_editor.SetPalette(palette);
} }
@@ -112,6 +128,12 @@ void template_editor::render_controls()
new_template(); new_template();
} }
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) &&
ImGui::IsKeyDown(ImGuiKey_LeftCtrl) && ImGui::IsKeyPressed(ImGuiKey_S))
{
save_template();
}
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Save")) if (ImGui::Button("Save"))
{ {
@@ -192,7 +214,23 @@ void template_editor::render_editor()
} }
else else
{ {
ImGui::Text("Editing: %s", m_template_name.c_str()); ImGui::Text("%s", m_template_name.c_str());
auto trim_right = [](const std::string &s) -> std::string {
size_t end = s.find_last_not_of("\r\n");
return (end == std::string::npos) ? "" : s.substr(0, end + 1);
};
std::string current_content = trim_right(m_editor.GetText());
std::string saved_content = trim_right(m_saved_content);
m_has_unsaved_changes = (current_content != saved_content);
if (m_has_unsaved_changes)
{
ImGui::SameLine();
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.6f, 0.2f, 1.0f));
ImGui::Text("");
ImGui::PopStyleColor();
}
} }
ImGui::Separator(); ImGui::Separator();
@@ -346,6 +384,8 @@ void template_editor::save_template()
m_template_name = trimmed_name; m_template_name = trimmed_name;
m_output_path = trimmed_path; m_output_path = trimmed_path;
m_is_editing_existing = true; m_is_editing_existing = true;
m_saved_content = m_editor.GetText();
m_has_unsaved_changes = false;
refresh_templates(); refresh_templates();
} }
@@ -384,6 +424,8 @@ void template_editor::load_template(const std::string &name)
in.close(); in.close();
m_editor.SetText(content); m_editor.SetText(content);
m_saved_content = content;
m_has_unsaved_changes = false;
} }
} }
catch (const std::exception &e) catch (const std::exception &e)
@@ -396,12 +438,17 @@ void template_editor::load_template(const std::string &name)
void template_editor::new_template() void template_editor::new_template()
{ {
m_template_name = "new_template"; m_template_name = "new_template";
m_editor.SetText("# Enter your template here\n# Use {color_key} for color variables\n# Examples: {color.hex}, {color.rgb}, {color.r}\n\n"); std::string default_content =
"# Enter your template here\n# Use {color_key} for color variables\n# "
"Examples: {color.hex}, {color.rgb}, {color.r}\n\n";
m_editor.SetText(default_content);
m_saved_content = default_content;
m_output_path = ""; m_output_path = "";
m_reload_command = ""; m_reload_command = "";
m_enabled = true; m_enabled = true;
m_is_editing_existing = false; m_is_editing_existing = false;
m_validation_error = ""; m_validation_error = "";
m_has_unsaved_changes = false;
} }
void template_editor::refresh_templates() void template_editor::refresh_templates()

View File

@@ -32,6 +32,8 @@ private:
std::string m_output_path; std::string m_output_path;
std::string m_reload_command; std::string m_reload_command;
std::string m_validation_error; std::string m_validation_error;
std::string m_saved_content;
bool m_has_unsaved_changes = false;
bool m_enabled{true}; bool m_enabled{true};
bool m_is_editing_existing{false}; bool m_is_editing_existing{false};

View File

View File

@@ -1,10 +0,0 @@
[wrap-file]
directory = freetype-2.14.1
source_url = https://download.savannah.gnu.org/releases/freetype/freetype-2.14.1.tar.xz
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/freetype2_2.14.1-1/freetype-2.14.1.tar.xz
source_filename = freetype-2.14.1.tar.xz
source_hash = 32427e8c471ac095853212a37aef816c60b42052d4d9e48230bab3bdf2936ccc
wrapdb_version = 2.14.1-1
[provide]
dependency_names = freetype2

View File

@@ -1,13 +0,0 @@
[wrap-file]
directory = glfw-3.4
source_url = https://github.com/glfw/glfw/archive/refs/tags/3.4.tar.gz
source_filename = glfw-3.4.tar.gz
source_hash = c038d34200234d071fae9345bc455e4a8f2f544ab60150765d7704e08f3dac01
patch_filename = glfw_3.4-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/glfw_3.4-1/get_patch
patch_hash = 58a6a6cdb28195d7f7e6f5de85dff7044d378e49b46bf1d4a9b04c97ed93e6b0
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/glfw_3.4-1/glfw-3.4.tar.gz
wrapdb_version = 3.4-1
[provide]
glfw3 = glfw_dep

View File

@@ -1,2 +0,0 @@
[wrap-redirect]
filename = freetype-2.14.1/subprojects/libpng.wrap