- templates/layout.templ: base HTML shell per UI-SPEC §Base Layout Contract (max-w-5xl container, slate-50 header, slate-200 borders, footer copy, /static/tailwind.css in <head>, /static/htmx.min.js deferred at body end — D-10: HTMX never loaded from a CDN) - templates/index.templ: root page consuming @ui.Card and @ui.Button for the canonical HTMX demo (UI-SPEC §Component Library Contract canonical block) - templates/fragments.templ: TimeFragment renders <span> with RFC3339 UTC timestamp; templ auto-escapes interpolation (T-01-13) - internal/web/handlers.go: HealthzHandler (200 ok / 503 degraded per D-20, 2s Ping timeout), IndexHandler, DemoTimeHandler with injected clock - internal/web/router.go: Pinger interface; NewRouter wires RequestIDMiddleware → RealIP → SlogLoggerMiddleware → Recoverer (D-08 + Pitfall 6 — chi middleware.Logger deliberately NOT registered) and routes /, /healthz, /demo/time, /static/* via http.FileServer (T-01-08 path traversal blocked by http.Dir) All six handler tests + ui package tests are GREEN under default go test.
10 lines
367 B
Text
10 lines
367 B
Text
package templates
|
|
|
|
import "time"
|
|
|
|
// TimeFragment renders the canonical /demo/time response: a single <span>
|
|
// containing an ISO-8601 UTC timestamp. templ auto-escapes the interpolated
|
|
// value (T-01-13 defense-in-depth) — never use templ.Raw on user input.
|
|
templ TimeFragment(t time.Time) {
|
|
<span class="text-slate-900">{ t.UTC().Format(time.RFC3339) }</span>
|
|
}
|