From c493d45395fecfc6fc1f393f245ec9d1be50aa25 Mon Sep 17 00:00:00 2001 From: lambda Date: Sun, 1 Mar 2026 22:12:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/generators/allacrity.ts | 36 +++++++++++++++++++++++++ src/generators/emacs.ts | 34 ++++++++++++++++++++++++ src/generators/hyprland.ts | 52 +++++++++++++++++++++++++++++++++++++ src/index.ts | 16 ++++++++++++ 4 files changed, 138 insertions(+) create mode 100644 src/generators/allacrity.ts create mode 100644 src/generators/emacs.ts create mode 100644 src/generators/hyprland.ts create mode 100644 src/index.ts diff --git a/src/generators/allacrity.ts b/src/generators/allacrity.ts new file mode 100644 index 0000000..157fb6e --- /dev/null +++ b/src/generators/allacrity.ts @@ -0,0 +1,36 @@ +import type { Pallette } from "../pallette"; + +export function generateAlacritty(p: Pallette): string { + // Map palette to a TOML 16-color layout similar to the example + // Assign neutral slots (yellow/blue/magenta/cyan) using shades and fg + const toml = `# Generated by mono-theme-generator +[colors.primary] +background = "${p.bg}" +foreground = "${p.fg}" + +[colors.cursor] +text = "${p.bg}" +cursor = "${p.fg}" + +[colors.normal] +black = "${p.bg}" +red = "${p.red}" +green = "${p.green}" +yellow = "${p.shade2}" +blue = "${p.shade3}" +magenta = "${p.shade4}" +cyan = "${p.fg}" +white = "${p.fg}" + +[colors.bright] +black = "${p.shade1}" +red = "${p.red}" +green = "${p.green}" +yellow = "${p.shade2}" +blue = "${p.shade3}" +magenta = "${p.shade4}" +cyan = "${p.fg}" +white = "${p.fg}" +`; + return toml; +} diff --git a/src/generators/emacs.ts b/src/generators/emacs.ts new file mode 100644 index 0000000..463464b --- /dev/null +++ b/src/generators/emacs.ts @@ -0,0 +1,34 @@ +import type { Pallette } from "../pallette"; + +export function generateEmacsTheme(p: Pallette): string { + // Minimal elisp theme that sets default faces and ansi-color mapping + return `;;; mono-generated-theme.el --- autogenerated theme +(deftheme mono-generated "Auto-generated minimal mono theme") + +(let ((class '((class color) (min-colors 89)))) + (custom-theme-set-faces + 'mono-generated + ;; basics + '(default ((,class (:background "${p.bg}" :foreground "${p.fg}")))) + '(cursor ((,class (:background "${p.fg}")))) + '(fringe ((,class (:background "${p.bg}")))) + '(region ((,class (:background "${p.shade2}" :foreground "${p.bg}")))) + '(minibuffer-prompt ((,class (:foreground "${p.shade4}" :weight bold)))) + ;; syntax-ish hints + '(font-lock-keyword-face ((,class (:foreground "${p.shade4}")))) + '(font-lock-function-name-face ((,class (:foreground "${p.shade3}")))) + '(font-lock-comment-face ((,class (:foreground "${p.shade1}")))) + '(success ((,class (:foreground "${p.green}")))) + '(error ((,class (:foreground "${p.red}")))) + ;; modeline + '(mode-line ((,class (:background "${p.shade3}" :foreground "${p.fg}" :box nil)))) + '(mode-line-inactive ((,class (:background "${p.shade1}" :foreground "${p.shade2}" :box nil)))) + ) + + ;; ANSI color mapping for terminal emulation inside Emacs + (setq ansi-color-names-vector + [ "${p.bg}" "${p.red}" "${p.green}" "${p.shade2}" "${p.shade3}" "${p.shade4}" "${p.fg}" "${p.fg}" ]) + (provide-theme 'mono-generated)) +;;; mono-generated-theme.el ends here +`; +} diff --git a/src/generators/hyprland.ts b/src/generators/hyprland.ts new file mode 100644 index 0000000..165cb13 --- /dev/null +++ b/src/generators/hyprland.ts @@ -0,0 +1,52 @@ +import type { Pallette } from "../pallette"; + +const hexToRgbShort = (hex: string) => hex.replace("#", "").toLowerCase(); + +// Strategy for mapping: +// - $color0 = bg +// - $color1..$color7 use a mix: red, green, shade1..shade4, fg +// - $color8..$color15 are bright variants / repeats +export function generateHyprland(p: Pallette): string { + const h = (s: string) => `rgb(${hexToRgbShort(s)})`; + const mapping = { + color0: p.bg, + color1: p.red, + color2: p.green, + color3: p.shade1, + color4: p.shade2, + color5: p.shade3, + color6: p.shade4, + color7: p.fg, + color8: p.shade1, + color9: p.red, + color10: p.green, + color11: p.shade2, + color12: p.shade3, + color13: p.shade4, + color14: p.fg, + color15: p.fg, + }; + + return `# Generated by mono-theme-generator +$foreground = ${h(p.fg)} +$background = ${h(p.bg)} +$cursor = ${h(p.fg)} + +$color0 = ${h(mapping.color0)} +$color1 = ${h(mapping.color1)} +$color2 = ${h(mapping.color2)} +$color3 = ${h(mapping.color3)} +$color4 = ${h(mapping.color4)} +$color5 = ${h(mapping.color5)} +$color6 = ${h(mapping.color6)} +$color7 = ${h(mapping.color7)} +$color8 = ${h(mapping.color8)} +$color9 = ${h(mapping.color9)} +$color10 = ${h(mapping.color10)} +$color11 = ${h(mapping.color11)} +$color12 = ${h(mapping.color12)} +$color13 = ${h(mapping.color13)} +$color14 = ${h(mapping.color14)} +$color15 = ${h(mapping.color15)} +`; +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..7e6eece --- /dev/null +++ b/src/index.ts @@ -0,0 +1,16 @@ +import { mkdir } from "node:fs/promises"; +import { generateAlacritty } from "./generators/allacrity.ts"; +import { generateHyprland } from "./generators/hyprland.ts"; +import { generateEmacsTheme } from "./generators/emacs.ts"; +import { pallette } from "./pallette.ts"; + +const al = generateAlacritty(pallette); +const hy = generateHyprland(pallette); +const em = generateEmacsTheme(pallette); + +await mkdir("dist", { recursive: true }); +await Bun.write("dist/alacritty.toml", al); +await Bun.write("dist/colors.conf", hy); +await Bun.write("dist/theme.el", em); + +console.log("Wrote dist/alacritty.yml, dist/hyprland.conf, dist/theme.el");