@bytebrand/fe-ui-core-autobahn 1.0.29 → 1.0.31

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.29",
3
+ "version": "1.0.31",
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
@@ -33,6 +33,15 @@
33
33
  --md-primary-container: #DBE4FF;
34
34
  --md-on-primary-container:#001A45;
35
35
 
36
+ /* Figma round-9 tokens: bright link blue + the mockup's cool text/border palette */
37
+ --md-link: #005CFF; /* text links + category headings (Figma) */
38
+ --fig-navy: #1D2A38; /* card text */
39
+ --fig-gray: #5B6B7F; /* secondary text */
40
+ --fig-border: #D4DDE7; /* card border */
41
+ --fig-tile-border: #E6ECF3; /* inner tile border */
42
+ --fig-chip-bg: #EAF2FF; /* highlight pill bg */
43
+ --fig-chip-text: #0B2D5C; /* highlight pill text */
44
+
36
45
  /* accent (cyan) roles — highlights, focus, on-dark links */
37
46
  --md-accent: var(--autode-cyan);
38
47
  --md-accent-container: #C6EEFB;
@@ -163,6 +172,15 @@
163
172
  flex: 1 1 auto; /* the four chips stretch to fill the block width (mockup), min = natural width */ }
164
173
  .md3 .vdp-trust-chip .lucide { width: 14px; height: 14px; flex: none; }
165
174
 
175
+ /* VDP highlight pills — Figma round 9: light-blue pill, navy bold text, bright-blue check */
176
+ .md3 .vdp-highlights .chip { background: var(--fig-chip-bg); border: 1px solid var(--fig-tile-border);
177
+ color: var(--fig-chip-text); border-radius: 12px; min-height: 40px; height: auto;
178
+ font-size: 13px; font-weight: 700; white-space: normal; line-height: 1.2; }
179
+ .md3 .vdp-highlights .chip .lucide { color: var(--md-link); }
180
+
181
+ /* Fahrzeugdaten / Ausstattung expander links — Figma bright link blue */
182
+ .md3 #vdp-daten .mbtn--text, .md3 #vdp-ausstattung .mbtn--text { color: var(--md-link); }
183
+
166
184
  /* status / rating chip (no CTA) */
167
185
  .md3 .statchip { display: inline-flex; align-items: center; gap: 5px; height: 24px; padding: 0 10px;
168
186
  border-radius: var(--md-r-xs); font-size: 12px; font-weight: 600; }
@@ -930,6 +948,7 @@
930
948
  box-shadow: 0 2px 8px rgba(0,0,0,.18); }
931
949
  .md3 .hiw-title { font-size: 15px; font-weight: 700; margin-top: 4px; margin-bottom: 8px; color: var(--md-on-surface); }
932
950
  .md3 .hiw-desc { margin: 0; font-size: 13px; color: var(--md-on-surface-variant); line-height: 1.55; }
951
+ .md3 .hiw-heading { text-align: center; } /* desktop; the mobile card left-aligns it */
933
952
  .md3 .footer-grid { display: grid; grid-template-columns: 1.4fr repeat(3,1fr); gap: 28px; }
934
953
  .md3 .srp-grid { display: grid; grid-template-columns: 244px 1fr; gap: 24px; align-items: start; }
935
954
  /* SRP grid view sits beside the filter rail — 2 columns, not 3 (cards need ≥340px) */
@@ -1217,19 +1236,43 @@
1217
1236
  .md3 .enquiry-phone { display: inline-flex; align-items: center; gap: 8px; margin-top: auto; padding-top: 18px;
1218
1237
  color: var(--md-primary); font-weight: 700; font-size: 16px; text-decoration: none; }
1219
1238
  .md3 .enquiry-form { padding: 24px; }
