@bytebrand/fe-ui-core-autobahn 1.0.40 → 1.0.42

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytebrand/fe-ui-core-autobahn",
3
- "version": "1.0.40",
3
+ "version": "1.0.42",
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
@@ -1208,6 +1208,9 @@
1208
1208
  sticky bottom bar, all payment modes. */
1209
1209
  .md3 .fin-rate-old { font-size: 15px; font-weight: 700; color: var(--md-error);
1210
1210
  text-decoration: line-through; letter-spacing: 0; flex: none; }
1211
+ /* stacked unit column beside the hero rate (Figma: struck old rate ABOVE "/mtl.") */
1212
+ .md3 .fin-rate-unit { display: flex; flex-direction: column; line-height: 1.25;
1213
+ font-size: 14px; font-weight: 600; color: var(--md-on-surface-variant); flex: none; }
1211
1214
  /* condition summary — left cell of row 2 in fin-price-grid */
1212
1215
  .md3 .fin-cond { min-width: 0; font-size: 12.5px; color: var(--md-on-surface-variant); }
1213
1216
  /* Rate-edit (Rate anpassen) sits between the rate and the CTA now */
@@ -1395,7 +1398,11 @@
1395
1398
  which stays bundled inside .vdp-gallery, hidden on mobile via hide-mobile). */
1396
1399
  .md3 .vdp-header-summary { order: 2; padding: 0; margin-bottom: 4px; /* flush with the card edges so the trust chips span the same width */ }
1397
1400
  .md3 .vdp-aside { order: 3; }
1398
- .md3 .vdp-header-extras { order: 4; margin-top: 16px; }
1401
+ /* no extra margin-top — .vdp-grid's own gap (14px, set further below) already spaces every
1402
+ mobile card uniformly; an added margin here stacked ON TOP of that gap, making the gap
1403
+ AFTER this card visibly bigger than the gap before it once ReviewsTeaser was inserted
1404
+ between the aside and this card (round 10 fix). */
1405
+ .md3 .vdp-header-extras { order: 4; }
1399
1406
  .md3 .vdp-details { order: 5; }
1400
1407
  .md3 .vdp-aside { position: static; }
1401
1408
  .md3 .price-card { position: static; }
@@ -1612,7 +1619,17 @@
1612
1619
  /* tighter stacked rhythm so title→chips→finance card land above the fold */
1613
1620
  .md3 .vdp-grid { gap: 14px; }
1614
1621
  .md3 .fin-tabs { margin-bottom: 12px; }
1615
- .md3 .fin-info { margin-top: 10px; padding-top: 10px; }
1622
+ /* no divider above the Persönliche-Beratung row on phone (Figma: the only divider in this
1623
+ zone is the one before "Rate anpassen"); desktop keeps its border-top. */
1624
+ .md3 .fin-info { margin-top: 10px; padding-top: 10px; border-top: 0; }
1625
+ /* tabs divider runs edge-to-edge of the card / sticky bar (Figma) */
1626
+ .md3 .vdp-aside .fin-tabs { margin-left: -16px; margin-right: -16px; }
1627
+ .md3 .vdp-bottom-bar .fin-tabs { margin-left: -14px; margin-right: -14px; }
1628
+ /* Anrufen / phone buttons: Figma blue outline (default outlined is quiet gray) */
1629
+ .md3 .fin-cta-row .mbtn--outlined,
1630
+ .md3 .bb-cta-row .mbtn--outlined:not(.bb-adjust) { box-shadow: inset 0 0 0 1.5px var(--md-primary); }
1631
+ /* mobile page is WHITE like the Figma master — beats the .vdp-tint inline gray */
1632
+ .md3 .vdp-tint { background: var(--md-sc-lowest) !important; }
1616
1633
  /* mockup hero rate is a notch bigger on phone (inline style says 48 — hence !important) */
1617
1634
  .md3 .fin-rate-main .num { font-size: 52px !important; letter-spacing: -1.5px !important; }
1618
1635
  /* the struck old figure must NOT inherit the 52px hero size */
