Skip to content

Commit 247cac2

Browse files
committed
Implement complete extension detail page (/ext/:name)
Features implemented: - Route parameter extraction (extension name from URL) - Extension metrics display: readiness %, successes, failures, skipped - Mini-grid showing build status across all PHP versions - Single row with larger cells (80x80px) - Color-coded: green (success), red (failure), gray (skipped/unknown) - Clickable cells open drawer with full build details - Same CellDrawer component reused from matrix page - Failing builds section grouped by PHP version - Shows platform, platform_version, architecture, channel - Displays failure category if available - Links to workflow run and artifact downloads - Clean card layout with visual hierarchy - Friendly 404 page when extension not found - Helpful icon and messaging - Suggests filter settings might be hiding the extension - Link back to matrix with filters preserved - Back to Matrix navigation preserving all query params - Uses buildFilteredURL utility for consistent URLs - All filters applied from URL params - Metrics computed based on current filter set - No failures celebration message when all builds pass CSS updates: - Extension detail page styles (back-link, mini-grid) - Extension not found page (not-found-icon, hints) - Mini grid cells (larger 80x80 with labels) - Failing combinations cards and groups - No failures success message - Mobile responsive layouts Utilities updated: - buildFilteredURL now accepts path parameter for flexible URL building - Updated HomePage to use new buildFilteredURL signature Types and hooks: - Reuses existing MatrixCell, ExtensionMetrics types - Leverages matchesFilters and selectBestResult from matrix utils - Full integration with DatasetContext and useFilters hook
1 parent 10ba3a8 commit 247cac2

4 files changed

Lines changed: 550 additions & 47 deletions

File tree

src/index.css

Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,247 @@ body {
272272
background: var(--gray-200);
273273
}
274274

275+
.back-link {
276+
display: inline-block;
277+
color: var(--primary);
278+
text-decoration: none;
279+
font-size: 0.875rem;
280+
font-weight: 500;
281+
margin-bottom: 1rem;
282+
transition: color 0.2s;
283+
}
284+
285+
.back-link:hover {
286+
color: var(--primary-dark);
287+
text-decoration: underline;
288+
}
289+
275290
.extension-detail-content {
276291
background: white;
277292
padding: 2rem;
278293
border-radius: 0.5rem;
279294
box-shadow: var(--shadow);
280295
}
281296

