├── .gitignore ├── static ├── css │ ├── footer.css │ ├── animate.css │ ├── header.css │ ├── main.css │ └── index.css ├── img │ ├── portfolio.png │ └── texture.svg └── js │ └── index.js ├── go.mod ├── main.go ├── templates └── index.html └── go.sum /.gitignore: -------------------------------------------------------------------------------- 1 | tmp -------------------------------------------------------------------------------- /static/css/footer.css: -------------------------------------------------------------------------------- 1 | 2 | footer { 3 | grid-area:footer; 4 | text-align: center; 5 | padding: 1em; 6 | } -------------------------------------------------------------------------------- /static/img/portfolio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Phillip-England/landing-page/main/static/img/portfolio.png -------------------------------------------------------------------------------- /static/css/animate.css: -------------------------------------------------------------------------------- 1 | @keyframes wave { 2 | 0% { transform: rotate(0deg); } 3 | 25% { transform: rotate(-10deg); } 4 | 50% { transform: rotate(10deg); } 5 | 75% { transform: rotate(-10deg); } 6 | 100% { transform: rotate(0deg); } 7 | } 8 | 9 | @keyframes glow { 10 | 0% { 11 | box-shadow: 0 0 5px red; 12 | } 13 | 50% { 14 | box-shadow: 0 0 20px red; 15 | } 16 | 100% { 17 | box-shadow: 0 0 5px red; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/js/index.js: -------------------------------------------------------------------------------- 1 | class ActiveLink extends HTMLElement { 2 | constructor() { 3 | super(); 4 | this.path = window.location.pathname 5 | this.href = this.getAttribute('href') 6 | if (this.path == this.href) { 7 | this.setAttribute('active', 'true') 8 | } else { 9 | this.setAttribute('active', 'false') 10 | } 11 | this.addEventListener('click', () => { 12 | window.location = this.href 13 | }) 14 | } 15 | } 16 | 17 | customElements.define('active-link', ActiveLink); -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/Phillip-England/landing-page 2 | 3 | go 1.23.3 4 | 5 | require ( 6 | github.com/Phillip-England/vbf v0.1.0 // indirect 7 | github.com/PuerkitoBio/goquery v1.8.1 // indirect 8 | github.com/a-h/templ v0.2.771 // indirect 9 | github.com/alecthomas/chroma/v2 v2.14.0 // indirect 10 | github.com/andybalholm/cascadia v1.3.1 // indirect 11 | github.com/dlclark/regexp2 v1.11.0 // indirect 12 | github.com/yuin/goldmark v1.7.4 // indirect 13 | github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc // indirect 14 | golang.org/x/net v0.28.0 // indirect 15 | ) 16 | -------------------------------------------------------------------------------- /static/css/header.css: -------------------------------------------------------------------------------- 1 | 2 | header { 3 | grid-area: header; 4 | display: grid; 5 | grid-template-columns:auto; 6 | grid-template-areas: 7 | "img nav" 8 | ; 9 | } 10 | 11 | header img { 12 | grid-area:img; 13 | border-radius: 100%; 14 | padding:1rem; 15 | width: fit-content; 16 | } 17 | 18 | header nav { 19 | grid-area: nav; 20 | display:grid; 21 | align-items:center; 22 | justify-content: end; 23 | } 24 | 25 | header nav ul { 26 | display:flex; 27 | flex-direction: row; 28 | list-style: none; 29 | gap:2em; 30 | } 31 | 32 | header nav ul active-link { 33 | font-size:1.2em; 34 | user-select: none; 35 | cursor: pointer; 36 | } 37 | 38 | header nav ul active-link[active='true'] { 39 | border-bottom: solid red 4px; 40 | } 41 | 42 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "html/template" 5 | "net/http" 6 | 7 | "github.com/Phillip-England/vbf" 8 | ) 9 | 10 | const KEY_TEMPLATES = "TEMPLATES" 11 | 12 | func main() { 13 | 14 | mux, gCtx := vbf.VeryBestFramework() 15 | 16 | templates, err := vbf.ParseTemplates("./templates", nil) 17 | if err != nil { 18 | panic(err) 19 | } 20 | vbf.SetGlobalContext(gCtx, KEY_TEMPLATES, templates) 21 | 22 | vbf.HandleStaticFiles(mux) 23 | vbf.HandleFavicon(mux) 24 | 25 | vbf.AddRoute("GET /", mux, gCtx, func(w http.ResponseWriter, r *http.Request) { 26 | templates, _ := vbf.GetContext(KEY_TEMPLATES, r).(*template.Template) 27 | vbf.ExecuteTemplate(w, templates, "index.html", nil) 28 | }, vbf.MwLogger) 29 | 30 | err = vbf.Serve(mux, "8080") 31 | if err != nil { 32 | panic(err) 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /static/css/main.css: -------------------------------------------------------------------------------- 1 | 2 | main { 3 | display: flex; 4 | justify-content: center; 5 | align-items: center; 6 | flex-direction: column; 7 | gap: 2rem; 8 | grid-area:main; 9 | } 10 | 11 | main section { 12 | padding-bottom: 15em; 13 | display: flex; 14 | align-items: center; 15 | flex-direction: column; 16 | gap:2rem; 17 | } 18 | 19 | main h1 { 20 | font-size: 2.5rem; 21 | text-align: center; 22 | } 23 | 24 | 25 | main a { 26 | background-color: red; 27 | color: white; 28 | padding: 0.5rem 1rem; 29 | border-radius: 5px; 30 | font-size: 1.5rem; 31 | text-decoration: none; 32 | display: inline-block; 33 | animation: glow 1.5s infinite alternate ease-in-out; 34 | cursor: pointer; 35 | user-select: none; 36 | 37 | } 38 | 39 | main section span.hand { 40 | display: inline-block; 41 | font-size: 2rem; 42 | transform-origin: bottom center; 43 | animation: wave 1.5s ease-in-out infinite; 44 | /* padding-right: 0.5em; */ 45 | } -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Phillip England - Software Developer 8 | 9 | 10 | 11 |
12 | 13 |
14 | 15 | 28 |
29 | 30 |
31 | 32 |
33 |
34 |

👋Hi! I'm Phillip England,

35 |

nice to meet you!

36 |
37 | Yes, I'm Hirable! 38 |
39 | 40 | 41 |
42 | 43 | 44 | 45 | 46 |
47 | 48 | 49 | -------------------------------------------------------------------------------- /static/img/texture.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/css/index.css: -------------------------------------------------------------------------------- 1 | @import './header.css'; 2 | @import './main.css'; 3 | @import './animate.css'; 4 | @import './footer.css'; 5 | @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap'); 6 | 7 | :root { 8 | --c-black:#111111; 9 | --c-white:#eeeeee; 10 | } 11 | 12 | 13 | * { 14 | margin: 0; 15 | padding: 0; 16 | } 17 | 18 | html, body { 19 | box-sizing: border-box; 20 | width: 100%; 21 | height: 100%; 22 | min-height: max-content; 23 | font-family: "Roboto", sans-serif; 24 | background-color: var(--c-white); 25 | color:var(--c-black); 26 | 27 | } 28 | 29 | body { 30 | } 31 | 32 | #root { 33 | background-image: url('/static/img/texture.svg'); 34 | background-repeat: repeat; 35 | background-size: auto 10px; 36 | background-color: var(--c-white); 37 | display: grid; 38 | height: 100%; 39 | grid-template-rows: auto 1fr auto; 40 | grid-template-columns: 5% 90% 5%; 41 | grid-template-areas: 42 | ". header ." 43 | ". main ." 44 | ". footer ." 45 | ; 46 | } 47 | 48 | @media screen and (min-width: 500px) { 49 | #root { 50 | grid-template-columns: 5% 90% 5%; 51 | grid-template-areas: 52 | ". header ." 53 | ". main ." 54 | ". footer ." 55 | ; 56 | } 57 | } 58 | 59 | @media screen and (min-width: 768px) { 60 | #root { 61 | grid-template-columns: 10% 80% 10%; 62 | grid-template-areas: 63 | ". header ." 64 | ". main ." 65 | ". footer ." 66 | ; 67 | } 68 | } 69 | 70 | @media screen and (min-width: 1200px) { 71 | #root { 72 | grid-template-columns: 15% 70% 15%; 73 | grid-template-areas: 74 | ". header ." 75 | ". main ." 76 | ". footer ." 77 | ; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/Phillip-England/vbf v0.1.0 h1:wIJUpKGVqwaYpS4k3Ruq3TETVEkK9PISTaTx5TXkjXs= 2 | github.com/Phillip-England/vbf v0.1.0/go.mod h1:hqZAzPU2+uEvab2BEcCHiB0cMQaXBTyXKDOSeTqi3co= 3 | github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= 4 | github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= 5 | github.com/a-h/templ v0.2.771 h1:4KH5ykNigYGGpCe0fRJ7/hzwz72k3qFqIiiLLJskbSo= 6 | github.com/a-h/templ v0.2.771/go.mod h1:lq48JXoUvuQrU0VThrK31yFwdRjTCnIE5bcPCM9IP1w= 7 | github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= 8 | github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= 9 | github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= 10 | github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= 11 | github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= 12 | github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= 13 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 14 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 15 | github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= 16 | github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= 17 | github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= 18 | github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= 19 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 20 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 21 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 22 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 23 | github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 24 | github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= 25 | github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= 26 | github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= 27 | github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= 28 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 29 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 30 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 31 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 32 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 33 | golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 34 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 35 | golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 36 | golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= 37 | golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= 38 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 39 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 40 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 41 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 42 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 43 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 44 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 45 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 46 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 47 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 48 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 49 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 50 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 51 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 52 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 53 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 54 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 55 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 56 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 57 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 58 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 59 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 60 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 61 | --------------------------------------------------------------------------------