@bytebrand/fe-ui-core-autobahn 1.0.154 → 1.0.156

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -88,7 +88,7 @@
88
88
  "detailsShow": "Details anzeigen",
89
89
  "paymentLabel": "Zahlung",
90
90
  "paymentValue": "Überweisung",
91
- "warrantyLabel": "Garantie",
91
+ "warrantyLabel": "Zusatzgarantie (Multipart)",
92
92
  "warrantyValue": "1 Jahr inklusive",
93
93
  "deliveryLabel": "Lieferung",
94
94
  "deliveryValue": "ca. 7–14 Tage · oder Abholung",
@@ -701,7 +701,7 @@
701
701
  },
702
702
  "modal": {
703
703
  "leasingDetails": "Leasingdetails",
704
- "financingDetails": "Details",
704
+ "financingDetails": "Finanzierungsdetails",
705
705
  "close": "Schließen",
706
706
  "vehiclePrice": "Fahrzeugpreis ggf. inkl. MwSt.",
707
707
  "leasingAmount": "Leasingbetrag",
@@ -88,7 +88,7 @@
88
88
  "detailsShow": "Show details",
89
89
  "paymentLabel": "Payment",
90
90
  "paymentValue": "Bank transfer",
91
- "warrantyLabel": "Warranty",
91
+ "warrantyLabel": "Additional warranty (Multipart)",
92
92
  "warrantyValue": "1 year included",
93
93
  "deliveryLabel": "Delivery",
94
94
  "deliveryValue": "approx. 7–14 days · or collection",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytebrand/fe-ui-core-autobahn",
3
- "version": "1.0.154",
3
+ "version": "1.0.156",
4
4
  "description": "auto.de md3 (Autobahn) design system — UI primitives, cards, chrome, VDP modules, theme CSS and locales. Ships raw TypeScript source (like fe-ui-core before it); each consumer's bundler compiles it.",
5
5
  "main": "index.ts",
6
6
  "license": "UNLICENSED",
package/theme/md3.css CHANGED
@@ -1657,6 +1657,7 @@ line-height: 31px;
1657
1657
  font-size: 11px;
1658
1658
  line-height: 150%;
1659
1659
  color: #5B6B7F;
1660
+ text-align: justify;
1660
1661
  }
1661
1662
  .md3 .co-footer-inner p b {
1662
1663
  font-weight: 700;
@@ -1821,6 +1822,14 @@ line-height: 31px;
1821
1822
  gap: 8px;
1822
1823
  flex-wrap: wrap;
1823
1824
  }
1825
+ /* Figma 64860-62117 (Kaufen only): ground-truth design-context pull — "row" is gap-[14px]
1826
+ items-start, not the shared gap-8/align-center financing/leasing's own row keeps (base rule
1827
+ above, untouched) — the taller 2-row old-price stack (badge above struck price, see
1828
+ .cf-rate-old--buy below) needs top alignment against the big price instead of centering. */
1829
+ .md3 .cf-rate-row.cf-rate-row--buy {
1830
+ gap: 14px;
1831
+ align-items: flex-start;
1832
+ }
1824
1833
  .md3 .cf-rate-amount {
1825
1834
  font-family: 'Arial';
1826
1835
  font-style: normal;
@@ -1829,6 +1838,16 @@ line-height: 31px;
1829
1838
  line-height: 58px;
1830
1839
  color: #005CFF;
1831
1840
  }
1841
+ /* Figma 64860-62117 (Kaufen only): exact text spec pasted by user — Arimo/700/36px/100%
1842
+ line-height/-1.6px letter-spacing — smaller + tighter than the shared 54px Arial price
1843
+ financing/leasing keep (base rule above, untouched). 2-class selector scopes to
1844
+ .cf-rate-amount--buy only; the ≤600px rule further down already matches this 36px size. */
1845
+ .md3 .cf-rate-amount.cf-rate-amount--buy {
1846
+ font-family: 'Arimo';
1847
+ font-size: 36px;
1848
+ line-height: 100%;
1849
+ letter-spacing: -1.6px;
1850
+ }
1832
1851
  .md3 .cf-rate-side {
1833
1852
  display: flex;
1834
1853
  flex-direction: column;
@@ -1855,6 +1874,51 @@ line-height: 31px;
1855
1874
  color: #0E2238;
1856
1875
  white-space: nowrap;
1857
1876
  }
1877
+ /* Figma 64860-62117 (Kaufen only): ground-truth design-context pull ("uvp" node) — flex column
1878
+ (badge row stacked above the struck price, gap 1px), Arimo/700/15px/normal line-height/0
1879
+ letter-spacing/native line-through, color var(--semantic-error, #ba1a1a) — replaces the shared
1880
+ Arial/400/20px dark .cf-rate-old treatment financing/leasing's own isStrike price keeps
1881
+ untouched below. 2-class selector scopes this to .cf-rate-old--buy only. */
1882
+ .md3 .cf-rate-old.cf-rate-old--buy {
1883
+ display: flex;
1884
+ flex-direction: column;
1885
+ align-items: flex-start;
1886
+ gap: 1px;
1887
+ font-family: 'Arimo';
1888
+ font-weight: 700;
1889
+ font-size: 15px;
1890
+ line-height: normal;
1891
+ letter-spacing: 0;
1892
+ color: #BA1A1A;
1893
+ }
1894
+ /* line-through lives on .cf-rate-old-text (the price span) only, not the flex container above —
1895
+ a descendant's own text-decoration:none is NOT reliable for "undoing" an ancestor's decoration
1896
+ line (well-known CSS quirk: the line is drawn across the ancestor's whole inline content
1897
+ regardless), which was still drawing the strike through the badge's "2" one level up. */
1898
+ .md3 .cf-panel .cf-rate-old--buy .cf-rate-old-text {
1899
+ text-decoration: line-through;
1900
+ }
1901
+ /* replaces the custom red diagonal bar for Kaufen only — financing/leasing's own isStrike price
1902
+ keeps the shared ::after bar (base rule below, untouched). */
1903
+ .md3 .cf-rate-old.cf-rate-old--buy::after {
1904
+ display: none;
1905
+ }
1906
+ /* Same Figma frame ("footnote" node): a plain 13x13 ring in brand/primary, Arimo Regular 8px
1907
+ text-primary (#0e2238) — sits in normal flow as its own row above the struck price (the
1908
+ flex-column .cf-rate-old--buy above), not absolutely overlaid — scoped to .cf-rate-old--buy,
1909
+ financing/leasing's isStrike badge keeps the shared corner-overlay .pp-eyebrow-badge rule
1910
+ (top-right, bigger ring) untouched below. */
1911
+ .md3 .cf-panel .cf-rate-old--buy .pp-eyebrow-badge {
1912
+ position: static;
1913
+ width: 13px;
1914
+ height: 13px;
1915
+ font-family: 'Arimo';
1916
+ font-weight: 400;
1917
+ font-size: 8px;
1918
+ line-height: normal;
1919
+ border-width: 1px;
1920
+ color: #0E2238;
1921
+ }
1858
1922
  /* must stay AFTER the base .cf-rate-amount/.cf-rate-old rules above — equal specificity means
1859
1923
  source order decides the tie (same rule as the .co-form media query elsewhere in this file). */
1860
1924
  @media (max-width: 600px) {
@@ -1967,6 +2031,20 @@ line-height: 31px;
1967
2031
  gap: 6px;
1968
2032
  }
1969
2033
  }
2034
+ /* Figma 64860-62117 (Kaufen only): ground-truth "hero" node is a plain gap-[10px] row (price
2035
+ block + rating column packed together on the left), not the shared space-between push-to-
2036
+ far-edge financing/leasing's own hero row keeps (base rule above, untouched) — the 10px gap
2037
+ itself lives on .fin-eval-col--buy's margin-left just below, so this only cancels the
2038
+ space-between/gap-16 that would otherwise ADD to it. 2-class selector scopes to
2039
+ .cf-rate-top--buy; applies at every width (.fin-eval-col--buy's margin-left is the only
2040
+ intended gap, mobile included). */
2041
+ .md3 .cf-rate-top.cf-rate-top--buy {
2042
+ justify-content: flex-start;
2043
+ gap: 0;
2044
+ }
2045
+ .md3 .cf-panel .fin-eval-col.fin-eval-col--buy {
2046
+ margin-left: 10px;
2047
+ }
1970
2048
  .md3 .cf-rate-left {
1971
2049
  display: flex;
1972
2050
  flex-direction: column;
@@ -1981,13 +2059,15 @@ line-height: 31px;
1981
2059
  line-height: 15px;
1982
2060
  color: #0E2238;
1983
2061
  }
