img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}.wp-block-site-title{box-sizing:border-box}.wp-block-site-title :where(a){color:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}.link-ui-tools{outline:1px solid #f0f0f0;padding:8px}.link-ui-block-inserter{padding-top:8px}.link-ui-block-inserter__back{margin-left:8px;text-transform:uppercase}.wp-block-navigation{position:relative}.wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none;padding:0}.wp-block-navigation .wp-block-navigation-item{align-items:center;background-color:inherit;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block;z-index:1}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation :where(a),.wp-block-navigation :where(a:active),.wp-block-navigation :where(a:focus){text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-left:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{stroke:currentColor;display:inline-block;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation{--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;opacity:0;position:absolute;z-index:2}@media not (prefers-reduced-motion){.wp-block-navigation .has-child .wp-block-navigation__submenu-container{transition:opacity .1s linear}}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{height:0;overflow:hidden;visibility:hidden;width:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1;padding:.5em 1em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:auto;margin-right:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{left:-1px;top:100%}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-right:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(-90deg)}}@media (hover:hover){.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation .has-child.open-always{align-items:var(--navigation-layout-align,initial);flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);gap:var(--wp--style--block-gap,2em)}.wp-block-navigation .has-child.open-always,.wp-block-navigation .has-child.open-always .wp-block-navigation-item{justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container,.wp-block-navigation .has-child.open-always.wp-block-navigation-submenu{gap:var(--wp--style--block-gap,2em)}.wp-block-navigation .has-child.open-always .wp-block-navigation-item,.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container,.wp-block-navigation .has-child.open-always.wp-block-navigation-submenu{padding-bottom:0;padding-top:0}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container{padding-left:var(--wp--style--block-gap,2em);padding-right:var(--wp--style--block-gap,2em)}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container .wp-block-navigation-item__content{padding:0}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content,.wp-block-navigation .has-child.open-always>.wp-block-navigation-item__content{flex-grow:0}.wp-block-navigation .has-child.open-always>.wp-block-navigation__submenu-container{background-color:initial;border:none;color:inherit;flex-basis:100%;height:auto;opacity:1;overflow:visible;position:static;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{left:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:initial;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-align:left;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-submenu__toggle[aria-expanded=true]+.wp-block-navigation__submenu-icon>svg,.wp-block-navigation-submenu__toggle[aria-expanded=true]>svg{transform:rotate(180deg)}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-left:0;padding-right:.85em}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-left:-.6em;pointer-events:none}.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){padding:0}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:auto;right:0}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:auto;right:100%}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid #00000026}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{color:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-left:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{background-color:inherit;display:flex;flex-direction:column}@media not (prefers-reduced-motion){.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards}}.wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay){padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-left),20rem)}.wp-block-navigation__responsive-container.is-menu-open{overflow:auto;z-index:100000}.wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay) .wp-block-navigation__responsive-container-content{padding-top:calc(2rem + 24px)}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-page-list{background:#0000!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}.wp-block-navigation__responsive-container.disable-default-overlay .wp-block-navigation__overlay-container{display:none;width:100%}.wp-block-navigation__responsive-container.disable-default-overlay .wp-block-navigation__responsive-close{max-width:none}.wp-block-navigation__responsive-container.disable-default-overlay.is-menu-open .wp-block-navigation__responsive-container-content>:not(.wp-block-navigation__overlay-container){display:none}.wp-block-navigation__responsive-container.disable-default-overlay.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__overlay-container{display:block}.wp-block-navigation__responsive-container.disable-default-overlay.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__overlay-container .wp-block-navigation__submenu-container{left:0;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay){background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay){color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:#0000;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{position:absolute;right:0;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.disable-default-overlay .wp-block-navigation__responsive-container-close{right:clamp(1rem,var(--wp--style--root--padding-left),20rem);top:clamp(1rem,var(--wp--style--root--padding-left),20rem)}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}.has-modal-open .admin-bar .is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}.wp-block-button__link{align-content:center;box-sizing:border-box;cursor:pointer;display:inline-block;height:100%;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}:root :where(.wp-block-button .wp-block-button__link.is-style-outline),:root :where(.wp-block-button.is-style-outline>.wp-block-button__link){border:2px solid;padding:.667em 1.333em}:root :where(.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color)),:root :where(.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color)){color:currentColor}:root :where(.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background)),:root :where(.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background)){background-color:initial;background-image:none}.wp-block-buttons{box-sizing:border-box}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons .wp-block-button__link{width:100%}.wp-block-button.aligncenter{text-align:center}.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative}.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title :where(a){display:inline-block;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}.wp-block-columns{box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns{align-items:normal!important}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0%;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0%;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-post-content{display:flow-root}ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:1.25em 2.375em}:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}:root{--wp--preset--aspect-ratio--square:1;--wp--preset--aspect-ratio--4-3:4/3;--wp--preset--aspect-ratio--3-4:3/4;--wp--preset--aspect-ratio--3-2:3/2;--wp--preset--aspect-ratio--2-3:2/3;--wp--preset--aspect-ratio--16-9:16/9;--wp--preset--aspect-ratio--9-16:9/16;--wp--preset--color--black:#000000;--wp--preset--color--cyan-bluish-gray:#abb8c3;--wp--preset--color--white:#ffffff;--wp--preset--color--pale-pink:#f78da7;--wp--preset--color--vivid-red:#cf2e2e;--wp--preset--color--luminous-vivid-orange:#ff6900;--wp--preset--color--luminous-vivid-amber:#fcb900;--wp--preset--color--light-green-cyan:#7bdcb5;--wp--preset--color--vivid-green-cyan:#00d084;--wp--preset--color--pale-cyan-blue:#8ed1fc;--wp--preset--color--vivid-cyan-blue:#0693e3;--wp--preset--color--vivid-purple:#9b51e0;--wp--preset--color--background:#ffffff;--wp--preset--color--surface:#f5f6f7;--wp--preset--color--primary:#16171a;--wp--preset--color--secondary:#5a5c63;--wp--preset--color--accent:#e02b20;--wp--preset--color--accent-dark:#be251b;--wp--preset--color--light:#fdf2f1;--wp--preset--color--dark:#0b0c0e;--wp--preset--color--graphite:#3c3d44;--wp--preset--color--graphite-deep:#2f3036;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple:linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan:linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange:linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red:linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray:linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum:linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple:linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux:linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk:linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean:linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass:linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight:linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--gradient--dark-fade:linear-gradient(135deg, #2f3036 0%, #3c3d44 55%, #45464e 100%);--wp--preset--gradient--red-sheen:linear-gradient(120deg, #d80e00 0%, #f4574c 50%, #d80e00 100%);--wp--preset--font-size--small:13px;--wp--preset--font-size--medium:20px;--wp--preset--font-size--large:36px;--wp--preset--font-size--x-large:42px;--wp--preset--font-size--xx-large:clamp(2.25rem, 4.1vw, 3.15rem);--wp--preset--font-size--huge:clamp(2.8rem, 5.6vw, 4.5rem);--wp--preset--font-family--heading:"Fraunces", "Iowan Old Style", Georgia, serif;--wp--preset--font-family--body:"Manrope", -apple-system, BlinkMacSystemFont, sans-serif;--wp--preset--spacing--20:0.44rem;--wp--preset--spacing--30:0.67rem;--wp--preset--spacing--40:1rem;--wp--preset--spacing--50:1.5rem;--wp--preset--spacing--60:2.25rem;--wp--preset--spacing--70:3.38rem;--wp--preset--spacing--80:5.06rem;--wp--preset--spacing--10:0.5rem;--wp--preset--shadow--natural:6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep:12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp:6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined:6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp:6px 6px 0px rgb(0, 0, 0)}:root{--wp--style--global--content-size:680px;--wp--style--global--wide-size:1240px}:where(body){margin:0}.wp-site-blocks>.alignleft{float:left;margin-right:2em}.wp-site-blocks>.alignright{float:right;margin-left:2em}.wp-site-blocks>.aligncenter{justify-content:center;margin-left:auto;margin-right:auto}:where(.wp-site-blocks)>*{margin-block-start:1.85rem;margin-block-end:0}:where(.wp-site-blocks)>:first-child{margin-block-start:0}:where(.wp-site-blocks)>:last-child{margin-block-end:0}:root{--wp--style--block-gap:1.85rem}:root :where(.is-layout-flow)>:first-child{margin-block-start:0}:root :where(.is-layout-flow)>:last-child{margin-block-end:0}:root :where(.is-layout-flow)>*{margin-block-start:1.85rem;margin-block-end:0}:root :where(.is-layout-constrained)>:first-child{margin-block-start:0}:root :where(.is-layout-constrained)>:last-child{margin-block-end:0}:root :where(.is-layout-constrained)>*{margin-block-start:1.85rem;margin-block-end:0}:root :where(.is-layout-flex){gap:1.85rem}:root :where(.is-layout-grid){gap:1.85rem}.is-layout-flow>.alignleft{float:left;margin-inline-start:0;margin-inline-end:2em}.is-layout-flow>.alignright{float:right;margin-inline-start:2em;margin-inline-end:0}.is-layout-flow>.aligncenter{margin-left:auto!important;margin-right:auto!important}.is-layout-constrained>.alignleft{float:left;margin-inline-start:0;margin-inline-end:2em}.is-layout-constrained>.alignright{float:right;margin-inline-start:2em;margin-inline-end:0}.is-layout-constrained>.aligncenter{margin-left:auto!important;margin-right:auto!important}.is-layout-constrained>:where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:var(--wp--style--global--content-size);margin-left:auto!important;margin-right:auto!important}.is-layout-constrained>.alignwide{max-width:var(--wp--style--global--wide-size)}body .is-layout-flex{display:flex}.is-layout-flex{flex-wrap:wrap;align-items:center}.is-layout-flex>:is(*,div){margin:0}body .is-layout-grid{display:grid}.is-layout-grid>:is(*,div){margin:0}body{background-color:var(--wp--preset--color--background);color:var(--wp--preset--color--primary);font-family:var(--wp--preset--font-family--body);font-size:var(--wp--preset--font-size--medium);letter-spacing:.002em;line-height:1.7;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0}a:where(:not(.wp-element-button)){color:var(--wp--preset--color--accent-dark);text-decoration:none}:root :where(a:where(:not(.wp-element-button)):hover){color:var(--wp--preset--color--accent);text-decoration:underline}h1,h2,h3,h4,h5,h6{color:var(--wp--preset--color--primary);font-family:var(--wp--preset--font-family--heading);font-weight:700;letter-spacing:-.02em;line-height:1.15}h1{font-size:var(--wp--preset--font-size--huge);font-weight:700;letter-spacing:-.03em;line-height:1.06}h2{font-size:var(--wp--preset--font-size--xx-large);font-weight:700;letter-spacing:-.025em;line-height:1.18}h3{font-size:var(--wp--preset--font-size--x-large);font-weight:600;letter-spacing:-.015em;line-height:1.3}h4{font-size:1.3rem;font-weight:600;letter-spacing:-.01em;line-height:1.4}:root :where(.wp-element-button,.wp-block-button__link){background-color:var(--wp--preset--color--accent);border-radius:var(--hrp-radius-md,10px);border-width:0;color:var(--wp--preset--color--background);font-family:inherit;font-size:1.0625rem;font-style:inherit;font-weight:700;letter-spacing:.01em;line-height:1.2;padding-top:1.05rem;padding-right:2.25rem;padding-bottom:1.05rem;padding-left:2.25rem;text-decoration:none;text-transform:inherit}:root :where(.wp-element-button:hover,.wp-block-button__link:hover){background-color:var(--wp--preset--color--accent-dark);color:var(--wp--preset--color--background)}.has-black-color{color:var(--wp--preset--color--black)!important}.has-cyan-bluish-gray-color{color:var(--wp--preset--color--cyan-bluish-gray)!important}.has-white-color{color:var(--wp--preset--color--white)!important}.has-pale-pink-color{color:var(--wp--preset--color--pale-pink)!important}.has-vivid-red-color{color:var(--wp--preset--color--vivid-red)!important}.has-luminous-vivid-orange-color{color:var(--wp--preset--color--luminous-vivid-orange)!important}.has-luminous-vivid-amber-color{color:var(--wp--preset--color--luminous-vivid-amber)!important}.has-light-green-cyan-color{color:var(--wp--preset--color--light-green-cyan)!important}.has-vivid-green-cyan-color{color:var(--wp--preset--color--vivid-green-cyan)!important}.has-pale-cyan-blue-color{color:var(--wp--preset--color--pale-cyan-blue)!important}.has-vivid-cyan-blue-color{color:var(--wp--preset--color--vivid-cyan-blue)!important}.has-vivid-purple-color{color:var(--wp--preset--color--vivid-purple)!important}.has-background-color{color:var(--wp--preset--color--background)!important}.has-surface-color{color:var(--wp--preset--color--surface)!important}.has-primary-color{color:var(--wp--preset--color--primary)!important}.has-secondary-color{color:var(--wp--preset--color--secondary)!important}.has-accent-color{color:var(--wp--preset--color--accent)!important}.has-accent-dark-color{color:var(--wp--preset--color--accent-dark)!important}.has-light-color{color:var(--wp--preset--color--light)!important}.has-dark-color{color:var(--wp--preset--color--dark)!important}.has-graphite-color{color:var(--wp--preset--color--graphite)!important}.has-graphite-deep-color{color:var(--wp--preset--color--graphite-deep)!important}.has-black-background-color{background-color:var(--wp--preset--color--black)!important}.has-cyan-bluish-gray-background-color{background-color:var(--wp--preset--color--cyan-bluish-gray)!important}.has-white-background-color{background-color:var(--wp--preset--color--white)!important}.has-pale-pink-background-color{background-color:var(--wp--preset--color--pale-pink)!important}.has-vivid-red-background-color{background-color:var(--wp--preset--color--vivid-red)!important}.has-luminous-vivid-orange-background-color{background-color:var(--wp--preset--color--luminous-vivid-orange)!important}.has-luminous-vivid-amber-background-color{background-color:var(--wp--preset--color--luminous-vivid-amber)!important}.has-light-green-cyan-background-color{background-color:var(--wp--preset--color--light-green-cyan)!important}.has-vivid-green-cyan-background-color{background-color:var(--wp--preset--color--vivid-green-cyan)!important}.has-pale-cyan-blue-background-color{background-color:var(--wp--preset--color--pale-cyan-blue)!important}.has-vivid-cyan-blue-background-color{background-color:var(--wp--preset--color--vivid-cyan-blue)!important}.has-vivid-purple-background-color{background-color:var(--wp--preset--color--vivid-purple)!important}.has-background-background-color{background-color:var(--wp--preset--color--background)!important}.has-surface-background-color{background-color:var(--wp--preset--color--surface)!important}.has-primary-background-color{background-color:var(--wp--preset--color--primary)!important}.has-secondary-background-color{background-color:var(--wp--preset--color--secondary)!important}.has-accent-background-color{background-color:var(--wp--preset--color--accent)!important}.has-accent-dark-background-color{background-color:var(--wp--preset--color--accent-dark)!important}.has-light-background-color{background-color:var(--wp--preset--color--light)!important}.has-dark-background-color{background-color:var(--wp--preset--color--dark)!important}.has-graphite-background-color{background-color:var(--wp--preset--color--graphite)!important}.has-graphite-deep-background-color{background-color:var(--wp--preset--color--graphite-deep)!important}.has-black-border-color{border-color:var(--wp--preset--color--black)!important}.has-cyan-bluish-gray-border-color{border-color:var(--wp--preset--color--cyan-bluish-gray)!important}.has-white-border-color{border-color:var(--wp--preset--color--white)!important}.has-pale-pink-border-color{border-color:var(--wp--preset--color--pale-pink)!important}.has-vivid-red-border-color{border-color:var(--wp--preset--color--vivid-red)!important}.has-luminous-vivid-orange-border-color{border-color:var(--wp--preset--color--luminous-vivid-orange)!important}.has-luminous-vivid-amber-border-color{border-color:var(--wp--preset--color--luminous-vivid-amber)!important}.has-light-green-cyan-border-color{border-color:var(--wp--preset--color--light-green-cyan)!important}.has-vivid-green-cyan-border-color{border-color:var(--wp--preset--color--vivid-green-cyan)!important}.has-pale-cyan-blue-border-color{border-color:var(--wp--preset--color--pale-cyan-blue)!important}.has-vivid-cyan-blue-border-color{border-color:var(--wp--preset--color--vivid-cyan-blue)!important}.has-vivid-purple-border-color{border-color:var(--wp--preset--color--vivid-purple)!important}.has-background-border-color{border-color:var(--wp--preset--color--background)!important}.has-surface-border-color{border-color:var(--wp--preset--color--surface)!important}.has-primary-border-color{border-color:var(--wp--preset--color--primary)!important}.has-secondary-border-color{border-color:var(--wp--preset--color--secondary)!important}.has-accent-border-color{border-color:var(--wp--preset--color--accent)!important}.has-accent-dark-border-color{border-color:var(--wp--preset--color--accent-dark)!important}.has-light-border-color{border-color:var(--wp--preset--color--light)!important}.has-dark-border-color{border-color:var(--wp--preset--color--dark)!important}.has-graphite-border-color{border-color:var(--wp--preset--color--graphite)!important}.has-graphite-deep-border-color{border-color:var(--wp--preset--color--graphite-deep)!important}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple)!important}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan)!important}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange)!important}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background:var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red)!important}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray)!important}.has-cool-to-warm-spectrum-gradient-background{background:var(--wp--preset--gradient--cool-to-warm-spectrum)!important}.has-blush-light-purple-gradient-background{background:var(--wp--preset--gradient--blush-light-purple)!important}.has-blush-bordeaux-gradient-background{background:var(--wp--preset--gradient--blush-bordeaux)!important}.has-luminous-dusk-gradient-background{background:var(--wp--preset--gradient--luminous-dusk)!important}.has-pale-ocean-gradient-background{background:var(--wp--preset--gradient--pale-ocean)!important}.has-electric-grass-gradient-background{background:var(--wp--preset--gradient--electric-grass)!important}.has-midnight-gradient-background{background:var(--wp--preset--gradient--midnight)!important}.has-dark-fade-gradient-background{background:var(--wp--preset--gradient--dark-fade)!important}.has-red-sheen-gradient-background{background:var(--wp--preset--gradient--red-sheen)!important}.has-small-font-size{font-size:var(--wp--preset--font-size--small)!important}.has-medium-font-size{font-size:var(--wp--preset--font-size--medium)!important}.has-large-font-size{font-size:var(--wp--preset--font-size--large)!important}.has-x-large-font-size{font-size:var(--wp--preset--font-size--x-large)!important}.has-xx-large-font-size{font-size:var(--wp--preset--font-size--xx-large)!important}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)!important}.has-heading-font-family{font-family:var(--wp--preset--font-family--heading)!important}.has-body-font-family{font-family:var(--wp--preset--font-family--body)!important}:root :where(.wp-block-button.is-style-outline--2 .wp-block-button__link){background:#fff0 none;background-color:#fff0;border-color:var(--wp--preset--color--primary);border-width:2px;border-style:solid;color:var(--wp--preset--color--primary);padding-top:.667em;padding-right:1.33em;padding-bottom:.667em;padding-left:1.33em}:root :where(.wp-block-button.is-style-outline--3 .wp-block-button__link){background:#fff0 none;background-color:#fff0;border-color:var(--wp--preset--color--primary);border-width:2px;border-style:solid;color:var(--wp--preset--color--primary);padding-top:.667em;padding-right:1.33em;padding-bottom:.667em;padding-left:1.33em}@font-face{font-family:'Fraunces';font-style:normal;font-weight:400 700;font-display:swap;src:url(/wp-content/themes/hernandez-roofing-pros/assets/fonts/fraunces-variable-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Manrope';font-style:normal;font-weight:400 800;font-display:swap;src:url(/wp-content/themes/hernandez-roofing-pros/assets/fonts/manrope-variable-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--hrp-radius-sm:6px;--hrp-radius-md:10px;--hrp-radius-lg:16px;--hrp-radius-pill:999px;--hrp-shadow-sm:0 1px 2px rgba(11, 12, 14, 0.06), 0 2px 6px rgba(11, 12, 14, 0.05);--hrp-shadow-md:0 4px 10px rgba(11, 12, 14, 0.06), 0 12px 26px rgba(11, 12, 14, 0.09);--hrp-shadow-lg:0 6px 14px rgba(11, 12, 14, 0.07), 0 24px 52px rgba(11, 12, 14, 0.14);--hrp-shadow-red-sm:0 6px 16px rgba(224, 43, 32, 0.24);--hrp-shadow-red:0 12px 28px rgba(224, 43, 32, 0.30);--hrp-shadow-on-dark:0 12px 30px rgba(0, 0, 0, 0.38);--hrp-border:#e5e6ea;--hrp-border-strong:#d2d4d9;--hrp-border-on-dark:rgba(255, 255, 255, 0.16);--hrp-surface-dark:#3c3d44;--hrp-surface-dark-deep:#2f3036;--hrp-surface-dark-soft:#45464e;--hrp-red-on-dark:#ff9a8f;--hrp-ink-on-dark:#d8d9dd;--hrp-ease:cubic-bezier(0.2, 0.7, 0.3, 1);--hrp-card-pad-x:1.75rem;--hrp-card-pad-y:2rem;--hrp-card-padding:var(--hrp-card-pad-y) var(--hrp-card-pad-x);--hrp-heading-gap:2.5rem;--hrp-heading-gap-sm:1.15rem;--hrp-heading-gap-card:0.7rem;--hrp-frame-icon-size:76px;--hrp-section-width:1240px;--hrp-gutter:clamp(1.15rem, 3.2vw, 2.5rem);--hrp-icon-phone:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.2a2 2 0 0 1 2.1-.5c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2Z'/%3E%3C/svg%3E");

  /* How far the hero's trust-badge row hangs below the hero's bottom edge. The
     section beneath the hero adds the same amount to its own top padding, so
     the overlap never collides with that section's own content. */
  --hrp-hero-trust-overlap: 3.75rem;
}

/* ==========================================================================
   Layout resets
   ========================================================================== */
.wp-site-blocks > footer {
  margin-block-start: 0;
}

.wp-site-blocks > * {
  margin-block-start: 0 !important;
}

/* --------------------------------------------------------------------------
   Sitewide horizontal gutter (mockup-driven redesign, 2026-08-02)
   --------------------------------------------------------------------------
   Every full-width band in this theme is a constrained group whose own content
   is capped at --hrp-section-width and centred. With no root padding, that
   content sat flush against the viewport edge at any width below the measure.
   These rules put one small, consistent gutter on the header, the footer and
   every alignfull band, and nowhere else — so nesting can never double it.
   -------------------------------------------------------------------------- */
.site-header,
.site-footer,
.wp-site-blocks main > .alignfull,
.wp-site-blocks main > .wp-block-group > .alignfull {
  padding-inline: var(--hrp-gutter);
}
/* Interior pages put their post-content prose in a constrained <main>; give it
   the same gutter so 680px prose never touches the edge on a small tablet. */
.wp-site-blocks > main.is-layout-constrained > :not(.alignfull) {
  padding-inline: var(--hrp-gutter);
  box-sizing: border-box;
}

/* Section intro paragraphs. A section container is now 1240px wide, which is
   far too wide a measure for a centred paragraph — this keeps the lede at a
   readable ~70 characters while the grid beneath it uses the full width. */
.section-lede {
  /* !important is required: core's constrained-layout rule
     `.is-layout-constrained > :not(.alignleft):not(.alignright):not(.alignfull):not(.alignwide)`
     is a 0-5-0 selector, which outranks any reasonable class selector here. */
  max-width: 62ch !important;
  margin-inline: auto !important;
}

img {
  max-width: 100%;
  height: auto;
}

/* WordPress core ships this class, but the theme's own hand-authored markup
   (review star rows, modal close button) depends on it, so it is declared here
   rather than assumed. */
.screen-reader-text {
  border: 0;
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  width: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  word-wrap: normal !important;
}

/* Consistent, brand-coloured focus ring on every interactive element. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
.wp-block-button__link:focus-visible {
  outline: 3px solid var(--wp--preset--color--accent);
  outline-offset: 3px;
  border-radius: var(--hrp-radius-sm);
}

/* Body copy rhythm. Measure itself is handled at the layout level —
   theme.json's contentSize dropped 800px → 680px, which at the new 1.0625rem
   body size is roughly 80 characters per line instead of ~100. Combined with
   theme.json's 1.7 line-height that is the readability half of objective 2;
   nothing here needs a per-paragraph max-width (which would leave headings
   and prose at visibly different widths). */
