From 1a15cbc4019b381202806f8bbe5acec39305cbd8 Mon Sep 17 00:00:00 2001 From: Frederic Cabassut Date: Sat, 7 Mar 2026 19:35:09 +0100 Subject: [PATCH] feat: add marketing landing page for crumbs.bretzel.app Static landing page with parchment/retro theme matching the app aesthetic. Includes GitHub Pages deploy workflow, responsive layout, feature grid, deploy quick-start, and 404 page. Screenshot placeholders ready for real captures. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/website.yml | 36 ++ website/.nojekyll | 0 website/404.html | 40 ++ website/CNAME | 1 + website/assets/favicon-96x96.png | Bin 0 -> 18405 bytes website/assets/favicon.ico | Bin 0 -> 15086 bytes website/index.html | 266 +++++++++++++ website/styles.css | 654 +++++++++++++++++++++++++++++++ 8 files changed, 997 insertions(+) create mode 100644 .github/workflows/website.yml create mode 100644 website/.nojekyll create mode 100644 website/404.html create mode 100644 website/CNAME create mode 100644 website/assets/favicon-96x96.png create mode 100644 website/assets/favicon.ico create mode 100644 website/index.html create mode 100644 website/styles.css diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 0000000..0ecc3ea --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,36 @@ +name: Deploy Website + +on: + push: + branches: [main] + paths: ['website/**'] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + deploy: + name: Deploy to GitHub Pages + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v4 + + - uses: actions/configure-pages@v5 + + - uses: actions/upload-pages-artifact@v3 + with: + path: website + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/website/.nojekyll b/website/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/website/404.html b/website/404.html new file mode 100644 index 0000000..4b8a566 --- /dev/null +++ b/website/404.html @@ -0,0 +1,40 @@ + + + + + + 404 - Page not found | Crumbs + + + + + + +
+

404

+

This note seems to have been deleted. Or maybe it never existed.

