# Stylix theme integration (zero-op auto-detect). When the operator's # host config has stylix enabled, generate a base16 `colors.css` from # its palette and overlay it onto the bundled frontend dist so the # dashboard re-themes with no operator action and no npm/esbuild # rebuild (a pure file-copy over the prebuilt dist). `colors.css` is # the entire swap contract — `theme.css` derives every semantic var # from the 16 base16 slots (see docs/web-ui/css-vars.md). The guarded # access makes this a clean no-op when stylix isn't imported into the # host config. Exposed as the read-only `c0re.servedFrontend` option. { pkgs, lib, config, ... }: let cfg = config.services.hyperhive.c0re; stylixThemeColors = if (config.stylix.enable or false) && ((config.lib.stylix or { }) ? colors) then config.lib.stylix.colors.withHashtag else null; themedColorsCss = c: pkgs.writeText "hyperhive-colors.css" '' :root { --base00: ${c.base00}; --base01: ${c.base01}; --base02: ${c.base02}; --base03: ${c.base03}; --base04: ${c.base04}; --base05: ${c.base05}; --base06: ${c.base06}; --base07: ${c.base07}; --base08: ${c.base08}; --base09: ${c.base09}; --base0A: ${c.base0A}; --base0B: ${c.base0B}; --base0C: ${c.base0C}; --base0D: ${c.base0D}; --base0E: ${c.base0E}; --base0F: ${c.base0F}; } ''; # Overlay the generated colors.css onto both dist subtrees. Both the # dashboard (served by hive-c0re via HIVE_STATIC_DIR) and the agent UIs # (served by the gateway from HIVE_AGENT_FRONTEND_DIR — static files # straight from the store) read their colors.css from this host-side # tree, so swapping both re-themes both surfaces. # # Not covered here: an agent reached directly on its own harness web # server (no gateway) serves from its per-agent `mergedDist`, built in # the agent's own nixosSystem with no access to the host's stylix # colours — theming that path needs the base16 palette forwarded # host→agent, tracked separately. themedFrontend = c: pkgs.runCommand "hyperhive-frontend-themed" { } '' cp -r ${cfg.frontend} $out chmod -R u+w $out install -m644 ${themedColorsCss c} $out/dashboard/static/colors.css install -m644 ${themedColorsCss c} $out/agent/static/colors.css ''; in { options.services.hyperhive.c0re.servedFrontend = lib.mkOption { type = lib.types.package; internal = true; readOnly = true; default = if stylixThemeColors != null then themedFrontend stylixThemeColors else cfg.frontend; defaultText = lib.literalExpression ""; description = '' Internal, read-only: `frontend` re-themed with the active stylix palette (or `frontend` verbatim when unthemed); has `dashboard/` and `agent/`. Exposed so the hive-gateway module can static-serve `dashboard/` as an nginx root instead of proxying to hive-c0re. ''; }; }