diff --git a/build/build.js b/build/build.js index ddc3816..99690be 100644 --- a/build/build.js +++ b/build/build.js @@ -3,8 +3,8 @@ const inquirer = require( 'inquirer' ); const fs = require( 'fs' ); const path = require( 'path' ); const os = require( 'os' ); -const render = require( './render' ); -const { treeWalker } = require('./util'); +const render = require( './helpers/render' ); +const { treeWalker } = require('./helpers/util'); // TODO: Better comments // TODO: Split up configs and buildables diff --git a/build/helpers/generateTheme.js b/build/helpers/generateTheme.js new file mode 100644 index 0000000..08ecec3 --- /dev/null +++ b/build/helpers/generateTheme.js @@ -0,0 +1,280 @@ +const util = require( './util' ); + +const renderColourAsRGB = util.renderColourAsRGB; +const renderColourAsRGBA = util.renderColourAsRGBA; +const renderColourAsHex = util.renderColourAsHex; + +// ─────────────────────────────────────────────────────────────────── +// ╭───────────────────────────────────────────────╮ +// │ Theme generator (returns theme as object) │ +// ╰───────────────────────────────────────────────╯ +// ─────────────────────────────────────────────────────────────────── +module.exports.generateTheme = ( theme, wallpaper, lockpaper, palette ) => { + return { + 'wallpaper-path': wallpaper, + 'lockpaper-path': lockpaper, + + // ┌ ┐ + // │ Colours │ + // └ ┘ + // ── Foreground ─────────────────────────────────────────────────── + 'colour-foreground-hex': renderColourAsHex( colours.foreground[ theme ] ), + 'colour-foreground-rgb': renderColourAsRGB( colours.foreground[ theme ] ), + 'colour-foreground-rgba': renderColourAsRGBA( colours.foreground[ theme ], 0.5 ), + 'colour-foreground-rgba-07': renderColourAsRGBA( colours.foreground[ theme ], 0.7 ), + 'colour-foreground-rgba-06': renderColourAsRGBA( colours.foreground[ theme ], 0.6 ), + 'colour-foreground-rgba-05': renderColourAsRGBA( colours.foreground[ theme ], 0.5 ), + 'colour-foreground-rgba-03': renderColourAsRGBA( colours.foreground[ theme ], 0.3 ), + 'colour-foreground-rgba-02': renderColourAsRGBA( colours.foreground[ theme ], 0.2 ), + 'colour-foreground-rgba-01': renderColourAsRGBA( colours.foreground[ theme ], 0.1 ), + + // ── Accent foreground colour ───────────────────────────────────── + 'colour-foreground-accent-hex': renderColourAsHex( colours['foreground-accent'][ theme ] ), + 'colour-foreground-accent-rgba-07': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.7 ), + 'colour-foreground-accent-rgba-06': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.6 ), + 'colour-foreground-accent-rgba-05': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.5 ), + 'colour-foreground-accent-rgba-03': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.3 ), + 'colour-foreground-accent-rgba-02': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.2 ), + + // ── Accent colour ──────────────────────────────────────────────── + 'colour-accent-hex': renderColourAsHex( palette[ 0 ] ), + 'colour-accent-rgb': renderColourAsRGB( palette[ 0 ] ), + 'colour-accent-rgba': renderColourAsRGBA( palette[ 0 ], 0.3 ), + 'colour-accent-rgba-07': renderColourAsRGBA( palette[ 0 ], 0.7 ), + 'colour-accent-rgba-05': renderColourAsRGBA( palette[ 0 ], 0.5 ), + 'colour-accent-rgba-03': renderColourAsRGBA( palette[ 0 ], 0.3 ), + 'colour-accent-rgba-02': renderColourAsRGBA( palette[ 0 ], 0.2 ), + 'colour-accent-rgba-015': renderColourAsRGBA( palette[ 0 ], 0.15 ), + 'colour-accent-rgba-011': renderColourAsRGBA( palette[ 0 ], 0.11 ), + 'colour-accent-rgba-007': renderColourAsRGBA( palette[ 0 ], 0.07 ), + 'colour-accent-hyprland': util.renderColourAsRGBAHex( palette[ 0 ], 0.8 ), + // ─────────────────────────────────────────────────────────────────── + 'colour-accent-gradient-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, gradientMultipliers[ theme ] ) ), + 'colour-accent-gradient-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 2, gradientMultipliers[ theme ] ) ), + 'colour-accent-gradient-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 3, gradientMultipliers[ theme ] ) ), + 'colour-accent-gradient-4-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 4, gradientMultipliers[ theme ] ) ), + 'colour-accent-gradient-5-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 5, gradientMultipliers[ theme ] ) ), + 'colour-accent-gradient-inverse-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), + 'colour-accent-gradient-inverse-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), + 'colour-accent-gradient-inverse-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), + + // ── Secondary accent ───────────────────────────────────────────── + 'colour-accent-2-hex': renderColourAsHex( palette[ 1 ] ), + 'colour-accent-2-rgb': renderColourAsRGB( palette[ 1 ] ), + 'colour-accent-2-rgba-07': renderColourAsRGBA( palette[ 1 ], 0.7 ), + 'colour-accent-2-rgba-05': renderColourAsRGBA( palette[ 1 ], 0.5 ), + 'colour-accent-2-rgba-03': renderColourAsRGBA( palette[ 1 ], 0.3 ), + 'colour-accent-2-rgba-02': renderColourAsRGBA( palette[ 1 ], 0.2 ), + 'colour-accent-2-rgba-015': renderColourAsRGBA( palette[ 1 ], 0.15 ), + 'colour-accent-2-rgba-01': renderColourAsRGBA( palette[ 1 ], 0.1 ), + 'colour-accent-2-hyprland': util.renderColourAsRGBAHex( palette[ 1 ], 0.8 ), + + // ── Tertiary accent ────────────────────────────────────────────── + 'colour-accent-3-hex': renderColourAsHex( palette[ 2 ] ), + 'colour-accent-3-rgb': renderColourAsRGB( palette[ 2 ] ), + 'colour-accent-3-hyprland': util.renderColourAsRGBAHex( palette[ 2 ], 0.8 ), + + // ── Background ─────────────────────────────────────────────────── + 'colour-background-hex': renderColourAsHex( colours.background[ theme ] ), + 'colour-background-rgb': renderColourAsRGB( colours.background[ theme ] ), + 'colour-background-rgba': renderColourAsRGBA( colours.background[ theme ], 0.5 ), + 'colour-background-rgba-07': renderColourAsRGBA( colours.background[ theme ], 0.7 ), + 'colour-background-rgba-05': renderColourAsRGBA( colours.background[ theme ], 0.5 ), + 'colour-background-rgba-03': renderColourAsRGBA( colours.background[ theme ], 0.3 ), + 'colour-background-rgba-02': renderColourAsRGBA( colours.background[ theme ], 0.2 ), + 'colour-background-rgba-015': renderColourAsRGBA( colours.background[ theme ], 0.15 ), + 'colour-background-rgba-011': renderColourAsRGBA( colours.background[ theme ], 0.11 ), + + // ── Background Alternative ─────────────────────────────────────── + 'colour-background-alternative-hex': renderColourAsHex( colours[ 'background-alternative' ][ theme ] ), + 'colour-background-alternative-rgb': renderColourAsRGB( colours[ 'background-alternative' ][ theme ] ), + 'colour-background-alternative-rgba-07': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.7 ), + 'colour-background-alternative-rgba-06': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.6 ), + 'colour-background-alternative-rgba-05': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.5 ), + 'colour-background-alternative-rgba-04': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.4 ), + 'colour-background-alternative-rgba-03': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.3 ), + 'colour-background-alternative-rgba-02': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.2 ), + 'colour-background-alternative-rgba-015': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.15 ), + 'colour-background-alternative-rgba-01': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.1 ), + + // ── Background Tertiary ────────────────────────────────────────── + 'colour-background-tertiary-hex': renderColourAsHex( colours[ 'background-tertiary' ][ theme ] ), + 'colour-background-tertiary-rgb': renderColourAsRGB( colours[ 'background-tertiary' ][ theme ] ), + 'colour-background-tertiary-rgba-05': renderColourAsRGBA( colours[ 'background-tertiary' ][ theme ], 0.5 ), + 'colour-background-tertiary-rgba-02': renderColourAsRGBA( colours[ 'background-tertiary' ][ theme ], 0.2 ), + + // ── Shadow ─────────────────────────────────────────────────────── + 'colour-shadow-hex': renderColourAsHex( colours.shadow[ theme ] ), + 'colour-shadow-rgb': renderColourAsRGB( colours.shadow[ theme ] ), + 'colour-shadow-hyprland': util.renderColourAsRGBHex( colours.shadow[ theme ] ), + 'colour-shadow-rgba-07': renderColourAsRGBA( colours.shadow[ theme ], 0.7 ), + 'colour-shadow-rgba-05': renderColourAsRGBA( colours.shadow[ theme ], 0.5 ), + 'colour-shadow-rgba-03': renderColourAsRGBA( colours.shadow[ theme ], 0.3 ), + 'colour-shadow-rgba-02': renderColourAsRGBA( colours.shadow[ theme ], 0.2 ), + 'colour-shadow-rgba-015': renderColourAsRGBA( colours.shadow[ theme ], 0.15 ), + 'colour-shadow-rgba-011': renderColourAsRGBA( colours.shadow[ theme ], 0.11 ), + + // ── Inactive ───────────────────────────────────────────────────── + 'colour-inactive-hex': renderColourAsHex( colours.inactive[ theme ] ), + 'colour-inactive-rgb': renderColourAsRGB( colours.inactive[ theme ] ), + 'colour-inactive-rgba-07': renderColourAsRGBA( colours.inactive[ theme ], 0.7 ), + 'colour-inactive-rgba-05': renderColourAsRGBA( colours.inactive[ theme ], 0.5 ), + 'colour-inactive-rgba-03': renderColourAsRGBA( colours.inactive[ theme ], 0.3 ), + 'colour-inactive-rgba-02': renderColourAsRGBA( colours.inactive[ theme ], 0.2 ), + 'colour-inactive-rgba-015': renderColourAsRGBA( colours.inactive[ theme ], 0.15 ), + // ─────────────────────────────────────────────────────────────────── + 'colour-inactive-background-hex': renderColourAsHex( colours[ 'inactive-background' ][ theme ] ), + 'colour-inactive-background-rgb': renderColourAsRGB( colours[ 'inactive-background' ][ theme ] ), + 'colour-inactive-background-hyprland': util.renderColourAsRGBHex( colours[ 'inactive-background' ][ theme ] ), + 'colour-inactive-background-rgba-07': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.7 ), + 'colour-inactive-background-rgba-05': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.5 ), + 'colour-inactive-background-rgba-04': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.4 ), + 'colour-inactive-background-rgba-03': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.3 ), + 'colour-inactive-background-rgba-02': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.2 ), + 'colour-inactive-background-rgba-015': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.15 ), + 'colour-inactive-background-rgba-01': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.1 ), + + // ┌ ┐ + // │ Fonts │ + // └ ┘ + 'font-primary': fonts.primary[ theme ], + 'font-accent': fonts.accent[ theme ], + 'font-mono': fonts.mono[ theme ], + + // ┌ ┐ + // │ Icon Theme │ + // └ ┘ + 'icon-theme': iconTheme[ theme ], + + // ┌ ┐ + // │ yazi theme │ + // └ ┘ + 'yazi-theme': yaziThemes[ theme ], + + // ┌ ┐ + // │ Path to this repo on disk │ + // └ ┘ + 'path-to-dotfiles': __dirname.slice(0, __dirname.length - 5), + } +} + + +// ─────────────────────────────────────────────────────────────────── +// ╭───────────────────────────────────────────────╮ +// │ Theme definitions │ +// ╰───────────────────────────────────────────────╯ +// ─────────────────────────────────────────────────────────────────── +const gradientMultipliers = { + 'nordic': 0.9, + 'deep-dark': 0.8, + 'material': 0.85, + 'light': 1.1, + 'bright': 1.15, + 'test': 0.75 +} +const colours = { + foreground: { + 'nordic': [ 200, 220, 255 ], + 'deep-dark': [ 230, 230, 230 ], + 'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator + 'light': [ 40, 40, 40 ], + 'bright': [ 0, 0, 0 ], + 'test': [ 0, 0, 0 ], + }, + 'foreground-accent': { + 'nordic': [ 255, 255, 255 ], + 'deep-dark': [ 255, 255, 255 ], + 'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator + 'light': [ 0, 0, 0 ], + 'bright': [ 50, 50, 50 ], + 'test': [ 0, 0, 0 ], + }, + background: { + 'nordic': [ 10, 10, 15 ], + 'deep-dark': [ 20, 20, 20 ], + 'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator + 'light': [ 230, 230, 230 ], + 'bright': [ 255, 255, 255 ], + 'test': [ 255, 255, 255 ], + }, + 'background-alternative': { + 'nordic': [ 20, 20, 25 ], + 'deep-dark': [ 30, 30, 30 ], + 'material': [ 40, 40, 40 ], // TODO: Will be calculated by material theme generator + 'light': [ 210, 210, 210 ], + 'bright': [ 230, 230, 230 ], + 'test': [ 255, 255, 0 ] // brown + }, + 'background-tertiary': { + 'nordic': [ 0, 0, 0 ], + 'deep-dark': [ 45, 45, 45 ], + 'material': [ 0, 0, 0 ], // TODO: Will be calculated by material theme generator + 'light': [ 180, 180, 180 ], + 'bright': [ 200, 200, 200 ], + 'test': [ 255, 0, 255 ] // purple + }, + shadow: { + 'nordic': [ 0, 0, 2 ], + 'deep-dark': [ 40, 40, 40 ], + 'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator + 'light': [ 190, 190, 190 ], + 'bright': [ 150, 150, 150 ], + 'test': [ 120, 0, 0 ] // dark red + }, + inactive: { + 'nordic': [ 200, 200, 200 ], + 'deep-dark': [ 200, 200, 200 ], + 'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator + 'light': [ 65, 65, 65 ], + 'bright': [ 60, 60, 60 ], + 'test': [ 150, 150, 150 ] + }, + 'inactive-background': { + 'nordic': [ 0, 0, 0 ], + 'deep-dark': [ 0, 0, 0 ], + 'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator + 'light': [ 80, 80, 80 ], + 'bright': [ 60, 60, 60 ], + 'test': [ 60, 60, 60 ] + } +} + +const fonts = { + 'primary': { + 'nordic': 'Comfortaa', + 'deep-dark': 'Comfortaa', + 'material': 'Comfortaa', + 'light': 'Adwaita Sans', + 'bright': 'Adwaita Sans Extralight' + }, + 'accent': { + 'nordic': 'Adwaita Sans', + 'deep-dark': 'Adwaita Sans', + 'material': 'Adwaita Sans', + 'light': 'Cantarell', + 'bright': 'Contarell Thin' + }, + 'mono': { + 'nordic': 'Source Code Pro', + 'deep-dark': 'Source Code Pro', + 'material': 'Source Code Pro', + 'light': 'Jetbrains Mono', + 'bright': 'Jetbrains Mono', + } +} + +const iconTheme = { + 'nordic': 'Candy', + 'deep-dark': 'Candy', + 'material': 'Candy', + 'light': 'Candy', + 'bright': 'Candy' +} + +const yaziThemes = { + 'nordic': 'tokyo-night', + 'deep-dark': 'vscode-dark-modern', + 'material': 'dracula', + 'light': 'vscode-light-modern', + 'bright': 'vscode-light-modern', +} diff --git a/build/helpers/render.js b/build/helpers/render.js new file mode 100644 index 0000000..af70f6f --- /dev/null +++ b/build/helpers/render.js @@ -0,0 +1,68 @@ +const mustache = require( 'mustache' ); +const colorThief = require( '@janishutz/colorthief' ); +const fs = require( 'fs' ); +const path = require( 'path' ); +const util = require( './util' ); +const generateTheme = require( './generateTheme' ); + +const build = ( wallpaper, lockpaper, theme ) => { + console.log( '\n=> Extracting colours' ); + // Extract colour palette from chosen wallpaper using Color-Thief + colorThief.getPalette( wallpaper ).then( palette => { + // Define view options (for rendering with mustache) + if ( theme === 'test' ) { + palette = [ [ 255, 0, 0 ], [ 0, 255, 0 ], [ 0, 0, 255 ] ]; + } + + const view = generateTheme.generateTheme( theme, wallpaper, lockpaper, palette ); + + try { + fs.mkdir( path.join( __dirname, '/dist' ) ); + } catch ( e ) { + + } + + // recursively index files from config directory -> Maybe add a file to each + // directory to indicate whether or not to index files in it? + const fileList = util.treeWalker( path.join( __dirname, '/../../renderable/' ), '*', [ 'node_modules', '@girs', '.gitignore', '.git', 'flavours' ] ); + + for (let index = 0; index < fileList.length; index++) { + try { + render( fileList[ index ], view ); + } catch ( e ) { + console.error( '=> Render failed for ' + fileList[ index ] + ' with error ' + e ); + } + } + + util.themePreProcessor( path.join( __dirname, '/../../gtk-theme/src/gtk-4.0/gtk.css' ), 'src', 'dist' ); + util.themePreProcessor( path.join( __dirname, '/../../gtk-theme/src/gtk-3.0/gtk.css' ), 'src', 'dist' ); + render( path.join( __dirname, '/../../gtk-theme/src/colours.css' ), view, 'src', 'dist' ); + } ).catch( e => { + console.error( e ); + console.error( '\n=> Failed to load image or retrieve colour palette from it' ); + } ); +} + +/** + * @param {string} templatePath - absolute path to config directory + * @param {object} view - rendering config passed to mustache + * @param {string} originalDir - The original directory, defaults to renderable + * @param {string} newDir - the output directory override, defaults to config + */ +const render = ( templatePath, view, originalDir = 'renderable', newDir = 'config' ) => { + // Load template from disk (all can be found in /renderable) + // TODO: Make exclusion better plus copy other files maybe? + const template = '' + fs.readFileSync( templatePath ); + const outPath = path.join( templatePath.replace( originalDir, newDir ) ); + console.log( '=> Rendering to ' + outPath ); + try { + fs.mkdirSync( path.dirname( outPath ), { + recursive: true, + } ); + } catch ( e ) { + console.error( e ); + } + fs.writeFileSync( outPath, mustache.render( template, view ) ); +} + +module.exports = build; diff --git a/build/util.js b/build/helpers/util.js similarity index 100% rename from build/util.js rename to build/helpers/util.js diff --git a/build/render.js b/build/render.js deleted file mode 100644 index 4129d5b..0000000 --- a/build/render.js +++ /dev/null @@ -1,318 +0,0 @@ -const mustache = require( 'mustache' ); -const colorThief = require( '@janishutz/colorthief' ); -const fs = require( 'fs' ); -const path = require( 'path' ); -const util = require( './util' ); -const renderColourAsRGB = util.renderColourAsRGB; -const renderColourAsRGBA = util.renderColourAsRGBA; -const renderColourAsHex = util.renderColourAsHex; - -const build = ( wallpaper, lockpaper, theme ) => { - console.log( '\n=> Extracting colours' ); - // Extract colour palette from chosen wallpaper using Color-Thief - colorThief.getPalette( wallpaper ).then( palette => { - // Define view options (for rendering with mustache) - if ( theme === 'test' ) { - palette = [ [ 255, 0, 0 ], [ 0, 255, 0 ], [ 0, 0, 255 ] ]; - } - const view = { - 'wallpaper-path': wallpaper, - 'lockpaper-path': lockpaper, - - // ┌ ┐ - // │ Colours │ - // └ ┘ - // ── Foreground ─────────────────────────────────────────────────── - 'colour-foreground-hex': renderColourAsHex( colours.foreground[ theme ] ), - 'colour-foreground-rgb': renderColourAsRGB( colours.foreground[ theme ] ), - 'colour-foreground-rgba': renderColourAsRGBA( colours.foreground[ theme ], 0.5 ), - 'colour-foreground-rgba-07': renderColourAsRGBA( colours.foreground[ theme ], 0.7 ), - 'colour-foreground-rgba-06': renderColourAsRGBA( colours.foreground[ theme ], 0.6 ), - 'colour-foreground-rgba-05': renderColourAsRGBA( colours.foreground[ theme ], 0.5 ), - 'colour-foreground-rgba-03': renderColourAsRGBA( colours.foreground[ theme ], 0.3 ), - 'colour-foreground-rgba-02': renderColourAsRGBA( colours.foreground[ theme ], 0.2 ), - 'colour-foreground-rgba-01': renderColourAsRGBA( colours.foreground[ theme ], 0.1 ), - - // ── Accent foreground colour ───────────────────────────────────── - 'colour-foreground-accent-hex': renderColourAsHex( colours['foreground-accent'][ theme ] ), - 'colour-foreground-accent-rgba-07': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.7 ), - 'colour-foreground-accent-rgba-06': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.6 ), - 'colour-foreground-accent-rgba-05': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.5 ), - 'colour-foreground-accent-rgba-03': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.3 ), - 'colour-foreground-accent-rgba-02': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.2 ), - - // ── Accent colour ──────────────────────────────────────────────── - 'colour-accent-hex': renderColourAsHex( palette[ 0 ] ), - 'colour-accent-rgb': renderColourAsRGB( palette[ 0 ] ), - 'colour-accent-rgba': renderColourAsRGBA( palette[ 0 ], 0.3 ), - 'colour-accent-rgba-07': renderColourAsRGBA( palette[ 0 ], 0.7 ), - 'colour-accent-rgba-05': renderColourAsRGBA( palette[ 0 ], 0.5 ), - 'colour-accent-rgba-03': renderColourAsRGBA( palette[ 0 ], 0.3 ), - 'colour-accent-rgba-02': renderColourAsRGBA( palette[ 0 ], 0.2 ), - 'colour-accent-rgba-015': renderColourAsRGBA( palette[ 0 ], 0.15 ), - 'colour-accent-rgba-011': renderColourAsRGBA( palette[ 0 ], 0.11 ), - 'colour-accent-rgba-007': renderColourAsRGBA( palette[ 0 ], 0.07 ), - 'colour-accent-hyprland': util.renderColourAsRGBAHex( palette[ 0 ], 0.8 ), - // ─────────────────────────────────────────────────────────────────── - 'colour-accent-gradient-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, gradientMultipliers[ theme ] ) ), - 'colour-accent-gradient-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 2, gradientMultipliers[ theme ] ) ), - 'colour-accent-gradient-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 3, gradientMultipliers[ theme ] ) ), - 'colour-accent-gradient-4-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 4, gradientMultipliers[ theme ] ) ), - 'colour-accent-gradient-5-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 5, gradientMultipliers[ theme ] ) ), - 'colour-accent-gradient-inverse-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), - 'colour-accent-gradient-inverse-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), - 'colour-accent-gradient-inverse-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), - - // ── Secondary accent ───────────────────────────────────────────── - 'colour-accent-2-hex': renderColourAsHex( palette[ 1 ] ), - 'colour-accent-2-rgb': renderColourAsRGB( palette[ 1 ] ), - 'colour-accent-2-rgba-07': renderColourAsRGBA( palette[ 1 ], 0.7 ), - 'colour-accent-2-rgba-05': renderColourAsRGBA( palette[ 1 ], 0.5 ), - 'colour-accent-2-rgba-03': renderColourAsRGBA( palette[ 1 ], 0.3 ), - 'colour-accent-2-rgba-02': renderColourAsRGBA( palette[ 1 ], 0.2 ), - 'colour-accent-2-rgba-015': renderColourAsRGBA( palette[ 1 ], 0.15 ), - 'colour-accent-2-rgba-01': renderColourAsRGBA( palette[ 1 ], 0.1 ), - 'colour-accent-2-hyprland': util.renderColourAsRGBAHex( palette[ 1 ], 0.8 ), - - // ── Tertiary accent ────────────────────────────────────────────── - 'colour-accent-3-hex': renderColourAsHex( palette[ 2 ] ), - 'colour-accent-3-rgb': renderColourAsRGB( palette[ 2 ] ), - 'colour-accent-3-hyprland': util.renderColourAsRGBAHex( palette[ 2 ], 0.8 ), - - // ── Background ─────────────────────────────────────────────────── - 'colour-background-hex': renderColourAsHex( colours.background[ theme ] ), - 'colour-background-rgb': renderColourAsRGB( colours.background[ theme ] ), - 'colour-background-rgba': renderColourAsRGBA( colours.background[ theme ], 0.5 ), - 'colour-background-rgba-07': renderColourAsRGBA( colours.background[ theme ], 0.7 ), - 'colour-background-rgba-05': renderColourAsRGBA( colours.background[ theme ], 0.5 ), - 'colour-background-rgba-03': renderColourAsRGBA( colours.background[ theme ], 0.3 ), - 'colour-background-rgba-02': renderColourAsRGBA( colours.background[ theme ], 0.2 ), - 'colour-background-rgba-015': renderColourAsRGBA( colours.background[ theme ], 0.15 ), - 'colour-background-rgba-011': renderColourAsRGBA( colours.background[ theme ], 0.11 ), - - // ── Background Alternative ─────────────────────────────────────── - 'colour-background-alternative-hex': renderColourAsHex( colours[ 'background-alternative' ][ theme ] ), - 'colour-background-alternative-rgb': renderColourAsRGB( colours[ 'background-alternative' ][ theme ] ), - 'colour-background-alternative-rgba-07': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.7 ), - 'colour-background-alternative-rgba-06': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.6 ), - 'colour-background-alternative-rgba-05': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.5 ), - 'colour-background-alternative-rgba-04': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.4 ), - 'colour-background-alternative-rgba-03': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.3 ), - 'colour-background-alternative-rgba-02': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.2 ), - 'colour-background-alternative-rgba-015': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.15 ), - 'colour-background-alternative-rgba-01': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.1 ), - - // ── Background Tertiary ────────────────────────────────────────── - 'colour-background-tertiary-hex': renderColourAsHex( colours[ 'background-tertiary' ][ theme ] ), - 'colour-background-tertiary-rgb': renderColourAsRGB( colours[ 'background-tertiary' ][ theme ] ), - 'colour-background-tertiary-rgba-05': renderColourAsRGBA( colours[ 'background-tertiary' ][ theme ], 0.5 ), - 'colour-background-tertiary-rgba-02': renderColourAsRGBA( colours[ 'background-tertiary' ][ theme ], 0.2 ), - - // ── Shadow ─────────────────────────────────────────────────────── - 'colour-shadow-hex': renderColourAsHex( colours.shadow[ theme ] ), - 'colour-shadow-rgb': renderColourAsRGB( colours.shadow[ theme ] ), - 'colour-shadow-hyprland': util.renderColourAsRGBHex( colours.shadow[ theme ] ), - 'colour-shadow-rgba-07': renderColourAsRGBA( colours.shadow[ theme ], 0.7 ), - 'colour-shadow-rgba-05': renderColourAsRGBA( colours.shadow[ theme ], 0.5 ), - 'colour-shadow-rgba-03': renderColourAsRGBA( colours.shadow[ theme ], 0.3 ), - 'colour-shadow-rgba-02': renderColourAsRGBA( colours.shadow[ theme ], 0.2 ), - 'colour-shadow-rgba-015': renderColourAsRGBA( colours.shadow[ theme ], 0.15 ), - 'colour-shadow-rgba-011': renderColourAsRGBA( colours.shadow[ theme ], 0.11 ), - - // ── Inactive ───────────────────────────────────────────────────── - 'colour-inactive-hex': renderColourAsHex( colours.inactive[ theme ] ), - 'colour-inactive-rgb': renderColourAsRGB( colours.inactive[ theme ] ), - 'colour-inactive-rgba-07': renderColourAsRGBA( colours.inactive[ theme ], 0.7 ), - 'colour-inactive-rgba-05': renderColourAsRGBA( colours.inactive[ theme ], 0.5 ), - 'colour-inactive-rgba-03': renderColourAsRGBA( colours.inactive[ theme ], 0.3 ), - 'colour-inactive-rgba-02': renderColourAsRGBA( colours.inactive[ theme ], 0.2 ), - 'colour-inactive-rgba-015': renderColourAsRGBA( colours.inactive[ theme ], 0.15 ), - // ─────────────────────────────────────────────────────────────────── - 'colour-inactive-background-hex': renderColourAsHex( colours[ 'inactive-background' ][ theme ] ), - 'colour-inactive-background-rgb': renderColourAsRGB( colours[ 'inactive-background' ][ theme ] ), - 'colour-inactive-background-hyprland': util.renderColourAsRGBHex( colours[ 'inactive-background' ][ theme ] ), - 'colour-inactive-background-rgba-07': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.7 ), - 'colour-inactive-background-rgba-05': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.5 ), - 'colour-inactive-background-rgba-04': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.4 ), - 'colour-inactive-background-rgba-03': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.3 ), - 'colour-inactive-background-rgba-02': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.2 ), - 'colour-inactive-background-rgba-015': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.15 ), - 'colour-inactive-background-rgba-01': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.1 ), - - // ┌ ┐ - // │ Fonts │ - // └ ┘ - 'font-primary': fonts.primary[ theme ], - 'font-accent': fonts.accent[ theme ], - 'font-mono': fonts.mono[ theme ], - - // ┌ ┐ - // │ yazi theme │ - // └ ┘ - 'yazi-theme': yaziThemes[ theme ], - - // ┌ ┐ - // │ Path to this repo on disk │ - // └ ┘ - 'path-to-dotfiles': __dirname.slice(0, __dirname.length - 5), - } - - try { - fs.mkdir( path.join( __dirname, '/dist' ) ); - } catch ( e ) { - - } - - // recursively index files from config directory -> Maybe add a file to each - // directory to indicate whether or not to index files in it? - const fileList = util.treeWalker( path.join( __dirname, '/../renderable/' ), '*', [ 'node_modules', '@girs', '.gitignore', '.git', 'flavours' ] ); - - for (let index = 0; index < fileList.length; index++) { - try { - render( fileList[ index ], view ); - } catch ( e ) { - console.error( '=> Render failed for ' + fileList[ index ] + ' with error ' + e ); - } - } - - util.themePreProcessor( path.join( __dirname, '/../gtk-theme/src/gtk-4.0/gtk.css' ), 'src', 'dist' ); - util.themePreProcessor( path.join( __dirname, '/../gtk-theme/src/gtk-3.0/gtk.css' ), 'src', 'dist' ); - render( path.join( __dirname, '/../gtk-theme/src/colours.css' ), view, 'src', 'dist' ); - // TODO: Copy over to /usr/share/themes/Adaptive-Theme/ - } ).catch( e => { - console.error( e ); - console.error( '\n=> Failed to load image or retrieve colour palette from it' ); - } ); -} - -const gradientMultipliers = { - 'nordic': 0.9, - 'deep-dark': 0.8, - 'material': 0.85, - 'light': 1.1, - 'bright': 1.15, - 'test': 0.75 -} -const colours = { - foreground: { - 'nordic': [ 200, 220, 255 ], - 'deep-dark': [ 230, 230, 230 ], - 'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator - 'light': [ 40, 40, 40 ], - 'bright': [ 0, 0, 0 ], - 'test': [ 0, 0, 0 ], - }, - 'foreground-accent': { - 'nordic': [ 255, 255, 255 ], - 'deep-dark': [ 255, 255, 255 ], - 'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator - 'light': [ 0, 0, 0 ], - 'bright': [ 50, 50, 50 ], - 'test': [ 0, 0, 0 ], - }, - background: { - 'nordic': [ 10, 10, 15 ], - 'deep-dark': [ 20, 20, 20 ], - 'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator - 'light': [ 230, 230, 230 ], - 'bright': [ 255, 255, 255 ], - 'test': [ 255, 255, 255 ], - }, - 'background-alternative': { - 'nordic': [ 20, 20, 25 ], - 'deep-dark': [ 30, 30, 30 ], - 'material': [ 40, 40, 40 ], // TODO: Will be calculated by material theme generator - 'light': [ 210, 210, 210 ], - 'bright': [ 230, 230, 230 ], - 'test': [ 255, 255, 0 ] // brown - }, - 'background-tertiary': { - 'nordic': [ 0, 0, 0 ], - 'deep-dark': [ 45, 45, 45 ], - 'material': [ 0, 0, 0 ], // TODO: Will be calculated by material theme generator - 'light': [ 180, 180, 180 ], - 'bright': [ 200, 200, 200 ], - 'test': [ 255, 0, 255 ] // purple - }, - shadow: { - 'nordic': [ 0, 0, 2 ], - 'deep-dark': [ 40, 40, 40 ], - 'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator - 'light': [ 190, 190, 190 ], - 'bright': [ 150, 150, 150 ], - 'test': [ 120, 0, 0 ] // dark red - }, - inactive: { - 'nordic': [ 200, 200, 200 ], - 'deep-dark': [ 200, 200, 200 ], - 'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator - 'light': [ 65, 65, 65 ], - 'bright': [ 60, 60, 60 ], - 'test': [ 150, 150, 150 ] - }, - 'inactive-background': { - 'nordic': [ 0, 0, 0 ], - 'deep-dark': [ 0, 0, 0 ], - 'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator - 'light': [ 80, 80, 80 ], - 'bright': [ 60, 60, 60 ], - 'test': [ 60, 60, 60 ] - } -} - -const fonts = { - 'primary': { - 'nordic': 'Comfortaa', - 'deep-dark': 'Comfortaa', - 'material': 'Comfortaa', - 'light': 'Adwaita Sans', - 'bright': 'Adwaita Sans Extralight' - }, - 'accent': { - 'nordic': 'Adwaita Sans', - 'deep-dark': 'Adwaita Sans', - 'material': 'Adwaita Sans', - 'light': 'Cantarell', - 'bright': 'Contarell Thin' - }, - 'mono': { - 'nordic': 'Source Code Pro', - 'deep-dark': 'Source Code Pro', - 'material': 'Source Code Pro', - 'light': 'Jetbrains Mono', - 'bright': 'Jetbrains Mono', - } -} - -const yaziThemes = { - 'nordic': 'tokyo-night', - 'deep-dark': 'vscode-dark-modern', - 'material': 'dracula', - 'light': 'vscode-light-modern', - 'bright': 'vscode-light-modern', -} - - -/** - * @param {string} templatePath - absolute path to config directory - * @param {object} view - rendering config passed to mustache - * @param {string} originalDir - The original directory, defaults to renderable - * @param {string} newDir - the output directory override, defaults to config - */ -const render = ( templatePath, view, originalDir = 'renderable', newDir = 'config' ) => { - // Load template from disk (all can be found in /renderable) - // TODO: Make exclusion better plus copy other files maybe? - const template = '' + fs.readFileSync( templatePath ); - const outPath = path.join( templatePath.replace( originalDir, newDir ) ); - console.log( '=> Rendering to ' + outPath ); - try { - fs.mkdirSync( path.dirname( outPath ), { - recursive: true, - } ); - } catch ( e ) { - console.error( e ); - } - fs.writeFileSync( outPath, mustache.render( template, view ) ); -} - -module.exports = build;