@@ -1428,137 +1428,223 @@
14281428 /* ================================================================
14291429 SCREENSHOTS
14301430 ================================================================ */
1431+
1432+ /*
1433+ * Layout: hero card full-width on top, three smaller cards below.
1434+ * Labels: frosted-glass overlay at the bottom of each image —
1435+ * one line by default, second line revealed on hover.
1436+ */
1437+
14311438 .screenshots-grid {
14321439 display : grid;
1433- grid-template-columns : repeat (2 , 1fr );
1434- gap : 20px ;
1440+ grid-template-columns : repeat (3 , 1fr );
1441+ grid-template-rows : auto auto;
1442+ gap : 14px ;
1443+ }
1444+
1445+ /* Hero card spans all three columns */
1446+ .screenshot-card--hero {
1447+ grid-column : 1 / -1 ;
14351448 }
14361449
1450+ /* ---- Base card ---- */
14371451 .screenshot-card {
14381452 border-radius : var (--radius );
14391453 border : 1px solid var (--glass-border );
14401454 overflow : hidden;
1441- background : var (--glass-bg );
1455+ background : var (--bg-surface );
14421456 box-shadow : var (--card-shadow );
1443- transition : border-color 200ms , transform 250ms var (--ease-spring ), box-shadow 250ms ;
1457+ transition :
1458+ border-color 220ms ease,
1459+ transform 300ms var (--ease-spring ),
1460+ box-shadow 300ms ease;
14441461 position : relative;
1462+ cursor : pointer;
1463+ }
1464+
1465+ /* Gradient border glow — layered behind the card */
1466+ .screenshot-card ::after {
1467+ content : '' ;
1468+ position : absolute;
1469+ inset : -1px ;
1470+ border-radius : calc (var (--radius ) + 1px );
1471+ background : linear-gradient (
1472+ 135deg ,
1473+ rgba (99 , 102 , 241 , 0.55 ) 0% ,
1474+ rgba (15 , 250 , 122 , 0.25 ) 100%
1475+ );
1476+ opacity : 0 ;
1477+ transition : opacity 320ms ease;
1478+ pointer-events : none;
1479+ z-index : -1 ;
14451480 }
14461481
14471482 .screenshot-card : hover {
1448- border-color : rgba (99 , 102 , 241 , 0.28 );
1449- transform : translateY (-3 px );
1483+ border-color : rgba (99 , 102 , 241 , 0.32 );
1484+ transform : translateY (-4 px );
14501485 box-shadow : var (--card-shadow-hover );
14511486 }
14521487
1453- .screenshot-placeholder {
1454- aspect-ratio : 16 / 10 ;
1455- background :
1456- linear-gradient (135deg , rgba (99 , 102 , 241 , 0.06 ) 0% , transparent 70% ),
1457- var (--bg-surface );
1458- display : flex;
1459- align-items : center;
1460- justify-content : center;
1461- font-family : var (--font-mono );
1462- font-size : 0.8rem ;
1463- color : var (--text-dim );
1488+ .screenshot-card : hover ::after ,
1489+ .screenshot-card : focus-visible ::after {
1490+ opacity : 1 ;
14641491 }
14651492
1466- .screenshot-card img {
1467- width : 100% ;
1468- height : auto;
1469- display : block;
1493+ /* Keyboard focus ring */
1494+ .screenshot-card : focus-visible {
1495+ outline : 2px solid var (--indigo );
1496+ outline-offset : 3px ;
1497+ border-color : rgba (99 , 102 , 241 , 0.32 );
1498+ transform : translateY (-4px );
1499+ box-shadow : var (--card-shadow-hover );
14701500 }
14711501
1472- .screenshot-label {
1473- padding : 12px 16px ;
1474- font-size : 0.85rem ;
1475- color : var (--text-muted );
1476- border-top : 1px solid var (--border );
1477- display : flex;
1478- align-items : center;
1479- gap : 10px ;
1502+ /* ---- Image wrapper — clips the zoom transform ---- */
1503+ .screenshot-img-wrap {
1504+ overflow : hidden;
1505+ display : block;
1506+ position : relative;
1507+ line-height : 0 ; /* remove phantom gap under inline image */
14801508 }
14811509
1482- .screenshot-label-icon {
1483- width : 28px ; height : 28px ;
1484- border-radius : 7px ;
1485- background : rgba (99 , 102 , 241 , 0.12 );
1486- border : 1px solid rgba (99 , 102 , 241 , 0.2 );
1487- color : var (--indigo-light );
1488- display : flex; align-items : center; justify-content : center;
1489- flex-shrink : 0 ;
1490- transition : background 200ms , border-color 200ms ;
1510+ /* Hero: wider crop; secondary cards: squarer crop to keep grid tight */
1511+ .screenshot-card--hero .screenshot-img-wrap {
1512+ aspect-ratio : 16 / 7 ;
14911513 }
14921514
1493- .screenshot-label-icon svg {
1494- width : 14px ; height : 14px ;
1495- stroke : currentColor; fill : none;
1496- stroke-width : 2 ; stroke-linecap : round; stroke-linejoin : round;
1515+ .screenshot-card--secondary .screenshot-img-wrap {
1516+ aspect-ratio : 4 / 3 ;
14971517 }
14981518
1499- .screenshot-label-text strong {
1519+ .screenshot-card img {
1520+ width : 100% ;
1521+ height : 100% ;
1522+ object-fit : cover;
1523+ object-position : top left;
15001524 display : block;
1501- font-weight : 600 ;
1502- font-size : 0.88rem ;
1503- color : var (--text );
1504- letter-spacing : -0.01em ;
1525+ transition : transform 500ms var (--ease-out );
1526+ will-change : transform;
15051527 }
15061528
1507- .screenshot-label-text span {
1508- font-size : 0.78 rem ;
1509- color : var ( --text-dim );
1529+ .screenshot-card : hover img ,
1530+ . screenshot-card : focus-visible img {
1531+ transform : scale ( 1.035 );
15101532 }
15111533
1512- /* Card glow on hover/focus — GPU composited, no backdrop-filter */
1513- .screenshot-card {
1514- cursor : pointer;
1515- }
1516-
1517- .screenshot-card : hover .screenshot-label-icon ,
1518- .screenshot-card : focus-within .screenshot-label-icon {
1519- background : rgba (99 , 102 , 241 , 0.22 );
1520- border-color : rgba (99 , 102 , 241 , 0.4 );
1534+ /* ---- Scan-line shimmer on the hero card only ---- */
1535+ .screenshot-card--hero .screenshot-img-wrap ::before {
1536+ content : '' ;
1537+ position : absolute;
1538+ inset : 0 ;
1539+ background : repeating-linear-gradient (
1540+ 0deg ,
1541+ transparent,
1542+ transparent 3px ,
1543+ rgba (0 , 0 , 0 , 0.07 ) 3px ,
1544+ rgba (0 , 0 , 0 , 0.07 ) 4px
1545+ );
1546+ pointer-events : none;
1547+ z-index : 1 ;
15211548 }
15221549
1523- /* Animated gradient border glow on hover — pointer-events safe */
1524- .screenshot-card ::after {
1550+ /* Subtle top-to-bottom vignette so the overlay reads cleanly */
1551+ .screenshot-img-wrap ::after {
15251552 content : '' ;
15261553 position : absolute;
1527- inset : -1px ;
1528- border-radius : calc (var (--radius ) + 1px );
1529- background : linear-gradient (135deg ,
1530- rgba (99 , 102 , 241 , 0 ) 0% ,
1531- rgba (99 , 102 , 241 , 0.4 ) 50% ,
1532- rgba (15 , 250 , 122 , 0.2 ) 100%
1554+ inset : 0 ;
1555+ background : linear-gradient (
1556+ to bottom,
1557+ transparent 55% ,
1558+ rgba (7 , 9 , 26 , 0.72 ) 100%
15331559 );
1534- opacity : 0 ;
1535- transition : opacity 300ms ease;
15361560 pointer-events : none;
1537- z-index : -1 ;
1561+ z-index : 2 ;
15381562 }
15391563
1540- .screenshot-card : hover ::after ,
1541- .screenshot-card : focus-visible ::after {
1542- opacity : 1 ;
1564+ /* ---- Frosted-glass overlay label ---- */
1565+ .screenshot-label {
1566+ position : absolute;
1567+ bottom : 0 ;
1568+ left : 0 ;
1569+ right : 0 ;
1570+ z-index : 3 ;
1571+ padding : 10px 14px 11px ;
1572+ /* backdrop-filter for browsers that support it; degrades to semi-opaque bg */
1573+ background : rgba (7 , 9 , 26 , 0.62 );
1574+ backdrop-filter : blur (10px ) saturate (1.4 );
1575+ -webkit-backdrop-filter : blur (10px ) saturate (1.4 );
1576+ border-top : 1px solid rgba (255 , 255 , 255 , 0.07 );
1577+
1578+ display : flex;
1579+ flex-direction : column;
1580+ gap : 0 ;
1581+ overflow : hidden;
15431582 }
15441583
1545- /* Keyboard focus ring — matches .btn :focus-visible pattern */
1546- .screenshot-card : focus-visible {
1547- outline : 2px solid var (--indigo );
1548- outline-offset : 3px ;
1549- border-color : rgba (99 , 102 , 241 , 0.28 );
1550- transform : translateY (-3px );
1551- box-shadow : var (--card-shadow-hover );
1584+ .screenshot-label-title {
1585+ font-size : 0.8rem ;
1586+ font-weight : 600 ;
1587+ color : rgba (255 , 255 , 255 , 0.9 );
1588+ letter-spacing : 0.01em ;
1589+ white-space : nowrap;
1590+ overflow : hidden;
1591+ text-overflow : ellipsis;
1592+ line-height : 1.3 ;
15521593 }
15531594
1554- /* Ensure label-icon lights up on keyboard focus too */
1555- .screenshot-card : focus-visible .screenshot-label-icon {
1556- background : rgba (99 , 102 , 241 , 0.22 );
1557- border-color : rgba (99 , 102 , 241 , 0.4 );
1595+ .screenshot-label-desc {
1596+ font-size : 0.72rem ;
1597+ color : var (--text-dim );
1598+ white-space : nowrap;
1599+ overflow : hidden;
1600+ text-overflow : ellipsis;
1601+ line-height : 1.3 ;
1602+ /* Collapsed by default — slides in on hover */
1603+ max-height : 0 ;
1604+ opacity : 0 ;
1605+ transform : translateY (4px );
1606+ transition :
1607+ max-height 260ms var (--ease-out ),
1608+ opacity 220ms ease,
1609+ transform 220ms var (--ease-out );
15581610 }
15591611
1560- @media (max-width : 640px ) {
1561- .screenshots-grid { grid-template-columns : 1fr ; }
1612+ .screenshot-card : hover .screenshot-label-desc ,
1613+ .screenshot-card : focus-visible .screenshot-label-desc {
1614+ max-height : 2em ;
1615+ opacity : 1 ;
1616+ transform : translateY (0 );
1617+ }
1618+
1619+ /* ---- Responsive ---- */
1620+ @media (max-width : 840px ) {
1621+ .screenshots-grid {
1622+ grid-template-columns : repeat (2 , 1fr );
1623+ }
1624+ /* Hero still spans both columns */
1625+ .screenshot-card--hero {
1626+ grid-column : 1 / -1 ;
1627+ }
1628+ /* Third secondary card: span both columns at this breakpoint */
1629+ .screenshot-card--secondary : last-child {
1630+ grid-column : 1 / -1 ;
1631+ }
1632+ }
1633+
1634+ @media (max-width : 560px ) {
1635+ .screenshots-grid {
1636+ grid-template-columns : 1fr ;
1637+ }
1638+ .screenshot-card--hero ,
1639+ .screenshot-card--secondary : last-child {
1640+ grid-column : unset;
1641+ }
1642+ .screenshot-card--hero .screenshot-img-wrap {
1643+ aspect-ratio : 16 / 9 ;
1644+ }
1645+ .screenshot-card--secondary .screenshot-img-wrap {
1646+ aspect-ratio : 16 / 10 ;
1647+ }
15621648 }
15631649
15641650 /* ================================================================
@@ -3238,37 +3324,49 @@ <h2 class="section-title">See it in action.</h2>
32383324 </ div >
32393325
32403326 < div class ="screenshots-grid ">
3241- < div class ="screenshot-card " tabindex ="0 " data-reveal data-reveal-delay ="1 ">
3242- < img src ="/screenshots/screenshot-1.jpg " alt ="Agent editor drawer showing security-engineer persona configuration with tools, model selection, and persona text " loading ="lazy " width ="1280 " height ="800 ">
3243- < div class ="screenshot-label ">
3244- < span class ="screenshot-label-icon " aria-hidden ="true "> < svg viewBox ="0 0 24 24 "> < path d ="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7 "/> < path d ="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z "/> </ svg > </ span >
3245- < span class ="screenshot-label-text "> < strong > Agent editor</ strong > < span > Configure tools, model, and persona per agent</ span > </ span >
3327+
3328+ <!-- Hero card — full row, wider crop -->
3329+ < div class ="screenshot-card screenshot-card--hero " tabindex ="0 " data-reveal data-reveal-delay ="1 ">
3330+ < div class ="screenshot-img-wrap ">
3331+ < img src ="/screenshots/screenshot-2.jpg " alt ="Full dashboard view with agent list on left, task board in center showing epics and phases, and activity log on right " loading ="lazy " width ="1280 " height ="800 ">
3332+ </ div >
3333+ < div class ="screenshot-label " aria-label ="Task board — Real-time epic and task tracking across all agents ">
3334+ < span class ="screenshot-label-title "> Task board</ span >
3335+ < span class ="screenshot-label-desc " aria-hidden ="true "> Real-time epic and task tracking across all agents</ span >
32463336 </ div >
32473337 </ div >
32483338
3249- < div class ="screenshot-card " tabindex ="0 " data-reveal data-reveal-delay ="2 ">
3250- < img src ="/screenshots/screenshot-2.jpg " alt ="Full dashboard view with agent list on left, task board in center showing epics and phases, and activity log on right " loading ="lazy " width ="1280 " height ="800 ">
3251- < div class ="screenshot-label ">
3252- < span class ="screenshot-label-icon " aria-hidden ="true "> < svg viewBox ="0 0 24 24 "> < rect x ="3 " y ="3 " width ="18 " height ="18 " rx ="2 "/> < line x1 ="3 " y1 ="9 " x2 ="21 " y2 ="9 "/> < line x1 ="9 " y1 ="21 " x2 ="9 " y2 ="9 "/> </ svg > </ span >
3253- < span class ="screenshot-label-text "> < strong > Task board</ strong > < span > Real-time epic and task tracking across all agents</ span > </ span >
3339+ <!-- Secondary cards — three columns below -->
3340+ < div class ="screenshot-card screenshot-card--secondary " tabindex ="0 " data-reveal data-reveal-delay ="2 ">
3341+ < div class ="screenshot-img-wrap ">
3342+ < img src ="/screenshots/screenshot-1.jpg " alt ="Agent editor drawer showing security-engineer persona configuration with tools, model selection, and persona text " loading ="lazy " width ="1280 " height ="800 ">
3343+ </ div >
3344+ < div class ="screenshot-label " aria-label ="Agent editor — Configure tools, model, and persona per agent ">
3345+ < span class ="screenshot-label-title "> Agent editor</ span >
3346+ < span class ="screenshot-label-desc " aria-hidden ="true "> Configure tools, model, and persona per agent</ span >
32543347 </ div >
32553348 </ div >
32563349
3257- < div class ="screenshot-card " tabindex ="0 " data-reveal data-reveal-delay ="3 ">
3258- < img src ="/screenshots/screenshot-3.jpg " alt ="New Agent creation dialog with fields for name, description, model selection, tools, and persona text " loading ="lazy " width ="1280 " height ="800 ">
3259- < div class ="screenshot-label ">
3260- < span class ="screenshot-label-icon " aria-hidden ="true "> < svg viewBox ="0 0 24 24 "> < circle cx ="12 " cy ="8 " r ="4 "/> < path d ="M20 21a8 8 0 1 0-16 0 "/> < line x1 ="12 " y1 ="15 " x2 ="12 " y2 ="21 "/> < line x1 ="9 " y1 ="18 " x2 ="15 " y2 ="18 "/> </ svg > </ span >
3261- < span class ="screenshot-label-text "> < strong > Agent creator</ strong > < span > Define new agents in seconds</ span > </ span >
3350+ < div class ="screenshot-card screenshot-card--secondary " tabindex ="0 " data-reveal data-reveal-delay ="3 ">
3351+ < div class ="screenshot-img-wrap ">
3352+ < img src ="/screenshots/screenshot-3.jpg " alt ="New Agent creation dialog with fields for name, description, model selection, tools, and persona text " loading ="lazy " width ="1280 " height ="800 ">
3353+ </ div >
3354+ < div class ="screenshot-label " aria-label ="Agent creator — Define new agents in seconds ">
3355+ < span class ="screenshot-label-title "> Agent creator</ span >
3356+ < span class ="screenshot-label-desc " aria-hidden ="true "> Define new agents in seconds</ span >
32623357 </ div >
32633358 </ div >
32643359
3265- < div class ="screenshot-card " tabindex ="0 " data-reveal data-reveal-delay ="4 ">
3266- < img src ="/screenshots/screenshot-4.jpg " alt ="Projects browser dialog showing local git repositories that can be connected to Dispatch " loading ="lazy " width ="1280 " height ="800 ">
3267- < div class ="screenshot-label ">
3268- < span class ="screenshot-label-icon " aria-hidden ="true "> < svg viewBox ="0 0 24 24 "> < path d ="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z "/> </ svg > </ span >
3269- < span class ="screenshot-label-text "> < strong > Project browser</ strong > < span > Connect any local repo with one click</ span > </ span >
3360+ < div class ="screenshot-card screenshot-card--secondary " tabindex ="0 " data-reveal data-reveal-delay ="4 ">
3361+ < div class ="screenshot-img-wrap ">
3362+ < img src ="/screenshots/screenshot-4.jpg " alt ="Projects browser dialog showing local git repositories that can be connected to Dispatch " loading ="lazy " width ="1280 " height ="800 ">
3363+ </ div >
3364+ < div class ="screenshot-label " aria-label ="Project browser — Connect any local repo with one click ">
3365+ < span class ="screenshot-label-title "> Project browser</ span >
3366+ < span class ="screenshot-label-desc " aria-hidden ="true "> Connect any local repo with one click</ span >
32703367 </ div >
32713368 </ div >
3369+
32723370 </ div >
32733371 </ div >
32743372 </ section >
0 commit comments