mirror of https://github.com/jetkvm/kvm.git
Compare commits
12 Commits
b42682ac86
...
cd9a55d9ac
| Author | SHA1 | Date |
|---|---|---|
|
|
cd9a55d9ac | |
|
|
62b8dee170 | |
|
|
bdd6f4247b | |
|
|
63aa940f42 | |
|
|
043ef9ddfc | |
|
|
437f0b854a | |
|
|
a45d55123c | |
|
|
213e750e04 | |
|
|
6dcb0286e3 | |
|
|
74ccca0b1a | |
|
|
0ad435475b | |
|
|
23bf3978fa |
|
|
@ -8,7 +8,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mounts": [
|
"mounts": [
|
||||||
"source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh,type=bind,consistency=cached"
|
"source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh,type=bind,consistency=cached",
|
||||||
|
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
|
||||||
],
|
],
|
||||||
"onCreateCommand": ".devcontainer/install-deps.sh",
|
"onCreateCommand": ".devcontainer/install-deps.sh",
|
||||||
"customizations": {
|
"customizations": {
|
||||||
|
|
@ -31,8 +32,11 @@
|
||||||
// Frontend
|
// Frontend
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"bradlc.vscode-tailwindcss"
|
"bradlc.vscode-tailwindcss",
|
||||||
|
"codeandstuff.package-json-upgrade",
|
||||||
|
// Localization
|
||||||
|
"inlang.vs-code-extension"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -32,4 +32,5 @@ wget https://github.com/jetkvm/rv1106-system/releases/download/${BUILDKIT_VERSIO
|
||||||
sudo mkdir -p /opt/jetkvm-native-buildkit && \
|
sudo mkdir -p /opt/jetkvm-native-buildkit && \
|
||||||
sudo tar --use-compress-program="unzstd --long=31" -xvf buildkit.tar.zst -C /opt/jetkvm-native-buildkit && \
|
sudo tar --use-compress-program="unzstd --long=31" -xvf buildkit.tar.zst -C /opt/jetkvm-native-buildkit && \
|
||||||
rm buildkit.tar.zst
|
rm buildkit.tar.zst
|
||||||
popd
|
popd
|
||||||
|
rm -rf "${BUILDKIT_TMPDIR}"
|
||||||
|
|
@ -43,7 +43,7 @@ jobs:
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
cache-dependency-path: "**/package-lock.json"
|
cache-dependency-path: "**/package-lock.json"
|
||||||
- name: Set up Golang
|
- name: Set up Golang
|
||||||
uses: actions/setup-go@v6.0.0
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version: "^1.25.1"
|
go-version: "^1.25.1"
|
||||||
- name: Build frontend
|
- name: Build frontend
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ jobs:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
- name: Install Go
|
- name: Install Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version: oldstable
|
go-version: oldstable
|
||||||
- name: Create empty resource directory
|
- name: Create empty resource directory
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ jobs:
|
||||||
EOF
|
EOF
|
||||||
ssh jkci "cat /tmp/device-tests.json" > device-tests.json
|
ssh jkci "cat /tmp/device-tests.json" > device-tests.json
|
||||||
- name: Set up Golang
|
- name: Set up Golang
|
||||||
uses: actions/setup-go@v5.5.0
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version: "1.24.4"
|
go-version: "1.24.4"
|
||||||
- name: Golang Test Report
|
- name: Golang Test Report
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
// coding styles
|
||||||
|
"chrislajoie.vscode-modelines",
|
||||||
|
"editorconfig.editorconfig",
|
||||||
|
// GitHub
|
||||||
|
"GitHub.vscode-pull-request-github",
|
||||||
|
"github.vscode-github-actions",
|
||||||
|
// Golang
|
||||||
|
"golang.go",
|
||||||
|
// C / C++
|
||||||
|
"ms-vscode.cpptools",
|
||||||
|
"ms-vscode.cpptools-extension-pack",
|
||||||
|
// CMake / Makefile
|
||||||
|
"ms-vscode.makefile-tools",
|
||||||
|
"ms-vscode.cmake-tools",
|
||||||
|
// Frontend
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"bradlc.vscode-tailwindcss",
|
||||||
|
"codeandstuff.package-json-upgrade",
|
||||||
|
// Localization
|
||||||
|
"inlang.vs-code-extension"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -97,21 +97,42 @@ tail -f /var/log/jetkvm.log
|
||||||
|
|
||||||
```
|
```
|
||||||
/kvm/
|
/kvm/
|
||||||
├── main.go # App entry point
|
├── main.go # App entry point
|
||||||
├── config.go # Settings & configuration
|
├── config.go # Settings & configuration
|
||||||
├── web.go # API endpoints
|
├── display.go # Device UI control
|
||||||
├── ui/ # React frontend
|
├── web.go # API endpoints
|
||||||
│ ├── src/routes/ # Pages (login, settings, etc.)
|
├── cmd/ # Command line main
|
||||||
│ └── src/components/ # UI components
|
├── internal/ # Internal Go packages
|
||||||
├── internal/ # Internal Go packages
|
│ ├── confparser/ # Configuration file implementation
|
||||||
│ ├── native/ # CGO / Native code glue layer
|
│ ├── hidrpc/ # HIDRPC implementation for HID devices (keyboard, mouse, etc.)
|
||||||
│ ├── native/cgo/ # C files for the native library (HDMI, Touchscreen, etc.)
|
│ ├── logging/ # Logging implementation
|
||||||
│ ├── native/eez/ # EEZ Studio Project files (for Touchscreen)
|
│ ├── mdns/ # mDNS implementation
|
||||||
│ ├── hidrpc/ # HIDRPC implementation for HID devices (keyboard, mouse, etc.)
|
│ ├── native/ # CGO / Native code glue layer (on-device hardware)
|
||||||
│ ├── logging/ # Logging implementation
|
│ │ ├── cgo/ # C files for the native library (HDMI, Touchscreen, etc.)
|
||||||
│ ├── usbgadget/ # USB gadget
|
│ │ └── eez/ # EEZ Studio Project files (for Touchscreen)
|
||||||
│ └── websecurity/ # TLS certificate management
|
│ ├── network/ # Network implementation
|
||||||
└── resource # netboot iso and other resources
|
│ ├── timesync/ # Time sync/NTP implementation
|
||||||
|
│ ├── tzdata/ # Timezone data and generation
|
||||||
|
│ ├── udhcpc/ # DHCP implementation
|
||||||
|
│ ├── usbgadget/ # USB gadget
|
||||||
|
│ ├── utils/ # SSH handling
|
||||||
|
│ └── websecure/ # TLS certificate management
|
||||||
|
├── resource/ # netboot iso and other resources
|
||||||
|
├── scripts/ # Bash shell scripts for building and deploying
|
||||||
|
└── static/ # (react client build output)
|
||||||
|
└── ui/ # React frontend
|
||||||
|
├── localization/ # Client UI localization (i18n)
|
||||||
|
│ ├── jetKVM.UI.inlang/ # Settings for inlang
|
||||||
|
│ └── messages/ # Messages localized
|
||||||
|
├── public/ # UI website static images and fonts
|
||||||
|
└── src/ # Client React UI
|
||||||
|
├── assets/ # UI in-page images
|
||||||
|
├── components/ # UI components
|
||||||
|
├── hooks/ # Hooks (stores, RPC handling, virtual devices)
|
||||||
|
├── keyboardLayouts/ # Keyboard layout definitions
|
||||||
|
│ ├── paraglide/ # (localization compiled messages output)
|
||||||
|
├── providers/ # Feature flags
|
||||||
|
└── routes/ # Pages (login, settings, etc.)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Key files for beginners:**
|
**Key files for beginners:**
|
||||||
|
|
@ -252,6 +273,47 @@ rm -rf node_modules
|
||||||
npm install
|
npm install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### "Device UI Fails to Build"
|
||||||
|
|
||||||
|
If while trying to build you run into an error message similar to :
|
||||||
|
```plaintext
|
||||||
|
In file included from /workspaces/kvm/internal/native/cgo/ctrl.c:15:
|
||||||
|
/workspaces/kvm/internal/native/cgo/ui_index.h:4:10: fatal error: ui/ui.h: No such file or directory
|
||||||
|
#include "ui/ui.h"
|
||||||
|
^~~~~~~~~
|
||||||
|
compilation terminated.
|
||||||
|
```
|
||||||
|
This means that your system didn't create the directory-link to from _./internal/native/cgo/ui_ to ./internal/native/eez/src/ui when the repository was checked out. You can verify this is the case if _./internal/native/cgo/ui_ appears as a plain text file with only the textual contents:
|
||||||
|
```plaintext
|
||||||
|
../eez/src/ui
|
||||||
|
```
|
||||||
|
|
||||||
|
If this happens to you need to [enable git creation of symbolic links](https://stackoverflow.com/a/59761201/2076) either globally or for the KVM repository:
|
||||||
|
```bash
|
||||||
|
# Globally enable git to create symlinks
|
||||||
|
git config --global core.symlinks true
|
||||||
|
git restore internal/native/cgo/ui
|
||||||
|
```
|
||||||
|
```bash
|
||||||
|
# Enable git to create symlinks only in this project
|
||||||
|
git config core.symlinks true
|
||||||
|
git restore internal/native/cgo/ui
|
||||||
|
```
|
||||||
|
|
||||||
|
Or if you want to manually create the symlink use:
|
||||||
|
```bash
|
||||||
|
# linux
|
||||||
|
cd internal/native/cgo
|
||||||
|
rm ui
|
||||||
|
ln -s ui ../eez/src/ui
|
||||||
|
```
|
||||||
|
```dos
|
||||||
|
rem Windows
|
||||||
|
cd internal/native/cgo
|
||||||
|
del ui
|
||||||
|
mklink /d ui ../eez/src/ui
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Next Steps
|
## Next Steps
|
||||||
|
|
|
||||||
39
go.mod
39
go.mod
|
|
@ -5,13 +5,14 @@ go 1.24.4
|
||||||
require (
|
require (
|
||||||
github.com/Masterminds/semver/v3 v3.4.0
|
github.com/Masterminds/semver/v3 v3.4.0
|
||||||
github.com/beevik/ntp v1.4.3
|
github.com/beevik/ntp v1.4.3
|
||||||
github.com/coder/websocket v1.8.13
|
github.com/coder/websocket v1.8.14
|
||||||
github.com/coreos/go-oidc/v3 v3.15.0
|
github.com/coreos/go-oidc/v3 v3.15.0
|
||||||
github.com/creack/pty v1.1.24
|
github.com/creack/pty v1.1.24
|
||||||
|
github.com/erikdubbelboer/gspt v0.0.0-20210805194459-ce36a5128377
|
||||||
github.com/fsnotify/fsnotify v1.9.0
|
github.com/fsnotify/fsnotify v1.9.0
|
||||||
github.com/gin-contrib/logger v1.2.6
|
github.com/gin-contrib/logger v1.2.6
|
||||||
github.com/gin-gonic/gin v1.10.1
|
github.com/gin-gonic/gin v1.10.1
|
||||||
github.com/go-co-op/gocron/v2 v2.16.5
|
github.com/go-co-op/gocron/v2 v2.16.6
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/guregu/null/v6 v6.0.0
|
github.com/guregu/null/v6 v6.0.0
|
||||||
github.com/gwatts/rootcerts v0.0.0-20250901182336-dc5ae18bd79f
|
github.com/gwatts/rootcerts v0.0.0-20250901182336-dc5ae18bd79f
|
||||||
|
|
@ -19,8 +20,8 @@ require (
|
||||||
github.com/pion/mdns/v2 v2.0.7
|
github.com/pion/mdns/v2 v2.0.7
|
||||||
github.com/pion/webrtc/v4 v4.1.4
|
github.com/pion/webrtc/v4 v4.1.4
|
||||||
github.com/pojntfx/go-nbd v0.3.2
|
github.com/pojntfx/go-nbd v0.3.2
|
||||||
github.com/prometheus/client_golang v1.23.0
|
github.com/prometheus/client_golang v1.23.2
|
||||||
github.com/prometheus/common v0.66.0
|
github.com/prometheus/common v0.66.1
|
||||||
github.com/prometheus/procfs v0.17.0
|
github.com/prometheus/procfs v0.17.0
|
||||||
github.com/psanford/httpreadat v0.1.0
|
github.com/psanford/httpreadat v0.1.0
|
||||||
github.com/rs/xid v1.6.0
|
github.com/rs/xid v1.6.0
|
||||||
|
|
@ -30,37 +31,31 @@ require (
|
||||||
github.com/vearutop/statigz v1.5.0
|
github.com/vearutop/statigz v1.5.0
|
||||||
github.com/vishvananda/netlink v1.3.1
|
github.com/vishvananda/netlink v1.3.1
|
||||||
go.bug.st/serial v1.6.4
|
go.bug.st/serial v1.6.4
|
||||||
golang.org/x/crypto v0.41.0
|
golang.org/x/crypto v0.42.0
|
||||||
golang.org/x/net v0.43.0
|
golang.org/x/net v0.44.0
|
||||||
golang.org/x/sys v0.35.0
|
golang.org/x/sys v0.36.0
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/pojntfx/go-nbd v0.3.2 => github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b
|
replace github.com/pojntfx/go-nbd v0.3.2 => github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/bytedance/sonic v1.13.3 // indirect
|
github.com/bytedance/sonic v1.14.0 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.2.4 // indirect
|
github.com/bytedance/sonic/loader v0.3.0 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
github.com/cloudwego/base64x v0.1.5 // indirect
|
github.com/cloudwego/base64x v0.1.6 // indirect
|
||||||
github.com/creack/goselect v0.1.2 // indirect
|
github.com/creack/goselect v0.1.2 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/erikdubbelboer/gspt v0.0.0-20210805194459-ce36a5128377 // indirect
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
|
||||||
github.com/gin-contrib/sse v1.1.0 // indirect
|
github.com/gin-contrib/sse v1.1.0 // indirect
|
||||||
github.com/go-jose/go-jose/v4 v4.1.0 // indirect
|
github.com/go-jose/go-jose/v4 v4.1.0 // indirect
|
||||||
github.com/go-ole/go-ole v1.2.4 // indirect
|
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.26.0 // indirect
|
github.com/go-playground/validator/v10 v10.27.0 // indirect
|
||||||
github.com/goccy/go-json v0.10.5 // indirect
|
github.com/goccy/go-json v0.10.5 // indirect
|
||||||
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect
|
|
||||||
github.com/jonboulle/clockwork v0.5.0 // indirect
|
github.com/jonboulle/clockwork v0.5.0 // indirect
|
||||||
github.com/jpillora/overseer v1.1.6 // indirect
|
|
||||||
github.com/jpillora/s3 v1.1.4 // indirect
|
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
|
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
|
@ -90,10 +85,10 @@ require (
|
||||||
github.com/ugorji/go/codec v1.3.0 // indirect
|
github.com/ugorji/go/codec v1.3.0 // indirect
|
||||||
github.com/vishvananda/netns v0.0.5 // indirect
|
github.com/vishvananda/netns v0.0.5 // indirect
|
||||||
github.com/wlynxg/anet v0.0.5 // indirect
|
github.com/wlynxg/anet v0.0.5 // indirect
|
||||||
golang.org/x/arch v0.18.0 // indirect
|
go.yaml.in/yaml/v2 v2.4.2 // indirect
|
||||||
|
golang.org/x/arch v0.20.0 // indirect
|
||||||
golang.org/x/oauth2 v0.30.0 // indirect
|
golang.org/x/oauth2 v0.30.0 // indirect
|
||||||
golang.org/x/text v0.28.0 // indirect
|
golang.org/x/text v0.29.0 // indirect
|
||||||
google.golang.org/protobuf v1.36.8 // indirect
|
google.golang.org/protobuf v1.36.9 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
86
go.sum
86
go.sum
|
|
@ -1,7 +1,5 @@
|
||||||
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
|
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
|
||||||
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
|
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
|
||||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
|
|
||||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
|
||||||
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
||||||
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
||||||
github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho=
|
github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho=
|
||||||
|
|
@ -10,20 +8,18 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bool64/dev v0.2.39 h1:kP8DnMGlWXhGYJEZE/J0l/gVBdbuhoPGL+MJG4QbofE=
|
github.com/bool64/dev v0.2.39 h1:kP8DnMGlWXhGYJEZE/J0l/gVBdbuhoPGL+MJG4QbofE=
|
||||||
github.com/bool64/dev v0.2.39/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
|
github.com/bool64/dev v0.2.39/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
|
||||||
github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=
|
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
|
||||||
github.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
|
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
|
||||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
|
||||||
github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
|
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||||
github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b h1:dSbDgy72Y1sjLPWLv7vs0fMFuhMBMViiT9PJZiZWZNs=
|
github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b h1:dSbDgy72Y1sjLPWLv7vs0fMFuhMBMViiT9PJZiZWZNs=
|
||||||
github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b/go.mod h1:SehHnbi2e8NiSAKby42Itm8SIoS7b+wAprsfPH3qgYk=
|
github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b/go.mod h1:SehHnbi2e8NiSAKby42Itm8SIoS7b+wAprsfPH3qgYk=
|
||||||
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
||||||
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
|
||||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=
|
||||||
github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE=
|
github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
|
||||||
github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs=
|
|
||||||
github.com/coreos/go-oidc/v3 v3.15.0 h1:R6Oz8Z4bqWR7VFQ+sPSvZPQv4x8M+sJkDO5ojgwlyAg=
|
github.com/coreos/go-oidc/v3 v3.15.0 h1:R6Oz8Z4bqWR7VFQ+sPSvZPQv4x8M+sJkDO5ojgwlyAg=
|
||||||
github.com/coreos/go-oidc/v3 v3.15.0/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU=
|
github.com/coreos/go-oidc/v3 v3.15.0/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU=
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
|
|
@ -46,20 +42,18 @@ github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w
|
||||||
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
|
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
|
||||||
github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
|
github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
|
||||||
github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||||
github.com/go-co-op/gocron/v2 v2.16.5 h1:j228Jxk7bb9CF8LKR3gS+bK3rcjRUINjlVI+ZMp26Ss=
|
github.com/go-co-op/gocron/v2 v2.16.6 h1:zI2Ya9sqvuLcgqJgV79LwoJXM8h20Z/drtB7ATbpRWo=
|
||||||
github.com/go-co-op/gocron/v2 v2.16.5/go.mod h1:zAfC/GFQ668qHxOVl/D68Jh5Ce7sDqX6TJnSQyRkRBc=
|
github.com/go-co-op/gocron/v2 v2.16.6/go.mod h1:zAfC/GFQ668qHxOVl/D68Jh5Ce7sDqX6TJnSQyRkRBc=
|
||||||
github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY=
|
github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY=
|
||||||
github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw=
|
github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw=
|
||||||
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
|
|
||||||
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
|
||||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||||
github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k=
|
github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
|
||||||
github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
|
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
|
||||||
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
|
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
|
||||||
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
|
@ -68,26 +62,18 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248=
|
|
||||||
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
|
|
||||||
github.com/guregu/null/v6 v6.0.0 h1:N14VRS+4di81i1PXRiprbQJ9EM9gqBa0+KVMeS/QSjQ=
|
github.com/guregu/null/v6 v6.0.0 h1:N14VRS+4di81i1PXRiprbQJ9EM9gqBa0+KVMeS/QSjQ=
|
||||||
github.com/guregu/null/v6 v6.0.0/go.mod h1:hrMIhIfrOZeLPZhROSn149tpw2gHkidAqxoXNyeX3iQ=
|
github.com/guregu/null/v6 v6.0.0/go.mod h1:hrMIhIfrOZeLPZhROSn149tpw2gHkidAqxoXNyeX3iQ=
|
||||||
github.com/gwatts/rootcerts v0.0.0-20250901182336-dc5ae18bd79f h1:08t2PbrkDgW2+mwCQ3jhKUBrCM9Bc9SeH5j2Dst3B+0=
|
github.com/gwatts/rootcerts v0.0.0-20250901182336-dc5ae18bd79f h1:08t2PbrkDgW2+mwCQ3jhKUBrCM9Bc9SeH5j2Dst3B+0=
|
||||||
github.com/gwatts/rootcerts v0.0.0-20250901182336-dc5ae18bd79f/go.mod h1:5Kt9XkWvkGi2OHOq0QsGxebHmhCcqJ8KCbNg/a6+n+g=
|
github.com/gwatts/rootcerts v0.0.0-20250901182336-dc5ae18bd79f/go.mod h1:5Kt9XkWvkGi2OHOq0QsGxebHmhCcqJ8KCbNg/a6+n+g=
|
||||||
github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=
|
github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=
|
||||||
github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60=
|
github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60=
|
||||||
github.com/jpillora/overseer v1.1.6 h1:3ygYfNcR3FfOr22miu3vR1iQcXKMHbmULBh98rbkIyo=
|
|
||||||
github.com/jpillora/overseer v1.1.6/go.mod h1:aPXQtxuVb9PVWRWTXpo+LdnC/YXQ0IBLNXqKMJmgk88=
|
|
||||||
github.com/jpillora/s3 v1.1.4 h1:YCCKDWzb/Ye9EBNd83ATRF/8wPEy0xd43Rezb6u6fzc=
|
|
||||||
github.com/jpillora/s3 v1.1.4/go.mod h1:yedE603V+crlFi1Kl/5vZJaBu9pUzE9wvKegU/lF2zs=
|
|
||||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
|
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
|
||||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
|
|
@ -152,12 +138,12 @@ github.com/pion/webrtc/v4 v4.1.4/go.mod h1:Oab9npu1iZtQRMic3K3toYq5zFPvToe/QBw7d
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc=
|
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
|
||||||
github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE=
|
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
|
||||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
||||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
||||||
github.com/prometheus/common v0.66.0 h1:K/rJPHrG3+AoQs50r2+0t7zMnMzek2Vbv31OFVsMeVY=
|
github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
|
||||||
github.com/prometheus/common v0.66.0/go.mod h1:Ux6NtV1B4LatamKE63tJBntoxD++xmtI/lK0VtEplN4=
|
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
|
||||||
github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
|
github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
|
||||||
github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
|
github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
|
||||||
github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE=
|
github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE=
|
||||||
|
|
@ -170,15 +156,12 @@ github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
||||||
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
||||||
github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
|
github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
|
||||||
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
|
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
|
||||||
github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
|
||||||
github.com/smartystreets/gunit v1.1.3/go.mod h1:EH5qMBab2UclzXUcpR8b93eHsIlp9u+pDQIRp5DZNzQ=
|
|
||||||
github.com/sourcegraph/tf-dag v0.2.2-0.20250131204052-3e8ff1477b4f h1:VgoRCP1efSCEZIcF2THLQ46+pIBzzgNiaUBe9wEDwYU=
|
github.com/sourcegraph/tf-dag v0.2.2-0.20250131204052-3e8ff1477b4f h1:VgoRCP1efSCEZIcF2THLQ46+pIBzzgNiaUBe9wEDwYU=
|
||||||
github.com/sourcegraph/tf-dag v0.2.2-0.20250131204052-3e8ff1477b4f/go.mod h1:pzro7BGorij2WgrjEammtrkbo3+xldxo+KaGLGUiD+Q=
|
github.com/sourcegraph/tf-dag v0.2.2-0.20250131204052-3e8ff1477b4f/go.mod h1:pzro7BGorij2WgrjEammtrkbo3+xldxo+KaGLGUiD+Q=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
|
|
@ -200,12 +183,14 @@ go.bug.st/serial v1.6.4 h1:7FmqNPgVp3pu2Jz5PoPtbZ9jJO5gnEnZIvnI1lzve8A=
|
||||||
go.bug.st/serial v1.6.4/go.mod h1:nofMJxTeNVny/m6+KaafC6vJGj3miwQZ6vW4BZUGJPI=
|
go.bug.st/serial v1.6.4/go.mod h1:nofMJxTeNVny/m6+KaafC6vJGj3miwQZ6vW4BZUGJPI=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/arch v0.18.0 h1:WN9poc33zL4AzGxqf8VtpKUnGvMi8O9lhNyBMF/85qc=
|
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
|
||||||
golang.org/x/arch v0.18.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
|
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
|
||||||
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
|
golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
|
||||||
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
|
golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
|
||||||
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
|
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
||||||
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
|
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
||||||
|
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
||||||
|
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
||||||
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
||||||
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
|
@ -213,20 +198,17 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
|
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
||||||
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
|
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
|
||||||
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
|
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
|
||||||
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
|
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
||||||
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
|
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
||||||
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
|
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
|
||||||
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
|
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,6 @@ func uiInit(rotation uint16) {
|
||||||
defer cgoLock.Unlock()
|
defer cgoLock.Unlock()
|
||||||
|
|
||||||
cRotation := C.u_int16_t(rotation)
|
cRotation := C.u_int16_t(rotation)
|
||||||
defer C.free(unsafe.Pointer(&cRotation))
|
|
||||||
|
|
||||||
C.jetkvm_ui_init(cRotation)
|
C.jetkvm_ui_init(cRotation)
|
||||||
}
|
}
|
||||||
|
|
@ -350,7 +349,6 @@ func uiDispSetRotation(rotation uint16) (bool, error) {
|
||||||
nativeLogger.Info().Uint16("rotation", rotation).Msg("setting rotation")
|
nativeLogger.Info().Uint16("rotation", rotation).Msg("setting rotation")
|
||||||
|
|
||||||
cRotation := C.u_int16_t(rotation)
|
cRotation := C.u_int16_t(rotation)
|
||||||
defer C.free(unsafe.Pointer(&cRotation))
|
|
||||||
|
|
||||||
C.jetkvm_ui_set_rotation(cRotation)
|
C.jetkvm_ui_set_rotation(cRotation)
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ module.exports = defineConfig([{
|
||||||
groups: ["builtin", "external", "internal", "parent", "sibling"],
|
groups: ["builtin", "external", "internal", "parent", "sibling"],
|
||||||
"newlines-between": "always",
|
"newlines-between": "always",
|
||||||
}],
|
}],
|
||||||
|
|
||||||
"@typescript-eslint/no-unused-vars": ["warn", {
|
"@typescript-eslint/no-unused-vars": ["warn", {
|
||||||
"argsIgnorePattern": "^_", "varsIgnorePattern": "^_"
|
"argsIgnorePattern": "^_", "varsIgnorePattern": "^_"
|
||||||
}],
|
}],
|
||||||
|
|
@ -81,7 +81,10 @@ module.exports = defineConfig([{
|
||||||
map: [
|
map: [
|
||||||
["@components", "./src/components"],
|
["@components", "./src/components"],
|
||||||
["@routes", "./src/routes"],
|
["@routes", "./src/routes"],
|
||||||
|
["@hooks", "./src/hooks"],
|
||||||
|
["@providers", "./src/providers"],
|
||||||
["@assets", "./src/assets"],
|
["@assets", "./src/assets"],
|
||||||
|
["@localizations", "./localization/paraglide"],
|
||||||
["@", "./src"],
|
["@", "./src"],
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,31 +45,39 @@
|
||||||
<link rel="shortcut icon" href="/favicon.ico" />
|
<link rel="shortcut icon" href="/favicon.ico" />
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||||
<meta name="apple-mobile-web-app-title" content="JetKVM" />
|
<meta name="apple-mobile-web-app-title" content="JetKVM" />
|
||||||
<link rel="manifest" href="/site.webmanifest" />
|
<link rel="manifest" href="/public/site.webmanifest" />
|
||||||
<meta name="theme-color" content="#051946" />
|
<meta name="theme-color" content="#051946" />
|
||||||
<meta name="description" content="A web-based KVM console for managing remote servers." />
|
<meta
|
||||||
|
name="description"
|
||||||
|
content="A web-based KVM console for managing remote servers."
|
||||||
|
/>
|
||||||
<script>
|
<script>
|
||||||
function applyThemeFromPreference() {
|
function applyThemeFromPreference() {
|
||||||
// dark theme setup
|
// dark theme setup
|
||||||
var darkDesired = localStorage.theme === "dark" ||
|
var darkDesired =
|
||||||
|
localStorage.theme === "dark" ||
|
||||||
(!("theme" in localStorage) &&
|
(!("theme" in localStorage) &&
|
||||||
window.matchMedia("(prefers-color-scheme: dark)").matches)
|
window.matchMedia("(prefers-color-scheme: dark)").matches);
|
||||||
|
|
||||||
document.documentElement.classList.toggle("dark", darkDesired)
|
document.documentElement.classList.toggle("dark", darkDesired);
|
||||||
}
|
}
|
||||||
|
|
||||||
// initial theme application
|
// initial theme application
|
||||||
applyThemeFromPreference();
|
applyThemeFromPreference();
|
||||||
|
|
||||||
// Listen for system theme changes
|
// Listen for system theme changes
|
||||||
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", applyThemeFromPreference);
|
window
|
||||||
window.matchMedia("(prefers-color-scheme: light)").addEventListener("change", applyThemeFromPreference);
|
.matchMedia("(prefers-color-scheme: dark)")
|
||||||
|
.addEventListener("change", applyThemeFromPreference);
|
||||||
|
window
|
||||||
|
.matchMedia("(prefers-color-scheme: light)")
|
||||||
|
.addEventListener("change", applyThemeFromPreference);
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body
|
<body
|
||||||
class="h-full w-full bg-[#f3f9ff] font-sans text-sm antialiased dark:bg-slate-900 md:text-base"
|
class="h-full w-full bg-[#f3f9ff] font-sans text-sm antialiased md:text-base dark:bg-slate-900"
|
||||||
>
|
>
|
||||||
<div id="root" class="w-full h-full"></div>
|
<div id="root" class="h-full w-full"></div>
|
||||||
<script type="module" src="/src/main.tsx"></script>
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
cache
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
TI1a2RjjH4qkImNj0w
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/project-settings",
|
||||||
|
"baseLocale": "en",
|
||||||
|
"sourceLanguageTag": "en",
|
||||||
|
"locales": [
|
||||||
|
"en",
|
||||||
|
"da",
|
||||||
|
"de",
|
||||||
|
"es",
|
||||||
|
"fr",
|
||||||
|
"it",
|
||||||
|
"nb",
|
||||||
|
"sv",
|
||||||
|
"zh"
|
||||||
|
],
|
||||||
|
"languageTags": [
|
||||||
|
"en",
|
||||||
|
"da",
|
||||||
|
"de",
|
||||||
|
"es",
|
||||||
|
"fr",
|
||||||
|
"it",
|
||||||
|
"nb",
|
||||||
|
"sv",
|
||||||
|
"zh"
|
||||||
|
],
|
||||||
|
"modules": [
|
||||||
|
"https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@latest/dist/index.js",
|
||||||
|
"https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@latest/dist/index.js"
|
||||||
|
],
|
||||||
|
"plugin.inlang.messageFormat": {
|
||||||
|
"pathPattern": "./messages/{locale}.json"
|
||||||
|
},
|
||||||
|
"strategy": [
|
||||||
|
"localStorage",
|
||||||
|
"preferredLanguage",
|
||||||
|
"baseLocale"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "Åh nej!",
|
||||||
|
"something_went_wrong": "Noget gik galt. Prøv igen senere, eller kontakt support.",
|
||||||
|
"jetkvm_logo": "JetKVM-logo",
|
||||||
|
"load": "Indlæs",
|
||||||
|
"unknown_error": "Ukendt fejl",
|
||||||
|
"action_bar_virtual_media": "Virtuelle medier",
|
||||||
|
"action_bar_paste_text": "Indsæt tekst",
|
||||||
|
"action_bar_web_terminal": "Webterminal",
|
||||||
|
"action_bar_wake_on_lan": "Vågn på LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Virtuelt tastatur",
|
||||||
|
"action_bar_extension": "Udvidelse",
|
||||||
|
"action_bar_connection_stats": "Forbindelsesstatistik",
|
||||||
|
"action_bar_settings": "Indstillinger",
|
||||||
|
"action_bar_fullscreen": "Fuldskærm",
|
||||||
|
"action_bar_exit_fullscreen": "Afslut fuldskærm",
|
||||||
|
"extensions_popover_extensions": "Udvidelser",
|
||||||
|
"extension_popover_set_error_notification": "Kunne ikke angive aktiv udvidelse: {error}",
|
||||||
|
"extension_popover_unload_extension": "Fjern udvidelse",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Indlæs og administrer dine udvidelser",
|
||||||
|
"extensions_atx_power_control": "ATX-strømstyring",
|
||||||
|
"extensions_atx_power_control_description": "Styr din maskines strømtilstand via ATX-strømstyring.",
|
||||||
|
"extensions_dc_power_control": "DC-strømstyring",
|
||||||
|
"extensions_dc_power_control_description": "Styr din DC-strømforlænger",
|
||||||
|
"extension_serial_console": "Seriel konsol",
|
||||||
|
"extension_serial_console_description": "Få adgang til din serielle konsoludvidelse",
|
||||||
|
"atx_power_control_get_state_error": "Kunne ikke hente ATX-strømtilstand: {error}",
|
||||||
|
"atx_power_control_send_action_error": "Kunne ikke sende ATX-strømfunktion {action} : {error}",
|
||||||
|
"atx_power_control_power_button": "Magt",
|
||||||
|
"atx_power_control_short_power_button": "Kort tryk",
|
||||||
|
"atx_power_control_long_power_button": "Langt tryk",
|
||||||
|
"atx_power_control_reset_button": "Nulstil",
|
||||||
|
"atx_power_control_power_led": "Strøm-LED",
|
||||||
|
"atx_power_control_hdd_led": "HDD-LED",
|
||||||
|
"dc_power_control_get_state_error": "Kunne ikke hente DC-strømtilstand: {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "Kunne ikke sende DC-strømstatus til {enabled} : {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "Kunne ikke sende DC-strømgendannelsesstatus til {state} : {error}",
|
||||||
|
"dc_power_control_power_on_button": "Tænd",
|
||||||
|
"dc_power_control_power_off_button": "Sluk",
|
||||||
|
"dc_power_control_restore_power_state": "Gendan strømtab",
|
||||||
|
"dc_power_control_power_on_state": "Tænd",
|
||||||
|
"dc_power_control_power_off_state": "Sluk",
|
||||||
|
"dc_power_control_voltage": "Spænding",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Strøm",
|
||||||
|
"dc_power_control_current_unit": "A",
|
||||||
|
"dc_power_control_power": "Magt",
|
||||||
|
"dc_power_control_power_unit": "W",
|
||||||
|
"serial_console_get_state_error": "Kunne ikke hente indstillinger for seriel konsol: {error}",
|
||||||
|
"serial_console_set_power_state_error": "Kunne ikke indstille seriel konsolindstillinger til {settings} : {error}",
|
||||||
|
"serial_console_configure_description": "Konfigurer dine serielle konsolindstillinger",
|
||||||
|
"serial_console_open_console": "Åbn konsol",
|
||||||
|
"serial_console_baud_rate": "Baudhastighed",
|
||||||
|
"serial_console_data_bits": "Databits",
|
||||||
|
"serial_console_stop_bits": "Stopbits",
|
||||||
|
"serial_console_parity": "Paritet",
|
||||||
|
"serial_console_parity_even": "Lige paritet",
|
||||||
|
"serial_console_parity_odd": "Ulige paritet",
|
||||||
|
"serial_console_parity_none": "Ingen paritet",
|
||||||
|
"serial_console_parity_mark": "Mark Paritet",
|
||||||
|
"serial_console_parity_space": "Rumparitet",
|
||||||
|
"serial_console_get_settings_error": "Kunne ikke hente indstillinger for seriel konsol: {error}",
|
||||||
|
"serial_console_set_settings_error": "Kunne ikke indstille seriel konsolindstillinger til {settings} : {error}"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "Oh nein!",
|
||||||
|
"something_went_wrong": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es später noch einmal oder wenden Sie sich an den Support.",
|
||||||
|
"jetkvm_logo": "JetKVM Logo",
|
||||||
|
"load": "Laden",
|
||||||
|
"unknown_error": "Unbekannter Fehler",
|
||||||
|
"action_bar_virtual_media": "Virtuelle Medien",
|
||||||
|
"action_bar_paste_text": "Text einfügen",
|
||||||
|
"action_bar_web_terminal": "Web-Terminal",
|
||||||
|
"action_bar_wake_on_lan": "Wake-on-LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Virtuelle Tastatur",
|
||||||
|
"action_bar_extension": "Verlängerung",
|
||||||
|
"action_bar_connection_stats": "Verbindungsstatistiken",
|
||||||
|
"action_bar_settings": "Einstellungen",
|
||||||
|
"action_bar_fullscreen": "Vollbild",
|
||||||
|
"action_bar_exit_fullscreen": "Vollbildmodus beenden",
|
||||||
|
"extensions_popover_extensions": "Erweiterungen",
|
||||||
|
"extension_popover_set_error_notification": "Fehler beim Festlegen der aktiven Erweiterung: {error}",
|
||||||
|
"extension_popover_unload_extension": "Erweiterung entladen",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Laden und verwalten Sie Ihre Erweiterungen",
|
||||||
|
"extensions_atx_power_control": "ATX-Stromsteuerung",
|
||||||
|
"extensions_atx_power_control_description": "Steuern Sie den Energiezustand Ihrer Maschine über die ATX-Energiesteuerung.",
|
||||||
|
"extensions_dc_power_control": "Gleichstromsteuerung",
|
||||||
|
"extensions_dc_power_control_description": "Steuern Sie Ihre DC-Stromerweiterung",
|
||||||
|
"extension_serial_console": "Serielle Konsole",
|
||||||
|
"extension_serial_console_description": "Greifen Sie auf Ihre serielle Konsolenerweiterung zu",
|
||||||
|
"atx_power_control_get_state_error": "ATX-Stromversorgungsstatus konnte nicht abgerufen werden: {error}",
|
||||||
|
"atx_power_control_send_action_error": "ATX-Stromversorgungsaktion {action} konnte nicht gesendet werden: {error}",
|
||||||
|
"atx_power_control_power_button": "Leistung",
|
||||||
|
"atx_power_control_short_power_button": "Kurzes Drücken",
|
||||||
|
"atx_power_control_long_power_button": "Langes Drücken",
|
||||||
|
"atx_power_control_reset_button": "Zurücksetzen",
|
||||||
|
"atx_power_control_power_led": "Betriebs-LED",
|
||||||
|
"atx_power_control_hdd_led": "Festplatten-LED",
|
||||||
|
"dc_power_control_get_state_error": "Der Gleichstromstatus konnte nicht abgerufen werden: {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "Der DC-Stromversorgungsstatus konnte nicht an {enabled} werden: {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "Der Status zur Wiederherstellung der Gleichstromversorgung konnte nicht an {state} gesendet werden: {error}",
|
||||||
|
"dc_power_control_power_on_button": "Einschalten",
|
||||||
|
"dc_power_control_power_off_button": "Ausschalten",
|
||||||
|
"dc_power_control_restore_power_state": "Wiederherstellung nach Stromausfall",
|
||||||
|
"dc_power_control_power_on_state": "Einschalten",
|
||||||
|
"dc_power_control_power_off_state": "Ausschalten",
|
||||||
|
"dc_power_control_voltage": "Stromspannung",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Aktuell",
|
||||||
|
"dc_power_control_current_unit": "A",
|
||||||
|
"dc_power_control_power": "Leistung",
|
||||||
|
"dc_power_control_power_unit": "W",
|
||||||
|
"serial_console_get_state_error": "Die seriellen Konsoleneinstellungen konnten nicht abgerufen werden: {error}",
|
||||||
|
"serial_console_set_power_state_error": "Die Einstellungen der seriellen Konsole konnten nicht auf {settings} festgelegt werden: {error}",
|
||||||
|
"serial_console_configure_description": "Konfigurieren Sie die Einstellungen Ihrer seriellen Konsole",
|
||||||
|
"serial_console_open_console": "Konsole öffnen",
|
||||||
|
"serial_console_baud_rate": "Baudrate",
|
||||||
|
"serial_console_data_bits": "Datenbits",
|
||||||
|
"serial_console_stop_bits": "Stoppbits",
|
||||||
|
"serial_console_parity": "Parität",
|
||||||
|
"serial_console_parity_even": "Gerade Parität",
|
||||||
|
"serial_console_parity_odd": "Ungerade Parität",
|
||||||
|
"serial_console_parity_none": "Keine Parität",
|
||||||
|
"serial_console_parity_mark": "Parität markieren",
|
||||||
|
"serial_console_parity_space": "Raumparität",
|
||||||
|
"serial_console_get_settings_error": "Die seriellen Konsoleneinstellungen konnten nicht abgerufen werden: {error}",
|
||||||
|
"serial_console_set_settings_error": "Die Einstellungen der seriellen Konsole konnten nicht auf {settings} festgelegt werden: {error}"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "Oh no!",
|
||||||
|
"something_went_wrong": "Something went wrong. Please try again later or contact support",
|
||||||
|
"jetkvm_logo": "JetKVM Logo",
|
||||||
|
"load": "Load",
|
||||||
|
"unknown_error": "Unknown error",
|
||||||
|
"action_bar_virtual_media": "Virtual Media",
|
||||||
|
"action_bar_paste_text": "Paste text",
|
||||||
|
"action_bar_web_terminal": "Web Terminal",
|
||||||
|
"action_bar_wake_on_lan": "Wake on LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Virtual Keyboard",
|
||||||
|
"action_bar_extension": "Extension",
|
||||||
|
"action_bar_connection_stats": "Connection Stats",
|
||||||
|
"action_bar_settings": "Settings",
|
||||||
|
"action_bar_fullscreen": "Fullscreen",
|
||||||
|
"action_bar_exit_fullscreen": "Exit Fullscreen",
|
||||||
|
"extensions_popover_extensions": "Extensions",
|
||||||
|
"extension_popover_set_error_notification": "Failed to set active extension: {error}",
|
||||||
|
"extension_popover_unload_extension": "Unload Extension",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Load and manage your extensions",
|
||||||
|
"extensions_atx_power_control": "ATX Power Control",
|
||||||
|
"extensions_atx_power_control_description": "Control the power state of your machine via ATX power control.",
|
||||||
|
"extensions_dc_power_control": "DC Power Control",
|
||||||
|
"extensions_dc_power_control_description": "Control your DC Power extension",
|
||||||
|
"extension_serial_console": "Serial Console",
|
||||||
|
"extension_serial_console_description": "Access your serial console extension",
|
||||||
|
"atx_power_control_get_state_error": "Failed to get ATX power state: {error}",
|
||||||
|
"atx_power_control_send_action_error": "Failed to send ATX power action {action}: {error}",
|
||||||
|
"atx_power_control_power_button": "Power",
|
||||||
|
"atx_power_control_short_power_button": "Short Press",
|
||||||
|
"atx_power_control_long_power_button": "Long Press",
|
||||||
|
"atx_power_control_reset_button": "Reset",
|
||||||
|
"atx_power_control_power_led": "Power LED",
|
||||||
|
"atx_power_control_hdd_led": "HDD LED",
|
||||||
|
"dc_power_control_get_state_error": "Failed to get DC power state: {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "Failed to send DC power state to {enabled}: {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "Failed to send DC power restore state to {state}: {error}",
|
||||||
|
"dc_power_control_power_on_button": "Power On",
|
||||||
|
"dc_power_control_power_off_button": "Power Off",
|
||||||
|
"dc_power_control_restore_power_state": "Restore Power Loss",
|
||||||
|
"dc_power_control_power_on_state": "Power ON",
|
||||||
|
"dc_power_control_power_off_state": "Power OFF",
|
||||||
|
"dc_power_control_voltage": "Voltage",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Current",
|
||||||
|
"dc_power_control_current_unit": "A",
|
||||||
|
"dc_power_control_power": "Power",
|
||||||
|
"dc_power_control_power_unit": "W",
|
||||||
|
"serial_console_get_settings_error": "Failed to get serial console settings: {error}",
|
||||||
|
"serial_console_set_settings_error": "Failed to set serial console settings to {settings}: {error}",
|
||||||
|
"serial_console_configure_description": "Configure your serial console settings",
|
||||||
|
"serial_console_open_console": "Open Console",
|
||||||
|
"serial_console_baud_rate": "Baud Rate",
|
||||||
|
"serial_console_data_bits": "Data Bits",
|
||||||
|
"serial_console_stop_bits": "Stop Bits",
|
||||||
|
"serial_console_parity": "Parity",
|
||||||
|
"serial_console_parity_even": "Even Parity",
|
||||||
|
"serial_console_parity_odd": "Odd Parity",
|
||||||
|
"serial_console_parity_none": "No Parity",
|
||||||
|
"serial_console_parity_mark": "Mark Parity",
|
||||||
|
"serial_console_parity_space": "Space Parity"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "¡Oh, no!",
|
||||||
|
"something_went_wrong": "Algo salió mal. Inténtalo de nuevo más tarde o contacta con el servicio de asistencia.",
|
||||||
|
"jetkvm_logo": "Logotipo de JetKVM",
|
||||||
|
"load": "Carga",
|
||||||
|
"unknown_error": "Error desconocido",
|
||||||
|
"action_bar_virtual_media": "Medios virtuales",
|
||||||
|
"action_bar_paste_text": "Pegar texto",
|
||||||
|
"action_bar_web_terminal": "Terminal web",
|
||||||
|
"action_bar_wake_on_lan": "Activación en LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Teclado virtual",
|
||||||
|
"action_bar_extension": "Extensión",
|
||||||
|
"action_bar_connection_stats": "Estadísticas de conexión",
|
||||||
|
"action_bar_settings": "Ajustes",
|
||||||
|
"action_bar_fullscreen": "Pantalla completa",
|
||||||
|
"action_bar_exit_fullscreen": "Salir de pantalla completa",
|
||||||
|
"extensions_popover_extensions": "Extensiones",
|
||||||
|
"extension_popover_set_error_notification": "No se pudo establecer la extensión activa: {error}",
|
||||||
|
"extension_popover_unload_extension": "Extensión de descarga",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Cargar y administrar sus extensiones",
|
||||||
|
"extensions_atx_power_control": "Control de alimentación ATX",
|
||||||
|
"extensions_atx_power_control_description": "Controle el estado de energía de su máquina a través del control de energía ATX.",
|
||||||
|
"extensions_dc_power_control": "Control de potencia de CC",
|
||||||
|
"extensions_dc_power_control_description": "Controle su extensión de alimentación de CC",
|
||||||
|
"extension_serial_console": "Consola serial",
|
||||||
|
"extension_serial_console_description": "Acceda a la extensión de su consola serie",
|
||||||
|
"atx_power_control_get_state_error": "No se pudo obtener el estado de energía ATX: {error}",
|
||||||
|
"atx_power_control_send_action_error": "No se pudo enviar la acción de alimentación ATX {action} : {error}",
|
||||||
|
"atx_power_control_power_button": "Fuerza",
|
||||||
|
"atx_power_control_short_power_button": "Prensa corta",
|
||||||
|
"atx_power_control_long_power_button": "Pulsación larga",
|
||||||
|
"atx_power_control_reset_button": "Reiniciar",
|
||||||
|
"atx_power_control_power_led": "LED de encendido",
|
||||||
|
"atx_power_control_hdd_led": "LED del disco duro",
|
||||||
|
"dc_power_control_get_state_error": "No se pudo obtener el estado de la alimentación de CC: {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "No se pudo enviar el estado de alimentación de CC a {enabled} : {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "No se pudo enviar el estado de restauración de energía de CC a {state} : {error}",
|
||||||
|
"dc_power_control_power_on_button": "Encendido",
|
||||||
|
"dc_power_control_power_off_button": "Apagado",
|
||||||
|
"dc_power_control_restore_power_state": "Restaurar pérdida de energía",
|
||||||
|
"dc_power_control_power_on_state": "Encendido",
|
||||||
|
"dc_power_control_power_off_state": "Apagado",
|
||||||
|
"dc_power_control_voltage": "Voltaje",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Amperio",
|
||||||
|
"dc_power_control_current_unit": "A",
|
||||||
|
"dc_power_control_power": "Vatio",
|
||||||
|
"dc_power_control_power_unit": "O",
|
||||||
|
"serial_console_get_state_error": "No se pudo obtener la configuración de la consola serial: {error}",
|
||||||
|
"serial_console_set_power_state_error": "No se pudieron establecer los ajustes de la consola serial en {settings} : {error}",
|
||||||
|
"serial_console_configure_description": "Configure los ajustes de su consola serie",
|
||||||
|
"serial_console_open_console": "Consola abierta",
|
||||||
|
"serial_console_baud_rate": "Tasa de Baud",
|
||||||
|
"serial_console_data_bits": "Bits de datos",
|
||||||
|
"serial_console_stop_bits": "Bits de parada",
|
||||||
|
"serial_console_parity": "Paridad",
|
||||||
|
"serial_console_parity_even": "Paridad uniforme",
|
||||||
|
"serial_console_parity_odd": "Paridad impar",
|
||||||
|
"serial_console_parity_none": "Sin paridad",
|
||||||
|
"serial_console_parity_mark": "Paridad de marca",
|
||||||
|
"serial_console_parity_space": "Paridad espacial",
|
||||||
|
"serial_console_get_settings_error": "No se pudo obtener la configuración de la consola serial: {error}",
|
||||||
|
"serial_console_set_settings_error": "No se pudieron establecer los ajustes de la consola serial en {settings} : {error}"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "Oh non!",
|
||||||
|
"something_went_wrong": "Une erreur s'est produite. Veuillez réessayer ultérieurement ou contacter le support.",
|
||||||
|
"jetkvm_logo": "Logo JetKVM",
|
||||||
|
"load": "Charger",
|
||||||
|
"unknown_error": "Erreur inconnue",
|
||||||
|
"action_bar_virtual_media": "Médias virtuels",
|
||||||
|
"action_bar_paste_text": "Coller du texte",
|
||||||
|
"action_bar_web_terminal": "Terminal Web",
|
||||||
|
"action_bar_wake_on_lan": "Réveil sur LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Clavier virtuel",
|
||||||
|
"action_bar_extension": "Extension",
|
||||||
|
"action_bar_connection_stats": "Statistiques de connexion",
|
||||||
|
"action_bar_settings": "Paramètres",
|
||||||
|
"action_bar_fullscreen": "Plein écran",
|
||||||
|
"action_bar_exit_fullscreen": "Quitter le plein écran",
|
||||||
|
"extensions_popover_extensions": "Extensions",
|
||||||
|
"extension_popover_set_error_notification": "Échec de la définition de l'extension active: {error}",
|
||||||
|
"extension_popover_unload_extension": "Extension de déchargement",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Chargez et gérez vos extensions",
|
||||||
|
"extensions_atx_power_control": "Contrôle d'alimentation ATX",
|
||||||
|
"extensions_atx_power_control_description": "Contrôlez l'état d'alimentation de votre machine via le contrôle d'alimentation ATX.",
|
||||||
|
"extensions_dc_power_control": "Contrôle de l'alimentation CC",
|
||||||
|
"extensions_dc_power_control_description": "Contrôlez votre extension d'alimentation CC",
|
||||||
|
"extension_serial_console": "Console série",
|
||||||
|
"extension_serial_console_description": "Accédez à votre extension de console série",
|
||||||
|
"atx_power_control_get_state_error": "Échec de l'obtention de l'état d'alimentation ATX : {error}",
|
||||||
|
"atx_power_control_send_action_error": "Échec de l'envoi de l'action d'alimentation ATX {action} : {error}",
|
||||||
|
"atx_power_control_power_button": "Pouvoir",
|
||||||
|
"atx_power_control_short_power_button": "Appui court",
|
||||||
|
"atx_power_control_long_power_button": "Appui long",
|
||||||
|
"atx_power_control_reset_button": "Réinitialiser",
|
||||||
|
"atx_power_control_power_led": "LED d'alimentation",
|
||||||
|
"atx_power_control_hdd_led": "Voyant du disque dur",
|
||||||
|
"dc_power_control_get_state_error": "Échec de l'obtention de l'état d'alimentation CC : {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "Échec de l'envoi de l'état d'alimentation CC à {enabled} : {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "Échec de l'envoi de l'état de restauration de l'alimentation CC à {state} : {error}",
|
||||||
|
"dc_power_control_power_on_button": "Mise sous tension",
|
||||||
|
"dc_power_control_power_off_button": "Éteindre",
|
||||||
|
"dc_power_control_restore_power_state": "Restaurer la perte de puissance",
|
||||||
|
"dc_power_control_power_on_state": "Mise sous tension",
|
||||||
|
"dc_power_control_power_off_state": "Éteindre",
|
||||||
|
"dc_power_control_voltage": "Tension",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Ampère",
|
||||||
|
"dc_power_control_current_unit": "UN",
|
||||||
|
"dc_power_control_power": "Pouvoir",
|
||||||
|
"dc_power_control_power_unit": "W",
|
||||||
|
"serial_console_get_state_error": "Échec de l'obtention des paramètres de la console série : {error}",
|
||||||
|
"serial_console_set_power_state_error": "Échec de la définition des paramètres de la console série sur {settings} : {error}",
|
||||||
|
"serial_console_configure_description": "Configurez les paramètres de votre console série",
|
||||||
|
"serial_console_open_console": "Ouvrir la console",
|
||||||
|
"serial_console_baud_rate": "Débit en bauds",
|
||||||
|
"serial_console_data_bits": "Bits de données",
|
||||||
|
"serial_console_stop_bits": "Bits d'arrêt",
|
||||||
|
"serial_console_parity": "Parité",
|
||||||
|
"serial_console_parity_even": "Parité égale",
|
||||||
|
"serial_console_parity_odd": "Parité impaire",
|
||||||
|
"serial_console_parity_none": "Pas de parité",
|
||||||
|
"serial_console_parity_mark": "Marquer la parité",
|
||||||
|
"serial_console_parity_space": "Parité spatiale",
|
||||||
|
"serial_console_get_settings_error": "Échec de l'obtention des paramètres de la console série : {error}",
|
||||||
|
"serial_console_set_settings_error": "Échec de la définition des paramètres de la console série sur {settings} : {error}"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "Oh no!",
|
||||||
|
"something_went_wrong": "Qualcosa è andato storto. Riprova più tardi o contatta l'assistenza.",
|
||||||
|
"jetkvm_logo": "Logo JetKVM",
|
||||||
|
"load": "Carico",
|
||||||
|
"unknown_error": "Errore sconosciuto",
|
||||||
|
"action_bar_virtual_media": "Media virtuali",
|
||||||
|
"action_bar_paste_text": "Incolla il testo",
|
||||||
|
"action_bar_web_terminal": "Terminale Web",
|
||||||
|
"action_bar_wake_on_lan": "Wake on LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Tastiera virtuale",
|
||||||
|
"action_bar_extension": "Estensione",
|
||||||
|
"action_bar_connection_stats": "Statistiche di connessione",
|
||||||
|
"action_bar_settings": "Impostazioni",
|
||||||
|
"action_bar_fullscreen": "A schermo intero",
|
||||||
|
"action_bar_exit_fullscreen": "Esci dalla modalità a schermo intero",
|
||||||
|
"extensions_popover_extensions": "Estensioni",
|
||||||
|
"extension_popover_set_error_notification": "Impossibile impostare l'estensione attiva: {error}",
|
||||||
|
"extension_popover_unload_extension": "Estensione di scaricamento",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Carica e gestisci le tue estensioni",
|
||||||
|
"extensions_atx_power_control": "Controllo di potenza ATX",
|
||||||
|
"extensions_atx_power_control_description": "Controlla lo stato di alimentazione del tuo computer tramite il controllo di alimentazione ATX.",
|
||||||
|
"extensions_dc_power_control": "Controllo di potenza CC",
|
||||||
|
"extensions_dc_power_control_description": "Controlla la tua estensione di alimentazione CC",
|
||||||
|
"extension_serial_console": "Console seriale",
|
||||||
|
"extension_serial_console_description": "Accedi all'estensione della tua console seriale",
|
||||||
|
"atx_power_control_get_state_error": "Impossibile ottenere lo stato di alimentazione ATX: {error}",
|
||||||
|
"atx_power_control_send_action_error": "Impossibile inviare l'azione di alimentazione ATX {action} : {error}",
|
||||||
|
"atx_power_control_power_button": "Energia",
|
||||||
|
"atx_power_control_short_power_button": "Pressione breve",
|
||||||
|
"atx_power_control_long_power_button": "Pressione lunga",
|
||||||
|
"atx_power_control_reset_button": "Reset",
|
||||||
|
"atx_power_control_power_led": "LED di potenza",
|
||||||
|
"atx_power_control_hdd_led": "LED dell'HDD",
|
||||||
|
"dc_power_control_get_state_error": "Impossibile ottenere lo stato di alimentazione CC: {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "Impossibile inviare lo stato di alimentazione CC a {enabled} : {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "Impossibile inviare lo stato di ripristino dell'alimentazione CC a {state} : {error}",
|
||||||
|
"dc_power_control_power_on_button": "Accensione",
|
||||||
|
"dc_power_control_power_off_button": "Spegnimento",
|
||||||
|
"dc_power_control_restore_power_state": "Ripristinare la perdita di potenza",
|
||||||
|
"dc_power_control_power_on_state": "Accensione",
|
||||||
|
"dc_power_control_power_off_state": "Spegnimento",
|
||||||
|
"dc_power_control_voltage": "Voltaggio",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Attuale",
|
||||||
|
"dc_power_control_current_unit": "UN",
|
||||||
|
"dc_power_control_power": "Energia",
|
||||||
|
"dc_power_control_power_unit": "O",
|
||||||
|
"serial_console_get_state_error": "Impossibile ottenere le impostazioni della console seriale: {error}",
|
||||||
|
"serial_console_set_power_state_error": "Impossibile impostare le impostazioni della console seriale su {settings} : {error}",
|
||||||
|
"serial_console_configure_description": "Configura le impostazioni della tua console seriale",
|
||||||
|
"serial_console_open_console": "Apri console",
|
||||||
|
"serial_console_baud_rate": "Velocità in baud",
|
||||||
|
"serial_console_data_bits": "Bit di dati",
|
||||||
|
"serial_console_stop_bits": "Bit di stop",
|
||||||
|
"serial_console_parity": "Parità",
|
||||||
|
"serial_console_parity_even": "Parità pari",
|
||||||
|
"serial_console_parity_odd": "Parità dispari",
|
||||||
|
"serial_console_parity_none": "Nessuna parità",
|
||||||
|
"serial_console_parity_mark": "Segna la parità",
|
||||||
|
"serial_console_parity_space": "Parità spaziale",
|
||||||
|
"serial_console_get_settings_error": "Impossibile ottenere le impostazioni della console seriale: {error}",
|
||||||
|
"serial_console_set_settings_error": "Impossibile impostare le impostazioni della console seriale su {settings} : {error}"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "Å nei!",
|
||||||
|
"something_went_wrong": "Noe gikk galt. Prøv igjen senere, eller kontakt kundestøtte.",
|
||||||
|
"jetkvm_logo": "JetKVM-logo",
|
||||||
|
"load": "Laste",
|
||||||
|
"unknown_error": "Ukjent feil",
|
||||||
|
"action_bar_virtual_media": "Virtuelle medier",
|
||||||
|
"action_bar_paste_text": "Lim inn tekst",
|
||||||
|
"action_bar_web_terminal": "Nettterminal",
|
||||||
|
"action_bar_wake_on_lan": "Vekk på LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Virtuelt tastatur",
|
||||||
|
"action_bar_extension": "Forlengelse",
|
||||||
|
"action_bar_connection_stats": "Tilkoblingsstatistikk",
|
||||||
|
"action_bar_settings": "Innstillinger",
|
||||||
|
"action_bar_fullscreen": "Fullskjerm",
|
||||||
|
"action_bar_exit_fullscreen": "Avslutt fullskjerm",
|
||||||
|
"extensions_popover_extensions": "Utvidelser",
|
||||||
|
"extension_popover_set_error_notification": "Klarte ikke å angi aktiv utvidelse: {error}",
|
||||||
|
"extension_popover_unload_extension": "Fjern utvidelse",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Last inn og administrer utvidelsene dine",
|
||||||
|
"extensions_atx_power_control": "ATX-strømstyring",
|
||||||
|
"extensions_atx_power_control_description": "Kontroller maskinens strømstatus via ATX-strømkontroll.",
|
||||||
|
"extensions_dc_power_control": "DC-strømkontroll",
|
||||||
|
"extensions_dc_power_control_description": "Kontroller DC-strømutvidelsen din",
|
||||||
|
"extension_serial_console": "Seriell konsoll",
|
||||||
|
"extension_serial_console_description": "Få tilgang til seriekonsollutvidelsen din",
|
||||||
|
"atx_power_control_get_state_error": "Klarte ikke å hente ATX-strømstatus: {error}",
|
||||||
|
"atx_power_control_send_action_error": "Kunne ikke sende ATX-strømhandling {action} : {error}",
|
||||||
|
"atx_power_control_power_button": "Makt",
|
||||||
|
"atx_power_control_short_power_button": "Kort trykk",
|
||||||
|
"atx_power_control_long_power_button": "Langt trykk",
|
||||||
|
"atx_power_control_reset_button": "Tilbakestill",
|
||||||
|
"atx_power_control_power_led": "Strøm-LED",
|
||||||
|
"atx_power_control_hdd_led": "HDD-LED",
|
||||||
|
"dc_power_control_get_state_error": "Klarte ikke å hente likestrømsstatus: {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "Kunne ikke sende likestrømsstatus til {enabled} : {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "Kunne ikke sende gjenopprettingsstatus for likestrøm til {state} : {error}",
|
||||||
|
"dc_power_control_power_on_button": "Slå på",
|
||||||
|
"dc_power_control_power_off_button": "Slå av",
|
||||||
|
"dc_power_control_restore_power_state": "Gjenopprett strømtap",
|
||||||
|
"dc_power_control_power_on_state": "Slå PÅ",
|
||||||
|
"dc_power_control_power_off_state": "Slå av",
|
||||||
|
"dc_power_control_voltage": "Spenning",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Nåværende",
|
||||||
|
"dc_power_control_current_unit": "EN",
|
||||||
|
"dc_power_control_power": "Makt",
|
||||||
|
"dc_power_control_power_unit": "V",
|
||||||
|
"serial_console_get_state_error": "Klarte ikke å hente innstillinger for seriell konsoll: {error}",
|
||||||
|
"serial_console_set_power_state_error": "Klarte ikke å sette innstillingene for seriell konsoll til {settings} : {error}",
|
||||||
|
"serial_console_configure_description": "Konfigurer innstillingene for seriekonsollen",
|
||||||
|
"serial_console_open_console": "Åpne konsollen",
|
||||||
|
"serial_console_baud_rate": "Baudhastighet",
|
||||||
|
"serial_console_data_bits": "Databiter",
|
||||||
|
"serial_console_stop_bits": "Stoppbiter",
|
||||||
|
"serial_console_parity": "Paritet",
|
||||||
|
"serial_console_parity_even": "Paritet",
|
||||||
|
"serial_console_parity_odd": "Oddeparitet",
|
||||||
|
"serial_console_parity_none": "Ingen paritet",
|
||||||
|
"serial_console_parity_mark": "Mark Paritet",
|
||||||
|
"serial_console_parity_space": "Romparitet",
|
||||||
|
"serial_console_get_settings_error": "Klarte ikke å hente innstillinger for seriell konsoll: {error}",
|
||||||
|
"serial_console_set_settings_error": "Klarte ikke å sette innstillingene for seriell konsoll til {settings} : {error}"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "nej då!",
|
||||||
|
"something_went_wrong": "Något gick fel. Försök igen senare eller kontakta supporten.",
|
||||||
|
"jetkvm_logo": "JetKVM-logotyp",
|
||||||
|
"load": "Ladda",
|
||||||
|
"unknown_error": "Okänt fel",
|
||||||
|
"action_bar_virtual_media": "Virtuella medier",
|
||||||
|
"action_bar_paste_text": "Klistra in text",
|
||||||
|
"action_bar_web_terminal": "Webbterminal",
|
||||||
|
"action_bar_wake_on_lan": "Vakna på LAN",
|
||||||
|
"action_bar_virtual_keyboard": "Virtuellt tangentbord",
|
||||||
|
"action_bar_extension": "Förlängning",
|
||||||
|
"action_bar_connection_stats": "Anslutningsstatistik",
|
||||||
|
"action_bar_settings": "Inställningar",
|
||||||
|
"action_bar_fullscreen": "Helskärm",
|
||||||
|
"action_bar_exit_fullscreen": "Avsluta helskärm",
|
||||||
|
"extensions_popover_extensions": "Tillägg",
|
||||||
|
"extension_popover_set_error_notification": "Misslyckades med att ange aktivt tillägg: {error}",
|
||||||
|
"extension_popover_unload_extension": "Avlasta tillägg",
|
||||||
|
"extension_popover_load_and_manage_extensions": "Ladda och hantera dina tillägg",
|
||||||
|
"extensions_atx_power_control": "ATX-strömkontroll",
|
||||||
|
"extensions_atx_power_control_description": "Styr din maskins strömförsörjning via ATX-strömkontroll.",
|
||||||
|
"extensions_dc_power_control": "DC-strömstyrning",
|
||||||
|
"extensions_dc_power_control_description": "Styr din DC-strömförlängning",
|
||||||
|
"extension_serial_console": "Seriell konsol",
|
||||||
|
"extension_serial_console_description": "Åtkomst till din seriella konsoltillägg",
|
||||||
|
"atx_power_control_get_state_error": "Misslyckades med att hämta ATX-strömstatus: {error}",
|
||||||
|
"atx_power_control_send_action_error": "Misslyckades med att skicka ATX-strömåtgärd {action} : {error}",
|
||||||
|
"atx_power_control_power_button": "Driva",
|
||||||
|
"atx_power_control_short_power_button": "Kort tryck",
|
||||||
|
"atx_power_control_long_power_button": "Långt tryck",
|
||||||
|
"atx_power_control_reset_button": "Återställa",
|
||||||
|
"atx_power_control_power_led": "Ström-LED",
|
||||||
|
"atx_power_control_hdd_led": "Hårddisk-LED",
|
||||||
|
"dc_power_control_get_state_error": "Misslyckades med att hämta likströmsstatus: {error}",
|
||||||
|
"dc_power_control_set_power_state_error": "Misslyckades med att skicka likströmsstatus till {enabled} : {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "Misslyckades med att skicka återställningsstatus för likström till {state} : {error}",
|
||||||
|
"dc_power_control_power_on_button": "Slå på",
|
||||||
|
"dc_power_control_power_off_button": "Stäng av",
|
||||||
|
"dc_power_control_restore_power_state": "Återställ strömförlust",
|
||||||
|
"dc_power_control_power_on_state": "Slå på",
|
||||||
|
"dc_power_control_power_off_state": "Stäng av",
|
||||||
|
"dc_power_control_voltage": "Spänning",
|
||||||
|
"dc_power_control_voltage_unit": "V",
|
||||||
|
"dc_power_control_current": "Nuvarande",
|
||||||
|
"dc_power_control_current_unit": "En",
|
||||||
|
"dc_power_control_power": "Driva",
|
||||||
|
"dc_power_control_power_unit": "V",
|
||||||
|
"serial_console_get_state_error": "Misslyckades med att hämta inställningar för seriekonsolen: {error}",
|
||||||
|
"serial_console_set_power_state_error": "Misslyckades med att ställa in seriekonsolinställningarna till {settings} : {error}",
|
||||||
|
"serial_console_configure_description": "Konfigurera dina seriella konsolinställningar",
|
||||||
|
"serial_console_open_console": "Öppna konsolen",
|
||||||
|
"serial_console_baud_rate": "Baudhastighet",
|
||||||
|
"serial_console_data_bits": "Databitar",
|
||||||
|
"serial_console_stop_bits": "Stoppbitar",
|
||||||
|
"serial_console_parity": "Paritet",
|
||||||
|
"serial_console_parity_even": "Jämn paritet",
|
||||||
|
"serial_console_parity_odd": "Udda paritet",
|
||||||
|
"serial_console_parity_none": "Ingen paritet",
|
||||||
|
"serial_console_parity_mark": "Markera paritet",
|
||||||
|
"serial_console_parity_space": "Rymdparitet",
|
||||||
|
"serial_console_get_settings_error": "Misslyckades med att hämta inställningar för seriekonsolen: {error}",
|
||||||
|
"serial_console_set_settings_error": "Misslyckades med att ställa in seriekonsolinställningarna till {settings} : {error}"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||||
|
"jetkvm": "JetKVM",
|
||||||
|
"oh_no": "噢不!",
|
||||||
|
"something_went_wrong": "出了点问题。请稍后重试或联系客服",
|
||||||
|
"jetkvm_logo": "JetKVM 徽标",
|
||||||
|
"load": "加载",
|
||||||
|
"unknown_error": "未知错误",
|
||||||
|
"action_bar_virtual_media": "虚拟媒体",
|
||||||
|
"action_bar_paste_text": "粘贴文本",
|
||||||
|
"action_bar_web_terminal": "网页终端",
|
||||||
|
"action_bar_wake_on_lan": "局域网唤醒",
|
||||||
|
"action_bar_virtual_keyboard": "虚拟键盘",
|
||||||
|
"action_bar_extension": "扩大",
|
||||||
|
"action_bar_connection_stats": "连接统计",
|
||||||
|
"action_bar_settings": "设置",
|
||||||
|
"action_bar_fullscreen": "全屏",
|
||||||
|
"action_bar_exit_fullscreen": "退出全屏",
|
||||||
|
"extensions_popover_extensions": "扩展",
|
||||||
|
"extension_popover_set_error_notification": "无法设置活动扩展:{error}",
|
||||||
|
"extension_popover_unload_extension": "卸载扩展",
|
||||||
|
"extension_popover_load_and_manage_extensions": "加载和管理您的扩展",
|
||||||
|
"extensions_atx_power_control": "ATX电源控制",
|
||||||
|
"extensions_atx_power_control_description": "通过 ATX 电源控制来控制机器的电源状态。",
|
||||||
|
"extensions_dc_power_control": "直流电源控制",
|
||||||
|
"extensions_dc_power_control_description": "控制您的直流电源扩展",
|
||||||
|
"extension_serial_console": "串行控制台",
|
||||||
|
"extension_serial_console_description": "访问串行控制台扩展",
|
||||||
|
"atx_power_control_get_state_error": "无法获取 ATX 电源状态:{error}",
|
||||||
|
"atx_power_control_send_action_error": "无法发送 ATX 电源操作{action} : {error}",
|
||||||
|
"atx_power_control_power_button": "力量",
|
||||||
|
"atx_power_control_short_power_button": "短按",
|
||||||
|
"atx_power_control_long_power_button": "长按",
|
||||||
|
"atx_power_control_reset_button": "重置",
|
||||||
|
"atx_power_control_power_led": "电源 LED",
|
||||||
|
"atx_power_control_hdd_led": "硬盘指示灯",
|
||||||
|
"dc_power_control_get_state_error": "无法获取直流电源状态:{error}",
|
||||||
|
"dc_power_control_set_power_state_error": "无法将直流电源状态发送到 {enabled} : {error}",
|
||||||
|
"dc_power_control_set_restore_state_error": "无法将直流电源恢复状态发送到 {state} : {error}",
|
||||||
|
"dc_power_control_power_on_button": "开机",
|
||||||
|
"dc_power_control_power_off_button": "关闭电源",
|
||||||
|
"dc_power_control_restore_power_state": "恢复断电",
|
||||||
|
"dc_power_control_power_on_state": "开启电源",
|
||||||
|
"dc_power_control_power_off_state": "关闭电源",
|
||||||
|
"dc_power_control_voltage": "电压",
|
||||||
|
"dc_power_control_voltage_unit": "五",
|
||||||
|
"dc_power_control_current": "安培",
|
||||||
|
"dc_power_control_current_unit": "一个",
|
||||||
|
"dc_power_control_power": "瓦特",
|
||||||
|
"dc_power_control_power_unit": "西",
|
||||||
|
"serial_console_get_state_error": "无法获取串行控制台设置: {error}",
|
||||||
|
"serial_console_set_power_state_error": "无法将串行控制台设置设置为{settings} : {error}",
|
||||||
|
"serial_console_configure_description": "配置串行控制台设置",
|
||||||
|
"serial_console_open_console": "打开控制台",
|
||||||
|
"serial_console_baud_rate": "波特率",
|
||||||
|
"serial_console_data_bits": "数据位",
|
||||||
|
"serial_console_stop_bits": "停止位",
|
||||||
|
"serial_console_parity": "平价",
|
||||||
|
"serial_console_parity_even": "偶校验",
|
||||||
|
"serial_console_parity_odd": "奇校验",
|
||||||
|
"serial_console_parity_none": "无奇偶校验",
|
||||||
|
"serial_console_parity_mark": "马克·帕里蒂",
|
||||||
|
"serial_console_parity_space": "空间平价",
|
||||||
|
"serial_console_get_settings_error": "无法获取串行控制台设置: {error}",
|
||||||
|
"serial_console_set_settings_error": "无法将串行控制台设置设置为{settings} : {error}"
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "kvm-ui",
|
"name": "kvm-ui",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2025.09.26.01300",
|
"version": "2025.10.03.1500",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^22.15.0"
|
"node": "^22.15.0"
|
||||||
|
|
@ -11,12 +11,14 @@
|
||||||
"dev:ssl": "USE_SSL=true ./dev_device.sh",
|
"dev:ssl": "USE_SSL=true ./dev_device.sh",
|
||||||
"dev:cloud": "vite dev --mode=cloud-development",
|
"dev:cloud": "vite dev --mode=cloud-development",
|
||||||
"build": "npm run build:prod",
|
"build": "npm run build:prod",
|
||||||
"build:device": "tsc && vite build --mode=device --emptyOutDir",
|
"build:device": "npm run paraglide && tsc && vite build --mode=device --emptyOutDir",
|
||||||
"build:staging": "tsc && vite build --mode=cloud-staging",
|
"build:staging": "npm run paraglide && tsc && vite build --mode=cloud-staging",
|
||||||
"build:prod": "tsc && vite build --mode=cloud-production",
|
"build:prod": "npm run paraglide && tsc && vite build --mode=cloud-production",
|
||||||
"lint": "eslint './src/**/*.{ts,tsx}'",
|
"lint": "npm run paraglide && eslint './src/**/*.{ts,tsx}'",
|
||||||
"lint:fix": "eslint './src/**/*.{ts,tsx}' --fix",
|
"lint:fix": "npm run paraglide && eslint './src/**/*.{ts,tsx}' --fix",
|
||||||
"preview": "vite preview"
|
"paraglide": "paraglide-js compile --project ./localization/jetKVM.UI.inlang --outdir ./localization/paraglide",
|
||||||
|
"validate": "inlang validate --project ./localization/jetKVM.UI.inlang",
|
||||||
|
"machine-translate": "inlang machine translate --project ./localization/jetKVM.UI.inlang"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/react": "^2.2.9",
|
"@headlessui/react": "^2.2.9",
|
||||||
|
|
@ -36,13 +38,13 @@
|
||||||
"framer-motion": "^12.23.22",
|
"framer-motion": "^12.23.22",
|
||||||
"lodash.throttle": "^4.1.1",
|
"lodash.throttle": "^4.1.1",
|
||||||
"mini-svg-data-uri": "^1.4.4",
|
"mini-svg-data-uri": "^1.4.4",
|
||||||
"react": "^19.1.1",
|
"react": "^19.2.0",
|
||||||
"react-animate-height": "^3.2.3",
|
"react-animate-height": "^3.2.3",
|
||||||
"react-dom": "^19.1.1",
|
"react-dom": "^19.2.0",
|
||||||
"react-hot-toast": "^2.6.0",
|
"react-hot-toast": "^2.6.0",
|
||||||
"react-icons": "^5.5.0",
|
"react-icons": "^5.5.0",
|
||||||
"react-router": "^7.9.3",
|
"react-router": "^7.9.3",
|
||||||
"react-simple-keyboard": "^3.8.122",
|
"react-simple-keyboard": "^3.8.126",
|
||||||
"react-use-websocket": "^4.13.0",
|
"react-use-websocket": "^4.13.0",
|
||||||
"react-xtermjs": "^1.0.10",
|
"react-xtermjs": "^1.0.10",
|
||||||
"recharts": "^3.2.1",
|
"recharts": "^3.2.1",
|
||||||
|
|
@ -54,32 +56,37 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/compat": "^1.4.0",
|
"@eslint/compat": "^1.4.0",
|
||||||
"@eslint/eslintrc": "^3.3.1",
|
"@eslint/eslintrc": "^3.3.1",
|
||||||
"@eslint/js": "^9.36.0",
|
"@eslint/js": "^9.37.0",
|
||||||
|
"@inlang/cli": "^3.0.12",
|
||||||
|
"@inlang/paraglide-js": "^2.4.0",
|
||||||
|
"@inlang/plugin-m-function-matcher": "^2.1.0",
|
||||||
|
"@inlang/plugin-message-format": "^4.0.0",
|
||||||
|
"@inlang/sdk": "^2.4.9",
|
||||||
"@tailwindcss/forms": "^0.5.10",
|
"@tailwindcss/forms": "^0.5.10",
|
||||||
"@tailwindcss/postcss": "^4.1.13",
|
"@tailwindcss/postcss": "^4.1.14",
|
||||||
"@tailwindcss/typography": "^0.5.19",
|
"@tailwindcss/typography": "^0.5.19",
|
||||||
"@tailwindcss/vite": "^4.1.13",
|
"@tailwindcss/vite": "^4.1.14",
|
||||||
"@types/react": "^19.1.14",
|
"@types/react": "^19.2.0",
|
||||||
"@types/react-dom": "^19.1.9",
|
"@types/react-dom": "^19.2.0",
|
||||||
"@types/semver": "^7.7.1",
|
"@types/semver": "^7.7.1",
|
||||||
"@types/validator": "^13.15.3",
|
"@types/validator": "^13.15.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.44.1",
|
"@typescript-eslint/eslint-plugin": "^8.45.0",
|
||||||
"@typescript-eslint/parser": "^8.44.1",
|
"@typescript-eslint/parser": "^8.45.0",
|
||||||
"@vitejs/plugin-react-swc": "^4.1.0",
|
"@vitejs/plugin-react-swc": "^4.1.0",
|
||||||
"autoprefixer": "^10.4.21",
|
"autoprefixer": "^10.4.21",
|
||||||
"eslint": "^9.36.0",
|
"eslint": "^9.36.0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-import": "^2.32.0",
|
"eslint-plugin-import": "^2.32.0",
|
||||||
"eslint-plugin-react": "^7.37.5",
|
"eslint-plugin-react": "^7.37.5",
|
||||||
"eslint-plugin-react-hooks": "^5.2.0",
|
"eslint-plugin-react-hooks": "^6.1.0",
|
||||||
"eslint-plugin-react-refresh": "^0.4.22",
|
"eslint-plugin-react-refresh": "^0.4.23",
|
||||||
"globals": "^16.4.0",
|
"globals": "^16.4.0",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"prettier": "^3.6.2",
|
"prettier": "^3.6.2",
|
||||||
"prettier-plugin-tailwindcss": "^0.6.14",
|
"prettier-plugin-tailwindcss": "^0.6.14",
|
||||||
"tailwindcss": "^4.1.13",
|
"tailwindcss": "^4.1.14",
|
||||||
"typescript": "^5.9.2",
|
"typescript": "^5.9.3",
|
||||||
"vite": "^7.1.7",
|
"vite": "^7.1.9",
|
||||||
"vite-tsconfig-paths": "^5.1.4"
|
"vite-tsconfig-paths": "^5.1.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,25 @@
|
||||||
|
import { Fragment, useCallback, useRef } from "react";
|
||||||
import { MdOutlineContentPasteGo } from "react-icons/md";
|
import { MdOutlineContentPasteGo } from "react-icons/md";
|
||||||
import { LuCable, LuHardDrive, LuMaximize, LuSettings, LuSignal } from "react-icons/lu";
|
import { LuCable, LuHardDrive, LuMaximize, LuSettings, LuSignal } from "react-icons/lu";
|
||||||
import { FaKeyboard } from "react-icons/fa6";
|
import { FaKeyboard } from "react-icons/fa6";
|
||||||
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/react";
|
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/react";
|
||||||
import { Fragment, useCallback, useRef } from "react";
|
|
||||||
import { CommandLineIcon } from "@heroicons/react/20/solid";
|
import { CommandLineIcon } from "@heroicons/react/20/solid";
|
||||||
|
|
||||||
import { Button } from "@components/Button";
|
|
||||||
import {
|
import {
|
||||||
useHidStore,
|
useHidStore,
|
||||||
useMountMediaStore,
|
useMountMediaStore,
|
||||||
useSettingsStore,
|
useSettingsStore,
|
||||||
useUiStore,
|
useUiStore,
|
||||||
} from "@/hooks/stores";
|
} from "@hooks/stores";
|
||||||
import Container from "@components/Container";
|
|
||||||
import { cx } from "@/cva.config";
|
import { cx } from "@/cva.config";
|
||||||
import PasteModal from "@/components/popovers/PasteModal";
|
import { Button } from "@components/Button";
|
||||||
import WakeOnLanModal from "@/components/popovers/WakeOnLan/Index";
|
import Container from "@components/Container";
|
||||||
import MountPopopover from "@/components/popovers/MountPopover";
|
import PasteModal from "@components/popovers/PasteModal";
|
||||||
import ExtensionPopover from "@/components/popovers/ExtensionPopover";
|
import WakeOnLanModal from "@components/popovers/WakeOnLan/Index";
|
||||||
import { useDeviceUiNavigation } from "@/hooks/useAppNavigation";
|
import MountPopopover from "@components/popovers/MountPopover";
|
||||||
|
import ExtensionPopover from "@components/popovers/ExtensionPopover";
|
||||||
|
import { useDeviceUiNavigation } from "@hooks/useAppNavigation";
|
||||||
|
import { m } from "@localizations/messages.js";
|
||||||
|
|
||||||
export default function Actionbar({
|
export default function Actionbar({
|
||||||
requestFullscreen,
|
requestFullscreen,
|
||||||
|
|
@ -28,10 +29,7 @@ export default function Actionbar({
|
||||||
const { navigateTo } = useDeviceUiNavigation();
|
const { navigateTo } = useDeviceUiNavigation();
|
||||||
const { isVirtualKeyboardEnabled, setVirtualKeyboardEnabled } = useHidStore();
|
const { isVirtualKeyboardEnabled, setVirtualKeyboardEnabled } = useHidStore();
|
||||||
const { setDisableVideoFocusTrap, terminalType, setTerminalType, toggleSidebarView } = useUiStore();
|
const { setDisableVideoFocusTrap, terminalType, setTerminalType, toggleSidebarView } = useUiStore();
|
||||||
|
const { remoteVirtualMediaState } = useMountMediaStore();
|
||||||
const remoteVirtualMediaState = useMountMediaStore(
|
|
||||||
state => state.remoteVirtualMediaState,
|
|
||||||
);
|
|
||||||
const { developerMode } = useSettingsStore();
|
const { developerMode } = useSettingsStore();
|
||||||
|
|
||||||
// This is the only way to get a reliable state change for the popover
|
// This is the only way to get a reliable state change for the popover
|
||||||
|
|
@ -64,7 +62,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Web Terminal"
|
text={m.action_bar_web_terminal()}
|
||||||
LeadingIcon={({ className }) => <CommandLineIcon className={className} />}
|
LeadingIcon={({ className }) => <CommandLineIcon className={className} />}
|
||||||
onClick={() => setTerminalType(terminalType === "kvm" ? "none" : "kvm")}
|
onClick={() => setTerminalType(terminalType === "kvm" ? "none" : "kvm")}
|
||||||
/>
|
/>
|
||||||
|
|
@ -74,7 +72,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Paste text"
|
text={m.action_bar_paste_text()}
|
||||||
LeadingIcon={MdOutlineContentPasteGo}
|
LeadingIcon={MdOutlineContentPasteGo}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setDisableVideoFocusTrap(true);
|
setDisableVideoFocusTrap(true);
|
||||||
|
|
@ -105,7 +103,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Virtual Media"
|
text={m.action_bar_virtual_media()}
|
||||||
LeadingIcon={({ className }) => {
|
LeadingIcon={({ className }) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
@ -148,7 +146,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Wake on LAN"
|
text={m.action_bar_wake_on_lan()}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setDisableVideoFocusTrap(true);
|
setDisableVideoFocusTrap(true);
|
||||||
}}
|
}}
|
||||||
|
|
@ -198,7 +196,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Virtual Keyboard"
|
text={m.action_bar_virtual_keyboard()}
|
||||||
LeadingIcon={FaKeyboard}
|
LeadingIcon={FaKeyboard}
|
||||||
onClick={() => setVirtualKeyboardEnabled(!isVirtualKeyboardEnabled)}
|
onClick={() => setVirtualKeyboardEnabled(!isVirtualKeyboardEnabled)}
|
||||||
/>
|
/>
|
||||||
|
|
@ -211,7 +209,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Extension"
|
text={m.action_bar_extension()}
|
||||||
LeadingIcon={LuCable}
|
LeadingIcon={LuCable}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setDisableVideoFocusTrap(true);
|
setDisableVideoFocusTrap(true);
|
||||||
|
|
@ -237,7 +235,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Virtual Keyboard"
|
text={m.action_bar_virtual_keyboard()}
|
||||||
LeadingIcon={FaKeyboard}
|
LeadingIcon={FaKeyboard}
|
||||||
onClick={() => setVirtualKeyboardEnabled(!isVirtualKeyboardEnabled)}
|
onClick={() => setVirtualKeyboardEnabled(!isVirtualKeyboardEnabled)}
|
||||||
/>
|
/>
|
||||||
|
|
@ -246,7 +244,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Connection Stats"
|
text={m.action_bar_connection_stats()}
|
||||||
LeadingIcon={({ className }) => (
|
LeadingIcon={({ className }) => (
|
||||||
<LuSignal
|
<LuSignal
|
||||||
className={cx(className, "mb-0.5 text-green-500")}
|
className={cx(className, "mb-0.5 text-green-500")}
|
||||||
|
|
@ -262,7 +260,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Settings"
|
text={m.action_bar_settings()}
|
||||||
LeadingIcon={LuSettings}
|
LeadingIcon={LuSettings}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setDisableVideoFocusTrap(true);
|
setDisableVideoFocusTrap(true);
|
||||||
|
|
@ -276,7 +274,7 @@ export default function Actionbar({
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Fullscreen"
|
text={m.action_bar_fullscreen()}
|
||||||
LeadingIcon={LuMaximize}
|
LeadingIcon={LuMaximize}
|
||||||
onClick={() => requestFullscreen()}
|
onClick={() => requestFullscreen()}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import { LuHardDrive, LuPower, LuRotateCcw } from "react-icons/lu";
|
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
import { LuHardDrive, LuPower, LuRotateCcw } from "react-icons/lu";
|
||||||
|
|
||||||
|
import { m } from "@localizations/messages.js";
|
||||||
|
import { JsonRpcResponse, useJsonRpc } from "@hooks/useJsonRpc";
|
||||||
import { Button } from "@components/Button";
|
import { Button } from "@components/Button";
|
||||||
import Card from "@components/Card";
|
import Card from "@components/Card";
|
||||||
|
import LoadingSpinner from "@components/LoadingSpinner";
|
||||||
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
||||||
import notifications from "@/notifications";
|
import notifications from "@/notifications";
|
||||||
import LoadingSpinner from "@/components/LoadingSpinner";
|
|
||||||
|
|
||||||
import { JsonRpcResponse, useJsonRpc } from "../../hooks/useJsonRpc";
|
|
||||||
|
|
||||||
const LONG_PRESS_DURATION = 3000; // 3 seconds for long press
|
const LONG_PRESS_DURATION = 3000; // 3 seconds for long press
|
||||||
|
|
||||||
|
|
@ -33,9 +33,7 @@ export function ATXPowerControl() {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
send("getATXState", {}, (resp: JsonRpcResponse) => {
|
send("getATXState", {}, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.atx_power_control_get_state_error({ error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to get ATX state: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setAtxState(resp.result as ATXState);
|
setAtxState(resp.result as ATXState);
|
||||||
|
|
@ -56,9 +54,7 @@ export function ATXPowerControl() {
|
||||||
console.log("Sending long press ATX power action");
|
console.log("Sending long press ATX power action");
|
||||||
send("setATXPowerAction", { action: "power-long" }, (resp: JsonRpcResponse) => {
|
send("setATXPowerAction", { action: "power-long" }, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.atx_power_control_send_action_error({ action: m.atx_power_control_long_power_button(), error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to send ATX power action: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
setIsPowerPressed(false);
|
setIsPowerPressed(false);
|
||||||
});
|
});
|
||||||
|
|
@ -77,9 +73,7 @@ export function ATXPowerControl() {
|
||||||
console.log("Sending short press ATX power action");
|
console.log("Sending short press ATX power action");
|
||||||
send("setATXPowerAction", { action: "power-short" }, (resp: JsonRpcResponse) => {
|
send("setATXPowerAction", { action: "power-short" }, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.atx_power_control_send_action_error({ action: m.atx_power_control_short_power_button(), error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to send ATX power action: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -98,8 +92,8 @@ export function ATXPowerControl() {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<SettingsPageHeader
|
<SettingsPageHeader
|
||||||
title="ATX Power Control"
|
title={m.extensions_atx_power_control()}
|
||||||
description="Control your ATX power settings"
|
description={m.extensions_atx_power_control_description()}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{atxState === null ? (
|
{atxState === null ? (
|
||||||
|
|
@ -115,7 +109,7 @@ export function ATXPowerControl() {
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="light"
|
theme="light"
|
||||||
LeadingIcon={LuPower}
|
LeadingIcon={LuPower}
|
||||||
text="Power"
|
text={m.atx_power_control_power_button()}
|
||||||
onMouseDown={() => handlePowerPress(true)}
|
onMouseDown={() => handlePowerPress(true)}
|
||||||
onMouseUp={() => handlePowerPress(false)}
|
onMouseUp={() => handlePowerPress(false)}
|
||||||
onMouseLeave={() => handlePowerPress(false)}
|
onMouseLeave={() => handlePowerPress(false)}
|
||||||
|
|
@ -125,13 +119,11 @@ export function ATXPowerControl() {
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="light"
|
theme="light"
|
||||||
LeadingIcon={LuRotateCcw}
|
LeadingIcon={LuRotateCcw}
|
||||||
text="Reset"
|
text={m.atx_power_control_reset_button()}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
send("setATXPowerAction", { action: "reset" }, (resp: JsonRpcResponse) => {
|
send("setATXPowerAction", { action: "reset" }, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.atx_power_control_send_action_error({ action: m.atx_power_control_reset_button(), error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to send ATX power action: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -150,7 +142,7 @@ export function ATXPowerControl() {
|
||||||
atxState?.power ? "text-green-600" : "text-slate-300"
|
atxState?.power ? "text-green-600" : "text-slate-300"
|
||||||
}`}
|
}`}
|
||||||
/>
|
/>
|
||||||
Power LED
|
{m.atx_power_control_power_led()}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
|
|
@ -161,7 +153,7 @@ export function ATXPowerControl() {
|
||||||
atxState?.hdd ? "text-blue-400" : "text-slate-300"
|
atxState?.hdd ? "text-blue-400" : "text-slate-300"
|
||||||
}`}
|
}`}
|
||||||
/>
|
/>
|
||||||
HDD LED
|
{m.atx_power_control_hdd_led()}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
import { LuPower } from "react-icons/lu";
|
|
||||||
import { useCallback, useEffect, useState } from "react";
|
import { useCallback, useEffect, useState } from "react";
|
||||||
|
import { LuPower } from "react-icons/lu";
|
||||||
|
|
||||||
|
import { m } from "@localizations/messages.js";
|
||||||
|
import { JsonRpcResponse, useJsonRpc } from "@/hooks/useJsonRpc";
|
||||||
import { Button } from "@components/Button";
|
import { Button } from "@components/Button";
|
||||||
import Card from "@components/Card";
|
import Card from "@components/Card";
|
||||||
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
||||||
import { JsonRpcResponse, useJsonRpc } from "@/hooks/useJsonRpc";
|
|
||||||
import notifications from "@/notifications";
|
|
||||||
import FieldLabel from "@components/FieldLabel";
|
import FieldLabel from "@components/FieldLabel";
|
||||||
import LoadingSpinner from "@components/LoadingSpinner";
|
import LoadingSpinner from "@components/LoadingSpinner";
|
||||||
import {SelectMenuBasic} from "@components/SelectMenuBasic";
|
import {SelectMenuBasic} from "@components/SelectMenuBasic";
|
||||||
|
import notifications from "@/notifications";
|
||||||
|
|
||||||
interface DCPowerState {
|
interface DCPowerState {
|
||||||
isOn: boolean;
|
isOn: boolean;
|
||||||
|
|
@ -25,9 +26,7 @@ export function DCPowerControl() {
|
||||||
const getDCPowerState = useCallback(() => {
|
const getDCPowerState = useCallback(() => {
|
||||||
send("getDCPowerState", {}, (resp: JsonRpcResponse) => {
|
send("getDCPowerState", {}, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.dc_power_control_get_state_error({ error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to get DC power state: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setPowerState(resp.result as DCPowerState);
|
setPowerState(resp.result as DCPowerState);
|
||||||
|
|
@ -37,9 +36,7 @@ export function DCPowerControl() {
|
||||||
const handlePowerToggle = (enabled: boolean) => {
|
const handlePowerToggle = (enabled: boolean) => {
|
||||||
send("setDCPowerState", { enabled }, (resp: JsonRpcResponse) => {
|
send("setDCPowerState", { enabled }, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.dc_power_control_set_power_state_error({ enabled: enabled, error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to set DC power state: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
getDCPowerState(); // Refresh state after change
|
getDCPowerState(); // Refresh state after change
|
||||||
|
|
@ -49,17 +46,13 @@ export function DCPowerControl() {
|
||||||
// const state = powerState?.restoreState === 0 ? 1 : powerState?.restoreState === 1 ? 2 : 0;
|
// const state = powerState?.restoreState === 0 ? 1 : powerState?.restoreState === 1 ? 2 : 0;
|
||||||
send("setDCRestoreState", { state }, (resp: JsonRpcResponse) => {
|
send("setDCRestoreState", { state }, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.dc_power_control_set_restore_state_error({ state: state, error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to set DC power state: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
getDCPowerState(); // Refresh state after change
|
getDCPowerState(); // Refresh state after change
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getDCPowerState();
|
getDCPowerState();
|
||||||
// Set up polling interval to update status
|
// Set up polling interval to update status
|
||||||
|
|
@ -70,8 +63,8 @@ export function DCPowerControl() {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<SettingsPageHeader
|
<SettingsPageHeader
|
||||||
title="DC Power Control"
|
title={m.extensions_dc_power_control()}
|
||||||
description="Control your DC power settings"
|
description={m.extensions_dc_power_control_description()}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{powerState === null ? (
|
{powerState === null ? (
|
||||||
|
|
@ -87,7 +80,7 @@ export function DCPowerControl() {
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="light"
|
theme="light"
|
||||||
LeadingIcon={LuPower}
|
LeadingIcon={LuPower}
|
||||||
text="Power On"
|
text={m.dc_power_control_power_on_button()}
|
||||||
onClick={() => handlePowerToggle(true)}
|
onClick={() => handlePowerToggle(true)}
|
||||||
disabled={powerState.isOn}
|
disabled={powerState.isOn}
|
||||||
/>
|
/>
|
||||||
|
|
@ -95,7 +88,7 @@ export function DCPowerControl() {
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="light"
|
theme="light"
|
||||||
LeadingIcon={LuPower}
|
LeadingIcon={LuPower}
|
||||||
text="Power Off"
|
text={m.dc_power_control_power_off_button()}
|
||||||
disabled={!powerState.isOn}
|
disabled={!powerState.isOn}
|
||||||
onClick={() => handlePowerToggle(false)}
|
onClick={() => handlePowerToggle(false)}
|
||||||
/>
|
/>
|
||||||
|
|
@ -104,13 +97,13 @@ export function DCPowerControl() {
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<SelectMenuBasic
|
<SelectMenuBasic
|
||||||
size="SM"
|
size="SM"
|
||||||
label="Restore Power Loss"
|
label={m.dc_power_control_restore_power_state()}
|
||||||
value={powerState.restoreState}
|
value={powerState.restoreState}
|
||||||
onChange={e => handleRestoreChange(parseInt(e.target.value))}
|
onChange={e => handleRestoreChange(parseInt(e.target.value))}
|
||||||
options={[
|
options={[
|
||||||
{ value: '0', label: "Power OFF" },
|
{ value: '0', label: m.dc_power_control_power_off_state()},
|
||||||
{ value: '1', label: "Power ON" },
|
{ value: '1', label: m.dc_power_control_power_on_state()},
|
||||||
{ value: '2', label: "Last State" },
|
{ value: '2', label: m.dc_power_control_restore_power_state() },
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -120,21 +113,21 @@ export function DCPowerControl() {
|
||||||
{/* Status Display */}
|
{/* Status Display */}
|
||||||
<div className="grid grid-cols-3 gap-4">
|
<div className="grid grid-cols-3 gap-4">
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<FieldLabel label="Voltage" />
|
<FieldLabel label={m.dc_power_control_voltage()} />
|
||||||
<p className="text-sm font-medium text-slate-900 dark:text-slate-100">
|
<p className="text-sm font-medium text-slate-900 dark:text-slate-100">
|
||||||
{powerState.voltage.toFixed(1)}V
|
{powerState.voltage.toFixed(1)} {m.dc_power_control_voltage_unit()}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<FieldLabel label="Current" />
|
<FieldLabel label={m.dc_power_control_current()} />
|
||||||
<p className="text-sm font-medium text-slate-900 dark:text-slate-100">
|
<p className="text-sm font-medium text-slate-900 dark:text-slate-100">
|
||||||
{powerState.current.toFixed(1)}A
|
{powerState.current.toFixed(1)} {m.dc_power_control_current_unit()}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<FieldLabel label="Power" />
|
<FieldLabel label={m.dc_power_control_power()}/>
|
||||||
<p className="text-sm font-medium text-slate-900 dark:text-slate-100">
|
<p className="text-sm font-medium text-slate-900 dark:text-slate-100">
|
||||||
{powerState.power.toFixed(1)}W
|
{powerState.power.toFixed(1)} {m.dc_power_control_power_unit()}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
import { LuTerminal } from "react-icons/lu";
|
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
import { LuTerminal } from "react-icons/lu";
|
||||||
|
|
||||||
|
import { m } from "@localizations/messages.js";
|
||||||
|
import { JsonRpcResponse, useJsonRpc } from "@hooks/useJsonRpc";
|
||||||
|
import { useUiStore } from "@hooks/stores";
|
||||||
import { Button } from "@components/Button";
|
import { Button } from "@components/Button";
|
||||||
import Card from "@components/Card";
|
import Card from "@components/Card";
|
||||||
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
|
||||||
import { JsonRpcResponse, useJsonRpc } from "@/hooks/useJsonRpc";
|
|
||||||
import notifications from "@/notifications";
|
|
||||||
import { useUiStore } from "@/hooks/stores";
|
|
||||||
import { SelectMenuBasic } from "@components/SelectMenuBasic";
|
import { SelectMenuBasic } from "@components/SelectMenuBasic";
|
||||||
|
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
||||||
|
import notifications from "@/notifications";
|
||||||
|
|
||||||
interface SerialSettings {
|
interface SerialSettings {
|
||||||
baudRate: string;
|
baudRate: string;
|
||||||
|
|
@ -28,9 +29,7 @@ export function SerialConsole() {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
send("getSerialSettings", {}, (resp: JsonRpcResponse) => {
|
send("getSerialSettings", {}, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.serial_console_get_settings_error({ error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to get serial settings: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setSettings(resp.result as SerialSettings);
|
setSettings(resp.result as SerialSettings);
|
||||||
|
|
@ -41,9 +40,7 @@ export function SerialConsole() {
|
||||||
const newSettings = { ...settings, [setting]: value };
|
const newSettings = { ...settings, [setting]: value };
|
||||||
send("setSerialSettings", { settings: newSettings }, (resp: JsonRpcResponse) => {
|
send("setSerialSettings", { settings: newSettings }, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(m.serial_console_set_settings_error({ settings: setting, error: resp.error.data || m.unknown_error() }));
|
||||||
`Failed to update serial settings: ${resp.error.data || "Unknown error"}`,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setSettings(newSettings);
|
setSettings(newSettings);
|
||||||
|
|
@ -54,8 +51,8 @@ export function SerialConsole() {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<SettingsPageHeader
|
<SettingsPageHeader
|
||||||
title="Serial Console"
|
title={m.extension_serial_console()}
|
||||||
description="Configure your serial console settings"
|
description={m.serial_console_configure_description()}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Card className="animate-fadeIn opacity-0">
|
<Card className="animate-fadeIn opacity-0">
|
||||||
|
|
@ -66,10 +63,10 @@ export function SerialConsole() {
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="primary"
|
theme="primary"
|
||||||
LeadingIcon={LuTerminal}
|
LeadingIcon={LuTerminal}
|
||||||
text="Open Console"
|
text={m.serial_console_open_console()}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setTerminalType("serial");
|
|
||||||
console.log("Opening serial console with settings: ", settings);
|
console.log("Opening serial console with settings: ", settings);
|
||||||
|
setTerminalType("serial");
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -77,7 +74,7 @@ export function SerialConsole() {
|
||||||
{/* Settings */}
|
{/* Settings */}
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
<SelectMenuBasic
|
<SelectMenuBasic
|
||||||
label="Baud Rate"
|
label={m.serial_console_baud_rate()}
|
||||||
options={[
|
options={[
|
||||||
{ label: "1200", value: "1200" },
|
{ label: "1200", value: "1200" },
|
||||||
{ label: "2400", value: "2400" },
|
{ label: "2400", value: "2400" },
|
||||||
|
|
@ -93,7 +90,7 @@ export function SerialConsole() {
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<SelectMenuBasic
|
<SelectMenuBasic
|
||||||
label="Data Bits"
|
label={m.serial_console_data_bits()}
|
||||||
options={[
|
options={[
|
||||||
{ label: "8", value: "8" },
|
{ label: "8", value: "8" },
|
||||||
{ label: "7", value: "7" },
|
{ label: "7", value: "7" },
|
||||||
|
|
@ -103,7 +100,7 @@ export function SerialConsole() {
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<SelectMenuBasic
|
<SelectMenuBasic
|
||||||
label="Stop Bits"
|
label={m.serial_console_stop_bits()}
|
||||||
options={[
|
options={[
|
||||||
{ label: "1", value: "1" },
|
{ label: "1", value: "1" },
|
||||||
{ label: "1.5", value: "1.5" },
|
{ label: "1.5", value: "1.5" },
|
||||||
|
|
@ -114,11 +111,13 @@ export function SerialConsole() {
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<SelectMenuBasic
|
<SelectMenuBasic
|
||||||
label="Parity"
|
label={m.serial_console_parity()}
|
||||||
options={[
|
options={[
|
||||||
{ label: "None", value: "none" },
|
{ label: m.serial_console_parity_none(), value: "none" },
|
||||||
{ label: "Even", value: "even" },
|
{ label: m.serial_console_parity_even(), value: "even" },
|
||||||
{ label: "Odd", value: "odd" },
|
{ label: m.serial_console_parity_odd(), value: "odd" },
|
||||||
|
{ label: m.serial_console_parity_mark(), value: "mark" },
|
||||||
|
{ label: m.serial_console_parity_space(), value: "space" },
|
||||||
]}
|
]}
|
||||||
value={settings.parity}
|
value={settings.parity}
|
||||||
onChange={e => handleSettingChange("parity", e.target.value)}
|
onChange={e => handleSettingChange("parity", e.target.value)}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { LuPower, LuTerminal, LuPlugZap } from "react-icons/lu";
|
import { LuPower, LuTerminal, LuPlugZap } from "react-icons/lu";
|
||||||
|
|
||||||
import { JsonRpcResponse, useJsonRpc } from "@/hooks/useJsonRpc";
|
import { m } from "@localizations/messages.js";
|
||||||
|
import { JsonRpcResponse, useJsonRpc } from "@hooks/useJsonRpc";
|
||||||
import Card, { GridCard } from "@components/Card";
|
import Card, { GridCard } from "@components/Card";
|
||||||
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
||||||
import { ATXPowerControl } from "@components/extensions/ATXPowerControl";
|
import { ATXPowerControl } from "@components/extensions/ATXPowerControl";
|
||||||
|
|
@ -20,20 +21,20 @@ interface Extension {
|
||||||
const AVAILABLE_EXTENSIONS: Extension[] = [
|
const AVAILABLE_EXTENSIONS: Extension[] = [
|
||||||
{
|
{
|
||||||
id: "atx-power",
|
id: "atx-power",
|
||||||
name: "ATX Power Control",
|
name: m.extensions_atx_power_control(),
|
||||||
description: "Control your ATX Power extension",
|
description: m.extensions_atx_power_control_description(),
|
||||||
icon: LuPower,
|
icon: LuPower,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "dc-power",
|
id: "dc-power",
|
||||||
name: "DC Power Control",
|
name: m.extensions_dc_power_control(),
|
||||||
description: "Control your DC Power extension",
|
description: m.extensions_dc_power_control(),
|
||||||
icon: LuPlugZap,
|
icon: LuPlugZap,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "serial-console",
|
id: "serial-console",
|
||||||
name: "Serial Console",
|
name: m.extension_serial_console(),
|
||||||
description: "Access your serial console extension",
|
description: m.extension_serial_console_description(),
|
||||||
icon: LuTerminal,
|
icon: LuTerminal,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
@ -60,7 +61,7 @@ export default function ExtensionPopover() {
|
||||||
send("setActiveExtension", { extensionId: extension?.id || "" }, (resp: JsonRpcResponse) => {
|
send("setActiveExtension", { extensionId: extension?.id || "" }, (resp: JsonRpcResponse) => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(
|
||||||
`Failed to set active extension: ${resp.error.data || "Unknown error"}`,
|
m.extension_popover_set_error_notification({ error: resp.error.data || m.unknown_error() }),
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -101,7 +102,7 @@ export default function ExtensionPopover() {
|
||||||
<Button
|
<Button
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Unload Extension"
|
text={m.extension_popover_unload_extension()}
|
||||||
onClick={() => handleSetActiveExtension(null)}
|
onClick={() => handleSetActiveExtension(null)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -110,8 +111,8 @@ export default function ExtensionPopover() {
|
||||||
// Extensions List View
|
// Extensions List View
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<SettingsPageHeader
|
<SettingsPageHeader
|
||||||
title="Extensions"
|
title={m.extensions_popover_extensions()}
|
||||||
description="Load and manage your extensions"
|
description={m.extension_popover_load_and_manage_extensions()}
|
||||||
/>
|
/>
|
||||||
<Card className="animate-fadeIn opacity-0" >
|
<Card className="animate-fadeIn opacity-0" >
|
||||||
<div className="w-full divide-y divide-slate-700/30 dark:divide-slate-600/30">
|
<div className="w-full divide-y divide-slate-700/30 dark:divide-slate-600/30">
|
||||||
|
|
@ -131,7 +132,7 @@ export default function ExtensionPopover() {
|
||||||
<Button
|
<Button
|
||||||
size="XS"
|
size="XS"
|
||||||
theme="light"
|
theme="light"
|
||||||
text="Load"
|
text={m.load()}
|
||||||
onClick={() => handleSetActiveExtension(extension)}
|
onClick={() => handleSetActiveExtension(extension)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -153,13 +153,13 @@ body {
|
||||||
|
|
||||||
@property --grid-color-start {
|
@property --grid-color-start {
|
||||||
syntax: "<color>";
|
syntax: "<color>";
|
||||||
initial-value: var(--color-blue-50/10);
|
initial-value: oklch(97% 0.014 254.604 / 10); /* var(--color-blue-50/10) */
|
||||||
inherits: false;
|
inherits: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@property --grid-color-end {
|
@property --grid-color-end {
|
||||||
syntax: "<color>";
|
syntax: "<color>";
|
||||||
initial-value: var(--color-blue-50/100);
|
initial-value: oklch(97% 0.014 254.604 / 100); /* var(--color-blue-50/100) */
|
||||||
inherits: false;
|
inherits: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,8 +175,8 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.group:hover .grid-card {
|
.group:hover .grid-card {
|
||||||
--grid-color-start: var(--color-blue-100/50);
|
--grid-color-start: oklch(from var(--color-blue-100) l c h / 50);
|
||||||
--grid-color-end: var(--color-blue-50/50);
|
--grid-color-end: oklch(from var(--color-blue-50) l c h / 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
video::-webkit-media-controls {
|
video::-webkit-media-controls {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { lazy } from "react";
|
import { lazy } from "react";
|
||||||
import ReactDOM from "react-dom/client";
|
import ReactDOM from "react-dom/client";
|
||||||
import "./index.css";
|
|
||||||
import {
|
import {
|
||||||
createBrowserRouter,
|
createBrowserRouter,
|
||||||
isRouteErrorResponse,
|
isRouteErrorResponse,
|
||||||
|
|
@ -8,11 +7,13 @@ import {
|
||||||
RouterProvider,
|
RouterProvider,
|
||||||
useRouteError,
|
useRouteError,
|
||||||
} from "react-router";
|
} from "react-router";
|
||||||
|
import "./index.css";
|
||||||
import { ExclamationTriangleIcon } from "@heroicons/react/16/solid";
|
import { ExclamationTriangleIcon } from "@heroicons/react/16/solid";
|
||||||
|
|
||||||
import { CLOUD_API, DEVICE_API } from "@/ui.config";
|
import { CLOUD_API, DEVICE_API } from "@/ui.config";
|
||||||
import api from "@/api";
|
import api from "@/api";
|
||||||
import Root from "@/root";
|
import Root from "@/root";
|
||||||
|
import { m } from "@localizations/messages.js";
|
||||||
import Card from "@components/Card";
|
import Card from "@components/Card";
|
||||||
import EmptyCard from "@components/EmptyCard";
|
import EmptyCard from "@components/EmptyCard";
|
||||||
import NotFoundPage from "@components/NotFoundPage";
|
import NotFoundPage from "@components/NotFoundPage";
|
||||||
|
|
@ -28,12 +29,12 @@ import DeviceIdRename from "@routes/devices.$id.rename";
|
||||||
import DevicesRoute from "@routes/devices";
|
import DevicesRoute from "@routes/devices";
|
||||||
import SettingsIndexRoute from "@routes/devices.$id.settings._index";
|
import SettingsIndexRoute from "@routes/devices.$id.settings._index";
|
||||||
import SettingsAccessIndexRoute from "@routes/devices.$id.settings.access._index";
|
import SettingsAccessIndexRoute from "@routes/devices.$id.settings.access._index";
|
||||||
import Notifications from "@/notifications";
|
import Notifications from "@/notifications";
|
||||||
const SignupRoute = lazy(() => import("@routes/signup"));
|
const SignupRoute = lazy(() => import("@routes/signup"));
|
||||||
const LoginRoute = lazy(() => import("@routes/login"));
|
const LoginRoute = lazy(() => import("@routes/login"));
|
||||||
const DevicesAlreadyAdopted = lazy(() => import("@routes/devices.already-adopted"));
|
const DevicesAlreadyAdopted = lazy(() => import("@routes/devices.already-adopted"));
|
||||||
const OtherSessionRoute = lazy(() => import("@routes/devices.$id.other-session"));
|
const OtherSessionRoute = lazy(() => import("@routes/devices.$id.other-session"));
|
||||||
const MountRoute = lazy(() => import("./routes/devices.$id.mount"));
|
const MountRoute = lazy(() => import("@routes/devices.$id.mount"));
|
||||||
const SettingsRoute = lazy(() => import("@routes/devices.$id.settings"));
|
const SettingsRoute = lazy(() => import("@routes/devices.$id.settings"));
|
||||||
const SettingsMouseRoute = lazy(() => import("@routes/devices.$id.settings.mouse"));
|
const SettingsMouseRoute = lazy(() => import("@routes/devices.$id.settings.mouse"));
|
||||||
const SettingsKeyboardRoute = lazy(() => import("@routes/devices.$id.settings.keyboard"));
|
const SettingsKeyboardRoute = lazy(() => import("@routes/devices.$id.settings.keyboard"));
|
||||||
|
|
@ -404,8 +405,8 @@ function ErrorBoundary() {
|
||||||
<div className="w-full max-w-2xl">
|
<div className="w-full max-w-2xl">
|
||||||
<EmptyCard
|
<EmptyCard
|
||||||
IconElm={ExclamationTriangleIcon}
|
IconElm={ExclamationTriangleIcon}
|
||||||
headline="Oh no!"
|
headline={m.oh_no()}
|
||||||
description="Something went wrong. Please try again later or contact support"
|
description={m.something_went_wrong()}
|
||||||
BtnElm={
|
BtnElm={
|
||||||
errorMessage && (
|
errorMessage && (
|
||||||
<Card>
|
<Card>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { useNavigate } from "react-router";
|
|
||||||
import { useCallback } from "react";
|
import { useCallback } from "react";
|
||||||
|
import { useNavigate } from "react-router";
|
||||||
|
|
||||||
import { useJsonRpc } from "@/hooks/useJsonRpc";
|
import { useJsonRpc } from "@hooks/useJsonRpc";
|
||||||
import { Button } from "@components/Button";
|
import { Button } from "@components/Button";
|
||||||
|
|
||||||
export default function SettingsGeneralRebootRoute() {
|
export default function SettingsGeneralRebootRoute() {
|
||||||
|
|
@ -10,7 +10,7 @@ export default function SettingsGeneralRebootRoute() {
|
||||||
|
|
||||||
const onConfirmUpdate = useCallback(() => {
|
const onConfirmUpdate = useCallback(() => {
|
||||||
// This is where we send the RPC to the golang binary
|
// This is where we send the RPC to the golang binary
|
||||||
send("reboot", {force: true});
|
send("reboot", { force: true });
|
||||||
}, [send]);
|
}, [send]);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
@ -30,10 +30,10 @@ export function Dialog({
|
||||||
return (
|
return (
|
||||||
<div className="pointer-events-auto relative mx-auto text-left">
|
<div className="pointer-events-auto relative mx-auto text-left">
|
||||||
<div>
|
<div>
|
||||||
<ConfirmationBox
|
<ConfirmationBox
|
||||||
onYes={onConfirmUpdate}
|
onYes={onConfirmUpdate}
|
||||||
onNo={onClose}
|
onNo={onClose}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { cx } from "cva";
|
|
||||||
import { redirect } from "react-router";
|
import { redirect } from "react-router";
|
||||||
import type { LoaderFunction } from "react-router";
|
import type { LoaderFunction } from "react-router";
|
||||||
|
import { cx } from "cva";
|
||||||
|
|
||||||
|
import api from "@/api";
|
||||||
|
import { DEVICE_API } from "@/ui.config";
|
||||||
import GridBackground from "@components/GridBackground";
|
import GridBackground from "@components/GridBackground";
|
||||||
import Container from "@components/Container";
|
import Container from "@components/Container";
|
||||||
import { LinkButton } from "@components/Button";
|
import { LinkButton } from "@components/Button";
|
||||||
import LogoBlueIcon from "@/assets/logo-blue.png";
|
import LogoBlueIcon from "@assets/logo-blue.png";
|
||||||
import LogoWhiteIcon from "@/assets/logo-white.svg";
|
import LogoWhiteIcon from "@assets/logo-white.svg";
|
||||||
import DeviceImage from "@/assets/jetkvm-device-still.png";
|
import DeviceImage from "@assets/jetkvm-device-still.png";
|
||||||
import LogoMark from "@/assets/logo-mark.png";
|
import LogoMark from "@assets/logo-mark.png";
|
||||||
import { DEVICE_API } from "@/ui.config";
|
import { m } from "@localizations/messages.js";
|
||||||
|
|
||||||
import api from "../api";
|
|
||||||
|
|
||||||
export interface DeviceStatus {
|
export interface DeviceStatus {
|
||||||
isSetup: boolean;
|
isSetup: boolean;
|
||||||
|
|
@ -49,7 +49,7 @@ export default function WelcomeRoute() {
|
||||||
<div className="animate-fadeIn animation-delay-1000 flex items-center justify-center opacity-0">
|
<div className="animate-fadeIn animation-delay-1000 flex items-center justify-center opacity-0">
|
||||||
<img
|
<img
|
||||||
src={LogoWhiteIcon}
|
src={LogoWhiteIcon}
|
||||||
alt="JetKVM Logo"
|
alt={m.jetkvm_logo()}
|
||||||
className="hidden h-[32px] dark:block"
|
className="hidden h-[32px] dark:block"
|
||||||
/>
|
/>
|
||||||
<img
|
<img
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,14 @@
|
||||||
"target": "ES2020",
|
"target": "ES2020",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
"lib": ["ES2021", "DOM", "DOM.Iterable"],
|
"lib": [
|
||||||
|
"ES2021",
|
||||||
|
"DOM",
|
||||||
|
"DOM.Iterable"
|
||||||
|
],
|
||||||
"module": "ESNext",
|
"module": "ESNext",
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
|
"allowJs": true,
|
||||||
/* Bundler mode */
|
/* Bundler mode */
|
||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"allowImportingTsExtensions": false,
|
"allowImportingTsExtensions": false,
|
||||||
|
|
@ -18,19 +23,42 @@
|
||||||
"noUnusedLocals": true,
|
"noUnusedLocals": true,
|
||||||
"noUnusedParameters": true,
|
"noUnusedParameters": true,
|
||||||
"noFallthroughCasesInSwitch": true,
|
"noFallthroughCasesInSwitch": true,
|
||||||
"types": ["vite/client"],
|
"erasableSyntaxOnly": true,
|
||||||
|
"noUncheckedSideEffectImports": true,
|
||||||
|
"types": [
|
||||||
|
"vite/client"
|
||||||
|
],
|
||||||
/* Import Aliases */
|
/* Import Aliases */
|
||||||
"paths": {
|
"paths": {
|
||||||
"@components/*": ["./src/components/*"],
|
"@components/*": [
|
||||||
"@routes/*": ["./src/routes/*"],
|
"./src/components/*"
|
||||||
"@assets/*": ["./src/assets/*"],
|
],
|
||||||
"@/*": ["./src/*"]
|
"@routes/*": [
|
||||||
|
"./src/routes/*"
|
||||||
|
],
|
||||||
|
"@hooks/*": [
|
||||||
|
"./src/hooks/*"
|
||||||
|
],
|
||||||
|
"@providers/*": [
|
||||||
|
"./src/providers/*"
|
||||||
|
],
|
||||||
|
"@assets/*": [
|
||||||
|
"./src/assets/*"
|
||||||
|
],
|
||||||
|
"@localizations/*": [
|
||||||
|
"./localization/paraglide/*"
|
||||||
|
],
|
||||||
|
"@/*": [
|
||||||
|
"./src/*"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["src"],
|
"include": [
|
||||||
|
"src"
|
||||||
|
],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "./tsconfig.node.json"
|
"path": "./tsconfig.node.json"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"composite": true,
|
"composite": true,
|
||||||
"skipLibCheck": true,
|
/* Bundler mode */
|
||||||
"module": "ESNext",
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"strict": true
|
|
||||||
},
|
},
|
||||||
"include": ["vite.config.ts"]
|
"include": [
|
||||||
}
|
"vite.config.ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@ import react from "@vitejs/plugin-react-swc";
|
||||||
import tailwindcss from "@tailwindcss/vite";
|
import tailwindcss from "@tailwindcss/vite";
|
||||||
import tsconfigPaths from "vite-tsconfig-paths";
|
import tsconfigPaths from "vite-tsconfig-paths";
|
||||||
import basicSsl from "@vitejs/plugin-basic-ssl";
|
import basicSsl from "@vitejs/plugin-basic-ssl";
|
||||||
|
import { paraglideVitePlugin } from "@inlang/paraglide-js";
|
||||||
|
|
||||||
declare const process: {
|
declare const process: {
|
||||||
env: {
|
env: {
|
||||||
|
|
@ -22,10 +23,20 @@ export default defineConfig(({ mode, command }) => {
|
||||||
tsconfigPaths(),
|
tsconfigPaths(),
|
||||||
react()
|
react()
|
||||||
];
|
];
|
||||||
|
|
||||||
if (useSSL) {
|
if (useSSL) {
|
||||||
plugins.push(basicSsl());
|
plugins.push(basicSsl());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
plugins.push(paraglideVitePlugin({
|
||||||
|
project: "./localization/jetKVM.UI.inlang",
|
||||||
|
outdir: "./localization/paraglide",
|
||||||
|
outputStructure: 'message-modules',
|
||||||
|
cookieName: 'JETKVM_LOCALE',
|
||||||
|
localStorageKey: 'JETKVM_LOCALE',
|
||||||
|
strategy: ['cookie', 'localStorage', 'preferredLanguage', 'baseLocale'],
|
||||||
|
}))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
plugins,
|
plugins,
|
||||||
esbuild: {
|
esbuild: {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue