feat: add custom Pivoine Rose theme to asciinema

- Mount custom CSS, favicon, and JS into static directories
- Create custom.js to inject theme CSS and favicon via JavaScript
- Add CustomThemeInjector Plug in custom.exs to inject script tag
- Custom theme features:
  - Pivoine rose primary color (#CE275B)
  - Gray tone backgrounds
  - Custom SVG favicon with rose gradient
  - Bootstrap 4 component overrides

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-09 09:50:07 +01:00
parent 95b01afafa
commit 63b96bb8e7
3 changed files with 60 additions and 2 deletions

View File

@@ -15,3 +15,43 @@ config :asciinema, Asciinema.Emails.Mailer,
verify: :verify_none,
versions: [:"tlsv1.2", :"tlsv1.3"]
]
# Custom Plug to inject theme JavaScript into HTML responses
defmodule CustomThemeInjector do
@behaviour Plug
def init(opts), do: opts
def call(conn, _opts) do
Plug.Conn.register_before_send(conn, fn conn ->
if html_response?(conn) do
inject_custom_script(conn)
else
conn
end
end)
end
defp html_response?(conn) do
case Plug.Conn.get_resp_header(conn, "content-type") do
[content_type | _] -> String.contains?(content_type, "text/html")
[] -> false
end
end
defp inject_custom_script(conn) do
{status, headers, body} = Plug.Conn.sent_resp(conn)
if is_binary(body) and String.contains?(body, "</head>") do
script_tag = ~s(<script src="/js/custom.js"></script>\n)
modified_body = String.replace(body, "</head>", "#{script_tag}</head>", global: false)
%{conn | status: status, resp_headers: headers, resp_body: modified_body}
else
conn
end
end
end
# Add the custom plug to the endpoint
config :asciinema, AsciinemaWeb.Endpoint,
http: [plug: CustomThemeInjector]