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

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/theme/md3.css +513 -168
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.155",
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;
@@ -2404,7 +2405,7 @@ line-height: 31px;
2404
2405
  .md3 .co-form {
2405
2406
  display: flex;
2406
2407
  flex-direction: column;
2407
- gap: 18px;
2408
+ gap: 20px;
2408
2409
  padding-bottom: 20px;
2409
2410
  border-bottom: 1px solid #C5C6D2;
2410
2411
  }
@@ -2422,10 +2423,19 @@ line-height: 31px;
2422
2423
  .md3 .co-form.co-form--payment-details {
2423
2424
  border-bottom: 0;
2424
2425
  }
2425
- /* order-overview step only — same reasoning, see OrderOverviewNext.tsx's "co-form oo-page". */
2426
+ /* order-overview step only — same reasoning, see OrderOverviewNext.tsx's "co-form oo-page".
2427
+ gap also overridden to the shared ≤600px value (14px) at ALL widths, desktop included, per
2428
+ explicit request — the base .co-form's 20px (every other checkout step, except
2429
+ additional-services below) is untouched. */
2426
2430
  .md3 .co-form.oo-page {
2431
+ gap: 14px;
2427
2432
  border-bottom: 0;
2428
2433
  }
2434
+ /* additional-services step only — see AdditionalServicesNext.tsx's "co-form co-form--additional-
2435
+ services". Same reasoning/value as .oo-page above, desktop included, per explicit request. */
2436
+ .md3 .co-form.co-form--additional-services {
2437
+ gap: 14px;
2438
+ }
2429
2439
  .md3 .co-step-title {
2430
2440
  font: 700 22px var(--md-font-display, var(--md-font));
2431
2441
  margin: 0;
@@ -4667,79 +4677,189 @@ line-height: 31px;
4667
4677
  border-left: 0 !important;
4668
4678
  }
4669
4679
  }
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);
4680
+ /* "5. Monatlich zu zahlen" / "5. Gesamtpreis" (Figma: Finanzierung 64763:107263, Leasing
4681
+ 64794:110315, Kaufen 64794:109673) — own "oo-pay-*" namespace, NOT the shared
4682
+ .cf-rate-row/.fin-eval-* classes CheckoutFinancePanelNext.tsx (step 3) uses: that component
4683
+ still renders the OLDER rate-hero pattern, and this card's Figma ("auto.de / Price Block") is
4684
+ a newer, differently-proportioned design (54px/38px amounts, different UVP layout) — reusing
4685
+ the old shared classes here would either look wrong or risk step 3 regressions if tweaked to
4686
+ fit. EvalBar is still the shared component (only the pill/bar's own wrapper sizing is new). */
4687
+ .md3 .oo-pay-rate {
4688
+ display: flex;
4689
+ flex-direction: column;
4690
+ gap: 6px;
4691
+ width: 100%;
4692
+ }
4693
+ /* Mobile-only condensed line under the price block (Figma: 63571:28425 financing / 64794:110041
4694
+ leasing) — see .show-mobile below for the display toggle. */
4695
+ .md3 .oo-pay-mobile-summary {
4682
4696
  margin: 0;
4697
+ font-family: Arimo, Arial, sans-serif;
4698
+ font-size: 13px;
4699
+ color: #0E2238;
4700
+ width: 100%;
4683
4701
  }
