{ ... }: {
  flake.nixosModules.desktopShellDmsOptions = { lib, ... }: {
    options.chiasson.desktop.shells.dms = {
      enableGpuTemp = lib.mkOption {
        type = lib.types.bool;
        default = true;
        description = "GPU temp in DMS bar.";
      };
      obsidianVaults = lib.mkOption {
        type = lib.types.listOf lib.types.str;
        default = [ ];
        example = [ "/mnt/zimaos/Obsidian/Home/.obsidian" ];
        description = "Vault `.obsidian/` dirs; matugen writes `<vault>/snippets/matugen.css`.";
      };
      extraRightBarWidgets = lib.mkOption {
        type = lib.types.listOf lib.types.attrs;
        default = [ ];
        description = "Extra right-bar widgets merged into the first-run DMS settings seed.";
      };
      rebuildCommand = lib.mkOption {
        type = lib.types.nullOr (lib.types.listOf lib.types.str);
        default = null;
        example = [ "sudo" "nixos-rebuild" "switch" "--flake" ".#14900k" ];
        description = "Command used by DMS nix-monitor widget for rebuild actions.";
      };
      defaultSeedDir = lib.mkOption {
        type = lib.types.nullOr lib.types.path;
        default = null;
        example = ./dms-defaults;
        description = ''
          Host-specific first-run DMS config seed directory. When set, copies
          `settings.json` (required) and `plugin_settings.json` (optional) from this
          directory into `~/.config/DankMaterialShell/` on fresh profiles.
          Replaces the bundled `default-settings.nix` template for `settings.json`.
        '';
      };
      bundleThirdPartyPlugins = lib.mkOption {
        type = lib.types.bool;
        default = true;
        description = ''
          Install bundled DMS plugins from flake inputs (third-party + chiasson).
          Disable individual plugins in DMS settings; set this to false to skip all bundled plugins.
        '';
      };
    };
  };

  flake.homeManagerModules.desktopShellDms = import ./_private/hm.nix;

  # DMS IPC commands shared between Niri and Hyprland keybind tables.
  # Defines flake.lib.dmsIpcBinds so each compositor formats the same
  # command string in its native shape — Niri attrs vs Hyprland string-list.
  # Adding a new DMS keybind requires editing this file plus the
  # per-compositor bind layout, not the command string.
  flake.lib.dmsIpcBinds = {
    spotlight         = "dms ipc call spotlight toggle";
    clipboard         = "dms ipc call clipboard toggle";
    notepad           = "dms ipc call notepad toggle";
    notifications     = "dms ipc call notifications toggle";
    processlist       = "dms ipc call processlist toggle";
    # Hyprland prefers focusOrToggle (window-aware); niri subscribes to toggle.
    processlistFocus  = "dms ipc call processlist focusOrToggle";
    settingsFocus     = "dms ipc call settings focusOrToggle";
    barToggle         = ''dms ipc call bar toggle name "Main Bar"; dms ipc call bar toggle name "Bar 2"'';
    barToggleBar2     = ''dms ipc call bar toggle name "Bar 2"'';
    ephemera          = "dms ipc call ephemera toggle";
    wallpaperCarousel = "dms ipc call wallpaperCarousel toggle";
    lock              = "dms ipc call lock lock";
  };
}
