# SPDX-FileCopyrightText: 2025 Ethan Reece # # SPDX-License-Identifier: LGPL-3.0-or-later { module-name, ... }: { flake-parts-lib, lib, ... }: { options.perSystem = flake-parts-lib.mkPerSystemOption ( { config, mkHelixPackage, nixGLPkgs, pkgs, ... }: { options.languages.${module-name} = { enable = lib.mkEnableOption "Typst"; entrypoints = lib.mkOption { description = '' Entrypoint files for Typst. Default file for `typst-` commands. ''; type = lib.types.attrsOf lib.types.string; default = { default = "main.typ"; }; }; fonts = lib.mkOption { description = '' Fonts package for Typst. ''; type = lib.types.package; default = pkgs.buildEnv { name = "fonts"; paths = [ ]; }; }; package = lib.mkOption { description = '' Package for Typst. ''; type = lib.types.package; default = pkgs.typst; }; args = lib.mkOption { description = '' Args for Typst. ''; type = lib.types.listOf lib.types.string; default = [ ]; }; }; config = lib.mkIf config.languages.${module-name}.enable ( let tinymist = { url = "127.0.0.1:23635"; config = { command = "${pkgs.tinymist}/bin/tinymist"; config = { preview.background = { enabled = true; args = [ "--data-plane-host=${tinymist.url}" "--invert-colors=never" ]; }; typstExtraArgs = [ "--ignore-system-fonts" "--font-path" "${config.languages.${module-name}.fonts}/share/fonts" ] ++ config.languages.${module-name}.args; }; }; }; in { languages.en-us.dictionary = [ "typ" "Typst" ]; editors.helix.languages = { language = [ { name = "typst"; language-servers = [ "tinymist" ] ++ (lib.optionals config.languages.en-us.enable [ "harper-ls" "typos" ]); formatter = { command = "${config.treefmt.build.wrapper}/bin/treefmt"; args = [ "--stdin" "%{buffer_name}" "--quiet" ]; }; auto-format = true; } ]; language-server.tinymist = { command = "${pkgs.tinymist}/bin/tinymist"; config = tinymist.config; }; }; treefmt.programs.typstyle.enable = true; devshells.default.commands = lib.mkIf config.editors.helix.enable ( lib.mapAttrsToList ( name: value: let tinymist' = tinymist // { config = tinymist.config // { config = tinymist.config.config // { typstExtraArgs = tinymist.config.config.typstExtraArgs ++ [ value ]; }; }; }; helix' = { base = config.editors.helix; config = helix'.base // { languages = helix'.base.languages // { language-server = helix'.base.languages.language-server // { tinymist = tinymist'.config; }; }; }; package = mkHelixPackage helix'.config; }; in { help = "󰌧 launch Typst editing environment for ${name}"; name = "typst-${name}"; category = " Typst"; command = '' #!${pkgs.nushell}/bin/nu let git_root = (^"${pkgs.git}/bin/git" rev-parse --show-toplevel | str trim) let file_path = $"($git_root)/${value}" let bg_process = (job spawn { ^"${nixGLPkgs.nixgl.nixGLMesa}/bin/nixGLMesa" "${pkgs.qutebrowser}/bin/qutebrowser" "${tinymist.url}" }) ^"${helix'.package}/bin/hx" $file_path job kill $bg_process ''; } ) config.languages.${module-name}.entrypoints ); } ); } ); }