1239
+ /* outlined float-label fields (Figma phone/message row): label sits ON the top border */
1240
+ .md3 .enq-float { position: relative; display: block; border: 1px solid var(--md-outline-variant);
1241
+ border-radius: var(--md-r-sm); background: var(--md-sc-lowest); }
1242
+ .md3 .enq-float-label { position: absolute; top: -8px; left: 10px; padding: 0 5px; background: var(--md-sc-lowest);
1243
+ font-size: 11.5px; font-weight: 600; color: var(--md-on-surface-variant); line-height: 1.3; z-index: 1; }
1244
+ .md3 .enq-float input, .md3 .enq-float textarea { width: 100%; border: 0; background: none; outline: 0;
1245
+ color: var(--md-on-surface); font: inherit; font-size: 14px; height: 46px; padding: 0 12px; }
1246
+ .md3 .enq-float textarea { height: 96px; padding: 12px; resize: vertical; }
1247
+ .md3 .enq-phone-row { display: grid; grid-template-columns: 82px 96px 1fr; gap: 10px; }
1248
+ .md3 .enq-country { display: flex; align-items: center; justify-content: space-between; gap: 4px;
1249
+ height: 46px; padding: 0 10px 0 12px; font-size: 14px; color: var(--md-on-surface); }
1250
+ /* revocable-consent checkbox + microtext (Figma round 9) */
1251
+ .md3 .enq-consent { display: flex; align-items: flex-start; gap: 9px; margin-top: 10px; cursor: pointer; }
1252
+ .md3 .enq-consent input { width: 17px; height: 17px; margin: 1px 0 0; flex: none; accent-color: var(--md-primary); cursor: pointer; }
1253
+ .md3 .enq-consent span { font-size: 11px; line-height: 1.45; color: var(--md-on-surface-variant); }
1254
+ .md3 .enq-consent a { color: inherit; }
1220
1255
  @media (max-width: 780px) {
1221
1256
  .md3 .enquiry-grid { grid-template-columns: 1fr; }
1222
1257
  .md3 .enquiry-aside { border-right: 0; border-bottom: 1px solid var(--md-outline-variant); }
1223
1258
  .md3 .enquiry-phone { margin-top: 16px; }
1224
1259
  }
1225
1260
 
1226
- /* sticky mobile CTA bar (VDP) — hidden (slid off-screen) until the page scrolls past the
1227
- main offer card, matching the desktop VdpStickyBar's show/scroll-gated behavior. */
1261
+ /* sticky mobile bar (VDP) — Figma "Sticky Footer": mode tabs + rate/eval row + CTA row.
1262
+ Hidden (slid off-screen) until the page scrolls past the main offer card, matching the
1263
+ desktop VdpStickyBar's show/scroll-gated behavior. */
1228
1264
  .md3 .vdp-bottom-bar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 60; background: var(--md-sc-lowest);
1229
1265
  border-top: 1px solid var(--md-outline-variant); box-shadow: 0 -2px 14px rgba(0,0,0,.10);
1230
- padding: 10px 16px; align-items: center; gap: 14px;
1266
+ padding: 0 14px 10px; flex-direction: column; align-items: stretch; gap: 8px;
1231
1267
  transform: translateY(100%); transition: transform var(--dur-2, .25s); }
1232
1268
  .md3 .vdp-bottom-bar--on { transform: translateY(0); }
1269
+ .md3 .bb-tabs { margin-bottom: 0; }
1270
+ .md3 .bb-tabs .fin-tab { padding: 9px 4px; font-size: 13.5px; }
1271
+ .md3 .bb-price-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
1272
+ .md3 .bb-eval { display: flex; flex-direction: column; align-items: flex-end; gap: 5px; flex: none; width: 118px; }
1273
+ .md3 .bb-eval .fin-eval-pill { padding: 4px 10px; font-size: 11.5px; }
1274
+ .md3 .bb-cta-row { display: flex; gap: 8px; align-items: center; }
1275
+ .md3 .bb-adjust { color: var(--md-on-surface); border-color: var(--md-outline-variant); }
1233
1276
 