li {
  line-height: 1.6;
}
.wp-block-list li + li {
  margin-top: 0.4rem;
}

/* --------------------------------------------------------------------------
   Heading rhythm (spacing audit, 2026-08-02)
   --------------------------------------------------------------------------
   Section headings previously sat only one block-gap (1.85rem) above the grid,
   card row or paragraph beneath them, which read as crowded next to the
   generous section padding around them. These rules give every heading real
   air underneath without touching any heading's level, text or font size.

   Specificity note: core emits the block-gap as `.is-layout-constrained > *`
   (0,1,0). Adding the adjacent-sibling heading selector makes these 0,1,1, so
   they win without !important — except where a block carries an inline
   margin-top, which is authored intent and is deliberately left to win.
   -------------------------------------------------------------------------- */
.is-layout-constrained > h2 + *,
.is-layout-flow > h2 + *,
.wp-block-column > h2 + *,
.entry-content > h2 + * {
  margin-block-start: var(--hrp-heading-gap);
}

.is-layout-constrained > h3 + *,
.is-layout-flow > h3 + *,
.is-layout-constrained > h4 + *,
.is-layout-flow > h4 + *,
.wp-block-column > h3 + *,
.entry-content > h3 + *,
.entry-content > h4 + * {
  margin-block-start: var(--hrp-heading-gap-sm);
}

/* Card interiors keep their own tighter rhythm — a 2.5rem gap inside a
   240px-wide card would look broken, not premium. */
.service-card > h2 + *, .service-card > h3 + *, .service-card > h4 + *,
.testimonial-card > h2 + *, .testimonial-card > h3 + *,
.trust-card > h2 + *, .trust-card > h3 + *,
.plan-card > h2 + *, .plan-card > h3 + *,
.blog-post-card > h2 + *, .blog-post-card > h3 + *,
.hrp-area-card > h2 + *, .hrp-area-card > h3 + *,
.hrp-modal > h2 + *, .hrp-modal > h3 + *,
.hrp-form-card > h2 + *, .hrp-form-card > h3 + * {
  margin-block-start: var(--hrp-heading-gap-card);
}

/* An eyebrow label is a caption for the heading below it, not a paragraph of
   its own — keep the pair tight so the gap reads as heading→content, not
   eyebrow→heading→content. */
.eyebrow + h1,
.eyebrow + h2,
.eyebrow + h3 {
  margin-block-start: 0.15rem;
}

/* ==========================================================================
   Header
   ========================================================================== */
/* --------------------------------------------------------------------------
   2026-08-02, mockup-driven redesign: the bar is DARK GRAPHITE, not white.

   The surface is the same `graphite` palette slug (#3c3d44) already used by the
   footer, the hero, the submenus and the mobile overlay — so the site now opens
   and closes on the same dark tone instead of a white bar over a dark hero.
   The block markup in parts/header.html carries backgroundColor:"graphite", so
   this rule only reinforces it for the sticky/scrolled state; nav structure and
   every href are untouched.
   -------------------------------------------------------------------------- */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--hrp-surface-dark);
  border-bottom: 1px solid rgba(255, 255, 255, 0.10);
  box-shadow: 0 1px 0 rgba(11, 12, 14, 0.18);
  color: #ffffff;
}

.site-header .wp-block-site-title {
  letter-spacing: -0.02em;
}
.site-header .wp-block-site-title,
.site-header .wp-block-site-title a {
  color: #ffffff;
}
.site-header .wp-block-site-title a:hover {
  color: var(--hrp-red-on-dark);
  text-decoration: none;
}

.site-header .wp-block-navigation {
  font-family: var(--wp--preset--font-family--body);
}

/* The bar holds logo + title + a 6-item nav + phone + CTA on one line at 1240px.
   Tightened from 1.5rem so the row fits without wrapping now that the container
   measure is 1240px with a real side gutter. */
.site-header .wp-block-navigation .wp-block-navigation__container {
  gap: 1.15rem;
  flex-wrap: nowrap;
}
.site-header .wp-block-site-title {
  white-space: nowrap;
  font-size: 1.15rem;
}
.site-header .wp-block-button__link,
.site-header .header-phone-cta a {
  white-space: nowrap;
}

.site-header .wp-block-navigation-item__content {
  position: relative;
  font-weight: 600;
  font-size: 0.92rem;
  letter-spacing: 0.005em;
  white-space: nowrap;
  color: #ffffff;
  padding: 0.45rem 0;
  transition: color 0.2s ease;
}
.site-header .wp-block-navigation__submenu-icon {
  color: rgba(255, 255, 255, 0.72);
}

/* Animated red underline on top-level nav items (suppressed inside submenus). */
.site-header .wp-block-navigation-item__content::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  border-radius: 2px;
  background: var(--wp--preset--color--accent);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 0.22s var(--hrp-ease);
}
.site-header .wp-block-navigation-item:hover > .wp-block-navigation-item__content::after,
.site-header .wp-block-navigation-item:focus-within > .wp-block-navigation-item__content::after {
  transform: scaleX(1);
}
.site-header .wp-block-navigation-item:hover > .wp-block-navigation-item__content,
.site-header .wp-block-navigation-item:focus-within > .wp-block-navigation-item__content {
  color: var(--hrp-red-on-dark);
}
/* Current page. WordPress adds .current-menu-item to a nav item whose URL
   matches the request, and aria-current="page" to its link; both are matched so
   the red rule stays put on the active item instead of only on hover. */
.site-header .wp-block-navigation-item.current-menu-item > .wp-block-navigation-item__content::after,
.site-header .wp-block-navigation-item.current-menu-ancestor > .wp-block-navigation-item__content::after,
.site-header .wp-block-navigation-item__content[aria-current="page"]::after {
  transform: scaleX(1);
}
.site-header .wp-block-navigation-item.current-menu-item > .wp-block-navigation-item__content,
.site-header .wp-block-navigation-item__content[aria-current="page"] {
  color: #ffffff;
}
.site-header .wp-block-navigation__submenu-container .wp-block-navigation-item__content::after {
  display: none;
}

/* Phone number + handset icon. The icon is an inline data: URI mask — no icon
   font, no SVG file, no network request, and it inherits currentColor so it
   turns red with the number on hover. */
.header-phone-cta {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  white-space: nowrap;
  letter-spacing: -0.01em;
  margin: 0 !important;
}
.header-phone-cta::before {
  content: "";
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  background-color: currentColor;
  -webkit-mask-image: var(--hrp-icon-phone);
  mask-image: var(--hrp-icon-phone);
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
  transition: background-color 0.2s ease;
}
.header-phone-cta,
.header-phone-cta a {
  color: #ffffff;
  transition: color 0.2s ease;
}
.header-phone-cta:hover,
.header-phone-cta:hover a {
  color: var(--hrp-red-on-dark);
  text-decoration: none;
}

/* Submenu styling — graphite surface, not near-black */
.site-header .wp-block-navigation__submenu-container {
  background: var(--hrp-surface-dark) !important;
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: var(--hrp-radius-lg);
  box-shadow: var(--hrp-shadow-on-dark);
  padding: 0.6rem 0;
  overflow: hidden;
}

.site-header .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
  color: #ffffff !important;
  padding: 0.6rem 1.15rem;
}

.site-header .wp-block-navigation__submenu-container a:hover {
  color: var(--hrp-red-on-dark) !important;
  background: rgba(255, 255, 255, 0.05);
}

/* "Get a Free Quote" — the primary conversion target in the bar. Larger,
   heavier and shadowed so it reads as a button first and a link second. */
.site-header .wp-block-button__link {
  min-height: 48px;
  padding: 0.8rem 1.65rem;
  font-size: 1rem;
  font-weight: 800;
  letter-spacing: 0.005em;
  box-shadow: var(--hrp-shadow-red-sm);
}
.site-header .wp-block-button__link:hover {
  box-shadow: var(--hrp-shadow-red);
}

/* ==========================================================================
   Buttons — one definition, applied everywhere a button appears
   ==========================================================================
   Covers: header CTA, hero CTAs, cta-band, services-grid cards, 404 link
   cards, search "no results" buttons, both form submit buttons, the
   core/search button and the Query Loop pagination controls. Sizes, radius,
   weight, shadow and hover motion all come from the token scale above.
   ========================================================================== */
.wp-block-button__link,
.wp-element-button,
button.wp-element-button,
.hrp-form button[type="submit"] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 54px;
  border: none;
  border-radius: var(--hrp-radius-md);
  font-family: var(--wp--preset--font-family--body);
  font-size: 1.0625rem;
  font-weight: 700;
  letter-spacing: 0.01em;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  box-shadow: var(--hrp-shadow-sm);
  transition:
    transform 0.2s var(--hrp-ease),
    box-shadow 0.2s var(--hrp-ease),
    background-color 0.2s ease,
    border-color 0.2s ease,
    color 0.2s ease;
}

.wp-block-button__link:hover,
.wp-element-button:hover,
button.wp-element-button:hover,
.hrp-form button[type="submit"]:hover {
  transform: translateY(-2px);
  box-shadow: var(--hrp-shadow-red);
  text-decoration: none;
}

.wp-block-button__link:active,
.wp-element-button:active,
button.wp-element-button:active {
  transform: translateY(0);
  box-shadow: var(--hrp-shadow-sm);
}

/* Secondary / outline: charcoal hairline that resolves to brand red on hover. */
.wp-block-button.is-style-outline > .wp-block-button__link,
.wp-block-button.is-style-outline .wp-block-button__link {
  background: transparent;
  color: var(--wp--preset--color--primary);
  border: 2px solid rgba(22, 23, 26, 0.20);
  box-shadow: none;
}
.wp-block-button.is-style-outline > .wp-block-button__link:hover,
.wp-block-button.is-style-outline .wp-block-button__link:hover {
  background: var(--wp--preset--color--light);
  color: var(--wp--preset--color--accent-dark);
  border-color: var(--wp--preset--color--accent);
  box-shadow: var(--hrp-shadow-md);
}

/* Phone CTA — only ever used on the charcoal/gradient bands. */
.wp-block-button.is-style-phone-cta > .wp-block-button__link,
.wp-block-button.is-style-phone-cta .wp-block-button__link {
  background: transparent;
  color: #ffffff;
  border: 2px solid rgba(255, 255, 255, 0.42);
  box-shadow: none;
}
.wp-block-button.is-style-phone-cta > .wp-block-button__link:hover,
.wp-block-button.is-style-phone-cta .wp-block-button__link:hover {
  background: #ffffff;
  color: var(--wp--preset--color--primary);
  border-color: #ffffff;
  box-shadow: var(--hrp-shadow-on-dark);
}

/* Buttons sitting side by side get a little more air than the core 0.6em. */
.wp-block-buttons {
  gap: 0.9rem;
}

/* ==========================================================================
   Cards / equal-height rows
   ==========================================================================
   Card audit (2026-08-02). Every card grid in the theme — services-grid,
   testimonials, trust stat cards, the roof-store plan cards, the archive/search
   post cards, the 404 link cards and the new service-area cards — resolves to
   the same four rules:
     1. the row stretches   (align-items: stretch on the grid)
     2. the card is a flex column that fills its cell
     3. the CTA/footer element is pinned with margin-top:auto, so buttons line
        up horizontally across the row regardless of copy length
     4. padding, radius and shadow come from the token scale, never one-offs
   ========================================================================== */
.equal-cards,
.trust-bar .wp-block-columns,
.hrp-area-grid {
  align-items: stretch;
}
.equal-cards > .wp-block-column,
.hrp-area-grid > .wp-block-column {
  display: flex;
  flex-direction: column;
  flex-grow: 0;
  align-self: stretch;
}
.equal-cards > .wp-block-column > .wp-block-group,
.hrp-area-grid > .wp-block-column > .wp-block-group {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
}
.equal-cards .cta-bottom,
.hrp-area-grid .cta-bottom {
  margin-top: auto;
  justify-content: center;
}
/* Anything explicitly marked as the card's closing element is pinned down. */
.card-foot {
  margin-top: auto !important;
}

.service-card,
.testimonial-card,
.trust-card,
.plan-card,
.hrp-area-card,
.family-biz-card {
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  background: #ffffff;
  padding: var(--hrp-card-padding);
  overflow: hidden;
  box-shadow: var(--hrp-shadow-sm);
}

.service-card {
  border-top: 3px solid var(--wp--preset--color--accent);
}

.plan-card {
  border-top: 3px solid var(--wp--preset--color--accent);
}

.hover-lift {
  transition:
    transform 0.22s var(--hrp-ease),
    box-shadow 0.22s var(--hrp-ease),
    border-color 0.22s ease;
}
.hover-lift:hover {
  transform: translateY(-6px);
  box-shadow: var(--hrp-shadow-lg);
  border-color: rgba(224, 43, 32, 0.30);
}

/* --------------------------------------------------------------------------
   Testimonials / review cards
   --------------------------------------------------------------------------
   Two shapes share this base:
     • the redesigned homepage review card (patterns/testimonials.php) — carries
       .has-review-head and gets the avatar + name + star + source treatment;
     • the three legacy testimonial cards already living inside
       content/services/siding.html, which are plain `.testimonial-card` +
       `.stars` markup. Those content files are NOT edited by this pass, so the
       old quote-mark and ::after star rules are kept working for them.
   -------------------------------------------------------------------------- */
.testimonial-card {
  background: #ffffff;
  position: relative;
}
/* Legacy shape only: decorative opening quote above the copy. */
.testimonial-card:not(.has-review-head)::before {
  content: "\201C";
  font-family: var(--wp--preset--font-family--heading);
  font-size: 4rem;
  color: rgba(224, 43, 32, 0.32);
  line-height: 1;
  display: block;
  margin-bottom: -1rem;
}

/* Legacy star row (content/services/siding.html). Decorative-only; the new
   pattern below uses a properly-labelled row instead. */
.stars::after {
  content: "★★★★★";
  color: var(--wp--preset--color--accent);
  letter-spacing: 0.15em;
  display: block;
  margin-bottom: 0.5rem;
}

/* ---- Redesigned review card ---------------------------------------------- */
.testimonial-card.has-review-head {
  padding-top: calc(var(--hrp-card-pad-y) - 0.25rem);
}
.testimonial-card.has-review-head::after {
  /* Quiet quote watermark — sits behind the copy, never over it. */
  content: "\201D";
  position: absolute;
  right: 0.75rem;
  bottom: -1.6rem;
  font-family: var(--wp--preset--font-family--heading);
  font-size: 7rem;
  line-height: 1;
  color: rgba(224, 43, 32, 0.07);
  pointer-events: none;
  z-index: 0;
}
.testimonial-card.has-review-head > * {
  position: relative;
  z-index: 1;
}

.review-head {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  margin-bottom: 1.15rem !important;
}
.review-head-meta {
  min-width: 0;
  flex: 1 1 auto;
}
/* Same constrained-layout guard as .hrp-faq — the name and star row are the
   full width of this cluster, not a re-centred 680px column. */
.review-head-meta > * {
  max-width: none !important;
  margin-inline: 0 !important;
}
.review-name {
  font-family: var(--wp--preset--font-family--heading);
  font-size: 1.08rem;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -0.01em;
  color: var(--wp--preset--color--primary);
  margin: 0 0 0.15rem !important;
  overflow-wrap: break-word;
}

/* Star row. The glyphs are aria-hidden decoration; the rating is announced
   from the visually-hidden text beside them, so screen readers hear
   "Rated 5 out of 5 stars" instead of five black-star character names. */
.review-stars {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  row-gap: 0.3rem;
  gap: 0.5rem;
  margin: 0 !important;
  font-size: 0.85rem;
}
.review-stars-glyphs {
  color: var(--wp--preset--color--accent);
  letter-spacing: 0.12em;
  line-height: 1;
  font-size: 0.95rem;
}
.review-source {
  display: inline-flex;
  align-items: center;
  gap: 0.32rem;
  padding: 0.14rem 0.55rem;
  border: 1px solid var(--hrp-border-strong);
  border-radius: var(--hrp-radius-pill);
  background: var(--wp--preset--color--surface);
  color: var(--wp--preset--color--secondary);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
}
/* Generic star-in-circle mark — deliberately NOT a Google logo/trademark. */
.review-source::before {
  content: "★";
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.05em;
  height: 1.05em;
  border-radius: var(--hrp-radius-pill);
  background: var(--wp--preset--color--accent);
  color: #ffffff;
  font-size: 0.66em;
  line-height: 1;
}

.review-quote {
  font-size: 1.02rem;
  line-height: 1.65;
  color: var(--wp--preset--color--primary);
  margin-block-start: 0 !important;
}

/* ==========================================================================
   Placeholder media language — ONE system, used everywhere
   ==========================================================================
   Every image/video slot in this theme that has no real photo yet renders the
   same way: a graphite `dark-fade` gradient frame, a soft red radial wash, and
   a single centred icon inside a circular glass chip. A real photo dropped into
   the frame sits on a higher stacking layer and covers the placeholder with no
   CSS change and no PHP/JS conditional.

   Consumers (all four use the identical treatment, per the consistency audit):
     .post-thumb-frame  — blog/archive/search/single thumbnails
                          (patterns/post-placeholder-image.php)
     .card-thumb-frame  — service cards (patterns/services-grid.php)
     .hrp-modal-media   — homepage promo modal media/video-thumbnail slot
     .hrp-avatar        — testimonial reviewer avatars (circular variant)

   NO photography, stock imagery or external asset is referenced anywhere below.
   -------------------------------------------------------------------------- */
.card-thumb-frame,
.post-thumb-frame,
.hrp-modal-media {
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--wp--preset--gradient--dark-fade);
}
.card-thumb-frame::before,
.post-thumb-frame::before,
.hrp-modal-media::before,
.hrp-avatar::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    radial-gradient(circle at 28% 24%, rgba(224, 43, 32, 0.30) 0, transparent 55%),
    radial-gradient(circle at 78% 84%, rgba(224, 43, 32, 0.16) 0, transparent 55%);
  pointer-events: none;
}

/* The icon chip. Same diameter, same position, same glyph size in every frame,
   so icons line up across a card row — and it echoes the circular icon chip
   used by patterns/trust-signals.php rather than inventing a second language. */
.card-thumb-fallback-icon,
.post-thumb-frame .post-thumb-fallback-icon,
.hrp-modal-media .hrp-modal-media-icon {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--hrp-frame-icon-size);
  height: var(--hrp-frame-icon-size);
  margin: 0 !important;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 2.1rem;
  line-height: 1;
  color: rgba(255, 255, 255, 0.92);
  background: rgba(255, 255, 255, 0.10);
  border: 1px solid rgba(255, 255, 255, 0.22);
  border-radius: var(--hrp-radius-pill);
}

/* Reserved for the future real image — nothing renders in these slots today. */
.card-thumb-frame .wp-block-image,
.card-thumb-frame > figure,
.card-thumb-frame > img,
.post-thumb-frame .wp-block-post-featured-image,
.post-thumb-frame .wp-block-image,
.post-thumb-frame > figure,
.post-thumb-frame > img,
.hrp-modal-media > img,
.hrp-modal-media > video,
.hrp-modal-media > figure {
  position: absolute;
  inset: 0;
  z-index: 2;
  margin: 0;
}
.card-thumb-frame img,
.post-thumb-frame img,
.hrp-modal-media img,
.hrp-modal-media video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  margin: 0;
  border-radius: 0;
}

/* --------------------------------------------------------------------------
   LIGHT variant of the same frame (mockup-driven redesign, 2026-08-02)
   --------------------------------------------------------------------------
   Identical geometry, identical stacking behaviour, identical "drop an <img>in and it covers everything" contract — only the surface changes, from the
   graphite dark-fade to a faint red/cloud wash with a red-tinted icon chip.
   Used by the five service cards, where five dark 16:9 bands in a row read
   heavy against the airy white cards in the mockup. This is a variant of the
   one placeholder language, not a second language.
   -------------------------------------------------------------------------- */
.card-thumb-frame--light {
  background: linear-gradient(150deg, #fdf2f1 0%, #f7f8f9 55%, #f0f1f3 100%);
  border-bottom: 1px solid var(--hrp-border);
}
.card-thumb-frame--light::before {
  background-image:
    radial-gradient(circle at 26% 22%, rgba(224, 43, 32, 0.10) 0, transparent 58%),
    radial-gradient(circle at 80% 86%, rgba(224, 43, 32, 0.07) 0, transparent 55%);
}
.card-thumb-frame--light .card-thumb-fallback-icon {
  color: var(--wp--preset--color--accent-dark);
  background: #ffffff;
  border-color: rgba(224, 43, 32, 0.22);
  box-shadow: var(--hrp-shadow-sm);
}

/* Circular variant — reviewer avatars. Identical gradient + wash + chip logic,
   just round and small. A real photo drops in as
   `<img src="…" alt="…">` inside .hrp-avatar and covers the initial. */
.hrp-avatar {
  position: relative;
  flex: 0 0 auto;
  width: 52px;
  height: 52px;
  overflow: hidden;
  border-radius: var(--hrp-radius-pill);
  background: var(--wp--preset--gradient--dark-fade);
  border: 1px solid rgba(255, 255, 255, 0.22);
  box-shadow: var(--hrp-shadow-sm);
}
.hrp-avatar-initial {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--wp--preset--font-family--heading);
  font-size: 1.25rem;
  font-weight: 700;
  line-height: 1;
  color: #ffffff;
}
.hrp-avatar > img {
  position: absolute;
  inset: 0;
  z-index: 2;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  margin: 0;
}

/* Cards that carry a frame let it bleed to the card edges.
   !important is required on the inline axis: core's constrained-layout rule
   (`.wp-container-* > :where(...) { margin-left: auto !important }`) would
   otherwise re-centre the frame and kill the bleed. */
.service-card--media {
  padding-top: 0;
}
.service-card--media > .card-thumb-frame {
  margin-top: 0;
  margin-bottom: 1.5rem;
  margin-left: calc(-1 * var(--hrp-card-pad-x)) !important;
  margin-right: calc(-1 * var(--hrp-card-pad-x)) !important;
  max-width: none !important;
  border-radius: 0;
}
.service-card--media > .card-thumb-frame + * {
  margin-block-start: 0 !important;
}

/* Trust signals bar — elevated to individual badge cards */
.trust-bar {
  border-top: 1px solid var(--hrp-border);
  border-bottom: 1px solid var(--hrp-border);
}
.trust-bar .wp-block-column {
  text-align: center;
  background: #ffffff;
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  padding: 1.9rem 1.25rem;
  box-shadow: var(--hrp-shadow-sm);
  transition:
    transform 0.22s var(--hrp-ease),
    box-shadow 0.22s var(--hrp-ease),
    border-color 0.22s ease;
}
.trust-bar .wp-block-column:hover {
  transform: translateY(-4px);
  box-shadow: var(--hrp-shadow-md);
  border-color: rgba(224, 43, 32, 0.30);
}
.trust-bar .wp-block-column > * {
  margin-block-start: 0;
}
.trust-bar-icon {
  width: 56px;
  height: 56px;
  margin: 0 auto 0.9rem;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.6rem;
  line-height: 1;
  background: var(--wp--preset--color--light);
  border: 1px solid rgba(224, 43, 32, 0.20);
  border-radius: var(--hrp-radius-pill);
}
.trust-bar .wp-block-column p:not(.trust-bar-icon) {
  font-size: 0.98rem;
  line-height: 1.45;
  letter-spacing: -0.005em;
}

/* Accent divider rule (legacy .gold-rule selector kept so nothing breaks) */
.accent-rule,
.gold-rule {
  width: 64px;
  height: 3px;
  border-radius: 3px;
  background: var(--wp--preset--color--accent);
  border: none;
  margin: 0.5rem auto 1.5rem;
}
.accent-rule.align-left,
.gold-rule.align-left {
  margin: 0.5rem 0 1.5rem;
}

/* Badges */
.hero-badge {
  display: inline-flex;
  justify-content: center;
  align-items: center;
  gap: 0.5rem;
  width: fit-content;
  margin-inline: auto;
  padding: 0.55rem 1.15rem;
  /* Deepened from 0.15 → 0.28 alpha and flipped to white text: on the lighter
     graphite band a 15%-alpha red tint no longer gave the small uppercase
     label enough separation. White on the resulting mix clears AA comfortably. */
  background: rgba(224, 43, 32, 0.28);
  border: 1px solid rgba(255, 154, 143, 0.45);
  border-radius: var(--hrp-radius-pill);
  color: #ffffff;
  font-weight: 700;
  letter-spacing: 0.10em;
  text-transform: uppercase;
  font-size: 0.8rem;
}
.hero-badge.is-left {
  margin-inline: 0;
  justify-content: flex-start;
}

