@@ -79,123 +79,159 @@ posts.sort((a, b) => b.data.publishedAt.getTime() - a.data.publishedAt.getTime()
7979 </head >
8080 <body >
8181 <div class =" ambient" ></div >
82- <main class =" shell" >
83- <header class =" enter" style =" --delay: 0ms;" >
84- <div class =" brand-row" >
85- <p class =" brand" >Philo</p >
86- <p class =" status" >macOS beta</p >
87- </div >
88- </header >
89-
90- <section class =" hero enter" style =" --delay: 70ms;" >
91- <h1 >A daily journal that builds things for you.</h1 >
92- <p class =" lede" >
93- Capture notes. Track tasks that roll forward. Generate tiny tools in place when you need
94- them.
95- </p >
96- <p class =" release-note" >
97- Download Philo from <a href =" https://github.com/ComputelessComputer/philo/releases/latest" >GitHub Releases</a >.
98- </p >
99- <form class =" waitlist" action =" #" method =" post" >
100- <label for =" email" >Get early access</label >
101- <div class =" input-row" >
102- <input id =" email" type =" email" name =" email" placeholder =" name@domain.com" />
103- <button type =" submit" >→</button >
82+ <div class =" page-layout" >
83+ <main class =" shell" >
84+ <header class =" enter" style =" --delay: 0ms;" >
85+ <div class =" brand-row" >
86+ <p class =" brand" >Philo</p >
87+ <p class =" status" >macOS beta</p >
10488 </div >
105- </form >
106- </section >
107-
108- <section class =" panel enter" style =" --delay: 140ms;" >
109- <h2 >Core flow</h2 >
110- <ul class =" detail-list" >
111- {
112- capabilities .map ((item ,) => (
113- <li class = " detail-item" >
114- <div class = " detail-copy" >
115- <p class = " item-title" >{ item .title } <span >→</span ></p >
116- <p class = " item-copy" >{ item .description } </p >
117- </div >
118- <div class = " detail-placeholder" role = " img" aria-label = { ` ${item .title } image placeholder ` } >
119- <span >{ item .placeholder } </span >
120- </div >
121- </li >
122- ))
123- }
124- </ul >
125- </section >
126-
127- <section class =" panel enter" style =" --delay: 210ms;" >
128- <h2 >Things people build in Philo</h2 >
129- <div class =" carousel" data-carousel >
130- <div class =" carousel-controls" >
131- <button type =" button" class =" carousel-button" data-carousel-prev aria-label =" Previous example" >←</button >
132- <button type =" button" class =" carousel-button" data-carousel-next aria-label =" Next example" >→</button >
89+ </header >
90+
91+ <section class =" hero enter" style =" --delay: 70ms;" >
92+ <h1 >A daily journal that builds things for you.</h1 >
93+ <p class =" lede" >
94+ Capture notes. Track tasks that roll forward. Generate tiny tools in place when you
95+ need them.
96+ </p >
97+ <p class =" release-note" >
98+ Download Philo from <a href =" https://github.com/ComputelessComputer/philo/releases/latest" >GitHub Releases</a >.
99+ </p >
100+ <div class =" video-mobile" >
101+ <p class =" video-label" >Product walkthrough</p >
102+ <div class =" video-frame" >
103+ <video
104+ class =" product-video"
105+ controls
106+ muted
107+ loop
108+ playsinline
109+ preload =" metadata"
110+ poster =" /philo-video-poster.svg"
111+ >
112+ <source src =" /philo-demo.mp4" type =" video/mp4" />
113+ </video >
114+ </div >
133115 </div >
134- <div class =" carousel-track" data-carousel-track >
116+ <form class =" waitlist" action =" #" method =" post" >
117+ <label for =" email" >Get early access</label >
118+ <div class =" input-row" >
119+ <input id =" email" type =" email" name =" email" placeholder =" name@domain.com" />
120+ <button type =" submit" >→</button >
121+ </div >
122+ </form >
123+ </section >
124+
125+ <section class =" panel enter" style =" --delay: 140ms;" >
126+ <h2 >Core flow</h2 >
127+ <ul class =" detail-list" >
135128 {
136- examples .map ((item ,) => (
137- <article class = " example-card " >
138- <p class = " example-title " > { item . title } </ p >
139- <p class = " example-summary " >{ item .summary } </p >
140- < div class = " example-preview " role = " img " aria-label = { ` ${ item .title } preview ` } >
141- < ul >
142- { item .lines . map (( line ,) => < li > { line } </ li >) }
143- </ ul >
129+ capabilities .map ((item ,) => (
130+ <li class = " detail-item " >
131+ <div class = " detail-copy " >
132+ <p class = " item-title " >{ item .title } < span >→</ span > </p >
133+ < p class = " item-copy " > { item .description } </ p >
134+ </ div >
135+ < div class = " detail-placeholder " role = " img " aria-label = { ` ${ item .title } image placeholder ` } >
136+ <span > { item . placeholder } </ span >
144137 </div >
145- </article >
138+ </li >
146139 ))
147140 }
141+ </ul >
142+ </section >
143+
144+ <section class =" panel enter" style =" --delay: 210ms;" >
145+ <h2 >Things people build in Philo</h2 >
146+ <div class =" carousel" data-carousel >
147+ <div class =" carousel-controls" >
148+ <button type =" button" class =" carousel-button" data-carousel-prev aria-label =" Previous example" >←</button >
149+ <button type =" button" class =" carousel-button" data-carousel-next aria-label =" Next example" >→</button >
150+ </div >
151+ <div class =" carousel-track" data-carousel-track >
152+ {
153+ examples .map ((item ,) => (
154+ <article class = " example-card" >
155+ <p class = " example-title" >{ item .title } </p >
156+ <p class = " example-summary" >{ item .summary } </p >
157+ <div class = " example-preview" role = " img" aria-label = { ` ${item .title } preview ` } >
158+ <ul >
159+ { item .lines .map ((line ,) => <li >{ line } </li >)}
160+ </ul >
161+ </div >
162+ </article >
163+ ))
164+ }
165+ </div >
166+ <div class =" carousel-dots" >
167+ {
168+ examples .map ((item , index ,) => (
169+ <button
170+ type = " button"
171+ class = { ` carousel-dot ${index === 0 ? " is-active" : " " } ` }
172+ data-carousel-dot
173+ data-index = { index }
174+ aria-label = { ` Go to ${item .title } ` }
175+ aria-current = { index === 0 ? " true" : " false" }
176+ ></button >
177+ ))
178+ }
179+ </div >
148180 </div >
149- <div class =" carousel-dots" >
181+ </section >
182+
183+ <section class =" panel enter" style =" --delay: 280ms;" >
184+ <h2 >Notes from the team</h2 >
185+ <ul class =" link-list" >
150186 {
151- examples .map ((item , index ,) => (
152- <button
153- type = " button"
154- class = { ` carousel-dot ${index === 0 ? " is-active" : " " } ` }
155- data-carousel-dot
156- data-index = { index }
157- aria-label = { ` Go to ${item .title } ` }
158- aria-current = { index === 0 ? " true" : " false" }
159- ></button >
187+ posts .map ((post ,) => (
188+ <li >
189+ <a href = { ` /blog/${post .slug } ` } >
190+ { post .data .title }
191+ <span >→</span >
192+ </a >
193+ </li >
160194 ))
161195 }
162- </div >
196+ </ul >
197+ </section >
198+
199+ <section class =" panel enter" style =" --delay: 350ms;" >
200+ <h2 >Philo runs local-first</h2 >
201+ <p class =" item-copy" >
202+ Your journal lives on disk as markdown files. Keep your data close, move fast, and
203+ shape the app around your own workflow.
204+ </p >
205+ </section >
206+
207+ <footer class =" enter" style =" --delay: 420ms;" >
208+ <nav >
209+ <a href =" #" >X</a >
210+ <a href =" https://github.com/ComputelessComputer/philo" >GitHub</a >
211+ <a href =" #" >Docs</a >
212+ <a href =" mailto:team@philo.app" >Email</a >
213+ </nav >
214+ </footer >
215+ </main >
216+
217+ <aside class =" video-column enter" style =" --delay: 120ms;" >
218+ <p class =" video-label" >Product walkthrough</p >
219+ <div class =" video-frame" >
220+ <video
221+ class =" product-video"
222+ controls
223+ muted
224+ loop
225+ playsinline
226+ preload =" metadata"
227+ poster =" /philo-video-poster.svg"
228+ >
229+ <source src =" /philo-demo.mp4" type =" video/mp4" />
230+ </video >
163231 </div >
164- </section >
165-
166- <section class =" panel enter" style =" --delay: 280ms;" >
167- <h2 >Notes from the team</h2 >
168- <ul class =" link-list" >
169- {
170- posts .map ((post ,) => (
171- <li >
172- <a href = { ` /blog/${post .slug } ` } >
173- { post .data .title }
174- <span >→</span >
175- </a >
176- </li >
177- ))
178- }
179- </ul >
180- </section >
181-
182- <section class =" panel enter" style =" --delay: 350ms;" >
183- <h2 >Philo runs local-first</h2 >
184- <p class =" item-copy" >
185- Your journal lives on disk as markdown files. Keep your data close, move fast, and shape
186- the app around your own workflow.
187- </p >
188- </section >
189-
190- <footer class =" enter" style =" --delay: 420ms;" >
191- <nav >
192- <a href =" #" >X</a >
193- <a href =" https://github.com/ComputelessComputer/philo" >GitHub</a >
194- <a href =" #" >Docs</a >
195- <a href =" mailto:team@philo.app" >Email</a >
196- </nav >
197- </footer >
198- </main >
232+ <p class =" video-note" >Place `philo-demo.mp4` in `apps/landing/public/` to use your own demo.</p >
233+ </aside >
234+ </div >
199235 </body >
200236</html >
201237
@@ -302,11 +338,20 @@ posts.sort((a, b) => b.data.publishedAt.getTime() - a.data.publishedAt.getTime()
302338 opacity: 0.8;
303339 }
304340
305- .shell {
341+ .page-layout {
306342 position: relative;
307- width: min(100%, 720px );
343+ width: min(100%, 1160px );
308344 margin: 0 auto;
309345 padding: 68px 24px 88px;
346+ display: grid;
347+ grid-template-columns: minmax(0, 720px) minmax(0, 320px);
348+ gap: 34px;
349+ align-items: start;
350+ }
351+
352+ .shell {
353+ position: relative;
354+ width: 100%;
310355 }
311356
312357 .brand-row {
@@ -362,6 +407,11 @@ posts.sort((a, b) => b.data.publishedAt.getTime() - a.data.publishedAt.getTime()
362407 text-underline-offset: 2px;
363408 }
364409
410+ .video-mobile {
411+ display: none;
412+ margin-top: 18px;
413+ }
414+
365415 .waitlist {
366416 margin-top: 36px;
367417 max-width: 430px;
@@ -615,6 +665,42 @@ posts.sort((a, b) => b.data.publishedAt.getTime() - a.data.publishedAt.getTime()
615665 background: var(--accent);
616666 }
617667
668+ .video-column {
669+ position: sticky;
670+ top: 20px;
671+ border-top: 1px solid var(--line);
672+ padding-top: 24px;
673+ }
674+
675+ .video-label {
676+ margin: 0 0 10px;
677+ color: #3f3f3d;
678+ font-size: var(--fs-sm);
679+ font-weight: 500;
680+ letter-spacing: 0.04em;
681+ text-transform: uppercase;
682+ }
683+
684+ .video-frame {
685+ border: 1px solid var(--line);
686+ background: color-mix(in srgb, var(--bg-soft) 90%, #ffffff);
687+ padding: 8px;
688+ }
689+
690+ .product-video {
691+ display: block;
692+ width: 100%;
693+ aspect-ratio: 16 / 9;
694+ border: 1px dashed color-mix(in srgb, var(--line) 82%, #bfc2ce);
695+ background: #efefe9;
696+ }
697+
698+ .video-note {
699+ margin: 10px 0 0;
700+ color: #676762;
701+ font-size: var(--fs-xs);
702+ }
703+
618704 footer {
619705 margin-top: 42px;
620706 border-top: 1px solid var(--line);
@@ -654,11 +740,30 @@ posts.sort((a, b) => b.data.publishedAt.getTime() - a.data.publishedAt.getTime()
654740 }
655741 }
656742
743+ @media (max-width: 980px) {
744+ .page-layout {
745+ grid-template-columns: 1fr;
746+ gap: 0;
747+ }
748+
749+ .video-column {
750+ display: none;
751+ }
752+
753+ .video-mobile {
754+ display: block;
755+ }
756+ }
757+
657758 @media (max-width: 720px) {
658- .shell {
759+ .page-layout {
659760 padding: 42px 18px 62px;
660761 }
661762
763+ .shell {
764+ width: 100%;
765+ }
766+
662767 .brand {
663768 font-size: var(--fs-lg);
664769 }
0 commit comments