Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
6930504
Merge pull request #1 from continuedev/initial
sestinj Nov 24, 2025
90b0bd8
Merge pull request #2 from continuedev/initial
TyDunn Nov 24, 2025
4923677
Merge pull request #3 from continuedev/initial
TyDunn Nov 24, 2025
88bd93b
mobile footer padding
TyDunn Nov 24, 2025
6ccf63e
Merge pull request #5 from continuedev/mobile
TyDunn Nov 24, 2025
71a17f7
Add jan2025 dinner page
TyDunn Jan 22, 2026
4c2ca01
fixing vercel deployment
TyDunn Jan 22, 2026
a9bc204
Bump glob from 10.4.5 to 10.5.0
dependabot[bot] Jan 22, 2026
12da776
Update homepage text and jan2025 page title
TyDunn Jan 22, 2026
da84313
social card text update
TyDunn Jan 22, 2026
19838ea
fix text wrap issue
TyDunn Jan 22, 2026
fbe9cbf
improving questions
TyDunn Jan 22, 2026
c837ac5
Merge pull request #8 from continuedev/dependabot/npm_and_yarn/glob-1…
TyDunn Jan 22, 2026
8c8cf6e
fix interpolation error
TyDunn Jan 22, 2026
297ce97
Merge branch 'main' of github.com:continuedev/continuousai.com
TyDunn Jan 22, 2026
563cd1d
question improvements
TyDunn Jan 22, 2026
b7c7cfd
adjust question approach
TyDunn Jan 22, 2026
493e1b0
build prompt fixed
TyDunn Jan 22, 2026
10a95f1
llms.txt
TyDunn Jan 27, 2026
2b081d8
fix hyperlink
TyDunn Jan 27, 2026
621719e
jan 26 update
TyDunn Jan 27, 2026
2dc388e
Restore jan2025 dinner invite page
TyDunn Jan 27, 2026
a8aa9dc
Update main page with new landing design
TyDunn Jan 27, 2026
3b0b91e
Fix scroll snapping to lock sections into view
TyDunn Jan 27, 2026
12eee4b
Update favicon to match site theme
TyDunn Jan 27, 2026
d8e8fe6
Update Vision section button: rename to 'Continue' and add spacing
TyDunn Jan 27, 2026
2b04396
Equal spacing in footer: button, line, and powered by text
TyDunn Jan 27, 2026
f9451c4
Add social card with abstract art matching site theme
TyDunn Jan 27, 2026
9283ffd
Add dltHub to ecosystem tools list
TyDunn Jan 27, 2026
ada4ba6
Add dltHub icon (white version for dark background)
TyDunn Jan 27, 2026
a3a725c
Left-align footer elements and add GitHub repo link
TyDunn Jan 27, 2026
e4ccafb
Add dltHub to jan2025 page (React component)
TyDunn Jan 27, 2026
3055c49
Remove unused static jan2025/index.html
TyDunn Jan 27, 2026
006b8c0
Fix scrollbar visibility and reorder tools for better layout
TyDunn Jan 27, 2026
0a773bc
Fix mobile/iPhone experience
TyDunn Jan 27, 2026
625b0ef
Fix scrollbar and tools grid layout
TyDunn Jan 27, 2026
c0e2221
Revert "Fix scrollbar and tools grid layout"
TyDunn Jan 27, 2026
66596cc
Fix jan2025 page: scrollbar and tools grid layout
TyDunn Jan 27, 2026
a2fdf6c
Fix jan2025 tools grid: organic flex layout with max-width
TyDunn Jan 27, 2026
bc45e93
Improve mobile experience for jan2025 page
TyDunn Jan 27, 2026
c3cfdfa
Add BICEP - Glue music links to footer
TyDunn Jan 27, 2026
e13f83a
Fix scrollbar issue and tool grid layout
TyDunn Jan 27, 2026
cb29298
Add music links (Spotify, Apple Music, YouTube) for Glue by BICEP on …
TyDunn Jan 27, 2026
b0cb93c
Remove music links from jan2025 page footer
TyDunn Jan 27, 2026
29cf4b1
Fix tools grid: use flexbox for natural pill widths
TyDunn Jan 27, 2026
602dfd9
Narrow tools grid max-width for better row distribution
TyDunn Jan 27, 2026
3a92f62
Fix Apple Music link for Glue by BICEP
TyDunn Jan 27, 2026
9af20f4
Redesign mobile experience with elegant snap scrolling
TyDunn Jan 27, 2026
165beac
Fix mobile layout issues: header collision and footer overlap
TyDunn Jan 27, 2026
ec9f56b
Fix mobile nav position and restore Vision narrative
TyDunn Jan 27, 2026
ceb0e34
Center AI is Glue button and music icons on mobile
TyDunn Jan 27, 2026
c10d890
Move mobile nav dots to bottom right corner
TyDunn Jan 27, 2026
27e7b4c
Improve Vision section mobile layout
TyDunn Jan 27, 2026
af7e34b
Fix mobile nav dots position and align AI is Glue to right
TyDunn Jan 27, 2026
cff279b
Redesign Vision section mobile layout from first principles
TyDunn Jan 27, 2026
2254116
Simplify Ecosystem section for mobile
TyDunn Jan 27, 2026
6078f33
Standardize text sizes across sections, restore Vision text on mobile
TyDunn Jan 27, 2026
49f82bd
Expand Ecosystem section text to match other sections' length
TyDunn Jan 27, 2026
d943953
Center music icons under AI is Glue button on mobile
TyDunn Jan 27, 2026
48001be
Remove Sanity from ecosystem tools list (back to 16)
TyDunn Jan 27, 2026
8876733
Optimize tool order for balanced 4x4 grid on mobile
TyDunn Jan 27, 2026
b07c7fd
Add more bottom padding to Manifesto section on mobile
TyDunn Jan 27, 2026
92eeb98
Optimize jan2025 tool order for balanced 4x4 grid, remove Sanity
TyDunn Jan 27, 2026
71946a6
Rebalance jan2025 tools grid - distribute long names across rows
TyDunn Jan 27, 2026
6bd3270
Fix jan2025 mobile layout to fit in viewport without scroll
TyDunn Jan 27, 2026
e2716c3
Center jan2025 content vertically on desktop, reduce footer margin
TyDunn Jan 27, 2026
3d2a311
Fix jan2025 desktop layout - use space-between and fixed height
TyDunn Jan 27, 2026
18bddcf
Reduce spacing between sections on jan2025 desktop
TyDunn Jan 27, 2026
42b09a4
Match ask-label margin-bottom to section-label (20px)
TyDunn Jan 27, 2026
8b367eb
Shorten Vision text to prevent 'most' wrapping to second line
TyDunn Jan 27, 2026
67d1683
Keep music buttons inline on mobile with smaller icons
TyDunn Jan 27, 2026
f5a07ca
Simplify music links to Spotify and YouTube with larger icons
TyDunn Jan 27, 2026
03a05f7
Add Apple Music back, uniform spacing for all 4 buttons
TyDunn Jan 27, 2026
c6bc587
Fix Apple logo centering with better SVG path
TyDunn Jan 27, 2026
32da424
Open Jan 2025 Dinner link in new tab
TyDunn Jan 27, 2026
395c915
Redesign social card with abstract flowing network art
TyDunn Jan 27, 2026
6ab4f5c
Update social card to use og-image.gif
TyDunn Jan 27, 2026
f58681b
Add animated og-image from SVG source
TyDunn Jan 27, 2026
c49804a
Simplify social card tagline to 'Ship as fast as you code.'
TyDunn Jan 27, 2026
e9579e5
Make og-image.svg fill entire browser window
TyDunn Jan 27, 2026
0062ce3
Add /heartbeat page showing animated SVG
TyDunn Jan 27, 2026
2eb8db4
Add small heartbeat link to homepage on /heartbeat page
TyDunn Jan 27, 2026
9a4b381
Add subtle heartbeat link to main site, clean up heartbeat page
TyDunn Jan 27, 2026
ad0ebb6
Replace iframe with animated SVG heartbeat icon
TyDunn Jan 27, 2026
e5cc849
Make heartbeat larger, spanning right side of screen
TyDunn Jan 27, 2026
3dce282
Move heartbeat to bottom of screen, full width
TyDunn Jan 27, 2026
b8f9a49
Only show heartbeat when scrolled to bottom (vision section)
TyDunn Jan 27, 2026
5c49aa8
Make heartbeat animation slower and calmer (4s cycle, gentler movement)
TyDunn Jan 27, 2026
b3b7081
Speed up heartbeat to 2.5s cycle (balanced pace)
TyDunn Jan 27, 2026
391f91f
Restore double-beat heartbeat pattern (small jump, then big jump)
TyDunn Jan 27, 2026
80c5974
Make heartbeat lines interactive - light up on hover
TyDunn Jan 27, 2026
c0bbd1a
Raise footer z-index above heartbeat lines
TyDunn Jan 27, 2026
828dc54
Set heartbeat to 60 BPM - the optimal alive feeling
TyDunn Jan 27, 2026
4835bb4
Add custom 404 page matching site design
TyDunn Jan 28, 2026
de98369
Fix social card for /jan2025 page
TyDunn Jan 28, 2026
352c97a
Make heartbeat animation always lit up
TyDunn Jan 28, 2026
49385aa
Fix heartbeat animation to be always bright while still pulsing
TyDunn Jan 28, 2026
fcf0538
Revert heartbeat changes back to original
TyDunn Jan 28, 2026
0d69e78
Add accessibility tags without changing presentation
TyDunn Jan 28, 2026
9b8d673
Move footer above heartbeat animation to prevent overlap
TyDunn Jan 28, 2026
7e7445e
Update h1 font to Space Grotesk for bolder, more technical look
TyDunn Jan 28, 2026
28b12c1
Switch to Outfit font with larger, weightier sizing
TyDunn Jan 28, 2026
deb68a7
Use font-bold instead of font-extrabold for headings
TyDunn Jan 28, 2026
365addd
Use default Syne font for paragraphs, keep Outfit only for headings
TyDunn Jan 28, 2026
ed9f1d3
Restore Syne font import for body text
TyDunn Jan 28, 2026
71866c1
Move mobile nav dots above footer to prevent overlap
TyDunn Jan 28, 2026
c838a6b
Move mobile nav dots to top right for cleaner layout
TyDunn Jan 28, 2026
41c9fa0
Update Jan 2025 to Jan 2026 and add redirect
TyDunn Jan 29, 2026
c822276
Update ecosystem section copy
TyDunn Jan 30, 2026
94d2e8c
Merge branch 'main' into initial
dranashilal-bit Jan 31, 2026
65c71a4
5858c5e
dranashilal-bit Jan 31, 2026
efe7c34
Merge pull request #1 from 14salfd-boop/initial
14salfd-boop Jan 31, 2026
76ee56a
Bump next in the npm_and_yarn group across 1 directory (#2)
dependabot[bot] Feb 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .DS_Store
Binary file not shown.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
node_modules
.next
.claude
.claude
.DS_Store
15 changes: 14 additions & 1 deletion app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,23 @@
@tailwind components;
@tailwind utilities;

/* Screen reader only utility */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}