/* Section eyebrow label */
.eyebrow {
  color: var(--wp--preset--color--accent);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-weight: 700;
  font-size: 0.8rem;
  margin-bottom: 0.35rem;
}
/* Every dark band in this theme carries textColor:"background" → the
   .has-background-color class. Lift the eyebrow red for AA contrast there. */
.has-background-color .eyebrow,
.hero-band .eyebrow {
  color: var(--hrp-red-on-dark);
}

/* ==========================================================================
   Footer
   ==========================================================================
   Reworked in the final polish pass into a considered closing section rather
   than a link dump: a wider brand column (blurb → contact → credentials →
   social), then three tight link columns grouped Services / Service Areas /
   Company, and a legal + copyright rail at the bottom.

   Everything in it is already-real content. The CertainTeed Select
   ShingleMaster badge is the same image reference already used on /about-us/;
   the "Licensed & Insured" and "Family-Owned" claims are the ones already in
   patterns/trust-signals.php; the Facebook/Instagram URLs are the real ones
   already in the footer and in functions.php's `sameAs` schema. No new
   certification, award or claim was introduced.
   ========================================================================== */
.site-footer {
  background: var(--hrp-surface-dark);
  color: var(--hrp-ink-on-dark);
}
.site-footer a {
  color: var(--hrp-ink-on-dark);
  transition: color 0.2s ease;
}
.site-footer a:hover {
  color: var(--hrp-red-on-dark);
}

/* Column headings: small, uppercase, red-ruled — reads as a label set, which
   is what makes four stacked link lists scannable instead of soupy. */
.site-footer h3,
.site-footer h4 {
  color: #ffffff;
  letter-spacing: -0.015em;
  margin-bottom: 0.35rem;
}
.site-footer .footer-col-title {
  position: relative;
  margin: 0 0 1.15rem !important;
  padding-bottom: 0.7rem;
  font-family: var(--wp--preset--font-family--body);
  font-size: 0.78rem !important;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #ffffff;
}
/* The column title already carries its own bottom margin; the global
   heading-rhythm rule would double it up here. */
.site-footer .footer-col-title + *,
.site-footer .footer-brand-name + * {
  margin-block-start: 0 !important;
}
.site-footer .footer-col-title::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 34px;
  height: 2px;
  border-radius: 2px;
  background: var(--wp--preset--color--accent);
}

.site-footer li {
  line-height: 1.45;
  margin-bottom: 0.55rem;
}
.site-footer .wp-block-list {
  padding-left: 0;
  list-style: none;
}
.site-footer .wp-block-list a {
  display: inline-block;
  font-size: 0.94rem;
}

/* Brand column */
.footer-brand-name {
  margin: 0 0 0.9rem !important;
  color: #ffffff;
}
.footer-blurb {
  font-size: 0.95rem;
  line-height: 1.65;
  color: var(--hrp-ink-on-dark);
}
.footer-contact {
  font-size: 0.98rem;
  line-height: 1.65;
}
.footer-contact a {
  font-weight: 700;
  color: #ffffff;
}

/* Credential chips — Licensed & Insured / Family-Owned, plus the real
   CertainTeed badge image beside them. */
.footer-credentials {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem;
  margin: 1.25rem 0 0 !important;
}
.footer-cred {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.38rem 0.8rem;
  border: 1px solid var(--hrp-border-on-dark);
  border-radius: var(--hrp-radius-pill);
  background: rgba(255, 255, 255, 0.06);
  color: #ffffff;
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  white-space: nowrap;
}
.footer-badge {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  /* margin-inline:0 keeps the badge left-aligned: it is narrower than the
     column, so the constrained layout's auto margins would otherwise centre it. */
  margin: 1.25rem 0 0 !important;
  padding: 0.75rem 0.9rem;
  border: 1px solid var(--hrp-border-on-dark);
  border-radius: var(--hrp-radius-lg);
  background: rgba(255, 255, 255, 0.05);
  max-width: 320px;
}
.footer-badge img {
  flex: 0 0 auto;
  width: 56px;
  height: 56px;
  border-radius: var(--hrp-radius-sm);
  background: #ffffff;
  padding: 4px;
  box-sizing: border-box;
}
.footer-badge-text {
  font-size: 0.8rem;
  line-height: 1.4;
  color: var(--hrp-ink-on-dark);
}
.footer-badge-text strong {
  display: block;
  color: #ffffff;
  font-size: 0.86rem;
}

/* Social icons. Hand-authored inline SVG — no icon font, no CDN, nothing
   fetched, so the theme stays fully offline-safe. Generic geometric glyphs,
   not reproductions of the platforms' trademarked logo lockups. */
.footer-social {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin: 1.25rem 0 0 !important;
}
.footer-social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid var(--hrp-border-on-dark);
  border-radius: var(--hrp-radius-pill);
  background: rgba(255, 255, 255, 0.06);
  color: #ffffff;
  transition:
    background-color 0.2s ease,
    border-color 0.2s ease,
    color 0.2s ease,
    transform 0.2s var(--hrp-ease);
}
.footer-social a:hover,
.footer-social a:focus-visible {
  background: var(--wp--preset--color--accent);
  border-color: var(--wp--preset--color--accent);
  color: #ffffff;
  transform: translateY(-2px);
}
.footer-social svg {
  width: 20px;
  height: 20px;
  display: block;
}

/* Legal rail + copyright */
.footer-bottom {
  border-top: 1px solid var(--hrp-border-on-dark);
  color: rgba(216, 217, 221, 0.78);
  gap: 0.75rem 1.5rem;
}
.footer-legal-links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem 1.1rem;
  margin: 0 !important;
  font-size: 0.85rem;
}

/* ==========================================================================
   Forms (Contact / Estimate patterns)
   ========================================================================== */
.hrp-form label {
  display: block;
  font-weight: 600;
  margin-bottom: 0.4rem;
  font-size: 0.9rem;
  letter-spacing: 0.005em;
}
.hrp-form input,
.hrp-form select,
.hrp-form textarea {
  width: 100%;
  padding: 0.85rem 1rem;
  border: 1px solid var(--hrp-border-strong);
  border-radius: var(--hrp-radius-sm);
  font-family: var(--wp--preset--font-family--body);
  font-size: 1rem;
  margin-bottom: 1.35rem;
  background: #ffffff;
  color: var(--wp--preset--color--primary);
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.hrp-form input:hover,
.hrp-form select:hover,
.hrp-form textarea:hover {
  border-color: var(--hrp-border-strong);
}
.hrp-form input:focus,
.hrp-form select:focus,
.hrp-form textarea:focus {
  outline: none;
  border-color: var(--wp--preset--color--accent);
  box-shadow: 0 0 0 3px rgba(224, 43, 32, 0.16);
}
.hrp-form .required {
  color: var(--wp--preset--color--accent);
}
.hrp-form-note {
  font-size: 0.8rem;
  color: var(--wp--preset--color--secondary);
  margin-top: -0.85rem;
  margin-bottom: 1.35rem;
  line-height: 1.5;
}

/* ==========================================================================
   Animation & motion
   ========================================================================== */
.fade-up {
  opacity: 0;
  transform: translateY(30px);
  animation: fadeUp 0.6s ease forwards;
}
.fade-in {
  opacity: 0;
  animation: fadeIn 0.7s ease forwards;
}
.slide-in-left {
  opacity: 0;
  transform: translateX(-40px);
  animation: slideIn 0.7s ease forwards;
}
.slide-in-right {
  opacity: 0;
  transform: translateX(40px);
  animation: slideIn 0.7s ease forwards;
}

@keyframes fadeUp { to { opacity: 1; transform: translateY(0); } }
@keyframes fadeIn { to { opacity: 1; } }
@keyframes slideIn { to { opacity: 1; transform: translateX(0); } }

.stagger-children > * {
  opacity: 0;
  transform: translateY(20px);
  animation: fadeUp 0.5s ease forwards;
}
.stagger-children > *:nth-child(1) { animation-delay: 0.1s; }
.stagger-children > *:nth-child(2) { animation-delay: 0.2s; }
.stagger-children > *:nth-child(3) { animation-delay: 0.3s; }
.stagger-children > *:nth-child(4) { animation-delay: 0.4s; }
.stagger-children > *:nth-child(5) { animation-delay: 0.5s; }

.animate-on-scroll {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}
.animate-on-scroll.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.float {
  animation: float 3.5s ease-in-out infinite;
}
@keyframes float {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
  .animate-on-scroll,
  .fade-up,
  .fade-in,
  .slide-in-left,
  .slide-in-right,
  .stagger-children > * {
    opacity: 1 !important;
    transform: none !important;
  }
  .hover-lift:hover,
  .wp-block-button__link:hover,
  .trust-bar .wp-block-column:hover,
  .footer-social a:hover,
  .hrp-modal-actions .hrp-modal-primary:hover {
    transform: none !important;
  }
  /* New components in this pass: land them in their final state immediately
     rather than mid-animation. */
  .hrp-modal[open],
  .wp-block-details.hrp-faq-item[open] > .hrp-details-body {
    animation: none !important;
    opacity: 1 !important;
    transform: none !important;
  }
}

/* === Editor: keep animated content visible while editing === */
.editor-styles-wrapper .fade-up,
.editor-styles-wrapper .fade-in,
.editor-styles-wrapper .slide-in-left,
.editor-styles-wrapper .slide-in-right,
.editor-styles-wrapper .animate-on-scroll,
.editor-styles-wrapper .stagger-children > * {
  opacity: 1 !important;
  transform: none !important;
  animation: none !important;
  transition: none !important;
}

/* ==========================================================================
   Hero
   ==========================================================================
   Still a CSS-only placeholder treatment — no photography or video is
   referenced anywhere below, per the owner's separate media-migration phase.
   What changed in this pass: the gold radial wash became a red one, and the
   band was made structurally ready to accept a real full-bleed image or
   <video> later without a rewrite:

     • position:relative + overflow:hidden + isolation:isolate
     • a real min-height, so the band keeps its proportions once the copy is
       sitting on top of a photo instead of a flat colour
     • flex column / centred, so copy stays optically centred at any height
     • a .hero-media hook (below) that a future
         <div class="hero-media"><img …>  or  <video …></video></div>
       can be dropped into as the FIRST child of .hero-band — it will cover
       the band, sit under the copy, and get a legibility scrim automatically.
   ========================================================================== */
/* --------------------------------------------------------------------------
   2026-08-02, mockup-driven redesign
   --------------------------------------------------------------------------
   Three real changes on top of the structure above:

     1. overflow is VISIBLE, not hidden, so the trust-badge row docked at the
        hero's bottom can hang past the boundary into the section beneath. The
        media layer keeps its own overflow:hidden, so nothing else escapes.
     2. Content is left-aligned in a 660px column pinned to the left edge of the
        1240px section measure — the mockup's composition — instead of a centred
        680px column.
     3. .hero-media is no longer an empty hook: it now RENDERS the CSS-only
        photographic placeholder (layered sky gradient + a roofline/shingle
        silhouette drawn entirely from gradients and a clip-path). It is still
        the exact drop zone for a real photo or <video> — anything placed inside
        it covers the art by DOM stacking order, at the same size, with no other
        change. No image file, stock asset or network request is involved.
   -------------------------------------------------------------------------- */
.hero-band {
  position: relative;
  overflow: visible;
  isolation: isolate;
  /* Load-bearing. The section below the hero carries .animate-on-scroll, whose
     revealed state is `transform: translateY(0)` — a transform value, which
     creates its own stacking context. Without an explicit z-index here that
     context paints after the hero and covers the trust-badge row exactly where
     it is meant to overlap. Kept well under the sticky header's z-index: 100. */
  z-index: 2;
  min-height: clamp(520px, 64vh, 720px);
  display: flex;
  flex-direction: column;
  justify-content: center;
}

/* Legibility scrim. Weighted to the LEFT, where the copy sits, and lifting
   towards the right so a real photo dropped into .hero-media still reads as a
   photo on that side. Painted after .hero-media in DOM order, so it covers a
   real photo too. */
.hero-band::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image:
    linear-gradient(
      90deg,
      rgba(35, 36, 41, 0.94) 0%,
      rgba(35, 36, 41, 0.86) 34%,
      rgba(35, 36, 41, 0.58) 66%,
      rgba(35, 36, 41, 0.40) 100%
    ),
    radial-gradient(circle at 12% 16%, rgba(224, 43, 32, 0.20) 0, transparent 46%);
  pointer-events: none;
}
.hero-band > * {
  position: relative;
  z-index: 1;
}

/* ---- The media layer ------------------------------------------------------
   .hero-media is a real (empty) core group in templates/index.html. On its own
   it paints the CSS-only "photo": a graphite sky that warms towards the horizon,
   a soft light source, then a roofline silhouette with shingle-course texture
   clipped into the bottom third. Drop <img>/<video>/<figure> inside and the
   real media covers all of it. */
.hero-band .hero-media {
  position: absolute;
  inset: 0;
  z-index: 0;
  margin: 0 !important;
  max-width: none !important;
  padding: 0 !important;
  overflow: hidden;
}
.hero-band .hero-media--placeholder {
  background-image:
    /* soft light source, upper right — reads as sky glow behind the roofline */
    radial-gradient(ellipse 70% 55% at 78% 8%, rgba(255, 255, 255, 0.14) 0, transparent 62%),
    /* warm brand-red haze low on the horizon */
    radial-gradient(ellipse 90% 45% at 62% 62%, rgba(224, 43, 32, 0.16) 0, transparent 70%),
    /* sky: graphite deep → graphite → lifted graphite towards the horizon */
    linear-gradient(180deg, #2a2b31 0%, #34353c 46%, #43444c 74%, #4b4c55 100%);
}
/* Roofline silhouette + shingle courses, clipped into the lower third. */
.hero-band .hero-media--placeholder::before {
  content: "";
  position: absolute;
  left: -2%;
  right: -2%;
  bottom: 0;
  height: 46%;
  background-image:
    /* shingle-course banding, subtle */
    repeating-linear-gradient(
      180deg,
      rgba(255, 255, 255, 0.045) 0 2px,
      rgba(0, 0, 0, 0) 2px 14px
    ),
    /* the roof face itself */
    linear-gradient(160deg, #23242a 0%, #2c2d34 55%, #1e1f24 100%);
  clip-path: polygon(
    0% 100%, 0% 62%, 13% 30%, 26% 62%, 26% 46%,
    38% 46%, 52% 8%, 68% 46%, 68% 34%,
    82% 34%, 92% 58%, 100% 44%, 100% 100%
  );
  pointer-events: none;
}
/* A single ridge highlight so the silhouette does not read as a flat block. */
.hero-band .hero-media--placeholder::after {
  content: "";
  position: absolute;
  left: -2%;
  right: -2%;
  bottom: 0;
  height: 46%;
  background: linear-gradient(200deg, rgba(255, 255, 255, 0.10) 0, transparent 38%);
  clip-path: polygon(
    0% 100%, 0% 62%, 13% 30%, 26% 62%, 26% 46%,
    38% 46%, 52% 8%, 68% 46%, 68% 34%,
    82% 34%, 92% 58%, 100% 44%, 100% 100%
  );
  pointer-events: none;
}
/* A real photo/video dropped into the slot covers the art entirely. */
.hero-band .hero-media img,
.hero-band .hero-media video,
.hero-band .hero-media figure,
.hero-band .hero-media .wp-block-image {
  position: absolute;
  inset: 0;
  z-index: 1;
  margin: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}

/* ---- Hero copy column ----------------------------------------------------- */
/* The copy wrapper spans the full 1240px section measure, so the hero copy
   starts on exactly the same left edge as every section below it; its children
   are capped at a 660px reading column and pinned LEFT rather than centred.

   `width: 100%` is load-bearing: .hero-band is a column flex container, and a
   flex item with `margin-inline: auto` opts out of cross-axis stretching, so
   without an explicit width the wrapper would collapse to its content width and
   float somewhere in the middle of the band. */
.hero-band > .hero-content,
.hero-band > .hero-trust-row {
  width: 100%;
  max-width: var(--hrp-section-width) !important;
  margin-inline: auto !important;
}
.hero-band .hero-content {
  text-align: left;
  padding: 0 !important;
}
.hero-band .hero-content > * {
  max-width: 660px !important;
  margin-inline: 0 !important;
  text-align: left;
}
.hero-band h1 {
  margin-top: 1.35rem;
  max-width: 16ch;
  margin-inline: 0;
}
/* The brand-red "DMV" treatment. Gutenberg's inline text-colour format renders
   as <mark class="has-inline-color" style="…">; the transparent background it
   sets is what stops the UA's yellow <mark> highlight showing through. */
.hero-band h1 .has-inline-color {
  background-color: transparent;
}
.hero-band .hero-lede {
  margin-top: 1.35rem;
  max-width: 52ch !important;
  line-height: 1.6;
}
.hero-band .hero-actions {
  margin-top: 2.5rem !important;
  gap: 1rem;
  justify-content: flex-start;
}
.hero-band .hero-actions .wp-block-button__link {
  min-height: 60px;
  padding-inline: 2.5rem;
}
.hero-band .hero-rating {
  margin-top: 1.6rem !important;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5rem;
  color: #ffffff;
  letter-spacing: 0.01em;
}

/* ---- Trust badge row, straddling the hero's bottom edge -------------------- */
.hero-band .hero-trust-row {
  margin-top: var(--wp--preset--spacing--50) !important;
  margin-bottom: calc(-1 * var(--hrp-hero-trust-overlap) - var(--wp--preset--spacing--50)) !important;
  align-items: stretch;
}
.hero-trust-card {
  display: flex;
  align-items: center;
  gap: 0.85rem;
  height: 100%;
  padding: 1.05rem 1.15rem;
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  background: #ffffff;
  box-shadow: var(--hrp-shadow-lg);
  transition:
    transform 0.22s var(--hrp-ease),
    box-shadow 0.22s var(--hrp-ease),
    border-color 0.22s ease;
}
.hero-trust-card:hover {
  transform: translateY(-4px);
  border-color: rgba(224, 43, 32, 0.30);
}
.hero-trust-icon {
  flex: 0 0 auto;
  width: 46px;
  height: 46px;
  margin: 0 !important;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.3rem;
  line-height: 1;
  background: var(--wp--preset--color--light);
  border: 1px solid rgba(224, 43, 32, 0.20);
  border-radius: var(--hrp-radius-pill);
}
.hero-trust-label {
  margin: 0 !important;
  font-size: 0.94rem;
  font-weight: 700;
  line-height: 1.35;
  letter-spacing: -0.005em;
  color: var(--wp--preset--color--primary);
}

/* The section directly under the hero absorbs the overlap so the badge row
   never lands on that section's own eyebrow/heading. */
.hero-band + .wp-block-group {
  padding-top: calc(var(--wp--preset--spacing--50) + var(--hrp-hero-trust-overlap)) !important;
}

/* Diagonal roofline decorative divider between sections */
.roofline-divider {
  height: 28px;
  background: #ffffff;
  clip-path: polygon(0 100%, 5% 0, 10% 100%, 15% 0, 20% 100%, 25% 0, 30% 100%, 35% 0, 40% 100%, 45% 0, 50% 100%, 55% 0, 60% 100%, 65% 0, 70% 100%, 75% 0, 80% 100%, 85% 0, 90% 100%, 95% 0, 100% 100%, 100% 100%, 0 100%);
}

/* ==========================================================================
   Mobile navigation overlay
   Styles WordPress core's built-in "overlayMenu":"mobile" behavior on
   wp:navigation (parts/header.html) to match the site palette. Core already
   provides the responsive hamburger/dialog/close mechanics for free — this
   only themes what core renders, it does not rebuild the menu.
   ========================================================================== */
/* BUG FIX (2026-08-02): this rule used to set `display: flex` on BOTH the
   hamburger-open button and the overlay close button. Because the theme's
   stylesheet loads after core's block CSS and the selectors tie on specificity,
   that display value beat core's own
   `.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}`
   and left a hamburger icon visible in the desktop header at every width. The
   open button no longer declares `display` here — it is shown, as flex, only
   inside the 782px breakpoint below, which is where this theme's nav actually
   hands over to the overlay. */
.site-header .wp-block-navigation__responsive-container-open,
.site-header .wp-block-navigation__responsive-container-close {
  min-width: 44px;
  min-height: 44px;
  align-items: center;
  justify-content: center;
  /* White, not near-black: the header bar is graphite as of the mockup pass. */
  color: #ffffff;
}
.site-header .wp-block-navigation__responsive-container-close {
  display: flex;
}
.site-header .wp-block-navigation__responsive-container-open svg,
.site-header .wp-block-navigation__responsive-container-close svg {
  width: 28px;
  height: 28px;
}
.site-header .wp-block-navigation__responsive-container-open:hover,
.site-header .wp-block-navigation__responsive-container-open:focus,
.site-header .wp-block-navigation__responsive-container-close:hover,
.site-header .wp-block-navigation__responsive-container-close:focus {
  color: var(--hrp-red-on-dark);
}

.site-header .wp-block-navigation__responsive-container.is-menu-open {
  background-color: var(--hrp-surface-dark) !important;
}
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-close {
  color: #ffffff;
}
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
  padding: 1.5rem;
  gap: 0;
}
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
  border-bottom: 1px solid var(--hrp-border-on-dark);
}
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content,
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-submenu__toggle {
  color: #ffffff !important;
  font-size: 1.15rem;
  font-weight: 600;
  min-height: 44px;
  padding: 0.8rem 0.5rem;
  display: flex;
  align-items: center;
  width: 100%;
}
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:hover,
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:focus,
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-submenu__toggle:hover,
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-submenu__toggle:focus {
  color: var(--hrp-red-on-dark) !important;
}
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
  background: transparent !important;
  border: none;
  box-shadow: none;
  padding-left: 1rem;
}
.site-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
  font-size: 1rem;
  font-weight: 500;
  color: var(--hrp-ink-on-dark) !important;
}

/* True accordion collapse for the mobile overlay's three submenus (Services /
   Service Areas / The Roof Store) — see assets/js/mobile-nav-accordion.js for
   why this is needed: core lays the submenu list out as a plain static,
   always-visible flex block inside the overlay regardless of aria-expanded,
   so the collapsed state has to be enforced here with real display:none. */
.site-header .wp-block-navigation__responsive-container .wp-block-navigation__submenu-container.hrp-mobile-submenu-collapsed {
  display: none !important;
}
.site-header .wp-block-navigation__responsive-container .wp-block-navigation-submenu__toggle .wp-block-navigation__submenu-icon {
  transition: transform 0.2s var(--hrp-ease, ease);
}
.site-header .wp-block-navigation__responsive-container .wp-block-navigation-submenu__toggle[aria-expanded="true"] .wp-block-navigation__submenu-icon {
  transform: rotate(180deg);
}

/* ==========================================================================
   Blog archive / search results — post cards + branded placeholder thumbnail
   ========================================================================== */
.wp-block-post-template.is-layout-grid {
  gap: 2rem;
}
.blog-post-card {
  display: flex;
  flex-direction: column;
  height: 100%;
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  background: #ffffff;
  overflow: hidden;
  box-shadow: var(--hrp-shadow-sm);
  padding: 0 var(--hrp-card-pad-x) var(--hrp-card-pad-y);
}
.blog-post-card .post-thumb-frame {
  margin-top: 0;
  margin-bottom: 1.5rem;
  margin-left: calc(-1 * var(--hrp-card-pad-x)) !important;
  margin-right: calc(-1 * var(--hrp-card-pad-x)) !important;
  max-width: none !important;
  border-radius: 0;
}
.blog-post-card .wp-block-post-title {
  margin-bottom: 0.4rem;
  font-size: 1.15rem;
  line-height: 1.3;
  letter-spacing: -0.015em;
}
.blog-post-card .wp-block-post-title a {
  color: var(--wp--preset--color--primary);
  transition: color 0.2s ease;
}
.blog-post-card .wp-block-post-title a:hover {
  color: var(--wp--preset--color--accent);
}
.blog-post-card .wp-block-post-date {
  display: block;
  color: var(--wp--preset--color--secondary);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-bottom: 0.85rem;
}
.blog-post-card .wp-block-post-excerpt {
  margin: 0 0 1.25rem;
}
.blog-post-card .cta-bottom {
  margin-top: auto;
  display: inline-block;
  font-weight: 700;
  color: var(--wp--preset--color--accent-dark);
  transition: color 0.2s ease;
}
.blog-post-card .cta-bottom:hover {
  color: var(--wp--preset--color--accent);
  text-decoration: underline;
}

