From 565260b050864cb4c8a5f88cbb9e799a5dc99c21 Mon Sep 17 00:00:00 2001 From: joel Date: Sun, 14 Jan 2024 09:38:11 -0800 Subject: [PATCH] feat: add og image to tip and article --- .../public/android-chrome-192x192.png | Bin 0 -> 5742 bytes .../public/android-chrome-512x512.png | Bin 0 -> 17122 bytes .../public/apple-touch-icon.png | Bin 0 -> 5352 bytes .../public/browserconfig.xml | 9 +++++ .../public/favicon-16x16.png | Bin 0 -> 973 bytes .../public/favicon-32x32.png | Bin 0 -> 1624 bytes apps/course-builder-web/public/favicon.ico | Bin 23600 -> 15086 bytes .../public/mstile-150x150.png | Bin 0 -> 3792 bytes .../public/safari-pinned-tab.svg | 30 ++++++++++++++ .../public/site.webmanifest | 19 +++++++++ .../src/app/[article]/page.tsx | 29 ++++++++++++++ .../src/app/tips/[slug]/page.tsx | 37 ++++++++++++++---- .../src/utils/get-og-image-for-title.ts | 7 ++++ 13 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 apps/course-builder-web/public/android-chrome-192x192.png create mode 100644 apps/course-builder-web/public/android-chrome-512x512.png create mode 100644 apps/course-builder-web/public/apple-touch-icon.png create mode 100644 apps/course-builder-web/public/browserconfig.xml create mode 100644 apps/course-builder-web/public/favicon-16x16.png create mode 100644 apps/course-builder-web/public/favicon-32x32.png create mode 100644 apps/course-builder-web/public/mstile-150x150.png create mode 100644 apps/course-builder-web/public/safari-pinned-tab.svg create mode 100644 apps/course-builder-web/public/site.webmanifest create mode 100644 apps/course-builder-web/src/utils/get-og-image-for-title.ts diff --git a/apps/course-builder-web/public/android-chrome-192x192.png b/apps/course-builder-web/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..2f3db0a4ab651484a582d2e4ce585a03da0d24e3 GIT binary patch literal 5742 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 Grv49S??fR0 literal 0 HcmV?d00001 diff --git a/apps/course-builder-web/public/android-chrome-512x512.png b/apps/course-builder-web/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..a5987fd67edf75866e380f2e81f1ffe415eaa91b GIT binary patch literal 17122 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 RGz%;N*;v@&s?6|r{|`qGzP11W literal 0 HcmV?d00001 diff --git a/apps/course-builder-web/public/apple-touch-icon.png b/apps/course-builder-web/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d735f426fa4047a3ec94a40381aaa979e3eec GIT binary patch literal 5352 zcmZ{Ic{o&W`2H9(jNKTFgc-@s*pnfQ>}o98$~M+Q$!J7~G047Cqo_ezga)OtHrYj* zlqE}cO`nh~$?~c1`TTx=egF7g=Q`)T-sil}dGB+-+jBqZ4tOg8UP)dM2qa)*ZSDk= zFaEn>T)^|xJ1%XYfLz3##eqQexqOGdP@svnRK;&c)Xdf_<*&tA)CJ6Ko z0R+NQK_Fy!X^W!~@Pfyb*H+&B%UffphfC8TzjY#H_p?oM z47+oBpfjQ)WIUwBE}l+x)-2IPMv>B*PV^wAXrs zSxMv`8(`4nEbqJqCwno!(ybzu?GlOmqZ-}PAyx~NoKg^M1te5tFc&|!!l+zz_GG~; z2EEne;)JOlEA-D)Y2sZnAJ$ekdES96gFd(NM3B({|5b5vFc8>oU zD^bUo{|Ie>HuFukT?;lQpPgwXJBlH>GCL1 z47*<#9V<+#YIsIw`&Y&HYm!sX~xKI1_Qd}~0wqj>V+nWW(~c&0w9eU zXC5}<(b!f;8aGL#Amc!MN*qb@$`X~cC@XO{U0(JWb_vIgr(rxCfBzO1j$A*PQTmJ8 z3-uBz526oSJLb+>^Fi!qM^pJ)T)~N^VHJP;9@-kErA4_`BakEkcEdO?3ProI*0w_1 z2a)67Js1Iqs7n{-f^P~S?~(E`1myz6rvvNp489g|2$e~?J1epa*NxD#% z@KguaNIV_Yk>;R7bhF2%&n~bD10r)z}BU)e8W}0>K^%v zBez{x%c`>XI2(^H`t$lfbRRfc=?2i6?i|9kVLjw%6w+gRzvEdlUyDe^uJGTinKfoR zQOLq@j)F1J|V+l-e+lbqfF6@*^}_&yy9%18V0A-6@8&@K8c|x)_Vrx)}B| z9TdZG9laTs@w?W3fr!hc#9y_T|2Gt_d1^g+^GxM0uclrp4EuwyX{6LZ{ZZ&`Frsb0 z&IrSHgqw!R-x#EcgI@JYn->sqcW8s&%5iZphVpu}E!CoSE)q%0&vs?DgN-l-%8X&*w4MjE%Ry+jmRb zErjEcm5aVg$a%)_R>yrmE#^RUsJlQL$9(LieUYbj{kh{WRB~>A zbfk2x1s`!z5f35FZkP6dL7eu#-8bnnB}g|w%^ zFWLcwD=0YFa&^1TAl3|!6eQ_F;$YYnPDRlf-c3Vrj>!2w&scD=U@@jFl;~g40DExx<57) zs+g%I2P}cDnO2FPGlw~*c!VuJexwas*l+26=QTf8us=w+nP*C?`rcqX3>y`GfA#{x}~wk=?a*;XZ~8?awayTajoV>jcofF>YW@g?{!Snu=1~6!r$0Vb5C1a9n8ms<9t%2!ogcJ&k}cF zt+J6^wHmWtqpokYE9ICb36$yj^WZ5~*4TYeyClc3FKSBGw>bK8qoA@OC*^o?bZ7xN5 z!=}jx^RRH7)freE=upNzn=Uh9u3BD|} zUBW~<40GILME^W;JX-ag)j@|@-rh$bm~l5p8$!I!E#^EtR|1ZM+pMijR9}7g`A?VH zeE2jj5+m7J`ykchFXW(!beD4L{K_BB;9*n(+*gt=;fuX;zM_O+hQ5=seY|bZaY^)c z(G|#^a+j42q94!FNE+&kBkAA%Oij|S2$oV7ujj*p8{B&<>Fg-E^7Ye!WVD*?lzREb z$Otszn(=O%sNL)g*O{yX{G^BrW6_4OrQC?ZpW^o$>^kB55`8amSC#>h-5k1ODJXRV zJh(hED$9y`aW9HIPChDpKCNo|HlZD_YU4yx9zlT4If{Ta`*GZH8gsJN zAY5DPdy(q@+AWBso)~1aNa?U=Wkpqe)ye?y=Cfr|6s5h?-WZM z@mu91h#=r4se0GWXSqzggK86V&s2mD67_B+?rNE|@lGWF6CV~ELXPsm-G7Sj?$LEM zZh^5y`h&Tsnf*xYBe*?^;Dnfd_wNK?D*@SSyPcKLnPfpe($8G&M*6I)tZ15R; zgZPzsfadd{t`?};XPV>(JIe}7k54&QXS&}e;~ zXXSPamE3=Y%D6*NZ8vN!xVq||(`j4eXA(y~xadXbf-m`m>~`%4XF^$F%ns?5W1FBm zvBaUS7$QlqOr6a!Cw;k=;A3nOCo0i$A*8mXTN^>O=Lt$onylr9$8!wzN7?<;+o14( z>(N4op^d2Pwb$>g{UhUZH#mgfe*BrnpiVq)+FB4yL`-(^5X9Io(GR+7Y=m4NoI>o* z5c8mTKi3MOP&@j)())74#aDYZ7W_mGwmS5sr^~(4KvX!Kk?as_hAPxl!R$Hg6Se)+fTPUb6l(&w@ zC2mRg>%8xi_HpSBGpM$>?2)GyZXLTV{8j^AlCw5Gp0wQhqt~t6Efb9L+ne|1jdwSI zCfhWMjE~lof>#?)MN7@RwmzruKZg@ZT6J4|fl=CA`-LQG zN$+eoWTk^WKYeaV-CLDil287eHr=;eM0gVw^~r>7l(9E|D(jQohC-*7**onpsm&cl zV51Kv711*D<(P2hqlMXzGG93VDEeI7R9+oumrzYCvy8pNyhTNQ83xfV@Bxi7e`&jl_I8rC*K5IGeB`D)pKbkJ` z+vBpU_P0`qH^-5@i;~Y|*N;zr*0;?4$8aLdevOG|Ma9YQ6*FjjPt1h*3HM(}v*ls? zUhmx&D8q8?qLOcFdiF&XORgz}@)Tb$`w%LQVdpj){#6`UwU`i#61M4vdS$5uXg{tu z3M=@`O#ba_(-<$?#OTtLMd3|(LC%2+96;)~kT_dBf77<1InAF$e%s}NK)XJUh&f20h!6ictb!nCERTw@4I z++gT~X8@V%wHmII(3UC1b0J+&FFqX0{(F$XxCrE{!>gk&f!+%$hHY<}CKPH!$yAMF z<(g-nK#`=iRq!vpJ;@(v?<{8_4Ew@B0N(H4A9n|0S|U)4ggSs!_2dienop@>0(zWw zLV{KFGKEqA*ErcTUV55W>e5Ky7pp5^#R0=61u-P4)_s3nVk4-qj-KKmh={pfDdWl7 zLCf{nHmALp0zb0}cD*lcXy|5<&evj@5hS3`*>}wNW63|oE+eGQIY=Y z&9xUF1)I`)p);^*%^Jn}Vzq2KkAQu&meV58!Zao^OKI$U@RQ+>{G9F9v@b`V5j9|7 zO0FP~jhLvBB>;K^$VH$W*;(7AuT;`_k)#)^kM@Uc6F@V|g~}g*yb7-ijMC_A63P%9 zD1Dk>+*G6B1JV1;w#)1FzciZxjKh z?u=r*!{_UlO}82LkIZxVup!#uF^Tq4gC@V@V#SYdYRiWJsT!wG3k22hCqureA0FvF zJ+cKj_67+E`B%tf*Cx09xbppO5+BxYQ(f?_n5r`UuITB_8v94OoJi8vMB0@>*CFn` z*HL!?rFw+Ab`o~jv7~5dx_hun*aC(&Nevyr;qJ0oXl%}Pp#!xh(FvV_EJcX#Bbm?1 zg-n&A2bJjAO_Eomb)U3ppNPuCCA2{Y|0d6zFf!)>VI+$o_x;iz)KJ(M{_6lXAIQ_m zlPugx0luU_tbarxP=K^GwYAkXb=9>DoVB#Dng&>1T~$p@tfr>dhWE_>a=3CeAUNp8 z|LvewyW$HtxWzcTlbn2`(BTnRgMu#yqDeQx1JS|ZB!3Vnx^!`qA4YUlQhIAYIApWz z1mcwA!}#+d + + + + + #da532c + + + diff --git a/apps/course-builder-web/public/favicon-16x16.png b/apps/course-builder-web/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcc0406e527d35777298e89b1d50d3f87e856f2 GIT binary patch literal 973 zcmZ`$ZA?>F7(O>JKoMcP4C-LZ6=tnUN$FsL!nD=4QlLO@uTx?mu(pgYFfZ*j3|K-d z*fJ?}6EKXyvOmk5ic#5zTQu2_6k;)RDvMj@vdw9X3C`dL87_Nv?)>GCot$&tbKduP zp7+T)?^IWAPg?ohNpII-bzS^ zk`P}HAux`r$u_Ry#a9A=RO+2{nb_*Tb5L zvNQxgKwtzt@4+9$8iFE%EkySAcv4x~v5)E>MR*b)-;w>(QivuG|93co%>)%0=sqNy zq4X*a{&z8S20{)xd$79%UN3^95Ub^0Vioocq3ZxVHE88g_AD%^u&dw?qjwxZI>%71 zK+gy&*3kERcs<2Q-?UcZE9L)ra@b6xz3D$hR-2dpd^zY%n>n4#uzKIQ<)yP7#VJhH z@b?eyT?m^ihc4br$AsnJ<$AUYVCZA6Y%xYcqP;fe=+^UMt^j zj14#aXrq^S$znCd-;8AwSE#cmVr2uzEk=W&xa_DWj9F<|+ZgxaH?vteQ|ALY+(u=t zKa1P2PTfs&s*H^FGm*fr(M{8l4I2%{tHV2l`6~s#v-zKYwpV&ksJNfBs{a|59Xx2~ z`H;2Zf?`gcGr`+0UwTP9d1|7ic|lRQ@OcKXxO;?{y;+Jab2mB!;+>-YT& DhC!u= literal 0 HcmV?d00001 diff --git a/apps/course-builder-web/public/favicon-32x32.png b/apps/course-builder-web/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf413b4e5c4553c0d99498a4b2679d8f3daab92 GIT binary patch literal 1624 zcmZ`%3s6&65WPS`A_)~sK-8uUq!lWt0g(do2^u~Thyg-~qb)&*6$J^I1R`1tpFm84 zFj^2x>`+A!KOo{bqNq5fDGK9Y{h^gn(Y6*r3nB`r+Z)nhD7J6*-97K@?!D*kz8!pC zxUJ1x8-$Q8H-Zz3J;U^pt?s-Uf>2{ANOgvKzX zdV-LGg;1XuA^%E*W=jocV*(Je+{up;gyICy9fr+Z$dbTAfb=lX)q)n=LC|7847PDV za}qWzfgl8BEf8V>AqYy202{%M!w`S~?@(L~ayjH_K#>UL?NCq(G9i@IgSs4~eAvVW z{ZWweAdO=>OLqj)LnlC;37AgA_j8K9FBmgZ6EL2ZV~(21$>=oF%ulXZ zk4eeI&eJf~hBd3dGmQ)nm+t}v6;Rd$ZU_YKu)PFU`+_nTiuOQJC1mg>1~)N5eVwUw z8PTSu;TGk83)?jyOMuK+;L>0vHV5F^gTMm{c7bM}sVC8NP*<65$D;%9V*q$v_WU6J zBhSlYd2!hP_mdt&K3n15*F}>IFDKOIGkPxB3dRP!E2NIsPLen;AG@mGCen-t?fjMJ zM_)9iu_%^K5!&{_cl{S~gFdt%x`?W7zIxGF#+zrgv7vW-^w%1}hT{*%U*FvyM|2kM zy*@J3Q4%@V%5rv?#`xE}zLsqPvn*!%W}O=ys^7TS#{Q=oQsLXLI4>W~ckF5`&xjlA zU-HSlRx068UdnKY`=4Dja&vhaKUl16$LcNCMTT?kWZPu>;t!IX8y!meonTLyv541i?L3%FD5+ud2Zl01{)_o>IeNj+q>*)>H07ugE;??uS4bD0-8wF%WrMp zpdi<@-nBkQH|S4iiHW3v=+(_E#WG)izjJKbnX}DXl`>{s((us8;L8`m1Om>OX-%*u z78e%frT5M#)#$Z5{iqhgCVtQh$E5-jR>oM9*|aEw_m(RHXP@C}JI6{N`hKx7D$K{)gUuE@ ziZ1p0>0P>+E5y$N%JN4kPIIJgqBG7l`++SI-x+$EkZ`O`g1R*E zM;j8qY;r8kS3GT4+taF9lXs%kIIqg*Q3YvkqvYx70i{EKcXK4Q!E&%?>!*A*q7Gcw zT_~Yn!;||=9x9TjB*`WI$ubFc$cyFWwUFh#(9=)g>FLk%^Y>or&SLqqSmVX#QGMadL2i7p^B(pxd`>mo+Tez RzO)=4fw-YOPW^Im{@?8B38?@8 literal 0 HcmV?d00001 diff --git a/apps/course-builder-web/public/favicon.ico b/apps/course-builder-web/public/favicon.ico index b5336a48e6e7341e6e866c5f477d1a006dc6bf9e..2fec5d3e1ca86833f93f390903af888896ee2a34 100644 GIT binary patch literal 15086 zcmd6u3vg7`8OLu33R6)ck02lt8Rbzr1C$mY&}_iKSOS4SKo}fosZJ@75(tR3k{2XF zAS9Sa3sj~mv}hFyiq(n~iv?!Hg41G4u^pxAv=%WXp;<8O*Wb6hH!jQFXYLJqXMQ<* zALsl2=iIYr&-u=YVI&#J#_-_=X_~R~PQw^w7)Dx}|2)Mo{=u~rQoX;RqhXZuz+j#s zi}4-M>)zuIU(!B*C27l_kVC3}TZPDT>!r$3hc+8W z|0wjI3()`e&h^sGW;c$RLw^DK#jC&ETmR?LpYE7L8x5nqGrSz6U(mnGMmLU`Li-T- z*h2psl;H-)9NT0V?eoE7q5o6#>rZOJ9_UVn?I0HVwGAy!Sn&u$_ib=GjQ(Ae;rc`^ z1G;nIQW*UoqQ6~7VX@Q|x@%N>82v5ipA(DC_Iei0J>hr+{rVkvYUjGd8_%J895h9t z|2@jkr@iVmT0iJ6HMMIRqW{tQZ-%UB?Y75r=)D;ZMX6uQPzBd?PJq@MUNTpCjnkGAP;~oq^qu2P43?F$P-n z_p~o$Lp8hujc}FT;A>IpH_M@^2lTxhfI@IVH%N-*JAjT(Fc9X#({Ku|Xd9e6p+B%J z`neH~K{aGUUr4qr%U#mNNSBe+*%H_TA3+Ov+i|?6>#ZBH*@HBJL zxi41A!2O$~la^)3bSdmNS>8&WDCc^7TRb3k&>cI&W{T9VVGg|3R$8`J$j9|%vaf2j z%q)CVO4hBCBb!R3p{7(kAa+q+C^B=I$h4&*)7yaNH^I*38B66~vkTk&M>@k0m=D|GG+cz>?^oD!ZR>SqB9qWR0sV2%M4sbN13AzSh%QEdpt&RTgB+-V zOIpslNq{AHiP8 zhmp`FlmWjq|+VywxEoglY5%h23yLe5< zZ^7k5`|2q5yQ%LedZq4k$SYCMTXI!X;;H2*3^uQlA71e=QLlk=6Cz;h~KW5eoVin zj@C3tx2fMOms!r%)aBD1TtBVnMZWu<;8gUw?$b(x3~1e_mBNXQ$KA7KF>$`BHkypy z)L`j6G*@1$ERwqDGuim$7#Yewkbl>&mJ=^kOAi|@M`y|<58ak6vZYL#h$)VZE|Wb^ z5$Eqn?EDwRr-glB!f#TEJ(i=hg8%;bf4?8)SO1Jj4)WXHF7Yi@i2v#MzZBqK*H=bH zr@rk^;lEDTE&}{(Y+*^;El0M1?^HNp;eQVr9FN!GI}pQ?#SGXG>wY-hOS2G$!B@hU=<2)J z?f|`D0<49@&;VDgEn3vS`Zv+ox$djl50AqbxEc6Gw>XB$b;h^kb_NDBvAY@m1piYX z;RxveBCY?Or;mCYD(Ne;c2`QDqxHTu%i%L+!GJ09V(%>Zu;)bi!n?*dk+nYHJS4h~ z$39|ta&>HLct5KU_vQ-u8)NWi)|blkl`CXn`Qx&?s#wmjKKDhmYjm}&=dESr@qm9F z&Rj=}l(NotamF$^J!iRWf9Mg()wl7-ZF1e-Y8miCrOcv!w!%r)*P6qvvGI)jlyx-b z5z(xpH8NK^rt>}K9NFoMr0<~l)@#PJkq&SR+z;#EDEt@9w&hKEm+}+*XXBqaa4@=N zbQUzWQV8kL4XoRrMUyly;Wq{Dg-1d6I(pYrLipEs!X8)*!@<_L4!(7r>M(fQyG8kT z;M3Or$E*i4#dlc<|CjMS&wS3Q6yKR}!J__ky={W6!xS2_Ae=!gM2L%YEoLgD=x4pA_q@;O zvu+dDm-f`I`Y;g@jZ>sR8nnhKV%iO27-Qy0PCczEAII{4O^i{6y=3R<-;QlsBO5D9WPJWInNsqY)DiD_ z_sJ5upyN-Ibu_8jLE})ynT?E1-(8QE@m~>;Kc@Gm z<|xO6&E?WeJo}?Fpl<%2KvD*a|+`8{*b@CSaKd-DdV*~ jp$?5{dWycJh0iT6!*KT}X3MBrY2dS7(|du>YTo|?`7}98 literal 23600 zcmeI4YmXFF5QckMt_#9~A|eR0un<@-0Td&mM&yGDL5La*i5i4>L8E>%(V+2{5q^?? z!ER>HQ`Oydy3aY?Jv$3Mf%G$Vs@|$o)6>(}&9a4TF zKg<4m_B6L%y0q?b`nly`mYvD{@~}K=I+8Co#VeoB^xtjhhAtfID%1d1b*N@D#yK!} z14@QRPE;>VwZegct&j;zCFe!c2jiPMbtw>+9Gnxjf1rHjk{8xxNJDMDdJq=5I^ksZ z;MZyd{u-)I`aOORAPrZvZ^3#H)=n5j@O~-q8$2{<3CDUIR)hJM8M6srVBHJ-2IZTI z`ioHw+6{ZligsHERT+^(&}&{F`=clDQx}Nk4%9n*j$%ty&$m-J--U*Qw~*cj{S5&- zUAs2xviLEZqF~D$OqSbISAMd4F{)u zRru`TrQEV42tNjG6x_Ay^V!0StWBHHeNZyUY9)Is$zmV*CR??KXYfxxTqE~9>#bl< zln%~2s)E*gyj!6(O}y=WYKALt!YZM#;n%XmhTjw(`1G{B64UUuG{sU`Ps}Kt#bSa! zgnVFyS8cx7y1h1$LJBvTjQ42Mr6y(z)BrB3Y1t5788Ro)BwZb==$UV;G1hxC&@^@` z8AUk`!c+&V(5kH-<+Jot_|HCh?9~db_c*sga@8oGfMSUxiEK-Y9C zta5mL4_gRmu_g}Dn)-O>gT$AR57;8%um;7#-ll2kv2bB?ii8JkB=H6=yIQck2br+X z1%xb31=DCwu1JCRE+`7lyE=(VI@ln(6}&Sk&1R`p$8;!;?UP@oqG@cLLy@1T#QnoO zel>L-B0_X15cPD<&2#>FANi z4!n#VC^k98W$N$p|Kk;+yb0rL?7-N8u> zC0*N2##f+QjdY#SpvyF_KB6YjPtZUh7m#Vb8pd&yW@f| z4R>_=d`y6x62cS<+)nFD=ChM%sBWGmLoEDBK=8UkM0!>vw)k4sWGA}kb{09&{tF6$ zNmISnScqt|PyPr?{0qq;TPIgIpODXlh1dz8lD?5_y})VJMBV|~R^&rpS|{t@4XdIy z8;WuuizyI-ZgZ>Ff%ZV1a{0&;y$;nBkP3t!oI=bJ?ScCeQ*uD&J3THQCFK@GAj4JoyXP%bdp#m@4(F?j~pc4#O4FJd9k!dfV-R`$J7@b zk8Py(r-)fKRUQ~8bs&_Uqaa4kamy|%g9#uXWYWQ*>n)iF>?=81o_NJC9EuZh#U=Xn z7lHBsE2cnLb6Q=NvajO*~BQ$s(JFmBR@A3 z(FIDEjS!M=!S<#$#EzjqaNAs66I4ppIUETR%fu5b8r^2cYj8NvIIGsRd8Rr z%u>!K$irt0c7fvWJ9%FS%kwPOMbH)eUS5(*XzZ63ZKX5mTU8`9cps$0=^iw~KpiOk zO{>zUEyroSq<+KthNAos8eujaIHErfQpz@39=v0)3+&P9O6%G9(Xaodzb@@fj;(zy zQMv~80=xAJfZ}~3F~N?M&PZ@bGy_OwQ5DPS#1LJ<_wM%{`dVtJ*!&j4VJq eAi2Y^nY=fz>F@5yV+Y0#j2##|Fm_;GJMceGE{$0L diff --git a/apps/course-builder-web/public/mstile-150x150.png b/apps/course-builder-web/public/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..6148d65147cad256a04403a073f7126d2c507ea6 GIT binary patch literal 3792 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 + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/apps/course-builder-web/public/site.webmanifest b/apps/course-builder-web/public/site.webmanifest new file mode 100644 index 000000000..175bc12ec --- /dev/null +++ b/apps/course-builder-web/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Course Builder", + "short_name": "Course Builder", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#040308", + "display": "standalone" +} diff --git a/apps/course-builder-web/src/app/[article]/page.tsx b/apps/course-builder-web/src/app/[article]/page.tsx index 36c1e99ab..ba414ec18 100644 --- a/apps/course-builder-web/src/app/[article]/page.tsx +++ b/apps/course-builder-web/src/app/[article]/page.tsx @@ -6,6 +6,35 @@ import {getAbility} from '@/lib/ability' import ReactMarkdown from 'react-markdown' import {getArticle} from '@/lib/articles' import {notFound} from 'next/navigation' +import {type Metadata, type ResolvingMetadata} from 'next' +import {getOGImageUrlForTitle} from '@/utils/get-og-image-for-title' + +type Props = { + params: {article: string} + searchParams: {[key: string]: string | string[] | undefined} +} + +export async function generateMetadata( + {params, searchParams}: Props, + parent: ResolvingMetadata, +): Promise { + const article = await getArticle(params.article) + + if (!article) { + return parent as Metadata + } + + const previousImages = (await parent).openGraph?.images || [] + + const ogImage = getOGImageUrlForTitle(article.title) + + return { + title: article.title, + openGraph: { + images: [ogImage, ...previousImages], + }, + } +} export default async function ArticlePage({ params, diff --git a/apps/course-builder-web/src/app/tips/[slug]/page.tsx b/apps/course-builder-web/src/app/tips/[slug]/page.tsx index 7dd5d8afb..208970f56 100644 --- a/apps/course-builder-web/src/app/tips/[slug]/page.tsx +++ b/apps/course-builder-web/src/app/tips/[slug]/page.tsx @@ -1,11 +1,5 @@ import Link from 'next/link' -import { - CardTitle, - CardHeader, - CardContent, - Card, - Button, -} from '@coursebuilder/ui' +import {Button} from '@coursebuilder/ui' import {TipPlayer} from '@/app/tips/_components/tip-player' import * as React from 'react' import {getServerAuthSession} from '@/server/auth' @@ -13,6 +7,35 @@ import {getAbility} from '@/lib/ability' import {getTip} from '@/lib/tips' import ReactMarkdown from 'react-markdown' import {notFound} from 'next/navigation' +import type {Metadata, ResolvingMetadata} from 'next' +import {getOGImageUrlForTitle} from '@/utils/get-og-image-for-title' + +type Props = { + params: {slug: string} + searchParams: {[key: string]: string | string[] | undefined} +} + +export async function generateMetadata( + {params, searchParams}: Props, + parent: ResolvingMetadata, +): Promise { + const tip = await getTip(params.slug) + + if (!tip) { + return parent as Metadata + } + + const previousImages = (await parent).openGraph?.images || [] + + const ogImage = getOGImageUrlForTitle(tip.title) + + return { + title: tip.title, + openGraph: { + images: [ogImage, ...previousImages], + }, + } +} export default async function TipPage({params}: {params: {slug: string}}) { const session = await getServerAuthSession() diff --git a/apps/course-builder-web/src/utils/get-og-image-for-title.ts b/apps/course-builder-web/src/utils/get-og-image-for-title.ts new file mode 100644 index 000000000..fb816e013 --- /dev/null +++ b/apps/course-builder-web/src/utils/get-og-image-for-title.ts @@ -0,0 +1,7 @@ +export const getOGImageUrlForTitle = (title: string) => { + return ( + `https://res.cloudinary.com/badass-courses/image/upload/w_1200,h_630,c_fill,f_auto/w_630,h_450,c_fit,co_rgb:FFFFFF,g_west,x_45,y_-40,l_text:arial_60_bold:` + + encodeURIComponent(title) + + `/course-builder-og-image-template_qfarun.png` + ) +}