From 861aa28201490221357e5daf64e66a91128d36fe Mon Sep 17 00:00:00 2001 From: Gabriel Arazas Date: Sun, 5 Jan 2025 18:53:54 +0800 Subject: [PATCH] pkgs/firefox-addons: add RSSHub Radar --- devcontainers/ruby-on-rails.nix | 21 ++ .../workflows/horizontal-hunger/README.adoc | 5 + .../horizontal-hunger/config/ags/config.js | 5 + .../horizontal-hunger/config/niri/config | 195 ++++++++++++++++++ .../workflows/horizontal-hunger/default.nix | 188 +++++++++++++++++ modules/nixos/services/docker-compose.nix | 91 ++++++++ modules/wrapper-manager/fonts.nix | 54 +++++ modules/wrapper-manager/programs/tmux.nix | 53 +++++ pkgs/firefox-addons/default.nix | 21 +- pkgs/firefox-addons/firefox-addons.json | 3 + pkgs/graphite-design-tool/default.nix | 26 +++ pkgs/pd-l2ork/default.nix | 42 ++++ pkgs/purr-data/default.nix | 51 +++++ pkgs/rotp-fusion/default.nix | 52 +++++ pkgs/rotp-modnar/default.nix | 11 + pkgs/tailcall/default.nix | 30 +++ subprojects/bahaghari/CHANGELOG.adoc | 25 +++ subprojects/bahaghari/lib/colors/hsluv.nix | 45 ++++ .../bahaghari/modules/panapton/default.nix | 57 +++++ .../bahaghari/tests/lib/extra-utils.nix | 8 + 20 files changed, 979 insertions(+), 4 deletions(-) create mode 100644 devcontainers/ruby-on-rails.nix create mode 100644 modules/nixos/_private/workflows/horizontal-hunger/README.adoc create mode 100644 modules/nixos/_private/workflows/horizontal-hunger/config/ags/config.js create mode 100644 modules/nixos/_private/workflows/horizontal-hunger/config/niri/config create mode 100644 modules/nixos/_private/workflows/horizontal-hunger/default.nix create mode 100644 modules/nixos/services/docker-compose.nix create mode 100644 modules/wrapper-manager/fonts.nix create mode 100644 modules/wrapper-manager/programs/tmux.nix create mode 100644 pkgs/graphite-design-tool/default.nix create mode 100644 pkgs/pd-l2ork/default.nix create mode 100644 pkgs/purr-data/default.nix create mode 100644 pkgs/rotp-fusion/default.nix create mode 100644 pkgs/rotp-modnar/default.nix create mode 100644 pkgs/tailcall/default.nix create mode 100644 subprojects/bahaghari/CHANGELOG.adoc create mode 100644 subprojects/bahaghari/lib/colors/hsluv.nix create mode 100644 subprojects/bahaghari/modules/panapton/default.nix create mode 100644 subprojects/bahaghari/tests/lib/extra-utils.nix diff --git a/devcontainers/ruby-on-rails.nix b/devcontainers/ruby-on-rails.nix new file mode 100644 index 00000000..ce24519c --- /dev/null +++ b/devcontainers/ruby-on-rails.nix @@ -0,0 +1,21 @@ +{ dockerTools, ruby, bundix, foodogsquaredLib }: + +let name = s: "fds-ruby-on-rails-${ruby.version}${s}"; +in dockerTools.buildImage { + name = name ""; + + copyToRoot = foodogsquaredLib.buildFDSEnv { + name = name "root"; + paths = [ ruby bundix ]; + }; + + runAsRoot = '' + mkdir -p /data + ''; + + config = { + Cmd = [ "/bin/bash" ]; + WorkingDir = "/data"; + Volumes."/data" = { }; + }; +} diff --git a/modules/nixos/_private/workflows/horizontal-hunger/README.adoc b/modules/nixos/_private/workflows/horizontal-hunger/README.adoc new file mode 100644 index 00000000..fb092497 --- /dev/null +++ b/modules/nixos/_private/workflows/horizontal-hunger/README.adoc @@ -0,0 +1,5 @@ += Horizontal hunger +:toc: + + +A custom desktop session fully made with https://github.com/YaLTeR/niri[niri] and https://github.com/Aylur/ags[ags]. diff --git a/modules/nixos/_private/workflows/horizontal-hunger/config/ags/config.js b/modules/nixos/_private/workflows/horizontal-hunger/config/ags/config.js new file mode 100644 index 00000000..6fd0f042 --- /dev/null +++ b/modules/nixos/_private/workflows/horizontal-hunger/config/ags/config.js @@ -0,0 +1,5 @@ +App.config({ + windows: [ + // this is where window definitions will go + ], +}); diff --git a/modules/nixos/_private/workflows/horizontal-hunger/config/niri/config b/modules/nixos/_private/workflows/horizontal-hunger/config/niri/config new file mode 100644 index 00000000..b00774ef --- /dev/null +++ b/modules/nixos/_private/workflows/horizontal-hunger/config/niri/config @@ -0,0 +1,195 @@ +input { + keyboard { + xkb { + // You can set rules, model, layout, variant and options. + // For more information, see xkeyboard-config(7). + layout "us" + options "grp:win_space_toggle,compose:ralt,ctrl:nocaps" + } + } + + touchpad { + tap + natural-scroll + accel-speed 0.2 + } + + mouse { + natural-scroll + accel-speed 0.2 + } + + warp-mouse-to-focus + focus-follows-mouse +} + +// You can configure outputs by their name, which you can find +// by running `niri msg outputs` while inside a niri instance. +// The built-in laptop monitor is usually called "eDP-1". +// Find more information on the wiki: +// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs +// Remember to uncomment the node by removing "/-"! +/-output "eDP-1" { + mode "1920x1080@120.030" + scale 2.0 + transform "normal" + position x=1280 y=0 +} + +layout { + gaps 5 + center-focused-column "on-overflow" + + preset-column-widths { + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + } + + default-column-width { proportion 0.33; } + + focus-ring { + width 4 + active-color "#7fc8ff" + inactive-color "#505050" + } + + border { + off + + width 4 + active-color "#ffc87f" + inactive-color "#505050" + } +} + +screenshot-path null + +animations { + slowdown 2.0 +} + +window-rule { + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} +} + +window-rule { + match app-id=r#"^org\.keepassxc\.KeePassXC$"# + match app-id=r#"^org\.gnome\.World\.Secrets$"# + + block-out-from "screen-capture" +} + +binds { + Mod+T { spawn "alacritty"; } + Mod+D { spawn "fuzzel"; } + + XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; } + XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; } + XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } + XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } + + Mod+Q { close-window; } + + Mod+Left { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + Mod+Ctrl+Left { move-column-left; } + Mod+Ctrl+Down { move-window-down; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Right { move-column-right; } + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { move-column-right; } + + // Alternative commands that move across workspaces when reaching + // the first or last window in a column. + // Mod+J { focus-window-or-workspace-down; } + // Mod+K { focus-window-or-workspace-up; } + // Mod+Ctrl+J { move-window-down-or-to-workspace-down; } + // Mod+Ctrl+K { move-window-up-or-to-workspace-up; } + + Mod+Home { focus-column-first; } + Mod+End { focus-column-last; } + Mod+Ctrl+Home { move-column-to-first; } + Mod+Ctrl+End { move-column-to-last; } + + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + // Alternatively, there are commands to move just a single window: + // Mod+Ctrl+Page_Down { move-window-to-workspace-down; } + // ... + + Mod+Shift+Page_Down { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + Mod+WheelScrollRight { focus-column-right; } + Mod+WheelScrollLeft { focus-column-left; } + Mod+Ctrl+WheelScrollRight { move-column-right; } + Mod+Ctrl+WheelScrollLeft { move-column-left; } + + Mod+Shift+WheelScrollDown { focus-column-right; } + Mod+Shift+WheelScrollUp { focus-column-left; } + Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } + Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } + + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + +} diff --git a/modules/nixos/_private/workflows/horizontal-hunger/default.nix b/modules/nixos/_private/workflows/horizontal-hunger/default.nix new file mode 100644 index 00000000..27753d3f --- /dev/null +++ b/modules/nixos/_private/workflows/horizontal-hunger/default.nix @@ -0,0 +1,188 @@ +{ config, options, lib, pkgs, foodogsquaredLib, ... }: + +let + workflowId = "one.foodogsquared.HorizontalHunger"; + + cfg = config.workflows.workflows.${workflowId}; + sessionConfig = config.programs.gnome-session.sessions.${workflowId}; + + requiredPackages = with pkgs; [ + # The window manager. We only put this here since it has some commands that + # are useful to be having. + cfg.package + + # The application opener. + junction + ]; + + workflowEnvironment = foodogsquaredLib.nixos.mkNixoslikeEnvironment config { + name = "${workflowId}-env"; + paths = requiredPackages ++ cfg.extraApps; + }; +in +{ + options.workflows.enable = lib.mkOption { + type = with lib.types; listOf (enum [ workflowId ]); + }; + + options.workflows.workflows.${workflowId} = { + package = lib.mkOption { + type = lib.types.package; + description = '' + Derivation containing {program}`niri` executable which is the preferred + window manager for this workflow. + ''; + default = pkgs.niri; + }; + + extraApps = lib.mkOption { + type = with lib.types; listOf package; + default = with pkgs; [ + flowtime + dialect + blanket + ]; + description = '' + A list of extraneous applications to be included with the desktop + session. + ''; + }; + }; + + config = lib.mkIf (lib.elem workflowId config.workflows.enable) { + # Enable all of the core services. + hardware.bluetooth.enable = true; + programs.dconf.enable = true; + programs.xwayland.enable = true; + programs.gnupg.agent = { + enable = lib.mkDefault true; + pinentryPackage = pkgs.pinentry-gnome3; + }; + security.polkit.enable = true; + services.colord.enable = lib.mkDefault true; + services.gnome.gnome-keyring.enable = lib.mkDefault true; + services.power-profiles-daemon.enable = true; + services.udisks2.enable = lib.mkDefault true; + services.upower.enable = config.powerManagement.enable; + services.libinput.enable = lib.mkDefault true; + + # Configuring the preferred network manager. + networking.networkmanager.enable = true; + + # Configuring the XDG desktop components. Take note all of these are + # required for the desktop widgets components to work since they rely on + # them. + xdg.mime.enable = true; + xdg.icons.enable = true; + + # For now, the portal configuration doesn't work since Niri is now + # hardcoded to set the apprioriate envs for portal component. It is + # considered broken (or rather unused) for now. + xdg.portal = + lib.mkMerge [ + { + enable = lib.mkDefault true; + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + ]; + + # The option value is only a coerced `lib.type.str` so ehhh... + config.${workflowId}.default = + [ "gtk" ] + ++ lib.optionals (config.services.gnome.gnome-keyring.enable) [ "gnome" ]; + } + + (lib.mkIf config.services.gnome.gnome-keyring.enable { + config.${workflowId} = { + "org.freedesktop.impl.portal.Secret" = "gnome-keyring"; + }; + }) + ]; + + # Install of the programs. + environment.systemPackages = requiredPackages ++ cfg.extraApps; + + # Configuring the actual desktop session. + programs.gnome-session.sessions.${workflowId} = { + fullName = "Horizontal Hunger"; + desktopNames = [ workflowId ]; + + systemd.targetUnit = + let + requiredComponents = [ "window-manager" ]; + getId = lib.foldlAttrs (acc: _: v: acc ++ [ "${v.id}.target" ]) [ ]; + in { + requires = getId (lib.filterAttrs (n: _: lib.elem n requiredComponents) sessionConfig.components); + wants = getId (lib.attrsets.removeAttrs sessionConfig.components requiredComponents); + }; + + components = { + window-manager = { + script = "${lib.getExe' cfg.package "niri"} --config /tmp/shared/modules/nixos/_private/workflows/horizontal-hunger/config/niri/config"; + description = "Window manager"; + + systemd.serviceUnit = { + serviceConfig = { + Type = "notify"; + NotifyAccess = "all"; + OOMScoreAdjust = -1000; + }; + + unitConfig = { + OnFailure = [ "gnome-session-shutdown.target" ]; + OnFailureJobMode = "replace-irreversibly"; + }; + + startLimitBurst = 5; + startLimitIntervalSec = 10; + }; + + systemd.targetUnit = { + partOf = [ "gnome-session-initialized.target" ]; + after = [ "gnome-session-initialized.target" ]; + }; + }; + + desktop-widgets = { + script = "${lib.getExe' pkgs.ags "ags"} --config /tmp/shared/modules/nixos/_private/workflows/horizontal-hunger/config/ags/config.js"; + description = "Desktop widgets"; + + systemd.serviceUnit = { + serviceConfig = { + Type = "notify"; + NotifyAccess = "all"; + OOMScoreAdjust = -1000; + }; + + unitConfig = { + OnFailure = [ "gnome-session-shutdown.target" ]; + OnFailureJobMode = "replace-irreversibly"; + }; + }; + + systemd.targetUnit = { + partOf = [ "gnome-session-initialized.target" ]; + after = [ "gnome-session-initialized.target" ]; + }; + }; + + auth-agent = { + script = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; + description = "Authentication agent"; + + systemd.serviceUnit = { + serviceConfig = { + Type = "notify"; + NotifyAccess = "all"; + OOMScoreAdjust = -500; + }; + }; + + systemd.targetUnit = { + partOf = [ "graphical-session.target" "gnome-session.target" ]; + }; + }; + }; + }; + }; +} diff --git a/modules/nixos/services/docker-compose.nix b/modules/nixos/services/docker-compose.nix new file mode 100644 index 00000000..c45f6389 --- /dev/null +++ b/modules/nixos/services/docker-compose.nix @@ -0,0 +1,91 @@ +{ config, lib, pkgs, utils, ... }: + +let + cfg = config.services.docker-compose; + + settingsFormat = pkgs.formats.yaml { }; + + jobModule = { name, lib, config, ... }: { + options = { + extraArgs = lib.mkOption { + type = with lib.types; listOf str; + default = [ ]; + description = '' + Job-specific set of arguments to be added to {command}`docker compose`. + ''; + }; + + files = lib.mkOption { + type = with lib.types; listOf path; + description = '' + List of files to be used when setting up the docker-compose service. + ''; + default = []; + example = lib.literalExpression '' + [ + /path/to/docker-compose.yml + ] + ''; + }; + + settings = lib.mkOption { + type = settingsFormat.type; + description = '' + Configuration to be used for the docker-compose process. + ''; + default = { }; + example = { + }; + }; + }; + + config = { + extraArgs = + cfg.extraArgs + ++ lib.concatMap (f: [ "--file" f ]) config.files; + + files = lib.optionals (config.settings != { }) [ + (settingsFormat.generate "docker-compose-generated-${name}" config.settings) + ]; + }; + }; + + mkDockerComposeService = name: value: + lib.nameValuePair "docker-compose-${utils.escapeSystemdPath name}" { + path = [ config.virtualisation.docker.package ]; + script = "docker compose --project-name ${name} up"; + postStop = "docker compose --project-name ${name} down"; + + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + }; +in +{ + options.services.docker-compose = { + enable = lib.mkEnableOption "integration with docker-compose"; + + extraArgs = lib.mkOption { + type = with lib.types; listOf str; + default = []; + }; + + jobs = lib.mkOption { + type = with lib.types; attrsOf (submodule jobModule); + default = { }; + description = '' + A jobset of Docker compose services to be integrated with the system. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = lib.singleton { + assertion = cfg.enable && config.virtualisation.docker.enable; + message = "Docker server is not enabled."; + }; + + systemd.services = lib.mapAttrs' mkDockerComposeService cfg.jobs; + }; +} diff --git a/modules/wrapper-manager/fonts.nix b/modules/wrapper-manager/fonts.nix new file mode 100644 index 00000000..106c0984 --- /dev/null +++ b/modules/wrapper-manager/fonts.nix @@ -0,0 +1,54 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.fonts; + + fontsModuleFactory = { isGlobal ? false }: { + enable = lib.mkEnableOption "local fonts support" // { + default = if isGlobal then false else cfg.enable; + }; + + packages = lib.mkOption { + type = with lib.types; listOf package; + description = + if isGlobal then '' + Global list of fonts to be added per wrapper (with the local fonts + support enabled anyways). + '' else '' + List of fonts to be added to the wrapper. + ''; + default = [ ]; + example = lib.literalExpression '' + with pkgs; [ + noto-sans + source-sans-pro + source-code-pro + stix + ] + ''; + }; + }; +in +{ + options.fonts = fontsModuleFactory { isGlobal = true; }; + + wrappers = + let + fontsSubmodule = { config, lib, name, pkgs, ... }: let + submoduleCfg = config.fonts; + in { + options.fonts = fontsModuleFactory { isGlobal = false; }; + + config = let + fontCache = pkgs.makeFontsCache { + inherit (pkgs) fontconfig; + fontsDirectories = submoduleCfg.packages; + }; + in lib.mkIf submoduleCfg.enable { + fonts.packages = cfg.packages; + }; + }; + in lib.mkOption { + type = with lib.types; attrsOf (submodule fontsSubmodule); + }; +} diff --git a/modules/wrapper-manager/programs/tmux.nix b/modules/wrapper-manager/programs/tmux.nix new file mode 100644 index 00000000..0cf2c177 --- /dev/null +++ b/modules/wrapper-manager/programs/tmux.nix @@ -0,0 +1,53 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.programs.tmux; +in +{ + options.programs.tmux = { + enable = lib.mkEnableOption "configuring a tmux wrapper"; + + package = lib.mkPackageOption pkgs "tmux" { }; + + plugins = lib.mkOption { + type = with lib.types; listOf (either package pluginSubmodule); + description = '' + List of tmux plugins to be included at your + configuration. + ''; + default = [ ]; + example = lib.literalExpression '' + with pkgs; [ + tmuxPlugins.cpu + { + plugin = tmuxPlugins.resurrect; + extraConfig = "set -g @resurrect-strategy-nvim 'session'"; + } + ] + ''; + }; + + executableName = lib.mkOption { + type = lib.types.nonEmptyStr; + description = "The wrapper's executable name."; + default = "tmux-custom"; + example = "tmux-your-mom"; + }; + + extraArgs = lib.mkOption { + type = with lib.types; listOf str; + description = '' + List of arguments to be prepended to the user-given arguments. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + basePackage = cfg.package; + + wrappers.tmux = { + inherit (cfg) executableName; + prependArgs = cfg.extraArgs; + }; + }; +} diff --git a/pkgs/firefox-addons/default.nix b/pkgs/firefox-addons/default.nix index f1efe083..35224954 100644 --- a/pkgs/firefox-addons/default.nix +++ b/pkgs/firefox-addons/default.nix @@ -88,10 +88,10 @@ }; "open-access-helper" = buildFirefoxXpiAddon { pname = "open-access-helper"; - version = "2025.2.1"; + version = "2025.2"; addonId = "info@oahelper.org"; - url = "https://addons.mozilla.org/firefox/downloads/file/4414378/open_access_helper-2025.2.1.xpi"; - sha256 = "ecba30f17d957323ed0bf9f6c246fba59d1232f42d6f90caa4b8d83716a57783"; + url = "https://addons.mozilla.org/firefox/downloads/file/4414263/open_access_helper-2025.2.xpi"; + sha256 = "8acfb2a15b39e406e3b9e59272424e35627892e76acb4b0e3ed42b09968eed4a"; meta = with lib; { homepage = "https://www.oahelper.org"; @@ -129,6 +129,20 @@ platforms = platforms.all; }; }; + "rsshub-radar" = buildFirefoxXpiAddon { + pname = "rsshub-radar"; + version = "2.0.21"; + addonId = "i@diygod.me"; + url = "https://addons.mozilla.org/firefox/downloads/file/4369623/rsshub_radar-2.0.21.xpi"; + sha256 = "ffa6bd7d98080feea5e551f4873b02ec923af061f1db79c22accad2e14458e1e"; + meta = with lib; + { + homepage = "https://github.com/DIYgod/RSSHub-Radar"; + description = "Easily find and subscribe to RSS and RSSHub."; + mozPermissions = [ "storage" "tabs" "offscreen" "alarms" "" ]; + platforms = platforms.all; + }; + }; "simple-translate" = buildFirefoxXpiAddon { pname = "simple-translate"; version = "3.0.0"; @@ -214,4 +228,3 @@ platforms = platforms.all; }; }; - } \ No newline at end of file diff --git a/pkgs/firefox-addons/firefox-addons.json b/pkgs/firefox-addons/firefox-addons.json index 6ce3b1c2..479baf15 100644 --- a/pkgs/firefox-addons/firefox-addons.json +++ b/pkgs/firefox-addons/firefox-addons.json @@ -31,5 +31,8 @@ }, { "slug": "open-access-helper" + }, + { + "slug": "rsshub-radar" } ] diff --git a/pkgs/graphite-design-tool/default.nix b/pkgs/graphite-design-tool/default.nix new file mode 100644 index 00000000..e6510a1e --- /dev/null +++ b/pkgs/graphite-design-tool/default.nix @@ -0,0 +1,26 @@ +{ rustPlatform, cargo-tauri_1, fetchFromGitHub, wrapGAppsHook, wasm-bindgen-cli, pkg-config, lib }: + +rustPlatform.buildRustPackage rec { + pname = "graphite-design-tool"; + version = "unstable-2024-12-07"; + + src = fetchFromGitHub { + owner = "GraphiteEditor"; + repo = "graphite"; + rev = "b21b1cbfc7cb808ec5e2c66b090660506f07833f"; + hash = "sha256-RJYzS7TUViszDXomShw2h6DOVrER/VkW7cP69aEOQ/k="; + }; + + useFetchCargoVendor = true; + cargoHash = "sha256-+p9bpj+cSd0Bkpg+e4lwo4C7XqxZBc0McYYsNxAqzaA="; + + nativeBuildInputs = [ cargo-tauri_1 pkg-config wrapGAppsHook wasm-bindgen-cli ]; + + meta = with lib; { + homepage = "https://graphite.rs/"; + description = "2D vector & raster editor that melds traditional layers & tools with a modern node-based, non-destructive, procedural workflow"; + license = licenses.asl20; + maintainers = with maintainers; [ foo-dogsquared ]; + mainProgram = "graphite"; + }; +} diff --git a/pkgs/pd-l2ork/default.nix b/pkgs/pd-l2ork/default.nix new file mode 100644 index 00000000..7ba4895e --- /dev/null +++ b/pkgs/pd-l2ork/default.nix @@ -0,0 +1,42 @@ +{ stdenv, + lib, + fetchFromGitHub, + autoreconfHook, + bison, + fftw, + libtool, + libjack2, + bluez, + udev +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "pd-l2ork"; + version = "20241224"; + + src = fetchFromGitHub { + owner = "pd-l2ork"; + repo = "pd-l2ork"; + rev = finalAttrs.version; + hash = "sha256-A+ETptD1R+Pb4r2qgD0YxV7KYeAb9iLBwENhYQyjBc4="; + }; + + nativeBuildInputs = [ + libtool + ]; + + buildInputs = [ + bison + fftw + libjack2 + bluez + udev + ]; + + meta = with lib; { + homepage = "http://l2ork.music.vt.edu/"; + description = "Pure Data flavor based on Purr Data"; + license = licenses.bsd3; + platforms = platforms.linux ++ platforms.darwin; + }; +}) diff --git a/pkgs/purr-data/default.nix b/pkgs/purr-data/default.nix new file mode 100644 index 00000000..8f34cc53 --- /dev/null +++ b/pkgs/purr-data/default.nix @@ -0,0 +1,51 @@ +{ stdenv, + lib, + fetchFromGitHub, + bison, + fftw, + libtool, + libjack2, + bluez, + udev, + wget, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "pd-l2ork"; + version = "20241224"; + + src = fetchFromGitHub { + owner = "pd-l2ork"; + repo = "pd-l2ork"; + rev = finalAttrs.version; + hash = "sha256-A+ETptD1R+Pb4r2qgD0YxV7KYeAb9iLBwENhYQyjBc4="; + }; + + nativeBuildInputs = [ + libtool + ]; + + buildInputs = [ + bison + fftw + libjack2 + bluez + udev + wget + ]; + + preBuild = '' + patchShebangs l2ork_addons/*.sh + ''; + + buildFlags = [ + "prefix=${placeholder "out"}" + ]; + + meta = with lib; { + homepage = "http://l2ork.music.vt.edu/"; + description = "Pure Data flavor based on Purr Data"; + license = licenses.bsd3; + platforms = platforms.linux ++ platforms.darwin; + }; +}) diff --git a/pkgs/rotp-fusion/default.nix b/pkgs/rotp-fusion/default.nix new file mode 100644 index 00000000..69d47a3f --- /dev/null +++ b/pkgs/rotp-fusion/default.nix @@ -0,0 +1,52 @@ +{ lib, + fetchFromGitHub, + maven, + libwebp, + vorbis-tools, +}: + +maven.buildMavenPackage rec { + pname = "rotp-fusion"; + version = "2024/06/13/2254"; + + src = fetchFromGitHub { + owner = "Xilmi"; + repo = "Rotp-Fusion"; + + # We'll just use URL-encoded strings just to be safe. + rev = "2024%2F06%2F13%2F2254"; + hash = "sha256-gupeVfIrbFm5B11NdERtnXgkzRMa+yw5vC9MJVeXcys="; + }; + + mvnHash = ""; + + nativeBuildInputs = [ + libwebp + vorbis-tools + ]; + + meta = with lib; { + description = "Mod of Remnants of the Precursors with more features"; + homepage = "https://github.com/Xilmi/Rotp-Fusion"; + license = with licenses; [ + # For the Java codebase made by Ray Fowler. + gpl3Only + + # Java Files in `src/rotp/apachemath` folder. + asl20 + + # The Java-rewrite of the following code at: + # + # http://hjemmesider.diku.dk/~torbenm/Planet + { + free = true; + url = "http://hjemmesider.diku.dk/~torbenm/Planet"; + } + + # All images made by Peter Penev, audio from Remi Agullo, and + # various text written by Jeff Colucci and its translations. + cc-by-nc-nd-40 + ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/rotp-modnar/default.nix b/pkgs/rotp-modnar/default.nix new file mode 100644 index 00000000..d70e0c66 --- /dev/null +++ b/pkgs/rotp-modnar/default.nix @@ -0,0 +1,11 @@ +{ + lib, + rotp, + fetchFromGitHub, +}: + +rotp.overrideAttrs (finalAttrs: prevAttrs: { + src = fetchFromGitHub { + + }; +}) diff --git a/pkgs/tailcall/default.nix b/pkgs/tailcall/default.nix new file mode 100644 index 00000000..9b339d06 --- /dev/null +++ b/pkgs/tailcall/default.nix @@ -0,0 +1,30 @@ +{ rustPlatform, lib, fetchFromGitHub }: + +rustPlatform.buildRustPackage rec { + pname = "tailcall"; + version = "0.129.0"; + + src = fetchFromGitHub { + owner = "tailcallhq"; + repo = "tailcall"; + rev = "v${version}"; + hash = "sha256-tTj1hugq6a6rAKwUsS072pCizsB/BYaBlu8OWGYKNsk="; + }; + + cargoLock = { + lockFile = "${src}/Cargo.lock"; + outputHashes = { + "genai-0.1.7-wip" = "sha256-peqM0rBLnL4F0M6o8CO/+ttv9eOLV4VkDEy2e4x7dn0="; + "htpasswd-verify-0.3.0" = "sha256-GbkY590xWEZ+lVT9nffs4HIRW6CwBjll4rGIk27waxo="; + "posthog-rs-0.2.3" = "sha256-1HxOEzc8GROStxuxG0cfCNa4iA04sCD7jD6uWT5bl2o="; + "serde_json_borrow-0.7.0" = "sha256-UcgIWjdSCkYRYxEcWbwQs+BxX41ITqkvFSFtzEJchVk="; + }; + }; + + meta = with lib; { + homepage = "https://tailcall.run"; + description = "GraphQL runtime"; + license = licenses.asl20; + mainProgram = "tailcall"; + }; +} diff --git a/subprojects/bahaghari/CHANGELOG.adoc b/subprojects/bahaghari/CHANGELOG.adoc new file mode 100644 index 00000000..3e208934 --- /dev/null +++ b/subprojects/bahaghari/CHANGELOG.adoc @@ -0,0 +1,25 @@ += Changelog +:toc: + +All changes in Bahaghari will be documented here for their users to see. +The structure is loosely based on https://keepachangelog.com/en/1.1.0/[Keep a changelog format] except we separate the sections by the module and the library set instead. +This is structured like this so it is easier to skim things. + + +// TODO: Update the release date once released. +[#0-1-0] +== 0.1.0 (unreleased) + +[#0-1-0-module-sets] +=== Module sets + +* Initialize Bahaghari module set including options for its schemes, templates, and builder. +* Include the Bahaghari library set as part of the module argument. + +[#0-1-0-library-set] +=== Library set + +* Initialize Tinted Theming-specific library subset. +* Implement a basic math subset intended for computing with color namespaces (or whatever use cases for basic mathematics). +* Implement basic color namespace for RGB, HSL, and HSLUV. +* Create Tinted Theming-speific utilities subset. diff --git a/subprojects/bahaghari/lib/colors/hsluv.nix b/subprojects/bahaghari/lib/colors/hsluv.nix new file mode 100644 index 00000000..1d08aefc --- /dev/null +++ b/subprojects/bahaghari/lib/colors/hsluv.nix @@ -0,0 +1,45 @@ +# HSLuv implementation in Nix. This is taken from the reference implementation, +# specifically from the JavaScript implementation at +# https://github.com/hsluv/hsluv-javascript. +{ pkgs, lib, self }: + +let + inherit (self.colors) rgb hsl; + + refY = 1.0; + refU = 0.19783000664283; + refV = 0.46831999493879; + kappa = 903.2962962; + epsilon = 0.0088564516; + + m = { + r = [ 3.240969941904521 (-1.537383177570093) (-0.498610760293) ]; + g = [ (-0.96924363628087) 1.87596750150772 0.041555057407175 ]; + b = [ 0.055630079696993 (-0.20397695888897) 1.056971514242878 ]; + }; + + fromLinear = number: + if number <= 0.0031308 then + 12.92 * number + else + 1.055 * (self.math.pow number (1 / 2.4)) - 0.055; + + toLinear = number: + if number > 0.04045 then + self.math.pow ((number + 0.055) / 1.055) 2.4 + else + number / 12.92; +in +rec { + inherit (hsl) valueHueMin valueHueMax valueParamMin valueParamMax; + + HSLuv = color: {}; + + toRgb = { h, s, l, ... }@color: { + + }; + + toHex = color: rgb.toHex (toRgb color); + + toHex' = color: rgb.toHex' (toRgb color); +} diff --git a/subprojects/bahaghari/modules/panapton/default.nix b/subprojects/bahaghari/modules/panapton/default.nix new file mode 100644 index 00000000..9c4a1f45 --- /dev/null +++ b/subprojects/bahaghari/modules/panapton/default.nix @@ -0,0 +1,57 @@ +{ config, options, lib, pkgs, bahaghariLib, ... }: + +{ + options.bahaghari.panapton = { + package = lib.mkPackageOption pkgs "panapton" { }; + + dataFiles = lib.mkOption { + type = with lib.types; listOf package; + default = [ ]; + description = '' + A list of derivations containing Panapton data files (e.g., templates, + schemes) to be included within Panapton builder operations. It is + expected that the data files are in `$out/share/panapton`. + + If you want to include only a specific type of data file, you can use + {option}`bahaghari.panapton.{scheme,template}Dirs` instead. + ''; + example = '' + [ + (pkgs.callPackage ./custom-panapton-schemes-and-templates.nix) + pkgs.foodogsquared-panapton-data-files + ] + ''; + }; + + schemeDirs = lib.mkOption { + type = with lib.types; listOf path; + description = '' + A list of scheme directories to be included within Panapton builder + operations. + ''; + default = [ ]; + example = '' + [ + ./foodogsquared-custom-panapton-schemes + ./foodogsquared-custom-panapton-schemes-extension + ] + ''; + }; + + templateDirs = lib.mkOption { + type = with lib.types; listOf path; + description = '' + A list of template directories to be included within Panapton builder + operations. + ''; + default = [ ]; + example = '' + [ + ./my-panapton-templates + ./my-other-panapton-templates + ] + ''; + }; + }; + +} diff --git a/subprojects/bahaghari/tests/lib/extra-utils.nix b/subprojects/bahaghari/tests/lib/extra-utils.nix new file mode 100644 index 00000000..a169a8b1 --- /dev/null +++ b/subprojects/bahaghari/tests/lib/extra-utils.nix @@ -0,0 +1,8 @@ +# A bunch of utilities to be used in a bunch of tests. +{ lib, self }: + +{ + # The typical rounding procedure for our results. 10 decimal places should be + # enough to test accuracy at least for a basic math subset like this. + round' = self.math.round' (-10); +}