Skip to content

Instantly share code, notes, and snippets.

@leafac
Last active December 1, 2023 23:39
Show Gist options
  • Save leafac/c9a065cbce59367490ee2b6b5e648ced to your computer and use it in GitHub Desktop.
Save leafac/c9a065cbce59367490ee2b6b5e648ced to your computer and use it in GitHub Desktop.
Create macOS Color Palette (.clr) with JavaScript
#!/usr/bin/env osascript -l JavaScript
// Download. Change permissions to be able to execute: ‘chmod a+x example.js’. Execute. Check ‘~/Library/Colors/Example Palette.clr’.
// https://github.com/Rutger0000/colorpalette-converter/blob/56da3f1c5d13ca67e47cd6bad812e24f1985fd11/src/colorpaletteconverter.py
// https://github.com/JXA-Cookbook/JXA-Cookbook/wiki/Using-JavaScript-for-Automation
// https://github.com/JXA-Cookbook/JXA-Cookbook/wiki/Using-Objective-C-%28ObjC%29-with-JXA
// https://tylergaw.com/blog/building-osx-apps-with-js/
// https://stackoverflow.com/questions/49379341/how-does-the-apple-color-list-format-clr-work
function run() {
ObjC.import("Cocoa");
const palette = $.NSColorList.alloc.initWithName("Example Palette");
palette.setColorForKey(
$.NSColor.colorWithRedGreenBlueAlpha(0, 0, 0, 1),
"Black"
);
palette.setColorForKey(
$.NSColor.colorWithRedGreenBlueAlpha(1, 1, 1, 1),
"White"
);
palette.writeToURLError(ObjC.nil, ObjC.nil);
}
#!/usr/bin/env osascript -l JavaScript
// https://github.com/tailwindlabs/tailwindcss/blob/767b78cc3069dcc2007a0c7119e70ba466430e10/src/public/colors.js
const name = "Tailwind";
const css = `
--color--black: #000000;
--color--white: #ffffff;
--color--slate--50: #f8fafc;
--color--slate--100: #f1f5f9;
--color--slate--200: #e2e8f0;
--color--slate--300: #cbd5e1;
--color--slate--400: #94a3b8;
--color--slate--500: #64748b;
--color--slate--600: #475569;
--color--slate--700: #334155;
--color--slate--800: #1e293b;
--color--slate--900: #0f172a;
--color--slate--950: #020617;
--color--gray--50: #f9fafb;
--color--gray--100: #f3f4f6;
--color--gray--200: #e5e7eb;
--color--gray--300: #d1d5db;
--color--gray--400: #9ca3af;
--color--gray--500: #6b7280;
--color--gray--600: #4b5563;
--color--gray--700: #374151;
--color--gray--800: #1f2937;
--color--gray--900: #111827;
--color--gray--950: #030712;
--color--zinc--50: #fafafa;
--color--zinc--100: #f4f4f5;
--color--zinc--200: #e4e4e7;
--color--zinc--300: #d4d4d8;
--color--zinc--400: #a1a1aa;
--color--zinc--500: #71717a;
--color--zinc--600: #52525b;
--color--zinc--700: #3f3f46;
--color--zinc--800: #27272a;
--color--zinc--900: #18181b;
--color--zinc--950: #09090b;
--color--neutral--50: #fafafa;
--color--neutral--100: #f5f5f5;
--color--neutral--200: #e5e5e5;
--color--neutral--300: #d4d4d4;
--color--neutral--400: #a3a3a3;
--color--neutral--500: #737373;
--color--neutral--600: #525252;
--color--neutral--700: #404040;
--color--neutral--800: #262626;
--color--neutral--900: #171717;
--color--neutral--950: #0a0a0a;
--color--stone--50: #fafaf9;
--color--stone--100: #f5f5f4;
--color--stone--200: #e7e5e4;
--color--stone--300: #d6d3d1;
--color--stone--400: #a8a29e;
--color--stone--500: #78716c;
--color--stone--600: #57534e;
--color--stone--700: #44403c;
--color--stone--800: #292524;
--color--stone--900: #1c1917;
--color--stone--950: #0c0a09;
--color--red--50: #fef2f2;
--color--red--100: #fee2e2;
--color--red--200: #fecaca;
--color--red--300: #fca5a5;
--color--red--400: #f87171;
--color--red--500: #ef4444;
--color--red--600: #dc2626;
--color--red--700: #b91c1c;
--color--red--800: #991b1b;
--color--red--900: #7f1d1d;
--color--red--950: #450a0a;
--color--orange--50: #fff7ed;
--color--orange--100: #ffedd5;
--color--orange--200: #fed7aa;
--color--orange--300: #fdba74;
--color--orange--400: #fb923c;
--color--orange--500: #f97316;
--color--orange--600: #ea580c;
--color--orange--700: #c2410c;
--color--orange--800: #9a3412;
--color--orange--900: #7c2d12;
--color--orange--950: #431407;
--color--amber--50: #fffbeb;
--color--amber--100: #fef3c7;
--color--amber--200: #fde68a;
--color--amber--300: #fcd34d;
--color--amber--400: #fbbf24;
--color--amber--500: #f59e0b;
--color--amber--600: #d97706;
--color--amber--700: #b45309;
--color--amber--800: #92400e;
--color--amber--900: #78350f;
--color--amber--950: #451a03;
--color--yellow--50: #fefce8;
--color--yellow--100: #fef9c3;
--color--yellow--200: #fef08a;
--color--yellow--300: #fde047;
--color--yellow--400: #facc15;
--color--yellow--500: #eab308;
--color--yellow--600: #ca8a04;
--color--yellow--700: #a16207;
--color--yellow--800: #854d0e;
--color--yellow--900: #713f12;
--color--yellow--950: #422006;
--color--lime--50: #f7fee7;
--color--lime--100: #ecfccb;
--color--lime--200: #d9f99d;
--color--lime--300: #bef264;
--color--lime--400: #a3e635;
--color--lime--500: #84cc16;
--color--lime--600: #65a30d;
--color--lime--700: #4d7c0f;
--color--lime--800: #3f6212;
--color--lime--900: #365314;
--color--lime--950: #1a2e05;
--color--green--50: #f0fdf4;
--color--green--100: #dcfce7;
--color--green--200: #bbf7d0;
--color--green--300: #86efac;
--color--green--400: #4ade80;
--color--green--500: #22c55e;
--color--green--600: #16a34a;
--color--green--700: #15803d;
--color--green--800: #166534;
--color--green--900: #14532d;
--color--green--950: #052e16;
--color--emerald--50: #ecfdf5;
--color--emerald--100: #d1fae5;
--color--emerald--200: #a7f3d0;
--color--emerald--300: #6ee7b7;
--color--emerald--400: #34d399;
--color--emerald--500: #10b981;
--color--emerald--600: #059669;
--color--emerald--700: #047857;
--color--emerald--800: #065f46;
--color--emerald--900: #064e3b;
--color--emerald--950: #022c22;
--color--teal--50: #f0fdfa;
--color--teal--100: #ccfbf1;
--color--teal--200: #99f6e4;
--color--teal--300: #5eead4;
--color--teal--400: #2dd4bf;
--color--teal--500: #14b8a6;
--color--teal--600: #0d9488;
--color--teal--700: #0f766e;
--color--teal--800: #115e59;
--color--teal--900: #134e4a;
--color--teal--950: #042f2e;
--color--cyan--50: #ecfeff;
--color--cyan--100: #cffafe;
--color--cyan--200: #a5f3fc;
--color--cyan--300: #67e8f9;
--color--cyan--400: #22d3ee;
--color--cyan--500: #06b6d4;
--color--cyan--600: #0891b2;
--color--cyan--700: #0e7490;
--color--cyan--800: #155e75;
--color--cyan--900: #164e63;
--color--cyan--950: #083344;
--color--sky--50: #f0f9ff;
--color--sky--100: #e0f2fe;
--color--sky--200: #bae6fd;
--color--sky--300: #7dd3fc;
--color--sky--400: #38bdf8;
--color--sky--500: #0ea5e9;
--color--sky--600: #0284c7;
--color--sky--700: #0369a1;
--color--sky--800: #075985;
--color--sky--900: #0c4a6e;
--color--sky--950: #082f49;
--color--blue--50: #eff6ff;
--color--blue--100: #dbeafe;
--color--blue--200: #bfdbfe;
--color--blue--300: #93c5fd;
--color--blue--400: #60a5fa;
--color--blue--500: #3b82f6;
--color--blue--600: #2563eb;
--color--blue--700: #1d4ed8;
--color--blue--800: #1e40af;
--color--blue--900: #1e3a8a;
--color--blue--950: #172554;
--color--indigo--50: #eef2ff;
--color--indigo--100: #e0e7ff;
--color--indigo--200: #c7d2fe;
--color--indigo--300: #a5b4fc;
--color--indigo--400: #818cf8;
--color--indigo--500: #6366f1;
--color--indigo--600: #4f46e5;
--color--indigo--700: #4338ca;
--color--indigo--800: #3730a3;
--color--indigo--900: #312e81;
--color--indigo--950: #1e1b4b;
--color--violet--50: #f5f3ff;
--color--violet--100: #ede9fe;
--color--violet--200: #ddd6fe;
--color--violet--300: #c4b5fd;
--color--violet--400: #a78bfa;
--color--violet--500: #8b5cf6;
--color--violet--600: #7c3aed;
--color--violet--700: #6d28d9;
--color--violet--800: #5b21b6;
--color--violet--900: #4c1d95;
--color--violet--950: #2e1065;
--color--purple--50: #faf5ff;
--color--purple--100: #f3e8ff;
--color--purple--200: #e9d5ff;
--color--purple--300: #d8b4fe;
--color--purple--400: #c084fc;
--color--purple--500: #a855f7;
--color--purple--600: #9333ea;
--color--purple--700: #7e22ce;
--color--purple--800: #6b21a8;
--color--purple--900: #581c87;
--color--purple--950: #3b0764;
--color--fuchsia--50: #fdf4ff;
--color--fuchsia--100: #fae8ff;
--color--fuchsia--200: #f5d0fe;
--color--fuchsia--300: #f0abfc;
--color--fuchsia--400: #e879f9;
--color--fuchsia--500: #d946ef;
--color--fuchsia--600: #c026d3;
--color--fuchsia--700: #a21caf;
--color--fuchsia--800: #86198f;
--color--fuchsia--900: #701a75;
--color--fuchsia--950: #4a044e;
--color--pink--50: #fdf2f8;
--color--pink--100: #fce7f3;
--color--pink--200: #fbcfe8;
--color--pink--300: #f9a8d4;
--color--pink--400: #f472b6;
--color--pink--500: #ec4899;
--color--pink--600: #db2777;
--color--pink--700: #be185d;
--color--pink--800: #9d174d;
--color--pink--900: #831843;
--color--pink--950: #500724;
--color--rose--50: #fff1f2;
--color--rose--100: #ffe4e6;
--color--rose--200: #fecdd3;
--color--rose--300: #fda4af;
--color--rose--400: #fb7185;
--color--rose--500: #f43f5e;
--color--rose--600: #e11d48;
--color--rose--700: #be123c;
--color--rose--800: #9f1239;
--color--rose--900: #881337;
--color--rose--950: #4c0519;
`;
function run() {
ObjC.import("Cocoa");
const palette = $.NSColorList.alloc.initWithName(name);
for (const line of css.split("\n").filter((line) => line.trim() !== "")) {
const match = line.match(
/--color--(?<name>.*?): #(?<red>..)(?<green>..)(?<blue>..);/
);
palette.setColorForKey(
$.NSColor.colorWithRedGreenBlueAlpha(
parseInt(match.groups.red, 16) / 0xff,
parseInt(match.groups.green, 16) / 0xff,
parseInt(match.groups.blue, 16) / 0xff,
1
),
match.groups.name
);
}
palette.writeToURLError(ObjC.nil, ObjC.nil);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment