Home
›
Brands
›
7th Floor
7th Floor
7th Floor is an American manufacturer based in Colorado, known for desktop vaporizers with whip-style systems. The Silver Surfer Vaporizer (SSV) and Da Buddha are desktop classics — robust, long-lasting devices with ceramic heating elements and glass components.
Price Comparison
7th Floor Preise, Shops und Filter werden erst bei Bedarf geladen. So bleibt der erste Seitenaufbau deutlich leichter.
About 7th Floor
7th Floor is an American manufacturer based in Colorado, known for desktop vaporizers with whip-style systems. The Silver Surfer Vaporizer (SSV) and Da Buddha are desktop classics — robust, long-lasting devices with ceramic heating elements and glass components. Handcrafted in the USA for over 15 years.
×
Price History (30 Days)
Price history is being recorded. Check back in a few days!
7th Floor Vaporizers Overview
7th Floor is a vaporizer manufacturer from USA. Vapochecker lists 6 vaporizers and 33 accessories from 7th Floor, available at 38 shops. Prices range from €94.90 to €331.90. The lineup includes 1 portable devices, 4 desktop devices, heating methods: conduction, convection.
Where to Buy 7th Floor
7th Floor vaporizers are available at 38 shops. Compare prices and shipping costs to find the best deal.
';
} else if (d.shops > 0) {
metaHtml = '';
}
var priceHtml = d.price
? '' + priceLabel + ' \u20AC' + d.price + '
'
: '';
card.innerHTML = '' + imgHtml + '
' + nameHtml + ' ' + metaHtml + priceHtml;
return card;
}
function renderAllDeferred() {
if (accRenderedIdx >= accDeferredData.length) return;
var frag = document.createDocumentFragment();
for (var i = accRenderedIdx; i < accDeferredData.length; i++) {
frag.appendChild(renderAccCard(accDeferredData[i]));
}
if (accSentinel && accSentinel.parentNode) {
accGrid.insertBefore(frag, accSentinel);
} else {
accGrid.appendChild(frag);
}
accRenderedIdx = accDeferredData.length;
if (accSentinel) accSentinel.remove();
var lmBtn = document.getElementById('vc-acc-load-more');
if (lmBtn) lmBtn.style.display = 'none';
}
// Load more button
var loadMoreBtn = document.getElementById('vc-acc-load-more');
if (loadMoreBtn && accDeferredData.length > 0) {
loadMoreBtn.addEventListener('click', function() {
renderAllDeferred();
generateAccTable();
filterAccessories();
});
}
// Build table rows from all grid cards (lazy, on first table toggle)
var accTableGenerated = false;
function generateAccTable() {
accTableGenerated = true;
var tbody = document.getElementById('vc-acc-tbody');
if (!tbody || !accPanel) return;
var cards = accPanel.querySelectorAll('.vc-accessory-card');
if (cards.length === 0) return;
var frag = document.createDocumentFragment();
cards.forEach(function(card) {
var tr = document.createElement('tr');
tr.dataset.type = card.dataset.type || '';
tr.dataset.name = (card.dataset.accName || '').toLowerCase();
tr.style.cursor = 'pointer';
var img = card.dataset.accImage || '';
var name = card.dataset.accName || '';
var typeLabel = card.dataset.accType || '';
var priceEl = card.querySelector('.vc-product-price');
var priceText = priceEl ? priceEl.textContent.replace(/^\s+|\s+$/g, '').replace(/^[a-zA-Z\u00e0-\u024f\s]+/, '').trim() : '-';
if (!priceText) priceText = '-';
var shopEl = card.querySelector('.vc-product-shops');
var shopCount = shopEl ? shopEl.textContent.replace(/[^0-9]/g, '') : '0';
var imgHtml = img ? ' ' : '';
tr.innerHTML = '' + imgHtml + ' ' + name.replace(/ ' +
'' + typeLabel.replace(/ ' +
'' + priceText + ' ' +
'' + shopCount + ' ';
frag.appendChild(tr);
});
tbody.innerHTML = '';
tbody.appendChild(frag);
}
// Accessories Search + Type Filter (Multi-Select Checkbox)
var accSearchInput = document.getElementById('vc-acc-search');
const filterToggle = document.getElementById('vc-filter-toggle');
const filterDropdown = document.getElementById('vc-filter-dropdown');
const filterCount = document.getElementById('vc-filter-count');
const accPanel = document.querySelector('[data-panel="accessories"]');
let selectedTypes = [];
function filterAccessories() {
if (!accPanel) return;
const searchTerm = (accSearchInput ? accSearchInput.value : '').toLowerCase().trim();
// If filtering, render all deferred cards first
if ((searchTerm || selectedTypes.length > 0) && accRenderedIdx < accDeferredData.length) {
renderAllDeferred();
generateAccTable();
}
const allSelected = selectedTypes.length === 0;
let visibleCount = 0;
// Filter grid cards
accPanel.querySelectorAll('.vc-accessory-card').forEach(card => {
const cardType = card.dataset.type || '';
const cardName = (card.dataset.name || '').toLowerCase();
const matchesType = allSelected || selectedTypes.includes(cardType);
const matchesSearch = !searchTerm || cardName.includes(searchTerm);
const isVisible = matchesType && matchesSearch;
card.style.display = isVisible ? '' : 'none';
if (isVisible) visibleCount++;
});
// Filter table rows
accPanel.querySelectorAll('.vc-acc-table tbody tr').forEach(row => {
const rowType = row.dataset.type || '';
const rowName = (row.dataset.name || '').toLowerCase();
const matchesType = allSelected || selectedTypes.includes(rowType);
const matchesSearch = !searchTerm || rowName.includes(searchTerm);
const isVisible = matchesType && matchesSearch;
row.classList.toggle('vc-filtered-out', !isVisible);
});
// Update count display
if (filterCount) {
filterCount.textContent = '(' + visibleCount + ')';
}
// Show/hide no results message
const noResults = accPanel.querySelector('.vc-acc-no-results');
if (noResults) {
noResults.style.display = visibleCount === 0 ? 'block' : 'none';
}
}
// Search input with debounce
if (accSearchInput) {
var accDebounceTimer;
accSearchInput.addEventListener('input', function() {
clearTimeout(accDebounceTimer);
accDebounceTimer = setTimeout(filterAccessories, 150);
});
}
// Trigger initial filter if search is pre-filled via ?q= parameter
if (accSearchInput && accSearchInput.value.trim()) {
filterAccessories();
}
// Filter dropdown toggle
if (filterToggle && filterDropdown) {
filterToggle.addEventListener('click', function(e) {
e.stopPropagation();
filterDropdown.classList.toggle('open');
filterToggle.classList.toggle('active');
});
// Close on outside click
document.addEventListener('click', function(e) {
if (!filterDropdown.contains(e.target) && e.target !== filterToggle) {
filterDropdown.classList.remove('open');
filterToggle.classList.remove('active');
}
});
// Checkbox handling
const allCheckbox = filterDropdown.querySelector('input[data-all]');
const typeCheckboxes = filterDropdown.querySelectorAll('input:not([data-all])');
if (allCheckbox) {
allCheckbox.addEventListener('change', function() {
if (this.checked) {
typeCheckboxes.forEach(cb => cb.checked = false);
selectedTypes = [];
var label = filterToggle.querySelector('.vc-filter-label');
if (label) label.textContent = 'All Types';
}
filterAccessories();
});
}
if (typeCheckboxes && typeCheckboxes.length > 0) {
typeCheckboxes.forEach(cb => {
cb.addEventListener('change', function() {
// Update selected types
selectedTypes = Array.from(typeCheckboxes)
.filter(c => c.checked)
.map(c => c.value);
// Update "All" checkbox
if (allCheckbox) allCheckbox.checked = selectedTypes.length === 0;
// Update label
var label = filterToggle.querySelector('.vc-filter-label');
if (label) {
if (selectedTypes.length === 0) {
label.textContent = 'All Types';
} else if (selectedTypes.length === 1) {
var spanText = this.parentElement.querySelector('span');
label.textContent = spanText ? spanText.textContent.split(' (')[0] : selectedTypes[0];
} else {
label.textContent = selectedTypes.length + ' Typen';
}
}
filterAccessories();
});
});
}
}
// Accessory Card Click → Modal with Price Chart
var goToShopText = "Go to Shop";
var apiBase = "https:\/\/vapochecker.com\/wp-json\/vapochecker\/v1\/accessory-history\/";
var modal = document.getElementById('vc-acc-modal');
var accChartInstance = null;
if (modal) {
var modalName = document.getElementById('vc-modal-name');
var modalImage = document.getElementById('vc-modal-image');
var modalType = document.getElementById('vc-modal-type');
var modalShops = document.getElementById('vc-modal-shops');
var chartWrap = document.getElementById('vc-modal-chart-wrap');
var chartEmpty = document.getElementById('vc-modal-chart-empty');
var chartCanvas = document.getElementById('vc-acc-chart');
var closeBtn = modal.querySelector('.vc-acc-modal-close');
function loadChartJs(cb) {
if (typeof Chart !== 'undefined') { cb(); return; }
if (window._vcChartLoading) {
var check = setInterval(function() { if (typeof Chart !== 'undefined') { clearInterval(check); cb(); } }, 50);
return;
}
window._vcChartLoading = true;
var s = document.createElement('script');
s.src = 'https://cdn.jsdelivr.net/npm/[email protected] /dist/chart.umd.min.js';
s.onload = cb;
document.head.appendChild(s);
}
function renderAccChart(data) {
if (accChartInstance) { accChartInstance.destroy(); accChartInstance = null; }
chartCanvas.style.display = '';
chartEmpty.style.display = 'none';
var dates = [...new Set(data.map(function(d) { return d.date; }))].sort();
if (dates.length < 2) {
chartCanvas.style.display = 'none';
chartEmpty.style.display = 'block';
return;
}
var shopData = {};
data.forEach(function(d) {
if (!shopData[d.shop]) shopData[d.shop] = {};
shopData[d.shop][d.date] = parseFloat(d.price);
});
var colors = ['#3b82f6','#10b981','#f59e0b','#ef4444','#8b5cf6','#ec4899','#06b6d4','#84cc16'];
var datasets = Object.keys(shopData).slice(0, 8).map(function(shop, i) {
return {
label: shop,
data: dates.map(function(d) { return shopData[shop][d] || null; }),
borderColor: colors[i % colors.length],
backgroundColor: colors[i % colors.length],
tension: 0.3, fill: false, pointRadius: 3, spanGaps: true
};
});
accChartInstance = new Chart(chartCanvas, {
type: 'line',
data: { labels: dates, datasets: datasets },
options: {
responsive: true, maintainAspectRatio: false,
interaction: { intersect: false, mode: 'index' },
scales: { y: { ticks: { callback: function(v) { return v + ' \u20AC'; } } } },
plugins: { legend: { position: 'bottom', labels: { boxWidth: 12, font: { size: 11 } } },
tooltip: { callbacks: { label: function(ctx) { return ctx.dataset.label + ': ' + ctx.parsed.y.toFixed(2) + ' €'; } } } }
}
});
}
function fetchAccHistory(accId) {
chartCanvas.style.display = 'none';
chartEmpty.style.display = 'none';
fetch(apiBase + accId + '?days=30')
.then(function(r) { return r.json(); })
.then(function(data) {
if (!data || !data.length) { chartCanvas.style.display = 'none'; chartEmpty.style.display = 'block'; return; }
loadChartJs(function() { renderAccChart(data); });
})
.catch(function() { chartCanvas.style.display = 'none'; chartEmpty.style.display = 'block'; });
}
function openAccModal(card) {
var name = card.dataset.accName;
var image = card.dataset.accImage;
var type = card.dataset.accType;
var accId = card.dataset.accId;
var shops = [];
try { shops = JSON.parse(card.dataset.accShops || '[]'); } catch(e) {}
modalName.textContent = name;
modalType.textContent = type;
modalType.style.display = type ? '' : 'none';
modalImage.innerHTML = image
? ' '
: ' ';
var html = '';
shops.forEach(function(s) {
var priceFormatted = '\u20AC' + s.price.toFixed(2).replace('.', ',');
var logoHtml = s.logo
? ' '
: '';
var btnHtml = s.url
? '' +
' ' +
goToShopText + ' '
: '';
html += '' + logoHtml +
'
' + s.name + ' ' +
'' + s.country + '
' +
'' + priceFormatted + ' ' +
'' + btnHtml + ' ';
});
modalShops.innerHTML = html;
modal.style.display = 'flex';
document.body.style.overflow = 'hidden';
// Fetch and render price history chart
if (accId) fetchAccHistory(accId);
}
function closeAccModal() {
modal.style.display = 'none';
document.body.style.overflow = '';
if (accChartInstance) { accChartInstance.destroy(); accChartInstance = null; }
}
// Event delegation for grid card clicks (works for lazy-loaded cards)
if (accGrid) {
accGrid.addEventListener('click', function(e) {
var card = e.target.closest('.vc-accessory-card.vc-clickable');
if (card) openAccModal(card);
});
}
// Event delegation for table row clicks
var accTable = document.getElementById('vc-acc-table');
if (accTable) {
accTable.addEventListener('click', function(e) {
var row = e.target.closest('tbody tr');
if (!row) return;
var nameEl = row.querySelector('.vc-acc-table-name');
if (!nameEl) return;
var accName = nameEl.textContent.trim();
var matchingCard = document.querySelector('.vc-accessory-card[data-acc-name="' + CSS.escape(accName) + '"]');
if (matchingCard) openAccModal(matchingCard);
});
}
closeBtn.addEventListener('click', closeAccModal);
modal.addEventListener('click', function(e) {
if (e.target === modal) closeAccModal();
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && modal.style.display !== 'none') closeAccModal();
});
}
})();