/* Branded CSS-only placeholder thumbnail (patterns/post-placeholder-image.php).
   The frame, wash, icon chip and real-image stacking rules all live in the
   single "Placeholder media language" block near the top of this file — only
   the size variants are declared here. */

/* Single post hero thumbnail — larger standalone use of the same frame */
.single-post-thumb .post-thumb-frame {
  aspect-ratio: 21 / 9;
  border-radius: var(--hrp-radius-lg);
}
.single-post-thumb .post-thumb-fallback-icon {
  width: calc(var(--hrp-frame-icon-size) * 1.35);
  height: calc(var(--hrp-frame-icon-size) * 1.35);
  font-size: 2.9rem;
}

/* Query Loop pagination — matched to the button scale */
.wp-block-query-pagination {
  gap: 0.5rem;
}
.wp-block-query-pagination a,
.wp-block-query-pagination .page-numbers,
.wp-block-query-pagination-numbers .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  padding: 0.55rem 0.9rem;
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-sm);
  font-weight: 700;
  color: var(--wp--preset--color--primary);
  text-decoration: none;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}
.wp-block-query-pagination a:hover,
.wp-block-query-pagination .page-numbers:hover {
  background: var(--wp--preset--color--light);
  border-color: var(--wp--preset--color--accent);
  color: var(--wp--preset--color--accent-dark);
  text-decoration: none;
}
.wp-block-query-pagination .page-numbers.current {
  background: var(--wp--preset--color--accent);
  border-color: var(--wp--preset--color--accent);
  color: #ffffff;
}

/* ==========================================================================
   404 page
   ========================================================================== */
.error-mark {
  font-family: var(--wp--preset--font-family--heading);
  font-weight: 700;
  font-size: clamp(3.5rem, 10vw, 6.5rem);
  line-height: 1;
  letter-spacing: -0.04em;
  margin-bottom: 0.5rem;
  background: var(--wp--preset--gradient--red-sheen);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: var(--wp--preset--color--accent);
}

/* ==========================================================================
   core/search block (404 + search results "search again")
   ========================================================================== */
.wp-block-search__input {
  border: 1px solid var(--hrp-border-strong);
  border-right: none;
  border-radius: var(--hrp-radius-sm) 0 0 var(--hrp-radius-sm);
  padding: 0.85rem 1rem;
  font-family: var(--wp--preset--font-family--body);
  font-size: 1rem;
  color: var(--wp--preset--color--primary);
  background: #ffffff;
}
.wp-block-search__input:focus {
  outline: none;
  border-color: var(--wp--preset--color--accent);
  box-shadow: 0 0 0 3px rgba(224, 43, 32, 0.16);
}
.wp-block-search__button.wp-element-button {
  background: var(--wp--preset--color--accent);
  color: #ffffff;
  border-radius: 0 var(--hrp-radius-sm) var(--hrp-radius-sm) 0;
  font-weight: 700;
  font-size: 1rem;
  min-height: 50px;
  padding: 0.75rem 1.5rem;
  box-shadow: none;
}
.wp-block-search__button.wp-element-button:hover {
  background: var(--wp--preset--color--accent-dark);
  color: #ffffff;
  transform: none;
  box-shadow: none;
}

/* ==========================================================================
   FAQ accordion (core/details)
   ==========================================================================
   Objective 7. The FAQ Q&A that already existed on the homepage, /the-roof-store/,
   /roof-replacement-guide-cost-lifespan/ and /roof-repair-vs-replacement-guide/
   was rewrapped from heading+paragraph pairs into core/details blocks. Not one
   character of question or answer text changed — only the wrapper markup.

   Animation is dependency-free, no library and no JS, in two layers:

     1. A reveal animation on the .hrp-details-body wrapper, which runs the
        moment the body is rendered (i.e. when the <details> opens). This works
        in every browser that supports <details> at all, which is all of them.

     2. Where the browser supports the ::details-content pseudo-element
        (Chrome/Edge 131+, and shipping in the other engines), the real
        grid-template-rows: 0fr → 1fr height transition is layered on top, so
        the panel physically grows instead of appearing. `interpolate-size` is
        not needed with the 0fr/1fr technique, and `allow-discrete` handles the
        content-visibility flip so the closing direction animates too.

   Both layers are switched off automatically by the global
   prefers-reduced-motion block earlier in this file.
   ========================================================================== */
/* --------------------------------------------------------------------------
   2026-08-02, mockup-driven redesign — TWO-COLUMN grid on desktop.
   --------------------------------------------------------------------------
   Layout only. The core/details mechanism, the chevron, the open/close
   animation and every question and answer are untouched; the list simply flows
   into two columns above 900px instead of one long stack. Grid is row-major, so
   the reading order in the DOM is preserved exactly (item 1 top-left, item 2
   top-right, item 3 second row left…).

   Odd counts are handled explicitly: a final item that would otherwise leave a
   hole spans both columns. That covers the real sets on this site — 6 on the
   homepage (even), 5 on /roof-replacement-guide-cost-lifespan/, 3 on
   /roof-repair-vs-replacement-guide/ and 1 on /the-roof-store/.

   The `!important` on max-width is required: core's constrained-layout rule
   (`.is-layout-constrained > :not(...)`, 0-2-0) would otherwise cap this block
   at the 680px prose measure on the interior pages that carry an accordion.
   -------------------------------------------------------------------------- */
.hrp-faq {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0.9rem;
  /* Break out to a 1040px measure wherever the accordion sits, including the
     680px prose column on /the-roof-store/ and the two guide posts — two 290px
     columns inside the prose measure would wrap most questions onto three
     lines. The negative inline margin resolves to zero when the parent is
     already ≥1040px and shrinks with the viewport, so it can never overflow.
     !important is required against core's 0-5-0 constrained-layout rule. */
  max-width: none !important;
  margin-inline: calc(50% - min(520px, 50vw - var(--hrp-gutter))) !important;
}
@media (min-width: 900px) {
  .hrp-faq {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1rem 1.25rem;
  }
  /* Odd count: the last item spans the full width rather than leaving a gap. */
  .hrp-faq > .wp-block-details:last-child:nth-child(odd) {
    grid-column: 1 / -1;
  }
}
/* WordPress resolves a "default" group layout to `is-layout-constrained` when
   theme.json declares a contentSize, which would cap each accordion at 680px
   and re-centre it inside this column. The accordion IS the content here, so it
   takes the full grid-cell width. */
.hrp-faq > * {
  margin-block-start: 0 !important;
  max-width: none !important;
  margin-inline: 0 !important;
  align-self: start;
}

.wp-block-details.hrp-faq-item {
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  background: #ffffff;
  box-shadow: var(--hrp-shadow-sm);
  overflow: hidden;
  transition:
    border-color 0.22s ease,
    box-shadow 0.22s var(--hrp-ease);
}
.wp-block-details.hrp-faq-item[open] {
  border-color: rgba(224, 43, 32, 0.30);
  box-shadow: var(--hrp-shadow-md);
}

.wp-block-details.hrp-faq-item > summary {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.15rem var(--hrp-card-pad-x);
  cursor: pointer;
  list-style: none;
  /* Matches the type the FAQ headings used before the conversion, so the
     question copy reads at exactly the same size and weight as it did. */
  font-family: var(--wp--preset--font-family--heading);
  font-size: 1.1rem;
  font-weight: 600;
  line-height: 1.4;
  letter-spacing: -0.015em;
  color: var(--wp--preset--color--primary);
  transition: color 0.2s ease, background-color 0.2s ease;
}
.wp-block-details.hrp-faq-item > summary::-webkit-details-marker,
.wp-block-details.hrp-faq-item > summary::marker {
  display: none;
  content: "";
}
.wp-block-details.hrp-faq-item > summary:hover {
  color: var(--wp--preset--color--accent-dark);
  background: var(--wp--preset--color--light);
}
.wp-block-details.hrp-faq-item > summary:focus-visible {
  outline: 3px solid var(--wp--preset--color--accent);
  outline-offset: -3px;
  border-radius: var(--hrp-radius-lg);
}

/* Chevron affordance — CSS only, no icon asset. */
.wp-block-details.hrp-faq-item > summary::after {
  content: "";
  flex: 0 0 auto;
  width: 0.62em;
  height: 0.62em;
  margin-top: 0.36em;
  border-right: 2px solid var(--wp--preset--color--accent);
  border-bottom: 2px solid var(--wp--preset--color--accent);
  transform: rotate(45deg);
  transform-origin: center;
  transition: transform 0.25s var(--hrp-ease);
}
.wp-block-details.hrp-faq-item[open] > summary::after {
  transform: rotate(-135deg);
}

.hrp-details-body {
  min-height: 0;
  padding: 0 var(--hrp-card-pad-x) 1.35rem;
}
.hrp-details-body > * {
  margin-block-start: 0 !important;
}
.hrp-details-body p {
  color: var(--wp--preset--color--secondary);
  line-height: 1.7;
}

/* Layer 1 — universal reveal. */
.wp-block-details.hrp-faq-item[open] > .hrp-details-body {
  animation: hrpDetailsOpen 0.28s var(--hrp-ease);
}
@keyframes hrpDetailsOpen {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: none; }
}

/* Layer 2 — real height transition where ::details-content exists. */
@supports selector(::details-content) {
  .wp-block-details.hrp-faq-item::details-content {
    display: grid;
    grid-template-rows: 0fr;
    overflow: hidden;
    transition:
      grid-template-rows 0.3s var(--hrp-ease),
      content-visibility 0.3s allow-discrete;
  }
  .wp-block-details.hrp-faq-item[open]::details-content {
    grid-template-rows: 1fr;
  }
  /* The wrapper reveal would double up with the height transition. */
  .wp-block-details.hrp-faq-item[open] > .hrp-details-body {
    animation: none;
  }
}

/* ==========================================================================
   Service-area cards (patterns/service-area-cards.php)
   ==========================================================================
   Objective 8. Replaces the plain two-column link list that previously sat
   inside the homepage's "Proudly Serving the Greater DMV Area" section. Every
   URL in the pattern is one that already existed in that list — no new page,
   no invented city, no changed destination.
   ========================================================================== */
.hrp-area-grid {
  margin-top: var(--hrp-heading-gap) !important;
}
.hrp-area-card {
  position: relative;
  overflow: hidden;
}
.hrp-area-card::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  background: var(--wp--preset--color--accent);
}
.hrp-area-icon {
  width: 52px;
  height: 52px;
  margin: 0 0 1rem !important;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.45rem;
  line-height: 1;
  background: var(--wp--preset--color--light);
  border: 1px solid rgba(224, 43, 32, 0.20);
  border-radius: var(--hrp-radius-pill);
}
.hrp-area-city {
  margin: 0 0 0.35rem !important;
  font-size: 1.28rem !important;
  line-height: 1.25;
}
.hrp-area-city a {
  color: var(--wp--preset--color--primary);
  text-decoration: none;
  transition: color 0.2s ease;
}
.hrp-area-card:hover .hrp-area-city a,
.hrp-area-city a:hover,
.hrp-area-city a:focus-visible {
  color: var(--wp--preset--color--accent);
}
.hrp-area-blurb {
  margin: 0 0 1.1rem !important;
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--wp--preset--color--secondary);
}
.hrp-area-links {
  margin: 0 !important;
  padding-left: 0;
  list-style: none;
}
.hrp-area-links li {
  margin: 0 0 0.5rem;
  line-height: 1.45;
}
.hrp-area-links a {
  display: inline-flex;
  align-items: baseline;
  gap: 0.45rem;
  font-size: 0.93rem;
  font-weight: 600;
  color: var(--wp--preset--color--accent-dark);
  text-decoration: none;
}
.hrp-area-links a::before {
  content: "\203A";
  color: var(--wp--preset--color--accent);
  font-weight: 700;
}
.hrp-area-links a:hover,
.hrp-area-links a:focus-visible {
  color: var(--wp--preset--color--accent);
  text-decoration: underline;
}
.hrp-area-cta {
  margin-top: auto !important;
  padding-top: 1.15rem;
  font-weight: 700;
  font-size: 0.93rem;
}
.hrp-area-cta a {
  color: var(--wp--preset--color--accent-dark);
  text-decoration: none;
}
.hrp-area-cta a:hover,
.hrp-area-cta a:focus-visible {
  color: var(--wp--preset--color--accent);
  text-decoration: underline;
}

/* ==========================================================================
   Homepage promo modal (patterns/popup-*.php + functions.php)
   ==========================================================================
   Objective 10. Native <dialog>, opened with showModal() by the small vanilla
   snippet enqueued from functions.php — which buys real focus trapping,
   Escape-to-close and ::backdrop for free instead of hand-rolling them.
   Homepage only, first visit only (localStorage flag), no cookies.
   ========================================================================== */
/* --------------------------------------------------------------------------
   2026-08-02, mockup-driven redesign — two-panel card, docked right
   --------------------------------------------------------------------------
   Still a native <dialog> opened with showModal(), so focus trapping, Escape
   and ::backdrop keep coming from the platform. What changed:

     • Composition — image panel left, message right, matching the mockup,
       instead of a stacked media-over-text card.
     • Position — the dialog docks to the RIGHT edge of the viewport instead of
       centring. A modal <dialog> is UA-positioned `position:fixed; inset:0;
       margin:auto`, so overriding the margin box is all that is needed; nothing
       about the dialog's accessibility semantics changes.
     • Entrance — slides in from the right (from the bottom on phones) rather
       than appearing. Suppressed by the global prefers-reduced-motion block.
     • Content — seven day-of-week messages live in the DOM; the script in
       functions.php un-hides exactly one and repoints aria-labelledby at that
       message's own <h2>.
   -------------------------------------------------------------------------- */
.hrp-modal {
  width: min(620px, calc(100vw - 3rem));
  max-width: min(620px, calc(100vw - 3rem));
  max-height: calc(100vh - 3rem);
  padding: 0;
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  background: #ffffff;
  box-shadow: var(--hrp-shadow-lg);
  color: var(--wp--preset--color--primary);
  overflow: hidden;
  box-sizing: border-box;
}
.hrp-modal::backdrop {
  background: rgba(47, 48, 54, 0.62);
  backdrop-filter: blur(2px);
}

/* Docked right on desktop. `margin: auto <gutter> auto auto` keeps the vertical
   centring the UA gives a modal dialog and pins the horizontal axis right. */
@media (min-width: 481px) {
  .hrp-modal--daily {
    margin: auto 1.75rem auto auto !important;
  }
}

.hrp-modal-inner {
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 3rem);
  overflow-y: auto;
}
/* Two-panel layout: image left, message right. Gated at the theme's own 782px
   tablet breakpoint, not at the modal's width — below it the modal is only
   520px wide and a 236px image panel would leave the message in a 284px
   column, which wraps the CTA label. Below 782px the panels stack. */
@media (min-width: 782px) {
  .hrp-modal--daily .hrp-modal-inner {
    display: grid;
    grid-template-columns: 236px minmax(0, 1fr);
    align-items: stretch;
    overflow: hidden;
  }
  .hrp-modal--daily .hrp-modal-media {
    height: 100%;
    aspect-ratio: auto;
    min-height: 320px;
  }
  .hrp-modal--daily .hrp-modal-body {
    max-height: calc(100vh - 3rem);
    overflow-y: auto;
  }
}
.hrp-modal-media {
  flex: 0 0 auto;
  border-radius: 0;
}
.hrp-modal-body {
  padding: 1.85rem var(--hrp-card-pad-x) var(--hrp-card-pad-y);
}

/* Exactly one day-of-week message is visible; the rest carry [hidden]. The
   explicit rule guards against a later display: rule defeating the attribute. */
.hrp-modal-msg[hidden] {
  display: none !important;
}
.hrp-modal-msg > * {
  max-width: none;
}

/* "Not Today" — a real <button> (it performs an action, it does not navigate)
   styled as the quiet text link the mockup shows. It carries the same
   data-hrp-modal-close hook as the × button, so both dismiss AND both set the
   seen/dismissed flag. */
.hrp-modal-not-today {
  display: inline-block;
  padding: 0.35rem 0.15rem;
  border: 0;
  background: none;
  font-family: inherit;
  font-size: 0.9rem;
  font-weight: 700;
  color: var(--wp--preset--color--secondary);
  text-decoration: underline;
  text-underline-offset: 3px;
  cursor: pointer;
  transition: color 0.2s ease;
}
.hrp-modal-not-today:hover,
.hrp-modal-not-today:focus-visible {
  color: var(--wp--preset--color--accent-dark);
}
.hrp-modal-eyebrow {
  margin: 0 0 0.4rem;
  color: var(--wp--preset--color--accent);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-weight: 700;
  font-size: 0.78rem;
}
.hrp-modal-title {
  margin: 0 0 0.8rem;
  font-family: var(--wp--preset--font-family--heading);
  font-size: clamp(1.5rem, 4.2vw, 1.9rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--wp--preset--color--primary);
}
.hrp-modal-text {
  margin: 0 0 1.5rem;
  font-size: 1rem;
  line-height: 1.65;
  color: var(--wp--preset--color--secondary);
}
/* Used by the popup-google-reviews variant, which reuses the review-card star
   row verbatim so there is one star treatment on the site, not two. */
.hrp-modal-body .review-stars {
  margin: -0.25rem 0 1.15rem !important;
}
.hrp-modal-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
}
.hrp-modal-actions .hrp-modal-primary,
.hrp-modal-actions .hrp-modal-secondary {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 52px;
  padding: 0.9rem 1.6rem;
  border-radius: var(--hrp-radius-md);
  font-weight: 700;
  font-size: 1rem;
  text-decoration: none;
  transition:
    transform 0.2s var(--hrp-ease),
    box-shadow 0.2s var(--hrp-ease),
    background-color 0.2s ease,
    border-color 0.2s ease,
    color 0.2s ease;
}
.hrp-modal-actions .hrp-modal-primary {
  flex: 1 1 200px;
  background: var(--wp--preset--color--accent);
  color: #ffffff;
  border: 2px solid var(--wp--preset--color--accent);
  box-shadow: var(--hrp-shadow-red-sm);
}
.hrp-modal-actions .hrp-modal-primary:hover {
  background: var(--wp--preset--color--accent-dark);
  border-color: var(--wp--preset--color--accent-dark);
  color: #ffffff;
  transform: translateY(-2px);
  box-shadow: var(--hrp-shadow-red);
}
.hrp-modal-actions .hrp-modal-secondary {
  flex: 1 1 160px;
  background: transparent;
  color: var(--wp--preset--color--primary);
  border: 2px solid rgba(22, 23, 26, 0.20);
}
.hrp-modal-actions .hrp-modal-secondary:hover {
  background: var(--wp--preset--color--light);
  color: var(--wp--preset--color--accent-dark);
  border-color: var(--wp--preset--color--accent);
}
.hrp-modal-dismiss {
  margin: 1.1rem 0 0;
  font-size: 0.85rem;
  color: var(--wp--preset--color--secondary);
  text-align: center;
}
.hrp-modal-close {
  position: absolute;
  top: 0.75rem;
  right: 0.75rem;
  z-index: 3;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 1px solid rgba(255, 255, 255, 0.28);
  border-radius: var(--hrp-radius-pill);
  background: rgba(47, 48, 54, 0.55);
  color: #ffffff;
  font-size: 1.35rem;
  line-height: 1;
  cursor: pointer;
  transition: background-color 0.2s ease, border-color 0.2s ease;
}
.hrp-modal-close:hover,
.hrp-modal-close:focus-visible {
  background: var(--wp--preset--color--accent);
  border-color: var(--wp--preset--color--accent);
}
/* Entry motion — a real slide-in, one effect only, suppressed under reduced
   motion by the global rule earlier in this file. Desktop slides in from the
   right edge it is docked to; the phone bottom sheet slides up (below). */
.hrp-modal[open] {
  animation: hrpModalIn 0.26s var(--hrp-ease);
}
@keyframes hrpModalIn {
  from { opacity: 0; transform: translateY(12px) scale(0.985); }
  to   { opacity: 1; transform: none; }
}
.hrp-modal--daily[open] {
  animation: hrpModalSlideInRight 0.34s var(--hrp-ease);
}
@keyframes hrpModalSlideInRight {
  from { opacity: 0; transform: translateX(40px); }
  to   { opacity: 1; transform: none; }
}
@keyframes hrpModalSlideUp {
  from { opacity: 0; transform: translateY(100%); }
  to   { opacity: 1; transform: none; }
}
/* The dialog is display:none until showModal(); belt-and-braces for the case
   where CSS loads before the browser applies its own UA rule. */
.hrp-modal:not([open]) {
  display: none;
}

/* ==========================================================================
   Mockup-driven chassis redesign — 2026-08-02
   ==========================================================================
   Everything below belongs to the sitewide chassis pass driven by the owner's
   mockup. Nothing above was deleted; the rules here either add new components
   or refine existing ones in place. Palette is unchanged — white, graphite
   #3c3d44, brand red #e02b20. No black, no gold, no imagery.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Services grid — 3 cards on row 1, 2 centred cards on row 2
   -------------------------------------------------------------------------- */
.hrp-services-row {
  align-items: stretch;
}
.hrp-services-row-1 {
  margin-top: var(--hrp-heading-gap) !important;
}
.hrp-services-row-2 {
  margin-top: var(--wp--preset--spacing--30) !important;
}
/* Two cards, each exactly as wide as a row-1 card, centred under the row above.
   Row 1 = 3 cards over the full measure with 2 gaps; two of those cards plus
   one gap is two thirds of the measure minus a third of a gap. */
/* Row 2's two cards are sized to exactly one third of the row (the same width a
   row-1 card gets) and the row centres them. Sizing the COLUMNS rather than
   capping the row is deliberate: a percentage max-width on the row would
   resolve against the full-bleed section, not against the 1240px measure, and
   would come out wrong at every viewport width. A flex-basis percentage
   resolves against the flex container's own inner width, which is the measure. */
@media (min-width: 782px) {
  .hrp-services-row-2 {
    justify-content: center;
  }
  .hrp-services-row-2 > .wp-block-column {
    flex: 0 0 calc((100% - 2 * var(--wp--preset--spacing--30)) / 3) !important;
    max-width: calc((100% - 2 * var(--wp--preset--spacing--30)) / 3);
  }
}

.service-card-title {
  margin-bottom: 0.15rem;
}
.service-card {
  border-radius: var(--hrp-radius-lg);
}
/* padding, NOT margin-top: `.equal-cards .cta-bottom { margin-top: auto }` is
   what pins every card's button to the bottom of its card so the buttons line
   up across a row. A margin-top here would tie on specificity, win by source
   order, and silently break that alignment. */
.service-card .cta-bottom {
  padding-top: 1.5rem;
}
.service-card .cta-bottom .wp-block-button__link {
  min-height: 52px;
  padding: 0.9rem 1.9rem;
  box-sizing: border-box;
}
/* Larger icon chip in the light card frame, per "larger icons". */
.card-thumb-frame--light .card-thumb-fallback-icon {
  width: calc(var(--hrp-frame-icon-size) * 1.05);
  height: calc(var(--hrp-frame-icon-size) * 1.05);
  font-size: 2.4rem;
}

/* --------------------------------------------------------------------------
   Reviews band (patterns/testimonials.php) on the graphite surface
   -------------------------------------------------------------------------- */
.hrp-reviews-band .equal-cards {
  margin-top: var(--hrp-heading-gap) !important;
}
.hrp-reviews-band .testimonial-card {
  padding: calc(var(--hrp-card-pad-y) + 0.35rem) calc(var(--hrp-card-pad-x) + 0.35rem);
  border-color: transparent;
  box-shadow: var(--hrp-shadow-on-dark);
}
.hrp-reviews-band .review-quote {
  font-size: 1.06rem;
  line-height: 1.72;
}
.hrp-reviews-band .review-name {
  font-size: 1.14rem;
}
.hrp-reviews-band .hrp-avatar {
  width: 58px;
  height: 58px;
}
.hrp-reviews-band .hrp-avatar-initial {
  font-size: 1.35rem;
}

/* --------------------------------------------------------------------------
   Photo + CTA banner (patterns/photo-cta-banner.php)
   -------------------------------------------------------------------------- */
