58 | {#if copied} 59 | Command copied to clipboard 60 | {:else} 61 | Run in your system's terminal emulator 62 | {/if} 63 |
64 |├── .dockerignore ├── .github └── workflows │ ├── build.yml │ ├── deploy.yml │ └── lint.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── Dockerfile ├── LICENSE ├── README.md ├── cmd └── terminal.go ├── demo.gif ├── go.mod ├── go.sum ├── internal ├── cmds │ ├── about.go │ ├── cmds.go │ ├── games.go │ ├── music.go │ ├── projects.go │ └── workouts.go ├── output │ ├── animations.go │ ├── color.go │ ├── help.go │ ├── live.go │ ├── table.go │ ├── welcome.go │ └── width.go └── util │ └── time.go └── website ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── README.md ├── eslint.config.js ├── package.json ├── pnpm-lock.yaml ├── src ├── app.d.ts ├── app.html └── routes │ ├── +layout.svelte │ ├── +layout.ts │ └── +page.svelte ├── static ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── fonts │ └── ibm_plex_mono │ │ └── normal.woff2 ├── opengraph.png ├── robots.txt ├── safari-pinned-tab.svg ├── site.webmanifest └── sitemap.xml ├── svelte.config.js ├── tsconfig.json └── vite.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | # 1) ignore all files under website/ 2 | website/* 3 | 4 | # 2) but don’t ignore the build folder itself 5 | !website/build/ 6 | 7 | # 3) and don’t ignore anything inside it 8 | !website/build/**/* 9 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | - push 5 | - pull_request 6 | 7 | jobs: 8 | go: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: actions/setup-go@v5 13 | with: 14 | go-version: '1.24.3' 15 | - run: 'go build ./cmd/terminal.go' 16 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | caprover: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: pnpm/action-setup@v4 14 | with: 15 | version: 10.11.0 16 | - working-directory: ./website 17 | run: | 18 | pnpm install 19 | pnpm run build 20 | - run: | 21 | echo ${{ secrets.REGISTRY_PASSWORD }} | docker login docker.mattglei.ch -u admin --password-stdin 22 | docker build -t docker.mattglei.ch/terminal . 23 | docker push docker.mattglei.ch/terminal 24 | - uses: caprover/deploy-from-github@v1.1.2 25 | with: 26 | server: https://lab.mattglei.ch 27 | app: terminal 28 | token: '${{ secrets.CAPROVER_APP_TOKEN }}' 29 | image: docker.mattglei.ch/terminal 30 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: lint 2 | 3 | on: 4 | - push 5 | - pull_request 6 | 7 | jobs: 8 | golangci-lint: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: actions/setup-go@v5 13 | with: 14 | go-version: '1.24.3' 15 | - uses: golangci/golangci-lint-action@v6.5.0 16 | with: 17 | version: v1.64.4 18 | gomod: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v4 22 | - uses: actions/setup-go@v5 23 | with: 24 | go-version: '1.24.3' 25 | - run: go mod tidy -diff 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # air 2 | tmp/ 3 | bin/ 4 | 5 | # goreleaser 6 | dist/ 7 | 8 | # MacOS Meta Data 9 | .DS_Store 10 | 11 | # Binaries for programs and plugins 12 | *.exe 13 | *.exe~ 14 | *.dll 15 | *.so 16 | *.dylib 17 | 18 | # Test binary, built with `go test -c` 19 | *.test 20 | 21 | # Output of the go coverage tool, specifically when used with LiteIDE 22 | *.out 23 | 24 | .env -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at email@mattglei.ch. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM golang:1.24.3 AS build 3 | 4 | WORKDIR /src 5 | COPY . . 6 | 7 | RUN CGO_ENABLED=0 GOOS=linux go build -o /bin/terminal ./cmd/terminal.go 8 | 9 | FROM alpine:3.20.2 10 | 11 | WORKDIR / 12 | 13 | RUN apk update && apk add --no-cache ca-certificates=20241121-r1 tzdata=2025b-r0 wget=1.24.5-r0 openssh=9.7_p1-r5 14 | 15 | COPY --from=build /bin/terminal /bin/terminal 16 | COPY --from=build /src/website/build ./website/build 17 | 18 | CMD ["/bin/terminal"] 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2025 Matthew Gleich 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # terminal 2 | 3 | [](https://github.com/gleich/terminal/actions/workflows/deploy.yml) 4 | [](https://github.com/gleich/terminal/actions/workflows/build.yml) 5 | [](https://github.com/gleich/terminal/actions/workflows/lint.yml) 6 | [](https://goreportcard.com/report/go.mattglei.ch/terminal) 7 | 8 |  9 | 10 | terminal version of my [website](https://mattglei.ch). Access via the following terminal command: 11 | 12 | ```bash 13 | ssh terminal.mattglei.ch 14 | ``` 15 | -------------------------------------------------------------------------------- /cmd/terminal.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "io/fs" 7 | "net" 8 | "net/http" 9 | "os" 10 | "path/filepath" 11 | "time" 12 | 13 | "github.com/charmbracelet/ssh" 14 | "github.com/charmbracelet/wish" 15 | "github.com/charmbracelet/wish/activeterm" 16 | "github.com/joho/godotenv" 17 | "go.mattglei.ch/lcp/pkg/lcp" 18 | "go.mattglei.ch/terminal/internal/cmds" 19 | "go.mattglei.ch/terminal/internal/output" 20 | "go.mattglei.ch/timber" 21 | ) 22 | 23 | func main() { 24 | setupLogger() 25 | 26 | if _, err := os.Stat(".env"); !errors.Is(err, fs.ErrNotExist) { 27 | err := godotenv.Load() 28 | if err != nil { 29 | timber.Fatal(err, "loading .env failed") 30 | } 31 | } 32 | 33 | homedir, err := os.UserHomeDir() 34 | if err != nil { 35 | timber.Fatal(err, "getting home directory failed") 36 | } 37 | 38 | client := lcp.Client{Token: os.Getenv("LCP_TOKEN")} 39 | 40 | sshPort := "22" 41 | srv, err := wish.NewServer( 42 | wish.WithAddress(net.JoinHostPort("0.0.0.0", sshPort)), 43 | wish.WithHostKeyPath(filepath.Join(homedir, ".ssh", "id_rsa")), 44 | wish.WithMiddleware(func(next ssh.Handler) ssh.Handler { 45 | return func(s ssh.Session) { 46 | ct := time.Now() 47 | timber.Info( 48 | fmt.Sprintf("login from user \"%s\" started connection", s.User()), 49 | ) 50 | styles := output.LoadStyles(s) 51 | if os.Getenv("OUTPUT_WELCOME") == "true" { 52 | output.Welcome(s, styles) 53 | } 54 | cmds.Terminal(s, styles, &client) 55 | timber.Done( 56 | fmt.Sprintf("logout from user \"%s\"; spent %s", s.User(), time.Since(ct)), 57 | ) 58 | } 59 | }, activeterm.Middleware()), 60 | ) 61 | if err != nil { 62 | timber.Fatal(err, "creating server failed") 63 | } 64 | 65 | go func() { 66 | fs := http.FileServer(http.Dir("./website/build")) 67 | http.Handle("/", fs) 68 | 69 | httpPort := ":8888" 70 | timber.Info("starting http server on port", httpPort) 71 | err := http.ListenAndServe(httpPort, nil) 72 | if err != nil { 73 | timber.Fatal(err, "failed to start http server") 74 | } 75 | }() 76 | 77 | timber.Info("starting ssh server on port", sshPort) 78 | if err = srv.ListenAndServe(); err != nil && !errors.Is(err, ssh.ErrServerClosed) { 79 | timber.Fatal(err, "starting server failed") 80 | } 81 | } 82 | 83 | func setupLogger() { 84 | ny, err := time.LoadLocation("America/New_York") 85 | if err != nil { 86 | timber.Fatal(err, "failed to load new york timezone") 87 | } 88 | timber.Timezone(ny) 89 | timber.TimeFormat("01/02 03:04:05 PM MST") 90 | } 91 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gleich/terminal/019a98432287d0c1c6ed2a3106cfa27752a40bb7/demo.gif -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module go.mattglei.ch/terminal 2 | 3 | go 1.24.3 4 | 5 | require golang.org/x/sys v0.33.0 // indirect 6 | 7 | require ( 8 | github.com/charmbracelet/lipgloss v1.1.0 9 | github.com/charmbracelet/ssh v0.0.0-20250429213052-383d50896132 10 | github.com/charmbracelet/wish v1.4.7 11 | github.com/creack/pty v1.1.24 12 | github.com/joho/godotenv v1.5.1 13 | github.com/muesli/termenv v0.16.0 14 | go.mattglei.ch/lcp v1.1.0 15 | go.mattglei.ch/timber v1.2.5 16 | golang.org/x/term v0.32.0 17 | ) 18 | 19 | require ( 20 | github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect 21 | github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect 22 | github.com/charmbracelet/bubbletea v1.3.5 // indirect 23 | github.com/charmbracelet/colorprofile v0.3.1 // indirect 24 | github.com/charmbracelet/keygen v0.5.3 // indirect 25 | github.com/charmbracelet/log v0.4.2 // indirect 26 | github.com/charmbracelet/x/ansi v0.9.2 // indirect 27 | github.com/charmbracelet/x/cellbuf v0.0.13 // indirect 28 | github.com/charmbracelet/x/conpty v0.1.0 // indirect 29 | github.com/charmbracelet/x/errors v0.0.0-20250530202730-6ba1785cd7b9 // indirect 30 | github.com/charmbracelet/x/term v0.2.1 // indirect 31 | github.com/charmbracelet/x/termios v0.1.1 // indirect 32 | github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect 33 | github.com/go-logfmt/logfmt v0.6.0 // indirect 34 | github.com/lucasb-eyer/go-colorful v1.2.0 // indirect 35 | github.com/mattn/go-isatty v0.0.20 // indirect 36 | github.com/mattn/go-localereader v0.0.1 // indirect 37 | github.com/mattn/go-runewidth v0.0.16 // indirect 38 | github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect 39 | github.com/muesli/cancelreader v0.2.2 // indirect 40 | github.com/rivo/uniseg v0.4.7 // indirect 41 | github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect 42 | golang.org/x/crypto v0.38.0 // indirect 43 | golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b // indirect 44 | golang.org/x/sync v0.14.0 // indirect 45 | golang.org/x/text v0.25.0 // indirect 46 | ) 47 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= 2 | github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= 3 | github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= 4 | github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= 5 | github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= 6 | github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= 7 | github.com/charmbracelet/bubbletea v1.3.5 h1:JAMNLTbqMOhSwoELIr0qyP4VidFq72/6E9j7HHmRKQc= 8 | github.com/charmbracelet/bubbletea v1.3.5/go.mod h1:TkCnmH+aBd4LrXhXcqrKiYwRs7qyQx5rBgH5fVY3v54= 9 | github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40= 10 | github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0= 11 | github.com/charmbracelet/keygen v0.5.3 h1:2MSDC62OUbDy6VmjIE2jM24LuXUvKywLCmaJDmr/Z/4= 12 | github.com/charmbracelet/keygen v0.5.3/go.mod h1:TcpNoMAO5GSmhx3SgcEMqCrtn8BahKhB8AlwnLjRUpk= 13 | github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= 14 | github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= 15 | github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsyig= 16 | github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw= 17 | github.com/charmbracelet/ssh v0.0.0-20250429213052-383d50896132 h1:ILyX/vWS/SeHfyuMFAsaV95jEKrwivNUkA8tE7JEXs4= 18 | github.com/charmbracelet/ssh v0.0.0-20250429213052-383d50896132/go.mod h1:R9cISUs5kAH4Cq/rguNbSwcR+slE5Dfm8FEs//uoIGE= 19 | github.com/charmbracelet/wish v1.4.7 h1:O+jdLac3s6GaqkOHHSwezejNK04vl6VjO1A+hl8J8Yc= 20 | github.com/charmbracelet/wish v1.4.7/go.mod h1:OBZ8vC62JC5cvbxJLh+bIWtG7Ctmct+ewziuUWK+G14= 21 | github.com/charmbracelet/x/ansi v0.9.2 h1:92AGsQmNTRMzuzHEYfCdjQeUzTrgE1vfO5/7fEVoXdY= 22 | github.com/charmbracelet/x/ansi v0.9.2/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= 23 | github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= 24 | github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= 25 | github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U= 26 | github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ= 27 | github.com/charmbracelet/x/errors v0.0.0-20250530202730-6ba1785cd7b9 h1:FiotifM1z5xyFvyHbuL77ymo66DrzeCImM5dh50F/Uo= 28 | github.com/charmbracelet/x/errors v0.0.0-20250530202730-6ba1785cd7b9/go.mod h1:nmnmDtAEAq9i8KHhoYE3SvXMjYPuS219MWbawvAumQ4= 29 | github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= 30 | github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= 31 | github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= 32 | github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= 33 | github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= 34 | github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= 35 | github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= 36 | github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= 37 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 38 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 39 | github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= 40 | github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= 41 | github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= 42 | github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 43 | github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= 44 | github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= 45 | github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= 46 | github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= 47 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 48 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 49 | github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= 50 | github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= 51 | github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= 52 | github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 53 | github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= 54 | github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= 55 | github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= 56 | github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= 57 | github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= 58 | github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= 59 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 60 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 61 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 62 | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 63 | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 64 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 65 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 66 | github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= 67 | github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= 68 | go.mattglei.ch/lcp v1.1.0 h1:4ciWRCXL+EVDc32nOox6TdL1XVYXm0nYSl61o85xJzc= 69 | go.mattglei.ch/lcp v1.1.0/go.mod h1:MAbBXzDf05jd2h/YNIu2fl3gddRC1YsnWTeiApgmuEU= 70 | go.mattglei.ch/timber v1.2.5 h1:G2WOAQFKkav/WdHFB38zuUmrHIVgFXPjHvFdhWb+tt0= 71 | go.mattglei.ch/timber v1.2.5/go.mod h1:brMY6q0rrt+Gp3XScsp9oeOIcpqx35kjzfBJgQIDSvg= 72 | golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= 73 | golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= 74 | golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b h1:QoALfVG9rhQ/M7vYDScfPdWjGL9dlsVVM5VGh7aKoAA= 75 | golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= 76 | golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= 77 | golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 78 | golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 79 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 80 | golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= 81 | golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 82 | golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= 83 | golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= 84 | golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= 85 | golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= 86 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 87 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 88 | -------------------------------------------------------------------------------- /internal/cmds/about.go: -------------------------------------------------------------------------------- 1 | package cmds 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/charmbracelet/ssh" 7 | "go.mattglei.ch/terminal/internal/output" 8 | ) 9 | 10 | func about(s ssh.Session, styles output.Styles) { 11 | linkStyle := styles.Blue.Underline(true) 12 | fmt.Fprintln(s, "\nHey, I'm Matt Gleich") 13 | fmt.Fprintln( 14 | s, 15 | styles.Renderer.NewStyle().Width(output.MAX_WIDTH).Render(fmt.Sprintf( 16 | "I'm a rising fourth-year computer science student at the Rochester Institute of Technology [%s] and an incoming DevOps intern at KCF Technologies [%s]. This website serves as a portfolio showcasing some of my projects, work experience, and personal interests. I am committed to applying my technical skills to develop practical solutions and consistently strive to expand my expertise. If you'd like to discuss a project or explore potential opportunities, please contact me at %s. Additional details about my professional work are in my résumé [%s].\n", 17 | linkStyle.Render("https://rit.edu"), 18 | linkStyle.Render("https://kcftech.com"), 19 | linkStyle.Render("mail@mattglei.ch"), 20 | linkStyle.Render("https://mattglei.ch/resume.pdf"), 21 | )), 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /internal/cmds/cmds.go: -------------------------------------------------------------------------------- 1 | package cmds 2 | 3 | import ( 4 | "fmt" 5 | "io" 6 | "strings" 7 | 8 | "github.com/charmbracelet/ssh" 9 | "go.mattglei.ch/lcp/pkg/lcp" 10 | "go.mattglei.ch/terminal/internal/output" 11 | "go.mattglei.ch/timber" 12 | "golang.org/x/term" 13 | ) 14 | 15 | func Terminal(s ssh.Session, styles output.Styles, client *lcp.Client) { 16 | prefix := styles.Green.Render("λ ") 17 | terminal := term.NewTerminal(s, prefix) 18 | 19 | for { 20 | cmd, err := terminal.ReadLine() 21 | if err == io.EOF { 22 | fmt.Fprintln(s) 23 | return 24 | } 25 | if err != nil { 26 | timber.Error(err, "failed to process command") 27 | fmt.Fprintln(s, "processing command failed, closing connection") 28 | return 29 | } 30 | 31 | switch strings.ToLower(strings.Trim(cmd, " ")) { 32 | case "": 33 | case "exit": 34 | return 35 | case "help": 36 | fmt.Fprintln(s, output.Help(styles)) 37 | case "clear", "c": 38 | styles.Renderer.Output().ClearScreen() 39 | case "about": 40 | about(s, styles) 41 | case "workouts": 42 | workouts(s, styles, client) 43 | case "projects": 44 | projects(s, styles, client) 45 | case "games": 46 | games(s, styles, client) 47 | case "music": 48 | music(s, styles, client) 49 | default: 50 | fmt.Fprintf( 51 | s, 52 | "\nInvalid command '%s'. Type 'help' to see available commands.\n\n", 53 | cmd, 54 | ) 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /internal/cmds/games.go: -------------------------------------------------------------------------------- 1 | package cmds 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/charmbracelet/ssh" 7 | "go.mattglei.ch/lcp/pkg/lcp" 8 | "go.mattglei.ch/terminal/internal/output" 9 | "go.mattglei.ch/terminal/internal/util" 10 | "go.mattglei.ch/timber" 11 | ) 12 | 13 | func games(s ssh.Session, styles output.Styles, client *lcp.Client) { 14 | var ( 15 | headers = []string{"", "NAME", "ACHIEVEMENT PROGRESS", "TIME IN GAME", "STEAM LINK"} 16 | data [][]string 17 | ) 18 | games, err := lcp.FetchCache[[]lcp.SteamGame](client) 19 | if err != nil { 20 | msg := "failed to load steam games from lcp" 21 | fmt.Fprintln(s, styles.Red.Render(msg)) 22 | timber.Error(err, msg) 23 | return 24 | } 25 | 26 | for i, g := range games.Data { 27 | var achievementProgress string 28 | if g.AchievementProgress == nil { 29 | achievementProgress = "N/A" 30 | } else { 31 | achievementProgress = fmt.Sprintf("%.2f%%", *g.AchievementProgress) 32 | } 33 | data = append( 34 | data, 35 | []string{ 36 | fmt.Sprint(i + 1), 37 | g.Name, 38 | achievementProgress, 39 | util.RenderDuration(int(g.PlaytimeForever * 60)), 40 | g.URL, 41 | }, 42 | ) 43 | } 44 | 45 | fmt.Fprintln( 46 | s, 47 | "\nTo relax I love to play games with some of my friends. Below are some of my most recent games from Steam:", 48 | ) 49 | fmt.Fprintln(s) 50 | table := output.Table(styles).Headers(headers...).Rows(data...).Render() 51 | fmt.Fprintln(s, table) 52 | output.LiveFrom(s, styles, table, games.Updated) 53 | fmt.Fprintln(s) 54 | } 55 | -------------------------------------------------------------------------------- /internal/cmds/music.go: -------------------------------------------------------------------------------- 1 | package cmds 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/charmbracelet/ssh" 7 | "go.mattglei.ch/lcp/pkg/lcp" 8 | "go.mattglei.ch/terminal/internal/output" 9 | "go.mattglei.ch/timber" 10 | ) 11 | 12 | func music(s ssh.Session, styles output.Styles, client *lcp.Client) { 13 | cacheData, err := lcp.FetchCache[lcp.AppleMusicCache](client) 14 | if err != nil { 15 | msg := "failed to load data from apple music cache" 16 | fmt.Fprintln(s, styles.Red.Render(msg)) 17 | timber.Error(err, msg) 18 | return 19 | } 20 | 21 | fmt.Fprintln(s) 22 | fmt.Fprintln( 23 | s, 24 | styles.Renderer.NewStyle(). 25 | Width(output.MAX_WIDTH). 26 | Render("I love a lot of different types of music ranging from electronic to jazz. A few of my favorite artists are Daft Punk, The Smiths, Eagles, Mac DeMarco, Fleetwood Mac, Oasis, and Deftones."), 27 | ) 28 | 29 | fmt.Fprintln(s, "\nHere are 5 of my most recently played songs from Apple Music:") 30 | 31 | for i, song := range cacheData.Data.RecentlyPlayed[5:] { 32 | fmt.Fprintf( 33 | s, 34 | " %d. %s by %s\n", 35 | i+1, 36 | styles.Green.Bold(true).Render(song.Track), 37 | song.Artist, 38 | ) 39 | } 40 | fmt.Fprintln(s) 41 | } 42 | -------------------------------------------------------------------------------- /internal/cmds/projects.go: -------------------------------------------------------------------------------- 1 | package cmds 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/charmbracelet/lipgloss" 7 | "github.com/charmbracelet/ssh" 8 | "go.mattglei.ch/lcp/pkg/lcp" 9 | "go.mattglei.ch/terminal/internal/output" 10 | "go.mattglei.ch/terminal/internal/util" 11 | "go.mattglei.ch/timber" 12 | ) 13 | 14 | func projects(s ssh.Session, styles output.Styles, client *lcp.Client) { 15 | var ( 16 | headers = []string{"", "NAME", "DESCRIPTION", "UPDATED", "LANGUAGE", "GITHUB LINK"} 17 | data [][]string 18 | ) 19 | repositories, err := lcp.FetchCache[[]lcp.GitHubRepository](client) 20 | if err != nil { 21 | msg := "failed to load github repositories from lcp" 22 | fmt.Fprintln(s, styles.Red.Render(msg)) 23 | timber.Error(err, msg) 24 | return 25 | } 26 | for i, p := range repositories.Data { 27 | data = append( 28 | data, 29 | []string{ 30 | fmt.Sprint(i + 1), 31 | fmt.Sprintf("%s/%s", p.Owner, p.Name), 32 | p.Description, 33 | util.RenderExactFromNow(p.UpdatedAt), 34 | fmt.Sprintf( 35 | "%s %s", 36 | styles.Renderer.NewStyle(). 37 | Foreground(lipgloss.Color(p.LanguageColor)). 38 | Render("●"), 39 | p.Language, 40 | ), 41 | p.URL, 42 | }, 43 | ) 44 | } 45 | 46 | linkStyle := styles.Blue.Underline(true) 47 | table := output.Table(styles).Headers(headers...).Rows(data...).Render() 48 | fmt.Fprintln( 49 | s, 50 | styles.Renderer.NewStyle().Width(lipgloss.Width(table)+10).Render(fmt.Sprintf( 51 | "\nFor the past five years, I have been passionately pursuing programming. From developing PCBs with custom integrated circuit drivers written in Rust to creating CLIs and websites, I have explored various facets of the programming world. My journey includes cloud automation work at Bottomline Technologies [%s], where I utilized Python, Puppet, Docker, and Grafana. At Rootly [%s], I developed their official CLI in Golang. More recently, I contributed to Stainless API [%s] as an engineering developer, automating customer deployments and product testing.", 52 | linkStyle.Render("https://bottomline.com"), 53 | linkStyle.Render("https://rootly.com"), 54 | linkStyle.Render("https://stainlessapi.com"), 55 | )), 56 | ) 57 | fmt.Fprintln(s, "\nHere are my pinned repositories from GitHub:") 58 | fmt.Fprintln(s) 59 | fmt.Fprintln(s, table) 60 | output.LiveFrom(s, styles, table, repositories.Updated) 61 | fmt.Fprintln(s) 62 | } 63 | -------------------------------------------------------------------------------- /internal/cmds/workouts.go: -------------------------------------------------------------------------------- 1 | package cmds 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/charmbracelet/ssh" 7 | "go.mattglei.ch/lcp/pkg/lcp" 8 | "go.mattglei.ch/terminal/internal/output" 9 | "go.mattglei.ch/terminal/internal/util" 10 | "go.mattglei.ch/timber" 11 | ) 12 | 13 | func workouts(s ssh.Session, styles output.Styles, client *lcp.Client) { 14 | activities, err := lcp.FetchCache[[]lcp.Workout](client) 15 | if err != nil { 16 | msg := "failed to load workouts from lcp" 17 | fmt.Fprintln(s, styles.Red.Render(msg)) 18 | timber.Error(err, msg) 19 | return 20 | } 21 | 22 | fmt.Fprintln( 23 | s, 24 | "\nOne of my favorite things in the world is staying active and enjoying the outdoors. I grew up in New Hampshire hiking, biking, snowshoeing, and traveling with my family. Out of all of those things I especially love cycling mainly through gravel cycling, road cycling, and mountain biking. Recently I've been getting into lifting which has been a ton of fun. Below are 5 of my most recent Strava and Hevy workouts:", 25 | ) 26 | for i, a := range activities.Data[:3] { 27 | switch a.SportType { 28 | case "GravelRide": 29 | a.SportType = "Gravel Ride" 30 | case "MountainBikeRide": 31 | a.SportType = "Mountain Bike Ride" 32 | case "WeightTraining": 33 | a.SportType = "Weight Training" 34 | case "": 35 | a.SportType = "Workout" 36 | } 37 | 38 | fmt.Fprintln(s) 39 | fmt.Fprintf( 40 | s, 41 | "%d. %s %s\n", 42 | i+1, 43 | styles.Green.Bold(true).Render(a.Name), 44 | styles.Grey.Render(fmt.Sprintf("[%s]", a.Platform)), 45 | ) 46 | fmt.Fprintf(s, " Started: %s\n", util.RenderExactFromNow(a.StartDate)) 47 | fmt.Fprintf(s, " Duration: %s\n", util.RenderDuration(int(a.MovingTime))) 48 | if a.Platform == "strava" { 49 | fmt.Fprintf(s, " Type: %s\n", a.SportType) 50 | if a.Distance != 0 { 51 | fmt.Fprintf( 52 | s, 53 | " Distance: %s\n", 54 | fmt.Sprintf("%.2f mi [%.2f km]", a.Distance*0.000621371, a.Distance*0.001), 55 | ) 56 | } 57 | if a.AverageHeartrate != 0 { 58 | fmt.Fprintf( 59 | s, 60 | " Avg. Heartrate: %s\n", 61 | fmt.Sprintf("%.2f bpm", a.AverageHeartrate), 62 | ) 63 | } 64 | } else { 65 | fmt.Fprintln(s, " Exercises:") 66 | for i, exercise := range a.HevyExercises { 67 | fmt.Fprintf(s, " %s (%d/%d)\n", styles.Blue.Render(exercise.Title), i+1, len(a.HevyExercises)) 68 | for j, set := range exercise.Sets { 69 | fmt.Fprintf(s, " [set %d] %.1f lbs × %d reps\n", j+1, set.WeightKg*2.2046226218, set.Reps) 70 | } 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /internal/output/animations.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | 7 | "github.com/charmbracelet/ssh" 8 | ) 9 | 10 | func TypewriterAnimation(s ssh.Session, speed time.Duration, msg string) { 11 | for _, c := range msg { 12 | fmt.Fprint(s, string(c)) 13 | time.Sleep(speed) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /internal/output/color.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "strings" 7 | 8 | "github.com/charmbracelet/lipgloss" 9 | "github.com/charmbracelet/ssh" 10 | "github.com/creack/pty" 11 | "github.com/muesli/termenv" 12 | "go.mattglei.ch/timber" 13 | ) 14 | 15 | type Styles struct { 16 | Renderer *lipgloss.Renderer 17 | Blue lipgloss.Style 18 | Green lipgloss.Style 19 | Grey lipgloss.Style 20 | Red lipgloss.Style 21 | } 22 | 23 | func LoadStyles(s ssh.Session) Styles { 24 | clientOutput := outputFromSession(s) 25 | r := lipgloss.NewRenderer(s) 26 | r.SetOutput(clientOutput) 27 | return Styles{ 28 | Renderer: r, 29 | Blue: r.NewStyle().Foreground(lipgloss.Color("#2B95FF")), 30 | Green: r.NewStyle().Foreground(lipgloss.Color("#00D96B")), 31 | Grey: r.NewStyle().Foreground(lipgloss.Color("#747474")), 32 | Red: r.NewStyle().Foreground(lipgloss.Color("#ff4747")), 33 | } 34 | } 35 | 36 | // Bridge Wish and Termenv so we can query for a user's terminal capabilities. 37 | type sshOutput struct { 38 | ssh.Session 39 | tty *os.File 40 | } 41 | 42 | func (s *sshOutput) Write(p []byte) (int, error) { 43 | return s.Session.Write(p) 44 | } 45 | 46 | func (s *sshOutput) Read(p []byte) (int, error) { 47 | return s.Session.Read(p) 48 | } 49 | 50 | func (s *sshOutput) Fd() uintptr { 51 | return s.tty.Fd() 52 | } 53 | 54 | type sshEnviron struct { 55 | environ []string 56 | } 57 | 58 | func (s *sshEnviron) Getenv(key string) string { 59 | for _, v := range s.environ { 60 | if strings.HasPrefix(v, key+"=") { 61 | return v[len(key)+1:] 62 | } 63 | } 64 | return "" 65 | } 66 | 67 | func (s *sshEnviron) Environ() []string { 68 | return s.environ 69 | } 70 | 71 | // Create a termenv.Output from the session. 72 | func outputFromSession(sess ssh.Session) *termenv.Output { 73 | sshPty, _, _ := sess.Pty() 74 | _, tty, err := pty.Open() 75 | if err != nil { 76 | timber.Fatal(err) 77 | } 78 | o := &sshOutput{ 79 | Session: sess, 80 | tty: tty, 81 | } 82 | environ := sess.Environ() 83 | environ = append(environ, fmt.Sprintf("TERM=%s", sshPty.Term)) 84 | e := &sshEnviron{environ: environ} 85 | // We need to use unsafe mode here because the ssh session is not running 86 | // locally and we already know that the session is a TTY. 87 | return termenv.NewOutput(o, termenv.WithUnsafe(), termenv.WithEnvironment(e)) 88 | } 89 | -------------------------------------------------------------------------------- /internal/output/help.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/charmbracelet/lipgloss" 7 | ) 8 | 9 | func Help(styles Styles) string { 10 | box := lipgloss.NewStyle(). 11 | Border(lipgloss.NormalBorder()). 12 | BorderForeground(styles.Grey.GetForeground()). 13 | Padding(1, 3). 14 | BorderTop(true). 15 | BorderLeft(true). 16 | BorderRight(true). 17 | BorderBottom(true). 18 | Margin(1). 19 | MarginRight(0) 20 | cmdStyle := styles.Green.Bold(true) 21 | return box.Render(fmt.Sprintf(`%s a little about myself 22 | %s my recent workouts from Strava/Hevy 23 | %s recent projects I've worked on from GitHub 24 | %s games I've recently played on Steam 25 | %s music I've listened to recently 26 | 27 | %s displays this help table 28 | %s exit out of terminal 29 | %s clear the terminal`, 30 | cmdStyle.Render("about"), 31 | cmdStyle.Render("workouts"), 32 | cmdStyle.Render("projects"), 33 | cmdStyle.Render("games"), 34 | cmdStyle.Render("music"), 35 | cmdStyle.Render("help"), 36 | cmdStyle.Render("exit"), 37 | cmdStyle.Render("clear"), 38 | )) 39 | } 40 | -------------------------------------------------------------------------------- /internal/output/live.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | 7 | "github.com/charmbracelet/lipgloss" 8 | "github.com/charmbracelet/ssh" 9 | "go.mattglei.ch/terminal/internal/util" 10 | ) 11 | 12 | func LiveFrom(s ssh.Session, styles Styles, table string, updated time.Time) { 13 | liveStyle := lipgloss.NewStyle().Width(lipgloss.Width(table)).Align(lipgloss.Center) 14 | fmt.Fprintln( 15 | s, 16 | styles.Red.Bold(true).Inherit(liveStyle).Render( 17 | "LIVE DATA FROM LCP (https://mattglei.ch/writing/lcp)", 18 | ), 19 | ) 20 | fmt.Fprintln( 21 | s, 22 | liveStyle.Render( 23 | fmt.Sprintf("[Updated %s]", util.RenderExactFromNow(updated)), 24 | ), 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /internal/output/table.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | import ( 4 | "github.com/charmbracelet/lipgloss" 5 | "github.com/charmbracelet/lipgloss/table" 6 | ) 7 | 8 | func Table(styles Styles) *table.Table { 9 | var ( 10 | headerStyle = styles.Green.Bold(true).Align(lipgloss.Center).Padding(0, 2) 11 | baseStyle = styles.Renderer.NewStyle().Padding(0, 1) 12 | indexStyle = styles.Grey.Align(lipgloss.Center) 13 | nameStyle = styles.Renderer.NewStyle().Bold(true).Padding(0, 1).Align(lipgloss.Center) 14 | ) 15 | return table.New(). 16 | Border(lipgloss.NormalBorder()). 17 | BorderStyle(styles.Grey). 18 | BorderRow(true). 19 | StyleFunc(func(row, col int) lipgloss.Style { 20 | if row == -1 { 21 | return headerStyle 22 | } 23 | if col == 0 { 24 | return indexStyle 25 | } 26 | if row != -1 && col == 1 { 27 | return nameStyle 28 | } 29 | return baseStyle 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /internal/output/welcome.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | 7 | "github.com/charmbracelet/ssh" 8 | ) 9 | 10 | func Welcome(s ssh.Session, colors Styles) { 11 | TypewriterAnimation(s, 60*time.Millisecond, "\nESTABLISHING CONNECTION") 12 | TypewriterAnimation(s, 500*time.Millisecond, " ...") 13 | TypewriterAnimation( 14 | s, 15 | 50*time.Millisecond, 16 | " CONNECTION SUCCESSFULLY ESTABLISHED", 17 | ) 18 | fmt.Fprintln(s) 19 | fmt.Fprintln(s) 20 | TypewriterAnimation( 21 | s, 22 | 50*time.Millisecond, 23 | colors.Green.Render("Welcome to Matt Gleich's personal terminal."), 24 | ) 25 | fmt.Fprintln(s) 26 | fmt.Fprintln(s, Help(colors)) 27 | } 28 | -------------------------------------------------------------------------------- /internal/output/width.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | const MAX_WIDTH = 150 4 | -------------------------------------------------------------------------------- /internal/util/time.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | ) 7 | 8 | func RenderExactFromNow(date time.Time) string { 9 | currentTime := time.Now() 10 | duration := currentTime.Sub(date) 11 | 12 | totalSeconds := int(duration.Seconds()) 13 | totalMinutes := totalSeconds / 60 14 | totalHours := totalMinutes / 60 15 | totalDays := totalHours / 24 16 | totalMonths := totalDays / 30 17 | totalYears := totalMonths / 12 18 | 19 | yearsDiff := totalYears 20 | monthsDiff := totalMonths % 12 21 | daysDiff := totalDays % 30 22 | hoursDiff := totalHours % 24 23 | minutesDiff := totalMinutes % 60 24 | secondsDiff := totalSeconds % 60 25 | var fromNow string 26 | 27 | if yearsDiff > 0 { 28 | fromNow = fmt.Sprintf( 29 | "%d %s & %d %s", 30 | yearsDiff, 31 | pluralize(yearsDiff, "year"), 32 | monthsDiff, 33 | pluralize(monthsDiff, "month"), 34 | ) 35 | } else if monthsDiff > 0 { 36 | fromNow = fmt.Sprintf("%d %s & %d %s", monthsDiff, pluralize(monthsDiff, "month"), daysDiff, pluralize(daysDiff, "day")) 37 | } else if daysDiff > 0 { 38 | fromNow = fmt.Sprintf("%d %s & %dh", daysDiff, pluralize(daysDiff, "day"), hoursDiff) 39 | } else if hoursDiff > 0 { 40 | fromNow = fmt.Sprintf("%dh & %dm", hoursDiff, minutesDiff) 41 | } else if minutesDiff > 0 { 42 | fromNow = fmt.Sprintf("%dm & %ds", minutesDiff, secondsDiff) 43 | } else { 44 | fromNow = fmt.Sprintf("%ds", secondsDiff) 45 | } 46 | 47 | return fromNow + " ago" 48 | } 49 | 50 | func pluralize(value int, unit string) string { 51 | if value == 1 { 52 | return unit 53 | } 54 | return unit + "s" 55 | } 56 | 57 | func RenderDuration(seconds int) string { 58 | duration := time.Duration(seconds) * time.Second 59 | totalHours := int(duration.Hours()) 60 | minutes := int(duration.Minutes()) % 60 61 | var formattedDuration string 62 | 63 | if totalHours > 0 { 64 | formattedDuration = fmt.Sprintf("%dh", totalHours) 65 | if minutes > 0 { 66 | formattedDuration += fmt.Sprintf(" & %dm", minutes) 67 | } 68 | } else if seconds < 3660 && seconds > 3540 { 69 | formattedDuration = "1h" 70 | } else { 71 | remainingSeconds := seconds % 60 72 | formattedDuration = fmt.Sprintf("%dm", minutes) 73 | if remainingSeconds > 0 { 74 | formattedDuration += fmt.Sprintf(" & %ds", remainingSeconds) 75 | } 76 | } 77 | 78 | return formattedDuration 79 | } 80 | -------------------------------------------------------------------------------- /website/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | # Output 4 | .output 5 | .vercel 6 | .netlify 7 | .wrangler 8 | /.svelte-kit 9 | /build 10 | 11 | # OS 12 | .DS_Store 13 | Thumbs.db 14 | 15 | # Env 16 | .env 17 | .env.* 18 | !.env.example 19 | !.env.test 20 | 21 | # Vite 22 | vite.config.js.timestamp-* 23 | vite.config.ts.timestamp-* 24 | -------------------------------------------------------------------------------- /website/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /website/.prettierignore: -------------------------------------------------------------------------------- 1 | # Package Managers 2 | package-lock.json 3 | pnpm-lock.yaml 4 | yarn.lock 5 | bun.lock 6 | bun.lockb 7 | -------------------------------------------------------------------------------- /website/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "overrides": [ 8 | { 9 | "files": "*.svelte", 10 | "options": { 11 | "parser": "svelte" 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /website/README.md: -------------------------------------------------------------------------------- 1 | # sv 2 | 3 | Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npx sv create 12 | 13 | # create a new project in my-app 14 | npx sv create my-app 15 | ``` 16 | 17 | ## Developing 18 | 19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 | 21 | ```bash 22 | npm run dev 23 | 24 | # or start the server and open the app in a new browser tab 25 | npm run dev -- --open 26 | ``` 27 | 28 | ## Building 29 | 30 | To create a production version of your app: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | You can preview the production build with `npm run preview`. 37 | 38 | > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. 39 | -------------------------------------------------------------------------------- /website/eslint.config.js: -------------------------------------------------------------------------------- 1 | import prettier from 'eslint-config-prettier'; 2 | import js from '@eslint/js'; 3 | import { includeIgnoreFile } from '@eslint/compat'; 4 | import svelte from 'eslint-plugin-svelte'; 5 | import globals from 'globals'; 6 | import { fileURLToPath } from 'node:url'; 7 | import ts from 'typescript-eslint'; 8 | import svelteConfig from './svelte.config.js'; 9 | 10 | const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); 11 | 12 | export default ts.config( 13 | includeIgnoreFile(gitignorePath), 14 | js.configs.recommended, 15 | ...ts.configs.recommended, 16 | ...svelte.configs.recommended, 17 | prettier, 18 | ...svelte.configs.prettier, 19 | { 20 | languageOptions: { 21 | globals: { ...globals.browser, ...globals.node } 22 | }, 23 | rules: { 'no-undef': 'off' } 24 | }, 25 | { 26 | files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], 27 | languageOptions: { 28 | parserOptions: { 29 | projectService: true, 30 | extraFileExtensions: ['.svelte'], 31 | parser: ts.parser, 32 | svelteConfig 33 | } 34 | } 35 | } 36 | ); 37 | -------------------------------------------------------------------------------- /website/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "website", 3 | "private": true, 4 | "version": "0.0.1", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite dev --open", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "prepare": "svelte-kit sync || echo ''", 11 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 12 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 13 | "format": "prettier --write .", 14 | "lint": "prettier --check . && eslint ." 15 | }, 16 | "devDependencies": { 17 | "@eslint/compat": "^1.2.5", 18 | "@eslint/js": "^9.18.0", 19 | "@gleich/ui": "^1.2.8", 20 | "@sveltejs/adapter-static": "^3.0.8", 21 | "@sveltejs/kit": "^2.16.0", 22 | "@sveltejs/vite-plugin-svelte": "^5.0.0", 23 | "eslint": "^9.18.0", 24 | "eslint-config-prettier": "^10.0.1", 25 | "eslint-plugin-svelte": "^3.0.0", 26 | "globals": "^16.0.0", 27 | "prettier": "^3.4.2", 28 | "prettier-plugin-svelte": "^3.3.3", 29 | "svelte": "^5.0.0", 30 | "svelte-check": "^4.0.0", 31 | "typescript": "^5.0.0", 32 | "typescript-eslint": "^8.20.0", 33 | "vite": "^6.2.6" 34 | }, 35 | "pnpm": { 36 | "onlyBuiltDependencies": [ 37 | "esbuild" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /website/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@eslint/compat': 12 | specifier: ^1.2.5 13 | version: 1.2.9(eslint@9.27.0) 14 | '@eslint/js': 15 | specifier: ^9.18.0 16 | version: 9.27.0 17 | '@gleich/ui': 18 | specifier: ^1.2.8 19 | version: 1.2.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2) 20 | '@sveltejs/adapter-static': 21 | specifier: ^3.0.8 22 | version: 3.0.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5)) 23 | '@sveltejs/kit': 24 | specifier: ^2.16.0 25 | version: 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5) 26 | '@sveltejs/vite-plugin-svelte': 27 | specifier: ^5.0.0 28 | version: 5.0.3(svelte@5.33.2)(vite@6.3.5) 29 | eslint: 30 | specifier: ^9.18.0 31 | version: 9.27.0 32 | eslint-config-prettier: 33 | specifier: ^10.0.1 34 | version: 10.1.5(eslint@9.27.0) 35 | eslint-plugin-svelte: 36 | specifier: ^3.0.0 37 | version: 3.9.0(eslint@9.27.0)(svelte@5.33.2) 38 | globals: 39 | specifier: ^16.0.0 40 | version: 16.2.0 41 | prettier: 42 | specifier: ^3.4.2 43 | version: 3.5.3 44 | prettier-plugin-svelte: 45 | specifier: ^3.3.3 46 | version: 3.4.0(prettier@3.5.3)(svelte@5.33.2) 47 | svelte: 48 | specifier: ^5.0.0 49 | version: 5.33.2 50 | svelte-check: 51 | specifier: ^4.0.0 52 | version: 4.2.1(picomatch@4.0.2)(svelte@5.33.2)(typescript@5.8.3) 53 | typescript: 54 | specifier: ^5.0.0 55 | version: 5.8.3 56 | typescript-eslint: 57 | specifier: ^8.20.0 58 | version: 8.32.1(eslint@9.27.0)(typescript@5.8.3) 59 | vite: 60 | specifier: ^6.2.6 61 | version: 6.3.5 62 | 63 | packages: 64 | 65 | '@ampproject/remapping@2.3.0': 66 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 67 | engines: {node: '>=6.0.0'} 68 | 69 | '@esbuild/aix-ppc64@0.25.4': 70 | resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} 71 | engines: {node: '>=18'} 72 | cpu: [ppc64] 73 | os: [aix] 74 | 75 | '@esbuild/android-arm64@0.25.4': 76 | resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} 77 | engines: {node: '>=18'} 78 | cpu: [arm64] 79 | os: [android] 80 | 81 | '@esbuild/android-arm@0.25.4': 82 | resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} 83 | engines: {node: '>=18'} 84 | cpu: [arm] 85 | os: [android] 86 | 87 | '@esbuild/android-x64@0.25.4': 88 | resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} 89 | engines: {node: '>=18'} 90 | cpu: [x64] 91 | os: [android] 92 | 93 | '@esbuild/darwin-arm64@0.25.4': 94 | resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} 95 | engines: {node: '>=18'} 96 | cpu: [arm64] 97 | os: [darwin] 98 | 99 | '@esbuild/darwin-x64@0.25.4': 100 | resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} 101 | engines: {node: '>=18'} 102 | cpu: [x64] 103 | os: [darwin] 104 | 105 | '@esbuild/freebsd-arm64@0.25.4': 106 | resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} 107 | engines: {node: '>=18'} 108 | cpu: [arm64] 109 | os: [freebsd] 110 | 111 | '@esbuild/freebsd-x64@0.25.4': 112 | resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} 113 | engines: {node: '>=18'} 114 | cpu: [x64] 115 | os: [freebsd] 116 | 117 | '@esbuild/linux-arm64@0.25.4': 118 | resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} 119 | engines: {node: '>=18'} 120 | cpu: [arm64] 121 | os: [linux] 122 | 123 | '@esbuild/linux-arm@0.25.4': 124 | resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} 125 | engines: {node: '>=18'} 126 | cpu: [arm] 127 | os: [linux] 128 | 129 | '@esbuild/linux-ia32@0.25.4': 130 | resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} 131 | engines: {node: '>=18'} 132 | cpu: [ia32] 133 | os: [linux] 134 | 135 | '@esbuild/linux-loong64@0.25.4': 136 | resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} 137 | engines: {node: '>=18'} 138 | cpu: [loong64] 139 | os: [linux] 140 | 141 | '@esbuild/linux-mips64el@0.25.4': 142 | resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} 143 | engines: {node: '>=18'} 144 | cpu: [mips64el] 145 | os: [linux] 146 | 147 | '@esbuild/linux-ppc64@0.25.4': 148 | resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} 149 | engines: {node: '>=18'} 150 | cpu: [ppc64] 151 | os: [linux] 152 | 153 | '@esbuild/linux-riscv64@0.25.4': 154 | resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} 155 | engines: {node: '>=18'} 156 | cpu: [riscv64] 157 | os: [linux] 158 | 159 | '@esbuild/linux-s390x@0.25.4': 160 | resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} 161 | engines: {node: '>=18'} 162 | cpu: [s390x] 163 | os: [linux] 164 | 165 | '@esbuild/linux-x64@0.25.4': 166 | resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} 167 | engines: {node: '>=18'} 168 | cpu: [x64] 169 | os: [linux] 170 | 171 | '@esbuild/netbsd-arm64@0.25.4': 172 | resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} 173 | engines: {node: '>=18'} 174 | cpu: [arm64] 175 | os: [netbsd] 176 | 177 | '@esbuild/netbsd-x64@0.25.4': 178 | resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} 179 | engines: {node: '>=18'} 180 | cpu: [x64] 181 | os: [netbsd] 182 | 183 | '@esbuild/openbsd-arm64@0.25.4': 184 | resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} 185 | engines: {node: '>=18'} 186 | cpu: [arm64] 187 | os: [openbsd] 188 | 189 | '@esbuild/openbsd-x64@0.25.4': 190 | resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} 191 | engines: {node: '>=18'} 192 | cpu: [x64] 193 | os: [openbsd] 194 | 195 | '@esbuild/sunos-x64@0.25.4': 196 | resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} 197 | engines: {node: '>=18'} 198 | cpu: [x64] 199 | os: [sunos] 200 | 201 | '@esbuild/win32-arm64@0.25.4': 202 | resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} 203 | engines: {node: '>=18'} 204 | cpu: [arm64] 205 | os: [win32] 206 | 207 | '@esbuild/win32-ia32@0.25.4': 208 | resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} 209 | engines: {node: '>=18'} 210 | cpu: [ia32] 211 | os: [win32] 212 | 213 | '@esbuild/win32-x64@0.25.4': 214 | resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} 215 | engines: {node: '>=18'} 216 | cpu: [x64] 217 | os: [win32] 218 | 219 | '@eslint-community/eslint-utils@4.7.0': 220 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 221 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 222 | peerDependencies: 223 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 224 | 225 | '@eslint-community/regexpp@4.12.1': 226 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 227 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 228 | 229 | '@eslint/compat@1.2.9': 230 | resolution: {integrity: sha512-gCdSY54n7k+driCadyMNv8JSPzYLeDVM/ikZRtvtROBpRdFSkS8W9A82MqsaY7lZuwL0wiapgD0NT1xT0hyJsA==} 231 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 232 | peerDependencies: 233 | eslint: ^9.10.0 234 | peerDependenciesMeta: 235 | eslint: 236 | optional: true 237 | 238 | '@eslint/config-array@0.20.0': 239 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 240 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 241 | 242 | '@eslint/config-helpers@0.2.2': 243 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} 244 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 245 | 246 | '@eslint/core@0.14.0': 247 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 248 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 249 | 250 | '@eslint/eslintrc@3.3.1': 251 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 252 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 253 | 254 | '@eslint/js@9.27.0': 255 | resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} 256 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 257 | 258 | '@eslint/object-schema@2.1.6': 259 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 260 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 261 | 262 | '@eslint/plugin-kit@0.3.1': 263 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 264 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 265 | 266 | '@gleich/ui@1.2.8': 267 | resolution: {integrity: sha512-e3jlcHT4F0e0thXO0XiBc15Q4m0NVllcnfyP++aVWIckRWWUDlsSe7nPjplCq6okSysOyXzdfszk9Po/mOfUOg==} 268 | peerDependencies: 269 | '@sveltejs/kit': ^2.16.0 270 | svelte: ^5.0.0 271 | 272 | '@humanfs/core@0.19.1': 273 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 274 | engines: {node: '>=18.18.0'} 275 | 276 | '@humanfs/node@0.16.6': 277 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 278 | engines: {node: '>=18.18.0'} 279 | 280 | '@humanwhocodes/module-importer@1.0.1': 281 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 282 | engines: {node: '>=12.22'} 283 | 284 | '@humanwhocodes/retry@0.3.1': 285 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 286 | engines: {node: '>=18.18'} 287 | 288 | '@humanwhocodes/retry@0.4.3': 289 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 290 | engines: {node: '>=18.18'} 291 | 292 | '@jridgewell/gen-mapping@0.3.8': 293 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 294 | engines: {node: '>=6.0.0'} 295 | 296 | '@jridgewell/resolve-uri@3.1.2': 297 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 298 | engines: {node: '>=6.0.0'} 299 | 300 | '@jridgewell/set-array@1.2.1': 301 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 302 | engines: {node: '>=6.0.0'} 303 | 304 | '@jridgewell/sourcemap-codec@1.5.0': 305 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 306 | 307 | '@jridgewell/trace-mapping@0.3.25': 308 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 309 | 310 | '@nodelib/fs.scandir@2.1.5': 311 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 312 | engines: {node: '>= 8'} 313 | 314 | '@nodelib/fs.stat@2.0.5': 315 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 316 | engines: {node: '>= 8'} 317 | 318 | '@nodelib/fs.walk@1.2.8': 319 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 320 | engines: {node: '>= 8'} 321 | 322 | '@polka/url@1.0.0-next.29': 323 | resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 324 | 325 | '@rollup/rollup-android-arm-eabi@4.41.1': 326 | resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} 327 | cpu: [arm] 328 | os: [android] 329 | 330 | '@rollup/rollup-android-arm64@4.41.1': 331 | resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} 332 | cpu: [arm64] 333 | os: [android] 334 | 335 | '@rollup/rollup-darwin-arm64@4.41.1': 336 | resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} 337 | cpu: [arm64] 338 | os: [darwin] 339 | 340 | '@rollup/rollup-darwin-x64@4.41.1': 341 | resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} 342 | cpu: [x64] 343 | os: [darwin] 344 | 345 | '@rollup/rollup-freebsd-arm64@4.41.1': 346 | resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} 347 | cpu: [arm64] 348 | os: [freebsd] 349 | 350 | '@rollup/rollup-freebsd-x64@4.41.1': 351 | resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} 352 | cpu: [x64] 353 | os: [freebsd] 354 | 355 | '@rollup/rollup-linux-arm-gnueabihf@4.41.1': 356 | resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} 357 | cpu: [arm] 358 | os: [linux] 359 | 360 | '@rollup/rollup-linux-arm-musleabihf@4.41.1': 361 | resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} 362 | cpu: [arm] 363 | os: [linux] 364 | 365 | '@rollup/rollup-linux-arm64-gnu@4.41.1': 366 | resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} 367 | cpu: [arm64] 368 | os: [linux] 369 | 370 | '@rollup/rollup-linux-arm64-musl@4.41.1': 371 | resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} 372 | cpu: [arm64] 373 | os: [linux] 374 | 375 | '@rollup/rollup-linux-loongarch64-gnu@4.41.1': 376 | resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} 377 | cpu: [loong64] 378 | os: [linux] 379 | 380 | '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': 381 | resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} 382 | cpu: [ppc64] 383 | os: [linux] 384 | 385 | '@rollup/rollup-linux-riscv64-gnu@4.41.1': 386 | resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} 387 | cpu: [riscv64] 388 | os: [linux] 389 | 390 | '@rollup/rollup-linux-riscv64-musl@4.41.1': 391 | resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} 392 | cpu: [riscv64] 393 | os: [linux] 394 | 395 | '@rollup/rollup-linux-s390x-gnu@4.41.1': 396 | resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} 397 | cpu: [s390x] 398 | os: [linux] 399 | 400 | '@rollup/rollup-linux-x64-gnu@4.41.1': 401 | resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} 402 | cpu: [x64] 403 | os: [linux] 404 | 405 | '@rollup/rollup-linux-x64-musl@4.41.1': 406 | resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} 407 | cpu: [x64] 408 | os: [linux] 409 | 410 | '@rollup/rollup-win32-arm64-msvc@4.41.1': 411 | resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} 412 | cpu: [arm64] 413 | os: [win32] 414 | 415 | '@rollup/rollup-win32-ia32-msvc@4.41.1': 416 | resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} 417 | cpu: [ia32] 418 | os: [win32] 419 | 420 | '@rollup/rollup-win32-x64-msvc@4.41.1': 421 | resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} 422 | cpu: [x64] 423 | os: [win32] 424 | 425 | '@sveltejs/acorn-typescript@1.0.5': 426 | resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} 427 | peerDependencies: 428 | acorn: ^8.9.0 429 | 430 | '@sveltejs/adapter-static@3.0.8': 431 | resolution: {integrity: sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg==} 432 | peerDependencies: 433 | '@sveltejs/kit': ^2.0.0 434 | 435 | '@sveltejs/kit@2.21.1': 436 | resolution: {integrity: sha512-vLbtVwtDcK8LhJKnFkFYwM0uCdFmzioQnif0bjEYH1I24Arz22JPr/hLUiXGVYAwhu8INKx5qrdvr4tHgPwX6w==} 437 | engines: {node: '>=18.13'} 438 | hasBin: true 439 | peerDependencies: 440 | '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 441 | svelte: ^4.0.0 || ^5.0.0-next.0 442 | vite: ^5.0.3 || ^6.0.0 443 | 444 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1': 445 | resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} 446 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 447 | peerDependencies: 448 | '@sveltejs/vite-plugin-svelte': ^5.0.0 449 | svelte: ^5.0.0 450 | vite: ^6.0.0 451 | 452 | '@sveltejs/vite-plugin-svelte@5.0.3': 453 | resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} 454 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 455 | peerDependencies: 456 | svelte: ^5.0.0 457 | vite: ^6.0.0 458 | 459 | '@types/cookie@0.6.0': 460 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 461 | 462 | '@types/estree@1.0.7': 463 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 464 | 465 | '@types/json-schema@7.0.15': 466 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 467 | 468 | '@typescript-eslint/eslint-plugin@8.32.1': 469 | resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} 470 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 471 | peerDependencies: 472 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 473 | eslint: ^8.57.0 || ^9.0.0 474 | typescript: '>=4.8.4 <5.9.0' 475 | 476 | '@typescript-eslint/parser@8.32.1': 477 | resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} 478 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 479 | peerDependencies: 480 | eslint: ^8.57.0 || ^9.0.0 481 | typescript: '>=4.8.4 <5.9.0' 482 | 483 | '@typescript-eslint/scope-manager@8.32.1': 484 | resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} 485 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 486 | 487 | '@typescript-eslint/type-utils@8.32.1': 488 | resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} 489 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 490 | peerDependencies: 491 | eslint: ^8.57.0 || ^9.0.0 492 | typescript: '>=4.8.4 <5.9.0' 493 | 494 | '@typescript-eslint/types@8.32.1': 495 | resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} 496 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 497 | 498 | '@typescript-eslint/typescript-estree@8.32.1': 499 | resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} 500 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 501 | peerDependencies: 502 | typescript: '>=4.8.4 <5.9.0' 503 | 504 | '@typescript-eslint/utils@8.32.1': 505 | resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} 506 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 507 | peerDependencies: 508 | eslint: ^8.57.0 || ^9.0.0 509 | typescript: '>=4.8.4 <5.9.0' 510 | 511 | '@typescript-eslint/visitor-keys@8.32.1': 512 | resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} 513 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 514 | 515 | acorn-jsx@5.3.2: 516 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 517 | peerDependencies: 518 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 519 | 520 | acorn@8.14.1: 521 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 522 | engines: {node: '>=0.4.0'} 523 | hasBin: true 524 | 525 | ajv@6.12.6: 526 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 527 | 528 | ansi-styles@4.3.0: 529 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 530 | engines: {node: '>=8'} 531 | 532 | argparse@2.0.1: 533 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 534 | 535 | aria-query@5.3.2: 536 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 537 | engines: {node: '>= 0.4'} 538 | 539 | axobject-query@4.1.0: 540 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 541 | engines: {node: '>= 0.4'} 542 | 543 | balanced-match@1.0.2: 544 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 545 | 546 | brace-expansion@1.1.11: 547 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 548 | 549 | brace-expansion@2.0.1: 550 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 551 | 552 | braces@3.0.3: 553 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 554 | engines: {node: '>=8'} 555 | 556 | callsites@3.1.0: 557 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 558 | engines: {node: '>=6'} 559 | 560 | chalk@4.1.2: 561 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 562 | engines: {node: '>=10'} 563 | 564 | chokidar@4.0.3: 565 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 566 | engines: {node: '>= 14.16.0'} 567 | 568 | clsx@2.1.1: 569 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 570 | engines: {node: '>=6'} 571 | 572 | color-convert@2.0.1: 573 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 574 | engines: {node: '>=7.0.0'} 575 | 576 | color-name@1.1.4: 577 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 578 | 579 | concat-map@0.0.1: 580 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 581 | 582 | cookie@0.6.0: 583 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 584 | engines: {node: '>= 0.6'} 585 | 586 | cross-spawn@7.0.6: 587 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 588 | engines: {node: '>= 8'} 589 | 590 | cssesc@3.0.0: 591 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 592 | engines: {node: '>=4'} 593 | hasBin: true 594 | 595 | debug@4.4.1: 596 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 597 | engines: {node: '>=6.0'} 598 | peerDependencies: 599 | supports-color: '*' 600 | peerDependenciesMeta: 601 | supports-color: 602 | optional: true 603 | 604 | deep-is@0.1.4: 605 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 606 | 607 | deepmerge@4.3.1: 608 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 609 | engines: {node: '>=0.10.0'} 610 | 611 | devalue@5.1.1: 612 | resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} 613 | 614 | esbuild@0.25.4: 615 | resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} 616 | engines: {node: '>=18'} 617 | hasBin: true 618 | 619 | escape-string-regexp@4.0.0: 620 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 621 | engines: {node: '>=10'} 622 | 623 | eslint-config-prettier@10.1.5: 624 | resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} 625 | hasBin: true 626 | peerDependencies: 627 | eslint: '>=7.0.0' 628 | 629 | eslint-plugin-svelte@3.9.0: 630 | resolution: {integrity: sha512-nvIUNyyPGbr5922Kd1p/jXe+FfNdVPXsxLyrrXpwfSbZZEFdAYva9O/gm2lObC/wXkQo/AUmQkAihfmNJYeCjA==} 631 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 632 | peerDependencies: 633 | eslint: ^8.57.1 || ^9.0.0 634 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 635 | peerDependenciesMeta: 636 | svelte: 637 | optional: true 638 | 639 | eslint-scope@8.3.0: 640 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 641 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 642 | 643 | eslint-visitor-keys@3.4.3: 644 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 645 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 646 | 647 | eslint-visitor-keys@4.2.0: 648 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 649 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 650 | 651 | eslint@9.27.0: 652 | resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} 653 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 654 | hasBin: true 655 | peerDependencies: 656 | jiti: '*' 657 | peerDependenciesMeta: 658 | jiti: 659 | optional: true 660 | 661 | esm-env@1.2.2: 662 | resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 663 | 664 | espree@10.3.0: 665 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 666 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 667 | 668 | esquery@1.6.0: 669 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 670 | engines: {node: '>=0.10'} 671 | 672 | esrap@1.4.6: 673 | resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} 674 | 675 | esrecurse@4.3.0: 676 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 677 | engines: {node: '>=4.0'} 678 | 679 | estraverse@5.3.0: 680 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 681 | engines: {node: '>=4.0'} 682 | 683 | esutils@2.0.3: 684 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 685 | engines: {node: '>=0.10.0'} 686 | 687 | fast-deep-equal@3.1.3: 688 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 689 | 690 | fast-glob@3.3.3: 691 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 692 | engines: {node: '>=8.6.0'} 693 | 694 | fast-json-stable-stringify@2.1.0: 695 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 696 | 697 | fast-levenshtein@2.0.6: 698 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 699 | 700 | fastq@1.19.1: 701 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 702 | 703 | fdir@6.4.4: 704 | resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} 705 | peerDependencies: 706 | picomatch: ^3 || ^4 707 | peerDependenciesMeta: 708 | picomatch: 709 | optional: true 710 | 711 | file-entry-cache@8.0.0: 712 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 713 | engines: {node: '>=16.0.0'} 714 | 715 | fill-range@7.1.1: 716 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 717 | engines: {node: '>=8'} 718 | 719 | find-up@5.0.0: 720 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 721 | engines: {node: '>=10'} 722 | 723 | flat-cache@4.0.1: 724 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 725 | engines: {node: '>=16'} 726 | 727 | flatted@3.3.3: 728 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 729 | 730 | fsevents@2.3.3: 731 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 732 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 733 | os: [darwin] 734 | 735 | glob-parent@5.1.2: 736 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 737 | engines: {node: '>= 6'} 738 | 739 | glob-parent@6.0.2: 740 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 741 | engines: {node: '>=10.13.0'} 742 | 743 | globals@14.0.0: 744 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 745 | engines: {node: '>=18'} 746 | 747 | globals@16.2.0: 748 | resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} 749 | engines: {node: '>=18'} 750 | 751 | graphemer@1.4.0: 752 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 753 | 754 | has-flag@4.0.0: 755 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 756 | engines: {node: '>=8'} 757 | 758 | ignore@5.3.2: 759 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 760 | engines: {node: '>= 4'} 761 | 762 | ignore@7.0.4: 763 | resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} 764 | engines: {node: '>= 4'} 765 | 766 | import-fresh@3.3.1: 767 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 768 | engines: {node: '>=6'} 769 | 770 | imurmurhash@0.1.4: 771 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 772 | engines: {node: '>=0.8.19'} 773 | 774 | is-extglob@2.1.1: 775 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 776 | engines: {node: '>=0.10.0'} 777 | 778 | is-glob@4.0.3: 779 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 780 | engines: {node: '>=0.10.0'} 781 | 782 | is-number@7.0.0: 783 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 784 | engines: {node: '>=0.12.0'} 785 | 786 | is-reference@3.0.3: 787 | resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 788 | 789 | isexe@2.0.0: 790 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 791 | 792 | js-yaml@4.1.0: 793 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 794 | hasBin: true 795 | 796 | json-buffer@3.0.1: 797 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 798 | 799 | json-schema-traverse@0.4.1: 800 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 801 | 802 | json-stable-stringify-without-jsonify@1.0.1: 803 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 804 | 805 | keyv@4.5.4: 806 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 807 | 808 | kleur@4.1.5: 809 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 810 | engines: {node: '>=6'} 811 | 812 | known-css-properties@0.36.0: 813 | resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==} 814 | 815 | levn@0.4.1: 816 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 817 | engines: {node: '>= 0.8.0'} 818 | 819 | lilconfig@2.1.0: 820 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 821 | engines: {node: '>=10'} 822 | 823 | locate-character@3.0.0: 824 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 825 | 826 | locate-path@6.0.0: 827 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 828 | engines: {node: '>=10'} 829 | 830 | lodash.merge@4.6.2: 831 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 832 | 833 | magic-string@0.30.17: 834 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 835 | 836 | merge2@1.4.1: 837 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 838 | engines: {node: '>= 8'} 839 | 840 | micromatch@4.0.8: 841 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 842 | engines: {node: '>=8.6'} 843 | 844 | minimatch@3.1.2: 845 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 846 | 847 | minimatch@9.0.5: 848 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 849 | engines: {node: '>=16 || 14 >=14.17'} 850 | 851 | mri@1.2.0: 852 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 853 | engines: {node: '>=4'} 854 | 855 | mrmime@2.0.1: 856 | resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 857 | engines: {node: '>=10'} 858 | 859 | ms@2.1.3: 860 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 861 | 862 | nanoid@3.3.11: 863 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 864 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 865 | hasBin: true 866 | 867 | natural-compare@1.4.0: 868 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 869 | 870 | optionator@0.9.4: 871 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 872 | engines: {node: '>= 0.8.0'} 873 | 874 | p-limit@3.1.0: 875 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 876 | engines: {node: '>=10'} 877 | 878 | p-locate@5.0.0: 879 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 880 | engines: {node: '>=10'} 881 | 882 | parent-module@1.0.1: 883 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 884 | engines: {node: '>=6'} 885 | 886 | path-exists@4.0.0: 887 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 888 | engines: {node: '>=8'} 889 | 890 | path-key@3.1.1: 891 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 892 | engines: {node: '>=8'} 893 | 894 | picocolors@1.1.1: 895 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 896 | 897 | picomatch@2.3.1: 898 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 899 | engines: {node: '>=8.6'} 900 | 901 | picomatch@4.0.2: 902 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 903 | engines: {node: '>=12'} 904 | 905 | postcss-load-config@3.1.4: 906 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 907 | engines: {node: '>= 10'} 908 | peerDependencies: 909 | postcss: '>=8.0.9' 910 | ts-node: '>=9.0.0' 911 | peerDependenciesMeta: 912 | postcss: 913 | optional: true 914 | ts-node: 915 | optional: true 916 | 917 | postcss-safe-parser@7.0.1: 918 | resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} 919 | engines: {node: '>=18.0'} 920 | peerDependencies: 921 | postcss: ^8.4.31 922 | 923 | postcss-scss@4.0.9: 924 | resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} 925 | engines: {node: '>=12.0'} 926 | peerDependencies: 927 | postcss: ^8.4.29 928 | 929 | postcss-selector-parser@7.1.0: 930 | resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} 931 | engines: {node: '>=4'} 932 | 933 | postcss@8.5.3: 934 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 935 | engines: {node: ^10 || ^12 || >=14} 936 | 937 | prelude-ls@1.2.1: 938 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 939 | engines: {node: '>= 0.8.0'} 940 | 941 | prettier-plugin-svelte@3.4.0: 942 | resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} 943 | peerDependencies: 944 | prettier: ^3.0.0 945 | svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 946 | 947 | prettier@3.5.3: 948 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 949 | engines: {node: '>=14'} 950 | hasBin: true 951 | 952 | punycode@2.3.1: 953 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 954 | engines: {node: '>=6'} 955 | 956 | queue-microtask@1.2.3: 957 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 958 | 959 | readdirp@4.1.2: 960 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 961 | engines: {node: '>= 14.18.0'} 962 | 963 | resolve-from@4.0.0: 964 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 965 | engines: {node: '>=4'} 966 | 967 | reusify@1.1.0: 968 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 969 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 970 | 971 | rollup@4.41.1: 972 | resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} 973 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 974 | hasBin: true 975 | 976 | run-parallel@1.2.0: 977 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 978 | 979 | sade@1.8.1: 980 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 981 | engines: {node: '>=6'} 982 | 983 | semver@7.7.2: 984 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 985 | engines: {node: '>=10'} 986 | hasBin: true 987 | 988 | set-cookie-parser@2.7.1: 989 | resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} 990 | 991 | shebang-command@2.0.0: 992 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 993 | engines: {node: '>=8'} 994 | 995 | shebang-regex@3.0.0: 996 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 997 | engines: {node: '>=8'} 998 | 999 | sirv@3.0.1: 1000 | resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} 1001 | engines: {node: '>=18'} 1002 | 1003 | source-map-js@1.2.1: 1004 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1005 | engines: {node: '>=0.10.0'} 1006 | 1007 | strip-json-comments@3.1.1: 1008 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1009 | engines: {node: '>=8'} 1010 | 1011 | supports-color@7.2.0: 1012 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1013 | engines: {node: '>=8'} 1014 | 1015 | svelte-check@4.2.1: 1016 | resolution: {integrity: sha512-e49SU1RStvQhoipkQ/aonDhHnG3qxHSBtNfBRb9pxVXoa+N7qybAo32KgA9wEb2PCYFNaDg7bZCdhLD1vHpdYA==} 1017 | engines: {node: '>= 18.0.0'} 1018 | hasBin: true 1019 | peerDependencies: 1020 | svelte: ^4.0.0 || ^5.0.0-next.0 1021 | typescript: '>=5.0.0' 1022 | 1023 | svelte-eslint-parser@1.2.0: 1024 | resolution: {integrity: sha512-mbPtajIeuiyU80BEyGvwAktBeTX7KCr5/0l+uRGLq1dafwRNrjfM5kHGJScEBlPG3ipu6dJqfW/k0/fujvIEVw==} 1025 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1026 | peerDependencies: 1027 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 1028 | peerDependenciesMeta: 1029 | svelte: 1030 | optional: true 1031 | 1032 | svelte@5.33.2: 1033 | resolution: {integrity: sha512-uiyusx2rUa9NmVMaIcShnZyDhOfFXxgkn5eXOcgjDBL3RYQGR1+7TctPcI6AWNbu4gHWF5xZ/TlFM7nnw5H+JQ==} 1034 | engines: {node: '>=18'} 1035 | 1036 | tinyglobby@0.2.14: 1037 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1038 | engines: {node: '>=12.0.0'} 1039 | 1040 | to-regex-range@5.0.1: 1041 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1042 | engines: {node: '>=8.0'} 1043 | 1044 | totalist@3.0.1: 1045 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1046 | engines: {node: '>=6'} 1047 | 1048 | ts-api-utils@2.1.0: 1049 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1050 | engines: {node: '>=18.12'} 1051 | peerDependencies: 1052 | typescript: '>=4.8.4' 1053 | 1054 | type-check@0.4.0: 1055 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1056 | engines: {node: '>= 0.8.0'} 1057 | 1058 | typescript-eslint@8.32.1: 1059 | resolution: {integrity: sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==} 1060 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1061 | peerDependencies: 1062 | eslint: ^8.57.0 || ^9.0.0 1063 | typescript: '>=4.8.4 <5.9.0' 1064 | 1065 | typescript@5.8.3: 1066 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1067 | engines: {node: '>=14.17'} 1068 | hasBin: true 1069 | 1070 | uri-js@4.4.1: 1071 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1072 | 1073 | util-deprecate@1.0.2: 1074 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1075 | 1076 | vite@6.3.5: 1077 | resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1078 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1079 | hasBin: true 1080 | peerDependencies: 1081 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1082 | jiti: '>=1.21.0' 1083 | less: '*' 1084 | lightningcss: ^1.21.0 1085 | sass: '*' 1086 | sass-embedded: '*' 1087 | stylus: '*' 1088 | sugarss: '*' 1089 | terser: ^5.16.0 1090 | tsx: ^4.8.1 1091 | yaml: ^2.4.2 1092 | peerDependenciesMeta: 1093 | '@types/node': 1094 | optional: true 1095 | jiti: 1096 | optional: true 1097 | less: 1098 | optional: true 1099 | lightningcss: 1100 | optional: true 1101 | sass: 1102 | optional: true 1103 | sass-embedded: 1104 | optional: true 1105 | stylus: 1106 | optional: true 1107 | sugarss: 1108 | optional: true 1109 | terser: 1110 | optional: true 1111 | tsx: 1112 | optional: true 1113 | yaml: 1114 | optional: true 1115 | 1116 | vitefu@1.0.6: 1117 | resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} 1118 | peerDependencies: 1119 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 1120 | peerDependenciesMeta: 1121 | vite: 1122 | optional: true 1123 | 1124 | which@2.0.2: 1125 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1126 | engines: {node: '>= 8'} 1127 | hasBin: true 1128 | 1129 | word-wrap@1.2.5: 1130 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1131 | engines: {node: '>=0.10.0'} 1132 | 1133 | yaml@1.10.2: 1134 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1135 | engines: {node: '>= 6'} 1136 | 1137 | yocto-queue@0.1.0: 1138 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1139 | engines: {node: '>=10'} 1140 | 1141 | zimmerframe@1.1.2: 1142 | resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} 1143 | 1144 | snapshots: 1145 | 1146 | '@ampproject/remapping@2.3.0': 1147 | dependencies: 1148 | '@jridgewell/gen-mapping': 0.3.8 1149 | '@jridgewell/trace-mapping': 0.3.25 1150 | 1151 | '@esbuild/aix-ppc64@0.25.4': 1152 | optional: true 1153 | 1154 | '@esbuild/android-arm64@0.25.4': 1155 | optional: true 1156 | 1157 | '@esbuild/android-arm@0.25.4': 1158 | optional: true 1159 | 1160 | '@esbuild/android-x64@0.25.4': 1161 | optional: true 1162 | 1163 | '@esbuild/darwin-arm64@0.25.4': 1164 | optional: true 1165 | 1166 | '@esbuild/darwin-x64@0.25.4': 1167 | optional: true 1168 | 1169 | '@esbuild/freebsd-arm64@0.25.4': 1170 | optional: true 1171 | 1172 | '@esbuild/freebsd-x64@0.25.4': 1173 | optional: true 1174 | 1175 | '@esbuild/linux-arm64@0.25.4': 1176 | optional: true 1177 | 1178 | '@esbuild/linux-arm@0.25.4': 1179 | optional: true 1180 | 1181 | '@esbuild/linux-ia32@0.25.4': 1182 | optional: true 1183 | 1184 | '@esbuild/linux-loong64@0.25.4': 1185 | optional: true 1186 | 1187 | '@esbuild/linux-mips64el@0.25.4': 1188 | optional: true 1189 | 1190 | '@esbuild/linux-ppc64@0.25.4': 1191 | optional: true 1192 | 1193 | '@esbuild/linux-riscv64@0.25.4': 1194 | optional: true 1195 | 1196 | '@esbuild/linux-s390x@0.25.4': 1197 | optional: true 1198 | 1199 | '@esbuild/linux-x64@0.25.4': 1200 | optional: true 1201 | 1202 | '@esbuild/netbsd-arm64@0.25.4': 1203 | optional: true 1204 | 1205 | '@esbuild/netbsd-x64@0.25.4': 1206 | optional: true 1207 | 1208 | '@esbuild/openbsd-arm64@0.25.4': 1209 | optional: true 1210 | 1211 | '@esbuild/openbsd-x64@0.25.4': 1212 | optional: true 1213 | 1214 | '@esbuild/sunos-x64@0.25.4': 1215 | optional: true 1216 | 1217 | '@esbuild/win32-arm64@0.25.4': 1218 | optional: true 1219 | 1220 | '@esbuild/win32-ia32@0.25.4': 1221 | optional: true 1222 | 1223 | '@esbuild/win32-x64@0.25.4': 1224 | optional: true 1225 | 1226 | '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0)': 1227 | dependencies: 1228 | eslint: 9.27.0 1229 | eslint-visitor-keys: 3.4.3 1230 | 1231 | '@eslint-community/regexpp@4.12.1': {} 1232 | 1233 | '@eslint/compat@1.2.9(eslint@9.27.0)': 1234 | optionalDependencies: 1235 | eslint: 9.27.0 1236 | 1237 | '@eslint/config-array@0.20.0': 1238 | dependencies: 1239 | '@eslint/object-schema': 2.1.6 1240 | debug: 4.4.1 1241 | minimatch: 3.1.2 1242 | transitivePeerDependencies: 1243 | - supports-color 1244 | 1245 | '@eslint/config-helpers@0.2.2': {} 1246 | 1247 | '@eslint/core@0.14.0': 1248 | dependencies: 1249 | '@types/json-schema': 7.0.15 1250 | 1251 | '@eslint/eslintrc@3.3.1': 1252 | dependencies: 1253 | ajv: 6.12.6 1254 | debug: 4.4.1 1255 | espree: 10.3.0 1256 | globals: 14.0.0 1257 | ignore: 5.3.2 1258 | import-fresh: 3.3.1 1259 | js-yaml: 4.1.0 1260 | minimatch: 3.1.2 1261 | strip-json-comments: 3.1.1 1262 | transitivePeerDependencies: 1263 | - supports-color 1264 | 1265 | '@eslint/js@9.27.0': {} 1266 | 1267 | '@eslint/object-schema@2.1.6': {} 1268 | 1269 | '@eslint/plugin-kit@0.3.1': 1270 | dependencies: 1271 | '@eslint/core': 0.14.0 1272 | levn: 0.4.1 1273 | 1274 | '@gleich/ui@1.2.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)': 1275 | dependencies: 1276 | '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5) 1277 | svelte: 5.33.2 1278 | 1279 | '@humanfs/core@0.19.1': {} 1280 | 1281 | '@humanfs/node@0.16.6': 1282 | dependencies: 1283 | '@humanfs/core': 0.19.1 1284 | '@humanwhocodes/retry': 0.3.1 1285 | 1286 | '@humanwhocodes/module-importer@1.0.1': {} 1287 | 1288 | '@humanwhocodes/retry@0.3.1': {} 1289 | 1290 | '@humanwhocodes/retry@0.4.3': {} 1291 | 1292 | '@jridgewell/gen-mapping@0.3.8': 1293 | dependencies: 1294 | '@jridgewell/set-array': 1.2.1 1295 | '@jridgewell/sourcemap-codec': 1.5.0 1296 | '@jridgewell/trace-mapping': 0.3.25 1297 | 1298 | '@jridgewell/resolve-uri@3.1.2': {} 1299 | 1300 | '@jridgewell/set-array@1.2.1': {} 1301 | 1302 | '@jridgewell/sourcemap-codec@1.5.0': {} 1303 | 1304 | '@jridgewell/trace-mapping@0.3.25': 1305 | dependencies: 1306 | '@jridgewell/resolve-uri': 3.1.2 1307 | '@jridgewell/sourcemap-codec': 1.5.0 1308 | 1309 | '@nodelib/fs.scandir@2.1.5': 1310 | dependencies: 1311 | '@nodelib/fs.stat': 2.0.5 1312 | run-parallel: 1.2.0 1313 | 1314 | '@nodelib/fs.stat@2.0.5': {} 1315 | 1316 | '@nodelib/fs.walk@1.2.8': 1317 | dependencies: 1318 | '@nodelib/fs.scandir': 2.1.5 1319 | fastq: 1.19.1 1320 | 1321 | '@polka/url@1.0.0-next.29': {} 1322 | 1323 | '@rollup/rollup-android-arm-eabi@4.41.1': 1324 | optional: true 1325 | 1326 | '@rollup/rollup-android-arm64@4.41.1': 1327 | optional: true 1328 | 1329 | '@rollup/rollup-darwin-arm64@4.41.1': 1330 | optional: true 1331 | 1332 | '@rollup/rollup-darwin-x64@4.41.1': 1333 | optional: true 1334 | 1335 | '@rollup/rollup-freebsd-arm64@4.41.1': 1336 | optional: true 1337 | 1338 | '@rollup/rollup-freebsd-x64@4.41.1': 1339 | optional: true 1340 | 1341 | '@rollup/rollup-linux-arm-gnueabihf@4.41.1': 1342 | optional: true 1343 | 1344 | '@rollup/rollup-linux-arm-musleabihf@4.41.1': 1345 | optional: true 1346 | 1347 | '@rollup/rollup-linux-arm64-gnu@4.41.1': 1348 | optional: true 1349 | 1350 | '@rollup/rollup-linux-arm64-musl@4.41.1': 1351 | optional: true 1352 | 1353 | '@rollup/rollup-linux-loongarch64-gnu@4.41.1': 1354 | optional: true 1355 | 1356 | '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': 1357 | optional: true 1358 | 1359 | '@rollup/rollup-linux-riscv64-gnu@4.41.1': 1360 | optional: true 1361 | 1362 | '@rollup/rollup-linux-riscv64-musl@4.41.1': 1363 | optional: true 1364 | 1365 | '@rollup/rollup-linux-s390x-gnu@4.41.1': 1366 | optional: true 1367 | 1368 | '@rollup/rollup-linux-x64-gnu@4.41.1': 1369 | optional: true 1370 | 1371 | '@rollup/rollup-linux-x64-musl@4.41.1': 1372 | optional: true 1373 | 1374 | '@rollup/rollup-win32-arm64-msvc@4.41.1': 1375 | optional: true 1376 | 1377 | '@rollup/rollup-win32-ia32-msvc@4.41.1': 1378 | optional: true 1379 | 1380 | '@rollup/rollup-win32-x64-msvc@4.41.1': 1381 | optional: true 1382 | 1383 | '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': 1384 | dependencies: 1385 | acorn: 8.14.1 1386 | 1387 | '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5))': 1388 | dependencies: 1389 | '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5) 1390 | 1391 | '@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5)': 1392 | dependencies: 1393 | '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) 1394 | '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.2)(vite@6.3.5) 1395 | '@types/cookie': 0.6.0 1396 | acorn: 8.14.1 1397 | cookie: 0.6.0 1398 | devalue: 5.1.1 1399 | esm-env: 1.2.2 1400 | kleur: 4.1.5 1401 | magic-string: 0.30.17 1402 | mrmime: 2.0.1 1403 | sade: 1.8.1 1404 | set-cookie-parser: 2.7.1 1405 | sirv: 3.0.1 1406 | svelte: 5.33.2 1407 | vite: 6.3.5 1408 | 1409 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5)': 1410 | dependencies: 1411 | '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.2)(vite@6.3.5) 1412 | debug: 4.4.1 1413 | svelte: 5.33.2 1414 | vite: 6.3.5 1415 | transitivePeerDependencies: 1416 | - supports-color 1417 | 1418 | '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5)': 1419 | dependencies: 1420 | '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5))(svelte@5.33.2)(vite@6.3.5) 1421 | debug: 4.4.1 1422 | deepmerge: 4.3.1 1423 | kleur: 4.1.5 1424 | magic-string: 0.30.17 1425 | svelte: 5.33.2 1426 | vite: 6.3.5 1427 | vitefu: 1.0.6(vite@6.3.5) 1428 | transitivePeerDependencies: 1429 | - supports-color 1430 | 1431 | '@types/cookie@0.6.0': {} 1432 | 1433 | '@types/estree@1.0.7': {} 1434 | 1435 | '@types/json-schema@7.0.15': {} 1436 | 1437 | '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3)': 1438 | dependencies: 1439 | '@eslint-community/regexpp': 4.12.1 1440 | '@typescript-eslint/parser': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 1441 | '@typescript-eslint/scope-manager': 8.32.1 1442 | '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 1443 | '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 1444 | '@typescript-eslint/visitor-keys': 8.32.1 1445 | eslint: 9.27.0 1446 | graphemer: 1.4.0 1447 | ignore: 7.0.4 1448 | natural-compare: 1.4.0 1449 | ts-api-utils: 2.1.0(typescript@5.8.3) 1450 | typescript: 5.8.3 1451 | transitivePeerDependencies: 1452 | - supports-color 1453 | 1454 | '@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3)': 1455 | dependencies: 1456 | '@typescript-eslint/scope-manager': 8.32.1 1457 | '@typescript-eslint/types': 8.32.1 1458 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1459 | '@typescript-eslint/visitor-keys': 8.32.1 1460 | debug: 4.4.1 1461 | eslint: 9.27.0 1462 | typescript: 5.8.3 1463 | transitivePeerDependencies: 1464 | - supports-color 1465 | 1466 | '@typescript-eslint/scope-manager@8.32.1': 1467 | dependencies: 1468 | '@typescript-eslint/types': 8.32.1 1469 | '@typescript-eslint/visitor-keys': 8.32.1 1470 | 1471 | '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0)(typescript@5.8.3)': 1472 | dependencies: 1473 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1474 | '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 1475 | debug: 4.4.1 1476 | eslint: 9.27.0 1477 | ts-api-utils: 2.1.0(typescript@5.8.3) 1478 | typescript: 5.8.3 1479 | transitivePeerDependencies: 1480 | - supports-color 1481 | 1482 | '@typescript-eslint/types@8.32.1': {} 1483 | 1484 | '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': 1485 | dependencies: 1486 | '@typescript-eslint/types': 8.32.1 1487 | '@typescript-eslint/visitor-keys': 8.32.1 1488 | debug: 4.4.1 1489 | fast-glob: 3.3.3 1490 | is-glob: 4.0.3 1491 | minimatch: 9.0.5 1492 | semver: 7.7.2 1493 | ts-api-utils: 2.1.0(typescript@5.8.3) 1494 | typescript: 5.8.3 1495 | transitivePeerDependencies: 1496 | - supports-color 1497 | 1498 | '@typescript-eslint/utils@8.32.1(eslint@9.27.0)(typescript@5.8.3)': 1499 | dependencies: 1500 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) 1501 | '@typescript-eslint/scope-manager': 8.32.1 1502 | '@typescript-eslint/types': 8.32.1 1503 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1504 | eslint: 9.27.0 1505 | typescript: 5.8.3 1506 | transitivePeerDependencies: 1507 | - supports-color 1508 | 1509 | '@typescript-eslint/visitor-keys@8.32.1': 1510 | dependencies: 1511 | '@typescript-eslint/types': 8.32.1 1512 | eslint-visitor-keys: 4.2.0 1513 | 1514 | acorn-jsx@5.3.2(acorn@8.14.1): 1515 | dependencies: 1516 | acorn: 8.14.1 1517 | 1518 | acorn@8.14.1: {} 1519 | 1520 | ajv@6.12.6: 1521 | dependencies: 1522 | fast-deep-equal: 3.1.3 1523 | fast-json-stable-stringify: 2.1.0 1524 | json-schema-traverse: 0.4.1 1525 | uri-js: 4.4.1 1526 | 1527 | ansi-styles@4.3.0: 1528 | dependencies: 1529 | color-convert: 2.0.1 1530 | 1531 | argparse@2.0.1: {} 1532 | 1533 | aria-query@5.3.2: {} 1534 | 1535 | axobject-query@4.1.0: {} 1536 | 1537 | balanced-match@1.0.2: {} 1538 | 1539 | brace-expansion@1.1.11: 1540 | dependencies: 1541 | balanced-match: 1.0.2 1542 | concat-map: 0.0.1 1543 | 1544 | brace-expansion@2.0.1: 1545 | dependencies: 1546 | balanced-match: 1.0.2 1547 | 1548 | braces@3.0.3: 1549 | dependencies: 1550 | fill-range: 7.1.1 1551 | 1552 | callsites@3.1.0: {} 1553 | 1554 | chalk@4.1.2: 1555 | dependencies: 1556 | ansi-styles: 4.3.0 1557 | supports-color: 7.2.0 1558 | 1559 | chokidar@4.0.3: 1560 | dependencies: 1561 | readdirp: 4.1.2 1562 | 1563 | clsx@2.1.1: {} 1564 | 1565 | color-convert@2.0.1: 1566 | dependencies: 1567 | color-name: 1.1.4 1568 | 1569 | color-name@1.1.4: {} 1570 | 1571 | concat-map@0.0.1: {} 1572 | 1573 | cookie@0.6.0: {} 1574 | 1575 | cross-spawn@7.0.6: 1576 | dependencies: 1577 | path-key: 3.1.1 1578 | shebang-command: 2.0.0 1579 | which: 2.0.2 1580 | 1581 | cssesc@3.0.0: {} 1582 | 1583 | debug@4.4.1: 1584 | dependencies: 1585 | ms: 2.1.3 1586 | 1587 | deep-is@0.1.4: {} 1588 | 1589 | deepmerge@4.3.1: {} 1590 | 1591 | devalue@5.1.1: {} 1592 | 1593 | esbuild@0.25.4: 1594 | optionalDependencies: 1595 | '@esbuild/aix-ppc64': 0.25.4 1596 | '@esbuild/android-arm': 0.25.4 1597 | '@esbuild/android-arm64': 0.25.4 1598 | '@esbuild/android-x64': 0.25.4 1599 | '@esbuild/darwin-arm64': 0.25.4 1600 | '@esbuild/darwin-x64': 0.25.4 1601 | '@esbuild/freebsd-arm64': 0.25.4 1602 | '@esbuild/freebsd-x64': 0.25.4 1603 | '@esbuild/linux-arm': 0.25.4 1604 | '@esbuild/linux-arm64': 0.25.4 1605 | '@esbuild/linux-ia32': 0.25.4 1606 | '@esbuild/linux-loong64': 0.25.4 1607 | '@esbuild/linux-mips64el': 0.25.4 1608 | '@esbuild/linux-ppc64': 0.25.4 1609 | '@esbuild/linux-riscv64': 0.25.4 1610 | '@esbuild/linux-s390x': 0.25.4 1611 | '@esbuild/linux-x64': 0.25.4 1612 | '@esbuild/netbsd-arm64': 0.25.4 1613 | '@esbuild/netbsd-x64': 0.25.4 1614 | '@esbuild/openbsd-arm64': 0.25.4 1615 | '@esbuild/openbsd-x64': 0.25.4 1616 | '@esbuild/sunos-x64': 0.25.4 1617 | '@esbuild/win32-arm64': 0.25.4 1618 | '@esbuild/win32-ia32': 0.25.4 1619 | '@esbuild/win32-x64': 0.25.4 1620 | 1621 | escape-string-regexp@4.0.0: {} 1622 | 1623 | eslint-config-prettier@10.1.5(eslint@9.27.0): 1624 | dependencies: 1625 | eslint: 9.27.0 1626 | 1627 | eslint-plugin-svelte@3.9.0(eslint@9.27.0)(svelte@5.33.2): 1628 | dependencies: 1629 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) 1630 | '@jridgewell/sourcemap-codec': 1.5.0 1631 | eslint: 9.27.0 1632 | esutils: 2.0.3 1633 | globals: 16.2.0 1634 | known-css-properties: 0.36.0 1635 | postcss: 8.5.3 1636 | postcss-load-config: 3.1.4(postcss@8.5.3) 1637 | postcss-safe-parser: 7.0.1(postcss@8.5.3) 1638 | semver: 7.7.2 1639 | svelte-eslint-parser: 1.2.0(svelte@5.33.2) 1640 | optionalDependencies: 1641 | svelte: 5.33.2 1642 | transitivePeerDependencies: 1643 | - ts-node 1644 | 1645 | eslint-scope@8.3.0: 1646 | dependencies: 1647 | esrecurse: 4.3.0 1648 | estraverse: 5.3.0 1649 | 1650 | eslint-visitor-keys@3.4.3: {} 1651 | 1652 | eslint-visitor-keys@4.2.0: {} 1653 | 1654 | eslint@9.27.0: 1655 | dependencies: 1656 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) 1657 | '@eslint-community/regexpp': 4.12.1 1658 | '@eslint/config-array': 0.20.0 1659 | '@eslint/config-helpers': 0.2.2 1660 | '@eslint/core': 0.14.0 1661 | '@eslint/eslintrc': 3.3.1 1662 | '@eslint/js': 9.27.0 1663 | '@eslint/plugin-kit': 0.3.1 1664 | '@humanfs/node': 0.16.6 1665 | '@humanwhocodes/module-importer': 1.0.1 1666 | '@humanwhocodes/retry': 0.4.3 1667 | '@types/estree': 1.0.7 1668 | '@types/json-schema': 7.0.15 1669 | ajv: 6.12.6 1670 | chalk: 4.1.2 1671 | cross-spawn: 7.0.6 1672 | debug: 4.4.1 1673 | escape-string-regexp: 4.0.0 1674 | eslint-scope: 8.3.0 1675 | eslint-visitor-keys: 4.2.0 1676 | espree: 10.3.0 1677 | esquery: 1.6.0 1678 | esutils: 2.0.3 1679 | fast-deep-equal: 3.1.3 1680 | file-entry-cache: 8.0.0 1681 | find-up: 5.0.0 1682 | glob-parent: 6.0.2 1683 | ignore: 5.3.2 1684 | imurmurhash: 0.1.4 1685 | is-glob: 4.0.3 1686 | json-stable-stringify-without-jsonify: 1.0.1 1687 | lodash.merge: 4.6.2 1688 | minimatch: 3.1.2 1689 | natural-compare: 1.4.0 1690 | optionator: 0.9.4 1691 | transitivePeerDependencies: 1692 | - supports-color 1693 | 1694 | esm-env@1.2.2: {} 1695 | 1696 | espree@10.3.0: 1697 | dependencies: 1698 | acorn: 8.14.1 1699 | acorn-jsx: 5.3.2(acorn@8.14.1) 1700 | eslint-visitor-keys: 4.2.0 1701 | 1702 | esquery@1.6.0: 1703 | dependencies: 1704 | estraverse: 5.3.0 1705 | 1706 | esrap@1.4.6: 1707 | dependencies: 1708 | '@jridgewell/sourcemap-codec': 1.5.0 1709 | 1710 | esrecurse@4.3.0: 1711 | dependencies: 1712 | estraverse: 5.3.0 1713 | 1714 | estraverse@5.3.0: {} 1715 | 1716 | esutils@2.0.3: {} 1717 | 1718 | fast-deep-equal@3.1.3: {} 1719 | 1720 | fast-glob@3.3.3: 1721 | dependencies: 1722 | '@nodelib/fs.stat': 2.0.5 1723 | '@nodelib/fs.walk': 1.2.8 1724 | glob-parent: 5.1.2 1725 | merge2: 1.4.1 1726 | micromatch: 4.0.8 1727 | 1728 | fast-json-stable-stringify@2.1.0: {} 1729 | 1730 | fast-levenshtein@2.0.6: {} 1731 | 1732 | fastq@1.19.1: 1733 | dependencies: 1734 | reusify: 1.1.0 1735 | 1736 | fdir@6.4.4(picomatch@4.0.2): 1737 | optionalDependencies: 1738 | picomatch: 4.0.2 1739 | 1740 | file-entry-cache@8.0.0: 1741 | dependencies: 1742 | flat-cache: 4.0.1 1743 | 1744 | fill-range@7.1.1: 1745 | dependencies: 1746 | to-regex-range: 5.0.1 1747 | 1748 | find-up@5.0.0: 1749 | dependencies: 1750 | locate-path: 6.0.0 1751 | path-exists: 4.0.0 1752 | 1753 | flat-cache@4.0.1: 1754 | dependencies: 1755 | flatted: 3.3.3 1756 | keyv: 4.5.4 1757 | 1758 | flatted@3.3.3: {} 1759 | 1760 | fsevents@2.3.3: 1761 | optional: true 1762 | 1763 | glob-parent@5.1.2: 1764 | dependencies: 1765 | is-glob: 4.0.3 1766 | 1767 | glob-parent@6.0.2: 1768 | dependencies: 1769 | is-glob: 4.0.3 1770 | 1771 | globals@14.0.0: {} 1772 | 1773 | globals@16.2.0: {} 1774 | 1775 | graphemer@1.4.0: {} 1776 | 1777 | has-flag@4.0.0: {} 1778 | 1779 | ignore@5.3.2: {} 1780 | 1781 | ignore@7.0.4: {} 1782 | 1783 | import-fresh@3.3.1: 1784 | dependencies: 1785 | parent-module: 1.0.1 1786 | resolve-from: 4.0.0 1787 | 1788 | imurmurhash@0.1.4: {} 1789 | 1790 | is-extglob@2.1.1: {} 1791 | 1792 | is-glob@4.0.3: 1793 | dependencies: 1794 | is-extglob: 2.1.1 1795 | 1796 | is-number@7.0.0: {} 1797 | 1798 | is-reference@3.0.3: 1799 | dependencies: 1800 | '@types/estree': 1.0.7 1801 | 1802 | isexe@2.0.0: {} 1803 | 1804 | js-yaml@4.1.0: 1805 | dependencies: 1806 | argparse: 2.0.1 1807 | 1808 | json-buffer@3.0.1: {} 1809 | 1810 | json-schema-traverse@0.4.1: {} 1811 | 1812 | json-stable-stringify-without-jsonify@1.0.1: {} 1813 | 1814 | keyv@4.5.4: 1815 | dependencies: 1816 | json-buffer: 3.0.1 1817 | 1818 | kleur@4.1.5: {} 1819 | 1820 | known-css-properties@0.36.0: {} 1821 | 1822 | levn@0.4.1: 1823 | dependencies: 1824 | prelude-ls: 1.2.1 1825 | type-check: 0.4.0 1826 | 1827 | lilconfig@2.1.0: {} 1828 | 1829 | locate-character@3.0.0: {} 1830 | 1831 | locate-path@6.0.0: 1832 | dependencies: 1833 | p-locate: 5.0.0 1834 | 1835 | lodash.merge@4.6.2: {} 1836 | 1837 | magic-string@0.30.17: 1838 | dependencies: 1839 | '@jridgewell/sourcemap-codec': 1.5.0 1840 | 1841 | merge2@1.4.1: {} 1842 | 1843 | micromatch@4.0.8: 1844 | dependencies: 1845 | braces: 3.0.3 1846 | picomatch: 2.3.1 1847 | 1848 | minimatch@3.1.2: 1849 | dependencies: 1850 | brace-expansion: 1.1.11 1851 | 1852 | minimatch@9.0.5: 1853 | dependencies: 1854 | brace-expansion: 2.0.1 1855 | 1856 | mri@1.2.0: {} 1857 | 1858 | mrmime@2.0.1: {} 1859 | 1860 | ms@2.1.3: {} 1861 | 1862 | nanoid@3.3.11: {} 1863 | 1864 | natural-compare@1.4.0: {} 1865 | 1866 | optionator@0.9.4: 1867 | dependencies: 1868 | deep-is: 0.1.4 1869 | fast-levenshtein: 2.0.6 1870 | levn: 0.4.1 1871 | prelude-ls: 1.2.1 1872 | type-check: 0.4.0 1873 | word-wrap: 1.2.5 1874 | 1875 | p-limit@3.1.0: 1876 | dependencies: 1877 | yocto-queue: 0.1.0 1878 | 1879 | p-locate@5.0.0: 1880 | dependencies: 1881 | p-limit: 3.1.0 1882 | 1883 | parent-module@1.0.1: 1884 | dependencies: 1885 | callsites: 3.1.0 1886 | 1887 | path-exists@4.0.0: {} 1888 | 1889 | path-key@3.1.1: {} 1890 | 1891 | picocolors@1.1.1: {} 1892 | 1893 | picomatch@2.3.1: {} 1894 | 1895 | picomatch@4.0.2: {} 1896 | 1897 | postcss-load-config@3.1.4(postcss@8.5.3): 1898 | dependencies: 1899 | lilconfig: 2.1.0 1900 | yaml: 1.10.2 1901 | optionalDependencies: 1902 | postcss: 8.5.3 1903 | 1904 | postcss-safe-parser@7.0.1(postcss@8.5.3): 1905 | dependencies: 1906 | postcss: 8.5.3 1907 | 1908 | postcss-scss@4.0.9(postcss@8.5.3): 1909 | dependencies: 1910 | postcss: 8.5.3 1911 | 1912 | postcss-selector-parser@7.1.0: 1913 | dependencies: 1914 | cssesc: 3.0.0 1915 | util-deprecate: 1.0.2 1916 | 1917 | postcss@8.5.3: 1918 | dependencies: 1919 | nanoid: 3.3.11 1920 | picocolors: 1.1.1 1921 | source-map-js: 1.2.1 1922 | 1923 | prelude-ls@1.2.1: {} 1924 | 1925 | prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.33.2): 1926 | dependencies: 1927 | prettier: 3.5.3 1928 | svelte: 5.33.2 1929 | 1930 | prettier@3.5.3: {} 1931 | 1932 | punycode@2.3.1: {} 1933 | 1934 | queue-microtask@1.2.3: {} 1935 | 1936 | readdirp@4.1.2: {} 1937 | 1938 | resolve-from@4.0.0: {} 1939 | 1940 | reusify@1.1.0: {} 1941 | 1942 | rollup@4.41.1: 1943 | dependencies: 1944 | '@types/estree': 1.0.7 1945 | optionalDependencies: 1946 | '@rollup/rollup-android-arm-eabi': 4.41.1 1947 | '@rollup/rollup-android-arm64': 4.41.1 1948 | '@rollup/rollup-darwin-arm64': 4.41.1 1949 | '@rollup/rollup-darwin-x64': 4.41.1 1950 | '@rollup/rollup-freebsd-arm64': 4.41.1 1951 | '@rollup/rollup-freebsd-x64': 4.41.1 1952 | '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 1953 | '@rollup/rollup-linux-arm-musleabihf': 4.41.1 1954 | '@rollup/rollup-linux-arm64-gnu': 4.41.1 1955 | '@rollup/rollup-linux-arm64-musl': 4.41.1 1956 | '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 1957 | '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 1958 | '@rollup/rollup-linux-riscv64-gnu': 4.41.1 1959 | '@rollup/rollup-linux-riscv64-musl': 4.41.1 1960 | '@rollup/rollup-linux-s390x-gnu': 4.41.1 1961 | '@rollup/rollup-linux-x64-gnu': 4.41.1 1962 | '@rollup/rollup-linux-x64-musl': 4.41.1 1963 | '@rollup/rollup-win32-arm64-msvc': 4.41.1 1964 | '@rollup/rollup-win32-ia32-msvc': 4.41.1 1965 | '@rollup/rollup-win32-x64-msvc': 4.41.1 1966 | fsevents: 2.3.3 1967 | 1968 | run-parallel@1.2.0: 1969 | dependencies: 1970 | queue-microtask: 1.2.3 1971 | 1972 | sade@1.8.1: 1973 | dependencies: 1974 | mri: 1.2.0 1975 | 1976 | semver@7.7.2: {} 1977 | 1978 | set-cookie-parser@2.7.1: {} 1979 | 1980 | shebang-command@2.0.0: 1981 | dependencies: 1982 | shebang-regex: 3.0.0 1983 | 1984 | shebang-regex@3.0.0: {} 1985 | 1986 | sirv@3.0.1: 1987 | dependencies: 1988 | '@polka/url': 1.0.0-next.29 1989 | mrmime: 2.0.1 1990 | totalist: 3.0.1 1991 | 1992 | source-map-js@1.2.1: {} 1993 | 1994 | strip-json-comments@3.1.1: {} 1995 | 1996 | supports-color@7.2.0: 1997 | dependencies: 1998 | has-flag: 4.0.0 1999 | 2000 | svelte-check@4.2.1(picomatch@4.0.2)(svelte@5.33.2)(typescript@5.8.3): 2001 | dependencies: 2002 | '@jridgewell/trace-mapping': 0.3.25 2003 | chokidar: 4.0.3 2004 | fdir: 6.4.4(picomatch@4.0.2) 2005 | picocolors: 1.1.1 2006 | sade: 1.8.1 2007 | svelte: 5.33.2 2008 | typescript: 5.8.3 2009 | transitivePeerDependencies: 2010 | - picomatch 2011 | 2012 | svelte-eslint-parser@1.2.0(svelte@5.33.2): 2013 | dependencies: 2014 | eslint-scope: 8.3.0 2015 | eslint-visitor-keys: 4.2.0 2016 | espree: 10.3.0 2017 | postcss: 8.5.3 2018 | postcss-scss: 4.0.9(postcss@8.5.3) 2019 | postcss-selector-parser: 7.1.0 2020 | optionalDependencies: 2021 | svelte: 5.33.2 2022 | 2023 | svelte@5.33.2: 2024 | dependencies: 2025 | '@ampproject/remapping': 2.3.0 2026 | '@jridgewell/sourcemap-codec': 1.5.0 2027 | '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) 2028 | '@types/estree': 1.0.7 2029 | acorn: 8.14.1 2030 | aria-query: 5.3.2 2031 | axobject-query: 4.1.0 2032 | clsx: 2.1.1 2033 | esm-env: 1.2.2 2034 | esrap: 1.4.6 2035 | is-reference: 3.0.3 2036 | locate-character: 3.0.0 2037 | magic-string: 0.30.17 2038 | zimmerframe: 1.1.2 2039 | 2040 | tinyglobby@0.2.14: 2041 | dependencies: 2042 | fdir: 6.4.4(picomatch@4.0.2) 2043 | picomatch: 4.0.2 2044 | 2045 | to-regex-range@5.0.1: 2046 | dependencies: 2047 | is-number: 7.0.0 2048 | 2049 | totalist@3.0.1: {} 2050 | 2051 | ts-api-utils@2.1.0(typescript@5.8.3): 2052 | dependencies: 2053 | typescript: 5.8.3 2054 | 2055 | type-check@0.4.0: 2056 | dependencies: 2057 | prelude-ls: 1.2.1 2058 | 2059 | typescript-eslint@8.32.1(eslint@9.27.0)(typescript@5.8.3): 2060 | dependencies: 2061 | '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3) 2062 | '@typescript-eslint/parser': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 2063 | '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 2064 | eslint: 9.27.0 2065 | typescript: 5.8.3 2066 | transitivePeerDependencies: 2067 | - supports-color 2068 | 2069 | typescript@5.8.3: {} 2070 | 2071 | uri-js@4.4.1: 2072 | dependencies: 2073 | punycode: 2.3.1 2074 | 2075 | util-deprecate@1.0.2: {} 2076 | 2077 | vite@6.3.5: 2078 | dependencies: 2079 | esbuild: 0.25.4 2080 | fdir: 6.4.4(picomatch@4.0.2) 2081 | picomatch: 4.0.2 2082 | postcss: 8.5.3 2083 | rollup: 4.41.1 2084 | tinyglobby: 0.2.14 2085 | optionalDependencies: 2086 | fsevents: 2.3.3 2087 | 2088 | vitefu@1.0.6(vite@6.3.5): 2089 | optionalDependencies: 2090 | vite: 6.3.5 2091 | 2092 | which@2.0.2: 2093 | dependencies: 2094 | isexe: 2.0.0 2095 | 2096 | word-wrap@1.2.5: {} 2097 | 2098 | yaml@1.10.2: {} 2099 | 2100 | yocto-queue@0.1.0: {} 2101 | 2102 | zimmerframe@1.1.2: {} 2103 | -------------------------------------------------------------------------------- /website/src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://svelte.dev/docs/kit/types#app.d.ts 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface PageState {} 9 | // interface Platform {} 10 | } 11 | } 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /website/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | %sveltekit.head% 7 | 8 | 15 | 16 | 17 | 25 | 26 | 27 |58 | {#if copied} 59 | Command copied to clipboard 60 | {:else} 61 | Run in your system's terminal emulator 62 | {/if} 63 |
64 |