Skip to content

Commit

Permalink
POC portal init (#94)
Browse files Browse the repository at this point in the history
  • Loading branch information
led0nk authored Oct 12, 2024
1 parent b3a1783 commit ee354c3
Show file tree
Hide file tree
Showing 15 changed files with 489 additions and 3 deletions.
73 changes: 73 additions & 0 deletions cmd/portal/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Copyright (C) 2024 the lets-party maintainers
// See root-dir/LICENSE for more information

package main

import (
"context"
"flag"
"log/slog"
"os"
"time"

"github.com/quixsi/core/internal/portal"
templates "github.com/quixsi/core/internal/portal/tmp"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)

func main() {
var (
addr = flag.String("addr", "0.0.0.0:8080", "default server address")
otlpAddr = flag.String("otlp-grpc", "", "default otlp/gRPC address, by default disabled. Example value: localhost:4317")
logLevelArg = flag.String("log-level", "INFO", "log level")
)
var logLevel slog.Level
err := logLevel.UnmarshalText([]byte(*logLevelArg))
jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: logLevel})
logger := slog.New(jsonHandler)
if err != nil {
logger.Error("unable to parse log level", "level-input", *logLevelArg, "error", err)
os.Exit(1)
}

slog.SetDefault(logger)
logger.Info("log level set to", "log level", *logLevelArg)
logger.Info("start and listen", "address", *addr)

setupOTLP(*otlpAddr, logger)

//NOTE: for implementation of observability (later)

templateHandler := templates.NewTemplateHandler()

portal := portal.NewPortal(logger, *addr, *templateHandler)
portal.ServeHTTP()
}