+ Back to home +
+ + diff --git a/website/CNAME b/website/CNAME new file mode 100644 index 0000000..f36d58a --- /dev/null +++ b/website/CNAME @@ -0,0 +1 @@ +crumbs.bretzel.app diff --git a/website/assets/favicon-96x96.png b/website/assets/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..c07a9e9ff8c6a0bf7eeebf89e81008c251931d92 GIT binary patch literal 18405 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 M07*qoM6N<$f|GP7$N&HU literal 0 HcmV?d00001 diff --git a/website/assets/favicon.ico b/website/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ff6507425fed89159a3792aa6e90f5840b716ba5 GIT binary patch literal 15086 zcmb`O37AyXmB-&&uU@U)bOXIX0kQ}xjqGdhtR^NgG0~`rGchxclYFB_v!FmVy|D_} zG&nJ8;wS=wW--PE8WoK)lT4g3iK9XT;xcANqKQOB&-~7_ zXTR^S{KyN%?-XAbJ}rJ&d|i0q|M6nL_=VfT#a}&FB&d~mVy49695Fr5ka%o{Ih$+l zW9EJ)@6D1}V!C|rBp;rh+?&P!FCM-BII$%2$EQh{m@4t)Yzf0@;y1R7)3ipM=2aY> zTyx*hQMh-Txo*+tywkE;+@=okqf^XU;_>N{U_Ghy%nz}qV!Gb%xo}f<;wQQ5;wL9tk8Py}&6ViFE{Qa?iZg!=^h0+ud~8;_pyxB+7I(#i;;(#2 z{Epoc>3mq+_D95P+a-S6Zt>f@Idf!piI?3ek=6&rJDYViu;zLlW1aX5Rvas0lq?e@^iOI^uq5;c+vMI zxa1DG>IV;q3*AoZE(urelK55ka{sV6D|d?1zFR!5z0Td@wswol?{4QK^0k|OF0l)~ zBhd>sN%U{-$ninf!=45cE|b!6=SwmBNh7w5A#vKQ<_7vCaNwvJ=g$lh_*eNuV!kSWy-k9p(Bk=n2U3_j^?7@mnu znIeJGjh^}{-+CaoUI#QWr}8#j^`y8L-elxq#P%1YdfN+9vF)H#Z9gOxcO90hyIzpt z+d1?6**D&kM_+qShH;(Q!LzN0pck6ESobRBfyx$p0}oW*Y_(r4=$X;|4(uGdeZn;q z?@Mk;aqNKCuoAwn7u8i8zI(dw@W)a5*#i%G7}T{(UVi;8sfL#7ZHJ)yuvG7OK`L2G z73XU1N8WukJmH6%SjdGGouj#xycUUDnu1r|U7Pyz_afzVkV$+Ol6p zZ95>twjN*&2ci3bSRen6v7hezwPLAFosW&=a2i*MwRoLWvOk&aJ*=TeoD~m<4Udxx zIwZi4M51R(5S=d30eW>2irr z{Guc${vCXtDK&NfBLZbxSbQ>bGT+26h`#_m(u45>=#M3# zapu=04IS~sY;cagJ5xf=1)iMbA`ELK45oq?)Ys0I(&j9(&$^qDHMM8RzN0=7-q~RT z^s6r5Kk$Ke9rh2KQf21tn=2Yqe$5ac{;JHo;FJ)XtGv={9~t$~W1|!3QxHx!x)ep$ z;>i!PYkAGm1#!)PvG|$T683h{Ml-Ixcs;)DmvZRHTjH+yC4BA>FE&rCpdLGijl$N| zpz9;C5jE)ACvN?BzMod$RWvqHO3wTea)aJ3K-ch7>N6tH>VNS^IlGP>S6`%f$2Du| zg8wVwJvfe|Kf7~u_J5YUi=mr7V|dsE7u)HqWZdjS*wDws@4|+jwLz3G31rx6z-E9) zs+p$OXz9#aE7qP*2>=(tW zQDj*0brn9rTmB0fe%mu*Px~r9p=$JVnSnDCHt|{?7QE^wc7W3>_a2iCB8)b2zr5j=I8Lh!=(+& z#944%&W^zM_<7%z3T*Ijv3b8t00-FT z-H3dFlfji5v-tR|l7|sDsF!k%+@MHmvkb} zeL55p%Y?J8z~_PE>iPW#zm+g`V%bzo;lnov-HkM@lowuq+t6>f?*Ut3yTEFtt9FB- zh_&zoG58u;{&N`$&uX{)mmECuHaOs*!J!UvWhqW#PLFlOu>p#^yu};PJ?Mu=_Ub33 z8lG3NerLf(ae^6AI&|`H^8C!7qlq)nDexnF2!lRbS!~Vp-59bTX=#(>SAHtaDr}eP z75uSP{*WQ>{O?J)WF7p}_;n^@Dos-*n0b}hOV&%(ojpR~WC;7FF@j&$ zX6RQNm2Sk&Yutl7(@cD<51D5dRGPMRBsfXq_a!e7DgTyBA;XefiCtjl19n5?w&N zg)c7tcGRdT>GI6n${0S^D_tbsxtpXCd^z=w-$?Ver(`($QjYwoP7H3mMqF$`fc!b( zJaJOjIbh9&t5(;onux+i>4;-^AEkADi$uWh71o`v+y@Jugd1_P(55g6CGe8QV%6 z5(7IV2kPSSBOm{y-*O5!>W4kBP52L6kr!eg@P?ynfOj@_$i3(m^rOS*QsJWkgD1hX zN$`it{290JBQ^n3WA_feb`%~UM;Zrllr$+``XIbfnB{~QF|bZDtv)Wt1GNtt_eU?= zg1(}&_$~+gtTBW+RDQsf#rFI}1INe#B^29&$Lvphml%QgWGnI5o!F*zPhuxm8a-2N z6D_hQCmQSho(=A}9~<)!eA%6|DcBOjUvNTX^^@X4udVSk`sWY>xfk7v{I7<;$NP@_ zJOTQd(3lM#JJC7d-v)!%huo=g*9-FB#KOZ`w@Z4}6X2e9;}`PZ{#9r8y>eCeF>*2{ ze(}J4DvutxC-qNvOUc?j^6H=7mFnA`HJDHRnESaO8B86AzbBh3sxpXej3{md^Q9Jo zp@NCnnNDKJ7fo#Dv_61+1)~vjdE~nkKc8&8zUQ{3x)tJM&9eb=tIsq?sq`nmyhEaE zACvgf?dSnERDH18qR-t5j&7F#KhZaC|EmzpV&Vg0hYWsr+`7FI$8XyaY%V%wuXso@ z+g_9r+YXDDC2z%A6RFuJ9ZyGh{2Jny=`yzSAvu*;vj2=Mq<1YEFGlda3B{S}cks7H z?!h}Iw{gME5|DFyKYl6J*7(|n_k)%_C}nNve(mKZhKM7J4m4+wqhYrbH@E)O_^|}G zv_DP#?}GArvC2M%uYXX6u6_8q{=fF!1<}c1mJSKOyj>#j+*bO@EjXIzf&Z$Dk$GP? z`C`R0eP8xnDNcxhK^^#P6GQ3#DK-v}5tHWx>t)EN)ZYHI{Nd;^<>;;2WU#P4j}OfM_Y$dgET(yNJ>&Bgix$)0x2l2)Scw!d;Dj$Q5BVy^E#&=1 z=o&u#Z3!+%uE;TI?mLm1g&jR!@8ZN=ip}hfZrS;VcjT!*zH9KPi{A*b4~fJaNjDMy zE!ZHQ=KaA%YB!2$(dz_bJB!H86E{|E`VSekiM%7eHLmt~0DdX{RxxE*`}e#H_C*GM zfAl?xUjOg%Z~yzQoVWQ&?A{(pp%W-1Cmu|QuKSrEQcs{P2RjHS6*a4B^g&4Vg_)O>2?9g3w6k-Kb#59G*LVBG%muonH)3k>-Zk~Y;Y-d!9Ht^(J@!!KlS^_-9BQV zhmS~Z|J8ngO*96~%S$oMg=bu7JfpV3{lxc)4T;mCe>^$P!^F7;@9AE&Zyd>vRD z|EfM91lyLgF8l0nn?2NAMFu%AvUmP>#s2&)My_mPRE+4gXcQ*}v7~_OE+F{0)0$NcLwk{?d&ynE35J-qG4e=6k=9spPna zd};&oFinP!p5G@sC*gbXW35TYs3$}wU5dYNqlSVGAV;9wN2@-oPPXqPU$UPZCb`$`2c?W$MFl)i`%=!a(O}Cj>?UKpMfx$-q_$5QzQ0&snN0AX~Fd5dPwXqSpF4mOU@uE1Nxlx>X zG{YC z&Oz4h$#Ax_b~kin^(xSHWL>4No1ye<*2(Yrv*82Z<1c&{~D!NR6Y4Yf*iK zoM^HWJtGI6VouFr^x{vg7kJE<>nCDP?I+69K^@%ml7NTQmT6vIeT~-4O3G%vY34ui zG=-mve#HVRpqzdd?wd0_{M04+YR!-Ua9C%Fgl09Hkcmp2xp;@ov zEAG$n0@+Al=LeP7_M;(BO9H>>s4U@oO0T__d?eq)PsL=vqQ|7h^l0SzH?*Il3LH5C zIx_g{YI-E9I25A|Cr_>ZPkW+_Txt)F#&Ozn0)7}=eSFS45{&t+*3(s*gG zjYNnKtG7OH@|7d+W^Qu%WA8aEehW1%@(2DB^_3lR3Vj>H;m4>SzbNUY_kz{xBm&+E zsq;9gX6k;dgs|;qcTvc<*37Y1-jTf`1$i=Av1hdQCg(q+UYL%{RHT9!)^ys3R3<>b)<;*lt0 zqaS+7$X{`x;|vj-+?S z{KUQYL3p~6*$8XBFWBNGd}%kwa~sEr!o8YA;%Yj?}|ZTrPn8wBsH z(vO(Bpf&X?*osGFH1c7-V-2ZNYPiHR-eT-1^?0q-jBiI@be}KZA(L<2E17?JUaU|5 zv!tP~?ArUqgHN7M?xtii>o|jcnWZvBYYgOc|MLxz>K{@+O)u`Fk-fITaKnG_d*W-J z7kH;V6Xa;nx9;cum$`|L$+4Q=j?zZ#IQS4e=4Bs{-_hq)t$M|t1YM6C`=+)+F{Iks z5W1_jfPFcl^-KHaW}zypT3-#w2kE+trl)t5{0QsO9J-C3yDBHdZQ2hLBW}~)6%RTl zU~?*oW3(RVt|ZRHrfE)I>nv_0Cv&Qsej_<$YFBywnsdMZ*;ZNg9Nc)03YBZ^#d11` zcRQ)iUvNXtj+4(Q9wSPAE4lQiG72m|X8S%VAz!KSz4mlQ@KdP;(83;i=s@xMbc~#; zDLaGpb)V!A39@Q)7k~_#3kY8qg)9Xl&RDY_e ziRd0sp9t9Z5_q6~sOGMh<{HHl+ z4>@q7ML886i1(w|Wsg1A-ak7!Pm&+)GJPP!phJC>{+3c3HE=FIcj-5C68YR<-wOe@ zTIEmYG&+FYQ{U;Zmhy_cjn2KVagOFn1NaojziW?x_DQIZ-1CROz{k}Frw!zrlCOA0 z&-$0W`Q~Uz*^GB{cldpBe93RnX8?{dc}4cqrtTZ^ zT66!%p-cWeU(d;Zlb@sbtbWTy-|~ElBI~hhes1ywrf*d3_SxUT{^aAf+-NcCP9_(P ztq8z9n)}mO(WMTlJkz?I%7>Y&mjKPTXr3e2N76@Culq8uMzI0mH|~|PuKTI49+2RZ zQC`E>ZcSR2VK9EDDSENt)_NeLLaFv zy_kY9Rr`zw_S4+3_TNVS_J>9uHRtPrflV(Gbf~{@7G4L&%VW*Q@a;Rr2j6ME)bs`; zqY>(|rZ$C~RFm&Zw!<^zRC{g{B~$)vSl>s0Sbe{gle>zpCm(mw z4XhnG@G=GaUqpi8ht>?ebc>9o4{03!tO{D5rA|I)`|s$B+HZJL)=BM)TED%7Is(41 zf;`$NaPUy_tJ;G!5~eCl);} zP!^3(d?`SGd~#UcS>H5$T#lZ(52$~o$nWUO0rmJO{x`m`o%~hqJ?&H0_dM{d=@E)g zd8IJ$UwPpN6V`kF==J0a*ZUlvH)^%#W!j6SSBLbxk!vE6ajU$@=uVD~NHDJ5i;UyF z6aDqASdIiDSxa!n^?;HLd553}ccDkOIlAp^rpL~vIlJ9tDC{mCZ{T>x?hf9td(v;& zN78@c{GQzt{MzaXp2_wEZ*gR@7e|6_E807bWzLMB)_IQER=v30qIrrEju9NT`9BvY z{L9f?_`hCoPz&9Q%QqT{hlK?j!jJ)AA}t+wK()k?fy&j_UXT+a6U^;Ui(uNKYp_7%j8hL)D~riWg8=Og&=DD^y<` ze|bjY#&6q}%Cf6Hm|#Thxg3IRu;{Tgc@Au@=@o6GzJv`>U#B$>?UA%$p0ZDS@l1UH zdzj=mWvJTp47#d3Q$6vT>F3J-8K$%5PU0X2Fg-ljL5sLZ|4o@0ly@~JQiIPh^)^k1c&7Q9SeO6#BLgEt8a*aS00m^+9U5!3(+-b?ne6?)c0zw%;Ovdf9O1h2Iz{hPg-+%Ui(w2uUN>K_9JNQGf4lv z2==*$nu+#TX%0P4yN;3n(`TvF+`Xyv9CUW--rU$43!=xV8GB38^USm2Z;#bmR*&XM lIkNoFnuVrT2I4+CPw@-K9FEx>Q!J}}WbQqE|BqO!{{whtCqn=L literal 0 HcmV?d00001 diff --git a/website/index.html b/website/index.html new file mode 100644 index 0000000..cbd2983 --- /dev/null +++ b/website/index.html @@ -0,0 +1,266 @@ + + + + + + Crumbs - Your notes. Your server. Your rules. + + + + + + + + + + + + + + + + + +
+ +
Buy groceries
- Milk
- Eggs
+
Meeting notes
Q3 planning...
+
Project ideas
#startup #saas
+
Remember to
call the vet
+ +
+
+

