{{- /* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Commercial */ -}} {{- /* SPDX-FileCopyrightText: 2025-2026 Christian Galo */ -}} {{/* member_plans.html The Products page's Plans region: one bordered group per ladder, tier cards inside, the switch preview banner, and the plan cancel (through the shared confirm modal; design-system.md ยง3 bans hx-confirm). Badges render through statusBadge; the cancel chip carries the date itself, which is the fact a member needs. */}} {{ if .Error }} {{ else if eq (len .Ladders) 0 }} {{ template "emptyState" .Empty }} {{ else }} {{ if .Success }} {{ end }} {{ if .Preview }} {{ template "form" .Preview }} {{ end }} {{ range .Ladders }}

{{ .Name }} {{ if .CancelsOn }} {{ template "statusBadge" .CancelBadge }}{{ end }}

{{ range .Tiers }}

{{ .Name }}

{{ if eq .Relation "current" }}{{ template "statusBadge" .CurrentBadge }}{{ end }}
{{/* Every card states its cost, not only the current tier's (member-product-discovery: "Every plan card states its cost", ACC-7): the current tier shows what the org is actually billed; every other tier shows its own list price and interval when it has an active synced price, "Included" when it carries no price at all (the free rung), or nothing when its price exists but isn't synced yet (the purchasability gate already disables its move control with a visible reason below). */}} {{ if eq .Relation "current" }} {{ if .BillingPending }}

Billing details are still being processed.

{{ else if .BillingPriceText }}

{{ .BillingPriceText }}, renews {{ .BillingRenewsOn }}

{{ end }} {{ else if .NoPriceTier }}

Included

{{ else if .PriceText }}

{{ .PriceText }}

{{ end }} {{ if .Description }}

{{ .Description }}

{{ end }}
    {{ range .EntitlementFeatures }}
  • · {{ . }}
  • {{ end }} {{ range .MetadataFeatures }}
  • · {{ . }}
  • {{ end }}
{{ if ne .Relation "current" }} {{ if .MoveKind }} {{ if .MoveEnabled }} {{/* chrome-conventions D2 (one dominant primary action per screen): every purchasable tier across every ladder is a parallel, equal-weight option, so none carries the filled primary style; only the switch-preview banner's "Confirm switch" (above) is a genuine single dominant action, when shown. */}} {{ if eq .MoveKind "checkout" }}
{{ else if eq .MoveKind "switch" }} {{ else if eq .MoveKind "cancel" }} {{ end }} {{ else }} {{ template "disabledControl" .DisabledControl }} {{ end }} {{ end }} {{ end }}
{{ end }}
{{ end }} {{ end }}