Spaces:
Configuration error
Configuration error
File size: 8,650 Bytes
1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 2f6f345 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 2f6f345 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 2f6f345 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 2f6f345 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 82a0800 8c22d3c 1f25474 2f6f345 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 8c22d3c 1f25474 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Shingle Geek β Open Roofing Cost Data</title>
<meta name="description" content="Open-source roofing cost transparency data for 400+ US cities. Independent pricing analysis by Shingle Geek.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--accent: #ea5f1a;
--accent-light: #ff7a3d;
--bg: #0f1116;
--bg-2: #181b22;
--bg-3: #1e222b;
--text: #e8e8e6;
--text-2: #9a9a96;
--card-border: #2a2e38;
--line: #2a2e38;
}
body {
font-family: 'Inter Tight', system-ui, sans-serif;
background: var(--bg) !important;
color: var(--text) !important;
overflow-x: hidden;
}
/* ββ Hero βββββββββββββββββββββββββββββββββββββββββββ */
.hero {
background: var(--bg);
padding: 64px 24px 48px;
text-align: center;
position: relative;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: -50%; left: -50%;
width: 200%; height: 200%;
background: radial-gradient(circle at 30% 50%, rgba(234,95,26,0.1) 0%, transparent 50%),
radial-gradient(circle at 70% 80%, rgba(234,95,26,0.06) 0%, transparent 40%);
animation: pulse 8s ease-in-out infinite alternate;
}
@keyframes pulse {
from { transform: scale(1) rotate(0deg); }
to { transform: scale(1.05) rotate(2deg); }
}
.hero-content { position: relative; z-index: 1; max-width: 640px; margin: 0 auto; }
.hero-badge {
display: inline-flex; align-items: center; gap: 6px;
background: rgba(234,95,26,0.15); border: 1px solid rgba(234,95,26,0.3);
color: var(--accent-light); font-size: 12px; font-weight: 600;
letter-spacing: 0.08em; text-transform: uppercase;
padding: 6px 14px; border-radius: 100px; margin-bottom: 24px;
}
.hero h1 {
font-size: clamp(32px, 5vw, 48px); font-weight: 900;
letter-spacing: -0.03em; line-height: 1.1; margin-bottom: 14px;
}
.hero h1 span { color: #ea5f1a !important; }
.hero p {
font-size: 16px; line-height: 1.6; color: var(--text-2);
max-width: 500px; margin: 0 auto 28px;
}
.hero-links { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
.hero-links a {
display: inline-flex; align-items: center; gap: 8px;
padding: 12px 24px; border-radius: 10px; font-size: 14px;
font-weight: 600; text-decoration: none; transition: all 0.2s ease;
}
.btn-primary { background: var(--accent); color: white; }
.btn-primary:hover { background: var(--accent-light); transform: translateY(-2px); box-shadow: 0 8px 24px rgba(234,95,26,0.3); }
.btn-outline { background: transparent; color: var(--text); border: 1px solid var(--card-border); }
.btn-outline:hover { border-color: var(--accent); background: rgba(234,95,26,0.05); transform: translateY(-2px); }
/* ββ Stats βββββββββββββββββββββββββββββββββββββββββββ */
.stats {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px;
background: var(--line); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
}
@media (max-width: 600px) { .stats { grid-template-columns: repeat(2, 1fr); } }
.stat { background: var(--bg-2); padding: 24px 16px; text-align: center; }
.stat-value { font-size: 30px; font-weight: 900; letter-spacing: -0.03em; color: #ea5f1a !important; line-height: 1; margin-bottom: 4px; }
.stat-label { font-size: 12px; font-weight: 500; color: var(--text-2); }
/* ββ Table Section βββββββββββββββββββββββββββββββββββ */
.section {
max-width: 800px; margin: 0 auto; padding: 40px 24px;
}
.section h2 { font-size: 22px; font-weight: 800; letter-spacing: -0.02em; margin-bottom: 6px; }
.section h2 span { color: #ea5f1a !important; }
.section-sub { font-size: 14px; color: var(--text-2); line-height: 1.6; margin-bottom: 20px; }
.preview-table {
width: 100%; border-collapse: collapse; font-size: 14px;
background: var(--bg-3); border-radius: 12px; overflow: hidden;
border: 1px solid var(--card-border);
}
.preview-table th {
background: var(--bg-2); color: var(--text-2); padding: 10px 16px;
text-align: left; font-weight: 600; font-size: 11px;
letter-spacing: 0.06em; text-transform: uppercase;
}
.preview-table td { padding: 10px 16px; border-bottom: 1px solid var(--line); color: var(--text); }
.preview-table tr:last-child td { border-bottom: none; }
.preview-table tr:hover td { background: rgba(234,95,26,0.04); }
.cost-fair { color: #4ade80; font-weight: 600; }
.cost-markup { color: #f87171; font-weight: 600; }
.preview-table a { color: #ea5f1a !important; text-decoration: none; font-weight: 500; }
.preview-table a:hover { text-decoration: underline; }
/* ββ Footer ββββββββββββββββββββββββββββββββββββββββββ */
.footer {
background: var(--bg-2); border-top: 1px solid var(--line);
color: var(--text-2); text-align: center; padding: 24px; font-size: 13px;
}
.footer a { color: var(--accent-light); text-decoration: none; }
.footer a:hover { text-decoration: underline; }
</style>
</head>
<body>
<div class="hero">
<div class="hero-content">
<div class="hero-badge">π Open Data Initiative</div>
<h1>See What Roofs <span>Actually Costs</span></h1>
<p>Independent, city-level roofing cost data β so homeowners can compare fair contractor pricing against inflated sales quotes.</p>
<div class="hero-links">
<a href="https://www.shinglegeek.com" class="btn-primary" target="_blank">π Visit Shingle Geek</a>
<a href="https://huggingface.co/datasets/ShingleGeek/roofing-cost-index" class="btn-outline" target="_blank">π Download Dataset</a>
</div>
</div>
</div>
<div class="stats">
<div class="stat"><div class="stat-value">425+</div><div class="stat-label">US Cities Tracked</div></div>
<div class="stat"><div class="stat-value">50</div><div class="stat-label">States Covered</div></div>
<div class="stat"><div class="stat-value">$0</div><div class="stat-label">Hidden Fees</div></div>
<div class="stat"><div class="stat-value">Weekly</div><div class="stat-label">Data Refresh</div></div>
</div>
<div class="section">
<h2>Dataset <span>Preview</span></h2>
<p class="section-sub">Fair contractor estimate vs. sales company price β with a source link for every city.</p>
<table class="preview-table">
<thead>
<tr><th>City</th><th>State</th><th>Fair Estimate</th><th>Sales Price</th><th>Source</th></tr>
</thead>
<tbody>
<tr><td>Houston</td><td>TX</td><td class="cost-fair">$11,900</td><td class="cost-markup">$15,470</td><td><a href="https://www.shinglegeek.com/cost/houston-tx" target="_blank">View β</a></td></tr>
<tr><td>Nashville</td><td>TN</td><td class="cost-fair">$10,850</td><td class="cost-markup">$14,105</td><td><a href="https://www.shinglegeek.com/cost/nashville-tn" target="_blank">View β</a></td></tr>
<tr><td>Beverly Hills</td><td>CA</td><td class="cost-fair">$12,100</td><td class="cost-markup">$15,730</td><td><a href="https://www.shinglegeek.com/cost/beverly-hills-ca" target="_blank">View β</a></td></tr>
<tr><td>Kirkland</td><td>WA</td><td class="cost-fair">$9,980</td><td class="cost-markup">$12,974</td><td><a href="https://www.shinglegeek.com/cost/kirkland-wa" target="_blank">View β</a></td></tr>
<tr><td>Naples</td><td>FL</td><td class="cost-fair">$13,200</td><td class="cost-markup">$17,160</td><td><a href="https://www.shinglegeek.com/cost/naples-fl" target="_blank">View β</a></td></tr>
</tbody>
</table>
</div>
<div class="footer">
<p>Β© 2026 <a href="https://www.shinglegeek.com" target="_blank">Shingle Geek</a> Β· CC BY 4.0 Β· JSONL + CSV formats available</p>
</div>
</body>
</html>
|