297+
/* Extension Not Found */
298+
.extension-not-found {
299+
background: white;
300+
padding: 4rem 2rem;
301+
border-radius: 0.5rem;
302+
box-shadow: var(--shadow);
303+
text-align: center;
304+
max-width: 600px;
305+
margin: 2rem auto;
306+
}
307+
308+
.not-found-icon {
309+
font-size: 4rem;
310+
margin-bottom: 1rem;
311+
}
312+
313+
.extension-not-found h2 {
314+
font-size: 1.5rem;
315+
margin-bottom: 1rem;
316+
color: var(--gray-900);
317+
}
318+
319+
.extension-not-found p {
320+
color: var(--gray-600);
321+
margin-bottom: 0.75rem;
322+
}
323+
324+
.not-found-hint {
325+
font-size: 0.875rem;
326+
color: var(--gray-500);
327+
font-style: italic;
328+
}
329+
330+
/* Extension Mini Grid */
331+
.extension-mini-grid {
332+
background: white;
333+
padding: 2rem;
334+
border-radius: 0.5rem;
335+
box-shadow: var(--shadow);
336+
margin-bottom: 2rem;
337+
}
338+
339+
.extension-mini-grid h2 {
340+
font-size: 1.25rem;
341+
margin-bottom: 1.5rem;
342+
color: var(--gray-900);
343+
}
344+
345+
.mini-grid-container {
346+
overflow-x: auto;
347+
}
348+
349+
.mini-grid-row {
350+
display: flex;
351+
gap: 1.5rem;
352+
justify-content: center;
353+
flex-wrap: wrap;
354+
}
355+
356+
.mini-grid-cell-wrapper {
357+
display: flex;
358+
flex-direction: column;
359+
align-items: center;
360+
gap: 0.5rem;
361+
}
362+
363+
.mini-grid-php-label {
364+
font-size: 0.875rem;
365+
font-weight: 600;
366+
color: var(--gray-700);
367+
}
368+
369+
.mini-grid-cell-wrapper .cell {
370+
width: 80px;
371+
height: 80px;
372+
border-radius: 0.5rem;
373+
display: flex;
374+
align-items: center;
375+
justify-content: center;
376+
font-size: 1rem;
377+
font-weight: 600;
378+
box-shadow: var(--shadow);
379+
}
380+
381+
/* Failing Combinations */
382+
.failing-combinations {
383+
background: white;
384+
padding: 2rem;
385+
border-radius: 0.5rem;
386+
box-shadow: var(--shadow);
387+
margin-bottom: 2rem;
388+
}
389+
390+
.failing-combinations h2 {
391+
font-size: 1.25rem;
392+
margin-bottom: 0.5rem;
393+
color: var(--gray-900);
394+
}
395+
396+
.section-subtitle {
397+
color: var(--gray-600);
398+
font-size: 0.875rem;
399+
margin-bottom: 1.5rem;
400+
}
401+
402+
.failure-group {
403+
margin-bottom: 2rem;
404+
}
405+
406+
.failure-group:last-child {
407+
margin-bottom: 0;
408+
}
409+
410+
.failure-group h3 {
411+
font-size: 1rem;
412+
font-weight: 600;
413+
color: var(--primary);
414+
margin-bottom: 1rem;
415+
padding-bottom: 0.5rem;
416+
border-bottom: 2px solid var(--gray-200);
417+
}
418+
419+
.failure-list {
420+
display: grid;
421+
gap: 1rem;
422+
}
423+
424+
.failure-card {
425+
background: var(--gray-50);
426+
border: 1px solid var(--gray-200);
427+
border-left: 3px solid var(--danger);
428+
padding: 1rem;
429+
border-radius: 0.375rem;
430+
}
431+
432+
.failure-header {
433+
display: flex;
434+
justify-content: space-between;
435+
align-items: center;
436+
margin-bottom: 0.5rem;
437+
flex-wrap: wrap;
438+
gap: 0.5rem;
439+
}
440+
441+
.failure-platform {
442+
font-weight: 600;
443+
color: var(--gray-900);
444+
font-size: 0.875rem;
445+
}
446+
447+
.failure-channel {
448+
background: var(--gray-200);
449+
color: var(--gray-700);
450+
padding: 0.25rem 0.5rem;
451+
border-radius: 0.25rem;
452+
font-size: 0.75rem;
453+
font-weight: 600;
454+
}
455+
456+
.failure-category {
457+
font-size: 0.875rem;
458+
color: var(--gray-600);
459+
margin-bottom: 0.5rem;
460+
}
461+
462+
.failure-links {
463+
display: flex;
464+
gap: 0.75rem;
465+
flex-wrap: wrap;
466+
}
467+
468+
.failure-link {
469+
color: var(--primary);
470+
text-decoration: none;
471+
font-size: 0.875rem;
472+
font-weight: 500;
473+
transition: color 0.2s;
474+
}
475+
476+
.failure-link:hover {
477+
color: var(--primary-dark);
478+
text-decoration: underline;
479+
}
480+
481+
/* No Failures Message */
482+
.no-failures-message {
483+
background: white;
484+
padding: 3rem 2rem;
485+
border-radius: 0.5rem;
486+
box-shadow: var(--shadow);
487+
text-align: center;
488+
margin-bottom: 2rem;
489+
}
490+
491+
.success-icon {
492+
width: 64px;
493+
height: 64px;
494+
background: var(--success);
495+
color: white;
496+
font-size: 2rem;
497+
font-weight: bold;
498+
border-radius: 50%;
499+
display: flex;
500+
align-items: center;
501+
justify-content: center;
502+
margin: 0 auto 1rem;
503+
}
504+
505+
.no-failures-message h3 {
506+
font-size: 1.25rem;
507+
margin-bottom: 0.5rem;
508+
color: var(--gray-900);
509+
}
510+
511+
.no-failures-message p {
512+
color: var(--gray-600);
513+
font-size: 0.875rem;
514+
}
515+
282516
/* Schema Warning */
283517
.schema-warning {
284518
background: #fff3cd;

0 commit comments

Comments
 (0)