From 4cbf153b5064d3243de3fbe570680e2831bacd96 Mon Sep 17 00:00:00 2001 From: JP <37535226+RabbITCybErSeC@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:29:56 +0200 Subject: [PATCH] initial work on gui (#2) * initial work on gui * removed wrong readme * update on readme * fix on div * update on the readme description * description update * give back title * added dashboard example * removal of redundant * added _templ.go to gitignore * removal of _temp.go files * added comment maarten on gitignore * update on the makefile * updated gitignore according to feedback * add temp ignore --- .gitignore | 3 +- Makefile | 55 + README.md | 47 +- go.mod | 37 + go.sum | 89 ++ handlers/auth.handler.go | 53 + handlers/dashboard.handler.go | 39 + img/dashboard1.PNG | Bin 0 -> 76043 bytes img/soarca-logo.svg | 36 + package-lock.json | 1487 +++++++++++++++++++++ package.json | 12 + public/public.go | 20 + public/public/styles.css | 1 + public/public/vendor/htmx@1.9.6.js | 1 + routes/routes.go | 35 + server/main.go | 19 + tailwind.config.js | 13 + utils/render.go | 46 + views/assets/app.css | 51 + views/auth/login.templ | 106 ++ views/components/cards.templ | 402 ++++++ views/components/headbar.templ | 20 + views/components/navbar.templ | 44 + views/components/notications.templ | 21 + views/components/overlays.templ | 8 + views/components/reporting_card.templ | 80 ++ views/dashboard/reporting/reporting.templ | 323 +++++ views/home.templ | 15 + views/layouts/base_layout.templ | 33 + views/layouts/dashboard_layout.templ | 17 + 30 files changed, 3097 insertions(+), 16 deletions(-) create mode 100644 Makefile create mode 100644 go.mod create mode 100644 go.sum create mode 100644 handlers/auth.handler.go create mode 100644 handlers/dashboard.handler.go create mode 100644 img/dashboard1.PNG create mode 100644 img/soarca-logo.svg create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/public.go create mode 100644 public/public/styles.css create mode 100644 public/public/vendor/htmx@1.9.6.js create mode 100644 routes/routes.go create mode 100644 server/main.go create mode 100644 tailwind.config.js create mode 100644 utils/render.go create mode 100644 views/assets/app.css create mode 100644 views/auth/login.templ create mode 100644 views/components/cards.templ create mode 100644 views/components/headbar.templ create mode 100644 views/components/navbar.templ create mode 100644 views/components/notications.templ create mode 100644 views/components/overlays.templ create mode 100644 views/components/reporting_card.templ create mode 100644 views/dashboard/reporting/reporting.templ create mode 100644 views/home.templ create mode 100644 views/layouts/base_layout.templ create mode 100644 views/layouts/dashboard_layout.templ diff --git a/.gitignore b/.gitignore index 85c0365..6548a91 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ docs/node_modules/ docs/package-lock.json docs/.hugo_build.lock **.hugo_build.lock - +**_templ.go +tmp/* \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b33660d --- /dev/null +++ b/Makefile @@ -0,0 +1,55 @@ +.PHONY: dev-server dev-tailwind dev-templ dev build-server build-tailwind build-templ build launch deploy + +#----------------------------------------------------- +# DEV +#----------------------------------------------------- + +dev: + @make -j dev-templ dev-tailwind dev-server + +dev-server: + # run air to detect any go file changes to re-build and re-run the server. + + @go run github.com/air-verse/air@latest \ + --build.cmd "templ generate && go build --tags dev -o tmp/bin/main ./server/" --build.bin "tmp/bin/main" --build.delay "100" \ + --build.exclude_dir "node_modules" \ + --build.exclude_regex ".*_templ.go" \ + --build.include_ext "go,templ" \ + --build.stop_on_error "false" \ + --build.exclude_regex ".*_templ.go" \ + --build.poll "true" \ + --misc.clean_on_exit true + + +# watch for any js or css change in the assets/ folder, then reload the browser via templ proxy. +sync_assets: + go run github.com/air-verse/air@latest \ + --build.cmd "go run github.com/a-h/templ/cmd/templ@latest generate --notify-proxy" \ + --build.bin "true" \ + --build.delay "100" \ + --build.exclude_dir "" \ + --build.include_dir "public" \ + --build.include_ext "js,css" + + +dev-templ: + @go run github.com/a-h/templ/cmd/templ@latest generate --watch --proxy="http://localhost:8081" --open-browser=false -v + +dev-tailwind: + @make ARGS="--watch" build-tailwind +#----------------------------------------------------- +# BUILD +#----------------------------------------------------- + +build: build-tailwind build-server build-templ + +build-server: + @go build -o bin/server ./server/main.go + +build-templ: + @templ generate + +build-tailwind: + @npx tailwindcss -m -i ./views/assets/app.css -o ./public/public/styles.css $(ARGS) + +.DEFAULT_GOAL := dev \ No newline at end of file diff --git a/README.md b/README.md index e0b6f76..09ebef0 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,50 @@
+
+# SOARCA-GUI -[![https://cossas-project.org/portfolio/SOARCA/](https://img.shields.io/badge/website-cossas--project.org-orange)](https://cossas-project.org/portfolio/SOARCA/) -[![Pipeline status](https://github.com/cossas/soarca/actions/workflows/ci.yml/badge.svg?development)](https://github.com/COSSAS/SOARCA/actions) -[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) - +A [Go](https://go.dev), [Templ](https://templ.guide/), [Tailwind CSS](https://tailwindcss.com/) and [HTMX](https://htmx.org/) based GUI for [SOARCA](https://github.com/COSSAS/SOARCA). -Automate threat and incident response workflows with CACAO security playbooks +## Quick Use -## Context and backgound +Usage of this SOARCA-GUI is described [here](https://cossas.github.io/SOARCA/docs/). -Organisations are increasingly automating threat and incident response through playbook driven security workflow orchestration. The essence of this concept is that specific security events trigger a predefined series of response actions that are executed with no or only limited human intervention. These automated workflows are captured in machine-readable security playbooks, which are typically executed by a so called Security Orchestration, Automation and Response (SOAR) tool. The market for SOAR solutions has matured significantly over the past years and present day products support sophisticated automation workflows and a wide array of integrations with external security tools and data resources. Typically, however, the technology employed is proprietary and not easily adaptable for research and experimentation purposes. SOARCA aims to offer an open-source alternative for such solutions that is free of vendor dependencies and supports standardized formats and technologies where applicable. +## Documentation -SOARCA was developed for research and innovation purposes and allows SOC, CERT and CTI professionals to experiment with the concept of playbook driven security automation. It is open and extensible and its interfaces are well-defined and elaborately documented. Importantly, it offers native support for the emerging technology standards CACAOv2 and OpenC2, both developed and maintained by OASIS Open. CACAO (Collaborative Automated Course of Action Operations) provides a standardized scheme for machine-readable security playbooks while OpenC2 offers a standardized language for the command and control of cyber defense technologies (e.g. firewalls or IAM solutions). +All the documentation to off the SOARCA-GUI is currently being worked on. +## Contributing -## Software -SOARCA is a security orchestrator that can ingest, validate and execute CACAOv2 security playbooks. These playbooks and the triggers for their execution are consumed via a JSON API. SOARCA comes with native http(s), SSH and OpenC2 capabilities to interface with external tools and data resources. These native capabilities can be extended via a dedicated MQTT interface, allowing developers to compile additional integrations according their needs. +Want to contribute to this project? Please keep in mind the following [rules](https://cossas.github.io/SOARCA/docs/contribution-guidelines/): +- This repository uses git **rebase** strategy +- For each PR, there should be at least one issue +- Make sure all tests pass (including lint errors) -Development is ongoing. The current version solely supports machine and command line interfaces, but a graphical user interface will be added in the foreseeable future. Furthermore, its current capability to run CACAOv2 playbooks sequentially will evolve towards the ability to run multiple playbooks in parallel. Such further developments will be announced and published on the SOARCA repository on Github. +### Running this repository +#### Requirements -## Documentation + - Make + - Go + - Npm + - [Templ](https://templ.guide/quick-start/installation) + + +#### Development environment -For the latest documentation we refer to our [Github pages](https://cossas.github.io/SOARCA/). +The Makefile contains all the required setup for live reloading, meaning that whenever a change is detected in any of the files, the Templ proxy will reload the browser. For file change detection, we use Air. Note that Air does not need to be installed manually, as this is all handled through the Makefile. Although this setup works quite well, it is not perfect. +To start the development environment, run: -## Source Project +```bash +make dev +``` +In some cases, the TailwindCSS changes are not picked up correctly. If this happens, you need to rerun: -More information on the source of the project can be found [here](https://cossas.github.io/SOARCA/docs/about/). \ No newline at end of file +```bash +make build-tailwind +make dev +``` +This will rebuild the required CSS files, and rerun the development environment. \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c1a0fac --- /dev/null +++ b/go.mod @@ -0,0 +1,37 @@ +module soarca-gui + +go 1.22.2 + +require ( + github.com/a-h/templ v0.2.707 + github.com/gin-gonic/gin v1.10.0 +) + +require ( + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..ee7865f --- /dev/null +++ b/go.sum @@ -0,0 +1,89 @@ +github.com/a-h/templ v0.2.707 h1:T1Gkd2ugbRglZ9rYw/VBchWOSZVKmetDbBkm4YubM7U= +github.com/a-h/templ v0.2.707/go.mod h1:5cqsugkq9IerRNucNsI4DEamdHPsoGMQy99DzydLhM8= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +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/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/handlers/auth.handler.go b/handlers/auth.handler.go new file mode 100644 index 0000000..9f51418 --- /dev/null +++ b/handlers/auth.handler.go @@ -0,0 +1,53 @@ +package handlers + +import ( + "errors" + "net/http" + "strings" + + "soarca-gui/utils" + authviews "soarca-gui/views/auth" + + "github.com/gin-gonic/gin" +) + +type AuthHandler struct{} + +func (a *AuthHandler) AuthPage(context *gin.Context) { + render := utils.NewTempl(context, http.StatusOK, authviews.LoginIndex()) + context.Render(http.StatusOK, render) +} + +func (a *AuthHandler) Login(context *gin.Context) { + errors := a.inputValidation(context) + + // email := context.PostForm("email") + // password := context.PostForm("password") + if len(errors) > 0 { + template := utils.NewTempl(context, http.StatusOK, authviews.AuthErrorCmp(errors)) + context.Render(http.StatusOK, template) + return + } + context.Header("HX-Redirect", "/dashboard") + context.String(http.StatusFound, "") +} + +func (a *AuthHandler) inputValidation(context *gin.Context) []error { + email := context.PostForm("email") + password := context.PostForm("password") + var validationErrors []error + if email == "" { + validationErrors = append(validationErrors, errors.New("email is empty")) + } + if !strings.Contains(email, "@") { + validationErrors = append(validationErrors, errors.New("valid e-mail is required")) + } + if len(password) < 8 { + validationErrors = append(validationErrors, errors.New("password must be at least 8 characters long")) + } + if password == "" { + validationErrors = append(validationErrors, errors.New("password is empty")) + } + + return validationErrors +} diff --git a/handlers/dashboard.handler.go b/handlers/dashboard.handler.go new file mode 100644 index 0000000..2c62317 --- /dev/null +++ b/handlers/dashboard.handler.go @@ -0,0 +1,39 @@ +package handlers + +import ( + "fmt" + "net/http" + + "soarca-gui/utils" + "soarca-gui/views" + "soarca-gui/views/components" + "soarca-gui/views/dashboard/reporting" + + "github.com/gin-gonic/gin" +) + +func HomeDashboard(context *gin.Context) { + render := utils.NewTempl(context, http.StatusOK, views.Home(nil)) + context.Render(http.StatusOK, render) +} + +func ReportingDashboard(context *gin.Context) { + + render := utils.NewTempl(context, http.StatusOK, + reporting.ReportingIndex()) + + context.Render(http.StatusOK, render) +} + +func ReportingCard(context *gin.Context) { + + id := context.Param("id") + fmt.Println(id) + updatedCard := components.ReportingCardData{Loaded: true, + ID: fmt.Sprint(id), + Value: 10, + Name: "Executed Playbooks"} + render := utils.NewTempl(context, http.StatusOK, components.ReportingCard(updatedCard)) + + context.Render(http.StatusOK, render) +} diff --git a/img/dashboard1.PNG b/img/dashboard1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..033ad2d4070e7105ed62a20fc3c16822c872cef4 GIT binary patch literal 76043 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 literal 0 HcmV?d00001 diff --git a/img/soarca-logo.svg b/img/soarca-logo.svg new file mode 100644 index 0000000..f3498c1 --- /dev/null +++ b/img/soarca-logo.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7b108cd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1487 @@ +{ + "name": "SOARCA-GUI", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/free-brands-svg-icons": "^6.5.2", + "@fortawesome/free-regular-svg-icons": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.2" + }, + "devDependencies": { + "daisyui": "^4.11.1", + "tailwindcss": "^3.4.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", + "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.2.tgz", + "integrity": "sha512-zi5FNYdmKLnEc0jc0uuHH17kz/hfYTg4Uei0wMGzcoCL/4d3WM3u1VMc0iGGa31HuhV5i7ZK8ZlTCQrHqRHSGQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz", + "integrity": "sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/culori": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", + "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/daisyui": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.11.1.tgz", + "integrity": "sha512-obT9CUbQdW6eoHwSeT5VwaRrWlwrM4OT5qlfdJ0oQlSIEYhwnEl2+L2fwu5PioLbitwuMdYC2X8I1cyy8Pf6LQ==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.8", + "culori": "^3", + "picocolors": "^1", + "postcss-js": "^4" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..9040709 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "devDependencies": { + "daisyui": "^4.11.1", + "tailwindcss": "^3.4.3" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/free-brands-svg-icons": "^6.5.2", + "@fortawesome/free-regular-svg-icons": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.2" + } +} diff --git a/public/public.go b/public/public.go new file mode 100644 index 0000000..e4541cd --- /dev/null +++ b/public/public.go @@ -0,0 +1,20 @@ +package public + +import ( + "embed" + "io/fs" + "net/http" +) + +//go:embed public +var publicAssets embed.FS + +// GetPublicAssetsFileSystem returns a http.FileSystem for the public assets so that +// we can embed them into the binary so it is self-contained. +func GetPublicAssetsFileSystem() http.FileSystem { + fsys, err := fs.Sub(publicAssets, "public") + if err != nil { + panic(err) + } + return http.FS(fsys) +} diff --git a/public/public/styles.css b/public/public/styles.css new file mode 100644 index 0000000..40e804a --- /dev/null +++ b/public/public/styles.css @@ -0,0 +1 @@ +/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-0{bottom:0}.right-3{right:.75rem}.top-3{top:.75rem}.z-10{z-index:10}.z-50{z-index:50}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-5{margin-bottom:1.25rem}.ml-1{margin-left:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.ms-2{margin-inline-start:.5rem}.mt-1{margin-top:.25rem}.mt-16{margin-top:4rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-12{height:3rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-12{width:3rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.rounded-tr-lg{border-top-right-radius:.5rem}.border{border-width:1px}.border-4{border-width:4px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.bg-blue-100\/60{background-color:#dbeafe99}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.bg-emerald-100\/60{background-color:#d1fae599}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-100\/60{background-color:#f3f4f699}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-100\/60{background-color:#fee2e299}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-opacity-60{--tw-bg-opacity:0.6}.object-cover{-o-object-fit:cover;object-fit:cover}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-6{padding-left:1.5rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.align-text-top{vertical-align:text-top}.align-text-bottom{vertical-align:text-bottom}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tracking-tight{letter-spacing:-.025em}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-blue-500\/50{--tw-shadow-color:#3b82f680;--tw-shadow:var(--tw-shadow-colored)}.ring-inset{--tw-ring-inset:inset}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}:root{--bs-font-sans-serif:"Montserrat",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.font-family-sans-serif{font-family:var(--bs-font-sans-serif)}.font-family-monospace{font-family:var(--bs-font-monospace)}.font-family-karla{font-family:Karla,sans-serif}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.hover\:text-violet-800:hover{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.hover\:shadow-md:hover,.hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus,.focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity))}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}@media (min-width:640px){.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:flex{display:flex}.md\:w-full{width:100%}.md\:max-w-md{max-width:28rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:rounded-lg{border-radius:.5rem}.md\:p-2{padding:.5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-0{padding-top:0;padding-bottom:0}}@media (min-width:1024px){.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:gap-8{gap:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:1280px){.xl\:p-5{padding:1.25rem}}.rtl\:rotate-180:where([dir=rtl],[dir=rtl] *){--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-scale-x-100:where([dir=rtl],[dir=rtl] *){--tw-scale-x:-1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:space-x-reverse:where([dir=rtl],[dir=rtl] *)>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.rtl\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}.dark\:divide-gray-700:where([data-mode=dark],[data-mode=dark] *)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}.dark\:border-gray-700:where([data-mode=dark],[data-mode=dark] *){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.dark\:bg-blue-600:where([data-mode=dark],[data-mode=dark] *){--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.dark\:bg-blue-950:where([data-mode=dark],[data-mode=dark] *){--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.dark\:bg-gray-800:where([data-mode=dark],[data-mode=dark] *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.dark\:bg-gray-900:where([data-mode=dark],[data-mode=dark] *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.dark\:bg-slate-800:where([data-mode=dark],[data-mode=dark] *){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.dark\:text-gray-100:where([data-mode=dark],[data-mode=dark] *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.dark\:text-gray-200:where([data-mode=dark],[data-mode=dark] *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.dark\:text-gray-300:where([data-mode=dark],[data-mode=dark] *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.dark\:text-gray-400:where([data-mode=dark],[data-mode=dark] *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.dark\:text-white:where([data-mode=dark],[data-mode=dark] *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark\:ring-offset-gray-900:where([data-mode=dark],[data-mode=dark] *){--tw-ring-offset-color:#111827}.dark\:hover\:bg-blue-700:hover:where([data-mode=dark],[data-mode=dark] *){--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.dark\:hover\:bg-gray-800:hover:where([data-mode=dark],[data-mode=dark] *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.dark\:hover\:text-indigo-500:hover:where([data-mode=dark],[data-mode=dark] *){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.dark\:hover\:text-violet-300:hover:where([data-mode=dark],[data-mode=dark] *){--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.dark\:focus\:ring-blue-800:focus:where([data-mode=dark],[data-mode=dark] *){--tw-ring-opacity:1;--tw-ring-color:rgb(30 64 175/var(--tw-ring-opacity))} \ No newline at end of file diff --git a/public/public/vendor/htmx@1.9.6.js b/public/public/vendor/htmx@1.9.6.js new file mode 100644 index 0000000..de5f0f1 --- /dev/null +++ b/public/public/vendor/htmx@1.9.6.js @@ -0,0 +1 @@ +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.12"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t){return new RegExp("<"+e+"(\\s[^>]*>|>)([\\s\\S]*?)<\\/"+e+">",!!t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function A(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function s(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function N(e){return/",0);var a=i.querySelector("template").content;if(Q.config.allowScriptTags){oe(a.querySelectorAll("script"),function(e){if(Q.config.inlineScriptNonce){e.nonce=Q.config.inlineScriptNonce}e.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1})}else{oe(a.querySelectorAll("script"),function(e){_(e)})}return a}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s(""+n+"
",1);case"col":return s(""+n+"
",2);case"tr":return s(""+n+"
",2);case"td":case"th":return s(""+n+"
",3);case"script":case"style":return s("
"+n+"
",1);default:return s(n,0)}}function ie(e){if(e){e()}}function I(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return I(e,"Function")}function P(e){return I(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function M(e){var t=[];if(e){for(var r=0;r=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function D(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function U(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function B(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function j(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function _(e,t){e=p(e);if(t){setTimeout(function(){_(e);e=null},t)}else{e.parentElement.removeChild(e)}}function z(e,t,r){e=p(e);if(r){setTimeout(function(){z(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=p(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function $(e,t){e=p(e);e.classList.toggle(t)}function W(e,t){e=p(e);oe(e.parentElement.children,function(e){n(e,t)});z(e,t)}function v(e,t){e=p(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function g(e,t){return e.substring(0,t.length)===t}function G(e,t){return e.substring(e.length-t.length)===t}function J(e){var t=e.trim();if(g(t,"<")&&G(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Z(e,t){if(t.indexOf("closest ")===0){return[v(e,J(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,J(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[K(e,J(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[Y(e,J(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(J(t))}}var K=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Z(e,t)[0]}else{return Z(re().body,e)[0]}}function p(e){if(I(e,"String")){return C(e)}else{return e}}function ve(e,t,r){if(k(t)){return{target:re().body,event:e,listener:t}}else{return{target:p(e),event:t,listener:r}}}function de(t,r,n){jr(function(){var e=ve(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=k(r);return e?r:n}function ge(t,r,n){jr(function(){var e=ve(t,r,n);e.target.removeEventListener(e.event,e.listener)});return k(r)?r:n}var pe=re().createElement("output");function me(e,t){var r=ne(e,t);if(r){if(r==="this"){return[xe(e,t)]}else{var n=Z(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[pe]}else{return n}}}}function xe(e,t){return c(e,function(e){return te(e,t)!=null})}function ye(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return xe(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function be(e){var t=Q.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Se(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){Fe(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Ce(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();we(e,i);s.tasks.push(function(){we(e,a)})}}})}function Oe(e){return function(){n(e,Q.config.addedClass);zt(e);Nt(e);qe(e);ce(e,"htmx:load")}}function qe(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){Te(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;z(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Oe(i))}}}function He(e,t){var r=0;while(r-1){var t=e.replace(H,"");var r=t.match(q);if(r){return r[2]}}}function je(e,t,r,n,i,a){i.title=Ve(n);var o=l(n);if(o){Ce(r,o,i);o=Be(r,o,a);Re(o);return Fe(e,r,t,o,i)}}function _e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!P(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=Tr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Qe(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function tt(e){var t;if(e.length>0&&Ze.test(e[0])){e.shift();t=y(e,Ke).trim();e.shift()}else{t=y(e,x)}return t}var rt="input, textarea, select";function nt(e,t,r){var n=[];var i=Ye(t);do{y(i,Je);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Je);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Je);var l=et(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=et(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Je);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ze.test(i[0])){var c=tt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=tt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=tt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=tt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Je)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function it(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||nt(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,rt)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function at(e){ae(e).cancelled=true}function ot(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!ct(r,e,Wt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}ot(e,t,r)}},r.pollInterval)}function st(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function lt(t,r,e){if(t.tagName==="A"&&st(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){ht(t,function(e,t){if(v(e,Q.config.disableSelector)){m(e);return}he(n,i,e,t)},r,e,true)})}}function ut(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ft(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function ct(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function ht(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Z(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ft(a,e)){return}if(l||ut(e,a)){e.preventDefault()}if(ct(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var vt=false;var dt=null;function gt(){if(!dt){dt=function(){vt=true};window.addEventListener("scroll",dt);setInterval(function(){if(vt){vt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){pt(e)})}},200)}}function pt(t){if(!o(t,"data-hx-revealed")&&X(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function mt(e,t,r){var n=D(r);for(var i=0;i=0){var t=wt(n);setTimeout(function(){xt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(yt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=M(n.children);for(var a=0;a0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ut(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function wt(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(e,t,r){var n=D(r);for(var i=0;i0){setTimeout(i,n)}else{i()}}function Ht(t,i,e){var a=false;oe(w,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Lt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){m(e);return}he(r,n,e,t)})})}});return a}function Lt(n,e,t,r){if(e.sseEvent){Rt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){gt();ht(n,r,t,e);pt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t0){t.polling=true;ot(n,r,e)}else{ht(n,r,t,e)}}function At(e){if(!e.htmxExecuted&&Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function Nt(e){if(h(e,"script")){At(e)}oe(f(e,"script"),function(e){At(e)})}function It(e){var t=e.attributes;if(!t){return false}for(var r=0;r0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Bt(o)}for(var l in r){Ft(e,l,r[l])}}}function jt(e){Ae(e);for(var t=0;tQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Yt(e){if(!U()){return null}e=B(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Zt();var r=T(t);var n=Ve(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ue(t,e,r);nr(r.tasks);Jt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function ar(e){er();e=e||location.pathname+location.search;var t=Yt(e);if(t){var r=l(t.content);var n=Zt();var i=T(n);Ue(n,r,i);nr(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Jt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{ir(e)}}}function or(e){var t=me(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function sr(e){var t=me(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function lr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function ur(e,t){for(var r=0;r=0}function wr(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!br(e)){n["show"]="top"}if(r){var i=D(r);if(i.length>0){for(var a=0;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Sr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Er(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Sr(r)){return mr(n)}else{return pr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Cr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Rr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=Tr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Rr(u(e),t,r,n)}function Tr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Or(e,t){return Rr(e,"hx-vars",true,t)}function qr(e,t){return Rr(e,"hx-vals",false,t)}function Hr(e){return le(Or(e),qr(e))}function Lr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Ar(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Nr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||I(r,"String")){return he(e,t,null,null,{targetOverride:p(r),returnPromise:true})}else{return he(e,t,p(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:p(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Ir(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function kr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=g(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Mr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||ye(n);if(u==null||u==pe){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var p=ne(n,"hx-sync");var m=null;var x=false;if(p){var B=p.split(":");var F=B[0].trim();if(F==="this"){g=xe(n,"hx-sync")}else{g=ue(n,F)}p=(B[1]||"drop").trim();f=ae(g);if(p==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(p==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(p==="replace"){ce(g,"htmx:abort")}else if(p.indexOf("queue")===0){var V=p.split(" ");m=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(m==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){m=y.triggerSpec.queue}}if(m==null){m="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(m==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(m==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(m==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=xr(n,u,S);if(t!=="get"&&!Sr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=dr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Hr(n);var $=le(R,z);var T=yr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Rr(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=pr(T);if(L){A+="#"+L}}}if(!kr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Lr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Ir(n);I.pathInfo.responsePath=Ar(b);M(n,I);lr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=or(n);var P=sr(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Er(b,n,T);b.send(Y);return l}function Pr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Mr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){_e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){er();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}Nr("GET",r,v).then(function(){tr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Pr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var p=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:p},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;p=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){at(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){er()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=wr(l,s);if(v.hasOwnProperty("ignoreTitle")){p=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var m=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){tr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{rr(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);je(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}_e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!p){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Cr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}_e(f,"HX-Trigger-After-Settle",r)}ie(m)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){m=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Xr={};function Dr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ur(e,t){if(t.init){t.init(r)}Xr[e]=le(Dr(),t)}function Br(e){delete Xr[e]}function Fr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Xr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Fr(u(e),r,n)}var Vr=false;re().addEventListener("DOMContentLoaded",function(){Vr=true});function jr(e){if(Vr||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function _r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","")}}function zr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function $r(){var e=zr();if(e){Q.config=le(Q.config,e)}}jr(function(){$r();_r();var e=re().body;zt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){ar();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()}); \ No newline at end of file diff --git a/routes/routes.go b/routes/routes.go new file mode 100644 index 0000000..9034c36 --- /dev/null +++ b/routes/routes.go @@ -0,0 +1,35 @@ +package routes + +import ( + "soarca-gui/handlers" + "soarca-gui/public" + + "github.com/gin-gonic/gin" +) + +func Setup(app *gin.Engine) { + publicRoutes := app.Group("/") + PublicRoutes(publicRoutes) + Reporting(publicRoutes) +} + +func PublicRoutes(app *gin.RouterGroup) { + authHandler := handlers.AuthHandler{} + + publicRoute := app.Group("/") + { + publicRoute.GET("/", authHandler.AuthPage) + publicRoute.POST("/login", authHandler.Login) + publicRoute.GET("/dashboard", handlers.HomeDashboard) + + } + publicRoute.StaticFS("/public", public.GetPublicAssetsFileSystem()) +} + +func Reporting(app *gin.RouterGroup) { + reportingRoute := app.Group("/reporting") + { + reportingRoute.GET("/", handlers.ReportingDashboard) + reportingRoute.GET("/reportingcard/:id", handlers.ReportingCard) + } +} diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..2e7764d --- /dev/null +++ b/server/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "soarca-gui/routes" + + "github.com/gin-gonic/gin" +) + +var ( + Version string + Buildtime string +) + +func main() { + app := gin.Default() + routes.Setup(app) + + app.Run(":8081") +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..2ae6bcf --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,13 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./**/*.templ"], + // Disable Tailwind colors: + // theme: { colors: {} }, + + darkMode: ['selector', '[data-mode="dark"]'], + // ... + + plugins: [], +}; + + diff --git a/utils/render.go b/utils/render.go new file mode 100644 index 0000000..d2a5c33 --- /dev/null +++ b/utils/render.go @@ -0,0 +1,46 @@ +package utils + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin/render" + + templ "github.com/a-h/templ" +) + +var Default = &HTMLTemplRenderer{} + +type HTMLTemplRenderer struct { + FallbackHtmlRenderer render.HTMLRender +} + +func NewTempl(ctx context.Context, status int, component templ.Component) *Renderer { + return &Renderer{ + Ctx: ctx, + Status: status, + Component: component, + } +} + +type Renderer struct { + Ctx context.Context + Status int + Component templ.Component +} + +func (t Renderer) Render(w http.ResponseWriter) error { + t.WriteContentType(w) + + if t.Status != -1 { + w.WriteHeader(t.Status) + } + if t.Component != nil { + return t.Component.Render(t.Ctx, w) + } + return nil +} + +func (t Renderer) WriteContentType(w http.ResponseWriter) { + w.Header().Set("Content-Type", "text/html; charset=utf-8") +} diff --git a/views/assets/app.css b/views/assets/app.css new file mode 100644 index 0000000..d8517fe --- /dev/null +++ b/views/assets/app.css @@ -0,0 +1,51 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@import url('https://fonts.googleapis.com/css?family=Karla:400,700&display=swap'); + +:root { + --bs-font-sans-serif: "Montserrat", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.font-family-sans-serif { + font-family: var(--bs-font-sans-serif); +} + +.font-family-monospace { + font-family: var(--bs-font-monospace); +} + + +.font-family-karla { + font-family: 'Karla', sans-serif; +} + +/* .bg-sidebar { + background: #3d68ff; +} */ + +/* .cta-btn { + color: #3d68ff; +} + +.upgrade-btn { + background: #1947ee; +} + +.upgrade-btn:hover { + background: #0038fd; +} + +.active-nav-link { + background: #1947ee; +} + +.nav-item:hover { + background: #1947ee; +} + +.account-link:hover { + background: #3d68ff; +} */ \ No newline at end of file diff --git a/views/auth/login.templ b/views/auth/login.templ new file mode 100644 index 0000000..c691a59 --- /dev/null +++ b/views/auth/login.templ @@ -0,0 +1,106 @@ +package authviews + + +import ( + "soarca-gui/views/layouts" + "soarca-gui/views/components" +) + +templ LoginIndex() { + @LoginBaseLayout(){ + @LoginForm() + } +} + + +templ LoginBaseLayout() { + @layouts.BaseLayout(){ + +
+ + + +
+
+ // will be filled when error message +
+
+ { children... } +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + } +} + +templ LoginForm() { +
+ + + + + +
+} + +templ AuthErrorCmp(errors []error) { + for _, err := range errors { + @components.WarningNofication(err.Error()) + } +} \ No newline at end of file diff --git a/views/components/cards.templ b/views/components/cards.templ new file mode 100644 index 0000000..ad8292a --- /dev/null +++ b/views/components/cards.templ @@ -0,0 +1,402 @@ +package components + + + +templ grid() { + +
+ +
+ + +
+
+ 24 +
+
+ + + +
+ +
+
+ +
+ Card +
+
+ +

+ A card component +

+
+
+ +
+ + +
+
+ 19 +
+ +
+ + + +
+ +
+
+ +
+ Input +
+
+ +

+ description +

+
+
+
+ + +
+
+ 18 +
+
+ + + +
+ +
+
+ +
+ Button +
+
+

+ description +

+
+
+
+ + +
+ +
+ 15 +
+ +
+ + + +
+ + +
+
+ +
+ Form +
+
+ +

+ description +

+ +
+
+
+ + +
+
+ 10 +
+
+ + + +
+ + +
+
+ +
+ Alert +
+
+ +

+ description +

+
+
+
+ + +
+
+ 9 +
+
+ + + +
+
+
+ +
+ Gradient +
+
+ +

+ description +

+
+
+
+ + +
+ +
+ 8 +
+ +
+ + + +
+ +
+
+ +
+ Badge +
+
+

+ description +

+
+
+
+ + +
+
+ 7 +
+ +
+ + + +
+ + +
+
+ +
+ Button Group +
+
+ +

+ description +

+
+
+ +
+ + +
+
+ 7 +
+ +
+ + + +
+ +
+
+ +
+ Feature +
+
+

+ description +

+
+
+
+ + +
+
+ 6 +
+ +
+ + + +
+ +
+
+ +
+ Call to Action +
+
+

+ description +

+
+
+
+ + +
+
+ 6 +
+
+ + + +
+ +
+
+ +
+ Grid +
+
+ +

+ description +

+
+
+
+ + +
+
+ 6 +
+ +
+ + + +
+ + +
+
+ +
+ Login +
+
+

+ description +

+
+
+
+ +
+ +
+} + +templ card() { + +
+ +
Noteworthy technology acquisitions 2021
+
+

Here are the biggest enterprise technology acquisitions of 2021 so far, in reverse chronological order.

+ + Read more + + +
+ + +} diff --git a/views/components/headbar.templ b/views/components/headbar.templ new file mode 100644 index 0000000..9b1ba56 --- /dev/null +++ b/views/components/headbar.templ @@ -0,0 +1,20 @@ +package components + + +templ HeaderBar() { + +} \ No newline at end of file diff --git a/views/components/navbar.templ b/views/components/navbar.templ new file mode 100644 index 0000000..195acb5 --- /dev/null +++ b/views/components/navbar.templ @@ -0,0 +1,44 @@ +package components + +type link struct{ + Name string + Href string +} + +var links = []link{ + //{Name: "Home", Href: "/home"}, + {Name: "Reporting", Href: "/reporting"}, + //{Name: "Fins", Href: "/fins"}, + //{Name: "Integrations", Href: "/integrations"}, + {Name: "Settings", Href: "/settings"}, +} + +templ RenderLinks(links []link) { + for _, link := range links { + + {link.Name} + } +} + +templ Navsidebar(title string, version string, documentation_url string) { + +} diff --git a/views/components/notications.templ b/views/components/notications.templ new file mode 100644 index 0000000..2fb30f5 --- /dev/null +++ b/views/components/notications.templ @@ -0,0 +1,21 @@ +package components + + +templ TitledWarningNofication(title string, message string) { +
+
+ { title } +
+
+

{ message }

+
+
+} + +templ WarningNofication(message string) { +
+
+ { message } +
+
+} \ No newline at end of file diff --git a/views/components/overlays.templ b/views/components/overlays.templ new file mode 100644 index 0000000..cfa24a1 --- /dev/null +++ b/views/components/overlays.templ @@ -0,0 +1,8 @@ +package components + +templ Overlay() { +
+ { children... } +
+ +} \ No newline at end of file diff --git a/views/components/reporting_card.templ b/views/components/reporting_card.templ new file mode 100644 index 0000000..5c84f77 --- /dev/null +++ b/views/components/reporting_card.templ @@ -0,0 +1,80 @@ +package components + +import "fmt" + + + +type ReportingCardData struct { + Loaded bool + Name string + Value int + ID string +} + +templ ReportingCard(data ReportingCardData) { + + + if !data.Loaded { +
+
+
+
+ + + + + +
+
+
+
+ unkown +
+
+ - +
+ //
+ // 32k increase + // + //
+
+
+
+ } else { + + + +
+
+
+ { data.Name } +
+
+ { fmt.Sprint(data.Value)} +
+ //
+ // 32k increase + // + //
+
+
+ } + +} \ No newline at end of file diff --git a/views/dashboard/reporting/reporting.templ b/views/dashboard/reporting/reporting.templ new file mode 100644 index 0000000..02b812a --- /dev/null +++ b/views/dashboard/reporting/reporting.templ @@ -0,0 +1,323 @@ +package reporting + + +import ( + "soarca-gui/views/layouts" + "soarca-gui/views/components" +) + +var initialCards = []components.ReportingCardData{ + {Loaded: false, ID: "1"}, + {Loaded: false, ID: "2"}, + {Loaded: false, ID: "3"}} + +templ ReportingIndex() { + @layouts.DashboardLayout("SOARCA-GUI", "", ""){ +
+ @ReportingBase() + @ReportList() +
+ } +} + +templ ReportList() { +
+
+
+
+ + + + + + + + + + // + + + + + + + + + + + + // + + + + + + + + + // + + + + + + + + + // + + + + + + + + + // + + + + + + + + + // + + + + +
+
+ + +
+
+ Date + + Status + + // Customer + // + Type + + Actions +
+
+ + + #3066 +
+
Jan 6, 2022 +
+ + + + +

Paid

+
+
+ //
+ // + //
+ //

Arthur Melo

+ //

authurmelo@example.com

+ //
+ //
+ //
playbook +
+ + + +
+
+
+ + + #3065 +
+
Jan 5, 2022 +
+ + + + +

Cancelled

+
+
+ //
+ // + //
+ //

Andi Lane

+ //

andi@example.com

+ //
+ //
+ //
playbook +
+ + + +
+
+
+ + + #3064 +
+
Jan 5, 2022 +
+ + + + +

Paid

+
+
+ //
+ // + //
+ //

Kate Morrison

+ //

kate@example.com

+ //
+ //
+ //
playbook +
+ + + +
+
+
+ + + #3063 +
+
Jan 4, 2022 +
+ + + + +

Paid

+
+
+ //
+ // + //
+ //

Candice Wu

+ //

candice@example.com

+ //
+ //
+ //
playbook +
+ + + +
+
+
+ + + #3062 +
+
Jan 4, 2022 +
+ + + + +

Refunded

+
+
+ //
+ // + //
+ //

Orlando Diggs

+ //

orlando@example.com

+ //
+ //
+ //
playbook +
+ + + +
+
+
+
+
+
+ + + +} + +templ ReportingBase() { + +

Reporting

+
+ + for _, card := range initialCards { + @components.ReportingCard(card) + } +
+} + diff --git a/views/home.templ b/views/home.templ new file mode 100644 index 0000000..69badc6 --- /dev/null +++ b/views/home.templ @@ -0,0 +1,15 @@ +package views + + +import ( + "soarca-gui/views/layouts" +) + + + +templ Home(components templ.Component){ + + @layouts.DashboardLayout("SOARCA-GUI","",""){ + + } +} \ No newline at end of file diff --git a/views/layouts/base_layout.templ b/views/layouts/base_layout.templ new file mode 100644 index 0000000..ca7b466 --- /dev/null +++ b/views/layouts/base_layout.templ @@ -0,0 +1,33 @@ +package layouts + +const ( + apptitle = "SOARCA-GUI" +) + +templ Head(title string, description string, content string) { + + { title } + + + + + + + + + + // + + +} + + +templ BaseLayout() { + + + @Head(apptitle,"","") + { children... } + +} + diff --git a/views/layouts/dashboard_layout.templ b/views/layouts/dashboard_layout.templ new file mode 100644 index 0000000..cdc7636 --- /dev/null +++ b/views/layouts/dashboard_layout.templ @@ -0,0 +1,17 @@ +package layouts + +import "soarca-gui/views/components" + +templ DashboardLayout(title string, version string, homelink string) { + @BaseLayout() { + + @components.Navsidebar(title, version, homelink) +
+ @components.HeaderBar() +
+ {children...} +
+
+ + } +} \ No newline at end of file