1984
- /* Kaufen's compact "Überweisung · Sofort verfügbar" recap — mobile only (show-mobile, see JSX);
1985
- desktop already has the same two facts as separate Zahlung/Verfügbarkeit rows further down
1986
- (.cf-buy-info), so this would just duplicate them there. */
1987
- @media (max-width: 600px) {
1988
- .md3 .cf-panel .co-aside-cond.co-aside-cond--buy {
1989
- margin-top: 5px;
1990
- }
2062
+ /* Kaufen's compact "Überweisung · sofort verfügbar" recap — Figma 64860-62117 renders it
2063
+ unconditionally (desktop AND mobile) right under the price, alongside the separate Zahlung/
2064
+ Zusatzgarantie/Verfügbar rows further down (.cf-buy-info) — previously hidden on desktop
2065
+ (show-mobile) on the wrong assumption that it only duplicated those rows; removed from JSX.
2066
+ 5px (ground-truth "Rate" column gap) replaces the shared 10px .co-aside-cond gap financing/
2067
+ leasing's own cond line keeps (base rule above, untouched) — was mobile-only before; Figma's
2068
+ same frame carries this gap at any width, so it's no longer scoped to the ≤600px query. */
2069
+ .md3 .cf-panel .co-aside-cond.co-aside-cond--buy {
2070
+ margin-top: 5px;
1991
2071
  }
1992
2072
  /* .fin-eval-col's shared base rule is `display: contents` (a CSS-grid trick that relies on a
1993
2073
  `.fin-price-grid` grid ancestor with named areas — cf-panel isn't a grid), so it needs the
@@ -1998,6 +2078,10 @@ line-height: 31px;
1998
2078
  gap: 8px;
1999
2079
  flex: none;
2000
2080
  align-items: stretch;
2081
+ /* Figma 64860-62117: fixed 106px column so the pill (below, display:flex + align-items:
2082
+ stretch cascading down) and the bar (already width:100%) both span the same width instead
2083
+ of shrink-wrapping to whichever tier label happens to be widest. */
2084
+ width: 106px;
2001
2085
  }
2002
2086
  @media (max-width: 600px) {
2003
2087
  .md3 .cf-panel .fin-eval-col {
@@ -2200,6 +2284,31 @@ line-height: 31px;
2200
2284
  width: 40px;
2201
2285
  height: 40px;
2202
2286
  }
2287
+ /* Rundum-Sorglos-Paket title "i" popover — same reasoning/pattern as the .cf-toggle override
2288
+ above (inherited rule is tuned for the small UVP-Rate footnote badge, top:16px/left:0/
2289
+ width:260px): left:0 was relative to the title's own 20px padding box, bleeding the popover
2290
+ past the card's left border. left:20px nudges it to align with the title's own content edge
2291
+ instead (close to the original 260px width — a full left:0/right:0/width:auto span was tried
2292
+ and was too wide/plain). right:20px + max-width is the mobile safety net: on a narrow card it
2293
+ shrinks instead of overflowing; on a normal-width card max-width wins and the box just sits
2294
+ 280px wide, anchored at left:20px (CSS over-constrained resolution recalculates the unused
2295
+ "right" rather than stretching). 3 class-selectors deep so it always wins over the 2-deep base
2296
+ rule regardless of source order. */
2297
+ .md3 .cf-panel .co-card-title .pp-uvp-tooltip {
2298
+ top: 28px;
2299
+ left: 40px;
2300
+ right: 20px;
2301
+ width: auto;
2302
+ max-width: 280px;
2303
+ }
2304
+ /* same box, narrower safety margin so the 280px cap still comfortably fits a phone-width card
2305
+ instead of being cut flush against the right edge. */
2306
+ @media (max-width: 600px) {
2307
+ .md3 .cf-panel .co-card-title .pp-uvp-tooltip {
2308
+ left: 20px;
2309
+ right: 12px;
2310
+ }
2311
+ }
2203
2312
  .md3 .cf-toggle .md-title-sm {
2204
2313
  display: inline-flex;
2205
2314
  align-items: center;
@@ -2211,6 +2320,14 @@ line-height: 31px;
2211
2320
  line-height: 15px;
2212
2321
  color: #1A1B22;
2213
2322
  }
2323
+ /* Rundum-Sorglos-Paket's toggle label should read the same size as the Zahlung/Zusatzgarantie/
2324
+ Verfügbarkeit rows above it (.cf-buy-info .calcrow-label, 15px/17px) — .cf-panel scopes this to
2325
+ CheckoutFinancePanelNext only, leaving AdditionalServicesNext's unrelated .co-rundum-footer
2326
+ .cf-toggle (step 4) at its own 13px untouched. */
2327
+ .md3 .cf-panel .cf-toggle .md-title-sm {
2328
+ font-size: 15px;
2329
+ line-height: 17px;
2330
+ }
2214
2331
  .md3 .cf-toggle .md-title-sm svg {
2215
2332
  cursor: pointer;
2216
2333
  }
@@ -2404,7 +2521,7 @@ line-height: 31px;
2404
2521
  .md3 .co-form {
2405
2522
  display: flex;
2406
2523
  flex-direction: column;
2407
- gap: 18px;
2524
+ gap: 20px;
2408
2525
  padding-bottom: 20px;
2409
2526
  border-bottom: 1px solid #C5C6D2;
2410
2527
  }
@@ -2422,10 +2539,19 @@ line-height: 31px;
2422
2539
  .md3 .co-form.co-form--payment-details {
2423
2540
  border-bottom: 0;
2424
2541
  }
2425
- /* order-overview step only — same reasoning, see OrderOverviewNext.tsx's "co-form oo-page". */
2542
+ /* order-overview step only — same reasoning, see OrderOverviewNext.tsx's "co-form oo-page".
2543
+ gap also overridden to the shared ≤600px value (14px) at ALL widths, desktop included, per
2544
+ explicit request — the base .co-form's 20px (every other checkout step, except
2545
+ additional-services below) is untouched. */
2426
2546
  .md3 .co-form.oo-page {
2547
+ gap: 14px;
2427
2548
  border-bottom: 0;
2428
2549
  }
2550
+ /* additional-services step only — see AdditionalServicesNext.tsx's "co-form co-form--additional-
2551
+ services". Same reasoning/value as .oo-page above, desktop included, per explicit request. */
2552
+ .md3 .co-form.co-form--additional-services {
2553
+ gap: 14px;
2554
+ }
2429
2555
  .md3 .co-step-title {
2430
2556
  font: 700 22px var(--md-font-display, var(--md-font));
2431
2557
  margin: 0;
@@ -2505,6 +2631,12 @@ line-height: 31px;
2505
2631
  padding: 14px 20px;
2506
2632
  border-bottom: 1px solid #C5C6D2;
2507
2633
  }
2634
+ /* Kaufen: .co-rundum-footer (the "in die Rate einrechnen" toggle) isn't rendered at all, so
2635
+ .co-rundum-box is the card's last element — the border-bottom above would just be a dangling
2636
+ line with nothing below it. */
2637
+ .md3 .cf-panel .co-rundum-box.co-rundum-box--buy {
2638
+ border-bottom: 0;
2639
+ }
2508
2640
  .md3 .cf-panel .co-rundum-footer {
2509
2641
  padding: 14px 20px;
2510
2642
  }
@@ -4555,6 +4687,23 @@ line-height: 31px;
4555
4687
  justify-content: space-between;
4556
4688
  gap: 10px;
4557
4689
  }
