CartSummary
ImplementedStatic cart/order recap aside for the checkout page — line items (label + optional detail) in a divided list, then a definition list of pre-formatted subtotal / fees / taxes (TPS+TVQ) / total rows and a full-width primary CTA (Button atom). Built-in labels are FR-CA by default (Recapitulatif, Sous-total, Frais, TPS+TVQ, Total, Confirmer et payer) with a full EN set via the locale prop (Order summary, Subtotal, Fees, Tax, Total, Confirm and pay). Not a timer: the legacy reservation-bar pattern (items/total/reservationMinutes/onCheckout) was never implemented. `variant='selection'` (2026-11-02) is the event page's live panel: a heading ('2 tickets') with the total and its note, the lines with a price and a trash IconButton each, an optional notice, and ONE primary CTA with onCta — a side panel that sticks below the site header from lg, and a bottom bar stuck to the viewport below lg that collapses to heading + total + chevron and expands to the lines.
components/organisms/cartsummary/CartSummary.tsxRécapitulatif statique d'une commande (sous-total, frais, TPS+TVQ, total) utilisé dans la page de paiement. FR-CA : « Sous-total · Frais · TPS+TVQ · Total · Confirmer et payer ».
CartSummary
Organism — Commerce family (Family 7)
Composant d'affichage (non contrôlé). Affiche les lignes du panier sous forme de liste, un tableau récapitulatif avec sous-total, frais, taxes et total, et un bouton CTA localisé.
Recapitulatif
Festival Jazz MTL — Quartet
2 × 48,00 $ · Admission générale
OSM — Symphonie n° 5
1 × 88,00 $ · Première balcon
- Sous-total
- 184,00 $
- Frais
- 9,20 $
- TPS+TVQ
- 29,32 $
- Total
- 222,52 $
This component supports light and dark mode.
Props
lines*CartSummaryLine[]Lignes affichées dans la liste.
subtotal*stringSous-total formaté.
fees*stringFrais formatés.
taxes*stringTaxes formatées (TPS + TVQ au Québec).
total*stringTotal formaté.
ctaLabelstringLibellé du bouton CTA (défaut localisé).
locale'fr' | 'en'frBascule des libellés.
Props
CartSummary
linesCartSummaryLine[]—Cart line items rendered as a divided list. CartSummaryLine = { id, label, detail? } — label is the primary line (heading token), detail an optional muted second line.
subtotalstring—Pre-formatted subtotal amount (e.g. "144,00 $"). Display-only — the component performs no currency math.
feesstring—Pre-formatted fees amount.
taxesstring—Pre-formatted taxes amount; row label is TPS+TVQ (fr) / Tax (en).
totalstring—Pre-formatted grand total — rendered as the emphasized final dl row (heading token, ep-base).
ctaLabelstringfr: "Confirmer et payer" / en: "Confirm and pay"Overrides the CTA button label only; all other labels follow locale.
locale"fr" | "en"'fr'Switches every built-in label (heading, items, totals rows, CTA). 'fr' (default) keeps FR-CA copy; 'en' renders the English set.
variant'summary' | 'selection''summary''selection' switches to the event-page panel and its own props (heading, totalNote, emptyMessage, notice, ariaLabel, expandLabel, ctaLabel, onCta, ctaDisabled, ctaLoading); subtotal/fees/taxes/locale do not apply there.
headingReactNode—'2 tickets' — translated and pluralised by the caller.
totalNoteReactNode—Muted line under the total ('Taxes and service fees included').
emptyMessageReactNode—Shown instead of the list when there are no lines.
noticeReactNode—Message above the CTA (e.g. an Alert saying why it is disabled). Not collapsed on a phone.
ariaLabelstring—Accessible name of the aside (translated).
expandLabelstring—Accessible name of the phone bar's expand toggle (translated); it carries aria-expanded + aria-controls.
onCta / ctaDisabled / ctaLoading() => void / boolean / boolean— / false / falseThe selection CTA's click handler and states.
lines[].price / onRemove / removeLabelstring / () => void / string—Selection lines only: the line amount under the label, and a trash IconButton named by the translated removeLabel.
classNamestring—Appended to the root aside element.
<CartSummary />Accessibility
ARIA
1 rulea11y
1 rulei18n
1 ruleUsage
Import
import { CartSummary } from "@epasslive/design-system"Example 1
<CartSummary lines={[{ id: "ga", label: "Billet GA", detail: "2 × 48,00 $" }, { id: "vip", label: "Billet VIP" }]} subtotal="144,00 $" fees="7,20 $" taxes="21,96 $" total="173,16 $" />Example 2
<CartSummary lines={lines} subtotal="265,00 $" fees="18,55 $" taxes="39,86 $" total="323,41 $" locale="en" ctaLabel="Go to payment" />Example 3
<CartSummary variant="selection" heading={t("ticketCount", { count })} total={money(total)} totalNote={t("totalNote")} lines={lines} emptyMessage={t("empty")} ariaLabel={t("ariaLabel")} expandLabel={t("expand")} ctaLabel={t("addToCart")} onCta={commit} ctaDisabled={count === 0} />Anti-patterns
— Do not fetch data directly in organisms
— Avoid tight coupling to specific data sources