/* ===== ASIC MINER COMPARISON TOOL STYLES ===== */
@import url(‘https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=Barlow+Condensed:wght@600;700&display=swap’);
.mc-compare {
–mc-bg-primary: #0D0D0D;
–mc-bg-secondary: #1E1E2E;
–mc-bg-tertiary: #242432;
–mc-accent: #FF6E00;
–mc-accent-glow: rgba(255, 110, 0, 0.15);
–mc-accent-glow-strong: rgba(255, 110, 0, 0.35);
–mc-text-primary: #E8E8E8;
–mc-text-secondary: #8A8A8A;
–mc-border: #333333;
–mc-border-subtle: #2A2A2A;
–mc-green: #10B981;
–mc-red: #EF4444;
–mc-blue: #3B82F6;
–mc-purple: #A855F7;
–mc-yellow: #F59E0B;
–mc-terminal-bg: #0A0A0A;
–mc-font-body: ‘Inter’, -apple-system, BlinkMacSystemFont, sans-serif;
–mc-font-mono: ‘JetBrains Mono’, ‘Fira Code’, ‘Consolas’, monospace;
–mc-font-heading: ‘Barlow Condensed’, ‘Inter’, sans-serif;
max-width: 1400px;
margin: 0 auto;
padding: 0 16px 80px;
font-family: var(–mc-font-body);
color: var(–mc-text-primary);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.mc-compare *,
.mc-compare *::before,
.mc-compare *::after {
box-sizing: border-box;
}
/* —- Intro Section —- */
.mc-intro {
margin-bottom: 32px;
padding-bottom: 24px;
border-bottom: 1px solid var(–mc-border-subtle);
}
.mc-intro h2 {
font-family: var(–mc-font-heading);
font-size: clamp(1.75rem, 4vw, 2.5rem);
font-weight: 700;
color: var(–mc-text-primary);
margin: 0 0 8px 0;
text-transform: uppercase;
letter-spacing: 0.5px;
line-height: 1.2;
}
.mc-intro .mc-terminal-tag {
font-family: var(–mc-font-mono);
font-size: 0.8rem;
color: var(–mc-accent);
margin-bottom: 20px;
display: block;
}
.mc-intro .mc-terminal-tag::before {
content: ‘> ‘;
opacity: 0.6;
}
.mc-intro p {
font-size: 1rem;
color: var(–mc-text-secondary);
margin: 0 0 12px 0;
max-width: 860px;
line-height: 1.7;
}
.mc-intro p strong {
color: var(–mc-text-primary);
}
.mc-intro p a {
color: var(–mc-accent);
text-decoration: none;
}
.mc-intro p a:hover {
text-decoration: underline;
}
.mc-intro .mc-disclaimer {
font-size: 0.85rem;
font-style: italic;
color: var(–mc-text-secondary);
margin-top: 16px;
opacity: 0.8;
}
/* —- Stats Summary —- */
.mc-stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
margin-bottom: 24px;
}
.mc-stat-card {
background: var(–mc-bg-secondary);
border: 1px solid var(–mc-border-subtle);
border-radius: 8px;
padding: 20px;
text-align: center;
}
.mc-stat-card .mc-stat-value {
font-family: var(–mc-font-mono);
font-size: clamp(1.25rem, 2.5vw, 1.75rem);
font-weight: 700;
color: var(–mc-accent);
display: block;
margin-bottom: 4px;
}
.mc-stat-card .mc-stat-label {
font-size: 0.8rem;
color: var(–mc-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* —- Filter Bar —- */
.mc-filter-bar {
background: var(–mc-bg-secondary);
border: 1px solid var(–mc-border);
border-radius: 8px;
padding: 20px;
margin-bottom: 24px;
position: sticky;
top: 0;
z-index: 100;
transition: box-shadow 0.3s ease;
}
.mc-filter-bar.mc-stuck {
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
border-color: var(–mc-accent);
border-width: 1px 1px 2px 1px;
}
.mc-filter-row {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: flex-end;
}
.mc-filter-group {
display: flex;
flex-direction: column;
gap: 4px;
flex: 1 1 160px;
min-width: 140px;
}
.mc-filter-group.mc-filter-search {
flex: 1 1 220px;
}
.mc-filter-group label {
font-size: 0.7rem;
color: var(–mc-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 600;
}
.mc-filter-group select,
.mc-filter-group input[type=”text”] {
background: var(–mc-terminal-bg);
border: 1px solid var(–mc-border);
border-radius: 4px;
color: var(–mc-text-primary);
font-family: var(–mc-font-body);
font-size: 0.85rem;
padding: 8px 12px;
outline: none;
transition: border-color 0.2s ease;
width: 100%;
}
.mc-filter-group select:focus,
.mc-filter-group input[type=”text”]:focus {
border-color: var(–mc-accent);
}
.mc-filter-group select option {
background: var(–mc-terminal-bg);
color: var(–mc-text-primary);
}
/* Price range slider */
.mc-price-range-wrap {
display: flex;
flex-direction: column;
gap: 4px;
flex: 1 1 220px;
min-width: 200px;
}
.mc-price-range-wrap label {
font-size: 0.7rem;
color: var(–mc-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 600;
}
.mc-price-range-display {
font-family: var(–mc-font-mono);
font-size: 0.8rem;
color: var(–mc-accent);
margin-bottom: 2px;
}
.mc-range-slider-container {
position: relative;
height: 30px;
width: 100%;
}
.mc-range-slider-container input[type=”range”] {
-webkit-appearance: none;
appearance: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 30px;
background: transparent;
pointer-events: none;
outline: none;
margin: 0;
padding: 0;
}
.mc-range-slider-container input[type=”range”]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 18px;
height: 18px;
border-radius: 50%;
background: var(–mc-accent);
cursor: pointer;
pointer-events: all;
border: 2px solid var(–mc-bg-primary);
box-shadow: 0 0 6px var(–mc-accent-glow-strong);
position: relative;
z-index: 2;
}
.mc-range-slider-container input[type=”range”]::-moz-range-thumb {
width: 18px;
height: 18px;
border-radius: 50%;
background: var(–mc-accent);
cursor: pointer;
pointer-events: all;
border: 2px solid var(–mc-bg-primary);
box-shadow: 0 0 6px var(–mc-accent-glow-strong);
}
.mc-range-slider-container input[type=”range”]::-webkit-slider-runnable-track {
height: 4px;
background: var(–mc-border);
border-radius: 2px;
}
.mc-range-slider-container input[type=”range”]::-moz-range-track {
height: 4px;
background: var(–mc-border);
border-radius: 2px;
}
.mc-range-track {
position: absolute;
top: 13px;
left: 0;
right: 0;
height: 4px;
background: var(–mc-border);
border-radius: 2px;
z-index: 0;
}
.mc-range-track-active {
position: absolute;
top: 13px;
height: 4px;
background: var(–mc-accent);
border-radius: 2px;
z-index: 1;
}
/* Stock toggle */
.mc-filter-toggle {
display: flex;
flex-direction: column;
gap: 4px;
flex: 0 0 auto;
}
.mc-filter-toggle label {
font-size: 0.7rem;
color: var(–mc-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 600;
}
.mc-toggle-switch {
display: flex;
align-items: center;
gap: 8px;
height: 36px;
cursor: pointer;
user-select: none;
}
.mc-toggle-switch input {
display: none;
}
.mc-toggle-track {
width: 40px;
height: 22px;
background: var(–mc-border);
border-radius: 11px;
position: relative;
transition: background 0.2s ease;
flex-shrink: 0;
}
.mc-toggle-switch input:checked + .mc-toggle-track {
background: var(–mc-accent);
}
.mc-toggle-track::after {
content: ”;
position: absolute;
top: 3px;
left: 3px;
width: 16px;
height: 16px;
background: #fff;
border-radius: 50%;
transition: transform 0.2s ease;
}
.mc-toggle-switch input:checked + .mc-toggle-track::after {
transform: translateX(18px);
}
.mc-toggle-label {
font-size: 0.8rem;
color: var(–mc-text-secondary);
white-space: nowrap;
}
/* Reset & results count */
.mc-filter-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(–mc-border-subtle);
}
.mc-results-count {
font-family: var(–mc-font-mono);
font-size: 0.8rem;
color: var(–mc-text-secondary);
}
.mc-results-count strong {
color: var(–mc-accent);
}
.mc-btn-reset {
background: transparent;
border: 1px solid var(–mc-border);
color: var(–mc-text-secondary);
font-family: var(–mc-font-body);
font-size: 0.8rem;
padding: 6px 16px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
}
.mc-btn-reset:hover {
border-color: var(–mc-accent);
color: var(–mc-accent);
}
/* —- Sort Controls —- */
.mc-sort-bar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-bottom: 20px;
font-size: 0.8rem;
}
.mc-sort-label {
color: var(–mc-text-secondary);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
font-size: 0.7rem;
}
.mc-sort-btn {
background: var(–mc-bg-secondary);
border: 1px solid var(–mc-border);
color: var(–mc-text-secondary);
padding: 6px 14px;
border-radius: 4px;
cursor: pointer;
font-family: var(–mc-font-body);
font-size: 0.8rem;
transition: all 0.2s ease;
white-space: nowrap;
}
.mc-sort-btn:hover {
border-color: var(–mc-accent);
color: var(–mc-text-primary);
}
.mc-sort-btn.mc-sort-active {
background: var(–mc-accent);
border-color: var(–mc-accent);
color: #fff;
}
.mc-sort-btn .mc-sort-arrow {
margin-left: 4px;
font-size: 0.7rem;
}
/* —- Miner Cards Grid —- */
.mc-cards-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 20px;
margin-bottom: 32px;
}
.mc-miner-card {
background: var(–mc-bg-secondary);
border: 1px solid var(–mc-border);
border-radius: 8px;
padding: 20px;
transition: all 0.3s ease;
opacity: 1;
animation: mc-fadeIn 0.3s ease;
display: flex;
flex-direction: column;
}
@keyframes mc-fadeIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.mc-miner-card:hover {
border-color: var(–mc-accent);
box-shadow: 0 4px 20px var(–mc-accent-glow);
transform: translateY(-2px);
}
.mc-miner-card.mc-card-selected {
border-color: var(–mc-accent);
box-shadow: 0 0 12px var(–mc-accent-glow);
}
/* Card header */
.mc-card-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 12px;
gap: 8px;
}
.mc-card-name {
font-family: var(–mc-font-heading);
font-size: 1.15rem;
font-weight: 700;
color: var(–mc-text-primary);
text-decoration: none;
line-height: 1.3;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.mc-card-name:hover {
color: var(–mc-accent);
}
.mc-card-badges {
display: flex;
gap: 6px;
flex-wrap: wrap;
margin-bottom: 12px;
}
.mc-badge {
font-size: 0.65rem;
font-weight: 600;
padding: 3px 8px;
border-radius: 3px;
text-transform: uppercase;
letter-spacing: 0.5px;
white-space: nowrap;
}
.mc-badge-opensource {
background: rgba(16, 185, 129, 0.15);
color: var(–mc-green);
border: 1px solid rgba(16, 185, 129, 0.3);
}
.mc-badge-asic {
background: rgba(59, 130, 246, 0.15);
color: var(–mc-blue);
border: 1px solid rgba(59, 130, 246, 0.3);
}
.mc-badge-heater {
background: rgba(255, 110, 0, 0.15);
color: var(–mc-accent);
border: 1px solid rgba(255, 110, 0, 0.3);
}
.mc-badge-custom {
background: rgba(168, 85, 247, 0.15);
color: var(–mc-purple);
border: 1px solid rgba(168, 85, 247, 0.3);
}
.mc-badge-algo {
background: rgba(255, 255, 255, 0.05);
color: var(–mc-text-secondary);
border: 1px solid var(–mc-border);
}
.mc-card-desc {
font-size: 0.8rem;
color: var(–mc-text-secondary);
margin-bottom: 16px;
line-height: 1.5;
flex: 0 0 auto;
}
/* Specs grid */
.mc-specs-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px;
margin-bottom: 16px;
flex: 1 0 auto;
}
.mc-spec-item {
background: var(–mc-terminal-bg);
border: 1px solid var(–mc-border-subtle);
border-radius: 4px;
padding: 8px 10px;
text-align: center;
}
.mc-spec-value {
font-family: var(–mc-font-mono);
font-size: 0.95rem;
font-weight: 600;
color: var(–mc-text-primary);
display: block;
line-height: 1.2;
}
.mc-spec-label {
font-size: 0.65rem;
color: var(–mc-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 2px;
display: block;
}
/* Card footer */
.mc-card-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 10px;
margin-top: auto;
padding-top: 16px;
border-top: 1px solid var(–mc-border-subtle);
}
.mc-card-price-section {
display: flex;
flex-direction: column;
gap: 4px;
}
.mc-card-price {
font-family: var(–mc-font-mono);
font-size: 1.35rem;
font-weight: 700;
color: var(–mc-accent);
}
.mc-card-price-contact {
font-family: var(–mc-font-mono);
font-size: 0.9rem;
font-weight: 600;
color: var(–mc-text-secondary);
}
.mc-stock-indicator {
display: flex;
align-items: center;
gap: 5px;
font-size: 0.7rem;
font-weight: 600;
}
.mc-stock-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.mc-stock-instock .mc-stock-dot { background: var(–mc-green); }
.mc-stock-instock { color: var(–mc-green); }
.mc-stock-onbackorder .mc-stock-dot { background: var(–mc-yellow); }
.mc-stock-onbackorder { color: var(–mc-yellow); }
.mc-stock-outofstock .mc-stock-dot { background: var(–mc-red); }
.mc-stock-outofstock { color: var(–mc-red); }
.mc-card-actions {
display: flex;
align-items: center;
gap: 10px;
}
.mc-compare-check {
display: flex;
align-items: center;
gap: 5px;
cursor: pointer;
font-size: 0.75rem;
color: var(–mc-text-secondary);
user-select: none;
}
.mc-compare-check input[type=”checkbox”] {
-webkit-appearance: none;
appearance: none;
width: 18px;
height: 18px;
border: 2px solid var(–mc-border);
border-radius: 3px;
background: var(–mc-terminal-bg);
cursor: pointer;
position: relative;
transition: all 0.2s ease;
flex-shrink: 0;
}
.mc-compare-check input[type=”checkbox”]:checked {
background: var(–mc-accent);
border-color: var(–mc-accent);
}
.mc-compare-check input[type=”checkbox”]:checked::after {
content: ‘2713’;
color: #fff;
font-size: 12px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-weight: 700;
}
.mc-btn-view {
background: var(–mc-accent);
border: none;
color: #fff;
font-family: var(–mc-font-body);
font-size: 0.8rem;
font-weight: 600;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
text-decoration: none;
display: inline-block;
transition: all 0.2s ease;
white-space: nowrap;
}
.mc-btn-view:hover {
background: #ff8533;
box-shadow: 0 0 12px var(–mc-accent-glow-strong);
}
/* —- Compare Bar (sticky bottom) —- */
.mc-compare-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: var(–mc-bg-secondary);
border-top: 2px solid var(–mc-accent);
padding: 14px 24px;
display: flex;
align-items: center;
justify-content: center;
gap: 16px;
z-index: 200;
transform: translateY(100%);
transition: transform 0.3s ease;
box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.4);
}
.mc-compare-bar.mc-visible {
transform: translateY(0);
}
.mc-compare-bar-text {
font-family: var(–mc-font-mono);
font-size: 0.85rem;
color: var(–mc-text-secondary);
}
.mc-compare-bar-text strong {
color: var(–mc-accent);
}
.mc-btn-compare {
background: var(–mc-accent);
border: none;
color: #fff;
font-family: var(–mc-font-body);
font-size: 0.9rem;
font-weight: 700;
padding: 10px 24px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.mc-btn-compare:hover {
background: #ff8533;
box-shadow: 0 0 16px var(–mc-accent-glow-strong);
}
.mc-btn-clear-compare {
background: transparent;
border: 1px solid var(–mc-border);
color: var(–mc-text-secondary);
font-family: var(–mc-font-body);
font-size: 0.8rem;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
}
.mc-btn-clear-compare:hover {
border-color: var(–mc-red);
color: var(–mc-red);
}
/* —- Comparison Table Overlay —- */
.mc-comparison-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.85);
z-index: 300;
display: none;
align-items: flex-start;
justify-content: center;
padding: 40px 20px;
overflow-y: auto;
}
.mc-comparison-overlay.mc-visible {
display: flex;
}
.mc-comparison-panel {
background: var(–mc-bg-primary);
border: 1px solid var(–mc-border);
border-radius: 12px;
max-width: 1200px;
width: 100%;
max-height: calc(100vh – 80px);
overflow: auto;
position: relative;
}
.mc-comparison-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px;
border-bottom: 1px solid var(–mc-border);
position: sticky;
top: 0;
background: var(–mc-bg-primary);
z-index: 10;
}
.mc-comparison-header h3 {
font-family: var(–mc-font-heading);
font-size: 1.25rem;
font-weight: 700;
color: var(–mc-text-primary);
text-transform: uppercase;
letter-spacing: 0.5px;
margin: 0;
}
.mc-btn-close-compare {
background: transparent;
border: 1px solid var(–mc-border);
color: var(–mc-text-secondary);
font-family: var(–mc-font-body);
font-size: 0.85rem;
padding: 8px 20px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
}
.mc-btn-close-compare:hover {
border-color: var(–mc-accent);
color: var(–mc-accent);
}
.mc-comparison-body {
padding: 0;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.mc-comparison-table {
width: 100%;
border-collapse: collapse;
min-width: 600px;
}
.mc-comparison-table th,
.mc-comparison-table td {
padding: 12px 16px;
border-bottom: 1px solid var(–mc-border-subtle);
text-align: center;
vertical-align: middle;
font-size: 0.85rem;
}
.mc-comparison-table th:first-child,
.mc-comparison-table td:first-child {
text-align: left;
font-weight: 600;
color: var(–mc-text-secondary);
background: var(–mc-bg-secondary);
position: sticky;
left: 0;
z-index: 5;
min-width: 140px;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.mc-comparison-table thead th {
background: var(–mc-bg-secondary);
font-family: var(–mc-font-heading);
font-size: 1rem;
font-weight: 700;
color: var(–mc-text-primary);
text-transform: uppercase;
padding: 16px;
border-bottom: 2px solid var(–mc-accent);
}
.mc-comparison-table thead th:first-child {
background: var(–mc-bg-secondary);
}
.mc-comparison-table tbody td {
font-family: var(–mc-font-mono);
font-size: 0.85rem;
color: var(–mc-text-primary);
}
.mc-comparison-table tbody tr:hover td {
background: rgba(255, 255, 255, 0.02);
}
.mc-comparison-table tbody tr:hover td:first-child {
background: var(–mc-bg-tertiary);
}
.mc-cell-best {
color: var(–mc-green) !important;
font-weight: 700 !important;
position: relative;
}
.mc-cell-best::after {
content: ‘ 2713’;
font-size: 0.7em;
vertical-align: super;
}
.mc-comparison-table td.mc-cell-desc {
font-family: var(–mc-font-body);
font-size: 0.8rem;
color: var(–mc-text-secondary);
max-width: 200px;
text-align: left;
}
/* —- Empty State —- */
.mc-empty-state {
text-align: center;
padding: 60px 20px;
display: none;
}
.mc-empty-state.mc-visible {
display: block;
}
.mc-empty-icon {
font-size: 3rem;
margin-bottom: 16px;
opacity: 0.5;
}
.mc-empty-state h3 {
font-family: var(–mc-font-heading);
font-size: 1.25rem;
font-weight: 700;
color: var(–mc-text-primary);
margin: 0 0 8px 0;
text-transform: uppercase;
}
.mc-empty-state p {
color: var(–mc-text-secondary);
font-size: 0.9rem;
margin: 0;
}
/* —- Footer Branding —- */
.mc-branding {
text-align: center;
padding: 40px 20px 0;
border-top: 1px solid var(–mc-border-subtle);
}
.mc-branding .mc-tagline {
font-family: var(–mc-font-mono);
font-size: 1rem;
color: var(–mc-accent);
margin-bottom: 8px;
}
.mc-branding p {
font-size: 0.8rem;
color: var(–mc-text-secondary);
margin: 0;
}
.mc-branding a {
color: var(–mc-accent);
text-decoration: none;
}
.mc-branding a:hover {
text-decoration: underline;
}
/* —- Responsive —- */
@media (max-width: 1024px) {
.mc-stats-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.mc-compare {
padding: 0 12px 80px;
}
.mc-stats-grid {
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
.mc-stat-card {
padding: 14px;
}
.mc-filter-bar {
padding: 14px;
position: static;
}
.mc-filter-group {
flex: 1 1 calc(50% – 6px);
min-width: 120px;
}
.mc-filter-group.mc-filter-search {
flex: 1 1 100%;
}
.mc-price-range-wrap {
flex: 1 1 100%;
}
.mc-cards-grid {
grid-template-columns: 1fr;
gap: 14px;
}
.mc-sort-bar {
flex-wrap: wrap;
}
.mc-sort-btn {
padding: 5px 10px;
font-size: 0.75rem;
}
.mc-comparison-overlay {
padding: 10px;
}
.mc-comparison-panel {
max-height: calc(100vh – 20px);
border-radius: 8px;
}
.mc-comparison-header {
padding: 14px 16px;
}
.mc-comparison-header h3 {
font-size: 1rem;
}
.mc-comparison-table th,
.mc-comparison-table td {
padding: 10px 12px;
font-size: 0.8rem;
}
.mc-comparison-table td:first-child,
.mc-comparison-table th:first-child {
min-width: 100px;
font-size: 0.7rem;
}
.mc-compare-bar {
padding: 10px 16px;
flex-wrap: wrap;
gap: 8px;
}
.mc-compare-bar-text {
font-size: 0.75rem;
}
}
@media (max-width: 480px) {
.mc-stats-grid {
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.mc-stat-card .mc-stat-value {
font-size: 1.1rem;
}
.mc-stat-card .mc-stat-label {
font-size: 0.65rem;
}
.mc-filter-group {
flex: 1 1 100%;
}
.mc-card-footer {
flex-direction: column;
align-items: flex-start;
}
.mc-card-actions {
width: 100%;
justify-content: space-between;
}
.mc-card-price {
font-size: 1.2rem;
}
}
@media (max-width: 320px) {
.mc-compare {
padding: 0 8px 80px;
}
.mc-specs-grid {
grid-template-columns: 1fr 1fr;
gap: 6px;
}
.mc-spec-value {
font-size: 0.85rem;
}
}
Compare Bitcoin Mining Hardware
asic-compare –all –sort=price
D-Central Technologies carries the widest selection of Bitcoin mining hardware in Canada – from educational solo miners like the Nerdminer to industrial-grade ASICs like the Antminer S21 XP. As Bitcoin Mining Hackers and pioneers in the open-source mining movement, we stock every Bitaxe variant, the complete Nerd lineup, full-size ASIC miners , and our exclusive custom builds including the Slim, Loki, and Pivotal Editions.
Use this comparison tool to filter by category, algorithm, price range, and use case. Select up to four miners to see a detailed side-by-side comparison of hashrate, power consumption, efficiency, noise level, and price. Whether you are looking for a silent desktop lottery miner, a dual-purpose space heater , or maximum hashrate per dollar, this tool helps you find the right hardware for your setup.
Every device we sell is tested, configured, and shipped from our facility in Laval, Quebec . We also offer ASIC repair services for all major manufacturers, so your investment is backed by real expertise.
All prices in CAD. Specifications may vary by batch and firmware version. Contact us for current availability and bulk pricing.
—
Total Miners
—
Price Range (CAD)
—
Hashrate Range
—
Open-Source Options
Category
All Categories
Open-Source Miners
ASIC Miners
Space Heaters
Custom Builds
Algorithm
All Algorithms
SHA-256
Scrypt
Use Case
All Use Cases
Solo / Lottery Mining
Home Mining
Serious Mining
Heating
Stock
In Stock Only
Search
Showing 0 of 0 miners
Reset Filters
Sort by:
Price ↑
Name
Hashrate
Power
Efficiency
⚠
No Miners Match Your Filters
Try adjusting your criteria or reset filters to see all available mining hardware.
Compare 0 miners
Compare Now
Clear Selection
(function() {
‘use strict’;
// === MINER DATA ===
const miners = [
{ id: 1, name: “Nerdminer”, category: “Open-Source”, algorithm: “SHA-256”, chip: “ESP32”, hashrate: 0.000002, hashrateUnit: “TH/s”, power: 1, noise: 15, price: 49.99, stock: “instock”, slug: “the-nerdminer”, useCase: “solo”, description: “Educational solo miner \u2014 lottery ticket to a full block” },
{ id: 2, name: “NerdNOS”, category: “Open-Source”, algorithm: “SHA-256”, chip: “BM1397”, hashrate: 0.5, hashrateUnit: “TH/s”, power: 15, noise: 25, price: 139.99, stock: “onbackorder”, slug: “the-nerdnos”, useCase: “solo”, description: “Open-source solo miner with BM1397 ASIC chip” },
{ id: 3, name: “PiAxe”, category: “Open-Source”, algorithm: “SHA-256”, chip: “BM1366”, hashrate: 0.5, hashrateUnit: “TH/s”, power: 15, noise: 25, price: 160, stock: “outofstock”, slug: “the-piaxe”, useCase: “solo”, description: “Raspberry Pi-based open-source Bitcoin miner” },
{ id: 4, name: “Bitaxe Supra”, category: “Open-Source”, algorithm: “SHA-256”, chip: “BM1366”, hashrate: 0.5, hashrateUnit: “TH/s”, power: 15, noise: 25, price: 189.99, stock: “onbackorder”, slug: “the-bitaxe”, useCase: “solo”, description: “The original open-source ASIC miner \u2014 D-Central pioneer product” },
{ id: 5, name: “NerdAxe”, category: “Open-Source”, algorithm: “SHA-256”, chip: “BM1397”, hashrate: 0.5, hashrateUnit: “TH/s”, power: 15, noise: 25, price: 189.99, stock: “instock”, slug: “the-nerdaxe”, useCase: “solo”, description: “Open-source solo miner with standalone design” },
{ id: 6, name: “Modern Minibit Gamma”, category: “Open-Source”, algorithm: “SHA-256”, chip: “BM1370”, hashrate: 1.2, hashrateUnit: “TH/s”, power: 20, noise: 25, price: 229.99, stock: “onbackorder”, slug: “the-minibit-powered-by-bitaxe”, useCase: “solo”, description: “Compact Bitaxe-powered miner with BM1370 chip” },
{ id: 7, name: “Canaan Avalon Nano 3”, category: “Open-Source”, algorithm: “SHA-256”, chip: “Custom”, hashrate: 3, hashrateUnit: “TH/s”, power: 60, noise: 35, price: 239.99, stock: “instock”, slug: “canaan-avalon-nano-3”, useCase: “solo”, description: “Canaan’s compact home solo miner” },
{ id: 8, name: “BitSupra 1368”, category: “Open-Source”, algorithm: “SHA-256”, chip: “BM1368”, hashrate: 0.6, hashrateUnit: “TH/s”, power: 15, noise: 25, price: 245, stock: “instock”, slug: “bitsupra-1368-powered-by-bitaxe-supra”, useCase: “solo”, description: “Custom Bitaxe Supra with BM1368 chip in premium case” },
{ id: 9, name: “Bitaxe GT”, category: “Open-Source”, algorithm: “SHA-256”, chip: “BM1370”, hashrate: 1.2, hashrateUnit: “TH/s”, power: 20, noise: 25, price: 319.99, stock: “instock”, slug: “the-bitaxe-gt”, useCase: “solo”, description: “Latest Bitaxe with BM1370 chip \u2014 highest single-chip hashrate” },
{ id: 10, name: “QAxe”, category: “Open-Source”, algorithm: “SHA-256”, chip: “4x BM1366”, hashrate: 2, hashrateUnit: “TH/s”, power: 60, noise: 30, price: 319.99, stock: “instock”, slug: “the-qaxe”, useCase: “solo”, description: “Quad-chip open-source miner \u2014 4x the hashrate of a single Bitaxe” },
{ id: 11, name: “Bitaxe Hex”, category: “Open-Source”, algorithm: “SHA-256”, chip: “6x BM1366”, hashrate: 3, hashrateUnit: “TH/s”, power: 90, noise: 35, price: 499.99, stock: “instock”, slug: “the-bitaxe-hex”, useCase: “solo”, description: “Six-chip Bitaxe powerhouse \u2014 D-Central designed heatsink” },
{ id: 12, name: “NerdQAxe+”, category: “Open-Source”, algorithm: “SHA-256”, chip: “4x BM1366”, hashrate: 2, hashrateUnit: “TH/s”, power: 60, noise: 30, price: 529.99, stock: “instock”, slug: “the-nerdqaxe-plus”, useCase: “solo”, description: “Quad-chip NerdAxe variant with enhanced design” },
{ id: 13, name: “NerdQAxe++”, category: “Open-Source”, algorithm: “SHA-256”, chip: “4x BM1370”, hashrate: 4, hashrateUnit: “TH/s”, power: 80, noise: 30, price: 569.99, stock: “onbackorder”, slug: “the-nerdqaxe-plus-plus”, useCase: “solo”, description: “Next-gen quad-chip NerdAxe with BM1370 chips” },
{ id: 14, name: “NerdOctaxe Gamma”, category: “Open-Source”, algorithm: “SHA-256”, chip: “8x BM1370”, hashrate: 8, hashrateUnit: “TH/s”, power: 160, noise: 35, price: 849.99, stock: “instock”, slug: “the-nerdoctaxe-gamma”, useCase: “solo”, description: “Eight-chip powerhouse \u2014 highest hashrate open-source miner” },
{ id: 15, name: “StealthMiner”, category: “Open-Source”, algorithm: “SHA-256”, chip: “Custom”, hashrate: 1, hashrateUnit: “TH/s”, power: 25, noise: 20, price: 849.99, stock: “instock”, slug: “the-stealthminer”, useCase: “solo”, description: “Ultra-silent desktop miner with passive cooling” },
{ id: 16, name: “Antminer S9”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1387”, hashrate: 13.5, hashrateUnit: “TH/s”, power: 1350, noise: 75, price: 35, stock: “instock”, slug: “bitmain-antminer-s9”, useCase: “home”, description: “Legendary miner \u2014 perfect for space heater conversion” },
{ id: 17, name: “Antminer S15”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1391”, hashrate: 28, hashrateUnit: “TH/s”, power: 1596, noise: 76, price: null, stock: “outofstock”, slug: “bitmain-antminer-s15”, useCase: “home”, description: “7nm generation \u2014 good efficiency for its era” },
{ id: 18, name: “Antminer S17”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1397”, hashrate: 56, hashrateUnit: “TH/s”, power: 2520, noise: 75, price: 280, stock: “outofstock”, slug: “bitmain-antminer-s17”, useCase: “home”, description: “Dual-tube heatsink design \u2014 popular for home mining” },
{ id: 19, name: “Antminer S17+”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1397”, hashrate: 73, hashrateUnit: “TH/s”, power: 2920, noise: 75, price: null, stock: “outofstock”, slug: “bitmain-antminer-s17plus”, useCase: “home”, description: “Enhanced S17 with higher hashrate” },
{ id: 20, name: “Antminer T17”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1397”, hashrate: 40, hashrateUnit: “TH/s”, power: 2200, noise: 75, price: null, stock: “outofstock”, slug: “bitmain-antminer-t17”, useCase: “home”, description: “Budget-friendly 17 series option” },
{ id: 21, name: “Antminer T17+”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1397”, hashrate: 64, hashrateUnit: “TH/s”, power: 3200, noise: 75, price: null, stock: “outofstock”, slug: “bitmain-antminer-t17plus”, useCase: “home”, description: “Enhanced T17 with improved hashrate” },
{ id: 22, name: “Antminer T19”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1398”, hashrate: 84, hashrateUnit: “TH/s”, power: 3150, noise: 75, price: 520, stock: “instock”, slug: “bitmain-antminer-t19”, useCase: “home”, description: “Bridge between 17 and 19 series \u2014 excellent value” },
{ id: 23, name: “Antminer S19”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1398”, hashrate: 95, hashrateUnit: “TH/s”, power: 3250, noise: 75, price: 600, stock: “instock”, slug: “bitmain-antminer-s19”, useCase: “serious”, description: “Workhorse of the 19 series \u2014 reliable and proven” },
{ id: 24, name: “Antminer S19 Pro”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1398”, hashrate: 110, hashrateUnit: “TH/s”, power: 3250, noise: 75, price: 925, stock: “instock”, slug: “bitmain-antminer-s19-pro”, useCase: “serious”, description: “Top-tier 19 series \u2014 excellent efficiency” },
{ id: 25, name: “Antminer S19j Pro”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1362”, hashrate: 104, hashrateUnit: “TH/s”, power: 3068, noise: 75, price: 925, stock: “instock”, slug: “bitmain-antminer-s19j-pro”, useCase: “serious”, description: “Refined 19 series with improved power efficiency” },
{ id: 26, name: “Antminer S19j Pro+”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1362”, hashrate: 120, hashrateUnit: “TH/s”, power: 3355, noise: 75, price: 800, stock: “instock”, slug: “bitmain-antminer-s19j-pro-2”, useCase: “serious”, description: “Enhanced S19j Pro with higher hashrate” },
{ id: 27, name: “Antminer S19k Pro”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1366”, hashrate: 120, hashrateUnit: “TH/s”, power: 2760, noise: 75, price: 2200, stock: “onbackorder”, slug: “bitmain-antminer-s19k-pro”, useCase: “serious”, description: “Most efficient 19 series \u2014 BM1366 chip” },
{ id: 28, name: “Antminer S19 XP”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1366”, hashrate: 140, hashrateUnit: “TH/s”, power: 3010, noise: 75, price: null, stock: “outofstock”, slug: “bitmain-antminer-s19-xp”, useCase: “serious”, description: “Pinnacle of the 19 series \u2014 best efficiency” },
{ id: 29, name: “Antminer S21”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1368”, hashrate: 200, hashrateUnit: “TH/s”, power: 3500, noise: 75, price: 5295, stock: “outofstock”, slug: “bitmain-antminer-s21”, useCase: “serious”, description: “Next-gen mining powerhouse \u2014 17.5 J/TH” },
{ id: 30, name: “Antminer S21 Pro”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1370”, hashrate: 234, hashrateUnit: “TH/s”, power: 3531, noise: 75, price: 8000, stock: “instock”, slug: “bitmain-antminer-s21-pro”, useCase: “serious”, description: “Flagship miner \u2014 15.1 J/TH efficiency” },
{ id: 31, name: “Antminer S21 XP”, category: “ASIC”, algorithm: “SHA-256”, chip: “BM1370”, hashrate: 270, hashrateUnit: “TH/s”, power: 3645, noise: 75, price: 6499.99, stock: “instock”, slug: “bitmain-antminer-s21-xp”, useCase: “serious”, description: “Highest hashrate ASIC available \u2014 13.5 J/TH” },
{ id: 32, name: “Whatsminer M30S++”, category: “ASIC”, algorithm: “SHA-256”, chip: “Custom”, hashrate: 112, hashrateUnit: “TH/s”, power: 3472, noise: 75, price: 1400, stock: “outofstock”, slug: “microbt-whatsminer-m30splusplus”, useCase: “serious”, description: “MicroBT’s top performer \u2014 competitive efficiency” },
{ id: 33, name: “AvalonMiner A1046-36T”, category: “ASIC”, algorithm: “SHA-256”, chip: “Custom”, hashrate: 36, hashrateUnit: “TH/s”, power: 2500, noise: 75, price: 150, stock: “instock”, slug: “canaan-avalonminer-a1046-36t”, useCase: “home”, description: “Budget Canaan miner \u2014 good for heater conversion” },
{ id: 34, name: “AvalonMiner A1166 Pro”, category: “ASIC”, algorithm: “SHA-256”, chip: “Custom”, hashrate: 81, hashrateUnit: “TH/s”, power: 3400, noise: 75, price: 546, stock: “outofstock”, slug: “canaan-avalonminer-a1166-pro”, useCase: “home”, description: “Canaan’s efficient mid-range miner” },
{ id: 35, name: “AvalonMiner A1246”, category: “ASIC”, algorithm: “SHA-256”, chip: “Custom”, hashrate: 90, hashrateUnit: “TH/s”, power: 3420, noise: 75, price: null, stock: “outofstock”, slug: “canaan-avalonminer-a1246”, useCase: “serious”, description: “Canaan’s top-tier SHA-256 miner” },
{ id: 36, name: “Canaan Avalon Mini 3”, category: “ASIC”, algorithm: “SHA-256”, chip: “Custom”, hashrate: 37.5, hashrateUnit: “TH/s”, power: 1200, noise: 50, price: 1750, stock: “onbackorder”, slug: “canaan-avalon-mini-3”, useCase: “home”, description: “Compact quiet ASIC \u2014 designed for home use” },
{ id: 37, name: “DragonMint T1”, category: “ASIC”, algorithm: “SHA-256”, chip: “DM8575”, hashrate: 16, hashrateUnit: “TH/s”, power: 1480, noise: 75, price: null, stock: “outofstock”, slug: “dragonmint-t1”, useCase: “home”, description: “HalongMining’s legendary miner \u2014 collector’s item” },
{ id: 38, name: “Antminer L3+”, category: “ASIC”, algorithm: “Scrypt”, chip: “BM1485”, hashrate: 504, hashrateUnit: “MH/s”, power: 800, noise: 75, price: 139.99, stock: “instock”, slug: “bitmain-antminer-l3”, useCase: “home”, description: “Popular Litecoin/Dogecoin miner \u2014 great for heater builds” },
{ id: 39, name: “Antminer L7”, category: “ASIC”, algorithm: “Scrypt”, chip: “Custom”, hashrate: 9500, hashrateUnit: “MH/s”, power: 3425, noise: 75, price: 3600, stock: “instock”, slug: “bitmain-antminer-l7”, useCase: “serious”, description: “King of Scrypt mining \u2014 Litecoin/Dogecoin powerhouse” },
{ id: 40, name: “Antminer Slim Edition”, category: “Custom”, algorithm: “SHA-256”, chip: “Various”, hashrate: 95, hashrateUnit: “TH/s”, power: 3250, noise: 55, price: 560, stock: “instock”, slug: “antminer-slim-edition”, useCase: “home”, description: “D-Central custom compact build \u2014 reduced noise, smaller footprint” },
{ id: 41, name: “Antminer Loki Edition”, category: “Custom”, algorithm: “SHA-256”, chip: “Various”, hashrate: 95, hashrateUnit: “TH/s”, power: 3250, noise: 55, price: 585, stock: “instock”, slug: “antminer-loki-edition”, useCase: “home”, description: “110V-compatible custom build \u2014 plug into any standard outlet” },
{ id: 42, name: “Antminer Pivotal Edition”, category: “Custom”, algorithm: “SHA-256”, chip: “Various”, hashrate: 95, hashrateUnit: “TH/s”, power: 3250, noise: 55, price: null, stock: “instock”, slug: “antminer-pivotal-edition”, useCase: “home”, description: “D-Central’s custom quiet configuration \u2014 contact for pricing” },
{ id: 43, name: “S9 Space Heater Edition”, category: “Space Heater”, algorithm: “SHA-256”, chip: “BM1387”, hashrate: 13.5, hashrateUnit: “TH/s”, power: 1350, noise: 40, price: 235, stock: “instock”, slug: “antminer-s9-space-heater-edition”, useCase: “heating”, description: “Bitcoin-earning space heater \u2014 silent 140mm fans” },
{ id: 44, name: “L3+ Space Heater Edition”, category: “Space Heater”, algorithm: “Scrypt”, chip: “BM1485”, hashrate: 504, hashrateUnit: “MH/s”, power: 800, noise: 40, price: 295, stock: “instock”, slug: “antminer-l3-space-heater-edition”, useCase: “heating”, description: “Mine Litecoin/Dogecoin while heating \u2014 whisper quiet” },
{ id: 45, name: “S17 Space Heater Edition”, category: “Space Heater”, algorithm: “SHA-256”, chip: “BM1397”, hashrate: 56, hashrateUnit: “TH/s”, power: 2520, noise: 40, price: 530, stock: “outofstock”, slug: “antminer-s17-space-heater-edition”, useCase: “heating”, description: “High-output Bitcoin heater \u2014 56 TH/s of heating power” },
{ id: 46, name: “S19 Space Heater Edition”, category: “Space Heater”, algorithm: “SHA-256”, chip: “BM1398”, hashrate: 95, hashrateUnit: “TH/s”, power: 3250, noise: 40, price: 755, stock: “instock”, slug: “antminer-s19-space-heater-edition”, useCase: “heating”, description: “Flagship space heater \u2014 maximum hashrate + heating” },
{ id: 47, name: “L7 Heater Pivotal Edition”, category: “Space Heater”, algorithm: “Scrypt”, chip: “Custom”, hashrate: 3500, hashrateUnit: “MH/s”, power: 1300, noise: 40, price: 2350, stock: “instock”, slug: “l7-heater-pivotal-edition-3-5ghs-1300w”, useCase: “heating”, description: “Scrypt mining heater \u2014 3.5 GH/s quiet dual-voltage” }
];
// === HELPER FUNCTIONS ===
function formatHashrate(hashrate, unit) {
if (unit === ‘TH/s’) {
if (hashrate < 0.001) {
return (hashrate * 1e6).toFixed(0) + ' MH/s';
}
if (hashrate = 1000) {
return (hashrate / 1000).toFixed(1).replace(/\.0$/, ”) + ‘ GH/s’;
}
return hashrate.toFixed(0) + ‘ MH/s’;
}
return hashrate + ‘ ‘ + unit;
}
function getHashrateNumeric(miner) {
// Normalize to TH/s for comparison
if (miner.hashrateUnit === ‘TH/s’) return miner.hashrate;
if (miner.hashrateUnit === ‘MH/s’) return miner.hashrate / 1e6;
return miner.hashrate;
}
function calcEfficiency(miner) {
if (miner.hashrateUnit === ‘TH/s’ && miner.hashrate > 0) {
return miner.power / miner.hashrate;
}
if (miner.hashrateUnit === ‘MH/s’ && miner.hashrate > 0) {
return miner.power / miner.hashrate;
}
return Infinity;
}
function formatEfficiency(miner) {
if (miner.hashrateUnit === ‘TH/s’ && miner.hashrate > 0) {
var eff = miner.power / miner.hashrate;
if (eff > 10000) return (eff / 1000).toFixed(0) + ‘ kJ/TH’;
return eff.toFixed(1) + ‘ J/TH’;
}
if (miner.hashrateUnit === ‘MH/s’ && miner.hashrate > 0) {
var eff2 = miner.power / miner.hashrate;
return eff2.toFixed(2) + ‘ W/MH’;
}
return ‘N/A’;
}
function formatPrice(price) {
if (price === null) return null;
if (price >= 1000) {
return ‘$’ + price.toLocaleString(‘en-CA’, { minimumFractionDigits: 0, maximumFractionDigits: 2 });
}
return ‘$’ + price.toFixed(2);
}
function stockLabel(stock) {
switch (stock) {
case ‘instock’: return ‘In Stock’;
case ‘onbackorder’: return ‘On Backorder’;
case ‘outofstock’: return ‘Out of Stock’;
default: return stock;
}
}
function useCaseLabel(uc) {
switch (uc) {
case ‘solo’: return ‘Solo / Lottery’;
case ‘home’: return ‘Home Mining’;
case ‘serious’: return ‘Serious Mining’;
case ‘heating’: return ‘Heating’;
default: return uc;
}
}
function categoryBadgeClass(cat) {
switch (cat) {
case ‘Open-Source’: return ‘mc-badge-opensource’;
case ‘ASIC’: return ‘mc-badge-asic’;
case ‘Space Heater’: return ‘mc-badge-heater’;
case ‘Custom’: return ‘mc-badge-custom’;
default: return ‘mc-badge-algo’;
}
}
// === STATE ===
var currentSort = ‘price’;
var currentDir = ‘asc’;
var selectedIds = new Set();
var filteredMiners = [];
// === DOM REFS ===
var filterCategory = document.getElementById(‘filterCategory’);
var filterAlgorithm = document.getElementById(‘filterAlgorithm’);
var filterUseCase = document.getElementById(‘filterUseCase’);
var filterInStock = document.getElementById(‘filterInStock’);
var filterSearch = document.getElementById(‘filterSearch’);
var priceMin = document.getElementById(‘priceMin’);
var priceMax = document.getElementById(‘priceMax’);
var priceRangeDisplay = document.getElementById(‘priceRangeDisplay’);
var priceTrackActive = document.getElementById(‘priceTrackActive’);
var resultsCount = document.getElementById(‘resultsCount’);
var btnReset = document.getElementById(‘btnReset’);
var cardsGrid = document.getElementById(‘mcCardsGrid’);
var emptyState = document.getElementById(‘mcEmptyState’);
var compareBar = document.getElementById(‘mcCompareBar’);
var compareCount = document.getElementById(‘compareCount’);
var btnOpenCompare = document.getElementById(‘btnOpenCompare’);
var btnClearCompare = document.getElementById(‘btnClearCompare’);
var comparisonOverlay = document.getElementById(‘mcComparisonOverlay’);
var btnCloseCompare = document.getElementById(‘btnCloseCompare’);
var compTableHead = document.getElementById(‘mcCompTableHead’);
var compTableBody = document.getElementById(‘mcCompTableBody’);
var filterBar = document.getElementById(‘mcFilterBar’);
// === STATS ===
function updateStats() {
var total = miners.length;
var priced = miners.filter(function(m) { return m.price !== null; });
var prices = priced.map(function(m) { return m.price; });
var minP = Math.min.apply(null, prices);
var maxP = Math.max.apply(null, prices);
var openSource = miners.filter(function(m) { return m.category === ‘Open-Source’; }).length;
// Hashrate range (normalize to TH/s, then display nicely)
var hashrates = miners.map(getHashrateNumeric);
var minH = Math.min.apply(null, hashrates);
var maxH = Math.max.apply(null, hashrates);
document.getElementById(‘statTotal’).textContent = total;
document.getElementById(‘statPriceRange’).textContent = ‘$’ + minP.toFixed(0) + ‘ \u2013 $’ + maxP.toLocaleString(‘en-CA’, {maximumFractionDigits: 0});
document.getElementById(‘statOpenSource’).textContent = openSource;
// Format hashrate range
var minHStr, maxHStr;
if (minH < 0.001) {
minHStr = (minH * 1e6).toFixed(0) + ' MH/s';
} else if (minH < 1) {
minHStr = (minH * 1000).toFixed(1) + ' GH/s';
} else {
minHStr = minH.toFixed(0) + ' TH/s';
}
if (maxH max) {
var tmp = min;
priceMin.value = max;
priceMax.value = tmp;
min = parseInt(priceMin.value);
max = parseInt(priceMax.value);
}
priceRangeDisplay.textContent = ‘$’ + min.toLocaleString() + ‘ \u2013 $’ + max.toLocaleString();
var sliderMax = 10000;
var leftPct = (min / sliderMax) * 100;
var rightPct = (max / sliderMax) * 100;
priceTrackActive.style.left = leftPct + ‘%’;
priceTrackActive.style.width = (rightPct – leftPct) + ‘%’;
applyFilters();
}
priceMin.addEventListener(‘input’, updatePriceRange);
priceMax.addEventListener(‘input’, updatePriceRange);
// === FILTERING ===
function applyFilters() {
var cat = filterCategory.value;
var algo = filterAlgorithm.value;
var uc = filterUseCase.value;
var inStockOnly = filterInStock.checked;
var search = filterSearch.value.toLowerCase().trim();
var pMin = parseInt(priceMin.value);
var pMax = parseInt(priceMax.value);
filteredMiners = miners.filter(function(m) {
if (cat !== ‘all’ && m.category !== cat) return false;
if (algo !== ‘all’ && m.algorithm !== algo) return false;
if (uc !== ‘all’ && m.useCase !== uc) return false;
if (inStockOnly && m.stock !== ‘instock’) return false;
// Price filter: include null-priced miners if range goes to max, exclude otherwise
if (m.price !== null) {
if (m.price pMax) return false;
} else {
// Show contact-for-price miners unless user narrowed the range
if (pMax < 10000) return false;
}
if (search) {
var haystack = (m.name + ' ' + m.chip + ' ' + m.description + ' ' + m.category + ' ' + m.algorithm).toLowerCase();
if (haystack.indexOf(search) === -1) return false;
}
return true;
});
sortMiners();
renderCards();
updateResultsCount();
}
// === SORTING ===
function sortMiners() {
filteredMiners.sort(function(a, b) {
var va, vb;
switch (currentSort) {
case 'name':
va = a.name.toLowerCase();
vb = b.name.toLowerCase();
return currentDir === 'asc' ? (va vb ? 1 : 0) : (va > vb ? -1 : va < vb ? 1 : 0);
case 'hashrate':
va = getHashrateNumeric(a);
vb = getHashrateNumeric(b);
break;
case 'power':
va = a.power;
vb = b.power;
break;
case 'efficiency':
va = calcEfficiency(a);
vb = calcEfficiency(b);
break;
case 'price':
va = a.price !== null ? a.price : (currentDir === 'asc' ? Infinity : -1);
vb = b.price !== null ? b.price : (currentDir === 'asc' ? Infinity : -1);
break;
default:
va = a.price || Infinity;
vb = b.price || Infinity;
}
if (typeof va === 'number') {
return currentDir === 'asc' ? va – vb : vb – va;
}
return 0;
});
}
function updateResultsCount() {
resultsCount.innerHTML = 'Showing
‘ + filteredMiners.length + ‘ of ‘ + miners.length + ‘ miners’;
}
// === RENDER CARDS ===
function renderCards() {
cardsGrid.innerHTML = ”;
if (filteredMiners.length === 0) {
emptyState.classList.add(‘mc-visible’);
return;
}
emptyState.classList.remove(‘mc-visible’);
filteredMiners.forEach(function(miner) {
var card = document.createElement(‘div’);
card.className = ‘mc-miner-card’ + (selectedIds.has(miner.id) ? ‘ mc-card-selected’ : ”);
card.setAttribute(‘data-id’, miner.id);
var priceHtml;
if (miner.price !== null) {
priceHtml = ‘‘ + formatPrice(miner.price) + ”;
} else {
priceHtml = ‘Contact for Price’;
}
var stockClass = ‘mc-stock-‘ + miner.stock;
var isChecked = selectedIds.has(miner.id) ? ‘ checked’ : ”;
var isDisabled = (!selectedIds.has(miner.id) && selectedIds.size >= 4) ? ‘ disabled’ : ”;
card.innerHTML =
‘