func setupOTLP(otlpAddr string, logger *slog.Logger) {
if otlpAddr != "" {
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()

grpcOptions := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock()}
conn, err := grpc.DialContext(ctx, otlpAddr, grpcOptions...)
if err != nil {
logger.Error("failed to create gRPC connection to collector", "error", err)
os.Exit(1)
}
defer conn.Close()

// Set up a trace exporter
otelExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn))
if err != nil {
logger.Error("failed to create trace exporter", "error", err)
os.Exit(1)
}
tp := sdktrace.NewTracerProvider(sdktrace.WithSyncer(otelExporter))
otel.SetTracerProvider(tp)
}
}
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ go 1.22
require (
github.com/a-h/templ v0.2.747
github.com/gin-gonic/gin v1.9.1
github.com/google/uuid v1.4.0
github.com/google/uuid v1.6.0
github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4
github.com/samber/slog-gin v1.5.0
github.com/samber/slog-http v1.3.1
go.etcd.io/bbolt v1.3.8
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.44.0
go.opentelemetry.io/otel v1.19.0
Expand Down
6 changes: 4 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4 h1:eA9wi6ZzpIRobvXkn/S2Lyw1hr2pc71zxzOPl7Xjs4w=
Expand Down Expand Up @@ -78,6 +78,8 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/samber/slog-gin v1.5.0 h1:riEZB1ozVuL6wFFHhcZdQmkujuo3EtX1qu3Q+2EPgFo=
github.com/samber/slog-gin v1.5.0/go.mod h1:E09LgkvhRB3Ae3VcekH6WlhPsT1i5O1/wWHcFAh3BhQ=
github.com/samber/slog-http v1.3.1 h1:Fho8CGX4elTKAXFKCNGloRAz2yWt1WD+vXpO9iylQ9g=
github.com/samber/slog-http v1.3.1/go.mod h1:n6h4x2ZBeTgLqMKf95EuNlU6mcJF1b/RVLxo1od5+V0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
Expand Down
36 changes: 36 additions & 0 deletions internal/portal/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (C) 2024 the lets-party maintainers
// See root-dir/LICENSE for more information

package portal

import "net/http"

func (p *Portal) home(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()

err := p.templates.TmplHome.Execute(w, nil)
if err != nil {
p.logger.ErrorContext(ctx, "failed to execute template", "error", err)
return
}
}

func (p *Portal) login(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()

err := p.templates.TmplLogin.Execute(w, nil)
if err != nil {
p.logger.ErrorContext(ctx, "failed to execute template", "error", err)
return
}
}

func (p *Portal) register(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()

err := p.templates.TmplRegister.Execute(w, nil)
if err != nil {
p.logger.ErrorContext(ctx, "failed to execute template", "error", err)
return
}
}
63 changes: 63 additions & 0 deletions internal/portal/portal.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Copyright (C) 2024 the lets-party maintainers
// See root-dir/LICENSE for more information

package portal

import (
"log/slog"
"net/http"
"os"

templates "github.com/quixsi/core/internal/portal/tmp"
sloghttp "github.com/samber/slog-http"
)

type Portal struct {
logger *slog.Logger
address string
routes map[string]http.Handler
//NOTE: just temporary until templ implementation
templates templates.TemplateHandler
//database interface{}
}

func NewPortal(
logger *slog.Logger,
address string,
templates templates.TemplateHandler,
//database interface{},
) *Portal {
return &Portal{
logger: logger,
address: address,
templates: templates,
//database: nil,
}
}

func (p *Portal) ServeHTTP() {
mux := http.NewServeMux()

loggerMW := sloghttp.NewWithConfig(
p.logger, sloghttp.Config{
DefaultLevel: slog.LevelInfo,
ClientErrorLevel: slog.LevelWarn,
ServerErrorLevel: slog.LevelError,
WithUserAgent: true,
},
)

p.routes = p.addRoutes()
registerRoutes(mux, p.routes)

portal := &http.Server{
Addr: p.address,
Handler: loggerMW(mux),
}

p.logger.Info("listening on", "address", p.address)
if err := portal.ListenAndServe(); err != nil {
p.logger.Error("failed to run server", "error", err)
os.Exit(1)
}
}
30 changes: 30 additions & 0 deletions internal/portal/routes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright (C) 2024 the lets-party maintainers
// See root-dir/LICENSE for more information

package portal

import (
"net/http"
)

// register provided routes to http.ServerMux
func registerRoutes(
mux *http.ServeMux,
routes map[string]http.Handler,
) {
for route, handler := range routes {
mux.Handle(route, handler)
}
}

func (p *Portal) addRoutes() map[string]http.Handler {
routes := make(map[string]http.Handler)

//NOTE: if middleware is needed, it can be added right here

routes["GET /"] = http.HandlerFunc(p.home)
routes["GET /login"] = http.HandlerFunc(p.login)
routes["GET /register"] = http.HandlerFunc(p.register)

return routes
}
31 changes: 31 additions & 0 deletions internal/portal/tmp/templatehandler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (C) 2024 the lets-party maintainers
// See root-dir/LICENSE for more information

package templates

import (
"embed"
"text/template"
)

type TemplateHandler struct {
TmplHome *template.Template
TmplLogin *template.Template
TmplRegister *template.Template
}

//go:embed templates/*.html
var templates embed.FS

func NewTemplateHandler() *TemplateHandler {
mainTemplate := []string{"templates/main.html", "templates/main.style.html", "templates/header.html", "templates/nav.html", "templates/footer.html"}
homeTemplate := "templates/home.html"
loginTemplate := "templates/login.html"
registerTemplate := "templates/register.html"

return &TemplateHandler{
TmplHome: template.Must(template.ParseFS(templates, append(mainTemplate, homeTemplate)...)),
TmplLogin: template.Must(template.ParseFS(templates, append(mainTemplate, loginTemplate)...)),
TmplRegister: template.Must(template.ParseFS(templates, append(mainTemplate, registerTemplate)...)),
}
}
40 changes: 40 additions & 0 deletions internal/portal/tmp/templates/footer.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{{ define "FOOTER" }}

<footer
class="flex justify-center md:justify-start w-full border-y border-b-0 border-slate-300 p-5 text-slate-600"
>
<nav class="list-none flex gap-4">
<li>
<a href="https://github.com/quixsi/core" target="_blank"
><svg
height="32"
aria-hidden="true"
viewBox="0 0 16 16"
version="1.1"
width="32"
data-view-component="true"
>
<path
d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"
></path>
</svg>
</a>
</li>
<a href="/monitoring" target="_blank"
><svg
height="32"
aria-hidden="true"
viewBox="-113.76 -96.84 64 64"
version="1.1"
width="32"
data-view-component="true"
>
<g transform="matrix(.38094 0 0 .38094 -67.511466 -92.267639)"><path d="M-3.73 35.388s10.563 4.275 17.354 59.354c0 0-9.8 3.772-3.772 10.312s6.8 18.863 6.8 18.863-35.713 5.28-97.833.754c0 0-24.898-50.803-15.1-68.408l16.348.503s23.64 11.82 22.635-.754c0 0 4.352-.432 5.012-.83s5.747 9.38 19.42-6.936c0 0 21.268-8.125 28.798-12.75zm-81.07 9.31S-91.233 26.2-99.367 30.054s.592 17.674 2.884 20.63c0 .001 7.024-4.58 11.683-5.988z" fill="#60d0e4"/><g fill-rule="evenodd"><path d="M-30.957 138.898c-.803-1.302-2.67-1.275-4.504-1.542-1.2-.177-3.928-.473-4-1.975-.1-1.64 2.314-2.246 3.95-2.592 3.913-.827 7.814-.68 12.526-.68 2.02 0 4.714.127 4.936 1.48.185 1.136-.775 1.947-1.543 2.468-.682.463-2.06.9-2.097 1.914-.068 1.798 3.24 1.47 2.468 3.948-.285.916-1.874 1.44-3.085 1.8-3.84 1.1-8.353 1.477-12.773 1.852-4 .34-9.118 1.105-13.822.432-1.347-.2-3.124-.706-3.208-1.665-.135-1.537 2.4-2.022 3.764-2.223 3.77-.55 7.307-.308 11.415-.493 2.864-.13 5.74-.1 5.984-2.714zm-40.417.556c2.778-.133 6.68.042 9.44.74.722.183 2.095.48 2.098 1.234.004.806-1.808 1.15-2.838 1.42-5.868 1.52-11.88 2-18.387 2.775-1.183.143-2.412.224-3.703.556-.752.194-2.595.742-2.53 1.666.082 1.14 3.03.83 4.258.926 1.58.122 3.58.314 3.702 1.48.208 1.987-3.717 2.075-5.677 2.22-5.4.405-10.042.203-15.056-.432-.977-.123-2.2-.354-3.208-.74-.9-.347-2.134-.868-2.16-1.728-.04-1.285 1.97-1.77 3.085-2.036 4.14-.982 8.652-1.358 12.958-2.283 2.734-.587 5.427-1.633 7.65-2.53 2.428-.98 4.726-2.248 7.22-2.962 1-.283 1.8-.243 3.146-.308zm51.214 4.32c.644-.065 2.397.007 2.406.863.015 1.252-3.937 1.248-4 .062-.047-.742.872-.85 1.604-.925zm-5.06 1.05c.84-.078 2.244-.03 2.284.864.06 1.354-4 1.296-3.95 0 .028-.585.786-.783 1.665-.864zm-6.046 1.046c.37-.028 1.26-.07 1.913.062.237.048 1.207.405 1.234.74.053.635-1.292.874-1.912.925-1.222.103-3.43-.053-3.518-.802-.086-.737 1.566-.872 2.283-.925zm-8.02.618c.97-.13 3.175-.082 3.208.986.048 1.527-4.9 1.535-4.937.062-.018-.795.977-.947 1.73-1.048zm-9.38.112c.823-.056 1.644-.054 2.53.124.43.085 1.756.392 1.8.985.063 1.135-3.138 1.34-4.7 1.235-.945-.062-2.708-.428-2.715-1.172-.006-.63.952-.843 1.234-.926.673-.195 1.048-.2 1.85-.246zm-57.694 2.47c-.295.9-3.22 1.398-4.32.74.574-1 3.033-1.254 4.32-.74zm.68 1.614c-.753 1.114-3.643 1.518-5.06.803.762-1.104 3.64-1.522 5.06-.803zm1.172 1.48c-.805 1.013-3.65 1.514-5.06.742.563-1.034 3.945-1.55 5.06-.742zm5.183.742c-.523 1.247-4.048 1.798-5.245.802.63-1.312 3.904-1.73 5.245-.802zm4.195.246c.787-.062 2.366-.127 3.208.123 1.56.463.332 1.3-.863 1.604-1.23.323-2.566.476-4.135.37-.738-.05-1.98-.247-2.036-.74-.068-.585 1.127-.873 1.542-.988.9-.252 1.47-.305 2.284-.37zm12.342.678c-.07.783-1.12 1.232-2.037 1.543a13.01 13.01 0 0 1-3.085.616c-.685.043-2.04-.004-2.16-.493-.18-.73 1.466-1.3 1.975-1.48 1.053-.378 2.083-.6 3.023-.678.917-.068 1.945-.04 2.284.493zm51.584-119.087c.07.012.034.062 0 .062-4.13 4.635-7.988 9.6-12.834 13.76-.562.483-1.583 1.47-2.345 1.42-.432-.028-.976-.633-1.418-.803-2.6-.993-5.36 1.026-5.245 3.888-.958.293-1.994.4-3.085.493-1.037.1-2.242.352-3.27.247-.76-.078-1.255-.476-2.283-.37-.473.05-.845.358-1.42.432-.9.114-2.1-.193-3.147-.432-6.56-1.5-12.15-4.92-18.573-6.293.792-.483 1.794-.756 2.715-1.1.158-.298-.32-.778-.185-1.05 15.196 1.584 28.443-2.042 39.8-5.8 3.937-1.303 7.775-2.946 11.3-4.442z"/><path d="M-42.496 39.185c-11.356 3.758-24.603 7.385-39.8 5.8-.134.27.342.75.185 1.05-.92.354-1.923.628-2.715 1.11 6.422 1.373 12.013 4.784 18.573 6.293 1.038.24 2.258.546 3.147.432.574-.074.946-.383 1.42-.432 1.028-.105 1.522.293 2.283.37 1.03.105 2.233-.158 3.27-.247 1.092-.093 2.127-.2 3.085-.493-.114-2.862 2.635-4.88 5.245-3.888.443.17.987.774 1.418.803.762.05 1.783-.937 2.345-1.42 4.846-4.16 8.706-9.125 12.834-13.76.034 0 .07-.05 0-.062-3.515 1.496-7.353 3.14-11.29 4.442z" fill="#638b18"/><path d="M-36.942 141.613c-4.108.186-7.645-.056-11.415.493-1.375.2-3.9.686-3.764 2.223.084.96 1.86 1.474 3.208 1.665 4.704.674 9.822-.093 13.822-.432 4.42-.375 8.933-.74 12.773-1.852 1.2-.35 2.8-.873 3.085-1.8.773-2.48-2.536-2.15-2.468-3.948.038-1.005 1.416-1.45 2.097-1.914.768-.52 1.728-1.332 1.543-2.468-.222-1.354-2.917-1.48-4.936-1.48-4.7 0-8.613-.148-12.526.68-1.635.346-4.04.953-3.95 2.592.083 1.502 2.8 1.798 4 1.975 1.835.267 3.7.24 4.504 1.542-.243 2.613-3.12 2.584-5.984 2.714zm-37.578-1.85c-2.494.714-4.792 1.982-7.22 2.962-2.224.896-4.917 1.942-7.65 2.53-4.306.925-8.818 1.3-12.958 2.283-1.115.266-3.124.75-3.085 2.036.026.86 1.26 1.38 2.16 1.728 1 .386 2.23.617 3.208.74 5.014.635 9.654.837 15.056.432 1.96-.146 5.885-.233 5.677-2.22-.122-1.166-2.122-1.358-3.702-1.48-1.23-.095-4.176.213-4.258-.926-.065-.924 1.777-1.472 2.53-1.666 1.292-.332 2.52-.413 3.703-.556 6.508-.784 12.52-1.255 18.387-2.775 1.03-.27 2.842-.614 2.838-1.42-.003-.756-1.376-1.052-2.098-1.234-2.76-.698-6.663-.873-9.44-.74-1.346.064-2.156.024-3.146.308zm52.757 4.935c.073 1.187 4.025 1.2 4-.062-.01-.856-1.763-.93-2.406-.863-.732.076-1.65.183-1.604.925zm-5.122 1c-.062 1.296 4 1.354 3.95 0-.04-.896-1.445-.942-2.284-.864-.878.08-1.636.278-1.665.864zm-6.665 1.098c.088.75 2.295.904 3.518.802.62-.05 1.965-.3 1.912-.925-.027-.335-.997-.692-1.234-.74-.652-.133-1.542-.1-1.913-.062-.717.053-2.37.188-2.283.925zm-7.465.74c.035 1.473 4.984 1.465 4.937-.062-.034-1.068-2.24-1.116-3.208-.986-.753.1-1.748.252-1.73 1.048zm-9.503-.678c-.282.083-1.24.296-1.234.926.007.744 1.77 1.1 2.715 1.172 1.552.104 4.752-.1 4.7-1.235-.033-.594-1.36-.9-1.8-.985-.886-.178-1.707-.18-2.53-.124-.8.055-1.175.05-1.85.246zm-60.16 2.962c1.1.658 4.024.17 4.32-.74-1.286-.514-3.745-.26-4.32.74zm-.062 1.666c1.417.715 4.307.312 5.06-.803-1.42-.718-4.298-.3-5.06.803zm1.172 1.42c1.4.77 4.255.27 5.06-.742-1.115-.8-4.497-.292-5.06.742zm4.998.802c1.197.996 4.72.445 5.245-.802-1.34-.927-4.614-.5-5.245.802zm7.157-.188c-.415.115-1.6.403-1.542.988.057.493 1.297.7 2.036.74 1.57.105 2.904-.047 4.135-.37 1.195-.315 2.424-1.142.863-1.604-.842-.25-2.42-.185-3.208-.123-.813.064-1.373.117-2.284.37zm12.343-.182c-.94.068-1.97.3-3.023.678-.5.183-2.156.75-1.975 1.48.12.5 1.475.536 2.16.493a13.06 13.06 0 0 0 3.085-.616c.917-.3 1.967-.76 2.037-1.543-.34-.532-1.368-.56-2.284-.493z"/></g><path d="M-32.024 24.95C-69.12 41.047-87.73 34.004-87.73 34.004l4.4 8.803c26.533 3.018 53.8-11.255 53.8-11.255l1.364-3.738s-2.26.487-3.56-2.96z" fill="#e1caa2"/><path d="M-29.32 14.167l-.472-1.603S-59.69.87-66.48 4.453-82.04 14.262-88.454 23.88l-.094 7.64s18.423 7.64 56.4-8.833c0 0-.503-4.592 2.83-8.52z" fill="#638b18"/><path d="M-27.02 25.048c-.45.392-.874.68-1.32.593-1.348-.265-1.97-2.884-1.388-5.85s2.148-5.155 3.498-4.9c1.297.255 1.92 2.688 1.448 5.514 0 0-1.436 2.635-2.116 4.485z"/><path d="M-8.635 11.307s-6.79-4.464-14.02 5.47c0 0-.943-5.91-5.785-3.396 0 0 .943-8.488.314-9.683 0 0 1.887.566 2.452 1.823 0 0 4.968-4.84 4.653-11.568 0 0 1.32.188 1.32 1.886 0 0 1.85-4.092 3.663-6.298l.172-.242c7.293-6.35.566 12.576.566 12.576s-.392.94-.793 1.446 3.454-1.285 3.407-2.747.483 2.063 0 2.7c0 0 6.378-5.045 6.566-7.687 0 0 1.006 2.012.754 3.646 0 0 5.658-4.275 5.785-6.288 0 0 .69 10.877-10.06 15.027 0 0 1.76 0 3.96-.44z" fill="#e1caa2"/><path d="M-5.05 24.322s22.698-5.03 10.626 3.08-13.833 7.734-13.833 7.734S-5.805 31.5-5.05 24.322zM-8.634 35.45l-20.875 9.117s6.477-5.533 4.276-8.552c0 .001 10.94-1.633 16.6-.565z" fill="#638b18"/><path d="M-28 33.88c5.784-16.033 8.692-17.838 8.692-17.838 2.742-2.95 6.193-4.25 8.918-3.002 2.36 1.08 3.626 3.823 3.637 7.137l-.001.21s-.435 8.086-2.698 12.676c0 0-8.425-1.195-17.48 1.195z" fill="#60d0e4"/><path d="M-19.74 26.715s4.526-9.008 7.288-6.926c0 0 .68.815-1.086 6.745 0 0 7.3-8.918-.27-9.145-.001.001-5.07-.18-5.93 9.326zM-90.1 44.397s-5.96-9.016-6.5-7.22.36 4.972.5 5.84-4.554-5.542-1.408-7.88 7.04 4.914 7.4 9.257z"/><path d="M-97.047 53.515h.235s3.454-2.513 4.475-2.905-1.256 3.768 4.788 3.768-15.7.785-20.645-3.532c0 0-.43-1.867 6.198-4.94 0 0 4 7.148 4.95 7.6z" fill="#638b18"/><path d="M-75.77 55.948c-6.837-3.02-11.954-3.9-11.954-3.9-.05.004-.102.006-.153.006-1.074 0-1.946-.697-1.946-1.556s.872-1.556 1.946-1.556a2.61 2.61 0 0 1 .268.014s5.02.84 12.83 4.103l.85.35c7.262 2.688 10.186 2.76 10.186 2.76.98.083 1.238.083 1.368-.012s.943-.412.943-.412c1.033.027 1.862.743 1.862 1.622 0 .846-1.45 1.767-2.428 1.844 0 0-5.375.424-13.486-3.16zm48.6-18.112c.017-.085.025-.173.025-.264 0-.778-.644-1.4-1.438-1.4a1.47 1.47 0 0 0-.569.114l-5.944 6.487c-2.436 2.758-8.392 9.272-10.886 9.565l-1.408.146c-.118-.234-.754-.8-.754-.8-.4-.355-.94-.505-1.454-.348-.82.25-1.262 1.2-.984 2.098a1.85 1.85 0 0 0 .565.868s4.124 4.177 11.224-3.247l7.746-8.186s3.6-3.932 3.843-4.87z"/><path d="M-14.754 67.066c0 7.885-6.4 14.283-14.3 14.283S-43.35 74.952-43.35 67.066c0-7.892 6.4-14.3 14.296-14.3a14.3 14.3 0 0 1 14.3 14.29zm-44.4 10.438c0 7.886-6.4 14.283-14.3 14.283S-87.74 85.4-87.74 77.504s6.4-14.3 14.297-14.3a14.3 14.3 0 0 1 14.3 14.3zm11.916 22.896c.377 2.137 1.257 6.664 4.275 6.286s1.887-6.413 1.887-6.413-5.156-.25-5.66 0zm-1.76.594s-2.768 1.18-4.977 2.62c0 0 1.1 5.624 4.77 3.945 0 0 2.415-.532.354-6.187zm-7.028-12.496s-17.6 5.3-8.967 14.2c5.66 5.834 13.494-4.1 17.672-4.004 0 0 .958-.435 2.96-.174s15.062 1.306 16.28-3.918-.348-6.094-1.306-6.703-7.835-4.7-18.108-1.828z" fill="#fff"/><circle cx="-74.702" cy="82.41" r="4.481"/><ellipse cx="-30.94" cy="71.722" rx="4.481" ry="4.476"/><ellipse transform="matrix(.9801 -.1986 .1986 .9801 -18.3085 -8.1092)" cx="-49.585" cy="87.228" rx="7.93" ry="4.328"/><path d="M-57.802 91.347s-11.066 5.155-5.9 9.43 7.67-2.64 15.215-3.897 16.222.754 17.982-2.516 2.4-5.9-9.935-7.042c0 0-1.13 5.408-7.67 6.036s-7.668-.504-9.68-2.012z" fill="#e1caa2"/><path d="M29.777 115.666s18.272 3.873-8.144 7.747c0 0 6.257-2.582 8.144-7.747z" fill="#231f20"/><path d="M17.264 117.453s-.597-9.333-6.158-14.398 4.668-6.653 7.846-5.264 16.386 10.527 4.766 22.245c0 0-4.965 3.575-6.355-2.085z" fill="#e1caa2"/><path d="M-99.488 115.365s-.943 4.715-.188 6.696c0 0-15.94-2.736-.755-6.508z"/><path d="M-91.85 104.708s-9.787 11.58-4.716 21.03c4.15 7.734 12.543-1.036 12.732-1.32z" fill="#e1caa2"/></g>
</svg>
</a>
</li>

</nav>
</footer>

{{ end }}
7 changes: 7 additions & 0 deletions internal/portal/tmp/templates/header.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{{ define "HEADER" }}

<header class="w-full flex flex-col items-center gap-4 sticky top-0 z-50">
{{ template "NAV" .}}
</header>

{{ end }}
1 change: 1 addition & 0 deletions internal/portal/tmp/templates/home.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{ define "CONTENT" }} PLEASE BUY OUR CONTENT {{ end }}
Loading

0 comments on commit ee354c3

Please sign in to comment.