Layout tree (as in design/layout.json)
{
"pattern": "hero.interactive-grid-hover",
"kind": "hero",
"grid": {
"intro": "1-5",
"tiles": "6-12"
},
"slots": [
"eyebrow",
"headline",
"subhead",
"cta",
"items[6..9]"
],
"notes": "Tiles share borders (gap 0, collapsed borders). On hover a tile fills with the accent and its text switches to onAccent (150–200 ms); each tile is a link (category, service, product). Keyboard focus triggers the same state. No motion beyond the colour change under reduced motion.",
"tree": {
"el": "grid",
"gap": 4,
"align": "stretch",
"minVh": 0.9,
"children": [
{
"el": "box",
"span": "1-5",
"gap": 4,
"pad": [
4,
0
],
"justify": "between",
"children": [
{
"el": "box",
"gap": 3,
"children": [
{
"el": "text",
"slot": "eyebrow",
"role": "eyebrow"
},
{
"el": "text",
"slot": "headline",
"role": "h1",
"step": 6,
"leading": "tight",
"maxCh": 12
}
]
},
{
"el": "box",
"gap": 3,
"children": [
{
"el": "text",
"slot": "subhead",
"role": "body",
"maxCh": 32
},
{
"el": "button",
"slot": "cta",
"variant": "primary",
"arrow": true
}
]
}
]
},
{
"el": "repeat",
"span": "6-12",
"mobile": "scroll-x",
"slot": "items",
"min": 6,
"max": 9,
"layout": "grid",
"cols": 3,
"gap": 0,
"of": {
"el": "box",
"gap": 4,
"pad": [
4,
3
],
"justify": "between",
"border": "all",
"children": [
{
"el": "text",
"color": "textMuted",
"slot": "number",
"role": "label",
"font": "mono"
},
{
"el": "text",
"slot": "title",
"role": "h4"
}
]
}
}
]
}
}