diff --git a/apps/web/app/components/ui/Navigation/Brand.tsx b/apps/web/app/components/ui/Navigation/Brand.tsx
index ce49ed8..c87fc3c 100644
--- a/apps/web/app/components/ui/Navigation/Brand.tsx
+++ b/apps/web/app/components/ui/Navigation/Brand.tsx
@@ -42,11 +42,17 @@ export interface BrandProps {
/** Accessible name of the link; the images are decorative. */
label: string;
surface: NavSurface;
+ /**
+ * Run the "-ER" reveal and its breathing loop. Off on the home page, whose
+ * hero plays the same reveal once - a second, looping copy beside it is
+ * jarring. Anywhere else the two animations run as designed.
+ */
+ animate?: boolean;
className?: string;
}
/** The SHARP-ER wordmark, linking home. Sits at the inline start of the bar. */
-export function Brand({ href, label, surface, className }: BrandProps) {
+export function Brand({ href, label, surface, animate = true, className }: BrandProps) {
const { base, suffix } = BRAND_LOCKUP[surface];
return (
@@ -75,10 +81,12 @@ export function Brand({ href, label, surface, className }: BrandProps) {
/>
{/* The clipping box starts at the P's right edge, so the mark inside
- it can slide out from behind the P (Navigation.css). */}
+ it can slide out from behind the P (Navigation.css). Without
+ `animate` the box and the reveal classes are dropped and the full
+ lockup simply sits there. */}
diff --git a/apps/web/app/components/ui/Navigation/MobileNav.tsx b/apps/web/app/components/ui/Navigation/MobileNav.tsx
index 941c1f7..6e4d969 100644
--- a/apps/web/app/components/ui/Navigation/MobileNav.tsx
+++ b/apps/web/app/components/ui/Navigation/MobileNav.tsx
@@ -268,7 +268,12 @@ export function MobileNav({
{/* Mirrors the compact bar it replaces (20:220): the same 64px row and
the same gutter, so the wordmark does not shift when it opens. */}
-
+ = {
+ dark: {
+ src: "/assets/sharp-wordmark-inverse.svg",
+ alt: "",
+ width: 218,
+ height: 46,
+ drawnWidth: 218,
+ suffix: {
+ src: "/assets/sharp-er-suffix-inverse.svg",
+ width: 112,
+ height: 46,
+ drawnWidth: 112,
+ },
+ },
+ light: {
+ src: "/assets/sharp-wordmark.svg",
+ alt: "",
+ width: 218,
+ height: 46,
+ drawnWidth: 218,
+ suffix: {
+ src: "/assets/sharp-er-suffix.svg",
+ width: 112,
+ height: 46,
+ drawnWidth: 112,
+ },
+ },
+};
+
/** The network logo wall - a wide but finite grid. */
const PARTNER_PAGE_SIZE = 36;
/**
@@ -312,24 +349,70 @@ function StatusPill({ label }: { label: string }) {
}
/**
- * The approach band's three pictures. The CMS alt text doubles as the visible
+ * The approach band's pictures. The CMS alt text doubles as the visible
* caption - so the picture is described once, in the caption, and the
* itself is marked decorative rather than having a screen reader read the same
* sentence twice.
*
- * The frame and the picture hover apart, as the third draft has them: the
- * frame lifts and takes the accent hairline (`sh-lift`) while the picture
- * closes in inside it (`sh-zoom`, which also does the clipping).
+ * The frame and the picture move as one: the frame lifts and takes the accent
+ * hairline (`sh-lift`) and the whole tile grows under the pointer
+ * (`sh-lift--grow`) - the draft grows the frame, it does not push the picture
+ * inside it.
+ *
+ * THREE PICTURES RENDER AS THE DRAFT'S MOSAIC (figma 559:4089): the middle
+ * tile dominates - 605px wide, full height, full opacity - and the two flanks
+ * sit shorter beside it (427/426px wide, 0.72 of its height) at 50% opacity,
+ * vertically centred on the middle. One or two pictures fall back to the
+ * uniform grid, where the mosaic's "faded flank" reading has no partner.
*/
function GalleryShots({ images }: { images: readonly ResolvedImage[] }) {
if (images.length === 0) return null;
+ const mosaic = images.length === 3;
+
+ if (mosaic) {
+ return (
+ /* The track widths are the draft's own drawing (605 centre, ~427/426
+ flanks); the aspect ratios keep each tile at its drawn proportions, so
+ the row only reads as a mosaic from lg up and stacks full-width, full
+ opacity below it. `lg:items-center` sits the shorter flanks level with
+ the middle one, as the draft has them. gap-3xl is the closest step to
+ the draft's 60px. */
+
{/* WHAT THE PROJECT IS, AND WHO DELIVERS IT */}
+ {/* `bleed` drops the 80rem Container so the band's content - the three
+ pictures especially - runs the full width of the viewport, the way
+ the draft draws the mosaic. The gutter the Container used to add is
+ re-applied here, and the header column still constrains itself to its
+ own measure, so only the gallery actually strays to the edges. */}
-