+ Your notes. Your server.
Your rules. +

+

+ A self-hostable, offline-first note-taking app. The Google Keep alternative that respects your privacy. +

+ +
+
+
+
+
+
+ + +
+
+

Everything you need,
nothing you don't

+
+ +
+
+ +
+

Rich Editor

+

Tiptap-powered WYSIWYG with full Markdown support. Bold, lists, code blocks, and more.

+
+ + +
+
+ +
+

Offline-First

+

Works without internet. PWA with CRDT-based sync means your notes are always available.

+
+ + +
+
+ +
+

Self-Hostable

+

One Docker command. Your data stays on your server. No cloud, no tracking, no nonsense.

+
+ + +
+
+ +
+

Tags & Colors

+

Organize with tags, 12 note colors, and pinned notes. Your notes, your way.

+
+ + +
+
+ +
+

Checklists

+

Built-in task lists with checkbox support. Track to-dos right inside your notes.

+
+ + +
+
+ +
+

Full-Text Search

+

Find anything instantly. SQLite-powered search across all your notes and tags.

+
+
+
+
+ + +
+
+

See it in action

+
+
+
+
Notes grid view
+
+
+
+
Rich text editor
+
+
+
+
Mobile view
+
+
+
+
+ + +
+
+

Deploy in seconds