body {
margin: 0;
padding: 0;
background-color: #151515;
background-color: #0a0a0b;
overflow: hidden;
height: 100vh;
width: 100vw;
Expand Down
276 changes: 276 additions & 0 deletions app/heartbeat/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
"use client";

export default function Heartbeat() {
return (
<main
id="main-content"
role="main"
aria-label="Heartbeat visualization - an animated representation of continuous AI workflow"
style={{ margin: 0, padding: 0, width: '100vw', height: '100vh', overflow: 'hidden', background: '#0a0a0b' }}
>
<style jsx global>{`
@keyframes heartbeat {
0%, 100% { transform: scaleY(1); }
7% { transform: scaleY(1.2); }
14% { transform: scaleY(1); }
21% { transform: scaleY(1.45); }
35% { transform: scaleY(1); }
}

@keyframes breathe-out {
0%, 100% { transform: translateY(0) scaleY(1); opacity: 0.5; }
7% { transform: translateY(-5px) scaleY(1.05); opacity: 0.65; }
14% { transform: translateY(0) scaleY(1); opacity: 0.5; }
21% { transform: translateY(-12px) scaleY(1.12); opacity: 0.8; }
35% { transform: translateY(0) scaleY(1); opacity: 0.5; }
}

@keyframes breathe-in {
0%, 100% { transform: translateY(0) scaleY(1); opacity: 0.5; }
7% { transform: translateY(5px) scaleY(1.05); opacity: 0.65; }
14% { transform: translateY(0) scaleY(1); opacity: 0.5; }
21% { transform: translateY(12px) scaleY(1.12); opacity: 0.8; }
35% { transform: translateY(0) scaleY(1); opacity: 0.5; }
}

@keyframes fade-pulse {
0%, 100% { opacity: 0.15; }
7% { opacity: 0.25; }
14% { opacity: 0.15; }
21% { opacity: 0.4; }
35% { opacity: 0.15; }
}

.core {
animation: heartbeat 1s ease-in-out infinite;
transform-origin: center center;
transform-box: fill-box;
}
.breathe-up {
animation: breathe-out 1s ease-in-out infinite;
transform-origin: center bottom;
}
.breathe-down {
animation: breathe-in 1s ease-in-out infinite;
transform-origin: center top;
}
.fade-band {
animation: fade-pulse 1s ease-in-out infinite;
}

.hover-line {
transition: all 0.15s ease-out;
}
.hover-line:hover {
opacity: 1 !important;
filter: brightness(2);
}
.hover-line:hover rect {
fill: #c8ff00 !important;
}
`}</style>

<svg width="100%" height="100%" viewBox="0 0 1200 630" preserveAspectRatio="xMidYMid slice" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Abstract heartbeat visualization with pulsing horizontal lines converging to a bright green core line">
<defs>
<filter id="grain" x="0%" y="0%" width="100%" height="100%">
<feTurbulence type="fractalNoise" baseFrequency="0.7" numOctaves="4" result="noise"/>
<feColorMatrix type="saturate" values="0"/>
<feComponentTransfer>
<feFuncA type="linear" slope="0.03"/>
</feComponentTransfer>
<feBlend in="SourceGraphic" mode="overlay"/>
</filter>

<radialGradient id="vignette" cx="50%" cy="50%" r="70%">
<stop offset="0%" stopColor="#000000" stopOpacity="0"/>
<stop offset="100%" stopColor="#000000" stopOpacity="0.4"/>
</radialGradient>
</defs>

{/* Background */}
<rect width="1200" height="630" fill="#0a0a0b"/>

{/* MACRO - distant echoes */}
<g className="fade-band hover-line" style={{ animationDelay: '0.2s' }}>
<rect x="0" y="50" width="1200" height="1" fill="#0d0d0e"/>
<rect x="0" y="580" width="1200" height="1" fill="#0d0d0e"/>
</g>

<g className="fade-band hover-line" style={{ animationDelay: '0.18s' }}>
<rect x="0" y="90" width="1200" height="1" fill="#101011"/>
<rect x="0" y="540" width="1200" height="1" fill="#101011"/>
</g>

<g className="fade-band hover-line" style={{ animationDelay: '0.15s' }}>
<rect x="0" y="125" width="1200" height="1" fill="#131314"/>
<rect x="0" y="505" width="1200" height="1" fill="#131314"/>
</g>

{/* LARGE SCALE - fragmenting bands, upper */}
<g className="breathe-up hover-line" style={{ animationDelay: '0.12s' }}>
<rect x="0" y="155" width="450" height="1" fill="#161617"/>
<rect x="480" y="155" width="380" height="1" fill="#171718"/>
<rect x="890" y="155" width="310" height="1" fill="#161617"/>
</g>

{/* LARGE SCALE - fragmenting bands, lower */}
<g className="breathe-down hover-line" style={{ animationDelay: '0.12s' }}>
<rect x="0" y="475" width="400" height="1" fill="#161617"/>
<rect x="430" y="475" width="420" height="1" fill="#171718"/>
<rect x="880" y="475" width="320" height="1" fill="#161617"/>
</g>

{/* MEDIUM SCALE - coalescing, upper */}
<g className="breathe-up hover-line" style={{ animationDelay: '0.09s' }}>
<rect x="0" y="185" width="550" height="1" fill="#1a1b1a"/>
<rect x="580" y="185" width="400" height="1" fill="#1b1c1b"/>
<rect x="1010" y="185" width="190" height="1" fill="#1a1b1a"/>

<rect x="0" y="190" width="600" height="1" fill="#1c1d1c"/>
<rect x="630" y="190" width="350" height="1" fill="#1b1c1b"/>
<rect x="1010" y="190" width="190" height="1" fill="#1c1d1c"/>
</g>

{/* MEDIUM SCALE - coalescing, lower */}
<g className="breathe-down hover-line" style={{ animationDelay: '0.09s' }}>
<rect x="0" y="440" width="520" height="1" fill="#1a1b1a"/>
<rect x="550" y="440" width="430" height="1" fill="#1b1c1b"/>
<rect x="1010" y="440" width="190" height="1" fill="#1a1b1a"/>

<rect x="0" y="445" width="580" height="1" fill="#1c1d1c"/>
<rect x="610" y="445" width="370" height="1" fill="#1b1c1b"/>
<rect x="1010" y="445" width="190" height="1" fill="#1c1d1c"/>
</g>

{/* SMALL SCALE - tighter, upper */}
<g className="breathe-up hover-line" style={{ animationDelay: '0.06s' }}>
<rect x="0" y="215" width="700" height="2" fill="#1e1f1e"/>
<rect x="730" y="215" width="470" height="2" fill="#1d1e1d"/>

<rect x="0" y="222" width="750" height="1" fill="#1f201f"/>
<rect x="780" y="222" width="420" height="1" fill="#1e1f1e"/>
</g>

{/* SMALL SCALE - tighter, lower */}
<g className="breathe-down hover-line" style={{ animationDelay: '0.06s' }}>
<rect x="0" y="413" width="680" height="2" fill="#1e1f1e"/>
<rect x="710" y="413" width="490" height="2" fill="#1d1e1d"/>

<rect x="0" y="408" width="720" height="1" fill="#1f201f"/>
<rect x="750" y="408" width="450" height="1" fill="#1e1f1e"/>
</g>

{/* FINE SCALE - green emerging, upper */}
<g className="breathe-up hover-line" style={{ animationDelay: '0.04s' }}>
<rect x="0" y="245" width="850" height="2" fill="#1a1f0a"/>
<rect x="880" y="245" width="320" height="2" fill="#191e09"/>

<rect x="0" y="252" width="900" height="2" fill="#1c240b"/>
<rect x="930" y="252" width="270" height="2" fill="#1b220a"/>
</g>

{/* FINE SCALE - green emerging, lower */}
<g className="breathe-down hover-line" style={{ animationDelay: '0.04s' }}>
<rect x="0" y="383" width="830" height="2" fill="#1a1f0a"/>
<rect x="860" y="383" width="340" height="2" fill="#191e09"/>

<rect x="0" y="378" width="880" height="2" fill="#1c240b"/>
<rect x="910" y="378" width="290" height="2" fill="#1b220a"/>
</g>

{/* MICRO SCALE - almost bound, upper */}
<g className="breathe-up hover-line" style={{ animationDelay: '0.02s' }}>
<rect x="0" y="270" width="950" height="3" fill="#1e2a0c"/>
<rect x="980" y="270" width="220" height="3" fill="#1d280b"/>

<rect x="0" y="278" width="1000" height="3" fill="#20320e"/>
<rect x="1030" y="278" width="170" height="3" fill="#1f300d"/>
</g>

{/* MICRO SCALE - almost bound, lower */}
<g className="breathe-down hover-line" style={{ animationDelay: '0.02s' }}>
<rect x="0" y="357" width="940" height="3" fill="#1e2a0c"/>
<rect x="970" y="357" width="230" height="3" fill="#1d280b"/>

<rect x="0" y="352" width="990" height="3" fill="#20320e"/>
<rect x="1020" y="352" width="180" height="3" fill="#1f300d"/>
</g>

{/* THE CORE - the beating continuous line */}
<g className="core" style={{ transform: 'translateY(315px)' }}>

{/* Outer core bands */}
<g className="hover-line">
<rect x="0" y="-22" width="1050" height="4" fill="#2a3d10"/>
<rect x="1080" y="-22" width="120" height="4" fill="#28390f"/>
</g>

<g className="hover-line">
<rect x="0" y="19" width="1030" height="4" fill="#28390f"/>
<rect x="1060" y="19" width="140" height="4" fill="#2a3d10"/>
</g>

{/* Inner core bands */}
<g className="hover-line">
<rect x="0" y="-14" width="1100" height="5" fill="#3a5214"/>
<rect x="1130" y="-14" width="70" height="5" fill="#384f13"/>
</g>

<g className="hover-line">
<rect x="0" y="10" width="1080" height="5" fill="#384f13"/>
<rect x="1110" y="10" width="90" height="5" fill="#3a5214"/>
</g>

{/* Near core */}
<g className="hover-line">
<rect x="0" y="-7" width="1150" height="5" fill="#506a18"/>
<rect x="1170" y="-7" width="30" height="5" fill="#4d6617"/>
</g>

<g className="hover-line">
<rect x="0" y="3" width="1140" height="5" fill="#4d6617"/>
<rect x="1160" y="3" width="40" height="5" fill="#506a18"/>
</g>

{/* THE CONTINUOUS LINE */}
<rect x="0" y="-2" width="1200" height="5" fill="#c8ff00"/>

{/* Nano structure - brightness variations within */}
<g opacity="0.3">
<rect x="40" y="-1" width="100" height="3" fill="#d4ff34"/>
<rect x="180" y="-1" width="70" height="3" fill="#dcff55"/>
<rect x="300" y="-1" width="120" height="3" fill="#d4ff34"/>
<rect x="480" y="-1" width="90" height="3" fill="#dcff55"/>
<rect x="620" y="-1" width="140" height="3" fill="#d4ff34"/>
<rect x="820" y="-1" width="80" height="3" fill="#dcff55"/>
<rect x="950" y="-1" width="110" height="3" fill="#d4ff34"/>
<rect x="1100" y="-1" width="70" height="3" fill="#dcff55"/>
</g>

{/* Pico scale hints */}
<g opacity="0.2">
<rect x="60" y="0" width="25" height="1" fill="#e5ff77"/>
<rect x="140" y="0" width="18" height="1" fill="#e5ff77"/>
<rect x="220" y="0" width="30" height="1" fill="#e5ff77"/>
<rect x="340" y="0" width="22" height="1" fill="#e5ff77"/>
<rect x="430" y="0" width="28" height="1" fill="#e5ff77"/>
<rect x="540" y="0" width="20" height="1" fill="#e5ff77"/>
<rect x="650" y="0" width="35" height="1" fill="#e5ff77"/>
<rect x="760" y="0" width="24" height="1" fill="#e5ff77"/>
<rect x="870" y="0" width="32" height="1" fill="#e5ff77"/>
<rect x="980" y="0" width="26" height="1" fill="#e5ff77"/>
<rect x="1090" y="0" width="40" height="1" fill="#e5ff77"/>
</g>

</g>

{/* Vignette */}
<rect width="1200" height="630" fill="url(#vignette)" style={{ pointerEvents: 'none' }}/>

{/* Grain */}
<rect width="1200" height="630" filter="url(#grain)" fill="#808080" opacity="0.025" style={{ pointerEvents: 'none' }}/>

</svg>
</main>
);
}
57 changes: 57 additions & 0 deletions app/jan2026/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import type { Metadata } from "next";

export const metadata: Metadata = {
title: "Jan 2026 Dinner | Continuous AI",
description: "San Francisco · January 2026",
openGraph: {
type: "website",
title: "Continuous AI Dinner",
description: "San Francisco · January 2026",
url: "https://continuousai.com/jan2026",
siteName: "Continuous AI",
images: [
{
url: "/og-image.gif",
width: 1200,
height: 630,
alt: "Continuous AI",
},
],
},
twitter: {
card: "summary_large_image",
title: "Continuous AI Dinner",
description: "San Francisco · January 2026",
images: ["/og-image.gif"],
},
};

export default function Jan2025Layout({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<style dangerouslySetInnerHTML={{ __html: `
html, body {
background: #0a0a0b;
margin: 0;
padding: 0;
}
.jan2025-page {
opacity: 0;
transition: opacity 0.3s ease;
}
.jan2025-page.loaded {
opacity: 1;
}
img {
max-width: 16px;
max-height: 16px;
}
`}} />
{children}
</>
);
}
Loading