parent
0d881d990f
commit
c493d45395
@ -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;
|
||||
}
|
||||
@ -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
|
||||
`;
|
||||
}
|
||||
@ -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)}
|
||||
`;
|
||||
}
|
||||
@ -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");
|
||||
Loading…
Reference in new issue