Taddy1 commited on
Commit
8c22d3c
Β·
verified Β·
1 Parent(s): 1f25474

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +72 -340
index.html CHANGED
@@ -13,27 +13,26 @@
13
  :root {
14
  --accent: #ea5f1a;
15
  --accent-light: #ff7a3d;
16
- --bg: #f4f4f2;
17
- --bg-dark: #1a1a18;
18
- --text: #1a1a18;
19
- --text-2: #5a5a56;
20
- --text-light: #f4f4f2;
21
- --card-bg: #ffffff;
22
- --line: #e0e0dc;
23
  }
24
 
25
  body {
26
  font-family: 'Inter Tight', system-ui, sans-serif;
27
- background: var(--bg);
28
- color: var(--text);
29
  overflow-x: hidden;
30
  }
31
 
32
  /* ── Hero ─────────────────────────────────────────── */
33
  .hero {
34
- background: var(--bg-dark);
35
- color: var(--text-light);
36
- padding: 80px 24px 60px;
37
  text-align: center;
38
  position: relative;
39
  overflow: hidden;
@@ -42,12 +41,10 @@
42
  .hero::before {
43
  content: '';
44
  position: absolute;
45
- top: -50%;
46
- left: -50%;
47
- width: 200%;
48
- height: 200%;
49
- background: radial-gradient(circle at 30% 50%, rgba(234, 95, 26, 0.08) 0%, transparent 50%),
50
- radial-gradient(circle at 70% 80%, rgba(234, 95, 26, 0.05) 0%, transparent 40%);
51
  animation: pulse 8s ease-in-out infinite alternate;
52
  }
53
 
@@ -56,282 +53,94 @@
56
  to { transform: scale(1.05) rotate(2deg); }
57
  }
58
 
59
- .hero-content {
60
- position: relative;
61
- z-index: 1;
62
- max-width: 720px;
63
- margin: 0 auto;
64
- }
65
 
66
  .hero-badge {
67
- display: inline-flex;
68
- align-items: center;
69
- gap: 6px;
70
- background: rgba(234, 95, 26, 0.15);
71
- border: 1px solid rgba(234, 95, 26, 0.3);
72
- color: var(--accent-light);
73
- font-size: 12px;
74
- font-weight: 600;
75
- letter-spacing: 0.08em;
76
- text-transform: uppercase;
77
- padding: 6px 14px;
78
- border-radius: 100px;
79
- margin-bottom: 24px;
80
  }
81
 
82
  .hero h1 {
83
- font-size: clamp(36px, 6vw, 56px);
84
- font-weight: 900;
85
- letter-spacing: -0.03em;
86
- line-height: 1.05;
87
- margin-bottom: 16px;
88
- }
89
-
90
- .hero h1 span {
91
- color: var(--accent);
92
  }
 
93
 
94
  .hero p {
95
- font-size: 17px;
96
- line-height: 1.6;
97
- color: rgba(244, 244, 242, 0.7);
98
- max-width: 540px;
99
- margin: 0 auto 32px;
100
  }
101
 
102
- .hero-links {
103
- display: flex;
104
- gap: 12px;
105
- justify-content: center;
106
- flex-wrap: wrap;
107
- }
108
 
109
  .hero-links a {
110
- display: inline-flex;
111
- align-items: center;
112
- gap: 8px;
113
- padding: 12px 24px;
114
- border-radius: 10px;
115
- font-size: 14px;
116
- font-weight: 600;
117
- text-decoration: none;
118
- transition: all 0.2s ease;
119
  }
120
 
121
- .btn-primary {
122
- background: var(--accent);
123
- color: white;
124
- }
125
 
126
- .btn-primary:hover {
127
- background: var(--accent-light);
128
- transform: translateY(-2px);
129
- box-shadow: 0 8px 24px rgba(234, 95, 26, 0.3);
130
- }
131
-
132
- .btn-outline {
133
- background: transparent;
134
- color: var(--text-light);
135
- border: 1px solid rgba(244, 244, 242, 0.2);
136
- }
137
-
138
- .btn-outline:hover {
139
- border-color: rgba(244, 244, 242, 0.5);
140
- background: rgba(244, 244, 242, 0.05);
141
- transform: translateY(-2px);
142
- }
143
 
144
  /* ── Stats ─────────────────────────────────────────── */
145
  .stats {
146
- display: grid;
147
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
148
- gap: 1px;
149
- background: var(--line);
150
- border-top: 1px solid var(--line);
151
- border-bottom: 1px solid var(--line);
152
- }
153
-
154
- .stat {
155
- background: var(--card-bg);
156
- padding: 32px 24px;
157
- text-align: center;
158
  }
 
