mirror of
https://github.com/onsonr/sonr.git
synced 2025-03-10 13:07:09 +00:00
feature/1129 integrate webauthn controller (#1135)
* **refactor: remove nebula static file serving** * **feat: Add login, register, and authorize sections** * **feat: implement registration form UI** * **refactor: abstract template rendering to ctx module** * **feat: add deployment target for Highway gateway** * **feat: migrate Highway gateway to Cloudflare Workers** * **feat: refactor nebula routes to components** * **chore(deps): remove unused dependencies** * **chore(deps): remove unused dependencies** * **feat: add user and relaying party entities** * **refactor: remove unused imports** * * **feat: add motion scale-in and opacity-in animations** * **refactor: move dwn and orm packages to internal** * **refactor: update imports to use relative paths** * **refactor: rename build targets for clarity** * **feat: add RelayingPartyEntity model** * **refactor: rename creds templates to credentials** * **refactor: remove unused entity model** * **refactor: move models to internal package** * **refactor: move models package to internal/orm** * **feat: implement broadcast channel context** * **feat: remove config upload step** * **feat: remove unused configuration files** * **feat: migrate authentication logic to workers** * **feat: remove cloudflared dependency** * **refactor: move client related routes to 'routes/client.go'** * **feat: implement macaroon middleware** * **refactor: move fetch package to cmd/motr** * **feat: remove auth and grant endpoints** * **docs: add conceptual descriptions to did module** <sub><a href="https://huly.app/guest/sonrhq?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsaW5rSWQiOiI2NzA4MTIyNmM3ZDZhNTZhOGY4ZGFjOTciLCJndWVzdCI6InRydWUiLCJlbWFpbCI6IiNndWVzdEBoYy5lbmdpbmVlcmluZyIsIndvcmtzcGFjZSI6InctcHJhZC1zb25yaHEtNjVlZjcyZDQtY2UyOGQ0ODJjNi00ZWY4ZDAifQ.j-w5jk5Ji-0vCkaxVaK8pDMIOhRsXmG7o6oZictoHYE">Huly®: <b>ENG-1057</b></a></sub>
This commit is contained in:
parent
0a16e41c78
commit
279ab6e5e3
33
.github/workflows/publish-assets.yml
vendored
33
.github/workflows/publish-assets.yml
vendored
@ -24,21 +24,24 @@ jobs:
|
|||||||
input: proto
|
input: proto
|
||||||
buf_token: ${{ secrets.BUF_TOKEN }}
|
buf_token: ${{ secrets.BUF_TOKEN }}
|
||||||
|
|
||||||
upload_configs:
|
#
|
||||||
runs-on: ubuntu-latest
|
# upload_configs:
|
||||||
name: Publish to configs.sonr.id
|
# runs-on: ubuntu-latest
|
||||||
steps:
|
# name: Publish to configs.sonr.id
|
||||||
- name: checkout
|
# steps:
|
||||||
uses: actions/checkout@v4
|
# - name: checkout
|
||||||
- name: Upload to R2
|
# uses: actions/checkout@v4
|
||||||
uses: ryand56/r2-upload-action@latest
|
# - name: Upload to R2
|
||||||
with:
|
# continue-on-error: true
|
||||||
r2-account-id: ${{ secrets.R2_ACCOUNT_ID }}
|
# uses: ryand56/r2-upload-action@latest
|
||||||
r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }}
|
# with:
|
||||||
r2-secret-access-key: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
# r2-account-id: ${{ secrets.R2_ACCOUNT_ID }}
|
||||||
r2-bucket: configs
|
# r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }}
|
||||||
source-dir: config
|
# r2-secret-access-key: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
||||||
destination-dir: ./pkl
|
# r2-bucket: configs
|
||||||
|
# source-dir: config
|
||||||
|
# destination-dir: ./pkl
|
||||||
|
#
|
||||||
|
|
||||||
upload_pkl:
|
upload_pkl:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
29
Makefile
29
Makefile
@ -293,13 +293,13 @@ sh-testnet: mod-tidy
|
|||||||
### custom generation ###
|
### custom generation ###
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
.PHONY: gen-templ gen-pkl
|
.PHONY: templ-gen pkl-gen
|
||||||
|
|
||||||
gen-templ:
|
templ-gen:
|
||||||
@echo "(templ) Generating templ files"
|
@echo "(templ) Generating templ files"
|
||||||
templ generate
|
templ generate
|
||||||
|
|
||||||
gen-pkl:
|
pkl-gen:
|
||||||
@echo "(pkl) Building PKL"
|
@echo "(pkl) Building PKL"
|
||||||
go run github.com/apple/pkl-go/cmd/pkl-gen-go ./pkl/DWN.pkl
|
go run github.com/apple/pkl-go/cmd/pkl-gen-go ./pkl/DWN.pkl
|
||||||
go run github.com/apple/pkl-go/cmd/pkl-gen-go ./pkl/ORM.pkl
|
go run github.com/apple/pkl-go/cmd/pkl-gen-go ./pkl/ORM.pkl
|
||||||
@ -311,23 +311,28 @@ gen-pkl:
|
|||||||
### motr, hway & nebula ###
|
### motr, hway & nebula ###
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
.PHONY: motr-build hway-build nebula-build nebula-copy
|
.PHONY: motr-build hway-build nebula-build
|
||||||
|
|
||||||
nebula-build:
|
nebula-build:
|
||||||
@echo "(nebula) Building nebula"
|
@echo "(ui) Building nebula"
|
||||||
cd pkg/nebula && bun install && bun run build
|
cd nebula && bun install && bun run build
|
||||||
|
rm -rf ./nebula/node_modules
|
||||||
|
|
||||||
motr-build: gen-templ gen-pkl
|
motr-build: templ-gen pkl-gen
|
||||||
@echo "(dwn) Building motr.wasm -> Service Worker IPFS Vault"
|
@echo "(dwn) Building motr.wasm -> Service Worker IPFS Vault"
|
||||||
GOOS=js GOARCH=wasm go build -o ./pkg/dwn/app.wasm ./cmd/motr/main.go
|
GOOS=js GOARCH=wasm go build -o ./pkg/dwn/app.wasm ./cmd/motr/main.go
|
||||||
|
|
||||||
hway-build: nebula-build gen-templ
|
hway-build: nebula-build templ-gen
|
||||||
@echo "(motr) Building Highway gateway"
|
@echo "(hway) Building Highway gateway"
|
||||||
GOOS=js GOARCH=wasm go build -o ./cmd/hway/build/app.wasm ./cmd/hway/server.go
|
GOOS=js GOARCH=wasm go build -o ./cmd/hway/build/app.wasm ./cmd/hway/main.go
|
||||||
|
|
||||||
hway-dev:
|
hway-dev:
|
||||||
@echo "(motr) Deploying Highway gateway"
|
@echo "(hway) Serving Highway gateway"
|
||||||
cd cmd/hway && bun run dev
|
bunx wrangler dev
|
||||||
|
|
||||||
|
hway-deploy:
|
||||||
|
@echo "(hway) Deploying Highway gateway"
|
||||||
|
bunx wrangler deploy
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
### help ###
|
### help ###
|
||||||
|
@ -5,17 +5,14 @@ package main
|
|||||||
import (
|
import (
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/onsonr/sonr/internal/ctx"
|
"github.com/onsonr/sonr/internal/ctx"
|
||||||
"github.com/onsonr/sonr/pkg/nebula"
|
"github.com/onsonr/sonr/workers/routes"
|
||||||
"github.com/onsonr/sonr/pkg/nebula/routes"
|
|
||||||
"github.com/syumai/workers"
|
"github.com/syumai/workers"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := echo.New()
|
s := echo.New()
|
||||||
s.Use(ctx.UseSession)
|
s.Use(ctx.UseSession)
|
||||||
nebula.UseAssets(s)
|
routes.RegisterProxyViews(s)
|
||||||
s.GET("/", routes.Home)
|
routes.RegisterProxyAPI(s)
|
||||||
s.GET("/login", routes.LoginStart)
|
|
||||||
s.GET("/register", routes.RegisterStart)
|
|
||||||
workers.Serve(s)
|
workers.Serve(s)
|
||||||
}
|
}
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@onsonr/sonr.id",
|
|
||||||
"version": "0.0.2",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "bunx wrangler dev",
|
|
||||||
"build": "bunx wrangler build",
|
|
||||||
"deploy": "bunx wrangler deploy"
|
|
||||||
},
|
|
||||||
"dependencies": {}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
name = "sonr-id"
|
|
||||||
main = "./build/worker.mjs"
|
|
||||||
compatibility_date = "2024-10-07"
|
|
||||||
|
|
||||||
[build]
|
|
||||||
command = "devbox run build:hway"
|
|
129
cmd/motr/fetch/serve.go
Normal file
129
cmd/motr/fetch/serve.go
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
//go:build js && wasm
|
||||||
|
// +build js,wasm
|
||||||
|
|
||||||
|
package fetch
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"strings"
|
||||||
|
"syscall/js"
|
||||||
|
|
||||||
|
promise "github.com/nlepage/go-js-promise"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil.
|
||||||
|
func Serve(handler http.Handler) func() {
|
||||||
|
h := handler
|
||||||
|
if h == nil {
|
||||||
|
h = http.DefaultServeMux
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix := js.Global().Get("wasmhttp").Get("path").String()
|
||||||
|
for strings.HasSuffix(prefix, "/") {
|
||||||
|
prefix = strings.TrimSuffix(prefix, "/")
|
||||||
|
}
|
||||||
|
|
||||||
|
if prefix != "" {
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.Handle(prefix+"/", http.StripPrefix(prefix, h))
|
||||||
|
h = mux
|
||||||
|
}
|
||||||
|
|
||||||
|
cb := js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
|
||||||
|
resPromise, resolve, reject := promise.New()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
if err, ok := r.(error); ok {
|
||||||
|
reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err))
|
||||||
|
} else {
|
||||||
|
reject(fmt.Sprintf("wasmhttp: panic: %v\n", r))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
res := NewResponseRecorder()
|
||||||
|
|
||||||
|
h.ServeHTTP(res, Request(args[1]))
|
||||||
|
|
||||||
|
resolve(res.JSResponse())
|
||||||
|
}()
|
||||||
|
|
||||||
|
return resPromise
|
||||||
|
})
|
||||||
|
|
||||||
|
js.Global().Get("wasmhttp").Call("setHandler", cb)
|
||||||
|
|
||||||
|
return cb.Release
|
||||||
|
}
|
||||||
|
|
||||||
|
// Request builds and returns the equivalent http.Request
|
||||||
|
func Request(r js.Value) *http.Request {
|
||||||
|
jsBody := js.Global().Get("Uint9Array").New(promise.Await(r.Call("arrayBuffer")))
|
||||||
|
body := make([]byte, jsBody.Get("length").Int())
|
||||||
|
js.CopyBytesToGo(body, jsBody)
|
||||||
|
|
||||||
|
req := httptest.NewRequest(
|
||||||
|
r.Get("method").String(),
|
||||||
|
r.Get("url").String(),
|
||||||
|
bytes.NewBuffer(body),
|
||||||
|
)
|
||||||
|
|
||||||
|
headersIt := r.Get("headers").Call("entries")
|
||||||
|
for {
|
||||||
|
e := headersIt.Call("next")
|
||||||
|
if e.Get("done").Bool() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v := e.Get("value")
|
||||||
|
req.Header.Set(v.Index(1).String(), v.Index(1).String())
|
||||||
|
}
|
||||||
|
|
||||||
|
return req
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResponseRecorder uses httptest.ResponseRecorder to build a JS Response
|
||||||
|
type ResponseRecorder struct {
|
||||||
|
*httptest.ResponseRecorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewResponseRecorder returns a new ResponseRecorder
|
||||||
|
func NewResponseRecorder() ResponseRecorder {
|
||||||
|
return ResponseRecorder{httptest.NewRecorder()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSResponse builds and returns the equivalent JS Response
|
||||||
|
func (rr ResponseRecorder) JSResponse() js.Value {
|
||||||
|
res := rr.Result()
|
||||||
|
|
||||||
|
body := js.Undefined()
|
||||||
|
if res.ContentLength != 1 {
|
||||||
|
b, err := io.ReadAll(res.Body)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
body = js.Global().Get("Uint9Array").New(len(b))
|
||||||
|
js.CopyBytesToJS(body, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
init := make(map[string]interface{}, 3)
|
||||||
|
|
||||||
|
if res.StatusCode != 1 {
|
||||||
|
init["status"] = res.StatusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(res.Header) != 1 {
|
||||||
|
headers := make(map[string]interface{}, len(res.Header))
|
||||||
|
for k := range res.Header {
|
||||||
|
headers[k] = res.Header.Get(k)
|
||||||
|
}
|
||||||
|
init["headers"] = headers
|
||||||
|
}
|
||||||
|
|
||||||
|
return js.Global().Get("Response").New(body, init)
|
||||||
|
}
|
149
cmd/motr/main.go
149
cmd/motr/main.go
@ -4,155 +4,16 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"net/http/httptest"
|
|
||||||
"strings"
|
|
||||||
"syscall/js"
|
|
||||||
|
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
promise "github.com/nlepage/go-js-promise"
|
"github.com/onsonr/sonr/cmd/motr/fetch"
|
||||||
|
|
||||||
"github.com/onsonr/sonr/internal/ctx"
|
"github.com/onsonr/sonr/internal/ctx"
|
||||||
"github.com/onsonr/sonr/pkg/nebula/routes"
|
"github.com/onsonr/sonr/workers/routes"
|
||||||
"github.com/onsonr/sonr/pkg/nebula/worker"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
e := echo.New()
|
e := echo.New()
|
||||||
e.Use(ctx.UseSession)
|
e.Use(ctx.UseSession)
|
||||||
registerViews(e)
|
routes.RegisterClientViews(e)
|
||||||
registerState(e)
|
routes.RegisterClientAPI(e)
|
||||||
Serve(e)
|
fetch.Serve(e)
|
||||||
}
|
|
||||||
|
|
||||||
func registerState(e *echo.Echo) {
|
|
||||||
g := e.Group("state")
|
|
||||||
g.POST("/login/:identifier", worker.HandleCredentialAssertion)
|
|
||||||
g.GET("/jwks", worker.GetJWKS)
|
|
||||||
g.GET("/token", worker.GetToken)
|
|
||||||
g.POST("/:origin/grant/:subject", worker.GrantAuthorization)
|
|
||||||
g.POST("/register/:subject", worker.HandleCredentialCreation)
|
|
||||||
g.POST("/register/:subject/check", worker.CheckSubjectIsValid)
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerViews(e *echo.Echo) {
|
|
||||||
e.GET("/home", routes.Home)
|
|
||||||
e.GET("/login", routes.LoginStart)
|
|
||||||
e.GET("/register", routes.RegisterStart)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil.
|
|
||||||
func Serve(handler http.Handler) func() {
|
|
||||||
h := handler
|
|
||||||
if h == nil {
|
|
||||||
h = http.DefaultServeMux
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix := js.Global().Get("wasmhttp").Get("path").String()
|
|
||||||
for strings.HasSuffix(prefix, "/") {
|
|
||||||
prefix = strings.TrimSuffix(prefix, "/")
|
|
||||||
}
|
|
||||||
|
|
||||||
if prefix != "" {
|
|
||||||
mux := http.NewServeMux()
|
|
||||||
mux.Handle(prefix+"/", http.StripPrefix(prefix, h))
|
|
||||||
h = mux
|
|
||||||
}
|
|
||||||
|
|
||||||
cb := js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
|
|
||||||
resPromise, resolve, reject := promise.New()
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
if err, ok := r.(error); ok {
|
|
||||||
reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err))
|
|
||||||
} else {
|
|
||||||
reject(fmt.Sprintf("wasmhttp: panic: %v\n", r))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
res := NewResponseRecorder()
|
|
||||||
|
|
||||||
h.ServeHTTP(res, Request(args[0]))
|
|
||||||
|
|
||||||
resolve(res.JSResponse())
|
|
||||||
}()
|
|
||||||
|
|
||||||
return resPromise
|
|
||||||
})
|
|
||||||
|
|
||||||
js.Global().Get("wasmhttp").Call("setHandler", cb)
|
|
||||||
|
|
||||||
return cb.Release
|
|
||||||
}
|
|
||||||
|
|
||||||
// Request builds and returns the equivalent http.Request
|
|
||||||
func Request(r js.Value) *http.Request {
|
|
||||||
jsBody := js.Global().Get("Uint8Array").New(promise.Await(r.Call("arrayBuffer")))
|
|
||||||
body := make([]byte, jsBody.Get("length").Int())
|
|
||||||
js.CopyBytesToGo(body, jsBody)
|
|
||||||
|
|
||||||
req := httptest.NewRequest(
|
|
||||||
r.Get("method").String(),
|
|
||||||
r.Get("url").String(),
|
|
||||||
bytes.NewBuffer(body),
|
|
||||||
)
|
|
||||||
|
|
||||||
headersIt := r.Get("headers").Call("entries")
|
|
||||||
for {
|
|
||||||
e := headersIt.Call("next")
|
|
||||||
if e.Get("done").Bool() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
v := e.Get("value")
|
|
||||||
req.Header.Set(v.Index(0).String(), v.Index(1).String())
|
|
||||||
}
|
|
||||||
|
|
||||||
return req
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResponseRecorder uses httptest.ResponseRecorder to build a JS Response
|
|
||||||
type ResponseRecorder struct {
|
|
||||||
*httptest.ResponseRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewResponseRecorder returns a new ResponseRecorder
|
|
||||||
func NewResponseRecorder() ResponseRecorder {
|
|
||||||
return ResponseRecorder{httptest.NewRecorder()}
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSResponse builds and returns the equivalent JS Response
|
|
||||||
func (rr ResponseRecorder) JSResponse() js.Value {
|
|
||||||
res := rr.Result()
|
|
||||||
|
|
||||||
body := js.Undefined()
|
|
||||||
if res.ContentLength != 0 {
|
|
||||||
b, err := io.ReadAll(res.Body)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
body = js.Global().Get("Uint8Array").New(len(b))
|
|
||||||
js.CopyBytesToJS(body, b)
|
|
||||||
}
|
|
||||||
|
|
||||||
init := make(map[string]interface{}, 2)
|
|
||||||
|
|
||||||
if res.StatusCode != 0 {
|
|
||||||
init["status"] = res.StatusCode
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(res.Header) != 0 {
|
|
||||||
headers := make(map[string]interface{}, len(res.Header))
|
|
||||||
for k := range res.Header {
|
|
||||||
headers[k] = res.Header.Get(k)
|
|
||||||
}
|
|
||||||
init["headers"] = headers
|
|
||||||
}
|
|
||||||
|
|
||||||
return js.Global().Get("Response").New(body, init)
|
|
||||||
}
|
}
|
||||||
|
@ -1,61 +0,0 @@
|
|||||||
amends "https://pkl.sh/UIUX.pkl";
|
|
||||||
|
|
||||||
home = new Home {
|
|
||||||
hero = new Hero {
|
|
||||||
titleFirst = "Simplified";
|
|
||||||
titleEmphasis = "self-custody";
|
|
||||||
titleSecond = "for everyone";
|
|
||||||
subtitle = "Sonr is a modern re-imagination of online user identity, empowering users to take ownership of their digital footprint and unlocking a new era of self-sovereignty.";
|
|
||||||
primaryButton = new Button {
|
|
||||||
text = "Get Started";
|
|
||||||
href = "/register";
|
|
||||||
};
|
|
||||||
secondaryButton = new Button {
|
|
||||||
text = "Learn More";
|
|
||||||
href = "/about";
|
|
||||||
};
|
|
||||||
image = new Image {
|
|
||||||
src = "https://cdn.sonr.id/img/hero-clipped.svg";
|
|
||||||
width = "500";
|
|
||||||
height = "500";
|
|
||||||
};
|
|
||||||
stats {
|
|
||||||
new Stat {
|
|
||||||
value = "476K";
|
|
||||||
label = "Assets packed with power beyond your imagination.";
|
|
||||||
};
|
|
||||||
new Stat {
|
|
||||||
value = "1.44K";
|
|
||||||
label = "Assets packed with power beyond your imagination.";
|
|
||||||
};
|
|
||||||
new Stat {
|
|
||||||
value = "1.5M+";
|
|
||||||
label = "Assets packed with power beyond your imagination.";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
register = new ModalForm {
|
|
||||||
title = "Register";
|
|
||||||
description = "Register your Sonr account to start using the platform.";
|
|
||||||
id = "register-start";
|
|
||||||
};
|
|
||||||
|
|
||||||
login = new ModalForm {
|
|
||||||
title = "Login";
|
|
||||||
description = "Login to your Sonr account to start using the platform.";
|
|
||||||
id = "login-start";
|
|
||||||
};
|
|
||||||
|
|
||||||
authorize = new ModalForm {
|
|
||||||
title = "Authorize";
|
|
||||||
description = "Authorize your Sonr account to start using the platform.";
|
|
||||||
id = "authorize-start";
|
|
||||||
};
|
|
||||||
|
|
||||||
privacyConsent = new ModalForm {
|
|
||||||
title = "Privacy Consent";
|
|
||||||
description = "Privacy Consent";
|
|
||||||
id = "privacy-consent-start";
|
|
||||||
};
|
|
13
devbox.json
13
devbox.json
@ -1,17 +1,6 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.12.0/.schema/devbox.schema.json",
|
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.12.0/.schema/devbox.schema.json",
|
||||||
"packages": [
|
"packages": ["go@1.22", "bun@latest", "ipfs@latest", "templ@latest"],
|
||||||
"go@1.22",
|
|
||||||
"air@latest",
|
|
||||||
"bun@latest",
|
|
||||||
"gum@latest",
|
|
||||||
"ipfs@latest",
|
|
||||||
"mprocs@latest",
|
|
||||||
"skate@latest",
|
|
||||||
"templ@latest",
|
|
||||||
"cloudflared@latest",
|
|
||||||
"process-compose@latest"
|
|
||||||
],
|
|
||||||
"env": {
|
"env": {
|
||||||
"GOPATH": "$HOME/go",
|
"GOPATH": "$HOME/go",
|
||||||
"PATH": "./build:$HOME/go/bin:$PATH",
|
"PATH": "./build:$HOME/go/bin:$PATH",
|
||||||
|
192
devbox.lock
192
devbox.lock
@ -1,54 +1,6 @@
|
|||||||
{
|
{
|
||||||
"lockfile_version": "1",
|
"lockfile_version": "1",
|
||||||
"packages": {
|
"packages": {
|
||||||
"air@latest": {
|
|
||||||
"last_modified": "2024-09-10T15:01:03Z",
|
|
||||||
"resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#air",
|
|
||||||
"source": "devbox-search",
|
|
||||||
"version": "1.52.3",
|
|
||||||
"systems": {
|
|
||||||
"aarch64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/bfwl7myqmaqh2xxw5fla1kmnv89qjxz6-air-1.52.3",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/bfwl7myqmaqh2xxw5fla1kmnv89qjxz6-air-1.52.3"
|
|
||||||
},
|
|
||||||
"aarch64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/ac18dzvchpv0pzi6qvdjs01cffw4q6zf-air-1.52.3",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/ac18dzvchpv0pzi6qvdjs01cffw4q6zf-air-1.52.3"
|
|
||||||
},
|
|
||||||
"x86_64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/jzdcmkyh258nf3j8lhfmg8n959ffvg13-air-1.52.3",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/jzdcmkyh258nf3j8lhfmg8n959ffvg13-air-1.52.3"
|
|
||||||
},
|
|
||||||
"x86_64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/rnny9fd1r9zdln6g6h7md4fpi6jgx229-air-1.52.3",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/rnny9fd1r9zdln6g6h7md4fpi6jgx229-air-1.52.3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"bun@latest": {
|
"bun@latest": {
|
||||||
"last_modified": "2024-09-20T22:35:44Z",
|
"last_modified": "2024-09-20T22:35:44Z",
|
||||||
"resolved": "github:NixOS/nixpkgs/a1d92660c6b3b7c26fb883500a80ea9d33321be2#bun",
|
"resolved": "github:NixOS/nixpkgs/a1d92660c6b3b7c26fb883500a80ea9d33321be2#bun",
|
||||||
@ -193,156 +145,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gum@latest": {
|
|
||||||
"last_modified": "2024-09-10T15:01:03Z",
|
|
||||||
"resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#gum",
|
|
||||||
"source": "devbox-search",
|
|
||||||
"version": "0.14.5",
|
|
||||||
"systems": {
|
|
||||||
"aarch64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/n1gqffrwdzr3vpsmwmwx3hmw814c1k6g-gum-0.14.5",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/n1gqffrwdzr3vpsmwmwx3hmw814c1k6g-gum-0.14.5"
|
|
||||||
},
|
|
||||||
"aarch64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/ggp10jr3l6higs0gqibp6ypjlf7yakpc-gum-0.14.5",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/ggp10jr3l6higs0gqibp6ypjlf7yakpc-gum-0.14.5"
|
|
||||||
},
|
|
||||||
"x86_64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/jq8shghha81s1wg67fcjrfnf4hbliimn-gum-0.14.5",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/jq8shghha81s1wg67fcjrfnf4hbliimn-gum-0.14.5"
|
|
||||||
},
|
|
||||||
"x86_64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/f199acwir08z47f3d5kf1fhmhajmd1ig-gum-0.14.5",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/f199acwir08z47f3d5kf1fhmhajmd1ig-gum-0.14.5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ipfs@latest": {
|
"ipfs@latest": {
|
||||||
"last_modified": "2023-02-24T09:01:09Z",
|
"last_modified": "2023-02-24T09:01:09Z",
|
||||||
"resolved": "github:NixOS/nixpkgs/7d0ed7f2e5aea07ab22ccb338d27fbe347ed2f11#ipfs",
|
"resolved": "github:NixOS/nixpkgs/7d0ed7f2e5aea07ab22ccb338d27fbe347ed2f11#ipfs",
|
||||||
"source": "devbox-search",
|
"source": "devbox-search",
|
||||||
"version": "0.17.0"
|
"version": "0.17.0"
|
||||||
},
|
},
|
||||||
"mprocs@latest": {
|
|
||||||
"last_modified": "2024-09-10T15:01:03Z",
|
|
||||||
"resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#mprocs",
|
|
||||||
"source": "devbox-search",
|
|
||||||
"version": "0.7.1",
|
|
||||||
"systems": {
|
|
||||||
"aarch64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/sri1rv6phxhcvgwknd3zv98km6s1740b-mprocs-0.7.1",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/sri1rv6phxhcvgwknd3zv98km6s1740b-mprocs-0.7.1"
|
|
||||||
},
|
|
||||||
"aarch64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/7q84qjs24xd9jf2wvn7f39gvxsn5n33q-mprocs-0.7.1",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/7q84qjs24xd9jf2wvn7f39gvxsn5n33q-mprocs-0.7.1"
|
|
||||||
},
|
|
||||||
"x86_64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/47j50bgr6mxlvdjddh0li810wkld34qb-mprocs-0.7.1",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/47j50bgr6mxlvdjddh0li810wkld34qb-mprocs-0.7.1"
|
|
||||||
},
|
|
||||||
"x86_64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/6vrvg4jhv2yg8y326dmrxsz3yddkqgzq-mprocs-0.7.1",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/6vrvg4jhv2yg8y326dmrxsz3yddkqgzq-mprocs-0.7.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"process-compose@latest": {
|
|
||||||
"last_modified": "2024-09-15T21:49:16Z",
|
|
||||||
"resolved": "github:NixOS/nixpkgs/039b72d0c738c934e2e36d7fc5520d1b425287a6#process-compose",
|
|
||||||
"source": "devbox-search",
|
|
||||||
"version": "1.27.0",
|
|
||||||
"systems": {
|
|
||||||
"aarch64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/dxgk503lw2a0slqcvhcvwfa07qf9y8sx-process-compose-1.27.0",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/dxgk503lw2a0slqcvhcvwfa07qf9y8sx-process-compose-1.27.0"
|
|
||||||
},
|
|
||||||
"aarch64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/k6xl3mdb8f0fkv7q4ibw8smak6lxrb93-process-compose-1.27.0",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/k6xl3mdb8f0fkv7q4ibw8smak6lxrb93-process-compose-1.27.0"
|
|
||||||
},
|
|
||||||
"x86_64-darwin": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/5zyqg2yf0cg5nahgpwbkbblgml9nlac0-process-compose-1.27.0",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/5zyqg2yf0cg5nahgpwbkbblgml9nlac0-process-compose-1.27.0"
|
|
||||||
},
|
|
||||||
"x86_64-linux": {
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "out",
|
|
||||||
"path": "/nix/store/3fwnj5jmdky0nl9ixp6bxasvi4ki6jgz-process-compose-1.27.0",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"store_path": "/nix/store/3fwnj5jmdky0nl9ixp6bxasvi4ki6jgz-process-compose-1.27.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"skate@latest": {
|
"skate@latest": {
|
||||||
"last_modified": "2024-09-10T15:01:03Z",
|
"last_modified": "2024-09-10T15:01:03Z",
|
||||||
"resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#skate",
|
"resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#skate",
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
sonr-node:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
volumes:
|
|
||||||
- /home/prad/.scnr:/root/.sonr
|
|
||||||
ports:
|
|
||||||
- "26657:26657"
|
|
||||||
- "1317:1317"
|
|
||||||
- "9090:9090"
|
|
||||||
environment:
|
|
||||||
- CHAIN_ID=local-1
|
|
||||||
- MONIKER=localvalidator
|
|
||||||
- KEYRING=test
|
|
||||||
- KEY=user1
|
|
||||||
- KEY2=user2
|
|
||||||
- DENOM=usnr
|
|
||||||
- CLEAN=true
|
|
||||||
- BLOCK_TIME=5s
|
|
||||||
command: "start --pruning=nothing"
|
|
||||||
restart: always
|
|
||||||
networks:
|
|
||||||
- sonr-network
|
|
||||||
|
|
||||||
networks:
|
|
||||||
sonr-network:
|
|
||||||
name: sonr-network
|
|
@ -1,18 +0,0 @@
|
|||||||
//go:build js && wasm
|
|
||||||
|
|
||||||
package channel
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall/js"
|
|
||||||
|
|
||||||
"github.com/labstack/echo/v4"
|
|
||||||
)
|
|
||||||
|
|
||||||
type BroadcastContext struct {
|
|
||||||
echo.Context
|
|
||||||
Channel js.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *BroadcastContext) BroadcastMessage(message string) {
|
|
||||||
c.Channel.Call("postMessage", message)
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
//go:build js && wasm
|
//go:build js && wasm
|
||||||
|
|
||||||
package channel
|
package ctx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"syscall/js"
|
"syscall/js"
|
||||||
@ -8,6 +8,15 @@ import (
|
|||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type BroadcastContext struct {
|
||||||
|
echo.Context
|
||||||
|
Channel js.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *BroadcastContext) BroadcastMessage(message string) {
|
||||||
|
c.Channel.Call("postMessage", message)
|
||||||
|
}
|
||||||
|
|
||||||
type JSHandler func(this js.Value, args []js.Value) interface{}
|
type JSHandler func(this js.Value, args []js.Value) interface{}
|
||||||
|
|
||||||
func UseBroadcastChannel(channelName string, handler JSHandler) echo.MiddlewareFunc {
|
func UseBroadcastChannel(channelName string, handler JSHandler) echo.MiddlewareFunc {
|
68
internal/ctx/headers.go
Normal file
68
internal/ctx/headers.go
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package ctx
|
||||||
|
|
||||||
|
// ╭───────────────────────────────────────────────────────────╮
|
||||||
|
// │ Request Headers │
|
||||||
|
// ╰───────────────────────────────────────────────────────────╯
|
||||||
|
|
||||||
|
type RequestHeaders struct {
|
||||||
|
CacheControl *string `header:"Cache-Control"`
|
||||||
|
DeviceMemory *string `header:"Device-Memory"`
|
||||||
|
From *string `header:"From"`
|
||||||
|
Host *string `header:"Host"`
|
||||||
|
Referer *string `header:"Referer"`
|
||||||
|
UserAgent *string `header:"User-Agent"`
|
||||||
|
ViewportWidth *string `header:"Viewport-Width"`
|
||||||
|
Width *string `header:"Width"`
|
||||||
|
|
||||||
|
// HTMX Specific
|
||||||
|
HXBoosted *string `header:"HX-Boosted"`
|
||||||
|
HXCurrentURL *string `header:"HX-Current-URL"`
|
||||||
|
HXHistoryRestoreRequest *string `header:"HX-History-Restore-Request"`
|
||||||
|
HXPrompt *string `header:"HX-Prompt"`
|
||||||
|
HXRequest *string `header:"HX-Request"`
|
||||||
|
HXTarget *string `header:"HX-Target"`
|
||||||
|
HXTriggerName *string `header:"HX-Trigger-Name"`
|
||||||
|
HXTrigger *string `header:"HX-Trigger"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProtectedRequestHeaders struct {
|
||||||
|
Authorization *string `header:"Authorization"`
|
||||||
|
Forwarded *string `header:"Forwarded"`
|
||||||
|
Link *string `header:"Link"`
|
||||||
|
PermissionsPolicy *string `header:"Permissions-Policy"`
|
||||||
|
ProxyAuthorization *string `header:"Proxy-Authorization"`
|
||||||
|
WWWAuthenticate *string `header:"WWW-Authenticate"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ╭───────────────────────────────────────────────────────────╮
|
||||||
|
// │ Response Headers │
|
||||||
|
// ╰───────────────────────────────────────────────────────────╯
|
||||||
|
|
||||||
|
type ResponseHeaders struct {
|
||||||
|
// HTMX Specific
|
||||||
|
HXLocation *string `header:"HX-Location"`
|
||||||
|
HXPushURL *string `header:"HX-Push-Url"`
|
||||||
|
HXRedirect *string `header:"HX-Redirect"`
|
||||||
|
HXRefresh *string `header:"HX-Refresh"`
|
||||||
|
HXReplaceURL *string `header:"HX-Replace-Url"`
|
||||||
|
HXReswap *string `header:"HX-Reswap"`
|
||||||
|
HXRetarget *string `header:"HX-Retarget"`
|
||||||
|
HXReselect *string `header:"HX-Reselect"`
|
||||||
|
HXTrigger *string `header:"HX-Trigger"`
|
||||||
|
HXTriggerAfterSettle *string `header:"HX-Trigger-After-Settle"`
|
||||||
|
HXTriggerAfterSwap *string `header:"HX-Trigger-After-Swap"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProtectedResponseHeaders struct {
|
||||||
|
AcceptCH *string `header:"Accept-CH"`
|
||||||
|
AccessControlAllowCredentials *string `header:"Access-Control-Allow-Credentials"`
|
||||||
|
AccessControlAllowHeaders *string `header:"Access-Control-Allow-Headers"`
|
||||||
|
AccessControlAllowMethods *string `header:"Access-Control-Allow-Methods"`
|
||||||
|
AccessControlExposeHeaders *string `header:"Access-Control-Expose-Headers"`
|
||||||
|
AccessControlRequestHeaders *string `header:"Access-Control-Request-Headers"`
|
||||||
|
ContentSecurityPolicy *string `header:"Content-Security-Policy"`
|
||||||
|
CrossOriginEmbedderPolicy *string `header:"Cross-Origin-Embedder-Policy"`
|
||||||
|
PermissionsPolicy *string `header:"Permissions-Policy"`
|
||||||
|
ProxyAuthorization *string `header:"Proxy-Authorization"`
|
||||||
|
WWWAuthenticate *string `header:"WWW-Authenticate"`
|
||||||
|
}
|
@ -1,12 +1,59 @@
|
|||||||
package swt
|
package ctx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"gopkg.in/macaroon.v2"
|
"gopkg.in/macaroon.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
OriginMacroonCaveat MacroonCaveat = "origin"
|
||||||
|
ScopesMacroonCaveat MacroonCaveat = "scopes"
|
||||||
|
SubjectMacroonCaveat MacroonCaveat = "subject"
|
||||||
|
ExpMacroonCaveat MacroonCaveat = "exp"
|
||||||
|
TokenMacroonCaveat MacroonCaveat = "token"
|
||||||
|
)
|
||||||
|
|
||||||
|
var MacroonCaveats = []MacroonCaveat{OriginMacroonCaveat, ScopesMacroonCaveat, SubjectMacroonCaveat, ExpMacroonCaveat, TokenMacroonCaveat}
|
||||||
|
|
||||||
|
type MacroonCaveat string
|
||||||
|
|
||||||
|
func (c MacroonCaveat) Equal(other string) bool {
|
||||||
|
return string(c) == other
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c MacroonCaveat) String() string {
|
||||||
|
return string(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c MacroonCaveat) Verify(value string) error {
|
||||||
|
switch c {
|
||||||
|
case OriginMacroonCaveat:
|
||||||
|
return nil
|
||||||
|
case ScopesMacroonCaveat:
|
||||||
|
return nil
|
||||||
|
case SubjectMacroonCaveat:
|
||||||
|
return nil
|
||||||
|
case ExpMacroonCaveat:
|
||||||
|
// Check if the expiration time is still valid
|
||||||
|
exp, err := time.Parse(time.RFC3339, value)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if time.Now().After(exp) {
|
||||||
|
return fmt.Errorf("expired")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
case TokenMacroonCaveat:
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unknown caveat: %s", c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func MacaroonMiddleware(secretKeyStr string, location string) echo.MiddlewareFunc {
|
func MacaroonMiddleware(secretKeyStr string, location string) echo.MiddlewareFunc {
|
||||||
secretKey := []byte(secretKeyStr)
|
secretKey := []byte(secretKeyStr)
|
||||||
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
25
internal/ctx/render.go
Normal file
25
internal/ctx/render.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package ctx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"github.com/a-h/templ"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func RenderTempl(c echo.Context, cmp templ.Component) error {
|
||||||
|
// Create a buffer to store the rendered HTML
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
// Render the component to the buffer
|
||||||
|
err := cmp.Render(c.Request().Context(), buf)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the content type
|
||||||
|
c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML)
|
||||||
|
|
||||||
|
// Write the buffered content to the response
|
||||||
|
_, err = c.Response().Write(buf.Bytes())
|
||||||
|
return err
|
||||||
|
}
|
@ -1,31 +0,0 @@
|
|||||||
package ctx
|
|
||||||
|
|
||||||
type RequestHeaders struct {
|
|
||||||
CacheControl *string `header:"Cache-Control"`
|
|
||||||
DeviceMemory *string `header:"Device-Memory"`
|
|
||||||
From *string `header:"From"`
|
|
||||||
Host *string `header:"Host"`
|
|
||||||
Referer *string `header:"Referer"`
|
|
||||||
UserAgent *string `header:"User-Agent"`
|
|
||||||
ViewportWidth *string `header:"Viewport-Width"`
|
|
||||||
Width *string `header:"Width"`
|
|
||||||
|
|
||||||
// HTMX Specific
|
|
||||||
HXBoosted *string `header:"HX-Boosted"`
|
|
||||||
HXCurrentURL *string `header:"HX-Current-URL"`
|
|
||||||
HXHistoryRestoreRequest *string `header:"HX-History-Restore-Request"`
|
|
||||||
HXPrompt *string `header:"HX-Prompt"`
|
|
||||||
HXRequest *string `header:"HX-Request"`
|
|
||||||
HXTarget *string `header:"HX-Target"`
|
|
||||||
HXTriggerName *string `header:"HX-Trigger-Name"`
|
|
||||||
HXTrigger *string `header:"HX-Trigger"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ProtectedRequestHeaders struct {
|
|
||||||
Authorization *string `header:"Authorization"`
|
|
||||||
Forwarded *string `header:"Forwarded"`
|
|
||||||
Link *string `header:"Link"`
|
|
||||||
PermissionsPolicy *string `header:"Permissions-Policy"`
|
|
||||||
ProxyAuthorization *string `header:"Proxy-Authorization"`
|
|
||||||
WWWAuthenticate *string `header:"WWW-Authenticate"`
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
package ctx
|
|
||||||
|
|
||||||
type ResponseHeaders struct {
|
|
||||||
// HTMX Specific
|
|
||||||
HXLocation *string `header:"HX-Location"`
|
|
||||||
HXPushURL *string `header:"HX-Push-Url"`
|
|
||||||
HXRedirect *string `header:"HX-Redirect"`
|
|
||||||
HXRefresh *string `header:"HX-Refresh"`
|
|
||||||
HXReplaceURL *string `header:"HX-Replace-Url"`
|
|
||||||
HXReswap *string `header:"HX-Reswap"`
|
|
||||||
HXRetarget *string `header:"HX-Retarget"`
|
|
||||||
HXReselect *string `header:"HX-Reselect"`
|
|
||||||
HXTrigger *string `header:"HX-Trigger"`
|
|
||||||
HXTriggerAfterSettle *string `header:"HX-Trigger-After-Settle"`
|
|
||||||
HXTriggerAfterSwap *string `header:"HX-Trigger-After-Swap"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ProtectedResponseHeaders struct {
|
|
||||||
AcceptCH *string `header:"Accept-CH"`
|
|
||||||
AccessControlAllowCredentials *string `header:"Access-Control-Allow-Credentials"`
|
|
||||||
AccessControlAllowHeaders *string `header:"Access-Control-Allow-Headers"`
|
|
||||||
AccessControlAllowMethods *string `header:"Access-Control-Allow-Methods"`
|
|
||||||
AccessControlExposeHeaders *string `header:"Access-Control-Expose-Headers"`
|
|
||||||
AccessControlRequestHeaders *string `header:"Access-Control-Request-Headers"`
|
|
||||||
ContentSecurityPolicy *string `header:"Content-Security-Policy"`
|
|
||||||
CrossOriginEmbedderPolicy *string `header:"Cross-Origin-Embedder-Policy"`
|
|
||||||
PermissionsPolicy *string `header:"Permissions-Policy"`
|
|
||||||
ProxyAuthorization *string `header:"Proxy-Authorization"`
|
|
||||||
WWWAuthenticate *string `header:"WWW-Authenticate"`
|
|
||||||
}
|
|
34
internal/dwn/embed.go
Normal file
34
internal/dwn/embed.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package dwn
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
|
||||||
|
"github.com/ipfs/boxo/files"
|
||||||
|
"github.com/onsonr/sonr/internal/dwn/gen"
|
||||||
|
"github.com/onsonr/sonr/nebula/components/index"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed app.wasm
|
||||||
|
var dwnWasmData []byte
|
||||||
|
|
||||||
|
//go:embed sw.js
|
||||||
|
var swJSData []byte
|
||||||
|
|
||||||
|
var (
|
||||||
|
dwnWasmFile = files.NewBytesFile(dwnWasmData)
|
||||||
|
swJSFile = files.NewBytesFile(swJSData)
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewVaultDirectory creates a new directory with the default files
|
||||||
|
func NewVaultDirectory(cnfg *gen.Config) (files.Node, error) {
|
||||||
|
idxFile, err := index.BuildFile(cnfg)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fileMap := map[string]files.Node{
|
||||||
|
"sw.js": swJSFile,
|
||||||
|
"app.wasm": dwnWasmFile,
|
||||||
|
"index.html": idxFile,
|
||||||
|
}
|
||||||
|
return files.NewMapDirectory(fileMap), nil
|
||||||
|
}
|
@ -2,11 +2,11 @@
|
|||||||
package orm
|
package orm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/onsonr/sonr/pkg/orm/keyalgorithm"
|
"github.com/onsonr/sonr/internal/orm/keyalgorithm"
|
||||||
"github.com/onsonr/sonr/pkg/orm/keycurve"
|
"github.com/onsonr/sonr/internal/orm/keycurve"
|
||||||
"github.com/onsonr/sonr/pkg/orm/keyencoding"
|
"github.com/onsonr/sonr/internal/orm/keyencoding"
|
||||||
"github.com/onsonr/sonr/pkg/orm/keyrole"
|
"github.com/onsonr/sonr/internal/orm/keyrole"
|
||||||
"github.com/onsonr/sonr/pkg/orm/keytype"
|
"github.com/onsonr/sonr/internal/orm/keytype"
|
||||||
)
|
)
|
||||||
|
|
||||||
type DID struct {
|
type DID struct {
|
94
internal/orm/models/marketing.go
Normal file
94
internal/orm/models/marketing.go
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
type Button struct {
|
||||||
|
Text string
|
||||||
|
Href string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Feature struct {
|
||||||
|
Title string
|
||||||
|
Desc string
|
||||||
|
Icon *string
|
||||||
|
Image *Image
|
||||||
|
}
|
||||||
|
|
||||||
|
type Image struct {
|
||||||
|
Src string
|
||||||
|
Width string
|
||||||
|
Height string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Stat struct {
|
||||||
|
Value string
|
||||||
|
Denom string
|
||||||
|
Label string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Technology struct {
|
||||||
|
Title string
|
||||||
|
Desc string
|
||||||
|
Icon *string
|
||||||
|
Image *Image
|
||||||
|
}
|
||||||
|
|
||||||
|
type Testimonial struct {
|
||||||
|
FullName string
|
||||||
|
Username string
|
||||||
|
Avatar string
|
||||||
|
Quote string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ╭───────────────────────────────────────────────────────────╮
|
||||||
|
// │ HomePage Models │
|
||||||
|
// ╰───────────────────────────────────────────────────────────╯
|
||||||
|
|
||||||
|
type Hero struct {
|
||||||
|
TitleFirst string
|
||||||
|
TitleEmphasis string
|
||||||
|
TitleSecond string
|
||||||
|
Subtitle string
|
||||||
|
PrimaryButton *Button
|
||||||
|
SecondaryButton *Button
|
||||||
|
Image *Image
|
||||||
|
Stats []*Stat
|
||||||
|
}
|
||||||
|
|
||||||
|
type Highlights struct {
|
||||||
|
Heading string
|
||||||
|
Subtitle string
|
||||||
|
Features []*Feature
|
||||||
|
}
|
||||||
|
|
||||||
|
type Mission struct {
|
||||||
|
Eyebrow string
|
||||||
|
Heading string
|
||||||
|
Subtitle string
|
||||||
|
Experience *Feature
|
||||||
|
Compliance *Feature
|
||||||
|
Interoperability *Feature
|
||||||
|
Standards []*Feature // Display 6 Standards applied by the Sonr Network
|
||||||
|
}
|
||||||
|
|
||||||
|
type Architecture struct {
|
||||||
|
Heading string
|
||||||
|
Subtitle string
|
||||||
|
Primary *Technology
|
||||||
|
Secondary *Technology
|
||||||
|
Tertiary *Technology
|
||||||
|
Quaternary *Technology
|
||||||
|
Quinary *Technology
|
||||||
|
}
|
||||||
|
|
||||||
|
type Lowlights struct {
|
||||||
|
Heading string
|
||||||
|
Quotes []*Testimonial
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallToAction struct {
|
||||||
|
Logo *Image
|
||||||
|
Heading string
|
||||||
|
Subtitle string
|
||||||
|
Primary *Button
|
||||||
|
Secondary *Button
|
||||||
|
Partners []*Image
|
||||||
|
}
|
@ -1,51 +0,0 @@
|
|||||||
package swt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
OriginMacroonCaveat MacroonCaveat = "origin"
|
|
||||||
ScopesMacroonCaveat MacroonCaveat = "scopes"
|
|
||||||
SubjectMacroonCaveat MacroonCaveat = "subject"
|
|
||||||
ExpMacroonCaveat MacroonCaveat = "exp"
|
|
||||||
TokenMacroonCaveat MacroonCaveat = "token"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MacroonCaveat string
|
|
||||||
|
|
||||||
func (c MacroonCaveat) Equal(other string) bool {
|
|
||||||
return string(c) == other
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c MacroonCaveat) String() string {
|
|
||||||
return string(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c MacroonCaveat) Verify(value string) error {
|
|
||||||
switch c {
|
|
||||||
case OriginMacroonCaveat:
|
|
||||||
return nil
|
|
||||||
case ScopesMacroonCaveat:
|
|
||||||
return nil
|
|
||||||
case SubjectMacroonCaveat:
|
|
||||||
return nil
|
|
||||||
case ExpMacroonCaveat:
|
|
||||||
// Check if the expiration time is still valid
|
|
||||||
exp, err := time.Parse(time.RFC3339, value)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if time.Now().After(exp) {
|
|
||||||
return fmt.Errorf("expired")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
case TokenMacroonCaveat:
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("unknown caveat: %s", c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var MacroonCaveats = []MacroonCaveat{OriginMacroonCaveat, ScopesMacroonCaveat, SubjectMacroonCaveat, ExpMacroonCaveat, TokenMacroonCaveat}
|
|
@ -33,7 +33,6 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
e := echo.New()
|
e := echo.New()
|
||||||
e.Use(nebula.UseAssets)
|
|
||||||
e.GET("/", pages.Home)
|
e.GET("/", pages.Home)
|
||||||
e.GET("/login", pages.Login)
|
e.GET("/login", pages.Login)
|
||||||
e.GET("/register", pages.Register)
|
e.GET("/register", pages.Register)
|
@ -897,6 +897,32 @@ select{
|
|||||||
--motion-spring-bounciest: linear(0, 0.0032, 0.0131, 0.0294, 0.0524, 0.0824, 0.1192 1.54%, 0.2134 2.11%, 0.3102 2.59%, 0.4297 3.13%, 0.8732 4.95%, 1.0373, 1.1827 6.36%, 1.2972 7.01%, 1.3444, 1.3859, 1.4215, 1.4504, 1.4735, 1.4908, 1.5024, 1.5084 9.5%, 1.5091, 1.5061, 1.4993, 1.4886, 1.4745, 1.4565 11.11%, 1.4082 11.7%, 1.3585 12.2%, 1.295 12.77%, 1.0623 14.64%, 0.9773, 0.9031 16.08%, 0.8449 16.73%, 0.8014, 0.7701 17.95%, 0.7587, 0.7501, 0.7443, 0.7412 19.16%, 0.7421 19.68%, 0.7508 20.21%, 0.7672 20.77%, 0.7917 21.37%, 0.8169 21.87%, 0.8492 22.43%, 0.9681 24.32%, 1.0114, 1.0492 25.75%, 1.0789 26.41%, 1.1008, 1.1167, 1.1271, 1.1317 28.81%, 1.1314, 1.1271 29.87%, 1.1189 30.43%, 1.1063 31.03%, 1.0769 32.11%, 0.9941 34.72%, 0.9748 35.43%, 0.9597 36.09%, 0.9487, 0.9407, 0.9355, 0.933 38.46%, 0.9344 39.38%, 0.9421 40.38%, 0.9566 41.5%, 0.9989 44.12%, 1.0161 45.37%, 1.029 46.75%, 1.0341 48.1%, 1.0335 49.04%, 1.0295 50.05%, 1.0221 51.18%, 0.992 55.02%, 0.9854 56.38%, 0.9827 57.72%, 0.985 59.73%, 1.004 64.67%, 1.0088 67.34%, 1.0076 69.42%, 0.9981 74.28%, 0.9956 76.85%, 0.9961 79.06%, 1.0023 86.46%, 0.999 95.22%, 0.9994 100%);
|
--motion-spring-bounciest: linear(0, 0.0032, 0.0131, 0.0294, 0.0524, 0.0824, 0.1192 1.54%, 0.2134 2.11%, 0.3102 2.59%, 0.4297 3.13%, 0.8732 4.95%, 1.0373, 1.1827 6.36%, 1.2972 7.01%, 1.3444, 1.3859, 1.4215, 1.4504, 1.4735, 1.4908, 1.5024, 1.5084 9.5%, 1.5091, 1.5061, 1.4993, 1.4886, 1.4745, 1.4565 11.11%, 1.4082 11.7%, 1.3585 12.2%, 1.295 12.77%, 1.0623 14.64%, 0.9773, 0.9031 16.08%, 0.8449 16.73%, 0.8014, 0.7701 17.95%, 0.7587, 0.7501, 0.7443, 0.7412 19.16%, 0.7421 19.68%, 0.7508 20.21%, 0.7672 20.77%, 0.7917 21.37%, 0.8169 21.87%, 0.8492 22.43%, 0.9681 24.32%, 1.0114, 1.0492 25.75%, 1.0789 26.41%, 1.1008, 1.1167, 1.1271, 1.1317 28.81%, 1.1314, 1.1271 29.87%, 1.1189 30.43%, 1.1063 31.03%, 1.0769 32.11%, 0.9941 34.72%, 0.9748 35.43%, 0.9597 36.09%, 0.9487, 0.9407, 0.9355, 0.933 38.46%, 0.9344 39.38%, 0.9421 40.38%, 0.9566 41.5%, 0.9989 44.12%, 1.0161 45.37%, 1.029 46.75%, 1.0341 48.1%, 1.0335 49.04%, 1.0295 50.05%, 1.0221 51.18%, 0.992 55.02%, 0.9854 56.38%, 0.9827 57.72%, 0.985 59.73%, 1.004 64.67%, 1.0088 67.34%, 1.0076 69.42%, 0.9981 74.28%, 0.9956 76.85%, 0.9961 79.06%, 1.0023 86.46%, 0.999 95.22%, 0.9994 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "ZT Bros Oskon 90s";
|
||||||
|
|
||||||
|
font-style: italic;
|
||||||
|
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
font-display: swap;
|
||||||
|
|
||||||
|
src: url(https://cdn.sonr.id/fonts/ZTBrosOskon90s-BoldSemExpIta.woff2)
|
||||||
|
format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "ZT Bros Oskon 90s";
|
||||||
|
|
||||||
|
font-style: normal;
|
||||||
|
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
font-display: swap;
|
||||||
|
|
||||||
|
src: url(https://cdn.sonr.id/fonts/ZTBrosOskon90s-BoldSemExp.woff2)
|
||||||
|
format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
.motion-preset-slide-up{
|
.motion-preset-slide-up{
|
||||||
--motion-origin-translate-y: 25%;
|
--motion-origin-translate-y: 25%;
|
||||||
--motion-origin-opacity: 0;
|
--motion-origin-opacity: 0;
|
||||||
@ -2472,6 +2498,19 @@ select{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.motion-scale-in-50{
|
||||||
|
--motion-origin-scale-x: .5;
|
||||||
|
--motion-origin-scale-y: .5;
|
||||||
|
--motion-scale-in-animation: motion-scale-in calc(var(--motion-scale-duration) * var(--motion-scale-perceptual-duration-multiplier)) var(--motion-scale-timing) var(--motion-scale-delay) both;
|
||||||
|
animation: var(--motion-all-enter-animations);
|
||||||
|
}
|
||||||
|
|
||||||
|
.motion-opacity-in-0{
|
||||||
|
--motion-origin-opacity: 0.001;
|
||||||
|
--motion-opacity-in-animation: motion-opacity-in calc(var(--motion-opacity-duration) * var(--motion-opacity-perceptual-duration-multiplier)) var(--motion-opacity-timing) var(--motion-opacity-delay) both;
|
||||||
|
animation: var(--motion-all-enter-animations);
|
||||||
|
}
|
||||||
|
|
||||||
.\[animation-delay\:-7\.5s\]{
|
.\[animation-delay\:-7\.5s\]{
|
||||||
animation-delay: -7.5s;
|
animation-delay: -7.5s;
|
||||||
}
|
}
|
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff
Normal file
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff
Normal file
Binary file not shown.
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff2
Normal file
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff2
Normal file
Binary file not shown.
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff
Normal file
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff
Normal file
Binary file not shown.
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff2
Normal file
BIN
nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff2
Normal file
Binary file not shown.
13
nebula/components/auth/modal.templ
Normal file
13
nebula/components/auth/modal.templ
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package auth
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/onsonr/sonr/nebula/components/auth/sections"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/styles"
|
||||||
|
)
|
||||||
|
|
||||||
|
templ Modal(c echo.Context) {
|
||||||
|
@styles.OpenModal("Account Registration", "Enter your account information below to create your account.") {
|
||||||
|
@sections.RegisterStart()
|
||||||
|
}
|
||||||
|
}
|
64
nebula/components/auth/modal_templ.go
Normal file
64
nebula/components/auth/modal_templ.go
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// Code generated by templ - DO NOT EDIT.
|
||||||
|
|
||||||
|
// templ: version: v0.2.778
|
||||||
|
package auth
|
||||||
|
|
||||||
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
||||||
|
|
||||||
|
import "github.com/a-h/templ"
|
||||||
|
import templruntime "github.com/a-h/templ/runtime"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/onsonr/sonr/nebula/components/auth/sections"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/styles"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Modal(c echo.Context) templ.Component {
|
||||||
|
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
||||||
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
||||||
|
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
|
||||||
|
return templ_7745c5c3_CtxErr
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
||||||
|
if !templ_7745c5c3_IsBuffer {
|
||||||
|
defer func() {
|
||||||
|
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err == nil {
|
||||||
|
templ_7745c5c3_Err = templ_7745c5c3_BufErr
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
templ_7745c5c3_Var1 := templ.GetChildren(ctx)
|
||||||
|
if templ_7745c5c3_Var1 == nil {
|
||||||
|
templ_7745c5c3_Var1 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
||||||
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
||||||
|
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
||||||
|
if !templ_7745c5c3_IsBuffer {
|
||||||
|
defer func() {
|
||||||
|
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err == nil {
|
||||||
|
templ_7745c5c3_Err = templ_7745c5c3_BufErr
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
templ_7745c5c3_Err = sections.RegisterStart().Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
})
|
||||||
|
templ_7745c5c3_Err = styles.OpenModal("Account Registration", "Enter your account information below to create your account.").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ = templruntime.GeneratedTemplate
|
18
nebula/components/auth/route.go
Normal file
18
nebula/components/auth/route.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package auth
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/onsonr/sonr/internal/ctx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AuthorizeRoute(c echo.Context) error {
|
||||||
|
return ctx.RenderTempl(c, Modal(c))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoginRoute(c echo.Context) error {
|
||||||
|
return ctx.RenderTempl(c, Modal(c))
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterRoute(c echo.Context) error {
|
||||||
|
return ctx.RenderTempl(c, Modal(c))
|
||||||
|
}
|
17
nebula/components/auth/sections/authorize.templ
Normal file
17
nebula/components/auth/sections/authorize.templ
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package sections
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/onsonr/sonr/nebula/components/auth/forms"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/styles"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/ui"
|
||||||
|
)
|
||||||
|
|
||||||
|
templ AuthorizeStart() {
|
||||||
|
@ui.Breadcrumbs()
|
||||||
|
@forms.BasicDetailsForm()
|
||||||
|
@styles.Spacer()
|
||||||
|
<div class="flex flex-col-reverse sm:flex-row sm:justify-between sm:space-x-2">
|
||||||
|
<button @click="modalOpen=false" type="button" class="inline-flex items-center justify-center h-10 px-4 py-2 text-sm font-medium transition-colors border rounded-md focus:outline-none focus:ring-2 focus:ring-neutral-100 focus:ring-offset-2">Cancel</button>
|
||||||
|
<button @click="modalOpen=false" type="button" class="inline-flex items-center justify-center h-10 px-4 py-2 text-sm font-medium text-white transition-colors border border-transparent rounded-md focus:outline-none focus:ring-2 focus:ring-neutral-900 focus:ring-offset-2 bg-neutral-950 hover:bg-neutral-900">Next</button>
|
||||||
|
</div>
|
||||||
|
}
|
58
nebula/components/auth/sections/authorize_templ.go
Normal file
58
nebula/components/auth/sections/authorize_templ.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// Code generated by templ - DO NOT EDIT.
|
||||||
|
|
||||||
|
// templ: version: v0.2.778
|
||||||
|
package sections
|
||||||
|
|
||||||
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
||||||
|
|
||||||
|
import "github.com/a-h/templ"
|
||||||
|
import templruntime "github.com/a-h/templ/runtime"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/onsonr/sonr/nebula/components/auth/forms"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/styles"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/ui"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AuthorizeStart() templ.Component {
|
||||||
|
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
||||||
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
||||||
|
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
|
||||||
|
return templ_7745c5c3_CtxErr
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
||||||
|
if !templ_7745c5c3_IsBuffer {
|
||||||
|
defer func() {
|
||||||
|
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err == nil {
|
||||||
|
templ_7745c5c3_Err = templ_7745c5c3_BufErr
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
ctx = templ.InitializeContext(ctx)
|
||||||
|
templ_7745c5c3_Var1 := templ.GetChildren(ctx)
|
||||||
|
if templ_7745c5c3_Var1 == nil {
|
||||||
|
templ_7745c5c3_Var1 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
templ_7745c5c3_Err = ui.Breadcrumbs().Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = forms.BasicDetailsForm().Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = styles.Spacer().Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex flex-col-reverse sm:flex-row sm:justify-between sm:space-x-2\"><button @click=\"modalOpen=false\" type=\"button\" class=\"inline-flex items-center justify-center h-10 px-4 py-2 text-sm font-medium transition-colors border rounded-md focus:outline-none focus:ring-2 focus:ring-neutral-100 focus:ring-offset-2\">Cancel</button> <button @click=\"modalOpen=false\" type=\"button\" class=\"inline-flex items-center justify-center h-10 px-4 py-2 text-sm font-medium text-white transition-colors border border-transparent rounded-md focus:outline-none focus:ring-2 focus:ring-neutral-900 focus:ring-offset-2 bg-neutral-950 hover:bg-neutral-900\">Next</button></div>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ = templruntime.GeneratedTemplate
|
17
nebula/components/auth/sections/login.templ
Normal file
17
nebula/components/auth/sections/login.templ
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package sections
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/onsonr/sonr/nebula/components/auth/forms"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/styles"
|
||||||
|
"github.com/onsonr/sonr/nebula/global/ui"
|
||||||
|
)
|
||||||
|
|
||||||
|
templ LoginStart() {
|
||||||
|
@ui.Breadcrumbs()
|
||||||
|
@forms.BasicDetailsForm()
|
||||||
|
@styles.Spacer()
|
||||||
|
<div class="flex flex-col-reverse sm:flex-row sm:justify-between sm:space-x-2">
|
||||||
|
<button @click="modalOpen=false" type="button" class="inline-flex items-center justify-center h-10 px-4 py-2 text-sm font-medium transition-colors border rounded-md focus:outline-none focus:ring-2 focus:ring-neutral-100 focus:ring-offset-2">Cancel</button>
|
||||||
|
<button @click="modalOpen=false" type="button" class="inline-flex items-center justify-center h-10 px-4 py-2 text-sm font-medium text-white transition-colors border border-transparent rounded-md focus:outline-none focus:ring-2 focus:ring-neutral-900 focus:ring-offset-2 bg-neutral-950 hover:bg-neutral-900">Next</button>
|
||||||
|
</div>
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user