// ========================================================= // STERLING & HALE — Legal Site Stylesheet // ========================================================= // ---------- Design tokens ---------- @color-navy: #0B2544; // primary brand / authority @color-navy-dark: darken(@color-navy, 8%); @color-gold: #9C7A3C; // accent, used sparingly @color-white: #FFFFFF; @color-text: #1C1C1E; @color-text-muted: #5B6470; @color-border: #E8E6E1; @font-serif: 'Lora', Georgia, serif; @font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; @header-utility-height: 40px; @header-main-height: 88px; @header-main-height-sm: 72px; @transition-base: all 0.2s ease-in-out; // ---------- Mixins ---------- .flex-between() { display: flex; align-items: center; justify-content: space-between; } // ---------- Base ---------- body { margin: 0; padding-top: (@header-utility-height + @header-main-height); background: @color-white; color: @color-text; font-family: @font-sans; @media (max-width: 991.98px) { padding-top: (@header-utility-height + @header-main-height-sm); } } a { text-decoration: none; color: inherit; } // ========================================================= // SITE HEADER (persists identically across every page) // ========================================================= .site-header { position: fixed; top: 0; left: 0; right: 0; z-index: 1030; width: 100%; // ---------- Utility bar ---------- .utility-bar { background: @color-navy; font-size: 0.8125rem; color: rgba(255, 255, 255, 0.85); .utility-inner { .flex-between(); height: 100%; } .utility-contact { display: flex; align-items: center; gap: 1.5rem; a { display: inline-flex; align-items: center; gap: 0.4rem; color: rgba(255, 255, 255, 0.85); transition: @transition-base; i { color: @color-gold; font-size: 0.8125rem; } &:hover { color: @color-white; } } } .utility-social { display: flex; align-items: center; gap: 1rem; a { color: rgba(255, 255, 255, 0.75); font-size: 0.9rem; transition: @transition-base; &:hover { color: @color-gold; } } } // Hide contact text on very small screens, keep icons @media (max-width: 575.98px) { .utility-contact span.label-text { display: none; } } } // ---------- Main navigation bar (Bootstrap 5 .navbar component) ---------- .main-nav { background: @color-white; min-height: @header-main-height; border-bottom: 1px solid @color-border; transition: @transition-base; padding-top: 0; padding-bottom: 0; @media (max-width: 991.98px) { min-height: @header-main-height-sm; } // Logo .navbar-brand { display: flex; align-items: center; margin-right: 0; padding: 0; img { height: 84px; width: auto; display: block; @media (max-width: 991.98px) { height: 55px; } } } // Nav links .navbar-nav { gap: 2.25rem; .nav-link { position: relative; display: inline-block; padding: 0.5rem 0; font-size: 0.95rem; font-weight: 500; color: @color-text; transition: @transition-base; &::after { content: ''; position: absolute; left: 0; bottom: -2px; width: 0; height: 2px; background: @color-gold; transition: width 0.2s ease-in-out; } &:hover { color: @color-navy; &::after { width: 100%; } } &.active { color: @color-navy; font-weight: 600; &::after { width: 100%; } } } } // ---------- Desktop: links start from the middle of the bar ---------- // Bootstrap's own flex layout only leaves the *leftover* space between // brand/toggler/collapse, so mx-auto alone won't true-center the links. // A 3-column grid (brand | nav | spacer) guarantees the nav is centered // in the bar regardless of how wide the logo or the link list is. @media (min-width: 992px) { > .container { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; column-gap: 1rem; } .navbar-brand { grid-column: 1; justify-self: start; } .navbar-collapse { grid-column: 2; justify-self: center; } .navbar-nav { flex-direction: row; margin: 0 !important; // override Bootstrap's mx-lg-auto / mb-lg-0 utilities } .navbar-spacer { grid-column: 3; } } } // ---------- Sticky / scrolled state (toggled via jQuery) ---------- &.is-scrolled { .main-nav { box-shadow: 0 2px 12px rgba(11, 37, 68, 0.08); } } // ---------- Mobile toggler ---------- .navbar-toggler { border: none; padding: 0.25rem 0.5rem; background: transparent; &:focus { box-shadow: 0 0 0 3px rgba(156, 122, 60, 0.35); outline: none; } // Recolor Bootstrap's default hamburger icon to navy .navbar-toggler-icon { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%230B2544' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } } // ---------- Mobile: collapsed link list ---------- @media (max-width: 991.98px) { .navbar-nav { gap: 0; padding: 0.5rem 0 1.5rem; .nav-item { width: 100%; } .nav-link { display: block; width: 100%; padding: 0.85rem 0; border-bottom: 1px solid @color-border; &::after { display: none; // underline hover treatment only makes sense inline, desktop } } .nav-item:last-child .nav-link { border-bottom: none; } } } } // Reduced motion respect @media (prefers-reduced-motion: reduce) { .site-header * { transition: none !important; } } // ========================================================= // BRAND UTILITY CLASSES // A handful of reusable helpers so pages can stay in Bootstrap's // grid/components/utilities instead of writing page-specific CSS. // ========================================================= .bg-navy { background-color: @color-navy !important; } .text-navy { color: @color-navy !important; } .text-gold { color: @color-gold !important; } .font-serif { font-family: @font-serif; } .btn-navy { background-color: @color-navy; border-color: @color-navy; color: @color-white; font-weight: 500; &:hover, &:focus { background-color: @color-navy-dark; border-color: @color-navy-dark; color: @color-white; } } // Brand-colored focus ring on form fields (replaces Bootstrap's default blue) .form-control:focus, .form-select:focus, .form-check-input:focus { border-color: @color-navy; box-shadow: 0 0 0 0.2rem rgba(11, 37, 68, 0.15); } .form-check-input:checked { background-color: @color-navy; border-color: @color-navy; } // Breadcrumb readability on the dark title band .breadcrumb-dark { --bs-breadcrumb-divider-color: rgba(255, 255, 255, 0.5); font-size: 0.875rem; a { color: rgba(255, 255, 255, 0.7); &:hover { color: @color-white; } } .breadcrumb-item.active { color: rgba(255, 255, 255, 0.9); } } // ========================================================= // SERVICES PAGE // ========================================================= // Office/address callout — a tinted accent bar rather than a boxed "alert" .office-callout { display: flex; gap: 1rem; align-items: flex-start; padding: 1.25rem 1.5rem; background: fade(@color-navy, 4%); border-left: 3px solid @color-gold; border-radius: 0 4px 4px 0; i { color: @color-gold; font-size: 1.1rem; margin-top: 0.2rem; } p { margin-bottom: 0; color: @color-text; } } // Areas-of-expertise cards — a bordered, flat card (no default drop shadow, // no rounded-everything treatment) so 13 of them read as a calm directory // rather than a stack of generic SaaS tiles. Gold appears only on hover. .service-card { display: flex; flex-direction: column; height: 100%; padding: 1.75rem 1.5rem; background: @color-white; border: 1px solid @color-border; border-top: 3px solid @color-navy; transition: @transition-base; &:hover { border-color: @color-border; border-top-color: @color-gold; transform: translateY(-3px); box-shadow: 0 10px 24px rgba(11, 37, 68, 0.08); } .service-card-icon { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; margin-bottom: 1.1rem; background: fade(@color-navy, 6%); color: @color-gold; font-size: 1.05rem; } .service-card-title { font-family: @font-serif; font-size: 1.05rem; font-weight: 600; color: @color-navy; margin-bottom: 0.6rem; } .service-card-desc { font-size: 0.9rem; line-height: 1.55; color: @color-text-muted; margin-bottom: 0; } } // ========================================================= // ABOUT US PAGE // ========================================================= // Key-figures strip — plain typography + Bootstrap's own border utilities // handle the dividers, so this only needs to style the number/label pair .stat-item { .stat-number { font-family: @font-serif; font-size: 2.25rem; font-weight: 600; line-height: 1; color: @color-navy; margin-bottom: 0.5rem; } .stat-label { font-size: 0.875rem; color: @color-text-muted; } } // Team member card — mirrors .service-card's border/hover language // (top accent border, no static shadow) with a centered, avatar-led layout .team-card { text-align: center; padding: 2rem 1.5rem; background: @color-white; border: 1px solid @color-border; border-top: 3px solid @color-navy; transition: @transition-base; &:hover { border-top-color: @color-gold; transform: translateY(-3px); box-shadow: 0 10px 24px rgba(11, 37, 68, 0.08); } .team-avatar { display: flex; align-items: center; justify-content: center; width: 84px; height: 84px; margin: 0 auto 1.25rem; border-radius: 50%; background: @color-navy; color: @color-gold; font-family: @font-serif; font-size: 1.4rem; font-weight: 600; } .team-name { font-family: @font-serif; font-weight: 600; color: @color-navy; margin-bottom: 0.15rem; } .team-role { font-size: 0.85rem; color: @color-gold; margin-bottom: 0.85rem; } .team-bio { font-size: 0.875rem; line-height: 1.55; color: @color-text-muted; margin-bottom: 0; } } // ========================================================= // HOME PAGE // ========================================================= // Hero .hero-section { position: relative; color: @color-white; padding: 5.5rem 0; overflow: hidden; background-color: @color-navy; // fallback shown while the image loads / if removed // Background photo — swap the src in the HTML for your own photography .hero-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; } // Darker on the left (behind the text), fading to nearly clear on the // right so the photo itself stays visible there. To flip which side is // dark, reverse the four color stops below and swap text alignment. .hero-overlay { position: absolute; inset: 0; z-index: 1; background: linear-gradient( 90deg, fade(@color-navy, 94%) 0%, fade(@color-navy, 82%) 35%, fade(@color-navy, 45%) 65%, fade(@color-navy, 12%) 100% ); } // Content sits above the image + overlay > .container { position: relative; z-index: 2; } .hero-eyebrow { display: inline-flex; align-items: center; gap: 0.5rem; color: @color-gold; letter-spacing: 0.06em; text-transform: uppercase; font-size: 0.75rem; font-weight: 600; margin-bottom: 1.25rem; } h1 { font-family: @font-serif; font-weight: 600; font-size: 2.75rem; line-height: 1.18; max-width: 660px; margin-bottom: 1.25rem; @media (max-width: 767.98px) { font-size: 2rem; } } .hero-lead { font-size: 1.05rem; color: rgba(255, 255, 255, 0.78); max-width: 540px; margin-bottom: 2rem; } // thin decorative rule along the bottom edge &::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 3px; z-index: 2; background: linear-gradient(90deg, @color-gold, transparent 65%); } } // Trust bar — compact highlight strip directly under the hero .trust-bar { background: @color-white; border-bottom: 1px solid @color-border; .trust-bar-inner { display: flex; flex-wrap: wrap; justify-content: center; } .trust-item { display: flex; align-items: center; gap: 0.6rem; padding: 1.15rem 1.75rem; font-size: 0.875rem; font-weight: 500; color: @color-text; white-space: nowrap; i { color: @color-gold; font-size: 0.95rem; } } @media (min-width: 992px) { .trust-item:not(:first-child) { border-left: 1px solid @color-border; } } } // Pull-quote panel used alongside the "About" teaser on the home page .pull-panel { height: 100%; display: flex; flex-direction: column; justify-content: center; padding: 2.75rem; background: @color-navy; color: @color-white; .pull-panel-icon { color: @color-gold; font-size: 1.6rem; margin-bottom: 1.1rem; } .pull-panel-quote { font-family: @font-serif; font-size: 1.5rem; line-height: 1.4; margin-bottom: 1rem; } .pull-panel-caption { font-size: 0.85rem; color: rgba(255, 255, 255, 0.65); } } // Expert attorney card — photo up top, name/role below. Mirrors the // border + hover-lift language used by .service-card and .team-card. .attorney-card { overflow: hidden; background: @color-white; border: 1px solid @color-border; transition: @transition-base; .attorney-photo { display: block; width: 100%; aspect-ratio: 1 / 1; object-fit: cover; } .attorney-body { padding: 1.25rem 1.25rem 1.5rem; text-align: center; } .attorney-name { font-family: @font-serif; font-weight: 600; color: @color-navy; margin-bottom: 0.15rem; } .attorney-role { font-size: 0.85rem; color: @color-gold; margin-bottom: 0; } .attorney-bio { font-size: 0.85rem; line-height: 1.55; color: @color-text-muted; margin: 0.6rem 0 0; } &:hover { transform: translateY(-3px); box-shadow: 0 10px 24px rgba(11, 37, 68, 0.08); } } // Testimonial card — quote mark + rating + a compact attributed author line .testimonial-card { height: 100%; padding: 2rem 1.75rem; background: @color-white; border: 1px solid @color-border; border-top: 3px solid @color-gold; transition: @transition-base; .testimonial-quote-icon { color: fade(@color-gold, 40%); font-size: 1.6rem; margin-bottom: 1rem; } .testimonial-stars { color: @color-gold; font-size: 0.75rem; margin-bottom: 0.75rem; } .testimonial-text { font-size: 0.95rem; line-height: 1.6; color: @color-text; margin-bottom: 1.5rem; } .testimonial-author { display: flex; align-items: center; gap: 0.75rem; .testimonial-avatar { display: flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 40px; height: 40px; border-radius: 50%; background: fade(@color-navy, 6%); color: @color-navy; font-family: @font-serif; font-weight: 600; font-size: 0.85rem; } .testimonial-name { font-weight: 600; color: @color-navy; font-size: 0.9rem; margin-bottom: 0; } .testimonial-meta { font-size: 0.8rem; color: @color-text-muted; } } &:hover { transform: translateY(-3px); box-shadow: 0 10px 24px rgba(11, 37, 68, 0.08); } }