diff --git a/internal/templates/components/pages/counterparties.templ b/internal/templates/components/pages/counterparties.templ
index b17055b1..49545808 100644
--- a/internal/templates/components/pages/counterparties.templ
+++ b/internal/templates/components/pages/counterparties.templ
@@ -89,18 +89,22 @@ templ counterpartiesListRow(c CounterpartyRow) {
// CounterpartyDetail renders /counterparties/{short_id} under the
// rules-as-substrate model: a counterparty IS the rules that define it. The page
-// pairs the LINKED CHARGES (what's bound to it) with the GOVERNING RULES (the
-// assign_counterparty rules that put them there), and adds a manual ENRICHMENT
-// form (name, category, mcc, website, logo). Enrichment is a plain POST →
-// UpdateCounterparty; no auto-fetch.
+// reads as a calm brand profile — the header carries the identity (logo, name,
+// category chip, website · MCC · charge-count facts), and the body pairs the
+// LINKED CHARGES (what's bound to it) with the GOVERNING RULES (the
+// assign_counterparty rules that put them there). Enrichment (name, category,
+// mcc, website, logo) edits in a right-side Drawer opened from the header — the
+// detail-page sibling of the series edit drawer (design-system principle #5).
templ CounterpartyDetail(p CounterpartyDetailProps) {
-
}
+// counterpartyDetailBadges is the EntityHeader badge row — a quiet category chip
+// when the counterparty has a default category set. Neutral metadata, so a ghost
+// badge (vivid tones are reserved for status per the design system).
+templ counterpartyDetailBadges(p CounterpartyDetailProps) {
+ if cat := counterpartyCategoryLabel(p); cat != "" {
+ { cat }
+ }
+}
+
+// counterpartyEditBtn is the EntityHeader trailing action — a single Edit
+// affordance that opens the enrichment drawer (matches the series detail).
+templ counterpartyEditBtn() {
+
+}
+
+// counterpartyEditDrawer is the right-side slide-over for enrichment — name,
+// category, mcc, website, logo — committed with one explicit Save. Plain POST →
+// UpdateCounterparty (no Alpine factory); the Drawer shell handles open/close via
+// $store.drawers. Single-column stacked fields (the drawer is narrow).
+templ counterpartyEditDrawer(p CounterpartyDetailProps) {
+ @components.Drawer(components.DrawerProps{ID: "counterparty-edit", Title: "Edit counterparty"}) {
+
+ }
+}
+
// CounterpartyForm renders /counterparties/new — a from-scratch create form. A
// counterparty needs only a name; enrich it and point rules at it afterwards.
// Plain POST → CreateCounterpartyPageHandler creates the counterparty and
@@ -180,30 +219,33 @@ templ CounterpartyForm(p CounterpartyFormProps) {
Subtitle: "Name a counterparty, then enrich it and author rules that assign charges to it. It starts empty.",
SubtitleHideOnMobile: true,
})
-