.hrp-photo-cta {
  align-items: center;
  background: #ffffff;
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  box-shadow: var(--hrp-shadow-lg);
  padding: 1.25rem 1.75rem 1.25rem 1.25rem;
  overflow: hidden;
}
.hrp-photo-cta > .wp-block-column {
  min-width: 0;
}
.hrp-photo-cta .eyebrow {
  margin-bottom: 0.3rem;
}
.hrp-photo-cta-title {
  margin: 0 0 0.55rem !important;
  font-size: clamp(1.55rem, 2.6vw, 2.05rem) !important;
  line-height: 1.2;
}
.hrp-photo-cta-text {
  margin: 0 !important;
  font-size: 1rem;
  line-height: 1.6;
  color: var(--wp--preset--color--secondary);
}
.hrp-photo-cta-actions .wp-block-buttons {
  justify-content: flex-end;
}
.hrp-photo-cta-actions .wp-block-button__link {
  min-height: 56px;
  width: 100%;
  box-sizing: border-box;
}
.hrp-photo-cta-actions .wp-block-button {
  width: 100%;
}
.hrp-photo-cta-phone {
  margin: 0.85rem 0 0 !important;
  text-align: center;
  font-weight: 700;
}
.hrp-photo-cta-phone a {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  color: var(--wp--preset--color--primary);
  text-decoration: none;
}
.hrp-photo-cta-phone a::before {
  content: "";
  width: 17px;
  height: 17px;
  background-color: var(--wp--preset--color--accent);
  -webkit-mask-image: var(--hrp-icon-phone);
  mask-image: var(--hrp-icon-phone);
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}
.hrp-photo-cta-phone a:hover {
  color: var(--wp--preset--color--accent-dark);
}

/* --------------------------------------------------------------------------
   General media placeholder frame (.hrp-media-frame)
   --------------------------------------------------------------------------
   The named, size-carrying members of the one placeholder media language, so
   every future real photo has a slot already sized at its final dimensions and
   drops in with zero layout change. Same contract everywhere: graphite
   dark-fade gradient + red radial wash + one centred icon chip, and any
   <img>/<video>/<figure> placed inside covers it by DOM stacking order.

   Variants and where they live (see BUILD-MANIFEST.md for the full audit):
     --crew    4:3   crew-working photo — homepage photo+CTA banner
     --popup   4:5   popup image        — homepage promo modal (left panel)
     --aerial  16:9  drone-inspection   — /about-us/
     --ba      4:3   before / after     — /services/roof-replacement/ (a pair)
     --video   16:9  video thumbnail    — /about-us/, with a play affordance
     --shot    16:10 estimate screenshot— /contact-us-right/
   -------------------------------------------------------------------------- */
.hrp-media-frame {
  position: relative;
  overflow: hidden;
  aspect-ratio: 16 / 9;
  border-radius: var(--hrp-radius-lg);
  background: var(--wp--preset--gradient--dark-fade);
  margin-inline: 0 !important;
  max-width: none !important;
}
.hrp-media-frame::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    radial-gradient(circle at 28% 24%, rgba(224, 43, 32, 0.30) 0, transparent 55%),
    radial-gradient(circle at 78% 84%, rgba(224, 43, 32, 0.16) 0, transparent 55%);
  pointer-events: none;
}
.hrp-media-frame-icon {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--hrp-frame-icon-size);
  height: var(--hrp-frame-icon-size);
  margin: 0 !important;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 2.1rem;
  line-height: 1;
  color: rgba(255, 255, 255, 0.92);
  background: rgba(255, 255, 255, 0.10);
  border: 1px solid rgba(255, 255, 255, 0.22);
  border-radius: var(--hrp-radius-pill);
}
.hrp-media-frame img,
.hrp-media-frame video,
.hrp-media-frame figure,
.hrp-media-frame .wp-block-image {
  position: absolute;
  inset: 0;
  z-index: 2;
  margin: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: 0;
}
.hrp-media-frame--crew   { aspect-ratio: 4 / 3; }
.hrp-media-frame--aerial { aspect-ratio: 16 / 9; }
.hrp-media-frame--ba     { aspect-ratio: 4 / 3; }
.hrp-media-frame--video  { aspect-ratio: 16 / 9; }
.hrp-media-frame--shot   { aspect-ratio: 16 / 10; }
.hrp-media-frame--popup  { aspect-ratio: 4 / 5; border-radius: 0; }

/* Video thumbnail: a play affordance drawn in CSS, no icon asset. It sits
   below a real poster image (z-index 1 vs 2), so a dropped-in <img> covers it. */
.hrp-media-frame--video .hrp-media-frame-icon {
  background: var(--wp--preset--color--accent);
  border-color: var(--wp--preset--color--accent);
  box-shadow: var(--hrp-shadow-red);
  font-size: 1.6rem;
}
/* Before/after pair labels. */
.hrp-media-ba-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.25rem;
}
.hrp-media-ba-label {
  margin: 0.6rem 0 0 !important;
  font-size: 0.76rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--wp--preset--color--secondary);
}

/* --------------------------------------------------------------------------
   Service-area cards — terse variant
   -------------------------------------------------------------------------- */
.hrp-area-card {
  align-items: center;
  text-align: center;
  padding: 2.1rem 1.5rem;
}
.hrp-area-card .hrp-area-icon {
  margin: 0 auto 1rem !important;
}
.hrp-area-city {
  text-align: center;
}
.hrp-area-cta {
  margin-top: auto !important;
  padding-top: 0.9rem;
  text-align: center;
}
.hrp-area-also {
  margin-top: var(--wp--preset--spacing--30) !important;
  max-width: 62ch !important;
  margin-inline: auto !important;
  font-size: 0.98rem;
  color: var(--wp--preset--color--secondary);
}

/* --------------------------------------------------------------------------
   FAQ accordion on the graphite band (homepage only, via .hrp-faq--on-dark)
   --------------------------------------------------------------------------
   The same core/details markup, the same questions and answers, restyled for a
   dark surface. Scoped to the modifier class, so the accordions on
   /the-roof-store/ and the two guide posts keep their white-card treatment
   untouched.
   -------------------------------------------------------------------------- */
.hrp-faq--on-dark {
  margin-top: var(--hrp-heading-gap) !important;
}
.hrp-faq--on-dark .wp-block-details.hrp-faq-item {
  background: rgba(255, 255, 255, 0.06);
  border-color: var(--hrp-border-on-dark);
  box-shadow: none;
}
.hrp-faq--on-dark .wp-block-details.hrp-faq-item[open] {
  background: rgba(255, 255, 255, 0.10);
  border-color: rgba(255, 154, 143, 0.55);
  box-shadow: var(--hrp-shadow-on-dark);
}
.hrp-faq--on-dark .wp-block-details.hrp-faq-item > summary {
  color: #ffffff;
}
.hrp-faq--on-dark .wp-block-details.hrp-faq-item > summary:hover {
  color: var(--hrp-red-on-dark);
  background: rgba(255, 255, 255, 0.06);
}
.hrp-faq--on-dark .wp-block-details.hrp-faq-item > summary::after {
  border-right-color: var(--hrp-red-on-dark);
  border-bottom-color: var(--hrp-red-on-dark);
}
.hrp-faq--on-dark .hrp-details-body p {
  color: var(--hrp-ink-on-dark);
}

/* --------------------------------------------------------------------------
   Footer refinements — five-group layout
   -------------------------------------------------------------------------- */
.site-footer .footer-contact-col .footer-contact {
  margin: 0 0 1rem !important;
  font-size: 0.9rem;
  line-height: 1.75;
}
/* The real contact email is long; let it break on the @ rather than mid-word. */
.site-footer .footer-contact a[href^="mailto:"] {
  overflow-wrap: anywhere;
  word-break: break-word;
}
.site-footer .footer-contact-note {
  margin: 0 0 1.1rem !important;
  font-size: 0.88rem;
  line-height: 1.55;
  color: rgba(216, 217, 221, 0.85);
}
.site-footer .footer-contact-col .wp-block-button__link {
  min-height: 48px;
  padding: 0.75rem 1.4rem;
  font-size: 0.98rem;
  width: 100%;
  box-sizing: border-box;
}
.site-footer .footer-contact-col .wp-block-button {
  width: 100%;
}
/* The Service Areas column carries 11 real, deliberately long page titles;
   tightening its line-height and size is what keeps the five-column footer
   scannable without dropping a single link. */
.site-footer .footer-areas-list a {
  font-size: 0.87rem;
  line-height: 1.4;
}
.site-footer .footer-areas-list li {
  margin-bottom: 0.5rem;
}
.site-footer .footer-brand-col .footer-blurb {
  max-width: 42ch;
}

/* --------------------------------------------------------------------------
   Typography pass — section headings and heading→content air
   --------------------------------------------------------------------------
   theme.json carries the size scale (h1 → clamp(2.8rem, 5.6vw, 4.5rem),
   h2 → clamp(2.25rem, 4.1vw, 3.15rem), h3 → clamp(1.7rem, 2.9vw, 2.2rem)).
   These rules only handle the rhythm around them: a centred section heading now
   gets a real measure so a long H2 breaks into two balanced lines instead of
   one very wide one, and the heading→grid gap opened up with the section
   padding.
   -------------------------------------------------------------------------- */
.wp-block-group > h2.has-text-align-center,
.wp-block-group > h1.has-text-align-center {
  /* Same 0-5-0 constrained-layout rule as .section-lede — see the note there. */
  max-width: 26ch !important;
  margin-inline: auto !important;
  text-wrap: balance;
}
.hero-band h1,
.hrp-photo-cta-title {
  text-wrap: balance;
}
:root {
  --hrp-heading-gap: 2.85rem;
}

/* --------------------------------------------------------------------------
   Header overflow — threshold raised 782px → 1024px (2026-08-02)
   --------------------------------------------------------------------------
   The responsive audit pass fixed a real 600–781px overflow by moving core's
   overlay-menu threshold up from 599px to 782px. That fix is NOT removed — it
   is extended, because the bar itself grew: the header is now a single nowrap
   row holding the brand name, a six-item nav, the phone number WITH an icon and
   the "Get a Free Quote" button, inside a 1240px measure with a real side
   gutter. Measured at ~1180px minimum to fit; below that the row overflowed the
   viewport (verified at 900px, where the CTA ran 291px past the right edge).

   Two steps, so nothing is hidden earlier than it has to be:
     ≤ 1023.98px   the nav hands over to core's overlay/hamburger
     1024–1179.98  the nav stays inline and the phone NUMBER steps out (the
                   phone is still one tap away in the overlay-free CTA, in the
                   footer's Contact column and on every page's CTA band)
   -------------------------------------------------------------------------- */
@media (max-width: 1099.98px) {
  .site-header .wp-block-navigation__responsive-container.hidden-by-default:not(.is-menu-open) {
    display: none !important;
  }
  .site-header .wp-block-navigation__responsive-container-open:not(.always-shown) {
    display: flex !important;
  }
}
@media (min-width: 1100px) and (max-width: 1279.98px) {
  .site-header .header-phone-cta {
    display: none;
  }
}

/* --------------------------------------------------------------------------
   Review cards go 2-up below 1024px, not 3-up
   --------------------------------------------------------------------------
   A review card's minimum content width is large — a 58px avatar beside a
   nowrap "Google Review" badge and a star row — so three of them across a
   ~960px measure overflowed the viewport. They step down to two columns a
   breakpoint earlier than the other card grids; the star/badge cluster is also
   allowed to wrap at every width now, not only on a phone.
   -------------------------------------------------------------------------- */
/* The lower bound matters: this selector is more specific than the generic
   .equal-cards rules in the 782px/480px blocks below, so without `min-width`
   it would also win at phone width and keep the cards 2-up there. Core forces
   `flex-wrap: nowrap !important` above 782px, so an explicit wrap is required
   for a second row to exist at all in this range. */
@media (min-width: 782px) and (max-width: 1023.98px) {
  .hrp-reviews-band .equal-cards.wp-block-columns:not(.is-not-stacked-on-mobile) {
    flex-wrap: wrap !important;
    justify-content: center;
  }
  .hrp-reviews-band .equal-cards.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
    flex-basis: calc(50% - 1rem) !important;
    flex-grow: 0 !important;
  }
}

/* ==========================================================================
   ===== Responsive breakpoints =====
   Added 2026-08-02 (responsive audit pass), retained and re-tuned in the
   visual redesign pass of the same date. Nothing from the audit was removed:
   both of its bug fixes are still here — the header-overflow fix that moves
   the hamburger threshold from core's 599px up to 782px (the width at which
   this theme's 6-item nav genuinely stops fitting inside a nowrap row), and
   the form `box-sizing: border-box` fix. The spacing-preset re-pointing was
   re-based on the new, more generous desktop scale (1.125 / 2 / 3.25 / 5.5 /
   8rem) so the premium whitespace does not become cramped or excessive on
   small screens. Two conventional WordPress breakpoints, unchanged:

     781.98px  — tablet / "mobile" boundary (core's own columns breakpoint is
                 max-width:781px; 781.98 avoids a 1px dead zone on fractional
                 viewport widths)
     480px     — phone

   Rules are ordered: base sizing fixes first (needed for the breakpoints to
   behave at all), then tablet, then phone.
   ========================================================================== */

/* --- Base sizing fixes (apply at every width, required by the breakpoints) --- */

/* Form controls are width:100% with 1rem horizontal padding + 1px border. In
   the default content-box model that makes every input WIDER than its
   container, which overflows the 640px contact-form card and forces horizontal
   scroll on a phone. Border-box is the actual fix; the media queries below
   assume it. (Original responsive-audit fix — preserved.) */
.hrp-form input,
.hrp-form select,
.hrp-form textarea,
.hrp-form button,
.wp-block-search__input {
  box-sizing: border-box;
  max-width: 100%;
}

/* Nothing hand-authored should be able to push the page wider than the viewport. */
.wp-block-embed iframe,
.wp-block-embed__wrapper > iframe {
  max-width: 100%;
}

.blog-post-card,
.service-card,
.testimonial-card,
.trust-card,
.plan-card,
.hrp-area-card,
.wp-block-details.hrp-faq-item {
  box-sizing: border-box;
  max-width: 100%;
}

/* The modal deliberately does NOT take `max-width: 100%` from the rule above —
   its own `min(560px, calc(100vw - 2rem))` already guarantees it can never
   exceed the viewport, and a later 100% would undo it. Box-sizing only. */
.hrp-modal,
.hrp-modal-inner,
.hrp-modal-body {
  box-sizing: border-box;
}
/* Neutralise the constrained-layout margins <main> would otherwise put on the
   dialog; a top-layer modal centres itself with margin:auto. */
.hrp-modal {
  margin: auto;
}

/* Long slugs/URLs in migrated copy must wrap rather than overflow. */
.wp-block-post-title,
.blog-post-card p,
.site-footer li,
.hrp-area-links a,
.wp-block-details.hrp-faq-item > summary,
.hrp-modal-title {
  overflow-wrap: break-word;
}

/* --- Tablet: 782px and below --------------------------------------------- */
@media (max-width: 781.98px) {

  /* Section rhythm. Every band in this theme pads with the spacing presets
     (cta-band, trust-signals, services-grid, page/archive title bands, footer,
     hero). Re-pointing the presets themselves scales all of them together
     instead of chasing each component. html:root keeps this ahead of the
     :root block WordPress generates from theme.json. Re-based on the new
     desktop scale so the redesign's extra whitespace still reads as generous
     — not cavernous — on a tablet. */
  html:root {
    --wp--preset--spacing--30: 1.6rem;
    --wp--preset--spacing--40: 2.5rem;
    --wp--preset--spacing--50: 3.75rem;
    --wp--preset--spacing--60: 5rem;
  }

  /* Card interiors follow the same reduction. */
  :root {
    --hrp-card-pad-x: 1.5rem;
    --hrp-card-pad-y: 1.75rem;
    --hrp-heading-gap: 1.9rem;
    --hrp-heading-gap-sm: 1rem;
    --hrp-frame-icon-size: 68px;
  }

  /* Header ---------------------------------------------------------------
     The visible header bar is a single flex row with flexWrap:"nowrap" holding
     logo + site title + the full 6-item nav + phone number + "Get a Free Quote".
     Core's overlayMenu:"mobile" does NOT take over until 599px, so between
     600px and 782px the entire desktop nav was still rendering inline inside a
     nowrap row — guaranteed overflow on any tablet. Two fixes: (1) move the
     hamburger threshold up to the 782px tablet breakpoint, which is where this
     theme's nav actually stops fitting, and (2) let the remaining bar wrap.
     (Original responsive-audit fix — preserved.) */
  .site-header .wp-block-navigation__responsive-container.hidden-by-default:not(.is-menu-open) {
    display: none !important;
  }
  .site-header .wp-block-navigation__responsive-container-open:not(.always-shown) {
    display: flex !important;
  }

  .site-header > .wp-block-group {
    flex-wrap: wrap !important;
    row-gap: 0.75rem;
    column-gap: 0.9rem;
    padding-top: 0.95rem !important;
    padding-bottom: 0.95rem !important;
  }
  .site-header .wp-block-site-title {
    font-size: 1.15rem;
    min-width: 0;
    flex: 1 1 auto;
  }
  .site-header .wp-block-site-logo img {
    width: 44px;
    height: auto;
  }
  .site-header > .wp-block-group > .wp-block-group {
    flex-wrap: wrap;
    gap: 0.9rem;
  }
  .site-header .wp-block-button__link {
    min-height: 44px;
    padding: 0.7rem 1.35rem;
    font-size: 0.95rem;
  }

  /* Hero: the desktop min-height is too tall once the copy stacks. */
  .hero-band {
    min-height: clamp(380px, 52vh, 520px);
  }
  .hero-band h1 {
    max-width: none;
  }

  /* Card grids: 3-across (and the 5-across services grid, 4-across 404 grid)
     collapse to 2-across. Core stacks .wp-block-columns straight to 1-across
     with a !important flex-basis, so matching !important is required to hold
     an intermediate 2-up step. */
  .equal-cards.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column,
  .hrp-area-grid.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column,
  .trust-bar .wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
    flex-basis: calc(50% - 1rem) !important;
    flex-grow: 0;
  }

  /* Query Loop post cards (archive.html / search.html): 3 → 2.
     Two class selectors beat the single .wp-container-* class core generates
     for the grid layout, so no !important needed here. */
  .wp-block-post-template.is-layout-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.5rem;
  }

  /* Footer: the four columns go 2-up at tablet rather than straight to a single
     very long column (they only collapse to 1-up at phone width, below). */
  .site-footer .wp-block-columns > .wp-block-column {
    flex-basis: calc(50% - 1rem) !important;
    flex-grow: 0;
  }
  .site-footer .footer-brand-col {
    flex-basis: 100% !important;
  }
  .site-footer .footer-bottom {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.6rem;
  }
  .footer-badge {
    max-width: none;
  }

  /* FAQ accordion: reclaim the horizontal padding, keep the tap target big. */
  .wp-block-details.hrp-faq-item > summary {
    padding: 1rem 1.15rem;
    font-size: 1.05rem;
  }
  .hrp-details-body {
    padding: 0 1.15rem 1.15rem;
  }

  /* Promo modal — panels stacked at this width (see the 782px note above), so
     the image becomes a short banner rather than a 4:5 portrait panel. */
  .hrp-modal {
    width: min(520px, calc(100vw - 1.5rem));
    max-width: min(520px, calc(100vw - 1.5rem));
  }
  .hrp-modal--daily .hrp-modal-media {
    aspect-ratio: 16 / 7;
    min-height: 0;
  }

  /* Trust bar reads as an icon + one short label per cell; 2-up is the honest
     layout here, not 1-up. */
  .trust-bar .wp-block-column {
    padding: 1.5rem 1rem;
  }
  .trust-bar-icon {
    width: 48px;
    height: 48px;
    font-size: 1.4rem;
    margin-bottom: 0.7rem;
  }

  /* ---- Mockup-redesign components at tablet ---------------------------- */

  :root {
    --hrp-heading-gap: 1.9rem;
    --hrp-hero-trust-overlap: 2.5rem;
  }

  /* Hero: copy fills the column, badge row goes 2-up. */
  .hero-band {
    min-height: clamp(430px, 56vh, 560px);
  }
  .hero-band .hero-content {
    max-width: none !important;
  }
  .hero-band h1 {
    max-width: none;
  }
  .hero-band .hero-lede {
    max-width: none !important;
  }
  .hero-band .hero-actions .wp-block-button__link {
    min-height: 52px;
    padding-inline: 1.9rem;
  }
  .hero-band .hero-trust-row.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
    flex-basis: calc(50% - 0.625rem) !important;
    flex-grow: 0;
  }

  /* Services: both rows behave identically at 2-up; row 2 stops being a
     two-thirds-width centred row and just fills the measure. */
  .hrp-services-row-2 {
    max-width: none;
  }
  .hrp-services-row.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
    flex-basis: calc(50% - 1rem) !important;
    flex-grow: 0;
  }
  /* Row 1 has three cards; at 2-up the third would leave an empty cell beside
     it. Centring the row puts it neatly on its own centred line instead. */
  .hrp-services-row-1 {
    justify-content: center;
  }

  /* Photo + CTA banner stacks into a readable column. */
  .hrp-photo-cta {
    padding: 1.25rem;
  }
  .hrp-photo-cta > .wp-block-column {
    flex-basis: 100% !important;
  }
  .hrp-photo-cta-media-col .hrp-media-frame {
    aspect-ratio: 16 / 7;
  }
  .hrp-photo-cta-actions .wp-block-buttons {
    justify-content: flex-start;
  }

  /* FAQ: single column below 900px (see the min-width rule above). */
  .hrp-faq--on-dark {
    margin-top: 1.9rem !important;
  }
}

