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&reg;:
<b>ENG-1057</b></a></sub>
This commit is contained in:
Prad Nukala 2024-10-10 13:44:17 -04:00 committed by GitHub
parent 0a16e41c78
commit 279ab6e5e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
189 changed files with 1515 additions and 1432 deletions

View File

@ -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

View File

@ -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 ###

View File

@ -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)
} }

View File

@ -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": {}
}

View File

@ -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
View 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)
}

View File

@ -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)
} }

View File

@ -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";
};

View File

@ -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",

View File

@ -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",

View File

@ -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

View File

@ -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)
}

View File

@ -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
View 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"`
}

View File

@ -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
View 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
}

View File

@ -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"`
}

View File

@ -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
View 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
}

View File

@ -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 {

View 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
}

View File

@ -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}

View File

@ -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)

View File

@ -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;
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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()
}
}

View 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

View 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))
}

View 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>
}

View 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

View 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