diff --git a/themes/src/custom-nu-themes/catppuccin-frappe.nu b/themes/nu-themes/catppuccin-frappe.nu similarity index 81% rename from themes/src/custom-nu-themes/catppuccin-frappe.nu rename to themes/nu-themes/catppuccin-frappe.nu index b55e7ff37..bccb5f7b5 100644 --- a/themes/src/custom-nu-themes/catppuccin-frappe.nu +++ b/themes/nu-themes/catppuccin-frappe.nu @@ -61,7 +61,7 @@ export def main [] { } else if $in > 1wk { $color_palette.red } - } + } range: $color_palette.text float: $color_palette.text string: $color_palette.text @@ -112,4 +112,40 @@ export def main [] { foreground: $color_palette.text cursor: $color_palette.blue } -} \ No newline at end of file +} + + # Update the Nushell configuration +export def --env "set color_config" [] { + $env.config.color_config = (main) +} + +# Update terminal colors +export def "update terminal" [] { + let theme = (main) + + # Set terminal colors + let osc_screen_foreground_color = '10;' + let osc_screen_background_color = '11;' + let osc_cursor_color = '12;' + + $" + (ansi -o $osc_screen_foreground_color)($theme.foreground)(char bel) + (ansi -o $osc_screen_background_color)($theme.background)(char bel) + (ansi -o $osc_cursor_color)($theme.cursor)(char bel) + " + # Line breaks above are just for source readability + # but create extra whitespace when activating. Collapse + # to one line and print with no-newline + | str replace --all "\n" '' + | print -n $"($in)\r" +} + +export module activate { + export-env { + set color_config + update terminal + } +} + +# Activate the theme when sourced +use activate diff --git a/themes/nu-themes/catppuccin-latte.nu b/themes/nu-themes/catppuccin-latte.nu index 80f30d2bb..adc5b0f75 100644 --- a/themes/nu-themes/catppuccin-latte.nu +++ b/themes/nu-themes/catppuccin-latte.nu @@ -1,4 +1,3 @@ -# Retrieve the theme settings export def main [] { const color_palette = { rosewater: "#dc8a78" @@ -50,7 +49,7 @@ export def main [] { $color_palette.red } } - datetime: {|| (date now) - $in | + date: {|| (date now) - $in | if $in < 1hr { $color_palette.green } else if $in < 1day { @@ -115,7 +114,7 @@ export def main [] { } } -# Update the Nushell configuration + # Update the Nushell configuration export def --env "set color_config" [] { $env.config.color_config = (main) } @@ -149,4 +148,4 @@ export module activate { } # Activate the theme when sourced -use activate \ No newline at end of file +use activate diff --git a/themes/nu-themes/catppuccin-mocha.nu b/themes/nu-themes/catppuccin-mocha.nu index accb237a8..6929fc5d6 100644 --- a/themes/nu-themes/catppuccin-mocha.nu +++ b/themes/nu-themes/catppuccin-mocha.nu @@ -1,4 +1,3 @@ -# Retrieve the theme settings export def main [] { const color_palette = { rosewater: "#f5e0dc" @@ -50,7 +49,7 @@ export def main [] { $color_palette.red } } - datetime: {|| (date now) - $in | + date: {|| (date now) - $in | if $in < 1hr { $color_palette.green } else if $in < 1day { @@ -115,7 +114,7 @@ export def main [] { } } -# Update the Nushell configuration + # Update the Nushell configuration export def --env "set color_config" [] { $env.config.color_config = (main) } @@ -149,4 +148,4 @@ export module activate { } # Activate the theme when sourced -use activate \ No newline at end of file +use activate diff --git a/themes/src/asciinema-script b/themes/src/asciinema-script new file mode 100644 index 000000000..dfc8d2a04 --- /dev/null +++ b/themes/src/asciinema-script @@ -0,0 +1,8 @@ +use .. * +sleep 200ms +source ../nu-themes/$theme_name.nu +clear +print 'Theme: ($theme_name)' +print -n (preview theme small) +sleep 200ms +print "" diff --git a/themes/src/custom-nu-themes/catppuccin-latte.nu b/themes/src/custom-nu-themes/catppuccin-latte.nu deleted file mode 100644 index 3523ac448..000000000 --- a/themes/src/custom-nu-themes/catppuccin-latte.nu +++ /dev/null @@ -1,115 +0,0 @@ -export def main [] { - const color_palette = { - rosewater: "#dc8a78" - flamingo: "#dd7878" - pink: "#ea76cb" - mauve: "#8839ef" - red: "#d20f39" - maroon: "#e64553" - peach: "#fe640b" - yellow: "#df8e1d" - green: "#40a02b" - teal: "#179299" - sky: "#04a5e5" - sapphire: "#209fb5" - blue: "#1e66f5" - lavender: "#7287fd" - text: "#4c4f69" - subtext1: "#5c5f77" - subtext0: "#6c6f85" - overlay2: "#7c7f93" - overlay1: "#8c8fa1" - overlay0: "#9ca0b0" - surface2: "#acb0be" - surface1: "#bcc0cc" - surface0: "#ccd0da" - crust: "#dce0e8" - mantle: "#e6e9ef" - base: "#eff1f5" - } - - return { - separator: $color_palette.overlay0 - leading_trailing_space_bg: { attr: "n" } - header: { fg: $color_palette.blue attr: "b" } - empty: $color_palette.lavender - bool: $color_palette.lavender - int: $color_palette.peach - duration: $color_palette.text - filesize: {|e| - if $e < 1mb { - $color_palette.green - } else if $e < 100mb { - $color_palette.yellow - } else if $e < 500mb { - $color_palette.peach - } else if $e < 800mb { - $color_palette.maroon - } else if $e > 800mb { - $color_palette.red - } - } - date: {|| (date now) - $in | - if $in < 1hr { - $color_palette.green - } else if $in < 1day { - $color_palette.yellow - } else if $in < 3day { - $color_palette.peach - } else if $in < 1wk { - $color_palette.maroon - } else if $in > 1wk { - $color_palette.red - } - } - range: $color_palette.text - float: $color_palette.text - string: $color_palette.text - nothing: $color_palette.text - binary: $color_palette.text - 'cell-path': $color_palette.text - row_index: { fg: $color_palette.mauve attr: "b" } - record: $color_palette.text - list: $color_palette.text - block: $color_palette.text - hints: $color_palette.overlay1 - search_result: { fg: $color_palette.red bg: $color_palette.text } - - shape_and: { fg: $color_palette.pink attr: "b" } - shape_binary: { fg: $color_palette.pink attr: "b" } - shape_block: { fg: $color_palette.blue attr: "b" } - shape_bool: $color_palette.teal - shape_custom: $color_palette.green - shape_datetime: { fg: $color_palette.teal attr: "b" } - shape_directory: $color_palette.teal - shape_external: $color_palette.teal - shape_externalarg: { fg: $color_palette.green attr: "b" } - shape_filepath: $color_palette.teal - shape_flag: { fg: $color_palette.blue attr: "b" } - shape_float: { fg: $color_palette.pink attr: "b" } - shape_garbage: { fg: $color_palette.text bg: $color_palette.red attr: "b" } - shape_globpattern: { fg: $color_palette.teal attr: "b" } - shape_int: { fg: $color_palette.pink attr: "b" } - shape_internalcall: { fg: $color_palette.teal attr: "b" } - shape_list: { fg: $color_palette.teal attr: "b" } - shape_literal: $color_palette.blue - shape_match_pattern: $color_palette.green - shape_matching_brackets: { attr: "u" } - shape_nothing: $color_palette.teal - shape_operator: $color_palette.peach - shape_or: { fg: $color_palette.pink attr: "b" } - shape_pipe: { fg: $color_palette.pink attr: "b" } - shape_range: { fg: $color_palette.peach attr: "b" } - shape_record: { fg: $color_palette.teal attr: "b" } - shape_redirection: { fg: $color_palette.pink attr: "b" } - shape_signature: { fg: $color_palette.green attr: "b" } - shape_string: $color_palette.green - shape_string_interpolation: { fg: $color_palette.teal attr: "b" } - shape_table: { fg: $color_palette.blue attr: "b" } - shape_variable: $color_palette.pink - - background: $color_palette.base - foreground: $color_palette.text - cursor: $color_palette.blue - } -} \ No newline at end of file diff --git a/themes/src/custom-nu-themes/catppuccin-mocha.nu b/themes/src/custom-nu-themes/catppuccin-mocha.nu deleted file mode 100644 index 37e4f36af..000000000 --- a/themes/src/custom-nu-themes/catppuccin-mocha.nu +++ /dev/null @@ -1,115 +0,0 @@ -export def main [] { - const color_palette = { - rosewater: "#f5e0dc" - flamingo: "#f2cdcd" - pink: "#f5c2e7" - mauve: "#cba6f7" - red: "#f38ba8" - maroon: "#eba0ac" - peach: "#fab387" - yellow: "#f9e2af" - green: "#a6e3a1" - teal: "#94e2d5" - sky: "#89dceb" - sapphire: "#74c7ec" - blue: "#89b4fa" - lavender: "#b4befe" - text: "#cdd6f4" - subtext1: "#bac2de" - subtext0: "#a6adc8" - overlay2: "#9399b2" - overlay1: "#7f849c" - overlay0: "#6c7086" - surface2: "#585b70" - surface1: "#45475a" - surface0: "#313244" - base: "#1e1e2e" - mantle: "#181825" - crust: "#11111b" - } - - return { - separator: $color_palette.overlay0 - leading_trailing_space_bg: { attr: "n" } - header: { fg: $color_palette.blue attr: "b" } - empty: $color_palette.lavender - bool: $color_palette.lavender - int: $color_palette.peach - duration: $color_palette.text - filesize: {|e| - if $e < 1mb { - $color_palette.green - } else if $e < 100mb { - $color_palette.yellow - } else if $e < 500mb { - $color_palette.peach - } else if $e < 800mb { - $color_palette.maroon - } else if $e > 800mb { - $color_palette.red - } - } - date: {|| (date now) - $in | - if $in < 1hr { - $color_palette.green - } else if $in < 1day { - $color_palette.yellow - } else if $in < 3day { - $color_palette.peach - } else if $in < 1wk { - $color_palette.maroon - } else if $in > 1wk { - $color_palette.red - } - } - range: $color_palette.text - float: $color_palette.text - string: $color_palette.text - nothing: $color_palette.text - binary: $color_palette.text - 'cell-path': $color_palette.text - row_index: { fg: $color_palette.mauve attr: "b" } - record: $color_palette.text - list: $color_palette.text - block: $color_palette.text - hints: $color_palette.overlay1 - search_result: { fg: $color_palette.red bg: $color_palette.text } - - shape_and: { fg: $color_palette.pink attr: "b" } - shape_binary: { fg: $color_palette.pink attr: "b" } - shape_block: { fg: $color_palette.blue attr: "b" } - shape_bool: $color_palette.teal - shape_custom: $color_palette.green - shape_datetime: { fg: $color_palette.teal attr: "b" } - shape_directory: $color_palette.teal - shape_external: $color_palette.teal - shape_externalarg: { fg: $color_palette.green attr: "b" } - shape_filepath: $color_palette.teal - shape_flag: { fg: $color_palette.blue attr: "b" } - shape_float: { fg: $color_palette.pink attr: "b" } - shape_garbage: { fg: $color_palette.text bg: $color_palette.red attr: "b" } - shape_globpattern: { fg: $color_palette.teal attr: "b" } - shape_int: { fg: $color_palette.pink attr: "b" } - shape_internalcall: { fg: $color_palette.teal attr: "b" } - shape_list: { fg: $color_palette.teal attr: "b" } - shape_literal: $color_palette.blue - shape_match_pattern: $color_palette.green - shape_matching_brackets: { attr: "u" } - shape_nothing: $color_palette.teal - shape_operator: $color_palette.peach - shape_or: { fg: $color_palette.pink attr: "b" } - shape_pipe: { fg: $color_palette.pink attr: "b" } - shape_range: { fg: $color_palette.peach attr: "b" } - shape_record: { fg: $color_palette.teal attr: "b" } - shape_redirection: { fg: $color_palette.pink attr: "b" } - shape_signature: { fg: $color_palette.green attr: "b" } - shape_string: $color_palette.green - shape_string_interpolation: { fg: $color_palette.teal attr: "b" } - shape_table: { fg: $color_palette.blue attr: "b" } - shape_variable: $color_palette.pink - - background: $color_palette.base - foreground: $color_palette.text - cursor: $color_palette.blue - } -} \ No newline at end of file diff --git a/themes/src/minicap-script b/themes/src/minicap-script new file mode 100644 index 000000000..b01bc72fc --- /dev/null +++ b/themes/src/minicap-script @@ -0,0 +1,7 @@ +use .. * +source ($theme_name) +clear +sleep 100ms +print `Theme name: '($theme_name)' +print -n (preview theme small | table -e) +sleep 250ms diff --git a/themes/src/powershell-script b/themes/src/powershell-script new file mode 100644 index 000000000..e3949b410 --- /dev/null +++ b/themes/src/powershell-script @@ -0,0 +1,15 @@ +use .. * +source ($theme_name) +clear +sleep 100ms +print `Theme name: '($theme_name)'` +print -n \(preview theme small | table -e) +sleep 250ms + +$Host.UI.RawUI.WindowTitle = 'Theme Preview' +Add-Type -AssemblyName System.Windows.Forms +[Windows.Forms.Sendkeys]::SendWait\('%{Prtsc}') +[Windows.Forms.Sendkeys]::SendWait\('%{Prtsc}') +[Windows.Forms.Sendkeys]::SendWait\('%{Prtsc}') +sleep 1 +[Windows.Forms.Clipboard]::GetImage\().Save\('($theme_name).png', [System.Drawing.Imaging.ImageFormat]::Png) diff --git a/themes/src/preview-generate-screenshots.nu b/themes/src/preview-generate-screenshots.nu index 62afaabce..668d0132d 100644 --- a/themes/src/preview-generate-screenshots.nu +++ b/themes/src/preview-generate-screenshots.nu @@ -9,8 +9,8 @@ # * Place your terminal window against a separate solid # background to reduce artifacts -def save_screenshot [ method, theme_name ] { - use .../stdlib-candidate/std-rfc/str +def save_screenshot [ method, theme_name, themes ] { + use ../../stdlib-candidate-archive/stdlib-candidate-older/std-rfc/str/ match $method { # This method for generating terminal screenshots uses # a pure-PowerShell script. The caveat is that Windows @@ -22,153 +22,125 @@ def save_screenshot [ method, theme_name ] { # This method should work from either WSL or Nushell # for Windows "powershell" => { - let ps_script = $" - use .. * - source ($name) - clear - sleep 100ms - print `Theme name: '($theme_name)'` - print -n \(preview theme small | table -e) - sleep 250ms - - $Host.UI.RawUI.WindowTitle = 'Theme Preview' - Add-Type -AssemblyName System.Windows.Forms - [Windows.Forms.Sendkeys]::SendWait\('%{Prtsc}') - [Windows.Forms.Sendkeys]::SendWait\('%{Prtsc}') - [Windows.Forms.Sendkeys]::SendWait\('%{Prtsc}') - sleep 1 - [Windows.Forms.Clipboard]::GetImage\().Save\('($theme_name).png', [System.Drawing.Imaging.ImageFormat]::Png) - " + # in the powershell script template replace "$theme_name" the text holder with $theme_name the actual string passed to this function + let powershell_nu_script = open powershell-script --raw | str replace -a "$theme_name" $theme_name | str dedent $"powershell.exe -c \" - ($ps_script) + ($powershell_nu_script) \"" } # Requires MiniCap, a utility for capturing screenshots on Windows "minicap" => { - $' - use .. * - source ($name) - clear - sleep 100ms - print `Theme name: '($theme_name)'` - print -n \(preview theme small | table -e) - sleep 250ms - - c:\\apps\\MiniCap\\MiniCap.exe -captureactivewin -bordershadow -save ($theme_name).png -closeapp -exit - ' + # in the script template replace "$theme_name" the text holder with $theme_name the actual string passed to this function + let minicap_nu_script = open minicap-script --raw | str replace -a "$theme_name" $theme_name + + } # Requires asciinema (Linux/Mac only), agg (asciinema to gif), and ffmpeg # Currently uses Caskaydia Cover Nerd Font installed in user's local fonts "asciinema" => { print $theme_name - $" - let asciinema_nu_script = $\" - use .. * - sleep 200ms - source ../nu-themes/($theme_name).nu - clear - print 'Theme: ($theme_name)' - print -n \\\(preview theme small) - sleep 200ms - print "" - \" - - mkdir conversions - - asciinema rec -c $'nu -c "\($asciinema_nu_script)\"' ./conversions/($theme_name).cast - - # Define terminal colors for asciinema-to-gif converter - let sgr_colors = { - black: r#'000000'# - red: r#'800000'# - green: r#'808000'# - yellow: r#'008000'# - blue: r#'000080'# - magenta: r#'800080'# - cyan: r#'008080'# - white: r#'c0c0c0'# - gray: r#'808080'# - bright_red: r#'ff0000'# - bright_green: r#'00ff00'# - bright_yellow: r#'ffff00'# - bright_blue: r#'0000ff'# - bright_magenta: r#'ff00ff'# - bright_cyan: r#'00ffff'# - bright_white: r#'ffffff'# - } - - use ../nu-themes/($theme_name).nu - let theme_fg_bg = { - background: \(\(($theme_name)).background | str replace '#' '') - foreground: \(\(($theme_name)).foreground | str replace '#' '') - } - - # Combine the theme foreground/background with the SGR colors for an agg theme - let agg_theme = { - ...$theme_fg_bg - ...$sgr_colors - } - | transpose key value - | get value - | str join "," - - # Convert asciinema recording to gif - # Line-height of 1.2 to keep table drawing characters together - agg -v --font-size=24 --renderer=resvg --line-height 1.2 --font-dir ~/.nix-profile/share/fonts/truetype/NerdFonts --font-family \"CaskaydiaCove NFM\" --theme $agg_theme ./conversions/($theme_name).cast ./conversions/($theme_name).gif - rm ./conversions/($theme_name).cast - - ffmpeg -i ./conversions/($theme_name).gif -vf 'select=eq\\\(n\\,1)' -fps_mode vfr -q:v 2 -frames:v 1 -update 1 ../screenshots/($theme_name).png - rm ./conversions/($theme_name).gif + + # in the asciinema script template replace "$theme_name" the text holder with $theme_name the actual string passed to this function + let asciinema_nu_script = open asciinema-script --raw | str replace -a "$theme_name" $theme_name + + mkdir conversions + asciinema rec --overwrite -c $'nu -c "\($asciinema_nu_script)\"' ./conversions/($theme_name).cast + + # Define terminal colors for asciinema-to-gif converter + let sgr_colors = { + black: r#'000000'# + red: r#'800000'# + green: r#'808000'# + yellow: r#'008000'# + blue: r#'000080'# + magenta: r#'800080'# + cyan: r#'008080'# + white: r#'c0c0c0'# + gray: r#'808080'# + bright_red: r#'ff0000'# + bright_green: r#'00ff00'# + bright_yellow: r#'ffff00'# + bright_blue: r#'0000ff'# + bright_magenta: r#'ff00ff'# + bright_cyan: r#'00ffff'# + bright_white: r#'ffffff'# + } + + const nu_themes = "../nu-themes" + let theme = $themes | where $it == $theme_name + let name_of_theme = $theme | get 0 + + # need to import one of the themes at ../nu-themes/(some-theme).nu + # but compiler will fail because + # name_of_theme is not a parse time constant + # is there a workaround? + use $"../nu-themes/($theme_name).nu" + use $"($nu_themes)/($name_of_theme).nu" + use $"($nu_themes)/($theme_name).nu" + print "using theme:" + print $theme + + let command = $"($theme_name) | get background | str replace '#' ''" + print "command to run:" + print $command + asciinema rec --overwrite -c $'nu -c "\($"($theme) | get background | str replace '#' ''")\"' ./conversions/($theme_name).cast + + let theme_fg_bg = { + background: (nu -c $command) + foreground: (nu -c $command) + } + + # Combine the theme foreground/background with the SGR colors for an agg theme + let agg_theme = { + ...$theme_fg_bg + ...$sgr_colors + } + | transpose key value + | get value + | str join "," + + # Convert asciinema recording to gif + # Line-height of 1.2 to keep table drawing characters together + agg -v --font-size=24 --renderer=resvg --line-height 1.2 --font-dir ~/.nix-profile/share/fonts/truetype/NerdFonts --font-family \"CaskaydiaCove NFM\" --theme $agg_theme ./conversions/($theme_name).cast ./conversions/($theme_name).gif + rm ./conversions/($theme_name).cast + + ffmpeg -i ./conversions/($theme_name).gif -vf 'select=eq\\\(n\\,1)' -fps_mode vfr -q:v 2 -frames:v 1 -update 1 ../screenshots/($theme_name).png + rm ./conversions/($theme_name).gif " } } - } -def "preview generate screenshots" [screenshot_method, theme_count = 10_000] { - use .../stdlib-candidate/std-rfc str - - let themes = ( - "../nu-themes/" - | path expand - | path join "*.nu" - | into glob - | ls $in - ) - - for theme in $themes { - let name = $theme.name - let basename = ($theme.name | path parse | get stem) - - let filename = ( - "../screenshots" - | path join $'($name | path parse | get stem).png' - ) +def "preview generate screenshots" [screenshot_method, themes, theme_count = 10_000] { + use ../../stdlib-candidate-archive/stdlib-candidate-older/std-rfc/str/ + + for $theme in $themes { + + let filename = "../screenshots" | path join $theme ".png" + + let script = $" + #use .. * + #source ($theme) + #clear + #sleep 100ms + #print `Theme name: '($theme)'` + #print -n \(preview theme small | table -e) + #sleep 250ms + (save_screenshot $screenshot_method $theme $themes) + " - let script = $" - #use .. * - #source ($name) - #clear - #sleep 100ms - #print `Theme name: '($basename)'` - #print -n \(preview theme small | table -e) - #sleep 250ms - (save_screenshot $screenshot_method $basename) - " - - # Run with default config - # nu -n -c $script - nu -n -c $"(save_screenshot $screenshot_method $basename)" + # Run with default config + # nu -n -c $script + nu -n -c $"(save_screenshot $screenshot_method $theme $themes)" } - } def "preview generate readme" [] { - use .../stdlib-candidate/std-rfc str + use ../../stdlib-candidate-archive/stdlib-candidate-older/std-rfc/str/ # README Title "# Screenshots of Theme Previews\n\n" @@ -204,7 +176,7 @@ def "preview generate readme" [] { } def main [screenshot_method] { - use .../stdlib-candidate/std-rfc/str + use ../../stdlib-candidate-archive/stdlib-candidate-older/std-rfc/str/ if $env.PWD != $env.FILE_PWD { " @@ -217,8 +189,22 @@ def main [screenshot_method] { return } else { - mkdir ../screenshots - preview generate screenshots $screenshot_method - preview generate readme + let nu_themes = ( + "../nu-themes/" + | path expand + | path join "*.nu" + | into glob + | ls $in + ) + + # this is the file name of all the files in ../nu-themes + let themes = $nu_themes | each { $in.name | path parse | get stem } + + mkdir ../screenshots + preview generate screenshots $screenshot_method $themes + preview generate readme } -} \ No newline at end of file + + + } +