/* --- Phone: 480px and below ---------------------------------------------- */
@media (max-width: 480px) {

  html:root {
    --wp--preset--spacing--20: 1rem;
    --wp--preset--spacing--30: 1.35rem;
    --wp--preset--spacing--40: 1.9rem;
    --wp--preset--spacing--50: 2.75rem;
    --wp--preset--spacing--60: 3.5rem;
  }

  :root {
    --hrp-card-pad-x: 1.25rem;
    --hrp-card-pad-y: 1.5rem;
    --hrp-heading-gap: 1.5rem;
    --hrp-heading-gap-sm: 0.85rem;
    --hrp-frame-icon-size: 60px;
  }

  /* Everything goes single column. */
  .equal-cards.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column,
  .hrp-area-grid.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column,
  .site-footer .wp-block-columns > .wp-block-column {
    flex-basis: 100% !important;
  }
  .trust-bar .wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
    flex-basis: calc(50% - 0.5rem) !important;
  }
  .wp-block-post-template.is-layout-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: 1.25rem;
  }

  /* Display typography. Fraunces at the theme's `huge` preset
     (clamp(2.6rem, 5.2vw, 4rem)) never drops below 2.6rem/41.6px, which is too
     large for a 375px viewport once the constrained layout's padding is taken
     off. Scaled here only where no inline font-size was authored on the block,
     so the many deliberately-sized headings in migrated content
     (style="font-size:1.1rem" etc.) are left exactly as they are. */
  h1:not([style*="font-size"]),
  .wp-block-post-title:not([style*="font-size"]) {
    font-size: 2.05rem;
    line-height: 1.12;
    letter-spacing: -0.025em;
  }
  h2:not([style*="font-size"]) {
    font-size: 1.72rem;
    line-height: 1.2;
    letter-spacing: -0.02em;
  }
  h3:not([style*="font-size"]) {
    font-size: 1.34rem;
    line-height: 1.32;
  }
  h1, h2, h3, h4 {
    overflow-wrap: break-word;
  }

  /* Hero + intro lead paragraphs authored at 1.15–1.25rem inline. */
  .hero-band p[style*="font-size:1.25rem"],
  p[style*="font-size:1.15rem"] {
    font-size: 1.04rem !important;
  }
  .hero-band {
    min-height: 0;
  }
  .hero-band h1 {
    margin-top: 1rem;
  }
  .hero-band .wp-block-buttons {
    margin-top: 1.85rem;
  }
  .hero-badge {
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    padding: 0.45rem 0.9rem;
    flex-wrap: wrap;
    text-align: center;
  }

  /* 404 mark — clamp already handles this, but tighten the gap under it. */
  .error-mark {
    margin-bottom: 0.25rem;
  }

  /* Header bar at phone width: give the phone number + CTA their own full
     row under the logo/title/hamburger line so nothing is squeezed. */
  .site-header > .wp-block-group > .wp-block-group {
    flex-basis: 100%;
    justify-content: space-between;
    width: 100%;
  }
  .site-header .header-phone-cta {
    font-size: 0.95rem;
  }
  .site-header .wp-block-site-title {
    font-size: 1rem;
  }
  .site-header .wp-block-button__link {
    min-height: 44px;
    padding: 0.7rem 1.1rem;
    font-size: 0.88rem;
  }

  /* Content buttons go full width — they are the primary conversion targets
     and half-width buttons wrap their labels badly at this size. Header CTA is
     deliberately excluded (handled above). */
  main .wp-block-buttons > .wp-block-button,
  .site-footer .wp-block-buttons > .wp-block-button {
    width: 100%;
  }
  main .wp-block-buttons > .wp-block-button .wp-block-button__link,
  .site-footer .wp-block-buttons > .wp-block-button .wp-block-button__link {
    display: flex;
    text-align: center;
    width: 100%;
    box-sizing: border-box;
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }

  /* Cards: reclaim the desktop padding (driven by the token overrides above). */
  .testimonial-card:not(.has-review-head)::before {
    font-size: 3rem;
    margin-bottom: -0.75rem;
  }
  .testimonial-card.has-review-head::after {
    font-size: 5rem;
    bottom: -1.1rem;
  }
  .review-head {
    gap: 0.75rem;
  }
  .hrp-avatar {
    width: 46px;
    height: 46px;
  }
  .hrp-avatar-initial {
    font-size: 1.1rem;
  }
  /* The name/star/badge cluster wraps rather than squeezing the badge off the
     card edge at 320–360px. */
  .review-stars {
    flex-wrap: wrap;
    row-gap: 0.3rem;
  }

  /* FAQ accordion */
  .wp-block-details.hrp-faq-item > summary {
    padding: 0.95rem 1rem;
    font-size: 1rem;
    gap: 0.7rem;
  }
  .hrp-details-body {
    padding: 0 1rem 1.1rem;
  }

  /* Service-area cards */
  .hrp-area-icon {
    width: 46px;
    height: 46px;
    font-size: 1.3rem;
  }
  .hrp-area-city {
    font-size: 1.2rem !important;
  }

  /* Footer */
  .footer-credentials,
  .footer-social {
    gap: 0.5rem;
  }
  .footer-badge {
    max-width: none;
  }
  .footer-legal-links {
    gap: 0.35rem 0.85rem;
  }

  /* Promo modal: full-bleed-ish sheet, stacked actions, no horizontal squeeze. */
  .hrp-modal {
    width: calc(100vw - 1.5rem);
    max-width: calc(100vw - 1.5rem);
  }
  .hrp-modal-body {
    padding: 1.4rem 1.15rem 1.5rem;
  }
  .hrp-modal-actions {
    flex-direction: column;
    gap: 0.6rem;
  }
  .hrp-modal-actions .hrp-modal-primary,
  .hrp-modal-actions .hrp-modal-secondary {
    flex: 1 1 auto;
    width: 100%;
    box-sizing: border-box;
    min-height: 50px;
  }
  .hrp-modal-close {
    width: 40px;
    height: 40px;
    top: 0.5rem;
    right: 0.5rem;
  }
  .trust-bar .wp-block-column {
    padding: 1.25rem 0.85rem;
  }
  .trust-bar .wp-block-column p:not(.trust-bar-icon) {
    font-size: 0.9rem;
  }

  /* Forms stay full-width and tappable. */
  .hrp-form input,
  .hrp-form select,
  .hrp-form textarea {
    font-size: 16px; /* prevents iOS Safari zoom-on-focus */
    padding: 0.75rem 0.8rem;
    margin-bottom: 1.1rem;
  }
  .hrp-form button.wp-element-button,
  .hrp-form button[type="submit"] {
    width: 100%;
    min-height: 52px;
  }

  /* core/search: the 60%-width block + inline button would overflow. */
  .wp-block-search {
    width: 100% !important;
  }
  .wp-block-search__inside-wrapper {
    max-width: 100%;
  }
  .wp-block-search__button.wp-element-button {
    padding: 0.75rem 0.95rem;
  }

  /* Single-post hero frame is far too letterboxed at 21/9 on a phone. */
  .single-post-thumb .post-thumb-frame {
    aspect-ratio: 16 / 9;
  }
  .single-post-thumb .post-thumb-fallback-icon {
    font-size: 2.5rem;
  }

  .roofline-divider {
    height: 18px;
  }

  /* ---- Mockup-redesign components at phone width ----------------------- */

  :root {
    --hrp-heading-gap: 1.5rem;
    --hrp-hero-trust-overlap: 1.75rem;
  }

  /* Hero: the badge row goes single column, so the overlap is kept small and
     the row is allowed to sit almost entirely inside the band. */
  .hero-band .hero-trust-row.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
    flex-basis: 100% !important;
  }
  .hero-band .hero-trust-row {
    margin-top: var(--wp--preset--spacing--40) !important;
  }
  .hero-trust-card {
    padding: 0.85rem 1rem;
  }
  .hero-trust-icon {
    width: 40px;
    height: 40px;
    font-size: 1.15rem;
  }
  .hero-trust-label {
    font-size: 0.9rem;
  }
  .hero-band .hero-actions .wp-block-button__link {
    min-height: 52px;
  }
  .hero-band .hero-rating {
    font-size: 0.95rem;
  }

  /* Services / area cards / photo banner all single column. */
  .hrp-services-row.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
    flex-basis: 100% !important;
  }
  .hrp-photo-cta {
    padding: 1rem;
  }
  .hrp-photo-cta-title {
    font-size: 1.5rem !important;
  }
  .hrp-photo-cta-actions .wp-block-buttons {
    justify-content: stretch;
  }
  .hrp-area-card {
    padding: 1.6rem 1.15rem;
  }

  /* Reviews band card padding follows the shared token reduction. */
  .hrp-reviews-band .testimonial-card {
    padding: var(--hrp-card-padding);
  }
  .hrp-reviews-band .hrp-avatar {
    width: 48px;
    height: 48px;
  }

  /* ---- Promo modal: BOTTOM SHEET --------------------------------------
     Full-width, pinned to the bottom edge, rounded on the top corners only,
     sliding up from below. The two-panel grid collapses to a single column
     with the image as a short banner above the message. */
  .hrp-modal--daily {
    width: 100vw !important;
    max-width: 100vw !important;
    max-height: 88vh;
    margin: auto auto 0 auto !important;
    border-radius: 20px 20px 0 0;
    border-bottom: 0;
  }
  .hrp-modal--daily[open] {
    animation: hrpModalSlideUp 0.32s var(--hrp-ease);
  }
  .hrp-modal--daily .hrp-modal-inner {
    display: flex;
    flex-direction: column;
    max-height: 88vh;
  }
  .hrp-modal--daily .hrp-modal-media {
    aspect-ratio: 16 / 7;
    min-height: 0;
  }
  .hrp-modal--daily .hrp-modal-body {
    padding: 1.35rem 1.15rem 1.6rem;
  }
  /* A drag-handle affordance, drawn in CSS, so the sheet reads as a sheet. */
  .hrp-modal--daily::before {
    content: "";
    position: absolute;
    top: 0.5rem;
    left: 50%;
    transform: translateX(-50%);
    z-index: 4;
    width: 44px;
    height: 4px;
    border-radius: var(--hrp-radius-pill);
    background: rgba(255, 255, 255, 0.55);
  }

  /* Before/after pair stacks rather than shrinking to two thumbnails. */
  .hrp-media-ba-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* ==========================================================================
   Local / service page layout — mockup-driven redesign, phase 2 (2026-08-02)
   ==========================================================================
   Phase 1 rebuilt the sitewide chassis (1240px wideSize, spacing scale, type
   scale, header/hero/popup/footer). This section applies that same system to
   the individual service and geo landing pages, which were the pages the owner
   described as "too narrow and cramped".

   Nothing above this block was removed or rewritten. Both existing breakpoints
   (781.98px tablet, 480px phone) and both earlier bug fixes (the header
   overflow fix, the form box-sizing fix) are untouched; this section adds its
   own breakpoint blocks at the end rather than editing theirs.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Interior page content measure — the actual cause of "too narrow"
   --------------------------------------------------------------------------
   templates/page.html renders `wp:post-content` inside a constrained group, so
   WordPress caps `.entry-content` ITSELF at the 680px prose measure. Every
   `alignfull` band a content file declares — including the shared
   trust-signals, testimonials, estimate-form and cta-band patterns — was
   therefore being squeezed into a 680px centred column instead of running the
   full width it was authored for.

   Un-constraining the content wrapper (and only the wrapper) fixes that:
     • `.alignfull` children become genuinely full-width bands;
     • `.alignwide` children resolve to theme.json's 1240px wideSize;
     • ordinary, non-aligned prose is STILL capped at 680px and centred by
       `.entry-content`'s own constrained layout, so the long-form pages
       (about, contact, legal, Roof Store plan pages, blog posts) keep exactly
       the reading measure they had before.
   -------------------------------------------------------------------------- */
/* The wrapper is now `main > .alignfull`, which the sitewide gutter rule near
   the top of this file targets. It must NOT take that gutter itself: the gutter
   belongs to the bands inside it, otherwise every coloured band would stop 40px
   short of the viewport edge and show a stripe of page background beside it. */
.hrp-page-content {
  padding-inline: 0 !important;
}
.hrp-page-content > .entry-content {
  max-width: none !important;
  margin-inline: 0 !important;
}
/* Full-width bands: the sitewide side gutter, which
   `.wp-site-blocks main > .wp-block-group > .alignfull` could never reach
   through the intervening `.entry-content` wrapper. Inline padding-left /
   padding-right authored on a specific block still wins over this shorthand. */
.hrp-page-content > .entry-content > .alignfull {
  padding-inline: var(--hrp-gutter);
}
/* Everything else keeps the 680px prose measure AND the same side gutter the
   old wrapper gave it, so long-form pages render at exactly the width they
   did before this change. */
.hrp-page-content > .entry-content > :not(.alignfull) {
  padding-inline: var(--hrp-gutter);
  box-sizing: border-box;
}

/* --------------------------------------------------------------------------
   1b. Title-band contrast — pre-existing bug found while doing this pass
   --------------------------------------------------------------------------
   Every interior template (page / single / archive / search) puts its title on
   the graphite band with `textColor:"background"` (white). That colour is set
   on the GROUP and inherited — but theme.json's `elements.heading` rule sets an
   explicit `color` on h1–h6 itself, which beats inheritance, so the H1 was
   rendering in near-black ink (#16171a) on the graphite band: roughly 1.2:1,
   effectively invisible. Naming the title blocks directly fixes it without
   touching theme.json's ink colour, which is correct everywhere else.
   -------------------------------------------------------------------------- */
.has-graphite-background-color > .wp-block-post-title,
.has-graphite-background-color > .wp-block-query-title,
.has-graphite-background-color .wp-block-post-title,
.has-graphite-background-color .wp-block-query-title {
  color: #ffffff;
}

/* --------------------------------------------------------------------------
   1c. Seams between the content wrapper's padding and full-bleed bands
   --------------------------------------------------------------------------
   The wrapper's spacing|50 padding is the air a prose page needs around its
   text. When the content's LAST block is a full-bleed band, that padding
   instead shows as a strip of page background between that band and the
   closing cta-band; when the content's FIRST block is the real 25%-offer
   strip, it shows as a strip between the graphite title band and the strip.
   Both are removed conditionally so every other page keeps its air.

   `:has()` is baseline in every current browser; if it were ever unsupported
   the rules simply do not apply and the layout falls back to the extra
   padding, which is cosmetic, not broken. `!important` is required because the
   wrapper declares its padding as an inline style, the way every band in this
   theme declares spacing.
   -------------------------------------------------------------------------- */
.hrp-page-content:has(> .entry-content > .alignfull:last-child) {
  padding-bottom: 0 !important;
}
.hrp-page-content:has(> .entry-content > .hrp-offer-strip:first-child) {
  padding-top: 0 !important;
}

/* --------------------------------------------------------------------------
   2. Alternating media + text section (.hrp-split)
   --------------------------------------------------------------------------
   The owner's section-1 / section-2 pattern: an image placeholder on one side
   and real copy on the other, alternating down the page. Built from real core
   blocks (wp:columns + wp:column), so it stays editable in WordPress.

   Which side the media sits on is decided by DOM order in the pattern, not by
   CSS — the media column is written first for "image left" sections and second
   for "image right" sections. That keeps the stacked mobile order sensible in
   both directions with no order/flex-direction tricks.
   -------------------------------------------------------------------------- */
.wp-block-columns.hrp-split {
  align-items: center;
  gap: clamp(2rem, 4.4vw, 4.25rem);
  margin-block: 0;
}
.hrp-split > .wp-block-column {
  min-width: 0;
}

/* Text column ------------------------------------------------------------- */
.hrp-split-text > *:first-child {
  margin-block-start: 0 !important;
}
.hrp-split-text .eyebrow {
  margin-bottom: 0.35rem;
}
/* `.wp-block-column > h2 + *` gives every heading the 2.85rem section gap.
   Inside a split column that is more air than the composition wants, so the
   pair is tightened here — same specificity (0,1,1), later in the file. */
.hrp-split-text > h2 + *,
.hrp-split-text > h3 + * {
  margin-block-start: 1.45rem;
}
.hrp-split-text > p {
  max-width: 62ch;
}
.hrp-split-text > p + p {
  margin-block-start: 1.15rem;
}
.hrp-split-text .wp-block-list {
  max-width: 62ch;
}
.hrp-split-text > .wp-block-buttons {
  margin-block-start: 2.15rem;
}
/* A promoted section heading keeps its original tag level and its exact text —
   the only change is that the pre-redesign inline `font-size:1.1rem` /
   `1.15rem` override is dropped, so it picks up the phase-1 type scale
   (h2 = xx-large, h3 = x-large) instead of rendering at body size. */

/* Media column ------------------------------------------------------------ */
.hrp-split-media > .hrp-media-frame,
.hrp-split-media > .hrp-media-ba-grid .hrp-media-frame {
  box-shadow: var(--hrp-shadow-lg);
}
.hrp-split-media > * {
  margin-block-start: 0 !important;
}

/* --------------------------------------------------------------------------
   3. Media placeholder slots for this pass
   --------------------------------------------------------------------------
   Same one placeholder language as everywhere else in the theme (graphite
   dark-fade gradient + red radial wash + a single centred icon chip; a real
   <img>/<video> dropped inside covers it by DOM stacking order with zero
   layout change). Each variant is sized at the aspect ratio the real photo for
   that slot will actually be shot at, rather than repeating one ratio
   everywhere. NOTHING is fetched — no stock imagery exists in this build.
   -------------------------------------------------------------------------- */
.hrp-media-frame--replace    { aspect-ratio: 3 / 2; }    /* replacement in progress */
.hrp-media-frame--install    { aspect-ratio: 3 / 2; }    /* new roof going on */
.hrp-media-frame--repair     { aspect-ratio: 4 / 3; }    /* close-up repair work */
.hrp-media-frame--materials  { aspect-ratio: 1 / 1; }    /* material / shingle samples */
.hrp-media-frame--siding     { aspect-ratio: 4 / 3; }    /* finished siding elevation */
.hrp-media-frame--gutter     { aspect-ratio: 3 / 2; }    /* seamless gutter run */
.hrp-media-frame--downspout  { aspect-ratio: 2 / 3; }    /* tall downspout detail */
.hrp-media-frame--cleaning   { aspect-ratio: 4 / 3; }    /* gutter clean-out */
.hrp-media-frame--city       { aspect-ratio: 16 / 10; }  /* neighbourhood streetscape */
.hrp-media-frame--rowhouse   { aspect-ratio: 16 / 10; }  /* DC row-house roofline */
.hrp-media-frame--truck      { aspect-ratio: 3 / 2; }    /* branded truck on site */

/* --------------------------------------------------------------------------
   4. Sub-service card grids on service / geo pages
   --------------------------------------------------------------------------
   Deliberately the SAME card language as patterns/services-grid.php — the
   shared `.service-card` rule already supplies the border, 16px radius, red
   top rule, token padding and hover lift. These rules only size the type for
   the denser 3-up grid that sits inside a service page.
   -------------------------------------------------------------------------- */
.hrp-cards-section .service-card-title {
  font-size: 1.3rem;
  margin-block: 0 0.7rem !important;
}
.hrp-cards-section .service-card p {
  color: var(--wp--preset--color--secondary);
  font-size: 1rem;
  line-height: 1.65;
}
.hrp-cards-section .wp-block-columns + .wp-block-columns {
  margin-block-start: var(--wp--preset--spacing--30);
}
.hrp-cards-row {
  align-items: stretch;
}
/* A trailing row of two cards under a row of three: size the COLUMNS to one
   third of the row and centre them, so the last two cards are exactly as wide
   as the three above rather than stretching to half the measure each. Same
   technique (and same reasoning) as .hrp-services-row-2 on the homepage —
   a percentage flex-basis resolves against the flex container's own inner
   width, which is the 1240px measure; a max-width on the row would resolve
   against the full-bleed section and be wrong at every viewport width. */
@media (min-width: 782px) {
  .hrp-cards-row--2up {
    justify-content: center;
  }
  .hrp-cards-row--2up > .wp-block-column {
    flex: 0 0 calc((100% - 2 * var(--wp--preset--spacing--30)) / 3) !important;
    max-width: calc((100% - 2 * var(--wp--preset--spacing--30)) / 3);
  }
}

/* --------------------------------------------------------------------------
   5. Photo + CTA banner reused as the section-4 CTA on interior pages
   --------------------------------------------------------------------------
   patterns/photo-cta-banner.php was authored for the homepage, where it
   continues the graphite reviews band directly above it and therefore must not
   restate a full section's top padding. Its own padding is now the normal
   section value so it stands alone correctly on a service page; the homepage's
   tight join is restored by this adjacency rule. `!important` is required only
   because the pattern carries its padding as an inline style, which is how
   every band in this theme declares spacing.
   -------------------------------------------------------------------------- */
.hrp-reviews-band + .hrp-photo-cta-band {
  padding-top: var(--wp--preset--spacing--20) !important;
}

/* --------------------------------------------------------------------------
   6. Section rhythm on the redesigned pages
   -------------------------------------------------------------------------- */
/* The first content section sits directly under page.html's title band, which
   already supplies the air above it via the post-content wrapper's padding. */
.hrp-split-section--first {
  padding-top: 0 !important;
}
/* A promo/offer strip (the real 25%-bundle banners) reads as part of the
   section beneath it, not as a section of its own. */
.hrp-offer-strip + .hrp-split-section {
  padding-top: var(--wp--preset--spacing--50) !important;
}

/* --- Tablet: 781.98px and below ------------------------------------------ */
@media (max-width: 781.98px) {
  /* Core stacks .wp-block-columns with an !important flex-basis, but an inline
     `width` on the column outranks it — the same reason .hrp-photo-cta needs
     this rule. */
  .hrp-split > .wp-block-column {
    flex-basis: 100% !important;
  }
  .wp-block-columns.hrp-split {
    gap: 2.35rem;
  }
  .hrp-split-text > p,
  .hrp-split-text .wp-block-list {
    max-width: none;
  }
  .hrp-split-text > .wp-block-buttons {
    margin-block-start: 1.6rem;
  }
  /* Portrait slots become far too tall once they span the full column width. */
  .hrp-media-frame--downspout,
  .hrp-media-frame--materials {
    aspect-ratio: 4 / 3;
  }
}

/* --- Phone: 480px and below ---------------------------------------------- */
@media (max-width: 480px) {
  .wp-block-columns.hrp-split {
    gap: 1.75rem;
  }
  .hrp-split-media > .hrp-media-frame,
  .hrp-split-media > .hrp-media-ba-grid .hrp-media-frame {
    border-radius: var(--hrp-radius-md);
    box-shadow: var(--hrp-shadow-md);
  }
  /* Wide cinematic slots get uncomfortably short at 320–420px. */
  .hrp-media-frame--city,
  .hrp-media-frame--rowhouse {
    aspect-ratio: 3 / 2;
  }
  .hrp-cards-section .service-card-title {
    font-size: 1.18rem;
  }
}

/* ==========================================================================
   Before / After comparison slider  (added 2026-08-03)
   ==========================================================================
   Markup: patterns/before-after-slider.php   Behaviour: assets/js/before-after-slider.js

   Everything below is appended; nothing above it was edited. The component
   reuses the established tokens only — graphite `dark-fade` surfaces, the brand
   red accent, --hrp-radius-*, --hrp-shadow-*, --hrp-ease — so it is the same
   design language as .hrp-media-frame / .card-thumb-frame / .post-thumb-frame,
   not a parallel one.

   ONE custom property drives the whole thing: --hrp-ba-pos. The "before" layer
   is clipped to it, the divider rule sits on it and the handle is centred on it.
   The JS sets that single property; nothing else moves. It is also written
   inline in the markup, so the divider is already in the right place on FIRST
   PAINT, before any JavaScript runs.
   ========================================================================== */

/* NOTE: .hrp-ba deliberately does NOT force max-width:none. It is a constrained
   group, so inside the homepage band it correctly takes that band's own 1240px
   section measure — the same left edge as every other band on the site. Only
   the stage inside it opts out of the 680px prose measure (below), and only the
   split-column variant goes edge-to-edge in its column (further below). */
.hrp-ba > .hrp-ba-title {
  margin-top: 0.15rem !important;
}
.hrp-ba > .hrp-ba-meta {
  margin-top: 0.55rem !important;
  color: var(--wp--preset--color--secondary);
  font-size: 0.9rem;
  font-weight: 600;
}
.hrp-ba > .hrp-ba-desc {
  margin-top: 0.85rem !important;
  max-width: 56ch;
}
.hrp-ba > .hrp-ba-stage {
  margin-top: 1.6rem;
}
.hrp-ba > .hrp-ba-cta {
  margin-top: 1.6rem;
}

/* --------------------------------------------------------------------------
   The stage — reserves its final height from first paint (aspect-ratio), so
   there is no layout shift when a real photo is dropped in later.

   touch-action is the fix for the classic mobile bug: a vertical swipe over the
   image must still scroll the page, but a horizontal drag must NOT be stolen by
   the browser as a scroll/overscroll gesture. `pan-y` gives exactly that split,
   and the handle itself takes `none` so a drag started on the handle is ours
   outright. The script additionally preventDefault()s cancelable pointermove
   events while a drag is live, and ends the drag on pointercancel.
   -------------------------------------------------------------------------- */
.hrp-ba-stage {
  --hrp-ba-pos: 50%;
  position: relative;
  isolation: isolate;
  overflow: hidden;
  aspect-ratio: var(--hrp-ba-ratio, 16 / 9);
  border-radius: var(--hrp-radius-lg);
  box-shadow: var(--hrp-shadow-lg);
  background: var(--wp--preset--gradient--dark-fade);
  touch-action: pan-y;
  cursor: ew-resize;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
  margin-inline: 0 !important;
  max-width: none !important;
}

.hrp-ba-frame {
  position: absolute;
  inset: 0;
  overflow: hidden;
}
/* The "before" layer is revealed from the left edge up to the divider. */
.hrp-ba-clip {
  position: absolute;
  inset: 0;
  z-index: 2;
  clip-path: inset(0 calc(100% - var(--hrp-ba-pos)) 0 0);
  will-change: clip-path;
}

/* Smooth stepping for keyboard users; instant while a pointer drag is live so
   the divider never lags behind the finger/cursor. */
.hrp-ba-clip,
.hrp-ba-divider,
.hrp-ba-handle {
  transition: clip-path 160ms var(--hrp-ease, ease), left 160ms var(--hrp-ease, ease);
}
.hrp-ba-stage.is-dragging .hrp-ba-clip,
.hrp-ba-stage.is-dragging .hrp-ba-divider,
.hrp-ba-stage.is-dragging .hrp-ba-handle {
  transition: none;
}

/* --------------------------------------------------------------------------
   CSS-only placeholder art. No stock imagery, no external asset, no data URI —
   pure gradients in the theme's own graphite + red language, but deliberately
   differentiated so the comparison concept reads even with no photography:

     BEFORE  darker, desaturated, uneven courses, patchy staining and streaks
     AFTER   lighter, crisp evenly-spaced courses, a clean sheen and red wash
   -------------------------------------------------------------------------- */