159
 
160
- .stat-value {
161
- font-size: 36px;
162
- font-weight: 900;
163
- letter-spacing: -0.03em;
164
- color: var(--accent);
165
- line-height: 1;
166
- margin-bottom: 4px;
167
- }
168
-
169
- .stat-label {
170
- font-size: 13px;
171
- font-weight: 500;
172
- color: var(--text-2);
173
- letter-spacing: 0.02em;
174
- }
175
 
176
- /* ── Sections ──────────────────────────────────────── */
177
  .section {
178
- max-width: 800px;
179
- margin: 0 auto;
180
- padding: 64px 24px;
181
- }
182
-
183
- .section h2 {
184
- font-size: 28px;
185
- font-weight: 800;
186
- letter-spacing: -0.02em;
187
- margin-bottom: 8px;
188
  }
 
 
 
189
 
190
- .section h2 span {
191
- color: var(--accent);
192
- }
193
-
194
- .section-sub {
195
- font-size: 15px;
196
- color: var(--text-2);
197
- line-height: 1.6;
198
- margin-bottom: 32px;
199
- }
200
-
201
- /* ── Cards ─────────────────────────────────────────── */
202
- .card-grid {
203
- display: grid;
204
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
205
- gap: 16px;
206
- }
207
-
208
- .card {
209
- background: var(--card-bg);
210
- border: 1px solid var(--line);
211
- border-radius: 12px;
212
- padding: 24px;
213
- transition: all 0.2s ease;
214
- }
215
-
216
- .card:hover {
217
- border-color: var(--accent);
218
- transform: translateY(-4px);
219
- box-shadow: 0 12px 32px rgba(0,0,0,0.06);
220
- }
221
-
222
- .card-icon {
223
- font-size: 28px;
224
- margin-bottom: 12px;
225
- }
226
-
227
- .card h3 {
228
- font-size: 16px;
229
- font-weight: 700;
230
- margin-bottom: 6px;
231
- }
232
-
233
- .card p {
234
- font-size: 13px;
235
- line-height: 1.5;
236
- color: var(--text-2);
237
- }
238
-
239
- /* ── Dataset Preview ──────────────────────────────── */
240
  .preview-table {
241
- width: 100%;
242
- border-collapse: collapse;
243
- font-size: 14px;
244
- background: var(--card-bg);
245
- border-radius: 12px;
246
- overflow: hidden;
247
- border: 1px solid var(--line);
248
  }