@@ -333,22 +333,22 @@ const FinanceCalculator: React.FunctionComponent<FinanceCalculatorProps> = ({
333
333
 
334
334
  {/* 2-col grid: rate|pill (row 1) + condLine|bar (row 2) — fixed right column prevents wrapping */}
335
335
  <div className="fin-price-grid">
336
- {/* col 1 row 1: hero rate */}
336
+ {/* col 1 row 1: hero rate — Figma: "329 €" all-big, then a small stacked column with
337
+ the struck old rate ABOVE "/mtl." (round 11; was a single baseline row) */}
337
338
  <div className="fin-rate-main">
338
- <div style={{ display: 'flex', alignItems: 'baseline', gap: 5 }}>
339
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
339
340
  <span
340
341
  className="num"
341
342
  style={{ fontSize: 48, fontWeight: 800, color: 'var(--md-primary)', letterSpacing: '-2px' }}
342
343
  >
343
- {isCash ? eur(price) : eur(Math.round(monthly))}
344
+ {isCash ? eur(price) : eur(Math.round(monthly))} €
344
345
  </span>
345
- <span className="md-body-sm" style={{ fontWeight: 600 }}>
346
- {isCash ? '€' : `€ ${t('autobahn:finance.perMonth')}`}
347
- </span>
348
- {/* struck old rate (REAL oldMonthlyInstallment; SRP strikes the same source) —
349
- after the unit, else the unit wraps under the hero figure on phones */}
350
- {!isCash && oldMonthly != null && (
351
- <s className="num fin-rate-old">{eur(Math.round(oldMonthly))} €</s>
346
+ {!isCash && (
347
+ <span className="fin-rate-unit">
348
+ {/* struck old rate (REAL oldMonthlyInstallment; SRP strikes the same source) */}
349
+ {oldMonthly != null && <s className="num fin-rate-old">{eur(Math.round(oldMonthly))} €</s>}
350
+ <span>{t('autobahn:finance.perMonth')}</span>
351
+ </span>
352
352
  )}
353
353
  </div>
354
354
  {isCash && <div className="md-label-sm">{t('autobahn:finance.fixedPrice')}</div>}
@@ -491,7 +491,8 @@ const FinanceCalculator: React.FunctionComponent<FinanceCalculatorProps> = ({
491
491
  {/* side-by-side CTAs — mockup ratio ~2:1, with the tiny auto.de-ID sitting
492
492
  directly under the Anrufen button (not in its own full-width row). */}
493
493
  <div className="fin-cta-row" style={{ display: 'flex', gap: 10, marginTop: 14, alignItems: 'flex-start' }}>
494
- <Button variant="filled" size="lg" icon="shield-check" style={{ flex: 2 }} onClick={onSecure}>
494
+ {/* file-check, not shield — the Figma CTA carries the document-with-check icon */}
495
+ <Button variant="filled" size="lg" icon="file-check" style={{ flex: 2 }} onClick={onSecure}>
495
496
  {t('autobahn:finance.secureOffer')}
496
497
  </Button>
497
498
  <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: 4, minWidth: 0 }}>
@@ -1168,18 +1168,29 @@ export const VdpBottomBar: React.FunctionComponent<VdpBottomBarProps> = ({
1168
1168
  </div>
1169
1169
  )}
1170
1170
  <div className="bb-price-row">
1171
- <div style={{ display: 'flex', alignItems: 'baseline', gap: 5, whiteSpace: 'nowrap', minWidth: 0 }}>
1171
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6, whiteSpace: 'nowrap', minWidth: 0 }}>
1172
1172
  <span className="num" style={{ fontWeight: 800, fontSize: 30, color: 'var(--md-primary)', letterSpacing: '-1px' }}>
1173
1173
  {isCash ? eur(vehicle.price) : eur(Math.round(rate))} €
1174
1174
  </span>
1175
- {/* struck old rate / list price (REAL isStrikeShown-gated figures, per Figma sticky footer) */}
1176
- {!isCash && oldMonthly != null && <s className="num fin-rate-old">{eur(Math.round(oldMonthly))} €</s>}
1177
- {isCash && vehicle.listPrice != null && vehicle.listPrice > vehicle.price && (
1178
- <s className="num fin-rate-old">{eur(vehicle.listPrice)} €</s>
1175
+ {/* Figma sticky footer: tiny "z.B.", then the struck old rate stacked ABOVE "/mtl." */}
1176
+ {isCash ? (
1177
+ <>
1178
+ {vehicle.listPrice != null && vehicle.listPrice > vehicle.price && (
1179
+ <s className="num fin-rate-old">{eur(vehicle.listPrice)} €</s>
1180
+ )}
1181
+ <span className="md-label-sm" style={{ fontWeight: 600 }}>{t('autobahn:finance.fixedPrice')}</span>
1182
+ </>
1183
+ ) : (
1184
+ <>
1185
+ <span className="md-label-sm" style={{ fontWeight: 600, alignSelf: 'flex-end', paddingBottom: 4 }}>
1186
+ {t('autobahn:finance.exampleLabel')}
1187
+ </span>
1188
+ <span className="fin-rate-unit" style={{ fontSize: 12.5 }}>
1189
+ {oldMonthly != null && <s className="num fin-rate-old">{eur(Math.round(oldMonthly))} €</s>}
1190
+ <span>{t('autobahn:bottom.perMonth')}</span>
1191
+ </span>
1192
+ </>
1179
1193
  )}
1180
- <span className="md-label-sm" style={{ fontWeight: 600 }}>
1181
- {isCash ? t('autobahn:finance.fixedPrice') : `${t('autobahn:finance.exampleLabel')} ${t('autobahn:bottom.perMonth')}`}
1182
- </span>
1183
1194
  </div>
1184
1195
  {ratingLabel && (
1185
1196
  <div className="bb-eval">
@@ -1614,15 +1625,15 @@ export const FinanceDetailsModal: React.FunctionComponent<FinanceDetailsModalPro
1614
1625
 
1615
1626
  <div className="fin-price-grid">
1616
1627
  <div className="fin-rate-main">
1617
- <div style={{ display: 'flex', alignItems: 'baseline', gap: 5 }}>
1628
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
1618
1629
  <span className="num" style={{ fontSize: 34, fontWeight: 800, color: 'var(--md-primary)', letterSpacing: '-1px' }}>
1619
- {isCash ? eur(price) : eur(Math.round(monthly))}
1630
+ {isCash ? eur(price) : eur(Math.round(monthly))} €
1620
1631
  </span>
1621
- <span className="md-body-sm" style={{ fontWeight: 600 }}>
1622
- {isCash ? '€' : `€ ${t('autobahn:finance.perMonth')}`}
1623
- </span>
1624
- {!isCash && oldMonthly != null && (
1625
- <s className="num fin-rate-old">{eur(Math.round(oldMonthly))} €</s>
1632
+ {!isCash && (
1633
+ <span className="fin-rate-unit">
1634
+ {oldMonthly != null && <s className="num fin-rate-old">{eur(Math.round(oldMonthly))} €</s>}
1635
+ <span>{t('autobahn:finance.perMonth')}</span>
1636
+ </span>
1626
1637
  )}
1627
1638
  </div>
1628
1639
  </div>