.hrp-ba-ph {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
}
.hrp-ba-frame--after .hrp-ba-ph {
  background-color: var(--hrp-surface-dark-soft);
  background-image:
    linear-gradient(180deg, rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 46%),
    radial-gradient(circle at 76% 18%, rgba(224, 43, 32, 0.26) 0, transparent 52%),
    repeating-linear-gradient(180deg, rgba(255, 255, 255, 0.13) 0 2px, rgba(255, 255, 255, 0) 2px 26px),
    repeating-linear-gradient(90deg, rgba(11, 12, 14, 0.14) 0 1px, rgba(11, 12, 14, 0) 1px 34px),
    linear-gradient(160deg, #5c5f69 0%, #4c4e57 58%, #3c3d44 100%);
}
.hrp-ba-frame--before .hrp-ba-ph {
  background-color: var(--hrp-surface-dark-deep);
  background-image:
    repeating-linear-gradient(64deg, rgba(11, 12, 14, 0.24) 0 7px, rgba(255, 255, 255, 0.03) 7px 15px),
    repeating-linear-gradient(180deg, rgba(11, 12, 14, 0.34) 0 3px, rgba(11, 12, 14, 0) 3px 21px),
    repeating-linear-gradient(90deg, rgba(11, 12, 14, 0.28) 0 2px, rgba(11, 12, 14, 0) 2px 18px),
    radial-gradient(ellipse at 20% 70%, rgba(11, 12, 14, 0.58) 0, transparent 46%),
    radial-gradient(ellipse at 70% 28%, rgba(11, 12, 14, 0.46) 0, transparent 42%),
    radial-gradient(circle at 44% 86%, rgba(122, 98, 62, 0.34) 0, transparent 36%),
    linear-gradient(160deg, #3a3b41 0%, #2b2c31 62%, #232427 100%);
  filter: saturate(0.55);
}

/* Same icon-chip treatment as every other placeholder frame in the theme, but
   offset to the quarter points rather than dead centre: both frames span the
   full stage, so centring both would stack the two chips on top of each other
   underneath the handle. At the 50% default each chip sits in the middle of the
   half it belongs to. */
.hrp-ba-icon {
  position: absolute;
  top: 50%;
  left: 25%;
  transform: translate(-50%, -50%);
  z-index: 1;
  width: var(--hrp-frame-icon-size);
  height: var(--hrp-frame-icon-size);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 2.1rem;
  line-height: 1;
  color: rgba(255, 255, 255, 0.92);
  background: rgba(255, 255, 255, 0.10);
  border: 1px solid rgba(255, 255, 255, 0.22);
  border-radius: var(--hrp-radius-pill);
  pointer-events: none;
}
.hrp-ba-frame--after .hrp-ba-icon {
  left: 75%;
}
.hrp-ba-frame--before .hrp-ba-icon {
  background: rgba(11, 12, 14, 0.32);
  border-color: rgba(255, 255, 255, 0.16);
  color: rgba(255, 255, 255, 0.78);
}

/* The drop-in contract. A real photo is added by giving the <img> a src — it
   then covers the placeholder completely, at the frame's own aspect ratio,
   honouring its inline object-position focal point. A src-less <img> is hidden
   so no broken-image glyph can appear while photography is still pending. */
.hrp-ba-img {
  position: absolute;
  inset: 0;
  z-index: 1;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: 0;
  margin: 0;
  pointer-events: none;
}
.hrp-ba-img:not([src]),
.hrp-ba-img[src=""] {
  display: none;
}

/* --------------------------------------------------------------------------
   Labels. They are siblings of BOTH image layers and sit above them in the
   stacking order, so neither can ever be clipped away or buried under the photo
   it names, at any divider position — including 0% and 100%.

   Contrast: white on rgba(11,12,14,0.86). Over the darkest possible backdrop
   that is ~17:1; even composited over pure white it resolves to about #232426,
   ~15:1. Comfortably past AA at this size either way. The words themselves are
   what distinguish before from after — colour is never the only cue.
   -------------------------------------------------------------------------- */
.hrp-ba-label {
  position: absolute;
  top: 0.9rem;
  z-index: 5;
  padding: 0.42rem 0.85rem;
  border-radius: var(--hrp-radius-pill);
  background: rgba(11, 12, 14, 0.86);
  border: 1px solid rgba(255, 255, 255, 0.24);
  color: #ffffff;
  font-family: var(--wp--preset--font-family--body);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  line-height: 1;
  text-transform: uppercase;
  pointer-events: none;
}
.hrp-ba-label--before { left: 0.9rem; }
.hrp-ba-label--after  { right: 0.9rem; }

.hrp-ba-divider {
  position: absolute;
  top: 0;
  bottom: 0;
  left: var(--hrp-ba-pos);
  width: 3px;
  margin-left: -1.5px;
  z-index: 4;
  background: #ffffff;
  box-shadow: 0 0 0 1px rgba(11, 12, 14, 0.35), 0 0 16px rgba(11, 12, 14, 0.45);
  pointer-events: none;
}

/* --------------------------------------------------------------------------
   The handle — a real <button>, sized past the 44px WCAG touch-target minimum.
   -------------------------------------------------------------------------- */
.hrp-ba-handle {
  position: absolute;
  top: 50%;
  left: var(--hrp-ba-pos);
  transform: translate(-50%, -50%);
  z-index: 6;
  width: 56px;
  height: 56px;
  min-height: 0;
  padding: 0;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 3px;
  border: 2px solid #ffffff;
  border-radius: var(--hrp-radius-pill);
  background: var(--wp--preset--color--accent);
  color: #ffffff;
  font-size: 0.85rem;
  line-height: 1;
  cursor: ew-resize;
  touch-action: none;
  box-shadow: var(--hrp-shadow-red), 0 0 0 1px rgba(11, 12, 14, 0.25);
}
.hrp-ba-handle:hover {
  background: var(--wp--preset--color--accent-dark);
}
.hrp-ba-arrow {
  display: block;
  pointer-events: none;
}
/* Custom focus ring: the sitewide red ring (style.css line ~200) would be red
   on a red handle. focus-visible is NOT removed — it is re-treated as a white
   outline plus a red halo, legible against the placeholder, against a real
   photo and against the white page behind it. */
.hrp-ba-handle:focus-visible {
  outline: 3px solid #ffffff;
  outline-offset: 3px;
  border-radius: var(--hrp-radius-pill);
  box-shadow: 0 0 0 7px rgba(224, 43, 32, 0.55), var(--hrp-shadow-red);
}

/* The accessible text description of the comparison, for anyone who never
   drags the divider. Kept visible rather than screen-reader-only — it is
   useful to everyone. The script points the handle's aria-describedby at it. */
.hrp-ba-caption {
  margin-top: 0.9rem !important;
  color: var(--wp--preset--color--secondary);
  font-size: 0.88rem;
  line-height: 1.5;
}

/* Inside a split section's media column (service pages), the component fills
   the column exactly like a .hrp-media-frame does — the column, not the prose
   measure, is what sets its width there. */
.hrp-split-media > .hrp-ba {
  width: 100%;
  margin-inline: 0 !important;
  max-width: none !important;
}
.hrp-split-media > .hrp-ba > .hrp-ba-stage {
  width: 100%;
  margin-top: 0;
}
/* In the media column the surrounding copy already carries the context, so the
   pattern's own eyebrow/heading/meta block would duplicate the section heading
   sitting right beside it. Kept in the DOM (it is real, indexable text and the
   caption still describes the comparison) but tightened up. */
.hrp-split-media > .hrp-ba > .eyebrow {
  margin-top: 0 !important;
}
.hrp-split-media > .hrp-ba > .hrp-ba-title {
  font-size: 1.25rem;
}
.hrp-split-media > .hrp-ba > .hrp-ba-desc {
  font-size: 0.95rem;
}

/* Homepage featured band. */
.hrp-ba-band .hrp-ba > .hrp-ba-stage {
  margin-top: 1.9rem;
}

@media (prefers-reduced-motion: reduce) {
  .hrp-ba-clip,
  .hrp-ba-divider,
  .hrp-ba-handle {
    transition: none;
  }
}

/* --- Tablet: 781.98px and below ------------------------------------------ */
@media (max-width: 781.98px) {
  .hrp-ba-handle {
    width: 52px;
    height: 52px;
  }
  .hrp-ba > .hrp-ba-stage {
    margin-top: 1.3rem;
  }
}

/* --- Phone: 480px and below ---------------------------------------------- */
@media (max-width: 480px) {
  /* A 16:9 stage is only ~190px tall at 340px wide, which is too short to drag
     comfortably; 4:3 gives a usable target without changing any markup. */
  .hrp-ba-stage {
    aspect-ratio: 4 / 3;
    border-radius: var(--hrp-radius-md);
  }
  .hrp-ba-label {
    top: 0.65rem;
    padding: 0.36rem 0.7rem;
    font-size: 0.66rem;
    letter-spacing: 0.12em;
  }
  .hrp-ba-label--before { left: 0.65rem; }
  .hrp-ba-label--after  { right: 0.65rem; }
  .hrp-ba-handle {
    width: 48px;
    height: 48px;
  }
  .hrp-ba-caption {
    font-size: 0.82rem;
  }
}

/* ==========================================================================
   Project Gallery page  (added 2026-08-03)
   ==========================================================================
   Markup:  patterns/project-gallery.php + content/project-gallery.html
   Behaviour: assets/js/project-gallery.js

   Everything below is APPENDED; nothing above it was edited. It reuses only
   the established tokens — --hrp-radius-*, --hrp-shadow-*, --hrp-border*,
   --hrp-ease, --hrp-card-pad-*, the graphite `dark-fade` gradient and the
   brand red accent — and the established breakpoints (781.98px / 480px). The
   card thumbnails literally reuse the before/after slider's own placeholder
   classes (.hrp-ba-frame--before / --after + .hrp-ba-ph), so the page has one
   placeholder language, not a second one.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Hero — continues page.html's graphite title band
   --------------------------------------------------------------------------
   Same technique already used for .hrp-offer-strip: when the page's FIRST
   content block is this hero, the content wrapper's own top padding would show
   as a white strip between the title band and a band that is meant to read as
   one piece with it. `:has()` is baseline in every current browser; if it were
   ever unsupported the rule simply does not apply and the extra padding is
   cosmetic, not broken. !important because the wrapper declares its padding
   inline, the way every band in this theme declares spacing.
   -------------------------------------------------------------------------- */
.hrp-page-content:has(> .entry-content > .hrp-pg-hero:first-child) {
  padding-top: 0 !important;
}

/* The 16:10 project photo/video slot in the hero. Same drop-in contract as
   every other .hrp-media-frame; the hairline and shadow are only so a graphite
   frame reads as a distinct object on the graphite band behind it. */
.hrp-media-frame--gallery {
  aspect-ratio: 16 / 10;
}
.hrp-pg-hero .hrp-media-frame {
  border: 1px solid var(--hrp-border-on-dark);
  box-shadow: var(--hrp-shadow-on-dark);
}
.hrp-pg-hero .hrp-pg-lede {
  max-width: 54ch;
}

/* --------------------------------------------------------------------------
   2. Placeholder disclosure notice
   --------------------------------------------------------------------------
   The class already exists on all six sample project files from phase 1 but
   had no styling of its own; giving it one here improves those pages too.
   -------------------------------------------------------------------------- */
.hrp-placeholder-notice {
  border-left: 4px solid var(--wp--preset--color--accent);
  border-radius: var(--hrp-radius-md);
  padding: 1rem 1.25rem !important;
  color: var(--wp--preset--color--primary);
  line-height: 1.6;
}

/* --------------------------------------------------------------------------
   3. Featured transformations — the alternating split rows
   --------------------------------------------------------------------------
   Layout comes from the existing .hrp-split / .hrp-split-media pair, including
   the "a slider in a media column fills the column" rules already written for
   the service pages. Which side the comparison sits on is decided by DOM order
   in content/project-gallery.html, not by CSS, so the stacked mobile order
   stays sensible in both directions.

   The shared before/after pattern carries its own service-neutral eyebrow,
   heading, meta line, description and CTA. In this context the column beside
   it already supplies the REAL per-project versions of all five, so printing
   both would duplicate every line — they are hidden here and nowhere else.
   The caption is deliberately NOT hidden: it is the accessible description the
   slider handle's aria-describedby points at, and the gallery script replaces
   its text with the one describing this project.
   -------------------------------------------------------------------------- */
.hrp-pg-feature-media .hrp-ba > .eyebrow,
.hrp-pg-feature-media .hrp-ba > .hrp-ba-title,
.hrp-pg-feature-media .hrp-ba > .hrp-ba-meta,
.hrp-pg-feature-media .hrp-ba > .hrp-ba-desc,
.hrp-pg-feature-media .hrp-ba > .hrp-ba-cta {
  display: none;
}
.hrp-pg-feature-media .hrp-ba > .hrp-ba-stage {
  margin-top: 0;
}
.hrp-pg-feature .hrp-pg-feature-meta {
  margin-top: 0.5rem !important;
  color: var(--wp--preset--color--secondary);
  font-size: 0.92rem;
  font-weight: 600;
}
.hrp-pg-featured-intro .section-lede {
  margin-top: 0.9rem !important;
}

/* --------------------------------------------------------------------------
   4. Filter bar
   --------------------------------------------------------------------------
   Real <button aria-pressed> toggles, 44px minimum touch target. The pressed
   state is white-on-#e02b20 (4.6:1 — past AA at this size) and the unpressed
   state is near-black on white inside a #d2d4d9 hairline, so the two states
   are distinguishable by fill, border AND text colour, never by colour alone
   (aria-pressed carries the state for assistive tech).
   -------------------------------------------------------------------------- */
.hrp-pg-filters {
  margin-top: 2.4rem;
}
.hrp-pg-filter-block + .hrp-pg-filter-block {
  margin-top: 1.2rem;
}
.hrp-pg-filter-label {
  margin: 0 0 0.6rem;
  font-size: 0.76rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--wp--preset--color--secondary);
}
.hrp-pg-filter-row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
}
.hrp-pg-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 0.6rem 1.15rem;
  border: 1px solid var(--hrp-border-strong);
  border-radius: var(--hrp-radius-pill);
  background: #ffffff;
  color: var(--wp--preset--color--primary);
  font-family: inherit;
  font-size: 0.94rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  cursor: pointer;
  transition:
    background-color 0.2s ease,
    border-color 0.2s ease,
    color 0.2s ease,
    box-shadow 0.2s var(--hrp-ease);
}
.hrp-pg-pill:hover {
  border-color: var(--wp--preset--color--accent);
  color: var(--wp--preset--color--accent-dark);
}
.hrp-pg-pill[aria-pressed="true"] {
  background: var(--wp--preset--color--accent);
  border-color: var(--wp--preset--color--accent);
  color: #ffffff;
  box-shadow: var(--hrp-shadow-red-sm);
}
.hrp-pg-pill[aria-pressed="true"]:hover {
  background: var(--wp--preset--color--accent-dark);
  border-color: var(--wp--preset--color--accent-dark);
  color: #ffffff;
}
.hrp-pg-count {
  margin: 1.15rem 0 0;
  color: var(--wp--preset--color--secondary);
  font-size: 0.9rem;
  font-weight: 600;
}

/* --------------------------------------------------------------------------
   5. The card grid
   --------------------------------------------------------------------------
   A real CSS grid rather than core/columns: filtering hides cards, and a
   hidden flex-basis column leaves a hole in the row, whereas grid reflows.
   Column counts step at the theme's existing breakpoints — 3 / 2 / 1 — with no
   new breakpoint value introduced.
   -------------------------------------------------------------------------- */
.hrp-pg-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--wp--preset--spacing--30);
  align-items: stretch;
  margin-top: 2.5rem;
}
.hrp-pg-card {
  position: relative;
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  max-width: 100%;
  overflow: hidden;
  border: 1px solid var(--hrp-border);
  border-radius: var(--hrp-radius-lg);
  background: #ffffff;
  box-shadow: var(--hrp-shadow-sm);
}
/* The class sets display:flex, which outranks the UA's [hidden] rule. */
.hrp-pg-card[hidden] {
  display: none !important;
}
.hrp-pg-card-body {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
  padding: 1.5rem var(--hrp-card-pad-x) 1.35rem;
}
/* Three facts on one label line: service · property type · city. Uppercase at
   0.06em tracking pushed the longest of them ("Roof Replacement · Commercial · Washington,DC") onto three ragged lines inside a 392px card, so the tracking
   and size are tightened and the line-height opened — measured, not guessed. */
.hrp-pg-card-meta {
  margin: 0 0 0.55rem;
  font-size: 0.73rem;
  font-weight: 700;
  line-height: 1.55;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--wp--preset--color--secondary);
}
.hrp-pg-card-service {
  color: var(--wp--preset--color--accent-dark);
}
.hrp-pg-card-dot {
  margin: 0 0.4rem;
  color: var(--hrp-border-strong);
}
.hrp-pg-card-title {
  margin: 0 0 0.6rem;
  font-family: var(--wp--preset--font-family--heading);
  font-size: 1.2rem;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: -0.01em;
  color: var(--wp--preset--color--primary);
  overflow-wrap: break-word;
}
.hrp-pg-card-summary {
  margin: 0;
  color: var(--wp--preset--color--secondary);
  font-size: 0.97rem;
  line-height: 1.6;
  /* Keeps a row of cards visually even without truncating the real sentence in
     the DOM — the full text is still there for search engines and for the
     modal, which prints it in full. */
  display: -webkit-box;
  -webkit-line-clamp: 4;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* `margin-top: auto` pins the action to the bottom of every card in the row,
   the same way .card-foot / .cta-bottom do elsewhere in this theme. */
.hrp-pg-card-action-wrap {
  margin: auto 0 0 !important;
  padding-top: 1.25rem;
}
.hrp-pg-card-action {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  min-height: 44px;
  padding: 0.4rem 0;
  border: 0;
  background: none;
  font-family: inherit;
  font-size: 1rem;
  font-weight: 700;
  color: var(--wp--preset--color--accent-dark);
  cursor: pointer;
  transition: color 0.2s ease, gap 0.2s var(--hrp-ease);
}
/* The whole card is the click target, but there is still exactly ONE tab stop
   and one accessible name. The overlay sits above the thumbnail because the
   thumbnail isolates its own stacking context (below). */
.hrp-pg-card-action::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 6;
}
.hrp-pg-card:hover .hrp-pg-card-action {
  color: var(--wp--preset--color--accent);
  gap: 0.7rem;
}
.hrp-pg-card-arrow {
  transition: transform 0.2s var(--hrp-ease);
}
.hrp-pg-card:hover .hrp-pg-card-arrow {
  transform: translateX(2px);
}

/* --------------------------------------------------------------------------
   6. Static before/after card thumbnail
   --------------------------------------------------------------------------
   NOT a slider. Six live sliders on one page would compete with each other and
   with the featured comparisons; the interactive one lives in the modal. This
   is a fixed 45% split of the SAME two placeholder treatments the slider uses
   (.hrp-ba-frame--before / --after and .hrp-ba-ph), so nothing is redrawn and
   there is one placeholder language on the page.

   Drop-in contract, identical to every other frame in this theme: give the
   <img> a src (the project's cover/after photo) and it covers the split art at
   z-index 3 — under the divider rule and the "Before / After" badge, over the
   placeholder and its icon chip.
   -------------------------------------------------------------------------- */
.hrp-pg-thumb {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  aspect-ratio: 16 / 9;
  background: var(--wp--preset--gradient--dark-fade);
  border-bottom: 1px solid var(--hrp-border);
}
.hrp-pg-thumb .hrp-ba-frame--after {
  z-index: 0;
}
.hrp-pg-thumb .hrp-pg-thumb-before {
  z-index: 1;
  clip-path: inset(0 55% 0 0);
}
.hrp-pg-thumb-icon {
  position: absolute;
  top: 50%;
  left: 72%;
  transform: translate(-50%, -50%);
  z-index: 2;
  width: 52px;
  height: 52px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.45rem;
  line-height: 1;
  color: rgba(255, 255, 255, 0.92);
  background: rgba(255, 255, 255, 0.10);
  border: 1px solid rgba(255, 255, 255, 0.22);
  border-radius: var(--hrp-radius-pill);
  pointer-events: none;
}
.hrp-pg-thumb-img {
  position: absolute;
  inset: 0;
  z-index: 3;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  margin: 0;
  border-radius: 0;
  pointer-events: none;
}
/* No broken-image glyph can appear while photography is still pending. */
.hrp-pg-thumb-img:not([src]),
.hrp-pg-thumb-img[src=""] {
  display: none;
}
.hrp-pg-thumb-rule {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 45%;
  z-index: 4;
  width: 2px;
  margin-left: -1px;
  background: #ffffff;
  box-shadow: 0 0 0 1px rgba(11, 12, 14, 0.35), 0 0 14px rgba(11, 12, 14, 0.45);
  pointer-events: none;
}
/* Same contrast treatment as the slider's own Before/After labels: white on
   rgba(11,12,14,0.86) with a white hairline, which holds against the darkest
   placeholder and against a real photograph alike. */
.hrp-pg-thumb-badge {
  position: absolute;
  top: 0.75rem;
  left: 0.75rem;
  z-index: 5;
  padding: 0.34rem 0.7rem;
  border-radius: var(--hrp-radius-pill);
  background: rgba(11, 12, 14, 0.86);
  border: 1px solid rgba(255, 255, 255, 0.24);
  color: #ffffff;
  font-size: 0.66rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  line-height: 1;
  text-transform: uppercase;
  pointer-events: none;
}

/* --------------------------------------------------------------------------
   7. Empty state
   -------------------------------------------------------------------------- */
.hrp-pg-empty {
  margin: 2.25rem auto 0;
  max-width: 46rem;
  padding: 1.5rem 1.75rem;
  border: 1px dashed var(--hrp-border-strong);
  border-radius: var(--hrp-radius-lg);
  background: #ffffff;
  color: var(--wp--preset--color--secondary);
  text-align: center;
}
.hrp-pg-empty[hidden] {
  display: none;
}

/* --------------------------------------------------------------------------
   8. The project modal
   --------------------------------------------------------------------------
   Inherits everything structural from .hrp-modal (native <dialog>, ::backdrop,
   the 44px × close button, the action buttons). Only the width and the inner
   composition differ, because this one holds a 16:9 comparison.
   -------------------------------------------------------------------------- */
.hrp-modal--project {
  width: min(900px, calc(100vw - 3rem));
  max-width: min(900px, calc(100vw - 3rem));
}
.hrp-pg-modal-inner {
  padding: 1.9rem var(--hrp-card-pad-x) var(--hrp-card-pad-y);
}
/* Room for the close button, which is absolutely positioned top-right. */
.hrp-pg-modal-head {
  padding-right: 3.25rem;
}
/* The shared .hrp-modal-close is a translucent graphite chip, which works on the
   promo modal because it sits over that modal's dark image panel. Here it sits
   on white, where rgba(47,48,54,0.55) composites to roughly #9a9b9f and the
   white × falls to about 2.5:1. Solid graphite takes it back over 9:1.
   (Measured against this modal, not assumed.) */
.hrp-modal--project .hrp-modal-close {
  background: var(--hrp-surface-dark);
  border-color: var(--hrp-surface-dark);
}
.hrp-modal--project .hrp-modal-close:hover,
.hrp-modal--project .hrp-modal-close:focus-visible {
  background: var(--wp--preset--color--accent);
  border-color: var(--wp--preset--color--accent);
}
.hrp-pg-modal-meta {
  margin: 0.55rem 0 0;
  color: var(--wp--preset--color--secondary);
  font-size: 0.92rem;
  font-weight: 600;
}
.hrp-pg-modal-stage {
  margin: 1.5rem 0 1.35rem;
}
/* The cloned pattern root is a constrained core group, so without this it
   would take the 680px prose measure and centre itself inside the dialog —
   exactly the same fix .hrp-split-media > .hrp-ba already carries. */
.hrp-pg-modal-stage > .hrp-ba {
  width: 100%;
  margin-inline: 0 !important;
  max-width: none !important;
}
.hrp-pg-modal-stage > .hrp-ba > .hrp-ba-stage {
  margin-top: 0;
  /* A 4:3 project inside a 900px dialog would otherwise be ~620px tall and push
     the CTA below the fold on a laptop. Capping the height keeps the whole
     modal — comparison, description and both CTAs — on one screen; the frames
     are object-fit: cover, so nothing distorts.
     `width: 100%` is required alongside it: with an auto width, a max-height
     constraint makes an aspect-ratio box shrink its WIDTH to keep the ratio,
     which left the stage narrower than the dialog with dead space beside it
     (measured: 683px inside an 829px column). A definite width makes the ratio
     resolve the other way — the box stays full width and the cap simply trims
     its height. */
  width: 100%;
  max-height: min(56vh, 520px);
}
.hrp-modal--project .hrp-modal-text {
  margin-bottom: 0.9rem;
}
.hrp-pg-modal-note {
  margin: 0 0 1.4rem;
  padding-left: 0.85rem;
  border-left: 3px solid var(--wp--preset--color--accent);
  color: var(--wp--preset--color--secondary);
  font-size: 0.85rem;
  line-height: 1.55;
}
/* The template that the modal's stage is cloned from. Hidden, never shown. */
.hrp-pg-stage-template {
  display: none;
}

