From 03a47e8bfd4518ecb5357ee4ecfcce36ddbc5d3e Mon Sep 17 00:00:00 2001 From: andrewmuratov Date: Thu, 1 Oct 2026 11:21:54 -0400 Subject: [PATCH 01/16] feat(platform): add registry-driven site roles Co-authored-by: Codex --- e2e/site-roles.e2e.ts | 63 +++++ public/campuses/utm/og-card.png | Bin 0 -> 46774 bytes public/campuses/utsc/og-card.png | Bin 0 -> 47625 bytes public/campuses/utsg/og-card.png | Bin 0 -> 47234 bytes public/og-card.png | Bin 44924 -> 50123 bytes public/og-gapwise.png | Bin 44924 -> 50123 bytes public/sitemap.xml | 6 - scripts/build-seo-pages.ts | 91 ++++--- scripts/check-seo-output.ts | 24 +- scripts/generate-social-cards.ts | 30 ++- src/components/MarketingLandingImpl.tsx | 154 +++++++++--- src/components/marketing-landing.css | 67 ++++++ src/routes/__root.tsx | 26 +- src/routes/_app.index.tsx | 14 +- src/routes/_app.tsx | 95 +++++--- src/universities/registry.ts | 127 +++++++++- tests/auth-branding.test.ts | 3 +- tests/ecosystem-consistency.test.ts | 31 +++ tests/marketing-home.test.ts | 8 +- tests/seo.test.ts | 51 +++- tests/universities.test.ts | 30 ++- universities.json | 308 +++++++++++++++++++++++- vercel.json | 104 +++++--- 23 files changed, 1024 insertions(+), 208 deletions(-) create mode 100644 e2e/site-roles.e2e.ts create mode 100644 public/campuses/utm/og-card.png create mode 100644 public/campuses/utsc/og-card.png create mode 100644 public/campuses/utsg/og-card.png diff --git a/e2e/site-roles.e2e.ts b/e2e/site-roles.e2e.ts new file mode 100644 index 00000000..fc411e12 --- /dev/null +++ b/e2e/site-roles.e2e.ts @@ -0,0 +1,63 @@ +import { expect, test } from "@playwright/test"; +import { watchForAppFailures } from "./helpers"; + +test("global homepage presents the multi-university Gapwise ecosystem", async ({ + page, + baseURL, +}) => { + test.skip(test.info().project.name !== "chromium"); + if (!baseURL) throw new Error("Playwright baseURL is required"); + const failures = watchForAppFailures(page, baseURL); + + await page.goto("/?site=gapwise-global"); + await expect( + page.getByRole("heading", { name: "Your university day, connected." }), + ).toBeVisible(); + await expect(page.getByText("14 supported universities")).toBeVisible(); + await expect(page.getByRole("link", { name: /Find your university/ })).toBeVisible(); + await expect(page.getByText("For University of Toronto", { exact: true })).toHaveCount(0); + await expect(page.getByText("This edition", { exact: true })).toHaveCount(0); + await expect(page.getByRole("button", { name: /Search campus and classes/ })).toHaveCount(0); + failures.assertClean(); +}); + +test("University of Toronto hub links to three distinct campus editions", async ({ + page, + baseURL, +}) => { + test.skip(test.info().project.name !== "chromium"); + if (!baseURL) throw new Error("Playwright baseURL is required"); + const failures = watchForAppFailures(page, baseURL); + + await page.goto("/?site=uoft-hub"); + await expect(page.getByText("Gapwise for University of Toronto", { exact: true })).toBeVisible(); + await expect(page.getByRole("button", { name: /Search campus and classes/ })).toHaveCount(0); + for (const [name, host] of [ + ["University of Toronto Mississauga", "https://utm.gapwise.ca"], + ["University of Toronto St. George", "https://utsg.gapwise.ca"], + ["University of Toronto Scarborough", "https://utsc.gapwise.ca"], + ] as const) { + await expect(page.getByRole("link", { name: new RegExp(name) })).toHaveAttribute("href", host); + } + failures.assertClean(); +}); + +test("U of T campus editions retain campus-scoped import experiences", async ({ + page, + baseURL, +}) => { + test.skip(test.info().project.name !== "chromium"); + if (!baseURL) throw new Error("Playwright baseURL is required"); + const failures = watchForAppFailures(page, baseURL); + + for (const [campus, name] of [ + ["utm", "University of Toronto Mississauga"], + ["utsg", "University of Toronto St. George"], + ["utsc", "University of Toronto Scarborough"], + ] as const) { + await page.goto(`/?campus=${campus}`); + await expect(page.getByText(`For ${name}`, { exact: true })).toBeVisible(); + await expect(page.getByRole("button", { name: "Import ACORN" })).toBeVisible(); + } + failures.assertClean(); +}); diff --git a/public/campuses/utm/og-card.png b/public/campuses/utm/og-card.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1039c6b98a77d19cb4a913b68d2b3a674433fb GIT binary patch literal 46774 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 C7(}7~ literal 0 HcmV?d00001 diff --git a/public/campuses/utsc/og-card.png b/public/campuses/utsc/og-card.png new file mode 100644 index 0000000000000000000000000000000000000000..7073e65fffbf3de98209a21a51e848f2796b5968 GIT binary patch literal 47625 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 XKHgNkT96|E{JVV7{6f)r$ld<~GI=X@ literal 0 HcmV?d00001 diff --git a/public/campuses/utsg/og-card.png b/public/campuses/utsg/og-card.png new file mode 100644 index 0000000000000000000000000000000000000000..47739cb13decb5996e7b2b3af042ddcee7fccf92 GIT binary patch literal 47234 zcmeFZXIK;1);26C7ElnSNCy$=peP_+KtQGUBE5)o=_L?QM3ml<4$^z?5D+N=ga`|cLHDEe0TF5!P$%FqnJgmd{Dn@{pFJDph)@Q z&$6a6IzyxpvZ1-G8FAFI;hu(V3dK}fe^@UQ)gH|+Iy(IUn;uOf#vY6&l{KsGm#@+^ zQ%IBE2_U#^dgknn_A}@I^v5FE*0EUsgJ|5u!UVN(rBpKPj?YB0(@0k0rDr{LJy85BZ7MF0lcDc`P)Q?Om&)9F9;mBC(aMvk$!{p?2o4@t> z?2*wCqnfT!n{KIbTNey_A}e1UvFJRHm5mA{9H3WgCnRIIh{sr?StUQs20pT1p2SzneoQHEl}HyMFlmkozn}#U1Ik?~Z*Ab5BN7WkXH0myWX6|d*SMx1OH-rE{)g308OqSZ zjMLgsN$kvN#bn*Kub|VX&7x zO53O{tK0QqRN$Q(nE_U?EAM_Te2<#gt~ou=s}Jiy+8vB!oEEt=s7h|j^jY-5lk9QI zgYwfy?W|?n2IlTM++&Vv87J#x`mH*g4ZZJpoo{BxS2;B2DM%e{50y(E+_%FXm!EF? zkBV*h7w|Rh5DP+|W^XR1Fkc|Dad}8U!t8eKM*BlX+7}-L6AI!9^#$iq8$*p4 zAafd!$&V{7R~Opj2#EE@vrnBJ0|<2-sVgiy<0)d4OzOil`o>%*tiNAuez~-K(F?V| zKZ5wy?I4CRr^Q|KPa&2`_>=Qa2;8yXIS1K^T_IC&=%O}(=KAb0bZob8M-Gax>NsAMlUeoy24)?&hn-JlKux6X*H5p;Jqi^H%sq7AptU;ArcGfZmZoCwF` zJ_4eWcds~Bg$%m#9h}Kiw9TFbZK7{)abGZ3S!=B1s#7-c;vJ41l(9+J-M{Gz1Q=3<$_=ZpCcX^6mKA&m!KNLVei{i zxs<@tC@Z59k3omYP)@9P4BY91_`p3KPozp{Q-lB%)krIF?l>1YbN_?|{zR=^U?b>G zEZF_{{DdpsYU`90WwVf!P4pKX0!8^`BbS5G?hOR^!8s>QX*f6uZu6na{)@<u7al8;Duds7J1NN)&hXF-!XI=6GD3=P|pi~uo#Z86OCU@J8 zs;BVRqK&nL3crcF6d0~mL+bN==LZC#s7KJnOy95KNR_D`pBruKhVKU@4vS`ScN^rS z{g08S1&EVh3cKA?8->fpzSyRt(jZ8&3;Gs186jb=hI3v18BGQ4K~M?jXvH}xJKon^z9l|GxJ!t_pL z%D{LmzjYGL@NO$itQVS?y0p@uDsl8tba$tE4MCqInG&b%rapgLcpU9urJqpEg98_N4rva5>j@tiw{P8>Ir_y~iay#f z@uT0bUE%R$K1djP1T|4?jv*GzbxvqH*lQjolR8;YBv6dtROH!LZ;842%pEKFswU8I zIZQTE%@YIp9$-#K#B(_RI%*Nbg>$Szj*VzS>7L}Q?(!6PB>m5|IDO}@F5u3SI3sXm z-X{UK&Alla@bSF>!_F9OF6cH!gN(l;ee`o>9 zlV0NU!Vte{Z-lQXvepID-JTKKSLSZpm3(DynTx+CnjhT)MO zjvNPZ0J|;z%Wl~t@8s60T{fgf@S!+5aQGy+X>Y=2{BC!-*eZ)0JAY`tV#{fNq!v>2 zUbA#W#_$XNhSk~tHcd));V(7Fps0^wJPVU!HD}WHSNu6ttyJekFKU2gIdrZu%;$F0=0mzKkEkku~h zXX-LMh`j-pk7?$EdrgmZQL!|94@$_nJfyW;Ubgu0{)h+p{(fxY zgv0gD>S58j+Exs8H)O+K54Tu8Yiraj&b}3`4S*15SJtNkPjths)qgS+ajXgDWh~I+D_%a&&2KhNnA=A2}py?jI--6{r zrumuxQZo0a)nQXMBXXm4U?ez4%6Bt&b;9%A<`KN+qFqsxAiX7)p=~Vb<+ZKXzUx7W z;5_AA9&bLjZmp{G@QfK^Q=$Iq#0@<A$i0qFbam@B4u?i(+HmWB zdyk2v%JtKWt*lFkOZ1d~E`!^#L!zf?O<&}0#HO?SSX^w&Dj3N>5b@w}91i7Ug-c66 z#ODNQ!!C*24SZKS>FSC*u8A^_I3%Lg^$czJ;p=18&e%)csRyG$M{wXxCnkSy9%uX_c%|&bZzS z2jwv5I#*2>__xtJlodI8ylr-?Ni^ae88&^m;4o5OJD>L^(5*s=++jB zfvZs(WGB3{nwhn|bw_NAC~gJ93|4;86@>5CL$IQ9G~ug9!GoW|%Q#jgjpKLHRib%1 zS%{QuSZ#_k2U+Y&SH|s4Xuf=mJGf?y)N243HGEb!jzsT$R7WgR_IL|bMTCgi`wdq0 zYnn=s9hx;C2{sz<`8`9&d?omcoAo4|Xo@~J5*L-a2MB;XLQ}NSJSuss9fh(BL?u4~v}#Oz_MOAU0l&)CtHIEVz4<~c4JV{=ek^FjZ zf$oT(G3;Oa(IiLBsf;U_rB&LdAI1Qd@+g>^Pa+ zItiAGl56BCu{X+z_0Ei@#?E~}ogb#UKymLvBgDp)>aMoPqCJw2yZfj)%^eoh@}>78 z8H(&lJ<7d&6Y`6-L!k3U_mq#E8RVy{rK|6qY~udf+p1asFiej*i|88zxyH zK31pj<7D94+}oAZMNPL7nliBE$6~96M&3)DypA7beKQk!w^)*pZ&@^!O=WPO(v3T( zBOYF|ds7&|=8T$oR&CH8W8>4*T(3qleWWoM7Gh)=tAGQ9HYyQVUKt>S;KG@1C-QU)oEok0=sFfNvt1H{2=8AUNg^$M- zP8zRgpM3uuCS`(mIOpFSZqmJIl#5DBMSpp!MsmWr%y#v}Jw8?5#$R+XQ|YlIszz?~ z+Z7MGLzfftB*_Mqe#>STT%pdJT*sze6>w{?632Rj3wK8P+e%2-#NMMIr=M3rde#s_ zG(X0JH++o`2}x0sjy?6?OfOz*IbM&PAu$&~@g$PywH+>K_GIUjwXRShduA)#^Rq3m zbOMtjesG<2=~A1m@7bz{&&L6F@j#CZM6NyOv{UIV2vDB#EL`Ls8%KnR^W%|d)7&K8 z=yim6`N{sG2_d)Xz_XVv%S7Y30iG+A$O4cJ#*zH|jfsZPT8Twue`Tbh*Xzv_ej|9Y z@34-e#agEgh{r~1?S0{dW1RguUOp!Re$ltE71+AwZ%M_-DLOs4)@tU)%1;Z`Vc2sT zzf^7$o@)!4%$a}>2)R>M)N8jR-{MAx=|5O};E3P_zcl!)Oui@CY@OGQ!RpIvBek@e zNw1lYjK*~~Gfg8XnF+IqG5*uj{gv50H`a+l`%dXtLuCa;V^baD$u>YA)NFC1)!jEF z;4cW!^Rve~X^<7WI4{na;;yx+o8-#V1y- zhe!2N$EcI3D(5K`d<9>8GGOzVKo5I}r&Z<=RMMoxGU@n~A5ll8>UpiQGJoIo#7v=? zZu6e^6+1H`+nY;G1)O$;2hQu`pp%Yg??7aeU>@(cJvW?N`*r0K)6+8;CQ3I7EU1c`_asa= zyoxm2V;DHyC$&SY6%)!|YI8t-R_50X);eyJ&K}aW1rmHVhI!8 z_`d(1ONPBB(Av5(9lFL}a@@p36K`vdQ+iELvG4?c#U5DRk5w6Z_|Y%72V)&-QB(vC zEOt%Uv$>yMZ5TN$d2gDM5^d!cQ16s6sk^5>de6gFWbLbW#b&CUM9Z2e`{$L`)MxUe zaPt}IH&bM>TUq>Ych;PDyQo=zx3u|SCVx>h5l>RzsAt9YP&}xah8ZjKAd>lF(kmsO z7A$FF6K|HisjgQ zH5Kx+VDpt9Uo1bX64v^h$W>4}f4rR4AOl#CF)n&HT9>$d*M7&hj)T-rFRDCwz}D%> zAiD6kw>{-@yrfi@d6-rmZy8s=KUA(W8xaY0f!93XXBt~Q^iCOW287+&BW9Xz6nXCB zr9DYY_M7#Z6fG1LIhi8Q&0EnBF;HgKAUM0o*_WeMK0sA1Vs`zGeK`_{#_gmpt@;9=r$uPP9(9ddl}+X~BpxNA9@W%06?=Uq6JCiA82yS_$ z<>J!J0C&@8>g~iP1l)Ivrutu)O39u${^TLZobtaVbCT!X%L3>JKRz>}-)?U3ZOsa| zkPCYpC0Qi3h$)+K8QoRj7|C?NdR5QT23z4D$0h)c@v}IY@sO2knX&e9bE{?6aTrdnWo)ey|?J?rXXUz5!a)jauVDmOyFLD0@5xbAzMSQF- znv$G0WoCaAx7gMF9ohZ#eBVo)mm6(TLN0OdAYry{!bW$=d46uFKGStaFRldY zJCwije%2l{WbJo8qQaA1?8UI#k#8{K*^BbcC@vv~*<5%2Bq~j8alr2WNMYz5mHeEO z-KmY*L5y49L}+=-kHhiLJxWU6;`)yyM_$l#-m>CK?H$xA3?Vxk9PaKnz=S&#F570Z zB(PhY3^%}V@tap=kL@G{Ll`Spgcedok-lRSDdHIrP{0~2C)lV>e2I?5pQji&PbUIJ znM3=up+xDRV~nROt|~Tjz0qxKU6B-UXGew|#NvQ7aXDjP(o=!A!H!>CLOM{M0I4~*_S0q8PI1{Ml z=~{nzTW)LNtHDE4fmLpRkM*es$od70b`BDaHHD{rn{i6LDtT2uWUjJCT3Sn`+3i@6 zKd;Pmb*!B8WNbN)k3;W490GO5gZ&EDZ~P}miLf0bV;PV812rn8J7{NqW-RTvv#cOVn*kH?Qqbc0OzbdLRm7>SXQ+_u++wfx2 ziSQmD>$K$l&+G1h zWE^L`IKB2di7V%E0>)a9np!09_wx*qC*U6P>|G{U3HIOLWVb-GZPYrE&9?(lq+C5{Gy_)z04F!wXD)!-*X+6!G)5t+M#g zS!-Cea#Ek+Z-ymT8B?(1PKU1NmKc{av9R9wyoUuS>lNk^0kJ#p;wcaLUKE%#xCyo`kZ`w7T@1UrTXZmV)D^I!qez$+tyHc$nsL#pV@1SmOo--=+ZTeK=)_{BHe{*esi>32bgT{Y z3RGw8)YimcVvfElC2h(MFmc#g7bZ7?V%JF6p3MC1bb^T=8uDLiwcjaGs!R&ovy5=# z)@E@RiS;hjT_-AeK~)hWdl+Mu%|0$h^i&!Rm_)zt2rR~P!`02_wCZ9?_eW%Xu2fm3I;6Z_WfWEgBMVj}CrOp!X|5UFdHLuDVyAfxzM$SJ^j@FXi(f zC3`@3WswsEp)X?p-eNDDN;tH*o-~PStgOYZdmBzT?HKXw8>Zc9@V%+4nxR;?HeLK) zQuKtbw=Sfqu&mrmHdaC-st#LU+Uh%k?X_;(c5|emWaTGcnXAlCC#ea*b0vOEQ0U`u zb5JtOZ-3SVtt98?#;RtZ7G%Vz}7;x<(y#^3^X<=}R=gsxoFT(Bij9DDiAfxT@*`A{ki9pz42 z9bN3pX<8exRpe+p7~NAq=hP^RZ%e?$=Rset-)pAwdcL=4@S1Ni1R>xjF|u66ux$9@ zp4~CIjxnCUhzL?5`oPKBHF(B5P@KDnd8v{1jO-b7G3hIh4 z0%VzLUEc+C>o@Wh*E`$4Si}9)h+SBo=M(YJ3~%%V4;N5ZNFIG=^0VPj<8*b*ztbl? z4jeXR{&WeO(aebRJnro`I3AqNrfP&{#kDjws(459mVY^xi|Qpz==|8F_$|@@U~>E( z3x9W&?29J5%i9HgS}Y_J!5AlMYU$1nbREmF+Zs^=R1tBhA74DvfBst5k`kgid+kM5mVLXu zClOEH)wfV$vz36)!;Gp*UUw-o>PCltN_O~>TAtI$E7XGW-C@il9FvaCgEV0mqF(ob z9^$uj!ZOW3E za>jbHcAMWHSLdByD0x<)0oHA8;w2}Bo!~KL8|#db$uwcTKHXiHww&K8>CLEYs9Q!^ z(dm~*PU8?1)_va(BTX^I#@DjoGFz4nYA6i4VfC<8zn7AT=QM#nO0Yh4;kZk8_N!#@ zx@d?>AYsD6Noa*Qo=+#e$+fP%Q8;c&owlm6L8~>nan-Xc`f@hp;;AdMi07!hAK4R3 zp<|4-Dx16Ji{&$==yd}CO9$`-BUOdv4;|D|LhW6AwJivlAv_{N^tLJ$NIj?l2{f|> z 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�|yUrTj0yGc%M3Ny0Zqj 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

w(3HEd zV7r-C+FHo|__f(!6T^nDoUT6)7$`9hg2$uO0$myw7TX6;R&F|0S>tdd=kiW51N?v+ z@PVA7Eb*suD=Q>-IPh)P&TEQB!AeH6(FlJV}O}y}-RyBRG zLvuQec3G##1Jpyv`%9BgHmj?}llwBQmbplYrFQDBhIzXzT1ejFLIy_T)_GjAcsEa& zbwGN)i?wwxKx$ZeZ*Y=X))jUpd9JO;fcoMg5Z9Fx-wQv{+|7C;!3>`;QnhsmR@!K| zWOvmEbBEJNS0-+v>%3>*vv+tH;BSe4SHx(o>@JFTSvK2_ib(N*e>!~Y%m;zn)#U5B zf;aMx*G{Uii`H$)Vs%dlyxJK5d+_gOyco@;56z1RSLLbAAf~%l&+5FL%4z^Wq&4=n zvSaxoWJfp zgpIx^Wkv{?25XrLC({n0s8y-)LP(slK!eS zxNX-OPKy}RI3wE)U1<9%@l_b+tg^W8WCo>izEOUz(?(aQ=HUtDm_6zx#wTT+4C`kZ z&B8s&pm)FC#EEW-olVbuFSYL~s|28gD5@axYF@gi$RbY+P*Ad)gZ1#UbSH4`!g zib!a52c~oLMs?n#({h>KF4=dZY?g@i9w|58bobX3HT##HxR&%%87(zr(!(oS%FrZx zB~wCrM1_^Oo485EDZ%+#b*D>@;&M9+hG-1~akVeU~}1B)PCbRWW34$j(tEOP$fv&8Kl!VIUSY z8TqNA-R5_}|6as4LH+CV2ftfgsFS>VzUR+(J}!TIXxGy3c5a(!2k+fvL2HS^z1^E; zG~iY{>mz^CIc}qYC?9A_{nf#>(Bbu!v8#}NB5TgNK(Ah%iPqY6my4_eW3Ky+f zokm|qm{VsO#cK1fZ?D*+^;*CfHLFYIsc*)uF@)uxyO8tSK3F-C!`sc_rel8;QHCm0 zwTITBCfll4s_ye(G?tgJRUf46^HjTU^oX$)-8^8tp)46SUtMCRS^#23rEmrUV literal 0 HcmV?d00001 diff --git a/public/og-card.png b/public/og-card.png index b6ea8f52ab2dc8a56e2a44b59a7d62282cab9db1..061953cce02162d10289c799508ddd5496760966 100644 GIT binary patch delta 20129 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 Z->D%t|6bqYj12e(vcZ0;IvH^L{{n)nCm;X- delta 14482 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 Z->D%t|6bqYj12e(vcZ0;IvH^L{{n)nCm;X- delta 14482 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://gapwise.ca/about https://gapwise.ca/universities https://gapwise.ca/open-source - https://gapwise.ca/utm-timetable https://gapwise.ca/campus-map https://gapwise.ca/gap-planner https://gapwise.ca/campus-routing - https://gapwise.ca/acorn-import - https://gapwise.ca/places - https://gapwise.ca/places/davis-food-court - https://gapwise.ca/places/utm-library - https://gapwise.ca/places/rawc https://gapwise.ca/developers https://gapwise.ca/ai https://gapwise.ca/support diff --git a/scripts/build-seo-pages.ts b/scripts/build-seo-pages.ts index 200b031d..f6f18193 100644 --- a/scripts/build-seo-pages.ts +++ b/scripts/build-seo-pages.ts @@ -1,4 +1,4 @@ -import { mkdir, readFile, rm, writeFile } from "node:fs/promises"; +import { copyFile, mkdir, readFile, rm, writeFile } from "node:fs/promises"; import { dirname, join } from "node:path"; import { PUBLIC_FEATURE_PAGES, editionFeatureMetadata } from "../src/content/public-feature-pages"; @@ -36,7 +36,7 @@ export const UOFT_CONTEXT: UniversityContext = { id: "uoft", name: "University of Toronto", shortName: "U of T", - origin: SITE_ORIGIN, + origin: "https://uoft.gapwise.ca", routable: true, }; @@ -74,8 +74,11 @@ const UOFT_CAMPUS_EDITIONS = [ ] as const satisfies ReadonlyArray<{ campusId: string; context: UniversityContext }>; function socialImageUrl(uniContext?: UniversityContext) { - const origin = uniContext?.origin ?? SITE_ORIGIN; - const id = uniContext?.id ?? "uoft"; + if (!uniContext) return `${SITE_ORIGIN}/og-gapwise.png`; + const origin = uniContext.origin; + if (uniContext.campusName) + return `${origin}/campuses/${uniContext.shortName.toLowerCase()}/og-card.png`; + const id = uniContext.id; return `${origin}/universities/${id}/og-card.png`; } @@ -270,9 +273,7 @@ function homepageStructuredData(page: SeoPage, uniContext?: UniversityContext) { const websiteId = `${origin}/#website`; const appId = `${origin}/#app`; const founderId = `${SITE_ORIGIN}/#andrew-muratov`; - const isDedicatedTenant = Boolean( - uniContext && (uniContext.id !== "uoft" || uniContext.campusName), - ); + const isDedicatedTenant = Boolean(uniContext); const uniName = isDedicatedTenant ? uniContext!.name : null; return { "@context": "https://schema.org", @@ -365,19 +366,17 @@ function homepageStructuredData(page: SeoPage, uniContext?: UniversityContext) { } function metadata(page: SeoPage, uniContext?: UniversityContext) { - const effectiveUni = uniContext ?? UOFT_CONTEXT; - const origin = effectiveUni.origin; + const origin = uniContext?.origin ?? SITE_ORIGIN; const canonical = canonicalUrl(page.path, origin); const title = escapeHtml(page.title); const description = escapeHtml(page.description); - const socialImage = socialImageUrl(effectiveUni); - const socialImageAlt = - uniContext?.id === "uoft" && !uniContext.campusName && page.path === "/" - ? "Gapwise — University timetable and campus navigation" - : `Gapwise — ${escapeHtml(effectiveUni.name)}`; + const socialImage = socialImageUrl(uniContext); + const socialImageAlt = `Gapwise — ${escapeHtml( + uniContext?.name ?? "University timetable and campus navigation", + )}`; const schema = page.path === "/" - ? `\n ` + ? `\n ` : ""; return ` @@ -456,9 +455,7 @@ function fallback(page: SeoPage, uniContext?: UniversityContext) { ) .join("\n"); - const isDedicatedTenant = Boolean( - uniContext && (uniContext.id !== "uoft" || uniContext.campusName), - ); + const isDedicatedTenant = Boolean(uniContext); const disclaimer = isDedicatedTenant ? `Gapwise is an independent student project for students at ${escapeHtml(uniContext!.name)}. It is not an official service of ${escapeHtml(uniContext!.name)} and does not claim university approval, sponsorship, or endorsement.` : `Gapwise is an independent student project for students across supported Canadian universities. It is not an official service of any university and does not claim university approval, sponsorship, or endorsement.`; @@ -477,6 +474,16 @@ function fallback(page: SeoPage, uniContext?: UniversityContext) { ` : ""; + const uoftCampusesSection = + page.path === "/" && uniContext?.id === "uoft" && !uniContext.campusName + ? `

+

Choose your U of T campus

+
+
` + : ""; + return `

Gapwise — Timetable & Campus Navigation

${escapeHtml(page.heading)}

@@ -484,6 +491,7 @@ function fallback(page: SeoPage, uniContext?: UniversityContext) {

${escapeHtml(page.detail)}

${page.path === "/" ? '

Gapwise was created by Andrew Muratov. Gapwise is open source on GitHub.

' : ""} ${universitiesSection} + ${uoftCampusesSection} ${sections}

${disclaimer}

@@ -545,6 +553,9 @@ const UNIVERSITY_COMMON_PATHS = new Set([ "/accessibility", ]); +/** Institution-neutral pages published by the global ecosystem site. */ +const GLOBAL_PUBLIC_PATHS = UNIVERSITY_COMMON_PATHS; + function getUniversityPage(page: SeoPage, uni: UniversityContext): SeoPage { if (page.path === "/") { return { @@ -614,17 +625,10 @@ const baseHtml = await readFile(distIndexPath, "utf8"); for (const page of PAGES) { const destination = join("dist", outputPath(page.path)); await mkdir(dirname(destination), { recursive: true }); - await writeFile( - destination, - renderDocument( - baseHtml, - page.path === "/" ? page : getUniversityPage(page, UOFT_CONTEXT), - UOFT_CONTEXT, - ), - ); + await writeFile(destination, renderDocument(baseHtml, page)); } -const expectedSitemap = renderSitemap(); +const expectedSitemap = renderSitemap(SITE_ORIGIN, GLOBAL_PUBLIC_PATHS); const committedSitemap = await readFile(join("public", "sitemap.xml"), "utf8"); if (committedSitemap !== expectedSitemap) { throw new Error("public/sitemap.xml is out of sync with the production SEO page inventory."); @@ -637,13 +641,23 @@ await writeFile( // Write U of T tenant entry point and sitemap/robots const uoftTenantDir = join("dist", "_universities", "uoft"); +const uoftTenantSeoDir = join(uoftTenantDir, "_seo"); await mkdir(uoftTenantDir, { recursive: true }); -const uoftHomeHtml = renderDocument(baseHtml, PAGES[0]!, UOFT_CONTEXT); -await writeFile(join(uoftTenantDir, "index.html"), uoftHomeHtml); -await writeFile(join(uoftTenantDir, "sitemap.xml"), expectedSitemap); +await mkdir(uoftTenantSeoDir, { recursive: true }); +for (const page of PAGES.filter((candidate) => UNIVERSITY_COMMON_PATHS.has(candidate.path))) { + const html = renderDocument(baseHtml, getUniversityPage(page, UOFT_CONTEXT), UOFT_CONTEXT); + if (page.path === "/") await writeFile(join(uoftTenantDir, "index.html"), html); + else + await writeFile( + join(uoftTenantSeoDir, `${page.path.slice(1).replaceAll("/", "--")}.html`), + html, + ); +} +const uoftSitemap = renderSitemap(UOFT_CONTEXT.origin, UNIVERSITY_COMMON_PATHS); +await writeFile(join(uoftTenantDir, "sitemap.xml"), uoftSitemap); await writeFile( join(uoftTenantDir, "robots.txt"), - await readFile(join("public", "robots.txt"), "utf8"), + renderRobotsTxt(`${UOFT_CONTEXT.origin}/sitemap.xml`), ); for (const { campusId, context } of UOFT_CAMPUS_EDITIONS) { @@ -709,16 +723,25 @@ for (const uni of universitiesManifest.universities) { universityCount++; } -// Remove root files so they cannot shadow host-specific rewrites on Vercel +// Preserve the global cards under a private output path before removing the public +// copies, so host-specific rewrites cannot be shadowed by Vercel's static-file lookup. +const globalAssetDir = join("dist", "_global"); +await mkdir(globalAssetDir, { recursive: true }); +await copyFile(join("dist", "og-gapwise.png"), join(globalAssetDir, "og-gapwise.png")); +await copyFile(join("dist", "og-card.png"), join(globalAssetDir, "og-card.png")); + +// Remove root files so they cannot shadow host-specific rewrites on Vercel. await rm(join("dist", "index.html"), { force: true }); await rm(join("dist", "sitemap.xml"), { force: true }); await rm(join("dist", "robots.txt"), { force: true }); await rm(join("dist", "og-gapwise.png"), { force: true }); await rm(join("dist", "og-card.png"), { force: true }); -const uoftPageCount = PAGES.filter((p) => p.sitemap).length; +const globalPageCount = PAGES.filter( + (page) => page.sitemap && GLOBAL_PUBLIC_PATHS.has(page.path), +).length; console.log( - `Generated ${PAGES.length} crawlable Gapwise HTML entry points and ${uoftPageCount} U of T sitemap URLs.`, + `Generated ${PAGES.length} Gapwise HTML entry points and ${globalPageCount} global sitemap URLs.`, ); console.log( `Generated per-university sitemap + robots.txt for ${universityCount} university editions: ${Object.entries( diff --git a/scripts/check-seo-output.ts b/scripts/check-seo-output.ts index 7a1db4ee..8845454b 100644 --- a/scripts/check-seo-output.ts +++ b/scripts/check-seo-output.ts @@ -80,11 +80,13 @@ for (const rootFile of [ } const [home, sitemap, robots] = await Promise.all([ - readFile("dist/_universities/uoft/index.html", "utf8"), + readFile("dist/_seo/index.html", "utf8"), readFile("dist/_seo/sitemap.xml", "utf8"), readFile("dist/_seo/robots.txt", "utf8"), ]); +await Promise.all([readFile("dist/_global/og-gapwise.png"), readFile("dist/_global/og-card.png")]); + for (const needle of [ 'https://gapwise.ca${path}`, "sitemap"); } +for (const institutionSpecificPath of ["/utm-timetable", "/acorn-import", "/places"]) { + rejectText(sitemap, `https://gapwise.ca${institutionSpecificPath}`, "global sitemap"); +} + for (const privatePath of ["/today", "/timetable", "/gaps", "/oauth/"]) { if (sitemap.includes(`https://gapwise.ca${privatePath}`)) { throw new Error(`private/stateful path leaked into sitemap: ${privatePath}`); @@ -486,10 +494,7 @@ for (const uniId of ALL_UNIVERSITY_IDS) { .replaceAll(">", ">") .replaceAll('"', """) .replaceAll("'", "'"); - const expectedAlt = - uniId === "uoft" - ? "Gapwise — University timetable and campus navigation" - : `Gapwise — ${escapedName}`; + const expectedAlt = `Gapwise — ${escapedName}`; requireText(html, ``, `${uniId} og:image`); requireText( @@ -512,10 +517,7 @@ for (const uniId of ALL_UNIVERSITY_IDS) { ``, `${uniId} twitter:image:alt`, ); - const expectedTitle = - uniId === "uoft" - ? "Gapwise — University Timetable & Campus Navigation" - : `Gapwise for ${escapedName} — Timetable & Campus Navigation`; + const expectedTitle = `Gapwise for ${escapedName} — Timetable & Campus Navigation`; requireText(html, ``, `${uniId} og:title`); requireText(html, `${expectedTitle}`, `${uniId} title`); diff --git a/scripts/generate-social-cards.ts b/scripts/generate-social-cards.ts index 076f11e2..dd76a937 100644 --- a/scripts/generate-social-cards.ts +++ b/scripts/generate-social-cards.ts @@ -62,6 +62,30 @@ const CARDS: CardConfig[] = [ tagline: "Make the time between classes count.", detail: "University of Toronto", }, + { + outputPath: "public/campuses/utm/og-card.png", + accentColor: "#4EA7FE", + textColor: "#93c5fd", + title: "Gapwise · UTM", + tagline: "Timetable & Campus Navigation", + detail: "University of Toronto Mississauga", + }, + { + outputPath: "public/campuses/utsg/og-card.png", + accentColor: "#1E4B87", + textColor: "#93c5fd", + title: "Gapwise · UTSG", + tagline: "Timetable & Campus Navigation", + detail: "University of Toronto St. George", + }, + { + outputPath: "public/campuses/utsc/og-card.png", + accentColor: "#18A999", + textColor: "#5eead4", + title: "Gapwise · UTSC", + tagline: "Timetable & Campus Navigation", + detail: "University of Toronto Scarborough", + }, { outputPath: "public/universities/carleton/og-card.png", accentColor: "#E31B23", @@ -166,14 +190,14 @@ const CARDS: CardConfig[] = [ tagline: "Timetable and downtown campus navigation.", detail: "McGill University · Downtown Campus", }, - // ── Root fallbacks (U of T default) ────────────────────── + // ── Global ecosystem root ──────────────────────────────── { outputPath: "public/og-card.png", accentColor: "#4EA7FE", textColor: "#93c5fd", title: "Gapwise", tagline: "Make the time between classes count.", - detail: "University of Toronto", + detail: "University timetable · Campus navigation · Open source", }, { outputPath: "public/og-gapwise.png", @@ -181,7 +205,7 @@ const CARDS: CardConfig[] = [ textColor: "#93c5fd", title: "Gapwise", tagline: "Make the time between classes count.", - detail: "University of Toronto", + detail: "University timetable · Campus navigation · Open source", }, // ── Supporting Sites ────────────────────────────────────── { diff --git a/src/components/MarketingLandingImpl.tsx b/src/components/MarketingLandingImpl.tsx index c6b297e9..3ae9dfea 100644 --- a/src/components/MarketingLandingImpl.tsx +++ b/src/components/MarketingLandingImpl.tsx @@ -4,6 +4,8 @@ import { UploadPanel } from "@/components/UploadPanel"; import type { MarketingLandingProps } from "./MarketingLanding"; import { activeUniversity, + activeSite, + SITES, supportedUniversities, canonicalUrlForUniversity, } from "@/universities/registry"; @@ -41,6 +43,10 @@ const INSTITUTION_MARKETING_METRICS: Record< waterloo: { count: 68, sampleCodes: ["MC", "DC", "QNC", "AL"] }, mcgill: { count: 49, sampleCodes: ["LEA", "MAASS", "RPHYS", "ARTS"] }, }; +const GLOBAL_MARKETING_METRICS = { + count: 0, + sampleCodes: ["CLASS", "LIB", "LAB", "STUDY"] as [string, string, string, string], +}; export function MarketingLandingImpl({ isOnline, @@ -53,10 +59,20 @@ export function MarketingLandingImpl({ rememberAvailable, }: MarketingLandingProps) { const university = activeUniversity(); + const site = activeSite(); const universities = supportedUniversities(); - const metrics = - INSTITUTION_MARKETING_METRICS[university?.id ?? "uoft"] ?? - INSTITUTION_MARKETING_METRICS["uoft"]!; + const isGlobal = site?.role === "global"; + const isHub = site?.role === "university-hub"; + const hubCampuses = isHub + ? SITES.filter( + (candidate) => + candidate.role === "campus-edition" && candidate.universityId === site.universityId, + ) + : []; + const metrics = isGlobal + ? GLOBAL_MARKETING_METRICS + : (INSTITUTION_MARKETING_METRICS[university?.id ?? "uoft"] ?? + INSTITUTION_MARKETING_METRICS["uoft"]!); const rootRef = useRef(null); const [activeSection, setActiveSection] = useState("capabilities"); @@ -93,38 +109,100 @@ export function MarketingLandingImpl({
-

For {university?.name ?? "your campus"}

+

+ {isGlobal + ? "Free and open-source university software" + : isHub + ? `Gapwise for ${university?.name}` + : `For ${site?.name ?? university?.name ?? "your campus"}`} +

- Make every gap on campus count. + {isGlobal || isHub ? ( + <> + Your university day, connected. + + ) : ( + <> + Make every gap on campus count. + + )}

- One precise workspace for your {university?.shortName ?? "campus"} timetable, the time - between classes, and source-backed campus context where available. + {isGlobal + ? "Gapwise brings timetable planning, campus maps, pedestrian routing, and the time between classes into one multi-university platform." + : isHub + ? `Choose your ${university?.shortName} campus for a timetable, campus map, building search, and pedestrian routing experience grounded in that campus.` + : `One precise workspace for your ${site?.shortName ?? university?.shortName ?? "campus"} timetable, the time between classes, and source-backed campus context where available.`}

-
- {!isOnline ? ( -

- Offline mode — timetable import and saved schedules still work. + {isGlobal ? ( +

+

One platform · many campuses

+

{universities.length} supported universities

+

+ Find your edition, explore the open data and developer platform, or help map the next + campus.

- ) : null} - -
+ +
+ ) : isHub ? ( +
+ {hubCampuses.map((campus) => ( + + {campus.shortName} + {campus.name} + + + ))} + {site.universityId === "ubc" ? ( +

Okanagan support is planned and is not yet listed as supported.

+ ) : null} + {site.universityId === "york" ? ( +

Glendon and Markham are reserved for future verified coverage.

+ ) : null} +
+ ) : ( +
+ {!isOnline ? ( +

+ Offline mode — timetable import and saved schedules still work. +

+ ) : null} + +
+ )}
- - Timetable - - - Gap planner - + {isGlobal || isHub ? ( + <> + + {isHub ? "Choose a campus" : "Find your edition"}{" "} + + + + Developer platform + + + ) : ( + <> + + Timetable + + + Gap planner + + + )}
@@ -235,7 +327,7 @@ export function MarketingLandingImpl({
    {universities.map((uni) => { const href = canonicalUrlForUniversity(uni); - const isCurrent = (university?.id ?? "uoft") === uni.id; + const isCurrent = !isGlobal && university?.id === uni.id; return (
  • p:not(.marketing-eyebrow), +.hub-campus-panel > p { + max-width: 34rem; + color: var(--muted-foreground); + line-height: 1.65; +} + +.hub-campus-link { + position: relative; + display: grid; + grid-template-columns: 4.5rem minmax(0, 1fr) auto; + align-items: center; + gap: 1rem; + min-height: 5rem; + padding: 1rem 1.1rem; + border: 1px solid var(--marketing-line); + border-radius: 1rem; + background: color-mix(in srgb, var(--background) 90%, var(--accent) 10%); + transition: + border-color 160ms ease, + transform 160ms ease, + background 160ms ease; +} + +.hub-campus-link:hover, +.hub-campus-link:focus-visible { + border-color: color-mix(in srgb, var(--accent) 55%, var(--marketing-line)); + background: color-mix(in srgb, var(--background) 82%, var(--accent) 18%); + transform: translateY(-2px); +} + +.hub-campus-link span { + color: var(--accent); + font-family: var(--font-mono); + font-size: 0.78rem; + font-weight: 650; +} + +.hub-campus-link strong { + font-family: var(--font-display); + font-size: 1rem; + font-weight: 560; +} + +.hub-campus-link i { + color: var(--muted-foreground); + font-style: normal; +} + .marketing-offline { margin-bottom: 0.85rem; border: 1px solid var(--marketing-line); diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index 193ac59a..e10c3ad6 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -14,7 +14,7 @@ import { reportLovableError } from "../lib/lovable-error-reporting"; import { AppErrorBoundary } from "@/components/AppErrorBoundary"; import { AppUpdatePrompt } from "@/components/AppUpdatePrompt"; import { trackPageView } from "@/lib/telemetry"; -import { activeUniversity } from "@/universities/registry"; +import { activeSite, activeUniversity } from "@/universities/registry"; function NotFoundComponent() { return ( @@ -112,34 +112,20 @@ function RootShell({ children }: { children: ReactNode }) { ); } -const PLANNED_EDITIONS: Record = {}; - function RootComponent() { const { queryClient } = Route.useRouteContext(); const university = activeUniversity(); + const site = activeSite(); const pathname = useRouterState({ select: (state) => state.location.pathname }); useEffect(() => { trackPageView(pathname, university?.id); }, [pathname, university?.id]); - const hostname = - typeof window !== "undefined" ? window.location.hostname.toLowerCase().replace(/\.$/, "") : ""; - const isDev = ["localhost", "127.0.0.1", "gapwise.test"].includes(hostname); - const devParam = - typeof window !== "undefined" - ? new URLSearchParams(window.location.search).get("university") - : null; - const plannedInfo = - PLANNED_EDITIONS[hostname] ?? - (isDev && devParam && PLANNED_EDITIONS[`${devParam}.gapwise.ca`] - ? PLANNED_EDITIONS[`${devParam}.gapwise.ca`] - : null); - - if (!university || university.status === "planned" || plannedInfo) { - const isPlanned = Boolean(plannedInfo || university?.status === "planned"); - const name = plannedInfo?.name ?? university?.name; - const shortName = plannedInfo?.shortName ?? university?.shortName ?? "GW"; + if (!site || site.role === "reserved" || university?.status === "planned") { + const isPlanned = site?.role === "reserved" || university?.status === "planned"; + const name = site?.name ?? university?.name; + const shortName = site?.shortName ?? university?.shortName ?? "GW"; return (
    diff --git a/src/routes/_app.index.tsx b/src/routes/_app.index.tsx index 1d3778ed..67602c2e 100644 --- a/src/routes/_app.index.tsx +++ b/src/routes/_app.index.tsx @@ -1,16 +1,18 @@ import { createFileRoute } from "@tanstack/react-router"; -import { activeUniversity } from "@/universities/registry"; +import { activeSite, activeUniversity } from "@/universities/registry"; export const Route = createFileRoute("/_app/")({ head: () => { const university = activeUniversity(); - const isRootHost = !university || university.id === "uoft"; - const title = isRootHost + const site = activeSite(); + const isGlobal = site?.role === "global"; + const editionName = site?.name ?? university?.name ?? "Campus timetable"; + const title = isGlobal ? "Gapwise — University Timetable & Campus Navigation" - : `Gapwise for ${university?.name ?? "Campus timetable"} — Timetable & Campus Navigation`; - const description = isRootHost + : `Gapwise for ${editionName} — Timetable & Campus Navigation`; + const description = isGlobal ? "Gapwise is a free and open-source timetable, campus navigation, and student planning platform for students across multiple Canadian universities." - : `Gapwise is a free and open-source timetable, campus navigation, and student planning platform for ${university.name} students.`; + : `Gapwise is a free and open-source timetable, campus navigation, and student planning platform for ${editionName} students.`; return { meta: [ { title }, diff --git a/src/routes/_app.tsx b/src/routes/_app.tsx index 4d6120fb..f896fb44 100644 --- a/src/routes/_app.tsx +++ b/src/routes/_app.tsx @@ -49,7 +49,7 @@ import { } from "@/features/sync/preferences"; import { useIntroDismissed, useTheme } from "@/hooks/use-preferences"; import { trackFeatureView, trackTimetableImport } from "@/lib/telemetry"; -import { activeCampus, activeUniversity } from "@/universities/registry"; +import { activeCampus, activeSite, activeUniversity } from "@/universities/registry"; import type { Meeting } from "@/lib/timetable-types"; import { isEncryptedPrivateCloudAuthoritative } from "@/features/security/private-cloud-mode"; import { useEncryptedAutosave } from "@/features/sync/use-encrypted-autosave"; @@ -145,6 +145,7 @@ function ProductEmptyState({ function AppLayout() { const university = activeUniversity(); + const site = activeSite(); const { theme, toggleTheme } = useTheme(); const { dismissed, dismiss } = useIntroDismissed(); const { user, loading: authLoading, error: authError } = useAuth(); @@ -211,6 +212,8 @@ function AppLayout() { openGapPlan, openDayRoute, } = useAppNavigation(Boolean(meetings?.length)); + const isEcosystemHome = + destination === "home" && (site?.role === "global" || site?.role === "university-hub"); const { term, setTerm, @@ -630,38 +633,64 @@ function AppLayout() {
    - - - - replacementInputRef.current?.click()} - settingsRequest={accountSettingsRequest} - meetings={exportMeetings} - term={term} - preferences={preferences} - planTransition={planTransition} - /> + {isEcosystemHome ? ( + <> + + Universities + + + Docs + + + GitHub + + + + ) : ( + <> + + + + replacementInputRef.current?.click()} + settingsRequest={accountSettingsRequest} + meetings={exportMeetings} + term={term} + preferences={preferences} + planTransition={planTransition} + /> + + )}
    diff --git a/src/universities/registry.ts b/src/universities/registry.ts index 5996f8aa..de56c892 100644 --- a/src/universities/registry.ts +++ b/src/universities/registry.ts @@ -2,7 +2,26 @@ import manifest from "../../universities.json" with { type: "json" }; export type University = (typeof manifest.universities)[number]; +export type SiteRole = + "global" | "university-hub" | "campus-edition" | "single-campus-edition" | "reserved"; + +export type SiteDefinition = { + id: string; + role: SiteRole; + hosts: string[]; + canonicalHost: string; + universityId?: string; + campusId?: string; + name?: string; + shortName?: string; +}; + export const UNIVERSITIES: readonly University[] = manifest.universities; +export const SITES: readonly SiteDefinition[] = manifest.sites as readonly SiteDefinition[]; + +function normalizeHostname(hostname: string) { + return hostname.toLowerCase().replace(/\.$/, ""); +} export function validateUniversityManifest( entries: readonly University[] = manifest.universities, @@ -11,6 +30,30 @@ export function validateUniversityManifest( const ids = new Set(); const hosts = new Set(); const campusIds = new Set(); + const siteIds = new Set(); + const siteHosts = new Set(); + for (const site of SITES) { + if (!/^[a-z][a-z0-9-]*$/.test(site.id) || siteIds.has(site.id)) + errors.push(`Invalid or duplicate site ID: ${site.id}`); + siteIds.add(site.id); + if (!site.hosts.includes(site.canonicalHost)) + errors.push(`${site.id}: canonicalHost must be listed in hosts`); + for (const host of site.hosts) { + if (host !== normalizeHostname(host) || !/^[a-z0-9.-]+$/.test(host) || siteHosts.has(host)) + errors.push(`Invalid or duplicate site host: ${host}`); + siteHosts.add(host); + } + const university = site.universityId + ? entries.find((entry) => entry.id === site.universityId) + : undefined; + if (site.universityId && !university) errors.push(`${site.id}: unknown universityId`); + if (site.campusId && !university?.campuses.includes(site.campusId)) + errors.push(`${site.id}: campusId must belong to universityId`); + if (site.role === "campus-edition" && !site.campusId) + errors.push(`${site.id}: campus editions require campusId`); + } + if (SITES.filter((site) => site.role === "global").length !== 1) + errors.push("Exactly one global site is required"); for (const entry of entries) { if (!/^[a-z][a-z0-9-]*$/.test(entry.id) || ids.has(entry.id)) errors.push(`Invalid or duplicate university ID: ${entry.id}`); @@ -44,7 +87,7 @@ export function universityById(id: string): University | null { } export function isPreviewOrLocalHost(hostname: string): boolean { - const host = hostname.toLowerCase().replace(/\.$/, ""); + const host = normalizeHostname(hostname); return ( host === "localhost" || host === "127.0.0.1" || @@ -54,17 +97,80 @@ export function isPreviewOrLocalHost(hostname: string): boolean { ); } +export function siteForHostname(hostname: string): SiteDefinition | null { + const host = normalizeHostname(hostname); + const productionHost = host.endsWith(".gapwise.test") + ? `${host.slice(0, -".gapwise.test".length)}.gapwise.ca` + : host; + const explicit = SITES.find((site) => site.hosts.includes(productionHost)); + if (explicit) return explicit; + const university = manifest.universities.find((entry) => entry.hosts.includes(productionHost)); + if (!university) return null; + return singleCampusSiteForUniversity(university, productionHost); +} + +function singleCampusSiteForUniversity( + university: University, + host: string = university.hosts[0]!, +): SiteDefinition { + return { + id: `${university.id}-edition`, + role: "single-campus-edition", + hosts: [host], + canonicalHost: university.hosts[0]!, + universityId: university.id, + campusId: university.defaultCampus, + name: university.name, + shortName: university.shortName, + }; +} + +export function activeSite(): SiteDefinition | null { + if (typeof window === "undefined") return SITES.find((site) => site.role === "global") ?? null; + const host = normalizeHostname(window.location.hostname); + if (isPreviewOrLocalHost(host)) { + const params = new URLSearchParams(window.location.search); + const requestedSite = params.get("site"); + if (requestedSite) return SITES.find((site) => site.id === requestedSite) ?? null; + const requestedCampus = params.get("campus"); + if (requestedCampus) { + const campusSite = SITES.find((site) => site.campusId === requestedCampus); + if (campusSite) return campusSite; + const campusUniversity = universityByCampus(requestedCampus); + if (campusUniversity) + return singleCampusSiteForUniversity(campusUniversity, campusUniversity.hosts[0]); + } + const requestedUniversity = params.get("university"); + if (requestedUniversity) { + const explicit = + SITES.find( + (site) => + site.universityId === requestedUniversity && + (site.role === "university-hub" || site.role === "single-campus-edition"), + ) ?? null; + if (explicit) return explicit; + const university = universityById(requestedUniversity); + return university ? singleCampusSiteForUniversity(university) : null; + } + // Keep the longstanding local/preview default on the UTM application while + // allowing every site role to be exercised explicitly with query parameters. + return SITES.find((site) => site.id === "uoft-utm") ?? null; + } + return siteForHostname(host); +} + export function universityForHostname( hostname: string, override?: string | null, ): University | null { - const host = hostname.toLowerCase().replace(/\.$/, ""); + const host = normalizeHostname(hostname); const local = host === "localhost" || host === "127.0.0.1" || host === "gapwise.test"; const preview = host.endsWith(".vercel.app"); if (override && (local || preview)) return universityById(override); if (local || preview) return universityById("uoft"); - if (host.endsWith(".gapwise.test")) return universityById(host.slice(0, -".gapwise.test".length)); - return manifest.universities.find((entry) => entry.hosts.includes(host)) ?? null; + const site = siteForHostname(host); + if (!site || site.role === "global" || site.role === "reserved") return null; + return site.universityId ? universityById(site.universityId) : null; } export function activeUniversity(): University | null { @@ -85,17 +191,14 @@ export function activeUniversity(): University | null { } export function campusForHostname(hostname: string, overrideCampus?: string | null): string | null { - const host = hostname.toLowerCase().replace(/\.$/, ""); + const host = normalizeHostname(hostname); const local = host === "localhost" || host === "127.0.0.1" || host === "gapwise.test"; const preview = host.endsWith(".vercel.app"); if (overrideCampus && (local || preview)) return overrideCampus.toLowerCase(); - if (host === "utm.gapwise.ca" || host === "utm.gapwise.test") return "utm"; - if (host === "utsg.gapwise.ca" || host === "utsg.gapwise.test") return "utsg"; - if (host === "utsc.gapwise.ca" || host === "utsc.gapwise.test") return "utsc"; - if (host === "ubc.gapwise.ca" || host === "ubc.gapwise.test") return "ubc-vancouver"; - if (host === "waterloo.gapwise.ca" || host === "waterloo.gapwise.test") return "waterloo-main"; - if (host === "mcgill.gapwise.ca" || host === "mcgill.gapwise.test") return "mcgill-downtown"; - return null; + const site = siteForHostname(host); + return site?.role === "campus-edition" || site?.role === "single-campus-edition" + ? (site.campusId ?? null) + : null; } export function activeCampus(): string | null { diff --git a/tests/auth-branding.test.ts b/tests/auth-branding.test.ts index a0608134..2d38bc9e 100644 --- a/tests/auth-branding.test.ts +++ b/tests/auth-branding.test.ts @@ -173,7 +173,8 @@ describe("branding metadata", () => { expect(indexRoute).toContain("const university = activeUniversity()"); expect(indexRoute).toContain("Gapwise — University Timetable & Campus Navigation"); - expect(indexRoute).toContain("`Gapwise for ${university?.name"); + expect(indexRoute).toContain("const editionName = site?.name ?? university?.name"); + expect(indexRoute).toContain("`Gapwise for ${editionName}"); expect(indexRoute).toContain('{ name: "description", content: description }'); }); }); diff --git a/tests/ecosystem-consistency.test.ts b/tests/ecosystem-consistency.test.ts index 9894a3f7..fc2b6fbb 100644 --- a/tests/ecosystem-consistency.test.ts +++ b/tests/ecosystem-consistency.test.ts @@ -4,6 +4,7 @@ import { resolve } from "node:path"; import manifest from "../universities.json"; import { timetableAdapters, demoTimetableLoaders } from "@/universities/timetable-adapters"; import { + siteForHostname, supportedUniversities, universityById, universityForHostname, @@ -27,6 +28,34 @@ const EXPECTED_UNIVERSITY_IDS = [ ] as const; describe("Gapwise Ecosystem Consistency", () => { + test("reserved hosts are modeled without entering supported university coverage", () => { + const reservedHosts = manifest.sites + .filter((site) => site.role === "reserved") + .flatMap((site) => site.hosts); + for (const host of [ + "ubco.gapwise.ca", + "glendon.gapwise.ca", + "markham.gapwise.ca", + "harvard.gapwise.ca", + "yale.gapwise.ca", + "princeton.gapwise.ca", + "columbia.gapwise.ca", + "brown.gapwise.ca", + "dartmouth.gapwise.ca", + "cornell.gapwise.ca", + "upenn.gapwise.ca", + "stanford.gapwise.ca", + "mit.gapwise.ca", + "cmu.gapwise.ca", + "nyu.gapwise.ca", + "ucberkeley.gapwise.ca", + ]) { + expect(reservedHosts).toContain(host); + expect(manifest.universities.some((university) => university.hosts.includes(host))).toBe( + false, + ); + } + }); test("canonical registry contains exactly the supported universities", () => { expect(manifest.universities).toHaveLength(EXPECTED_UNIVERSITY_IDS.length); const ids = manifest.universities.map((u) => u.id); @@ -39,6 +68,8 @@ describe("Gapwise Ecosystem Consistency", () => { for (const uni of manifest.universities) { expect(universityById(uni.id)).not.toBeNull(); for (const host of uni.hosts) { + expect(siteForHostname(host)?.role).not.toBe("reserved"); + expect(siteForHostname(host)?.universityId).toBe(uni.id); expect(universityForHostname(host)?.id).toBe(uni.id); expect(universityForHostname(host.toUpperCase())?.id).toBe(uni.id); } diff --git a/tests/marketing-home.test.ts b/tests/marketing-home.test.ts index dfd1d452..7800aae6 100644 --- a/tests/marketing-home.test.ts +++ b/tests/marketing-home.test.ts @@ -90,7 +90,7 @@ describe("Gapwise marketing system", () => { { id: "uoft", name: "University of Toronto", - url: "https://gapwise.ca", + url: "https://uoft.gapwise.ca", scope: "Mississauga, St. George, and Scarborough", }, { @@ -165,6 +165,12 @@ describe("Gapwise marketing system", () => { url: "https://waterloo.gapwise.ca", scope: "Main campus", }, + { + id: "mcgill", + name: "McGill University", + url: "https://mcgill.gapwise.ca", + scope: "Downtown Montreal campus", + }, ]; expect(manifest.universities).toHaveLength(14); diff --git a/tests/seo.test.ts b/tests/seo.test.ts index 96ec29ee..b6d65c1a 100644 --- a/tests/seo.test.ts +++ b/tests/seo.test.ts @@ -9,11 +9,9 @@ const FEATURE_PATHS = [ "/about", "/universities", "/open-source", - "/utm-timetable", "/campus-map", "/gap-planner", "/campus-routing", - "/acorn-import", ] as const; function sitemapLocations(xml: string) { @@ -52,8 +50,6 @@ describe("Gapwise searchability and entity metadata", () => { const expected = [ `${SITE_ORIGIN}/`, ...FEATURE_PATHS.map((path) => `${SITE_ORIGIN}${path}`), - `${SITE_ORIGIN}/places`, - ...listCampusPlaces().map((place) => `${SITE_ORIGIN}/places/${place.id}`), `${SITE_ORIGIN}/developers`, `${SITE_ORIGIN}/ai`, `${SITE_ORIGIN}/support`, @@ -118,6 +114,12 @@ describe("Gapwise searchability and entity metadata", () => { trailingSlash?: boolean; headers: Array<{ source: string; headers: Array<{ key: string; value: string }> }>; rewrites: Array<{ source: string; destination: string }>; + redirects: Array<{ + source: string; + destination: string; + permanent: boolean; + has?: Array<{ type: string; value: string }>; + }>; }; const rewrite = new Map(config.rewrites.map((entry) => [entry.source, entry.destination])); @@ -125,9 +127,20 @@ describe("Gapwise searchability and entity metadata", () => { for (const path of FEATURE_PATHS) { expect(rewrite.get(path)).toBe(`/_seo/${path.slice(1)}.html`); } - expect(rewrite.get("/places")).toBe("/_seo/places.html"); - for (const place of listCampusPlaces()) { - expect(rewrite.get(`/places/${place.id}`)).toBe(`/_seo/places--${place.id}.html`); + expect(rewrite.has("/utm-timetable")).toBe(false); + expect(rewrite.has("/acorn-import")).toBe(false); + expect(rewrite.has("/places")).toBe(false); + for (const place of listCampusPlaces()) expect(rewrite.has(`/places/${place.id}`)).toBe(false); + + for (const [source, destination] of [ + ["/utm-timetable", "https://utm.gapwise.ca/utm-timetable"], + ["/acorn-import", "https://utm.gapwise.ca/acorn-import"], + ["/places/:path*", "https://utm.gapwise.ca/places/:path*"], + ]) { + const redirect = config.redirects.find((entry) => entry.source === source); + expect(redirect?.destination).toBe(destination); + expect(redirect?.permanent).toBe(true); + expect(redirect?.has).toContainEqual({ type: "host", value: "gapwise.ca" }); } const noindexSources = config.headers @@ -182,8 +195,30 @@ describe("Gapwise searchability and entity metadata", () => { destinationFor("/(logo-mark.svg|favicon.*|apple-touch-icon.png|site.webmanifest)"), ).toBe("/universities/uoft/$1"); expect(destinationFor("/(og-card.png|og-gapwise.png)")).toBe( - "/universities/uoft/og-card.png", + `/campuses/${campusId}/og-card.png`, ); } }); + + test("Vercel routes the U of T hub independently from the global and campus sites", async () => { + const config = JSON.parse(await readFile("vercel.json", "utf8")) as { + rewrites: Array<{ + source: string; + destination: string; + has?: Array<{ type: string; value: string }>; + }>; + }; + const hubRewrites = config.rewrites.filter((entry) => + entry.has?.some( + (condition) => condition.type === "host" && condition.value === "uoft.gapwise.ca", + ), + ); + const destinationFor = (source: string) => + hubRewrites.find((entry) => entry.source === source)?.destination; + + expect(destinationFor("/")).toBe("/_universities/uoft/index.html"); + expect(destinationFor("/sitemap.xml")).toBe("/_universities/uoft/sitemap.xml"); + expect(destinationFor("/robots.txt")).toBe("/_universities/uoft/robots.txt"); + expect(destinationFor("/(og-card.png|og-gapwise.png)")).toBe("/universities/uoft/og-card.png"); + }); }); diff --git a/tests/universities.test.ts b/tests/universities.test.ts index 4aa57955..2c88ae86 100644 --- a/tests/universities.test.ts +++ b/tests/universities.test.ts @@ -19,6 +19,8 @@ import { parseIcs as parseUoftIcs } from "@/lib/ics-parser"; import { parseCarletonIcs, carletonCampus } from "@/universities/carleton/adapter"; import { timetableAdapters, loadDemoTimetable } from "@/universities/timetable-adapters"; import { + campusForHostname, + siteForHostname, universityById, universityForHostname, validateUniversityManifest, @@ -48,10 +50,11 @@ const carletonIcs = [ describe("university registry", () => { test("resolves production hosts and local preview override", () => { - expect(universityForHostname("gapwise.ca")?.id).toBe("uoft"); - expect(universityForHostname("GAPWISE.CA")?.id).toBe("uoft"); - expect(universityForHostname("gapwise.ca.")?.id).toBe("uoft"); - expect(universityForHostname("www.gapwise.ca")?.id).toBe("uoft"); + expect(universityForHostname("gapwise.ca")).toBeNull(); + expect(universityForHostname("GAPWISE.CA")).toBeNull(); + expect(universityForHostname("gapwise.ca.")).toBeNull(); + expect(universityForHostname("www.gapwise.ca")).toBeNull(); + expect(universityForHostname("uoft.gapwise.ca")?.id).toBe("uoft"); expect(universityForHostname("carleton.gapwise.ca")?.id).toBe("carleton"); expect(universityForHostname("CARLETON.GAPWISE.CA.")?.id).toBe("carleton"); expect(universityForHostname("tmu.gapwise.ca")?.id).toBe("tmu"); @@ -81,12 +84,29 @@ describe("university registry", () => { expect(universityForHostname("preview-branch.vercel.app", "ubc")?.id).toBe("ubc"); expect(universityForHostname("preview-branch.vercel.app", "waterloo")?.id).toBe("waterloo"); expect(universityForHostname("preview-branch.vercel.app", "mcgill")?.id).toBe("mcgill"); - expect(universityForHostname("gapwise.ca", "carleton")?.id).toBe("uoft"); + expect(universityForHostname("gapwise.ca", "carleton")).toBeNull(); expect(universityForHostname("unknown.gapwise.ca")).toBeNull(); expect(universityForHostname("attacker.com")).toBeNull(); expect(universityById("nonexistent")).toBeNull(); }); + test("resolves registry-driven global, hub, campus, single-campus, and reserved roles", () => { + expect(siteForHostname("gapwise.ca")?.role).toBe("global"); + expect(siteForHostname("uoft.gapwise.ca")?.role).toBe("university-hub"); + expect(siteForHostname("utm.gapwise.ca")).toMatchObject({ + role: "campus-edition", + universityId: "uoft", + campusId: "utm", + }); + expect(siteForHostname("mcgill.gapwise.ca")?.role).toBe("single-campus-edition"); + expect(siteForHostname("harvard.gapwise.ca")?.role).toBe("reserved"); + expect(universityForHostname("harvard.gapwise.ca")).toBeNull(); + expect(campusForHostname("uoft.gapwise.ca")).toBeNull(); + expect(campusForHostname("utm.gapwise.ca")).toBe("utm"); + expect(campusForHostname("ubc.gapwise.ca")).toBe("ubc-vancouver"); + expect(campusForHostname("ubcv.gapwise.ca")).toBeNull(); + }); + test("rejects malformed manifest entries", () => { expect(validateUniversityManifest()).toEqual([]); const uoft = universityById("uoft")!; diff --git a/universities.json b/universities.json index aebf812d..98780c3b 100644 --- a/universities.json +++ b/universities.json @@ -1,5 +1,305 @@ { "schemaVersion": 1, + "sites": [ + { + "id": "gapwise-global", + "role": "global", + "hosts": ["gapwise.ca", "www.gapwise.ca"], + "canonicalHost": "gapwise.ca" + }, + { + "id": "uoft-hub", + "role": "university-hub", + "hosts": ["uoft.gapwise.ca"], + "canonicalHost": "uoft.gapwise.ca", + "universityId": "uoft" + }, + { + "id": "uoft-utm", + "role": "campus-edition", + "hosts": ["utm.gapwise.ca"], + "canonicalHost": "utm.gapwise.ca", + "universityId": "uoft", + "campusId": "utm", + "name": "University of Toronto Mississauga", + "shortName": "UTM" + }, + { + "id": "uoft-utsg", + "role": "campus-edition", + "hosts": ["utsg.gapwise.ca"], + "canonicalHost": "utsg.gapwise.ca", + "universityId": "uoft", + "campusId": "utsg", + "name": "University of Toronto St. George", + "shortName": "UTSG" + }, + { + "id": "uoft-utsc", + "role": "campus-edition", + "hosts": ["utsc.gapwise.ca"], + "canonicalHost": "utsc.gapwise.ca", + "universityId": "uoft", + "campusId": "utsc", + "name": "University of Toronto Scarborough", + "shortName": "UTSC" + }, + { + "id": "carleton-edition", + "role": "single-campus-edition", + "hosts": ["carleton.gapwise.ca"], + "canonicalHost": "carleton.gapwise.ca", + "universityId": "carleton", + "campusId": "carleton" + }, + { + "id": "tmu-edition", + "role": "single-campus-edition", + "hosts": ["tmu.gapwise.ca"], + "canonicalHost": "tmu.gapwise.ca", + "universityId": "tmu", + "campusId": "tmu" + }, + { + "id": "queens-edition", + "role": "single-campus-edition", + "hosts": ["queens.gapwise.ca"], + "canonicalHost": "queens.gapwise.ca", + "universityId": "queens", + "campusId": "queens" + }, + { + "id": "laurier-edition", + "role": "single-campus-edition", + "hosts": ["laurier.gapwise.ca"], + "canonicalHost": "laurier.gapwise.ca", + "universityId": "laurier", + "campusId": "waterloo" + }, + { + "id": "ubc-hub", + "role": "single-campus-edition", + "hosts": ["ubc.gapwise.ca"], + "canonicalHost": "ubc.gapwise.ca", + "universityId": "ubc", + "campusId": "ubc-vancouver" + }, + { + "id": "ubc-vancouver", + "role": "reserved", + "hosts": ["ubcv.gapwise.ca"], + "canonicalHost": "ubcv.gapwise.ca", + "universityId": "ubc", + "campusId": "ubc-vancouver", + "name": "UBC Vancouver", + "shortName": "UBCV" + }, + { + "id": "ubc-okanagan", + "role": "reserved", + "hosts": ["ubco.gapwise.ca"], + "canonicalHost": "ubco.gapwise.ca", + "universityId": "ubc", + "name": "UBC Okanagan", + "shortName": "UBCO" + }, + { + "id": "york-hub", + "role": "single-campus-edition", + "hosts": ["york.gapwise.ca"], + "canonicalHost": "york.gapwise.ca", + "universityId": "york", + "campusId": "keele" + }, + { + "id": "york-keele", + "role": "reserved", + "hosts": ["keele.gapwise.ca"], + "canonicalHost": "keele.gapwise.ca", + "universityId": "york", + "campusId": "keele", + "name": "York University Keele Campus", + "shortName": "Keele" + }, + { + "id": "mcmaster-edition", + "role": "single-campus-edition", + "hosts": ["mcmaster.gapwise.ca"], + "canonicalHost": "mcmaster.gapwise.ca", + "universityId": "mcmaster", + "campusId": "mcmaster" + }, + { + "id": "western-edition", + "role": "single-campus-edition", + "hosts": ["western.gapwise.ca"], + "canonicalHost": "western.gapwise.ca", + "universityId": "western", + "campusId": "western" + }, + { + "id": "guelph-edition", + "role": "single-campus-edition", + "hosts": ["guelph.gapwise.ca"], + "canonicalHost": "guelph.gapwise.ca", + "universityId": "guelph", + "campusId": "guelph" + }, + { + "id": "uottawa-edition", + "role": "single-campus-edition", + "hosts": ["uottawa.gapwise.ca"], + "canonicalHost": "uottawa.gapwise.ca", + "universityId": "uottawa", + "campusId": "uottawa" + }, + { + "id": "brock-edition", + "role": "single-campus-edition", + "hosts": ["brock.gapwise.ca"], + "canonicalHost": "brock.gapwise.ca", + "universityId": "brock", + "campusId": "brock" + }, + { + "id": "waterloo-edition", + "role": "single-campus-edition", + "hosts": ["waterloo.gapwise.ca"], + "canonicalHost": "waterloo.gapwise.ca", + "universityId": "waterloo", + "campusId": "waterloo-main" + }, + { + "id": "mcgill-edition", + "role": "single-campus-edition", + "hosts": ["mcgill.gapwise.ca"], + "canonicalHost": "mcgill.gapwise.ca", + "universityId": "mcgill", + "campusId": "mcgill-downtown" + }, + { + "id": "york-glendon", + "role": "reserved", + "hosts": ["glendon.gapwise.ca"], + "canonicalHost": "glendon.gapwise.ca", + "universityId": "york", + "name": "York University Glendon Campus", + "shortName": "Glendon" + }, + { + "id": "york-markham", + "role": "reserved", + "hosts": ["markham.gapwise.ca"], + "canonicalHost": "markham.gapwise.ca", + "universityId": "york", + "name": "York University Markham Campus", + "shortName": "Markham" + }, + { + "id": "harvard", + "role": "reserved", + "hosts": ["harvard.gapwise.ca"], + "canonicalHost": "harvard.gapwise.ca", + "name": "Harvard University", + "shortName": "Harvard" + }, + { + "id": "yale", + "role": "reserved", + "hosts": ["yale.gapwise.ca"], + "canonicalHost": "yale.gapwise.ca", + "name": "Yale University", + "shortName": "Yale" + }, + { + "id": "princeton", + "role": "reserved", + "hosts": ["princeton.gapwise.ca"], + "canonicalHost": "princeton.gapwise.ca", + "name": "Princeton University", + "shortName": "Princeton" + }, + { + "id": "columbia", + "role": "reserved", + "hosts": ["columbia.gapwise.ca"], + "canonicalHost": "columbia.gapwise.ca", + "name": "Columbia University", + "shortName": "Columbia" + }, + { + "id": "brown", + "role": "reserved", + "hosts": ["brown.gapwise.ca"], + "canonicalHost": "brown.gapwise.ca", + "name": "Brown University", + "shortName": "Brown" + }, + { + "id": "dartmouth", + "role": "reserved", + "hosts": ["dartmouth.gapwise.ca"], + "canonicalHost": "dartmouth.gapwise.ca", + "name": "Dartmouth College", + "shortName": "Dartmouth" + }, + { + "id": "cornell", + "role": "reserved", + "hosts": ["cornell.gapwise.ca"], + "canonicalHost": "cornell.gapwise.ca", + "name": "Cornell University", + "shortName": "Cornell" + }, + { + "id": "upenn", + "role": "reserved", + "hosts": ["upenn.gapwise.ca"], + "canonicalHost": "upenn.gapwise.ca", + "name": "University of Pennsylvania", + "shortName": "Penn" + }, + { + "id": "stanford", + "role": "reserved", + "hosts": ["stanford.gapwise.ca"], + "canonicalHost": "stanford.gapwise.ca", + "name": "Stanford University", + "shortName": "Stanford" + }, + { + "id": "mit", + "role": "reserved", + "hosts": ["mit.gapwise.ca"], + "canonicalHost": "mit.gapwise.ca", + "name": "Massachusetts Institute of Technology", + "shortName": "MIT" + }, + { + "id": "cmu", + "role": "reserved", + "hosts": ["cmu.gapwise.ca"], + "canonicalHost": "cmu.gapwise.ca", + "name": "Carnegie Mellon University", + "shortName": "CMU" + }, + { + "id": "nyu", + "role": "reserved", + "hosts": ["nyu.gapwise.ca"], + "canonicalHost": "nyu.gapwise.ca", + "name": "New York University", + "shortName": "NYU" + }, + { + "id": "ucberkeley", + "role": "reserved", + "hosts": ["ucberkeley.gapwise.ca"], + "canonicalHost": "ucberkeley.gapwise.ca", + "name": "University of California, Berkeley", + "shortName": "UC Berkeley" + } + ], "universities": [ { "id": "uoft", @@ -7,13 +307,7 @@ "shortName": "U of T", "accentColor": "#4EA7FE", "campusScope": "Mississauga, St. George, and Scarborough", - "hosts": [ - "gapwise.ca", - "www.gapwise.ca", - "utm.gapwise.ca", - "utsg.gapwise.ca", - "utsc.gapwise.ca" - ], + "hosts": ["uoft.gapwise.ca", "utm.gapwise.ca", "utsg.gapwise.ca", "utsc.gapwise.ca"], "campuses": ["utm", "utsg", "utsc"], "defaultCampus": "utm", "timetableAdapter": "acorn-ics", diff --git a/vercel.json b/vercel.json index a2bf649a..7b2b0c77 100644 --- a/vercel.json +++ b/vercel.json @@ -23,6 +23,39 @@ "destination": "https://gapwise.ca/:path*", "permanent": true }, + { + "source": "/utm-timetable", + "has": [ + { + "type": "host", + "value": "gapwise.ca" + } + ], + "destination": "https://utm.gapwise.ca/utm-timetable", + "permanent": true + }, + { + "source": "/acorn-import", + "has": [ + { + "type": "host", + "value": "gapwise.ca" + } + ], + "destination": "https://utm.gapwise.ca/acorn-import", + "permanent": true + }, + { + "source": "/places/:path*", + "has": [ + { + "type": "host", + "value": "gapwise.ca" + } + ], + "destination": "https://utm.gapwise.ca/places/:path*", + "permanent": true + }, { "source": "/:path*", "has": [ @@ -290,6 +323,41 @@ "source": "/v1/gaps/plan", "destination": "/api/v1?resource=gap-plan" }, + { + "source": "/(logo-mark.svg|favicon.*|apple-touch-icon.png|site.webmanifest)", + "has": [{ "type": "host", "value": "uoft.gapwise.ca" }], + "destination": "/universities/uoft/$1" + }, + { + "source": "/(og-card.png|og-gapwise.png)", + "has": [{ "type": "host", "value": "uoft.gapwise.ca" }], + "destination": "/universities/uoft/og-card.png" + }, + { + "source": "/sitemap.xml", + "has": [{ "type": "host", "value": "uoft.gapwise.ca" }], + "destination": "/_universities/uoft/sitemap.xml" + }, + { + "source": "/robots.txt", + "has": [{ "type": "host", "value": "uoft.gapwise.ca" }], + "destination": "/_universities/uoft/robots.txt" + }, + { + "source": "/(about|universities|open-source|campus-map|gap-planner|campus-routing|developers|ai|support|trust|privacy|security|accessibility)", + "has": [{ "type": "host", "value": "uoft.gapwise.ca" }], + "destination": "/_universities/uoft/_seo/$1.html" + }, + { + "source": "/", + "has": [{ "type": "host", "value": "uoft.gapwise.ca" }], + "destination": "/_universities/uoft/index.html" + }, + { + "source": "/(.*)", + "has": [{ "type": "host", "value": "uoft.gapwise.ca" }], + "destination": "/_universities/uoft/index.html" + }, { "source": "/(logo-mark.svg|favicon.*|apple-touch-icon.png|site.webmanifest)", "has": [ @@ -1218,7 +1286,7 @@ "value": "utm.gapwise.ca" } ], - "destination": "/universities/uoft/og-card.png" + "destination": "/campuses/utm/og-card.png" }, { "source": "/sitemap.xml", @@ -1288,7 +1356,7 @@ "value": "utsg.gapwise.ca" } ], - "destination": "/universities/uoft/og-card.png" + "destination": "/campuses/utsg/og-card.png" }, { "source": "/sitemap.xml", @@ -1358,7 +1426,7 @@ "value": "utsc.gapwise.ca" } ], - "destination": "/universities/uoft/og-card.png" + "destination": "/campuses/utsc/og-card.png" }, { "source": "/sitemap.xml", @@ -1412,7 +1480,7 @@ }, { "source": "/(og-card.png|og-gapwise.png)", - "destination": "/universities/uoft/og-card.png" + "destination": "/_global/og-gapwise.png" }, { "source": "/(logo-mark.svg|favicon.*|apple-touch-icon.png|site.webmanifest)", @@ -1438,10 +1506,6 @@ "source": "/open-source", "destination": "/_seo/open-source.html" }, - { - "source": "/utm-timetable", - "destination": "/_seo/utm-timetable.html" - }, { "source": "/campus-map", "destination": "/_seo/campus-map.html" @@ -1454,26 +1518,6 @@ "source": "/campus-routing", "destination": "/_seo/campus-routing.html" }, - { - "source": "/acorn-import", - "destination": "/_seo/acorn-import.html" - }, - { - "source": "/places", - "destination": "/_seo/places.html" - }, - { - "source": "/places/davis-food-court", - "destination": "/_seo/places--davis-food-court.html" - }, - { - "source": "/places/utm-library", - "destination": "/_seo/places--utm-library.html" - }, - { - "source": "/places/rawc", - "destination": "/_seo/places--rawc.html" - }, { "source": "/developers", "destination": "/_seo/developers.html" @@ -1508,11 +1552,11 @@ }, { "source": "/", - "destination": "/_universities/uoft/index.html" + "destination": "/_seo/index.html" }, { "source": "/(.*)", - "destination": "/_universities/uoft/index.html" + "destination": "/_seo/index.html" } ] } From 124f4001531a9d67838d194cf499e8821a2a720b Mon Sep 17 00:00:00 2001 From: Andrew Muratov Date: Thu, 1 Oct 2026 15:45:13 -0400 Subject: [PATCH 02/16] feat(marketing): add polished global Gapwise homepage --- src/components/GlobalMarketingHome.tsx | 486 +++++++++++++++++++++++++ 1 file changed, 486 insertions(+) create mode 100644 src/components/GlobalMarketingHome.tsx diff --git a/src/components/GlobalMarketingHome.tsx b/src/components/GlobalMarketingHome.tsx new file mode 100644 index 00000000..1efcaf2b --- /dev/null +++ b/src/components/GlobalMarketingHome.tsx @@ -0,0 +1,486 @@ +import { Link } from "@tanstack/react-router"; +import { + Activity, + ArrowRight, + BookOpen, + Braces, + Check, + ChevronRight, + Code2, + Github, + MapPin, + Navigation, + Search, + Sparkles, +} from "lucide-react"; +import { useMemo, useState, type CSSProperties } from "react"; +import { + canonicalUrlForUniversity, + supportedUniversities, +} from "@/universities/registry"; +import "./global-marketing-home.css"; + +const FEATURED_UNIVERSITY_IDS = ["uoft", "waterloo", "mcgill", "ubc", "mcmaster", "queens"]; + +const ecosystemProducts = [ + { + id: "ai", + title: "Gapwise AI", + label: "AI", + copy: "Permissioned campus intelligence and Model Context Protocol tools for assistants.", + href: "https://ai.gapwise.ca", + cta: "Open Gapwise AI", + accent: "#a78bfa", + icon: Sparkles, + }, + { + id: "docs", + title: "Gapwise Docs", + label: "Docs", + copy: "Guides, API references, SDK documentation, and integration details.", + href: "https://docs.gapwise.ca", + cta: "Open docs", + accent: "#38bdf8", + icon: BookOpen, + }, + { + id: "data", + title: "Gapwise Data", + label: "Data", + copy: "Open campus datasets, schemas, and source-backed navigation data.", + href: "https://data.gapwise.ca", + cta: "Explore data", + accent: "#ff5a66", + icon: Braces, + }, + { + id: "status", + title: "Gapwise Status", + label: "Status", + copy: "Public service health, uptime probes, and operational incident history.", + href: "https://status.gapwise.ca", + cta: "Open status", + accent: "#39cf97", + icon: Activity, + }, + { + id: "developers", + title: "Gapwise Developers", + label: "Developers", + copy: "Public API, SDKs, CLI tooling, and contracts for building on Gapwise.", + href: "/developers", + cta: "Developer platform", + accent: "#4ea7fe", + icon: Code2, + internal: true, + }, +] as const; + +function BrandMark({ className = "" }: { className?: string }) { + return ; +} + +function ProductPreview() { + return ( +
    +
    + + Example student day + Campus +
    + +
    + + +
    +
    +
    + Today + Your afternoon +
    + 3 classes · 2 gaps +
    + +
    +
    +