/* --- BicycleJack Vergleichstabelle: gekapselt fuer WordPress ---
Schriften werden bewusst NICHT gesetzt - alles erbt vom Theme.
Optional anpassbar ueber .bjv-root { --max: ...; } weiter unten. */
.bjv-root{font-family:inherit;font-size:16px;line-height:1.5;-webkit-text-size-adjust:100%;text-align:left;max-width:none}
.bjv-root *,.bjv-root *:before,.bjv-root *:after{box-sizing:border-box}
.bjv-root p,.bjv-root div,.bjv-root span,.bjv-root strong,.bjv-root small,.bjv-root b,.bjv-root label,.bjv-root button,.bjv-root input,.bjv-root select,.bjv-root a,.bjv-root table,.bjv-root th,.bjv-root td,.bjv-root thead,.bjv-root tbody,.bjv-root tr{font-family:inherit}
.bjv-root p,.bjv-root table,.bjv-root th,.bjv-root td,.bjv-root .bjv-h2{margin:0;padding:0}
.bjv-root table{border:0;background:none;width:100%;display:table;table-layout:auto}
.bjv-root tr,.bjv-root th,.bjv-root td{border:0;background:none;display:table-cell}
.bjv-root tr{display:table-row}
.bjv-root thead{display:table-header-group}
.bjv-root tbody{display:table-row-group}
.bjv-root a{text-decoration:none;box-shadow:none;border:0}
.bjv-root img{max-width:100%}
.bjv-root button{-webkit-appearance:none;appearance:none;text-transform:none;letter-spacing:normal;margin:0;box-shadow:none;min-height:0}
.bjv-root input,.bjv-root select{margin:0;box-shadow:none;max-width:none}
.bjv-root .bjv-h2{font-weight:800;text-wrap:balance}
/* ---- Optionale Stellschrauben -------------------------------------------
Maximale Breite des Inhalts (Standard 1580px):
.bjv-root{--max:1200px}
Volle Fensterbreite (Full-Bleed), falls der Theme-Container zu schmal ist
- dann die folgenden zwei Zeilen einkommentieren:
.bjv-root{width:100vw;margin-left:calc(50% - 50vw);max-width:100vw}
Eigene Schrift statt Theme-Schrift (normalerweise NICHT noetig):
.bjv-root{font-family:"Deine Theme-Schrift",sans-serif}
-------------------------------------------------------------------------- */
.bjv-root{--ink:#303638;--ink2:#4d5558;--muted:#6a7477;--line:#d9dddc;--paper:#f5f6f4;--white:#fff;--cyan:#26b6c8;--cyan2:#0d8999;--cyansoft:#dff5f7;--green:#21765e;--greensoft:#e2f3ec;--amber:#8a5b0a;--ambersoft:#fff2d5;--red:#8c3a35;--redsoft:#fae6e4;--purple:#62519c;--purplesoft:#efebff;--max:1580px}
.bjv-root,.bjv-root *{box-sizing:border-box}
.bjv-root{margin:0;background:#fff;color:var(--ink);font-size:16px;line-height:1.5}
.bjv-root a{color:inherit}
.bjv-root button,.bjv-root input,.bjv-root select{font:inherit}
.bjv-root .bjv-wrap{width:min(var(--max),calc(100% - 40px));margin-inline:auto}
.bjv-root .bjv-eyebrow{margin:0 0 .55rem;text-transform:uppercase;letter-spacing:.15em;font-size:.71rem;font-weight:800;color:var(--cyan2)}
.bjv-root .bjv-h2{line-height:1.08;margin:0;color:var(--ink)}
.bjv-root .bjv-h2{font-size:clamp(1.7rem,3vw,2.75rem);letter-spacing:-.035em}
.bjv-root .bjv-pills{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 22px}
.bjv-root .bjv-pill{display:inline-flex;align-items:center;gap:.42rem;padding:.54rem .76rem;border-radius:999px;background:var(--paper);border:1px solid rgba(48,54,56,.14);color:var(--ink);font-size:.8rem;font-weight:700}
.bjv-root .bjv-pill:before{content:'';width:8px;height:8px;border-radius:50%;background:var(--cyan);flex:none}
.bjv-root .bjv-section{padding:0 0 64px}
.bjv-root .bjv-summary-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:13px;position:relative;z-index:2}
.bjv-root .bjv-summary-card{background:#fff;border:1px solid var(--line);border-radius:16px;padding:18px 19px;box-shadow:0 12px 30px rgba(48,54,56,.07)}
.bjv-root .bjv-summary-card strong{font-size:1.75rem;letter-spacing:-.04em;display:block;color:var(--cyan2)}
.bjv-root .bjv-summary-card span{font-size:.84rem;color:#677174;display:block;margin-top:.15rem}
.bjv-root .bjv-intro{display:grid;grid-template-columns:1.12fr .88fr;gap:32px;align-items:start;margin:38px 0 26px}
.bjv-root .bjv-intro p{margin:.72rem 0 0;color:#5f696c}
.bjv-root .bjv-notice{background:var(--cyansoft);border-left:5px solid var(--cyan);padding:17px 18px;border-radius:0 13px 13px 0;color:#31545a;font-size:.88rem}
.bjv-root .bjv-toolbar{display:grid;grid-template-columns:minmax(260px,1fr) auto auto;gap:11px;align-items:end;margin:0 0 10px}
.bjv-root .bjv-control-label{display:block;font-size:.66rem;text-transform:uppercase;letter-spacing:.105em;font-weight:800;color:#697275;margin:0 0 .28rem .24rem}
.bjv-root .bjv-search-wrap input,.bjv-root .bjv-sort-wrap select,.bjv-root .bjv-multi-trigger{width:100%;border:1px solid var(--line);border-radius:12px;padding:.73rem .86rem;background:#fff;color:var(--ink);min-height:47px}
.bjv-root .bjv-search-wrap input:focus,.bjv-root .bjv-sort-wrap select:focus,.bjv-root .bjv-multi-trigger:focus{outline:3px solid rgba(38,182,200,.2);border-color:var(--cyan2)}
.bjv-root .bjv-sort-wrap select{min-width:245px}
.bjv-root .bjv-multi-select{position:relative;min-width:315px}
.bjv-root .bjv-multi-trigger{display:flex;align-items:center;justify-content:space-between;gap:14px;cursor:pointer;font-weight:700;text-align:left}
.bjv-root .bjv-multi-trigger:hover{border-color:var(--cyan2)}
.bjv-root .bjv-multi-count{display:inline-grid;place-items:center;min-width:24px;height:24px;border-radius:999px;background:var(--ink);color:#fff;font-size:.73rem;padding:0 7px}
.bjv-root .bjv-chevron{width:9px;height:9px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg) translateY(-2px);transition:.2s}
.bjv-root .bjv-multi-trigger[aria-expanded="true"] .bjv-chevron{transform:rotate(225deg) translate(-2px,-1px)}
.bjv-root .bjv-multi-panel{position:absolute;z-index:30;right:0;top:calc(100% + 7px);width:min(420px,calc(100vw - 40px));background:#fff;border:1px solid var(--line);border-radius:14px;box-shadow:0 18px 45px rgba(30,38,40,.17);padding:8px;display:none}
.bjv-root .bjv-multi-panel.bjv-open{display:block}
.bjv-root .bjv-multi-head{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:8px 9px 9px;border-bottom:1px solid var(--line);font-size:.76rem;color:var(--muted)}
.bjv-root .bjv-link-btn{border:0;background:transparent;color:var(--cyan2);font-weight:800;cursor:pointer;padding:3px}
.bjv-root .bjv-check-list{display:grid;gap:2px;padding-top:6px;max-height:420px;overflow:auto}
.bjv-root .bjv-check-option{display:grid;grid-template-columns:20px 1fr;gap:9px;align-items:start;padding:9px;border-radius:9px;cursor:pointer;font-size:.83rem;font-weight:650;color:#4e585b}
.bjv-root .bjv-check-option:hover{background:var(--paper)}
.bjv-root .bjv-check-option input{position:absolute;opacity:0;pointer-events:none}
.bjv-root .bjv-check-box{width:18px;height:18px;border:1.5px solid #aeb6b8;border-radius:5px;margin-top:1px;display:grid;place-items:center;background:#fff}
.bjv-root .bjv-check-option input:checked+.bjv-check-box{background:var(--cyan2);border-color:var(--cyan2)}
.bjv-root .bjv-check-option input:checked+.bjv-check-box:after{content:'✓';color:#fff;font-size:.73rem;line-height:1}
.bjv-root .bjv-check-option input:focus-visible+.bjv-check-box{outline:3px solid rgba(38,182,200,.25)}
.bjv-root .bjv-active-filters{min-height:34px;display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin:8px 0 10px}
.bjv-root .bjv-active-label{font-size:.74rem;color:var(--muted);font-weight:700;margin-right:2px}
.bjv-root .bjv-active-chip{display:inline-flex;align-items:center;gap:7px;border:0;border-radius:999px;background:var(--cyansoft);color:#255159;padding:.38rem .55rem .38rem .68rem;font-size:.75rem;font-weight:800;cursor:pointer}
.bjv-root .bjv-active-chip b{font-size:.83rem}
.bjv-root .bjv-result-row{display:flex;justify-content:space-between;gap:14px;align-items:center;margin:0 0 11px;color:#657073;font-size:.82rem}
.bjv-root .bjv-result-row strong{color:var(--ink)}
.bjv-root .bjv-and-note{display:inline-flex;align-items:center;gap:.35rem}
.bjv-root .bjv-and-note:before{content:'UND';font-size:.58rem;letter-spacing:.06em;background:var(--ink);color:#fff;padding:.17rem .32rem;border-radius:5px}
.bjv-root .bjv-table-shell{border:1px solid var(--line);border-radius:17px;background:#fff;box-shadow:0 12px 35px rgba(48,54,56,.06);overflow:hidden}
.bjv-root .bjv-scroll-hint{display:none;padding:9px 13px;background:#fff6dc;color:#6f4d09;font-size:.77rem;border-bottom:1px solid #ecdca9}
.bjv-root .bjv-table-wrap{overflow:auto;max-height:78vh;scrollbar-color:var(--cyan2) #edf0ef}
.bjv-root table{border-collapse:separate;border-spacing:0;width:100%;min-width:3370px;font-size:.78rem;line-height:1.34}
.bjv-root th,.bjv-root td{padding:12px 10px;border-bottom:1px solid #e5e8e7;vertical-align:top;text-align:left}
.bjv-root thead th{position:sticky;top:0;background:var(--ink);color:#fff;z-index:4;font-size:.61rem;text-transform:uppercase;letter-spacing:.045em;white-space:nowrap}
.bjv-root thead th:first-child{left:0;z-index:7}
.bjv-root tbody th{position:sticky;left:0;background:#fff;z-index:3;min-width:280px;max-width:280px;box-shadow:9px 0 13px -13px rgba(0,0,0,.45)}
.bjv-root tbody th strong{font-size:.9rem;display:block}
.bjv-root tbody th small{display:block;color:#748083;font-weight:500;margin-top:.25rem;font-size:.68rem}
.bjv-root .bjv-table-brand{display:block;color:var(--cyan2);text-transform:uppercase;font-size:.63rem;letter-spacing:.085em;font-weight:800;margin-bottom:.1rem}
.bjv-root .bjv-mechanism-badge{display:inline-block;margin:.38rem 0 .04rem;border-radius:999px;padding:.25rem .48rem;font-size:.56rem;line-height:1;text-transform:uppercase;letter-spacing:.04em;font-weight:800}
.bjv-root .bjv-mechanism-badge.bjv-gas{background:var(--cyansoft);color:#23616a}
.bjv-root .bjv-mechanism-badge.bjv-other{background:#eef0f0;color:#657073}
.bjv-root .bjv-spring-group-start td,.bjv-root .bjv-spring-group-start th{border-top:3px solid #cfd5d4}
.bjv-root tbody tr:hover td,.bjv-root tbody tr:hover th{background:#f8fbfa}
.bjv-root .bjv-benchmark-row td,.bjv-root .bjv-benchmark-row th{background:var(--cyansoft)!important}
.bjv-root .bjv-status{display:inline-flex;align-items:flex-start;gap:.34rem;padding:.31rem .49rem;border-radius:9px;font-size:.72rem;font-weight:680;max-width:230px}
.bjv-root .bjv-status>span{font-weight:800;line-height:1.15}
.bjv-root .bjv-status.bjv-good{background:var(--greensoft);color:var(--green)}
.bjv-root .bjv-status.bjv-no{background:var(--redsoft);color:var(--red)}
.bjv-root .bjv-status.bjv-limited{background:var(--ambersoft);color:var(--amber)}
.bjv-root .bjv-status.bjv-unknown{background:#eff1f1;color:#687174}
.bjv-root .bjv-num{white-space:nowrap}
.bjv-root .bjv-num strong{font-size:.87rem}
.bjv-root .bjv-text-cell{display:block;max-width:265px;color:#596265}
.bjv-root .bjv-product-link{display:inline-flex;align-items:center;gap:.25rem;text-decoration:none;color:#fff;background:var(--cyan2);font-weight:800;white-space:nowrap;padding:.47rem .65rem;border-radius:9px}
.bjv-root .bjv-product-link:hover{background:#086d79}
.bjv-root .bjv-no-link{color:#a5adaf;font-weight:700}
.bjv-root .bjv-no-results{display:none;padding:42px;text-align:center;font-weight:700}
.bjv-root .bjv-no-results.bjv-show{display:block}
.bjv-root .bjv-hidden{display:none!important}
.bjv-root .bjv-legend{display:flex;flex-wrap:wrap;gap:10px 17px;margin-top:14px;font-size:.76rem;color:#657073}
.bjv-root .bjv-legend span{display:inline-flex;align-items:center;gap:.33rem}
.bjv-root .bjv-legend b{width:19px;height:19px;border-radius:6px;display:inline-grid;place-items:center}
.bjv-root .bjv-legend .bjv-lg-good b{background:var(--greensoft);color:var(--green)}
.bjv-root .bjv-legend .bjv-lg-limit b{background:var(--ambersoft);color:var(--amber)}
.bjv-root .bjv-legend .bjv-lg-no b{background:var(--redsoft);color:var(--red)}
.bjv-root .bjv-legend .bjv-lg-unknown b{background:#eff1f1;color:#687174}
.bjv-root .bjv-method{margin-top:22px;border-top:1px solid var(--line);padding-top:18px;display:grid;grid-template-columns:repeat(3,1fr);gap:13px}
.bjv-root .bjv-method-card{background:var(--paper);border-radius:13px;padding:15px}
.bjv-root .bjv-method-card strong{font-size:.82rem}
.bjv-root .bjv-method-card p{font-size:.77rem;color:#626c6f;margin:.45rem 0 0}
.bjv-root .bjv-footer{background:#202526;color:#d8dddd;padding:30px 0}
.bjv-root .bjv-footer strong{}
.bjv-root .bjv-footer p{font-size:.76rem;color:#aab2b3;margin:.35rem 0 0}
@media(max-width:980px){
.bjv-root .bjv-summary-grid{grid-template-columns:repeat(2,1fr)}
.bjv-root .bjv-intro{grid-template-columns:1fr}
.bjv-root .bjv-toolbar{grid-template-columns:1fr 1fr}
.bjv-root .bjv-search-wrap{grid-column:1/-1}
.bjv-root .bjv-multi-select{min-width:0}
}
@media(max-width:680px){
.bjv-root .bjv-wrap{width:min(100% - 24px,var(--max))}
.bjv-root .bjv-section{padding:0 0 52px}
.bjv-root .bjv-summary-grid{gap:9px}
.bjv-root .bjv-summary-card{padding:14px}
.bjv-root .bjv-summary-card strong{font-size:1.4rem}
.bjv-root .bjv-toolbar{grid-template-columns:1fr}
.bjv-root .bjv-search-wrap{grid-column:auto}
.bjv-root .bjv-sort-wrap select{min-width:0}
.bjv-root .bjv-multi-panel{left:0;right:auto;width:min(420px,calc(100vw - 24px))}
.bjv-root .bjv-scroll-hint{display:block}
.bjv-root .bjv-result-row{align-items:flex-start;flex-direction:column;gap:4px}
.bjv-root .bjv-method{grid-template-columns:1fr}
.bjv-root .bjv-table-wrap{max-height:72vh}
.bjv-root table{font-size:.74rem}
.bjv-root tbody th{min-width:205px;max-width:205px}
}
@media print{
.bjv-root .bjv-toolbar,.bjv-root .bjv-active-filters,.bjv-root .bjv-scroll-hint{display:none}
.bjv-root .bjv-table-wrap{overflow:visible;max-height:none}
.bjv-root table{min-width:0;font-size:5.5pt}
.bjv-root thead th,.bjv-root tbody th{position:static}
.bjv-root .bjv-section{padding:0 0 20px}
.bjv-root .bjv-method{display:none}
}
pas de classement par prixuniquement en position de stationnement verticaleSélection multiple avec opérateur « ET »
9Liste des ascenseurs à vélos
6Moteur électrique / ressort à gaz + trajectoire circulaire en premier
13Filtres combinables simultanément
Avant de comparer des pommes et des poires, fais une liste · définis des critères clairs
Caractéristiques techniques directement comparables
Seuls les produits à position de rangement verticale, répertoriés sur une page produit ou une page d'offre en allemand, sont inclus. Cette liste n'est pas exhaustive. Ça te permet de comparer rapidement et directement : « Quel élévateur à vélo convient aux vélos électriques lourds ? », « Quels modèles sont pivotants ? » et « De combien d'espace ai-je besoin ? »
Les deux pneus sont bien à plat ?
« OUI » signifie : les roues avant et arrière sont bien maintenues grâce à des supports ou des rails prévus à cet effet. Aucun pneu n'est en contact direct avec le mur, ce qui permet de protéger celui-ci des traces de pneus.
9 produits sur 9 sont visiblesTous les critères cochés doivent être remplis
Fais glisser le tableau sur le côté. La colonne « Produits » reste visible.
| Ascenseur à vélos | Fabriqué en Allemagne ? | Système de sécurité anti-relâchement ? | capacité de charge max. | Largeur maximale des pneus | Longueur du vélo jusqu'à | orientable ? | Garde-boue / feu arrière ? | Les deux pneus sont-ils bien au ras du cadre ? | Assemblage | Délai de livraison actuel | Avis Google | Montage décalé en hauteur ? | Peut-on garer les vélos plus près les uns des autres en les décalant en hauteur ? | Distance minimale dans la rangée | Voir le produit |
|
BicycleJack
Basic
Ressort à gaz + trajectoire circulaire
Allemagne
|
✓OUI |
✓OUI– manuellement |
31 kg |
130 mm |
220 cm |
×NON |
✓OUI |
×NON |
prémonté à environ 99 % |
✓Prêt à être expédiésous 1 à 3 jours |
✓4,90 / 5 |
✓OUI– haut/bas |
✓OUI |
35 cm |
Retour à la page d'accueil ↗ |
|
BicycleJack
Twist
Ressort à gaz + trajectoire circulaire
Allemagne
|
✓OUI |
✓OUI– automatiquement |
38 kg |
130 mm |
220 cm |
✓OUI– plus de 90° à gauche/à droite |
✓OUI |
✓OUI |
pré-assemblé à environ 95 % |
✓Prêt à être expédiésous 1 à 3 jours |
✓4,90 / 5 |
✓OUI– haut/bas |
✓OUI |
35 cm |
À propos du Twist ↗ |
|
BicycleJack
Puissance
Moteur électrique + circuit
Allemagne
|
✓OUI |
✓OUI– automatiquement |
50 kg |
130 mm |
220 cm |
✓OUI– 90° à gauche/à droite |
✓OUI |
✓OUI |
prémonté à environ 99 % |
✓Prêt à être expédiédans 14 jours |
✓4,90 / 5 |
✓OUI– haut/bas |
✓OUI |
35 cm |
Vers la puissance ↗ |
|
VelowUp !
4.0
Ressort à gaz + trajectoire circulaire
Pays-Bas
|
×NON– Pays-Bas |
×NON |
35 kg |
60 mm |
220 cm |
✓OUI– 90° à gauche/à droite |
non spécifié |
×NON |
L'article est livré en pièces détachées ; un montage complet est nécessaire |
✓disponible tout de suite |
–— |
✓OUI– haut/bas |
✓OUI |
30 cm (35 cm recommandé) |
— |
|
Wheely Mobility
Wheelylift / GO-UP W
Ressort à gaz + trajectoire circulaire
Pays-Bas
|
×NON– Pays-Bas |
×NON |
35 kg |
non chiffré |
non chiffré |
✓OUI |
non spécifié |
×NON |
Niveau de pré-assemblage non précisé |
– nonindiqué |
–— |
✓OUI– haut/bas |
✓OUI |
non chiffré |
— |
|
STEIN HGS
Support mural « Milan »
Ressort à gaz + mouvement circulaire
non indiqué
|
– nonindiqué |
×NON |
30 kg |
non chiffré |
non chiffré |
×NON |
non spécifié |
×NON |
Niveau de pré-assemblage non précisé |
◐1 à 3semaines |
–— |
✓OUI– haut/bas |
✓OUI |
40 cm |
— |
|
Biohort
BikeLift
mécanisme à ressort
Autriche
|
×NON– Autriche |
×NON |
30 kg |
77 mm |
195 cm |
◐FACULTATIF |
×NON |
×NON |
Niveau de pré-assemblage non précisé |
◐dans un délai de10 jours ouvrés |
–— |
×NON |
×NON |
Largeur du guidon : au moins 65 cm |
— |
|
PARKIS
VTT
mécanisme à ressort
Lituanie
|
×NON– Lituanie |
×NON |
30 kg |
77 mm |
non chiffré |
×NON |
×NON |
×NON |
Niveau de pré-assemblage non précisé |
◐3 à 8jours |
–— |
×NON |
×NON |
Largeur du guidon : au moins 65 cm |
— |
|
Cranit, Handler, etc.
par exemple WS5, ABL12 et d'autres modèles de conception identique
mécanisme à ressort
Chine
|
×NON– Chine |
×NON |
32 kg |
80 mm |
non chiffré |
×NON |
×NON |
×NON |
L'article est livré en pièces détachées ; un montage complet est nécessaire |
✓Prêt à être expédiésous 1 à 3 jours ouvrés |
–— |
×NON |
×NON |
Largeur du guidon : au moins 65 cm |
— |
On n'a trouvé aucun produit correspondant à cette combinaison.
✓ confirmé / oui◐ limité / facultatif× non– pas clairement publié
OrdreLes cinq produits équipés d'un ressort à gaz et d'un mécanisme circulaire viennent en premier. D'autres produits suivront ensuite, dotés de mécanismes à ressort simples.
sécurité de levageLorsqu'il n'y a pas de dispositif de sécurité distinct pour empêcher tout mouvement involontaire du bras de levage à vide, ou lorsque ce dispositif n'est pas indiqué, la réponse est systématiquement « NON ».
Distance minimalePour les ascenseurs à vélos équipés de simples mécanismes à ressort (montée et descente sans mouvement circulaire), on tient compte de la largeur du guidon sans compter l'espace nécessaire pour le stationnement en hauteur ou en profondeur : au moins 65 cm.
(function () {
document.querySelectorAll('.bjv-root').forEach(function (root) {
if (root.dataset.bjvReady) return;
root.dataset.bjvReady = '1';
(() => {
const tbody = root.querySelector('#bjv-comparisonTable tbody');
const rows = [...tbody.querySelectorAll('.bjv-product-row')];
const checks = [...root.querySelectorAll('.bjv-check-option input')];
const trigger = root.querySelector('#bjv-multiTrigger');
const panel = root.querySelector('#bjv-multiPanel');
const clearBtn = root.querySelector('#bjv-clearFilters');
const search = root.querySelector('#bjv-search');
const sort = root.querySelector('#bjv-sort');
const activeBox = root.querySelector('#bjv-activeFilters');
const count = root.querySelector('#bjv-resultCount');
const selectedCount = root.querySelector('#bjv-selectedCount');
const noResults = root.querySelector('#bjv-noResults');
const labelMap = new Map(checks.map(c => [c.value, c.closest('label').innerText.trim()]));
function selected() { return checks.filter(c => c.checked).map(c => c.value); }
function rank(row) { return row.dataset.gasarc === '1' ? 0 : 1; }
function testCriterion(row, key) {
if (key === 'gasarc') return row.dataset.gasarc === '1';
if (key === 'bicyclejack') return row.dataset.bicyclejack === '1';
if (key === 'made') return row.dataset.made === '1';
if (key === 'hub') return row.dataset.hub === '1';
if (key === 'weight35') return Number(row.dataset.weight) >= 35;
if (key === 'tire100') return Number(row.dataset.tire) >= 100;
if (key === 'length220') return Number(row.dataset.length) >= 220;
if (key === 'swivel') return row.dataset.swivel === '1';
if (key === 'fender') return row.dataset.fender === '1';
if (key === 'wheelwall') return row.dataset.wheelwall === '1';
if (key === 'fast') return row.dataset.fast === '1';
if (key === 'staggerinstall') return row.dataset.staggerinstall === '1';
if (key === 'staggerpark') return row.dataset.staggerpark === '1';
return true;
}
function passes(row) {
const q = search.value.trim().toLocaleLowerCase('de');
if (q && !row.dataset.search.includes(q)) return false;
return selected().every(key => testCriterion(row, key));
}
function compareWithinGroup(a,b) {
if (sort.value === 'brand') return a.dataset.search.localeCompare(b.dataset.search, 'de');
if (sort.value === 'weight') return Number(b.dataset.weight)-Number(a.dataset.weight) || Number(a.dataset.index)-Number(b.dataset.index);
if (sort.value === 'tire') return Number(b.dataset.tire)-Number(a.dataset.tire) || Number(a.dataset.index)-Number(b.dataset.index);
if (sort.value === 'length') return Number(b.dataset.length)-Number(a.dataset.length) || Number(a.dataset.index)-Number(b.dataset.index);
return Number(a.dataset.index)-Number(b.dataset.index);
}
function sorter(a,b) { const rd = rank(a)-rank(b); return rd || compareWithinGroup(a,b); }
function renderChips(keys) {
activeBox.innerHTML = '';
if (!keys.length) { activeBox.innerHTML = '
Keine Merkmale ausgewählt – alle Produkte werden gezeigt.'; return; }
const label = document.createElement('span'); label.className='bjv-active-label'; label.textContent='Aktiv:'; activeBox.appendChild(label);
keys.forEach(key => {
const button=document.createElement('button'); button.type='button'; button.className='bjv-active-chip'; button.dataset.remove=key;
button.innerHTML=`
${labelMap.get(key)}×`; button.setAttribute('aria-label',`${labelMap.get(key)} entfernen`); activeBox.appendChild(button);
});
}
function render() {
rows.sort(sorter).forEach(r => tbody.appendChild(r));
let visible=0; rows.forEach(row => { const show=passes(row); row.classList.toggle('bjv-hidden',!show); if(show) visible++; });
const keys=selected(); count.textContent=visible; selectedCount.textContent=keys.length; selectedCount.hidden=keys.length===0; noResults.classList.toggle('bjv-show',visible===0); renderChips(keys);
}
function setPanel(open) { panel.classList.toggle('bjv-open',open); trigger.setAttribute('aria-expanded',String(open)); }
trigger.addEventListener('click',()=>setPanel(!panel.classList.contains('bjv-open')));
checks.forEach(c=>c.addEventListener('change',render));
clearBtn.addEventListener('click',()=>{ checks.forEach(c=>c.checked=false); render(); });
search.addEventListener('input',render); sort.addEventListener('change',render);
activeBox.addEventListener('click',event=>{ const button=event.target.closest('[data-remove]'); if(!button) return; const input=checks.find(c=>c.value===button.dataset.remove); if(input) input.checked=false; render(); });
document.addEventListener('click',event=>{ if(!event.target.closest('.bjv-multi-select')) setPanel(false); });
document.addEventListener('keydown',event=>{ if(event.key==='Escape'){setPanel(false);trigger.focus();} });
render();
})();
});
})();