/* --------------------------------------------------------------------------
   9. Motion
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  .hrp-pg-pill,
  .hrp-pg-card-action,
  .hrp-pg-card-arrow {
    transition: none;
  }
  .hrp-pg-card:hover .hrp-pg-card-arrow {
    transform: none;
  }
}

/* --- Tablet: 781.98px and below ------------------------------------------ */
@media (max-width: 781.98px) {
  .hrp-pg-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  /* Filters become a horizontally scrollable pill strip rather than a
     dropdown: every option stays visible, stays a real focusable button, and
     keyboard focus scrolls it into view natively. The negative inline margin
     lets the 3px focus ring on the first and last pill sit outside the
     scroller instead of being clipped by it. */
  .hrp-pg-filter-row {
    flex-wrap: nowrap;
    overflow-x: auto;
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
    padding: 4px;
    margin: -4px;
    /* A pill sitting flush at the scroller's edge reads as "cut off" even
       though it's just outside the current scroll position. This fade is a
       pure visual affordance — it changes nothing about which pills exist or
       their text, only signals "there's more, scroll me" the way native
       horizontally-scrolling chip rows do. */
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent 100%);
    mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent 100%);
  }
  .hrp-pg-filter-row > .hrp-pg-pill {
    flex: 0 0 auto;
    scroll-snap-align: start;
  }
  .hrp-pg-hero .hrp-pg-lede {
    max-width: none;
  }
  .hrp-modal--project {
    width: min(900px, calc(100vw - 2rem));
    max-width: min(900px, calc(100vw - 2rem));
  }
}

/* --- Phone: 480px and below ---------------------------------------------- */
@media (max-width: 480px) {
  .hrp-pg-grid {
    grid-template-columns: minmax(0, 1fr);
    margin-top: 2rem;
  }
  .hrp-pg-card {
    border-radius: var(--hrp-radius-md);
  }
  .hrp-pg-card-title {
    font-size: 1.12rem;
  }
  /* Matches the slider's own 16:9 → 4:3 step at this width. */ .hrp-pg-thumb{aspect-ratio:4 / 3}.hrp-pg-thumb-icon{width:46px;height:46px;font-size:1.3rem}.hrp-pg-filters{margin-top:1.85rem}.hrp-pg-modal-inner{padding:1.5rem 1.25rem 1.75rem}.hrp-pg-modal-head{padding-right:2.75rem}.hrp-pg-empty{padding:1.25rem 1.1rem}}.hrp-ba-stage .hrp-ba-frame::before{content:"";position:absolute;inset:0;z-index:0;display:block}.hrp-ba-stage .hrp-ba-frame--after::before{background-color:var(--hrp-surface-dark-soft);background-image:linear-gradient(180deg,rgb(255 255 255 / .16) 0%,#fff0 46%),radial-gradient(circle at 76% 18%,rgb(224 43 32 / .26) 0,transparent 52%),repeating-linear-gradient(180deg,rgb(255 255 255 / .13) 0 2px,#fff0 2px 26px),repeating-linear-gradient(90deg,rgb(11 12 14 / .14) 0 1px,#fff0 1px 34px),linear-gradient(160deg,#5c5f69 0%,#4c4e57 58%,#3c3d44 100%)}.hrp-ba-stage .hrp-ba-frame--before::before{background-color:var(--hrp-surface-dark-deep);background-image:repeating-linear-gradient(64deg,rgb(11 12 14 / .24) 0 7px,rgb(255 255 255 / .03) 7px 15px),repeating-linear-gradient(180deg,rgb(11 12 14 / .34) 0 3px,#fff0 3px 21px),repeating-linear-gradient(90deg,rgb(11 12 14 / .28) 0 2px,#fff0 2px 18px),radial-gradient(ellipse at 20% 70%,rgb(11 12 14 / .58) 0,transparent 46%),radial-gradient(ellipse at 70% 28%,rgb(11 12 14 / .46) 0,transparent 42%),radial-gradient(circle at 44% 86%,rgb(122 98 62 / .34) 0,transparent 36%),linear-gradient(160deg,#3a3b41 0%,#2b2c31 62%,#232427 100%);filter:saturate(.55)}.hrp-ba-stage .hrp-ba-frame::after{position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1;width:var(--hrp-frame-icon-size);height:var(--hrp-frame-icon-size);display:flex;align-items:center;justify-content:center;font-size:2.1rem;line-height:1;border-radius:var(--hrp-radius-pill);pointer-events:none}.hrp-ba-stage .hrp-ba-frame--after::after{content:"\1F3E0";left:75%;color:rgb(255 255 255 / .92);background:rgb(255 255 255 / .1);border:1px solid rgb(255 255 255 / .22)}.hrp-ba-stage .hrp-ba-frame--before::after{content:"\1F3DA";left:25%;color:rgb(255 255 255 / .78);background:rgb(11 12 14 / .32);border:1px solid rgb(255 255 255 / .16)}.hrp-ba-frame>.hrp-ba-img-block,.hrp-ba-frame>figure.wp-block-image.hrp-ba-img-block{position:absolute;inset:0;z-index:1;margin:0!important;padding:0;max-width:none;width:auto;height:auto;border-radius:0;overflow:hidden}.hrp-ba-img-block img{width:100%;height:100%;object-fit:cover;object-position:50% 50%;display:block;margin:0;border-radius:0;pointer-events:none}.hrp-ba-img-block img:not([src]),.hrp-ba-img-block img[src=""]{display:none}.hrp-ba-img-block figcaption{display:none}.hrp-ba-stage>*,.hrp-ba-clip>*,.hrp-ba-frame>*{margin-block-start:0;margin-block-end:0}.hrp-pg-featured-intro.is-layout-constrained>*,.hrp-pg-feature.is-layout-constrained>*{max-width:1240px!important}.hero-band .hero-media--carousel{background-color:#34353c}.hrp-hero-slide{position:absolute;inset:0;z-index:1;opacity:0;transition:opacity 900ms cubic-bezier(.4,0,.2,1);will-change:opacity;pointer-events:none}.hrp-hero-slide.is-active{opacity:1}.hrp-hero-slide .hrp-hero-slide-img{position:absolute;inset:0;z-index:1;display:block;width:100%;height:100%;margin:0;object-fit:cover;object-position:center 40%}.hrp-hero-scrim{position:absolute;inset:0;z-index:2;pointer-events:none;background-image:linear-gradient(180deg,rgb(60 61 68 / .44) 0%,rgb(60 61 68 / .3) 45%,rgb(47 48 54 / .52) 100%)}.hrp-hero-slide-ph{position:absolute;inset:0;z-index:0;display:block;background-image:radial-gradient(ellipse 70% 55% at 78% 8%,rgb(255 255 255 / .14) 0,transparent 62%),radial-gradient(ellipse 90% 45% at 62% 62%,rgb(224 43 32 / .16) 0,transparent 70%),linear-gradient(180deg,#2a2b31 0%,#34353c 46%,#43444c 74%,#4b4c55 100%)}.hrp-hero-slide-ph::before,.hrp-hero-slide-ph::after{content:"";position:absolute;left:-2%;right:-2%;bottom:0;height:46%;pointer-events:none;clip-path:polygon(0% 100%,0% 62%,13% 30%,26% 62%,26% 46%,38% 46%,52% 8%,68% 46%,68% 34%,82% 34%,92% 58%,100% 44%,100% 100%)}.hrp-hero-slide-ph::before{background-image:repeating-linear-gradient(180deg,rgb(255 255 255 / .045) 0 2px,#fff0 2px 14px),linear-gradient(160deg,#23242a 0%,#2c2d34 55%,#1e1f24 100%)}.hrp-hero-slide-ph::after{background:linear-gradient(200deg,rgb(255 255 255 / .1) 0,transparent 38%)}.hrp-hero-slide[data-ph="2"] .hrp-hero-slide-ph{background-image:radial-gradient(ellipse 60% 50% at 22% 10%,rgb(255 255 255 / .16) 0,transparent 60%),radial-gradient(ellipse 80% 40% at 40% 66%,rgb(224 43 32 / .12) 0,transparent 72%),linear-gradient(180deg,#262830 0%,#31333b 44%,#40424b 76%,#4a4c56 100%)}.hrp-hero-slide[data-ph="2"] .hrp-hero-slide-ph::before,.hrp-hero-slide[data-ph="2"] .hrp-hero-slide-ph::after{height:52%;clip-path:polygon(0% 100%,0% 54%,18% 12%,36% 54%,36% 40%,54% 40%,70% 6%,86% 40%,100% 40%,100% 100%)}.hrp-hero-slide[data-ph="2"] .hrp-hero-slide-ph::before{background-image:repeating-linear-gradient(102deg,rgb(255 255 255 / .07) 0 2px,#fff0 2px 26px),linear-gradient(150deg,#262730 0%,#313340 58%,#1f2027 100%)}.hrp-hero-slide[data-ph="3"] .hrp-hero-slide-ph{background-image:radial-gradient(ellipse 75% 55% at 60% 6%,rgb(255 255 255 / .12) 0,transparent 64%),radial-gradient(ellipse 95% 45% at 78% 60%,rgb(224 43 32 / .18) 0,transparent 68%),linear-gradient(180deg,#2c2d34 0%,#363840 48%,#45464f 78%,#4d4e58 100%)}.hrp-hero-slide[data-ph="3"] .hrp-hero-slide-ph::before,.hrp-hero-slide[data-ph="3"] .hrp-hero-slide-ph::after{height:40%;clip-path:polygon(0% 100%,0% 70%,10% 70%,24% 26%,46% 70%,62% 44%,78% 70%,100% 62%,100% 100%)}.hrp-hero-slide[data-ph="3"] .hrp-hero-slide-ph::before{background-image:repeating-linear-gradient(180deg,rgb(255 255 255 / .05) 0 3px,#fff0 3px 11px),repeating-linear-gradient(90deg,rgb(0 0 0 / .1) 0 1px,#fff0 1px 18px),linear-gradient(168deg,#212228 0%,#2a2c33 55%,#1c1d22 100%)}.hrp-hero-slide[data-ph="4"] .hrp-hero-slide-ph{background-image:radial-gradient(ellipse 65% 50% at 40% 8%,rgb(255 255 255 / .15) 0,transparent 58%),radial-gradient(ellipse 85% 45% at 26% 64%,rgb(224 43 32 / .14) 0,transparent 70%),linear-gradient(180deg,#282a31 0%,#33353d 45%,#42434c 75%,#4a4b55 100%)}.hrp-hero-slide[data-ph="4"] .hrp-hero-slide-ph::before,.hrp-hero-slide[data-ph="4"] .hrp-hero-slide-ph::after{height:49%;clip-path:polygon(0% 100%,0% 48%,12% 22%,30% 48%,42% 48%,48% 22%,56% 48%,74% 48%,88% 20%,100% 50%,100% 100%)}.hrp-hero-slide[data-ph="5"] .hrp-hero-slide-ph{background-image:radial-gradient(ellipse 70% 50% at 70% 10%,rgb(255 255 255 / .13) 0,transparent 60%),radial-gradient(ellipse 90% 40% at 50% 68%,rgb(224 43 32 / .15) 0,transparent 72%),linear-gradient(180deg,#2a2c33 0%,#35373f 46%,#44454e 76%,#4c4d57 100%)}.hrp-hero-slide[data-ph="5"] .hrp-hero-slide-ph::before,.hrp-hero-slide[data-ph="5"] .hrp-hero-slide-ph::after{height:38%;clip-path:polygon(0% 100%,0% 46%,22% 46%,22% 34%,48% 34%,48% 52%,72% 52%,72% 30%,100% 30%,100% 100%)}.hrp-hero-slide[data-ph="5"] .hrp-hero-slide-ph::before{background-image:repeating-linear-gradient(90deg,rgb(255 255 255 / .05) 0 1px,#fff0 1px 30px),linear-gradient(175deg,#24252b 0%,#2e2f37 60%,#1e1f25 100%)}.hrp-hero-slide-ph-tag{position:absolute;z-index:3;top:1.35rem;right:1.35rem;display:flex;flex-direction:column;align-items:flex-end;gap:.15rem;max-width:42vw;padding:.5rem .85rem;border:1px dashed rgb(255 255 255 / .4);border-radius:var(--hrp-radius-md,10px);background:rgb(35 36 41 / .62);text-align:right;pointer-events:none}.hrp-hero-slide-ph-kicker{color:var(--hrp-red-on-dark,#ff9a8f);font-size:.62rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;line-height:1.2}.hrp-hero-slide-ph-name{color:#fff;font-size:.82rem;font-weight:700;line-height:1.25}.hero-band>.hrp-hero-carousel-ui{order:1;width:100%;max-width:var(--hrp-section-width,1240px);margin:1.75rem auto 0;display:flex;align-items:center;gap:1rem;flex-wrap:wrap}.hero-band>.hero-trust-row{order:2}.hrp-hero-carousel-ui[hidden]{display:none}.hrp-hero-nav{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:1px solid rgb(255 255 255 / .38);border-radius:var(--hrp-radius-pill,999px);background:rgb(35 36 41 / .55);color:#fff;font-size:1.5rem;line-height:1;cursor:pointer;transition:background-color 0.2s var(--hrp-ease,ease),border-color 0.2s var(--hrp-ease,ease),transform 0.2s var(--hrp-ease,ease)}.hrp-hero-nav>span{display:block;margin-top:-.18em}.hrp-hero-nav:hover{background:var(--wp--preset--color--accent,#e02b20);border-color:var(--wp--preset--color--accent,#e02b20);transform:translateY(-2px)}.hrp-hero-nav:active{transform:translateY(0)}.hrp-hero-nav:focus-visible,.hrp-hero-dot:focus-visible{outline:3px solid #fff;outline-offset:2px;box-shadow:0 0 0 6px rgb(224 43 32 / .55)}.hrp-hero-dots{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap}.hrp-hero-dot{display:inline-flex;align-items:center;justify-content:center;width:30px;height:44px;padding:0;border:0;background:none;cursor:pointer}.hrp-hero-dot-fill{display:block;width:10px;height:10px;border-radius:var(--hrp-radius-pill,999px);background:rgb(255 255 255 / .42);transition:width 0.3s var(--hrp-ease,ease),background-color 0.3s var(--hrp-ease,ease)}.hrp-hero-dot:hover .hrp-hero-dot-fill{background:rgb(255 255 255 / .75)}.hrp-hero-dot.is-active .hrp-hero-dot-fill,.hrp-hero-dot[aria-current="true"] .hrp-hero-dot-fill{width:30px;background:var(--wp--preset--color--accent,#e02b20)}.hero-band{touch-action:pan-y pinch-zoom}@media (prefers-reduced-motion:reduce){.hrp-hero-slide,.hrp-hero-dot-fill,.hrp-hero-nav{transition:none!important}.hrp-hero-nav:hover,.hrp-hero-nav:active{transform:none}}.hrp-hero-carousel-editor-preview{position:relative;min-height:320px;overflow:hidden;border-radius:var(--hrp-radius-lg,16px);background:#34353c}.hrp-hero-carousel-editor-preview .hero-media--carousel{position:absolute;inset:0}@media (max-width:781.98px){.hero-band>.hrp-hero-carousel-ui{margin-top:1.35rem;gap:.75rem}.hrp-hero-slide-ph-tag{top:1rem;right:1rem;padding:.4rem .7rem}.hrp-hero-slide-ph-name{font-size:.75rem}}@media (max-width:480px){.hero-band>.hrp-hero-carousel-ui{margin-top:1.15rem;gap:.5rem}.hrp-hero-nav{width:44px;height:44px;font-size:1.3rem}.hrp-hero-dot{width:26px}.hrp-hero-dot.is-active .hrp-hero-dot-fill,.hrp-hero-dot[aria-current="true"] .hrp-hero-dot-fill{width:24px}.hrp-hero-slide-ph-tag{top:.75rem;right:.75rem;max-width:52vw;padding:.35rem .6rem}.hrp-hero-slide-ph-kicker{font-size:.56rem}.hrp-hero-slide-ph-name{font-size:.7rem}}.hrp-area-grid+.hrp-area-grid{margin-top:var(--wp--preset--spacing--30)!important}.hrp-area-grid+.wp-block-buttons{margin-top:var(--wp--preset--spacing--30)}.hrp-faq-section .hrp-faq,.hrp-links-section .hrp-cards-row{margin-top:var(--hrp-heading-gap)}.hrp-area-grid>.wp-block-column>.hrp-area-card,.hrp-cards-row>.wp-block-column>.hrp-area-card,.equal-cards>.wp-block-column>.hrp-area-card{width:100%;max-width:none;margin-inline:0}@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}.hrp-back-to-top-wrap{display:flex;justify-content:center;padding:var(--wp--preset--spacing--40,2.5rem) 0}.hrp-back-to-top-link{display:inline-flex;align-items:center;gap:.6rem;padding:.75rem 1.5rem;border:1px solid var(--hrp-border-strong);border-radius:var(--hrp-radius-pill);background:#fff;color:var(--wp--preset--color--primary);font-family:inherit;font-size:.95rem;font-weight:700;letter-spacing:.01em;text-decoration:none;box-shadow:var(--hrp-shadow-sm);transition:background-color 0.2s ease,border-color 0.2s ease,color 0.2s ease,box-shadow 0.2s var(--hrp-ease),transform 0.2s var(--hrp-ease)}.hrp-back-to-top-link:hover,.hrp-back-to-top-link:focus-visible{border-color:var(--wp--preset--color--accent);color:var(--wp--preset--color--accent-dark,var(--wp--preset--color--accent));box-shadow:var(--hrp-shadow-md);transform:translateY(-2px)}.hrp-back-to-top-link:focus-visible{outline:3px solid var(--wp--preset--color--accent);outline-offset:3px}.hrp-back-to-top-arrow{font-size:1.1rem;line-height:1}@media (prefers-reduced-motion:no-preference){.hrp-back-to-top-link:hover .hrp-back-to-top-arrow{transform:translateY(-2px);transition:transform 0.2s var(--hrp-ease)}}.hrp-back-to-top-float{position:fixed;right:1.25rem;bottom:1.25rem;z-index:40;display:flex;align-items:center;justify-content:center;width:48px;height:48px;border:none;border-radius:50%;background:var(--wp--preset--color--accent);color:#fff;font-size:1.3rem;line-height:1;cursor:pointer;box-shadow:var(--hrp-shadow-red);opacity:0;transform:translateY(12px);pointer-events:none;transition:opacity 0.25s var(--hrp-ease),transform 0.25s var(--hrp-ease),background-color 0.2s ease}.hrp-back-to-top-float.is-visible{opacity:1;transform:translateY(0);pointer-events:auto}.hrp-back-to-top-float:hover{background:var(--wp--preset--color--accent-dark,var(--wp--preset--color--accent))}.hrp-back-to-top-float:focus-visible{outline:3px solid #fff;outline-offset:2px;box-shadow:var(--hrp-shadow-red),0 0 0 5px rgb(224 43 32 / .35)}@media (prefers-reduced-motion:reduce){.hrp-back-to-top-float{transition:opacity 0.01ms;transform:none}}@media (max-width:480px){.hrp-back-to-top-float{right:1rem;bottom:1rem;width:46px;height:46px}}.family-biz-logo-placeholder{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;border-radius:var(--hrp-radius-lg);border:2px solid var(--biz-accent,var(--wp--preset--color--accent));background:color-mix(in srgb,var(--biz-accent,var(--wp--preset--color--accent)) 10%,#ffffff);color:var(--biz-accent,var(--wp--preset--color--accent));font-family:var(--wp--preset--font-family--heading);font-weight:700;font-size:1.6rem;letter-spacing:.02em}.family-biz-logo-img{display:block;border-radius:var(--hrp-radius-lg);object-fit:contain}.family-biz-visit-btn{display:inline-flex;align-items:center;gap:.5rem;margin-top:auto;padding:.7rem 1.25rem;border:1.5px solid var(--biz-accent,var(--wp--preset--color--accent));border-radius:var(--hrp-radius-md);color:var(--biz-accent,var(--wp--preset--color--accent));font-weight:700;font-size:.95rem;text-decoration:none;min-height:44px;transition:background-color 0.2s ease,color 0.2s ease,box-shadow 0.2s ease}.family-biz-visit-btn:hover,.family-biz-visit-btn:focus-visible{background:var(--biz-accent,var(--wp--preset--color--accent));color:#fff}.family-biz-visit-btn:focus-visible{outline:3px solid var(--biz-accent,var(--wp--preset--color--accent));outline-offset:3px}.family-biz-soon-badge{display:inline-flex;align-items:center;margin-top:auto;padding:.55rem 1.1rem;border-radius:var(--hrp-radius-pill);background:var(--hrp-surface,#f4f4f6);border:1px solid var(--hrp-border-strong);color:var(--wp--preset--color--secondary);font-weight:700;font-size:.85rem;letter-spacing:.04em;text-transform:uppercase}.family-biz-name{margin:0 0 .5rem}.family-biz-desc{margin:0 0 1.25rem;color:var(--wp--preset--color--secondary)}.family-biz-teaser-row{gap:var(--wp--preset--spacing--30,1.5rem);margin-top:2.5rem}.family-biz-teaser-card{display:flex;align-items:flex-start;gap:1.5rem;height:100%}.family-biz-teaser-logo .family-biz-logo-placeholder,.family-biz-teaser-logo .family-biz-logo-img{width:96px;height:96px;font-size:1.75rem}.family-biz-teaser-body{display:flex;flex-direction:column;flex:1;min-width:0}@media (max-width:781.98px){.family-biz-teaser-row{flex-direction:column}.family-biz-teaser-card{flex-direction:column}.family-biz-teaser-logo .family-biz-logo-placeholder,.family-biz-teaser-logo .family-biz-logo-img{width:72px;height:72px;font-size:1.3rem}}.family-biz-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1.75rem;margin-top:2.5rem}.family-biz-grid-card{display:flex;flex-direction:column;align-items:flex-start;height:100%}.family-biz-grid-logo{margin-bottom:1.25rem}.family-biz-grid-logo .family-biz-logo-placeholder,.family-biz-grid-logo .family-biz-logo-img{width:88px;height:88px;font-size:1.6rem}@media (max-width:999.98px){.family-biz-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:599.98px){.family-biz-grid{grid-template-columns:minmax(0,1fr)}}.wp-container-core-navigation-is-layout-1ed86b19{gap:1.75rem;justify-content:flex-end}.wp-container-core-group-is-layout-f634234d{flex-wrap:nowrap;gap:1rem}.wp-container-core-group-is-layout-95d540df{flex-wrap:nowrap;gap:2rem;justify-content:space-between}.wp-container-core-group-is-layout-e40ad2ba>:where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:1240px;margin-left:auto!important;margin-right:auto!important}.wp-container-core-group-is-layout-e40ad2ba>.alignwide{max-width:1240px}.wp-container-core-group-is-layout-e40ad2ba .alignfull{max-width:none}.wp-container-core-group-is-layout-1e15ea60>:where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:1240px;margin-left:auto!important;margin-right:auto!important}.wp-container-core-group-is-layout-1e15ea60>.alignwide{max-width:1240px}.wp-container-core-group-is-layout-1e15ea60 .alignfull{max-width:none}.wp-container-core-columns-is-layout-dd56be8d{flex-wrap:nowrap;gap:1.85rem var(--wp--preset--spacing--30)}.wp-container-core-columns-is-layout-c16c2608{flex-wrap:nowrap;gap:1.85rem var(--wp--preset--spacing--30)}.wp-container-core-buttons-is-layout-8743db41{justify-content:center}.wp-container-core-buttons-is-layout-e50320da{justify-content:center}.wp-container-core-columns-is-layout-b62be24c{flex-wrap:nowrap;gap:var(--wp--preset--spacing--40) var(--wp--preset--spacing--40)}.wp-container-core-group-is-layout-aacfe913{justify-content:space-between}.wp-container-core-group-is-layout-4e57a26a>:where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:1240px;margin-left:auto!important;margin-right:auto!important}.wp-container-core-group-is-layout-4e57a26a>.alignwide{max-width:1240px}.wp-container-core-group-is-layout-4e57a26a .alignfull{max-width:none}
/*! This file is auto-generated */
.skip-link.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;word-break:normal!important}.skip-link.screen-reader-text:focus{background-color:#eee;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}