4684
- .md3 .oo-mzz-price-row {
4702
+ .md3 .oo-pay-price-row {
4685
4703
  display: flex;
4686
4704
  align-items: center;
4687
4705
  justify-content: space-between;
4688
4706
  gap: 16px;
4689
4707
  width: 100%;
4690
4708
  }
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 {
4709
+ .md3 .oo-pay-left {
4710
+ display: flex;
4711
+ align-items: center;
4712
+ gap: 8px;
4713
+ flex: 1 0 0;
4714
+ min-width: 0;
4715
+ }
4716
+ .md3 .oo-pay-amount {
4717
+ font-family: Arimo, Arial, sans-serif;
4718
+ font-weight: 700;
4719
+ font-size: 54px;
4720
+ line-height: 58px;
4721
+ color: #005CFF;
4722
+ white-space: nowrap;
4723
+ }
4724
+ .md3 .oo-pay-secondary {
4694
4725
  display: flex;
4695
4726
  flex-direction: column;
4696
- align-items: flex-end;
4697
4727
  gap: 2px;
4728
+ align-items: flex-start;
4698
4729
  }
4699
- .md3 .oo-mzz-uvp-row {
4730
+ .md3 .oo-pay-uvp-row {
4700
4731
  display: flex;
4701
4732
  align-items: center;
4702
- gap: 6px;
4733
+ gap: 3px;
4703
4734
  }
4704
- .md3 .oo-mzz-uvp-label {
4705
- font-family: Arial;
4735
+ .md3 .oo-pay-uvp-label {
4736
+ font-family: Arimo, Arial, sans-serif;
4737
+ font-size: 11px;
4738
+ color: #0E2238;
4739
+ white-space: nowrap;
4740
+ }
4741
+ /* Buy's own "UVP" label (17.14px, no footnote circle immediately after it — the circle sits
4742
+ after the struck amount instead) — kept separate from .oo-pay-uvp-label (11px, financing/
4743
+ leasing) since the two aren't the same text node in Figma. */
4744
+ .md3 .oo-pay-buy-uvp-label {
4745
+ font-family: Arimo, Arial, sans-serif;
4706
4746
  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
4747
  color: #0E2238;
4748
+ white-space: nowrap;
4712
4749
  }
4713
- .md3 .oo-mzz-total-amount {
4714
- font-family: 'Arial';
4715
- font-weight: 700;
4716
- font-size: 46px;
4717
- line-height: 52px;
4750
+ .md3 .oo-pay-footnote {
4751
+ display: flex;
4752
+ align-items: center;
4753
+ justify-content: center;
4754
+ flex: none;
4755
+ width: 13px;
4756
+ height: 13px;
4757
+ border-radius: 999px;
4758
+ border: 1px solid #005CFF;
4759
+ background: #FFFFFF;
4760
+ font-family: Arimo, Arial, sans-serif;
4761
+ font-size: 7px;
4718
4762
  color: #005CFF;
4719
4763
  }
4720
- .md3 .oo-mzz-price-wrap {
4721
- margin-top: 6px;
4764
+ /* Buy's "①" next to the big price — plain text, no circle (Figma: no border/background on that
4765
+ node, unlike .oo-pay-footnote's "②"/"③"). */
4766
+ .md3 .oo-pay-footnote-plain {
4767
+ font-family: Arimo, Arial, sans-serif;
4768
+ font-size: 9px;
4769
+ color: #005CFF;
4722
4770
  }
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;
4771
+ /* Struck UVP amount — same mechanism as the shared .cf-rate-old::after (red bar, -10deg), kept
4772
+ as its own rule since .cf-rate-old itself is step 3's shared class (see file header above). */
4773
+ .md3 .oo-pay-uvp-amount {
4774
+ position: relative;
4775
+ display: inline-block;
4776
+ font-family: Arimo, Arial, sans-serif;
4777
+ font-size: 20px;
4778
+ color: #0E2238;
4779
+ white-space: nowrap;
4780
+ }
4781
+ .md3 .oo-pay-uvp-amount::after {
4782
+ content: '';
4783
+ position: absolute;
4784
+ left: -2px;
4785
+ right: -2px;
4786
+ top: 50%;
4787
+ height: 2px;
4788
+ background: #D92D20;
4789
+ transform: rotate(-10deg);
4790
+ transform-origin: center;
4791
+ }
4792
+ .md3 .oo-pay-unit {
4793
+ font-family: Arimo, Arial, sans-serif;
4794
+ font-weight: 700;
4795
+ font-size: 18px;
4796
+ color: #5B6B7F;
4730
4797
  }
4731
- .md3 .oo-mzz-price-wrap .fin-eval-bar-cell {
4798
+ .md3 .oo-pay-rating-col {
4799
+ display: flex;
4800
+ flex-direction: column;
4801
+ align-items: center;
4802
+ gap: 8px;
4803
+ flex: none;
4732
4804
  width: 120px;
4733
4805
  }
4734
- .md3 .oo-mzz-cond {
4735
- margin: 6px 0 0;
4736
- font-family: Arial;
4806
+ /* Buy's price block uses its own 108px rating column (Figma: 64794:109673 desktop and 64833:89153
4807
+ mobile both specify 108px, not 120px) — same value at both breakpoints, unlike Financing/
4808
+ Leasing's column which only changes WIDTH BEHAVIOUR (fixed → flexible) on mobile, not this
4809
+ number, so this rule isn't itself inside a media query. */
4810
+ .md3 .oo-pay-rating-col--buy {
4811
+ width: 108px;
4812
+ }
4813
+ .md3 .oo-pay-rating-badge {
4814
+ display: flex;
4815
+ align-items: center;
4816
+ justify-content: center;
4817
+ width: 100%;
4818
+ padding: 5px 10px;
4819
+ border-radius: 16px;
4820
+ box-sizing: border-box;
4821
+ font-family: Arimo, Arial, sans-serif;
4822
+ font-weight: 700;
4823
+ font-size: 12px;
4824
+ line-height: 18px;
4825
+ white-space: nowrap;
4826
+ }
4827
+ .md3 .oo-pay-rating-bar {
4828
+ width: 100%;
4829
+ }
4830
+ /* Buy's price block — right-aligned column (UVP above, big price below), unlike Financing/
4831
+ Leasing's side-by-side .oo-pay-left/.oo-pay-secondary. */
4832
+ .md3 .oo-pay-buy-price-col {
4833
+ display: flex;
4834
+ flex-direction: column;
4835
+ align-items: flex-end;
4836
+ gap: 2px;
4837
+ }
4838
+ .md3 .oo-pay-buy-uvp-row {
4839
+ display: flex;
4840
+ align-items: center;
4841
+ gap: 2px;
4842
+ }
4843
+ .md3 .oo-pay-buy-leftgroup {
4844
+ display: flex;
4845
+ align-items: flex-start;
4846
+ gap: 2px;
4847
+ }
4848
+ .md3 .oo-pay-buy-amount {
4849
+ font-family: Arimo, Arial, sans-serif;
4850
+ font-weight: 700;
4851
+ font-size: 38px;
4852
+ line-height: 52px;
4853
+ color: #005CFF;
4854
+ white-space: nowrap;
4855
+ }
4856
+ .md3 .oo-pay-cond {
4857
+ margin: 0;
4858
+ font-family: Arimo, Arial, sans-serif;
4737
4859
  font-size: 13px;
4738
- line-height: normal;
4739
- /* Figma's "text-primary" (#0e2238), not "text/strong" — see .oo-mzz-uvp-label above. */
4740
4860
  color: #0E2238;
4741
4861
  }
4742
- .md3 .oo-mzz-cond-link {
4862
+ .md3 .oo-pay-cond-link {
4743
4863
  background: none;
4744
4864
  border: 0;
4745
4865
  padding: 0;
@@ -4749,137 +4869,296 @@ line-height: 31px;
4749
4869
  text-decoration: underline;
4750
4870
  cursor: pointer;
4751
4871
  }
4752
- .md3 .oo-mzz-row {
4872
+ .md3 .oo-pay-row {
4753
4873
  display: flex;
4754
4874
  align-items: flex-start;
4755
4875
  width: 100%;
4756
- margin-top: 12px;
4757
4876
  }
4758
- /* Kaufen only — single list (no left/right KV split), Figma's own "list" node. */
4759
- .md3 .oo-mzz-buy-list {
4877
+ .md3 .oo-pay-col-left {
4760
4878
  display: flex;
4761
4879
  flex-direction: column;
4762
4880
  gap: 8px;
4763
- width: 100%;
4764
- margin-top: 12px;
4765
- padding-top: 12px;
4766
- border-top: 1px solid var(--md-outline-variant);
4881
+ flex: none;
4882
+ width: 266px;
4883
+ padding-right: 20px;
4767
4884
  box-sizing: border-box;
4885
+ font-family: Arimo, Arial, sans-serif;
4886
+ font-size: 14px;
4887
+ line-height: 1.4;
4768
4888
  }
4769
- .md3 .oo-mzz-kv-col {
4889
+ .md3 .oo-pay-col-right {
4770
4890
  display: flex;
4771
4891
  flex-direction: column;
4892
+ gap: 10px;
4772
4893
  flex: 1 0 0;
4773
4894
  min-width: 0;
4895
+ padding-left: 20px;
4896
+ box-sizing: border-box;
4897
+ font-family: Arimo, Arial, sans-serif;
4898
+ font-size: 14px;
4899
+ line-height: 1.4;
4774
4900
  }
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 {
4901
+ .md3 .oo-pay-divider {
4784
4902
  flex: none;
4785
4903
  align-self: stretch;
4786
4904
  width: 1px;
4787
- background: var(--md-outline-variant);
4905
+ background: #C5C6D2;
4788
4906
  }
4789
- .md3 .oo-mzz-kv-row {
4907
+ .md3 .oo-pay-kv-row {
4790
4908
  display: flex;
4791
4909
  align-items: baseline;
4792
- justify-content: space-between;
4793
- gap: 12px;
4910
+ gap: 8px;
4794
4911
  width: 100%;
4795
- font-family: Arial;
4796
- font-size: 14px;
4797
- line-height: 1.4;
4798
4912
  }
4799
- .md3 .oo-mzz-kv-label {
4913
+ /* Left column: short fixed label, value fills/right-aligns. Right column: label fills/wraps,
4914
+ value stays fixed — same inversion Figma itself uses between the two columns. */
4915
+ .md3 .oo-pay-kv-row--left .oo-pay-kv-label {
4916
+ flex: none;
4917
+ white-space: nowrap;
4918
+ }
4919
+ .md3 .oo-pay-kv-row--left .oo-pay-kv-value {
4800
4920
  flex: 1 0 0;
4801
4921
  min-width: 0;
4802
- color: var(--md-on-surface-variant);
4922
+ text-align: right;
4923
+ }
4924
+ .md3 .oo-pay-kv-row--right {
4925
+ gap: 12px;
4926
+ align-items: center;
4927
+ }
4928
+ .md3 .oo-pay-kv-row--right .oo-pay-kv-label {
4929
+ flex: 1 0 0;
4930
+ min-width: 0;
4931
+ display: flex;
4932
+ align-items: center;
4933
+ gap: 8px;
4803
4934
  }
4804
- .md3 .oo-mzz-kv-value {
4935
+ .md3 .oo-pay-kv-row--right .oo-pay-kv-value {
4936
+ flex: none;
4937
+ text-align: right;
4938
+ }
4939
+ /* Icon rows (Anschluss-Garantie / Rundum-Sorglos) invert the Fahrzeugrate row's flex roles in
4940
+ Figma: there the LABEL is the fixed, non-wrapping element (shrink-0 whitespace-nowrap) and the
4941
+ VALUE flexes/right-aligns into the remaining space — not the other way around, which is what
4942
+ made the long "2 Jahre Anschluss-Garantie"/icon combination wrap onto a second line. */
4943
+ .md3 .oo-pay-kv-row--icon .oo-pay-kv-label {
4805
4944
  flex: none;
4806
- color: var(--md-on-surface);
4807
4945
  white-space: nowrap;
4808
4946
  }
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);
4947
+ .md3 .oo-pay-kv-row--icon .oo-pay-kv-value {
4948
+ flex: 1 0 0;
4949
+ min-width: 0;
4950
+ white-space: nowrap;
4951
+ }
4952
+ .md3 .oo-pay-kv-label {
4953
+ color: #44464F;
4954
+ }
4955
+ .md3 .oo-pay-kv-value {
4956
+ color: #1A1B22;
4957
+ }
4958
+ .md3 .oo-pay-info-icon {
4959
+ flex: none;
4960
+ }
4961
+ /* Same "open the Garantie explainer in a new tab" onClick behaviour as the Zulassung card's
4962
+ info trigger elsewhere in OrderOverviewNext.tsx — unstyled button wrapper so the icon keeps
4963
+ its inline position in the kv-label. */
4964
+ .md3 .oo-pay-info-trigger {
4965
+ display: inline-flex;
4966
+ align-items: center;
4967
+ justify-content: center;
4968
+ flex: none;
4969
+ width: 18px;
4970
+ height: 18px;
4971
+ background: none;
4972
+ border: 0;
4973
+ padding: 0;
4974
+ margin: 0;
4975
+ appearance: none;
4976
+ line-height: 0;
4977
+ cursor: pointer;
4813
4978
  }
4814
- .md3 .oo-mzz-kv-hr {
4979
+ .md3 .oo-pay-rule-h {
4815
4980
  width: 100%;
4816
4981
  height: 1px;
4817
4982
  border: 0;
4818
4983
  margin: 0;
4819
- background: var(--md-outline-variant);
4984
+ background: #C5C6D2;
4820
4985
  }
4821
- .md3 .oo-mzz-note {
4822
- margin: 12px 0 0;
4823
- font-family: Arial;
4986
+ .md3 .oo-pay-total-row {
4987
+ display: flex;
4988
+ align-items: baseline;
4989
+ gap: 3px;
4990
+ width: 100%;
4991
+ font-family: Arimo, Arial, sans-serif;
4992
+ font-weight: 700;
4993
+ font-size: 14px;
4994
+ color: #1A1B22;
4995
+ }
4996
+ .md3 .oo-pay-total-row .oo-pay-kv-label {
4997
+ color: #1A1B22;
4998
+ }
4999
+ .md3 .oo-pay-total-row .oo-pay-kv-value {
5000
+ flex: 1 0 0;
5001
+ text-align: right;
5002
+ color: #1A1B22;
5003
+ }
5004
+ .md3 .oo-pay-vat-line {
5005
+ margin: 0;
5006
+ font-family: Arimo, Arial, sans-serif;
4824
5007
  font-size: 13px;
5008
+ color: #44464F;
5009
+ width: 100%;
5010
+ }
5011
+ .md3 .oo-pay-kaufpreis {
5012
+ width: 100%;
5013
+ padding-bottom: 12px;
5014
+ border-bottom: 1px solid #AAB3BF;
5015
+ box-sizing: border-box;
5016
+ }
5017
+ .md3 .oo-pay-kaufpreis p {
5018
+ margin: 0;
5019
+ font-family: Arimo, Arial, sans-serif;
5020
+ font-size: 15px;
5021
+ line-height: 1.35;
5022
+ color: #0E2238;
5023
+ }
5024
+ /* Kaufen only — single list (no left/right KV split), Figma's own "list" node. */
5025
+ .md3 .oo-pay-buy-list {
5026
+ display: flex;
5027
+ flex-direction: column;
5028
+ gap: 8px;
5029
+ width: 100%;
5030
+ padding-top: 12px;
5031
+ border-top: 1px solid #C5C6D2;
5032
+ box-sizing: border-box;
5033
+ font-family: Arimo, Arial, sans-serif;
5034
+ font-size: 14px;
4825
5035
  line-height: 1.4;
4826
- color: var(--md-on-surface);
4827
5036
  }
4828
- .md3 .oo-mzz-hinweis {
5037
+ .md3 .oo-pay-buy-row {
5038
+ display: flex;
5039
+ align-items: baseline;
5040
+ gap: 12px;
5041
+ width: 100%;
5042
+ }
5043
+ .md3 .oo-pay-buy-row--icon {
5044
+ align-items: center;
5045
+ }
5046
+ .md3 .oo-pay-buy-row .oo-pay-kv-label {
5047
+ flex: 1 0 0;
5048
+ min-width: 0;
5049
+ display: flex;
5050
+ align-items: center;
5051
+ gap: 8px;
5052
+ }
5053
+ .md3 .oo-pay-buy-row .oo-pay-kv-value {
5054
+ flex: none;
5055
+ text-align: right;
5056
+ }
5057
+ /* Same Figma inversion as .oo-pay-kv-row--icon above: icon rows fix the label and flex the value. */
5058
+ .md3 .oo-pay-buy-row--icon .oo-pay-kv-label {
5059
+ flex: none;
5060
+ white-space: nowrap;
5061
+ }
5062
+ .md3 .oo-pay-buy-row--icon .oo-pay-kv-value {
5063
+ flex: 1 0 0;
5064
+ min-width: 0;
5065
+ white-space: nowrap;
5066
+ }
5067
+ .md3 .oo-pay-buy-total {
5068
+ display: flex;
5069
+ align-items: baseline;
5070
+ gap: 12px;
5071
+ width: 100%;
5072
+ font-weight: 700;
5073
+ color: #1A1B22;
5074
+ }
5075
+ .md3 .oo-pay-buy-total .oo-pay-kv-label {
5076
+ flex: 1 0 0;
5077
+ color: #1A1B22;
5078
+ }
5079
+ .md3 .oo-pay-buy-total .oo-pay-kv-value {
5080
+ flex: none;
5081
+ color: #1A1B22;
5082
+ }
5083
+ .md3 .oo-pay-hinweis {
4829
5084
  display: flex;
4830
5085
  align-items: center;
4831
5086
  gap: 10px;
4832
5087
  width: 100%;
4833
- margin-top: 12px;
4834
5088
  padding: 12px 14px;
4835
5089
  border-radius: 12px;
4836
5090
  background: #F4F5FA;
4837
5091
  box-sizing: border-box;
4838
5092
  }
4839
- .md3 .oo-mzz-hinweis svg {
5093
+ .md3 .oo-pay-hinweis svg {
4840
5094
  flex: none;
4841
5095
  }
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 {
5096
+ .md3 .oo-pay-hinweis-link {
4852
5097
  flex: none;
4853
5098
  background: none;
4854
5099
  border: 0;
4855
5100
  padding: 0;
4856
- font-family: Arial;
5101
+ font-family: Arimo, Arial, sans-serif;
4857
5102
  font-weight: 700;
4858
5103
  font-size: 13px;
4859
- line-height: 1.4;
4860
- color: var(--md-primary);
5104
+ color: #005CFF;
4861
5105
  cursor: pointer;
4862
5106
  }
4863
- .md3 .oo-mzz-hinweis-link:hover {
5107
+ .md3 .oo-pay-hinweis-link:hover {
4864
5108
  text-decoration: underline;
4865
5109
  }
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;
5110
+ /* Figma's "CK / Content" wrapper holds rate/row(-or-buy-list)/kaufpreis(-or-vat-line)/hinweis in
5111
+ a flex-col with gap:12px — .co-card itself isn't a flex container, so that inter-section gap
5112
+ has to be reproduced as margin-top on each section that can follow .oo-pay-rate. */
5113
+ .md3 .co-card > .oo-pay-row,
5114
+ .md3 .co-card > .oo-pay-buy-list,
5115
+ .md3 .co-card > .oo-pay-kaufpreis,
5116
+ .md3 .co-card > .oo-pay-vat-line,
5117
+ .md3 .co-card > .oo-pay-hinweis {
5118
+ margin-top: 12px;
5119
+ }
5120
+ /* Leasing only: "inkl. 19 % MwSt." is grouped with Monatliche Gesamtbelastung in its own
5121
+ gap-[12px] sub-wrapper in Figma, not the surrounding .oo-pay-col-right's gap:10px. */
5122
+ .md3 .oo-pay-col-right .oo-pay-vat-line {
5123
+ margin-top: 2px;
5124
+ }
5125
+ /* 600px to match the project-wide .show-mobile/.hide-mobile breakpoint (and the real Figma mobile
5126
+ frames: 63571:28425 financing / 64794:110041 leasing / 64833:89153 buy) — the earlier 800px
5127
+ generic-reflow rule guessed at a mobile layout before those frames existed; this replaces it. */
5128
+ @media (max-width: 600px) {
5129
+ /* Figma mobile swaps which side of the price row grows: the rating column flexes/shrinks and
5130
+ the price+UVP group stays at its natural width, the reverse of desktop's fixed 120px rating
5131
+ column + flexible price group. Buy's own price row (.oo-pay-buy-price-col/-leftgroup, 108px
5132
+ rating column) is unchanged between breakpoints, hence the :not() scope. */
5133
+ .md3 .oo-pay-left {
5134
+ flex: none;
4875
5135
  }
4876
- .md3 .oo-mzz-kv-col--left,
4877
- .md3 .oo-mzz-kv-col--right {
4878
- padding: 0;
5136
+ .md3 .oo-pay-rating-col:not(.oo-pay-rating-col--buy) {
5137
+ flex: 1 0 0;
5138
+ min-width: 0;
5139
+ width: auto;
4879
5140
  }
4880
- .md3 .oo-mzz-kv-rule {
5141
+ /* The desktop two-column Laufzeit/Anzahlung/… | Fahrzeugrate/Garantie/RSP/… layout collapses
5142
+ into a single full-width list on mobile — col-left and the vertical divider disappear, and
5143
+ col-right (unchanged content, already exactly Figma's mobile "list") picks up the divider's
5144
+ old job as a border-top + padding-top instead of a padding-left. Figma's mobile "list" node
5145
+ also uses gap:8px row-to-row, not the desktop "rechts" column's gap:10px — same 8px buy's
5146
+ own (unchanged) list already uses. */
5147
+ .md3 .oo-pay-col-left,
5148
+ .md3 .oo-pay-divider {
4881
5149
  display: none;
4882
5150
  }
5151
+ .md3 .oo-pay-col-right {
5152
+ width: 100%;
5153
+ gap: 8px;
5154
+ padding-left: 0;
5155
+ padding-top: 12px;
5156
+ border-top: 1px solid #C5C6D2;
5157
+ box-sizing: border-box;
5158
+ }
5159
+ .md3 .oo-pay-hinweis {
5160
+ align-items: flex-start;
5161
+ }
4883
5162
  }
4884
5163
  .md3 .oo-car {
4885
5164
  display: flex;
@@ -5056,11 +5335,15 @@ line-height: 31px;
5056
5335
  muted gray as the body copy (var(--md-on-surface-variant) === Figma's var(--text/muted,
5057
5336
  #44464f) fallback exactly), not the design system's usual blue link color (.oo-underline,
5058
5337
  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. */
5338
+ request. Sits right after card 10, at the very bottom of the card stack (before .oo-next) on
5339
+ both desktop and mobile per explicit request — a spot this exact node isn't shown at in Figma
5340
+ (its own component description has it above the buy button instead). margin: 0 (not just
5341
+ margin-top) per explicit request — a bare <p> otherwise keeps the UA stylesheet's default
5342
+ margin-top AND margin-bottom (~1em each), which was still showing even after margin-top alone
5343
+ was removed. Spacing on every side now comes only from the parent .co-form.oo-page's own flex
5344
+ gap (14px), same as every other direct child in this step. */
5062
5345
  .md3 .oo-legal-notice {
5063
- margin-top: 16px;
5346
+ margin: 0;
5064
5347
  font-family: Arial;
5065
5348
  font-size: 13px;
5066
5349
  line-height: 1.5;
@@ -5079,7 +5362,6 @@ line-height: 31px;
5079
5362
  display: flex;
5080
5363
  align-items: center;
5081
5364
  gap: 16px;
5082
- margin-top: 24px;
5083
5365
  padding-top: 18px;
5084
5366
  border-top: 1px solid #C5C6D2;
5085
5367
  }
@@ -5139,6 +5421,24 @@ line-height: 31px;
5139
5421
  }
5140
5422
  .md3 .oo-buy-btn {
5141
5423
  width: 100%;
5424
+ height: 48px;
5425
+ font-size: 24px;
5426
+ }
5427
+ /* Figma 63492:4515 ("auto.de / Checkout CTA Bar") — mobile only, per explicit request: only
5428
+ the full-width buy button remains visible (Zurück/Schritt X already hidden above), so .oo-next
5429
+ itself becomes just that button's own white, padded shell instead of the desktop 3-up row.
5430
+ margin: 0 -23px breaks it out of .contentWrapper.nextLayout's own 23px mobile side padding
5431
+ (CheckoutPage.styl) for a true full-bleed white bar + top border — exact same technique/value
5432
+ already proven for .co-next's identical breakout a few hundred lines up in this file; that
5433
+ padding's parent (.contentContainer) already has overflow:visible at this width for exactly
5434
+ this purpose, so nothing else needs touching. */
5435
+ .md3 .oo-next {
5436
+ flex-direction: column;
5437
+ align-items: flex-start;
5438
+ margin: 0 -23px;
5439
+ gap: 8px;
5440
+ padding: 24px 16px;
5441
+ background: #FFFFFF;
5142
5442
  }
5143
5443
  }
5144
5444
  @media (max-width: 800px) {
@@ -5151,9 +5451,13 @@ line-height: 31px;
5151
5451
  800px the row collapses to 4 full-width stacked rows (adding "Hinweise zur Beschaffenheit"),
5152
5452
  each divided by a horizontal rule instead — unlike .oo-ls-row's mobile stack, this card's own
5153
5453
  Figma mobile variant keeps dividers between every row, so it can't reuse .oo-ls-cell as-is. */
5454
+ /* .oo-fb-notes is now a 4th (conditional) child of .oo-fb-row instead of a separate sibling —
5455
+ flex-wrap + its own flex-basis:100% drops it to its own full-width line on desktop, same as
5456
+ before; on mobile (below) the row becomes one plain stacked column so wrap no longer matters. */
5154
5457
  .md3 .oo-fb-row {
5155
5458
  display: flex;
5156
5459
  align-items: flex-start;
5460
+ flex-wrap: wrap;
5157
5461
  gap: 20px;
5158
5462
  }
5159
5463
  .md3 .oo-fb-cell {
@@ -5164,15 +5468,15 @@ line-height: 31px;
5164
5468
  }
5165
5469
  .md3 .oo-fb-row .oo-fb-cell {
5166
5470
  flex: 1 0 0;
5167
- padding: 0 20px;
5168
- }
5169
- .md3 .oo-fb-row .oo-fb-cell:first-child {
5170
- padding-left: 0;
5171
5471
  }
5172
- .md3 .oo-fb-row .oo-fb-cell:last-child {
5173
- padding-right: 0;
5174
- }
5175
- .md3 .oo-fb-row .oo-fb-cell:not(:first-child) {
5472
+ /* Figma (64755:99667) has no padding on the cells themselves — the 41px total gap between two
5473
+ cells' content is the row's own 20px gap, a 1px divider, then another 20px gap, modelled here
5474
+ as a border-left (no extra divider element needed) plus 20px padding-left so the border doesn't
5475
+ sit flush against the next cell's icon. Padding on every cell (both sides) double-counted with
5476
+ the row gap and made the gap 61px instead of 41px. Excludes .oo-fb-notes — that one gets its own
5477
+ full-width/horizontal-divider treatment below, never this vertical one. */
5478
+ .md3 .oo-fb-row .oo-fb-cell:not(:first-child):not(.oo-fb-notes) {
5479
+ padding-left: 20px;
5176
5480
  border-left: 1px solid var(--md-outline-variant);
5177
5481
  }
5178
5482
  .md3 .oo-fb-cell svg {
@@ -5202,20 +5506,37 @@ line-height: 31px;
5202
5506
  color: var(--md-on-surface-variant);
5203
5507
  overflow-wrap: break-word;
5204
5508
  }
5205
- .md3 .oo-fb-notes {
5509
+ .md3 .oo-fb-row .oo-fb-cell.oo-fb-notes {
5510
+ flex-basis: 100%;
5206
5511
  width: 100%;
5207
5512
  margin-top: 14px;
5208
5513
  padding-top: 14px;
5209
5514
  border-top: 1px solid var(--md-outline-variant);
5210
5515
  }
5211
- @media (max-width: 800px) {
5516
+ /* Mobile (Figma 63571:28484 used-car / 64800:111786 new-car, 3 rows, no Hinweise): the 3-cell row
5517
+ + separate full-width notes strip both collapse into ONE vertical list — every item gets the
5518
+ same icon+text row with a horizontal divider, first row has no top border/padding, last row has
5519
+ no bottom padding. :last-child picks whichever row (Fahrzeughalter or Hinweise) actually ends up
5520
+ last, since .oo-fb-notes is a real (conditionally-rendered) child of .oo-fb-row now, not a
5521
+ sibling CSS couldn't reach from here. 600px to match the project-wide mobile breakpoint — this
5522
+ used to be 800px, a guess from before any mobile Figma frame for this card existed. */
5523
+ @media (max-width: 600px) {
5212
5524
  .md3 .oo-fb-row {
5213
5525
  flex-direction: column;
5526
+ flex-wrap: nowrap;
5214
5527
  gap: 0;
5215
5528
  }
5216
5529
  .md3 .oo-fb-row .oo-fb-cell {
5530
+ flex-basis: auto;
5217
5531
  width: 100%;
5218
5532
  padding: 12px 0;
5533
+ }
5534
+ /* Same selector (and so the same specificity) as the desktop vertical-divider rule above —
5535
+ .oo-fb-row .oo-fb-cell{border-left:0} alone is LESS specific than that :not():not() rule
5536
+ (5 selector components vs 3), so it was silently losing to it and leaving the desktop
5537
+ border-left:1px/padding-left:20px active on mobile, stacked on top of the new border-top. */
5538
+ .md3 .oo-fb-row .oo-fb-cell:not(:first-child):not(.oo-fb-notes) {
5539
+ padding-left: 0;
5219
5540
  border-left: 0;
5220
5541
  }
5221
5542
  .md3 .oo-fb-row .oo-fb-cell:first-child {
@@ -5224,7 +5545,15 @@ line-height: 31px;
5224
5545
  .md3 .oo-fb-row .oo-fb-cell:not(:first-child) {
5225
5546
  border-top: 1px solid var(--md-outline-variant);
5226
5547
  }
5227
- .md3 .oo-fb-notes {
5548
+ .md3 .oo-fb-row .oo-fb-cell:last-child {
5549
+ padding-bottom: 0;
5550
+ }
5551
+ /* Same specificity as the desktop .oo-fb-row .oo-fb-cell.oo-fb-notes rule (not just .oo-fb-notes
5552
+ alone) — otherwise that rule's margin-top:14px/flex-basis:100%/width:100% would still win here
5553
+ even inside this media query, since media nesting doesn't change specificity. */
5554
+ .md3 .oo-fb-row .oo-fb-cell.oo-fb-notes {
5555
+ flex-basis: auto;
5556
+ width: 100%;
5228
5557
  margin-top: 0;
5229
5558
  padding-top: 12px;
5230
5559
  }
@@ -5519,15 +5848,7 @@ line-height: 31px;
5519
5848
  the JSX, not here. Both graphic blocks (the EU statutory-warranty notice, the GARAN
5520
5849
  certificate) are static images, not hand-coded — see the long comment above WARRANTY_NOTICE_IMG
5521
5850
  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
5851
  .md3 .oo-warranty-body {
5530
- margin-top: 16px;
5531
5852
  display: flex;
5532
5853
  flex-direction: column;
5533
5854
  gap: 12px;
@@ -5535,13 +5856,61 @@ line-height: 31px;
5535
5856
  .md3 .oo-warranty-notice-img {
5536
5857
  display: block;
5537
5858
  width: 100%;
5538
- max-width: 400px;
5859
+ max-width: 331px; /* Figma desktop (node 64763:84703): "Amtliche Mitteilung" 330.5x467.4, not stretched */
5539
5860
  height: auto;
5540
5861
  }
5862
+ @media (max-width: 600px) {
5863
+ .md3 .oo-warranty-notice-img {
5864
+ max-width: 251px; /* Figma mobile (node 64850:108036): 251.2x355.2 */
5865
+ }
5866
+ }
5867
+ /* Card 9 only — its image+link are centered (Figma: items-center). Card 10's open-state image+
5868
+ link are left-aligned (Figma: both sit at x=0 in their 572px-wide content), so this centering
5869
+ must NOT live on the shared .oo-warranty-notice-img/.oo-warranty-link rules themselves. */
5870
+ .md3 .oo-warranty-body--centered .oo-warranty-notice-img,
5871
+ .md3 .oo-warranty-body--centered .oo-warranty-link {
5872
+ align-self: center;
5873
+ }
5541
5874
  .md3 .oo-warranty-garan-img {
5542
5875
  display: block;
5543
5876
  width: 100%;
5544
- max-width: 320px;
5877
+ max-width: 320px; /* Figma (node 64669:36509): "vollständig" label, 320x336.8 */
5878
+ height: auto;
5879
+ }
5880
+ @media (max-width: 600px) {
5881
+ .md3 .oo-warranty-garan-img {
5882
+ /* Figma (node 64669:105484, dev-mode inspect): 215x226.31, centered — desktop (64669:36509)
5883
+ is left-aligned at 320px; mobile is centered and narrower, a real per-breakpoint
5884
+ difference in the file, not a mistake. */
5885
+ max-width: 215px;
5886
+ }
5887
+ /* .oo-warranty-garan-img-wrap (the role="img" host) is the actual flex child of
5888
+ .oo-warranty-body — align-self on .oo-warranty-garan-img itself (a grandchild) would be a
5889
+ no-op. */
5890
+ .md3 .oo-warranty-garan-img-wrap {
5891
+ align-self: center;
5892
+ }
5893
+ /* Card 10's "Weitere Informationen" link is left-aligned on desktop (confirmed, node
5894
+ 64669:36509) but centered on mobile along with the image above it — same real
5895
+ per-breakpoint difference, not scoped via .oo-warranty-body--centered since that's card 9's
5896
+ own (desktop-centered-too) modifier. */
5897
+ .md3 .oo-warranty-link {
5898
+ align-self: center;
5899
+ }
5900
+ }
5901
+ .md3 .oo-warranty-garan-strip-btn {
5902
+ display: block;
5903
+ width: 208px; /* Figma (node 64535:6410): "nested display" strip, 208x32 */
5904
+ max-width: 100%;
5905
+ background: none;
5906
+ border: 0;
5907
+ padding: 0;
5908
+ margin: 0;
5909
+ cursor: pointer;
5910
+ }
5911
+ .md3 .oo-warranty-garan-nested-img {
5912
+ display: block;
5913
+ width: 100%;
5545
5914
  height: auto;
5546
5915
  }
5547
5916
  .md3 .oo-warranty-link {
@@ -5557,35 +5926,11 @@ line-height: 31px;
5557
5926
  font-family: Arial, Helvetica, Arimo, sans-serif;
5558
5927
  font-weight: 400;
5559
5928
  font-size: 13px;
5929
+ line-height: 1.35;
5560
5930
  color: var(--md-primary);
5561
5931
  text-decoration: underline;
5562
5932
  text-align: left;
5563
5933
  }
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
5934
 
5590
5935
  /* ---------- Bestellungen (orders) ---------- */
5591
5936
  .md3 .mo-page {