1234
1277
  /* bottom-sheet (SRP filters) — sticky header + scrollable body + sticky action bar, slide-up entrance */
1235
1278
  .md3 .sheet-scrim { position: fixed; inset: 0; background: rgba(16,22,42,.5); z-index: 70;
@@ -1298,8 +1341,29 @@
1298
1341
  .md3 .gitem:nth-child(n+3) { border-top: 1px solid var(--md-outline-variant); }
1299
1342
  .md3 .mag-grid { grid-template-columns: 1fr; }
1300
1343
  .md3 .zustand-grid { grid-template-columns: repeat(2, 1fr); }
1301
- .md3 .steps-4 { grid-template-columns: repeat(2, 1fr); gap: 20px; }
1344
+ /* highlight pills: Figma 2-col grid — ALL highlights visible, no swipe-line */
1345
+ .md3 .vdp-highlights { display: grid !important; grid-template-columns: 1fr 1fr; gap: 9px; }
1346
+ .md3 .vdp-highlights .chip { width: 100%; justify-content: flex-start; }
1347
+ /* "So einfach geht's" — Figma mobile card: white card, left title, numbered blue
1348
+ circles in a vertical list with a connector line (replaces the desktop step cards) */
1349
+ .md3 .steps-4 { grid-template-columns: 1fr; gap: 0; }
1302
1350
  .md3 .hiw-step:not(:last-child)::after { display: none; }
1351
+ .md3 .hiw-section { background: var(--md-sc-lowest); border: 1px solid var(--fig-border);
1352
+ border-radius: 18px; padding: 22px 20px; }
1353
+ .md3 .hiw-heading { text-align: left; margin-bottom: 18px !important; }
1354
+ .md3 .hiw-step { flex-direction: row; align-items: flex-start; text-align: left; gap: 16px;
1355
+ background: none; border: 0; border-radius: 0; box-shadow: none; padding: 0 0 22px; position: relative; }
1356
+ .md3 .hiw-step:last-child { padding-bottom: 0; }
1357
+ /* connector line between the numbered circles */
1358
+ .md3 .hiw-step:not(:last-child)::before { content: ''; position: absolute; left: 21px; top: 46px; bottom: 2px;
1359
+ width: 2px; background: var(--fig-tile-border); }
1360
+ .md3 .hiw-icon-wrap { width: 44px; height: 44px; margin-bottom: 0; flex: none;
1361
+ background: var(--md-primary); box-shadow: none; }
1362
+ .md3 .hiw-icon-wrap .lucide { display: none; }
1363
+ .md3 .hiw-num { position: static; min-width: 0; width: auto; height: auto; padding: 0;
1364
+ background: none; box-shadow: none; color: #fff; font-size: 17px; font-weight: 700; }
1365
+ .md3 .hiw-title { margin-top: 0; margin-bottom: 5px; font-size: 16px; color: var(--fig-navy); }
1366
+ .md3 .hiw-desc { font-size: 13.5px; color: var(--fig-gray); }
1303
1367
  .md3 .curated-grid { grid-template-columns: repeat(2,1fr); }
1304
1368
  .md3 .footer-grid { grid-template-columns: repeat(3,1fr); gap: 24px; }
1305
1369
  .md3 .hide-tablet { display: none !important; }
@@ -1366,10 +1430,7 @@
1366
1430
  /* spec table clamps to 6 rows on phone until "Alle Daten anzeigen" */
1367
1431
  .md3 .vdp-specs--clamp .specitem:nth-child(n+7) { display: none; }
1368
1432
  .md3 .gitem { padding: 20px 18px; }
1369
- .md3 .steps-4 { grid-template-columns: 1fr; gap: 18px; }
1370
- .md3 .hiw-step { flex-direction: row; align-items: flex-start; text-align: left; gap: 14px; }
1371
- .md3 .hiw-step:not(:last-child)::after { display: none; }
1372
- .md3 .hiw-icon-wrap { margin-bottom: 0; flex: none; }
1433
+ /* steps/hiw: the ≤980 Figma vertical-list card already applies here */
1373
1434
  /* --- VDP header card: structured phone layout (desktop-composed VdpHeaderCard,
1374
1435
  hidden on phone via hide-mobile — kept for tablet widths 600-980px where the
1375
1436
  card still shows). The compact mobile-only .vdp-header-summary below is
@@ -1393,12 +1454,10 @@
1393
1454
  .md3 .vdp-header-summary .vdp-meta > span + span::before { content: ''; margin: 0 8px; }
1394
1455
  .md3 .vdp-header-summary .vdp-meta > span { overflow: visible; text-overflow: clip; }
1395
1456
  .md3 .vdp-header-summary .vdp-meta .lucide { display: none; }
1396
- .md3 .vdp-header-summary .vdp-meta > span:nth-child(5) { display: none; }
1397
- /* highlights: one swipeable line, no ragged wrap */
1398
- .md3 .vdp-highlights { flex-wrap: nowrap !important; overflow-x: auto; scrollbar-width: none;
1399
- width: 0; min-width: 100%; }
1400
- .md3 .vdp-highlights::-webkit-scrollbar { display: none; }
1401
- .md3 .vdp-highlights .chip { flex: none; }
1457
+ /* compact dot-line = km/EZ/Getriebe/Kraftstoff only (mockup) — hides Hand + Karosserie,
1458
+ which only appear in the 2-col fact grid */
1459
+ .md3 .vdp-header-summary .vdp-meta > span:nth-child(n+5) { display: none; }
1460
+ /* highlights: the ≤980 Figma 2-col grid applies here too (no swipe-line since round 9) */
1402
1461
  /* condition row: 2×2 on phone */
1403
1462
  .md3 .zustand-grid { grid-template-columns: 1fr 1fr; }
1404
1463
  .md3 .zustand-tile { border-left: 0; padding: 12px 0; }
@@ -1443,25 +1502,48 @@
1443
1502
  .md3 .mslider::-moz-range-thumb { width: 22px; height: 22px; border-radius: 50%; background: var(--md-primary); border: 3px solid #fff; box-shadow: var(--md-e2); cursor: pointer; }
1444
1503
  .md3 .eq-cols { column-count: 2; column-gap: 32px; }
1445
1504
  .md3 .pmv-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; }
1446
- /* trust strip — quiet one-line reassurance, NOT a card band */
1505
+ /* trust strip — quiet one-line reassurance on desktop; Figma 2×2 tile card ≤980 */
1447
1506
  .md3 .trust-strip { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; row-gap: 10px; padding: 2px 4px; }
1448
1507
  .md3 .trust-strip > div { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap;
1449
1508
  font-size: 13.5px; font-weight: 600; color: var(--md-on-surface-variant); }
1450
1509
  .md3 .trust-strip > div + div::before { content: ''; width: 4px; height: 4px; border-radius: 50%;
1451
1510
  background: var(--md-outline-variant); margin: 0 14px; }
1511
+ .md3 .trust-sub { display: none; } /* sublines only exist in the mobile tile layout */
1512
+
1513
+ @media (max-width: 980px) {
1514
+ /* Figma "Trust Highlights - Compact": white card holding 4 bordered tiles,
1515
+ icon + bold title + gray subline each */
1516
+ .md3 .trust-strip { display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
1517
+ background: var(--md-sc-lowest); border: 1px solid var(--fig-border); border-radius: 18px;
1518
+ padding: 14px; box-shadow: 0 2px 3px rgba(14,34,56,.07); }
1519
+ .md3 .trust-strip > div { display: flex; align-items: flex-start; white-space: normal;
1520
+ border: 1px solid var(--fig-tile-border); border-radius: 12px; padding: 10px 11px; gap: 9px; }
1521
+ .md3 .trust-strip > div + div::before { content: none; }
1522
+ .md3 .trust-strip > div .lucide { margin-top: 1px; }
1523
+ .md3 .trust-strip > div > span { display: block; font-size: 12.5px; font-weight: 700; color: var(--fig-navy); line-height: 1.3; }
1524
+ .md3 .trust-sub { display: block; margin-top: 2px; font-size: 11px; font-weight: 400; color: var(--fig-gray); line-height: 1.3; }
1525
+ }
1452
1526
 
1453
1527
  @media (max-width: 600px) {
1454
1528
  .md3 .eq-cols { column-count: 1; }
1455
1529
  .md3 .pmv-grid { grid-template-columns: 1fr; gap: 22px; }
1456
- .md3 .trust-strip { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 16px; justify-items: start; }
1457
- .md3 .trust-strip > div + div::before { content: none; }
1458
1530
  }
1459
1531
 
1460
- /* ---------- CO₂ / energy label — compact horizontal scale ---------- */
1461
- .md3 .co2-scale { display: flex; gap: 4px; align-items: stretch; }
1462
- .md3 .co2-seg { flex: 1; height: 32px; border-radius: 7px; color: #fff; font-weight: 800; font-size: 12.5px;
1463
- display: flex; align-items: center; justify-content: center; opacity: .3; transition: opacity var(--dur-2) var(--ease-standard); }
1464
- .md3 .co2-seg--on { opacity: 1; box-shadow: 0 2px 8px rgba(16,22,42,.25), 0 0 0 2px #fff inset; transform: scale(1.06); }
1532
+ /* ---------- CO₂ / energy label — Figma pastel scale (round 9) ----------
1533
+ Every segment shows its pastel class colour; the vehicle's class(es) pop as the
1534
+ saturated tile with a white ring + shadow. PHEV gets BOTH markers (gew./entladen)
1535
+ with tiny labels above the scale. */
1536
+ .md3 .co2-scale { display: flex; gap: 5px; align-items: flex-end; }
1537
+ .md3 .co2-col { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
1538
+ .md3 .co2-mark { font-size: 9.5px; line-height: 1.2; text-align: center; color: var(--fig-gray);
1539
+ white-space: nowrap; overflow: visible; }
1540
+ .md3 .co2-seg { height: 36px; border-radius: 10px; color: #fff; font-weight: 800; font-size: 13px;
1541
+ display: flex; align-items: center; justify-content: center;
1542
+ background: color-mix(in srgb, var(--seg) 38%, #fff);
1543
+ transition: background var(--dur-2) var(--ease-standard); }
1544
+ .md3 .co2-seg--on { background: var(--seg); border: 2px solid #fff;
1545
+ box-shadow: 0 2px 8px rgba(16,22,42,.28); transform: scale(1.06); }
1546
+ .md3 .co2-seg--on2 { border: 2px solid #fff; box-shadow: 0 2px 8px rgba(16,22,42,.22); transform: scale(1.04); }
1465
1547
  .md3 .co2-stats { display: flex; flex-wrap: wrap; gap: 10px 26px; margin-bottom: 16px; }
1466
1548
  .md3 .dealer-map { position: relative; height: 130px; border-radius: var(--md-r-sm); overflow: hidden;
1467
1549
  background: #e8edf3;
package/ui/Icon.tsx CHANGED
@@ -55,6 +55,7 @@ import {
55
55
  EyeOff,
56
56
  Facebook,
57
57
  File,
58
+ FileCheck,
58
59
  FileText,
59
60
  Flame,
60
61
  Fuel,
@@ -252,6 +253,7 @@ const REGISTRY: Record<string, React.ComponentType<LucideProps>> = {
252
253
  EyeOff,
253
254
  Facebook,
254
255
  File,
256
+ FileCheck,
255
257
  FileText,
256
258
  Flame,
257
259
  Fuel,