+

One file. One command. Done.

+ +
+
+ docker-compose.yml + +
+
services:
+  crumbs:
+    image: ghcr.io/bretzel-app/crumbs:latest
+    ports:
+      - "3000:3000"
+    volumes:
+      - crumbs_data:/data
+
+volumes:
+  crumbs_data:
+
+ +
+

That's it.

+

Open localhost:3000, set a password, and start writing.

+
+ + +
+
+ + + + + + + diff --git a/website/styles.css b/website/styles.css new file mode 100644 index 0000000..3739b18 --- /dev/null +++ b/website/styles.css @@ -0,0 +1,654 @@ +@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=JetBrains+Mono:ital,wght@0,400;0,600;0,700;1,400&display=swap'); + +/* ── Design tokens (ported from app) ── */ +:root { + --bg-base: #f0e6d3; + --bg-surface: #faf5eb; + --primary: #C8860A; + --primary-hover: #E8A020; + --text: #1a1a2e; + --text-muted: #6b6272; + --border: #1a1a2e; + --border-subtle: #d4cabb; + --destructive: #a63d2f; + --card-shadow: 2px 2px 0px var(--border-subtle); + --card-shadow-hover: 3px 3px 0px var(--primary); + + /* Note colors for decorative elements */ + --coral: #faafa8; + --peach: #f39f76; + --sand: #fff8b8; + --mint: #e2f6d3; + --sage: #b4ddd3; + --fog: #d4e4ed; + --storm: #aeccdc; + --dusk: #d3bfdb; + --blossom: #f6e2dd; + --clay: #e9e3d4; + --chalk: #efeff1; +} + +/* ── Reset ── */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +/* ── Base ── */ +html { + scroll-behavior: smooth; + scroll-padding-top: 5rem; +} + +body { + font-family: 'JetBrains Mono', monospace; + color: var(--text); + background-color: var(--bg-base); + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +/* Pixel grid overlay */ +body::before { + content: ''; + position: fixed; + inset: 0; + pointer-events: none; + opacity: 0.03; + background-image: repeating-conic-gradient(#1a1a2e 0% 25%, transparent 0% 50%); + background-size: 4px 4px; + z-index: 0; +} + +body > * { + position: relative; + z-index: 1; +} + +a { + color: var(--primary); + text-decoration: none; + transition: color 150ms ease-out; +} + +a:hover { + color: var(--primary-hover); +} + +img { + max-width: 100%; + height: auto; + display: block; +} + +/* ── Typography ── */ +.font-pixel { + font-family: 'Press Start 2P', cursive; +} + +h1, h2, h3 { + font-family: 'Press Start 2P', cursive; + line-height: 1.4; +} + +/* ── Layout ── */ +.container { + max-width: 72rem; + margin: 0 auto; + padding: 0 1.5rem; +} + +section { + padding: 5rem 0; +} + +/* ── Header ── */ +.site-header { + position: sticky; + top: 0; + z-index: 100; + background: var(--bg-base); + border-bottom: 2px solid var(--border-subtle); + padding: 1rem 0; +} + +.site-header .container { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1.5rem; +} + +.logo { + display: flex; + align-items: center; + gap: 0.75rem; + color: var(--text); + font-family: 'Press Start 2P', cursive; + font-size: 1rem; +} + +.logo img { + width: 32px; + height: 32px; + image-rendering: pixelated; +} + +.nav-links { + display: flex; + align-items: center; + gap: 1.5rem; + list-style: none; + font-size: 0.8rem; +} + +.nav-links a { + color: var(--text-muted); + font-weight: 600; +} + +.nav-links a:hover { + color: var(--primary); +} + +.github-link { + display: flex; + align-items: center; + gap: 0.4rem; +} + +.github-link svg { + width: 18px; + height: 18px; +} + +/* Mobile nav toggle */ +.nav-toggle { + display: none; + background: none; + border: 2px solid var(--border-subtle); + border-radius: 2px; + padding: 0.4rem; + cursor: pointer; + color: var(--text); +} + +.nav-toggle svg { + width: 20px; + height: 20px; + display: block; +} + +/* ── Hero ── */ +.hero { + padding: 6rem 0 4rem; + text-align: center; +} + +.hero h1 { + font-size: clamp(1.25rem, 4vw, 2rem); + margin-bottom: 1.5rem; + color: var(--text); +} + +.hero h1 span { + color: var(--primary); +} + +.hero-subtitle { + font-size: clamp(0.85rem, 2vw, 1rem); + color: var(--text-muted); + max-width: 36rem; + margin: 0 auto 2.5rem; +} + +.hero-buttons { + display: flex; + gap: 1rem; + justify-content: center; + flex-wrap: wrap; + margin-bottom: 3rem; +} + +/* ── Buttons ── */ +.btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + font-family: 'JetBrains Mono', monospace; + font-size: 0.85rem; + font-weight: 600; + padding: 0.75rem 1.5rem; + border-radius: 2px; + border: 2px solid var(--border); + cursor: pointer; + transition: all 150ms ease-out; + text-decoration: none; +} + +.btn svg { + width: 16px; + height: 16px; +} + +.btn-primary { + background: var(--primary); + color: var(--bg-surface); + border-color: var(--primary); + box-shadow: var(--card-shadow); +} + +.btn-primary:hover { + background: var(--primary-hover); + border-color: var(--primary-hover); + color: var(--bg-surface); + box-shadow: var(--card-shadow-hover); + transform: translate(-1px, -1px); +} + +.btn-secondary { + background: var(--bg-surface); + color: var(--text); + box-shadow: var(--card-shadow); +} + +.btn-secondary:hover { + border-color: var(--primary); + box-shadow: var(--card-shadow-hover); + transform: translate(-1px, -1px); +} + +/* ── Hero screenshot ── */ +.hero-screenshot { + max-width: 56rem; + margin: 0 auto; + border: 2px solid var(--border-subtle); + border-radius: 2px; + box-shadow: 4px 4px 0px var(--border-subtle); + overflow: hidden; + background: var(--bg-surface); +} + +.screenshot-placeholder { + aspect-ratio: 16 / 9; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, var(--bg-surface), var(--clay)); + position: relative; +} + +.screenshot-placeholder::after { + content: 'screenshot coming soon'; + font-family: 'Press Start 2P', cursive; + font-size: 0.65rem; + color: var(--text-muted); + opacity: 0.5; +} + +/* ── Decorative note cards (floating behind hero) ── */ +.hero-wrapper { + position: relative; + overflow: hidden; +} + +.deco-card { + position: absolute; + border: 2px solid var(--border-subtle); + border-radius: 2px; + box-shadow: var(--card-shadow); + padding: 1rem; + font-size: 0.7rem; + color: var(--text-muted); + opacity: 0.35; + pointer-events: none; + transform: rotate(var(--rotate, 0deg)); + width: 10rem; +} + +.deco-card-1 { + background: var(--coral); + top: 8%; + left: 3%; + --rotate: -6deg; +} + +.deco-card-2 { + background: var(--mint); + top: 20%; + right: 4%; + --rotate: 4deg; +} + +.deco-card-3 { + background: var(--sand); + bottom: 15%; + left: 5%; + --rotate: 3deg; +} + +.deco-card-4 { + background: var(--fog); + bottom: 10%; + right: 6%; + --rotate: -3deg; +} + +/* ── Features grid ── */ +.features { + background: var(--bg-surface); + border-top: 2px solid var(--border-subtle); + border-bottom: 2px solid var(--border-subtle); +} + +.features h2 { + text-align: center; + font-size: clamp(0.9rem, 2.5vw, 1.25rem); + margin-bottom: 3rem; +} + +.features-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); + gap: 1.5rem; +} + +.feature-card { + background: var(--bg-base); + border: 2px solid var(--border-subtle); + border-radius: 2px; + padding: 1.5rem; + box-shadow: var(--card-shadow); + transition: all 150ms ease-out; +} + +.feature-card:hover { + border-color: var(--primary); + box-shadow: var(--card-shadow-hover); + transform: translate(-1px, -1px); +} + +.feature-icon { + width: 2.5rem; + height: 2.5rem; + display: flex; + align-items: center; + justify-content: center; + background: var(--primary); + color: var(--bg-surface); + border-radius: 2px; + margin-bottom: 1rem; + box-shadow: 2px 2px 0px var(--border-subtle); +} + +.feature-icon svg { + width: 20px; + height: 20px; +} + +.feature-card h3 { + font-size: 0.7rem; + margin-bottom: 0.5rem; +} + +.feature-card p { + font-size: 0.85rem; + color: var(--text-muted); + line-height: 1.5; +} + +/* ── Screenshots ── */ +.screenshots h2 { + text-align: center; + font-size: clamp(0.9rem, 2.5vw, 1.25rem); + margin-bottom: 3rem; +} + +.screenshots-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr)); + gap: 1.5rem; +} + +.screenshot-card { + border: 2px solid var(--border-subtle); + border-radius: 2px; + box-shadow: var(--card-shadow); + overflow: hidden; + background: var(--bg-surface); +} + +.screenshot-card .screenshot-placeholder { + aspect-ratio: 4 / 3; +} + +.screenshot-label { + padding: 0.75rem 1rem; + font-size: 0.75rem; + font-weight: 600; + color: var(--text-muted); + border-top: 2px solid var(--border-subtle); + text-align: center; +} + +/* ── Deploy / Quick Start ── */ +.deploy { + background: var(--bg-surface); + border-top: 2px solid var(--border-subtle); + border-bottom: 2px solid var(--border-subtle); +} + +.deploy h2 { + text-align: center; + font-size: clamp(0.9rem, 2.5vw, 1.25rem); + margin-bottom: 1rem; +} + +.deploy-subtitle { + text-align: center; + color: var(--text-muted); + font-size: 0.9rem; + margin-bottom: 2.5rem; +} + +.code-block { + max-width: 40rem; + margin: 0 auto 2rem; + background: var(--text); + color: var(--bg-surface); + border: 2px solid var(--border); + border-radius: 2px; + box-shadow: 4px 4px 0px var(--border-subtle); + overflow: hidden; +} + +.code-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.75rem 1rem; + background: rgba(255, 255, 255, 0.05); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + font-size: 0.75rem; + color: rgba(255, 255, 255, 0.5); +} + +.copy-btn { + background: none; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 2px; + padding: 0.25rem 0.5rem; + color: rgba(255, 255, 255, 0.6); + font-family: 'JetBrains Mono', monospace; + font-size: 0.7rem; + cursor: pointer; + transition: all 150ms ease-out; +} + +.copy-btn:hover { + border-color: var(--primary); + color: var(--primary); +} + +.code-block pre { + padding: 1.25rem; + overflow-x: auto; + font-size: 0.8rem; + line-height: 1.6; +} + +.code-block code { + font-family: 'JetBrains Mono', monospace; +} + +.code-comment { + color: rgba(255, 255, 255, 0.35); +} + +.code-key { + color: var(--primary-hover); +} + +.code-string { + color: #b4ddd3; +} + +.deploy-thats-it { + text-align: center; + margin-bottom: 2rem; +} + +.deploy-thats-it .font-pixel { + font-size: 0.8rem; + color: var(--primary); + margin-bottom: 0.5rem; +} + +.deploy-thats-it p { + color: var(--text-muted); + font-size: 0.85rem; +} + +.deploy-cta { + text-align: center; +} + +/* ── Footer ── */ +.site-footer { + padding: 3rem 0; + border-top: 2px solid var(--border-subtle); + text-align: center; +} + +.footer-brand { + font-size: 0.6rem; + color: var(--text-muted); + margin-bottom: 1.5rem; +} + +.footer-links { + display: flex; + justify-content: center; + gap: 2rem; + list-style: none; + margin-bottom: 1.5rem; + font-size: 0.8rem; +} + +.footer-version { + display: inline-block; + font-family: 'JetBrains Mono', monospace; + font-size: 0.7rem; + color: var(--text-muted); + background: var(--bg-surface); + border: 1px solid var(--border-subtle); + border-radius: 2px; + padding: 0.2rem 0.6rem; +} + +/* ── Animations ── */ +@keyframes fade-up { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.animate-in { + animation: fade-up 400ms ease-out both; +} + +.delay-1 { animation-delay: 100ms; } +.delay-2 { animation-delay: 200ms; } +.delay-3 { animation-delay: 300ms; } +.delay-4 { animation-delay: 400ms; } +.delay-5 { animation-delay: 500ms; } +.delay-6 { animation-delay: 600ms; } + +/* ── Responsive ── */ +@media (max-width: 768px) { + .nav-links { + display: none; + position: absolute; + top: 100%; + left: 0; + right: 0; + background: var(--bg-base); + border-bottom: 2px solid var(--border-subtle); + flex-direction: column; + padding: 1rem 1.5rem; + gap: 1rem; + } + + .nav-links.open { + display: flex; + } + + .nav-toggle { + display: block; + } + + .hero { + padding: 4rem 0 3rem; + } + + .deco-card { + display: none; + } + + section { + padding: 3.5rem 0; + } + + .features-grid { + grid-template-columns: 1fr; + } + + .screenshots-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 480px) { + .hero-buttons { + flex-direction: column; + align-items: center; + } + + .btn { + width: 100%; + justify-content: center; + } + + .code-block pre { + font-size: 0.7rem; + padding: 1rem; + } +}