@bytebrand/fe-ui-core-autobahn 1.0.115 → 1.0.116

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.115",
3
+ "version": "1.0.116",
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
@@ -5336,6 +5336,11 @@ line-height: 31px;
5336
5336
  .md3 .card-cta-row .mbtn { font-size: 12.5px; padding: 0 10px; gap: 5px; min-width: 0; }
5337
5337
  .md3 .card-cta-row .mbtn span, .md3 .card-cta-row .mbtn { overflow: hidden; text-overflow: ellipsis; }
5338
5338
  .md3 .card-cta-row .mbtn .lucide { width: 15px; height: 15px; flex: none; }
5339
+ /* the phone/"Rate anpassen" outlined buttons set their own explicit `border` (1.6px solid) inline —
5340
+ .mbtn--outlined's inset box-shadow (the DEFAULT way that class draws its border everywhere else)
5341
+ stacks on top of it as a second, slightly offset ring ("double border"). Suppress just the
5342
+ shadow here; the real border keeps rendering from each button's own inline style. */
5343
+ .md3 .card-cta-row .mbtn--outlined { box-shadow: none; }
5339
5344
  /* muted buyer activity (#5) */
5340
5345
  .md3 .pp-activity {
5341
5346
  display: flex;
@@ -6767,16 +6772,30 @@ line-height: 31px;
6767
6772
  }
6768
6773
  .md3 .srp-bar {
6769
6774
  position: sticky;
6770
- /* was 64px (docked under the always-visible header) — now 0: once the header slides away
6771
- (autoHideOnScroll, TopBar.tsx) this bar takes its place at the very top instead of leaving
6772
- a gap, and sits flush under it again the moment the header slides back in. */
6773
- top: 0px;
6775
+ /* default: docked directly under the always-visible header (its 64px height). Same 0.25s
6776
+ duration as .topbar's own transform transition (below) — the header slides in/out over
6777
+ 0.25s, so this bar's top must animate in step with it, not jump instantly, or a gap (bar
6778
+ already at 64px, header still sliding in) or an overlap (bar already at 0, header still
6779
+ sliding out) flashes for that quarter-second. */
6780
+ top: 64px;
6781
+ transition: top 0.25s;
6774
6782
  z-index: 20;
6775
6783
  background: #fff;
6776
6784
  padding: 8px 0;
6777
6785
  margin: 0 0 8px;
6778
6786
  box-shadow: 0 6px 8px -8px rgba(0, 0, 0, 0.3);
6779
6787
  }
6788
+ /* once the header slides away on scroll-down (autoHideOnScroll, TopBar.tsx adds
6789
+ .topbar--hidden), this bar takes its place at the very top instead of leaving a 64px gap.
6790
+ The header's box stays in the layout flow even while hidden (transform doesn't affect
6791
+ `position: sticky`'s slot — see the .topbar--hidden rule above), so without this override
6792
+ the bar's own sticky top would also need to jump — and it must jump BACK to 64px the moment
6793
+ scroll-up brings the header back (topbar--hidden removed), or the reappearing header
6794
+ (z-index 50) sticks at the same top:0 slot and paints over/hides this bar (z-index 20)
6795
+ underneath it instead of sitting above it. */
6796
+ .md3:has(.topbar--hidden) .srp-bar {
6797
+ top: 0px;
6798
+ }
6780
6799
  /* full-bleed white to the true viewport edges, WITHOUT moving .srp-bar's own text — it stays
6781
6800
  inside .srp-main's own side padding, this pseudo-element just paints white past it on both
6782
6801
  sides so no gap of page background shows while the bar is sticky. NOT a box-shadow spread
@@ -7327,7 +7346,7 @@ line-height: 31px;
7327
7346
  no separate per-element rule to keep in sync with this one. */
7328
7347
  @media (max-width: 600px) {
7329
7348
  .md3 .vdp-main {
7330
- padding: 0 10px 48px !important;
7349
+ padding: 0 14px 48px !important;
7331
7350
  }
7332
7351
  .md3 .vdp-push-badges {
7333
7352
  gap: 6px;
package/ui/Dropdown.tsx CHANGED
@@ -330,6 +330,15 @@ const Dropdown: React.FunctionComponent<DropdownProps> = ({
330
330
 
331
331
  const editing = searchable && open;
332
332
 
333
+ // Bug 53/37: "Rate bis" / "km bis" allow a hand-typed amount the preset rungs don't cover
334
+ // (allowCustomValue) — that typed number never matches any option label, so filteredOptions
335
+ // comes back empty and the popover would show "Keine Treffer", reading as "no cars match this"
336
+ // to the customer even though the typed value is perfectly valid input. Once there's an actual
337
+ // typed query with zero matches on an allowCustomValue field, suppress the popover entirely
338
+ // (not just the "Keine Treffer" row) — an empty floating box would be just as confusing. Plain
339
+ // (non-custom) searchable dropdowns, e.g. Make/Model, are unaffected and keep showing it.
340
+ const suppressEmptyMenu = allowCustomValue && searchable && query.trim() !== '' && filteredOptions.length === 0;
341
+
333
342
  // shared between the in-place popover and the menuPortal one — identical option list either way.
334
343
  const renderMenuList = () => (
335
344
  <ul
@@ -407,7 +416,7 @@ const Dropdown: React.FunctionComponent<DropdownProps> = ({
407
416
  <Icon name="chevron-down" cls="mselect-chev" />
408
417
  </button>
409
418
  )}
410
- {open && (menuPortal && portalRoot
419
+ {open && !suppressEmptyMenu && (menuPortal && portalRoot
411
420
  ? ReactDOM.createPortal(
412
421
  <div
413
422
  ref={menuElRef}