From 694648bc82061c34441fae8f3a607bd4166f9b55 Mon Sep 17 00:00:00 2001 From: darius Date: Thu, 16 May 2024 22:56:04 +0200 Subject: [PATCH] gomponents first page --- go.mod | 1 + go.sum | 2 ++ web/assets/images/favicon.ico | Bin 0 -> 5238 bytes web/components/navbar.go | 43 ++++++++++++++++++++++++++++++++ web/handlers/homePageHandler.go | 26 +++++++++++++++++++ web/handlers/pageTemplates.go | 20 +++++++++++++++ web/webRoutes.go | 5 ++-- 7 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 web/assets/images/favicon.ico create mode 100644 web/components/navbar.go create mode 100644 web/handlers/homePageHandler.go create mode 100644 web/handlers/pageTemplates.go diff --git a/go.mod b/go.mod index d489dcd..9c88e09 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.19.1 // indirect + github.com/maragudk/gomponents v0.20.2 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/zclconf/go-cty v1.14.2 // indirect golang.org/x/mod v0.17.0 // indirect diff --git a/go.sum b/go.sum index 0d7e1da..61f6efc 100644 --- a/go.sum +++ b/go.sum @@ -46,6 +46,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maragudk/gomponents v0.20.2 h1:39FhnBNNCJzqNcD9Hmvp/5xj0otweFoyvVgFG6kXoy0= +github.com/maragudk/gomponents v0.20.2/go.mod h1:nHkNnZL6ODgMBeJhrZjkMHVvNdoYsfmpKB2/hjdQ0Hg= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= diff --git a/web/assets/images/favicon.ico b/web/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d5f7d2483b8beff204392ac225420fa9f4b2b8dc GIT binary patch literal 5238 zcmbVQX;hTg8K$ji`ZNFh>*{X_7O=^qZV)*O%rO;RM8w` z+!K>}+Vq^XrzSy6f+hwxTu_!_84=DR~Y`s z`No-!!Io(Iz{pJZaB#+VI~YCJGcwb0t0j86voT!vVd4BWf@uxL>D2lm0>W?o3*mSE zjd0_qh#dL~kxwrmviBq+M^7Vi_-lmRd%@mibK>j7=d$^Wzz~~1Tx=^GDzu?5--?b^ zX0)#~;X;NH=hBQgpJu}OR5LE5SO`{JNVehPayzcBaG`5?DSW>xD-4(njrVyTudd#Y z=Qdx$vl}mpXrPhsYleD;O9FmV-;Qd>VRWY1aWkW=amuQ1d1TU~%~XcsbtmwPU6V+9 z7YpL)os-CW`Ez`hUxnUGJ8rEkZ3#N~k!hO&w|NeE4PRlq!;2GY7n;?jIH@W}vyz~w z#OJa~Y&E=rtk=HAl}sZBvK<&)=^hC>b-|#W$8EhDIU8HC*SZcqr5b*v7B>|-_+@(d zB?j~q=&?szkIeOFa3xERfmJpPu5t#$rP^S~#p8~N=5K1nd-iqcRjV2T}99GZ1_IU6%3biBeVwYSyaf`O!n<-(XCRTPo+X%i5k5M4SHo- zbQW`H;y2Lz)9A?6;d?r>dj+nMnM$rDQm)0QU4`O}EvT<}6Gx4e_`pzwqkI*PXldj; zIIQvDHOE`XTmL0|g$CT0I`BZ^Zi!Z_8>5vP1l(%8{>o0Id)x5Rw##^t!Fxr-)+=~v z>s6#|I)}~W@8Y)Hj4`<#qY`@~R+kjccr=L68o_c70T+jd4jsmAI*eI(JfO23H5f3; z8!@6YVN7GexY~yC5`aK)zQr&AkR6YWO7 zx{l~&KO*~2A$qCPMJzA>~g*J~)k;8@CWS(T?!W6Np~BiO9#_ zB>F(#8(Nu-h5TU8gQ@lR6K%8af}NIYLXHjZ_$Ow%zem{ncfprvn@`BYf_<{Za&q*G zD~KFB1NJxe-u(5LjfH%ezwh|GkmmqG8;)T**DD}Yb5I=P&*g6-RIv|1%Ps_+?;=$G z9)ik7VGbMP>&zV+S`#^lo%avCyQtdnf3J}k5BIV?&G)iAh~w@`4{m3AFq~11Tj^B- z2GgrCm^K%;(mc48Dq@hv!4&$QvU&~%lj-;58UaHz4kfR_FkvXUwwZBoN3UOcPp89O zE#+#B4*g0EE=yE6oiE3!Tq&BfMSPJZgMgKCG-om>(43*b$#f;51TASQoFcTOs?n0d zpg~Kr1}B$uIJH8Hub1<2}c81=YI@o>nz7Qfuyji2p_{Al}Z?lNx=cFEV_TBZrUEYede9q4Ds zaKWGHZVTEC{-9ki)FQ^iB=In6;PH;ji>G#nkg@(Gb{N;=FQz|Wr>PD*jdj>%tS2;J zm!SbW3A^+g(WKvm-GnB7Gn#ap@fNoc8Ee19Q^dhm-Rrnc`mHb9j=n5A`m>zm10mDx z4?1+?Vl8Ao=*d3SWP=WGySE8@=W34OoJ58Wxe7PrYTS@%a6`&K+C#$hhfYKxkFFv; zx(W>F$~WM`DlIgXe-+l)O!hmnjOZn8)R#?QJY*3EnU3)g)$@>3tjCOpDe_^|sKwi5 zUSY0w&4;)sm7zzGy4|wkq`ZX4-|*wL&(MS0Mir%(t8vS^Xz|s3sNaM6(#5<9~gY(LyzDChaTcU z@S~XdKq%A;XwTumRedb(pWjXzn*7Q!6RhL|fqd|j)?|7l>?RIKlQ15p9eO-4Yw_pu z*#2v2|8gn1N=ndELL86=^-+!zI3OQ-7U020JhbO>&{m7~H|e*bBZs)jqy3Zp{#+~k zId%-^x)3fCbyZ04K}YsUn_0M7``jAZzf3~*m1LhdP%{WzwG;RY5xR2*&oVt;7*>KG#NJ@DHC-Ws59uJ8;_#`^C=WD=Ke4_Am2h7*^avfE{qhq$0HRQKlw1rLy+QO z%%&mxTZFk>?NOYU7onp>jvEY01wo1H3MJi#5`qeyG6oGg>0U5B&TuhL1_i;Ho#Sc0=fQhdiyD8qLJgnR|g=E?EpDk)UeABy`odeK?HV_0Gl^}WwVxK|rfKZtRcghU-#8Zb2Yv0GqzdwXEuO1}O_{t&F64Iq#YgZq_G3yo#XlSoWEA=)uvQIuxkHmNwlR4C=kuRO`s39QE1I0s_dX-=)heyQ4 zLnp-q<);Zd>z{axTY2iC^cXW!uArLvz{qko)eXJaOR;|HK4-?LmijU3tEeZ!1oc)E zs#t#&;~^k-3B3W?ZWiqm2eUkgXE8rNuv(E=FIfK+*AGH3W{CAtyjkqYw3c{ZMm~rf zh&(t1{lzpGoq_2w2gF63hgdu$=7;(9g4L|Jeh_pN^@Ec}=7U*4KxaWf@WG0Qi99In zbNZ1PkE%89!~A%N-wUyKOsE$^4@o&YK|f5=c|4H^;$T8$ouj`64r%C{=;ctp>7I1i2C74 z@$iT@w+8eJ+h!cZKe2dt9FuV#78MUHE?F!H@z6|m=bU%k){{ndH)Hw1%km`4)vxXgD5B`{*JWl@?@J^ca>Hzf@PqOhJWT@3O literal 0 HcmV?d00001 diff --git a/web/components/navbar.go b/web/components/navbar.go new file mode 100644 index 0000000..cd2813d --- /dev/null +++ b/web/components/navbar.go @@ -0,0 +1,43 @@ +package components + +import ( + g "github.com/maragudk/gomponents" + c "github.com/maragudk/gomponents/components" + . "github.com/maragudk/gomponents/html" +) + +type PageLink struct { + Path string + Name string +} + +func Navbar(currentPath string, links []PageLink) g.Node { + return Nav(Class("bg-gray-700 mb-4"), + container( + Div(Class("flex items-center space-x-4 h-16"), + navbarLink("/", "Home", currentPath == "/"), + + // We can Map custom slices to Nodes + g.Group(g.Map(links, func(l PageLink) g.Node { + return navbarLink(l.Path, l.Name, currentPath == l.Path) + })), + ), + ), + ) +} + +// NavbarLink is a link in the Navbar. +func navbarLink(path, text string, active bool) g.Node { + return A(Href(path), g.Text(text), + // Apply CSS classes conditionally + c.Classes{ + "px-3 py-2 rounded-md text-sm font-medium focus:outline-none focus:text-white focus:bg-gray-700": true, + "text-white bg-gray-900": active, + "text-gray-300 hover:text-white hover:bg-gray-700": !active, + }, + ) +} + +func container(children ...g.Node) g.Node { + return Div(Class("mx-auto px-2 sm:px-6 lg:px-8"), g.Group(children)) +} diff --git a/web/handlers/homePageHandler.go b/web/handlers/homePageHandler.go new file mode 100644 index 0000000..7a57ea0 --- /dev/null +++ b/web/handlers/homePageHandler.go @@ -0,0 +1,26 @@ +package handlers + +import ( + g "github.com/maragudk/gomponents" + "net/http" + "portfolio/web/components" +) + +func HomePageHandler(w http.ResponseWriter, r *http.Request) { + + err := Page("Homepage", createBody(w, r)).Render(w) + if err != nil { + return + } + +} + +func createBody(w http.ResponseWriter, r *http.Request) []g.Node { + + return []g.Node{ + components.Navbar(r.URL.Path, []components.PageLink{ + {Path: "/contact", Name: "Contact"}, + {Path: "/about", Name: "About"}, + }), + } +} diff --git a/web/handlers/pageTemplates.go b/web/handlers/pageTemplates.go new file mode 100644 index 0000000..ee2e372 --- /dev/null +++ b/web/handlers/pageTemplates.go @@ -0,0 +1,20 @@ +package handlers + +import ( + g "github.com/maragudk/gomponents" + c "github.com/maragudk/gomponents/components" + . "github.com/maragudk/gomponents/html" +) + +func Page(title string, body []g.Node) g.Node { + + return c.HTML5(c.HTML5Props{ + Title: title, + Language: "en", + Head: []g.Node{ + Script(Src("https://cdn.tailwindcss.com?plugins=typography")), + Link(Rel("icon"), Type("image/x-icon"), Href("assets/images/favicon.ico")), + }, + Body: body, + }) +} diff --git a/web/webRoutes.go b/web/webRoutes.go index 814a77b..7f44b56 100644 --- a/web/webRoutes.go +++ b/web/webRoutes.go @@ -2,7 +2,7 @@ package web import ( "net/http" - handlers2 "portfolio/api/handlers" + "portfolio/web/handlers" ) func WebRoutes() *http.ServeMux { @@ -11,7 +11,8 @@ func WebRoutes() *http.ServeMux { mux := http.NewServeMux() // Register the routes and webHandler - mux.HandleFunc("/", handlers2.CatchAllHandler) + mux.HandleFunc("/", handlers.HomePageHandler) + mux.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("./web/assets")))) return mux }