4690
+ /* "2. Rechnungsadresse" / "3. Lieferadresse" (.oo-addr-grid's two cards only — the shared 10px
4691
+ above still fits "Lieferung & Services"/Zahldetails fine, which have a whole row to themselves)
4692
+ — the base gap left too little room for "Rechnungsadresse" next to "Ändern" in the half-width
4693
+ grid column, wrapping the title to 2 lines. align-items: center (inherited from the base rule
4694
+ above) only centers against the FULL flex-row height, so while wrapped it centered "Ändern"
4695
+ against both title lines instead of matching the first one. */
4696
+ .md3 .oo-addr-grid .oo-card-title--action {
4697
+ gap: 4px;
4698
+ }
4699
+ /* The button has no explicit line-height, so the UA default ("normal", ~1.15-1.2x its 13px font)
4700
+ gives it a taller box than its own glyphs — align-items: center then centers that whole taller
4701
+ box against the title's 23px line-height box, landing "Ändern"'s visible text a bit low. line-
4702
+ height: 1 collapses the button's box to its font-size itself, so both sides center on their
4703
+ actual text instead of on mismatched leading. */
4704
+ .md3 .oo-addr-grid .oo-card-action {
4705
+ line-height: 1;
4706
+ }
4558
4707
  .md3 .oo-card-action {
4559
4708
  font-family: Arial;
4560
4709
  font-weight: 700;
@@ -4667,79 +4816,279 @@ line-height: 31px;
4667
4816
  border-left: 0 !important;
4668
4817
  }
4669
4818
  }
