4 Commits
Author SHA1 Message Date
soconnor da55f2ab4e Refresh Questions interface screenshots
Deploy to GitHub Pages / deploy (push) Skipped
Deploy to GitHub Pages / build (push) Failing after 29s
2026-08-26 21:25:40 -04:00
soconnor aaa566bbbc Refine website vertical rhythm 2026-08-26 21:03:16 -04:00
soconnor 2b436eeec6 Fix dark and medication screenshots 2026-08-26 20:48:04 -04:00
soconnor 96d152f592 Deploy website to GitHub Pages 2026-08-26 20:06:52 -04:00
14 changed files with 173 additions and 97 deletions
+65
View File
@@ -0,0 +1,65 @@
name: Deploy to GitHub Pages
on:
push:
branches: [master]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.14
- name: Configure GitHub Pages
uses: actions/configure-pages@v5
- name: Install dependencies
run: bun install --frozen-lockfile
- name: Check source
run: bun run check
- name: Prepare static-only routes
run: |
rm -f src/proxy.ts
rm -rf src/app/api src/app/login
rm -rf "src/app/(marketing)/beta"
rm -rf "src/app/(marketing)/executive-summary"
rm -rf "src/app/(marketing)/landscape"
- name: Build static site
run: bun run build
env:
GITHUB_PAGES: "true"
- name: Upload GitHub Pages artifact
uses: actions/upload-pages-artifact@v4
with:
path: ./out
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+7
View File
@@ -65,6 +65,13 @@ bun run build
bun run start
```
## GitHub Pages
Pushes to `master` also publish a static build to GitHub Pages through
`.github/workflows/deploy-pages.yml`. The Pages build keeps the public product
site and partner materials, while omitting the optional server-only password
gate and legacy redirect routes that cannot run on static hosting.
Screenshots live in `public/screenshots/`. Every route uses the same fresh,
precomposited iPhone 17 Pro assets in
`public/screenshots/product-bezel-2026-08-24-unified-type/`; there are no raw or
+9
View File
@@ -4,10 +4,19 @@
*/
import "./src/env.js";
const isGitHubPages = process.env.GITHUB_PAGES === "true";
/** @type {import("next").NextConfig} */
const config = {
...(isGitHubPages
? {
output: "export",
trailingSlash: true,
}
: {}),
images: {
qualities: [75, 92],
unoptimized: isGitHubPages,
},
};
+1
View File
@@ -0,0 +1 @@
Binary file not shown.

After

Width:  |  Height:  |  Size: 576 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

+19 -19
View File
@@ -68,13 +68,13 @@ export default function HowItWorksPage() {
</div>
</section>
<section className="section-wash px-4 py-18 sm:px-6 lg:py-22">
<section className="section-wash px-4 py-16 sm:px-6 lg:py-18">
<div className="mx-auto max-w-6xl">
<SectionLabel>Start with what matters</SectionLabel>
<h2 className="text-foreground mt-4 max-w-3xl font-display text-4xl font-semibold tracking-tight sm:text-5xl">
A clear rhythm from the moment to the next conversation.
</h2>
<div className="mt-10 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
<div className="mt-8 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
{dailyRhythm.map((item, index) => {
const Icon = item.icon;
@@ -114,9 +114,9 @@ export default function HowItWorksPage() {
</div>
</section>
<section className="px-4 py-20 sm:px-6 lg:py-28">
<div className="mx-auto max-w-6xl space-y-24">
<div className="grid gap-12 lg:grid-cols-2 lg:items-center">
<section className="px-4 py-16 sm:px-6 lg:py-20">
<div className="mx-auto max-w-6xl space-y-16 lg:space-y-20">
<div className="grid gap-8 lg:grid-cols-2 lg:items-center lg:gap-12">
<div>
<SectionLabel>Review what changed</SectionLabel>
<h2 className="text-foreground mt-4 font-display text-4xl font-semibold tracking-tight sm:text-5xl">
@@ -137,7 +137,7 @@ export default function HowItWorksPage() {
src="/screenshots/product-bezel-2026-08-24-unified-type/summary-reviewed-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/summary-reviewed-natural-dark.webp"
alt="Illustrative Medscribe visit summary"
width={280}
width={260}
/>
<p className="text-muted-foreground mt-4 text-center text-xs">
Illustrative profile · Medscribe interface
@@ -145,13 +145,13 @@ export default function HowItWorksPage() {
</div>
</div>
<div className="grid gap-12 lg:grid-cols-2 lg:items-center">
<div className="grid gap-8 lg:grid-cols-2 lg:items-center lg:gap-12">
<div className="justify-self-center py-2 lg:order-1">
<PhoneMockup
src="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-natural-dark.webp"
src="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-lisinopril-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-lisinopril-natural-dark.webp"
alt="Illustrative Medscribe medication detail"
width={280}
width={260}
/>
<p className="text-muted-foreground mt-4 text-center text-xs">
Illustrative profile · Medscribe interface
@@ -173,7 +173,7 @@ export default function HowItWorksPage() {
</div>
</div>
<div className="grid gap-12 lg:grid-cols-2 lg:items-center">
<div className="grid gap-8 lg:grid-cols-2 lg:items-center lg:gap-12">
<div className="lg:order-2">
<SectionLabel>Keep the next question</SectionLabel>
<h2 className="text-foreground mt-4 font-display text-4xl font-semibold tracking-tight sm:text-5xl">
@@ -191,10 +191,10 @@ export default function HowItWorksPage() {
</div>
<div className="justify-self-center py-2 lg:order-1">
<PhoneMockup
src="/screenshots/product-bezel-2026-08-24-unified-type/questions-black.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/questions-black-dark.webp"
src="/screenshots/product-bezel-2026-08-24-unified-type/questions-inline-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/questions-inline-natural-dark.webp"
alt="Illustrative Medscribe Questions to ask interface"
width={280}
width={260}
/>
<p className="text-muted-foreground mt-4 text-center text-xs">
Illustrative profile · Medscribe interface
@@ -202,7 +202,7 @@ export default function HowItWorksPage() {
</div>
</div>
<div className="grid gap-12 lg:grid-cols-2 lg:items-center">
<div className="grid gap-8 lg:grid-cols-2 lg:items-center lg:gap-12">
<div>
<SectionLabel>Prepare the handoff</SectionLabel>
<h2 className="text-foreground mt-4 font-display text-4xl font-semibold tracking-tight sm:text-5xl">
@@ -223,7 +223,7 @@ export default function HowItWorksPage() {
src="/screenshots/product-bezel-2026-08-24-unified-type/know-me-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/know-me-natural-dark.webp"
alt="Illustrative Medscribe Know Me handoff"
width={280}
width={260}
/>
<p className="text-muted-foreground mt-4 text-center text-xs">
Illustrative profile · Medscribe interface
@@ -233,8 +233,8 @@ export default function HowItWorksPage() {
</div>
</section>
<section className="section-wash px-4 py-20 sm:px-6">
<div className="mx-auto grid max-w-6xl gap-12 lg:grid-cols-2">
<section className="section-wash px-4 py-16 sm:px-6">
<div className="mx-auto grid max-w-6xl gap-8 lg:grid-cols-2 lg:gap-12">
<div>
<div className="bg-primary-light text-primary flex size-12 items-center justify-center rounded-xl">
<ShieldAlert className="size-6" aria-hidden="true" />
@@ -263,7 +263,7 @@ export default function HowItWorksPage() {
</div>
</section>
<section className="px-4 py-20 sm:px-6">
<section className="px-4 py-16 sm:px-6">
<div className="night-card mx-auto flex max-w-6xl flex-col items-start justify-between gap-7 rounded-[2rem] px-7 py-10 text-white sm:px-10 md:flex-row md:items-center">
<div>
<h2 className="font-display text-3xl font-semibold">
+63 -63
View File
@@ -101,7 +101,7 @@ const accessFit = [
export default function HomePage() {
return (
<>
<section className="section-wash relative isolate min-h-[calc(100svh-4rem)] overflow-hidden px-4 pt-14 sm:px-6 sm:pt-20 lg:pt-24">
<section className="section-wash relative isolate min-h-[calc(100svh-4rem)] overflow-hidden px-4 pt-12 sm:px-6 sm:pt-16 lg:pt-20">
<div className="mx-auto max-w-7xl text-center">
<div className="animate-fade-in-up flex items-center justify-center gap-3">
<span className="bg-success-light text-success rounded-full px-3 py-1.5 text-xs font-bold tracking-[0.12em] uppercase">
@@ -131,7 +131,7 @@ export default function HomePage() {
</div>
</div>
<div className="relative mx-auto mt-12 h-[44rem] max-w-5xl sm:h-[58rem] lg:mt-8 lg:h-[64rem]">
<div className="relative mx-auto mt-10 h-[42rem] max-w-5xl sm:h-[52rem] lg:mt-6 lg:h-[60rem]">
<div className="absolute top-24 left-1/2 w-[17rem] -translate-x-[86%] -rotate-6 sm:top-28 sm:w-[22rem] lg:top-32 lg:w-[26rem]">
<ProductDevice
src="/screenshots/product-bezel-2026-08-24-unified-type/summary-reviewed-natural.webp"
@@ -153,20 +153,20 @@ export default function HomePage() {
/>
</div>
</div>
<p className="text-muted-foreground relative z-20 mx-auto pb-8 text-center text-xs font-medium tracking-wide">
<p className="text-muted-foreground relative z-20 mx-auto pb-6 text-center text-xs font-medium tracking-wide">
Illustrative profile · Medscribe interface
</p>
</section>
<section className="pitch-lazy section-wash flex min-h-[78svh] items-center px-4 py-24 sm:px-6 lg:py-32">
<section className="pitch-lazy section-wash px-4 pt-12 pb-20 sm:px-6 lg:pt-16 lg:pb-24">
<div className="pitch-copy-motion mx-auto max-w-6xl text-center">
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
The connected picture
</p>
<h2 className="text-foreground mx-auto mt-7 max-w-5xl font-display text-[clamp(2.8rem,7vw,6.5rem)] leading-[0.98] font-semibold tracking-[-0.045em]">
<h2 className="text-foreground mx-auto mt-6 max-w-5xl font-display text-[clamp(2.8rem,7vw,6.5rem)] leading-[0.98] font-semibold tracking-[-0.045em]">
Care happens in fragments. Your context shouldn&apos;t.
</h2>
<p className="text-muted-foreground mx-auto mt-8 max-w-2xl text-lg leading-relaxed sm:text-xl">
<p className="text-muted-foreground mx-auto mt-6 max-w-2xl text-lg leading-relaxed sm:text-xl">
One instruction lives in a portal. A medication label sits in a
cabinet. The latest change lives in someone&apos;s memory. Medscribe
is the patient-held thread between those moments.
@@ -174,21 +174,21 @@ export default function HomePage() {
</div>
</section>
<section className="pitch-lazy px-4 py-24 sm:px-6 lg:py-36">
<div className="mx-auto grid max-w-7xl gap-16 lg:grid-cols-[0.78fr_1.22fr] lg:gap-24">
<section className="pitch-lazy px-4 py-20 sm:px-6 lg:py-28">
<div className="mx-auto grid max-w-7xl gap-12 lg:grid-cols-[0.78fr_1.22fr] lg:gap-20">
<div className="lg:sticky lg:top-28 lg:h-fit">
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
After the visit
</p>
<h2 className="text-foreground mt-6 max-w-xl font-display text-5xl leading-[0.98] font-semibold tracking-[-0.04em] sm:text-6xl">
<h2 className="text-foreground mt-5 max-w-xl font-display text-5xl leading-[0.98] font-semibold tracking-[-0.04em] sm:text-6xl">
Turn what happened into something you can check.
</h2>
<p className="text-muted-foreground mt-7 max-w-lg text-lg leading-relaxed">
<p className="text-muted-foreground mt-6 max-w-lg text-lg leading-relaxed">
Bring the important details from a visit into one reviewable
record. You decide what is useful and what belongs in the picture
you carry forward.
</p>
<div className="surface-panel mt-8 max-w-lg rounded-2xl p-5">
<div className="surface-panel mt-6 max-w-lg rounded-2xl p-5">
<p className="text-foreground text-sm leading-relaxed">
<strong className="font-semibold">The safety loop:</strong>{" "}
review generated information before acting. Medscribe does not
@@ -197,11 +197,11 @@ export default function HomePage() {
</div>
</div>
<ol className="space-y-8 sm:space-y-12">
<ol className="space-y-6 sm:space-y-8">
{visitMoments.map((moment, index) => (
<li
key={moment.number}
className="pitch-card-motion surface-panel relative overflow-hidden rounded-[2.5rem] px-5 pt-8 sm:px-10 sm:pt-10"
className="pitch-card-motion surface-panel relative overflow-hidden rounded-[2.5rem] px-5 pt-7 sm:px-10 sm:pt-9"
>
<div className="relative z-10 max-w-xl">
<div className="flex items-center gap-3">
@@ -220,7 +220,7 @@ export default function HomePage() {
</p>
</div>
<div className="bg-primary-light/45 absolute -right-36 bottom-14 -z-0 size-96 rounded-full blur-3xl" />
<div className="relative mx-auto mt-10 w-[min(72vw,21rem)] translate-y-14">
<div className="relative mx-auto mt-8 w-[min(72vw,20rem)] translate-y-10">
<ProductDevice
src={moment.image}
darkSrc={moment.darkImage}
@@ -235,33 +235,33 @@ export default function HomePage() {
</div>
</section>
<section className="pitch-lazy brand-night relative isolate overflow-hidden px-4 py-24 text-white sm:px-6 lg:py-36">
<section className="pitch-lazy brand-night relative isolate overflow-hidden px-4 py-20 text-white sm:px-6 lg:py-28">
<div className="mx-auto max-w-7xl">
<div className="pitch-copy-motion mx-auto max-w-4xl text-center">
<p className="text-xs font-bold tracking-[0.2em] text-teal-200 uppercase">
Between visits
</p>
<h2 className="mt-6 font-display text-[clamp(3rem,7vw,6.7rem)] leading-[0.94] font-semibold tracking-[-0.045em]">
<h2 className="mt-5 font-display text-[clamp(3rem,7vw,6.7rem)] leading-[0.94] font-semibold tracking-[-0.045em]">
Keep the medication picture current.
</h2>
<p className="mx-auto mt-8 max-w-2xl text-lg leading-relaxed text-teal-50/75 sm:text-xl">
<p className="mx-auto mt-6 max-w-2xl text-lg leading-relaxed text-teal-50/75 sm:text-xl">
The list, the label, the schedule, and the latest confirmation
belong in the same viewnot scattered across paper and memory.
</p>
</div>
<div className="mt-16 grid gap-14 lg:grid-cols-2 lg:items-center lg:gap-6">
<div className="relative mx-auto h-[42rem] w-full max-w-2xl sm:h-[50rem] lg:h-[56rem]">
<div className="absolute top-20 left-[4%] w-[17rem] -rotate-6 sm:w-[21rem] lg:w-[23rem]">
<div className="mt-12 grid gap-10 lg:grid-cols-2 lg:items-center lg:gap-6">
<div className="relative mx-auto h-[36rem] w-full max-w-2xl sm:h-[44rem] lg:h-[50rem]">
<div className="absolute top-12 left-[4%] w-[15rem] -rotate-6 sm:top-16 sm:w-[19rem] lg:w-[22rem]">
<ProductDevice
src="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-natural-dark.webp"
src="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-lisinopril-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-lisinopril-natural-dark.webp"
alt="Medscribe medication detail in an iPhone 17 Pro product bezel"
className="pitch-device-motion pitch-device-drift-left"
sizes="(min-width: 1024px) 368px, (min-width: 640px) 336px, 272px"
/>
</div>
<div className="absolute top-0 right-[2%] z-10 w-[18rem] rotate-5 sm:w-[22rem] lg:w-[24rem]">
<div className="absolute top-0 right-[2%] z-10 w-[16rem] rotate-5 sm:w-[20rem] lg:w-[23rem]">
<ProductDevice
src="/screenshots/product-bezel-2026-08-24-unified-type/medications-black.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/medications-black-dark.webp"
@@ -289,10 +289,10 @@ export default function HomePage() {
].map((item) => (
<article
key={item.title}
className="border-white/10 border-t p-7 first:border-t-0 sm:p-9"
className="border-white/10 border-t p-6 first:border-t-0 sm:p-8"
>
<Check className="size-5 text-teal-200" aria-hidden="true" />
<h3 className="mt-5 font-display text-2xl font-semibold sm:text-3xl">
<h3 className="mt-4 font-display text-2xl font-semibold sm:text-3xl">
{item.title}
</h3>
<p className="mt-3 leading-relaxed text-teal-50/70">
@@ -305,24 +305,24 @@ export default function HomePage() {
</div>
</section>
<section className="pitch-lazy section-wash overflow-hidden px-4 py-24 sm:px-6 lg:py-36">
<section className="pitch-lazy section-wash overflow-hidden px-4 py-20 sm:px-6 lg:py-28">
<div
id="questions"
className="mx-auto grid max-w-7xl scroll-mt-4 items-center gap-14 lg:grid-cols-[0.82fr_1.18fr] lg:gap-20"
className="mx-auto grid max-w-7xl scroll-mt-24 items-center gap-10 lg:grid-cols-[0.82fr_1.18fr] lg:gap-16"
>
<div className="pitch-copy-motion">
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
Questions for the doctor
</p>
<h2 className="text-foreground mt-6 max-w-2xl font-display text-[clamp(3.25rem,6vw,6.5rem)] leading-[0.94] font-semibold tracking-[-0.045em]">
<h2 className="text-foreground mt-5 max-w-2xl font-display text-[clamp(3.25rem,6vw,6.5rem)] leading-[0.94] font-semibold tracking-[-0.045em]">
Ask now. Save what belongs in the room.
</h2>
<p className="text-muted-foreground mt-8 max-w-xl text-lg leading-relaxed sm:text-xl">
<p className="text-muted-foreground mt-6 max-w-xl text-lg leading-relaxed sm:text-xl">
Ask about a visit or medication. When the answer needs a care
professional&apos;s judgment, Medscribe can suggest saving the
question and who may be helpful to ask.
</p>
<div className="text-muted-foreground mt-7 flex max-w-xl items-start gap-3 text-sm leading-relaxed">
<div className="text-muted-foreground mt-6 flex max-w-xl items-start gap-3 text-sm leading-relaxed">
<span className="bg-primary-light text-primary mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-full">
<Check className="size-3.5" aria-hidden="true" />
</span>
@@ -332,8 +332,8 @@ export default function HomePage() {
</p>
</div>
</div>
<div className="mx-auto grid w-full max-w-[40rem] items-center justify-center gap-2 sm:grid-cols-2 lg:justify-end">
<div className="mx-auto w-[min(72vw,18rem)] -rotate-2 sm:w-full">
<div className="mx-auto grid w-full max-w-[40rem] grid-cols-2 items-center justify-center gap-1 sm:gap-2 lg:justify-end">
<div className="mx-auto w-full -rotate-2">
<ProductDevice
src="/screenshots/product-bezel-2026-08-24-unified-type/ask-questions-black.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/ask-questions-black-dark.webp"
@@ -342,10 +342,10 @@ export default function HomePage() {
sizes="(min-width: 640px) 288px, 72vw"
/>
</div>
<div className="mx-auto w-[min(72vw,18rem)] rotate-2 sm:w-full">
<div className="mx-auto w-full rotate-2">
<ProductDevice
src="/screenshots/product-bezel-2026-08-24-unified-type/questions-black.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/questions-black-dark.webp"
src="/screenshots/product-bezel-2026-08-24-unified-type/questions-inline-natural.webp"
darkSrc="/screenshots/product-bezel-2026-08-24-unified-type/questions-inline-natural-dark.webp"
alt="Medscribe Questions to ask interface shown in an iPhone 17 Pro product bezel"
className="pitch-device-motion pitch-device-drift-right"
sizes="(min-width: 640px) 288px, 72vw"
@@ -355,10 +355,10 @@ export default function HomePage() {
</div>
</section>
<section className="pitch-lazy overflow-hidden px-4 py-24 sm:px-6 lg:py-36">
<section className="pitch-lazy overflow-hidden px-4 py-20 sm:px-6 lg:py-28">
<div className="mx-auto max-w-7xl">
<div className="grid items-center gap-16 lg:grid-cols-[0.92fr_1.08fr] lg:gap-24">
<div className="relative mx-auto w-[min(80vw,28rem)]">
<div className="grid items-center gap-12 lg:grid-cols-[0.92fr_1.08fr] lg:gap-20">
<div className="relative mx-auto w-[min(70vw,24rem)]">
<div className="bg-primary-light/70 absolute inset-[12%_-12%_8%] -z-10 rounded-[4rem] blur-2xl" />
<ProductDevice
src="/screenshots/product-bezel-2026-08-24-unified-type/know-me-natural.webp"
@@ -372,15 +372,15 @@ export default function HomePage() {
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
At the handoff
</p>
<h2 className="text-foreground mt-6 max-w-2xl font-display text-[clamp(3.2rem,6vw,6.2rem)] leading-[0.95] font-semibold tracking-[-0.045em]">
<h2 className="text-foreground mt-5 max-w-2xl font-display text-[clamp(3.2rem,6vw,6.2rem)] leading-[0.95] font-semibold tracking-[-0.045em]">
Bring the picture when care gets complicated.
</h2>
<p className="text-muted-foreground mt-8 max-w-xl text-lg leading-relaxed sm:text-xl">
<p className="text-muted-foreground mt-6 max-w-xl text-lg leading-relaxed sm:text-xl">
Know Me gathers selected medications, allergies, conditions,
baseline, and contacts into one readable snapshot that is easy
to review together.
</p>
<div className="mt-9 grid gap-4 sm:grid-cols-2">
<div className="mt-7 grid gap-4 sm:grid-cols-2">
<div className="surface-panel rounded-2xl p-5">
<ScanLine
className="text-primary size-6"
@@ -409,8 +409,8 @@ export default function HomePage() {
</div>
</div>
<div className="night-card mt-24 overflow-hidden rounded-[2.5rem] p-7 text-white sm:p-10 lg:p-14">
<div className="grid gap-12 lg:grid-cols-[0.85fr_1.15fr] lg:items-center">
<div className="night-card mt-16 overflow-hidden rounded-[2.5rem] p-6 text-white sm:p-8 lg:p-12">
<div className="grid gap-8 lg:grid-cols-[0.85fr_1.15fr] lg:items-center">
<div>
<HeartHandshake
className="size-7 text-teal-200"
@@ -437,7 +437,7 @@ export default function HomePage() {
<span className="flex size-8 items-center justify-center rounded-full bg-white/12 text-xs font-bold">
{number}
</span>
<p className="mt-8 font-display text-xl font-semibold">
<p className="mt-5 font-display text-xl font-semibold">
{title}
</p>
<p className="mt-2 text-sm leading-relaxed text-teal-50/65">
@@ -451,50 +451,50 @@ export default function HomePage() {
</div>
</section>
<section className="pitch-lazy brand-night relative isolate overflow-hidden px-4 py-24 text-white sm:px-6 lg:py-36">
<section className="pitch-lazy brand-night relative isolate overflow-hidden px-4 py-20 text-white sm:px-6 lg:py-28">
<div className="absolute inset-0 -z-10 bg-[radial-gradient(circle_at_50%_0%,rgba(45,212,191,0.13),transparent_36%)]" />
<div className="mx-auto max-w-7xl">
<div className="pitch-copy-motion mx-auto max-w-4xl text-center">
<p className="text-xs font-bold tracking-[0.2em] text-teal-300 uppercase">
Privacy that feels personal
</p>
<h2 className="mt-6 font-display text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
<h2 className="mt-5 font-display text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
Your health story stays centered on you.
</h2>
<p className="mx-auto mt-8 max-w-2xl text-lg leading-relaxed text-slate-300 sm:text-xl">
<p className="mx-auto mt-6 max-w-2xl text-lg leading-relaxed text-slate-300 sm:text-xl">
Medscribe keeps the experience focused on your choices: what you
keep, what you review, and what you share with people you trust.
</p>
</div>
<dl className="mt-20 grid gap-10 md:grid-cols-3 md:gap-0 md:divide-x md:divide-white/12">
<dl className="mt-14 grid gap-6 md:grid-cols-3 md:gap-0 md:divide-x md:divide-white/12">
{proofStats.map((stat) => (
<div
key={stat.label}
className="px-5 py-2 text-center md:py-10 lg:py-14"
className="px-5 py-2 text-center md:py-8 lg:py-10"
>
<dt className="text-sm text-slate-400">{stat.label}</dt>
<dd className="mt-3 font-display text-5xl font-semibold tracking-[-0.04em] text-teal-200 sm:text-6xl lg:text-7xl">
<dd className="mt-3 font-display text-4xl font-semibold tracking-[-0.04em] text-teal-200 sm:text-5xl lg:text-6xl">
{stat.value}
</dd>
</div>
))}
</dl>
<div className="mt-16 grid gap-4 md:grid-cols-3">
<div className="mt-12 grid gap-4 md:grid-cols-3">
{privacyPrinciples.map((principle) => {
const Icon = principle.icon;
return (
<article
key={principle.title}
className="rounded-[1.75rem] bg-white/[0.05] p-7"
className="rounded-[1.75rem] bg-white/[0.05] p-6"
>
<Icon className="size-6 text-teal-200" aria-hidden="true" />
<h3 className="mt-8 font-display text-2xl font-semibold">
<h3 className="mt-5 font-display text-2xl font-semibold">
{principle.title}
</h3>
<p className="mt-4 text-sm leading-relaxed text-slate-400">
<p className="mt-3 text-sm leading-relaxed text-slate-400">
{principle.body}
</p>
</article>
@@ -502,7 +502,7 @@ export default function HomePage() {
})}
</div>
<div className="mt-10 text-center">
<div className="mt-8 text-center">
<Button asChild variant="secondary">
<Link href="/privacy">
Read about privacy
@@ -515,9 +515,9 @@ export default function HomePage() {
<section
id="partners"
className="pitch-lazy overflow-hidden px-4 py-20 sm:px-6 lg:py-28"
className="pitch-lazy overflow-hidden px-4 py-16 sm:px-6 lg:py-20"
>
<div className="section-wash surface-panel mx-auto grid max-w-6xl gap-10 rounded-[2.75rem] px-6 py-12 sm:px-10 lg:grid-cols-[1fr_auto] lg:items-center lg:px-14 lg:py-16">
<div className="section-wash surface-panel mx-auto grid max-w-6xl gap-8 rounded-[2.75rem] px-6 py-10 sm:px-10 lg:grid-cols-[1fr_auto] lg:items-center lg:px-14 lg:py-12">
<div className="pitch-copy-motion max-w-3xl">
<div className="bg-primary-light text-primary flex size-12 items-center justify-center rounded-2xl">
<FileText className="size-6" aria-hidden="true" />
@@ -561,19 +561,19 @@ export default function HomePage() {
</div>
</section>
<section className="pitch-lazy flex min-h-[82svh] items-center px-4 py-24 sm:px-6 lg:py-32">
<div className="pitch-copy-motion section-wash surface-panel mx-auto w-full max-w-6xl overflow-hidden rounded-[3rem] px-6 py-16 text-center sm:px-10 lg:px-20 lg:py-24">
<section className="pitch-lazy px-4 py-20 sm:px-6 lg:py-24">
<div className="pitch-copy-motion section-wash surface-panel mx-auto w-full max-w-6xl overflow-hidden rounded-[3rem] px-6 py-14 text-center sm:px-10 lg:px-20 lg:py-18">
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
Made for people who carry a lot
</p>
<h2 className="text-foreground mx-auto mt-6 max-w-4xl font-display text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
<h2 className="text-foreground mx-auto mt-5 max-w-4xl font-display text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
Carry the record that helps you move forward.
</h2>
<p className="text-muted-foreground mx-auto mt-8 max-w-2xl text-lg leading-relaxed sm:text-xl">
<p className="text-muted-foreground mx-auto mt-6 max-w-2xl text-lg leading-relaxed sm:text-xl">
Bring visits, medication routines, and trusted caregivers into one
clearer picturewithout losing your place at the center.
</p>
<ul className="mx-auto mt-9 grid max-w-4xl gap-3 text-left md:grid-cols-3">
<ul className="mx-auto mt-7 grid max-w-4xl gap-3 text-left md:grid-cols-3">
{accessFit.map((item) => (
<li
key={item}
@@ -586,7 +586,7 @@ export default function HomePage() {
</li>
))}
</ul>
<div className="mt-10 flex flex-col items-center justify-center gap-3 sm:flex-row">
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
<Button asChild size="lg">
<a href={ACCESS_INVITE_MAILTO}>
Request access
+2
View File
@@ -1,5 +1,7 @@
import type { MetadataRoute } from "next";
export const dynamic = "force-static";
export default function robots(): MetadataRoute.Robots {
return {
rules: {
+2 -2
View File
@@ -44,9 +44,9 @@ const features = [
"Bring important questions to a clinician or pharmacist",
],
image:
"/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-natural.webp",
"/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-lisinopril-natural.webp",
darkImage:
"/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-natural-dark.webp",
"/screenshots/product-bezel-2026-08-24-unified-type/medication-detail-lisinopril-natural-dark.webp",
alt: "Illustrative Medscribe medication detail with schedule and medication information",
},
{
+2 -1
View File
@@ -38,13 +38,14 @@ export function ProductDevice({
const darkProps = darkSrc
? getImageProps({ src: darkSrc, ...shared }).props
: null;
const darkSrcSet = darkProps?.srcSet ?? darkProps?.src;
return (
<picture className="block">
{darkProps ? (
<source
media="(prefers-color-scheme: dark)"
srcSet={darkProps.srcSet}
srcSet={darkSrcSet}
sizes={darkProps.sizes}
/>
) : null}
+3 -12
View File
@@ -14,11 +14,7 @@
"noUncheckedIndexedAccess": true,
"checkJs": true,
/* Bundled projects */
"lib": [
"dom",
"dom.iterable",
"ES2022"
],
"lib": ["dom", "dom.iterable", "ES2022"],
"noEmit": true,
"module": "ESNext",
"moduleResolution": "Bundler",
@@ -32,9 +28,7 @@
/* Path Aliases */
"baseUrl": ".",
"paths": {
"~/*": [
"./src/*"
]
"~/*": ["./src/*"]
}
},
"include": [
@@ -46,8 +40,5 @@
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules",
"generated"
]
"exclude": ["node_modules", "generated", "out"]
}