249
-
250
  .preview-table th {
251
- background: var(--bg-dark);
252
- color: var(--text-light);
253
- padding: 12px 16px;
254
- text-align: left;
255
- font-weight: 600;
256
- font-size: 12px;
257
- letter-spacing: 0.04em;
258
- text-transform: uppercase;
259
- }
260
-
261
- .preview-table td {
262
- padding: 10px 16px;
263
- border-bottom: 1px solid var(--line);
264
- }
265
-
266
- .preview-table tr:last-child td {
267
- border-bottom: none;
268
- }
269
-
270
- .preview-table tr:hover td {
271
- background: rgba(234, 95, 26, 0.03);
272
- }
273
-
274
- .cost-fair { color: #16a34a; font-weight: 600; }
275
- .cost-markup { color: #dc2626; font-weight: 600; }
276
-
277
- .preview-table a {
278
- color: var(--accent);
279
- text-decoration: none;
280
- font-weight: 500;
281
- }
282
-
283
- .preview-table a:hover {
284
- text-decoration: underline;
285
- }
286
 
287
  /* ── Footer ────────────────────────────────────────── */
288
  .footer {
289
- background: var(--bg-dark);
290
- color: rgba(244, 244, 242, 0.5);
291
- text-align: center;
292
- padding: 32px 24px;
293
- font-size: 13px;
294
- }
295
-
296
- .footer a {
297
- color: var(--accent-light);
298
- text-decoration: none;
299
- }
300
-
301
- .footer a:hover {
302
- text-decoration: underline;
303
- }
304
-
305
- /* ── Animations ────────────────────────────────────── */
306
- @keyframes fadeUp {
307
- from { opacity: 0; transform: translateY(20px); }
308
- to { opacity: 1; transform: translateY(0); }
309
- }
310
-
311
- .fade-in {
312
- animation: fadeUp 0.6s ease forwards;
313
- opacity: 0;
314
- }
315
-
316
- .fade-in:nth-child(1) { animation-delay: 0.1s; }
317
- .fade-in:nth-child(2) { animation-delay: 0.2s; }
318
- .fade-in:nth-child(3) { animation-delay: 0.3s; }
319
- .fade-in:nth-child(4) { animation-delay: 0.4s; }
320
-
321
- .divider {
322
- height: 1px;
323
- background: var(--line);
324
  }
 
 
325
  </style>
326
  </head>
327
  <body>
328
 
329
- <!-- Hero -->
330
  <div class="hero">
331
  <div class="hero-content">
332
  <div class="hero-badge">🏠 Open Data Initiative</div>
333
- <h1>The Roofing Industry's <span>Transparency Problem</span></h1>
334
- <p>We publish independent, city-level roofing cost data so homeowners can see what a roof actually costs β€” before the 30% markup.</p>
335
  <div class="hero-links">
336
  <a href="https://www.shinglegeek.com" class="btn-primary" target="_blank">🌐 Visit Shingle Geek</a>
337
  <a href="https://huggingface.co/datasets/ShingleGeek/roofing-cost-index" class="btn-outline" target="_blank">πŸ“Š Download Dataset</a>
@@ -339,69 +148,19 @@
339
  </div>
340
  </div>
341
 
342
- <!-- Stats -->
343
  <div class="stats">
344
- <div class="stat fade-in">
345
- <div class="stat-value" id="cities">0</div>
346
- <div class="stat-label">US Cities Tracked</div>
347
- </div>
348
- <div class="stat fade-in">
349
- <div class="stat-value">50</div>
350
- <div class="stat-label">States Covered</div>
351
- </div>
352
- <div class="stat fade-in">
353
- <div class="stat-value">30%</div>
354
- <div class="stat-label">Avg Hidden Markup</div>
355
- </div>
356
- <div class="stat fade-in">
357
- <div class="stat-value">Weekly</div>
358
- <div class="stat-label">Data Refresh Rate</div>
359
- </div>
360
  </div>
361
 
362
- <!-- What We Expose -->
363
- <div class="section">
364
- <h2>What We <span>Expose</span></h2>
365
- <p class="section-sub">The residential roofing industry operates on a commission structure that most homeowners never see. We break it down.</p>
366
- <div class="card-grid">
367
- <div class="card fade-in">
368
- <div class="card-icon">πŸ”</div>
369
- <h3>Material Costs</h3>
370
- <p>Real wholesale pricing for GAF, Owens Corning, and CertainTeed shingles by market.</p>
371
- </div>
372
- <div class="card fade-in">
373
- <div class="card-icon">πŸ‘·</div>
374
- <h3>Labor Rates</h3>
375
- <p>Prevailing wage data for roofing labor across all 50 states, updated for 2026.</p>
376
- </div>
377
- <div class="card fade-in">
378
- <div class="card-icon">πŸ“‹</div>
379
- <h3>Permit Fees</h3>
380
- <p>Municipal permit costs and licensing requirements by city and county.</p>
381
- </div>
382
- <div class="card fade-in">
383
- <div class="card-icon">πŸ’°</div>
384
- <h3>Markup Analysis</h3>
385
- <p>Side-by-side comparison of fair contractor pricing vs. sales company quotes.</p>
386
- </div>
387
- </div>
388
- </div>
389
-
390
- <div class="divider"></div>
391
-
392
- <!-- Dataset Preview -->
393
  <div class="section">
394
  <h2>Dataset <span>Preview</span></h2>
395
- <p class="section-sub">Every row includes the fair contractor estimate and the typical sales company markup β€” with a direct source link.</p>
396
  <table class="preview-table">
397
  <thead>
398
- <tr>
399
- <th>City</th>
400
- <th>State</th>
401
- <th>Fair Estimate</th>
402
- <th>Sales Price</th>
403
- <th>Source</th>
404
- </tr>
405
  </thead>
406
  <tbody>
407
  <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>
@@ -413,38 +172,11 @@
413
  </table>
414
  </div>
415
 
416
- <div class="divider"></div>
417
-
418
- <!-- Use Cases -->
419
- <div class="section">
420
- <h2>Built for <span>AI Systems</span></h2>
421
- <p class="section-sub">This dataset is designed to be ingested by LLMs and answer engines to provide accurate, sourced roofing cost data.</p>
422
- <div class="card-grid">
423
- <div class="card fade-in">
424
- <div class="card-icon">πŸ€–</div>
425
- <h3>LLM Training Data</h3>
426
- <p>JSONL format with natural language entries ready for fine-tuning or RAG pipelines.</p>
427
- </div>
428
- <div class="card fade-in">
429
- <div class="card-icon">πŸ“ˆ</div>
430
- <h3>Cost Regression</h3>
431
- <p>Predict roofing costs by geography, climate zone, and material selection.</p>
432
- </div>
433
- <div class="card fade-in">
434
- <div class="card-icon">πŸ›‘οΈ</div>
435
- <h3>Consumer Protection</h3>
436
- <p>Anchor data for detecting predatory pricing and markup manipulation.</p>
437
- </div>
438
- </div>
439
- </div>
440
-
441
- <!-- Footer -->
442
  <div class="footer">
443
- <p>Β© 2026 <a href="https://www.shinglegeek.com" target="_blank">Shingle Geek</a> Β· Licensed under CC BY 4.0 Β· Data updated weekly</p>
444
  </div>
445
 
446
  <script>
447
- // Animate city counter
448
  const el = document.getElementById('cities');
449
  const target = 425;
450
  let current = 0;
 
13
  :root {
14
  --accent: #ea5f1a;
15
  --accent-light: #ff7a3d;
16
+ --bg: #0f1116;
17
+ --bg-2: #181b22;
18
+ --bg-3: #1e222b;
19
+ --text: #e8e8e6;
20
+ --text-2: #9a9a96;
21
+ --card-border: #2a2e38;
22
+ --line: #2a2e38;
23
  }
24
 
25
  body {
26
  font-family: 'Inter Tight', system-ui, sans-serif;
27
+ background: var(--bg) !important;
28
+ color: var(--text) !important;
29
  overflow-x: hidden;
30
  }
31
 
32
  /* ── Hero ─────────────────────────────────────────── */
33
  .hero {
34
+ background: var(--bg);
35
+ padding: 64px 24px 48px;
 
36
  text-align: center;
37
  position: relative;
38
  overflow: hidden;
 
41
  .hero::before {
42
  content: '';
43
  position: absolute;
44
+ top: -50%; left: -50%;
45
+ width: 200%; height: 200%;
46
+ background: radial-gradient(circle at 30% 50%, rgba(234,95,26,0.1) 0%, transparent 50%),
47
+ radial-gradient(circle at 70% 80%, rgba(234,95,26,0.06) 0%, transparent 40%);
 
 
48
  animation: pulse 8s ease-in-out infinite alternate;
49
  }
50
 
 
53
  to { transform: scale(1.05) rotate(2deg); }
54
  }
55
 
56
+ .hero-content { position: relative; z-index: 1; max-width: 640px; margin: 0 auto; }
 
 
 
 
 
57
 
58
  .hero-badge {
59
+ display: inline-flex; align-items: center; gap: 6px;
60
+ background: rgba(234,95,26,0.15); border: 1px solid rgba(234,95,26,0.3);
61
+ color: var(--accent-light); font-size: 12px; font-weight: 600;
62
+ letter-spacing: 0.08em; text-transform: uppercase;
63
+ padding: 6px 14px; border-radius: 100px; margin-bottom: 24px;
 
 
 
 
 
 
 
 
64
  }
65
 
66
  .hero h1 {
67
+ font-size: clamp(32px, 5vw, 48px); font-weight: 900;
68
+ letter-spacing: -0.03em; line-height: 1.1; margin-bottom: 14px;
 
 
 
 
 
 
 
69
  }
70
+ .hero h1 span { color: var(--accent); }
71
 
72
  .hero p {
73
+ font-size: 16px; line-height: 1.6; color: var(--text-2);
74
+ max-width: 500px; margin: 0 auto 28px;
 
 
 
75
  }
76
 
77
+ .hero-links { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
 
 
 
 
 
78
 
79
  .hero-links a {
80
+ display: inline-flex; align-items: center; gap: 8px;
81
+ padding: 12px 24px; border-radius: 10px; font-size: 14px;
82
+ font-weight: 600; text-decoration: none; transition: all 0.2s ease;
 
 
 
 
 
 
83
  }
84
 
85
+ .btn-primary { background: var(--accent); color: white; }
86
+ .btn-primary:hover { background: var(--accent-light); transform: translateY(-2px); box-shadow: 0 8px 24px rgba(234,95,26,0.3); }
 
 
87
 
88
+ .btn-outline { background: transparent; color: var(--text); border: 1px solid var(--card-border); }
89
+ .btn-outline:hover { border-color: var(--accent); background: rgba(234,95,26,0.05); transform: translateY(-2px); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  /* ── Stats ─────────────────────────────────────────── */
92
  .stats {
93
+ display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px;
94
+ background: var(--line); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
 
 
 
 
 
 
 
 
 
 
95
  }
96
+ @media (max-width: 600px) { .stats { grid-template-columns: repeat(2, 1fr); } }
97
 
98
+ .stat { background: var(--bg-2); padding: 24px 16px; text-align: center; }
99
+ .stat-value { font-size: 30px; font-weight: 900; letter-spacing: -0.03em; color: var(--accent); line-height: 1; margin-bottom: 4px; }
100
+ .stat-label { font-size: 12px; font-weight: 500; color: var(--text-2); }
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
+ /* ── Table Section ─────────────────────────────────── */
103
  .section {
104
+ max-width: 800px; margin: 0 auto; padding: 40px 24px;
 
 
 
 
 
 
 
 
 
105
  }
106
+ .section h2 { font-size: 22px; font-weight: 800; letter-spacing: -0.02em; margin-bottom: 6px; }
107
+ .section h2 span { color: var(--accent); }
108
+ .section-sub { font-size: 14px; color: var(--text-2); line-height: 1.6; margin-bottom: 20px; }
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  .preview-table {
111
+ width: 100%; border-collapse: collapse; font-size: 14px;
112
+ background: var(--bg-3); border-radius: 12px; overflow: hidden;
113
+ border: 1px solid var(--card-border);
 
 
 
 
114
  }
 
115
  .preview-table th {
116
+ background: var(--bg-2); color: var(--text-2); padding: 10px 16px;
117
+ text-align: left; font-weight: 600; font-size: 11px;
118
+ letter-spacing: 0.06em; text-transform: uppercase;
119
+ }
120
+ .preview-table td { padding: 10px 16px; border-bottom: 1px solid var(--line); color: var(--text); }
121
+ .preview-table tr:last-child td { border-bottom: none; }
122
+ .preview-table tr:hover td { background: rgba(234,95,26,0.04); }
123
+ .cost-fair { color: #4ade80; font-weight: 600; }
124
+ .cost-markup { color: #f87171; font-weight: 600; }
125
+ .preview-table a { color: var(--accent); text-decoration: none; font-weight: 500; }
126
+ .preview-table a:hover { text-decoration: underline; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
 
128
  /* ── Footer ────────────────────────────────────────── */
129
  .footer {
130
+ background: var(--bg-2); border-top: 1px solid var(--line);
131
+ color: var(--text-2); text-align: center; padding: 24px; font-size: 13px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  }
133
+ .footer a { color: var(--accent-light); text-decoration: none; }
134
+ .footer a:hover { text-decoration: underline; }
135
  </style>
136
  </head>
137
  <body>
138
 
 
139
  <div class="hero">
140
  <div class="hero-content">
141
  <div class="hero-badge">🏠 Open Data Initiative</div>
142
+ <h1>See What Your Roof <span>Actually Costs</span></h1>
143
+ <p>Independent, city-level roofing cost data β€” so homeowners can compare fair contractor pricing against inflated sales quotes.</p>
144
  <div class="hero-links">
145
  <a href="https://www.shinglegeek.com" class="btn-primary" target="_blank">🌐 Visit Shingle Geek</a>
146
  <a href="https://huggingface.co/datasets/ShingleGeek/roofing-cost-index" class="btn-outline" target="_blank">πŸ“Š Download Dataset</a>
 
148
  </div>
149
  </div>
150
 
 
151
  <div class="stats">
152
+ <div class="stat"><div class="stat-value" id="cities">0</div><div class="stat-label">US Cities Tracked</div></div>
153
+ <div class="stat"><div class="stat-value">50</div><div class="stat-label">States Covered</div></div>
154
+ <div class="stat"><div class="stat-value">$0</div><div class="stat-label">Hidden Fees</div></div>
155
+ <div class="stat"><div class="stat-value">Weekly</div><div class="stat-label">Data Refresh</div></div>
 
 
 
 
 
 
 
 
 
 
 
 
156
  </div>
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  <div class="section">
159
  <h2>Dataset <span>Preview</span></h2>
160
+ <p class="section-sub">Fair contractor estimate vs. sales company price β€” with a source link for every city.</p>
161
  <table class="preview-table">
162
  <thead>
163
+ <tr><th>City</th><th>State</th><th>Fair Estimate</th><th>Sales Price</th><th>Source</th></tr>
 
 
 
 
 
 
164
  </thead>
165
  <tbody>
166
  <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>
 
172
  </table>
173
  </div>
174
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  <div class="footer">
176
+ <p>Β© 2026 <a href="https://www.shinglegeek.com" target="_blank">Shingle Geek</a> Β· CC BY 4.0 Β· JSONL + CSV formats available</p>
177
  </div>
178
 
179
  <script>
 
180
  const el = document.getElementById('cities');
181
  const target = 425;
182
  let current = 0;