Skip to main content

marcom & hero banners

TuxCommHero

The architectural hero slab from tti.tamu.edu (used on /centers and /directory). Features diagonal chamfer cut, deep Maroon slab (#500000), left Warm Gold square anchor block, and 3-tier heading typography.

LIVEDEMO

TEXAS A&M TRANSPORTATION INSTITUTE

RESEARCH CENTERS & CAPABILITIES

SOLVING MULTIMODAL CHALLENGES FOR TEXAS & THE NATION

Texas A&M Transportation Institute conducts transportation research, testing, and technology development for public and private sponsors.
RELLIS Proving Grounds
RELLIS Proving Grounds
Template Usagevue
<TuxCommHero
  eyebrow="TEXAS A&M TRANSPORTATION INSTITUTE"
  title="RESEARCH CENTERS & CAPABILITIES"
  accent-title="SOLVING MULTIMODAL CHALLENGES FOR TEXAS & THE NATION"
  lead="TTI is the largest higher-education-affiliated transportation research institute in the United States, conducting over 700 concurrent research investigations annually."
  primary-action-text="Explore Capabilities"
  primary-action-to="#capabilities"
  secondary-action-text="Contact Leads"
  secondary-action-to="#contact"
  image-src="/resources/images/proving-grounds-aerial.jpg"
  image-alt="RELLIS Proving Grounds"
  image-badge="RELLIS Proving Grounds"
  :chamfer="true"
/>

COMPONENTSOURCE

app/components/TuxCommHero.vuevue
<script setup lang="ts">
/**
 * TuxCommHero — Signature Architectural Hero Slab from the new tti.tamu.edu redesign.
 *
 * Replicates the exact visual composition from the flagship /centers and /directory portals:
 *   - Diagonal chamfered cool-gray canvas backdrop
 *   - Deep Maroon primary slab
 *   - Warm Ochre Gold square anchor accent block
 *   - 3-tier heading typography (Light white line 1 + Bold white line 2 + Warm gold accent line 3)
 *   - Rectangular Kadence-style sharp action buttons
 *   - Framed 0px scientific photography
 */

interface Props {
  /** Line 1: Light uppercase kicker/eyebrow (e.g. "TEXAS A&M TRANSPORTATION INSTITUTE"). */
  eyebrow?: string;
  /** Line 2: Bold high-impact primary headline (e.g. "RESEARCH CENTERS"). */
  title: string;
  /** Line 3: Warm Ochre Gold sub-headline or focus area (e.g. "ADVANCING TRANSPORTATION INNOVATION"). */
  accentTitle?: string;
  /** Editorial lead paragraph describing the mission, capabilities, or center scope. */
  lead?: string;
  /** Primary action CTA button label. */
  primaryActionText?: string;
  /** Primary action destination route. */
  primaryActionTo?: string;
  /** Primary action external URL. */
  primaryActionHref?: string;
  /** Secondary action button label. */
  secondaryActionText?: string;
  /** Secondary action destination route. */
  secondaryActionTo?: string;
  /** Secondary action external URL. */
  secondaryActionHref?: string;
  /** Image source URL for the framed hero photograph. */
  imageSrc?: string;
  /** Image alt text for screen readers. */
  imageAlt?: string;
  /** Optional badge overlay text on the image. */
  imageBadge?: string;
  /** Whether to enable the diagonal cut chamfer at the bottom edge. */
  chamfer?: boolean;
}

withDefaults(defineProps<Props>(), {
  eyebrow: "TEXAS A&M TRANSPORTATION INSTITUTE",
  accentTitle: "",
  lead: "",
  primaryActionText: "",
  primaryActionTo: "",
  primaryActionHref: "",
  secondaryActionText: "",
  secondaryActionTo: "",
  secondaryActionHref: "",
  imageSrc: "",
  imageAlt: "TTI Research Facility and Operations",
  imageBadge: "",
  chamfer: true,
});

const emit = defineEmits<{
  "primary-click": [payload: MouseEvent];
  "secondary-click": [payload: MouseEvent];
}>();
</script>

<template>
  <section
    class="tux-comm-hero relative w-full overflow-hidden bg-surface-cool-gray text-text-primary"
    :class="{ 'pb-12 sm:pb-16 [clip-path:polygon(0_0,100%_0,100%_calc(100%-2.5rem),0_100%)]': chamfer }"
    aria-label="Hero Banner"
  >
    <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 sm:py-16 lg:py-20">
      <div class="grid grid-cols-1 lg:grid-cols-12 gap-8 lg:gap-12 items-center">
        <!-- Content Column: Deep Maroon Slab -->
        <div class="lg:col-span-7 xl:col-span-7 relative z-10">
          <div class="bg-brand-primary text-white p-6 sm:p-10 lg:p-12 shadow-2xl relative">
            <!-- Left Warm Gold Anchor Accent Block -->
            <div
              class="absolute left-0 top-0 w-3 sm:w-4 h-16 sm:h-24 bg-brand-accent"
              aria-hidden="true"
            />

            <!-- 3-Tier Signature Headings Rhythm -->
            <div class="space-y-1 sm:space-y-2 pl-2 sm:pl-3">
              <!-- Tier 1: Light White Eyebrow -->
              <p
                v-if="eyebrow"
                class="text-xs sm:text-sm font-light uppercase tracking-widest text-white/90"
              >
                {{ eyebrow }}
              </p>

              <!-- Tier 2: Bold White Primary Title -->
              <h1 class="text-2xl sm:text-4xl lg:text-5xl font-extrabold uppercase tracking-tight text-white leading-tight font-display">
                {{ title }}
              </h1>

              <!-- Tier 3: Warm Ochre Gold Accent Line -->
              <p
                v-if="accentTitle"
                class="text-base sm:text-xl font-bold uppercase tracking-wider text-brand-accent pt-1"
              >
                {{ accentTitle }}
              </p>
            </div>

            <!-- Lead Paragraph -->
            <div
              v-if="lead"
              class="mt-4 sm:mt-6 text-sm sm:text-base text-white/90 leading-relaxed pl-2 sm:pl-3 border-l border-white/20 ml-2 sm:ml-3"
            >
              {{ lead }}
            </div>

            <!-- Action Buttons -->
            <div
              v-if="primaryActionText || secondaryActionText"
              class="mt-6 sm:mt-8 flex flex-wrap items-center gap-3 sm:gap-4 pl-2 sm:pl-3"
            >
              <TuxButton
                v-if="primaryActionText"
                shape="sharp"
                intent="secondary"
                :to="primaryActionTo || undefined"
                :href="primaryActionHref || undefined"
                class="!bg-brand-accent !text-neutral-900 !border-brand-accent hover:!bg-brand-accent/90"
                @click="emit('primary-click', $event)"
              >
                {{ primaryActionText }}
              </TuxButton>

              <TuxButton
                v-if="secondaryActionText"
                shape="sharp"
                intent="ghost"
                :to="secondaryActionTo || undefined"
                :href="secondaryActionHref || undefined"
                class="!text-white !border-white/40 hover:!bg-white/10 hover:!border-white"
                @click="emit('secondary-click', $event)"
              >
                {{ secondaryActionText }}
              </TuxButton>
            </div>

            <slot name="extra" />
          </div>
        </div>

        <!-- Media Column: Framed Photography -->
        <div class="lg:col-span-5 xl:col-span-5 relative">
          <div class="relative shadow-2xl overflow-hidden border-2 border-white/80 bg-black">
            <img
              v-if="imageSrc"
              :src="imageSrc"
              :alt="imageAlt"
              class="w-full h-64 sm:h-80 lg:h-96 object-cover object-center transition-transform duration-500 hover:scale-102"
              loading="lazy"
            >
            <div
              v-else
              class="w-full h-64 sm:h-80 lg:h-96 bg-neutral-800 flex flex-col items-center justify-center p-6 text-center text-white/60"
            >
              <Icon name="lucide:image" class="w-12 h-12 mb-2 text-brand-accent/60" aria-hidden="true" />
              <span class="text-xs font-mono uppercase tracking-wider">Scientific Photography Slab</span>
            </div>

            <!-- Image Badge Pill -->
            <div
              v-if="imageBadge"
              class="absolute bottom-3 left-3 bg-brand-primary/90 backdrop-blur-xs text-white text-xs font-bold uppercase tracking-wider px-3 py-1.5 border-l-2 border-brand-accent shadow"
            >
              {{ imageBadge }}
            </div>
          </div>
        </div>
      </div>
    </div>
  </section>
</template>