@import "tailwindcss"; @theme { --font-sans: var(--font-instrument-sans), ui-sans-serif, system-ui, sans-serif; --font-serif: var(--font-playfair), ui-serif, Georgia, serif; /* Calm, layered palette shared with the current iOS visual language. */ --color-canvas: #f4f9f7; --color-surface: #fcfffe; --color-surface-soft: #e7f1ee; --color-primary: #0f766e; --color-primary-light: #d6f5ed; --color-primary-button: #0f766e; --color-foreground: #102523; --color-muted-foreground: #58716e; --color-border-soft: #ccddda; --color-success: #0f766e; --color-success-light: #d6f5ed; } @layer base { :root { color-scheme: light; --ambient-teal: rgba(83, 211, 192, 0.16); --ambient-blue: rgba(132, 194, 255, 0.12); --ambient-warm: rgba(244, 184, 128, 0.12); --surface-fill: rgba(252, 255, 254, 0.88); --surface-fill-strong: rgba(252, 255, 254, 0.94); --surface-shadow: rgba(16, 65, 60, 0.09); --surface-highlight: rgba(255, 255, 255, 0.7); --night: #0a1e1f; } /* * Dark palette: mirrors the app's `darkColors` (constants/colors.ts). * `--color-primary` stays the bright accent (text/icons/borders); filled * buttons use the muted `--color-primary-button` so white text keeps its * contrast, matching the app's primary vs. primaryButton split. */ @media (prefers-color-scheme: dark) { :root { color-scheme: dark; --color-canvas: #071415; --color-surface: #142728; --color-surface-soft: #0e2021; --color-primary: #2dd4bf; --color-primary-light: #124842; --color-primary-button: #115e59; --color-foreground: #eaf6f2; --color-muted-foreground: #96afab; --color-border-soft: #294243; --color-success: #34d399; --color-success-light: #124238; --ambient-teal: rgba(45, 212, 191, 0.11); --ambient-blue: rgba(41, 122, 179, 0.13); --ambient-warm: rgba(161, 91, 55, 0.1); --surface-fill: rgba(20, 39, 40, 0.84); --surface-fill-strong: rgba(20, 39, 40, 0.94); --surface-shadow: rgba(0, 0, 0, 0.22); --surface-highlight: rgba(180, 228, 218, 0.09); --night: #061718; } } html { scroll-behavior: smooth; scroll-padding-top: 6rem; } body { @apply bg-canvas text-foreground font-sans antialiased; min-height: 100svh; } ::selection { background: color-mix(in srgb, var(--color-primary) 24%, transparent); } h1, h2, h3 { text-wrap: balance; } p { text-wrap: pretty; } a, button, summary { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } } .ambient-canvas { background: radial-gradient( ellipse 72% 48% at 4% -8%, var(--ambient-teal), transparent 72% ), radial-gradient( ellipse 62% 46% at 102% 24%, var(--ambient-blue), transparent 74% ), radial-gradient( ellipse 60% 44% at -8% 88%, var(--ambient-warm), transparent 76% ), var(--color-canvas); } .surface-panel { background: var(--surface-fill); box-shadow: 0 20px 58px var(--surface-shadow), inset 0 1px 0 var(--surface-highlight); backdrop-filter: blur(18px) saturate(115%); -webkit-backdrop-filter: blur(18px) saturate(115%); } .surface-panel-strong { background: var(--surface-fill-strong); box-shadow: 0 12px 42px var(--surface-shadow), inset 0 1px 0 var(--surface-highlight); backdrop-filter: blur(22px) saturate(120%); -webkit-backdrop-filter: blur(22px) saturate(120%); } .section-wash { background: radial-gradient( ellipse 52% 36% at 88% 30%, color-mix(in srgb, var(--ambient-blue) 72%, transparent), transparent 72% ), radial-gradient( ellipse 48% 34% at 8% 68%, color-mix(in srgb, var(--ambient-warm) 68%, transparent), transparent 74% ); } .brand-night { background: radial-gradient( ellipse 58% 30% at 82% 32%, rgba(45, 212, 191, 0.1), transparent 72% ), radial-gradient( ellipse 46% 28% at 8% 72%, rgba(58, 134, 185, 0.08), transparent 76% ), var(--night); } .night-card { background: radial-gradient( ellipse 58% 42% at 88% 12%, rgba(45, 212, 191, 0.12), transparent 72% ), linear-gradient(145deg, #0a2021 0%, #0a1e1f 62%, #0d252d 100%); box-shadow: 0 30px 82px rgba(4, 20, 21, 0.2); } .card-hover { transition: transform 200ms ease, box-shadow 200ms ease; } .card-hover:hover { transform: translateY(-2px); box-shadow: 0 12px 30px rgba(15, 23, 42, 0.08); } @keyframes fade-in-up { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .animate-fade-in-up { animation: fade-in-up 0.5s ease-out both; } .animate-fade-in-up-delay-1 { animation: fade-in-up 0.5s ease-out 0.1s both; } .animate-fade-in-up-delay-2 { animation: fade-in-up 0.5s ease-out 0.2s both; } .animate-fade-in-up-delay-3 { animation: fade-in-up 0.5s ease-out 0.3s both; } /* * Scroll-scrubbed product motion. This stays CSS-only so the long homepage * remains a server component and ships no scroll listener or animation * runtime. Browsers without view timelines simply render the resting layout. */ .pitch-device-motion { --pitch-enter-x: 0px; --pitch-enter-y: 3.5rem; --pitch-exit-x: 0px; --pitch-exit-y: -2rem; backface-visibility: hidden; transform-origin: center; } .pitch-device-drift-left { --pitch-enter-x: -1rem; --pitch-exit-x: 0.5rem; } .pitch-device-drift-right { --pitch-enter-x: 1rem; --pitch-exit-x: -0.5rem; } @keyframes pitch-device-scroll { 0% { opacity: 0.78; transform: translate3d(var(--pitch-enter-x), var(--pitch-enter-y), 0); } 34% { opacity: 1; transform: translate3d(0, 0, 0); } 78% { opacity: 1; transform: translate3d(0, -0.75rem, 0); } 100% { opacity: 0.92; transform: translate3d(var(--pitch-exit-x), var(--pitch-exit-y), 0); } } @keyframes pitch-copy-scroll { from { opacity: 0.56; transform: translate3d(0, 2rem, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } } @keyframes pitch-card-scroll { from { opacity: 0.76; transform: translate3d(0, 2rem, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } } @supports (animation-timeline: view()) { .pitch-device-motion { animation: pitch-device-scroll linear both; animation-timeline: view(block); animation-range: entry 0% exit 100%; } .pitch-copy-motion { animation: pitch-copy-scroll linear both; animation-timeline: view(block); animation-range: entry 0% cover 28%; } .pitch-card-motion { animation: pitch-card-scroll linear both; animation-timeline: view(block); animation-range: entry 0% cover 24%; } } /* Keep the product choreography visible on phones without crowding the copy. */ @media (max-width: 639px) { .pitch-device-motion { --pitch-enter-y: 2.5rem; --pitch-exit-y: -1.25rem; } .pitch-device-drift-left { --pitch-enter-x: -0.5rem; --pitch-exit-x: 0.25rem; } .pitch-device-drift-right { --pitch-enter-x: 0.5rem; --pitch-exit-x: -0.25rem; } } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { scroll-behavior: auto !important; animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } .card-hover:hover { transform: none; } .pitch-device-motion, .pitch-copy-motion, .pitch-card-motion { animation: none !important; opacity: 1 !important; transform: none !important; } } /* * Branded one-page PDF sheet: a green-to-white gradient washed over a faint * teal grid. Only rendered for print (the on-screen page mirrors the homepage). */ .print-sheet { background: linear-gradient(150deg, #ccfbf1 0%, #f0fdfa 30%, #ffffff 64%), linear-gradient(rgba(15, 118, 110, 0.07) 1px, transparent 1px), linear-gradient(90deg, rgba(15, 118, 110, 0.06) 1px, transparent 1px); background-size: auto, 22px 22px, 22px 22px; } .northwell-print-only { display: none; } @page { size: letter; margin: 0; } @media print { :root { color-scheme: light !important; } * { print-color-adjust: exact !important; -webkit-print-color-adjust: exact !important; animation: none !important; opacity: 1 !important; } html, body { width: 8.5in !important; margin: 0 !important; padding: 0 !important; color: #0f172a !important; background: #ffffff !important; } .print-hidden { display: none !important; } .northwell-print-only { display: block !important; } .northwell-print-page { position: relative; box-sizing: border-box; width: 8.5in; height: 11in; overflow: hidden; padding: 0.42in 0.55in 0.46in; break-after: page; page-break-after: always; background: #f8fafc; } .northwell-print-page:last-child { break-after: auto; page-break-after: auto; } .northwell-print-wash { position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%; object-fit: cover; pointer-events: none; } .northwell-print-header, .northwell-print-content, .northwell-print-footer { position: relative; z-index: 1; } .northwell-print-header { position: absolute; top: 0.42in; right: 0.55in; left: 0.55in; display: flex; height: 0.43in; align-items: center; justify-content: space-between; border-bottom: 1px solid #cbd5e1; } .northwell-print-content { position: absolute; top: 0.85in; right: 0.55in; left: 0.55in; height: 9.43in; overflow: hidden; } .northwell-print-page--continuation .northwell-print-content { top: 0.42in; height: 9.86in; } .northwell-print-footer { position: absolute; right: 0.55in; bottom: 0.46in; left: 0.55in; display: flex; height: 0.26in; align-items: end; justify-content: center; border-top: 1px solid #cbd5e1; color: #64748b; font-size: 8px; line-height: 1; } .northwell-print-label { font-size: 9px; font-weight: 700; letter-spacing: 0.18em; color: #0f766e; text-transform: uppercase; } .northwell-print-title { margin-top: 0.12in; font-family: var(--font-playfair), Georgia, serif; font-size: 28px; line-height: 1.08; font-weight: 600; letter-spacing: -0.02em; color: #0f172a; } .northwell-print-lede { margin-top: 0.12in; font-size: 12px; line-height: 1.5; color: #475569; } }