mirror of
https://github.com/karl0ss/homepage.git
synced 2025-04-29 12:03:41 +01:00
Merge branch 'dev'
This commit is contained in:
commit
b2d75a99e7
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,3 +1,14 @@
|
||||
<!--
|
||||
==== STOP ====================
|
||||
======== STOP ================
|
||||
============ STOP ============
|
||||
================ STOP ========
|
||||
==================== STOP ====
|
||||
|
||||
⚠️ Before opening this pull request please review the guidelines in the checklist below.
|
||||
If this PR does not meet those guidelines it will not be accepted, and everyone will be sad.
|
||||
-->
|
||||
|
||||
## Proposed change
|
||||
|
||||
<!--
|
||||
|
2
.github/workflows/docker-publish.yml
vendored
2
.github/workflows/docker-publish.yml
vendored
@ -118,7 +118,7 @@ jobs:
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' && !(github.event_name == 'push' && startsWith(github.ref, 'refs/heads/feature')) }}
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: |
|
||||
|
4
.github/workflows/repo-maintenance.yml
vendored
4
.github/workflows/repo-maintenance.yml
vendored
@ -212,9 +212,9 @@ jobs:
|
||||
}
|
||||
|
||||
const CUTOFF_1_DAYS = 180;
|
||||
const CUTOFF_1_COUNT = 5;
|
||||
const CUTOFF_1_COUNT = 10;
|
||||
const CUTOFF_2_DAYS = 365;
|
||||
const CUTOFF_2_COUNT = 10;
|
||||
const CUTOFF_2_COUNT = 20;
|
||||
|
||||
const cutoff1Date = new Date();
|
||||
cutoff1Date.setDate(cutoff1Date.getDate() - CUTOFF_1_DAYS);
|
||||
|
@ -52,7 +52,7 @@ Homepage has built-in support for Docker, and can automatically discover and add
|
||||
|
||||
## Service Widgets
|
||||
|
||||
Homepage also has support for over 100 3rd party services, including all popular starr apps, and most popular self-hosted apps. Some examples include: Radarr, Sonarr, Lidarr, Bazarr, Ombi, Tautulli, Plex, Jellyfin, Emby, Transmission, qBittorrent, Deluge, Jackett, NZBGet, SABnzbd, etc. As well as service integrations, Homepage also has a number of information providers, sourcing information from a variety of external 3rd party APIs. See the [Service](https://gethomepage.dev/widgets/) page for more information.
|
||||
Homepage also has support for hundreds of 3rd-party services, including all popular \*arr apps, and most popular self-hosted apps. Some examples include: Radarr, Sonarr, Lidarr, Bazarr, Ombi, Tautulli, Plex, Jellyfin, Emby, Transmission, qBittorrent, Deluge, Jackett, NZBGet, SABnzbd, etc. As well as service integrations, Homepage also has a number of information providers, sourcing information from a variety of external 3rd-party APIs. See the [Service](https://gethomepage.dev/widgets/) page for more information.
|
||||
|
||||
## Information Widgets
|
||||
|
||||
|
@ -153,6 +153,18 @@ labels:
|
||||
- homepage.widget.fields=["field1","field2"] # optional
|
||||
```
|
||||
|
||||
Multiple widgets can be specified by incrementing the index, e.g.
|
||||
|
||||
```yaml
|
||||
labels: ...
|
||||
- homepage.widget[0].type=emby
|
||||
- homepage.widget[0].url=http://emby.home
|
||||
- homepage.widget[0].key=yourembyapikeyhere
|
||||
- homepage.widget[1].type=uptimekuma
|
||||
- homepage.widget[1].url=http://uptimekuma.home
|
||||
- homepage.widget[1].slug=youreventslughere
|
||||
```
|
||||
|
||||
You can add specify fields for e.g. the [CustomAPI](../widgets/services/customapi.md) widget by using array-style dot notation:
|
||||
|
||||
```yaml
|
||||
|
24
docs/configs/info-widgets.md
Normal file
24
docs/configs/info-widgets.md
Normal file
@ -0,0 +1,24 @@
|
||||
---
|
||||
title: Information Widgets
|
||||
description: Homepage info widgets.
|
||||
---
|
||||
|
||||
Information widgets are widgets that provide information about your system or environment and are displayed at the top of the homepage. You can find a list of all available info widgets under the [Info Widgets](../widgets/info/index.md) section.
|
||||
|
||||
Info widgets are defined in the widgets.yaml
|
||||
|
||||
Each widget has its own configuration options, which are detailed in the widget's documentation.
|
||||
|
||||
## Layout
|
||||
|
||||
Info widgets are displayed in the order they are defined in the `widgets.yaml` file. You can change the order by moving the widgets around in the file. However, some widgets (weather, search and datetime) are aligned to the right side of the screen which can affect the layout of the widgets.
|
||||
|
||||
## Adding A Link
|
||||
|
||||
You can add a link to an info widget such as the logo or text widgets by adding an `href` option, for example:
|
||||
|
||||
```yaml
|
||||
logo:
|
||||
href: https://example.com
|
||||
target: _blank # Optional, can be set in settings
|
||||
```
|
@ -1,40 +0,0 @@
|
||||
---
|
||||
title: Service Widgets
|
||||
description: Service Widget Configuration
|
||||
---
|
||||
|
||||
Unless otherwise noted, URLs should not end with a `/` or other API path. Each widget will handle the path on its own.
|
||||
|
||||
Each service can have one widget attached to it (often matching the service type, but that's not forced).
|
||||
|
||||
In addition to the href of the service, you can also specify the target location in which to open that link. See [Link Target](settings.md#link-target) for more details.
|
||||
|
||||
Using Emby as an example, this is how you would attach the Emby service widget.
|
||||
|
||||
```yaml
|
||||
- Emby:
|
||||
icon: emby.png
|
||||
href: http://emby.host.or.ip/
|
||||
description: Movies & TV Shows
|
||||
widget:
|
||||
type: emby
|
||||
url: http://emby.host.or.ip
|
||||
key: apikeyapikeyapikeyapikeyapikey
|
||||
```
|
||||
|
||||
## Field Visibility
|
||||
|
||||
Each widget can optionally provide a list of which fields should be visible via the `fields` widget property. If no fields are specified, then all fields will be displayed. The `fields` property must be a valid YAML array of strings. As an example, here is the entry for Sonarr showing only a couple of fields.
|
||||
|
||||
**In all cases a widget will work and display all fields without specifying the `fields` property.**
|
||||
|
||||
```yaml
|
||||
- Sonarr:
|
||||
icon: sonarr.png
|
||||
href: http://sonarr.host.or.ip
|
||||
widget:
|
||||
type: sonarr
|
||||
fields: ["wanted", "queued"]
|
||||
url: http://sonarr.host.or.ip
|
||||
key: apikeyapikeyapikeyapikeyapikey
|
||||
```
|
@ -21,6 +21,23 @@ Groups are defined as top-level array entries.
|
||||
|
||||
<img width="1038" alt="Service Groups" src="https://user-images.githubusercontent.com/82196/187040754-28065242-4534-4409-881c-93d1921c6141.png">
|
||||
|
||||
### Nested Groups
|
||||
|
||||
Groups can be nested by using the same format as the top-level groups.
|
||||
|
||||
```yaml
|
||||
- Group A:
|
||||
- Service A:
|
||||
href: http://localhost/
|
||||
|
||||
- Group B:
|
||||
- Service B:
|
||||
href: http://localhost/
|
||||
|
||||
- Service C:
|
||||
href: http://localhost/
|
||||
```
|
||||
|
||||
## Services
|
||||
|
||||
Services are defined as array entries on groups,
|
||||
@ -43,6 +60,60 @@ Services are defined as array entries on groups,
|
||||
|
||||
<img width="1038" alt="Service Services" src="https://user-images.githubusercontent.com/82196/187040763-038023a2-8bee-4d87-b5cc-13447e7365a4.png">
|
||||
|
||||
### Service Widgets
|
||||
|
||||
Each service can have widgets attached to it (often matching the service type, but that's not forced).
|
||||
|
||||
In addition to the href of the service, you can also specify the target location in which to open that link. See [Link Target](settings.md#link-target) for more details.
|
||||
|
||||
Using Emby as an example, this is how you would attach the Emby service widget.
|
||||
|
||||
```yaml
|
||||
- Emby:
|
||||
icon: emby.png
|
||||
href: http://emby.host.or.ip/
|
||||
description: Movies & TV Shows
|
||||
widget:
|
||||
type: emby
|
||||
url: http://emby.host.or.ip
|
||||
key: apikeyapikeyapikeyapikeyapikey
|
||||
```
|
||||
|
||||
#### Multiple Widgets
|
||||
|
||||
Each service can have multiple widgets attached to it, for example:
|
||||
|
||||
```yaml
|
||||
- Emby:
|
||||
icon: emby.png
|
||||
href: http://emby.host.or.ip/
|
||||
description: Movies & TV Shows
|
||||
widgets:
|
||||
- type: emby
|
||||
url: http://emby.host.or.ip
|
||||
key: apikeyapikeyapikeyapikeyapikey
|
||||
- type: uptimekuma
|
||||
url: http://uptimekuma.host.or.ip:port
|
||||
slug: statuspageslug
|
||||
```
|
||||
|
||||
#### Field Visibility
|
||||
|
||||
Each widget can optionally provide a list of which fields should be visible via the `fields` widget property. If no fields are specified, then all fields will be displayed. The `fields` property must be a valid YAML array of strings. As an example, here is the entry for Sonarr showing only a couple of fields.
|
||||
|
||||
**In all cases a widget will work and display all fields without specifying the `fields` property.**
|
||||
|
||||
```yaml
|
||||
- Sonarr:
|
||||
icon: sonarr.png
|
||||
href: http://sonarr.host.or.ip
|
||||
widget:
|
||||
type: sonarr
|
||||
fields: ["wanted", "queued"]
|
||||
url: http://sonarr.host.or.ip
|
||||
key: apikeyapikeyapikeyapikeyapikey
|
||||
```
|
||||
|
||||
## Descriptions
|
||||
|
||||
Services may have descriptions,
|
||||
|
@ -118,6 +118,22 @@ As an example, this would produce the following layout:
|
||||
|
||||
<img width="1260" alt="Screenshot 2022-09-15 at 8 03 57 PM" src="https://user-images.githubusercontent.com/82196/190466646-8ca94505-0fcf-4964-9687-3a6c7cd3144f.png">
|
||||
|
||||
### Icons-Only Layout
|
||||
|
||||
You can also specify the an icon-only layout for bookmarks, either like so:
|
||||
|
||||
```yaml
|
||||
layout:
|
||||
Media:
|
||||
iconsOnly: true
|
||||
```
|
||||
|
||||
or globally:
|
||||
|
||||
```yaml
|
||||
bookmarksStyle: icons
|
||||
```
|
||||
|
||||
### Sorting
|
||||
|
||||
Service groups and bookmark groups can be mixed in order, **but should use different group names**. If you do not specify any bookmark groups they will all show at the bottom of the page.
|
||||
@ -137,6 +153,27 @@ layout:
|
||||
columns: 3
|
||||
```
|
||||
|
||||
### Nested Groups
|
||||
|
||||
If your services config has nested groups, you can apply settings to these groups by nesting them in the layout block
|
||||
and using the same settings. For example
|
||||
|
||||
```yaml
|
||||
layout:
|
||||
Group A:
|
||||
style: row
|
||||
columns: 4
|
||||
Group C:
|
||||
style: row
|
||||
columns: 2
|
||||
Nested Group A:
|
||||
style: row
|
||||
columns: 2
|
||||
Nested Group B:
|
||||
style: row
|
||||
columns: 2
|
||||
```
|
||||
|
||||
### Headers
|
||||
|
||||
You can hide headers for each section in the layout as well by passing `header` as false, like so:
|
||||
@ -348,12 +385,12 @@ This can also be set for individual services. Note setting this at the service l
|
||||
|
||||
## Providers
|
||||
|
||||
The `providers` section allows you to define shared API provider options and secrets. Currently this allows you to define your weather API keys in secret and is also the location of the Longhorn URL and credentials.
|
||||
The `providers` section allows you to define shared API provider options and secrets.
|
||||
|
||||
```yaml
|
||||
providers:
|
||||
openweathermap: openweathermapapikey
|
||||
weatherapi: weatherapiapikey
|
||||
finnhub: yourfinnhubapikeyhere
|
||||
longhorn:
|
||||
url: https://longhorn.example.com
|
||||
username: admin
|
||||
@ -363,10 +400,10 @@ providers:
|
||||
You can then pass `provider` instead of `apiKey` in your widget configuration.
|
||||
|
||||
```yaml
|
||||
- weatherapi:
|
||||
- openweathermap:
|
||||
latitude: 50.449684
|
||||
longitude: 30.525026
|
||||
provider: weatherapi
|
||||
provider: openweathermap
|
||||
```
|
||||
|
||||
## Quick Launch
|
||||
|
@ -175,6 +175,7 @@ data:
|
||||
expanded: true
|
||||
cpu: true
|
||||
memory: true
|
||||
network: default
|
||||
- search:
|
||||
provider: duckduckgo
|
||||
target: _blank
|
||||
@ -209,7 +210,7 @@ rules:
|
||||
- get
|
||||
- list
|
||||
- apiGroups:
|
||||
- traefik.containo.us
|
||||
- traefik.io
|
||||
resources:
|
||||
- ingressroutes
|
||||
verbs:
|
||||
@ -370,7 +371,7 @@ prevent unnecessary re-renders on page loads and window / tab focusing. The
|
||||
procedure for enabling sticky sessions depends on your Ingress controller. Below
|
||||
is an example using Traefik as the Ingress controller.
|
||||
|
||||
```
|
||||
```yaml
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
|
@ -17,7 +17,7 @@ hide:
|
||||
|
||||
All service widgets work essentially the same, that is, homepage makes a proxied call to an API made available by that service. The majority of the time widgets don't work it is a configuration issue. Of course, sometimes things do break. Some basic steps to try:
|
||||
|
||||
1. Ensure that you follow the rule mentioned on https://gethomepage.dev/configs/service-widgets/. **Unless otherwise noted, URLs should not end with a / or other API path. Each widget will handle the path on its own.**. This is very important as including a trailing slash can result in an error.
|
||||
1. **URLs should not end with a / or other API path. Each widget will handle the path on its own.**. Including a trailing slash can result in an error.
|
||||
|
||||
2. Verify the homepage installation can connect to the IP address or host you are using for the widget `url`. This is most simply achieved by pinging the server from the homepage machine, in Docker this means _from inside the container_ itself, e.g.:
|
||||
|
||||
|
@ -55,7 +55,7 @@ self-hosted / open-source alternative, we ask that any widgets, etc. are develop
|
||||
|
||||
To ensure cohesiveness of various widgets, the following should be used as a guide for developing new widgets:
|
||||
|
||||
- Please only submit widgets that target a feature request discussion with at least 10 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of service widgets that might only benefit a small number of users.
|
||||
- Please only submit widgets that target a feature request discussion with at least 20 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of service widgets that might only benefit a small number of users.
|
||||
- Note that we reserve the right to decline widgets for projects that are very young (eg < ~1y) or those with a small reach (eg low GitHub stars). Again, this is in an effort to keep overall widget maintenance under control.
|
||||
- Widgets should be only one row of blocks
|
||||
- Widgets should be no more than 4 blocks wide and generally conform to the styling / design choices of other widgets
|
||||
|
@ -50,7 +50,7 @@ You can also pass API keys from the widget configuration to the proxy handler, f
|
||||
|
||||
### `credentialedProxyHandler`
|
||||
|
||||
A proxy handler that makes authenticated by setting request headers. Credentials are pulled from the widgets configuration.
|
||||
A proxy handler that makes authenticated requests by setting request headers. Credentials are pulled from the widgets configuration.
|
||||
|
||||
By default the key is passed as an `X-API-Key` header. If you need to pass the key as something else, either add a case to the credentialedProxyHandler or create a new proxy handler.
|
||||
|
||||
|
@ -19,12 +19,17 @@ Service widgets are used to display the status of a service, often a web service
|
||||
description: Watch movies and TV shows.
|
||||
server: localhost
|
||||
container: plex
|
||||
widget:
|
||||
type: tautulli
|
||||
url: http://172.16.1.1:8181
|
||||
key: aabbccddeeffgghhiijjkkllmmnnoo
|
||||
widgets:
|
||||
- type: tautulli
|
||||
url: http://172.16.1.1:8181
|
||||
key: aabbccddeeffgghhiijjkkllmmnnoo
|
||||
- type: uptimekuma
|
||||
url: http://172.16.1.2:8080
|
||||
slug: aaaaaaabbbbb
|
||||
```
|
||||
|
||||
More detail on configuring service widgets can be found in the [Service Widgets Config](../configs/services.md) section.
|
||||
|
||||
## Info Widgets
|
||||
|
||||
Info widgets are used to display information in the header, often about your system or environment. Info widgets are defined your `widgets.yaml` file. Here's an example:
|
||||
@ -36,3 +41,5 @@ Info widgets are used to display information in the header, often about your sys
|
||||
longitude: -117.51
|
||||
cache: 5
|
||||
```
|
||||
|
||||
More detail on configuring info widgets can be found in the [Info Widgets Config](../configs/info-widgets.md) section.
|
||||
|
@ -3,7 +3,7 @@ title: Open-Meteo
|
||||
description: Open-Meteo Information Widget Configuration
|
||||
---
|
||||
|
||||
No registration is required at all! See [https://open-meteo.com/en/docs](https://open-meteo.com/en/docs)
|
||||
Homepage's recommended weather widget. No registration is required at all! See [https://open-meteo.com/en/docs](https://open-meteo.com/en/docs)
|
||||
|
||||
```yaml
|
||||
- openmeteo:
|
||||
|
@ -24,9 +24,10 @@ _Note: unfortunately, the package used for getting CPU temp ([systeminformation]
|
||||
tempmin: 0 # optional, minimum cpu temp
|
||||
tempmax: 100 # optional, maximum cpu temp
|
||||
uptime: true
|
||||
units: imperial # only used by cpu temp
|
||||
units: imperial # only used by cpu temp, options: 'imperial' or 'metric'
|
||||
refresh: 3000 # optional, in ms
|
||||
diskUnits: bytes # optional, bytes (default) or bbytes. Only applies to disk
|
||||
network: true # optional, uses 'default' if true or specify a network interface name
|
||||
```
|
||||
|
||||
You can also pass a `label` option, which allows you to group resources under named sections,
|
||||
|
@ -7,7 +7,7 @@ _(Find the Unifi Controller service widget [here](../services/unifi-controller.m
|
||||
|
||||
You can display general connectivity status from your Unifi (Network) Controller.
|
||||
|
||||
!!!
|
||||
!!! warning
|
||||
|
||||
When authenticating you will want to use a local account that has at least read privileges.
|
||||
|
||||
|
@ -1,22 +0,0 @@
|
||||
---
|
||||
title: Weather API
|
||||
description: Weather API Information Widget Configuration
|
||||
---
|
||||
|
||||
**Note: this widget is considered 'deprecated' since there is no longer a free Weather API tier for new members. See the openmeteo or openweathermap widgets for alternatives.**
|
||||
|
||||
The free tier is all that's required, you will need to [register](https://www.weatherapi.com/signup.aspx) and grab your API key.
|
||||
|
||||
```yaml
|
||||
- weatherapi:
|
||||
label: Kyiv # optional
|
||||
latitude: 50.449684
|
||||
longitude: 30.525026
|
||||
units: metric # or imperial
|
||||
apiKey: yourweatherapikey
|
||||
cache: 5 # Time in minutes to cache API responses, to stay within limits
|
||||
format: # optional, Intl.NumberFormat options
|
||||
maximumFractionDigits: 1
|
||||
```
|
||||
|
||||
You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS).
|
@ -12,6 +12,11 @@ The `systemID` in the `id` field on the collections page of Beszel.
|
||||
Allowed fields for 'overview' mode: `["systems", "up"]`
|
||||
Allowed fields for a single system: `["name", "status", "updated", "cpu", "memory", "disk", "network"]`
|
||||
|
||||
| Beszel Version | Homepage Widget Version |
|
||||
| -------------- | ----------------------- |
|
||||
| < 0.9.0 | 1 (default) |
|
||||
| >= 0.9.0 | 2 |
|
||||
|
||||
```yaml
|
||||
widget:
|
||||
type: beszel
|
||||
@ -19,4 +24,5 @@ widget:
|
||||
username: username # email
|
||||
password: password
|
||||
systemId: systemId # optional
|
||||
version: 2 # optional, default is 1
|
||||
```
|
||||
|
@ -14,4 +14,5 @@ widget:
|
||||
type: deluge
|
||||
url: http://deluge.host.or.ip
|
||||
password: password # webui password
|
||||
enableLeechProgress: true # optional, defaults to false
|
||||
```
|
||||
|
@ -16,5 +16,6 @@ To group both `offline` and `unknown` devices together, users should use the `of
|
||||
widget:
|
||||
type: esphome
|
||||
url: http://esphome.host.or.ip:port
|
||||
key: myesphomecookie # only if auth enabled, get the value from a request from the frontend e.g. `authenticated=myesphomecookie`
|
||||
username: myesphomeuser # only if auth enabled
|
||||
password: myesphomepass # only if auth enabled
|
||||
```
|
||||
|
@ -3,7 +3,7 @@ title: EVCC
|
||||
description: EVCC Widget Configuration
|
||||
---
|
||||
|
||||
Learn more about [EVSS](https://github.com/evcc-io/evcc).
|
||||
Learn more about [EVCC](https://github.com/evcc-io/evcc).
|
||||
|
||||
Allowed fields: `["pv_power", "grid_power", "home_power", "charge_power]`.
|
||||
|
||||
|
@ -51,6 +51,8 @@ The metric field in the configuration determines the type of system monitoring d
|
||||
|
||||
`process`: Top 5 processes based on CPU usage. Gives an overview of which processes are consuming the most resources.
|
||||
|
||||
`containers`: Docker or Kubernetes containers list. Shows up to 5 containers running on the system and their resource usage.
|
||||
|
||||
`network:<interface_name>`: Network data usage for the specified interface. Replace `<interface_name>` with the name of your network interface, e.g., `network:enp0s25`, as specified in glances.
|
||||
|
||||
`sensor:<sensor_id>`: Temperature of the specified sensor, typically used to monitor CPU temperature. Replace `<sensor_id>` with the name of your sensor, e.g., `sensor:Package id 0` as specified in glances.
|
||||
|
@ -15,4 +15,5 @@ widget:
|
||||
url: http://qbittorrent.host.or.ip
|
||||
username: username
|
||||
password: password
|
||||
enableLeechProgress: true # optional, defaults to false
|
||||
```
|
||||
|
@ -9,7 +9,7 @@ _(Find the Unifi Controller information widget [here](../info/unifi_controller.m
|
||||
|
||||
You can display general connectivity status from your Unifi (Network) Controller.
|
||||
|
||||
!!!
|
||||
!!! warning
|
||||
|
||||
When authenticating you will want to use a local account that has at least read privileges.
|
||||
|
||||
|
@ -21,8 +21,8 @@ nav:
|
||||
- configs/index.md
|
||||
- configs/settings.md
|
||||
- configs/bookmarks.md
|
||||
- configs/info-widgets.md
|
||||
- configs/services.md
|
||||
- configs/service-widgets.md
|
||||
- configs/kubernetes.md
|
||||
- configs/docker.md
|
||||
- configs/custom-css-js.md
|
||||
@ -142,6 +142,7 @@ nav:
|
||||
- widgets/services/spoolman.md
|
||||
- widgets/services/stash.md
|
||||
- widgets/services/stocks.md
|
||||
- widgets/services/suwayomi.md
|
||||
- widgets/services/swagdashboard.md
|
||||
- widgets/services/syncthing-relay-server.md
|
||||
- widgets/services/tailscale.md
|
||||
@ -177,7 +178,6 @@ nav:
|
||||
- widgets/info/search.md
|
||||
- widgets/info/stocks.md
|
||||
- widgets/info/unifi_controller.md
|
||||
- widgets/info/weather.md
|
||||
- "Learn":
|
||||
- widgets/authoring/index.md
|
||||
- "Getting Started": widgets/authoring/getting-started.md
|
||||
|
112
package-lock.json
generated
112
package-lock.json
generated
@ -15,7 +15,7 @@
|
||||
"compare-versions": "^6.1.0",
|
||||
"dockerode": "^4.0.2",
|
||||
"follow-redirects": "^1.15.9",
|
||||
"gamedig": "^5.1.2",
|
||||
"gamedig": "^5.1.4",
|
||||
"i18next": "^21.10.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"json-rpc-2.0": "^1.7.0",
|
||||
@ -50,7 +50,7 @@
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||
"eslint-plugin-prettier": "^5.2.1",
|
||||
"eslint-plugin-react": "^7.37.1",
|
||||
"eslint-plugin-react": "^7.37.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.2",
|
||||
"postcss": "^8.4.47",
|
||||
"prettier": "^3.2.5",
|
||||
@ -2115,9 +2115,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
@ -2729,9 +2729,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/es-abstract": {
|
||||
"version": "1.23.3",
|
||||
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
|
||||
"integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
|
||||
"version": "1.23.5",
|
||||
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz",
|
||||
"integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -2750,7 +2750,7 @@
|
||||
"function.prototype.name": "^1.1.6",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"get-symbol-description": "^1.0.2",
|
||||
"globalthis": "^1.0.3",
|
||||
"globalthis": "^1.0.4",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.2",
|
||||
"has-proto": "^1.0.3",
|
||||
@ -2766,10 +2766,10 @@
|
||||
"is-string": "^1.0.7",
|
||||
"is-typed-array": "^1.1.13",
|
||||
"is-weakref": "^1.0.2",
|
||||
"object-inspect": "^1.13.1",
|
||||
"object-inspect": "^1.13.3",
|
||||
"object-keys": "^1.1.1",
|
||||
"object.assign": "^4.1.5",
|
||||
"regexp.prototype.flags": "^1.5.2",
|
||||
"regexp.prototype.flags": "^1.5.3",
|
||||
"safe-array-concat": "^1.1.2",
|
||||
"safe-regex-test": "^1.0.3",
|
||||
"string.prototype.trim": "^1.2.9",
|
||||
@ -2834,9 +2834,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/es-iterator-helpers": {
|
||||
"version": "1.0.19",
|
||||
"resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
|
||||
"integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz",
|
||||
"integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -2847,12 +2847,13 @@
|
||||
"es-set-tostringtag": "^2.0.3",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"globalthis": "^1.0.3",
|
||||
"globalthis": "^1.0.4",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.2",
|
||||
"has-proto": "^1.0.3",
|
||||
"has-symbols": "^1.0.3",
|
||||
"internal-slot": "^1.0.7",
|
||||
"iterator.prototype": "^1.1.2",
|
||||
"iterator.prototype": "^1.1.3",
|
||||
"safe-array-concat": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
@ -3280,17 +3281,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-react": {
|
||||
"version": "7.37.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz",
|
||||
"integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==",
|
||||
"version": "7.37.2",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz",
|
||||
"integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"array-includes": "^3.1.8",
|
||||
"array.prototype.findlast": "^1.2.5",
|
||||
"array.prototype.flatmap": "^1.3.2",
|
||||
"array.prototype.tosorted": "^1.1.4",
|
||||
"doctrine": "^2.1.0",
|
||||
"es-iterator-helpers": "^1.0.19",
|
||||
"es-iterator-helpers": "^1.1.0",
|
||||
"estraverse": "^5.3.0",
|
||||
"hasown": "^2.0.2",
|
||||
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
|
||||
@ -3847,9 +3849,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/gamedig": {
|
||||
"version": "5.1.3",
|
||||
"resolved": "https://registry.npmjs.org/gamedig/-/gamedig-5.1.3.tgz",
|
||||
"integrity": "sha512-ECksJC4idM3a+P+a+j9/XHcPOsP4DUrwowK38QucDQ4x5T7mQDWErY2n8NE4kV4HKjCq16ifNMAEt+/nyCKWog==",
|
||||
"version": "5.1.4",
|
||||
"resolved": "https://registry.npmjs.org/gamedig/-/gamedig-5.1.4.tgz",
|
||||
"integrity": "sha512-MgSbNVGh5QMdrmRTrZ3W7W6sC5/Mx+dMgTy2uZCKQ9vns9eFXkQj61Pw2Y2FNHNMMp4DXFSUMYAPJWLcR16Wwg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cheerio": "1.0.0-rc.12",
|
||||
@ -3858,7 +3860,6 @@
|
||||
"iconv-lite": "0.6.3",
|
||||
"long": "5.2.3",
|
||||
"minimist": "1.2.8",
|
||||
"punycode": "2.3.1",
|
||||
"seek-bzip": "2.0.0",
|
||||
"varint": "6.0.0"
|
||||
},
|
||||
@ -4677,13 +4678,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/is-finalizationregistry": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
|
||||
"integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz",
|
||||
"integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2"
|
||||
"call-bind": "^1.0.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@ -4974,9 +4978,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/iterator.prototype": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
|
||||
"integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz",
|
||||
"integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -4985,6 +4989,9 @@
|
||||
"has-symbols": "^1.0.3",
|
||||
"reflect.getprototypeof": "^1.0.4",
|
||||
"set-function-name": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/jackspeak": {
|
||||
@ -5503,9 +5510,9 @@
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.7",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
|
||||
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
|
||||
"version": "3.3.8",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
|
||||
"integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
@ -5758,9 +5765,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
|
||||
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
|
||||
"version": "1.13.3",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
|
||||
"integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@ -6677,19 +6684,19 @@
|
||||
}
|
||||
},
|
||||
"node_modules/reflect.getprototypeof": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
|
||||
"integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz",
|
||||
"integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.7",
|
||||
"define-properties": "^1.2.1",
|
||||
"es-abstract": "^1.23.1",
|
||||
"es-abstract": "^1.23.5",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"globalthis": "^1.0.3",
|
||||
"which-builtin-type": "^1.1.3"
|
||||
"gopd": "^1.0.1",
|
||||
"which-builtin-type": "^1.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@ -6705,16 +6712,16 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/regexp.prototype.flags": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
|
||||
"integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
|
||||
"version": "1.5.3",
|
||||
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
|
||||
"integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.6",
|
||||
"call-bind": "^1.0.7",
|
||||
"define-properties": "^1.2.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"set-function-name": "^2.0.1"
|
||||
"set-function-name": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@ -8337,17 +8344,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/which-builtin-type": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz",
|
||||
"integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==",
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz",
|
||||
"integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.7",
|
||||
"function.prototype.name": "^1.1.6",
|
||||
"has-tostringtag": "^1.0.2",
|
||||
"is-async-function": "^2.0.0",
|
||||
"is-date-object": "^1.0.5",
|
||||
"is-finalizationregistry": "^1.0.2",
|
||||
"is-finalizationregistry": "^1.1.0",
|
||||
"is-generator-function": "^1.0.10",
|
||||
"is-regex": "^1.1.4",
|
||||
"is-weakref": "^1.0.2",
|
||||
|
@ -17,7 +17,7 @@
|
||||
"compare-versions": "^6.1.0",
|
||||
"dockerode": "^4.0.2",
|
||||
"follow-redirects": "^1.15.9",
|
||||
"gamedig": "^5.1.2",
|
||||
"gamedig": "^5.1.4",
|
||||
"i18next": "^21.10.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"json-rpc-2.0": "^1.7.0",
|
||||
@ -52,7 +52,7 @@
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||
"eslint-plugin-prettier": "^5.2.1",
|
||||
"eslint-plugin-react": "^7.37.1",
|
||||
"eslint-plugin-react": "^7.37.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.2",
|
||||
"postcss": "^8.4.47",
|
||||
"prettier": "^3.2.5",
|
||||
|
105
pnpm-lock.yaml
generated
105
pnpm-lock.yaml
generated
@ -30,8 +30,8 @@ importers:
|
||||
specifier: ^1.15.9
|
||||
version: 1.15.9
|
||||
gamedig:
|
||||
specifier: ^5.1.2
|
||||
version: 5.1.3
|
||||
specifier: ^5.1.4
|
||||
version: 5.1.4
|
||||
i18next:
|
||||
specifier: ^21.10.0
|
||||
version: 21.10.0
|
||||
@ -117,7 +117,7 @@ importers:
|
||||
version: 8.57.1
|
||||
eslint-config-airbnb:
|
||||
specifier: ^19.0.4
|
||||
version: 19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.1(eslint@8.57.1))(eslint@8.57.1)
|
||||
version: 19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-config-next:
|
||||
specifier: ^14.2.3
|
||||
version: 14.2.8(eslint@8.57.1)(typescript@5.6.3)
|
||||
@ -126,7 +126,7 @@ importers:
|
||||
version: 9.1.0(eslint@8.57.1)
|
||||
eslint-plugin-import:
|
||||
specifier: ^2.31.0
|
||||
version: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||
version: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-plugin-jsx-a11y:
|
||||
specifier: ^6.8.0
|
||||
version: 6.10.0(eslint@8.57.1)
|
||||
@ -134,8 +134,8 @@ importers:
|
||||
specifier: ^5.2.1
|
||||
version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3)
|
||||
eslint-plugin-react:
|
||||
specifier: ^7.37.1
|
||||
version: 7.37.1(eslint@8.57.1)
|
||||
specifier: ^7.37.2
|
||||
version: 7.37.2(eslint@8.57.1)
|
||||
eslint-plugin-react-hooks:
|
||||
specifier: ^4.6.2
|
||||
version: 4.6.2(eslint@8.57.1)
|
||||
@ -783,8 +783,8 @@ packages:
|
||||
resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
|
||||
cross-spawn@7.0.3:
|
||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
||||
cross-spawn@7.0.6:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
css-select@5.1.0:
|
||||
@ -1006,6 +1006,10 @@ packages:
|
||||
resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
es-iterator-helpers@1.2.0:
|
||||
resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
es-object-atoms@1.0.0:
|
||||
resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -1155,8 +1159,8 @@ packages:
|
||||
peerDependencies:
|
||||
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
|
||||
|
||||
eslint-plugin-react@7.37.1:
|
||||
resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==}
|
||||
eslint-plugin-react@7.37.2:
|
||||
resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==}
|
||||
engines: {node: '>=4'}
|
||||
peerDependencies:
|
||||
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
|
||||
@ -1316,8 +1320,8 @@ packages:
|
||||
functions-have-names@1.2.3:
|
||||
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
|
||||
|
||||
gamedig@5.1.3:
|
||||
resolution: {integrity: sha512-ECksJC4idM3a+P+a+j9/XHcPOsP4DUrwowK38QucDQ4x5T7mQDWErY2n8NE4kV4HKjCq16ifNMAEt+/nyCKWog==}
|
||||
gamedig@5.1.4:
|
||||
resolution: {integrity: sha512-MgSbNVGh5QMdrmRTrZ3W7W6sC5/Mx+dMgTy2uZCKQ9vns9eFXkQj61Pw2Y2FNHNMMp4DXFSUMYAPJWLcR16Wwg==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
hasBin: true
|
||||
|
||||
@ -1648,6 +1652,10 @@ packages:
|
||||
iterator.prototype@1.1.2:
|
||||
resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
|
||||
|
||||
iterator.prototype@1.1.3:
|
||||
resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
jackspeak@2.3.6:
|
||||
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
|
||||
engines: {node: '>=14'}
|
||||
@ -3454,7 +3462,7 @@ snapshots:
|
||||
nan: 2.20.0
|
||||
optional: true
|
||||
|
||||
cross-spawn@7.0.3:
|
||||
cross-spawn@7.0.6:
|
||||
dependencies:
|
||||
path-key: 3.1.1
|
||||
shebang-command: 2.0.0
|
||||
@ -3757,6 +3765,24 @@ snapshots:
|
||||
iterator.prototype: 1.1.2
|
||||
safe-array-concat: 1.1.2
|
||||
|
||||
es-iterator-helpers@1.2.0:
|
||||
dependencies:
|
||||
call-bind: 1.0.7
|
||||
define-properties: 1.2.1
|
||||
es-abstract: 1.23.3
|
||||
es-errors: 1.3.0
|
||||
es-set-tostringtag: 2.0.3
|
||||
function-bind: 1.1.2
|
||||
get-intrinsic: 1.2.4
|
||||
globalthis: 1.0.4
|
||||
gopd: 1.0.1
|
||||
has-property-descriptors: 1.0.2
|
||||
has-proto: 1.0.3
|
||||
has-symbols: 1.0.3
|
||||
internal-slot: 1.0.7
|
||||
iterator.prototype: 1.1.3
|
||||
safe-array-concat: 1.1.2
|
||||
|
||||
es-object-atoms@1.0.0:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
@ -3785,18 +3811,18 @@ snapshots:
|
||||
dependencies:
|
||||
confusing-browser-globals: 1.0.11
|
||||
eslint: 8.57.1
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
|
||||
object.assign: 4.1.5
|
||||
object.entries: 1.1.8
|
||||
semver: 6.3.1
|
||||
|
||||
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.1(eslint@8.57.1))(eslint@8.57.1):
|
||||
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1):
|
||||
dependencies:
|
||||
eslint: 8.57.1
|
||||
eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
|
||||
eslint-plugin-react: 7.37.1(eslint@8.57.1)
|
||||
eslint-plugin-react: 7.37.2(eslint@8.57.1)
|
||||
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
|
||||
object.assign: 4.1.5
|
||||
object.entries: 1.1.8
|
||||
@ -3809,10 +3835,10 @@ snapshots:
|
||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||
eslint: 8.57.1
|
||||
eslint-import-resolver-node: 0.3.9
|
||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
|
||||
eslint-plugin-react: 7.37.1(eslint@8.57.1)
|
||||
eslint-plugin-react: 7.37.2(eslint@8.57.1)
|
||||
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
|
||||
optionalDependencies:
|
||||
typescript: 5.6.3
|
||||
@ -3833,48 +3859,48 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1):
|
||||
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1):
|
||||
dependencies:
|
||||
'@nolyfill/is-core-module': 1.0.39
|
||||
debug: 4.3.6
|
||||
enhanced-resolve: 5.17.1
|
||||
eslint: 8.57.1
|
||||
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
|
||||
fast-glob: 3.3.2
|
||||
get-tsconfig: 4.8.0
|
||||
is-bun-module: 1.1.0
|
||||
is-glob: 4.0.3
|
||||
optionalDependencies:
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
|
||||
transitivePeerDependencies:
|
||||
- '@typescript-eslint/parser'
|
||||
- eslint-import-resolver-node
|
||||
- eslint-import-resolver-webpack
|
||||
- supports-color
|
||||
|
||||
eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1):
|
||||
eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
|
||||
dependencies:
|
||||
debug: 3.2.7
|
||||
optionalDependencies:
|
||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||
eslint: 8.57.1
|
||||
eslint-import-resolver-node: 0.3.9
|
||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
|
||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1):
|
||||
eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
|
||||
dependencies:
|
||||
debug: 3.2.7
|
||||
optionalDependencies:
|
||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||
eslint: 8.57.1
|
||||
eslint-import-resolver-node: 0.3.9
|
||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
|
||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
|
||||
eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
|
||||
dependencies:
|
||||
'@rtsao/scc': 1.1.0
|
||||
array-includes: 3.1.8
|
||||
@ -3885,7 +3911,7 @@ snapshots:
|
||||
doctrine: 2.1.0
|
||||
eslint: 8.57.1
|
||||
eslint-import-resolver-node: 0.3.9
|
||||
eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1)
|
||||
eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
|
||||
hasown: 2.0.2
|
||||
is-core-module: 2.15.1
|
||||
is-glob: 4.0.3
|
||||
@ -3936,14 +3962,14 @@ snapshots:
|
||||
dependencies:
|
||||
eslint: 8.57.1
|
||||
|
||||
eslint-plugin-react@7.37.1(eslint@8.57.1):
|
||||
eslint-plugin-react@7.37.2(eslint@8.57.1):
|
||||
dependencies:
|
||||
array-includes: 3.1.8
|
||||
array.prototype.findlast: 1.2.5
|
||||
array.prototype.flatmap: 1.3.2
|
||||
array.prototype.tosorted: 1.1.4
|
||||
doctrine: 2.1.0
|
||||
es-iterator-helpers: 1.0.19
|
||||
es-iterator-helpers: 1.2.0
|
||||
eslint: 8.57.1
|
||||
estraverse: 5.3.0
|
||||
hasown: 2.0.2
|
||||
@ -3977,7 +4003,7 @@ snapshots:
|
||||
'@ungap/structured-clone': 1.2.0
|
||||
ajv: 6.12.6
|
||||
chalk: 4.1.2
|
||||
cross-spawn: 7.0.3
|
||||
cross-spawn: 7.0.6
|
||||
debug: 4.3.6
|
||||
doctrine: 3.0.0
|
||||
escape-string-regexp: 4.0.0
|
||||
@ -4032,7 +4058,7 @@ snapshots:
|
||||
|
||||
execa@5.0.0:
|
||||
dependencies:
|
||||
cross-spawn: 7.0.3
|
||||
cross-spawn: 7.0.6
|
||||
get-stream: 6.0.1
|
||||
human-signals: 2.1.0
|
||||
is-stream: 2.0.1
|
||||
@ -4101,7 +4127,7 @@ snapshots:
|
||||
|
||||
foreground-child@3.3.0:
|
||||
dependencies:
|
||||
cross-spawn: 7.0.3
|
||||
cross-spawn: 7.0.6
|
||||
signal-exit: 4.1.0
|
||||
|
||||
forever-agent@0.6.1: {}
|
||||
@ -4138,7 +4164,7 @@ snapshots:
|
||||
|
||||
functions-have-names@1.2.3: {}
|
||||
|
||||
gamedig@5.1.3:
|
||||
gamedig@5.1.4:
|
||||
dependencies:
|
||||
cheerio: 1.0.0-rc.12
|
||||
gbxremote: 0.2.1
|
||||
@ -4146,7 +4172,6 @@ snapshots:
|
||||
iconv-lite: 0.6.3
|
||||
long: 5.2.3
|
||||
minimist: 1.2.8
|
||||
punycode: 2.3.1
|
||||
seek-bzip: 2.0.0
|
||||
varint: 6.0.0
|
||||
|
||||
@ -4496,6 +4521,14 @@ snapshots:
|
||||
reflect.getprototypeof: 1.0.6
|
||||
set-function-name: 2.0.2
|
||||
|
||||
iterator.prototype@1.1.3:
|
||||
dependencies:
|
||||
define-properties: 1.2.1
|
||||
get-intrinsic: 1.2.4
|
||||
has-symbols: 1.0.3
|
||||
reflect.getprototypeof: 1.0.6
|
||||
set-function-name: 2.0.2
|
||||
|
||||
jackspeak@2.3.6:
|
||||
dependencies:
|
||||
'@isaacs/cliui': 8.0.2
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Rooster",
|
||||
"home_power": "Verbruik",
|
||||
"charge_power": "Laaier",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Aflaai",
|
||||
@ -990,22 +990,22 @@
|
||||
"network": "NET"
|
||||
},
|
||||
"argocd": {
|
||||
"apps": "Apps",
|
||||
"synced": "Synced",
|
||||
"outOfSync": "Out Of Sync",
|
||||
"apps": "Programme",
|
||||
"synced": "Gesinkroniseer",
|
||||
"outOfSync": "Nie Gesinchroniseer Nie",
|
||||
"healthy": "Gesond",
|
||||
"degraded": "Degraded",
|
||||
"progressing": "Progressing",
|
||||
"degraded": "Gedegradeer",
|
||||
"progressing": "Vorderend",
|
||||
"missing": "Vermis",
|
||||
"suspended": "Suspended"
|
||||
"suspended": "Geskors"
|
||||
},
|
||||
"spoolman": {
|
||||
"loading": "Laai"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Groepe",
|
||||
"issues": "Kwessies",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"merges": "Saamvleg Versoeke",
|
||||
"projects": "Projekte"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "شبكة",
|
||||
"home_power": "الاستهلاك",
|
||||
"charge_power": "شاحن",
|
||||
"watt_hour": "واط ساعة"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "التنزيل",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Xarxa",
|
||||
"home_power": "Consum",
|
||||
"charge_power": "Carregador",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Descarregar",
|
||||
@ -350,7 +350,7 @@
|
||||
"queue": "Cua",
|
||||
"processed": "Processat",
|
||||
"errored": "Error",
|
||||
"saved": "Desat"
|
||||
"saved": "Estalviat"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Encaminadors",
|
||||
@ -581,7 +581,7 @@
|
||||
"clientIP": "Client"
|
||||
},
|
||||
"scrutiny": {
|
||||
"passed": "Aprobat",
|
||||
"passed": "Aprovat",
|
||||
"failed": "Error",
|
||||
"unknown": "Desconegut"
|
||||
},
|
||||
@ -820,7 +820,7 @@
|
||||
"total": "Total",
|
||||
"running": "En execució",
|
||||
"stopped": "Aturat",
|
||||
"passed": "Aprobat",
|
||||
"passed": "Aprovat",
|
||||
"failed": "Error"
|
||||
},
|
||||
"openwrt": {
|
||||
@ -991,21 +991,21 @@
|
||||
},
|
||||
"argocd": {
|
||||
"apps": "Apps",
|
||||
"synced": "Synced",
|
||||
"outOfSync": "Out Of Sync",
|
||||
"synced": "Sincronitzats",
|
||||
"outOfSync": "Dessincronitzats",
|
||||
"healthy": "Saludable",
|
||||
"degraded": "Degraded",
|
||||
"progressing": "Progressing",
|
||||
"degraded": "Degradats",
|
||||
"progressing": "Progressant",
|
||||
"missing": "Falten",
|
||||
"suspended": "Suspended"
|
||||
"suspended": "Suspesos"
|
||||
},
|
||||
"spoolman": {
|
||||
"loading": "Carregant"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Grups",
|
||||
"issues": "Problemes",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"projects": "Projectes"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Mřížka",
|
||||
"home_power": "Spotřeba",
|
||||
"charge_power": "Nabíječka",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Stahování",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Gitter",
|
||||
"home_power": "Forbrug",
|
||||
"charge_power": "Oplader",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Netz",
|
||||
"home_power": "verbauch",
|
||||
"charge_power": "Ladegerät",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
@ -1003,9 +1003,9 @@
|
||||
"loading": "Wird geladen"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Gruppen",
|
||||
"issues": "Probleme",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"projects": "Projekte"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Πλέγμα",
|
||||
"home_power": "Κατανάλωση",
|
||||
"charge_power": "Φορτιστής",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Λήξη",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Elŝuti",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Red",
|
||||
"home_power": "Consumo",
|
||||
"charge_power": "Cargador",
|
||||
"watt_hour": "vatio-hora (Wh)"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Descarga",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grille",
|
||||
"home_power": "Consommation",
|
||||
"charge_power": "Chargeur",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Récep.",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Raspored",
|
||||
"home_power": "Potrošnja",
|
||||
"charge_power": "Punjač",
|
||||
"watt_hour": "Kilovat-sat"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Preuzimanje",
|
||||
|
@ -25,7 +25,7 @@
|
||||
"api_error": "API Hiba",
|
||||
"information": "Információ",
|
||||
"status": "Státusz",
|
||||
"url": "LINK",
|
||||
"url": "URL",
|
||||
"raw_error": "Nyers hiba",
|
||||
"response_data": "Válaszadatok"
|
||||
},
|
||||
@ -120,7 +120,7 @@
|
||||
"grid_power": "Rács",
|
||||
"home_power": "Fogyasztás",
|
||||
"charge_power": "Töltő",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Letöltés",
|
||||
@ -227,8 +227,8 @@
|
||||
"seed": "Seed"
|
||||
},
|
||||
"develancacheui": {
|
||||
"cachehitbytes": "Cache Hit Bytes",
|
||||
"cachemissbytes": "Cache Miss Bytes"
|
||||
"cachehitbytes": "Gyorsítótárban Sikeres Bitek",
|
||||
"cachemissbytes": "Gyorsítótárban Hibás Bitek"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Letöltés",
|
||||
@ -311,13 +311,13 @@
|
||||
},
|
||||
"suwayomi": {
|
||||
"download": "Letöltött",
|
||||
"nondownload": "Non-Downloaded",
|
||||
"nondownload": "Nem Letöltött",
|
||||
"read": "Olvasott",
|
||||
"unread": "Olvasatlan",
|
||||
"downloadedread": "Downloaded & Read",
|
||||
"downloadedunread": "Downloaded & Unread",
|
||||
"nondownloadedread": "Non-Downloaded & Read",
|
||||
"nondownloadedunread": "Non-Downloaded & Unread"
|
||||
"downloadedread": "Letöltött & Olvasott",
|
||||
"downloadedunread": "Letöltött & Olvasatlan",
|
||||
"nondownloadedread": "Nem Letöltött & Olvasatlan",
|
||||
"nondownloadedunread": "Nem Letöltött & Olvasatlan"
|
||||
},
|
||||
"tailscale": {
|
||||
"address": "Cím",
|
||||
@ -335,15 +335,15 @@
|
||||
},
|
||||
"technitium": {
|
||||
"totalQueries": "Lekérdezések",
|
||||
"totalNoError": "Success",
|
||||
"totalServerFailure": "Failures",
|
||||
"totalNxDomain": "NX Domains",
|
||||
"totalRefused": "Refused",
|
||||
"totalAuthoritative": "Authoritative",
|
||||
"totalRecursive": "Recursive",
|
||||
"totalCached": "Cached",
|
||||
"totalNoError": "Sikerek",
|
||||
"totalServerFailure": "Hibák",
|
||||
"totalNxDomain": "NX Domainek",
|
||||
"totalRefused": "Elutasított",
|
||||
"totalAuthoritative": "Irányadó",
|
||||
"totalRecursive": "Rekurzív",
|
||||
"totalCached": "Gyorsítótárazott",
|
||||
"totalBlocked": "Blokkolt",
|
||||
"totalDropped": "Dropped",
|
||||
"totalDropped": "Eldobott",
|
||||
"totalClients": "Kliensek"
|
||||
},
|
||||
"tdarr": {
|
||||
@ -453,7 +453,7 @@
|
||||
"search": "Keresés",
|
||||
"custom": "Egyedi",
|
||||
"visit": "Megnéz",
|
||||
"url": "LINK",
|
||||
"url": "URL",
|
||||
"searchsuggestion": "Javaslat"
|
||||
},
|
||||
"wmo": {
|
||||
@ -854,16 +854,16 @@
|
||||
},
|
||||
"romm": {
|
||||
"platforms": "Felület",
|
||||
"totalRoms": "Games",
|
||||
"saves": "Saves",
|
||||
"states": "States",
|
||||
"screenshots": "Screenshots",
|
||||
"totalfilesize": "Total Size"
|
||||
"totalRoms": "Játékok",
|
||||
"saves": "Mentések",
|
||||
"states": "Állapotok",
|
||||
"screenshots": "Képernyőképek",
|
||||
"totalfilesize": "Teljes méret"
|
||||
},
|
||||
"mailcow": {
|
||||
"domains": "Domainek",
|
||||
"mailboxes": "Mailboxes",
|
||||
"mails": "Mails",
|
||||
"mailboxes": "E-mail fiókok",
|
||||
"mails": "Mailek",
|
||||
"storage": "Tárhely"
|
||||
},
|
||||
"netdata": {
|
||||
@ -912,7 +912,7 @@
|
||||
},
|
||||
"crowdsec": {
|
||||
"alerts": "Riasztások",
|
||||
"bans": "Bans"
|
||||
"bans": "Kitiltások"
|
||||
},
|
||||
"wgeasy": {
|
||||
"connected": "Csatlakozva",
|
||||
@ -921,10 +921,10 @@
|
||||
"total": "Összes"
|
||||
},
|
||||
"swagdashboard": {
|
||||
"proxied": "Proxied",
|
||||
"auth": "With Auth",
|
||||
"outdated": "Outdated",
|
||||
"banned": "Banned"
|
||||
"proxied": "Proxyzott",
|
||||
"auth": "Hitelesítéssel",
|
||||
"outdated": "Elavult",
|
||||
"banned": "Kitiltott"
|
||||
},
|
||||
"myspeed": {
|
||||
"ping": "Ping",
|
||||
@ -932,29 +932,29 @@
|
||||
"upload": "Feltöltés"
|
||||
},
|
||||
"stocks": {
|
||||
"stocks": "Stocks",
|
||||
"loading": "Loading",
|
||||
"open": "Open - US Market",
|
||||
"closed": "Closed - US Market",
|
||||
"invalidConfiguration": "Invalid Configuration"
|
||||
"stocks": "Tőzsde",
|
||||
"loading": "Betöltés",
|
||||
"open": "Nyitva - US Piac",
|
||||
"closed": "Zárva - US Piac",
|
||||
"invalidConfiguration": "Érvénytelen konfiguráció"
|
||||
},
|
||||
"frigate": {
|
||||
"cameras": "Cameras",
|
||||
"cameras": "Kamerák",
|
||||
"uptime": "Üzemidő",
|
||||
"version": "Verzió"
|
||||
},
|
||||
"linkwarden": {
|
||||
"links": "Links",
|
||||
"collections": "Collections",
|
||||
"links": "Linkek",
|
||||
"collections": "Gyűjtemény",
|
||||
"tags": "Címkék"
|
||||
},
|
||||
"zabbix": {
|
||||
"unclassified": "Not classified",
|
||||
"unclassified": "Nem titkosított",
|
||||
"information": "Információ",
|
||||
"warning": "Warning",
|
||||
"average": "Average",
|
||||
"high": "High",
|
||||
"disaster": "Disaster"
|
||||
"warning": "Figyelmeztetés",
|
||||
"average": "Átlag",
|
||||
"high": "Magas",
|
||||
"disaster": "Katasztrófa"
|
||||
},
|
||||
"lubelogger": {
|
||||
"vehicle": "Jármű",
|
||||
@ -962,13 +962,13 @@
|
||||
"serviceRecords": "Szolgáltatások nyílvántartása",
|
||||
"reminders": "Emlékeztetők",
|
||||
"nextReminder": "Következő emlékeztető",
|
||||
"none": "None"
|
||||
"none": "Semmi"
|
||||
},
|
||||
"vikunja": {
|
||||
"projects": "Active Projects",
|
||||
"tasks7d": "Tasks Due This Week",
|
||||
"tasksOverdue": "Overdue Tasks",
|
||||
"tasksInProgress": "Tasks In Progress"
|
||||
"projects": "Aktív Projektek",
|
||||
"tasks7d": "Hátralévő feladatok a héten",
|
||||
"tasksOverdue": "Lejárt feladatok",
|
||||
"tasksInProgress": "Folyamatban levő Feladatok"
|
||||
},
|
||||
"headscale": {
|
||||
"name": "Név",
|
||||
@ -980,32 +980,32 @@
|
||||
},
|
||||
"beszel": {
|
||||
"name": "Név",
|
||||
"systems": "Systems",
|
||||
"systems": "Rendszerek",
|
||||
"up": "Fel",
|
||||
"status": "Státusz",
|
||||
"updated": "Frissített",
|
||||
"cpu": "Processzor",
|
||||
"memory": "RAM",
|
||||
"disk": "Disk",
|
||||
"network": "NET"
|
||||
"disk": "Lemez",
|
||||
"network": "Hálózat"
|
||||
},
|
||||
"argocd": {
|
||||
"apps": "Apps",
|
||||
"synced": "Synced",
|
||||
"outOfSync": "Out Of Sync",
|
||||
"apps": "Alkalmazások",
|
||||
"synced": "Szinkronizált",
|
||||
"outOfSync": "Nincs szinkronban",
|
||||
"healthy": "Egészséges",
|
||||
"degraded": "Degraded",
|
||||
"progressing": "Progressing",
|
||||
"degraded": "Leépült",
|
||||
"progressing": "Halad",
|
||||
"missing": "Hiányzik",
|
||||
"suspended": "Suspended"
|
||||
"suspended": "Felfüggesztett"
|
||||
},
|
||||
"spoolman": {
|
||||
"loading": "Loading"
|
||||
"loading": "Betöltés"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Csoportok",
|
||||
"issues": "Problémák",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"merges": "Merge kérések",
|
||||
"projects": "Projektek"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Konsumsi",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Watt/jam"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Unduh",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Griglia",
|
||||
"home_power": "Consumo",
|
||||
"charge_power": "Caricatore",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "グリッド",
|
||||
"home_power": "消費",
|
||||
"charge_power": "チャージャー",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "ダウンロード",
|
||||
@ -804,7 +804,7 @@
|
||||
"ping": "Ping"
|
||||
},
|
||||
"urbackup": {
|
||||
"ok": "はい",
|
||||
"ok": "正常",
|
||||
"errored": "エラー",
|
||||
"noRecent": "期限切れ",
|
||||
"totalUsed": "使用済みストレージ"
|
||||
@ -957,7 +957,7 @@
|
||||
"disaster": "災害"
|
||||
},
|
||||
"lubelogger": {
|
||||
"vehicle": "Vehicle",
|
||||
"vehicle": "車両",
|
||||
"vehicles": "Vehicles",
|
||||
"serviceRecords": "Service Records",
|
||||
"reminders": "Reminders",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "눈금",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "다운로드",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Lejupielāde",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Penggunaan",
|
||||
"charge_power": "Pengecas",
|
||||
"watt_hour": "Wj"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Muat turun",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Netstroom",
|
||||
"home_power": "Consumptie",
|
||||
"charge_power": "Oplader",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Nett",
|
||||
"home_power": "Forbruk",
|
||||
"charge_power": "Lader",
|
||||
"watt_hour": "W/t"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Last ned",
|
||||
|
@ -13,7 +13,7 @@
|
||||
"ms": "{{value, number}}",
|
||||
"date": "{{value, date}}",
|
||||
"relativeDate": "{{value, relativeDate}}",
|
||||
"duration": "{{value, duration}}",
|
||||
"duration": "{value, duration}",
|
||||
"months": "mc",
|
||||
"days": "d",
|
||||
"hours": "g",
|
||||
@ -120,7 +120,7 @@
|
||||
"grid_power": "Siatka",
|
||||
"home_power": "Zużycie",
|
||||
"charge_power": "Ładowarka",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Pobieranie",
|
||||
@ -311,13 +311,13 @@
|
||||
},
|
||||
"suwayomi": {
|
||||
"download": "Pobrano",
|
||||
"nondownload": "Non-Downloaded",
|
||||
"nondownload": "Niepobrane",
|
||||
"read": "Przeczytane",
|
||||
"unread": "Nieprzeczytane",
|
||||
"downloadedread": "Downloaded & Read",
|
||||
"downloadedunread": "Downloaded & Unread",
|
||||
"nondownloadedread": "Non-Downloaded & Read",
|
||||
"nondownloadedunread": "Non-Downloaded & Unread"
|
||||
"downloadedread": "Pobrane i przeczytane",
|
||||
"downloadedunread": "Pobrane i nieprzeczytane",
|
||||
"nondownloadedread": "Niepobrane i przeczytane",
|
||||
"nondownloadedunread": "Niepobrane i nieprzeczytane"
|
||||
},
|
||||
"tailscale": {
|
||||
"address": "Adres",
|
||||
@ -957,18 +957,18 @@
|
||||
"disaster": "Katastrofa"
|
||||
},
|
||||
"lubelogger": {
|
||||
"vehicle": "Vehicle",
|
||||
"vehicles": "Vehicles",
|
||||
"serviceRecords": "Service Records",
|
||||
"reminders": "Reminders",
|
||||
"nextReminder": "Next Reminder",
|
||||
"none": "None"
|
||||
"vehicle": "Pojazd",
|
||||
"vehicles": "Pojazdy",
|
||||
"serviceRecords": "Wpisy serwisowe",
|
||||
"reminders": "Przypomnienia",
|
||||
"nextReminder": "Następne przypomnienie",
|
||||
"none": "Brak"
|
||||
},
|
||||
"vikunja": {
|
||||
"projects": "Active Projects",
|
||||
"tasks7d": "Tasks Due This Week",
|
||||
"tasksOverdue": "Overdue Tasks",
|
||||
"tasksInProgress": "Tasks In Progress"
|
||||
"projects": "Aktywne Projekty",
|
||||
"tasks7d": "Zadania w tym tygodniu",
|
||||
"tasksOverdue": "Zaległe zadania",
|
||||
"tasksInProgress": "Zadania w toku"
|
||||
},
|
||||
"headscale": {
|
||||
"name": "Nazwa",
|
||||
@ -980,32 +980,32 @@
|
||||
},
|
||||
"beszel": {
|
||||
"name": "Nazwa",
|
||||
"systems": "Systems",
|
||||
"systems": "Systemy",
|
||||
"up": "Dostępny",
|
||||
"status": "Stan",
|
||||
"updated": "Zaktualizowane",
|
||||
"cpu": "Procesor",
|
||||
"memory": "RAM",
|
||||
"disk": "Disk",
|
||||
"disk": "Dysk",
|
||||
"network": "NET"
|
||||
},
|
||||
"argocd": {
|
||||
"apps": "Apps",
|
||||
"synced": "Synced",
|
||||
"outOfSync": "Out Of Sync",
|
||||
"apps": "Aplikacje",
|
||||
"synced": "Synchronizowane",
|
||||
"outOfSync": "Bez synchronizacji",
|
||||
"healthy": "Zdrowy",
|
||||
"degraded": "Degraded",
|
||||
"progressing": "Progressing",
|
||||
"degraded": "Zdegradowane",
|
||||
"progressing": "Postępujące",
|
||||
"missing": "Brakujące",
|
||||
"suspended": "Suspended"
|
||||
"suspended": "Zawieszone"
|
||||
},
|
||||
"spoolman": {
|
||||
"loading": "Wczytywanie"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Grupy",
|
||||
"issues": "Zgłoszenia",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"merges": "Żądania scaleń",
|
||||
"projects": "Projekty"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grelha",
|
||||
"home_power": "Consumo",
|
||||
"charge_power": "Carregador",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Descarregar",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grade",
|
||||
"home_power": "Consumo",
|
||||
"charge_power": "Carregador",
|
||||
"watt_hour": "Kw"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Descarregar",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grilă",
|
||||
"home_power": "Consum",
|
||||
"charge_power": "Încărcător",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Descarcă",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Сетка",
|
||||
"home_power": "Потребление",
|
||||
"charge_power": "Зарядка",
|
||||
"watt_hour": "Вт/ч"
|
||||
"kilowatt": "кВт"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Скачивание",
|
||||
@ -990,22 +990,22 @@
|
||||
"network": "Сеть"
|
||||
},
|
||||
"argocd": {
|
||||
"apps": "Apps",
|
||||
"synced": "Synced",
|
||||
"outOfSync": "Out Of Sync",
|
||||
"apps": "Приложения",
|
||||
"synced": "Синхронизированные",
|
||||
"outOfSync": "Не синхронизированные",
|
||||
"healthy": "Здоровый",
|
||||
"degraded": "Degraded",
|
||||
"progressing": "Progressing",
|
||||
"degraded": "Деградированные",
|
||||
"progressing": "Выполняются",
|
||||
"missing": "Отсутствует",
|
||||
"suspended": "Suspended"
|
||||
"suspended": "Приостановленные"
|
||||
},
|
||||
"spoolman": {
|
||||
"loading": "Загрузка"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Группы",
|
||||
"issues": "Вопросы",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"merges": "Мердж-реквесты",
|
||||
"projects": "Проекты"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Mriežka",
|
||||
"home_power": "Spotreba",
|
||||
"charge_power": "Nabíjačka",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Sťahovanie",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Omrežje",
|
||||
"home_power": "Poraba",
|
||||
"charge_power": "Polnilec",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Prenos",
|
||||
@ -1003,9 +1003,9 @@
|
||||
"loading": "Nalaganje"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Skupine",
|
||||
"issues": "Težave",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"merges": "Združi zahtevke",
|
||||
"projects": "Projekti"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "ดาวน์โหลด",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Güç",
|
||||
"home_power": "Tüketim",
|
||||
"charge_power": "Şarj",
|
||||
"watt_hour": "Watt/Saat"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "İndirme",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Сітка",
|
||||
"home_power": "Споживання",
|
||||
"charge_power": "Зарядний пристрій",
|
||||
"watt_hour": "Вт/год"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Завантажено",
|
||||
@ -311,13 +311,13 @@
|
||||
},
|
||||
"suwayomi": {
|
||||
"download": "Завантажено",
|
||||
"nondownload": "Non-Downloaded",
|
||||
"nondownload": "Не завантажено",
|
||||
"read": "Прочитано",
|
||||
"unread": "Не прочитано",
|
||||
"downloadedread": "Downloaded & Read",
|
||||
"downloadedunread": "Downloaded & Unread",
|
||||
"nondownloadedread": "Non-Downloaded & Read",
|
||||
"nondownloadedunread": "Non-Downloaded & Unread"
|
||||
"downloadedread": "Завантажено та Прочитано",
|
||||
"downloadedunread": "Завантажено та Непрочитано",
|
||||
"nondownloadedread": "Не завантажено та Прочитано",
|
||||
"nondownloadedunread": "Не завантажено та Не прочитано"
|
||||
},
|
||||
"tailscale": {
|
||||
"address": "Адреса",
|
||||
@ -965,10 +965,10 @@
|
||||
"none": "Жодного"
|
||||
},
|
||||
"vikunja": {
|
||||
"projects": "Active Projects",
|
||||
"tasks7d": "Tasks Due This Week",
|
||||
"tasksOverdue": "Overdue Tasks",
|
||||
"tasksInProgress": "Tasks In Progress"
|
||||
"projects": "Активні проекти",
|
||||
"tasks7d": "Завдання цього тижня",
|
||||
"tasksOverdue": "Прострочені завдання",
|
||||
"tasksInProgress": "Завдання в процесі"
|
||||
},
|
||||
"headscale": {
|
||||
"name": "Назва",
|
||||
@ -980,32 +980,32 @@
|
||||
},
|
||||
"beszel": {
|
||||
"name": "Назва",
|
||||
"systems": "Systems",
|
||||
"systems": "Системи",
|
||||
"up": "Онлайн",
|
||||
"status": "Стан",
|
||||
"updated": "Оновлено",
|
||||
"cpu": "ЦП",
|
||||
"memory": "ОЗП",
|
||||
"disk": "Disk",
|
||||
"network": "NET"
|
||||
"disk": "Диск",
|
||||
"network": "МЕРЕЖА"
|
||||
},
|
||||
"argocd": {
|
||||
"apps": "Apps",
|
||||
"synced": "Synced",
|
||||
"outOfSync": "Out Of Sync",
|
||||
"apps": "Додатки",
|
||||
"synced": "Синхронізовано",
|
||||
"outOfSync": "Не синхронізовано",
|
||||
"healthy": "Здоровий",
|
||||
"degraded": "Degraded",
|
||||
"progressing": "Progressing",
|
||||
"degraded": "Деградує",
|
||||
"progressing": "Прогрес",
|
||||
"missing": "Відсутній",
|
||||
"suspended": "Suspended"
|
||||
"suspended": "Призупинено"
|
||||
},
|
||||
"spoolman": {
|
||||
"loading": "Завантажую"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"groups": "Групи",
|
||||
"issues": "Питання",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"merges": "Запити на злиття",
|
||||
"projects": "Проєкти"
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "電網",
|
||||
"home_power": "電源使用率",
|
||||
"charge_power": "充電",
|
||||
"watt_hour": "瓦時 (Wh)"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "下載速率",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "Grid",
|
||||
"home_power": "Consumption",
|
||||
"charge_power": "Charger",
|
||||
"watt_hour": "Wh"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "下载",
|
||||
|
@ -120,7 +120,7 @@
|
||||
"grid_power": "電網",
|
||||
"home_power": "電源使用率",
|
||||
"charge_power": "充電",
|
||||
"watt_hour": "瓦時 (Wh)"
|
||||
"kilowatt": "kW"
|
||||
},
|
||||
"flood": {
|
||||
"download": "下載速率",
|
||||
|
@ -7,7 +7,13 @@ import ErrorBoundary from "components/errorboundry";
|
||||
import List from "components/bookmarks/list";
|
||||
import ResolvedIcon from "components/resolvedicon";
|
||||
|
||||
export default function BookmarksGroup({ bookmarks, layout, disableCollapse, groupsInitiallyCollapsed }) {
|
||||
export default function BookmarksGroup({
|
||||
bookmarks,
|
||||
layout,
|
||||
disableCollapse,
|
||||
groupsInitiallyCollapsed,
|
||||
bookmarksStyle,
|
||||
}) {
|
||||
const panel = useRef();
|
||||
|
||||
useEffect(() => {
|
||||
@ -64,7 +70,7 @@ export default function BookmarksGroup({ bookmarks, layout, disableCollapse, gro
|
||||
>
|
||||
<Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
|
||||
<ErrorBoundary>
|
||||
<List bookmarks={bookmarks.bookmarks} layout={layout} />
|
||||
<List bookmarks={bookmarks.bookmarks} layout={layout} bookmarksStyle={bookmarksStyle} />
|
||||
</ErrorBoundary>
|
||||
</Disclosure.Panel>
|
||||
</Transition>
|
||||
|
@ -4,12 +4,17 @@ import classNames from "classnames";
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
import ResolvedIcon from "components/resolvedicon";
|
||||
|
||||
export default function Item({ bookmark }) {
|
||||
export default function Item({ bookmark, iconOnly = false }) {
|
||||
const description = bookmark.description ?? new URL(bookmark.href).hostname;
|
||||
const { settings } = useContext(SettingsContext);
|
||||
|
||||
return (
|
||||
<li key={bookmark.name} id={bookmark.id} className="bookmark" data-name={bookmark.name}>
|
||||
<li
|
||||
key={bookmark.name}
|
||||
id={bookmark.id}
|
||||
className={classNames("bookmark", iconOnly && "grid")}
|
||||
data-name={bookmark.name}
|
||||
>
|
||||
<a
|
||||
href={bookmark.href}
|
||||
title={bookmark.name}
|
||||
@ -17,25 +22,37 @@ export default function Item({ bookmark }) {
|
||||
target={bookmark.target ?? settings.target ?? "_blank"}
|
||||
className={classNames(
|
||||
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`,
|
||||
"block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10",
|
||||
"text-left cursor-pointer transition-all rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10",
|
||||
iconOnly ? "h-[60px] w-[60px] grid" : "block w-full h-15 mb-3",
|
||||
)}
|
||||
>
|
||||
<div className="flex">
|
||||
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md bookmark-icon">
|
||||
{iconOnly ? (
|
||||
<div className="flex items-center justify-center text-theme-700 hover:text-theme-700 dark:text-theme-200 text-xl font-medium rounded-md bookmark-icon py-0.5">
|
||||
{bookmark.icon && (
|
||||
<div className="flex-shrink-0 w-5 h-5">
|
||||
<div className="w-7 h-7">
|
||||
<ResolvedIcon icon={bookmark.icon} alt={bookmark.abbr} />
|
||||
</div>
|
||||
)}
|
||||
{!bookmark.icon && bookmark.abbr}
|
||||
</div>
|
||||
<div className="flex-1 overflow-hidden flex items-center justify-between rounded-r-md bookmark-text">
|
||||
<div className="pl-3 py-2 text-xs bookmark-name">{bookmark.name}</div>
|
||||
<div className="shrink truncate px-2 py-2 text-theme-500 dark:text-theme-300 text-xs bookmark-description">
|
||||
{description}
|
||||
) : (
|
||||
<div className="flex">
|
||||
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md bookmark-icon">
|
||||
{bookmark.icon && (
|
||||
<div className="flex-shrink-0 w-5 h-5">
|
||||
<ResolvedIcon icon={bookmark.icon} alt={bookmark.abbr} />
|
||||
</div>
|
||||
)}
|
||||
{!bookmark.icon && bookmark.abbr}
|
||||
</div>
|
||||
<div className="flex-1 overflow-hidden flex items-center justify-between rounded-r-md bookmark-text">
|
||||
<div className="pl-3 py-2 text-xs bookmark-name">{bookmark.name}</div>
|
||||
<div className="shrink truncate px-2 py-2 text-theme-500 dark:text-theme-300 text-xs bookmark-description">
|
||||
{description}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
|
@ -4,16 +4,22 @@ import { columnMap } from "../../utils/layout/columns";
|
||||
|
||||
import Item from "components/bookmarks/item";
|
||||
|
||||
export default function List({ bookmarks, layout }) {
|
||||
export default function List({ bookmarks, layout, bookmarksStyle }) {
|
||||
let classes =
|
||||
layout?.style === "row" ? `grid ${columnMap[layout?.columns]} gap-x-2` : "flex flex-col mt-3 bookmark-list";
|
||||
const style = {};
|
||||
if (layout?.iconsOnly || bookmarksStyle === "icons") {
|
||||
classes = "grid gap-3 mt-3 bookmark-list";
|
||||
style.gridTemplateColumns = "repeat(auto-fill, minmax(60px, 1fr))";
|
||||
}
|
||||
return (
|
||||
<ul
|
||||
className={classNames(
|
||||
layout?.style === "row" ? `grid ${columnMap[layout?.columns]} gap-x-2` : "flex flex-col",
|
||||
"mt-3 bookmark-list",
|
||||
)}
|
||||
>
|
||||
<ul className={classNames(classes)} style={style}>
|
||||
{bookmarks.map((bookmark) => (
|
||||
<Item key={`${bookmark.name}-${bookmark.href}`} bookmark={bookmark} />
|
||||
<Item
|
||||
key={`${bookmark.name}-${bookmark.href}`}
|
||||
bookmark={bookmark}
|
||||
iconOnly={layout?.iconsOnly || bookmarksStyle === "icons"}
|
||||
/>
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
|
@ -129,7 +129,7 @@ export default function QuickLaunch({ servicesAndBookmarks, searchString, setSea
|
||||
useEffect(() => {
|
||||
const abortController = new AbortController();
|
||||
|
||||
if (searchString.length === 0) setResults([]);
|
||||
if (searchString.trim().length === 0) setResults([]);
|
||||
else {
|
||||
let newResults = servicesAndBookmarks.filter((r) => {
|
||||
const nameMatch = r.name.toLowerCase().includes(searchString);
|
||||
|
@ -3,12 +3,13 @@ import classNames from "classnames";
|
||||
import { Disclosure, Transition } from "@headlessui/react";
|
||||
import { MdKeyboardArrowDown } from "react-icons/md";
|
||||
|
||||
import { columnMap } from "../../utils/layout/columns";
|
||||
|
||||
import List from "components/services/list";
|
||||
import ResolvedIcon from "components/resolvedicon";
|
||||
|
||||
export default function ServicesGroup({
|
||||
group,
|
||||
services,
|
||||
layout,
|
||||
fiveColumns,
|
||||
disableCollapse,
|
||||
@ -23,7 +24,7 @@ export default function ServicesGroup({
|
||||
|
||||
return (
|
||||
<div
|
||||
key={services.name}
|
||||
key={group.name}
|
||||
className={classNames(
|
||||
"services-group",
|
||||
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
|
||||
@ -42,7 +43,7 @@ export default function ServicesGroup({
|
||||
</div>
|
||||
)}
|
||||
<h2 className="flex text-theme-800 dark:text-theme-300 text-xl font-medium service-group-name">
|
||||
{services.name}
|
||||
{group.name}
|
||||
</h2>
|
||||
<MdKeyboardArrowDown
|
||||
className={classNames(
|
||||
@ -74,7 +75,31 @@ export default function ServicesGroup({
|
||||
}}
|
||||
>
|
||||
<Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
|
||||
<List group={group} services={services.services} layout={layout} useEqualHeights={useEqualHeights} />
|
||||
<List
|
||||
groupName={group.name}
|
||||
services={group.services}
|
||||
layout={layout}
|
||||
useEqualHeights={useEqualHeights}
|
||||
/>
|
||||
{group.groups?.length > 0 && (
|
||||
<div
|
||||
className={`grid ${
|
||||
layout?.style === "row" ? `grid ${columnMap[layout?.columns]} gap-x-2` : "flex flex-col"
|
||||
} gap-2`}
|
||||
>
|
||||
{group.groups.map((subgroup) => (
|
||||
<ServicesGroup
|
||||
key={subgroup.name}
|
||||
group={subgroup}
|
||||
layout={layout?.[subgroup.name]}
|
||||
fiveColumns={fiveColumns}
|
||||
disableCollapse={disableCollapse}
|
||||
useEqualHeights={useEqualHeights}
|
||||
groupsInitiallyCollapsed={groupsInitiallyCollapsed}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</Disclosure.Panel>
|
||||
</Transition>
|
||||
</>
|
||||
|
@ -12,7 +12,7 @@ import Kubernetes from "widgets/kubernetes/component";
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
import ResolvedIcon from "components/resolvedicon";
|
||||
|
||||
export default function Item({ service, group, useEqualHeights }) {
|
||||
export default function Item({ service, groupName, useEqualHeights }) {
|
||||
const hasLink = service.href && service.href !== "#";
|
||||
const { settings } = useContext(SettingsContext);
|
||||
const showStats = service.showStats === false ? false : settings.showStats;
|
||||
@ -90,14 +90,14 @@ export default function Item({ service, group, useEqualHeights }) {
|
||||
>
|
||||
{service.ping && (
|
||||
<div className="flex-shrink-0 flex items-center justify-center service-tag service-ping">
|
||||
<Ping group={group} service={service.name} style={statusStyle} />
|
||||
<Ping groupName={groupName} serviceName={service.name} style={statusStyle} />
|
||||
<span className="sr-only">Ping status</span>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{service.siteMonitor && (
|
||||
<div className="flex-shrink-0 flex items-center justify-center service-tag service-site-monitor">
|
||||
<SiteMonitor group={group} service={service.name} style={statusStyle} />
|
||||
<SiteMonitor groupName={groupName} serviceName={service.name} style={statusStyle} />
|
||||
<span className="sr-only">Site monitor status</span>
|
||||
</div>
|
||||
)}
|
||||
@ -154,7 +154,9 @@ export default function Item({ service, group, useEqualHeights }) {
|
||||
</div>
|
||||
)}
|
||||
|
||||
{service.widget && <Widget service={service} />}
|
||||
{service.widgets.map((widget) => (
|
||||
<Widget widget={widget} service={service} key={widget.index} />
|
||||
))}
|
||||
</div>
|
||||
</li>
|
||||
);
|
||||
|
@ -4,7 +4,7 @@ import { columnMap } from "../../utils/layout/columns";
|
||||
|
||||
import Item from "components/services/item";
|
||||
|
||||
export default function List({ group, services, layout, useEqualHeights }) {
|
||||
export default function List({ groupName, services, layout, useEqualHeights }) {
|
||||
return (
|
||||
<ul
|
||||
className={classNames(
|
||||
@ -16,7 +16,7 @@ export default function List({ group, services, layout, useEqualHeights }) {
|
||||
<Item
|
||||
key={[service.container, service.app, service.name].filter((s) => s).join("-")}
|
||||
service={service}
|
||||
group={group}
|
||||
groupName={groupName}
|
||||
useEqualHeights={layout?.useEqualHeights ?? useEqualHeights}
|
||||
/>
|
||||
))}
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { useTranslation } from "react-i18next";
|
||||
import useSWR from "swr";
|
||||
|
||||
export default function Ping({ group, service, style }) {
|
||||
export default function Ping({ groupName, serviceName, style }) {
|
||||
const { t } = useTranslation();
|
||||
const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ group, service }).toString()}`, {
|
||||
const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ groupName, serviceName }).toString()}`, {
|
||||
refreshInterval: 30000,
|
||||
});
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { useTranslation } from "react-i18next";
|
||||
import useSWR from "swr";
|
||||
|
||||
export default function SiteMonitor({ group, service, style }) {
|
||||
export default function SiteMonitor({ groupName, serviceName, style }) {
|
||||
const { t } = useTranslation();
|
||||
const { data, error } = useSWR(`/api/siteMonitor?${new URLSearchParams({ group, service }).toString()}`, {
|
||||
const { data, error } = useSWR(`/api/siteMonitor?${new URLSearchParams({ groupName, serviceName }).toString()}`, {
|
||||
refreshInterval: 30000,
|
||||
});
|
||||
|
||||
|
@ -3,22 +3,24 @@ import { useTranslation } from "next-i18next";
|
||||
import ErrorBoundary from "components/errorboundry";
|
||||
import components from "widgets/components";
|
||||
|
||||
export default function Widget({ service }) {
|
||||
export default function Widget({ widget, service }) {
|
||||
const { t } = useTranslation("common");
|
||||
|
||||
const ServiceWidget = components[service.widget.type];
|
||||
const ServiceWidget = components[widget.type];
|
||||
|
||||
const fullService = Object.apply({}, service);
|
||||
fullService.widget = widget;
|
||||
if (ServiceWidget) {
|
||||
return (
|
||||
<ErrorBoundary>
|
||||
<ServiceWidget service={service} />
|
||||
<ServiceWidget service={fullService} />
|
||||
</ErrorBoundary>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1 service-missing">
|
||||
<div className="font-thin text-sm">{t("widget.missing_type", { type: service.widget.type })}</div>
|
||||
<div className="font-thin text-sm">{t("widget.missing_type", { type: widget.type })}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
47
src/components/widgets/resources/network.jsx
Normal file
47
src/components/widgets/resources/network.jsx
Normal file
@ -0,0 +1,47 @@
|
||||
import useSWR from "swr";
|
||||
import { FaNetworkWired } from "react-icons/fa";
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Resource from "../widget/resource";
|
||||
import Error from "../widget/error";
|
||||
|
||||
export default function Network({ options, refresh = 1500 }) {
|
||||
const { t } = useTranslation();
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
if (options.network === true) options.network = "default";
|
||||
|
||||
const { data, error } = useSWR(`/api/widgets/resources?type=network&interfaceName=${options.network}`, {
|
||||
refreshInterval: refresh,
|
||||
});
|
||||
|
||||
if (error || data?.error) {
|
||||
return <Error />;
|
||||
}
|
||||
|
||||
if (!data || !data.network || !data.network.rx_sec || !data.network.tx_sec) {
|
||||
return (
|
||||
<Resource
|
||||
icon={FaNetworkWired}
|
||||
value="- ↑"
|
||||
label="- ↓"
|
||||
expandedValue="- ↑"
|
||||
expandedLabel="- ↓"
|
||||
percentage="0"
|
||||
wide
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Resource
|
||||
icon={FaNetworkWired}
|
||||
value={`${t("common.byterate", { value: data.network.tx_sec })} ↑`}
|
||||
label={`${t("common.byterate", { value: data.network.rx_sec })} ↓`}
|
||||
expandedValue={`${t("common.bytes", { value: data.network.tx_bytes })} ↑`}
|
||||
expandedLabel={`${t("common.bytes", { value: data.network.rx_bytes })} ↓`}
|
||||
expanded={options.expanded}
|
||||
wide
|
||||
percentage={(100 * data.network.rx_sec) / (data.network.rx_sec + data.network.tx_sec)}
|
||||
/>
|
||||
);
|
||||
}
|
@ -6,6 +6,7 @@ import Cpu from "./cpu";
|
||||
import Memory from "./memory";
|
||||
import CpuTemp from "./cputemp";
|
||||
import Uptime from "./uptime";
|
||||
import Network from "./network";
|
||||
|
||||
export default function Resources({ options }) {
|
||||
const { expanded, units, diskUnits, tempmin, tempmax } = options;
|
||||
@ -23,6 +24,7 @@ export default function Resources({ options }) {
|
||||
<Disk key={disk} options={{ disk }} expanded={expanded} diskUnits={diskUnits} refresh={refresh} />
|
||||
))
|
||||
: options.disk && <Disk options={options} expanded={expanded} diskUnits={diskUnits} refresh={refresh} />}
|
||||
{options.network && <Network options={options} refresh={refresh} />}
|
||||
{options.cputemp && (
|
||||
<CpuTemp expanded={expanded} units={units} refresh={refresh} tempmin={tempmin} tempmax={tempmax} />
|
||||
)}
|
||||
|
@ -94,6 +94,7 @@ export default function Search({ options }) {
|
||||
if (
|
||||
options.showSearchSuggestions &&
|
||||
(selectedProvider.suggestionUrl || options.suggestionUrl) && // custom providers pass url via options
|
||||
query.trim().length > 0 &&
|
||||
query.trim() !== searchSuggestions[0]
|
||||
) {
|
||||
fetch(`/api/search/searchSuggestion?query=${encodeURIComponent(query)}&providerName=${selectedProvider.name}`, {
|
||||
|
@ -51,7 +51,9 @@ export default function Widget({ options }) {
|
||||
key={stock.ticker}
|
||||
className="rounded h-full text-xs px-1 w-[4.75rem] flex flex-col items-center justify-center"
|
||||
>
|
||||
<span className="text-theme-800 dark:text-theme-200 text-xs">{stock.ticker}</span>
|
||||
<span className="text-theme-800 dark:text-theme-200 text-xs">
|
||||
{stock.ticker.split(":").pop()}
|
||||
</span>
|
||||
{!viewingPercentChange ? (
|
||||
<span
|
||||
className={
|
||||
|
@ -1,10 +1,13 @@
|
||||
import classNames from "classnames";
|
||||
import { useContext } from "react";
|
||||
|
||||
import WidgetIcon from "./widget_icon";
|
||||
import PrimaryText from "./primary_text";
|
||||
import SecondaryText from "./secondary_text";
|
||||
import Raw from "./raw";
|
||||
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
|
||||
export function getAllClasses(options, additionalClassNames = "") {
|
||||
if (options?.style?.header === "boxedWidgets") {
|
||||
if (options?.style?.cardBlur !== undefined) {
|
||||
@ -56,7 +59,17 @@ export function getBottomBlock(children) {
|
||||
}
|
||||
|
||||
export default function Container({ children = [], options, additionalClassNames = "" }) {
|
||||
return (
|
||||
const { settings } = useContext(SettingsContext);
|
||||
return options?.href ? (
|
||||
<a
|
||||
href={options.href}
|
||||
target={options.target ?? settings.target ?? "_blank"}
|
||||
className={getAllClasses(options, `${additionalClassNames} widget-container`)}
|
||||
>
|
||||
{getInnerBlock(children)}
|
||||
{getBottomBlock(children)}
|
||||
</a>
|
||||
) : (
|
||||
<div className={getAllClasses(options, `${additionalClassNames} widget-container`)}>
|
||||
{getInnerBlock(children)}
|
||||
{getBottomBlock(children)}
|
||||
|
@ -10,6 +10,7 @@ export default function Resource({
|
||||
percentage,
|
||||
expanded = false,
|
||||
additionalClassNames = "",
|
||||
wide = false,
|
||||
}) {
|
||||
const Icon = icon;
|
||||
|
||||
@ -18,7 +19,11 @@ export default function Resource({
|
||||
className={`flex-none flex flex-row items-center mr-3 py-1.5 information-widget-resource ${additionalClassNames}`}
|
||||
>
|
||||
<Icon className="text-theme-800 dark:text-theme-200 w-5 h-5 resource-icon" />
|
||||
<div className={`flex flex-col ml-3 text-left min-w-[85px] ${expanded ? " expanded" : ""}`}>
|
||||
<div
|
||||
className={`flex flex-col ml-3 text-left ${expanded ? " expanded" : ""} ${
|
||||
wide ? " min-w-[120px]" : "min-w-[85px]"
|
||||
}`}
|
||||
>
|
||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||
<div className="pl-0.5">{value}</div>
|
||||
<div className="pr-1">{label}</div>
|
||||
|
@ -10,6 +10,8 @@ export default function Document() {
|
||||
/>
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<link rel="manifest" href="/site.webmanifest?v=4" crossOrigin="use-credentials" />
|
||||
<link rel="preload" href="/api/config/custom.css" as="style" />
|
||||
<link rel="stylesheet" href="/api/config/custom.css" /> {/* eslint-disable-line @next/next/no-css-tags */}
|
||||
</Head>
|
||||
<body>
|
||||
<Main />
|
||||
|
@ -6,10 +6,10 @@ import createLogger from "utils/logger";
|
||||
const logger = createLogger("ping");
|
||||
|
||||
export default async function handler(req, res) {
|
||||
const { group, service } = req.query;
|
||||
const serviceItem = await getServiceItem(group, service);
|
||||
const { groupName, serviceName } = req.query;
|
||||
const serviceItem = await getServiceItem(groupName, serviceName);
|
||||
if (!serviceItem) {
|
||||
logger.debug(`No service item found for group ${group} named ${service}`);
|
||||
logger.debug(`No service item found for group ${groupName} named ${serviceName}`);
|
||||
return res.status(400).send({
|
||||
error: "Unable to find service, see log for details.",
|
||||
});
|
||||
|
@ -9,8 +9,8 @@ const logger = createLogger("servicesProxy");
|
||||
|
||||
export default async function handler(req, res) {
|
||||
try {
|
||||
const { service, group } = req.query;
|
||||
const serviceWidget = await getServiceWidget(group, service);
|
||||
const { service, group, index } = req.query;
|
||||
const serviceWidget = await getServiceWidget(group, service, index);
|
||||
let type = serviceWidget?.type;
|
||||
|
||||
// exceptions
|
||||
@ -41,7 +41,7 @@ export default async function handler(req, res) {
|
||||
const endpoint = mapping?.endpoint;
|
||||
const endpointProxy = mapping?.proxyHandler || serviceProxyHandler;
|
||||
|
||||
if (mapping.method && mapping.method !== req.method) {
|
||||
if (mapping?.method && mapping.method !== req.method) {
|
||||
logger.debug("Unsupported method: %s", req.method);
|
||||
return res.status(403).json({ error: "Unsupported method" });
|
||||
}
|
||||
|
@ -7,10 +7,10 @@ import { httpProxy } from "utils/proxy/http";
|
||||
const logger = createLogger("siteMonitor");
|
||||
|
||||
export default async function handler(req, res) {
|
||||
const { group, service } = req.query;
|
||||
const serviceItem = await getServiceItem(group, service);
|
||||
const { groupName, serviceName } = req.query;
|
||||
const serviceItem = await getServiceItem(groupName, serviceName);
|
||||
if (!serviceItem) {
|
||||
logger.debug(`No service item found for group ${group} named ${service}`);
|
||||
logger.debug(`No service item found for group ${groupName} named ${serviceName}`);
|
||||
return res.status(400).send({
|
||||
error: "Unable to find service, see log for details.",
|
||||
});
|
||||
|
@ -7,7 +7,7 @@ const logger = createLogger("resources");
|
||||
const si = require("systeminformation");
|
||||
|
||||
export default async function handler(req, res) {
|
||||
const { type, target } = req.query;
|
||||
const { type, target, interfaceName = "default" } = req.query;
|
||||
|
||||
if (type === "cpu") {
|
||||
const load = await si.currentLoad();
|
||||
@ -57,6 +57,32 @@ export default async function handler(req, res) {
|
||||
});
|
||||
}
|
||||
|
||||
if (type === "network") {
|
||||
let networkData = await si.networkStats();
|
||||
let interfaceDefault;
|
||||
logger.debug("networkData:", JSON.stringify(networkData));
|
||||
if (interfaceName && interfaceName !== "default") {
|
||||
networkData = networkData.filter((network) => network.iface === interfaceName).at(0);
|
||||
if (!networkData) {
|
||||
return res.status(404).json({
|
||||
error: "Interface not found",
|
||||
});
|
||||
}
|
||||
} else {
|
||||
interfaceDefault = await si.networkInterfaceDefault();
|
||||
networkData = networkData.filter((network) => network.iface === interfaceDefault).at(0);
|
||||
if (!networkData) {
|
||||
return res.status(404).json({
|
||||
error: "Default interface not found",
|
||||
});
|
||||
}
|
||||
}
|
||||
return res.status(200).json({
|
||||
network: networkData,
|
||||
interface: interfaceName !== "default" ? interfaceName : interfaceDefault,
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(400).json({
|
||||
error: "invalid type",
|
||||
});
|
||||
|
@ -1,9 +1,14 @@
|
||||
import cachedFetch from "utils/proxy/cached-fetch";
|
||||
import { getSettings } from "utils/config/config";
|
||||
import createLogger from "utils/logger";
|
||||
|
||||
const logger = createLogger("stocks");
|
||||
|
||||
export default async function handler(req, res) {
|
||||
const { watchlist, provider, cache } = req.query;
|
||||
|
||||
logger.debug("Stocks API request: %o", { watchlist, provider, cache });
|
||||
|
||||
if (!watchlist) {
|
||||
return res.status(400).json({ error: "Missing watchlist" });
|
||||
}
|
||||
@ -56,6 +61,7 @@ export default async function handler(req, res) {
|
||||
// Finnhub free accounts allow up to 60 calls/minute
|
||||
// https://finnhub.io/pricing
|
||||
const { c, dp } = await cachedFetch(apiUrl, cache || 1);
|
||||
logger.debug("Finnhub API response for %s: %o", ticker, { c, dp });
|
||||
|
||||
// API sometimes returns 200, but values returned are `null`
|
||||
if (c === null || dp === null) {
|
||||
|
@ -291,13 +291,13 @@ function Home({ initialSettings }) {
|
||||
group.services ? (
|
||||
<ServicesGroup
|
||||
key={group.name}
|
||||
group={group.name}
|
||||
services={group}
|
||||
group={group}
|
||||
layout={settings.layout?.[group.name]}
|
||||
fiveColumns={settings.fiveColumns}
|
||||
disableCollapse={settings.disableCollapse}
|
||||
useEqualHeights={settings.useEqualHeights}
|
||||
groupsInitiallyCollapsed={settings.groupsInitiallyCollapsed}
|
||||
bookmarksStyle={settings.bookmarksStyle}
|
||||
/>
|
||||
) : (
|
||||
<BookmarksGroup
|
||||
@ -316,8 +316,7 @@ function Home({ initialSettings }) {
|
||||
{serviceGroups.map((group) => (
|
||||
<ServicesGroup
|
||||
key={group.name}
|
||||
group={group.name}
|
||||
services={group}
|
||||
group={group}
|
||||
layout={settings.layout?.[group.name]}
|
||||
fiveColumns={settings.fiveColumns}
|
||||
disableCollapse={settings.disableCollapse}
|
||||
@ -335,6 +334,7 @@ function Home({ initialSettings }) {
|
||||
layout={settings.layout?.[group.name]}
|
||||
disableCollapse={settings.disableCollapse}
|
||||
groupsInitiallyCollapsed={settings.groupsInitiallyCollapsed}
|
||||
bookmarksStyle={settings.bookmarksStyle}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
@ -352,13 +352,14 @@ function Home({ initialSettings }) {
|
||||
settings.useEqualHeights,
|
||||
settings.cardBlur,
|
||||
settings.groupsInitiallyCollapsed,
|
||||
settings.bookmarksStyle,
|
||||
initialSettings.layout,
|
||||
]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<title>{settings.title || "Homepage"}</title>
|
||||
<title>{initialSettings.title || "Homepage"}</title>
|
||||
{settings.base && <base href={settings.base} />}
|
||||
{settings.favicon ? (
|
||||
<>
|
||||
@ -376,8 +377,6 @@ function Home({ initialSettings }) {
|
||||
)}
|
||||
<meta name="msapplication-TileColor" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
|
||||
<meta name="theme-color" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
|
||||
<link rel="preload" href="/api/config/custom.css" as="style" />
|
||||
<link rel="stylesheet" href="/api/config/custom.css" /> {/* eslint-disable-line @next/next/no-css-tags */}
|
||||
</Head>
|
||||
|
||||
<Script src="/api/config/custom.js" />
|
||||
@ -454,6 +453,7 @@ function Home({ initialSettings }) {
|
||||
}
|
||||
|
||||
export default function Wrapper({ initialSettings, fallback }) {
|
||||
const { theme } = useContext(ThemeContext);
|
||||
const wrappedStyle = {};
|
||||
let backgroundBlur = false;
|
||||
let backgroundSaturate = false;
|
||||
@ -484,8 +484,9 @@ export default function Wrapper({ initialSettings, fallback }) {
|
||||
id="page_wrapper"
|
||||
className={classNames(
|
||||
"relative",
|
||||
initialSettings.theme && initialSettings.theme,
|
||||
theme && theme,
|
||||
initialSettings.color && `theme-${initialSettings.color}`,
|
||||
theme === "dark" ? "scheme-dark" : "scheme-light",
|
||||
)}
|
||||
>
|
||||
<div
|
||||
|
@ -1,6 +1,6 @@
|
||||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://gethomepage.dev/configs/services
|
||||
# https://gethomepage.dev/configs/services/
|
||||
|
||||
- My First Group:
|
||||
- My First Service:
|
||||
|
@ -1,6 +1,6 @@
|
||||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://gethomepage.dev/configs/settings
|
||||
# https://gethomepage.dev/configs/settings/
|
||||
|
||||
providers:
|
||||
openweathermap: openweathermapapikey
|
||||
|
@ -1,6 +1,6 @@
|
||||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://gethomepage.dev/configs/service-widgets
|
||||
# https://gethomepage.dev/configs/info-widgets/
|
||||
|
||||
- resources:
|
||||
cpu: true
|
||||
|
@ -16,6 +16,7 @@ body {
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
letter-spacing: 0.1px;
|
||||
}
|
||||
|
||||
#page_wrapper {
|
||||
|
@ -10,6 +10,7 @@ import {
|
||||
servicesFromDocker,
|
||||
cleanServiceGroups,
|
||||
servicesFromKubernetes,
|
||||
findGroupByName,
|
||||
} from "utils/config/service-helpers";
|
||||
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
|
||||
|
||||
@ -84,6 +85,17 @@ export async function widgetsResponse() {
|
||||
return configuredWidgets;
|
||||
}
|
||||
|
||||
function mergeSubgroups(configuredGroups, mergedGroup) {
|
||||
configuredGroups.forEach((group) => {
|
||||
if (group.name === mergedGroup.name) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
group.services = mergedGroup.services;
|
||||
} else if (group.groups) {
|
||||
mergeSubgroups(group.groups, mergedGroup);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export async function servicesResponse() {
|
||||
let discoveredDockerServices;
|
||||
let discoveredKubernetesServices;
|
||||
@ -140,25 +152,29 @@ export async function servicesResponse() {
|
||||
const definedLayouts = initialSettings.layout ? Object.keys(initialSettings.layout) : null;
|
||||
|
||||
mergedGroupsNames.forEach((groupName) => {
|
||||
const discoveredDockerGroup = discoveredDockerServices.find((group) => group.name === groupName) || {
|
||||
const discoveredDockerGroup = findGroupByName(discoveredDockerServices, groupName) || {
|
||||
services: [],
|
||||
};
|
||||
const discoveredKubernetesGroup = discoveredKubernetesServices.find((group) => group.name === groupName) || {
|
||||
const discoveredKubernetesGroup = findGroupByName(discoveredKubernetesServices, groupName) || {
|
||||
services: [],
|
||||
};
|
||||
const configuredGroup = configuredServices.find((group) => group.name === groupName) || { services: [] };
|
||||
const configuredGroup = findGroupByName(configuredServices, groupName) || { services: [], groups: [] };
|
||||
|
||||
const mergedGroup = {
|
||||
name: groupName,
|
||||
services: [...discoveredDockerGroup.services, ...discoveredKubernetesGroup.services, ...configuredGroup.services]
|
||||
.filter((service) => service)
|
||||
.sort(compareServices),
|
||||
groups: [...configuredGroup.groups],
|
||||
};
|
||||
|
||||
if (definedLayouts) {
|
||||
const layoutIndex = definedLayouts.findIndex((layout) => layout === mergedGroup.name);
|
||||
if (layoutIndex > -1) sortedGroups[layoutIndex] = mergedGroup;
|
||||
else unsortedGroups.push(mergedGroup);
|
||||
else if (configuredGroup.name) {
|
||||
// this is a nested group, so find the parent group and merge the services
|
||||
mergeSubgroups(configuredServices, mergedGroup);
|
||||
} else unsortedGroups.push(mergedGroup);
|
||||
} else {
|
||||
unsortedGroups.push(mergedGroup);
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user