4670
- /* "5. Monatlich zu zahlen" / "5. Gesamtpreis" (Figma 63794:27213 / 63898:29799 / 63895:9796) — the
4671
- rate hero (.oo-mzz-price-row down to .cf-rate-old) intentionally reuses CheckoutFinancePanelNext's
4672
- own .cf-rate-row/.cf-rate-amount/.cf-rate-side/.cf-rate-unit/.cf-rate-old (global) plus its
4673
- .pp-eyebrow/.pp-eyebrow-badge/.pp-uvp-tooltip/.fin-eval-* rules (scoped to .cf-panel) — the JSX
4674
- wraps this card's price block in a bare <div className="cf-panel"> (display:flex/column only, no
4675
- box styling of its own) purely so those already-pixel-verified scoped rules apply here too
4676
- (including .pp-uvp-tooltip's own left-anchor fix, further up this file). */
4677
- .md3 .oo-mzz-rate-label {
4678
- font-family: Arial;
4679
- font-size: 13px;
4680
- line-height: 1.4;
4681
- color: var(--md-on-surface-variant);
4819
+ /* "2 Jahre Garantie" "i" popover (OrderOverviewNext.tsx) — same AddServicesTooltipBody/
4820
+ pp-uvp-tooltip markup as step 3's title info trigger, but there's no .cf-panel ancestor here to
4821
+ inherit the shared "grey card" look from, so the full style (not just a position override) is
4822
+ defined fresh under .oo-ls-title-row. Anchored right:0 (the garantie cell is the row's last/
4823
+ rightmost of 3) so the box opens leftward instead of overflowing past the card's right edge;
4824
+ max-width keeps it inside a narrow phone screen once .oo-ls-row stacks to full width below. */
4825
+ .md3 .oo-ls-title-row .pp-uvp-tooltip {
4826
+ position: absolute;
4827
+ top: 24px;
4828
+ left: auto;
4829
+ right: 0;
4830
+ z-index: 20;
4831
+ width: 300px;
4832
+ max-width: calc(100vw - 48px);
4833
+ padding: 10px 12px;
4834
+ border-radius: 15px;
4835
+ background: #c5c6d2;
4836
+ box-shadow: var(--md-e2, 0 4px 12px rgba(0, 0, 0, 0.15));
4837
+ white-space: normal;
4838
+ cursor: default;
4839
+ }
4840
+ .md3 .oo-ls-title-row .pp-uvp-tooltip-close {
4841
+ position: absolute;
4842
+ top: -14px;
4843
+ right: -14px;
4844
+ display: flex;
4845
+ align-items: center;
4846
+ justify-content: center;
4847
+ width: 26px;
4848
+ height: 26px;
4849
+ border-radius: 50%;
4850
+ background: rgba(11, 19, 32, 0.55);
4851
+ border: 1.5px solid rgba(255, 255, 255, 0.25);
4852
+ padding: 0;
4853
+ cursor: pointer;
4854
+ }
4855
+ .md3 .oo-ls-title-row .pp-uvp-tooltip-body {
4856
+ font-family: 'Arimo';
4857
+ font-weight: 400;
4858
+ font-size: 11px;
4859
+ line-height: 13px;
4860
+ color: #0e2238;
4861
+ }
4862
+ /* "5. Monatlich zu zahlen" / "5. Gesamtpreis" (Figma: Finanzierung 64763:107263, Leasing
4863
+ 64794:110315, Kaufen 64794:109673) — own "oo-pay-*" namespace, NOT the shared
4864
+ .cf-rate-row/.fin-eval-* classes CheckoutFinancePanelNext.tsx (step 3) uses: that component
4865
+ still renders the OLDER rate-hero pattern, and this card's Figma ("auto.de / Price Block") is
4866
+ a newer, differently-proportioned design (54px/38px amounts, different UVP layout) — reusing
4867
+ the old shared classes here would either look wrong or risk step 3 regressions if tweaked to
4868
+ fit. EvalBar is still the shared component (only the pill/bar's own wrapper sizing is new). */
4869
+ .md3 .oo-pay-rate {
4870
+ display: flex;
4871
+ flex-direction: column;
4872
+ gap: 6px;
4873
+ width: 100%;
4874
+ }
4875
+ /* Mobile-only condensed line under the price block (Figma: 63571:28425 financing / 64794:110041
4876
+ leasing) — see .show-mobile below for the display toggle. */
4877
+ .md3 .oo-pay-mobile-summary {
4682
4878
  margin: 0;
4879
+ font-family: Arimo, Arial, sans-serif;
4880
+ font-size: 13px;
4881
+ color: #0E2238;
4882
+ width: 100%;
4683
4883
  }
4684
- .md3 .oo-mzz-price-row {
4884
+ .md3 .oo-pay-price-row {
4885
+ position: relative;
4685
4886
  display: flex;
4686
4887
  align-items: center;
4687
4888
  justify-content: space-between;
4688
4889
  gap: 16px;
4689
4890
  width: 100%;
4690
4891
  }
4691
- /* Kaufen only — UVP-struck price sits ABOVE the flat total (right-aligned column), unlike
4692
- Financing/Leasing where it sits beside the rate in .cf-rate-side. */
4693
- .md3 .oo-mzz-uvp-col {
4892
+ /* UVP footnote popover (both the Buy "②" and the Financing/Leasing "UVP-Rate ③" branches above —
4893
+ oo-pay-buy-uvp-row and oo-pay-secondary respectively, both descendants of this row) — same
4894
+ "grey card" pp-uvp-tooltip look step 3's .cf-panel scope and order-overview's own
4895
+ .oo-ls-title-row scope already give it, but nothing scoped it under this card's own oo-pay-*
4896
+ namespace, so it rendered as plain unstyled text. position:relative lives on this shared
4897
+ ancestor (not each branch's own element) since one rule here covers both. */
4898
+ .md3 .oo-pay-price-row .pp-uvp-tooltip {
4899
+ position: absolute;
4900
+ top: 28px;
4901
+ left: 0;
4902
+ z-index: 20;
4903
+ width: 300px;
4904
+ max-width: calc(100vw - 48px);
4905
+ padding: 10px 12px;
4906
+ border-radius: 15px;
4907
+ background: #c5c6d2;
4908
+ box-shadow: var(--md-e2, 0 4px 12px rgba(0, 0, 0, 0.15));
4909
+ white-space: normal;
4910
+ cursor: default;
4911
+ }
4912
+ .md3 .oo-pay-price-row .pp-uvp-tooltip-close {
4913
+ position: absolute;
4914
+ top: -14px;
4915
+ right: -14px;
4916
+ display: flex;
4917
+ align-items: center;
4918
+ justify-content: center;
4919
+ width: 26px;
4920
+ height: 26px;
4921
+ border-radius: 50%;
4922
+ background: rgba(11, 19, 32, 0.55);
4923
+ border: 1.5px solid rgba(255, 255, 255, 0.25);
4924
+ padding: 0;
4925
+ cursor: pointer;
4926
+ }
4927
+ .md3 .oo-pay-price-row .pp-uvp-tooltip-body {
4928
+ font-family: 'Arimo';
4929
+ font-weight: 400;
4930
+ font-size: 11px;
4931
+ line-height: 13px;
4932
+ color: #0e2238;
4933
+ }
4934
+ .md3 .oo-pay-left {
4935
+ display: flex;
4936
+ align-items: center;
4937
+ gap: 8px;
4938
+ flex: 1 0 0;
4939
+ min-width: 0;
4940
+ }
4941
+ .md3 .oo-pay-amount {
4942
+ font-family: Arimo, Arial, sans-serif;
4943
+ font-weight: 700;
4944
+ font-size: 54px;
4945
+ line-height: 58px;
4946
+ color: #005CFF;
4947
+ white-space: nowrap;
4948
+ }
4949
+ .md3 .oo-pay-secondary {
4694
4950
  display: flex;
4695
4951
  flex-direction: column;
4696
- align-items: flex-end;
4697
4952
  gap: 2px;
4953
+ align-items: flex-start;
4698
4954
  }
4699
- .md3 .oo-mzz-uvp-row {
4955
+ .md3 .oo-pay-uvp-row {
4700
4956
  display: flex;
4701
4957
  align-items: center;
4702
- gap: 6px;
4958
+ gap: 3px;
4703
4959
  }
4704
- .md3 .oo-mzz-uvp-label {
4705
- font-family: Arial;
4960
+ .md3 .oo-pay-uvp-label {
4961
+ font-family: Arimo, Arial, sans-serif;
4962
+ font-size: 11px;
4963
+ color: #0E2238;
4964
+ white-space: nowrap;
4965
+ }
4966
+ /* Buy's own "UVP" label (17.14px, no footnote circle immediately after it — the circle sits
4967
+ after the struck amount instead) — kept separate from .oo-pay-uvp-label (11px, financing/
4968
+ leasing) since the two aren't the same text node in Figma. */
4969
+ .md3 .oo-pay-buy-uvp-label {
4970
+ font-family: Arimo, Arial, sans-serif;
4706
4971
  font-size: 17px;
4707
- line-height: normal;
4708
- /* Figma's "text-primary" token (#0e2238) — NOT var(--md-on-surface)/"text/strong" (#1a1b22),
4709
- same distinction as .oo-mzz-cond below; matches the literal #0E2238 already hardcoded on
4710
- .cf-rate-old/.co-card-title/.cf-panel .co-aside-cond elsewhere in this file. */
4711
4972
  color: #0E2238;
4973
+ white-space: nowrap;
4712
4974
  }
4713
- .md3 .oo-mzz-total-amount {
4714
- font-family: 'Arial';
4715
- font-weight: 700;
4716
- font-size: 46px;
4717
- line-height: 52px;
4975
+ .md3 .oo-pay-footnote {
4976
+ display: flex;
4977
+ align-items: center;
4978
+ justify-content: center;
4979
+ flex: none;
4980
+ width: 13px;
4981
+ height: 13px;
4982
+ border-radius: 999px;
4983
+ border: 1px solid #005CFF;
4984
+ background: #FFFFFF;
4985
+ font-family: Arimo, Arial, sans-serif;
4986
+ font-size: 7px;
4718
4987
  color: #005CFF;
4719
4988
  }
4720
- .md3 .oo-mzz-price-wrap {
4721
- margin-top: 6px;
4989
+ /* Buy's "①" next to the big price — plain text, no circle (Figma: no border/background on that
4990
+ node, unlike .oo-pay-footnote's "②"/"③"). */
4991
+ .md3 .oo-pay-footnote-plain {
4992
+ font-family: Arimo, Arial, sans-serif;
4993
+ font-size: 9px;
4994
+ color: #005CFF;
4722
4995
  }
4723
- /* auto.de / Price Rating is 120px wide in this card (vs. the shared .fin-eval-pill/-bar's other,
4724
- narrower usages elsewhere on the site) — scoped here rather than touching those shared base
4725
- rules. .fin-eval-bar already has width:100%, so sizing the -cell wrapper is enough for the bar;
4726
- the pill itself needs an explicit box since it only auto-sizes to its text otherwise. */
4727
- .md3 .oo-mzz-price-wrap .fin-eval-pill--good {
4728
- width: 120px;
4729
- height: 28px;
4996
+ /* Struck UVP amount — same mechanism as the shared .cf-rate-old::after (red bar, -10deg), kept
4997
+ as its own rule since .cf-rate-old itself is step 3's shared class (see file header above). */
4998
+ .md3 .oo-pay-uvp-amount {
4999
+ position: relative;
5000
+ display: inline-block;
5001
+ font-family: Arimo, Arial, sans-serif;
5002
+ font-size: 20px;
5003
+ color: #0E2238;
5004
+ white-space: nowrap;
5005
+ }
5006
+ .md3 .oo-pay-uvp-amount::after {
5007
+ content: '';
5008
+ position: absolute;
5009
+ left: -2px;
5010
+ right: -2px;
5011
+ top: 50%;
5012
+ height: 2px;
5013
+ background: #D92D20;
5014
+ transform: rotate(-10deg);
5015
+ transform-origin: center;
5016
+ }
5017
+ .md3 .oo-pay-unit {
5018
+ font-family: Arimo, Arial, sans-serif;
5019
+ font-weight: 700;
5020
+ font-size: 18px;
5021
+ color: #5B6B7F;
4730
5022
  }
4731
- .md3 .oo-mzz-price-wrap .fin-eval-bar-cell {
5023
+ .md3 .oo-pay-rating-col {
5024
+ display: flex;
5025
+ flex-direction: column;
5026
+ align-items: center;
5027
+ gap: 8px;
5028
+ flex: none;
4732
5029
  width: 120px;
4733
5030
  }
4734
- .md3 .oo-mzz-cond {
4735
- margin: 6px 0 0;
4736
- font-family: Arial;
5031
+ /* Buy's price block uses its own 108px rating column (Figma: 64794:109673 desktop and 64833:89153
5032
+ mobile both specify 108px, not 120px) — same value at both breakpoints, unlike Financing/
5033
+ Leasing's column which only changes WIDTH BEHAVIOUR (fixed → flexible) on mobile, not this
5034
+ number, so this rule isn't itself inside a media query. */
5035
+ .md3 .oo-pay-rating-col--buy {
5036
+ width: 108px;
5037
+ }
5038
+ .md3 .oo-pay-rating-badge {
5039
+ display: flex;
5040
+ align-items: center;
5041
+ justify-content: center;
5042
+ width: 100%;
5043
+ padding: 5px 10px;
5044
+ border-radius: 16px;
5045
+ box-sizing: border-box;
5046
+ font-family: Arimo, Arial, sans-serif;
5047
+ font-weight: 700;
5048
+ font-size: 12px;
5049
+ line-height: 18px;
5050
+ white-space: nowrap;
5051
+ }
5052
+ .md3 .oo-pay-rating-bar {
5053
+ width: 100%;
5054
+ }
5055
+ /* Buy's price block — right-aligned column (UVP above, big price below), unlike Financing/
5056
+ Leasing's side-by-side .oo-pay-left/.oo-pay-secondary. */
5057
+ .md3 .oo-pay-buy-price-col {
5058
+ display: flex;
5059
+ flex-direction: column;
5060
+ align-items: flex-end;
5061
+ gap: 2px;
5062
+ }
5063
+ /* Figma 64794-109673 "secondaryStack": items-start, not center — the footnote badge (now a
5064
+ direct sibling of .oo-pay-uvp-amount, moved out so the struck price's own ::after bar doesn't
5065
+ draw its strike across the badge too) sits top-aligned/raised next to the price instead of
5066
+ vertically centered against it. */
5067
+ .md3 .oo-pay-buy-uvp-row {
5068
+ display: flex;
5069
+ align-items: flex-start;
5070
+ gap: 2px;
5071
+ }
5072
+ .md3 .oo-pay-buy-leftgroup {
5073
+ display: flex;
5074
+ align-items: flex-start;
5075
+ gap: 2px;
5076
+ }
5077
+ .md3 .oo-pay-buy-amount {
5078
+ font-family: Arimo, Arial, sans-serif;
5079
+ font-weight: 700;
5080
+ font-size: 38px;
5081
+ line-height: 52px;
5082
+ color: #005CFF;
5083
+ white-space: nowrap;
5084
+ }
5085
+ .md3 .oo-pay-cond {
5086
+ margin: 0;
5087
+ font-family: Arimo, Arial, sans-serif;
4737
5088
  font-size: 13px;
4738
- line-height: normal;
4739
- /* Figma's "text-primary" (#0e2238), not "text/strong" — see .oo-mzz-uvp-label above. */
4740
5089
  color: #0E2238;
4741
5090
  }
4742
- .md3 .oo-mzz-cond-link {
5091
+ .md3 .oo-pay-cond-link {
4743
5092
  background: none;
4744
5093
  border: 0;
4745
5094
  padding: 0;
@@ -4749,137 +5098,296 @@ line-height: 31px;
4749
5098
  text-decoration: underline;
4750
5099
  cursor: pointer;
4751
5100
  }
4752
- .md3 .oo-mzz-row {
5101
+ .md3 .oo-pay-row {
4753
5102
  display: flex;
4754
5103
  align-items: flex-start;
4755
5104
  width: 100%;
4756
- margin-top: 12px;
4757
5105
  }
4758
- /* Kaufen only — single list (no left/right KV split), Figma's own "list" node. */
4759
- .md3 .oo-mzz-buy-list {
5106
+ .md3 .oo-pay-col-left {
4760
5107
  display: flex;
4761
5108
  flex-direction: column;
4762
5109
  gap: 8px;
4763
- width: 100%;
4764
- margin-top: 12px;
4765
- padding-top: 12px;
4766
- border-top: 1px solid var(--md-outline-variant);
5110
+ flex: none;
5111
+ width: 266px;
5112
+ padding-right: 20px;
4767
5113
  box-sizing: border-box;
5114
+ font-family: Arimo, Arial, sans-serif;
5115
+ font-size: 14px;
5116
+ line-height: 1.4;
4768
5117
  }
4769
- .md3 .oo-mzz-kv-col {
5118
+ .md3 .oo-pay-col-right {
4770
5119
  display: flex;
4771
5120
  flex-direction: column;
5121
+ gap: 10px;
4772
5122
  flex: 1 0 0;
4773
5123
  min-width: 0;
5124
+ padding-left: 20px;
5125
+ box-sizing: border-box;
5126
+ font-family: Arimo, Arial, sans-serif;
5127
+ font-size: 14px;
5128
+ line-height: 1.4;
4774
5129
  }
4775
- .md3 .oo-mzz-kv-col--left {
4776
- gap: 8px;
4777
- padding-right: 24px;
4778
- }
4779
- .md3 .oo-mzz-kv-col--right {
4780
- gap: 10px;
4781
- padding-left: 24px;
4782
- }
4783
- .md3 .oo-mzz-kv-rule {
5130
+ .md3 .oo-pay-divider {
4784
5131
  flex: none;
4785
5132
  align-self: stretch;
4786
5133
  width: 1px;
4787
- background: var(--md-outline-variant);
5134
+ background: #C5C6D2;
4788
5135
  }
4789
- .md3 .oo-mzz-kv-row {
5136
+ .md3 .oo-pay-kv-row {
4790
5137
  display: flex;
4791
5138
  align-items: baseline;
4792
- justify-content: space-between;
4793
- gap: 12px;
5139
+ gap: 8px;
4794
5140
  width: 100%;
4795
- font-family: Arial;
4796
- font-size: 14px;
4797
- line-height: 1.4;
4798
5141
  }
4799
- .md3 .oo-mzz-kv-label {
5142
+ /* Left column: short fixed label, value fills/right-aligns. Right column: label fills/wraps,
5143
+ value stays fixed — same inversion Figma itself uses between the two columns. */
5144
+ .md3 .oo-pay-kv-row--left .oo-pay-kv-label {
5145
+ flex: none;
5146
+ white-space: nowrap;
5147
+ }
5148
+ .md3 .oo-pay-kv-row--left .oo-pay-kv-value {
4800
5149
  flex: 1 0 0;
4801
5150
  min-width: 0;
4802
- color: var(--md-on-surface-variant);
5151
+ text-align: right;
5152
+ }
5153
+ .md3 .oo-pay-kv-row--right {
5154
+ gap: 12px;
5155
+ align-items: center;
5156
+ }
5157
+ .md3 .oo-pay-kv-row--right .oo-pay-kv-label {
5158
+ flex: 1 0 0;
5159
+ min-width: 0;
5160
+ display: flex;
5161
+ align-items: center;
5162
+ gap: 8px;
4803
5163
  }
4804
- .md3 .oo-mzz-kv-value {
5164
+ .md3 .oo-pay-kv-row--right .oo-pay-kv-value {
5165
+ flex: none;
5166
+ text-align: right;
5167
+ }
5168
+ /* Icon rows (Anschluss-Garantie / Rundum-Sorglos) invert the Fahrzeugrate row's flex roles in
5169
+ Figma: there the LABEL is the fixed, non-wrapping element (shrink-0 whitespace-nowrap) and the
5170
+ VALUE flexes/right-aligns into the remaining space — not the other way around, which is what
5171
+ made the long "2 Jahre Anschluss-Garantie"/icon combination wrap onto a second line. */
5172
+ .md3 .oo-pay-kv-row--icon .oo-pay-kv-label {
4805
5173
  flex: none;
4806
- color: var(--md-on-surface);
4807
5174
  white-space: nowrap;
4808
5175
  }
4809
- .md3 .oo-mzz-kv-row--total .oo-mzz-kv-label,
4810
- .md3 .oo-mzz-kv-row--total .oo-mzz-kv-value {
4811
- font-weight: 700;
4812
- color: var(--md-on-surface);
5176
+ .md3 .oo-pay-kv-row--icon .oo-pay-kv-value {
5177
+ flex: 1 0 0;
5178
+ min-width: 0;
5179
+ white-space: nowrap;
5180
+ }
5181
+ .md3 .oo-pay-kv-label {
5182
+ color: #44464F;
5183
+ }
5184
+ .md3 .oo-pay-kv-value {
5185
+ color: #1A1B22;
5186
+ }
5187
+ .md3 .oo-pay-info-icon {
5188
+ flex: none;
5189
+ }
5190
+ /* Same "open the Garantie explainer in a new tab" onClick behaviour as the Zulassung card's
5191
+ info trigger elsewhere in OrderOverviewNext.tsx — unstyled button wrapper so the icon keeps
5192
+ its inline position in the kv-label. */
5193
+ .md3 .oo-pay-info-trigger {
5194
+ display: inline-flex;
5195
+ align-items: center;
5196
+ justify-content: center;
5197
+ flex: none;
5198
+ width: 18px;
5199
+ height: 18px;
5200
+ background: none;
5201
+ border: 0;
5202
+ padding: 0;
5203
+ margin: 0;
5204
+ appearance: none;
5205
+ line-height: 0;
5206
+ cursor: pointer;
4813
5207
  }
4814
- .md3 .oo-mzz-kv-hr {
5208
+ .md3 .oo-pay-rule-h {
4815
5209
  width: 100%;
4816
5210
  height: 1px;
4817
5211
  border: 0;
4818
5212
  margin: 0;
4819
- background: var(--md-outline-variant);
5213
+ background: #C5C6D2;
4820
5214
  }
4821
- .md3 .oo-mzz-note {
4822
- margin: 12px 0 0;
4823
- font-family: Arial;
5215
+ .md3 .oo-pay-total-row {
5216
+ display: flex;
5217
+ align-items: baseline;
5218
+ gap: 3px;
5219
+ width: 100%;
5220
+ font-family: Arimo, Arial, sans-serif;
5221
+ font-weight: 700;
5222
+ font-size: 14px;
5223
+ color: #1A1B22;
5224
+ }
5225
+ .md3 .oo-pay-total-row .oo-pay-kv-label {
5226
+ color: #1A1B22;
5227
+ }
5228
+ .md3 .oo-pay-total-row .oo-pay-kv-value {
5229
+ flex: 1 0 0;
5230
+ text-align: right;
5231
+ color: #1A1B22;
5232
+ }
5233
+ .md3 .oo-pay-vat-line {
5234
+ margin: 0;
5235
+ font-family: Arimo, Arial, sans-serif;
4824
5236
  font-size: 13px;
5237
+ color: #44464F;
5238
+ width: 100%;
5239
+ }
5240
+ .md3 .oo-pay-kaufpreis {
5241
+ width: 100%;
5242
+ padding-bottom: 12px;
5243
+ border-bottom: 1px solid #AAB3BF;
5244
+ box-sizing: border-box;
5245
+ }
5246
+ .md3 .oo-pay-kaufpreis p {
5247
+ margin: 0;
5248
+ font-family: Arimo, Arial, sans-serif;
5249
+ font-size: 15px;
5250
+ line-height: 1.35;
5251
+ color: #0E2238;
5252
+ }
5253
+ /* Kaufen only — single list (no left/right KV split), Figma's own "list" node. */
5254
+ .md3 .oo-pay-buy-list {
5255
+ display: flex;
5256
+ flex-direction: column;
5257
+ gap: 8px;
5258
+ width: 100%;
5259
+ padding-top: 12px;
5260
+ border-top: 1px solid #C5C6D2;
5261
+ box-sizing: border-box;
5262
+ font-family: Arimo, Arial, sans-serif;
5263
+ font-size: 14px;
4825
5264
  line-height: 1.4;
4826
- color: var(--md-on-surface);
4827
5265
  }
4828
- .md3 .oo-mzz-hinweis {
5266
+ .md3 .oo-pay-buy-row {
5267
+ display: flex;
5268
+ align-items: baseline;
5269
+ gap: 12px;
5270
+ width: 100%;
5271
+ }
5272
+ .md3 .oo-pay-buy-row--icon {
5273
+ align-items: center;
5274
+ }
5275
+ .md3 .oo-pay-buy-row .oo-pay-kv-label {
5276
+ flex: 1 0 0;
5277
+ min-width: 0;
5278
+ display: flex;
5279
+ align-items: center;
5280
+ gap: 8px;
5281
+ }
5282
+ .md3 .oo-pay-buy-row .oo-pay-kv-value {
5283
+ flex: none;
5284
+ text-align: right;
5285
+ }
5286
+ /* Same Figma inversion as .oo-pay-kv-row--icon above: icon rows fix the label and flex the value. */
5287
+ .md3 .oo-pay-buy-row--icon .oo-pay-kv-label {
5288
+ flex: none;
5289
+ white-space: nowrap;
5290
+ }
5291
+ .md3 .oo-pay-buy-row--icon .oo-pay-kv-value {
5292
+ flex: 1 0 0;
5293
+ min-width: 0;
5294
+ white-space: nowrap;
5295
+ }
5296
+ .md3 .oo-pay-buy-total {
5297
+ display: flex;
5298
+ align-items: baseline;
5299
+ gap: 12px;
5300
+ width: 100%;
5301
+ font-weight: 700;
5302
+ color: #1A1B22;
5303
+ }
5304
+ .md3 .oo-pay-buy-total .oo-pay-kv-label {
5305
+ flex: 1 0 0;
5306
+ color: #1A1B22;
5307
+ }
5308
+ .md3 .oo-pay-buy-total .oo-pay-kv-value {
5309
+ flex: none;
5310
+ color: #1A1B22;
5311
+ }
5312
+ .md3 .oo-pay-hinweis {
4829
5313
  display: flex;
4830
5314
  align-items: center;
4831
5315
  gap: 10px;
4832
5316
  width: 100%;
4833
- margin-top: 12px;
4834
5317
  padding: 12px 14px;
4835
5318
  border-radius: 12px;
4836
5319
  background: #F4F5FA;
4837
5320
  box-sizing: border-box;
4838
5321
  }
4839
- .md3 .oo-mzz-hinweis svg {
5322
+ .md3 .oo-pay-hinweis svg {
4840
5323
  flex: none;
4841
5324
  }
4842
- .md3 .oo-mzz-hinweis-text {
4843
- flex: 1 0 0;
4844
- min-width: 0;
4845
- font-family: Arial;
4846
- font-size: 13px;
4847
- line-height: 1.4;
4848
- color: var(--md-on-surface-variant);
4849
- margin: 0;
4850
- }
4851
- .md3 .oo-mzz-hinweis-link {
5325
+ .md3 .oo-pay-hinweis-link {
4852
5326
  flex: none;
4853
5327
  background: none;
4854
5328
  border: 0;
4855
5329
  padding: 0;
4856
- font-family: Arial;
5330
+ font-family: Arimo, Arial, sans-serif;
4857
5331
  font-weight: 700;
4858
5332
  font-size: 13px;
4859
- line-height: 1.4;
4860
- color: var(--md-primary);
5333
+ color: #005CFF;
4861
5334
  cursor: pointer;
4862
5335
  }
4863
- .md3 .oo-mzz-hinweis-link:hover {
5336
+ .md3 .oo-pay-hinweis-link:hover {
4864
5337
  text-decoration: underline;
4865
5338
  }
4866
- @media (max-width: 800px) {
4867
- .md3 .oo-mzz-price-row {
4868
- flex-direction: column;
4869
- align-items: flex-start;
4870
- gap: 10px;
4871
- }
4872
- .md3 .oo-mzz-row {
4873
- flex-direction: column;
4874
- gap: 12px;
5339
+ /* Figma's "CK / Content" wrapper holds rate/row(-or-buy-list)/kaufpreis(-or-vat-line)/hinweis in
5340
+ a flex-col with gap:12px — .co-card itself isn't a flex container, so that inter-section gap
5341
+ has to be reproduced as margin-top on each section that can follow .oo-pay-rate. */
5342
+ .md3 .co-card > .oo-pay-row,
5343
+ .md3 .co-card > .oo-pay-buy-list,
5344
+ .md3 .co-card > .oo-pay-kaufpreis,
5345
+ .md3 .co-card > .oo-pay-vat-line,
5346
+ .md3 .co-card > .oo-pay-hinweis {
5347
+ margin-top: 12px;
5348
+ }
5349
+ /* Leasing only: "inkl. 19 % MwSt." is grouped with Monatliche Gesamtbelastung in its own
5350
+ gap-[12px] sub-wrapper in Figma, not the surrounding .oo-pay-col-right's gap:10px. */
5351
+ .md3 .oo-pay-col-right .oo-pay-vat-line {
5352
+ margin-top: 2px;
5353
+ }
5354
+ /* 600px to match the project-wide .show-mobile/.hide-mobile breakpoint (and the real Figma mobile
5355
+ frames: 63571:28425 financing / 64794:110041 leasing / 64833:89153 buy) — the earlier 800px
5356
+ generic-reflow rule guessed at a mobile layout before those frames existed; this replaces it. */
5357
+ @media (max-width: 600px) {
5358
+ /* Figma mobile swaps which side of the price row grows: the rating column flexes/shrinks and
5359
+ the price+UVP group stays at its natural width, the reverse of desktop's fixed 120px rating
5360
+ column + flexible price group. Buy's own price row (.oo-pay-buy-price-col/-leftgroup, 108px
5361
+ rating column) is unchanged between breakpoints, hence the :not() scope. */
5362
+ .md3 .oo-pay-left {
5363
+ flex: none;
4875
5364
  }
4876
- .md3 .oo-mzz-kv-col--left,
4877
- .md3 .oo-mzz-kv-col--right {
4878
- padding: 0;
5365
+ .md3 .oo-pay-rating-col:not(.oo-pay-rating-col--buy) {
5366
+ flex: 1 0 0;
5367
+ min-width: 0;
5368
+ width: auto;
4879
5369
  }
4880
- .md3 .oo-mzz-kv-rule {
5370
+ /* The desktop two-column Laufzeit/Anzahlung/… | Fahrzeugrate/Garantie/RSP/… layout collapses
5371
+ into a single full-width list on mobile — col-left and the vertical divider disappear, and
5372
+ col-right (unchanged content, already exactly Figma's mobile "list") picks up the divider's
5373
+ old job as a border-top + padding-top instead of a padding-left. Figma's mobile "list" node
5374
+ also uses gap:8px row-to-row, not the desktop "rechts" column's gap:10px — same 8px buy's
5375
+ own (unchanged) list already uses. */
5376
+ .md3 .oo-pay-col-left,
5377
+ .md3 .oo-pay-divider {
4881
5378
  display: none;
4882
5379
  }
5380
+ .md3 .oo-pay-col-right {
5381
+ width: 100%;
5382
+ gap: 8px;
5383
+ padding-left: 0;
5384
+ padding-top: 12px;
5385
+ border-top: 1px solid #C5C6D2;
5386
+ box-sizing: border-box;
5387
+ }
5388
+ .md3 .oo-pay-hinweis {
5389
+ align-items: flex-start;
5390
+ }
4883
5391
  }
4884
5392
  .md3 .oo-car {
4885
5393
  display: flex;
@@ -5056,11 +5564,15 @@ line-height: 31px;
5056
5564
  muted gray as the body copy (var(--md-on-surface-variant) === Figma's var(--text/muted,
5057
5565
  #44464f) fallback exactly), not the design system's usual blue link color (.oo-underline,
5058
5566
  used elsewhere), so links here are styled with underline only. No border per explicit
5059
- request. Sits below .oo-next (order-overview's own bottom bar) — a spot this exact node
5060
- isn't shown at in Figma (its own component description has it above the buy button instead),
5061
- so this margin-top is this page's own established gap rhythm, not a value read off the design. */
5567
+ request. Sits right after card 10, at the very bottom of the card stack (before .oo-next) on
5568
+ both desktop and mobile per explicit request — a spot this exact node isn't shown at in Figma
5569
+ (its own component description has it above the buy button instead). margin: 0 (not just
5570
+ margin-top) per explicit request — a bare <p> otherwise keeps the UA stylesheet's default
5571
+ margin-top AND margin-bottom (~1em each), which was still showing even after margin-top alone
5572
+ was removed. Spacing on every side now comes only from the parent .co-form.oo-page's own flex
5573
+ gap (14px), same as every other direct child in this step. */
5062
5574
  .md3 .oo-legal-notice {
5063
- margin-top: 16px;
5575
+ margin: 0;
5064
5576
  font-family: Arial;
5065
5577
  font-size: 13px;
5066
5578
  line-height: 1.5;
@@ -5079,7 +5591,6 @@ line-height: 31px;
5079
5591
  display: flex;
5080
5592
  align-items: center;
5081
5593
  gap: 16px;
5082
- margin-top: 24px;
5083
5594
  padding-top: 18px;
5084
5595
  border-top: 1px solid #C5C6D2;
5085
5596
  }
@@ -5139,6 +5650,24 @@ line-height: 31px;
5139
5650
  }
5140
5651
  .md3 .oo-buy-btn {
5141
5652
  width: 100%;
5653
+ height: 48px;
5654
+ font-size: 24px;
5655
+ }
5656
+ /* Figma 63492:4515 ("auto.de / Checkout CTA Bar") — mobile only, per explicit request: only
5657
+ the full-width buy button remains visible (Zurück/Schritt X already hidden above), so .oo-next
5658
+ itself becomes just that button's own white, padded shell instead of the desktop 3-up row.
5659
+ margin: 0 -23px breaks it out of .contentWrapper.nextLayout's own 23px mobile side padding
5660
+ (CheckoutPage.styl) for a true full-bleed white bar + top border — exact same technique/value
5661
+ already proven for .co-next's identical breakout a few hundred lines up in this file; that
5662
+ padding's parent (.contentContainer) already has overflow:visible at this width for exactly
5663
+ this purpose, so nothing else needs touching. */
5664
+ .md3 .oo-next {
5665
+ flex-direction: column;
5666
+ align-items: flex-start;
5667
+ margin: 0 -23px;
5668
+ gap: 8px;
5669
+ padding: 24px 16px;
5670
+ background: #FFFFFF;
5142
5671
  }
5143
5672
  }
5144
5673
  @media (max-width: 800px) {
@@ -5151,9 +5680,13 @@ line-height: 31px;
5151
5680
  800px the row collapses to 4 full-width stacked rows (adding "Hinweise zur Beschaffenheit"),
5152
5681
  each divided by a horizontal rule instead — unlike .oo-ls-row's mobile stack, this card's own
5153
5682
  Figma mobile variant keeps dividers between every row, so it can't reuse .oo-ls-cell as-is. */
5683
+ /* .oo-fb-notes is now a 4th (conditional) child of .oo-fb-row instead of a separate sibling —
5684
+ flex-wrap + its own flex-basis:100% drops it to its own full-width line on desktop, same as
5685
+ before; on mobile (below) the row becomes one plain stacked column so wrap no longer matters. */
5154
5686
  .md3 .oo-fb-row {
5155
5687
  display: flex;
5156
5688
  align-items: flex-start;
5689
+ flex-wrap: wrap;
5157
5690
  gap: 20px;
5158
5691
  }
5159
5692
  .md3 .oo-fb-cell {
@@ -5164,15 +5697,15 @@ line-height: 31px;
5164
5697
  }
5165
5698
  .md3 .oo-fb-row .oo-fb-cell {
5166
5699
  flex: 1 0 0;
5167
- padding: 0 20px;
5168
- }
5169
- .md3 .oo-fb-row .oo-fb-cell:first-child {
5170
- padding-left: 0;
5171
- }
5172
- .md3 .oo-fb-row .oo-fb-cell:last-child {
5173
- padding-right: 0;
5174
5700
  }
5175
- .md3 .oo-fb-row .oo-fb-cell:not(:first-child) {
5701
+ /* Figma (64755:99667) has no padding on the cells themselves — the 41px total gap between two
5702
+ cells' content is the row's own 20px gap, a 1px divider, then another 20px gap, modelled here
5703
+ as a border-left (no extra divider element needed) plus 20px padding-left so the border doesn't
5704
+ sit flush against the next cell's icon. Padding on every cell (both sides) double-counted with
5705
+ the row gap and made the gap 61px instead of 41px. Excludes .oo-fb-notes — that one gets its own
5706
+ full-width/horizontal-divider treatment below, never this vertical one. */
5707
+ .md3 .oo-fb-row .oo-fb-cell:not(:first-child):not(.oo-fb-notes) {
5708
+ padding-left: 20px;
5176
5709
  border-left: 1px solid var(--md-outline-variant);
5177
5710
  }
5178
5711
  .md3 .oo-fb-cell svg {
@@ -5202,20 +5735,37 @@ line-height: 31px;
5202
5735
  color: var(--md-on-surface-variant);
5203
5736
  overflow-wrap: break-word;
5204
5737
  }
5205
- .md3 .oo-fb-notes {
5738
+ .md3 .oo-fb-row .oo-fb-cell.oo-fb-notes {
5739
+ flex-basis: 100%;
5206
5740
  width: 100%;
5207
5741
  margin-top: 14px;
5208
5742
  padding-top: 14px;
5209
5743
  border-top: 1px solid var(--md-outline-variant);
5210
5744
  }
5211
- @media (max-width: 800px) {
5745
+ /* Mobile (Figma 63571:28484 used-car / 64800:111786 new-car, 3 rows, no Hinweise): the 3-cell row
5746
+ + separate full-width notes strip both collapse into ONE vertical list — every item gets the
5747
+ same icon+text row with a horizontal divider, first row has no top border/padding, last row has
5748
+ no bottom padding. :last-child picks whichever row (Fahrzeughalter or Hinweise) actually ends up
5749
+ last, since .oo-fb-notes is a real (conditionally-rendered) child of .oo-fb-row now, not a
5750
+ sibling CSS couldn't reach from here. 600px to match the project-wide mobile breakpoint — this
5751
+ used to be 800px, a guess from before any mobile Figma frame for this card existed. */
5752
+ @media (max-width: 600px) {
5212
5753
  .md3 .oo-fb-row {
5213
5754
  flex-direction: column;
5755
+ flex-wrap: nowrap;
5214
5756
  gap: 0;
5215
5757
  }
5216
5758
  .md3 .oo-fb-row .oo-fb-cell {
5759
+ flex-basis: auto;
5217
5760
  width: 100%;
5218
5761
  padding: 12px 0;
5762
+ }
5763
+ /* Same selector (and so the same specificity) as the desktop vertical-divider rule above —
5764
+ .oo-fb-row .oo-fb-cell{border-left:0} alone is LESS specific than that :not():not() rule
5765
+ (5 selector components vs 3), so it was silently losing to it and leaving the desktop
5766
+ border-left:1px/padding-left:20px active on mobile, stacked on top of the new border-top. */
5767
+ .md3 .oo-fb-row .oo-fb-cell:not(:first-child):not(.oo-fb-notes) {
5768
+ padding-left: 0;
5219
5769
  border-left: 0;
5220
5770
  }
5221
5771
  .md3 .oo-fb-row .oo-fb-cell:first-child {
@@ -5224,7 +5774,15 @@ line-height: 31px;
5224
5774
  .md3 .oo-fb-row .oo-fb-cell:not(:first-child) {
5225
5775
  border-top: 1px solid var(--md-outline-variant);
5226
5776
  }
5227
- .md3 .oo-fb-notes {
5777
+ .md3 .oo-fb-row .oo-fb-cell:last-child {
5778
+ padding-bottom: 0;
5779
+ }
5780
+ /* Same specificity as the desktop .oo-fb-row .oo-fb-cell.oo-fb-notes rule (not just .oo-fb-notes
5781
+ alone) — otherwise that rule's margin-top:14px/flex-basis:100%/width:100% would still win here
5782
+ even inside this media query, since media nesting doesn't change specificity. */
5783
+ .md3 .oo-fb-row .oo-fb-cell.oo-fb-notes {
5784
+ flex-basis: auto;
5785
+ width: 100%;
5228
5786
  margin-top: 0;
5229
5787
  padding-top: 12px;
5230
5788
  }
@@ -5519,15 +6077,7 @@ line-height: 31px;
5519
6077
  the JSX, not here. Both graphic blocks (the EU statutory-warranty notice, the GARAN
5520
6078
  certificate) are static images, not hand-coded — see the long comment above WARRANTY_NOTICE_IMG
5521
6079
  in OrderOverviewNext.tsx for why (Figma ships them fully vector-flattened). */
5522
- /* same fix as .oo-promo-card above — .co-card-title's shared margin-bottom:16px leaves a
5523
- stray gap under the title when the card is collapsed; .oo-warranty-body's own margin-top
5524
- restores that 16px only once actually expanded (both cards default expanded, but the user can
5525
- still collapse them). */
5526
- .md3 .oo-warranty-card .co-card-title {
5527
- margin-bottom: 0;
5528
- }
5529
6080
  .md3 .oo-warranty-body {
5530
- margin-top: 16px;
5531
6081
  display: flex;
5532
6082
  flex-direction: column;
5533
6083
  gap: 12px;
@@ -5535,13 +6085,61 @@ line-height: 31px;
5535
6085
  .md3 .oo-warranty-notice-img {
5536
6086
  display: block;
5537
6087
  width: 100%;
5538
- max-width: 400px;
6088
+ max-width: 331px; /* Figma desktop (node 64763:84703): "Amtliche Mitteilung" 330.5x467.4, not stretched */
5539
6089
  height: auto;
5540
6090
  }
6091
+ @media (max-width: 600px) {
6092
+ .md3 .oo-warranty-notice-img {
6093
+ max-width: 251px; /* Figma mobile (node 64850:108036): 251.2x355.2 */
6094
+ }
6095
+ }
6096
+ /* Card 9 only — its image+link are centered (Figma: items-center). Card 10's open-state image+
6097
+ link are left-aligned (Figma: both sit at x=0 in their 572px-wide content), so this centering
6098
+ must NOT live on the shared .oo-warranty-notice-img/.oo-warranty-link rules themselves. */
6099
+ .md3 .oo-warranty-body--centered .oo-warranty-notice-img,
6100
+ .md3 .oo-warranty-body--centered .oo-warranty-link {
6101
+ align-self: center;
6102
+ }
5541
6103
  .md3 .oo-warranty-garan-img {
5542
6104
  display: block;
5543
6105
  width: 100%;
5544
- max-width: 320px;
6106
+ max-width: 320px; /* Figma (node 64669:36509): "vollständig" label, 320x336.8 */
6107
+ height: auto;
6108
+ }
6109
+ @media (max-width: 600px) {
6110
+ .md3 .oo-warranty-garan-img {
6111
+ /* Figma (node 64669:105484, dev-mode inspect): 215x226.31, centered — desktop (64669:36509)
6112
+ is left-aligned at 320px; mobile is centered and narrower, a real per-breakpoint
6113
+ difference in the file, not a mistake. */
6114
+ max-width: 215px;
6115
+ }
6116
+ /* .oo-warranty-garan-img-wrap (the role="img" host) is the actual flex child of
6117
+ .oo-warranty-body — align-self on .oo-warranty-garan-img itself (a grandchild) would be a
6118
+ no-op. */
6119
+ .md3 .oo-warranty-garan-img-wrap {
6120
+ align-self: center;
6121
+ }
6122
+ /* Card 10's "Weitere Informationen" link is left-aligned on desktop (confirmed, node
6123
+ 64669:36509) but centered on mobile along with the image above it — same real
6124
+ per-breakpoint difference, not scoped via .oo-warranty-body--centered since that's card 9's
6125
+ own (desktop-centered-too) modifier. */
6126
+ .md3 .oo-warranty-link {
6127
+ align-self: center;
6128
+ }
6129
+ }
6130
+ .md3 .oo-warranty-garan-strip-btn {
6131
+ display: block;
6132
+ width: 208px; /* Figma (node 64535:6410): "nested display" strip, 208x32 */
6133
+ max-width: 100%;
6134
+ background: none;
6135
+ border: 0;
6136
+ padding: 0;
6137
+ margin: 0;
6138
+ cursor: pointer;
6139
+ }
6140
+ .md3 .oo-warranty-garan-nested-img {
6141
+ display: block;
6142
+ width: 100%;
5545
6143
  height: auto;
5546
6144
  }
5547
6145
  .md3 .oo-warranty-link {
@@ -5557,35 +6155,11 @@ line-height: 31px;
5557
6155
  font-family: Arial, Helvetica, Arimo, sans-serif;
5558
6156
  font-weight: 400;
5559
6157
  font-size: 13px;
6158
+ line-height: 1.35;
5560
6159
  color: var(--md-primary);
5561
6160
  text-decoration: underline;
5562
6161
  text-align: left;
5563
6162
  }
5564
- a.oo-warranty-link--icon {
5565
- text-decoration: none;
5566
- }
5567
- a.oo-warranty-link--icon:hover {
5568
- text-decoration: underline;
5569
- }
5570
- .md3 .oo-warranty-link--pending {
5571
- cursor: default;
5572
- }
5573
- .md3 .oo-warranty-years-title {
5574
- margin: 0;
5575
- font-family: Arial, Helvetica, Arimo, sans-serif;
5576
- font-weight: 700;
5577
- font-size: 14px;
5578
- line-height: 1.35;
5579
- color: #0E2238;
5580
- }
5581
- .md3 .oo-warranty-years-desc {
5582
- margin: 0;
5583
- font-family: Arial, Helvetica, Arimo, sans-serif;
5584
- font-weight: 400;
5585
- font-size: 13px;
5586
- line-height: 1.35;
5587
- color: #44464F;
5588
- }
5589
6163
 
5590
6164
  /* ---------- Bestellungen (orders) ---------- */
5591
6165
  .md3 .mo-page {