-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
15 changed files
with
489 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)...)), | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
{{ define "CONTENT" }} PLEASE BUY OUR CONTENT {{ end }} |
Oops, something went wrong.