diff --git a/.github/labeler.yml b/.github/labeler.yml index b97d83f58..2cf5c7fc7 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -160,6 +160,7 @@ - modules/programs/cmus.nix - modules/programs/ncspot.nix - modules/programs/spotify-player.nix + - modules/programs/foliate.nix - modules/programs/freetube.nix - modules/programs/yt-dlp.nix - modules/programs/kodi.nix diff --git a/modules/misc/news/2025/05/2025-05-12_15-21-57.nix b/modules/misc/news/2025/05/2025-05-12_15-21-57.nix new file mode 100644 index 000000000..dc1d64262 --- /dev/null +++ b/modules/misc/news/2025/05/2025-05-12_15-21-57.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + time = "2025-05-12T22:21:57+00:00"; + condition = pkgs.stdenv.hostPlatform.isLinux; + message = '' + A new module is available: `programs.foliate` + + Foliate is a modern e-book reader tailored for GNOME. + ''; +} diff --git a/modules/modules.nix b/modules/modules.nix index b36a8d400..96e914404 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -362,6 +362,7 @@ let ./services/flameshot.nix ./services/fluidsynth.nix ./services/fnott.nix + ./programs/foliate.nix ./services/fusuma.nix ./services/getmail.nix ./services/git-sync.nix diff --git a/modules/programs/foliate.nix b/modules/programs/foliate.nix new file mode 100644 index 000000000..5426fc69c --- /dev/null +++ b/modules/programs/foliate.nix @@ -0,0 +1,111 @@ +{ + lib, + pkgs, + config, + ... +}: +let + inherit (lib) + mkEnableOption + mkPackageOption + mkOption + mkIf + types + mapAttrs' + nameValuePair + ; + + cfg = config.programs.foliate; + jsonFormat = pkgs.formats.json { }; +in +{ + meta.maintainers = [ lib.maintainers.awwpotato ]; + + options.programs.foliate = { + enable = mkEnableOption "Foliate"; + package = mkPackageOption pkgs "foliate" { nullable = true; }; + settings = mkOption { + type = with types; attrsOf (either lib.hm.types.gvariant (attrsOf lib.hm.types.gvariant)); + default = { }; + description = '' + Added to `config.dconf.settings` under `com/github/johnfactotum/Foliate`, + the scheme is defined at + + ''; + example = lib.literalExpression '' + { + myTheme = { + color-scheme = 0; + library = { + view-mode = "grid"; + show-covers = true; + }; + "viewer/view" = { + theme = "My Theme"; + }; + "viewer/font" = { + monospace = "Maple Mono"; + default-size = 12; + }; + }; + } + ''; + }; + themes = mkOption { + type = types.attrsOf ( + types.oneOf [ + jsonFormat.type + types.str + types.path + ] + ); + description = '' + Each theme is written to + {file}`$XDG_CONFIG_HOME/com.github.johnfactotum.Foliate/themes/NAME.json`. + See + for implementation of themes in Foliate. + ''; + default = { }; + example = lib.literalExpression '' + { + label = "My Theme"; + light = { + fg = "#89b4fa"; + bg = "#1e1e2e"; + link = "#89b4fa"; + }; + dark = { }; + } + ''; + }; + }; + + config = mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "programs.foliate" pkgs lib.platforms.linux) + ]; + + home.packages = mkIf (cfg.package != null) [ cfg.package ]; + + dconf.settings = mapAttrs' ( + name: value: + if builtins.isAttrs value then + nameValuePair "com/github/johnfactotum/Foliate/${name}" value + else + nameValuePair "com/github/johnfactotum/Foliate" { ${name} = value; } + ) cfg.settings; + + xdg.configFile = mapAttrs' ( + name: value: + nameValuePair "com.github.johnfactotum.Foliate/themes/${name}.json" { + source = + if lib.isString value then + pkgs.writeText "foliate-theme-${name}" value + else if builtins.isPath value || lib.isStorePath value then + value + else + jsonFormat.generate "foliate-theme-${name}" value; + } + ) cfg.themes; + }; +} diff --git a/tests/default.nix b/tests/default.nix index 2c89cc4e4..1f62fdf13 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -365,6 +365,7 @@ import nmtSrc { ./modules/programs/distrobox ./modules/programs/element-desktop/linux.nix ./modules/programs/eww + ./modules/programs/foliate ./modules/programs/foot ./modules/programs/freetube ./modules/programs/fuzzel diff --git a/tests/modules/programs/foliate/basic-theme.nix b/tests/modules/programs/foliate/basic-theme.nix new file mode 100644 index 000000000..dd564b976 --- /dev/null +++ b/tests/modules/programs/foliate/basic-theme.nix @@ -0,0 +1,45 @@ +{ pkgs, ... }: +{ + programs.foliate = { + enable = true; + settings = { + color-scheme = 0; + library = { + view-mode = "grid"; + show-covers = true; + }; + "viewer/view" = { + theme = "My Theme"; + }; + "viewer/font" = { + monospace = "Maple Mono"; + default-size = 12; + }; + }; + themes.myTheme = { + label = "My Theme"; + light = { + fg = "#89b4fa"; + bg = "#1e1e2e"; + link = "#89b4fa"; + }; + dark = { }; + }; + }; + + nmt.script = '' + assertFileExists home-files/.config/com.github.johnfactotum.Foliate/themes/myTheme.json + assertFileContent home-files/.config/com.github.johnfactotum.Foliate/themes/myTheme.json \ + ${pkgs.writeText "expected-foliate-theme" '' + { + "dark": {}, + "label": "My Theme", + "light": { + "bg": "#1e1e2e", + "fg": "#89b4fa", + "link": "#89b4fa" + } + } + ''} + ''; +} diff --git a/tests/modules/programs/foliate/default.nix b/tests/modules/programs/foliate/default.nix new file mode 100644 index 000000000..8f535d3f3 --- /dev/null +++ b/tests/modules/programs/foliate/default.nix @@ -0,0 +1,3 @@ +{ + foliate-basic-theme = ./basic-theme.nix; +}