diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 96b1e1bcf2..a6e0d46a7c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,17 +4,25 @@ "name": "Dashy", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/devcontainers/javascript-node:1-24-bookworm", + "customizations": { "vscode": { "extensions": [ "Vue.volar", "dbaeumer.vscode-eslint", - "ms-azuretools.vscode-docker", + "ms-azuretools.vscode-containers", "EditorConfig.EditorConfig", - "esbenp.prettier-vscode", "vitest.explorer", "redhat.vscode-yaml" - ] + ], + "settings": { + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "eslint.validate": ["javascript", "vue"], + "files.eol": "\n" + } } }, @@ -23,11 +31,25 @@ "ghcr.io/devcontainers/features/github-cli:1": {} }, - // Make the dev server and production server ports available locally. - "forwardPorts": [8080, 4000], + // Ports to forward to the host (Codespaces / Dev Containers will surface these). + "forwardPorts": [8080, 4000, 4001], + "portsAttributes": { + "8080": { + "label": "Vite Dev Server", + "onAutoForward": "openPreview" + }, + "4000": { + "label": "Dashy (Production)", + "onAutoForward": "notify" + }, + "4001": { + "label": "Dashy (SSL)", + "onAutoForward": "silent" + } + }, - // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "yarn install --ignore-engines --network-timeout 300000" + // Runs once after the container is created, then VS Code attaches. + "postCreateCommand": "yarn install --network-timeout 600000" // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root" diff --git a/.dockerignore b/.dockerignore index 5662588360..56f6534197 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,9 +1,15 @@ -# Files specified here are not required for Docker -# so ignoring them helps to reduce the container size -# The Docker container MUST have the following files: -# package.json yarn.lock server.js vue.config.js src/ services/ - -node_modules -docs -.git -.github +# Files specified here are not required for Docker +# Excluding them helps keep the build context lite +node_modules +docs +tests +dist +.git +.github + +# The only things needed to build the Dockerfile are: +# Depens: package.json, yarn.lock +# Setup: tsconfig.json, vite.config.mjs +# Client: index.html, src/, public/ +# Server: services/, server.js +# Config: user-data/conf.yml diff --git a/.env b/.env index 87202c329b..867b40cd7b 100644 --- a/.env +++ b/.env @@ -37,23 +37,20 @@ # If using BASIC_AUTH above, set these to the same values to skip the browser auth prompt # Requires a rebuild to take effect - only use on trusted networks -# VUE_APP_BASIC_AUTH_USERNAME= -# VUE_APP_BASIC_AUTH_PASSWORD= +# VITE_APP_BASIC_AUTH_USERNAME= +# VITE_APP_BASIC_AUTH_PASSWORD= # Override where the path to the configuration file is, can be a remote URL -# VUE_APP_CONFIG_PATH=/conf.yml +# VITE_APP_CONFIG_PATH=/conf.yml # Usually the same as BASE_URL, but accessible in frontend -# VUE_APP_DOMAIN=https://dashy.to +# VITE_APP_DOMAIN=https://dashy.to # Override the page title for the frontend app -# VUE_APP_TITLE='' - -# Set the default view to load on startup (can be `minimal`, `workspace` or `home`) -# VUE_APP_STARTING_VIEW=home +# VITE_APP_TITLE='' # Set the Vue app routing mode (can be 'hash', 'history' or 'abstract') -# VUE_APP_ROUTING_MODE=history +# VITE_APP_ROUTING_MODE=history # Should enable SRI for build script and link resources # INTEGRITY=true @@ -62,11 +59,11 @@ # IS_DOCKER=true # Again, set automatically using package.json during build time -# VUE_APP_VERSION=2.0.0 +# VITE_APP_VERSION=2.0.0 # Directory for conf.yml backups # BACKUP_DIR=./user-data/config-backups -# Setup any other user defined vars by prepending VUE_APP_ to the var name -# VUE_APP_pihole_ip=http://your.pihole.ip -# VUE_APP_pihole_key=your_pihole_secret_key +# Setup any other user defined vars by prepending VITE_APP_ to the var name +# VITE_APP_pihole_ip=http://your.pihole.ip +# VITE_APP_pihole_key=your_pihole_secret_key diff --git a/.github/workflows/docker-build-publish.yml b/.github/workflows/docker-build-publish.yml index 2b3c768447..22757c2213 100644 --- a/.github/workflows/docker-build-publish.yml +++ b/.github/workflows/docker-build-publish.yml @@ -39,13 +39,10 @@ jobs: type=raw,value=latest flavor: | latest=false - labels: | - maintainer=Lissy93 - org.opencontainers.image.title=Dashy - org.opencontainers.image.description=A self-hosted startpage for your server - org.opencontainers.image.documentation=https://dashy.to/docs - org.opencontainers.image.authors=Alicia Sykes - org.opencontainers.image.licenses=MIT + + - name: โฑ๏ธ Capture Build Timestamp + id: timestamp + run: echo "iso=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_OUTPUT" - name: ๐Ÿ”ง Set up QEMU uses: docker/setup-qemu-action@v4 @@ -71,12 +68,17 @@ jobs: - name: ๐Ÿšฆ Check Registry Status uses: crazy-max/ghaction-docker-status@v4 - - name: โš’๏ธ Build and push + - name: โš’๏ธ Build and Push uses: docker/build-push-action@v7 with: context: . file: ./Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7 tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + build-args: | + VERSION=${{ steps.meta.outputs.version }} + REVISION=${{ github.sha }} + CREATED=${{ steps.timestamp.outputs.iso }} + cache-from: type=gha + cache-to: type=gha,mode=max push: true diff --git a/.github/workflows/pr-quality-check.yml b/.github/workflows/pr-quality-check.yml index 18b3ed0009..51b3af22e6 100644 --- a/.github/workflows/pr-quality-check.yml +++ b/.github/workflows/pr-quality-check.yml @@ -30,6 +30,25 @@ jobs: - name: ๐Ÿ” Run ESLint run: yarn lint + typecheck: + name: ๐Ÿงท Type Check + runs-on: ubuntu-latest + steps: + - name: ๐Ÿ›Ž๏ธ Checkout Code + uses: actions/checkout@v6 + + - name: ๐Ÿ”ง Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '20' + cache: 'yarn' + + - name: ๐Ÿ“ฆ Install Dependencies + run: yarn install --frozen-lockfile + + - name: ๐Ÿงท Run vue-tsc + run: yarn typecheck + test: name: ๐Ÿงช Run Tests runs-on: ubuntu-latest @@ -67,8 +86,6 @@ jobs: - name: ๐Ÿ—๏ธ Build Project run: yarn build - env: - NODE_OPTIONS: --openssl-legacy-provider - name: โœ… Verify Build Output run: | diff --git a/.github/workflows/update-docs-site.yml b/.github/workflows/update-docs-site.yml index 53faf44b20..de1f627c43 100644 --- a/.github/workflows/update-docs-site.yml +++ b/.github/workflows/update-docs-site.yml @@ -55,8 +55,6 @@ jobs: - name: Run script to update documentation ๐Ÿช„ working-directory: website-docs - env: - NODE_OPTIONS: '--openssl-legacy-provider' run: | cp -r ../master-docs/docs ./ python ./do-doc-updaty-magic.py diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index b0a726d8da..0000000000 --- a/.gitpod.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Config for running Dashy in GitPod's cloud dev environment -# Docs: https://www.gitpod.io/docs/references/gitpod-yml - -# Commands to start on workspace startup -tasks: - - init: yarn install - command: yarn dev -# Ports to expose on workspace startup -ports: - - port: 8080 # Default dev server - visibility: private - onOpen: open-preview - - port: 4000 # Default prod server - visibility: public - onOpen: open-preview -prebuilds: - # Adds 'Open in GitPod' to PRs - addBadge: true - addComment: false -vscode: - # Adds Vue.js and formatting extensions - extensions: - - octref.vetur - - dbaeumer.vscode-eslint - - streetsidesoftware.code-spell-checker - - PKief.material-icon-theme - - wix.vscode-import-cost - - oderwat.indent-rainbow - - eamodio.gitlens diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..177df74072 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "dashy: edge", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}/src", + "preLaunchTask": "dashy start" + }, + { + "type": "chrome", + "request": "launch", + "name": "dashy: chrome", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}/src", + "preLaunchTask": "dashy start" + }, + { + "type": "firefox", + "request": "launch", + "name": "dashy: firefox", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}/src", + "preLaunchTask": "dashy start" + } + ] +} diff --git a/.yarnrc b/.yarnrc deleted file mode 100644 index 4f14322dc8..0000000000 --- a/.yarnrc +++ /dev/null @@ -1 +0,0 @@ ---ignore-engines true diff --git a/Dockerfile b/Dockerfile index 30e4131488..7c4b8e8877 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +1,63 @@ -FROM node:18.19.1-alpine AS build - -# Set the platform to build image for -ARG TARGETPLATFORM -ENV TARGETPLATFORM=${TARGETPLATFORM:-linux/amd64} - -# Install additional tools needed if on arm64 / armv7 -RUN \ - case "${TARGETPLATFORM}" in \ - 'linux/arm64') apk add --no-cache python3 make g++ ;; \ - 'linux/arm/v7') apk add --no-cache python3 make g++ ;; \ - esac - -# Create and set the working directory -WORKDIR /app - -# Install app dependencies -COPY package.json yarn.lock ./ -RUN yarn install --ignore-engines --immutable --no-cache --network-timeout 300000 --network-concurrency 1 - -# Copy over all project files and folders to the working directory -COPY . ./ - -# Build initial app for production -RUN yarn build --mode production --no-clean - -# Production stage -FROM node:20.11.1-alpine3.19 - -# Define some ENV Vars -ENV PORT=8080 \ - DIRECTORY=/app \ - IS_DOCKER=true - -# Create and set the working directory -WORKDIR ${DIRECTORY} - -# Update tzdata for setting timezone -RUN apk add --no-cache tzdata - -# Copy built application from build phase -COPY --from=build /app ./ - -# Finally, run start command to serve up the built application -CMD [ "yarn", "build-and-start" ] - -# Expose the port -EXPOSE ${PORT} - -# Run simple healthchecks every 5 mins, to check that everythings still great -HEALTHCHECK --interval=5m --timeout=5s --start-period=30s CMD yarn health-check +FROM node:24-alpine AS build + +WORKDIR /app + +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile --network-timeout 600000 + +COPY . . +RUN yarn build + +FROM node:24-alpine AS deps + +WORKDIR /app + +COPY package.json yarn.lock ./ +RUN yarn install --production --frozen-lockfile --network-timeout 600000 \ + && yarn cache clean + +FROM node:24-alpine + +ARG VERSION=dev +ARG REVISION +ARG CREATED + +LABEL org.opencontainers.image.title="Dashy" \ + org.opencontainers.image.description="The self-hosted dashboard" \ + org.opencontainers.image.url="https://dashy.to" \ + org.opencontainers.image.documentation="https://dashy.to/docs" \ + org.opencontainers.image.source="https://github.com/lissy93/dashy" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.authors="Alicia Sykes " \ + org.opencontainers.image.vendor="Alicia Sykes" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.revision="${REVISION}" \ + org.opencontainers.image.created="${CREATED}" + +ENV NODE_ENV=production \ + IS_DOCKER=true \ + PORT=8080 \ + HOST=0.0.0.0 + +WORKDIR /app + +RUN apk add --no-cache tzdata tini + +COPY --chown=node:node --from=deps /app/node_modules ./node_modules +COPY --chown=node:node --from=build /app/dist ./dist +COPY --chown=node:node --from=build /app/public ./public +COPY --chown=node:node --from=build /app/services ./services +COPY --chown=node:node --from=build /app/src/utils/config/ConfigSchema.json ./src/utils/config/ConfigSchema.json +COPY --chown=node:node --from=build /app/server.js ./server.js +COPY --chown=node:node --from=build /app/package.json ./package.json +COPY --chown=node:node --from=build /app/user-data/conf.yml ./user-data/conf.yml + +USER node + +EXPOSE 8080 + +HEALTHCHECK --interval=5m --timeout=10s --start-period=20s --retries=3 \ + CMD node services/healthcheck.js + +ENTRYPOINT ["/sbin/tini", "--"] +CMD ["node", "server.js"] diff --git a/Procfile b/Procfile deleted file mode 100644 index 7ddabf6ba5..0000000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: npm run build-and-start diff --git a/README.md b/README.md index f1813cad7b..a5201ef790 100644 --- a/README.md +++ b/README.md @@ -129,16 +129,23 @@ Or ```docker docker run -d \ -p 4000:8080 \ - -v /root/my-local-conf.yml:/app/user-data/conf.yml \ + -v /path/to/your/user-data:/app/user-data \ --name my-dashboard \ --restart=always \ lissy93/dashy:latest ``` + [![Dashy on Docker Hub](https://dockeri.co/image/lissy93/dashy)](https://hub.docker.com/r/lissy93/dashy) -See also: [examples with Docker Compose](./docs/deployment.md#using-docker-compose). Dashy is also available via GHCR, and tags for other architectures (`arm32v7`, `arm64v8`, etc.) and set versions are supported +The mounted `/app/user-data` directory **must** contain at least a `conf.yml`. +It can also hold sub-config files, item icons, fonts, custom CSS, or anything else you want served from the web root. + +Dashy is also available via GHCR (`ghcr.io/lissy93/dashy`). +To use with compose, see our sample [`docker-compose.yml`](https://github.com/lissy93/dashy/blob/master/docker-compose.yml). +You can either use `:latest` or pin to specific versions (like `4.0.0`). +All images are multi-arch (works on amd64, arm64, and arm/v7). -> Once you've got Dashy running, see [App Management Docs](./docs/management.md) for info on using health checks, updating, backups, web-server configs, logs, performance, security, and more. +> Once you've got Dashy running, see [the docs](https://dashy.to/docs/) for configuration references and usage guides. ### Deploying from Source ๐Ÿ”จ diff --git a/app.json b/app.json deleted file mode 100644 index ced115780a..0000000000 --- a/app.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Dashy", - "website": "https://dashy.to/", - "description": "A Dashboard for your Homelab ๐Ÿš€", - "repository": "https://github.com/lissy93/dashy", - "logo": "https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/logo.png", - "keywords": [ - "node", - "vue", - "static", - "dashboard", - "self-hosted", - "home-lab", - "lissy93" - ], - "stack": "heroku-20" -} diff --git a/docker-compose.yml b/docker-compose.yml index 9573c6668e..a10c2abd2a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,43 +1,41 @@ ---- # Welcome to Dashy! To get started, run `docker compose up -d` -# You can configure your container here, by modifying this file -version: "3.8" services: dashy: container_name: Dashy + image: lissy93/dashy:latest - # Pull latest image from DockerHub - image: lissy93/dashy - - # To build from source, replace 'image: lissy93/dashy' with 'build: .' - # build: . - - # You can also use an image with a different tag, or pull from a different registry, e.g: + # Or use a different registry (like GHCR), or a specific tag (like :4.0.0) # image: ghcr.io/lissy93/dashy or image: lissy93/dashy:3.0.0 - # Pass in your config file below, by specifying the path on your host machine - # volumes: - # - /path/to/my-config.yml:/app/user-data/conf.yml - # - /path/to/item-icons:/app/user-data/item-icons/ + # Or, to build from source, replace `image:` with `build: .` + # build: . # Set port that web service will be served on. Keep container port as 8080 ports: - 4000:8080 - # Set any environmental variables + # Mount the directory for your conf and assets to `/app/user-data` + # This dir NEEDS a conf.yml (the main config file for Dashy) + # This dir can also contain other configs as well as any assets like + # icons, stylesheets, fonts, etc which will be served from the web root (/) + # volumes: + # - ./user-data:/app/user-data + + # Specify environmental variables for the Dashy server, none needed by default environment: - NODE_ENV=production - # Specify your user ID and group ID. You can find this by running `id -u` and `id -g` - # - UID=1000 - # - GID=1000 + + # If your host uid is different, and causing perm errs for mounted content + # Then you can instead use your own ids (`id -u` / `id -g`) + # user: "1000:1000" # Specify restart policy restart: unless-stopped # Configure healthchecks healthcheck: - test: ['CMD', 'node', '/app/services/healthcheck'] + test: ['CMD', 'node', '/app/services/healthcheck.js'] interval: 1m30s timeout: 10s retries: 3 - start_period: 40s + start_period: 30s diff --git a/docker/Dockerfile-arm32v7 b/docker/Dockerfile-arm32v7 deleted file mode 100644 index cb50da2b0c..0000000000 --- a/docker/Dockerfile-arm32v7 +++ /dev/null @@ -1,43 +0,0 @@ -FROM alpine:3.12 AS builder - -# Download QEMU, see https://github.com/docker/hub-feedback/issues/1261 -RUN QEMU_URL=https://github.com/balena-io/qemu/releases/download/v5.2.0%2Bbalena4/qemu-5.2.0.balena4-arm.tar.gz \ - && apk add curl && curl -L $QEMU_URL | tar zxvf - -C . --strip-components 1 - -# Start second (arm32v7) stage -FROM arm32v7/alpine:3.12 - -# Add QEMU from build stage -COPY --from=builder qemu-arm-static /usr/bin - -# Install Node and Yarn -RUN apk add --update --no-cache nodejs npm yarn - -# Define some ENV Vars -ENV PORT=80 \ - DIRECTORY=/app \ - IS_DOCKER=true - -# Create and set the working directory -WORKDIR ${DIRECTORY} - -# Copy over both 'package.json' and 'package-lock.json' (if available) -COPY package*.json ./ - -# Install project dependencies -RUN yarn - -# Copy over all project files and folders to the working directory -COPY . . - -# Build initial app for production -RUN yarn build - -# Expose given port -EXPOSE ${PORT} - -# Finally, run start command to serve up the built application -CMD [ "yarn", "build-and-start"] - -# Run simple healthchecks every 5 mins, to check the Dashy's everythings great -HEALTHCHECK --interval=5m --timeout=2s --start-period=30s CMD yarn health-check diff --git a/docker/Dockerfile-arm64v8 b/docker/Dockerfile-arm64v8 deleted file mode 100644 index 1d85444bad..0000000000 --- a/docker/Dockerfile-arm64v8 +++ /dev/null @@ -1,43 +0,0 @@ -FROM alpine:3.12 AS builder - -# Download QEMU, see https://github.com/docker/hub-feedback/issues/1261 -RUN QEMU_URL=https://github.com/balena-io/qemu/releases/download/v5.2.0%2Bbalena4/qemu-5.2.0.balena4-aarch64.tar.gz \ - && apk add curl && curl -L $QEMU_URL | tar zxvf - -C . --strip-components 1 - -# Start second (arm64v8) stage -FROM arm64v8/alpine:3.12 - -# Add QEMU from build stage -COPY --from=builder qemu-aarch64-static /usr/bin - -# Install Node and Yarn -RUN apk add --update --no-cache nodejs npm yarn - -# Define some ENV Vars -ENV PORT=80 \ - DIRECTORY=/app \ - IS_DOCKER=true - -# Create and set the working directory -WORKDIR ${DIRECTORY} - -# Copy over both 'package.json' and 'package-lock.json' (if available) -COPY package*.json ./ - -# Install project dependencies -RUN yarn - -# Copy over all project files and folders to the working directory -COPY . . - -# Build initial app for production -RUN yarn build - -# Expose given port -EXPOSE ${PORT} - -# Finally, run start command to serve up the built application -CMD [ "yarn", "build-and-start"] - -# Run simple healthchecks every 5 mins, to check the Dashy's everythings great -HEALTHCHECK --interval=5m --timeout=2s --start-period=30s CMD yarn health-check diff --git a/docker/Dockerfile-lite b/docker/Dockerfile-lite deleted file mode 100644 index 8280d38cd2..0000000000 --- a/docker/Dockerfile-lite +++ /dev/null @@ -1,22 +0,0 @@ -# ----------------------------------------------------------------------------------------- -# A light-weight alternative Docker image, using NGINX rather than Node.js to serve the app -# This means that certain features that require server-side endpoints will not be available -# ----------------------------------------------------------------------------------------- - -# Build Stage - Install dependencies + build the app -FROM node:lts-alpine3.14 as build -WORKDIR /dashy -COPY package*.json . -COPY yarn.lock . -RUN yarn -COPY . . -RUN yarn build - -# Production Stage - Serve up built files with NGINX -FROM nginx:alpine as production -COPY ./docker/nginx.conf /etc/nginx/nginx.conf -COPY --from=build /dashy/dist /usr/share/nginx/html -EXPOSE 80 -ENTRYPOINT ["nginx", "-g", "daemon off;"] - -LABEL maintainer="Alicia Sykes " diff --git a/docker/Dockerfile-old b/docker/Dockerfile-old deleted file mode 100644 index 8328882fa6..0000000000 --- a/docker/Dockerfile-old +++ /dev/null @@ -1,31 +0,0 @@ -FROM node:lts-alpine3.14 - -# Define some ENV Vars -ENV PORT=80 \ - DIRECTORY=/app \ - IS_DOCKER=true - -# Create and set the working directory -WORKDIR ${DIRECTORY} - -# Copy over both 'package.json' and 'package-lock.json' (if available) -COPY package*.json ./ -COPY yarn.lock ./ - -# Install project dependencies -RUN yarn - -# Copy over all project files and folders to the working directory -COPY . . - -# Build initial app for production -RUN yarn build - -# Expose given port -EXPOSE ${PORT} - -# Finally, run start command to serve up the built application -CMD [ "yarn", "build-and-start"] - -# Run simple healthchecks every 5 mins, to check the Dashy's everythings great -HEALTHCHECK --interval=5m --timeout=2s --start-period=30s CMD yarn health-check diff --git a/docker/docker-readme.md b/docker/docker-readme.md deleted file mode 100644 index af447bf43d..0000000000 --- a/docker/docker-readme.md +++ /dev/null @@ -1,136 +0,0 @@ -

Dashy

-

- Dashy helps you organize your self-hosted services by making them accessible from a single place -
- -
- User Showcase | Live Demo | Getting Started | Documentation | GitHub -

- - Awesome Self-Hosted - - - License MIT - - - Current Version - - - Docker Pulls - - - GitHub Status - - - Known Vulnerabilities - -

- -## Features ๐ŸŒˆ - -- ๐Ÿ”Ž Instant search by name, domain, or tags + customizable hotkeys & keyboard shortcuts -- ๐ŸŽจ Multiple built-in color themes, with UI color editor and support for custom CSS -- ๐Ÿงธ Many icon options - Font-Awesome, homelab icons, auto-fetching Favicon, images, emojis, etc. -- ๐Ÿšฆ Status monitoring for each of your apps/links for basic availability and uptime checking -- ๐Ÿ“Š Widgets for displaying info and dynamic content from your self-hosted services -- ๐Ÿ’‚ Optional authentication with multi-user access, configurable privileges, and SSO support -- ๐ŸŒŽ Multi-language support, with 10+ human-translated languages, and more on the way -- โ˜ Optional, encrypted, free off-site cloud backup and restore feature available -- ๐Ÿ’ผ A workspace view, for easily switching between multiple apps simultaneously -- ๐Ÿ›ฉ๏ธ A minimal view, for use as a fast-loading browser Startpage -- ๐Ÿ–ฑ๏ธ Choose app launch method, either new tab, same tab, a pop-up modal, or in the workspace view -- ๐Ÿ“ Customizable layout, sizes, text, component visibility, sort order, behavior, etc. -- ๐Ÿ–ผ๏ธ Options for a full-screen background image, custom nav-bar links, HTML footer, title, etc. -- ๐Ÿš€ Easy to setup with Docker, or on bare metal, or with 1-Click cloud deployment -- โš™๏ธ Easy configuration, either through the UI, or using a YAML file -- โœจ Under active development with improvements and new features added regularly -- ๐Ÿค Small bundle size, fully responsive UI, and PWA for basic offline access -- ๐Ÿ†“ 100% free and open-source -- ๐Ÿ” Strong focus on privacy -- ๐ŸŒˆ And loads more... - -## Demo โšก - -**Live Instances**: [Demo 1](https://demo.dashy.to) (Live Demo) โ”† [Demo 2](https://live.dashy.to) (Dashy Links) โ”† [Demo 3](https://dev.dashy.to) (Dev Preview) - -**Screenshots**: Checkout the [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md), to see example dashboards from the community - -**Spin up your own demo**: [![One-Click Deploy with PWD](https://img.shields.io/badge/Play--with--Docker-Deploy-2496ed?style=flat-square&logo=docker)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:8080 lissy93/dashy`](./docs/quick-start.md) - - -

- Demo -

- - -**[โฌ†๏ธ Back to Top](#dashy)** - ---- - -## Getting Started ๐Ÿ›ซ - -To deploy Dashy with Docker, just run `docker run -p 8080:8080 lissy93/dashy`, then open `http://localhost:8080` - -For full list of options and a Docker compose file, see the [Deployment Docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md). - -Dashy can also be run on bare metal using Node.js, or deployed to a cloud service, using the 1-Click deploy script. - ---- - -## Documentation ๐Ÿ“ - -#### Running Dashy -- **[Quick Start](https://github.com/Lissy93/dashy/blob/master/docs/quick-start.md)** - TDLR guide on getting Dashy up and running -- **[Deployment](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md)** - Full guide on deploying Dashy either locally or online -- **[Configuring](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md)** - Complete list of all available options in the config file -- **[App Management](https://github.com/Lissy93/dashy/blob/master/docs/management.md)** - Managing your app, updating, security, web server configuration, etc -- **[Troubleshooting](https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md)** - Common errors and problems, and how to fix them - -#### Feature Docs -- **[Authentication](https://github.com/Lissy93/dashy/blob/master/docs/authentication.md)** - Guide to setting up authentication to protect your dashboard -- **[Alternate Views](https://github.com/Lissy93/dashy/blob/master/docs/alternate-views.md)** - Outline of available pages / views and item opening methods -- **[Backup & Restore](https://github.com/Lissy93/dashy/blob/master/docs/backup-restore.md)** - Guide to backing up config with Dashy's cloud sync feature -- **[Icons](https://github.com/Lissy93/dashy/blob/master/docs/icons.md)** - Outline of all available icon types for sections and items, with examples -- **[Language Switching](https://github.com/Lissy93/dashy/blob/master/docs/multi-language-support.md)** - Details on how to switch language, or add a new locale -- **[Status Indicators](https://github.com/Lissy93/dashy/blob/master/docs/status-indicators.md)** - Using Dashy to monitor uptime and status of your apps -- **[Searching & Shortcuts](https://github.com/Lissy93/dashy/blob/master/docs/searching.md)** - Searching, launching methods + keyboard shortcuts -- **[Theming](https://github.com/Lissy93/dashy/blob/master/docs/theming.md)** - Complete guide to applying, writing and modifying themes + styles -- **[Widgets](https://github.com/Lissy93/dashy/blob/master/docs/widgets.md)** - List of all dynamic content widgets, with usage guides and examples - -#### Development and Contributing -- **[Developing](https://github.com/Lissy93/dashy/blob/master/docs/developing.md)** - Running Dashy development server locally, and general workflow -- **[Development Guides](https://github.com/Lissy93/dashy/blob/master/docs/development-guides.md)** - Common development tasks, to help new contributors -- **[Contributing](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md)** - How you can help keep Dashy alive -- **[Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md)** - See how others are using Dashy, and share your dashboard -- **[Credits](https://github.com/Lissy93/dashy/blob/master/docs/credits.md)** - List of people and projects that have made Dashy possible -- **[Release Workflow](https://github.com/Lissy93/dashy/blob/master/docs/release-workflow.md)** - Info about releases, CI and automated tasks - ---- - -## License ๐Ÿ“œ - -Dashy is Licensed under [MIT X11](https://en.wikipedia.org/wiki/MIT_License) - -``` -Copyright ยฉ 2024 Alicia Sykes - -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE -OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, Dashy shall not be used in advertising or otherwise -to promote the sale, use, or other dealings in this Software without prior written -authorization from the repo owner. -``` diff --git a/docker/hooks/pre_build b/docker/hooks/pre_build deleted file mode 100644 index e5feacb7dd..0000000000 --- a/docker/hooks/pre_build +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -# Used to setup QEMU to build arm images on amd64 processors. -# Source: https://git.io/J0ezo - -# Register qemu-*-static for all supported processors except the -# current one, but also remove all registered binfmt_misc before -docker run --rm --privileged multiarch/qemu-user-static:register --reset diff --git a/docker/nginx.conf b/docker/nginx.conf deleted file mode 100644 index 82f6843bd0..0000000000 --- a/docker/nginx.conf +++ /dev/null @@ -1,15 +0,0 @@ -worker_processes 4; - -events { worker_connections 1024; } - -http { - server { - listen 80; - root /usr/share/nginx/html; - include /etc/nginx/mime.types; - - location /appui { - try_files $uri /index.html; - } - } -} \ No newline at end of file diff --git a/docs/authentication.md b/docs/authentication.md index b2bce79810..b3a56a7fb2 100644 --- a/docs/authentication.md +++ b/docs/authentication.md @@ -122,7 +122,7 @@ To disable all UI config features, including View Config, set `disableConfigurat If you don't want to hash your password, you can instead leave out the `hash` attribute, and replace it with `password` which should have the value of an environmental variable name you wish to use. -Note that env var must begin with `VUE_APP_`, and you must set this variable before building the app. +Note that env var must begin with `VITE_APP_`, and you must set this variable before building the app. For example: @@ -130,10 +130,10 @@ For example: auth: users: - user: bob - password: VUE_APP_BOB + password: VITE_APP_BOB ``` -Just be sure to set `VUE_APP_BOB='my super secret password'` before build-time. +Just be sure to set `VITE_APP_BOB='my super secret password'` before build-time. ### Adding HTTP Auth to Configuration @@ -184,7 +184,7 @@ If you don't have users in your `conf.yml` (e.g. you handle user management exte With this approach, there is no Dashy login page. When the browser first requests the config file, the server responds with a `401` and the browser shows its native HTTP auth prompt. Once the user enters the correct credentials, the browser caches them for the session and all subsequent requests work. -To skip the browser prompt and have the frontend authenticate automatically, also set `VUE_APP_BASIC_AUTH_USERNAME` and `VUE_APP_BASIC_AUTH_PASSWORD` to the same values. These are baked in at build time, so a rebuild is required, and you should only do this on a trusted network. +To skip the browser prompt and have the frontend authenticate automatically, also set `VITE_APP_BASIC_AUTH_USERNAME` and `VITE_APP_BASIC_AUTH_PASSWORD` to the same values. These are baked in at build time, so a rebuild is required, and you should only do this on a trusted network. > [!WARNING] > Do not combine `BASIC_AUTH_USERNAME`/`BASIC_AUTH_PASSWORD` with conf.yml users. If both are present, the server will log a warning at startup. With `ENABLE_HTTP_AUTH` set, config-file users take priority and the static credentials are ignored. Without it, the static credentials protect the server but the Dashy login page will use conf.yml credentials, and the frontend will send the wrong credentials to server endpoints. Pick one approach or the other. @@ -347,7 +347,7 @@ appConfig: - The `proxyWhitelist` checks `req.socket.remoteAddress`, which is the direct connection source. If your proxy connects through Docker networking, use the container's internal IP (e.g. `172.18.0.2`), not the external IP - Logout clears Dashy's session cookie, but the user remains authenticated at the proxy level. Revisiting the page will re-authenticate automatically -- When header auth is enabled, server-side API endpoints are also protected by the proxy whitelist. Requests not from a whitelisted IP will be rejected. Admin enforcement applies - only users with `type: admin` can access write endpoints (config save, rebuild) +- When header auth is enabled, server-side API endpoints are also protected by the proxy whitelist. Requests not from a whitelisted IP will be rejected. Admin enforcement applies - only users with `type: admin` can access write endpoints (config save) --- @@ -565,7 +565,6 @@ sections: - name: Authentication displayData: sortBy: default - rows: 2 cols: 1 collapsed: false hideForGuests: false diff --git a/docs/configuring.md b/docs/configuring.md index 9558eadf73..78c25b14cd 100644 --- a/docs/configuring.md +++ b/docs/configuring.md @@ -73,8 +73,10 @@ The following file provides a reference of all supported configuration options. **`title`** | `string` | Required | Your dashboard title, displayed in the header and browser tab **`description`** | `string` | _Optional_ | Description of your dashboard, also displayed as a subtitle **`navLinks`** | `array` | _Optional_ | Optional list of a maximum of 6 links, which will be displayed in the navigation bar. See [`navLinks`](#pageinfonavlinks-optional) -**`footerText`** | `string` | _Optional_ | Text to display in the footer (note that this will override the default footer content). This can also include HTML and inline CSS +**`footer`** | `string` | _Optional_ | Text to display in the footer. When omitted, no footer is rendered. Supports inline HTML (sanitized before render) **`logo`** | `string` | _Optional_ | The path to an image to display in the header (to the right of the title). This can be either local, where `/` is the root of `./public`, or any remote image, such as `https://i.ibb.co/yhbt6CY/dashy.png`. It's recommended to scale your image down, so that it doesn't impact load times +**`favicon`** | `string` | _Optional_ | URL or path to a custom favicon shown in the browser tab. Can be absolute (`https://...`), root-relative (`/icons/x.png`), or a `data:` URI +**`color`** | `string` | _Optional_ | Theme colour applied to the browser chrome (mobile address bar). Any valid CSS color (e.g. `#ff00a7`) is accepted **[โฌ†๏ธ Back to Top](#configuring)** @@ -104,7 +106,7 @@ For more info, see the[Multi-Page docs](/docs/pages-and-sections.md#multi-page-s **Field** | **Type** | **Required**| **Description** --- | --- | --- | --- **`language`** | `string` | _Optional_ | The 2 (or 4-digit) [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, e.g. `en` or `en-GB`. This must be a language that the app has already been [translated](https://github.com/Lissy93/dashy/tree/master/src/assets/locales) into. If your language is unavailable, Dashy will fallback to English. By default Dashy will attempt to auto-detect your language, although this may not work on some privacy browsers. -~~**`startingView`**~~ | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`. NOTE: This has been replaced by an environmental variable: `VUE_APP_STARTING_VIEW` in V3 onwards +**`startingView`** | `enum` | _Optional_ | Which view to land on when visiting `/`. One of `home`, `minimal` or `workspace`. Defaults to `home`. Applied at runtime, so no rebuild is needed. You can always switch views from the UI. (Legacy value `default` is accepted as an alias for `home`.) **`defaultOpeningMethod`** | `enum` | _Optional_ | The default opening method for items, if no `target` is specified for a given item. Can be either `newtab`, `sametab`, `modal`, `workspace`, `clipboard`, `top` or `parent`. Defaults to `newtab` **`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false` **`statusCheckInterval`** | `number` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0` @@ -117,7 +119,7 @@ For more info, see the[Multi-Page docs](/docs/pages-and-sections.md#multi-page-s **`faviconApi`** | `enum` | _Optional_ | Only applicable if you are using favicons for item icons. Specifies which service to use to resolve favicons. Set to `local` to do this locally, without using an API. Services running locally will use this option always. Available options are: `local`, `allesedv`, `iconhorse`, `faviconkit`, `duckduckgo`, `yandex`, `google`, `besticon`, `webmasterapi` and `mcapi`. Defaults to `allesedv`. See [Icons](/docs/icons.md#favicons) for more info **`auth`** | `object` | _Optional_ | All settings relating to user authentication. See [`auth`](#appconfigauth-optional) **`defaultIcon`** | `string` | _Optional_ | An icon to be applied to any items, which don't already have an icon set. See [Icon Docs](/docs/icons.md#default-icon) for more info -**`layout`** | `enum` | _Optional_ | Layout for homepage, either `horizontal`, `vertical` or `auto`. Defaults to `auto`. This specifies the layout and direction of how sections are positioned on the home screen. This can also be modified and overridden from the UI. +**`layout`** | `enum` | _Optional_ | Layout for homepage, either `horizontal`, `vertical` or `auto`. Defaults to `auto`. This specifies the layout and direction of how sections are positioned on the home screen. `auto` uses a responsive masonry grid: sections flow into the next available slot so shorter ones fill the gaps left by taller neighbours; `section.displayData.cols` still controls width, but `rows` is ignored (heights are driven by content). This can also be modified and overridden from the UI. **`iconSize`** | `enum` | _Optional_ | The size of link items / icons. Can be either `small`, `medium,` or `large`. Defaults to `medium`. This can also be set directly from the UI. **`colCount`** | `number` | _Optional_ | The number of columns of sections displayed on the homepage, using the default view. Should be in integer between `1` and `8`. Note that by default this is applied responsively, based on current screen size, and specifying a value here will override this behavior, which may not be desirable. **`contentMaxWidth`** | `string` or `number` | _Optional_ | Sets the max width of the main sections area on the homepage, overriding the responsive default. Can be a percentage, or any CSS unit @@ -128,7 +130,7 @@ For more info, see the[Multi-Page docs](/docs/pages-and-sections.md#multi-page-s **`customColors`** | `object`| _Optional_ | Enables you to apply a custom color palette to any given theme. Use the theme name (lowercase) as the key, for an object including key-value-pairs, with the color variable name as keys, and 6-digit hex code as value. See [Theming](/docs/theming.md#modifying-theme-colors) for more info **`externalStyleSheet`** | `string` or `string[]` | _Optional_ | Either a URL to an external stylesheet or an array or URLs, which can be applied as themes within the UI **`customCss`** | `string` | _Optional_ | Raw CSS that will be applied to the page. This can also be set from the UI. Please minify it first. -**`hideComponents`** | `object` | _Optional_ | A list of key page components (header, footer, search, settings, etc) that are present by default, but can be removed using this option. See [`appConfig.hideComponents`](#appconfighideComponents-optional) +**`hideComponents`** | `object` | _Optional_ | A list of key page components (header, nav, search, settings) that are present by default, but can be removed using this option. See [`appConfig.hideComponents`](#appconfighideComponents-optional) **`enableMultiTasking`** | `boolean` | _Optional_ | If set to true, will keep apps open in the background when in the workspace view. Useful for quickly switching between multiple sites, and preserving their state, but comes at the cost of performance. **`workspaceLandingUrl`** | `string` | _Optional_ | The URL or an app, service or website to launch when the workspace view is opened, before another service has been launched **`preventWriteToDisk`** | `boolean` | _Optional_ | If set to `true`, users will be prevented from saving config changes to disk through the UI @@ -150,7 +152,7 @@ For more info, see the[Multi-Page docs](/docs/pages-and-sections.md#multi-page-s > [!NOTE] > Since the auth is initiated in the main app entry point (for security), a rebuild is required to apply changes to the auth configuration. -> You can trigger a rebuild through the UI, under Config --> Rebuild, or by running `yarn build` in the root directory. +> Run `yarn build` in the root directory, then restart the server. > [!WARNING] > Built-in auth should **not be used** for security-critical applications, or if your Dashy instance is publicly accessible. @@ -235,7 +237,6 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)** **`hideNav`** | `boolean` | _Optional_ | If set to `true`, the navigation menu will not be visible. Defaults to `false` **`hideSearch`** | `boolean` | _Optional_ | If set to `true`, the search bar will not be visible. Defaults to `false` **`hideSettings`** | `boolean` | _Optional_ | If set to `true`, the settings menu will be initially collapsed. Defaults to `false` -**`hideFooter`** | `boolean` | _Optional_ | If set to `true`, the footer will not be visible. Defaults to `false` **[โฌ†๏ธ Back to Top](#configuring)** @@ -311,14 +312,14 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)** **`sortBy`** | `string` | _Optional_ | The sort order for items within the current section. By default items are displayed in the order in which they are listed in within the config. The following sort options are supported: `most-used` (most opened apps first), `last-used` (the most recently used apps), `alphabetical`, `reverse-alphabetical`, `random` and `default` **`collapsed`** | `boolean` | _Optional_ | If true, the section will be collapsed initially, and will need to be clicked to open. Useful for less regularly used, or very long sections. Defaults to `false` **`cutToHeight`** | `boolean` | _Optional_ | By default, sections will fill available space. Set this option to true to match section height with content height -**`rows`** | `number` | _Optional_ | Height of the section, specified as the number of rows it should span vertically, e.g. `2`. Defaults to `1`. Max is `5`. +**`rows`** | `number` | _Optional_ | _Deprecated._ Previously set a section's vertical row-span. The `auto` layout now uses masonry (heights follow content) and `horizontal`/`vertical` are flex-based, so this value is accepted for config compatibility but no longer applied. **`cols`** | `number` | _Optional_ | Width of the section, specified as the number of columns the section should span horizontally, e.g. `2`. Defaults to `1`. Max is `5`. Will be clamped to the page's active column count so that a section never exceeds the available grid width. **`itemSize`** | `string` | _Optional_ | Specify the size for items within this group, either `small`, `medium` or `large`. Note that this will override any settings specified through the UI **`color`** | `string` | _Optional_ | A custom accent color for the section, as a hex code or HTML color (e.g. `#fff`) **`customStyles`** | `string` | _Optional_ | Custom CSS properties that should be applied to that section, e.g. `border: 2px dashed #ff0000;` -**`sectionLayout`** | `string` | _Optional_ | Specify which CSS layout will be used to responsively place items. Can be either `auto` (which uses flex layout), or `grid`. If `grid` is selected, then `itemCountX` and `itemCountY` may also be set. Defaults to `auto` -**`itemCountX`** | `number` | _Optional_ | The number of items to display per row / horizontally. If not set, it will be calculated automatically based on available space. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12` -**`itemCountY`** | `number` | _Optional_ | The number of items to display per column / vertically. If not set, it will be calculated automatically based on available space. If `itemCountX` is set, then `itemCountY` can be calculated automatically. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12` +**`sectionLayout`** | `string` | _Optional_ | Specify which CSS layout will be used to responsively place items. Can be either `auto` (which uses flex layout), or `grid`. Defaults to `auto`. Setting `itemCountX` or `itemCountY` below will also switch the section to grid layout automatically +**`itemCountX`** | `number` | _Optional_ | Number of items per row / horizontally. If not set, it will be calculated automatically based on available space. Setting this switches the section to grid layout. Must be a whole number between `1` and `12`; values above `8` rely on the grid's responsive column sizing (no explicit minimum-width rule) +**`itemCountY`** | `number` | _Optional_ | Number of explicit rows before items flow into implicit rows. Setting this switches the section to grid layout. Must be a whole number between `1` and `12`. Row heights size to their content (section heights follow content in the masonry layout) **`hideForUsers`** | `string[]` | _Optional_ | Current section will be visible to all users, except for those specified in this list **`showForUsers`** | `string[]` | _Optional_ | Current section will be hidden from all users, except for those specified in this list **`hideForGuests`** | `boolean` | _Optional_ | Current section will be visible for logged in users, but not for guests (see `appConfig.enableGuestAccess`). Defaults to `false` diff --git a/docs/credits.md b/docs/credits.md index 3d50547756..ae2712b640 100644 --- a/docs/credits.md +++ b/docs/credits.md @@ -41,7 +41,6 @@ At it's core, the application uses [**Vue.js**](https://github.com/vuejs/vue), a - [`vue-material-tabs`](https://github.com/jairoblatt/vue-material-tabs) - Tab view component by @jairoblatt `MIT` - [`VJsoneditor`](https://github.com/yansenlei/VJsoneditor) - Interactive JSON editor component by @yansenlei `MIT` - Forked from [`JsonEditor`](https://github.com/josdejong/jsoneditor) by @josdejong `Apache-2.0 License` -- [`vue-toasted`](https://github.com/shakee93/vue-toasted) - Toast notification component by @shakee93 `MIT` - [`vue-swatches`](https://github.com/saintplay/vue-swatches) - Color palete picker by @saintplay `MIT` diff --git a/docs/deployment.md b/docs/deployment.md index 0d6c990ab6..a9cf29d52d 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -63,28 +63,29 @@ Dashy has a built container image hosted on [Docker Hub](https://hub.docker.com/ ```bash docker run -d \ -p 8080:8080 \ - -v /root/my-local-conf.yml:/app/user-data/conf.yml \ + -v /path/to/your/user-data:/app/user-data \ --name my-dashboard \ --restart=always \ lissy93/dashy:latest ``` -Explanation of the above options: +The `user-data` directory you mount must contain a `conf.yml` file. It can also contain any sub-config files, item icons, fonts, custom CSS, or other assets you want served from the web root. Anything you put in there is available at `/` in the browser. +Explanation of the above options: - `-d` Detached mode (not running in the foreground of your terminal) -- `-p` The port that should be exposed, and the port it should be mapped to in your host system `[host-port][container-port]`, leave the container port as is -- `-v` Specify volumes, to pass data from your host system to the container, in the format of `[host-path]:[container-path]`, you can use this to pass your config file, directory of assets (like icons), custom CSS or web assets (like favicon.ico, manifest.json etc) +- `-p` The port that should be exposed, and the port it should be mapped to in your host system `[host-port]:[container-port]`, leave the container port as `8080` +- `-v` Mounts the host directory containing your `conf.yml` (and any other assets) into the container at `/app/user-data` - `--name` Give your container a human-readable name - `--restart=always` Spin up the container when the daemon starts, or after it has been stopped -- `lissy93/dashy:latest` This last option is the image the container should be built from, you can also use a specific version or architecture type, by replacing `:latest` with one of the [tags](https://hub.docker.com/r/lissy93/dashy/tags) +- `lissy93/dashy:latest` The image to run. Replace `:latest` with a specific version from the [tags](https://hub.docker.com/r/lissy93/dashy/tags) if needed For all available options, and to learn more, see the [Docker Run Docs](https://docs.docker.com/engine/reference/commandline/run/) Dashy is also available through GHCR: `docker pull ghcr.io/lissy93/dashy:latest` -If you're deploying Dashy on a modern ARM-based board, such as a Raspberry Pi (2+), then you'll need to use one of Dashy's ARM images. Set the base image + tag to either `lissy93/dashy:arm64v8` or `lissy93/dashy:arm32v7`, depending on your system architecture. You can also use the `multi-arch` image, which should work on all system architectures. +The `latest` image is multi-arch, so the same tag works on amd64, arm64, and arm/v7 (Raspberry Pi 2+). Docker selects the right variant for your host automatically. -The image defaults to `:latest`, but you can instead specify a specific version, e.g. `docker pull lissy93/dashy:release-1.5.0` +The image defaults to `:latest`, but you can instead specify a specific version, e.g. `docker pull lissy93/dashy:4.0.0` --- @@ -95,38 +96,33 @@ Using Docker Compose can be useful for saving your specific config in files, wit The following is a complete example of a [`docker-compose.yml`](https://github.com/Lissy93/dashy/blob/master/docker-compose.yml) for Dashy. Run it as is, or uncomment the additional options you need. ```yaml ---- services: dashy: - # To build from source, replace 'image: lissy93/dashy' with 'build: .' - # build: . - image: lissy93/dashy - container_name: Dashy - # Pass in your config file below, by specifying the path on your host machine - # volumes: - # - /root/my-config.yml:/app/user-data/conf.yml + # The image to pull + version. Can use `ghcr.io/lissy93/dashy` instead + image: lissy93/dashy:latest + # Optional container name + container_name: dashy + # Port to serve on (keep container port (second one) as 8080) ports: - 8080:8080 - # Set any environmental variables + # Mount a directory containing your conf.yml and any other assets + volumes: + - ./user-data:/app/user-data + # Add any env vars for server here, if needed environment: - NODE_ENV=production - # Specify your user ID and group ID. You can find this by running `id -u` and `id -g` - # - UID=1000 - # - GID=1000 - # Specify restart policy + # Auto-start the container on boot restart: unless-stopped - # Configure healthchecks + # Healthcheck to determine when container healthy healthcheck: - test: ['CMD', 'node', '/app/services/healthcheck'] + test: ['CMD', 'node', '/app/services/healthcheck.js'] interval: 1m30s timeout: 10s retries: 3 - start_period: 40s + start_period: 30s ``` -You can use a different tag, by for example setting `image: lissy93/dashy:arm64v8`, or pull from GHCR instead by setting `image: ghcr.io/lissy93/dashy`. - -If you are building from source, and would like to use one of the [other Dockerfiles](https://github.com/Lissy93/dashy/tree/master/docker), then under `services.dashy` first set `context: .`, then specify the the path to the dockerfile, e.g. `dockerfile: ./docker/Dockerfile-arm32v7` +To pull from GHCR instead of Docker Hub, set `image: ghcr.io/lissy93/dashy:latest`. --- @@ -137,7 +133,7 @@ If you are building from source, and would like to use one of the [other Dockerf ```bash podman run -d \ -p 8080:8080 \ - -v /path/to/my-conf.yml:/app/user-data/conf.yml:Z \ + -v /path/to/your/user-data:/app/user-data:Z \ --name dashy \ --restart=always \ docker.io/lissy93/dashy:latest @@ -172,7 +168,7 @@ Alternatively, go to Containers > Add container and use the image `lissy93/dashy Dashy is available through the [Community Applications](https://forums.unraid.net/topic/38582-plug-in-community-applications/) plugin. Search for "Dashy" in the Apps tab and install from there. The template pre-fills the Docker image, port mapping, and volume paths for you. -If you'd prefer to set it up manually, go to Docker > Add Container and use `lissy93/dashy:latest` as the repository. Map port `8080` and add a path mapping for your config file to `/app/user-data/conf.yml`. +If you'd prefer to set it up manually, go to Docker > Add Container and use `lissy93/dashy:latest` as the repository. Map port `8080`, and add a path mapping for the host directory containing your `conf.yml` to `/app/user-data`. --- @@ -208,12 +204,14 @@ Installing dashy is really simply and fast: ```bash docker run -d \ -p 4000:8080 \ - -v /volume1/docker/dashy/my-local-conf.yml:/app/user-data/conf.yml \ + -v /volume1/docker/dashy:/app/user-data \ --name dashy \ --restart=always \ lissy93/dashy:latest ``` +(Place your `conf.yml` and any sub-configs / icons / assets inside `/volume1/docker/dashy` on the host.) + dashy should be up within 1-2min after you've started the install task procedure --- @@ -235,7 +233,7 @@ If you do not want to use Docker, you can run Dashy directly on your host system Dashy can be deployed to most cloud providers. The Docker guides above work on any VPS, but these providers offer quicker setup for static or containerized deployments. > [!NOTE] -> Static hosting providers (Netlify, Vercel, EdgeOne) won't have status checks, config writing to disk, or UI-triggered rebuilds, since those features need Dashy's Node server. Everything else works fine. +> Static hosting providers (Netlify, Vercel, EdgeOne) won't have status checks or config writing to disk, since those features need Dashy's Node server. Everything else works fine. ### Netlify @@ -283,7 +281,7 @@ URL: `https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com Once Dashy has been built, it is effectively just a static web app. This means that it can be served up with pretty much any static host, CDN or web server. To host Dashy through a CDN, the steps are very similar to building from source: clone the project, cd into it, install dependencies, write your config file and build the app. Once build is complete you will have a `./dist` directory within Dashy's root, and this is the build application which is ready to be served up. -However without Dashy's node server, there are a couple of features that will be unavailable to you, including: Writing config changes to disk through the UI, triggering a rebuild through the UI and application status checks. Everything else will work fine. +However without Dashy's node server, there are a couple of features that will be unavailable to you, including: writing config changes to disk through the UI, and application status checks. Everything else will work fine. --- @@ -299,7 +297,7 @@ The initial build causes a spike in resource usage, but once running it's fairly ### Bare Metal -Requires [Node.js](https://nodejs.org/) (v17 recommended) and [Yarn](https://yarnpkg.com/). The `engines` field in `package.json` specifies `>=16.0.0`, but the Docker image uses Node 20 and that's the best-tested version. Builds require the `--openssl-legacy-provider` flag, which the npm scripts already set. +Requires [Node.js](https://nodejs.org/) and [Yarn](https://yarnpkg.com/). The `engines` field in `package.json` specifies `>=18.0.0`, but the Docker image is built and tested on Node 24, so that's the recommended version for bare-metal too. Minimum 512MB memory, 2GB disk space. diff --git a/docs/developing.md b/docs/developing.md index 85a414f231..9bdaec2ee5 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -40,8 +40,8 @@ Dashy should now be being served on . Hot reload is enab #### Basics -- **`yarn build`** - In the interest of speed, the application is pre-compiled, this means that the config file is read during build-time, and therefore the app needs to rebuilt for any new changes to take effect. Luckily this is very straight forward. Just run `yarn build` or `docker exec -it [container-id] yarn build` -- **`yarn start`** - Starts a web server, and serves up the production site from `./dist` (must run build command first) +- **`yarn build`** - Builds the production bundle into `./dist`. The Vite dev/runtime server serves `user-data/conf.yml` on each request, so a rebuild is only needed when source code or assets change, not when config changes +- **`yarn start`** - Starts the Node server, which serves the built site from `./dist` and the live config from `user-data/`. Run `yarn build` first #### Development @@ -51,20 +51,18 @@ Dashy should now be being served on . Hot reload is enab #### Utils and Checks -- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/user-data/conf.yml` (or within your Docker container at `/app/user-data/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json). +- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/user-data/conf.yml` (or within your Docker container at `/app/user-data/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/config/ConfigSchema.json). - **`yarn health-check`** - Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability #### Alternate Start Commands -- **`yarn build-and-start`** - Builds the app, runs checks and starts the production server. Commands are run in parallel, and so is faster than running them in independently. Uses the `yarn build` and `yarn start` commands -- **`yarn build-watch`** - If you find yourself making frequent changes to your configuration, and do not want to have to keep manually rebuilding, then this option is for you. It will watch for changes to any files within the projects root, and then trigger a rebuild. Note that if you are developing new features, then `yarn dev` would be more appropriate, as it's significantly faster at recompiling (under 1 second), and has hot reloading, linting and testing integrated +- **`yarn build && yarn start`** - Builds the app, then starts the production Node server. Use this for a manual production-style run on bare metal. With Vite, `conf.yml` is served from `user-data/` at runtime, so config changes only require a page refresh - **`yarn pm2-start`** - Starts the Node server using [PM2](https://pm2.keymetrics.io/), a process manager for Node.js applications, that helps them stay alive. PM2 has some built-in basic monitoring features, and an optional [management solution](https://pm2.io/). If you are running the app on bare metal, it is recommended to use this start command #### Notes - If you are using NPM, replace `yarn` with `npm run` - If you are using Docker, precede each command with `docker exec -it [container-id]`. Container ID can be found by running `docker ps` -- You can manage the app using the [Vue-CLI Service](https://cli.vuejs.org/guide/cli-service.html), with `npx vue-cli-service [command]`. Or to start the Vue Management UI, run `npx vue ui`, and open `http://localhost:8000` ### Environmental Variables @@ -76,10 +74,10 @@ You can set variables either in your environment, or using the [`.env`](https:// - `PORT` - The port to expose the running application on - `HOST` - The host that Dashy is running on, domain or IP - `BASE_URL` - The default base path for serving up static assets -- `VUE_APP_DOMAIN` - Usually the same as BASE_URL, but accessible in frontend +- `VITE_APP_DOMAIN` - Usually the same as BASE_URL, but accessible in frontend - `INTEGRITY` - Should enable SRI for build script and link resources - `IS_DOCKER` - Computed automatically on build. Indicates if running in container -- `VUE_APP_VERSION` - Again, set automatically using package.json during build time +- `VITE_APP_VERSION` - Again, set automatically using package.json during build time - `BACKUP_DIR` - Directory for conf.yml backups ### Environment Modes @@ -245,8 +243,7 @@ Styleguides: โ”‚ โ”‚ โ”œโ”€โ”€ ConfigContainer.vue # Main container, wrapping all other config components โ”‚ โ”‚ โ”œโ”€โ”€ CustomCss.vue # Form where the user can input custom CSS โ”‚ โ”‚ โ”œโ”€โ”€ EditSiteMeta.vue # Form where the user can edit site meta data -โ”‚ โ”‚ โ”œโ”€โ”€ JsonEditor.vue # JSON editor, where the user can modify the main config file -โ”‚ โ”‚ โ•ฐโ”€โ”€ RebuildApp.vue # A component allowing user to trigger a rebuild through the UI +โ”‚ โ”‚ โ•ฐโ”€โ”€ JsonEditor.vue # JSON editor, where the user can modify the main config file โ”‚ โ”œโ”€โ”€ FormElements # Basic form elements used throughout the app โ”‚ โ”‚ โ”œโ”€โ”€ Button.vue # Standard button component โ”‚ โ”‚ โ”œโ”€โ”€ Radio.vue # Standard radio button input diff --git a/docs/development-guides.md b/docs/development-guides.md index e7e2059edc..7aa7f3be4c 100644 --- a/docs/development-guides.md +++ b/docs/development-guides.md @@ -20,7 +20,7 @@ Adding a new theme is really easy. There're two things you need to do: Pass the ### 1. Add Theme Name -Choose a snappy name for your theme, and add it to the `builtInThemes` array inside [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js#L27). +Choose a snappy name for your theme, and add it to the `builtInThemes` array inside [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/config/defaults.js#L27). ### 2. Write some Styles @@ -127,9 +127,9 @@ computed: { Then, where you want to get the users value within your component, use something like: `this.appConfig.myProperty`. If the user hasn't specified the value, Don't forget to have a fallback or default for it. -If you have a default fallback value, then this would typically be specified in the [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js) file. +If you have a default fallback value, then this would typically be specified in the [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/config/defaults.js) file. -You will now need to add the definition of your new attribute into the [ConfigSchema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json). This will make it available in the UI config editor, and also ensure that the config validation check doesn't fail. +You will now need to add the definition of your new attribute into the [ConfigSchema](https://github.com/Lissy93/dashy/blob/master/src/utils/config/ConfigSchema.json). This will make it available in the UI config editor, and also ensure that the config validation check doesn't fail. For example: ```json @@ -156,8 +156,8 @@ Finally, add your new property to the [`configuring.md`](./configuring.md) API d Checklist: - [ ] Ensure the new attribute is actually necessary, and nothing similar already exists -- [ ] Update the [Schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json) with the parameters for your new option -- [ ] If required, set a default or fallback value (usually in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js)) +- [ ] Update the [Schema](https://github.com/Lissy93/dashy/blob/master/src/utils/config/ConfigSchema.json) with the parameters for your new option +- [ ] If required, set a default or fallback value (usually in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/config/defaults.js)) - [ ] Document the new value in [`configuring.md`](./configuring.md), and if required under the relevant section in the docs - [ ] Ensure your changes are backwards compatible, and that nothing breaks if the attribute isn't specified @@ -210,14 +210,14 @@ For some pages (such as the login page, the minimal start page, etc) the basic p ### 1. Add the route name to the should hide array -In [`./src/utils/defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js), there's an array called `hideFurnitureOn`. Append the name of the route (the same as it appears in [`router.js`](https://github.com/Lissy93/dashy/blob/master/src/router.js)) here. +In [`./src/utils/config/defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/config/defaults.js), there's an array called `hideFurnitureOn`. Append the name of the route (the same as it appears in [`router.js`](https://github.com/Lissy93/dashy/blob/master/src/router.js)) here. ### 2. Add the conditional to the structural component to hide First, import the helper function: ```javascript -import { shouldBeVisible } from '@/utils/SectionHelpers'; +import { shouldBeVisible } from '@/utils/config/SectionHelpers'; ``` Then you can create a computed value, that calls this function, passing in the route name: @@ -250,9 +250,9 @@ All environmental variables are optional. Currently there are not many environme You can set variables either in your environment, or using the [`.env`](https://github.com/Lissy93/dashy/blob/master/.env) file. -Any environmental variables used by the frontend are preceded with `VUE_APP_`. Vue will merge the contents of your `.env` file into the app in a similar way to the ['dotenv'](https://github.com/motdotla/dotenv) package, where any variables that you set on your system will always take preference over the contents of any `.env` file. +Any environmental variables used by the frontend are preceded with `VITE_APP_`. Vite will merge the contents of your `.env` file into the app in a similar way to the ['dotenv'](https://github.com/motdotla/dotenv) package, where any variables that you set on your system will always take preference over the contents of any `.env` file. -If add any new variables, ensure that there is always a fallback (define it in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js)), so as to not cause breaking changes. Don't commit the contents of your `.env` file to git, but instead take a few moments to document what you've added under the appropriate section. Try and follow the concepts outlined in the [12 factor app](https://12factor.net/config). +If add any new variables, ensure that there is always a fallback (define it in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/config/defaults.js)), so as to not cause breaking changes. Don't commit the contents of your `.env` file to git, but instead take a few moments to document what you've added under the appropriate section. Try and follow the concepts outlined in the [12 factor app](https://12factor.net/config). --- @@ -280,7 +280,7 @@ Firstly, create a new `.vue` file under [`./src/components/Widgets`](https://git import axios from 'axios'; import WidgetMixin from '@/mixins/WidgetMixin'; -import { widgetApiEndpoints } from '@/utils/defaults'; +import { widgetApiEndpoints } from '@/utils/config/defaults'; export default { mixins: [WidgetMixin], @@ -341,7 +341,7 @@ computed: { #### **Adding an API Endpoint** -If your widget makes a data request, then add the URL for the API endpoint to the `widgetApiEndpoints` array in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js#L207) +If your widget makes a data request, then add the URL for the API endpoint to the `widgetApiEndpoints` array in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/config/defaults.js#L207) ```javascript widgetApiEndpoints: { @@ -353,7 +353,7 @@ widgetApiEndpoints: { Then in your widget file: ```javascript -import { widgetApiEndpoints } from '@/utils/defaults'; +import { widgetApiEndpoints } from '@/utils/config/defaults'; ``` For GET requests, you may need to add some parameters onto the end of the URL. We can use another computed property for this, for example: diff --git a/docs/management.md b/docs/management.md index e2ab9bd0bf..6100c20d34 100644 --- a/docs/management.md +++ b/docs/management.md @@ -5,6 +5,7 @@ _The following article is a primer on managing self-hosted apps. It covers every ## Contents - [Providing Assets](#providing-assets) +- [File Ownership and Permissions](#file-ownership-and-permissions) - [Running Commands](#running-commands) - [Healthchecks](#healthchecks) - [Logs and Performance](#logs-and-performance) @@ -29,16 +30,51 @@ _The following article is a primer on managing self-hosted apps. It covers every ## Providing Assets -Although not essential, you will most likely want to provide several assets to your running app. +Dashy reads everything for your dashboard from a single host directory mounted into the container at `/app/user-data`. This is done with a [Docker volume](https://docs.docker.com/storage/volumes/), e.g. `-v /path/to/your/user-data:/app/user-data`. -This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/user-data/conf.yml` +The directory must contain a `conf.yml`. It can also contain anything else you want served from the web root: sub-config files for additional pages, item icons, favicon, fonts, custom CSS, manifest, and so on. Any file placed there is reachable at `/` in the browser, overriding files of the same name in the bundled `public/` defaults. -In Dashy, commonly configured resources include: +Typical contents: -- `./user-data/conf.yml` - Your main application config file -- `./public/item-icons` - A directory containing your own icons. This allows for offline access, and better performance than fetching from a CDN -- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to pass these in, but you can do so if you wish -- `/src/styles/user-defined-themes.scss` - A stylesheet for applying custom CSS to your app. You can also write your own themes here. +- `conf.yml` - Main config (required) +- `*.yml` / `*.yaml` - Sub-config files for [multi-page support](/docs/pages-and-sections.md#multi-page-support) +- `item-icons/` - Local icons referenced by `icon: ./item-icons/foo.png` +- `favicon.ico`, `manifest.json`, `robots.txt` - Override the bundled defaults +- `fonts/`, `widget-resources/` - Custom fonts or assets used by widgets + +**[โฌ†๏ธ Back to Top](#management)** + +--- + +## File Ownership and Permissions + +Inside the container, Dashy runs as a non-root user with uid/gid 1000 (the built-in `node` user from the Node base image). This is fine for the vast majority of installs, since the first user on a default Linux or macOS box is also uid 1000, so a bind-mounted `user-data` directory is read/writable straight away. + +It only gets fiddly if your host uid happens to be something else (NAS systems and multi-user servers being the usual culprits). In that case, config saves from the UI will fail with a permission error, because the container's uid 1000 doesn't own your directory. + +There are two ways to sort it. Pick whichever is less hassle: + +1. **Run the container as your own user.** The cleanest option, since you don't touch host file ownership. + + On `docker run`: + ```bash + docker run -d -p 8080:8080 \ + --user $(id -u):$(id -g) \ + -v /path/to/user-data:/app/user-data \ + lissy93/dashy:latest + ``` + + In compose, uncomment the `user:` line under the service and set it: + ```yaml + user: "1001:1001" # whatever `id -u` and `id -g` give you + ``` + +2. **Hand the directory to uid 1000.** Quicker if you don't mind changing host ownership: + ```bash + sudo chown -R 1000:1000 /path/to/user-data + ``` + +Note that if you run the container as root (e.g. `--user 0:0`), Dashy will still work, but you lose the security benefit of a non-root container. Don't do that unless you've a good reason. **[โฌ†๏ธ Back to Top](#management)** @@ -287,24 +323,23 @@ You can use Dashy's default [`docker-compose.yml`](https://github.com/Lissy93/da An example Docker compose, using the default base image from DockerHub, might look something like this: ```yaml ---- services: dashy: container_name: Dashy - image: lissy93/dashy + image: lissy93/dashy:latest volumes: - - /root/my-config.yml:/app/user-data/conf.yml + - ./user-data:/app/user-data ports: - 4000:8080 environment: - BASE_URL=/my-dashboard restart: unless-stopped healthcheck: - test: ['CMD', 'node', '/app/services/healthcheck'] + test: ['CMD', 'node', '/app/services/healthcheck.js'] interval: 1m30s timeout: 10s retries: 3 - start_period: 40s + start_period: 30s ``` **[โฌ†๏ธ Back to Top](#management)** @@ -643,7 +678,7 @@ If you're facing permission issues on Debian-based systems when running Docker c For containers in general, running as an unprivileged user is one of the best ways to prevent privilege escalation attacks. You can specify a user with the [`--user` param](https://docs.docker.com/engine/reference/run/#user), using the user ID (`UID`) from `id -u` and group ID (`GID`) from `id -g`. -**Note for Dashy:** If you use features that write to disk (saving config through the UI, triggering a rebuild), the process needs write access to `/app/user-data/` and `/app/dist/`. Since the default image creates these directories as root, running with `--user` will cause those features to fail with permission errors unless you also fix ownership of the mounted volumes. If you only use Dashy in read-only mode, running as a non-root user works fine: +**Note for Dashy:** If you use features that write to disk (saving config through the UI), the process needs write access to `/app/user-data/`. Since the default image creates these directories as root, running with `--user` will cause those features to fail with permission errors unless you also fix ownership of the mounted volumes. If you only use Dashy in read-only mode, running as a non-root user works fine: `docker run --user 1000:1000 -p 8080:8080 lissy93/dashy` @@ -711,18 +746,16 @@ Similarly, never expose `/var/run/docker.sock` to other containers as a volume, ### Use Read-Only Volumes -You can specify that a specific volume should be read-only by appending `:ro` to the `-v` switch. For example, while running Dashy, if we want our config to be writable, but keep all other assets protected, we would do: +You can specify that a volume should be read-only by appending `:ro` to the `-v` switch. If you don't need the in-app config editor, mount your `user-data` read-only: ```bash docker run -d \ -p 8080:8080 \ - -v ~/dashy-conf.yml:/app/user-data/conf.yml \ - -v ~/dashy-icons:/app/public/item-icons:ro \ - -v ~/dashy-theme.scss:/app/src/styles/user-defined-themes.scss:ro \ + -v ~/dashy-data:/app/user-data:ro \ lissy93/dashy:latest ``` -You can also prevent a container from writing any changes to volumes on your host's disk, using the `--read-only` flag. Although, for Dashy, you will not be able to write config changes to disk, when edited through the UI with this method. You could make this work, by specifying the config directory as a temp write location, with `--tmpfs /app/user-data/conf.yml` - but that this will not write the volume back to your host. +If you do want config changes from the UI to persist back to disk, leave the mount writable. You can also use `--read-only` to make the whole container filesystem read-only, but in that case UI-driven config edits will not be saved. ### Set the Logging Level @@ -806,7 +839,7 @@ server { } ``` -To use HTML5 history mode (the default - controlled via the `VUE_APP_ROUTING_MODE` build-time env var), replace the inside of the location block with: `try_files $uri $uri/ /index.html;`. +To use HTML5 history mode (the default - controlled via the `VITE_APP_ROUTING_MODE` build-time env var), replace the inside of the location block with: `try_files $uri $uri/ /index.html;`. Then upload the build contents of Dashy's dist directory to that location. For example: `scp -r ./dist/* [username]@[server_ip]:/var/www/dashy/html` diff --git a/docs/multi-language-support.md b/docs/multi-language-support.md index 3bb4d6598a..d055d8b30f 100644 --- a/docs/multi-language-support.md +++ b/docs/multi-language-support.md @@ -64,27 +64,12 @@ Using [`en.json`](https://github.com/Lissy93/dashy/tree/master/src/assets/locale ### 3. Add your file to the app -In [`./src/utils/languages.js`](https://github.com/Lissy93/dashy/tree/master/src/utils/languages.js), you need to do 2 small things: - -First import your new translation file, do this at the top of the page. -E.g. `import de from '@/assets/locales/de.json';` - -Second, add it to the array of languages, e.g: +In [`./src/utils/languages.js`](https://github.com/Lissy93/dashy/tree/master/src/utils/languages.js), add your language's metadata to the `languages` array: ```javascript export const languages = [ - { - name: 'English', - code: 'en', - locale: en, - flag: '๐Ÿ‡ฌ๐Ÿ‡ง', - }, - { - name: 'German', // The name of your language - code: 'de', // The ISO code of your language - locale: de, // The name of the file you imported (no quotes) - flag: '๐Ÿ‡ฉ๐Ÿ‡ช', // An optional flag emoji - }, + { name: 'English', code: 'en', flag: '๐Ÿ‡ฌ๐Ÿ‡ง' }, + { name: 'German', code: 'de', flag: '๐Ÿ‡ฉ๐Ÿ‡ช' }, // The name, ISO code, and flag emoji for your language ]; ``` diff --git a/docs/pages-and-sections.md b/docs/pages-and-sections.md index 38f4b2e24d..589d8e5e72 100644 --- a/docs/pages-and-sections.md +++ b/docs/pages-and-sections.md @@ -1,5 +1,25 @@ # Pages and Sections +## Page Metadata + +Set your dashboard's branding under `pageInfo` + +```yaml +pageInfo: + title: My Dashboard # Used for main h1 title, and browser tab text + description: Home server links + logo: /web-icons/my-logo.png # path/URL to optional logo to display next to title + favicon: 'https://example.com/path/to/icon' # path/URL to a favicon (shows in browser tab) + color: '#2a7cf0' # Hex color, to set the browser/address bar color on mobile (supported browsers only) + footer: 'ยฉ 2026 Me' # Optional text or HTML content, to display in the pages footer +``` + +If you have multiple configs/pages, then these values swap automatically as you navigate between sub-pages. + +The only caveat being, if you install Dashy as a PWA, the installed app's name, icon, and splash-screen colour come from the bundled `manifest.webmanifest` (baked at build time) rather than `pageInfo`. Runtime values only apply when browsing in a regular tab or browser. + +--- + ## Multi-Page Support You can have additional pages within your dashboard, with each having it's own config file. The config files for sub-pages can either be stored locally, or hosted separately. A link to each additional page will be displayed in the navigation bar. @@ -28,8 +48,6 @@ If you're sub-page is located within `/app/user-data`, then you only need to spe A default template a page can be found here: [https://github.com/lissy93/dashy/blob/master/user-data/conf.yml](https://github.com/lissy93/dashy/blob/master/user-data/conf.yml) Keep in mind the appConfig cannot be used on subpages and should be removed, for further info see [Restrictions](#restrictions) -The last very important step is to rebuild dashy, this can be easily done through to UI, by opening the settings menu on the top right, navigato to update config and then recompile application. - Now if you reload the page, on the top right there should be a new button to navigate to the new page. ๐ŸŽ‰ ### Using Remote Sub-Pages @@ -65,9 +83,71 @@ The following example shows creating a config, publishing it as a [Gist](https:/ Only top-level fields supported by sub-pages are `pageInfo` and `sections`. The `appConfig` and `pages` will always be inherited from your main `conf.yml` file. Other than that, sub-pages behave exactly the same as your default view, and can contain sections, items, widgets and page info like nav links, title and logo. -Note that since page paths are required by the router, they are set at build-time, not run-time, and so a rebuild (happens automatically) is required for changes to page paths to take effect (this only applies to changes to the `pages` array, rebuild isn't required for editing page content). +### URL Structure + +Every view in Dashy shares the same URL shape, so any config can be reached from any view: + +``` +/ Landing โ€” whichever view you set as the default +/ Root config in +// Sub-config in +///
Single section of in +//main/
Single section of the root config (main is a reserved page id) +``` + +`` is one of `home`, `minimal`, or `workspace`. `` is the sub-config id โ€” the sub-page's `name` (from the `pages` array) converted to lowercase-and-dashes (emoji and other non-word characters stripped). `
` follows the same slugging rules. Workspace has no single-section URL; it uses its sidebar instead. + +Examples: + +``` +/home Home view, main config +/home/homelab Home view, "Homelab" sub-config +/home/homelab/media Home view, "Homelab" sub-config, "Media" section only +/home/main/getting-started Home view, main config, "Getting Started" section only +/minimal/homelab Minimal view, "Homelab" sub-config +/minimal/homelab/media Minimal view, "Homelab" sub-config, "Media" section pre-selected +/workspace/homelab Workspace view, "Homelab" sub-config +``` + +The view switcher, sub-page nav links, and section deep-links all preserve your current view and sub-page โ€” so clicking through a single-section view and then hitting "back to all" returns you to the same sub-page you came from. + +--- + +## Layout + +`appConfig.layout` controls how your sections sit on the page: + +- `auto` (default): masonry grid, shorter sections fill the gaps under taller ones +- `horizontal`: sections stacked top to bottom, each full width +- `vertical`: sections side by side in columns + +You can also switch between these from the settings menu. Add `appConfig.colCount` to force a specific number of columns. + +### Making a section wider + +Use `displayData.cols` (1 to 5) to make a section span extra columns: + +```yaml +- name: Important Links + displayData: + cols: 2 + collapsed: false + items: [...] +``` + +Section heights follow their content, so there's no `rows` option. + +### Items inside a section + +Items wrap responsively by default. The useful knobs on `displayData`: + +- `itemSize`: `small`, `medium` (default), or `large` (large tiles also show a description) +- `sortBy`: `alphabetical`, `reverse-alphabetical`, `most-used`, `last-used`, `random` +- `sectionLayout: grid` plus `itemCountX` and/or `itemCountY` if you want a fixed grid instead of auto wrapping + +See [configuring.md](./configuring.md#sectiondisplaydata-optional) for the full list of options. -## Sub-Items +### Sub-Items A normal section will contain zero or more items, for example: diff --git a/docs/privacy.md b/docs/privacy.md index 8f3a92d3ab..1dd62b44d5 100644 --- a/docs/privacy.md +++ b/docs/privacy.md @@ -264,7 +264,7 @@ Dashy provides several options to restrict what users can modify: - `appConfig.disableConfiguration` - Hides the config UI from all users - `appConfig.disableConfigurationForNonAdmin` - Hides the config UI for non-admin users -These can be combined with the `admin` and `normal` user roles to give fine-grained control. Admin users can save config changes and trigger app rebuilds, while normal users have read-only access. For more details, see the [Authentication Docs: Permissions](/docs/authentication.md#permissions). +These can be combined with the `admin` and `normal` user roles to give fine-grained control. Admin users can save config changes, while normal users have read-only access. For more details, see the [Authentication Docs: Permissions](/docs/authentication.md#permissions). ### Disabling Features @@ -326,7 +326,7 @@ If exposed to the internet, Dashy **must** be placed behind a reverse proxy with | "Status checks can be used for SSRF" | Status check target URLs are set by the server admin in `conf.yml`, not by end users. If auth is enabled, the endpoint is protected. | | "Password hashes are stored in plaintext in conf.yml" | They are SHA-256 hashes, not plaintext passwords. The config file should be readable only by the server admin, and protected by HTTP auth when served. | | "localStorage/cookies are not encrypted" | Browser storage is scoped to the origin and inaccessible to other domains. On a shared device, use your browser's profile isolation. | -| "No CSRF protection" | Dashy's state-changing operations (config save/rebuild) are protected by auth middleware. CSRF is a low risk on a private network dashboard. | +| "No CSRF protection" | Dashy's state-changing operations (config save) are protected by auth middleware. CSRF is a low risk on a private network dashboard. | | "Docker container runs as root" | The container is sandboxed. For hardened deployments, override with `--user` flag or configure in your Docker Compose file as described in the [container security docs](/docs/management.md#container-security). | | "Auth cookie is not HttpOnly/Secure" | The token is needed by client-side JavaScript for auth state. On a private network over plain HTTP, the `Secure` flag would break auth. Use HTTPS + a reverse proxy to add these flags if needed. | | "Iframe/embed widget can load arbitrary URLs" | The widget config is written by the server admin, not end users. If you don't trust your config authors, disable the config editor with `disableConfiguration`. | diff --git a/docs/quick-start.md b/docs/quick-start.md index 1176b9c8d6..cb2e04a7bb 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -20,21 +20,30 @@ To pull the latest image, and build and start the app run: ```bash docker run -d \ -p 8080:8080 \ - -v ~/my-conf.yml:/app/user-data/conf.yml \ - --name my-dashboard \ + -v ~/dashy-data:/app/user-data \ + --name dashy \ --restart=always \ lissy93/dashy:latest ``` -Either replace the -v path to point to your config file, or leave it out. For a full list of available options, then see [Dashy with Docker](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) Docs. If you'd prefer to use Docker Compose, then see [Dashy with Docker Compose](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#using-docker-compose) Docs. Alternate registries, architectures and pinned versions are also supported. +Your dashboard should now be up and running at `http://localhost:8080` (or your servers IP address/ domain, and the port that you chose) ๐ŸŽ‰ -Your dashboard should now be up and running at `http://localhost:8080` (or your servers IP address/ domain, and the port that you chose). The first time you build, it may take a few minutes. +Dashy is also available via GHCR (`ghcr.io/lissy93/dashy`).
+You can either use `:latest` or pin to specific versions (like `4.0.0`).
+All images are multi-arch (works on amd64, arm64, and arm/v7).
+To use with compose, see our sample [`docker-compose.yml`](https://github.com/lissy93/dashy/blob/master/docker-compose.yml).
+Once up and running, check the [configuring reference](https://dashy.to/docs/configuring) and [other docs](https://dashy.to/docs).
+ +> [!NOTE] +> You need to mount a directory for your Dashy settings in `/app/user-data`. +> The only required file here is the `conf.yml`, but this is also where you can put any other page configs and assets like images/icons, stylesheets, fonts, etc. +> Everything in this directory is served from Dashy's root (e.g. `/app/user-data/logo.png` will be accessible at `http://[dashy.local]/logo.png`). --- ## 3. User Data Directory -Your config file should be placed inside `user-data/` (in Docker, that's `/app/user-data/`). +Your config file should be placed inside `user-data` (in Docker, that's `/app/user-data/`). This directory can also contain some optional assets you wish to use within your dashboard, like icons, fonts, styles, scripts, etc. @@ -97,8 +106,8 @@ sections: # An array of sections Notes: -- You can use a Docker volume to pass a config file from your host system to the container - - E.g. `-v ./host-system/my-local-conf.yml:/app/user-data/conf.yml` +- You can use a Docker volume to pass your `user-data` directory from the host into the container + - E.g. `-v ./host-system/user-data:/app/user-data` - It's also possible to edit your config directly through the UI, and changes will be saved in this file - Check your config against Dashy's schema, with `docker exec -it [container-id] yarn validate-config` - You might find it helpful to look at some examples, a collection of which can be [found here](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10) diff --git a/docs/theming.md b/docs/theming.md index e538a91efa..2f300b0f4c 100644 --- a/docs/theming.md +++ b/docs/theming.md @@ -12,25 +12,57 @@ The following content requires that you have a basic understanding of CSS. If yo ## How Theme-Switching Works -The theme switching is done by simply changing the `data-theme` attribute on the root DOM element, which can then be targeted by CSS. First off, in order for the theme to show up in the theme switcher, it needs to be added to the config file, under `appConfig.cssThemes`, either as a string, or an array of strings for multiple themes. For example: +The theme switching is done by simply changing the `data-theme` attribute on the root DOM element, which can then be targeted by CSS. All colors and styles are managed with CSS variables. + +The theme switcher in the UI will list all themes defined in [here](github.com/Lissy93/dashy/blob/3.3.1/src/utils/defaults.js#L50), as well as any extras that you add yourself under `appConfig.cssThemes`. Then, when a theme is selected, any CSS within `html[data-theme='my-theme']{}` will be applied. + +To apply a default theme to your instance, set `appConfig.theme` (or, use `dayTheme` and `nightTheme` to adjust according to your OS light/dark preferences). + +## Adding Your Own Theme + +### Option 1: Colors-only, in `conf.yml` + +Quickest path when you just want to change colors. Name the theme under `cssThemes` so it shows in the dropdown, then list your colors under `customColors`: ```yaml appConfig: - cssThemes: ['tiger', 'another-theme'] + theme: mytheme + cssThemes: [mytheme] + customColors: + mytheme: + primary: '#ff6b6b' + background: '#1a1a2e' + background-darker: '#0f0f1e' ``` -You can now create a block to target you're theme with `html[data-theme='my-theme']{}` and set some styles. The easiest method is by setting CSS variables, but you can also directly override elements by their selector. As an example, see the [built-in CSS themes](https://github.com/Lissy93/dashy/blob/master/src/styles/color-themes.scss). +Reload Dashy and `mytheme` appears in the dropdown. Any of the [CSS variables](#css-variables) can go here. + +### Option 2: Full CSS file + +Use this when you want more than colors (fonts, backgrounds, layout tweaks), or a portable file you can share between instances. + +Drop a CSS file into the directory you mount for `conf.yml` (usually `./user-data/`). Dashy serves that directory as static files at the site root, so the stylesheet is fetchable at `/mytheme.css`: ```css -html[data-theme='tiger'] { - --primary: #f58233; - --background: #0b1021; +/* user-data/mytheme.css */ +html[data-theme='mytheme'] { + --primary: #ff6b6b; + --background: #1a1a2e; + --background-darker: #0f0f1e; + /* anything inside this block only applies when mytheme is active */ } ``` -Finally, from the UI use the theme dropdown menu to select your new theme, and your styles will be applied. +Then wire it up: -You can also set `appConfig.theme` to pre-select a default theme, which will be applied immediately after deployment. +```yaml +appConfig: + theme: mytheme + cssThemes: [mytheme] + externalStyleSheet: /mytheme.css +``` + +`externalStyleSheet` also takes a full `https://` URL if you'd rather host the file on a CDN or a repo, and it accepts an array to load several at once. See [Loading External Stylesheets](#loading-external-stylesheets) for more. ## Modifying Theme Colors @@ -44,7 +76,7 @@ Themes can be modified either through the UI, using the color picker menu (to th By default, any color modifications made to the current theme through the UI will only be applied locally. If you need these settings to be set globally, then click the 'Export' button, to get the color codes and variable names, which can then be backed up, or saved in your config file. -Custom colors are saved relative the the base theme selected. So if you switch themes after setting custom colors, then you're settings will no longer be applied. You're changes are not lost though, and switching back to the original theme will see your styles reapplied. +Custom colors are saved relative to the base theme selected. So if you switch themes after setting custom colors, then your settings will no longer be applied. Your changes aren't lost though, and switching back to the original theme will see your styles reapplied. If these values are specified in your `conf.yml` file, then it will look something like the below example. Note that in YAML, values or keys which contain special characters, must be wrapped in quotes. @@ -58,15 +90,11 @@ appConfig: primary: '#8be9fd' ``` -## Adding your own Theme - -User-defined styles and custom themes should be defined in `./src/styles/user-defined-themes.scss`. If you're using Docker, you can pass your own stylesheet in using the `--volume` flag. E.g. `v ./my-themes.scss:/app/src/styles/user-defined-themes.scss`. Don't forget to pass your theme name into `appConfig.cssThemes` so that it shows up on the theme-switcher dropdown. - ## Setting Custom CSS in the UI Custom CSS can be developed, tested and applied directly through the UI. Although you will need to make note of your changes to apply them across instances. -This can be done from the Config menu (spanner icon in the top-right), under the Custom Styles tab. This is then associated with `appConfig.customCss` in local storage. Styles can also be directly applied to this attribute in the config file, but this may get messy very quickly if you have a lot of CSS. +This can be done from the Config menu (spanner icon, inside the options panel in the header), under the Custom Styles tab. This is then associated with `appConfig.customCss` in local storage. Styles can also be directly applied to this attribute in the config file, but this may get messy very quickly if you have a lot of CSS. ## Page-Specific Styles @@ -111,13 +139,17 @@ Fonts which are not being used by the current theme are **not** fetched on page Full credit to the typographers behind each of the included fonts. Specifically: Matt McInerney, Christian Robertson, Haley Fiege, Peter Hull, Cyreal and the legendary Vernon Adams +## Changing browser address bar / tab color + +Some browsers support setting a color, which will apply a tint to the address bar, and task switcher card title bar. To enable this, set `pageInfo.color` to any valid CSS color (e.g. `#ff00a7`, `rebeccapurple`, `rgb(40, 60, 120)`). Note that browser support for this is still limited (Android Chrome, Safari iOS 15+ and some recent mobile Chromium browsers). This does not apply if you've installed the PWA. For more page-specific browser and UI options, see [Pages and Sections](/docs/pages-and-sections.md). + ## CSS Variables All colors as well as other variable values (such as borders, border-radius, shadows) are specified as CSS variables. This makes theming the application easy, as you only need to change a given color or value in one place. You can find all variables in [`color-palette.scss`](https://github.com/Lissy93/dashy/blob/master/src/styles/color-palette.scss) and the themes which make use of these color variables are specified in [`color-themes.scss`](https://github.com/Lissy93/dashy/blob/master/src/styles/color-themes.scss) CSS variables are simple to use. You define them like: `--background: #fff;` and use them like: `body { background-color: var(--background); }`. For more information, see this guide on using [CSS Variables](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties). -You can determine the variable used by any given element, and visualize changes using the browser developer tools (Usually opened with `F12`, or Options --> More --> Developer Tools). Under the elements tab, click the Element Selector icon (usually top-left corner), you will then be able to select any DOM element on the page by hovering and clicking it. In the CSS panel you will see all styles assigned to that given element, including CSS variables. Click a variable to see it's parent value, and for color attributes, click the color square to modify the color. For more information, see this [getting started guide](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_are_browser_developer_tools), and these articles on [selecting elements](https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Select_an_element) and [inspecting and modifying colors](https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Inspect_and_select_colors). +You can determine the variable used by any given element, and visualize changes using the browser developer tools (Usually opened with `F12`, or Options --> More --> Developer Tools). Under the elements tab, click the Element Selector icon (usually top-left corner), you will then be able to select any DOM element on the page by hovering and clicking it. In the CSS panel you will see all styles assigned to that given element, including CSS variables. Click a variable to see its parent value, and for color attributes, click the color square to modify the color. For more information, see this [getting started guide](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_are_browser_developer_tools), and these articles on [selecting elements](https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Select_an_element) and [inspecting and modifying colors](https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Inspect_and_select_colors). ### Top-Level Variables @@ -149,16 +181,16 @@ You can target specific elements on the UI with these variables. All are optiona - `--item-text-color` - The text and icon color for items. Defaults to `--primary` - `--item-group-outer-background` - The background color for the outer part of a section (including section head). Defaults to `--primary` - `--item-group-background` - The background color for the inner part of item groups. Defaults to `#0b1021cc` (semi-transparent black) -- `--item-group-heading-text-color` - The text color for section headings. Defaults to `--item-group-background`; +- `--item-group-heading-text-color` - The text color for section headings. Defaults to `--item-group-background` - `--item-group-heading-text-color-hover` - The text color for section headings, when hovered. Defaults to `--background` - `--config-code-background` - Background color for the JSON editor in the config menu. Defaults to `#fff` (white) - `--config-code-color` - Text color for the non-highlighted code within the JSON editor. Defaults to `--background` - `--config-settings-color` - The background for the config/ settings pop-up modal. Defaults to `--primary` - `--config-settings-background` - The text color for text within the settings container. Defaults to `--background-darker` - `--scroll-bar-color` - Color of the scroll bar thumb. Defaults to `--primary` -- `--scroll-bar-background` Color of the scroll bar blank space. Defaults to `--background-darker` -- `--highlight-background` Fill color for text highlighting. Defaults to `--primary` -- `--highlight-color` Text color for selected/ highlighted text. Defaults to `--background` +- `--scroll-bar-background` - Color of the scroll bar blank space. Defaults to `--background-darker` +- `--highlight-background` - Fill color for text highlighting. Defaults to `--primary` +- `--highlight-color` - Text color for selected/ highlighted text. Defaults to `--background` - `--toast-background` - Background color for the toast info popup. Defaults to `--primary` - `--toast-color` - Text, icon and border color in the toast info popup. Defaults to `--background` - `--welcome-popup-background` - Background for the info pop-up shown on first load. Defaults to `--background-darker` diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index ae0513ad0a..44e0141fc7 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -13,7 +13,13 @@ - [404 On Static Hosting](#404-on-static-hosting) - [404 from Mobile Home Screen](#404-after-launch-from-mobile-home-screen) - [404 On Multi-Page Apps](#404-on-multi-page-apps) +- [Dashy hosted at a sub-path](#dashy-hosted-at-a-sub-path-eg-examplecomdashy) +- [Sub-page shows "Unable to find config for ..."](#sub-page-shows-unable-to-find-config-for-) +- [Sub-page missing from nav, or won't open when clicked](#sub-page-missing-from-nav-or-wont-open-when-clicked) +- [Sub-page ignores its theme, layout or appConfig](#sub-page-ignores-its-theme-layout-or-appconfig) +- [Sub-config files return 404](#sub-config-files-return-404) - [Yarn Build or Run Error](#yarn-error) +- [`yarn build` fails inside the container](#yarn-build-fails-inside-the-container) - [Remote Config Not Loading](#remote-config-not-loading) - [High CPU or RAM Usage on Startup](#high-cpu-or-ram-usage-on-startup) - [Heap limit Allocation failed](#ineffective-mark-compacts-near-heap-limit-allocation-failed) @@ -23,12 +29,14 @@ - [App Not Starting After Update to 2.0.4](#app-not-starting-after-update-to-204) - [Keycloak Redirect Error](#keycloak-redirect-error) - [OIDC or Keycloak failure on numeric client IDs](#oidc-or-keycloak-failure-on-numeric-client-ids) -- [Docker Directory Error](#docker-directory) +- [Mount Type Mismatch](#mount-type-mismatch) +- [Permission Denied Saving Config](#permission-denied-saving-config) - [Config not Saving on Vercel / Netlify / CDN](#config-not-saving-on-vercel--netlify--cdn) - [Config Not Updating](#config-not-updating) - [Config Still not Updating](#config-still-not-updating) - [Styles and Assets not Updating](#styles-and-assets-not-updating) - [DockerHub toomanyrequests](#dockerhub-toomanyrequests) +- [Old image tags fail to pull](#old-image-tags-fail-to-pull) - [Config Validation Errors](#config-validation-errors) - [Node Sass unsupported environment](#node-sass-does-not-yet-support-your-current-environment) - [Unreachable Code Error](#unreachable-code-error) @@ -47,7 +55,6 @@ - [Widget Displaying Inaccurate Data](#widget-displaying-inaccurate-data) - [Font Awesome Icons not Displaying](#font-awesome-icons-not-displaying) - [Copy to Clipboard not Working](#copy-to-clipboard-not-working) -- [Unsupported Digital Envelope Routines](#unsupported-digital-envelope-routines) - [How to Reset Local Settings](#how-to-reset-local-settings) - [How to make a bug report](#how-to-make-a-bug-report) - [Public IP Widget not working for ipinfo or ipquery providers](#public-ip-widget-not-working-for-ipinfo-or-ipquery-providers) @@ -149,16 +156,16 @@ Content-Security-Policy: frame-ancestors 'self' https://[dashy-location]/ If you're seeing Dashy's 404 page on initial load/ refresh, and then the main app when you go back to Home, then this is likely caused by the Vue router, and if so can be fixed in one of two ways. -The first solution is to switch the routing mode, from HTML5 `history` mode to `hash` mode, by rebuilding Dashy with the `VUE_APP_ROUTING_MODE=hash` build-time environment variable set. +The first solution is to switch the routing mode, from HTML5 `history` mode to `hash` mode, by rebuilding Dashy with the `VITE_APP_ROUTING_MODE=hash` build-time environment variable set. -If this works, but you wish to continue using HTML5 history mode, then a bit of extra [server configuration](/docs/management.md#web-server-configuration) is required. This is explained in more detaail in the [Vue Docs](https://router.vuejs.org/guide/essentials/history-mode.html). Once completed, you can then use `VUE_APP_ROUTING_MODE=history` (the default) again, for neater URLs. +If this works, but you wish to continue using HTML5 history mode, then a bit of extra [server configuration](/docs/management.md#web-server-configuration) is required. This is explained in more detaail in the [Vue Docs](https://router.vuejs.org/guide/essentials/history-mode.html). Once completed, you can then use `VITE_APP_ROUTING_MODE=history` (the default) again, for neater URLs. --- ## 404 after Launch from Mobile Home Screen Similar to the above issue, if you get a 404 after using iOS and Android's "Add to Home Screen" feature, then this is caused by Vue router. -It can be fixed by rebuilding Dashy with the `VUE_APP_ROUTING_MODE=hash` build-time environment variable set. +It can be fixed by rebuilding Dashy with the `VITE_APP_ROUTING_MODE=hash` build-time environment variable set. See also: [#628](https://github.com/Lissy93/dashy/issues/628), [#762](https://github.com/Lissy93/dashy/issues/762) @@ -166,12 +173,84 @@ See also: [#628](https://github.com/Lissy93/dashy/issues/628), [#762](https://gi ## 404 On Multi-Page Apps -Similar to above, if you get a 404 error when visiting a page directly on multi-page apps, then this can be fixed by rebuilding Dashy with the `VUE_APP_ROUTING_MODE=hash` build-time environment variable set, then refreshing the page. +Similar to above, if you get a 404 error when visiting a page directly on multi-page apps, then this can be fixed by rebuilding Dashy with the `VITE_APP_ROUTING_MODE=hash` build-time environment variable set, then refreshing the page. See also: [#670](https://github.com/Lissy93/dashy/issues/670), [#763](https://github.com/Lissy93/dashy/issues/763) --- +## Dashy hosted at a sub-path (e.g. `example.com/dashy`) + +If the homepage works but sub-page links 404, or assets fail to load, it's almost always the base path. +Rebuild with `BASE_URL` set to the sub-path - leading slash, no trailing slash: + +Vue Router uses this to prefix every route. Without it, links resolve to `/home/...` instead of `/dashy/home/...` and skip your reverse proxy altogether. More detail in [web-server configuration](/docs/management.md#web-server-configuration). + +--- + +## Sub-page shows "Unable to find config for ..." + +This means Dashy couldn't match the URL segment to any entry in your `pages:` list. A few causes: + +### Old bookmark from before an upgrade +Slugs are now trimmed more aggressively (e.g. `๐ŸŒ Command Center` used to give `-command-center`, now gives `command-center`). Re-bookmark from the nav, or update the URL by hand. + +### The page was renamed or removed +The URL no longer resolves to anything. Check the `pages:` array in `conf.yml` and confirm the sub-page still exists. + +### The path points at an unreachable file +If the sub-config YAML can't be fetched (404, CORS, auth), you'll see "Unable to load config from ..." instead. Verify the `path:` is correct, reachable from the browser, and CORS-open if remote. + +### Page name literally "Main" +`main` is reserved in the URL scheme to mean "the root config". A page named "Main" becomes reachable at `/home/main-page` (not `/home/main`). Rename the page if that's confusing. + +### Service worker is serving a stale app +Hard-refresh (Ctrl + F5) after a major upgrade. The PWA cache may still be pointing at old routes. Also see [Styles and Assets not Updating](#styles-and-assets-not-updating). + +--- + +## Sub-page missing from nav, or won't open when clicked + +If page defined in `pages:` is nowhere in the nav bar, or its link goes to a different page, then there's probably something wrong with the name you chose. Note that Dashy strips out any non-alphanumeric characters. +- Ensure each page does have a valid `name` and `path` field +- Check two pages don't have the same/similar name +- Check each page has a name which has at least some alpha-numeric characters +- Very long names could be being stripped/truncated + +--- + +## Sub-page ignores its theme, layout or appConfig + +This is by design. Only the `appConfig` from your root `conf.yml` is used - theme, layout, iconSize, statusCheck, etc. are inherited globally so behaviour stays consistent across pages. + +If you put `appConfig` inside a sub-page YAML, it's silently dropped on load. Move the values to the root config. See [Restrictions](/docs/pages-and-sections.md#restrictions). + +--- + +## Sub-config files return 404 + +If your `conf.yml` references additional pages via `pages:` and the browser shows `Sub-config load failed: /something.yml`, the cause is almost always a Docker mount that only exposes `conf.yml` and not the rest of `user-data/`. + +If you've done this: + +```yaml +volumes: + - ./my-conf.yml:/app/user-data/conf.yml +``` + +Only `conf.yml` exists inside the container. Anything it references (sub-configs, custom icons, fonts, CSS) isn't there. + +Mount the directory instead: + +```yaml +volumes: + - ./user-data:/app/user-data +``` + +Now everything in your `user-data` folder is reachable at the web root. Same applies to `docker run -v`. + +--- + ## Yarn Error For more info, see [Issue #1](https://github.com/Lissy93/dashy/issues/1) @@ -192,6 +271,16 @@ Alternatively, as a workaround, you have several options: --- +## `yarn build` fails inside the container + +If you run `docker exec yarn build` and get `vite: not found` (or similar), it's because the published image ships only production dependencies. The build toolchain (vite, vue-tsc, sass, etc.) lives in `devDependencies` and isn't installed in the runtime image. + +You almost certainly don't need to rebuild. Dashy's Express server reads `user-data/conf.yml` on every request, so config changes show up on a page refresh, no rebuild required. + +If you genuinely need a fresh build (you've patched something in `src/`), do it on the host with `yarn install && yarn build`, or build a custom image from a checkout of the repo. + +--- + ## Remote Config Not Loading If you've got a multi-page dashboard, and are hosting the additional config files yourself, then CORS rules will apply. A CORS error will look something like: @@ -213,7 +302,7 @@ When the Dashy container first starts, it runs a Vue production build in paralle **To work around it:** -1. **Allocate at least 1 GB of RAM to the container** โ€” 2 GB is recommended on Raspberry Pi or low-powered VMs. Anything below 512 MB is unlikely to complete the first build. +1. **Allocate at least 1 GB of RAM to the container** - 2 GB is recommended on Raspberry Pi or low-powered VMs. Anything below 512 MB is unlikely to complete the first build. 2. **Set explicit Docker resource limits** so the build can't starve other services on the same host: ```yaml services: @@ -225,8 +314,8 @@ When the Dashy container first starts, it runs a Vue production build in paralle memory: 2g cpus: '1.5' ``` -3. **Wait it out** โ€” once the build completes, idle CPU drops to near zero and idle RAM is typically under 100 MB. If you watch `docker stats`, you'll see the spike taper off. -4. If the spike never tapers (i.e., Dashy stays at 100% CPU forever and never serves the page), see [Heap limit Allocation failed](#ineffective-mark-compacts-near-heap-limit-allocation-failed) below โ€” that usually means the build was killed mid-way and is being retried. +3. **Wait it out** - once the build completes, idle CPU drops to near zero and idle RAM is typically under 100 MB. If you watch `docker stats`, you'll see the spike taper off. +4. If the spike never tapers (i.e., Dashy stays at 100% CPU forever and never serves the page), see [Heap limit Allocation failed](#ineffective-mark-compacts-near-heap-limit-allocation-failed) below - that usually means the build was killed mid-way and is being retried. See also: [#1585](https://github.com/Lissy93/dashy/issues/1585), [#969](https://github.com/Lissy93/dashy/issues/969), [#1500](https://github.com/Lissy93/dashy/issues/1500), [#877](https://github.com/Lissy93/dashy/issues/877) @@ -262,7 +351,7 @@ See also [#624](https://github.com/Lissy93/dashy/issues/624) ## Container Crashes or Restart Loop After Saving Config -If your Dashy container crashes or enters a restart loop the moment you click **Save to Disk** in the editor โ€” particularly with logs that include something like: +If your Dashy container crashes or enters a restart loop the moment you click **Save to Disk** in the editor - particularly with logs that include something like: ```text node:_http_outgoing:652 @@ -358,7 +447,7 @@ See also: #479, #409, #507, #491, #341, #520 If your IdP rejects the login with an *"invalid client"* / *"client not found"* error, and your `clientId` is a long numeric value, the cause is almost certainly YAML number parsing. -YAML parses unquoted numeric tokens as Numbers, and JavaScript can't represent integers larger than 2^53 (~16 digits) without losing precision. So an unquoted numeric `clientId` will be silently truncated (e.g. `918756876419824312` โ†’ `918756876419824300`), or โ€” for very large values โ€” converted to scientific notation (e.g. `9.187568764198242e+37`), and the IdP will reject it. +YAML parses unquoted numeric tokens as Numbers, and JavaScript can't represent integers larger than 2^53 (~16 digits) without losing precision. So an unquoted numeric `clientId` will be silently truncated (e.g. `918756876419824312` โ†’ `918756876419824300`), or - for very large values - converted to scientific notation (e.g. `9.187568764198242e+37`), and the IdP will reject it. The fix is to wrap the `clientId` in quotes in your `conf.yml` so it gets parsed as a string: @@ -377,18 +466,37 @@ See also: #1941 --- -## Docker Directory +## Mount Type Mismatch ```text -Error response from daemon: OCI runtime create failed: container_linux.go:380: -starting container process caused: process_linux.go:545: container init caused: -rootfs_linux.go:76: mounting "/home/ubuntu/my-conf.yml" to rootfs at -"/app/user-data/conf.yml" caused: mount through procfd: not a directory: -unknown: Are you trying to mount a directory onto a file (or vice-versa)? -Check if the specified host path exists and is the expected type. +Error response from daemon: ... mount through procfd: not a directory: +Are you trying to mount a directory onto a file (or vice-versa)? ``` -If you get an error similar to the one above, you are mounting a directory to the config file's location, when a plain file is expected. Create a YAML file, (`touch my-conf.yml`), populate it with a sample config, then pass it as a volume: `-v ./my-local-conf.yml:/app/user-data/conf.yml` +This means the host side and container side of your volume don't agree on whether the target is a file or a directory. + +Recommended pattern: mount a host directory onto `/app/user-data`. The directory must exist on the host and contain at least a `conf.yml`: + +```bash +mkdir -p ~/dashy-data +cp /path/to/your/conf.yml ~/dashy-data/conf.yml +docker run -d -p 8080:8080 -v ~/dashy-data:/app/user-data lissy93/dashy:latest +``` + +If you'd rather mount a single file (`-v ~/conf.yml:/app/user-data/conf.yml`), the host path must be a file that already exists, otherwise Docker creates a directory in its place and you'll see this error. + +--- + +## Permission Denied Saving Config + +If saving config from the UI fails with `EACCES` or `permission denied`, your mounted `user-data` directory is owned by a uid the container can't write to. Inside the container, Dashy runs as uid 1000 (the `node` user), and your host directory probably belongs to a different uid. + +Two fixes, pick whichever's less of a faff: + +1. Run the container as your own user. On `docker run`, add `--user $(id -u):$(id -g)`. In `docker-compose.yml`, uncomment the `user:` line and set it to your uid:gid (run `id -u` and `id -g` to find them). +2. Hand the directory to uid 1000: `sudo chown -R 1000:1000 /path/to/your/user-data`. + +Most people are already uid 1000 on Linux and macOS, so this only tends to bite on NAS boxes, multi-user servers, or anywhere the first user isn't 1000. --- @@ -452,11 +560,25 @@ You can [check your rate limit status](https://www.docker.com/blog/checking-your --- +## Old image tags fail to pull + +If `docker pull` returns `manifest unknown` or `manifest for lissy93/dashy:arm32v7 not found`, the cause is a stale architecture-specific tag in your compose file or run command. Tags like `:arm32v7`, `:arm64v8`, and `:multi-arch` are no longer published. + +The `:latest` tag is now multi-arch and works on amd64, arm64, and arm/v7 (Raspberry Pi 2 and up) without you having to pick a variant. Just use: + +```yaml +image: lissy93/dashy:latest +``` + +Docker fetches the right architecture for your host automatically. To pin a version, use a semver tag, e.g. `lissy93/dashy:3.2.14`. + +--- + ## Config Validation Errors -The configuration file is validated against [Dashy's Schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json) using AJV. +The configuration file is validated against [Dashy's Schema](https://github.com/Lissy93/dashy/blob/master/src/utils/config/ConfigSchema.json) using AJV. -First, check that your syntax is valid, using [YAML Validator](https://codebeautify.org/yaml-validator/) or [JSON Validator](https://codebeautify.org/jsonvalidator). If the issue persists, then take a look at the [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json), and verify that the field you are trying to add/ modify matches the required format. You can also use [this tool](https://www.jsonschemavalidator.net/s/JFUj7X9J) to validate your JSON config against the schema, or run `yarn validate-config`. +First, check that your syntax is valid, using [YAML Validator](https://codebeautify.org/yaml-validator/) or [JSON Validator](https://codebeautify.org/jsonvalidator). If the issue persists, then take a look at the [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/config/ConfigSchema.json), and verify that the field you are trying to add/ modify matches the required format. You can also use [this tool](https://www.jsonschemavalidator.net/s/JFUj7X9J) to validate your JSON config against the schema, or run `yarn validate-config`. If you're trying to use a recently released feature, and are getting a warning, this is likely because you've not yet updated the the current latest version of Dashy. @@ -539,7 +661,7 @@ If you're serving Dashy though a CDN, instead of using the Node server or Docker ## Healthcheck Failing in Docker -If `docker ps` shows the Dashy container as `unhealthy`, it means the periodic healthcheck (`yarn health-check`, run every 5 minutes by default) couldn't reach the local server. +If `docker ps` shows the Dashy container as `unhealthy`, the periodic healthcheck (`node services/healthcheck.js`, run every 5 minutes by default) couldn't reach the local server. ### SSL-enabled Dashy @@ -549,9 +671,9 @@ The healthcheck reads the same cert paths as the main server (`/etc/ssl/certs/da If you've set `PORT` to override the default 8080, the healthcheck honors the same env var, so it should work without changes. Make sure `PORT` is set in the container environment, not just in the host-side Docker port mapping. -### Slow startup on weak hardware +### Container is unhealthy past the grace period -The healthcheck has a `--start-period=30s` grace period before failures count against the container. If your host takes longer than 30 seconds for the initial Vue build to complete (common on Pi 3 or similar), the first few healthchecks will fail and you may briefly see `unhealthy`. After the build finishes, subsequent checks should pass โ€” see [High CPU or RAM Usage on Startup](#high-cpu-or-ram-usage-on-startup) below. +The healthcheck has a 20s `start-period` after which failures start counting. The image is prebuilt, so startup is just `node server.js` binding to a port - fast even on a Pi. If the container is still `unhealthy` past the grace period, the server has likely crashed. Check `docker logs ` for the real error (usually a malformed `conf.yml` or a missing `user-data` mount). See also: [#1410](https://github.com/Lissy93/dashy/issues/1410) @@ -622,7 +744,7 @@ For testing purposes, you can use an addon, which will disable the CORS checks. ## CORS Proxy `connect ECONNREFUSED ...` or `getaddrinfo ENOTFOUND ...` -The target host is unreachable from the Dashy container. If the target is on the same host as Dashy, **don't use `localhost`** โ€” inside a Docker container that resolves to the container itself, not the host. Use the host's LAN IP, the Docker bridge gateway, or `host.docker.internal` (on Docker Desktop). If the target is on a different Docker network, attach Dashy to that network too. +The target host is unreachable from the Dashy container. If the target is on the same host as Dashy, **don't use `localhost`** - inside a Docker container that resolves to the container itself, not the host. Use the host's LAN IP, the Docker bridge gateway, or `host.docker.internal` (on Docker Desktop). If the target is on a different Docker network, attach Dashy to that network too. --- @@ -630,8 +752,8 @@ The target host is unreachable from the Dashy container. If the target is on the To prevent the CORS proxy from being abused as a Server-Side Request Forgery vector, Dashy refuses to proxy a small number of host/scheme combinations by default: -- **Cloud instance metadata services** โ€” `169.254.169.254`, `metadata.google.internal`, and the matching IPv6 forms. These are reserved magic addresses on AWS, Azure, GCP, DigitalOcean, Hetzner, Oracle Cloud and most other providers. A widget that successfully fetches them on a cloud-hosted Dashy can leak the host's IAM credentials, so they're blocked unconditionally. -- **Non-HTTP(S) schemes** โ€” `file://`, `ftp://`, `gopher://`, `javascript:`, `data:`, and similar. The proxy is meant for HTTP APIs only. +- **Cloud instance metadata services** - `169.254.169.254`, `metadata.google.internal`, and the matching IPv6 forms. These are reserved magic addresses on AWS, Azure, GCP, DigitalOcean, Hetzner, Oracle Cloud and most other providers. A widget that successfully fetches them on a cloud-hosted Dashy can leak the host's IAM credentials, so they're blocked unconditionally. +- **Non-HTTP(S) schemes** - `file://`, `ftp://`, `gopher://`, `javascript:`, `data:`, and similar. The proxy is meant for HTTP APIs only. If you're running Dashy in a fully isolated/private environment and you've deliberately decided you want to allow these (for example, you genuinely need to query your cloud provider's metadata API from a widget), you can opt out of all proxy restrictions by setting the environment variable: @@ -639,7 +761,7 @@ If you're running Dashy in a fully isolated/private environment and you've delib DANGEROUSLY_DISABLE_PROXY_RESTRICTIONS=true ``` -The variable is named so loudly because flipping it on a Dashy instance that's exposed to anything other than fully trusted users re-opens the SSRF surface โ€” anyone who can hit `/cors-proxy` can then use Dashy as a relay to reach internal services. **Don't set it on cloud-hosted or internet-exposed deployments.** +The variable is named so loudly because flipping it on a Dashy instance that's exposed to anything other than fully trusted users re-opens the SSRF surface - anyone who can hit `/cors-proxy` can then use Dashy as a relay to reach internal services. **Don't set it on cloud-hosted or internet-exposed deployments.** Note that this is an all-or-nothing escape hatch, not a per-host allowlist. If you only need to reach one specific host that's currently blocked, please open a feature request describing the use case. @@ -715,19 +837,6 @@ As a workaround, you could either: --- -## Unsupported Digital Envelope Routines - -If you're running on GitHub Codespaces, and seeing: `Error: error:0308010C:digital envelope routines::unsupported` when using Node 17+, it can be resolved by adding the `--openssl-legacy-provider` flag to your `NODE_OPTIONS` environmental variable. -For example: - -``` -export NODE_OPTIONS=--openssl-legacy-provider -``` - -This will be fixed once [webpack/webpack#17659](https://github.com/webpack/webpack/pull/17659) is merged. - ---- - ## How to Reset Local Settings Some settings are stored locally, in the browser's storage. diff --git a/docs/widgets.md b/docs/widgets.md index d81846f17f..57729108ff 100644 --- a/docs/widgets.md +++ b/docs/widgets.md @@ -1809,17 +1809,7 @@ Displays the number of queries blocked by [Pi-Hole](https://pi-hole.net/). ``` > [!TIP] -> In order to avoid leaking secret data, both `hostname` and `apiKey` can leverage environment variables. Simply pass the name of the variable, which MUST start with `VUE_APP_`. - -```yaml -- type: pi-hole-stats - options: - hostname: VUE_APP_pihole_ip - apiKey: VUE_APP_pihole_key -``` - -> [!IMPORTANT] -> You will need to restart the server (or the docker image) if adding/editing an env var for this to be refreshed. +> To avoid storing secrets in plaintext, both `hostname` and `apiKey` can be supplied via environment variables. See [Handling Secrets](#handling-secrets). #### Info @@ -1855,17 +1845,7 @@ Displays the number of queries blocked by [Pi-Hole](https://pi-hole.net/). Use t ``` > [!TIP] -> In order to avoid leaking secret data, both `hostname` and `apiKey` can leverage environment variables. Simply pass the name of the variable, which MUST start with `VUE_APP_`. - -```yaml -- type: pi-hole-stats-v6 - options: - hostname: VUE_APP_pihole_ip - apiKey: VUE_APP_pihole_key -``` - -> [!IMPORTANT] -> You will need to restart the server (or the docker image) if adding/editing an env var for this to be refreshed. +> To avoid storing secrets in plaintext, both `hostname` and `apiKey` can be supplied via environment variables. See [Handling Secrets](#handling-secrets). #### Info @@ -2662,7 +2642,7 @@ Displays storage statistics and file listings from a [Filebrowser Quantum](https useProxy: true options: hostname: http://filebrowser.local:8080 - apiKey: VUE_APP_FILEBROWSER_KEY + apiKey: DASHY_FILEBROWSER_KEY source: Documents path: / showRecent: 5 @@ -2678,7 +2658,7 @@ Displays storage statistics and file listings from a [Filebrowser Quantum](https useProxy: true options: hostname: http://filebrowser.local:8080 - apiKey: VUE_APP_FILEBROWSER_KEY + apiKey: DASHY_FILEBROWSER_KEY source: Downloads showDetailedStats: true showRecent: 10 @@ -3407,27 +3387,32 @@ Vary: Origin ### Handling Secrets -Some widgets require you to pass potentially sensetive info such as API keys. The `conf.yml` is not ideal for this, as it's stored in plaintext. -Instead, for secrets you should use environmental vairables. +Some widgets require you to pass potentially sensitive info such as API keys. The `conf.yml` is not ideal for this, as it's stored in plaintext. Instead, for secrets you should use environment variables. -You can do this, by setting the environmental variable name as the value, instead of the actual key, and then setting that env var in your container or local environment. +In your widget options, set the value to the name of an environment variable starting with `DASHY_` (or `VITE_APP_` / `VUE_APP_` for backwards compatibility). The Dashy server will substitute it with the matching `process.env` value when proxying the request. -The key can be named whatever you like, but it must start with `VUE_APP_` (to be picked up by Vue). If you need to update any of these values, a rebuild is required (this can be done under the Config menu in the UI, or by running `yarn build` then restarting the container). +The widget must be set to route through the Dashy server with `useProxy: true`. Without this, the placeholder is sent directly to the upstream API and will fail. Substitution covers the request URL, headers and body, so any auth pattern (Bearer, Basic, query param, POST body) works. -For more infomation about setting and managing your environmental variables, see [Management Docs --> Environmental Variables](/docs/management.md#passing-in-environmental-variables). +For more information about setting and managing your environment variables, see [Management Docs --> Environmental Variables](/docs/management.md#passing-in-environmental-variables). For example: ```yaml - type: weather + useProxy: true options: - apiKey: VUE_APP_WEATHER_TOKEN + apiKey: DASHY_WEATHER_TOKEN city: London units: metric hideDetails: true ``` -Then, set `VUE_APP_WEATHER_TOKEN='xxx'` +Then set `DASHY_WEATHER_TOKEN='xxx'` in your container or local environment, and restart Dashy. To rotate the value, just update the env var and restart. No rebuild required. + +> [!NOTE] +> Only env vars starting with `DASHY_`, `VITE_APP_` or `VUE_APP_` are eligible for substitution. Other server-side env vars are never exposed. +> +> If you build Dashy from source yourself, `VITE_APP_*` and `DASHY_*` vars set at build time are also baked into the bundle by Vite, which works without `useProxy: true`. --- diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..a4a9af6e8a --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,82 @@ +import js from '@eslint/js'; +import vue from 'eslint-plugin-vue'; +import importPlugin from 'eslint-plugin-import-x'; +import globals from 'globals'; + +export default [ + { + ignores: [ + 'dist/**', + 'node_modules/**', + 'public/**', + 'docs/**', + 'coverage/**', + 'user-data/**', + ], + }, + + js.configs.recommended, + ...vue.configs['flat/recommended'], + importPlugin.flatConfigs.recommended, + + { + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { + ...globals.browser, + ...globals.node, + ...globals.es2022, + }, + }, + settings: { + 'import-x/resolver-next': [importPlugin.createNodeResolver({ extensions: ['.js', '.mjs', '.vue'] })], + }, + rules: { + 'arrow-parens': 'off', + 'no-else-return': 'off', + 'no-console': 'off', + 'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], + 'vue/multi-word-component-names': 'off', + 'vue/no-reserved-component-names': 'off', + 'vue/no-v-html': ['warn', { ignorePattern: '(?:^|\\.)(sanitized|safeHtml)' }], + + // TODO: Enable these rules. Once I have enough sanity to fix all issues. + 'vue/html-indent': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/html-self-closing': 'off', + 'vue/attributes-order': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/v-on-event-hyphenation': 'off', + 'vue/first-attribute-linebreak': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/html-closing-bracket-spacing': 'off', + 'vue/mustache-interpolation-spacing': 'off', + 'vue/order-in-components': 'off', + 'vue/no-multi-spaces': 'off', + 'vue/v-bind-style': 'off', + 'vue/v-on-style': 'off', + 'vue/v-slot-style': 'off', + 'vue/component-definition-name-casing': 'off', + 'import-x/no-unresolved': 'off', + 'import-x/extensions': 'off', + 'import-x/order': ['warn', { + groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + 'newlines-between': 'ignore', + }], + 'import-x/newline-after-import': 'warn', + 'import-x/no-duplicates': 'error', + }, + }, + + { + files: ['tests/**', 'vitest.config.mjs', 'vite.config.mjs', 'eslint.config.mjs'], + rules: { + 'no-undef': 'off', + 'no-unused-vars': 'off', + 'import-x/no-extraneous-dependencies': 'off', + }, + }, +]; diff --git a/index.html b/index.html new file mode 100644 index 0000000000..5d7371534e --- /dev/null +++ b/index.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + Dashy + + + + +
+ +
+

Dashy

+

Loading...

+ + +
+
+ + + + + + + + + + diff --git a/netlify.toml b/netlify.toml index 9da589bd0c..09106843c6 100644 --- a/netlify.toml +++ b/netlify.toml @@ -11,32 +11,42 @@ # Environmental variables for build command [build.environment] - NODE_VERSION = "20.11.1" - NODE_OPTIONS = "--openssl-legacy-provider" - YARN_FLAGS = "--ignore-engines" + NODE_VERSION = "24" -# Redirect the Node endpoints to serverless functions +# Rewrite Node endpoints to serverless functions [[redirects]] from = "/status-check" to = "/.netlify/functions/cloud-status-check" - status = 301 + status = 200 force = true +[[redirects]] + from = "/cors-proxy" + to = "/.netlify/functions/netlify-cors" + status = 200 + force = true + +# Dashy's other node endpoints aren't supported on Netlify [[redirects]] from = "/config-manager/*" to = "/.netlify/functions/not-supported" - status = 301 + status = 200 force = true [[redirects]] - from = "/cors-proxy" - to = "/.netlify/functions/netlify-cors" - status = 301 + from = "/system-info" + to = "/.netlify/functions/not-supported" + status = 200 + force = true +[[redirects]] + from = "/get-user" + to = "/.netlify/functions/not-supported" + status = 200 force = true - + # For router history mode, ensure pages land on index [[redirects]] from = "/*" to = "/index.html" - status = 200 + status = 200 # Set any security headers here [[headers]] @@ -44,4 +54,3 @@ [headers.values] # Uncomment to enable Netlify user control. Requires premium plan. # Basic-Auth = "someuser:somepassword anotheruser:anotherpassword" - diff --git a/package.json b/package.json index 41bdb43e08..413ffd6cc9 100644 --- a/package.json +++ b/package.json @@ -1,127 +1,82 @@ { "name": "dashy", - "version": "3.3.1", + "version": "4.0.0", "license": "MIT", "main": "server", "author": "Alicia Sykes (https://aliciasykes.com)", "scripts": { "start": "node server", - "dev": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve", - "build": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build", - "lint": "vue-cli-service lint", + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "lint": "eslint \"src/**/*.{js,vue}\"", + "typecheck": "vue-tsc --noEmit", "test": "vitest run", "test:watch": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", "pm2-start": "npx pm2 start server.js", - "build-watch": "vue-cli-service build --watch --mode production", - "build-and-start": "NODE_OPTIONS=--openssl-legacy-provider npm-run-all --parallel build start", "validate-config": "node services/config-validator", "health-check": "node services/healthcheck", "dependency-audit": "npx improved-yarn-audit --ignore-dev-deps" }, "dependencies": { - "@babel/core": "^7.26.0", - "@formschema/native": "^2.0.0-beta.6", - "@sentry/tracing": "^7.102.1", - "@sentry/vue": "^7.102.1", + "@codemirror/autocomplete": "^6.20.1", + "@codemirror/commands": "^6.10.3", + "@codemirror/lang-yaml": "^6.1.3", + "@codemirror/language": "^6.12.3", + "@codemirror/lint": "^6.9.5", + "@codemirror/search": "^6.7.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.41.1", + "@jsonforms/core": "^3.7.0", + "@jsonforms/vue": "^3.7.0", + "@jsonforms/vue-vanilla": "^3.7.0", + "@lezer/highlight": "^1.2.3", + "@sentry/vue": "^9.0.0", "ajv": "^8.10.0", - "connect-history-api-fallback": "^1.6.0", + "ajv-formats": "^3.0.1", "crypto-js": "^4.2.0", "dompurify": "^3.0.8", "express": "^4.21.0", "express-basic-auth": "^1.2.1", "frappe-charts": "^1.6.2", "js-yaml": "^4.1.0", - "keycloak-js": "^20.0.3", + "keycloak-js": "^26.0.0", "oidc-client-ts": "^3.0.1", - "register-service-worker": "^1.7.2", - "remedial": "^1.0.8", - "rss-parser": "3.13.0", "rsup-progress": "^3.2.0", "simple-icons": "^16.6.0", - "v-jsoneditor": "^1.4.5", - "v-tooltip": "^2.1.3", - "vue": "^2.7.0", - "vue-i18n": "^8.27.2", - "vue-js-modal": "^2.0.1", - "vue-json-tree-view": "^2.1.6", - "vue-material-tabs": "0.1.5", - "vue-router": "^3.5.3", - "vue-select": "^3.20.2", - "vue-swatches": "^2.1.1", - "vue-toasted": "^1.1.28", - "vuex": "^3.6.2" + "vue": "^3.5.0", + "vue-i18n": "^9.14.0", + "vue-router": "^4.4.0", + "vue-select": "4.0.0-beta.6", + "vuex": "^4.1.0", + "yaml": "^2.8.3" }, "devDependencies": { - "@babel/eslint-parser": "^7.25.0", - "@babel/preset-env": "^7.26.0", - "@vitest/ui": "^1.6.0", - "@vue/cli-plugin-babel": "^5.0.8", - "@vue/cli-plugin-eslint": "^5.0.8", - "@vue/cli-plugin-pwa": "^5.0.8", - "@vue/cli-plugin-typescript": "^5.0.8", - "@vue/cli-service": "^5.0.8", - "@vue/eslint-config-standard": "^4.0.0", - "@vue/test-utils": "^1.3.6", - "copy-webpack-plugin": "6.4.0", - "eslint": "^7.32.0", - "eslint-config-airbnb": "^18.0.1", - "eslint-plugin-vue": "^7.9.0", + "@eslint/js": "^10.0.1", + "@vitejs/plugin-vue": "^5.0.0", + "@vitest/ui": "^4.0.18", + "@vue/compiler-sfc": "^3.5.0", + "@vue/test-utils": "^2.4.0", + "autoprefixer": "^10.4.27", + "eslint": "^10.2.1", + "eslint-plugin-import-x": "^4.16.2", + "eslint-plugin-vue": "^10.9.0", + "globals": "^17.5.0", "happy-dom": "^20.8.9", - "npm-run-all": "^4.1.5", "sass": "^1.77.0", - "sass-loader": "^12.0.0", "supertest": "^7.2.2", - "typescript": "^5.4.4", - "vite-plugin-vue2": "^2.0.3", - "vitest": "^1.6.0", - "vue-cli-plugin-yaml": "^1.0.2", - "vue-svg-loader": "^0.16.0", - "vue-template-compiler": "^2.7.0" + "typescript": "^6.0.3", + "vite": "^6.2.0", + "vite-plugin-pwa": "^1.0.0", + "vite-svg-loader": "^5.1.0", + "vitest": "^4.0.18", + "vue-eslint-parser": "^10.0.0", + "vue-tsc": "^3.2.7" }, "engines": { - "node": ">=16.0.0 <21.6.2" - }, - "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/essential", - "@vue/standard", - "airbnb-base" - ], - "rules": { - "import/no-unresolved": "off", - "import/extensions": "off", - "arrow-parens": 0, - "no-else-return": 0 - }, - "parserOptions": { - "parser": "@babel/eslint-parser" - }, - "overrides": [ - { - "files": [ - "tests/**", - "vitest.config.js" - ], - "rules": { - "import/no-extraneous-dependencies": "off", - "no-undef": "off", - "global-require": "off", - "no-unused-vars": "off" - } - } - ] - }, - "babel": { - "presets": [ - "@vue/cli-plugin-babel/preset", - "@babel/preset-env" - ] + "node": ">=18.0.0" }, "postcss": { "plugins": { @@ -133,17 +88,11 @@ "last 2 versions" ], "resolutions": { - "ejs": "^3.1.10", - "loader-utils": "^2.0.4", - "minimatch": "^3.1.2", "braces": "^3.0.3", "micromatch": "^4.0.8", - "serialize-javascript": "^6.0.2", - "node-forge": "^1.3.1", - "nth-check": "^2.1.1", - "ip": "^2.0.1", "postcss": "^8.4.31", - "tar": "^6.2.1" + "serialize-javascript": "^7.0.3", + "vite": "^6.2.0" }, "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/services/app.js b/services/app.js index 5ccee70238..e12c046c0e 100644 --- a/services/app.js +++ b/services/app.js @@ -17,7 +17,6 @@ const yaml = require('js-yaml'); /* Import Express + middleware functions */ const express = require('express'); const basicAuth = require('express-basic-auth'); -const history = require('connect-history-api-fallback'); /* Kick of some basic checks */ require('./update-checker'); // Checks if there are any updates available, prints message @@ -27,14 +26,20 @@ let config = require('./config-validator'); // Validate config file and load res /* Include route handlers for API endpoints */ const statusCheck = require('./status-check'); // Used by the status check feature, uses GET const saveConfig = require('./save-config'); // Saves users new conf.yml to file-system -const rebuild = require('./rebuild-app'); // A script to programmatically trigger a build const systemInfo = require('./system-info'); // Basic system info, for resource widget const sslServer = require('./ssl-server'); // TLS-enabled web server const corsProxy = require('./cors-proxy'); // Enables API requests to CORS-blocked services const getUser = require('./get-user'); // Enables server side user lookup -/* Helper functions, and default config */ -const ENDPOINTS = require('../src/utils/defaults').serviceEndpoints; // API endpoint URL paths +/* Service endpoint URL paths (see also serviceEndpoints in src/utils/config/defaults.js) */ +const ENDPOINTS = { + statusPing: '/status-ping', + statusCheck: '/status-check', + save: '/config-manager/save', + systemInfo: '/system-info', + corsProxy: '/cors-proxy', + getUser: '/get-user', +}; /* Indicates for the webpack config, that running as a server */ process.env.IS_SERVER = 'True'; @@ -204,12 +209,6 @@ const app = express() respond(JSON.stringify({ success: false, message: String(e) })); }); })) - // GET endpoint to trigger a build, and respond with success status and output - .use(ENDPOINTS.rebuild, protectConfig, requireAdmin, method('GET', (req, res) => { - rebuild() - .then((response) => safeEnd(res, JSON.stringify(response))) - .catch((e) => safeEnd(res, errBody(e))); - })) // GET endpoint to return system info, for widget .use(ENDPOINTS.systemInfo, protectConfig, method('GET', (req, res) => { try { @@ -246,7 +245,6 @@ const app = express() .use(express.static(path.join(rootDir, process.env.USER_DATA_DIR || 'user-data'))) .use(express.static(path.join(rootDir, 'dist'))) .use(express.static(path.join(rootDir, 'public'), { index: 'initialization.html' })) - .use(history()) // If no other route is matched, serve up the index.html with a 404 status .use((req, res) => { res.status(404).sendFile(path.join(rootDir, 'dist', 'index.html'), (err) => { diff --git a/services/config-validator.js b/services/config-validator.js index 372f432aff..6dabe63b1b 100644 --- a/services/config-validator.js +++ b/services/config-validator.js @@ -7,7 +7,7 @@ const fs = require('fs'); // For opening + reading files const yaml = require('js-yaml'); // For parsing YAML const Ajv = require('ajv'); // For validating with schema -const schema = require('../src/utils/ConfigSchema.json'); +const schema = require('../src/utils/config/ConfigSchema.json'); /* Tell AJV to use strict mode, and report all errors */ const validatorOptions = { diff --git a/services/cors-proxy.js b/services/cors-proxy.js index 510a719e20..8b0522c6ed 100644 --- a/services/cors-proxy.js +++ b/services/cors-proxy.js @@ -19,6 +19,30 @@ const BLOCKED_HOSTS = new Set([ // Operator escape hatch, set this env var to bypass all proxy restrictions const restrictionsDisabled = !!process.env.DANGEROUSLY_DISABLE_PROXY_RESTRICTIONS; +// If reference to env var is present, substitute for env var value if set +const PLACEHOLDER_RE = /\b(?:DASHY_|VITE_APP_|VUE_APP_)\w+/g; +const warnedPlaceholders = new Set(); +const resolvePlaceholder = (name) => { + const value = process.env[name]; + if (value !== undefined) return value; + if (!warnedPlaceholders.has(name)) { + warnedPlaceholders.add(name); + // eslint-disable-next-line no-console + console.warn(`[cors-proxy] Env-var placeholder '${name}' is referenced but not set`); + } + return name; +}; +const substituteEnv = (val) => { + if (typeof val === 'string') return val.replace(PLACEHOLDER_RE, resolvePlaceholder); + if (Array.isArray(val)) return val.map(substituteEnv); + if (val && typeof val === 'object') { + const out = {}; + Object.keys(val).forEach((k) => { out[k] = substituteEnv(val[k]); }); + return out; + } + return val; +}; + // Validate the target URL against scheme and host policies // Returns { ok: true } on success, or { ok: false, status, error } on rejection const validateTargetUrl = (raw) => { @@ -44,7 +68,7 @@ const validateTargetUrl = (raw) => { return { ok: true }; }; -module.exports = (req, res) => { +const handler = (req, res) => { // Apply allow-all response headers res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET, PUT, PATCH, POST, DELETE'); @@ -58,12 +82,13 @@ module.exports = (req, res) => { return; } - // Get desired URL, from Target-URL header, and validate it against the policy - const targetURL = req.header('Target-URL'); - if (!targetURL) { + // Get desired URL, resolve env-var placeholders, then validate against the policy. + const rawTargetURL = req.header('Target-URL'); + if (!rawTargetURL) { res.status(400).send({ error: 'Missing required Target-URL header' }); return; } + const targetURL = substituteEnv(rawTargetURL); const validation = validateTargetUrl(targetURL); if (!validation.ok) { res.status(validation.status).send({ error: validation.error }); @@ -75,7 +100,7 @@ module.exports = (req, res) => { const rawCustomHeaders = req.header('CustomHeaders'); if (rawCustomHeaders) { try { - headers = JSON.parse(rawCustomHeaders); + headers = substituteEnv(JSON.parse(rawCustomHeaders)); } catch (e) { res.status(400).send({ error: 'CustomHeaders header contains malformed JSON' }); return; @@ -86,7 +111,7 @@ module.exports = (req, res) => { const requestConfig = { method: req.method, url: targetURL, - data: req.body, + data: substituteEnv(req.body), headers, timeout: 30000, maxResponseSize: 10 * 1024 * 1024, // 10 MB @@ -102,3 +127,6 @@ module.exports = (req, res) => { (error) => send(500, { error }), ); }; + +module.exports = handler; +module.exports.substituteEnv = substituteEnv; diff --git a/services/rebuild-app.js b/services/rebuild-app.js deleted file mode 100644 index 2b748c2d22..0000000000 --- a/services/rebuild-app.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * This script programmatically triggers a production build - * and responds with the status, message and full output - */ -const { exec } = require('child_process'); - -module.exports = () => new Promise((resolve, reject) => { - const buildProcess = exec('NODE_OPTIONS="--max-old-space-size=512" npm run build'); // Trigger the build command - - let output = ''; // Will store console output - - // Write output to console, and append to var for returning - buildProcess.stdout.on('data', (data) => { - process.stdout.write(data); - output += data; - }); - - // Handle errors, by sending the reject - buildProcess.on('error', (error) => { - reject(Error({ - success: false, - error, - output, - })); - }); - - // When finished, check success, make message and resolve response - buildProcess.on('exit', (response) => { - const success = response === 0; - const message = `Build process exited with ${response}: ` - + `${success ? 'Success' : 'Possible Error'}`; - resolve({ success, message, output }); - }); -}); diff --git a/services/update-checker.js b/services/update-checker.js index b0ab287d31..63f8094ee3 100644 --- a/services/update-checker.js +++ b/services/update-checker.js @@ -8,25 +8,46 @@ const logToConsole = (msg) => { console.log(msg); // eslint-disable-line no-console }; +const VERSION_RE = /^\d+(\.\d+)*$/; + +const compareVersions = (a, b) => { + const pa = a.split('.').map((n) => parseInt(n, 10)); + const pb = b.split('.').map((n) => parseInt(n, 10)); + const len = Math.max(pa.length, pb.length); + for (let i = 0; i < len; i += 1) { + const diff = (pa[i] || 0) - (pb[i] || 0); + if (diff !== 0) return diff; + } + return 0; +}; + const makeMsg = (latestVersion) => { - const parse = (version) => parseInt(version.replace(/\./g, ''), 10); - const difference = parse(latestVersion) - parse(currentVersion); - let msg = ''; + const difference = compareVersions(latestVersion, currentVersion); if (difference <= 0) { - msg = '\x1b[1m\x1b[32mโœ… Dashy is Up-to-Date\x1b[0m\n'; - } else { - msg = `\x1b[103m\x1b[34m${new Array(27).fill('โ”').join('')}\x1b[0m\n` - + `\x1b[103m\x1b[34mโš ๏ธ Update Available: ${latestVersion} \x1b[0m\n` - + `\x1b[103m\x1b[34m${new Array(27).fill('โ”').join('')}\x1b[0m\n`; + return '\x1b[1m\x1b[32mโœ… Dashy is Up-to-Date\x1b[0m\n'; } - return msg; + return `\x1b[103m\x1b[34m${new Array(27).fill('โ”').join('')}\x1b[0m\n` + + `\x1b[103m\x1b[34mโš ๏ธ Update Available: ${latestVersion} \x1b[0m\n` + + `\x1b[103m\x1b[34m${new Array(27).fill('โ”').join('')}\x1b[0m\n`; }; -request.get(packageUrl).then((response) => { - if (response && response.data && response.data.version) { +const runCheck = async () => { + if (typeof currentVersion !== 'string' || !VERSION_RE.test(currentVersion)) { + logToConsole('Unable to check for updates: invalid local version'); + return; + } + try { + const response = await request.get(packageUrl); + const latest = response && response.data && response.data.version; + if (typeof latest !== 'string' || !VERSION_RE.test(latest)) { + logToConsole('Unable to check for updates: invalid response from upstream'); + return; + } logToConsole(`\nUsing Dashy V-${currentVersion}. Update Check Complete`); - logToConsole(makeMsg(response.data.version)); + logToConsole(makeMsg(latest)); + } catch { + logToConsole('Unable to check for updates'); } -}).catch(() => { - logToConsole('Unable to check for updates'); -}); +}; + +runCheck().catch(() => { /* never propagate โ€” module-load must not throw */ }); diff --git a/src/App.vue b/src/App.vue index 9ed5f0be7e..7ec62a4d45 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,7 +5,8 @@
-
+
+ diff --git a/src/assets/interface-icons/application-rebuild.svg b/src/assets/interface-icons/application-rebuild.svg deleted file mode 100644 index 7f2c709533..0000000000 --- a/src/assets/interface-icons/application-rebuild.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/interface-icons/config-debug-menu.svg b/src/assets/interface-icons/config-debug-menu.svg new file mode 100644 index 0000000000..eb5786c337 --- /dev/null +++ b/src/assets/interface-icons/config-debug-menu.svg @@ -0,0 +1 @@ + diff --git a/src/assets/interface-icons/config-editor.svg b/src/assets/interface-icons/config-editor.svg index 3cb87c2208..f6eaaaa701 100644 --- a/src/assets/interface-icons/config-editor.svg +++ b/src/assets/interface-icons/config-editor.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/src/assets/interface-icons/config-file.svg b/src/assets/interface-icons/config-file.svg new file mode 100644 index 0000000000..0c0a725fb5 --- /dev/null +++ b/src/assets/interface-icons/config-file.svg @@ -0,0 +1 @@ + diff --git a/src/assets/interface-icons/config-open-settings.svg b/src/assets/interface-icons/config-open-settings.svg index 3da196fa07..26a56abdec 100644 --- a/src/assets/interface-icons/config-open-settings.svg +++ b/src/assets/interface-icons/config-open-settings.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/src/assets/interface-icons/config-pages.svg b/src/assets/interface-icons/config-pages.svg index 36c4467531..f44164c82a 100644 --- a/src/assets/interface-icons/config-pages.svg +++ b/src/assets/interface-icons/config-pages.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/interface-icons/config-preview.svg b/src/assets/interface-icons/config-preview.svg new file mode 100644 index 0000000000..b687725b49 --- /dev/null +++ b/src/assets/interface-icons/config-preview.svg @@ -0,0 +1 @@ + diff --git a/src/assets/interface-icons/ellipse.svg b/src/assets/interface-icons/ellipse.svg new file mode 100644 index 0000000000..02f4cc1f9e --- /dev/null +++ b/src/assets/interface-icons/ellipse.svg @@ -0,0 +1 @@ + diff --git a/src/assets/interface-icons/section-expand-collapse.svg b/src/assets/interface-icons/section-expand-collapse.svg index c9cf291ed5..26fa480685 100644 --- a/src/assets/interface-icons/section-expand-collapse.svg +++ b/src/assets/interface-icons/section-expand-collapse.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/locales/ar.json b/src/assets/locales/ar.json index 33b51dfcdd..9c490d8ddd 100644 --- a/src/assets/locales/ar.json +++ b/src/assets/locales/ar.json @@ -87,7 +87,6 @@ "edit-css-button": "ุชุญุฑูŠุฑ CSS ู…ุฎุตุต", "cloud-sync-button": "ุชูุนูŠู„ Cloud Sync", "edit-cloud-sync-button": "ุชุนุฏูŠู„ Cloud Sync", - "rebuild-app-button": "ุฅุนุงุฏุฉ ุฅู†ุดุงุก ุงู„ุชุทุจูŠู‚", "change-language-button": "ุชุบูŠูŠุฑ ู„ุบุฉ ุงู„ุชุทุจูŠู‚", "reset-settings-button": "ุฅุนุงุฏุฉ ุถุจุท ุงู„ุฅุนุฏุงุฏุงุช ุงู„ู…ุญู„ูŠุฉ", "disabled-note": "ุชู… ุชุนุทูŠู„ ุจุนุถ ู…ูŠุฒุงุช ุงู„ุชูƒูˆูŠู† ุจูˆุงุณุทุฉ ุงู„ู…ุณุคูˆู„", @@ -181,20 +180,6 @@ "warning-msg-validation": "ุชุญุฐูŠุฑ ุงู„ุชุญู‚ู‚", "not-admin-note": "ู„ุง ูŠู…ูƒู†ูƒ ุงู„ูƒุชุงุจุฉ ุงู„ุชุบูŠูŠุฑ ุฅู„ู‰ ุงู„ู‚ุฑุต ุŒ ู„ุฃู†ูƒ ู„ู… ุชู‚ู… ุจุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ูƒู…ุณุคูˆู„" }, - "app-rebuild": { - "title": "ุฅุนุงุฏุฉ ุฅู†ุดุงุก ุงู„ุชุทุจูŠู‚", - "rebuild-note-l1": "ุฅุนุงุฏุฉ ุจู†ุงุก (Rebuild) ู…ุทู„ูˆุจุฉ ุญุชู‰ ุชุตุจุญ ุงู„ุชุบูŠูŠุฑุงุช ุงู„ู…ูƒุชูˆุจุฉ ููŠ ู…ู„ู conf.yml ุณุงุฑูŠุฉ ุงู„ู…ูุนูˆู„.", - "rebuild-note-l2": "ูŠุฌุจ ุฃู† ูŠุญุฏุซ ู‡ุฐุง ุชู„ู‚ุงุฆูŠู‹ุง ุŒ ูˆู„ูƒู† ุฅุฐุง ู„ู… ูŠุญุฏุซ ุฐู„ูƒ ุŒ ููŠู…ูƒู†ูƒ ุชุดุบูŠู„ู‡ ูŠุฏูˆูŠู‹ุง ู‡ู†ุง.", - "rebuild-note-l3": "ู‡ุฐุง ู„ูŠุณ ู…ุทู„ูˆุจู‹ุง ู„ู„ุชุนุฏูŠู„ุงุช ุงู„ู…ุฎุฒู†ุฉ ู…ุญู„ูŠู‹ุง.", - "rebuild-button": "ุงุจุฏุฃ ุงู„ุจู†ุงุก", - "rebuilding-status-1": "ุจู†ุงุก...", - "rebuilding-status-2": "ู‚ุฏ ูŠุณุชุบุฑู‚ ู‡ุฐุง ุจุถุน ุฏู‚ุงุฆู‚", - "error-permission": "ู„ูŠุณ ู„ุฏูŠูƒ ุฅุฐู† ู„ุจุฏุก ู‡ุฐุง ุงู„ุฅุฌุฑุงุก", - "success-msg": "ุงูƒุชู…ู„ ุงู„ุจู†ุงุก ุจู†ุฌุงุญ", - "fail-msg": "ูุดู„ุช ุนู…ู„ูŠุฉ ุงู„ุจู†ุงุก", - "reload-note": "ูŠู„ุฒู… ุงู„ุขู† ุฅุนุงุฏุฉ ุชุญู…ูŠู„ ุงู„ุตูุญุฉ ุญุชู‰ ุชุฏุฎู„ ุงู„ุชุบูŠูŠุฑุงุช ุญูŠุฒ ุงู„ุชู†ููŠุฐ", - "reload-button": "ุฅุนุงุฏุฉ ุชุญู…ูŠู„ ุงู„ุตูุญุฉ" - }, "cloud-sync": { "title": "ุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠ ูˆุงู„ุงุณุชุนุงุฏุฉ ุงู„ุณุญุงุจูŠุฉ", "intro-l1": "ุชุนุฏ ู…ูŠุฒุฉ ุงู„ู†ุณุฎ ุงู„ุงุญุชูŠุงุทูŠ ูˆุงู„ุงุณุชุนุงุฏุฉ ุงู„ุณุญุงุจูŠุฉ ู…ูŠุฒุฉ ุงุฎุชูŠุงุฑูŠุฉ ุŒ ุชุชูŠุญ ู„ูƒ ุชุญู…ูŠู„ ุงู„ุชู‡ูŠุฆุฉ ุงู„ุฎุงุตุฉ ุจูƒ ุนู„ู‰ ุงู„ุฅู†ุชุฑู†ุช ุŒ ุซู… ุงุณุชุนุงุฏุชู‡ุง ุนู„ู‰ ุฃูŠ ุฌู‡ุงุฒ ุฃูˆ ู…ุซูŠู„ ุขุฎุฑ ู„ู€ Dashy.", @@ -456,4 +441,4 @@ "wasted": "ู…ู‡ุฏุฑ" } } -} \ No newline at end of file +} diff --git a/src/assets/locales/bg.json b/src/assets/locales/bg.json index 7916a66463..a59c6246cd 100644 --- a/src/assets/locales/bg.json +++ b/src/assets/locales/bg.json @@ -44,7 +44,6 @@ "edit-css-button": "ะ ะตะดะฐะบั‚ะธั€ะฐะฝะต ะฝะฐ ะฟะตั€ัะพะฝะฐะปะตะฝ CSS", "cloud-sync-button": "ะะบั‚ะธะฒะธั€ะฐะฝะต ะšะปะฐัƒะด ะกะธะธะฝั…ั€ะพะฝะธะทะฐั†ะธั", "edit-cloud-sync-button": "ะŸั€ะพะผัะฝะฐ ะšะปะฐัƒะด ะกะธะฝั…ั€ะพะฝะธะฐะทั†ะธั", - "rebuild-app-button": "ะ ะตะฑะธะปะด ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ", "change-language-button": "ะŸั€ะพะผัะฝะฐ ะ•ะทะธะบ ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ", "reset-settings-button": "ะ’ัŠะทัั‚ะฐะฝะพะฒัะฒะฐะฝะต ะฝะฐ ะ›ะพะบะฐะปะฝะธั‚ะต ะะฐัั‚ั€ะพะนะบะธ", "app-info-button": "ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะทะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ", @@ -130,20 +129,6 @@ "warning-msg-validation": "ะŸั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะต ะทะฐ ะฒะฐะปะธะดะธั€ะฐะฝะต", "not-admin-note": "ะะต ะผะพะถะตั‚ะต ะดะฐ ะฟะธัˆะตั‚ะต ะฟั€ะพะผะตะฝะตะฝะพ ะฝะฐ ะดะธัะบะฐ, ะทะฐั‰ะพั‚ะพ ะฝะต ัั‚ะต ะฒะปะตะทะปะธ ะบะฐั‚ะพ ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€" }, - "app-rebuild": { - "title": "ะ ะตะฑะธะปะด ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ", - "rebuild-note-l1": "ะ˜ะทะธัะบะฒะฐ ัะต ะฟะพะฒั‚ะพั€ะตะฝ ั€ะตะฑะธะปะด, ะทะฐ ะดะฐ ะฒะปัะทะฐั‚ ะฒ ัะธะปะฐ ะฟั€ะพะผะตะฝะธั‚ะต, ะทะฐะฟะธัะฐะฝะธ ะฒัŠะฒ ั„ะฐะนะปะฐ conf.yml.", - "rebuild-note-l2": "ะขะพะฒะฐ ั‚ั€ัะฑะฒะฐ ะดะฐ ัะต ัะปัƒั‡ะธ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ, ะฝะพ ะฐะบะพ ะฝะต ัั‚ะฐะฝะต, ะผะพะถะตั‚ะต ะดะฐ ะณะพ ะทะฐะดะตะนัั‚ะฒะฐั‚ะต ั€ัŠั‡ะฝะพ ั‚ัƒะบ.", - "rebuild-note-l3": "ะขะพะฒะฐ ะฝะต ัะต ะธะทะธัะบะฒะฐ ะทะฐ ะผะพะดะธั„ะธะบะฐั†ะธะธ, ััŠั…ั€ะฐะฝัะฒะฐะฝะธ ะปะพะบะฐะปะฝะพ.", - "rebuild-button": "ะ ะตะฑะธะปะด", - "rebuilding-status-1": "ะ‘ะธะปะดะฒะฐะฝะต...", - "rebuilding-status-2": "ะขะพะฒะฐ ะผะพะถะต ะดะฐ ะพั‚ะฝะตะผะต ะฝัะบะพะปะบะพ ะผะธะฝัƒั‚ะธ.", - "error-permission": "ะัะผะฐั‚ะต ั€ะฐะทั€ะตัˆะตะฝะธะต ะดะฐ ะทะฐะดะตะนัั‚ะฒะฐั‚ะต ั‚ะพะฒะฐ ะดะตะนัั‚ะฒะธะต", - "success-msg": "ะ‘ะธะปะดะฐ ะฟั€ะธะบะปัŽั‡ะธ ัƒัะฟะตัˆะฝะพ", - "fail-msg": "ะ‘ะธะปะด ะพะฟะตั€ะฐั†ะธัั‚ะฐ ะฝะต ะฑะตัˆะต ัƒัะฟะตัˆะฝะฐ ", - "reload-note": "ะกะตะณะฐ ะต ะฝะตะพะฑั…ะพะดะธะผะพ ะฟั€ะตะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ, ะทะฐ ะดะฐ ะฒะปัะทะฐั‚ ะฒ ัะธะปะฐ ะฟั€ะพะผะตะฝะธั‚ะต", - "reload-button": "ะŸั€ะตะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ" - }, "cloud-sync": { "title": "ะั€ั…ะธะฒะธั€ะฐะฝะต ะธ ะฒัŠะทัั‚ะฐะฝะพะฒัะฒะฐะฝะต ะฒ ะพะฑะปะฐะบ", "intro-l1": "ะั€ั…ะธะฒะธั€ะฐะฝะต ะธ ะฒัŠะทัั‚ะฐะฝะพะฒัะฒะฐะฝะต ะฒ ะพะฑะปะฐะบ ะต ะพะฟั†ะธะพะฝะฐะปะฝะฐ ั„ัƒะฝะบั†ะธะพะฝะฐะปะฝะพัั‚, ะบะพัั‚ะพ ะฒะธ ะฟะพะทะฒะพะปัะฒะฐ ะดะฐ ะบะฐั‡ะธั‚ะต ะบะพะฝั„ะธะณัƒั€ะฐั†ะธัั‚ะฐ ัะธ ะฒ ะธะฝั‚ะตั€ะฝะตั‚ ะธ ัะปะตะด ั‚ะพะฒะฐ ะดะฐ ั ะฒัŠะทัั‚ะฐะฝะพะฒะธั‚ะต ะฝะฐ ะฒััะบะพ ะดั€ัƒะณะพ ัƒัั‚ั€ะพะนัั‚ะฒะพ ะธะปะธ ะตะบะทะตะผะฟะปัั€ ะฝะฐ Dashy.", diff --git a/src/assets/locales/bn.json b/src/assets/locales/bn.json index dab0dc90fa..c7497d180f 100644 --- a/src/assets/locales/bn.json +++ b/src/assets/locales/bn.json @@ -2,7 +2,7 @@ "home": { "no-results": "เฆ•เง‹เฆจ เฆคเฆฅเงเฆฏ เฆชเฆพเฆ“เงŸเฆพ เฆฏเฆพเงŸเฆจเฆฟ", "no-data": "เฆ•เง‹เฆจ เฆ‰เฆชเฆพเฆคเงเฆค เฆธเฆœเงเฆœเฆฟเฆค เฆ•เฆฐเฆพ เฆนเงŸเฆจเฆฟ", - "no-items-section": "เฆเฆ–เฆจเฆ“ เฆ•เง‹เฆจ เฆคเฆพเฆฒเฆฟเฆ•เฆพ เฆฆเง‡เฆ–เฆพเฆจเง‹เฆฐ เฆจเง‡เฆ‡" + "no-items-section": "เฆเฆ–เฆจเฆ“ เฆ•เง‹เฆจ เฆคเฆพเฆฒเฆฟเฆ•เฆพ เฆฆเง‡เฆ–เฆพเฆจเง‹เฆฐ เฆจเง‡เฆ‡" }, "search": { "search-label": "เฆ–เงเฆเฆœเงเฆจ", @@ -52,7 +52,6 @@ "edit-css-button": "CSS เฆธเฆฎเงเฆชเฆพเฆฆเฆจเฆพ เฆ•เฆฐเงเฆจ", "cloud-sync-button": "เฆ•เงเฆฒเฆพเฆ‰เฆก เฆธเฆฟเฆ™เงเฆ• เฆธเฆ•เงเฆฐเฆฟเงŸ เฆ•เฆฐเงเฆจ", "edit-cloud-sync-button": "เฆ•เงเฆฒเฆพเฆ‰เฆก เฆธเฆฟเฆ™เงเฆ• เฆธเฆฎเงเฆชเฆพเฆฆเฆจเฆพ เฆ•เฆฐเงเฆจ", - "rebuild-app-button": "เฆ…เงเฆฏเฆพเฆชเงเฆฒเฆฟเฆ•เง‡เฆถเฆจ เฆชเงเฆจเฆฐเงเฆจเฆฟเฆฐเงเฆฎเฆพเฆฃ", "change-language-button": "เฆญเฆพเฆทเฆพ เฆชเฆฐเฆฟเฆฌเฆฐเงเฆคเฆจ", "reset-settings-button": "เฆธเงเฆฅเฆพเฆจเฆฟเฆ• เฆธเง‡เฆŸเฆฟเฆ‚เฆธ เฆฐเฆฟเฆธเง‡เฆŸ เฆ•เฆฐเงเฆจ", "app-info-button": "เฆ…เงเฆฏเฆพเฆช เฆธเฆฎเงเฆชเฆฐเงเฆ•เฆฟเฆค เฆคเฆฅเงเฆฏ", @@ -138,20 +137,6 @@ "warning-msg-validation": "เฆฌเงˆเฆงเฆคเฆพ เฆธเฆคเฆฐเงเฆ•เฆคเฆพ", "not-admin-note": "เฆ†เฆชเฆจเฆฟ เฆกเฆฟเฆธเงเฆ•เง‡ เฆชเฆฐเฆฟเฆฌเฆฐเงเฆคเฆฟเฆค เฆฒเฆฟเฆ–เฆคเง‡ เฆชเฆพเฆฐเฆฌเง‡เฆจ เฆจเฆพ, เฆ•เฆพเฆฐเฆฃ เฆ†เฆชเฆจเฆฟ เฆ…เงเฆฏเฆพเฆกเฆฎเฆฟเฆจ เฆนเฆฟเฆธเฆพเฆฌเง‡ เฆฒเฆ— เฆ‡เฆจ เฆ•เฆฐเง‡เฆจเฆจเฆฟเงท" }, - "app-rebuild": { - "title": "เฆ…เงเฆฏเฆพเฆชเงเฆฒเฆฟเฆ•เง‡เฆถเฆจ เฆชเงเฆจเฆฐเงเฆจเฆฟเฆฐเงเฆฎเฆพเฆฃ", - "rebuild-note-l1": "conf.yml เฆซเฆพเฆ‡เฆฒเง‡ เฆฒเฆฟเฆ–เฆฟเฆค เฆชเฆฐเฆฟเฆฌเฆฐเงเฆคเฆจเฆ—เงเฆฒเฆฟ เฆ•เฆพเฆฐเงเฆฏเฆ•เฆฐ เฆ•เฆฐเฆพเฆฐ เฆœเฆจเงเฆฏ เฆเฆ•เฆŸเฆฟ เฆชเงเฆจเฆฐเงเฆจเฆฟเฆฐเงเฆฎเฆพเฆฃเง‡เฆฐ เฆชเงเฆฐเฆฏเฆผเง‹เฆœเฆจเฅค", - "rebuild-note-l2": "เฆเฆŸเฆฟ เฆธเงเฆฌเฆฏเฆผเฆ‚เฆ•เงเฆฐเฆฟเฆฏเฆผเฆญเฆพเฆฌเง‡ เฆ˜เฆŸเฆฌเง‡, เฆ•เฆฟเฆจเงเฆคเง เฆฏเฆฆเฆฟ เฆเฆŸเฆฟ เฆจเฆพ เฆนเฆฏเฆผเง‡ เฆฅเฆพเฆ•เง‡, เฆคเฆพเฆนเฆฒเง‡ เฆ†เฆชเฆจเฆฟ เฆเฆ–เฆพเฆจเง‡ เฆฎเงเฆฏเฆพเฆจเงเฆฏเฆผเฆพเฆฒเฆฟ เฆŸเงเฆฐเฆฟเฆ—เฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆชเฆพเฆฐเง‡เฆจเฅค", - "rebuild-note-l3": "เฆธเงเฆฅเฆพเฆจเง€เฆฏเฆผเฆญเฆพเฆฌเง‡ เฆธเฆ‚เฆฐเฆ•เงเฆทเฆฟเฆค เฆชเฆฐเฆฟเฆฌเฆฐเงเฆคเฆจเง‡เฆฐ เฆœเฆจเงเฆฏ เฆเฆŸเฆฟเฆฐ เฆชเงเฆฐเฆฏเฆผเง‹เฆœเฆจ เฆจเง‡เฆ‡เฅค", - "rebuild-button": "เฆจเฆฟเฆฐเงเฆฎเฆพเฆฃ เฆถเงเฆฐเง เฆ•เฆฐเงเฆจ", - "rebuilding-status-1": "เฆจเฆฟเฆฐเงเฆฎเฆพเฆฃ เฆนเฆšเงเฆ›เง‡...", - "rebuilding-status-2": "เฆเฆคเง‡ เฆ•เฆฏเฆผเง‡เฆ• เฆฎเฆฟเฆจเฆฟเฆŸ เฆธเฆฎเฆฏเฆผ เฆฒเฆพเฆ—เฆคเง‡ เฆชเฆพเฆฐเง‡", - "error-permission": "เฆ†เฆชเฆจเฆพเฆฐ เฆ•เฆพเฆ›เง‡ เฆเฆ‡ เฆ•เงเฆฐเฆฟเฆฏเฆผเฆพเฆŸเฆฟ เฆŸเงเฆฐเฆฟเฆ—เฆพเฆฐ เฆ•เฆฐเฆพเฆฐ เฆ…เฆจเงเฆฎเฆคเฆฟ เฆจเง‡เฆ‡เฅค", - "success-msg": "เฆจเฆฟเฆฐเงเฆฎเฆพเฆฃ เฆธเฆซเฆฒเฆญเฆพเฆฌเง‡ เฆธเฆฎเงเฆชเฆจเงเฆจ เฆนเฆฏเฆผเง‡เฆ›เง‡", - "fail-msg": "เฆจเฆฟเฆฐเงเฆฎเฆพเฆฃ เฆฌเงเฆฏเฆฐเงเฆฅ เฆนเงŸเง‡เฆ›เง‡", - "reload-note": "เฆชเฆฐเฆฟเฆฌเฆฐเงเฆคเฆจเฆ—เงเฆฒเฆฟ เฆ•เฆพเฆฐเงเฆฏเฆ•เฆฐ เฆนเฆ“เฆฏเฆผเฆพเฆฐ เฆœเฆจเงเฆฏ เฆเฆ•เฆŸเฆฟ เฆชเงƒเฆทเงเฆ เฆพ เฆชเงเฆจเฆฐเฆพเฆฏเฆผ เฆฒเง‹เฆก เฆ•เฆฐเฆพเฆฐ เฆชเงเฆฐเฆฏเฆผเง‹เฆœเฆจ เฆจเง‡เฆ‡เงท", - "reload-button": "เฆชเงƒเฆทเงเฆ เฆพเฆŸเฆฟ เฆฐเฆฟเฆฒเง‹เฆก เฆ•เฆฐเงเฆจ" - }, "cloud-sync": { "title": "เฆ•เงเฆฒเฆพเฆ‰เฆก เฆฌเงเฆฏเฆพเฆ•เฆ†เฆช เฆเฆฌเฆ‚ เฆชเงเฆจเฆฐเงเฆฆเงเฆงเฆพเฆฐ", "intro-l1": "เฆ•เงเฆฒเฆพเฆ‰เฆก เฆฌเงเฆฏเฆพเฆ•เฆ†เฆช เฆเฆฌเฆ‚ เฆชเงเฆจเฆฐเงเฆฆเงเฆงเฆพเฆฐ เฆนเฆฒ เฆเฆ•เฆŸเฆฟ เฆเฆšเงเฆ›เฆฟเฆ• เฆฌเงˆเฆถเฆฟเฆทเงเฆŸเงเฆฏ, เฆฏเฆพ เฆ†เฆชเฆจเฆพเฆ•เง‡ เฆ†เฆชเฆจเฆพเฆฐ เฆ•เฆจเฆซเฆฟเฆ—เฆพเฆฐเง‡เฆถเฆจ เฆ‡เฆจเงเฆŸเฆพเฆฐเฆจเง‡เฆŸเง‡ เฆ†เฆชเฆฒเง‹เฆก เฆ•เฆฐเฆคเง‡ เฆเฆฌเฆ‚ เฆคเฆพเฆฐเฆชเฆฐ เฆ…เฆจเงเฆฏ เฆ•เง‹เฆจเง‹ เฆกเฆฟเฆญเฆพเฆ‡เฆธเง‡ เฆฌเฆพ เฆกเงเฆฏเฆพเฆถเฆฟ-เฆฐ เฆ‰เฆฆเฆพเฆนเฆฐเฆฃเง‡ เฆชเงเฆจเฆฐเงเฆฆเงเฆงเฆพเฆฐ เฆ•เฆฐเฆคเง‡ เฆธเฆ•เงเฆทเฆฎ เฆ•เฆฐเง‡เฅค", @@ -394,4 +379,4 @@ "wasted": "เฆจเฆทเงเฆŸ" } } -} \ No newline at end of file +} diff --git a/src/assets/locales/cs.json b/src/assets/locales/cs.json index ca9eb8a1c7..4350d58e8c 100644 --- a/src/assets/locales/cs.json +++ b/src/assets/locales/cs.json @@ -44,7 +44,6 @@ "edit-css-button": "Upravit vlastnรญ CSS", "cloud-sync-button": "Povolit synchronizaci s cloudem", "edit-cloud-sync-button": "Upravit synchronizaci s cloudem", - "rebuild-app-button": "Pล™estavit aplikaci", "change-language-button": "Zmฤ›nit jazyk aplikacie", "reset-settings-button": "Obnovit mรญstnรญ nastavenรญ", "app-info-button": "Informace o aplikaci", @@ -130,20 +129,6 @@ "warning-msg-validation": "Chyba validace", "not-admin-note": "Nemลฏลพete zapisovat zmฤ›ny na disk, protoลพe nejste pล™ihlรกลกenรฝ/รก jako sprรกvca" }, - "app-rebuild": { - "title": "Pล™estavit aplikaci", - "rebuild-note-l1": "Aby se zmฤ›ny zapsanรฉ do souboru conf.yml projevily, je potล™ebnรฉ pล™estavenรญ aplikace.", - "rebuild-note-l2": "Aplikace by se mฤ›la automaticky pล™estavit, ale pokud se tak nestalo, mลฏลพete pล™estavenรก spustiลฅ manuรกlnฤ› zde.", - "rebuild-note-l3": "Pล™estavenรญ se nevyลพaduje pro lokรกlnฤ› uloลพenรฉ รบpravy.", - "rebuild-button": "Spustit pล™estavenรญ", - "rebuilding-status-1": "Pล™estavovรกnรญ...", - "rebuilding-status-2": "Mลฏลพe to trvat pรกr minut", - "error-permission": "Na spuลกtenรญ tรฉto akce nemรกte oprรกvnฤ›nรญ", - "success-msg": "Pล™estavenรญ bylo รบspฤ›ลกne dokonฤeno", - "fail-msg": "Pล™estavenรญ selhalo", - "reload-note": "Aby se zmฤ›ny projevily, je nutnรฉ obnovit strรกnku", - "reload-button": "Obnovit strรกnku" - }, "cloud-sync": { "title": "Cloud zรกloha a obnova", "intro-l1": "Cloudovรฉ zรกlohovanรญ a obnovenรญ je volitelnรก funkce, kterรก Vรกm umoลพลˆuje nahrรกt vaลกรญ konfiguraci na cloudovรฉ ulลพiลกtฤ› a potom ji obnovit na jakรฉmkoliv jinรฉm zaล™รญzenรญ anebo instanci Dashy.", diff --git a/src/assets/locales/da.json b/src/assets/locales/da.json index 426ebf6300..ea101961b2 100644 --- a/src/assets/locales/da.json +++ b/src/assets/locales/da.json @@ -44,7 +44,6 @@ "edit-css-button": "Rediger tilpasset CSS", "cloud-sync-button": "Aktiver Cloud Sync", "edit-cloud-sync-button": "Aktiver Cloud Sync", - "rebuild-app-button": "Genopbyg applikation", "change-language-button": "Skift app-sprog", "reset-settings-button": "Nulstil lokale indstillinger", "app-info-button": "App Info", @@ -130,20 +129,6 @@ "warning-msg-validation": "Valideringsadvarsel", "not-admin-note": "Du kan ikke skrive รฆndringer til disk, fordi du ikke er logget ind som admin" }, - "app-rebuild": { - "title": "Genopbyg applikation", - "rebuild-note-l1": "En genopbygning er pรฅkrรฆvet, for at รฆndringer skrevet til conf.yml-filen kan trรฆde i kraft.", - "rebuild-note-l2": "Dette skulle ske automatisk, men hvis det ikke er tilfรฆldet, kan du manuelt udlรธse det her.", - "rebuild-note-l3": "Dette er ikke nรธdvendigt for รฆndringer, der er gemt lokalt.", - "rebuild-button": "Start byg", - "rebuilding-status-1": "Bygger...", - "rebuilding-status-2": "Dette kan tage et par minutter", - "error-permission": "Du har ikke tilladelse til at udlรธse denne handling", - "success-msg": "Byg fuldfรธrt med succes", - "fail-msg": "Byggehandling mislykkedes", - "reload-note": "Der krรฆves nu en genindlรฆsning af siden, for at รฆndringer kan trรฆde i kraft", - "reload-button": "Genindlรฆs siden" - }, "cloud-sync": { "title": "Cloud sikkerhedskopiering og gendannelse", "intro-l1": "Cloud sikkerhedskopiering og gendannelse er en valgfri funktion, der gรธr det muligt for dig at uploade din konfiguration til internettet og derefter gendanne den pรฅ en hvilken som helst anden enhed eller forekomst af Dashy.", diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json index db2030664d..ac09ded64d 100644 --- a/src/assets/locales/de.json +++ b/src/assets/locales/de.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "App Info", - "error-log": "Fehlerprotokoll", - "no-errors": "Keine kรผrzlichen Fehler erkannt", - "help-support": "Hilfe & Support", - "help-support-description": "Um beim Betrieb oder der Konfiguration von Dashy Hilfe zu bekommen, siehe die", - "help-support-discussions": "Diskussionen", "support-dashy": "Dashy unterstรผtzen", "support-dashy-description": "Fรผr Wege, sich zu beteiligen, besuchen Sie die", "support-dashy-link": "Contributions Seite", @@ -86,7 +81,6 @@ "edit-css-button": "CSS bearbeiten", "cloud-sync-button": "Cloud-Synchronisation aktivieren", "edit-cloud-sync-button": "Cloud-Synchronisation bearbeiten", - "rebuild-app-button": "Anwendung neu kompilieren", "change-language-button": "App-Sprache รคndern", "reset-settings-button": "lokale Einstellungen zurรผcksetzen", "disabled-note": "Einige Konfigurationsoptionen wurden vom Administrator deaktivert", @@ -180,20 +174,6 @@ "warning-msg-validation": "Validierungswarnung", "not-admin-note": "ร„nderungen kรถnnen nicht auf die Festplatte gespeichert werden, da Sie nicht als Administrator angemeldet sind" }, - "app-rebuild": { - "title": "Applikation neu kompilieren", - "rebuild-note-l1": "Damit die in die Datei conf.yml geschriebenen ร„nderungen wirksam werden ist ein Neukompilieren erforderlich.", - "rebuild-note-l2": "Dies sollte automatisch passieren, aber falls nicht kรถnnen Sie es hier manuell starten.", - "rebuild-note-l3": "Dies ist bei lokal gespeicherten ร„nderungen nicht erforderlich.", - "rebuild-button": "Starte Kompilierung", - "rebuilding-status-1": "Baue...", - "rebuilding-status-2": "Das kann ein paar Minuten dauern", - "error-permission": "Sie sind nicht berechtigt diese Aktion auszulรถsen", - "success-msg": "Kompilierung erfolgreich abgeschlossen", - "fail-msg": "Kompilierung fehlgeschlagen", - "reload-note": "Ein neu Laden der Seite ist erforderlich, damit die ร„nderungen wirksam werden.", - "reload-button": "Seite neu laden" - }, "cloud-sync": { "title": "Cloud Backup & Wiederherstellung", "intro-l1": "Cloud-Backup und Wiederherstellung ist eine optionale Funktion mit der Sie Ihre Konfiguration in das Internet hochladen und dann auf einem anderen Gerรคt oder einer anderen Dashy-Instanz wiederherstellen kรถnnen.", @@ -251,12 +231,6 @@ "remove-section": "Entfernen" } }, - "footer": { - "dev-by": "Entwickelt von", - "licensed-under": "Lizensiert unter", - "get-the": "Hole dir den", - "source-code": "Quellcode" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "Interaktiven Editor starten", diff --git a/src/assets/locales/el.json b/src/assets/locales/el.json index e695ce4274..7f32cbcc12 100644 --- a/src/assets/locales/el.json +++ b/src/assets/locales/el.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "ฮ ฮปฮทฯฮฟฯ†ฮฟฯฮฏฮตฯ‚ ฮ•ฯ†ฮฑฯฮผฮฟฮณฮฎฯ‚", - "error-log": "ฮ‘ฯฯ‡ฮตฮฏฮฟ ฮšฮฑฯ„ฮฑฮณฯฮฑฯ†ฮฎฯ‚ ฮฃฯ†ฮฑฮปฮผฮฌฯ„ฯ‰ฮฝ", - "no-errors": "ฮ”ฮตฮฝ ฮตฮฝฯ„ฮฟฯ€ฮฏฯƒฯ„ฮทฮบฮฑฮฝ ฯ€ฯฯŒฯƒฯ†ฮฑฯ„ฮฑ ฯƒฯ†ฮฌฮปฮผฮฑฯ„ฮฑ", - "help-support": "ฮ’ฮฟฮฎฮธฮตฮนฮฑ & ฮฅฯ€ฮฟฯƒฯ„ฮฎฯฮนฮพฮท", - "help-support-description" : "ฮ“ฮนฮฑ ฮฝฮฑ ฮปฮฌฮฒฮตฯ„ฮต ฯ…ฯ€ฮฟฯƒฯ„ฮฎฯฮนฮพฮท ฯƒฯ‡ฮตฯ„ฮนฮบฮฌ ฮผฮต ฯ„ฮทฮฝ ฮตฮบฯ„ฮญฮปฮตฯƒฮท ฮฎ ฮผฮต ฯ„ฮท ฮดฮนฮฑฮผฯŒฯฯ†ฯ‰ฯƒฮท ฯ„ฮฟฯ… Dashy, ฮฑฮฝฮฑฯ„ฯฮญฮพฯ„ฮต ฯƒฯ„ฮนฯ‚", - "help-support-discussions": "ฮฃฯ…ฮถฮทฯ„ฮฎฯƒฮตฮนฯ‚", "support-dashy": "ฮฅฯ€ฮฟฯƒฯ„ฮฎฯฮนฮพฮท ฯ„ฮฟฯ… Dashy", "support-dashy-description": "ฮ“ฮนฮฑ ฯ„ฯฯŒฯ€ฮฟฯ…ฯ‚ ฮผฮต ฯ„ฮฟฯ…ฯ‚ ฮฟฯ€ฮฟฮฏฮฟฯ…ฯ‚ ฮผฯ€ฮฟฯฮตฮฏฯ„ฮต ฮฝฮฑ ฯƒฯ…ฮฝฮตฮนฯƒฯ†ฮญฯฮตฯ„ฮต, ฮฑฮฝฮฑฯ„ฯฮญฮพฯ„ฮต ฯƒฯ„ฮท", "support-dashy-link": "ฮฃฮตฮปฮฏฮดฮฑ ฯƒฯ…ฮฝฮตฮนฯƒฯ†ฮฟฯฯŽฮฝ", @@ -86,7 +81,6 @@ "edit-css-button": "ฮ•ฯ€ฮตฮพฮตฯฮณฮฑฯƒฮฏฮฑ ฮ ฯฮฟฯƒฮฑฯฮผฮฟฯƒฮผฮญฮฝฮฟฯ… CSS", "cloud-sync-button": "ฮ•ฮฝฮตฯฮณฮฟฯ€ฮฟฮฏฮทฯƒฮท ฮฃฯ…ฮณฯ‡ฯฮฟฮฝฮนฯƒฮผฮฟฯ ฮผฮต Cloud", "edit-cloud-sync-button": "ฮ•ฯ€ฮตฮพฮตฯฮณฮฑฯƒฮฏฮฑ ฮกฯ…ฮธฮผฮฏฯƒฮตฯ‰ฮฝ ฮฃฯ…ฮณฯ‡ฯฮฟฮฝฮนฯƒฮผฮฟฯ Cloud", - "rebuild-app-button": "ฮ‘ฮฝฮฑฮบฮฑฯ„ฮฑฯƒฮบฮตฯ…ฮฎ ฮ•ฯ†ฮฑฯฮผฮฟฮณฮฎฯ‚", "change-language-button": "ฮ‘ฮปฮปฮฑฮณฮฎ ฮ“ฮปฯŽฯƒฯƒฮฑฯ‚ ฮ•ฯ†ฮฑฯฮผฮฟฮณฮฎฯ‚", "reset-settings-button": "ฮ•ฯ€ฮฑฮฝฮฑฯ†ฮฟฯฮฌ ฮคฮฟฯ€ฮนฮบฯŽฮฝ ฮกฯ…ฮธฮผฮฏฯƒฮตฯ‰ฮฝ", "disabled-note": "ฮŸฯฮนฯƒฮผฮญฮฝฮตฯ‚ ฮดฯ…ฮฝฮฑฯ„ฯŒฯ„ฮทฯ„ฮตฯ‚ ฮดฮนฮฑฮผฯŒฯฯ†ฯ‰ฯƒฮทฯ‚ ฮญฯ‡ฮฟฯ…ฮฝ ฮฑฯ€ฮตฮฝฮตฯฮณฮฟฯ€ฮฟฮนฮทฮธฮตฮฏ ฮฑฯ€ฯŒ ฯ„ฮฟฮฝ ฮดฮนฮฑฯ‡ฮตฮนฯฮนฯƒฯ„ฮฎ ฯƒฮฑฯ‚", @@ -180,20 +174,6 @@ "warning-msg-validation": "ฮ ฯฮฟฮตฮนฮดฮฟฯ€ฮฟฮฏฮทฯƒฮท ฮตฯ€ฮนฮบฯฯฯ‰ฯƒฮทฯ‚", "not-admin-note": "ฮ”ฮตฮฝ ฮผฯ€ฮฟฯฮตฮฏฯ„ฮต ฮฝฮฑ ฮณฯฮฌฯˆฮตฯ„ฮต ฮฑฮปฮปฮฑฮณฮญฯ‚ ฯƒฯ„ฮฟฮฝ ฮดฮฏฯƒฮบฮฟ, ฮตฯ€ฮตฮนฮดฮฎ ฮดฮตฮฝ ฮญฯ‡ฮตฯ„ฮต ฯƒฯ…ฮฝฮดฮตฮธฮตฮฏ ฯ‰ฯ‚ ฮดฮนฮฑฯ‡ฮตฮนฯฮนฯƒฯ„ฮฎฯ‚" }, - "app-rebuild": { - "title": "ฮ•ฯ€ฮฑฮฝฮฌฮปฮทฯˆฮท ฮงฯ„ฮนฯƒฮฏฮผฮฑฯ„ฮฟฯ‚ ฮ•ฯ†ฮฑฯฮผฮฟฮณฮฎฯ‚", - "rebuild-note-l1": "ฮ— ฮตฯ†ฮฑฯฮผฮฟฮณฮฎ ฯ€ฯฮญฯ€ฮตฮน ฮฝฮฑ ฯ‡ฯ„ฮนฯƒฯ„ฮตฮฏ ฮตฮบ ฮฝฮญฮฟฯ… ฯ€ฯฮฟฮบฮตฮนฮผฮญฮฝฮฟฯ… ฮฝฮฑ ฮนฯƒฯ‡ฯฯƒฮฟฯ…ฮฝ ฮฟฮน ฮฑฮปฮปฮฑฮณฮญฯ‚ ฯ€ฮฟฯ… ฮญฯ‡ฮฟฯ…ฮฝ ฮฑฯ€ฮฟฮธฮทฮบฮตฯ…ฯ„ฮตฮฏ ฯƒฯ„ฮฟ ฮฑฯฯ‡ฮตฮฏฮฟ conf.yml.", - "rebuild-note-l2": "ฮ‘ฯ…ฯ„ฯŒ ฮธฮฑ ฮญฯ€ฯฮตฯ€ฮต ฮฝฮฑ ฯƒฯ…ฮผฮฒฮตฮฏ ฮฑฯ…ฯ„ฯŒฮผฮฑฯ„ฮฑ, ฮฑฮปฮปฮฌ ฮฑฮฝ ฮดฮตฮฝ ฮญฯ‡ฮตฮน ฯƒฯ…ฮผฮฒฮตฮฏ, ฮผฯ€ฮฟฯฮตฮฏฯ„ฮต ฮฝฮฑ ฯ„ฮฟ ฮตฮฝฮตฯฮณฮฟฯ€ฮฟฮนฮฎฯƒฮตฯ„ฮต ฮผฮต ฮผฮท ฮฑฯ…ฯ„ฯŒฮผฮฑฯ„ฮฟ ฯ„ฯฯŒฯ€ฮฟ ฮตฮดฯŽ.", - "rebuild-note-l3": "ฮ‘ฯ…ฯ„ฯŒ ฮดฮตฮฝ ฮฑฯ€ฮฑฮนฯ„ฮตฮฏฯ„ฮฑฮน ฮณฮนฮฑ ฯ„ฯฮฟฯ€ฮฟฯ€ฮฟฮนฮฎฯƒฮตฮนฯ‚ ฯ€ฮฟฯ… ฮตฮฏฮฝฮฑฮน ฮฑฯ€ฮฟฮธฮทฮบฮตฯ…ฮผฮญฮฝฮตฯ‚ ฯ„ฮฟฯ€ฮนฮบฮฌ.", - "rebuild-button": "ฮ•ฮบฮบฮฏฮฝฮทฯƒฮท ฯ‡ฯ„ฮนฯƒฮฏฮผฮฑฯ„ฮฟฯ‚", - "rebuilding-status-1": "ฮ ฯฮฑฮณฮผฮฑฯ„ฮฟฯ€ฮฟฮนฮตฮฏฯ„ฮฑฮน ฯ‡ฯ„ฮฏฯƒฮนฮผฮฟ ฯ„ฮทฯ‚ ฮตฯ†ฮฑฯฮผฮฟฮณฮฎฯ‚...", - "rebuilding-status-2": "ฮ‘ฯ…ฯ„ฯŒ ฮผฯ€ฮฟฯฮตฮฏ ฮฝฮฑ ฮดฮนฮฑฯฮบฮญฯƒฮตฮน ฮผฮตฯฮนฮบฮฌ ฮปฮตฯ€ฯ„ฮฌ", - "error-permission": "ฮ”ฮตฮฝ ฮญฯ‡ฮตฯ„ฮต ฯ„ฮฑ ฮฑฯ€ฮฑฯฮฑฮฏฯ„ฮทฯ„ฮฑ ฮดฮนฮบฮฑฮนฯŽฮผฮฑฯ„ฮฑ ฮณฮนฮฑ ฯ„ฮทฮฝ ฮตฮบฯ„ฮตฮปฮญฯƒฮตฯ„ฮต ฮฑฯ…ฯ„ฮฎ ฯ„ฮทฮฝ ฮตฮฝฮญฯฮณฮตฮนฮฑ", - "success-msg": "ฮคฮฟ ฯ‡ฯ„ฮฏฯƒฮนฮผฮฟ ฯ„ฮทฯ‚ ฮตฯ†ฮฑฯฮผฮฟฮณฮฎฯ‚ ฯ€ฯฮฑฮณฮผฮฑฯ„ฮฟฯ€ฮฟฮนฮฎฮธฮทฮบฮต ฮผฮต ฮตฯ€ฮนฯ„ฯ…ฯ‡ฮฏฮฑ", - "fail-msg": "ฮ— ฮดฮนฮฑฮดฮนฮบฮฑฯƒฮฏฮฑ ฯ‡ฯ„ฮนฯƒฮฏฮผฮฑฯ„ฮฟฯ‚ ฯ„ฮทฯ‚ ฮตฯ†ฮฑฯฮผฮฟฮณฮฎฯ‚ ฮฑฯ€ฮญฯ„ฯ…ฯ‡ฮต", - "reload-note": "ฮ‘ฯ€ฮฑฮนฯ„ฮตฮฏฯ„ฮฑฮน ฮตฯ€ฮฑฮฝฮฑฯ†ฯŒฯฯ„ฯ‰ฯƒฮท ฯ„ฮทฯ‚ ฯƒฮตฮปฮฏฮดฮฑฯ‚ ฮณฮนฮฑ ฮฝฮฑ ฯ„ฮตฮธฮฟฯฮฝ ฯƒฮต ฮนฯƒฯ‡ฯ ฮฟฮน ฮฑฮปฮปฮฑฮณฮญฯ‚", - "reload-button": "ฮ•ฯ€ฮฑฮฝฮฑฯ†ฯŒฯฯ„ฯ‰ฯƒฮท ฯƒฮตฮปฮฏฮดฮฑฯ‚" - }, "cloud-sync": { "title": "ฮ‘ฮฝฯ„ฮฏฮณฯฮฑฯ†ฮฑ ฮ‘ฯƒฯ†ฮฑฮปฮตฮฏฮฑฯ‚ ฯƒฯ„ฮฟ Cloud & ฮ•ฯ€ฮฑฮฝฮฑฯ†ฮฟฯฮฌ", "intro-l1": "ฮคฮฑ ฮฑฮฝฯ„ฮฏฮณฯฮฑฯ†ฮฑ ฮฑฯƒฯ†ฮฑฮปฮตฮฏฮฑฯ‚ ฯƒฯ„ฮฟ cloud ฮบฮฑฮน ฮท ฮตฯ€ฮฑฮฝฮฑฯ†ฮฟฯฮฌ ฯ„ฮฟฯ…ฯ‚ ฮตฮฏฮฝฮฑฮน ฮผฮนฮฑ ฯ€ฯฮฟฮฑฮนฯฮตฯ„ฮนฮบฮฎ ฮปฮตฮนฯ„ฮฟฯ…ฯฮณฮฏฮฑ ฯ€ฮฟฯ… ฯƒฮฑฯ‚ ฮตฯ€ฮนฯ„ฯฮญฯ€ฮตฮน ฮฝฮฑ ฮฑฮฝฮตฮฒฮฌฯƒฮตฯ„ฮต ฯ„ฮท ฮดฮนฮฑฮผฯŒฯฯ†ฯ‰ฯƒฮฎ ฯƒฮฑฯ‚ ฯƒฯ„ฮฟฮฝ ฮนฯƒฯ„ฯŒ ฮบฮฑฮน ฮฝฮฑ ฯ„ฮทฮฝ ฮตฯ€ฮฑฮฝฮฑฯ†ฮญฯฮตฯ„ฮต ฯƒฮต ฮฟฯ€ฮฟฮนฮฑฮดฮฎฯ€ฮฟฯ„ฮต ฮฌฮปฮปฮท ฯƒฯ…ฯƒฮบฮตฯ…ฮฎ.", @@ -251,12 +231,6 @@ "remove-section": "ฮ‘ฯ†ฮฑฮฏฯฮตฯƒฮท" } }, - "footer": { - "dev-by": "ฮ‘ฮฝฮฑฯ€ฯ„ฯฯ‡ฮธฮทฮบฮต ฮฑฯ€ฯŒ", - "licensed-under": "ฮ†ฮดฮตฮนฮฑ ฯ‡ฯฮฎฯƒฮทฯ‚ ฯƒฯฮผฯ†ฯ‰ฮฝฮฑ ฮผฮต ฯ„ฮทฮฝ", - "get-the": "ฮ›ฮฌฮฒฮตฯ„ฮต ฯ„ฮฟฮฝ", - "source-code": "ฮ ฮทฮณฮฑฮฏฮฟ ฮšฯŽฮดฮนฮบฮฑ" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "ฮœฯ€ฮตฮฏฯ„ฮต ฯƒฯ„ฮฟฮฝ ฮ”ฮนฮฑฮดฯฮฑฯƒฯ„ฮนฮบฯŒ ฮ•ฯ€ฮตฮพฮตฯฮณฮฑฯƒฯ„ฮฎ", diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 27b3d9a24e..adce569f49 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -1,4 +1,9 @@ { + "general": { + "close-modal": "Close dialog", + "confirm": "Confirm", + "cancel": "Cancel" + }, "home": { "no-results": "No Search Results", "no-data": "No Data Configured", @@ -47,16 +52,15 @@ }, "app-info": { "title": "App Info", - "error-log": "Error Log", - "no-errors": "No recent errors detected", - "help-support": "Help & Support", - "help-support-description" : "For getting support with running or configuring Dashy, see the", - "help-support-discussions": "Discussions", - "support-dashy": "Supporting Dashy", - "support-dashy-description": "For ways that you can get involved, check out the", "support-dashy-link": "Contributions page", + "sponsor-heading": "Sponsor Dashy", + "sponsor-l1-prefix": "Enjoying Dashy? Consider", + "sponsor-l1-link": "sponsoring me on GitHub", + "sponsor-l1-suffix": "to help fund ongoing development ๐Ÿฉท", "report-bug": "Report a Bug", - "report-bug-description": "If you think you've found a bug, then please", + "report-bug-description": "If you think you've found a bug, then", + "report-bug-debug-link": "check the debug menu", + "report-bug-middle": "and", "report-bug-link": "raise an Issue", "more-info": "More Info", "source": "Source", @@ -73,12 +77,12 @@ "licence-third-party": "For licenses for third-party modules, please see", "licence-third-party-link": "Legal", "list-contributors": "For the full list of contributors and thanks, see", - "list-contributors-link": "Credits", + "list-contributors-link": "Credits", "version": "Version" }, "config": { "main-tab": "Main Menu", - "view-config-tab": "View Config", + "view-config-tab": "Export Config", "edit-config-tab": "Edit Config", "custom-css-tab": "Custom Styles", "heading": "Configuration Options", @@ -87,12 +91,12 @@ "edit-css-button": "Edit Custom CSS", "cloud-sync-button": "Enable Cloud Sync", "edit-cloud-sync-button": "Edit Cloud Sync", - "rebuild-app-button": "Rebuild Application", "change-language-button": "Change App Language", "reset-settings-button": "Reset Local Settings", "disabled-note": "Some configuration features have been disabled by your administrator", "small-screen-note": "You are using a very small screen, and some screens in this menu may not be optimal", - "app-info-button": "App Info", + "app-info-button": "About", + "debug-info-button": "Debug Info", "backup-note": "It is recommended to make a backup of your configuration before making changes.", "reset-config-msg-l1": "This will remove all user settings from local storage, but won't affect your 'conf.yml' file.", "reset-config-msg-l2": "You should first backup any changes you've made locally, if you want to use them in the future.", @@ -118,6 +122,25 @@ "workspace": "Workspace", "minimal": "Minimal" }, + "remote-config": { + "title": "Load Remote Config?", + "apply-button": "Apply Preview", + "intro": "You are loading a configuration from an external URL. Would you like to continue?", + "warning": "You should ensure that you've read the content you are loading before proceeding. Once loaded, your browser will be able to execute any client-side code specified within this config.", + "field-title": "Title", + "field-source": "Source", + "field-sections": "Sections", + "field-items": "Items", + "preview-note": "Preview only. This won't make any changes on disk, nor affect your Dashy instance in any way.", + "applied-toast": "Remote config applied (preview only)", + "previewing-banner": "Previewing remote config", + "revert-button": "Revert", + "error-invalid-url": "Remote config URL is not valid (must be http or https)", + "error-fetch": "Could not fetch remote config. Check the URL is reachable and CORS is allowed.", + "error-parse": "Remote config is not valid YAML", + "error-not-config": "Remote file does not look like a Dashy config", + "error-apply": "Failed to apply remote config" + }, "settings": { "theme-label": "Theme", "layout-label": "Layout", @@ -128,20 +151,90 @@ "item-size-small": "Small", "item-size-medium": "Medium", "item-size-large": "Large", + "language-label": "Language", "config-launcher-label": "Config", "config-launcher-tooltip": "Update Configuration", + "nav-links-tooltip": "Navigation and Configs", + "toggle-nav-aria": "Toggle navigation menu", "sign-out-tooltip": "Sign Out", "sign-in-tooltip": "Log In", "sign-in-welcome": "Hello {username}!", + "please-login": "Log in for full access", "hide": "Hide", - "open": "Open" + "open": "Open", + "options-title": "Options", + "options-tooltip": "Options" }, "updates": { - "app-version-note": "Dashy version", + "app-version-note": "Running Dashy version", "up-to-date": "Up-to-Date", "out-of-date": "Update Available", "unsupported-version-l1": "You are using an unsupported version of Dashy", - "unsupported-version-l2": "For the best experience, and recent security patches, please update to" + "unsupported-version-l2": "For the best experience, and recent security patches, please update to", + "sw-update-available": "A new version of Dashy is available.", + "sw-update-action": "Refresh" + }, + "debug": { + "getting-help": "Getting Help", + "getting-help-msg": "If you've hit a snag, the community can help.", + "resources": { + "troubleshooting-name": "Troubleshooting", + "troubleshooting-desc": "We've outlined fixes for common issues here", + "docs-name": "Documentation", + "docs-desc": "Usage guides and configuring instructions", + "source-name": "Source code", + "source-desc": "Otherwise, you can determine the issue from the code", + "email-name": "Email Support", + "email-note": "(sponsors only)", + "email-desc": "Drop me a line, and I will try and help" + }, + "reporting-bug": "Reporting a Bug", + "reporting-bug-l1-prefix": "If you've found something not working as intended, please", + "reporting-bug-l1-link": "open an issue", + "reporting-bug-l1-suffix": "on our GitHub repo.", + "reporting-bug-l2-intro": "When raising a bug report, please include the relevant info, such as:", + "reporting-bug-list": { + "version": "Dashy version", + "deployment": "Deployment type", + "errors": "Error logs", + "config": "Config snippets", + "overrides": "Relevant overrides", + "environment": "Environment info" + }, + "reporting-bug-note": "Be sure to redact any sensitive info. Tickets which don't include enough information to debug, diagnose and fix may be closed. Due to time limitations, support and feature requests from sponsors are prioritized.", + "app-version": "App Version", + "error-log": "Error Log", + "error-log-hint-prefix": "See", + "error-log-hint-link": "here", + "error-log-hint-suffix": "for instructions on how to view the browser logs. There may also be useful info in the server logs.", + "no-errors": "No errors recorded this session.", + "current-config": "Current Config", + "current-config-hint": "When opening an issue, please include the relevant parts of your config file.", + "config-render-error": "Could not render config: {error}", + "local-storage": "Local Storage", + "local-storage-hint": "Settings saved in this browser. These override defaults until cleared.", + "no-local-storage": "Nothing stored locally.", + "local-storage-error": "Could not read local storage: {error}", + "environment": "Environment", + "environment-hint": "Browser and device info to include when filing a bug report.", + "env": { + "unknown": "Unknown", + "yes": "Yes", + "no": "No", + "browser": "Browser", + "os": "Operating System", + "viewport": "Viewport", + "screen": "Screen", + "dpr": "Pixel Ratio", + "languages": "Languages", + "timezone": "Timezone", + "colorScheme": "Color Scheme", + "reducedMotion": "Reduced Motion", + "online": "Online", + "route": "Current Route", + "mode": "Build Mode", + "swActive": "Service Worker" + } }, "language-switcher": { "title": "Change Application Language", @@ -179,21 +272,26 @@ "error-msg-cannot-save": "An error occurred saving config", "error-msg-bad-json": "Error in JSON, possibly malformed", "warning-msg-validation": "Validation Warning", - "not-admin-note": "You cannot write changes to disk because you are not logged in as an administrator" - }, - "app-rebuild": { - "title": "Rebuild Application", - "rebuild-note-l1": "A rebuild is no longer required for changes to take effect.", - "rebuild-note-l2": "Some changes (entry-point, and auth settings) are read at build-time. So to apply these, you should trigger a rebuild here.", - "rebuild-note-l3": "Note that this is only available on Node and Docker installations, not via statically deployed instances.", - "rebuild-button": "Start Build", - "rebuilding-status-1": "Building...", - "rebuilding-status-2": "This may take a few minutes", - "error-permission": "You don't have permission to trigger this action", - "success-msg": "Build completed successfully", - "fail-msg": "Build operation failed", - "reload-note": "A page reload is now required for changes to take effect", - "reload-button": "Reload Page" + "not-admin-note": "You cannot write changes to disk because you are not logged in as an administrator", + "preview-applied-msg": "Config previewed. Close this modal to see the changes.", + "reset-confirm-msg": "Discard all unsaved changes and revert to the original config?", + "wrap-label": "Wrap", + "format-label": "Format", + "reset-label": "Reset", + "reset-tooltip": "Discard all edits and revert to the original config", + "download-tooltip": "Download as conf.yml", + "download-label": "Download YAML", + "copy-tooltip": "Copy YAML to clipboard", + "copy-label": "Copy YAML", + "copy-success-msg": "Config copied to clipboard", + "copy-fail-msg": "Copy failed: {message}", + "format-fail-msg": "Cannot format: {message}", + "status-valid": "Valid", + "status-invalid": "Invalid", + "status-warning": "{n} Warning", + "status-warnings": "{n} Warnings", + "parse-fail-msg": "YAML parse error: {message}", + "editor-init-fail-msg": "Editor failed to start: {message}" }, "cloud-sync": { "title": "Cloud Backup & Restore", @@ -250,25 +348,24 @@ "edit-section": "Edit", "expand-collapse": "Expand / Collapse", "move-section": "Move To", - "remove-section": "Remove" + "remove-section": "Remove", + "section-options": "Section Options" } }, - "footer": { - "dev-by": "Developed by", - "licensed-under": "Licensed under", - "get-the": "Get the", - "source-code": "Source Code" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "Enter the Interactive Editor", + "config-unavailable": "Config editor not available", "edit-site-data-subheading": "Edit Site Data", + "edit-config-as-code-btn": "Edit Config as Code", + "edit-config-as-code-tooltip": "Open the YAML editor to edit the raw config file", "edit-page-info-btn": "Edit Page Info", "edit-page-info-tooltip": "App title, description, nav links, footer text, etc.", "edit-app-config-btn": "Edit App Config", "edit-app-config-tooltip": "All other app configuration options", "edit-pages-btn": "Edit Pages", "edit-pages-tooltip": "Add or remove additional views", + "edit-pages-subconfig-disabled": "Pages can only be edited from the root config", "config-save-methods-subheading": "Config Saving Options", "save-locally-btn": "Save Locally", "save-locally-tooltip": "Save config locally, to browser storage. This will not affect your config file, but changes will only be saved on this device", @@ -282,6 +379,7 @@ "edit-raw-config-tooltip": "View and modify raw config via JSON editor", "cancel-changes-btn": "Cancel Edit", "cancel-changes-tooltip": "Reset current modifications, and exit Edit Mode. This will not affect your saved config", + "leave-while-editing-confirm": "You have unsaved changes. Leave this page and discard them?", "edit-mode-name": "Edit Mode", "edit-mode-subtitle": "You are in Edit Mode", "edit-mode-description": "This means you can make modifications to your config, and preview the results, but until you save, none of your changes will be preserved.", @@ -298,6 +396,24 @@ "edit-tooltip": "Click to Edit, or right-click for more options", "remove-confirm": "Are you sure you want to remove this section? This action can be undone later." }, + "edit-widget": { + "edit-widget-title": "Edit Widget", + "add-widget-title": "Add New Widget", + "add-widget-btn": "Add Widget", + "type-label": "Widget Type", + "label-label": "Label", + "update-interval-label": "Update Interval (seconds)", + "timeout-label": "Timeout (ms)", + "use-proxy-label": "Use Proxy", + "ignore-errors-label": "Ignore Errors", + "options-heading": "Widget Options", + "add-option-btn": "Add Option", + "key-placeholder": "Key", + "value-placeholder": "Value", + "missing-type-err": "A widget type is required", + "remove-widget": "Remove Widget", + "remove-confirm": "Are you sure you want to remove this widget? This action can be undone later." + }, "edit-app-config": { "warning-msg-title": "Proceed with Caution", "warning-msg-l1": "The following options are for advanced app configuration.", @@ -311,7 +427,27 @@ "copy-clipboard-tooltip": "Copy all app config to system clipboard, in YAML format", "download-file-btn": "Download as File", "download-file-tooltip": "Download all app config to your device, in a YAML file", - "view-title": "View Config" + "current-config-title": "Current Config", + "preview-toggle": "YAML preview", + "issues-title": "Schema issues ({n})", + "config-list-title": "Config List", + "col-title": "Title", + "col-path": "Path", + "col-content": "Content", + "col-status": "Status", + "col-actions": "Actions", + "content-summary": "{sections} sections, {items} items, {widgets} widgets", + "status-loading": "loading", + "status-valid": "valid", + "status-warnings": "{n} warnings", + "status-error": "error", + "status-unknown": "unknown", + "edit-current-btn": "Edit Config", + "edit-current-tooltip": "Open the current config in the JSON editor", + "copy-fail-msg": "Unable to copy to clipboard, see log", + "download-row-tooltip": "Download YAML", + "preview-row-tooltip": "Toggle YAML Preview", + "apply-row-tooltip": "Apply config" } }, "critical-error": { diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index a9881966d1..bd6d01a929 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -1,389 +1,374 @@ -{ - "home": { - "no-results": "Tu bรบsqueda no ha obtenido resultados", - "no-data": "Faltan datos en la configuraciรณn", - "no-items-section": "No hay elementos para mostrar todavรญa" - }, - "search": { - "search-label": "Buscar", - "search-placeholder": "Empieza a escribir para filtrar", - "clear-search-tooltip": "Borrar bรบsqueda", - "enter-to-search-web": "Pulsa Intro para buscar" - }, - "login": { - "title": "Dashy", - "username-label": "Usuario", - "password-label": "Contraseรฑa", - "login-button": "Acceder", - "remember-me-label": "Recuรฉrdame durante", - "remember-me-never": "Nunca", - "remember-me-hour": "4 Horas", - "remember-me-day": "1 Dรญa", - "remember-me-week": "1 Semana", - "remember-me-long-time": "Mucho tiempo", - "error-missing-username": "Falta Usuario", - "error-missing-password": "Falta Contraseรฑa", - "error-incorrect-username": "El usuario no existe", - "error-incorrect-password": "La contraseรฑa es incorrecta", - "success-message": "Accediendo...", - "logout-message": "Desconectado", - "already-logged-in-title": "Estรกs conectado", - "already-logged-in-text": "Estรกs conectado como", - "proceed-to-dashboard": "Ir al Dashboard", - "log-out-button": "Desconectarte", - "proceed-guest-button": "Acceder como Invitado" - }, - "config": { - "main-tab": "Menรบ Principal", - "view-config-tab": "Ver Configuraciรณn", - "edit-config-tab": "Editar Configuraciรณn", - "custom-css-tab": "Personalizar apariencia", - "heading": "Opciones de Configuraciรณn", - "download-config-button": "Ver / Exportar configuraciรณn", - "edit-config-button": "Editar Configuraciรณn", - "edit-css-button": "Personalizar aspecto - CSS", - "cloud-sync-button": "Activar Sincronizaciรณn en la Nube", - "edit-cloud-sync-button": "Editar Sincronizaciรณn en la Nube", - "rebuild-app-button": "Reconstruir la aplicaciรณn", - "change-language-button": "Cambiar el Idioma", - "reset-settings-button": "Restaurar los Ajustes", - "app-info-button": "Info de la App", - "backup-note": "Se recomienda hacer una copia de seguridad de la configuraciรณn antes de realizar los cambios.", - "reset-config-msg-l1": "Esto borrarรก la configuraciรณn local del usuario, pero no tendrรก ningรบn efecto en el fichero 'conf.yml'.", - "reset-config-msg-l2": "Es recomedable realizar primero una copia de seguridad de los cambios hecho en su configuraciรณn local, por si los necesitas usar en el futuro.", - "reset-config-msg-l3": "ยฟEstรกs seguro de que quieres continuar?", - "data-cleared-msg": "Datos eliminados correctamente", - "actions-label": "Acciones", - "copy-config-label": "Copiar la Configuraciรณn", - "data-copied-msg": "La configuraciรณn ha sido copiada al portapapeles", - "reset-config-label": "Resetear la Configuraciรณn", - "css-save-btn": "Guardar Cambios", - "css-note-label": "Nota", - "css-note-l1": "Necesitarรกs refrescar tu navegador para que los cambios realizados tengan efecto.", - "css-note-l2": "La modificaciรณn de la apariencia sรณlo se almacena localmente, es recomendable realizar una copia de seguridad de tu CSS.", - "css-note-l3": "Para borrar las apariencias personalizadas, borra los contenidos y pulsa 'Guardar Cambios'" - }, - "alternate-views": { - "alternate-view-heading": "Cambiar Vista", - "default": "Por defecto", - "workspace": "Espacio de trabajo", - "minimal": "Minimalista" - }, - "settings": { - "theme-label": "Tema", - "layout-label": "Diseรฑo", - "layout-auto": "Auto", - "layout-horizontal": "Horizontal", - "layout-vertical": "Vertical", - "item-size-label": "Tamaรฑo de los Elementos", - "item-size-small": "Pequeรฑo", - "item-size-medium": "Mediano", - "item-size-large": "Grande", - "config-launcher-label": "Configuraciรณn", - "config-launcher-tooltip": "Actualizar Configuraciรณn", - "sign-out-tooltip": "Desconectar", - "sign-in-tooltip": "Acceder", - "sign-in-welcome": "Hola {username}!" - }, - "updates": { - "app-version-note": "Versiรณn de Dashy", - "up-to-date": "Actualizado", - "out-of-date": "Actualizaciรณn disponible", - "unsupported-version-l1": "Estรกs usando una versiรณn de Dashy no soportada", - "unsupported-version-l2": "Si quieres una mejor experiencia de usuario, y aplicar los parches de seguridad disponibles, por favor actualiza a" - }, - "language-switcher": { - "title": "Cambiar el idioma de la aplicaciรณn", - "dropdown-label": "Selecciona un idioma", - "save-button": "Guardar", - "success-msg": "Idioma actualizado a" - }, - "theme-maker": { - "title": "Configurar el Tema", - "export-button": "Exportar las Variables", - "reset-button": "Restaurar Estilo para", - "show-all-button": "Mostrar todas las Variables", - "change-fonts-button": "Cambiar Fuentes", - "save-button": "Guardar", - "cancel-button": "Cancelar", - "saved-toast": "{theme} Actualizado correctamente", - "copied-toast": "Datos del Tema {theme} copiados al portapapeles", - "reset-toast": "Colores personalizados de {theme} borrados" - }, - "config-editor": { - "save-location-label": "Guardar Ubicaciรณn", - "location-local-label": "Aplicar localmente", - "location-disk-label": "Guardar cambion en el fichero de configuraciรณn", - "save-button": "Guardar Cambios", - "preview-button": "Previsualizar los cambios", - "valid-label": "La configuraciรณn es vรกlida", - "status-success-msg": "Tarea Completada", - "status-fail-msg": "La Tarea ha fallado", - "success-msg-disk": "Fichero de configuraciรณn guardado en disco correctamente", - "success-msg-local": "Los cambios locales se han guardado correctamente", - "success-note-l1": "La app se recompilarรก automรกticamente.", - "success-note-l2": "Esto puede llevar algo mรกs de un minuto.", - "success-note-l3": "Es necesario refrescar la pรกgina para que los cambios tengan efecto.", - "error-msg-save-mode": "Por favor selecciona un modo de Guardar: Local o Fichero", - "error-msg-cannot-save": "Se ha producido un error al guardar la configuraciรณn", - "error-msg-bad-json": "Error en el JSON, probablemente estรฉ mal construรญdo", - "warning-msg-validation": "Advertencia de validaciรณn", - "not-admin-note": "No puedes guardar los cambios en el disco, porque no estรกs conectado como un Administrador" - }, - "app-rebuild": { - "title": "Reconstruir la aplicaciรณn", - "rebuild-note-l1": "Se requiere recompilar, para que los cambios realizados en el 'conf.yml' tengan efecto.", - "rebuild-note-l2": "Esto deberรญa de suceder automรกticamente, pero si no sucede, puedes forzarlo manualmente aquรญ.", - "rebuild-note-l3": "No es necesario para modificaciones guardadas localmente.", - "rebuild-button": "Iniciar la construcciรณn", - "rebuilding-status-1": "Construyendo...", - "rebuilding-status-2": "Esto puede llevar unos minutos", - "error-permission": "No tienes privilegios para ejecutar esta acciรณn", - "success-msg": "Construcciรณn completada correctamente", - "fail-msg": "la construcciรณn ha fallado", - "reload-note": "Se requiere refrescar la pรกgina para que los cambios tengan efecto", - "reload-button": "Refrescar la pรกgina" - }, - "cloud-sync": { - "title": "Copia de seguridad y Restauraciรณn en la Nube", - "intro-l1": "La copia de seguridad y restaurar en la Nube es una funcionalidad opcional, que permite subir tu configuraciรณn a Internet, y restaurarle en cualquier dispositivo u otras instancias de Dashy.", - "intro-l2": "Todos los datos estรกn cifrados de extremo a extremo con AES, la Contraseรฑa elegida es la clave de cifrado.", - "intro-l3": "Para mรกs informaciรณn, por favor consulta", - "backup-title-setup": "Hacer una copia de seguridad", - "backup-title-update": "Restaurar copia de seguridad", - "password-label-setup": "Selecciona una Contraseรฑa", - "password-label-update": "Escribe tu Contraseรฑa", - "backup-button-setup": "Copia de Seguridad", - "backup-button-update": "Actualizar la copia de seguridad", - "backup-id-label": "El identificador (ID) de tu copia de seguridad", - "backup-id-note": "Esto es necesario para restaurar copias de seguridad posteriormente. No lo pierdas, guardalo junto a la contraseรฑa que usaste en un lugar seguro.", - "restore-title": "Restaurar una copia de seguridad", - "restore-id-label": "ID (identificador) de la copia de seguridad", - "restore-password-label": "Contraseรฑa", - "restore-button": "Restaurar", - "backup-missing-password": "Falta la Contraseรฑa", - "backup-error-unknown": "No se puede procesar la solicitud", - "backup-error-password": "Contraseรฑa incorrecta. Por favor introduce la contraseรฑa.", - "backup-success-msg": "Completado con รฉxito", - "restore-success-msg": "Configuraciรณn restaurada con รฉxito" -}, - "menu": { - "open-section-title": "Abrir en", - "sametab": "Abrir en la pestaรฑa actual", - "newtab": "Abrir en una nueva pestaรฑa", - "modal": "Abrir en un Pop-Up", - "workspace": "Abrir en el espacio de trabajo", - "options-section-title": "Opciones", - "edit-item": "Editar", - "move-item": "Copiar o Mover", - "remove-item": "Eliminar" - }, - "context-menus": { - "item": { - "open-section-title": "Abrir en", - "sametab": "Pestaรฑa actual", - "newtab": "Nueva pestaรฑa", - "modal": "Pop-Up Modal", - "workspace": "Vista de espacio de trabajo", - "clipboard": "Copiar al portapapeles", - "options-section-title": "Opciones", - "edit-item": "Editar", - "move-item": "Copiar o mover", - "remove-item": "Eliminar", - "copied-toast": "La URL se ha copiado en el portapapeles" - }, - "section": { - "open-section": "Abrir la secciรณn", - "edit-section": "Editar", - "expand-collapse": "Expandir / Colapsar", - "move-section": "Mover a", - "remove-section": "Eliminar" - } - }, - "interactive-editor": { - "menu": { - "start-editing-tooltip": "Acceda al editor interactivo", - "edit-site-data-subheading": "Editar datos del sitio", - "edit-page-info-btn": "Editar la informaciรณn de la pรกgina", - "edit-page-info-tooltip": "Tรญtulo de la aplicaciรณn, descripciรณn, enlaces de navegaciรณn, texto del pie de pรกgina, etc.", - "edit-app-config-btn": "Editar la configuraciรณn de la aplicaciรณn", - "edit-app-config-tooltip": "Todas las demรกs opciones de configuraciรณn de la aplicaciรณn", - "edit-pages-btn": "Editar pรกginas", - "edit-pages-tooltip": "Aรฑadir o eliminar vistas adicionales", - "config-save-methods-subheading": "Opciones de guardado de la configuraciรณn", - "save-locally-btn": "Guardar localmente", - "save-locally-tooltip": "Guardar la configuraciรณn localmente, en el almacenamiento del navegador. Esto no afectarรก a su archivo de configuraciรณn, pero los cambios sรณlo se guardarรกn en este dispositivo.", - "save-disk-btn": "Guardar en disco", - "save-disk-tooltip": "Guarde la configuraciรณn en el archivo conf.yml en el disco. Esto harรก una copia de seguridad, y luego sobrescribirรก su configuraciรณn existente.", - "export-config-btn": "Exportar configuraciรณn", - "export-config-tooltip": "Ver y exportar la nueva configuraciรณn, ya sea a un archivo o al portapapeles", - "cloud-backup-btn": "Copia de seguridad en la nube", - "cloud-backup-tooltip": "Guardar una copia de seguridad encriptada de la configuraciรณn en la nube", - "edit-raw-config-btn": "Editar la configuraciรณn en bruto", - "edit-raw-config-tooltip": "Ver y modificar la configuraciรณn en bruto a travรฉs del editor JSON", - "cancel-changes-btn": "Cancelar la ediciรณn", - "cancel-changes-tooltip": "Restablecer las modificaciones actuales y salir del modo de ediciรณn. Esto no afectarรก a su configuraciรณn guardada", - "edit-mode-name": "Modo de ediciรณn", - "edit-mode-subtitle": "Estรกs en el modo de ediciรณn", - "edit-mode-description": "Esto significa que puedes hacer modificaciones en tu configuraciรณn, y previsualizar los resultados, pero hasta que no guardes, no se conservarรก ninguno de tus cambios.", - "save-stage-btn": "Guardar", - "cancel-stage-btn": "Cancelar", - "save-locally-warning": "Si procede, los cambios se guardarรกn sรณlo en su navegador. Deberรก exportar una copia de su configuraciรณn para utilizarla en otras mรกquinas. ยฟDesea continuar?" - }, - "edit-item": { - "missing-title-err": "Se requiere el tรญtulo del elemento" - }, - "edit-section": { - "edit-section-title": "Editar secciรณn", - "add-section-title": "Aรฑadir nueva secciรณn", - "edit-tooltip": "Haga clic para editar o haga clic con el botรณn derecho para mรกs opciones", - "remove-confirm": "ยฟEstรก seguro de que quiere eliminar esta secciรณn? Esta acciรณn puede deshacerse mรกs tarde." - }, - "edit-app-config": { - "warning-msg-title": "Proceda con precauciรณn", - "warning-msg-l1": "Las siguientes opciones son para la configuraciรณn avanzada de la aplicaciรณn.", - "warning-msg-l2": "Si no estรก seguro de alguno de los campos, consulte la", - "warning-msg-docs": "documentaciรณn", - "warning-msg-l3": "para evitar consecuencias imprevistas." - }, - "export": { - "export-title": "Exportar configuraciรณn", - "copy-clipboard-btn": "Copiar al portapapeles", - "copy-clipboard-tooltip": "Copiar toda la configuraciรณn de la aplicaciรณn al portapapeles del sistema, en formato YAML", - "download-file-btn": "Descargar como archivo", - "download-file-tooltip": "Descargue toda la configuraciรณn de la aplicaciรณn en su dispositivo, en un archivo YAML", - "view-title": "Ver configuraciรณn" - } - }, - "widgets": { - "general": { - "loading": "Cargando...", - "show-more": "Ampliar detalles", - "show-less": "Mostrar menos", - "open-link": "Continuar leyendo" - }, - "pi-hole": { - "status-heading": "Estado" - }, - "stat-ping": { - "up": "En lรญnea", - "down": "Fuera de lรญnea" - }, - "net-data": { - "cpu-chart-title": "Historial del procesador", - "mem-chart-title": "Consumo de memoria", - "mem-breakdown-title": "Desglose de la memoria", - "load-chart-title": "Carga del sistema" - }, - "glances": { - "disk-space-free": "Libre", - "disk-space-used": "Usado", - "disk-mount-point": "Punto de montaje", - "disk-file-system": "Sistema de archivos", - "disk-io-read": "Leรญdo", - "disk-io-write": "Escrito", - "system-load-desc": "Nรบmero de procesos en espera en la cola de ejecuciรณn, promediado en todos los nรบcleos" - }, - "system-info": { - "uptime": "Tiempo de servicio" - }, - "flight-data": { - "arrivals": "Llegadas", - "departures": "Salidas" - }, - "tfl-status": { - "good-service-all": "Buen servicio en todas las lรญneas", - "good-service-rest": "Buen servicio en todas las demรกs lรญneas" - }, - "synology-download": { - "download": "Descargar", - "upload": "Cargar", - "downloaded": "Descargado", - "uploaded": "Cargado", - "remaining": "Restante", - "up": "Levantado", - "down": "Caรญdo" - }, - "gluetun-status": { - "vpn-ip": "IP de la VPN", - "country": "Paรญs", - "region": "Regiรณn", - "city": "Ciudad", - "post-code": "Cรณdigo Postal", - "location": "Ubicaciรณn", - "timezone": "Zona horaria", - "organization": "Organizaciรณn" - }, - "nextcloud": { - "active": "activo", - "and": "y", - "applications": "aplicaciones", - "available": "disponible", - "away": "Fuera", - "cache-full": "CACHE LLENO", - "chat-room": "sala del chat", - "delete-all": "Borrar todo", - "delete-notification": "Eliminar la notificaciรณn", - "disabled": "deshabilitado", - "disk-quota": "Cuota del disco", - "disk-space": "Espacio del disco", - "dnd": "No distribuir", - "email": "email", - "enabled": "habilitado", - "federated-shares-ucfirst": "Acciones federadas", - "federated-shares": "acciones federadas", - "files": "archivo/s", - "free": "libre", - "groups": "grupos", - "hit-rate": "tasa de aciertos", - "hits": "aciertos", - "home": "casa", - "in": "en", - "keys": "teclas", - "last-24-hours": "รบltimas 24 horas", - "last-5-minutes": "en los รบltimos 5 minutos", - "last-hour": "en la รบltima hora", - "last-login": "รšltimo acceso", - "last-restart": "รšltimo reinicio", - "load-averages": "Promedios de carga en todos los nรบcleos del procesador", - "local-shares": "Acciones locales", - "local": "local", - "max-keys": "teclas mรกx", - "memory-used": "memoria usada", - "memory-utilisation": "utilizaciรณn de memoria", - "memory": "memoria", - "misses": "fallos", - "no-notifications": "Sin notificaciones", - "no-pending-updates": "no hay actualizaciones pendientes", - "nothing-to-show": "Nada que mostrar aquรญ en este momento", - "of-which": "de los cuales", - "of": "de", - "offline": "Fuera de lรญnea", - "online": "En lรญnea", - "other": "otros", - "overall": "En general", - "private-link": "enlace privado", - "public-link": "enlace pรบblico", - "quota-enabled": "La cuota de disco {no} estรก habilitado para este usuario", - "received": "recibido", - "scripts": "scripts", - "sent": "enviado", - "started": "Iniciado", - "storages-by-type": "Almacenamientos por tipo", - "storages": "almacenamiento/s", - "strings-use": "uso de cadenas", - "tasks": "Tareas", - "total-files": "total de archivos", - "total-users": "total de usuarios", - "total": "total", - "until": "Hasta", - "updates-available-for": "Las actualizaciones estรกn disponibles para", - "updates-available": "actualizacion/es disponible", - "used": "usado", - "user": "usuario", - "using": "usando", - "version": "versiรณn", - "wasted": "gastado" - } - } -} +{ + "home": { + "no-results": "Tu bรบsqueda no ha obtenido resultados", + "no-data": "Faltan datos en la configuraciรณn", + "no-items-section": "No hay elementos para mostrar todavรญa" + }, + "search": { + "search-label": "Buscar", + "search-placeholder": "Empieza a escribir para filtrar", + "clear-search-tooltip": "Borrar bรบsqueda", + "enter-to-search-web": "Pulsa Intro para buscar" + }, + "login": { + "title": "Dashy", + "username-label": "Usuario", + "password-label": "Contraseรฑa", + "login-button": "Acceder", + "remember-me-label": "Recuรฉrdame durante", + "remember-me-never": "Nunca", + "remember-me-hour": "4 Horas", + "remember-me-day": "1 Dรญa", + "remember-me-week": "1 Semana", + "remember-me-long-time": "Mucho tiempo", + "error-missing-username": "Falta Usuario", + "error-missing-password": "Falta Contraseรฑa", + "error-incorrect-username": "El usuario no existe", + "error-incorrect-password": "La contraseรฑa es incorrecta", + "success-message": "Accediendo...", + "logout-message": "Desconectado", + "already-logged-in-title": "Estรกs conectado", + "already-logged-in-text": "Estรกs conectado como", + "proceed-to-dashboard": "Ir al Dashboard", + "log-out-button": "Desconectarte", + "proceed-guest-button": "Acceder como Invitado" + }, + "config": { + "main-tab": "Menรบ Principal", + "view-config-tab": "Ver Configuraciรณn", + "edit-config-tab": "Editar Configuraciรณn", + "custom-css-tab": "Personalizar apariencia", + "heading": "Opciones de Configuraciรณn", + "download-config-button": "Ver / Exportar configuraciรณn", + "edit-config-button": "Editar Configuraciรณn", + "edit-css-button": "Personalizar aspecto - CSS", + "cloud-sync-button": "Activar Sincronizaciรณn en la Nube", + "edit-cloud-sync-button": "Editar Sincronizaciรณn en la Nube", + "change-language-button": "Cambiar el Idioma", + "reset-settings-button": "Restaurar los Ajustes", + "app-info-button": "Info de la App", + "backup-note": "Se recomienda hacer una copia de seguridad de la configuraciรณn antes de realizar los cambios.", + "reset-config-msg-l1": "Esto borrarรก la configuraciรณn local del usuario, pero no tendrรก ningรบn efecto en el fichero 'conf.yml'.", + "reset-config-msg-l2": "Es recomedable realizar primero una copia de seguridad de los cambios hecho en su configuraciรณn local, por si los necesitas usar en el futuro.", + "reset-config-msg-l3": "ยฟEstรกs seguro de que quieres continuar?", + "data-cleared-msg": "Datos eliminados correctamente", + "actions-label": "Acciones", + "copy-config-label": "Copiar la Configuraciรณn", + "data-copied-msg": "La configuraciรณn ha sido copiada al portapapeles", + "reset-config-label": "Resetear la Configuraciรณn", + "css-save-btn": "Guardar Cambios", + "css-note-label": "Nota", + "css-note-l1": "Necesitarรกs refrescar tu navegador para que los cambios realizados tengan efecto.", + "css-note-l2": "La modificaciรณn de la apariencia sรณlo se almacena localmente, es recomendable realizar una copia de seguridad de tu CSS.", + "css-note-l3": "Para borrar las apariencias personalizadas, borra los contenidos y pulsa 'Guardar Cambios'" + }, + "alternate-views": { + "alternate-view-heading": "Cambiar Vista", + "default": "Por defecto", + "workspace": "Espacio de trabajo", + "minimal": "Minimalista" + }, + "settings": { + "theme-label": "Tema", + "layout-label": "Diseรฑo", + "layout-auto": "Auto", + "layout-horizontal": "Horizontal", + "layout-vertical": "Vertical", + "item-size-label": "Tamaรฑo de los Elementos", + "item-size-small": "Pequeรฑo", + "item-size-medium": "Mediano", + "item-size-large": "Grande", + "config-launcher-label": "Configuraciรณn", + "config-launcher-tooltip": "Actualizar Configuraciรณn", + "sign-out-tooltip": "Desconectar", + "sign-in-tooltip": "Acceder", + "sign-in-welcome": "Hola {username}!" + }, + "updates": { + "app-version-note": "Versiรณn de Dashy", + "up-to-date": "Actualizado", + "out-of-date": "Actualizaciรณn disponible", + "unsupported-version-l1": "Estรกs usando una versiรณn de Dashy no soportada", + "unsupported-version-l2": "Si quieres una mejor experiencia de usuario, y aplicar los parches de seguridad disponibles, por favor actualiza a" + }, + "language-switcher": { + "title": "Cambiar el idioma de la aplicaciรณn", + "dropdown-label": "Selecciona un idioma", + "save-button": "Guardar", + "success-msg": "Idioma actualizado a" + }, + "theme-maker": { + "title": "Configurar el Tema", + "export-button": "Exportar las Variables", + "reset-button": "Restaurar Estilo para", + "show-all-button": "Mostrar todas las Variables", + "change-fonts-button": "Cambiar Fuentes", + "save-button": "Guardar", + "cancel-button": "Cancelar", + "saved-toast": "{theme} Actualizado correctamente", + "copied-toast": "Datos del Tema {theme} copiados al portapapeles", + "reset-toast": "Colores personalizados de {theme} borrados" + }, + "config-editor": { + "save-location-label": "Guardar Ubicaciรณn", + "location-local-label": "Aplicar localmente", + "location-disk-label": "Guardar cambion en el fichero de configuraciรณn", + "save-button": "Guardar Cambios", + "preview-button": "Previsualizar los cambios", + "valid-label": "La configuraciรณn es vรกlida", + "status-success-msg": "Tarea Completada", + "status-fail-msg": "La Tarea ha fallado", + "success-msg-disk": "Fichero de configuraciรณn guardado en disco correctamente", + "success-msg-local": "Los cambios locales se han guardado correctamente", + "success-note-l1": "La app se recompilarรก automรกticamente.", + "success-note-l2": "Esto puede llevar algo mรกs de un minuto.", + "success-note-l3": "Es necesario refrescar la pรกgina para que los cambios tengan efecto.", + "error-msg-save-mode": "Por favor selecciona un modo de Guardar: Local o Fichero", + "error-msg-cannot-save": "Se ha producido un error al guardar la configuraciรณn", + "error-msg-bad-json": "Error en el JSON, probablemente estรฉ mal construรญdo", + "warning-msg-validation": "Advertencia de validaciรณn", + "not-admin-note": "No puedes guardar los cambios en el disco, porque no estรกs conectado como un Administrador" + }, + "cloud-sync": { + "title": "Copia de seguridad y Restauraciรณn en la Nube", + "intro-l1": "La copia de seguridad y restaurar en la Nube es una funcionalidad opcional, que permite subir tu configuraciรณn a Internet, y restaurarle en cualquier dispositivo u otras instancias de Dashy.", + "intro-l2": "Todos los datos estรกn cifrados de extremo a extremo con AES, la Contraseรฑa elegida es la clave de cifrado.", + "intro-l3": "Para mรกs informaciรณn, por favor consulta", + "backup-title-setup": "Hacer una copia de seguridad", + "backup-title-update": "Restaurar copia de seguridad", + "password-label-setup": "Selecciona una Contraseรฑa", + "password-label-update": "Escribe tu Contraseรฑa", + "backup-button-setup": "Copia de Seguridad", + "backup-button-update": "Actualizar la copia de seguridad", + "backup-id-label": "El identificador (ID) de tu copia de seguridad", + "backup-id-note": "Esto es necesario para restaurar copias de seguridad posteriormente. No lo pierdas, guardalo junto a la contraseรฑa que usaste en un lugar seguro.", + "restore-title": "Restaurar una copia de seguridad", + "restore-id-label": "ID (identificador) de la copia de seguridad", + "restore-password-label": "Contraseรฑa", + "restore-button": "Restaurar", + "backup-missing-password": "Falta la Contraseรฑa", + "backup-error-unknown": "No se puede procesar la solicitud", + "backup-error-password": "Contraseรฑa incorrecta. Por favor introduce la contraseรฑa.", + "backup-success-msg": "Completado con รฉxito", + "restore-success-msg": "Configuraciรณn restaurada con รฉxito" + }, + "menu": { + "open-section-title": "Abrir en", + "sametab": "Abrir en la pestaรฑa actual", + "newtab": "Abrir en una nueva pestaรฑa", + "modal": "Abrir en un Pop-Up", + "workspace": "Abrir en el espacio de trabajo", + "options-section-title": "Opciones", + "edit-item": "Editar", + "move-item": "Copiar o Mover", + "remove-item": "Eliminar" + }, + "context-menus": { + "item": { + "open-section-title": "Abrir en", + "sametab": "Pestaรฑa actual", + "newtab": "Nueva pestaรฑa", + "modal": "Pop-Up Modal", + "workspace": "Vista de espacio de trabajo", + "clipboard": "Copiar al portapapeles", + "options-section-title": "Opciones", + "edit-item": "Editar", + "move-item": "Copiar o mover", + "remove-item": "Eliminar", + "copied-toast": "La URL se ha copiado en el portapapeles" + }, + "section": { + "open-section": "Abrir la secciรณn", + "edit-section": "Editar", + "expand-collapse": "Expandir / Colapsar", + "move-section": "Mover a", + "remove-section": "Eliminar" + } + }, + "interactive-editor": { + "menu": { + "start-editing-tooltip": "Acceda al editor interactivo", + "edit-site-data-subheading": "Editar datos del sitio", + "edit-page-info-btn": "Editar la informaciรณn de la pรกgina", + "edit-page-info-tooltip": "Tรญtulo de la aplicaciรณn, descripciรณn, enlaces de navegaciรณn, texto del pie de pรกgina, etc.", + "edit-app-config-btn": "Editar la configuraciรณn de la aplicaciรณn", + "edit-app-config-tooltip": "Todas las demรกs opciones de configuraciรณn de la aplicaciรณn", + "edit-pages-btn": "Editar pรกginas", + "edit-pages-tooltip": "Aรฑadir o eliminar vistas adicionales", + "config-save-methods-subheading": "Opciones de guardado de la configuraciรณn", + "save-locally-btn": "Guardar localmente", + "save-locally-tooltip": "Guardar la configuraciรณn localmente, en el almacenamiento del navegador. Esto no afectarรก a su archivo de configuraciรณn, pero los cambios sรณlo se guardarรกn en este dispositivo.", + "save-disk-btn": "Guardar en disco", + "save-disk-tooltip": "Guarde la configuraciรณn en el archivo conf.yml en el disco. Esto harรก una copia de seguridad, y luego sobrescribirรก su configuraciรณn existente.", + "export-config-btn": "Exportar configuraciรณn", + "export-config-tooltip": "Ver y exportar la nueva configuraciรณn, ya sea a un archivo o al portapapeles", + "cloud-backup-btn": "Copia de seguridad en la nube", + "cloud-backup-tooltip": "Guardar una copia de seguridad encriptada de la configuraciรณn en la nube", + "edit-raw-config-btn": "Editar la configuraciรณn en bruto", + "edit-raw-config-tooltip": "Ver y modificar la configuraciรณn en bruto a travรฉs del editor JSON", + "cancel-changes-btn": "Cancelar la ediciรณn", + "cancel-changes-tooltip": "Restablecer las modificaciones actuales y salir del modo de ediciรณn. Esto no afectarรก a su configuraciรณn guardada", + "edit-mode-name": "Modo de ediciรณn", + "edit-mode-subtitle": "Estรกs en el modo de ediciรณn", + "edit-mode-description": "Esto significa que puedes hacer modificaciones en tu configuraciรณn, y previsualizar los resultados, pero hasta que no guardes, no se conservarรก ninguno de tus cambios.", + "save-stage-btn": "Guardar", + "cancel-stage-btn": "Cancelar", + "save-locally-warning": "Si procede, los cambios se guardarรกn sรณlo en su navegador. Deberรก exportar una copia de su configuraciรณn para utilizarla en otras mรกquinas. ยฟDesea continuar?" + }, + "edit-item": { + "missing-title-err": "Se requiere el tรญtulo del elemento" + }, + "edit-section": { + "edit-section-title": "Editar secciรณn", + "add-section-title": "Aรฑadir nueva secciรณn", + "edit-tooltip": "Haga clic para editar o haga clic con el botรณn derecho para mรกs opciones", + "remove-confirm": "ยฟEstรก seguro de que quiere eliminar esta secciรณn? Esta acciรณn puede deshacerse mรกs tarde." + }, + "edit-app-config": { + "warning-msg-title": "Proceda con precauciรณn", + "warning-msg-l1": "Las siguientes opciones son para la configuraciรณn avanzada de la aplicaciรณn.", + "warning-msg-l2": "Si no estรก seguro de alguno de los campos, consulte la", + "warning-msg-docs": "documentaciรณn", + "warning-msg-l3": "para evitar consecuencias imprevistas." + }, + "export": { + "export-title": "Exportar configuraciรณn", + "copy-clipboard-btn": "Copiar al portapapeles", + "copy-clipboard-tooltip": "Copiar toda la configuraciรณn de la aplicaciรณn al portapapeles del sistema, en formato YAML", + "download-file-btn": "Descargar como archivo", + "download-file-tooltip": "Descargue toda la configuraciรณn de la aplicaciรณn en su dispositivo, en un archivo YAML", + "view-title": "Ver configuraciรณn" + } + }, + "widgets": { + "general": { + "loading": "Cargando...", + "show-more": "Ampliar detalles", + "show-less": "Mostrar menos", + "open-link": "Continuar leyendo" + }, + "pi-hole": { + "status-heading": "Estado" + }, + "stat-ping": { + "up": "En lรญnea", + "down": "Fuera de lรญnea" + }, + "net-data": { + "cpu-chart-title": "Historial del procesador", + "mem-chart-title": "Consumo de memoria", + "mem-breakdown-title": "Desglose de la memoria", + "load-chart-title": "Carga del sistema" + }, + "glances": { + "disk-space-free": "Libre", + "disk-space-used": "Usado", + "disk-mount-point": "Punto de montaje", + "disk-file-system": "Sistema de archivos", + "disk-io-read": "Leรญdo", + "disk-io-write": "Escrito", + "system-load-desc": "Nรบmero de procesos en espera en la cola de ejecuciรณn, promediado en todos los nรบcleos" + }, + "system-info": { + "uptime": "Tiempo de servicio" + }, + "flight-data": { + "arrivals": "Llegadas", + "departures": "Salidas" + }, + "tfl-status": { + "good-service-all": "Buen servicio en todas las lรญneas", + "good-service-rest": "Buen servicio en todas las demรกs lรญneas" + }, + "synology-download": { + "download": "Descargar", + "upload": "Cargar", + "downloaded": "Descargado", + "uploaded": "Cargado", + "remaining": "Restante", + "up": "Levantado", + "down": "Caรญdo" + }, + "gluetun-status": { + "vpn-ip": "IP de la VPN", + "country": "Paรญs", + "region": "Regiรณn", + "city": "Ciudad", + "post-code": "Cรณdigo Postal", + "location": "Ubicaciรณn", + "timezone": "Zona horaria", + "organization": "Organizaciรณn" + }, + "nextcloud": { + "active": "activo", + "and": "y", + "applications": "aplicaciones", + "available": "disponible", + "away": "Fuera", + "cache-full": "CACHE LLENO", + "chat-room": "sala del chat", + "delete-all": "Borrar todo", + "delete-notification": "Eliminar la notificaciรณn", + "disabled": "deshabilitado", + "disk-quota": "Cuota del disco", + "disk-space": "Espacio del disco", + "dnd": "No distribuir", + "email": "email", + "enabled": "habilitado", + "federated-shares-ucfirst": "Acciones federadas", + "federated-shares": "acciones federadas", + "files": "archivo/s", + "free": "libre", + "groups": "grupos", + "hit-rate": "tasa de aciertos", + "hits": "aciertos", + "home": "casa", + "in": "en", + "keys": "teclas", + "last-24-hours": "รบltimas 24 horas", + "last-5-minutes": "en los รบltimos 5 minutos", + "last-hour": "en la รบltima hora", + "last-login": "รšltimo acceso", + "last-restart": "รšltimo reinicio", + "load-averages": "Promedios de carga en todos los nรบcleos del procesador", + "local-shares": "Acciones locales", + "local": "local", + "max-keys": "teclas mรกx", + "memory-used": "memoria usada", + "memory-utilisation": "utilizaciรณn de memoria", + "memory": "memoria", + "misses": "fallos", + "no-notifications": "Sin notificaciones", + "no-pending-updates": "no hay actualizaciones pendientes", + "nothing-to-show": "Nada que mostrar aquรญ en este momento", + "of-which": "de los cuales", + "of": "de", + "offline": "Fuera de lรญnea", + "online": "En lรญnea", + "other": "otros", + "overall": "En general", + "private-link": "enlace privado", + "public-link": "enlace pรบblico", + "quota-enabled": "La cuota de disco {no} estรก habilitado para este usuario", + "received": "recibido", + "scripts": "scripts", + "sent": "enviado", + "started": "Iniciado", + "storages-by-type": "Almacenamientos por tipo", + "storages": "almacenamiento/s", + "strings-use": "uso de cadenas", + "tasks": "Tareas", + "total-files": "total de archivos", + "total-users": "total de usuarios", + "total": "total", + "until": "Hasta", + "updates-available-for": "Las actualizaciones estรกn disponibles para", + "updates-available": "actualizacion/es disponible", + "used": "usado", + "user": "usuario", + "using": "usando", + "version": "versiรณn", + "wasted": "gastado" + } + } +} diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json index 872fbbf378..2a2fd8e198 100644 --- a/src/assets/locales/fr.json +++ b/src/assets/locales/fr.json @@ -1,446 +1,420 @@ -{ - "home": { - "no-results": "Aucun rรฉsultat", - "no-data": "Aucune donnรฉe configurรฉe", - "no-items-section": "Encore aucun รฉlรฉment ร  afficher" - }, - "search": { - "search-label": "Rechercher", - "search-placeholder": "Commencez ร  taper pour filtrer", - "clear-search-tooltip": "Effacer la recherche", - "enter-to-search-web": "Appuyez sur entrรฉe pour rechercher sur le Web" - }, - "splash-screen": { - "loading": "Chargement" - }, - "login": { - "title": "Dashy", - "guest-label": "Accรจs invitรฉ", - "username-label": "Nom d'utilisateur", - "password-label": "Mot de passe", - "login-button": "Connexion", - "remember-me-label": "Se souvenir de moi", - "remember-me-never": "Jamais", - "remember-me-hour": "4 heures", - "remember-me-day": "1 jour", - "remember-me-week": "1 semaine", - "remember-me-long-time": "Un long moment", - "error-missing-username": "Nom d'utilisateur manquant", - "error-missing-password": "Mot de passe manquant", - "error-incorrect-username": "Utilisateur inexistant", - "error-incorrect-password": "Mot de passe incorrect", - "success-message": "Connexion ...", - "logout-message": "Dรฉconnexion", - "already-logged-in-title": "Dรฉjร  connectรฉ", - "already-logged-in-text": "Vous รชtes connectรฉ en tant que", - "proceed-to-dashboard": "Accรฉder au Tableau de bord", - "log-out-button": "Dรฉconnexion", - "proceed-guest-button": "Continuer en tant qu'invitรฉ", - "guest-intro-1": "L'accรจs invitรฉ est activรฉ pour cette instance.", - "guest-intro-2": "Les invitรฉs n'ont qu'un accรจs en mode lecture aux tableaux de bord, et ne peuvent donc pas รฉcrire de modifications sur le disque.", - "error": "Erreur", - "error-no-user-configured": "L'authentification n'est pas activรฉe ou aucun utilisateur n'a รฉtรฉ configurรฉ.", - "error-go-home-button": "Retour ร  l'accueil", - "logged-in-guest": "Connectรฉ en tant qu'invitรฉ, redirection...", - "error-guest-access": "L'accรจs invitรฉ n'est pas autorisรฉ" - }, - "app-info": { - "title": "Informations sur l'application", - "error-log": "Journal des erreurs", - "no-errors": "Aucune erreur rรฉcente dรฉtectรฉe", - "help-support": "Aide & Support", - "help-support-description" : "Pour obtenir de l'aide pour faire tourner ou configurer Dashy, voir les", - "help-support-discussions": "discussions", - "support-dashy": "Soutenir Dashy", - "support-dashy-description": "Pour savoir comment vous pouvez vous impliquer, consultez la page", - "support-dashy-link": "ยซย Contributionsย ยป", - "report-bug": "Signaler un bug", - "report-bug-description": "Si vous pensez avoir trouvรฉ un bug, alors s'il vous plaรฎt,ย ", - "report-bug-link": "signalez-le", - "more-info": "Plus d'informations", - "source": "Sourceย ", - "documentation": "Documentationย ", - "privacy-and-security": "Vie privรฉe & Sรฉcuritรฉ", - "privacy-and-security-l1": "Pour connaรฎtre la maniรจre dont vos donnรฉes sont gรฉrรฉes par Dashy, consultez la", - "privacy-and-security-privacy-policy": "politique de confidentialitรฉ", - "privacy-and-security-advice": "Pour obtenir des conseils sur la sรฉcurisation de votre tableau de bord, vous pouvez vous rรฉfรฉrer ร  la", - "privacy-and-security-advice-link": "documentation", - "privacy-and-security-security-issue": "Si vous avez trouvรฉ une potentielle faille de sรฉcuritรฉ, signalez-la en suivant notre", - "privacy-and-security-security-policy": "politique en matiรจre de sรฉcuritรฉ", - "license": "Licence", - "license-under": "Sous licence", - "licence-third-party": "Pour les licences des modules tiers, veuillez consulter", - "licence-third-party-link": "le document juridique", - "list-contributors": "Pour la liste complรจte des contributeurs et les remerciements, voir", - "list-contributors-link": "les crรฉdits", - "version": "Version" - }, - "config": { - "main-tab": "Menu principal", - "view-config-tab": "Afficher la configuration", - "edit-config-tab": "Modifier la configuration", - "custom-css-tab": "Styles personnalisรฉs", - "heading": "Options de configuration", - "download-config-button": "Voir / tรฉlรฉcharger la configuration", - "edit-config-button": "Modifier la configuration", - "edit-css-button": "Styles personnalisรฉs", - "cloud-sync-button": "Activer la synchro. dans le cloud", - "edit-cloud-sync-button": "Modifier la synchro. dans le cloud", - "rebuild-app-button": "Reconstruire l'application", - "change-language-button": "Changer la langue", - "reset-settings-button": "Rรฉinitialiser les paramรจtres locaux", - "disabled-note": "Certaines fonctionnalitรฉs de configuration ont รฉtรฉ dรฉsactivรฉes par votre administrateur", - "small-screen-note": "Vous utilisez un trรจs petit รฉcran, et certains menus peuvent ne pas apparaรฎtre de maniรจre optimale", - "app-info-button": "Informations sur l'application", - "backup-note": "Il est recommandรฉ de faire une sauvegarde de votre configuration avant d'apporter des modifications.", - "reset-config-msg-l1": "Cela supprimera tous les paramรจtres utilisateur du stockage local, mais n'affectera pas votre fichier 'conf.yml'.", - "reset-config-msg-l2": "Vous devez d'abord sauvegarder toutes les modifications locales si vous souhaitez les utiliser ร  l'avenir.", - "reset-config-msg-l3": "รŠtes-vous sรปr de vouloir continuer ?", - "data-cleared-msg": "Donnรฉes effacรฉes avec succรจs", - "actions-label": "Actions", - "copy-config-label": "Copier la configuration", - "data-copied-msg": "La configuration a รฉtรฉ copiรฉe dans le presse-papiers", - "reset-config-label": "Rรฉinitialiser la configuration", - "css-save-btn": "Enregistrer", - "css-note-label": "Note", - "css-note-l1": "Vous devrez actualiser la page pour que les modifications prennent effet.", - "css-note-l2": "Les modifications ne sont stockรฉes que localement, il est donc recommandรฉ de faire une copie de votre CSS.", - "css-note-l3": "Pour supprimer tous les styles personnalisรฉs, supprimez le contenu et appuyez sur Enregistrer.", - "custom-css": { - "title": "CSS personnalisรฉ", - "base-theme": "Thรจme de base" - } - }, - "alternate-views": { - "alternate-view-heading": "Changer le mode d'affichage", - "default": "Par dรฉfaut", - "workspace": "Espace de travail", - "minimal": "ร‰purรฉ" - }, - "settings": { - "theme-label": "Thรจme", - "layout-label": "Disposition", - "layout-auto": "Automatique", - "layout-horizontal": "Horizontale", - "layout-vertical": "Verticale", - "item-size-label": "Taille", - "item-size-small": "Petite", - "item-size-medium": "Moyenne", - "item-size-large": "Grande", - "config-launcher-label": "Configuration", - "config-launcher-tooltip": "Modifier la configuration", - "sign-out-tooltip": "Dรฉconnexion", - "sign-in-tooltip": "Connexion", - "sign-in-welcome": "Bonjour {username}ย !", - "hide": "Masquer", - "open": "Ouvrir" - }, - "updates": { - "app-version-note": "Version de Dashy", - "up-to-date": "ร€ jour", - "out-of-date": "Mise ร  jour disponibleย !", - "unsupported-version-l1": "Vous utilisez une version non prise en charge de Dashy", - "unsupported-version-l2": "Pour une meilleure expรฉrience et des correctifs de sรฉcuritรฉ rรฉcents, veuillez mettre ร  jour vers" - }, - "language-switcher": { - "title": "Changer la langue", - "dropdown-label": "Sรฉlectionnez une langueย ", - "save-button": "Enregistrer", - "success-msg": "Langue mise ร  jour vers" - }, - "theme-maker": { - "title": "Configurateur de thรจmes", - "export-button": "Exporter des variables personnalisรฉes", - "reset-button": "Rรฉinitialiser les styles pour", - "show-all-button": "Afficher toutes les variables", - "change-fonts-button": "Changer les polices d'รฉcritures", - "save-button": "Enregistrer", - "cancel-button": "Annuler", - "saved-toast": "{theme} mis ร  jour avec succรจs", - "copied-toast": "Donnรฉes du thรจme {theme} copiรฉes dans le presse-papiers", - "reset-toast": "Couleurs personnalisรฉes pour {theme} supprimรฉes" - }, - "config-editor": { - "save-location-label": "Enregistrer localement", - "location-local-label": "Appliquer localement", - "location-disk-label": "Appliquer dans le fichier de configuration", - "save-button": "Enregistrer", - "preview-button": "Prรฉvisualiser les modifications", - "valid-label": "La configuration est valide", - "status-success-msg": "Tรขche terminรฉe", - "status-fail-msg": "ร‰chec de la tรขche", - "success-msg-disk": "Le fichier de configuration est รฉcrit avec succรจs sur le disque", - "success-msg-local": "Les modifications locales ont bien รฉtรฉ enregistrรฉes", - "success-note-l1": "L'application devrait se reconstruire automatiquement.", - "success-note-l2": "Cela peut prendre une minute.", - "success-note-l3": "Vous devrez actualiser la page pour que les modifications prennent effet.", - "error-msg-save-mode": "Veuillez sรฉlectionner un mode d'enregistrement : Local ou Fichier", - "error-msg-cannot-save": "Une erreur s'est produite lors de l'enregistrement de la configuration", - "error-msg-bad-json": "Erreur dans le fichier JSON, il est peut-รชtre mal formรฉ", - "warning-msg-validation": "Attention", - "not-admin-note": "Vous ne pouvez pas รฉcrire les modifications sur le disque, car vous n'รชtes pas connectรฉ en tant qu'administrateur" - }, - "app-rebuild": { - "title": "Reconstruction de l'application", - "rebuild-note-l1": "Une reconstruction est requise pour que les modifications รฉcrites dans le fichier conf.yml prennent effet.", - "rebuild-note-l2": "Cela devrait se produire automatiquement, mais si ce n'est pas le cas, vous pouvez le dรฉclencher manuellement ici.", - "rebuild-note-l3": "Ceci n'est pas nรฉcessaire pour les modifications stockรฉes localement.", - "rebuild-button": "Dรฉmarrer la reconstruction", - "rebuilding-status-1": "Reconstruction ...", - "rebuilding-status-2": "Cela peut prendre quelques minutes", - "error-permission": "Vous n'รชtes pas autorisรฉ ร  executer cette action", - "success-msg": "Construction terminรฉe avec succรจs", - "fail-msg": "ร‰chec de la construction", - "reload-note": "Un rechargement de la page est maintenant requis pour que les modifications prennent effet", - "reload-button": "Rafraรฎchir la page" - }, - "cloud-sync": { - "title": "Sauvegarde Cloud & Restauration", - "intro-l1": "Ce service de sauvegarde et de restauration depuis le cloud est une fonctionnalitรฉ facultative qui vous permet de tรฉlรฉcharger votre configuration sur Internet, puis de la restaurer sur n'importe quel autre appareil ou instance de Dashy.", - "intro-l2": "Toutes les donnรฉes sont entiรจrement chiffrรฉes de bout en bout avec le protocole AES, en utilisant votre mot de passe comme clรฉ.", - "intro-l3": "Pour plus d'informations, veuillez consulter la", - "intro-docs": "documentation", - "backup-title-setup": "Sauvegarde", - "backup-title-update": "Mettre ร  jour la sauvegarde", - "password-label-setup": "Choisissez un mot de passe", - "password-label-update": "Entrer votre mot de passe", - "backup-button-setup": "Sauvegarder", - "backup-button-update": "Mettre ร  jour la sauvegarde", - "backup-id-label": "Votre identifiant de sauvegarde", - "backup-id-note": "Il vous sera demandรฉ par la suite pour restaurer ร  partir de votre sauvegarde. Alors gardez-le, avec votre mot de passe dans un endroit sรปr.", - "restore-title": "Restauration", - "restore-id-label": "Identifiant de sauvegarde", - "restore-password-label": "Mot de passe", - "restore-button": "Restaurer", - "backup-missing-password": "Mot de passe manquant", - "backup-error-unknown": "Impossible de traiter la demande", - "backup-error-password": "Mot de passe incorrect. Veuillez saisir votre mot de passe actuel.", - "backup-success-msg": "Sauvegarde effectuรฉe avec succรจs", - "restore-success-msg": "Configuration restaurรฉe avec succรจs" - }, - "menu": { - "open-section-title": "Ouvrir ...", - "sametab": "Ouvrir dans l'onglet actuel", - "newtab": "Ouvrir dans un nouvel onglet", - "modal": "Ouvrir en mode fenรชtrรฉ", - "workspace": "Ouvrir en plein รฉcran", - "options-section-title": "Options", - "edit-item": "Modifier", - "move-item": "Copier et Dรฉplacer", - "remove-item": "Supprimer" - }, - "context-menus": { - "item": { - "open-section-title": "Ouvrir ...", - "sametab": "Ouvrir dans l'onglet actuel", - "newtab": "Ouvrir dans un nouvel onglet", - "modal": "Ouvrir en mode fenรชtrรฉ", - "workspace": "Ouvrir en plein รฉcran", - "clipboard": "Copier vers le presse le presse-papiers", - "options-section-title": "Options", - "edit-item": "Modifier", - "move-item": "Copier et dรฉplacer", - "remove-item": "Supprimer", - "copied-toast": "L'URL a รฉtรฉ copiรฉe dans le presse-papies" - }, - "section": { - "open-section": "Ouvrir", - "edit-section": "Modifier", - "expand-collapse": "Dรฉvelopper / Rรฉduire", - "move-section": "Dรฉplacer vers", - "remove-section": "Supprimer" - } - }, - "footer": { - "dev-by": "Dรฉveloppรฉ par", - "licensed-under": "Sous licence", - "get-the": "Obtenir le", - "source-code": "code source" - }, - "interactive-editor": { - "menu": { - "start-editing-tooltip": "Entrer dans l'รฉditeur interactif", - "edit-site-data-subheading": "Modifier l'application", - "edit-page-info-btn": "Modifier les informations", - "edit-page-info-tooltip": "Titre de l'application, description, liens de navigation, texte de pied de page, etc.", - "edit-app-config-btn": "Modifier la configuration", - "edit-app-config-tooltip": "Toutes les autres options de configuration", - "edit-pages-btn": "ร‰diter les pages", - "edit-pages-tooltip": "Ajouter ou supprimer des vues supplรฉmentaires", - "config-save-methods-subheading": "Options de sauvegarde", - "save-locally-btn": "Enregistrer localement", - "save-locally-tooltip": "Enregistre la configuration localement, dans le stockage du navigateur. Cela n'affectera pas votre fichier de configuration, mais les modifications ne seront prรฉsentes que sur cet appareil", - "save-disk-btn": "Enregistrer sur le disque", - "save-disk-tooltip": "Enregistre la configuration dans le fichier conf.yml sur le disque. Cela sauvegardera, puis รฉcrasera votre configuration existante", - "export-config-btn": "Exporter la configuration", - "export-config-tooltip": "Affiche et exporte la nouvelle configuration, soit dans un fichier, soit dans le presse-papiers", - "cloud-backup-btn": "Sauvegarde sur le cloud", - "cloud-backup-tooltip": "Sauvegarde chiffrรฉe de la configuration dans le cloud", - "edit-raw-config-btn": "ร‰diter la configuration brute", - "edit-raw-config-tooltip": "Voir et modifier la configuration brute via l'รฉditeur JSON", - "cancel-changes-btn": "Annuler", - "cancel-changes-tooltip": "Rรฉinitialise les modifications en cours et quittez le mode d'รฉdition. Cela n'affectera pas votre configuration enregistrรฉe", - "edit-mode-name": "ร‰diteur interactif", - "edit-mode-subtitle": "Vous รชtes en mode d'รฉdition", - "edit-mode-description": "Vous pouvez apporter des modifications ร  votre configuration et prรฉvisualiser les rรฉsultats, mais jusqu'ร  ce que vous sauvegardiez, aucune de vos modifications ne sera conservรฉe.", - "save-stage-btn": "Enregistrer", - "cancel-stage-btn": "Annuler", - "save-locally-warning": "Si vous poursuivez, les modifications seront uniquement sauvegardรฉs dans votre navigateur. Vous devriez exporter une copie de votre configuration pour รชtre utilisรฉe sur d'autres machines. Voulez-vous continuerย ?" - }, - "edit-item": { - "missing-title-err": "Le titre de l'รฉlรฉment est requis" - }, - "edit-section": { - "edit-section-title": "ร‰diteur de section", - "add-section-title": "Ajouter une section", - "edit-tooltip": "Cliquer pour modifier ou cliquer droit pour plus d'options", - "remove-confirm": "Voulez-vous vraiment supprimer cette section ? Cette action peut รชtre annulรฉe ultรฉrieurement." - }, - "edit-app-config": { - "warning-msg-title": "Poursuivre avec prudence", - "warning-msg-l1": "Les options suivantes concernent la configuration avancรฉe de l'application.", - "warning-msg-l2": "Si vous n'รชtes pas sรปr de l'un des champs, veuillez consulter la", - "warning-msg-docs": "documentation", - "warning-msg-l3": "pour รฉviter des consรฉquences inattendues." - }, - "export": { - "export-title": "Exporter la configuration", - "copy-clipboard-btn": "Copier dans le presse-papiers", - "copy-clipboard-tooltip": "Copier la configuration complรจte de l'application sur votre appareil dans un fichier YAML", - "download-file-btn": "Tรฉlรฉcharger le fichier", - "download-file-tooltip": "Tรฉlรฉcharge la configuration complรจte de l'application sur votre appareil dans un fichier YAML", - "view-title": "Affichage de la configuration" - } - }, - "widgets": { - "general": { - "loading": "Chargement ...", - "show-more": "Dรฉvelopper les dรฉtails", - "show-less": "Montrer moins", - "open-link": "Lire la suite" - }, - "pi-hole": { - "status-heading": "Statut" - }, - "stat-ping": { - "up": "En ligne", - "down": "Hors ligne" - }, - "net-data": { - "cpu-chart-title": "Historique CPU", - "mem-chart-title": "Utilisation de la mรฉmoire", - "mem-breakdown-title": "Rupture mรฉmoire", - "load-chart-title": "Charge du systรจme" - }, - "glances": { - "disk-space-free": "Libre", - "disk-space-used": "Utilisรฉ", - "disk-mount-point": "Point de montage", - "disk-file-system": "Systรจme de fichiers", - "disk-io-read": "Lecture", - "disk-io-write": "ร‰criture", - "system-load-desc": "Nombre de processus en attente dans la file d'attente, moyenne sur tous les cล“urs" - }, - "system-info": { - "uptime": "Temps de fonctionnement" - }, - "flight-data": { - "arrivals": "Arrivรฉes", - "departures": "Dรฉparts" - }, - "tfl-status": { - "good-service-all": "Bon service sur toutes les lignes", - "good-service-rest": "Bon service sur toutes les autres lignes" - }, - "synology-download": { - "download": "Tรฉlรฉchargement", - "upload": "Envoi", - "downloaded": "Tรฉlรฉchargรฉ", - "uploaded": "Envoyer", - "remaining": "Restant", - "up": "Up", - "down": "Down" - }, - "gluetun-status": { - "vpn-ip": "VPN IP", - "country": "Pays", - "region": "Rรฉgion", - "city": "Ville", - "post-code": "Code Postal", - "location": "Localisation", - "timezone": "Fuseau horaire", - "organization": "Organisation" - }, - "nextcloud": { - "active": "actif", - "and": "et", - "applications": "applications", - "available": "disponible", - "away": "Away", - "cache-full": "CACHE PLEIN", - "chat-room": "salon de discussion", - "delete-all": "Supprimer tout", - "delete-notification": "Supprimer la notification", - "disabled": "dรฉsactivรฉ", - "disk-quota": "Quota", - "disk-space": "Espace disque", - "dnd": "Ne pas dรฉranger", - "email": "email", - "enabled": "activรฉ", - "federated-shares-ucfirst": "Partages Fรฉdรฉrรฉs", - "federated-shares": "partage fรฉdรฉrรฉ", - "files": "fichier{plural}", - "free": "libre", - "groups": "groupes", - "hit-rate": "hit rate", - "hits": "hits", - "home": "home", - "in": "in", - "keys": "keys", - "last-24-hours": "24 derniรจres heures", - "last-5-minutes": "dans les 5 derniรจres minutes", - "last-hour": "dans la derniรจre heure", - "last-login": "Derniรจre connexion", - "last-restart": "Dernier redรฉmarrage", - "load-averages": "Charge moyenne sur l'ensemble des coeurs du CPU", - "local-shares": "Partage locaux", - "local": "local", - "max-keys": "max keys", - "memory-used": "mรฉmoire utilisรฉe", - "memory-utilisation": "utilisation de la mรฉmoire", - "memory": "mรฉmoire", - "misses": "misses", - "no-notifications": "Aucune notification", - "no-pending-updates": "aucune mise ร  jour en attente", - "nothing-to-show": "Rien ร  afficher pour l'instant", - "of-which": "of which", - "of": "of", - "offline": "Hors ligne", - "online": "En ligne", - "other": "autre", - "overall": "Overall", - "private-link": "lien privรฉ", - "public-link": "lien public", - "quota-enabled": "Disk Quota is {not}enabled for this user", - "received": "received", - "scripts": "scripts", - "sent": "sent", - "started": "Started", - "storages-by-type": "Storages by type", - "storages": "stockage{plural}", - "strings-use": "strings use", - "tasks": "Tรขches", - "total-files": "total files", - "total-users": "total users", - "total": "total", - "until": "Until", - "updates-available-for": "Des mises ร  jour sont disponibles pour", - "updates-available": "mise{plural} ร  jour disponible", - "used": "used", - "user": "user", - "using": "using", - "version": "version", - "wasted": "wasted" - } - } -} +{ + "home": { + "no-results": "Aucun rรฉsultat", + "no-data": "Aucune donnรฉe configurรฉe", + "no-items-section": "Encore aucun รฉlรฉment ร  afficher" + }, + "search": { + "search-label": "Rechercher", + "search-placeholder": "Commencez ร  taper pour filtrer", + "clear-search-tooltip": "Effacer la recherche", + "enter-to-search-web": "Appuyez sur entrรฉe pour rechercher sur le Web" + }, + "splash-screen": { + "loading": "Chargement" + }, + "login": { + "title": "Dashy", + "guest-label": "Accรจs invitรฉ", + "username-label": "Nom d'utilisateur", + "password-label": "Mot de passe", + "login-button": "Connexion", + "remember-me-label": "Se souvenir de moi", + "remember-me-never": "Jamais", + "remember-me-hour": "4 heures", + "remember-me-day": "1 jour", + "remember-me-week": "1 semaine", + "remember-me-long-time": "Un long moment", + "error-missing-username": "Nom d'utilisateur manquant", + "error-missing-password": "Mot de passe manquant", + "error-incorrect-username": "Utilisateur inexistant", + "error-incorrect-password": "Mot de passe incorrect", + "success-message": "Connexion ...", + "logout-message": "Dรฉconnexion", + "already-logged-in-title": "Dรฉjร  connectรฉ", + "already-logged-in-text": "Vous รชtes connectรฉ en tant que", + "proceed-to-dashboard": "Accรฉder au Tableau de bord", + "log-out-button": "Dรฉconnexion", + "proceed-guest-button": "Continuer en tant qu'invitรฉ", + "guest-intro-1": "L'accรจs invitรฉ est activรฉ pour cette instance.", + "guest-intro-2": "Les invitรฉs n'ont qu'un accรจs en mode lecture aux tableaux de bord, et ne peuvent donc pas รฉcrire de modifications sur le disque.", + "error": "Erreur", + "error-no-user-configured": "L'authentification n'est pas activรฉe ou aucun utilisateur n'a รฉtรฉ configurรฉ.", + "error-go-home-button": "Retour ร  l'accueil", + "logged-in-guest": "Connectรฉ en tant qu'invitรฉ, redirection...", + "error-guest-access": "L'accรจs invitรฉ n'est pas autorisรฉ" + }, + "app-info": { + "title": "Informations sur l'application", + "support-dashy": "Soutenir Dashy", + "support-dashy-description": "Pour savoir comment vous pouvez vous impliquer, consultez la page", + "support-dashy-link": "ยซย Contributionsย ยป", + "report-bug": "Signaler un bug", + "report-bug-description": "Si vous pensez avoir trouvรฉ un bug, alors s'il vous plaรฎt,ย ", + "report-bug-link": "signalez-le", + "more-info": "Plus d'informations", + "source": "Sourceย ", + "documentation": "Documentationย ", + "privacy-and-security": "Vie privรฉe & Sรฉcuritรฉ", + "privacy-and-security-l1": "Pour connaรฎtre la maniรจre dont vos donnรฉes sont gรฉrรฉes par Dashy, consultez la", + "privacy-and-security-privacy-policy": "politique de confidentialitรฉ", + "privacy-and-security-advice": "Pour obtenir des conseils sur la sรฉcurisation de votre tableau de bord, vous pouvez vous rรฉfรฉrer ร  la", + "privacy-and-security-advice-link": "documentation", + "privacy-and-security-security-issue": "Si vous avez trouvรฉ une potentielle faille de sรฉcuritรฉ, signalez-la en suivant notre", + "privacy-and-security-security-policy": "politique en matiรจre de sรฉcuritรฉ", + "license": "Licence", + "license-under": "Sous licence", + "licence-third-party": "Pour les licences des modules tiers, veuillez consulter", + "licence-third-party-link": "le document juridique", + "list-contributors": "Pour la liste complรจte des contributeurs et les remerciements, voir", + "list-contributors-link": "les crรฉdits", + "version": "Version" + }, + "config": { + "main-tab": "Menu principal", + "view-config-tab": "Afficher la configuration", + "edit-config-tab": "Modifier la configuration", + "custom-css-tab": "Styles personnalisรฉs", + "heading": "Options de configuration", + "download-config-button": "Voir / tรฉlรฉcharger la configuration", + "edit-config-button": "Modifier la configuration", + "edit-css-button": "Styles personnalisรฉs", + "cloud-sync-button": "Activer la synchro. dans le cloud", + "edit-cloud-sync-button": "Modifier la synchro. dans le cloud", + "change-language-button": "Changer la langue", + "reset-settings-button": "Rรฉinitialiser les paramรจtres locaux", + "disabled-note": "Certaines fonctionnalitรฉs de configuration ont รฉtรฉ dรฉsactivรฉes par votre administrateur", + "small-screen-note": "Vous utilisez un trรจs petit รฉcran, et certains menus peuvent ne pas apparaรฎtre de maniรจre optimale", + "app-info-button": "Informations sur l'application", + "backup-note": "Il est recommandรฉ de faire une sauvegarde de votre configuration avant d'apporter des modifications.", + "reset-config-msg-l1": "Cela supprimera tous les paramรจtres utilisateur du stockage local, mais n'affectera pas votre fichier 'conf.yml'.", + "reset-config-msg-l2": "Vous devez d'abord sauvegarder toutes les modifications locales si vous souhaitez les utiliser ร  l'avenir.", + "reset-config-msg-l3": "รŠtes-vous sรปr de vouloir continuer ?", + "data-cleared-msg": "Donnรฉes effacรฉes avec succรจs", + "actions-label": "Actions", + "copy-config-label": "Copier la configuration", + "data-copied-msg": "La configuration a รฉtรฉ copiรฉe dans le presse-papiers", + "reset-config-label": "Rรฉinitialiser la configuration", + "css-save-btn": "Enregistrer", + "css-note-label": "Note", + "css-note-l1": "Vous devrez actualiser la page pour que les modifications prennent effet.", + "css-note-l2": "Les modifications ne sont stockรฉes que localement, il est donc recommandรฉ de faire une copie de votre CSS.", + "css-note-l3": "Pour supprimer tous les styles personnalisรฉs, supprimez le contenu et appuyez sur Enregistrer.", + "custom-css": { + "title": "CSS personnalisรฉ", + "base-theme": "Thรจme de base" + } + }, + "alternate-views": { + "alternate-view-heading": "Changer le mode d'affichage", + "default": "Par dรฉfaut", + "workspace": "Espace de travail", + "minimal": "ร‰purรฉ" + }, + "settings": { + "theme-label": "Thรจme", + "layout-label": "Disposition", + "layout-auto": "Automatique", + "layout-horizontal": "Horizontale", + "layout-vertical": "Verticale", + "item-size-label": "Taille", + "item-size-small": "Petite", + "item-size-medium": "Moyenne", + "item-size-large": "Grande", + "config-launcher-label": "Configuration", + "config-launcher-tooltip": "Modifier la configuration", + "sign-out-tooltip": "Dรฉconnexion", + "sign-in-tooltip": "Connexion", + "sign-in-welcome": "Bonjour {username}ย !", + "hide": "Masquer", + "open": "Ouvrir" + }, + "updates": { + "app-version-note": "Version de Dashy", + "up-to-date": "ร€ jour", + "out-of-date": "Mise ร  jour disponibleย !", + "unsupported-version-l1": "Vous utilisez une version non prise en charge de Dashy", + "unsupported-version-l2": "Pour une meilleure expรฉrience et des correctifs de sรฉcuritรฉ rรฉcents, veuillez mettre ร  jour vers" + }, + "language-switcher": { + "title": "Changer la langue", + "dropdown-label": "Sรฉlectionnez une langueย ", + "save-button": "Enregistrer", + "success-msg": "Langue mise ร  jour vers" + }, + "theme-maker": { + "title": "Configurateur de thรจmes", + "export-button": "Exporter des variables personnalisรฉes", + "reset-button": "Rรฉinitialiser les styles pour", + "show-all-button": "Afficher toutes les variables", + "change-fonts-button": "Changer les polices d'รฉcritures", + "save-button": "Enregistrer", + "cancel-button": "Annuler", + "saved-toast": "{theme} mis ร  jour avec succรจs", + "copied-toast": "Donnรฉes du thรจme {theme} copiรฉes dans le presse-papiers", + "reset-toast": "Couleurs personnalisรฉes pour {theme} supprimรฉes" + }, + "config-editor": { + "save-location-label": "Enregistrer localement", + "location-local-label": "Appliquer localement", + "location-disk-label": "Appliquer dans le fichier de configuration", + "save-button": "Enregistrer", + "preview-button": "Prรฉvisualiser les modifications", + "valid-label": "La configuration est valide", + "status-success-msg": "Tรขche terminรฉe", + "status-fail-msg": "ร‰chec de la tรขche", + "success-msg-disk": "Le fichier de configuration est รฉcrit avec succรจs sur le disque", + "success-msg-local": "Les modifications locales ont bien รฉtรฉ enregistrรฉes", + "success-note-l1": "L'application devrait se reconstruire automatiquement.", + "success-note-l2": "Cela peut prendre une minute.", + "success-note-l3": "Vous devrez actualiser la page pour que les modifications prennent effet.", + "error-msg-save-mode": "Veuillez sรฉlectionner un mode d'enregistrement : Local ou Fichier", + "error-msg-cannot-save": "Une erreur s'est produite lors de l'enregistrement de la configuration", + "error-msg-bad-json": "Erreur dans le fichier JSON, il est peut-รชtre mal formรฉ", + "warning-msg-validation": "Attention", + "not-admin-note": "Vous ne pouvez pas รฉcrire les modifications sur le disque, car vous n'รชtes pas connectรฉ en tant qu'administrateur" + }, + "cloud-sync": { + "title": "Sauvegarde Cloud & Restauration", + "intro-l1": "Ce service de sauvegarde et de restauration depuis le cloud est une fonctionnalitรฉ facultative qui vous permet de tรฉlรฉcharger votre configuration sur Internet, puis de la restaurer sur n'importe quel autre appareil ou instance de Dashy.", + "intro-l2": "Toutes les donnรฉes sont entiรจrement chiffrรฉes de bout en bout avec le protocole AES, en utilisant votre mot de passe comme clรฉ.", + "intro-l3": "Pour plus d'informations, veuillez consulter la", + "intro-docs": "documentation", + "backup-title-setup": "Sauvegarde", + "backup-title-update": "Mettre ร  jour la sauvegarde", + "password-label-setup": "Choisissez un mot de passe", + "password-label-update": "Entrer votre mot de passe", + "backup-button-setup": "Sauvegarder", + "backup-button-update": "Mettre ร  jour la sauvegarde", + "backup-id-label": "Votre identifiant de sauvegarde", + "backup-id-note": "Il vous sera demandรฉ par la suite pour restaurer ร  partir de votre sauvegarde. Alors gardez-le, avec votre mot de passe dans un endroit sรปr.", + "restore-title": "Restauration", + "restore-id-label": "Identifiant de sauvegarde", + "restore-password-label": "Mot de passe", + "restore-button": "Restaurer", + "backup-missing-password": "Mot de passe manquant", + "backup-error-unknown": "Impossible de traiter la demande", + "backup-error-password": "Mot de passe incorrect. Veuillez saisir votre mot de passe actuel.", + "backup-success-msg": "Sauvegarde effectuรฉe avec succรจs", + "restore-success-msg": "Configuration restaurรฉe avec succรจs" + }, + "menu": { + "open-section-title": "Ouvrir ...", + "sametab": "Ouvrir dans l'onglet actuel", + "newtab": "Ouvrir dans un nouvel onglet", + "modal": "Ouvrir en mode fenรชtrรฉ", + "workspace": "Ouvrir en plein รฉcran", + "options-section-title": "Options", + "edit-item": "Modifier", + "move-item": "Copier et Dรฉplacer", + "remove-item": "Supprimer" + }, + "context-menus": { + "item": { + "open-section-title": "Ouvrir ...", + "sametab": "Ouvrir dans l'onglet actuel", + "newtab": "Ouvrir dans un nouvel onglet", + "modal": "Ouvrir en mode fenรชtrรฉ", + "workspace": "Ouvrir en plein รฉcran", + "clipboard": "Copier vers le presse le presse-papiers", + "options-section-title": "Options", + "edit-item": "Modifier", + "move-item": "Copier et dรฉplacer", + "remove-item": "Supprimer", + "copied-toast": "L'URL a รฉtรฉ copiรฉe dans le presse-papies" + }, + "section": { + "open-section": "Ouvrir", + "edit-section": "Modifier", + "expand-collapse": "Dรฉvelopper / Rรฉduire", + "move-section": "Dรฉplacer vers", + "remove-section": "Supprimer" + } + }, + "interactive-editor": { + "menu": { + "start-editing-tooltip": "Entrer dans l'รฉditeur interactif", + "edit-site-data-subheading": "Modifier l'application", + "edit-page-info-btn": "Modifier les informations", + "edit-page-info-tooltip": "Titre de l'application, description, liens de navigation, texte de pied de page, etc.", + "edit-app-config-btn": "Modifier la configuration", + "edit-app-config-tooltip": "Toutes les autres options de configuration", + "edit-pages-btn": "ร‰diter les pages", + "edit-pages-tooltip": "Ajouter ou supprimer des vues supplรฉmentaires", + "config-save-methods-subheading": "Options de sauvegarde", + "save-locally-btn": "Enregistrer localement", + "save-locally-tooltip": "Enregistre la configuration localement, dans le stockage du navigateur. Cela n'affectera pas votre fichier de configuration, mais les modifications ne seront prรฉsentes que sur cet appareil", + "save-disk-btn": "Enregistrer sur le disque", + "save-disk-tooltip": "Enregistre la configuration dans le fichier conf.yml sur le disque. Cela sauvegardera, puis รฉcrasera votre configuration existante", + "export-config-btn": "Exporter la configuration", + "export-config-tooltip": "Affiche et exporte la nouvelle configuration, soit dans un fichier, soit dans le presse-papiers", + "cloud-backup-btn": "Sauvegarde sur le cloud", + "cloud-backup-tooltip": "Sauvegarde chiffrรฉe de la configuration dans le cloud", + "edit-raw-config-btn": "ร‰diter la configuration brute", + "edit-raw-config-tooltip": "Voir et modifier la configuration brute via l'รฉditeur JSON", + "cancel-changes-btn": "Annuler", + "cancel-changes-tooltip": "Rรฉinitialise les modifications en cours et quittez le mode d'รฉdition. Cela n'affectera pas votre configuration enregistrรฉe", + "edit-mode-name": "ร‰diteur interactif", + "edit-mode-subtitle": "Vous รชtes en mode d'รฉdition", + "edit-mode-description": "Vous pouvez apporter des modifications ร  votre configuration et prรฉvisualiser les rรฉsultats, mais jusqu'ร  ce que vous sauvegardiez, aucune de vos modifications ne sera conservรฉe.", + "save-stage-btn": "Enregistrer", + "cancel-stage-btn": "Annuler", + "save-locally-warning": "Si vous poursuivez, les modifications seront uniquement sauvegardรฉs dans votre navigateur. Vous devriez exporter une copie de votre configuration pour รชtre utilisรฉe sur d'autres machines. Voulez-vous continuerย ?" + }, + "edit-item": { + "missing-title-err": "Le titre de l'รฉlรฉment est requis" + }, + "edit-section": { + "edit-section-title": "ร‰diteur de section", + "add-section-title": "Ajouter une section", + "edit-tooltip": "Cliquer pour modifier ou cliquer droit pour plus d'options", + "remove-confirm": "Voulez-vous vraiment supprimer cette section ? Cette action peut รชtre annulรฉe ultรฉrieurement." + }, + "edit-app-config": { + "warning-msg-title": "Poursuivre avec prudence", + "warning-msg-l1": "Les options suivantes concernent la configuration avancรฉe de l'application.", + "warning-msg-l2": "Si vous n'รชtes pas sรปr de l'un des champs, veuillez consulter la", + "warning-msg-docs": "documentation", + "warning-msg-l3": "pour รฉviter des consรฉquences inattendues." + }, + "export": { + "export-title": "Exporter la configuration", + "copy-clipboard-btn": "Copier dans le presse-papiers", + "copy-clipboard-tooltip": "Copier la configuration complรจte de l'application sur votre appareil dans un fichier YAML", + "download-file-btn": "Tรฉlรฉcharger le fichier", + "download-file-tooltip": "Tรฉlรฉcharge la configuration complรจte de l'application sur votre appareil dans un fichier YAML", + "view-title": "Affichage de la configuration" + } + }, + "widgets": { + "general": { + "loading": "Chargement ...", + "show-more": "Dรฉvelopper les dรฉtails", + "show-less": "Montrer moins", + "open-link": "Lire la suite" + }, + "pi-hole": { + "status-heading": "Statut" + }, + "stat-ping": { + "up": "En ligne", + "down": "Hors ligne" + }, + "net-data": { + "cpu-chart-title": "Historique CPU", + "mem-chart-title": "Utilisation de la mรฉmoire", + "mem-breakdown-title": "Rupture mรฉmoire", + "load-chart-title": "Charge du systรจme" + }, + "glances": { + "disk-space-free": "Libre", + "disk-space-used": "Utilisรฉ", + "disk-mount-point": "Point de montage", + "disk-file-system": "Systรจme de fichiers", + "disk-io-read": "Lecture", + "disk-io-write": "ร‰criture", + "system-load-desc": "Nombre de processus en attente dans la file d'attente, moyenne sur tous les cล“urs" + }, + "system-info": { + "uptime": "Temps de fonctionnement" + }, + "flight-data": { + "arrivals": "Arrivรฉes", + "departures": "Dรฉparts" + }, + "tfl-status": { + "good-service-all": "Bon service sur toutes les lignes", + "good-service-rest": "Bon service sur toutes les autres lignes" + }, + "synology-download": { + "download": "Tรฉlรฉchargement", + "upload": "Envoi", + "downloaded": "Tรฉlรฉchargรฉ", + "uploaded": "Envoyer", + "remaining": "Restant", + "up": "Up", + "down": "Down" + }, + "gluetun-status": { + "vpn-ip": "VPN IP", + "country": "Pays", + "region": "Rรฉgion", + "city": "Ville", + "post-code": "Code Postal", + "location": "Localisation", + "timezone": "Fuseau horaire", + "organization": "Organisation" + }, + "nextcloud": { + "active": "actif", + "and": "et", + "applications": "applications", + "available": "disponible", + "away": "Away", + "cache-full": "CACHE PLEIN", + "chat-room": "salon de discussion", + "delete-all": "Supprimer tout", + "delete-notification": "Supprimer la notification", + "disabled": "dรฉsactivรฉ", + "disk-quota": "Quota", + "disk-space": "Espace disque", + "dnd": "Ne pas dรฉranger", + "email": "email", + "enabled": "activรฉ", + "federated-shares-ucfirst": "Partages Fรฉdรฉrรฉs", + "federated-shares": "partage fรฉdรฉrรฉ", + "files": "fichier{plural}", + "free": "libre", + "groups": "groupes", + "hit-rate": "hit rate", + "hits": "hits", + "home": "home", + "in": "in", + "keys": "keys", + "last-24-hours": "24 derniรจres heures", + "last-5-minutes": "dans les 5 derniรจres minutes", + "last-hour": "dans la derniรจre heure", + "last-login": "Derniรจre connexion", + "last-restart": "Dernier redรฉmarrage", + "load-averages": "Charge moyenne sur l'ensemble des coeurs du CPU", + "local-shares": "Partage locaux", + "local": "local", + "max-keys": "max keys", + "memory-used": "mรฉmoire utilisรฉe", + "memory-utilisation": "utilisation de la mรฉmoire", + "memory": "mรฉmoire", + "misses": "misses", + "no-notifications": "Aucune notification", + "no-pending-updates": "aucune mise ร  jour en attente", + "nothing-to-show": "Rien ร  afficher pour l'instant", + "of-which": "of which", + "of": "of", + "offline": "Hors ligne", + "online": "En ligne", + "other": "autre", + "overall": "Overall", + "private-link": "lien privรฉ", + "public-link": "lien public", + "quota-enabled": "Disk Quota is {not}enabled for this user", + "received": "received", + "scripts": "scripts", + "sent": "sent", + "started": "Started", + "storages-by-type": "Storages by type", + "storages": "stockage{plural}", + "strings-use": "strings use", + "tasks": "Tรขches", + "total-files": "total files", + "total-users": "total users", + "total": "total", + "until": "Until", + "updates-available-for": "Des mises ร  jour sont disponibles pour", + "updates-available": "mise{plural} ร  jour disponible", + "used": "used", + "user": "user", + "using": "using", + "version": "version", + "wasted": "wasted" + } + } +} diff --git a/src/assets/locales/gl.json b/src/assets/locales/gl.json index 202f341bbf..ddc527b44b 100644 --- a/src/assets/locales/gl.json +++ b/src/assets/locales/gl.json @@ -1,446 +1,420 @@ { - "home": { - "no-results": "Sen resultados de busca", - "no-data": "Sen datos configurados", - "no-items-section": "Aรญnda non hai elementos para mostrar" - }, - "search": { - "search-label": "Buscar", - "search-placeholder": "Comeza a escribir para filtrar", - "clear-search-tooltip": "Limpar busca", - "enter-to-search-web": "Preme Enter para buscar na web" - }, - "splash-screen": { - "loading": "Cargando" - }, - "login": { - "title": "Dashy", - "guest-label": "Acceso de convidado", - "username-label": "Nome de usuario", - "password-label": "Contrasinal", - "login-button": "Iniciar sesiรณn", - "remember-me-label": "Lembrar durante", - "remember-me-never": "Nunca", - "remember-me-hour": "4 horas", - "remember-me-day": "1 dรญa", - "remember-me-week": "1 semana", - "remember-me-long-time": "Moito tempo", - "error-missing-username": "Falta o nome de usuario", - "error-missing-password": "Falta o contrasinal", - "error-incorrect-username": "Usuario non encontrado", - "error-incorrect-password": "Contrasinal incorrecto", - "success-message": "Iniciando sesiรณn...", - "logout-message": "Sesiรณn pechada", - "already-logged-in-title": "Sesiรณn xa iniciada", - "already-logged-in-text": "Estรกs identificado como", - "proceed-to-dashboard": "Ir ao panel", - "log-out-button": "Pechar sesiรณn", - "proceed-guest-button": "Continuar como convidado", - "guest-intro-1": "Esta instancia ten o acceso de convidado habilitado.", - "guest-intro-2": "Os convidados sรณ teรฑen acceso de visualizaciรณn aos paneis e non poden facer cambios no disco.", - "error": "Erro", - "error-no-user-configured": "A autenticaciรณn non estรก habilitada ou non se configuraron usuarios", - "error-go-home-button": "Ir รก pรกxina principal", - "logged-in-guest": "Identificado como convidado, redirixindo...", - "error-guest-access": "Acceso de convidado non permitido" - }, - "app-info": { - "title": "Informaciรณn da aplicaciรณn", - "error-log": "Rexistro de erros", - "no-errors": "Non se detectaron erros recentes", - "help-support": "Axuda e soporte", - "help-support-description": "Para obter axuda sobre a execuciรณn ou configuraciรณn de Dashy, consulta as", - "help-support-discussions": "Discusiรณns", - "support-dashy": "Apoia Dashy", - "support-dashy-description": "Para saber como participar, consulta a pรกxina de", - "support-dashy-link": "Contribuciรณns", - "report-bug": "Informar dun erro", - "report-bug-description": "Se atopaches un erro, por favor", - "report-bug-link": "abre unha incidencia", - "more-info": "Mรกis informaciรณn", - "source": "Cรณdigo fonte", - "documentation": "Documentaciรณn", - "privacy-and-security": "Privacidade e seguridade", - "privacy-and-security-l1": "Para obter detalles sobre como os teus datos son xestionados por Dashy, consulta a", - "privacy-and-security-privacy-policy": "Polรญtica de privacidade", - "privacy-and-security-advice": "Para consellos sobre como asegurar o teu panel de control, consulta os", - "privacy-and-security-advice-link": "Documentos de xestiรณn", - "privacy-and-security-security-issue": "Se atopaches un problema de seguridade potencial, informa seguindo a nosa", - "privacy-and-security-security-policy": "Polรญtica de seguridade", - "license": "Licenza", - "license-under": "Licenciado baixo", - "licence-third-party": "Para licenzas de mรณdulos de terceiros, consulta", - "licence-third-party-link": "Legal", - "list-contributors": "Para a lista completa de contribuรญntes e agradecementos, consulta", - "list-contributors-link": "Crรฉditos", - "version": "Versiรณn" - }, - "config": { - "main-tab": "Menรบ principal", - "view-config-tab": "Ver configuraciรณn", - "edit-config-tab": "Editar configuraciรณn", - "custom-css-tab": "Estilos personalizados", - "heading": "Opciรณns de configuraciรณn", - "download-config-button": "Ver / Exportar configuraciรณn", - "edit-config-button": "Editar configuraciรณn", - "edit-css-button": "Editar CSS personalizado", - "cloud-sync-button": "Habilitar sincronizaciรณn en nube", - "edit-cloud-sync-button": "Editar sincronizaciรณn en nube", - "rebuild-app-button": "Reconstruรญr aplicaciรณn", - "change-language-button": "Cambiar idioma da aplicaciรณn", - "reset-settings-button": "Restablecer configuraciรณn local", - "disabled-note": "Algรบns recursos de configuraciรณn foron desactivados polo administrador", - "small-screen-note": "Estรกs a usar unha pantalla moi pequena e algรบns elementos deste menรบ poden non ser รณptimos", - "app-info-button": "Informaciรณn da aplicaciรณn", - "backup-note": "Recomรฉndase facer unha copia de seguridade da tรบa configuraciรณn antes de facer cambios.", - "reset-config-msg-l1": "Isto eliminarรก todas as configuraciรณns de usuario do almacenamento local, pero non afectarรก ao ficheiro 'conf.yml'.", - "reset-config-msg-l2": "Deberรญas facer unha copia de seguridade de calquera cambio que fixeches localmente, se queres usalos no futuro.", - "reset-config-msg-l3": "Seguro que queres continuar?", - "data-cleared-msg": "Datos eliminados correctamente", - "actions-label": "Acciรณns", - "copy-config-label": "Copiar configuraciรณn", - "data-copied-msg": "A configuraciรณn foi copiada ao portapapeis", - "reset-config-label": "Restablecer configuraciรณn", - "css-save-btn": "Gardar cambios", - "css-note-label": "Nota", - "css-note-l1": "Terรกs que actualizar a pรกxina para que se apliquen os cambios.", - "css-note-l2": "As substituciรณns de estilos sรณ se almacenan localmente, asรญ que รฉ recomendable facer unha copia do teu CSS.", - "css-note-l3": "Para eliminar todos os estilos personalizados, borra o contido e preme Gardar cambios", - "custom-css": { - "title": "CSS personalizado", - "base-theme": "Tema base" - } - }, - "alternate-views": { - "alternate-view-heading": "Cambiar vista", - "default": "Predeterminado", - "workspace": "รrea de traballo", - "minimal": "Minimalista" - }, - "settings": { - "theme-label": "Tema", - "layout-label": "Deseรฑo", - "layout-auto": "Automรกtico", - "layout-horizontal": "Horizontal", - "layout-vertical": "Vertical", - "item-size-label": "Tamaรฑo do elemento", - "item-size-small": "Pequeno", - "item-size-medium": "Mediano", - "item-size-large": "Grande", - "config-launcher-label": "Configuraciรณn", - "config-launcher-tooltip": "Actualizar configuraciรณn", - "sign-out-tooltip": "Pechar sesiรณn", - "sign-in-tooltip": "Iniciar sesiรณn", - "sign-in-welcome": "Ola {username}!", - "hide": "Ocultar", - "open": "Abrir" - }, - "updates": { - "app-version-note": "Versiรณn de Dashy", - "up-to-date": "Actualizado", - "out-of-date": "Actualizaciรณn dispoรฑible", - "unsupported-version-l1": "Estรกs a usar unha versiรณn non soportada de Dashy", - "unsupported-version-l2": "Para a mellor experiencia e actualizaciรณns de seguridade recentes, por favor, actualiza a" - }, - "language-switcher": { - "title": "Cambiar idioma da aplicaciรณn", - "dropdown-label": "Selecciona un idioma", - "save-button": "Gardar", - "success-msg": "Idioma actualizado a" - }, - "theme-maker": { - "title": "Configurador de tema", - "export-button": "Exportar variables personalizadas", - "reset-button": "Restablecer estilos para", - "show-all-button": "Amosar todas as variables", - "change-fonts-button": "Cambiar fontes", - "save-button": "Gardar", - "cancel-button": "Cancelar", - "saved-toast": "{theme} actualizado correctamente", - "copied-toast": "Datos do tema para {theme} copiados ao portapapeis", - "reset-toast": "Eliminadas as cores personalizadas de {theme}" - }, - "config-editor": { - "save-location-label": "Localizaciรณn de gardado", - "location-local-label": "Aplicar localmente", - "location-disk-label": "Gardar cambios no ficheiro de configuraciรณn", - "save-button": "Gardar cambios", - "preview-button": "Previsualizar cambios", - "valid-label": "A configuraciรณn รฉ vรกlida", - "status-success-msg": "Tarefa completada", - "status-fail-msg": "Fallou a tarefa", - "success-msg-disk": "Ficheiro de configuraciรณn gardado no disco correctamente", - "success-msg-local": "Cambios locais gardados correctamente", - "success-note-l1": "A aplicaciรณn debe reconstruรญrse automaticamente.", - "success-note-l2": "Isto pode levar ata un minuto.", - "success-note-l3": "Terรกs que actualizar a pรกxina para que se apliquen os cambios.", - "error-msg-save-mode": "Selecciona un modo de gardado: Local ou Ficheiro", - "error-msg-cannot-save": "Produciuse un erro ao gardar a configuraciรณn", - "error-msg-bad-json": "Erro en JSON, posiblemente malformado", - "warning-msg-validation": "Aviso de validaciรณn", - "not-admin-note": "Non podes gardar cambios no disco porque non iniciaches sesiรณn como administrador" - }, - "app-rebuild": { - "title": "Reconstruรญr aplicaciรณn", - "rebuild-note-l1": "ร‰ necesaria unha reconstruciรณn para que se apliquen os cambios escritos no ficheiro 'conf.yml'.", - "rebuild-note-l2": "Isto deberรญa ocorrer automaticamente, pero se non ocorre, podes activar manualmente aquรญ.", - "rebuild-note-l3": "Esto non รฉ necesario para as modificaciรณns almacenadas localmente.", - "rebuild-button": "Iniciar construciรณn", - "rebuilding-status-1": "Construรญndo...", - "rebuilding-status-2": "Isto pode levar uns minutos", - "error-permission": "Non tes permisos para iniciar esta acciรณn", - "success-msg": "Construciรณn completada con รฉxito", - "fail-msg": "A operaciรณn de construciรณn fallou", - "reload-note": "Agora รฉ necesario recargar a pรกxina para que se apliquen os cambios", - "reload-button": "Recargar pรกxina" - }, - "cloud-sync": { - "title": "Copia de seguridade e restauraciรณn en nube", - "intro-l1": "A copia de seguridade e restauraciรณn en nube รฉ unha caracterรญstica opcional que che permite cargar a tรบa configuraciรณn รก internet e restaurala en calquera outro dispositivo ou instancia de Dashy.", - "intro-l2": "Todos os datos estรกn totalmente cifrados de extremo a extremo con AES, usando o teu contrasinal como clave.", - "intro-l3": "Para obter mรกis informaciรณn, consulta a", - "intro-docs": "documentaciรณn", - "backup-title-setup": "Facer unha copia de seguridade", - "backup-title-update": "Actualizar copia de seguridade", - "password-label-setup": "Escolle un contrasinal", - "password-label-update": "Introduce o teu contrasinal", - "backup-button-setup": "Copia de seguridade", - "backup-button-update": "Actualizar copia de seguridade", - "backup-id-label": "ID da tรบa copia de seguridade", - "backup-id-note": "Esto รบsase para restaurar desde copias de seguridade mรกis tarde. Asรญ que guรกrdao, xunto co teu contrasinal, nun lugar seguro.", - "restore-title": "Restaurar unha copia de seguridade", - "restore-id-label": "ID de restauraciรณn", - "restore-password-label": "Contrasinal", - "restore-button": "Restaurar", - "backup-missing-password": "Falta o contrasinal", - "backup-error-unknown": "Non se puido procesar a solicitude", - "backup-error-password": "Contrasinal incorrecto. Introduce o teu contrasinal actual.", - "backup-success-msg": "Completado con รฉxito", - "restore-success-msg": "Configuraciรณn restaurada con รฉxito" - }, - "menu": { + "home": { + "no-results": "Sen resultados de busca", + "no-data": "Sen datos configurados", + "no-items-section": "Aรญnda non hai elementos para mostrar" + }, + "search": { + "search-label": "Buscar", + "search-placeholder": "Comeza a escribir para filtrar", + "clear-search-tooltip": "Limpar busca", + "enter-to-search-web": "Preme Enter para buscar na web" + }, + "splash-screen": { + "loading": "Cargando" + }, + "login": { + "title": "Dashy", + "guest-label": "Acceso de convidado", + "username-label": "Nome de usuario", + "password-label": "Contrasinal", + "login-button": "Iniciar sesiรณn", + "remember-me-label": "Lembrar durante", + "remember-me-never": "Nunca", + "remember-me-hour": "4 horas", + "remember-me-day": "1 dรญa", + "remember-me-week": "1 semana", + "remember-me-long-time": "Moito tempo", + "error-missing-username": "Falta o nome de usuario", + "error-missing-password": "Falta o contrasinal", + "error-incorrect-username": "Usuario non encontrado", + "error-incorrect-password": "Contrasinal incorrecto", + "success-message": "Iniciando sesiรณn...", + "logout-message": "Sesiรณn pechada", + "already-logged-in-title": "Sesiรณn xa iniciada", + "already-logged-in-text": "Estรกs identificado como", + "proceed-to-dashboard": "Ir ao panel", + "log-out-button": "Pechar sesiรณn", + "proceed-guest-button": "Continuar como convidado", + "guest-intro-1": "Esta instancia ten o acceso de convidado habilitado.", + "guest-intro-2": "Os convidados sรณ teรฑen acceso de visualizaciรณn aos paneis e non poden facer cambios no disco.", + "error": "Erro", + "error-no-user-configured": "A autenticaciรณn non estรก habilitada ou non se configuraron usuarios", + "error-go-home-button": "Ir รก pรกxina principal", + "logged-in-guest": "Identificado como convidado, redirixindo...", + "error-guest-access": "Acceso de convidado non permitido" + }, + "app-info": { + "title": "Informaciรณn da aplicaciรณn", + "support-dashy": "Apoia Dashy", + "support-dashy-description": "Para saber como participar, consulta a pรกxina de", + "support-dashy-link": "Contribuciรณns", + "report-bug": "Informar dun erro", + "report-bug-description": "Se atopaches un erro, por favor", + "report-bug-link": "abre unha incidencia", + "more-info": "Mรกis informaciรณn", + "source": "Cรณdigo fonte", + "documentation": "Documentaciรณn", + "privacy-and-security": "Privacidade e seguridade", + "privacy-and-security-l1": "Para obter detalles sobre como os teus datos son xestionados por Dashy, consulta a", + "privacy-and-security-privacy-policy": "Polรญtica de privacidade", + "privacy-and-security-advice": "Para consellos sobre como asegurar o teu panel de control, consulta os", + "privacy-and-security-advice-link": "Documentos de xestiรณn", + "privacy-and-security-security-issue": "Se atopaches un problema de seguridade potencial, informa seguindo a nosa", + "privacy-and-security-security-policy": "Polรญtica de seguridade", + "license": "Licenza", + "license-under": "Licenciado baixo", + "licence-third-party": "Para licenzas de mรณdulos de terceiros, consulta", + "licence-third-party-link": "Legal", + "list-contributors": "Para a lista completa de contribuรญntes e agradecementos, consulta", + "list-contributors-link": "Crรฉditos", + "version": "Versiรณn" + }, + "config": { + "main-tab": "Menรบ principal", + "view-config-tab": "Ver configuraciรณn", + "edit-config-tab": "Editar configuraciรณn", + "custom-css-tab": "Estilos personalizados", + "heading": "Opciรณns de configuraciรณn", + "download-config-button": "Ver / Exportar configuraciรณn", + "edit-config-button": "Editar configuraciรณn", + "edit-css-button": "Editar CSS personalizado", + "cloud-sync-button": "Habilitar sincronizaciรณn en nube", + "edit-cloud-sync-button": "Editar sincronizaciรณn en nube", + "change-language-button": "Cambiar idioma da aplicaciรณn", + "reset-settings-button": "Restablecer configuraciรณn local", + "disabled-note": "Algรบns recursos de configuraciรณn foron desactivados polo administrador", + "small-screen-note": "Estรกs a usar unha pantalla moi pequena e algรบns elementos deste menรบ poden non ser รณptimos", + "app-info-button": "Informaciรณn da aplicaciรณn", + "backup-note": "Recomรฉndase facer unha copia de seguridade da tรบa configuraciรณn antes de facer cambios.", + "reset-config-msg-l1": "Isto eliminarรก todas as configuraciรณns de usuario do almacenamento local, pero non afectarรก ao ficheiro 'conf.yml'.", + "reset-config-msg-l2": "Deberรญas facer unha copia de seguridade de calquera cambio que fixeches localmente, se queres usalos no futuro.", + "reset-config-msg-l3": "Seguro que queres continuar?", + "data-cleared-msg": "Datos eliminados correctamente", + "actions-label": "Acciรณns", + "copy-config-label": "Copiar configuraciรณn", + "data-copied-msg": "A configuraciรณn foi copiada ao portapapeis", + "reset-config-label": "Restablecer configuraciรณn", + "css-save-btn": "Gardar cambios", + "css-note-label": "Nota", + "css-note-l1": "Terรกs que actualizar a pรกxina para que se apliquen os cambios.", + "css-note-l2": "As substituciรณns de estilos sรณ se almacenan localmente, asรญ que รฉ recomendable facer unha copia do teu CSS.", + "css-note-l3": "Para eliminar todos os estilos personalizados, borra o contido e preme Gardar cambios", + "custom-css": { + "title": "CSS personalizado", + "base-theme": "Tema base" + } + }, + "alternate-views": { + "alternate-view-heading": "Cambiar vista", + "default": "Predeterminado", + "workspace": "รrea de traballo", + "minimal": "Minimalista" + }, + "settings": { + "theme-label": "Tema", + "layout-label": "Deseรฑo", + "layout-auto": "Automรกtico", + "layout-horizontal": "Horizontal", + "layout-vertical": "Vertical", + "item-size-label": "Tamaรฑo do elemento", + "item-size-small": "Pequeno", + "item-size-medium": "Mediano", + "item-size-large": "Grande", + "config-launcher-label": "Configuraciรณn", + "config-launcher-tooltip": "Actualizar configuraciรณn", + "sign-out-tooltip": "Pechar sesiรณn", + "sign-in-tooltip": "Iniciar sesiรณn", + "sign-in-welcome": "Ola {username}!", + "hide": "Ocultar", + "open": "Abrir" + }, + "updates": { + "app-version-note": "Versiรณn de Dashy", + "up-to-date": "Actualizado", + "out-of-date": "Actualizaciรณn dispoรฑible", + "unsupported-version-l1": "Estรกs a usar unha versiรณn non soportada de Dashy", + "unsupported-version-l2": "Para a mellor experiencia e actualizaciรณns de seguridade recentes, por favor, actualiza a" + }, + "language-switcher": { + "title": "Cambiar idioma da aplicaciรณn", + "dropdown-label": "Selecciona un idioma", + "save-button": "Gardar", + "success-msg": "Idioma actualizado a" + }, + "theme-maker": { + "title": "Configurador de tema", + "export-button": "Exportar variables personalizadas", + "reset-button": "Restablecer estilos para", + "show-all-button": "Amosar todas as variables", + "change-fonts-button": "Cambiar fontes", + "save-button": "Gardar", + "cancel-button": "Cancelar", + "saved-toast": "{theme} actualizado correctamente", + "copied-toast": "Datos do tema para {theme} copiados ao portapapeis", + "reset-toast": "Eliminadas as cores personalizadas de {theme}" + }, + "config-editor": { + "save-location-label": "Localizaciรณn de gardado", + "location-local-label": "Aplicar localmente", + "location-disk-label": "Gardar cambios no ficheiro de configuraciรณn", + "save-button": "Gardar cambios", + "preview-button": "Previsualizar cambios", + "valid-label": "A configuraciรณn รฉ vรกlida", + "status-success-msg": "Tarefa completada", + "status-fail-msg": "Fallou a tarefa", + "success-msg-disk": "Ficheiro de configuraciรณn gardado no disco correctamente", + "success-msg-local": "Cambios locais gardados correctamente", + "success-note-l1": "A aplicaciรณn debe reconstruรญrse automaticamente.", + "success-note-l2": "Isto pode levar ata un minuto.", + "success-note-l3": "Terรกs que actualizar a pรกxina para que se apliquen os cambios.", + "error-msg-save-mode": "Selecciona un modo de gardado: Local ou Ficheiro", + "error-msg-cannot-save": "Produciuse un erro ao gardar a configuraciรณn", + "error-msg-bad-json": "Erro en JSON, posiblemente malformado", + "warning-msg-validation": "Aviso de validaciรณn", + "not-admin-note": "Non podes gardar cambios no disco porque non iniciaches sesiรณn como administrador" + }, + "cloud-sync": { + "title": "Copia de seguridade e restauraciรณn en nube", + "intro-l1": "A copia de seguridade e restauraciรณn en nube รฉ unha caracterรญstica opcional que che permite cargar a tรบa configuraciรณn รก internet e restaurala en calquera outro dispositivo ou instancia de Dashy.", + "intro-l2": "Todos os datos estรกn totalmente cifrados de extremo a extremo con AES, usando o teu contrasinal como clave.", + "intro-l3": "Para obter mรกis informaciรณn, consulta a", + "intro-docs": "documentaciรณn", + "backup-title-setup": "Facer unha copia de seguridade", + "backup-title-update": "Actualizar copia de seguridade", + "password-label-setup": "Escolle un contrasinal", + "password-label-update": "Introduce o teu contrasinal", + "backup-button-setup": "Copia de seguridade", + "backup-button-update": "Actualizar copia de seguridade", + "backup-id-label": "ID da tรบa copia de seguridade", + "backup-id-note": "Esto รบsase para restaurar desde copias de seguridade mรกis tarde. Asรญ que guรกrdao, xunto co teu contrasinal, nun lugar seguro.", + "restore-title": "Restaurar unha copia de seguridade", + "restore-id-label": "ID de restauraciรณn", + "restore-password-label": "Contrasinal", + "restore-button": "Restaurar", + "backup-missing-password": "Falta o contrasinal", + "backup-error-unknown": "Non se puido procesar a solicitude", + "backup-error-password": "Contrasinal incorrecto. Introduce o teu contrasinal actual.", + "backup-success-msg": "Completado con รฉxito", + "restore-success-msg": "Configuraciรณn restaurada con รฉxito" + }, + "menu": { + "open-section-title": "Abrir en", + "sametab": "Lapela actual", + "newtab": "Nova lapela", + "modal": "Diรกlogo emerxente", + "workspace": "Vista do espazo de traballo", + "options-section-title": "Opciรณns", + "edit-item": "Editar", + "move-item": "Copiar ou mover", + "remove-item": "Eliminar" + }, + "context-menus": { + "item": { "open-section-title": "Abrir en", "sametab": "Lapela actual", "newtab": "Nova lapela", "modal": "Diรกlogo emerxente", "workspace": "Vista do espazo de traballo", + "clipboard": "Copiar ao portapapeis", "options-section-title": "Opciรณns", "edit-item": "Editar", "move-item": "Copiar ou mover", - "remove-item": "Eliminar" - }, - "context-menus": { - "item": { - "open-section-title": "Abrir en", - "sametab": "Lapela actual", - "newtab": "Nova lapela", - "modal": "Diรกlogo emerxente", - "workspace": "Vista do espazo de traballo", - "clipboard": "Copiar ao portapapeis", - "options-section-title": "Opciรณns", - "edit-item": "Editar", - "move-item": "Copiar ou mover", - "remove-item": "Eliminar", - "copied-toast": "A URL foi copiada ao portapapeis" - }, - "section": { - "open-section": "Abrir secciรณn", - "edit-section": "Editar", - "expand-collapse": "Expandir / Colapsar", - "move-section": "Mover a", - "remove-section": "Eliminar" - } - }, - "footer": { - "dev-by": "Desenvolto por", - "licensed-under": "Licenciado baixo", - "get-the": "Obter o", - "source-code": "Cรณdigo fonte" - }, - "interactive-editor": { - "menu": { - "start-editing-tooltip": "Entrar no Editor Interactivo", - "edit-site-data-subheading": "Editar datos do sitio", - "edit-page-info-btn": "Editar informaciรณn da pรกxina", - "edit-page-info-tooltip": "Tรญtulo da aplicaciรณn, descriciรณn, ligazรณns de navegaciรณn, texto do pรฉ de pรกxina, etc.", - "edit-app-config-btn": "Editar configuraciรณn da aplicaciรณn", - "edit-app-config-tooltip": "Todas as outras opciรณns de configuraciรณn da aplicaciรณn", - "edit-pages-btn": "Editar pรกxinas", - "edit-pages-tooltip": "Engadir ou eliminar vistas adicionais", - "config-save-methods-subheading": "Opciรณns de gardado de configuraciรณn", - "save-locally-btn": "Gardar localmente", - "save-locally-tooltip": "Gardar a configuraciรณn localmente, no almacenamento do navegador. Iso non afectarรก ao ficheiro de configuraciรณn, pero os cambios sรณ se gardarรกn neste dispositivo", - "save-disk-btn": "Gardar no disco", - "save-disk-tooltip": "Gardar a configuraciรณn no ficheiro conf.yml no disco. Isto farรก unha copia de seguridade e despois sobrescribirรก a tรบa configuraciรณn existente", - "export-config-btn": "Exportar configuraciรณn", - "export-config-tooltip": "Ver e exportar a nova configuraciรณn, ben a un ficheiro ou ao portapapeis", - "cloud-backup-btn": "Copia de seguridade na nube", - "cloud-backup-tooltip": "Gardar unha copia de seguridade cifrada da configuraciรณn na nube", - "edit-raw-config-btn": "Editar configuraciรณn en bruto", - "edit-raw-config-tooltip": "Ver e modificar a configuraciรณn en bruto a travรฉs do editor JSON", - "cancel-changes-btn": "Cancelar ediciรณn", - "cancel-changes-tooltip": "Restablecer as modificaciรณns actuais e saรญr do modo de ediciรณn. Iso non afectarรก รก tรบa configuraciรณn gardada", - "edit-mode-name": "Modo de ediciรณn", - "edit-mode-subtitle": "Estรกs no modo de ediciรณn", - "edit-mode-description": "Isto significa que podes facer modificaciรณns รก tรบa configuraciรณn e prever os resultados, pero ata que non a gardes, ningunha das tรบas modificaciรณns serรก preservada.", - "save-stage-btn": "Gardar", - "cancel-stage-btn": "Cancelar", - "save-locally-warning": "Se continรบas, os cambios sรณ se gardarรกn no teu navegador. Deberรญas exportar unha copia da tรบa configuraciรณn para usar noutros equipos. Queres continuar?" - }, - "edit-item": { - "missing-title-err": "ร‰ necesario un tรญtulo para o elemento" - }, - "edit-section": { - "edit-section-title": "Editar secciรณn", - "add-section-title": "Engadir nova secciรณn", - "edit-tooltip": "Fai clic para editar ou fai clic co botรณn dereito para obter mรกis opciรณns", - "remove-confirm": "Estรกs seguro de querer eliminar esta secciรณn? Esta acciรณn pรณdese desfacer mรกis tarde." - }, - "edit-app-config": { - "warning-msg-title": "Procede con cautela", - "warning-msg-l1": "As seguintes opciรณns son para a configuraciรณn avanzada da aplicaciรณn.", - "warning-msg-l2": "Se non estรกs seguro de ningรบn dos campos, consulta a", - "warning-msg-docs": "documentaciรณn", - "warning-msg-l3": "para evitar consecuencias non desexadas." - }, - "export": { - "export-title": "Exportar configuraciรณn", - "copy-clipboard-btn": "Copiar ao portapapeis", - "copy-clipboard-tooltip": "Copiar toda a configuraciรณn da aplicaciรณn ao portapapeis do sistema, en formato YAML", - "download-file-btn": "Descargar como ficheiro", - "download-file-tooltip": "Descargar toda a configuraciรณn da aplicaciรณn no teu dispositivo, nun ficheiro YAML", - "view-title": "Ver configuraciรณn" - } - }, - "widgets": { - "general": { - "loading": "Cargando...", - "show-more": "Expandir detalles", - "show-less": "Amosar menos", - "open-link": "Continuar lendo" - }, - "pi-hole": { - "status-heading": "Estado" - }, - "stat-ping": { - "up": "En liรฑa", - "down": "Fรณra de liรฑa" - }, - "net-data": { - "cpu-chart-title": "Historial da CPU", - "mem-chart-title": "Uso da memoria", - "mem-breakdown-title": "Desglose da memoria", - "load-chart-title": "Carga do sistema" - }, - "glances": { - "disk-space-free": "Libre", - "disk-space-used": "Usado", - "disk-mount-point": "Punto de montaxe", - "disk-file-system": "Sistema de ficheiros", - "disk-io-read": "Ler", - "disk-io-write": "Escribir", - "system-load-desc": "Nรบmero de procesos รก espera na cola de execuciรณn, promediado entre todos os nรบcleos" - }, - "system-info": { - "uptime": "Tempo de actividade" - }, - "flight-data": { - "arrivals": "Chegadas", - "departures": "Saรญdas" - }, - "tfl-status": { - "good-service-all": "Bos servizos en todas as liรฑas", - "good-service-rest": "Bos servizos en todas as outras liรฑas" - }, - "synology-download": { - "download": "Descargar", - "upload": "Subir", - "downloaded": "Descargado", - "uploaded": "Subido", - "remaining": "Restante", - "up": "Arriba", - "down": "Abaixo" - }, - "gluetun-status": { - "vpn-ip": "IP da VPN", - "country": "Paรญs", - "region": "Rexiรณn", - "city": "Cidade", - "post-code": "Cรณdigo postal", - "location": "Localizaciรณn", - "timezone": "Fuso horario", - "organization": "Organizaciรณn" - }, - "nextcloud": { - "active": "activo", - "and": "e", - "applications": "aplicaciรณns", - "available": "dispoรฑible", - "away": "Ausente", - "cache-full": "CACHE CHEO", - "chat-room": "sala de chat", - "delete-all": "Eliminar todo", - "delete-notification": "Eliminar notificaciรณn", - "disabled": "desactivado", - "disk-quota": "Cota de disco", - "disk-space": "Espazo en disco", - "dnd": "Non molestar", - "email": "correo electrรณnico", - "enabled": "activado", - "federated-shares-ucfirst": "Comparticiรณns federadas", - "federated-shares": "comparticiรณns federadas", - "files": "ficheiro{plural}", - "free": "libre", - "groups": "grupos", - "hit-rate": "taxa de acerto", - "hits": "acertos", - "home": "inicio", - "in": "en", - "keys": "chaves", - "last-24-hours": "รบltimas 24 horas", - "last-5-minutes": "nos รบltimas 5 minutos", - "last-hour": "na รบltima hora", - "last-login": "รšltimo acceso", - "last-restart": "รšltimo reinicio", - "load-averages": "Cargas medias en todos os nรบcleos da CPU", - "local-shares": "Comparticiรณns locais", - "local": "local", - "max-keys": "mรกximas chaves", - "memory-used": "memoria usada", - "memory-utilisation": "utilizaciรณn de memoria", - "memory": "memoria", - "misses": "faltas", - "no-notifications": "Sen notificaciรณns", - "no-pending-updates": "sen actualizaciรณns pendentes", - "nothing-to-show": "Nada que amosar neste momento", - "of-which": "dos cales", - "of": "de", - "offline": "Fรณra de liรฑa", - "online": "En liรฑa", - "other": "outro", - "overall": "Resumo", - "private-link": "ligazรณn privada", - "public-link": "ligazรณn pรบblica", - "quota-enabled": "A cota de disco estรก {not}activada para este usuario", - "received": "recibido", - "scripts": "scripts", - "sent": "enviado", - "started": "Iniciado", - "storages-by-type": "Almacenamentos por tipo", - "storages": "almacenamento{plural}", - "strings-use": "cadenas usadas", - "tasks": "Tarefas", - "total-files": "total de ficheiros", - "total-users": "total de usuarios", - "total": "total", - "until": "Ata", - "updates-available-for": "Hai actualizaciรณns dispoรฑibles para", - "updates-available": "actualizaciรณn{plural} dispoรฑible", - "used": "usado", - "user": "usuario", - "using": "usando", - "version": "versiรณn", - "wasted": "desperdiciado" - } - } -} \ No newline at end of file + "remove-item": "Eliminar", + "copied-toast": "A URL foi copiada ao portapapeis" + }, + "section": { + "open-section": "Abrir secciรณn", + "edit-section": "Editar", + "expand-collapse": "Expandir / Colapsar", + "move-section": "Mover a", + "remove-section": "Eliminar" + } + }, + "interactive-editor": { + "menu": { + "start-editing-tooltip": "Entrar no Editor Interactivo", + "edit-site-data-subheading": "Editar datos do sitio", + "edit-page-info-btn": "Editar informaciรณn da pรกxina", + "edit-page-info-tooltip": "Tรญtulo da aplicaciรณn, descriciรณn, ligazรณns de navegaciรณn, texto do pรฉ de pรกxina, etc.", + "edit-app-config-btn": "Editar configuraciรณn da aplicaciรณn", + "edit-app-config-tooltip": "Todas as outras opciรณns de configuraciรณn da aplicaciรณn", + "edit-pages-btn": "Editar pรกxinas", + "edit-pages-tooltip": "Engadir ou eliminar vistas adicionais", + "config-save-methods-subheading": "Opciรณns de gardado de configuraciรณn", + "save-locally-btn": "Gardar localmente", + "save-locally-tooltip": "Gardar a configuraciรณn localmente, no almacenamento do navegador. Iso non afectarรก ao ficheiro de configuraciรณn, pero os cambios sรณ se gardarรกn neste dispositivo", + "save-disk-btn": "Gardar no disco", + "save-disk-tooltip": "Gardar a configuraciรณn no ficheiro conf.yml no disco. Isto farรก unha copia de seguridade e despois sobrescribirรก a tรบa configuraciรณn existente", + "export-config-btn": "Exportar configuraciรณn", + "export-config-tooltip": "Ver e exportar a nova configuraciรณn, ben a un ficheiro ou ao portapapeis", + "cloud-backup-btn": "Copia de seguridade na nube", + "cloud-backup-tooltip": "Gardar unha copia de seguridade cifrada da configuraciรณn na nube", + "edit-raw-config-btn": "Editar configuraciรณn en bruto", + "edit-raw-config-tooltip": "Ver e modificar a configuraciรณn en bruto a travรฉs do editor JSON", + "cancel-changes-btn": "Cancelar ediciรณn", + "cancel-changes-tooltip": "Restablecer as modificaciรณns actuais e saรญr do modo de ediciรณn. Iso non afectarรก รก tรบa configuraciรณn gardada", + "edit-mode-name": "Modo de ediciรณn", + "edit-mode-subtitle": "Estรกs no modo de ediciรณn", + "edit-mode-description": "Isto significa que podes facer modificaciรณns รก tรบa configuraciรณn e prever os resultados, pero ata que non a gardes, ningunha das tรบas modificaciรณns serรก preservada.", + "save-stage-btn": "Gardar", + "cancel-stage-btn": "Cancelar", + "save-locally-warning": "Se continรบas, os cambios sรณ se gardarรกn no teu navegador. Deberรญas exportar unha copia da tรบa configuraciรณn para usar noutros equipos. Queres continuar?" + }, + "edit-item": { + "missing-title-err": "ร‰ necesario un tรญtulo para o elemento" + }, + "edit-section": { + "edit-section-title": "Editar secciรณn", + "add-section-title": "Engadir nova secciรณn", + "edit-tooltip": "Fai clic para editar ou fai clic co botรณn dereito para obter mรกis opciรณns", + "remove-confirm": "Estรกs seguro de querer eliminar esta secciรณn? Esta acciรณn pรณdese desfacer mรกis tarde." + }, + "edit-app-config": { + "warning-msg-title": "Procede con cautela", + "warning-msg-l1": "As seguintes opciรณns son para a configuraciรณn avanzada da aplicaciรณn.", + "warning-msg-l2": "Se non estรกs seguro de ningรบn dos campos, consulta a", + "warning-msg-docs": "documentaciรณn", + "warning-msg-l3": "para evitar consecuencias non desexadas." + }, + "export": { + "export-title": "Exportar configuraciรณn", + "copy-clipboard-btn": "Copiar ao portapapeis", + "copy-clipboard-tooltip": "Copiar toda a configuraciรณn da aplicaciรณn ao portapapeis do sistema, en formato YAML", + "download-file-btn": "Descargar como ficheiro", + "download-file-tooltip": "Descargar toda a configuraciรณn da aplicaciรณn no teu dispositivo, nun ficheiro YAML", + "view-title": "Ver configuraciรณn" + } + }, + "widgets": { + "general": { + "loading": "Cargando...", + "show-more": "Expandir detalles", + "show-less": "Amosar menos", + "open-link": "Continuar lendo" + }, + "pi-hole": { + "status-heading": "Estado" + }, + "stat-ping": { + "up": "En liรฑa", + "down": "Fรณra de liรฑa" + }, + "net-data": { + "cpu-chart-title": "Historial da CPU", + "mem-chart-title": "Uso da memoria", + "mem-breakdown-title": "Desglose da memoria", + "load-chart-title": "Carga do sistema" + }, + "glances": { + "disk-space-free": "Libre", + "disk-space-used": "Usado", + "disk-mount-point": "Punto de montaxe", + "disk-file-system": "Sistema de ficheiros", + "disk-io-read": "Ler", + "disk-io-write": "Escribir", + "system-load-desc": "Nรบmero de procesos รก espera na cola de execuciรณn, promediado entre todos os nรบcleos" + }, + "system-info": { + "uptime": "Tempo de actividade" + }, + "flight-data": { + "arrivals": "Chegadas", + "departures": "Saรญdas" + }, + "tfl-status": { + "good-service-all": "Bos servizos en todas as liรฑas", + "good-service-rest": "Bos servizos en todas as outras liรฑas" + }, + "synology-download": { + "download": "Descargar", + "upload": "Subir", + "downloaded": "Descargado", + "uploaded": "Subido", + "remaining": "Restante", + "up": "Arriba", + "down": "Abaixo" + }, + "gluetun-status": { + "vpn-ip": "IP da VPN", + "country": "Paรญs", + "region": "Rexiรณn", + "city": "Cidade", + "post-code": "Cรณdigo postal", + "location": "Localizaciรณn", + "timezone": "Fuso horario", + "organization": "Organizaciรณn" + }, + "nextcloud": { + "active": "activo", + "and": "e", + "applications": "aplicaciรณns", + "available": "dispoรฑible", + "away": "Ausente", + "cache-full": "CACHE CHEO", + "chat-room": "sala de chat", + "delete-all": "Eliminar todo", + "delete-notification": "Eliminar notificaciรณn", + "disabled": "desactivado", + "disk-quota": "Cota de disco", + "disk-space": "Espazo en disco", + "dnd": "Non molestar", + "email": "correo electrรณnico", + "enabled": "activado", + "federated-shares-ucfirst": "Comparticiรณns federadas", + "federated-shares": "comparticiรณns federadas", + "files": "ficheiro{plural}", + "free": "libre", + "groups": "grupos", + "hit-rate": "taxa de acerto", + "hits": "acertos", + "home": "inicio", + "in": "en", + "keys": "chaves", + "last-24-hours": "รบltimas 24 horas", + "last-5-minutes": "nos รบltimas 5 minutos", + "last-hour": "na รบltima hora", + "last-login": "รšltimo acceso", + "last-restart": "รšltimo reinicio", + "load-averages": "Cargas medias en todos os nรบcleos da CPU", + "local-shares": "Comparticiรณns locais", + "local": "local", + "max-keys": "mรกximas chaves", + "memory-used": "memoria usada", + "memory-utilisation": "utilizaciรณn de memoria", + "memory": "memoria", + "misses": "faltas", + "no-notifications": "Sen notificaciรณns", + "no-pending-updates": "sen actualizaciรณns pendentes", + "nothing-to-show": "Nada que amosar neste momento", + "of-which": "dos cales", + "of": "de", + "offline": "Fรณra de liรฑa", + "online": "En liรฑa", + "other": "outro", + "overall": "Resumo", + "private-link": "ligazรณn privada", + "public-link": "ligazรณn pรบblica", + "quota-enabled": "A cota de disco estรก {not}activada para este usuario", + "received": "recibido", + "scripts": "scripts", + "sent": "enviado", + "started": "Iniciado", + "storages-by-type": "Almacenamentos por tipo", + "storages": "almacenamento{plural}", + "strings-use": "cadenas usadas", + "tasks": "Tarefas", + "total-files": "total de ficheiros", + "total-users": "total de usuarios", + "total": "total", + "until": "Ata", + "updates-available-for": "Hai actualizaciรณns dispoรฑibles para", + "updates-available": "actualizaciรณn{plural} dispoรฑible", + "used": "usado", + "user": "usuario", + "using": "usando", + "version": "versiรณn", + "wasted": "desperdiciado" + } + } +} diff --git a/src/assets/locales/hi.json b/src/assets/locales/hi.json index b29dc00b7c..71a9168536 100644 --- a/src/assets/locales/hi.json +++ b/src/assets/locales/hi.json @@ -42,7 +42,6 @@ "edit-css-button": "เค•เคธเฅเคŸเคฎ เคธเฅ€เคเคธเคเคธ เคธเค‚เคชเคพเคฆเคฟเคค เค•เคฐเฅ‡เค‚", "cloud-sync-button": "เค•เฅเคฒเคพเค‰เคก เคธเคฟเค‚เค• เคธเค•เฅเคทเคฎ เค•เคฐเฅ‡เค‚", "edit-cloud-sync-button": "เค•เฅเคฒเคพเค‰เคก เคธเคฟเค‚เค• เคธเค‚เคชเคพเคฆเคฟเคค เค•เคฐเฅ‡เค‚", - "rebuild-app-button": "เคเคชเฅเคฒเคฟเค•เฅ‡เคถเคจ เค•เคพ เคชเฅเคจเคฐเฅเคจเคฟเคฐเฅเคฎเคพเคฃ เค•เคฐเฅ‡เค‚", "change-language-button": "เคเคช เค•เฅ€ เคญเคพเคทเคพ เคฌเคฆเคฒเฅ‡เค‚", "reset-settings-button": "เคธเฅเคฅเคพเคจเฅ€เคฏ เคธเฅ‡เคŸเคฟเค‚เค—เฅเคธ เคฐเฅ€เคธเฅ‡เคŸ เค•เคฐเฅ‡เค‚", "app-info-button": "เค…เคจเฅเคชเฅเคฐเคฏเฅ‹เค— เค•เฅ€ เคœเคพเคจเค•เคพเคฐเฅ€", @@ -126,20 +125,6 @@ "warning-msg-validation": "เคธเคคเฅเคฏเคพเคชเคจ เคšเฅ‡เคคเคพเคตเคจเฅ€", "not-admin-note": "เค†เคช เคกเคฟเคธเฅเค• เคฎเฅ‡เค‚ เคฌเคฆเคฒเคพ เคนเฅเค† เคจเคนเฅ€เค‚ เคฒเคฟเค– เคธเค•เคคเฅ‡, เค•เฅเคฏเฅ‹เค‚เค•เคฟ เค†เคช เคเค• เคตเฅเคฏเคตเคธเฅเคฅเคพเคชเค• เค•เฅ‡ เคฐเฅ‚เคช เคฎเฅ‡เค‚ เคฒเฅ‰เค— เค‡เคจ เคจเคนเฅ€เค‚ เคนเฅˆเค‚" }, - "app-rebuild": { - "title": "เคเคชเฅเคฒเคฟเค•เฅ‡เคถเคจ เค•เคพ เคชเฅเคจเคฐเฅเคจเคฟเคฐเฅเคฎเคพเคฃ เค•เคฐเฅ‡เค‚", - "rebuild-note-l1": "เคชเฅเคฐเคญเคพเคตเฅ€ เคนเฅ‹เคจเฅ‡ เค•เฅ‡ เคฒเคฟเค conf.yml เคซเคผเคพเค‡เคฒ เคฎเฅ‡เค‚ เคฒเคฟเค–เฅ‡ เค—เค เคชเคฐเคฟเคตเคฐเฅเคคเคจเฅ‹เค‚ เค•เฅ‡ เคฒเคฟเค เคเค• เคชเฅเคจเคฐเฅเคจเคฟเคฐเฅเคฎเคพเคฃ เค†เคตเคถเฅเคฏเค• เคนเฅˆเฅค", - "rebuild-note-l2": "เคฏเคน เคธเฅเคตเคšเคพเคฒเคฟเคค เคฐเฅ‚เคช เคธเฅ‡ เคนเฅ‹เคจเคพ เคšเคพเคนเคฟเค, เคฒเฅ‡เค•เคฟเคจ เค…เค—เคฐ เคเคธเคพ เคจเคนเฅ€เค‚ เคนเฅเค† เคนเฅˆ, เคคเฅ‹ เค†เคช เค‡เคธเฅ‡ เคฏเคนเคพเค‚ เคฎเฅˆเคจเฅเคฏเฅเค…เคฒ เคฐเฅ‚เคช เคธเฅ‡ เคŸเฅเคฐเคฟเค—เคฐ เค•เคฐ เคธเค•เคคเฅ‡ เคนเฅˆเค‚เฅค", - "rebuild-note-l3": "เคธเฅเคฅเคพเคจเฅ€เคฏ เคฐเฅ‚เคช เคธเฅ‡ เคธเค‚เค—เฅเคฐเคนเฅ€เคค เคธเค‚เคถเฅ‹เคงเคจเฅ‹เค‚ เค•เฅ‡ เคฒเคฟเค เคฏเคน เค†เคตเคถเฅเคฏเค• เคจเคนเฅ€เค‚ เคนเฅˆเฅค", - "rebuild-button": "เคจเคฟเคฐเฅเคฎเคพเคฃ เคถเฅเคฐเฅ‚ เค•เคฐเฅ‡เค‚", - "rebuilding-status-1": "เค‡เคฎเคพเคฐเคค...", - "rebuilding-status-2": "เค‡เคธเคฎเฅ‡เค‚ เค•เฅเค› เคฎเคฟเคจเคŸ เคฒเค— เคธเค•เคคเฅ‡ เคนเฅˆเค‚", - "error-permission": "เค†เคชเค•เฅ‹ เค‡เคธ เค•เฅเคฐเคฟเคฏเคพ เค•เฅ‹ เคŸเฅเคฐเคฟเค—เคฐ เค•เคฐเคจเฅ‡ เค•เฅ€ เค…เคจเฅเคฎเคคเคฟ เคจเคนเฅ€เค‚ เคนเฅˆ", - "success-msg": "เคจเคฟเคฐเฅเคฎเคพเคฃ เคธเคซเคฒเคคเคพเคชเฅ‚เคฐเฅเคตเค• เคชเฅ‚เคฐเคพ เคนเฅเค†", - "fail-msg": "เคจเคฟเคฐเฅเคฎเคพเคฃ เค•เคพเคฐเฅเคฏ เคตเคฟเคซเคฒ", - "reload-note": "เคชเคฐเคฟเคตเคฐเฅเคคเคจเฅ‹เค‚ เค•เฅ‹ เคชเฅเคฐเคญเคพเคตเฅ€ เคนเฅ‹เคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เค…เคฌ เคเค• เคชเฅƒเคทเฅเค  เคชเฅเคจเคƒ เคฒเฅ‹เคก เค•เคฐเคจเคพ เค†เคตเคถเฅเคฏเค• เคนเฅˆ", - "reload-button": "เคชเฅƒเคทเฅเค  เคชเฅเคจเคƒ เคฒเฅ‹เคก เค•เคฐเฅ‡เค‚" - }, "cloud-sync": { "title": "เค•เฅเคฒเคพเค‰เคก เคฌเฅˆเค•เค…เคช เค”เคฐ เคชเฅเคจเคฐเฅเคธเฅเคฅเคพเคชเคจเคพ", "intro-l1": "เค•เฅเคฒเคพเค‰เคก เคฌเฅˆเค•เค…เคช เค”เคฐ เคชเฅเคจเคฐเฅเคธเฅเคฅเคพเคชเคจเคพ เคเค• เคตเฅˆเค•เคฒเฅเคชเคฟเค• เคธเฅเคตเคฟเคงเคพ เคนเฅˆ, เคœเฅ‹ เค†เคชเค•เฅ‹ เค‡เค‚เคŸเคฐเคจเฅ‡เคŸ เคชเคฐ เค…เคชเคจเคพ เค•เฅ‰เคจเฅเคซเคผเคฟเค— เค…เคชเคฒเฅ‹เคก เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคธเค•เฅเคทเคฎ เคฌเคจเคพเคคเฅ€ เคนเฅˆ, เค”เคฐ เคซเคฟเคฐ เค‡เคธเฅ‡ เคกเฅˆเคถเฅ€ เค•เฅ‡ เค•เคฟเคธเฅ€ เค…เคจเฅเคฏ เคกเคฟเคตเคพเค‡เคธ เคฏเคพ เค‡เค‚เคธเฅเคŸเฅ‡เค‚เคธ เคชเคฐ เคชเฅเคจเคฐเฅเคธเฅเคฅเคพเคชเคฟเคค เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคธเค•เฅเคทเคฎ เคฌเคจเคพเคคเฅ€ เคนเฅˆเฅค", diff --git a/src/assets/locales/hu.json b/src/assets/locales/hu.json index 2ab2436726..ef7b04dfcc 100644 --- a/src/assets/locales/hu.json +++ b/src/assets/locales/hu.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "App Info", - "error-log": "Hibanaplรณ", - "no-errors": "Nem talรกlhatรณ friss hiba", - "help-support": "Sรบgรณ รฉs tรกmogatรกs", - "help-support-description" : "Ha segรญtsรฉgre van szรผksรฉged a Dashy futtatรกsรกhoz vagy beรกllรญtรกsรกhoz, nรฉzd meg a", - "help-support-discussions": "fรณrumot", "support-dashy": "Dashy tรกmogatรกsa", "support-dashy-description": "Ha szeretnรฉl rรฉszt venni a projektben, nรฉzd meg a", "support-dashy-link": "kรถzremลฑkรถdล‘k oldalรกt", @@ -72,7 +67,7 @@ "licence-third-party": "A harmadik fรฉltล‘l szรกrmazรณ modulok licenceiรฉrt lรกtogasd meg a", "licence-third-party-link": "jogi oldalunkat", "list-contributors": "A teljes kรถzremลฑkรถdล‘i lista รฉs kรถszรถnetnyilvรกnรญtรกs itt talรกlhatรณ:", - "list-contributors-link": "Kรฉszรญtล‘k", + "list-contributors-link": "Kรฉszรญtล‘k", "version": "Verziรณ" }, "config": { @@ -86,7 +81,6 @@ "edit-css-button": "Egyรฉni CSS szerkesztรฉse", "cloud-sync-button": "Szinkronizรกlรกs bekapcsolรกsa", "edit-cloud-sync-button": "Szinkronizรกlรกsi beรกllรญtรกsok szerkesztรฉse", - "rebuild-app-button": "Alkalmazรกs รบjraรฉpรญtรฉse", "change-language-button": "Nyelv mรณdosรญtรกsa", "reset-settings-button": "Helyi beรกllรญtรกsok visszaรกllรญtรกsa", "disabled-note": "Nรฉhรกny beรกllรญtรกsi lehetล‘sรฉget a rendszergazda letiltott", @@ -180,20 +174,6 @@ "warning-msg-validation": "ร‰rvรฉnyesรญtรฉsi figyelmeztetรฉs", "not-admin-note": "Nem รญrhatsz a lemezre, mert nem rendszergazdakรฉnt vagy bejelentkezve" }, - "app-rebuild": { - "title": "Alkalmazรกs รบjraรฉpรญtรฉse", - "rebuild-note-l1": "A vรกltoztatรกsok รฉrvรฉnyesรญtรฉsรฉhez mรกr nem szรผksรฉges รบjraรฉpรญtรฉs.", - "rebuild-note-l2": "Bizonyos beรกllรญtรกsok (pรฉldรกul a belรฉpรฉsi pont รฉs a hitelesรญtรฉs) csak az รฉpรญtรฉs sorรกn kerรผlnek betรถltรฉsre, ezรฉrt ezekhez รบjraรฉpรญtรฉst kell indรญtani.", - "rebuild-note-l3": "Ez a funkciรณ csak Node รฉs Docker telepรญtรฉseken รฉrhetล‘ el, statikus verziรณkban nem.", - "rebuild-button": "Build indรญtรกsa", - "rebuilding-status-1": "Build folyamatban...", - "rebuilding-status-2": "Ez nรฉhรกny percet igรฉnybe vehet", - "error-permission": "Nincs jogosultsรกgod a folyamat elindรญtรกsรกhoz", - "success-msg": "Az รบjraรฉpรญtรฉs sikeresen befejezล‘dรถtt", - "fail-msg": "Az รบjraรฉpรญtรฉs sikertelen volt", - "reload-note": "A vรกltoztatรกsok รฉrvรฉnyesรญtรฉsรฉhez frissรญteni kell az oldalt", - "reload-button": "Oldal รบjratรถltรฉse" - }, "cloud-sync": { "title": "Mentรฉs felhล‘be, visszaรกllรญtรกs", "intro-l1": "A mentรฉs felhล‘be, visszaรกllรญtรกs egy vรกlaszthatรณ funkciรณ, amellyel feltรถltheted a beรกllรญtรกsaidat az internetre, majd bรกrmely mรกsik Dashy pรฉldรกnyban visszaรกllรญthatod azokat.", @@ -251,12 +231,6 @@ "remove-section": "Eltรกvolรญtรกs" } }, - "footer": { - "dev-by": "Fejlesztette", - "licensed-under": "Licenc tรญpusa:", - "get-the": "Nรฉzd meg a", - "source-code": "forrรกskรณdot" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "Belรฉpรฉs az interaktรญv szerkesztล‘be", diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index 974f802df7..db2d8fcc4a 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -44,7 +44,6 @@ "edit-css-button": "Modifica CSS personalizzato", "cloud-sync-button": "Abilita sincronizzazione cloud", "edit-cloud-sync-button": "Modifica sincronizzazione cloud", - "rebuild-app-button": "Ricompila l'applicazione", "change-language-button": "Cambia la lingua dell'app", "reset-settings-button": "Ripristina impostazioni locali", "app-info-button": "Informazioni sull'app", @@ -130,20 +129,6 @@ "warning-msg-validation": "Avviso di convalida", "not-admin-note": "Non puoi scrivere le modifiche su disco, perchรฉ non sei autenticato come amministratore" }, - "app-rebuild": { - "title": "Ricompila l'applicazione", - "rebuild-note-l1": "รˆ necessaria una ricompilazione affinchรฉ le modifiche scritte nel file conf.yml abbiano effetto.", - "rebuild-note-l2": "La ricompilazione dovrebbe avvenire automaticamente, in caso contrario, puรฒ essere avviata manualmente.", - "rebuild-note-l3": "Questo non รจ richiesto per le modifiche memorizzate localmente.", - "rebuild-button": "Inizia la ricompilazione", - "rebuilding-status-1": "Ricompilazione...", - "rebuilding-status-2": "Questo potrebbe richiedere alcuni minuti", - "error-permission": "Non hai l'autorizzazione per avviare questa azione", - "success-msg": "Build completata con successo", - "fail-msg": "Operazione di ricompilazione non riuscita", - "reload-note": "รˆ necessario ricaricare la pagina affinchรฉ le modifiche abbiano effetto", - "reload-button": "Ricarica la pagina" - }, "cloud-sync": { "title": "Backup e Restore su Cloud", "intro-l1": "Il backup e il restore su cloud consentono di salvare la tua configurazione su un server internet e quindi ripristinarla su qualsiasi altro dispositivo o istanza Dashy.", @@ -292,4 +277,4 @@ "good-service-rest": "Buon servizio su tutte le altre Linee" } } -} \ No newline at end of file +} diff --git a/src/assets/locales/ja.json b/src/assets/locales/ja.json index af399ea420..8fb80cbc00 100644 --- a/src/assets/locales/ja.json +++ b/src/assets/locales/ja.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "ใ‚ขใƒ—ใƒชๆƒ…ๅ ฑ", - "error-log": "ใ‚จใƒฉใƒผใƒญใ‚ฐ", - "no-errors": "ใ‚จใƒฉใƒผใฏใ‚ใ‚Šใพใ›ใ‚“", - "help-support": "ใƒ˜ใƒซใƒ—ใจใ‚ตใƒใƒผใƒˆ", - "help-support-description": "DashyใฎๅฎŸ่กŒใ‚„่จญๅฎšใซใคใ„ใฆใ‚ตใƒใƒผใƒˆใŒๅฟ…่ฆใชๅ ดๅˆใฏใ€ใ“ใกใ‚‰ใ‚’ใ”่ฆงใใ ใ•ใ„: ", - "help-support-discussions": "Discussions", "support-dashy": "Dashyใ‚’ๆ”ฏๆด", "support-dashy-description": "ๅ‚ๅŠ ใ™ใ‚‹ๆ–นๆณ•ใ‚’็Ÿฅใ‚‹ใซใฏใ€ใ“ใกใ‚‰ใ‚’ใ”่ฆงใใ ใ•ใ„: ", "support-dashy-link": "ใ‚ณใƒณใƒˆใƒชใƒ“ใƒฅใƒผใ‚ทใƒงใƒณใƒšใƒผใ‚ธ", @@ -86,7 +81,6 @@ "edit-css-button": "ใ‚ซใ‚นใ‚ฟใƒ CSSใฎ็ทจ้›†", "cloud-sync-button": "ใ‚ฏใƒฉใ‚ฆใƒ‰ๅŒๆœŸใฎๆœ‰ๅŠนๅŒ–", "edit-cloud-sync-button": "ใ‚ฏใƒฉใ‚ฆใƒ‰ๅŒๆœŸใฎ็ทจ้›†", - "rebuild-app-button": "ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใฎๅ†ใƒ“ใƒซใƒ‰", "change-language-button": "ใ‚ขใƒ—ใƒช่จ€่ชžใฎๅค‰ๆ›ด", "reset-settings-button": "ใƒญใƒผใ‚ซใƒซใฎ่จญๅฎšใ‚’ใƒชใ‚ปใƒƒใƒˆ", "disabled-note": "ใ„ใใคใ‹ใฎ่จญๅฎšใฏ็ฎก็†่€…ใซใ‚ˆใฃใฆ็„กๅŠนๅŒ–ใ•ใ‚Œใฆใ„ใพใ™", @@ -180,20 +174,6 @@ "warning-msg-validation": "ใƒใƒชใƒ‡ใƒผใ‚ทใƒงใƒณ่ญฆๅ‘Š", "not-admin-note": "็ฎก็†่€…ใจใ—ใฆใƒญใ‚ฐใ‚คใƒณใ—ใฆใ„ใชใ„ใŸใ‚ใ€ๅค‰ๆ›ดใ‚’ใƒ‡ใ‚ฃใ‚นใ‚ฏใซๆ›ธใ่พผใ‚€ใ“ใจใฏใงใใพใ›ใ‚“" }, - "app-rebuild": { - "title": "ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ๅ†ใƒ“ใƒซใƒ‰", - "rebuild-note-l1": "conf.ymlใƒ•ใ‚กใ‚คใƒซใซๆ›ธใ่พผใพใ‚ŒใŸๅค‰ๆ›ดใ‚’ๆœ‰ๅŠนใซใ™ใ‚‹ใซใฏใ€ๅ†ใƒ“ใƒซใƒ‰ใŒๅฟ…่ฆใงใ™ใ€‚", - "rebuild-note-l2": "ๅ†ใƒ“ใƒซใƒ‰ใฏ่‡ชๅ‹•็š„ใซ่กŒใ‚ใ‚Œใพใ™ใŒใ€ใ‚‚ใ—่กŒใ‚ใ‚Œใฆใ„ใชใ„ๅ ดๅˆใฏใ“ใ“ใงๆ‰‹ๅ‹•ใงๅฎŸ่กŒใงใใพใ™ใ€‚", - "rebuild-note-l3": "ใชใŠใ€ใƒญใƒผใ‚ซใƒซใซไฟๅญ˜ใ•ใ‚ŒใŸๅค‰ๆ›ดใซใฏๅฟ…่ฆใ‚ใ‚Šใพใ›ใ‚“ใ€‚", - "rebuild-button": "ๅ†ใƒ“ใƒซใƒ‰ใ‚’้–‹ๅง‹", - "rebuilding-status-1": "ใƒ“ใƒซใƒ‰...", - "rebuilding-status-2": "ใ“ใ‚Œใซใฏๆ•ฐๅˆ†ใ‹ใ‹ใ‚‹ๅ ดๅˆใŒใ‚ใ‚Šใพใ™", - "error-permission": "ใ“ใฎๆ“ไฝœใ‚’ๅฎŸ่กŒใ™ใ‚‹ๆจฉ้™ใŒใ‚ใ‚Šใพใ›ใ‚“", - "success-msg": "ใƒ“ใƒซใƒ‰ใŒๆญฃๅธธใซๅฎŒไบ†ใ—ใพใ—ใŸ", - "fail-msg": "ใƒ“ใƒซใƒ‰ใซๅคฑๆ•—ใ—ใพใ—ใŸ", - "reload-note": "ๅค‰ๆ›ดใ‚’้ฉ็”จใ™ใ‚‹ใซใฏใƒšใƒผใ‚ธใฎๅ†่ชญใฟ่พผใฟใŒๅฟ…่ฆใงใ™", - "reload-button": "ใƒšใƒผใ‚ธใ‚’ๅ†่ชญใฟ่พผใฟ" - }, "cloud-sync": { "title": "ใ‚ฏใƒฉใ‚ฆใƒ‰ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใจๅพฉๅ…ƒ", "intro-l1": "ใ‚ฏใƒฉใ‚ฆใƒ‰ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใจๅพฉๅ…ƒใฏใ‚ชใƒ—ใ‚ทใƒงใƒณใฎๆฉŸ่ƒฝใงใ™ใ€‚่จญๅฎšใ‚’ใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใ€ไป–ใฎใƒ‡ใƒใ‚คใ‚นใพใŸใฏDashyใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใซๅพฉๅ…ƒใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚", @@ -251,12 +231,6 @@ "remove-section": "ๅ‰Š้™ค" } }, - "footer": { - "dev-by": "Developed by", - "licensed-under": "Licensed under", - "get-the": "Get the", - "source-code": "Source Code" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "ใ‚คใƒณใ‚ฟใƒฉใ‚ฏใƒ†ใ‚ฃใƒ–ใซ็ทจ้›†", diff --git a/src/assets/locales/ko.json b/src/assets/locales/ko.json index 8a72c18f0e..fe9103011a 100644 --- a/src/assets/locales/ko.json +++ b/src/assets/locales/ko.json @@ -44,7 +44,6 @@ "edit-css-button": "์‚ฌ์šฉ์ž ์ •์˜ ์Šคํƒ€์ผ ์ˆ˜์ •ํ•˜๊ธฐ", "cloud-sync-button": "ํด๋ผ์šฐ๋“œ ๋™๊ธฐํ™” ํ™œ์„ฑํ™”", "edit-cloud-sync-button": "ํด๋ผ์šฐ๋“œ ๋™๊ธฐํ™” ์ˆ˜์ •", - "rebuild-app-button": "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ๊ตฌ์ถ•", "change-language-button": "์–ธ์–ด ๋ณ€๊ฒฝ", "reset-settings-button": "์„ค์ • ์ดˆ๊ธฐํ™”", "app-info-button": "์•ฑ ์ •๋ณด", @@ -130,20 +129,6 @@ "warning-msg-validation": "์œ ํšจ์„ฑ ๊ฒ€์ฆ ๊ฒฝ๊ณ ", "not-admin-note": "๊ด€๋ฆฌ์ž๋กœ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””์Šคํฌ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." }, - "app-rebuild": { - "title": "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹ค์‹œ ๋นŒ๋“œ", - "rebuild-note-l1": "conf.yml ํŒŒ์ผ์— ๊ธฐ๋ก๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.", - "rebuild-note-l2": "์ด๊ฒƒ์€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", - "rebuild-note-l3": "๋กœ์ปฌ์— ์ €์žฅ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค..", - "rebuild-button": "๋นŒ๋“œ ์‹œ์ž‘", - "rebuilding-status-1": "๋นŒ๋“œ์ค‘...", - "rebuilding-status-2": "์ด ์ž‘์—…์€ ์ตœ๋Œ€ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", - "error-permission": "์ด ์ž‘์—…์„ ์‹คํ–‰ํ•  ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.", - "success-msg": "๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", - "fail-msg": "๋นŒ๋“œ ์ž‘์—… ์‹คํŒจ", - "reload-note": "๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.", - "reload-button": "ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ" - }, "cloud-sync": { "title": "ํด๋ผ์šฐ๋“œ ๋ฐฑ์—… ๋ฐ ๋ณต์›", "intro-l1": "ํด๋ผ์šฐ๋“œ ๋ฐฑ์—… ๋ฐ ๋ณต์›์€ ์˜ต์…˜ ๊ธฐ๋Šฅ์œผ๋กœ ์„ค์ •์„ ์ธํ„ฐ๋„ท์— ์—…๋กœ๋“œํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ๋‚˜ Dashy ์ธ์Šคํ„ด์Šค์—์„œ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", diff --git a/src/assets/locales/ky.json b/src/assets/locales/ky.json index bb03c9bb08..e6de51419e 100644 --- a/src/assets/locales/ky.json +++ b/src/assets/locales/ky.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "ะขะธั€ะบะตะผะต ะถำฉะฝาฏะฝะดำฉ ะผะฐะฐะปั‹ะผะฐั‚", - "error-log": "ะšะฐั‚ะฐะปะฐั€ ะถัƒั€ะฝะฐะปั‹", - "no-errors": "ะ–ะฐะบั‹ะฝะดะฐ ะบะฐั‚ะฐะปะฐั€ ะฐะฝั‹ะบั‚ะฐะปะณะฐะฝ ะถะพะบ", - "help-support": "ะ–ะฐั€ะดะฐะผ ะถะฐะฝะฐ ะบะพะปะดะพะพ", - "help-support-description": "Dashy'ะดะธ ะธัˆั‚ะตั‚าฏาฏ ะถะต ะบะพะฝั„ะธะณัƒั€ะฐั†ะธัะปะพะพ ะฑะพัŽะฝั‡ะฐ ะถะฐั€ะดะฐะผ ะฐะปัƒัƒ าฏั‡าฏะฝ ั‚ำฉะผำฉะฝะบาฏะณำฉ ะบะฐะนั€ั‹ะปั‹าฃั‹ะท", - "help-support-discussions": "ะขะฐะปะบัƒัƒะปะฐั€", "support-dashy": "Dashy'ะดะธ ะบะพะปะดะพะพ", "support-dashy-description": "ะšะฐั‚ั‹ัˆัƒัƒะฝัƒะฝ ะถะพะปะดะพั€ัƒ ะถำฉะฝาฏะฝะดำฉ ะผะฐะฐะปั‹ะผะฐั‚ ะฐะปัƒัƒ าฏั‡าฏะฝ", "support-dashy-link": "ะกะฐะปั‹ะผ ะบะพัˆะบะพะฝะดะพั€ ะฑะตั‚ะธ", @@ -86,7 +81,6 @@ "edit-css-button": "ำจะทะณำฉั‡ำฉ CSS ั‚าฏะทำฉั‚าฏาฏ", "cloud-sync-button": "ะ‘ัƒะปัƒั‚ั‚ัƒะบ ัะธะฝั…ั€ะพะฝะดะพัˆั‚ัƒั€ัƒัƒะฝัƒ ะธัˆั‚ะตั‚าฏาฏ", "edit-cloud-sync-button": "ะ‘ัƒะปัƒั‚ั‚ัƒะบ ัะธะฝั…ั€ะพะฝะดะพัˆั‚ัƒั€ัƒัƒะฝัƒ ั‚าฏะทำฉั‚าฏาฏ", - "rebuild-app-button": "ะขะธั€ะบะตะผะตะฝะธ ะบะฐะนั€ะฐ ะบัƒั€ัƒัƒ", "change-language-button": "ะขะธั€ะบะตะผะต ั‚ะธะปะธะฝ ำฉะทะณำฉั€ั‚าฏาฏ", "reset-settings-button": "ะ–ะตั€ะณะธะปะธะบั‚าฏาฏ ะถำฉะฝะดำฉำฉะปำฉั€ะดาฏ ะฑะฐัˆั‚ะฐะฟะบั‹ ะฐะฑะฐะปะณะฐ ะบะตะปั‚ะธั€าฏาฏ", "disabled-note": "ะšัั ะฑะธั€ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั ั„ัƒะฝะบั†ะธัะปะฐั€ั‹ ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ั‚ะฐั€ะฐะฑั‹ะฝะฐะฝ ำฉั‡าฏั€าฏะปะณำฉะฝ", @@ -180,20 +174,6 @@ "warning-msg-validation": "ะ’ะฐะปะธะดะฐั†ะธั ััะบะตั€ั‚าฏาฏัาฏ", "not-admin-note": "ะ”ะธัะบะบะต ะถะฐะทัƒัƒ ัƒะบัƒะณัƒ ะถะพะบ, ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ ะบะฐั‚ะฐั€ั‹ ะบะธั€าฏาฏ ะบะตั€ะตะบ" }, - "app-rebuild": { - "title": "ะขะธั€ะบะตะผะตะฝะธ ะบะฐะนั€ะฐ ะบัƒั€ัƒัƒ", - "rebuild-note-l1": "ะะทั‹ั€ะบั‹ ะฒะตั€ัะธัะดะฐ ำฉะทะณำฉั€ั‚าฏาฏะปำฉั€ ะบาฏั‡าฏะฝำฉ ะบะธั€ะธัˆะธ าฏั‡าฏะฝ ะบะฐะนั€ะฐ ะบัƒั€ัƒัƒะฝัƒะฝ ะทะฐั€ั‹ะปั‡ั‹ะปั‹ะณั‹ ะถะพะบ.", - "rebuild-note-l2": "ะšัั ะฑะธั€ ะถำฉะฝะดำฉำฉะปำฉั€ (ะบะธั€าฏาฏ ั‡ะตะบะธั‚ะธ ะถะฐะฝะฐ ะฐัƒั‚ะตะฝั‚ะธั„ะธะบะฐั†ะธั) ะบัƒั€ัƒัƒ ัƒั‡ัƒั€ัƒะฝะดะฐ ะณะฐะฝะฐ ะพะบัƒะปะฐั‚. ะะปะฐั€ะดั‹ ะบะพะปะดะพะฝัƒัƒ าฏั‡าฏะฝ ะบะฐะนั€ะฐ ะบัƒั€ัƒัƒะฝัƒ ะธัˆั‚ะตั‚ะธาฃะธะท.", - "rebuild-note-l3": "ะ‘ัƒะป ั„ัƒะฝะบั†ะธั Node ะถะฐะฝะฐ Docker ะพั€ะฝะพั‚ัƒัƒะปะฐั€ั‹ะฝะดะฐ ะณะฐะฝะฐ ะถะตั‚ะบะธะปะธะบั‚าฏาฏ.", - "rebuild-button": "ะšัƒั€ัƒัƒะฝัƒ ะฑะฐัˆั‚ะพะพ", - "rebuilding-status-1": "ะšัƒั€ัƒะปัƒัƒะดะฐ...", - "rebuilding-status-2": "ะ‘ัƒะป ะฑะธั€ ะฝะตั‡ะต ะผาฏะฝำฉั‚ั‚าฏ ั‚ะฐะปะฐะฟ ะบั‹ะปั‹ัˆั‹ ะผาฏะผะบาฏะฝ", - "error-permission": "ะ‘ัƒะป ะฐั€ะฐะบะตั‚ั‚ะธ ะฐั‚ะบะฐั€ัƒัƒะณะฐ ัƒะบัƒะณัƒาฃัƒะท ะถะพะบ", - "success-msg": "ะšัƒั€ัƒัƒ ะธะนะณะธะปะธะบั‚าฏาฏ ะฐัะบั‚ะฐะดั‹", - "fail-msg": "ะšัƒั€ัƒัƒ ะพะฟะตั€ะฐั†ะธััั‹ ะธัˆะบะต ะฐัˆะฟะฐะดั‹", - "reload-note": "ำจะทะณำฉั€ั‚าฏาฏะปำฉั€ ะบาฏั‡าฏะฝำฉ ะบะธั€ะธัˆะธ าฏั‡าฏะฝ ะฑะฐั€ะฐะบั‚ั‹ ะบะฐะนั€ะฐ ะถาฏะบั‚ำฉำฉ ั‚ะฐะปะฐะฟ ะบั‹ะปั‹ะฝะฐั‚", - "reload-button": "ะ‘ะฐั€ะฐะบั‚ั‹ ะบะฐะนั€ะฐ ะถาฏะบั‚ำฉำฉ" - }, "cloud-sync": { "title": "ะ‘ัƒะปัƒั‚ั‚ัƒะบ ะบะฐะผะดั‹ะบ ะบำฉั‡าฏั€ะผำฉ ะถะฐะฝะฐ ะบะฐะปั‹ะฑั‹ะฝะฐ ะบะตะปั‚ะธั€าฏาฏ", "intro-l1": "ะ‘ัƒะปัƒั‚ั‚ัƒะบ ะบะฐะผะดั‹ะบ ะบำฉั‡าฏั€ะผำฉ โ€“ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธัาฃั‹ะทะดั‹ ะธะฝั‚ะตั€ะฝะตั‚ะบะต ัˆะธั„ั€ะปะตะฝะณะตะฝ ั‚าฏั€ะดำฉ ัะฐะบั‚ะฐะฟ, ะฑะฐัˆะบะฐ ั‚าฏะทะผำฉะบั‚ำฉั€ะดำฉ ะบะฐะปั‹ะฑั‹ะฝะฐ ะบะตะปั‚ะธั€าฏาฏะณำฉ ะผาฏะผะบาฏะฝะดาฏะบ ะฑะตั€ะณะตะฝ ะบะพัˆัƒะผั‡ะฐ ั„ัƒะฝะบั†ะธั.", @@ -251,12 +231,6 @@ "remove-section": "ำจั‡าฏั€าฏาฏ" } }, - "footer": { - "dev-by": "ะ˜ัˆั‚ะตะฟ ั‡ั‹ะณัƒัƒั‡ัƒ", - "licensed-under": "ะ›ะธั†ะตะฝะทะธััั‹", - "get-the": "ะ‘ัƒะปะฐะบ ะบะพะดะดัƒ ะฐะปัƒัƒ", - "source-code": "ะ‘ัƒะปะฐะบ ะบะพะดัƒ" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "ะ˜ะฝั‚ะตั€ะฐะบั‚ะธะฒะดาฏาฏ ั‚าฏะทำฉั‚าฏาฏ ั€ะตะถะธะผะธะฝะต ำฉั‚าฏาฏ", diff --git a/src/assets/locales/nb.json b/src/assets/locales/nb.json index 25aaca7618..9bf6d3384e 100644 --- a/src/assets/locales/nb.json +++ b/src/assets/locales/nb.json @@ -1,172 +1,157 @@ -{ - "home": { - "no-results": "Ingen sรธkeresultater", - "no-data": "Ingen data tilgjengelig" - }, - "search": { - "search-label": "Sรธk", - "search-placeholder": "Begynn รฅ skrive for รฅ filtrere", - "clear-search-tooltip": "Fjern sรธk", - "enter-to-search-web": "Trykk enter for รฅ sรธke pรฅ nettet" - }, - "login": { - "title": "Dashy", - "username-label": "Brukernavn", - "password-label": "Passord", - "login-button": "Logg inn", - "remember-me-label": "Husk meg", - "remember-me-never": "Aldri", - "remember-me-hour": "4 timer", - "remember-me-day": "1 dag", - "remember-me-week": "1 uke", - "error-missing-username": "Mangler brukernavn", - "error-missing-password": "Manglende passord", - "error-incorrect-username": "Bruker ikke funnet", - "error-incorrect-password": "Feil passord", - "success-message": "Logger pรฅ...", - "logout-message": "Logget ut", - "already-logged-in-title": "Allerede logget inn", - "already-logged-in-text": "Du er logget inn som", - "continue-to-dashboard": "Fortsett til dashbordet", - "log-out-button": "Logg ut", - "continue-guest-button": "Fortsett som gjest" - }, - "config": { - "main-tab": "Hovedmeny", - "view-config-tab": "Vis konfigurering", - "edit-config-tab": "Rediger konfigurering", - "custom-css-tab": "Egendefinerte stiler", - "heading": "Konfigurasjonsalternativer", - "download-config-button": "Last ned konfigurasjon", - "edit-config-button": "Rediger konfigurering", - "edit-css-button": "Rediger tilpasset CSS", - "cloud-sync-button": "Aktiver skysynkronisering", - "edit-cloud-sync-button": "Rediger skysynkronisering", - "rebuild-app-button": "Bygg program", - "change-language-button": "Endre sprรฅk", - "reset-settings-button": "Tilbakestill lokale innstillinger", - "app-info-button": "Appinfo", - "backup-note": "Det anbefales รฅ ta en sikkerhetskopi av konfigurasjonen din fรธr du gjรธr endringer.", - "reset-config-msg-l1": "Dette fjerner alle brukerinnstillinger fra lokal lagring, men pรฅvirker ikke din 'conf.yml' -fil.", - "reset-config-msg-l2": "Du bรธr fรธrst ta sikkerhetskopi av eventuelle endringer du har gjort lokalt, hvis du vil bruke dem i fremtiden.", - "reset-config-msg-l3": "Er du sikker pรฅ at du vil fortsette?", - "data-cleared-msg": "Data slettet vellykket", - "actions-label": "Handlinger", - "copy-config-label": "Kopier konfigurasjon", - "data-copied-msg": "Konfig er kopiert til utklippstavlen", - "reset-config-label": "Tilbakestill konfigurasjon", - "css-save-btn": "Lagre endringer", - "css-note-label": "Merk", - "css-note-l1": "Du mรฅ oppdatere siden for at endringene dine skal tre i kraft.", - "css-note-l2": "Overstyring av stiler lagres bare lokalt, sรฅ det anbefales รฅ lage en kopi av CSS.", - "css-note-l3": "For รฅ fjerne alle egendefinerte stiler, slett innholdet og trykk Lagre endringer" - }, - "alternate-views": { - "alternate-view-heading": "Bytt visning", - "default": "Standard", - "workspace": "Workspace", - "minimal": "Minimal" - }, - "settings": { - "theme-label": "Tema", - "layout-label": "Layout", - "layout-auto": "Auto", - "layout-horizontal": "Horisontal", - "layout-vertical": "Vertikal", - "item-size-label": "Enhetsstรธrrelse", - "item-size-small": "Small", - "item-size-medium": "Medium", - "item-size-large": "Large", - "config-launcher-label": "Konfig", - "config-launcher-tooltip": "Oppdater konfigurasjon", - "sign-out-tooltip": "Logg av", - "sign-in-tooltip": "Logg inn", - "sign-in-welcome": "Hei {brukernavn}!" - }, - "updates": { - "app-version-note": "Dashy-versjon", - "up-to-date": "Oppdatert", - "out-of-date": "Oppdatering tilgjengelig", - "unsupported-version-l1": "Du bruker en ikke-stรธttet versjon av Dashy", - "unsupported-version-l2": "For den beste opplevelsen og de siste sikkerhetsoppdateringene, vennligst oppdater til" - }, - "language-switcher": { - "title": "Endre sprรฅk", - "dropdown-label": "Velg et sprรฅk", - "save-button": "Lagre", - "success-msg": "Sprรฅk oppdatert til" - }, - "theme-maker": { - "title": "Temakonfigurator", - "export-button": "Eksporter tilpassede variabler", - "reset-button": "Tilbakestill stiler for", - "show-all-button": "Vis alle variabler", - "save-button": "Lagre", - "cancel-button": "Avbryt", - "saved-toast": "{theme} Oppdatert vellykket", - "copied-toast": "Temadata for {theme} kopiert til utklippstavlen", - "reset-toast": "Egendefinerte farger for {theme} fjernet" - }, - "config-editor": { - "save-location-label": "Lagre beliggenhet", - "location-local-label": "Sรธk lokalt", - "location-disk-label": "Skriv endringer i konfigurasjonsfil", - "save-button": "Lagre endringer", - "valid-label": "Konfigurasjon er gyldig", - "status-success-msg": "Oppgaven fullfรธrt", - "status-fail-msg": "Oppgaven mislyktes", - "success-msg-disk": "Konfigurasjonsfil skrevet til disk vellykket", - "success-msg-local": "Lokale endringer er lagret", - "success-note-l1": "Appen bรธr bygge om automatisk.", - "success-note-l2": "Dette kan ta opptil et minutt.", - "success-note-l3": "Du mรฅ oppdatere siden for at endringene skal tre i kraft.", - "error-msg-save-mode": "Velg en lagringsmodus: lokal eller fil", - "error-msg-cannot-save": "Det oppsto en feil under konfigurering", - "error-msg-bad-json": "Feil i JSON, muligens feilformet", - "warning-msg-validation": "Valideringsadvarsel", - "not-admin-note": "Du kan ikke skrive endret til disk, fordi du ikke er logget inn som admin" - }, - "app-rebuild": { - "title": "Ombygg applikasjon", - "rebuild-note-l1": "En ombygging er nรธdvendig for at endringer skrevet i conf.yml-filen skal tre i kraft.", - "rebuild-note-l2": "Dette bรธr skje automatisk, men hvis det ikke har blitt gjort, kan du manuelt utlรธse det her.", - "rebuild-note-l3": "Dette er ikke nรธdvendig for endringer som er lagret lokalt.", - "rebuild-button": "Start Bygging", - "rebuilding-status-1": "Bygger ...", - "rebuilding-status-2": "Dette kan ta noen minutter", - "error-permission": "Du har ikke tillatelse til รฅ utfรธre denne handlingen", - "success-msg": "Byggingen er fullfรธrt", - "fail-msg": "Byggoperasjonen mislyktes", - "reload-note": "En sideinnlasting er nรฅ nรธdvendig for at endringer skal tre i kraft", - "reload-button": "Last siden pรฅ nytt" - }, - "cloud-sync": { - "title": "Sikkerhetskopiering & gjenoppretting", - "intro-l1": "Sikkerhetskopiering og gjenoppretting er en valgfri funksjon, som lar deg laste opp konfigurasjonen din til internett og deretter gjenopprette den pรฅ en hvilken som helst annen enhet eller forekomst av Dashy.", - "intro-l2": "Alle data er helt ende-til-ende-kryptert med AES, og bruker passordet ditt som nรธkkelen.", - "intro-l3": "For mer informasjon, se", - "backup-title-setup": "Lag en sikkerhetskopi", - "backup-title-update": "Oppdater sikkerhetskopi", - "password-label-setup": "Velg et passord", - "password-label-update": "Skriv inn passordet ditt", - "backup-button-setup": "Sikkerhetskopiering", - "backup-button-update": "Oppdater sikkerhetskopi", - "backup-id-label": "Din sikkerhetskopi-ID", - "backup-id-note": "Dette brukes til รฅ gjenopprette fra sikkerhetskopier senere. Sรฅ behold det, sammen med passordet ditt et trygt sted.", - "restore-title": "Gjenopprett en sikkerhetskopi", - "restore-id-label": "Gjenopprett ID", - "restore-password-label": "Passord", - "restore-button": "Gjenopprett", - "backup-missing-password": "Manglende passord", - "backup-error-unknown": "Kan ikke behandle forespรธrselen", - "backup-error-password": "Feil passord. Skriv inn ditt nรฅvรฆrende passord.", - "backup-success-msg": "Fullfรธrt vellykket", - "restore-success-msg": "Konfigurasjon gjenopprettet vellykket" - }, - "menu": { - "sametab": "ร…pne i nรฅvรฆrende fane", - "newtab": "ร…pne i ny fane", - "modal": "ร…pne i popup-modus", - "workspace": "ร…pne i Workspace-visning" - } -} +{ + "home": { + "no-results": "Ingen sรธkeresultater", + "no-data": "Ingen data tilgjengelig" + }, + "search": { + "search-label": "Sรธk", + "search-placeholder": "Begynn รฅ skrive for รฅ filtrere", + "clear-search-tooltip": "Fjern sรธk", + "enter-to-search-web": "Trykk enter for รฅ sรธke pรฅ nettet" + }, + "login": { + "title": "Dashy", + "username-label": "Brukernavn", + "password-label": "Passord", + "login-button": "Logg inn", + "remember-me-label": "Husk meg", + "remember-me-never": "Aldri", + "remember-me-hour": "4 timer", + "remember-me-day": "1 dag", + "remember-me-week": "1 uke", + "error-missing-username": "Mangler brukernavn", + "error-missing-password": "Manglende passord", + "error-incorrect-username": "Bruker ikke funnet", + "error-incorrect-password": "Feil passord", + "success-message": "Logger pรฅ...", + "logout-message": "Logget ut", + "already-logged-in-title": "Allerede logget inn", + "already-logged-in-text": "Du er logget inn som", + "continue-to-dashboard": "Fortsett til dashbordet", + "log-out-button": "Logg ut", + "continue-guest-button": "Fortsett som gjest" + }, + "config": { + "main-tab": "Hovedmeny", + "view-config-tab": "Vis konfigurering", + "edit-config-tab": "Rediger konfigurering", + "custom-css-tab": "Egendefinerte stiler", + "heading": "Konfigurasjonsalternativer", + "download-config-button": "Last ned konfigurasjon", + "edit-config-button": "Rediger konfigurering", + "edit-css-button": "Rediger tilpasset CSS", + "cloud-sync-button": "Aktiver skysynkronisering", + "edit-cloud-sync-button": "Rediger skysynkronisering", + "change-language-button": "Endre sprรฅk", + "reset-settings-button": "Tilbakestill lokale innstillinger", + "app-info-button": "Appinfo", + "backup-note": "Det anbefales รฅ ta en sikkerhetskopi av konfigurasjonen din fรธr du gjรธr endringer.", + "reset-config-msg-l1": "Dette fjerner alle brukerinnstillinger fra lokal lagring, men pรฅvirker ikke din 'conf.yml' -fil.", + "reset-config-msg-l2": "Du bรธr fรธrst ta sikkerhetskopi av eventuelle endringer du har gjort lokalt, hvis du vil bruke dem i fremtiden.", + "reset-config-msg-l3": "Er du sikker pรฅ at du vil fortsette?", + "data-cleared-msg": "Data slettet vellykket", + "actions-label": "Handlinger", + "copy-config-label": "Kopier konfigurasjon", + "data-copied-msg": "Konfig er kopiert til utklippstavlen", + "reset-config-label": "Tilbakestill konfigurasjon", + "css-save-btn": "Lagre endringer", + "css-note-label": "Merk", + "css-note-l1": "Du mรฅ oppdatere siden for at endringene dine skal tre i kraft.", + "css-note-l2": "Overstyring av stiler lagres bare lokalt, sรฅ det anbefales รฅ lage en kopi av CSS.", + "css-note-l3": "For รฅ fjerne alle egendefinerte stiler, slett innholdet og trykk Lagre endringer" + }, + "alternate-views": { + "alternate-view-heading": "Bytt visning", + "default": "Standard", + "workspace": "Workspace", + "minimal": "Minimal" + }, + "settings": { + "theme-label": "Tema", + "layout-label": "Layout", + "layout-auto": "Auto", + "layout-horizontal": "Horisontal", + "layout-vertical": "Vertikal", + "item-size-label": "Enhetsstรธrrelse", + "item-size-small": "Small", + "item-size-medium": "Medium", + "item-size-large": "Large", + "config-launcher-label": "Konfig", + "config-launcher-tooltip": "Oppdater konfigurasjon", + "sign-out-tooltip": "Logg av", + "sign-in-tooltip": "Logg inn", + "sign-in-welcome": "Hei {brukernavn}!" + }, + "updates": { + "app-version-note": "Dashy-versjon", + "up-to-date": "Oppdatert", + "out-of-date": "Oppdatering tilgjengelig", + "unsupported-version-l1": "Du bruker en ikke-stรธttet versjon av Dashy", + "unsupported-version-l2": "For den beste opplevelsen og de siste sikkerhetsoppdateringene, vennligst oppdater til" + }, + "language-switcher": { + "title": "Endre sprรฅk", + "dropdown-label": "Velg et sprรฅk", + "save-button": "Lagre", + "success-msg": "Sprรฅk oppdatert til" + }, + "theme-maker": { + "title": "Temakonfigurator", + "export-button": "Eksporter tilpassede variabler", + "reset-button": "Tilbakestill stiler for", + "show-all-button": "Vis alle variabler", + "save-button": "Lagre", + "cancel-button": "Avbryt", + "saved-toast": "{theme} Oppdatert vellykket", + "copied-toast": "Temadata for {theme} kopiert til utklippstavlen", + "reset-toast": "Egendefinerte farger for {theme} fjernet" + }, + "config-editor": { + "save-location-label": "Lagre beliggenhet", + "location-local-label": "Sรธk lokalt", + "location-disk-label": "Skriv endringer i konfigurasjonsfil", + "save-button": "Lagre endringer", + "valid-label": "Konfigurasjon er gyldig", + "status-success-msg": "Oppgaven fullfรธrt", + "status-fail-msg": "Oppgaven mislyktes", + "success-msg-disk": "Konfigurasjonsfil skrevet til disk vellykket", + "success-msg-local": "Lokale endringer er lagret", + "success-note-l1": "Appen bรธr bygge om automatisk.", + "success-note-l2": "Dette kan ta opptil et minutt.", + "success-note-l3": "Du mรฅ oppdatere siden for at endringene skal tre i kraft.", + "error-msg-save-mode": "Velg en lagringsmodus: lokal eller fil", + "error-msg-cannot-save": "Det oppsto en feil under konfigurering", + "error-msg-bad-json": "Feil i JSON, muligens feilformet", + "warning-msg-validation": "Valideringsadvarsel", + "not-admin-note": "Du kan ikke skrive endret til disk, fordi du ikke er logget inn som admin" + }, + "cloud-sync": { + "title": "Sikkerhetskopiering & gjenoppretting", + "intro-l1": "Sikkerhetskopiering og gjenoppretting er en valgfri funksjon, som lar deg laste opp konfigurasjonen din til internett og deretter gjenopprette den pรฅ en hvilken som helst annen enhet eller forekomst av Dashy.", + "intro-l2": "Alle data er helt ende-til-ende-kryptert med AES, og bruker passordet ditt som nรธkkelen.", + "intro-l3": "For mer informasjon, se", + "backup-title-setup": "Lag en sikkerhetskopi", + "backup-title-update": "Oppdater sikkerhetskopi", + "password-label-setup": "Velg et passord", + "password-label-update": "Skriv inn passordet ditt", + "backup-button-setup": "Sikkerhetskopiering", + "backup-button-update": "Oppdater sikkerhetskopi", + "backup-id-label": "Din sikkerhetskopi-ID", + "backup-id-note": "Dette brukes til รฅ gjenopprette fra sikkerhetskopier senere. Sรฅ behold det, sammen med passordet ditt et trygt sted.", + "restore-title": "Gjenopprett en sikkerhetskopi", + "restore-id-label": "Gjenopprett ID", + "restore-password-label": "Passord", + "restore-button": "Gjenopprett", + "backup-missing-password": "Manglende passord", + "backup-error-unknown": "Kan ikke behandle forespรธrselen", + "backup-error-password": "Feil passord. Skriv inn ditt nรฅvรฆrende passord.", + "backup-success-msg": "Fullfรธrt vellykket", + "restore-success-msg": "Konfigurasjon gjenopprettet vellykket" + }, + "menu": { + "sametab": "ร…pne i nรฅvรฆrende fane", + "newtab": "ร…pne i ny fane", + "modal": "ร…pne i popup-modus", + "workspace": "ร…pne i Workspace-visning" + } +} diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index 88109e647f..b6618a3561 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -30,7 +30,6 @@ "edit-css-button": "Wijzig Aangepaste CSS", "cloud-sync-button": "Schakel Cloud Synchronisatie In", "edit-cloud-sync-button": "Wijzig Cloud Synchronisatie", - "rebuild-app-button": "Herbouw Applicatie", "change-language-button": "Verander App Taal", "reset-settings-button": "Reset Lokale Instellingen", "app-info-button": "App Info", @@ -103,20 +102,6 @@ "error-msg-bad-json": "Fout in JSON, mogelijk ongeldige structuur", "warning-msg-validation": "Validatie Waarschuwing" }, - "app-rebuild": { - "title": "Herbouw Applicatie", - "rebuild-note-l1": "Het is nodig de applicatie te herbouwen om de veranderingen in conf.yml toe te passen.", - "rebuild-note-l2": "Dit zou automatisch moeten gebeuren, mocht dit niet het geval zijn, kun je het hier handmatig starten.", - "rebuild-note-l3": "Dit is niet nodig voor lokaal opgeslagen aanpassingen.", - "rebuild-button": "Start Build", - "rebuilding-status-1": "Building...", - "rebuilding-status-2": "Dit kan een paar minuten duren", - "error-permission": "Je bent niet bevoegd deze actie uit te voeren", - "success-msg": "Build succesvol uitgevoerd", - "fail-msg": "Build proces gefaald", - "reload-note": "Herlaad de pagina om de veranderingen toe te passen", - "reload-button": "Herlaad Pagina" - }, "cloud-sync": { "title": "Cloud Backup & Herstel", "intro-l1": "Cloud Backup & Herstel is een optionele functie, die het mogelijk maakt om het config bestand naar het internet te uploaden en het te herstellen op een ander apparaat of instantie van Dashy.", diff --git a/src/assets/locales/pl.json b/src/assets/locales/pl.json index 4523fde196..b6fc1f78b3 100644 --- a/src/assets/locales/pl.json +++ b/src/assets/locales/pl.json @@ -42,7 +42,6 @@ "edit-css-button": "Edytuj styl CSS", "cloud-sync-button": "Ustawienia chmury", "edit-cloud-sync-button": "Ustawienia chmury", - "rebuild-app-button": "Przebuduj aplikacjฤ™", "change-language-button": "Zmieล„ jฤ™zyk", "reset-settings-button": "Zresetuj pamiฤ™ฤ‡ podrฤ™cznฤ…", "app-info-button": "Informacje o aplikacji", @@ -126,20 +125,6 @@ "warning-msg-validation": "Ostrzeลผenie", "not-admin-note": "Nie moลผesz zapisywaฤ‡ na dysku, wymagane uprawnienia administratora" }, - "app-rebuild": { - "title": "Przebuduj aplikacjฤ™", - "rebuild-note-l1": "Przebudowanie jest koniecznne po dokonaniu zmian w pliku: conf.yml.", - "rebuild-note-l2": "Powinno to nastฤ…piฤ‡ automatycznie, jeล›li jednak tak siฤ™ nie stanie moลผesz je wymusiฤ‡ tutaj.", - "rebuild-note-l3": "Zmiany w pamiฤ™ci podrฤ™cznej nie wymagajฤ… przebudowania aplikacji.", - "rebuild-button": "Rozpocznij", - "rebuilding-status-1": "Budowanie...", - "rebuilding-status-2": "Moลผe to zajฤ…ฤ‡ kilka minut", - "error-permission": "Nie masz odpowiednich uprawnieล„ do wykonania tej akcji", - "success-msg": "Budowanie zakoล„czone pomyล›lnie", - "fail-msg": "Budowanie nie powiodล‚o siฤ™", - "reload-note": "Zmiany bฤ™dฤ… widoczne po odล›wieลผeniu strony", - "reload-button": "Odล›wieลผ stronฤ™" - }, "cloud-sync": { "title": "Kopia zapasowa w chmurze", "intro-l1": "Tworzenie i przywracanie z chmury to opcjonalna funkcja, ktรณra umoลผliwia zapisanie konfiguracji w sieci, by pรณลบniej wgraฤ‡ je na innym urzฤ…dzeniu z Dashy.", @@ -169,4 +154,4 @@ "modal": "Otwรณrz w oknie modalnym", "workspace": "Otwรณrz w obszarze roboczym" } -} \ No newline at end of file +} diff --git a/src/assets/locales/pt.json b/src/assets/locales/pt.json index c07736dded..d2c535d5ee 100644 --- a/src/assets/locales/pt.json +++ b/src/assets/locales/pt.json @@ -44,11 +44,9 @@ "logged-in-guest": "Logado como convidado. Redirecionando...", "error-guest-access": "O acesso como convidado nรฃo foi permitido" }, - "app-info": { "title": "Informaรงรฃo do App" }, - "config": { "main-tab": "Menu Principal", "view-config-tab": "Ver configuraรงรฃo", @@ -60,7 +58,6 @@ "edit-css-button": "Modificar CSS customizado", "cloud-sync-button": "Habilitar Cloud Sync", "edit-cloud-sync-button": "Modificar Cloud Sync", - "rebuild-app-button": "Recriar aplicaรงรฃo", "change-language-button": "Trocar idioma do app", "reset-settings-button": "Reset de configuraรงรตes locais", "app-info-button": "Informaรงรฃo de App", @@ -146,20 +143,6 @@ "warning-msg-validation": "Erro de validaรงรฃo", "not-admin-note": "Vocรช nรฃo pode salvar essa mudanรงa no disco. Vocรช nรฃo estรก conectado como admin" }, - "app-rebuild": { - "title": "Recriar aplicativo", - "rebuild-note-l1": "ร‰ necessรกrio recriar o aplicativo para que alteraรงรตes no arquivo conf.yml tenham efeito.", - "rebuild-note-l2": "Isso deveria acontecer automaticamente, mas se nรฃo aconteceu vocรช pode fazer manualmente aqui.", - "rebuild-note-l3": "Isso nรฃo รฉ necessรกrio para alteraรงรตes locais", - "rebuild-button": "Comeรงando construรงรฃo", - "rebuilding-status-1": "Construindo...", - "rebuilding-status-2": "Isso pode levar alguns minutos", - "error-permission": "Vocรช nรฃo tem permissรฃo para acionar esta aรงรฃo", - "success-msg": "Construรงรฃo concluรญda com sucesso!", - "fail-msg": "Operaรงรฃo de construรงรฃo falhou", - "reload-note": "Uma atualizaรงรฃo da pรกgina รฉ necessรกria para aplicar as alteraรงรตes.", - "reload-button": "Atualizar pรกgina" - }, "cloud-sync": { "title": "Backup e restauraรงรฃo em nuvem", "intro-l1": "O backup e restauraรงรฃo em nuvem รฉ um recurso opcional que permite fazer upload de sua configuraรงรฃo para a Internet e, em seguida, restaurรก-la em qualquer outro dispositivo ou instรขncia do Dashy.", diff --git a/src/assets/locales/ro.json b/src/assets/locales/ro.json index 9cdf36d142..e260376d4b 100644 --- a/src/assets/locales/ro.json +++ b/src/assets/locales/ro.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "Informaศ›ii Aplicaศ›ie", - "error-log": "Jurnal Erori", - "no-errors": "Nicio eroare recentฤƒ detectatฤƒ", - "help-support": "Ajutor & Suport", - "help-support-description" : "Pentru suport รฎn utilizarea sau configurarea Dashy, consultaศ›i", - "help-support-discussions": "Discuศ›iile", "support-dashy": "Suport pentru Dashy", "support-dashy-description": "Pentru moduri รฎn care poศ›i contribui, verificaศ›i", "support-dashy-link": "Pagina de Contribuศ›ii", @@ -66,14 +61,14 @@ "privacy-and-security-advice": "Pentru sfaturi รฎn securizarea tabloului tฤƒu de bord, poศ›i consulta", "privacy-and-security-advice-link": "Documentele de Management", "privacy-and-security-security-issue": "Dacฤƒ aศ›i descoperit o potenศ›ialฤƒ problemฤƒ de securitate, raportaศ›i-o urmรขnd", - "privacy-and-security-security-policy": "Politica de Securitate", - "license": "Licenศ›ฤƒ", - "license-under": "Licenศ›iat sub", - "licence-third-party": "Pentru licenศ›ele modulelor terศ›e pฤƒrศ›i, vฤƒ rugฤƒm sฤƒ consultaศ›i", - "licence-third-party-link": "Legal", - "list-contributors": "Pentru lista completฤƒ a contribuitorilor ศ™i mulศ›umiri, vedeศ›i", - "list-contributors-link": "Credite", - "version": "Versiune" + "privacy-and-security-security-policy": "Politica de Securitate", + "license": "Licenศ›ฤƒ", + "license-under": "Licenศ›iat sub", + "licence-third-party": "Pentru licenศ›ele modulelor terศ›e pฤƒrศ›i, vฤƒ rugฤƒm sฤƒ consultaศ›i", + "licence-third-party-link": "Legal", + "list-contributors": "Pentru lista completฤƒ a contribuitorilor ศ™i mulศ›umiri, vedeศ›i", + "list-contributors-link": "Credite", + "version": "Versiune" }, "config": { "main-tab": "Meniu Principal", @@ -86,7 +81,6 @@ "edit-css-button": "Editare CSS Personalizat", "cloud-sync-button": "Activeazฤƒ Sincronizarea รฎn Cloud", "edit-cloud-sync-button": "Editare Sincronizare รฎn Cloud", - "rebuild-app-button": "Reconstruire Aplicaศ›ie", "change-language-button": "Schimbฤƒ Limba Aplicaศ›iei", "reset-settings-button": "Reseteazฤƒ Setฤƒrile Locale", "disabled-note": "Unele caracteristici de configurare au fost dezactivate de administratorul tฤƒu", @@ -180,20 +174,6 @@ "warning-msg-validation": "Avertisment de Validare", "not-admin-note": "Nu puteศ›i scrie modificฤƒrile pe disc deoarece nu sunteศ›i conectat ca administrator" }, - "app-rebuild": { - "title": "Reconstruire Aplicaศ›ie", - "rebuild-note-l1": "O reconstruire este necesarฤƒ pentru ca modificฤƒrile scrise รฎn fiศ™ierul conf.yml sฤƒ aibฤƒ efect.", - "rebuild-note-l2": "Aceasta ar trebui sฤƒ se รฎntรขmple automat, dar dacฤƒ nu s-a รฎntรขmplat, o puteศ›i declanศ™a manual aici.", - "rebuild-note-l3": "Aceasta nu este necesarฤƒ pentru modificฤƒrile stocate local.", - "rebuild-button": "รŽncepeศ›i Reconstruirea", - "rebuilding-status-1": "Se reconstruieศ™te...", - "rebuilding-status-2": "Aceasta poate dura cรขteva minute", - "error-permission": "Nu aveศ›i permisiunea de a declanศ™a aceastฤƒ acศ›iune", - "success-msg": "Reconstruirea a fost completatฤƒ cu succes", - "fail-msg": "Operaศ›iunea de reconstruire a eศ™uat", - "reload-note": "Este necesarฤƒ reรฎncฤƒrcarea paginii pentru ca modificฤƒrile sฤƒ aibฤƒ efect", - "reload-button": "Reรฎncarcฤƒ Pagina" - }, "cloud-sync": { "title": "Backup ศ™i Restaurare รฎn Cloud", "intro-l1": "Backup-ul ศ™i restaurarea รฎn cloud este o caracteristicฤƒ opศ›ionalฤƒ, care vฤƒ permite sฤƒ รฎncฤƒrcaศ›i configuraศ›ia pe internet ศ™i apoi sฤƒ o restauraศ›i pe orice alt dispozitiv sau instanศ›ฤƒ de Dashy.", @@ -237,7 +217,7 @@ "modal": "Modal Pop-Up", "workspace": "Vizualizare Spaศ›iu de Lucru", "clipboard": "Copiazฤƒ รฎn Clipboard", - "options-section-title": "Opศ›iuni", + "options-section-title": "Opศ›iuni", "edit-item": "Editare", "move-item": "Copiazฤƒ sau Mutฤƒ", "remove-item": "ศ˜terge", @@ -251,12 +231,6 @@ "remove-section": "ศ˜terge" } }, - "footer": { - "dev-by": "Dezvoltat de", - "licensed-under": "Licenศ›iat sub", - "get-the": "Obศ›ineศ›i", - "source-code": "Codul Sursฤƒ" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "Intrฤƒ รฎn Editorul Interactiv", @@ -445,4 +419,4 @@ "wasted": "pierdut" } } -} \ No newline at end of file +} diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json index 93de0fdf6c..f8c9984e20 100644 --- a/src/assets/locales/ru.json +++ b/src/assets/locales/ru.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะพ ะŸั€ะธะปะพะถะตะฝะธะธ", - "error-log": "ะ–ัƒั€ะฝะฐะป ะžัˆะธะฑะพะบ", - "no-errors": "ะžัˆะธะฑะพะบ ะฝะต ะทะฐั„ะธะบัะธั€ะพะฒะฐะฝะพ", - "help-support": "ะŸะพะผะพั‰ัŒ ะธ ะŸะพะดะดะตั€ะถะบะฐ", - "help-support-description" : "ะ”ะปั ะฟะพะปัƒั‡ะตะฝะธั ะฟะพะดะดะตั€ะถะบะธ ะฒ ะทะฐะฟัƒัะบะต ะธ ะฝะฐัั‚ั€ะพะนะบะต Dashy, ะพะฑั€ะฐั‚ะธั‚ะตััŒ ะทะฐ ะฟะพะผะพั‰ัŒัŽ ะฝะฐ", - "help-support-discussions": "ัั‚ั€ะฐะฝะธั†ัƒ Discussions", "support-dashy": "ะŸะพะดะดะตั€ะถะฐั‚ัŒ Dashy", "support-dashy-description": "ะ•ัะปะธ ะฒั‹ ั…ะพั‚ะธั‚ะต ะฟะพะดะดะตั€ะถะฐั‚ัŒ ะฟั€ะพะตะบั‚, ะฟะพะถะฐะปัƒะนัั‚ะฐ ะฟะพัะตั‚ะธั‚ะต ัั‚ั€ะฐะฝะธั†ัƒ", "support-dashy-link": "Contributions", @@ -72,7 +67,7 @@ "licence-third-party": "ะ›ะธั†ะตะฝะทะธะธ ะฝะฐ ะผะพะดัƒะปะธ ัั‚ะพั€ะพะฝะฝะธั… ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปะตะน ัะผ.", "licence-third-party-link": "Legal", "list-contributors": "ะงั‚ะพะฑั‹ ะฟะพัะผะพั‚ั€ะตั‚ัŒ ะฟะพะปะฝั‹ะน ัะฟะธัะพะบ ะฐะฒั‚ะพั€ะพะฒ ะธ ะฑะปะฐะณะพะดะฐั€ะฝะพัั‚ะตะน, ัะผ.", - "list-contributors-link": "Credits", + "list-contributors-link": "Credits", "version": "ะ’ะตั€ัะธั" }, "config": { @@ -86,7 +81,6 @@ "edit-css-button": "ะ ะตะดะฐะบั‚ะธั€ะพะฒะฐั‚ัŒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน CSS", "cloud-sync-button": "ะ’ะบะปัŽั‡ะธั‚ัŒ ะพะฑะปะฐั‡ะฝัƒัŽ ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธัŽ", "edit-cloud-sync-button": "ะ˜ะทะผะตะฝะธั‚ัŒ ะพะฑะปะฐั‡ะฝัƒัŽ ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธัŽ", - "rebuild-app-button": "ะŸะตั€ะตัะพะฑั€ะฐั‚ัŒ ะฟั€ะธะปะพะถะตะฝะธะต", "change-language-button": "ะ’ั‹ะฑั€ะฐั‚ัŒ ัะทั‹ะบ", "reset-settings-button": "ะกะฑั€ะพัะธั‚ัŒ ะปะพะบะฐะปัŒะฝั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ", "disabled-note": "ะะตะบะพั‚ะพั€ั‹ะต ะฟัƒะฝะบั‚ั‹ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธะธ ะฑั‹ะปะธ ะพั‚ะบะปัŽั‡ะตะฝั‹ ะฒะฐัˆะธะผ ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ะพะผ", @@ -180,20 +174,6 @@ "warning-msg-validation": "ะŸั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะต ะฒะฐะปะธะดะฐั‚ะพั€ะฐ", "not-admin-note": "ะ’ั‹ ะฝะต ะผะพะถะตั‚ะต ะทะฐะฟะธัะฐั‚ัŒ ะธะทะผะตะฝะตะฝะฝั‹ะต ะฝะฐ ะดะธัะบ, ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒั‹ ะฝะต ะฒะพัˆะปะธ ะฒ ัะธัั‚ะตะผัƒ ะบะฐะบ ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€" }, - "app-rebuild": { - "title": "ะŸะตั€ะตัะพะฑั€ะฐั‚ัŒ ะฟั€ะธะปะพะถะตะฝะธะต", - "rebuild-note-l1": "ะงั‚ะพะฑั‹ ะธะทะผะตะฝะตะฝะธั, ะทะฐะฟะธัะฐะฝะฝั‹ะต ะฒ ั„ะฐะนะป conf.yml, ะฒัั‚ัƒะฟะธะปะธ ะฒ ัะธะปัƒ, ั‚ั€ะตะฑัƒะตั‚ัั ะฟะตั€ะตัะฑะพั€ะบะฐ.", - "rebuild-note-l2": "ะญั‚ะพ ะดะพะปะถะฝะพ ะฟั€ะพะธะทะพะนั‚ะธ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ, ะฝะพ ะตัะปะธ ัั‚ะพะณะพ ะฝะต ะฟั€ะพะธะทะพัˆะปะพ, ะฒั‹ ะผะพะถะตั‚ะต ะทะฐะฟัƒัั‚ะธั‚ัŒ ะตั‘ ะฒั€ัƒั‡ะฝัƒัŽ ะทะดะตััŒ.", - "rebuild-note-l3": "ะ—ะฐะผะตั‚ัŒั‚ะต, ั‡ั‚ะพ ัั‚ะฐ ั„ัƒะฝะบั†ะธั ะดะพัั‚ัƒะฟะฝะฐ ั‚ะพะปัŒะบะพ ะดะปั ัะบะทะตะผะฟะปัั€ะพะฒ ะฟั€ะธะปะพะถะตะฝะธั, ะบะพั‚ะพั€ั‹ะต ะทะฐะฟัƒั‰ะตะฝั‹ ั ะฟะพะผะพั‰ัŒัŽ Node ะธะปะธ Docker, ะฝะพ ะฝะต ะดะปั ั‚ะตั…, ะบะพั‚ะพั€ั‹ะต ะทะฐะฟัƒั‰ะตะฝะฝั‹ ัั‚ะฐั‚ะธั‡ะฝะพ", - "rebuild-button": "ะะฐั‡ะฐั‚ัŒ ัะฑะพั€ะบัƒ", - "rebuilding-status-1": "ะกะฑะพั€ะบะฐ...", - "rebuilding-status-2": "ะญั‚ะพ ะผะพะถะตั‚ ะทะฐะฝัั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ะผะธะฝัƒั‚", - "error-permission": "ะฃ ะฒะฐั ะฝะตั‚ ั€ะฐะทั€ะตัˆะตะฝะธั ะฝะฐ ะทะฐะฟัƒัะบ ัั‚ะพะณะพ ะดะตะนัั‚ะฒะธั", - "success-msg": "ะกะฑะพั€ะบะฐ ัƒัะฟะตัˆะฝะพ ะทะฐะฒะตั€ัˆะตะฝะฐ", - "fail-msg": "ะะต ัƒะดะฐะปะพััŒ ะฒั‹ะฟะพะปะฝะธั‚ัŒ ะพะฟะตั€ะฐั†ะธัŽ ัะฑะพั€ะบะธ", - "reload-note": "ะขะตะฟะตั€ัŒ ะฝัƒะถะฝะพ ะฟะตั€ะตะทะฐะณั€ัƒะทะธั‚ัŒ ัั‚ั€ะฐะฝะธั†ัƒ, ั‡ั‚ะพะฑั‹ ะธะทะผะตะฝะตะฝะธั ะฒัั‚ัƒะฟะธะปะธ ะฒ ัะธะปัƒ.", - "reload-button": "ะŸะตั€ะตะทะฐะณั€ัƒะทะธั‚ัŒ ัั‚ั€ะฐะฝะธั†ัƒ" - }, "cloud-sync": { "title": "ะžะฑะปะฐั‡ะฝะฐั ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั", "intro-l1": "ะžะฑะปะฐั‡ะฝะฐั ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั - ัั‚ะพ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝะฐั ั„ัƒะฝะบั†ะธั, ะบะพั‚ะพั€ะฐั ะฟะพะทะฒะพะปัะตั‚ ะฒะฐะผ ะทะฐะณั€ัƒะทะธั‚ัŒ ัะฒะพัŽ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธัŽ ะฒ ะ˜ะฝั‚ะตั€ะฝะตั‚, ะฐ ะทะฐั‚ะตะผ ะฒะพััั‚ะฐะฝะพะฒะธั‚ัŒ ะตะต ะฝะฐ ะปัŽะฑะพะผ ะดั€ัƒะณะพะผ ัƒัั‚ั€ะพะนัั‚ะฒะต ะธะปะธ ัะบะทะตะผะฟะปัั€ะต Dashy.", @@ -251,12 +231,6 @@ "remove-section": "ะฃะดะฐะปะธั‚ัŒ" } }, - "footer": { - "dev-by": "ะ ะฐะทั€ะฐะฑะพั‚ะฐะฝะพ ", - "licensed-under": "ะ›ะธั†ะตะฝะทะธั€ะพะฒะฐะฝะพ ะฟะพะด", - "get-the": "ะŸะพะปัƒั‡ะธั‚ะต", - "source-code": "ะ˜ัั…ะพะดะฝั‹ะน ะบะพะด" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "ะ’ะพะนั‚ะธ ะฒ ั€ะตะถะธะผ ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธั", diff --git a/src/assets/locales/sk.json b/src/assets/locales/sk.json index 07a355fc1a..775e87dfab 100644 --- a/src/assets/locales/sk.json +++ b/src/assets/locales/sk.json @@ -44,7 +44,6 @@ "edit-css-button": "Upraviลฅ vlastnรฉ CSS", "cloud-sync-button": "Povoliลฅ synchronizรกciu s cloudom", "edit-cloud-sync-button": "Upraviลฅ synchronizรกciu s cloudom", - "rebuild-app-button": "Prestavaลฅ aplikรกciu", "change-language-button": "Zmeniลฅ jazyk aplikรกcie", "reset-settings-button": "Obnoviลฅ miestne nastavenia", "app-info-button": "Informรกcie o aplikรกcii", @@ -130,20 +129,6 @@ "warning-msg-validation": "Upozornenie na validรกciu", "not-admin-note": "Nemรดลพete zapisovaลฅ zmeneny na disk, pretoลพe nie ste prihlรกsenรฝ ako sprรกvca" }, - "app-rebuild": { - "title": "Prestavaลฅ aplikรกciu", - "rebuild-note-l1": "Aby sa zmeny zapรญsanรฉ do sรบboru conf.yml prejavili, je potrebnรฉ opรคtovnรฉ zostavenie.", - "rebuild-note-l2": "Malo by sa to staลฅ automaticky, ale ak sa tak nestalo, mรดลพete to spustiลฅ manuรกlne tu.", - "rebuild-note-l3": "Toto sa nevyลพaduje pre lokรกlne uloลพenรฉ รบpravy.", - "rebuild-button": "Spustite zostavovanie", - "rebuilding-status-1": "Zostavovanie...", - "rebuilding-status-2": "Mรดลพe to trvaลฅ pรกr minรบt", - "error-permission": "Na spustenie tejto akcie nemรกte povolenie", - "success-msg": "Zostavba bola รบspeลกne dokonฤenรก", - "fail-msg": "Operรกcia zostavenia zlyhala", - "reload-note": "Aby sa zmeny prejavili, je teraz potrebnรฉ znovu naฤรญtaลฅ strรกnku", - "reload-button": "Znovu naฤรญtaลฅ strรกnku" - }, "cloud-sync": { "title": "Cloud zรกloha & obnova", "intro-l1": "Cloudovรฉ zรกlohovanie a obnovenie je voliteฤพnรก funkcia, ktorรก vรกm umoลพลˆuje nahraลฅ vaลกu konfigurรกciu na internet a potom ju obnoviลฅ na akomkoฤพvek inom zariadenรญ alebo inลกtancii Dashy.", diff --git a/src/assets/locales/sl.json b/src/assets/locales/sl.json index 6b8fec1365..8b4500daec 100644 --- a/src/assets/locales/sl.json +++ b/src/assets/locales/sl.json @@ -42,7 +42,6 @@ "edit-css-button": "Uredi CSS Po Meri", "cloud-sync-button": "Omogoฤi Sinhronizacijo v Oblaku", "edit-cloud-sync-button": "Ureditev Sinhronizacije v Oblaku", - "rebuild-app-button": "Obnovi Aplikacijo", "change-language-button": "Spremeni Jezik Aplikacije", "reset-settings-button": "Ponastavi Lokalne Nastavitve", "app-info-button": "Informacije o Aplikaciji", @@ -128,20 +127,6 @@ "warning-msg-validation": "Opozorilo o Validaciji", "not-admin-note": "Ne morete zapisati spremenjenega na disk, ker niste prijavljeni kot skrbnik" }, - "app-rebuild": { - "title": "Obnovite Aplikacijo", - "rebuild-note-l1": "Za uveljavitev sprememb, zapisanih v datoteki conf.yml, je potrebna obnovitev.", - "rebuild-note-l2": "To bi se moralo zgoditi samodejno, ฤe pa se ne, lahko to roฤno sproลพite tukaj.", - "rebuild-note-l3": "To ni potrebno za spremembe, shranjene lokalno.", - "rebuild-button": "Zaฤni Graditi", - "rebuilding-status-1": "Gradnja...", - "rebuilding-status-2": "To lahko traja nekaj minut", - "error-permission": "Nimate dovoljenja za izvajanje tega dejanja", - "success-msg": "Gradnja je bila uspeลกno zakljuฤena", - "fail-msg": "Operacija izdelave ni uspela", - "reload-note": "Za uveljavitev sprememb je potrebno osveลพiti stran", - "reload-button": "Osveลพi Stran" - }, "cloud-sync": { "title": "Varnostno Kopiranje & Obnovitev v Oblaku", "intro-l1": "Varnostno kopiranje in obnovitev v oblaku je izbirna funkcija, ki vam omogoฤa, da svojo konfiguracijo shranite v oblak in jo nato obnovite v kateri koli drugi napravi ali primerku Dashyja.", @@ -244,4 +229,4 @@ "view-title": "Ogled Konfiguracije" } } -} \ No newline at end of file +} diff --git a/src/assets/locales/sv.json b/src/assets/locales/sv.json index 0f82c3dcea..7879cc5c1a 100644 --- a/src/assets/locales/sv.json +++ b/src/assets/locales/sv.json @@ -1,283 +1,268 @@ { - "home":{ - "no-results":"Inga sรถkresultat", - "no-data":"Ingen data konfigurerad", - "no-items-section":"Inga objekt att visa รคn" + "home": { + "no-results": "Inga sรถkresultat", + "no-data": "Ingen data konfigurerad", + "no-items-section": "Inga objekt att visa รคn" }, - "search":{ - "search-label":"Sรถk", - "search-placeholder":"Bรถrja skriva fรถr att filtrera", - "clear-search-tooltip":"Rensa sรถk", - "enter-to-search-web":"Tryck pรฅ retur fรถr att sรถka pรฅ webben" + "search": { + "search-label": "Sรถk", + "search-placeholder": "Bรถrja skriva fรถr att filtrera", + "clear-search-tooltip": "Rensa sรถk", + "enter-to-search-web": "Tryck pรฅ retur fรถr att sรถka pรฅ webben" }, "splash-screen": { "loading": "Laddar" }, - "login":{ - "title":"Dashy", - "username-label":"Anvรคndarnamn", - "password-label":"Lรถsenord", - "login-button":"Logga in", - "remember-me-label":"Kom ihรฅg mig", - "remember-me-never":"Aldrig", - "remember-me-hour":"4 Timmar", - "remember-me-day":"1 Dag", - "remember-me-week":"1 Vecka", - "remember-me-long-time":"Lรคnge", - "error-missing-username":"Anvรคndarnamn saknas", - "error-missing-password":"Lรถsenord saknas", - "error-incorrect-username":"Anvรคndaren hittas inte", - "error-incorrect-password":"Fel lรถsenord", - "success-message":"Loggar in...", - "logout-message":"Utloggad", - "already-logged-in-title":"Redan inloggad", - "already-logged-in-text":"Du รคr inloggad som", - "proceed-to-dashboard":"Fortsรคtt till Dashboard", - "log-out-button":"Logga ut", - "proceed-guest-button":"Fortsรคtt som Gรคst" + "login": { + "title": "Dashy", + "username-label": "Anvรคndarnamn", + "password-label": "Lรถsenord", + "login-button": "Logga in", + "remember-me-label": "Kom ihรฅg mig", + "remember-me-never": "Aldrig", + "remember-me-hour": "4 Timmar", + "remember-me-day": "1 Dag", + "remember-me-week": "1 Vecka", + "remember-me-long-time": "Lรคnge", + "error-missing-username": "Anvรคndarnamn saknas", + "error-missing-password": "Lรถsenord saknas", + "error-incorrect-username": "Anvรคndaren hittas inte", + "error-incorrect-password": "Fel lรถsenord", + "success-message": "Loggar in...", + "logout-message": "Utloggad", + "already-logged-in-title": "Redan inloggad", + "already-logged-in-text": "Du รคr inloggad som", + "proceed-to-dashboard": "Fortsรคtt till Dashboard", + "log-out-button": "Logga ut", + "proceed-guest-button": "Fortsรคtt som Gรคst" }, - "config":{ - "main-tab":"Huvudmeny", - "view-config-tab":"Visa konfiguration", - "edit-config-tab":"Redigera konfiguration", - "custom-css-tab":"Egna stilmallar", - "heading":"Konfigurationsalternativ", - "download-config-button":"Visa / Exportera konfiguration", - "edit-config-button":"Redigera konfiguration", - "edit-css-button":"Redigera Custom CSS", - "cloud-sync-button":"Aktivera molnsynk", - "edit-cloud-sync-button":"Redigera molnsynk", - "rebuild-app-button":"Bygg om appen", - "change-language-button":"ร„ndra appsprรฅk", - "reset-settings-button":"ร…terstรคll lokala instรคllningar", - "app-info-button":"Appinfo", - "backup-note":"Det rekommenderas att du gรถr en sรคkerhetskopia av din konfiguration innan du gรถr รคndringar.", - "reset-config-msg-l1":"Detta tar bort alla anvรคndarinstรคllningar frรฅn lokal lagring, men pรฅverkar inte din 'conf.yml'-fil", - "reset-config-msg-l2":"Du bรถr fรถrst gรถra en sรคkerhetskopia av alla รคndringar du har gjort lokalt, om du vill anvรคnda dem i framtiden.", - "reset-config-msg-l3":"ร„r du sรคker pรฅ att du vill fortsรคtta?", - "data-cleared-msg":"Datarensning har lyckats", - "actions-label":"ร…tgรคrder", - "copy-config-label":"Kopiera konfiguration", - "data-copied-msg":"Konfiguration har kopierats till urklipp", - "reset-config-label":"ร…terstรคll konfiguration", - "css-save-btn":"Spara รคndringar", - "css-note-label":"Not", - "css-note-l1":"Du mรฅste uppdatera sidan fรถr att dina รคndringar ska gรคlla.", - "css-note-l2":"Styles overrides lagras bara lokalt, sรฅ det rekommenderas att du gรถr en kopia av din CSS.", - "css-note-l3":"Fรถr att ta bort alla egna stilmallar, radera innehรฅllet och tryck pรฅ Spara รคndringar" + "config": { + "main-tab": "Huvudmeny", + "view-config-tab": "Visa konfiguration", + "edit-config-tab": "Redigera konfiguration", + "custom-css-tab": "Egna stilmallar", + "heading": "Konfigurationsalternativ", + "download-config-button": "Visa / Exportera konfiguration", + "edit-config-button": "Redigera konfiguration", + "edit-css-button": "Redigera Custom CSS", + "cloud-sync-button": "Aktivera molnsynk", + "edit-cloud-sync-button": "Redigera molnsynk", + "change-language-button": "ร„ndra appsprรฅk", + "reset-settings-button": "ร…terstรคll lokala instรคllningar", + "app-info-button": "Appinfo", + "backup-note": "Det rekommenderas att du gรถr en sรคkerhetskopia av din konfiguration innan du gรถr รคndringar.", + "reset-config-msg-l1": "Detta tar bort alla anvรคndarinstรคllningar frรฅn lokal lagring, men pรฅverkar inte din 'conf.yml'-fil", + "reset-config-msg-l2": "Du bรถr fรถrst gรถra en sรคkerhetskopia av alla รคndringar du har gjort lokalt, om du vill anvรคnda dem i framtiden.", + "reset-config-msg-l3": "ร„r du sรคker pรฅ att du vill fortsรคtta?", + "data-cleared-msg": "Datarensning har lyckats", + "actions-label": "ร…tgรคrder", + "copy-config-label": "Kopiera konfiguration", + "data-copied-msg": "Konfiguration har kopierats till urklipp", + "reset-config-label": "ร…terstรคll konfiguration", + "css-save-btn": "Spara รคndringar", + "css-note-label": "Not", + "css-note-l1": "Du mรฅste uppdatera sidan fรถr att dina รคndringar ska gรคlla.", + "css-note-l2": "Styles overrides lagras bara lokalt, sรฅ det rekommenderas att du gรถr en kopia av din CSS.", + "css-note-l3": "Fรถr att ta bort alla egna stilmallar, radera innehรฅllet och tryck pรฅ Spara รคndringar" }, - "alternate-views":{ - "alternate-view-heading":"ร„ndra vy", - "default":"Standard", - "workspace":"Workspace", - "minimal":"Minimal" + "alternate-views": { + "alternate-view-heading": "ร„ndra vy", + "default": "Standard", + "workspace": "Workspace", + "minimal": "Minimal" }, - "settings":{ - "theme-label":"Tema", - "layout-label":"Layout", - "layout-auto":"Auto", - "layout-horizontal":"Vรฅgrรคt", - "layout-vertical":"Lodrรคt", - "item-size-label":"Storlek", - "item-size-small":"Liten", - "item-size-medium":"Mellan", - "item-size-large":"Stor", - "config-launcher-label":"Konfig", - "config-launcher-tooltip":"Uppdatera konfiguration", - "sign-out-tooltip":"Logga ut", - "sign-in-tooltip":"Logga in", - "sign-in-welcome":"Hej {username}!", + "settings": { + "theme-label": "Tema", + "layout-label": "Layout", + "layout-auto": "Auto", + "layout-horizontal": "Vรฅgrรคt", + "layout-vertical": "Lodrรคt", + "item-size-label": "Storlek", + "item-size-small": "Liten", + "item-size-medium": "Mellan", + "item-size-large": "Stor", + "config-launcher-label": "Konfig", + "config-launcher-tooltip": "Uppdatera konfiguration", + "sign-out-tooltip": "Logga ut", + "sign-in-tooltip": "Logga in", + "sign-in-welcome": "Hej {username}!", "hide": "Gรถm", "open": "ร–ppna" }, - "updates":{ - "app-version-note":"Dashy-version", - "up-to-date":"Uppdaterat", - "out-of-date":"Uppdatering finns", - "unsupported-version-l1":"Du anvรคnder en icke-stรถdd version av Dashy", - "unsupported-version-l2":"Fรถr den bรคsta upplevelsen och de senaste sรคkerhetskorrigeringarna, uppdatera till" + "updates": { + "app-version-note": "Dashy-version", + "up-to-date": "Uppdaterat", + "out-of-date": "Uppdatering finns", + "unsupported-version-l1": "Du anvรคnder en icke-stรถdd version av Dashy", + "unsupported-version-l2": "Fรถr den bรคsta upplevelsen och de senaste sรคkerhetskorrigeringarna, uppdatera till" }, - "language-switcher":{ - "title":"ร„ndra appsprรฅk", - "dropdown-label":"Vรคlj sprรฅk", - "save-button":"Spara", - "success-msg":"Sprรฅket har รคndrats till" + "language-switcher": { + "title": "ร„ndra appsprรฅk", + "dropdown-label": "Vรคlj sprรฅk", + "save-button": "Spara", + "success-msg": "Sprรฅket har รคndrats till" }, - "theme-maker":{ - "title":"Temakonfigurator", - "export-button":"Exportera egendefinierade variabler", - "reset-button":"ร…terstรคll stilmallar fรถr", - "show-all-button":"Visa alla variabler", - "change-fonts-button":"ร„ndra typsnitt", - "save-button":"Spara", - "cancel-button":"Avbryt", - "saved-toast":"{theme} har uppdaterats", - "copied-toast":"Temadatan fรถr {theme} har kopierats till urklipp", - "reset-toast":"Egna fรคrger fรถr {theme} har tagits bort" + "theme-maker": { + "title": "Temakonfigurator", + "export-button": "Exportera egendefinierade variabler", + "reset-button": "ร…terstรคll stilmallar fรถr", + "show-all-button": "Visa alla variabler", + "change-fonts-button": "ร„ndra typsnitt", + "save-button": "Spara", + "cancel-button": "Avbryt", + "saved-toast": "{theme} har uppdaterats", + "copied-toast": "Temadatan fรถr {theme} har kopierats till urklipp", + "reset-toast": "Egna fรคrger fรถr {theme} har tagits bort" }, - "config-editor":{ - "save-location-label":"Sparningsplats", - "location-local-label":"Tillรคmpa lokalt", - "location-disk-label":"Skriv รคndringar till konfigurationsfil", - "save-button":"Spara รคndringar", - "preview-button":"Fรถrhandsgranska รคndringar", - "valid-label":"Konfigurationen รคr giltig", - "status-success-msg":"ร…tgรคrden slutfรถrdes", - "status-fail-msg":"ร…tgรคrden misslyckades", - "success-msg-disk":"Konfigurationsfil har skrivits till disk utan problem", - "success-msg-local":"Lokala รคndringar har sparats utan problem", - "success-note-l1":"ร…terskapa", - "success-note-l2":"Detta kan ta upp till en minut.", - "success-note-l3":"Du mรฅste uppdatera sidan fรถr att รคndringar ska gรคlla", - "error-msg-save-mode":"Vรคlj Lagringslรคge: Lokalt eller Fil", - "error-msg-cannot-save":"Ett fel uppstod nรคr konfigurationen skulle sparas", - "error-msg-bad-json":"Fel i JSON, mรถjligen felformaterat", - "warning-msg-validation":"Valideringsvarning", - "not-admin-note":"Du kan inte skriva รคndringar till disk, eftersom du inte รคr inloggad som admin" + "config-editor": { + "save-location-label": "Sparningsplats", + "location-local-label": "Tillรคmpa lokalt", + "location-disk-label": "Skriv รคndringar till konfigurationsfil", + "save-button": "Spara รคndringar", + "preview-button": "Fรถrhandsgranska รคndringar", + "valid-label": "Konfigurationen รคr giltig", + "status-success-msg": "ร…tgรคrden slutfรถrdes", + "status-fail-msg": "ร…tgรคrden misslyckades", + "success-msg-disk": "Konfigurationsfil har skrivits till disk utan problem", + "success-msg-local": "Lokala รคndringar har sparats utan problem", + "success-note-l1": "ร…terskapa", + "success-note-l2": "Detta kan ta upp till en minut.", + "success-note-l3": "Du mรฅste uppdatera sidan fรถr att รคndringar ska gรคlla", + "error-msg-save-mode": "Vรคlj Lagringslรคge: Lokalt eller Fil", + "error-msg-cannot-save": "Ett fel uppstod nรคr konfigurationen skulle sparas", + "error-msg-bad-json": "Fel i JSON, mรถjligen felformaterat", + "warning-msg-validation": "Valideringsvarning", + "not-admin-note": "Du kan inte skriva รคndringar till disk, eftersom du inte รคr inloggad som admin" }, - "app-rebuild":{ - "title":"ร…terskapa appen", - "rebuild-note-l1":"Appen mรฅste รฅterskapas fรถr att รคndringar som skrivits till filen conf.yml ska gรคlla.", - "rebuild-note-l2":"Detta bรถr ske automatiskt, men om det inte har gjort det kan du aktivera det manuellt hรคr.", - "rebuild-note-l3":"Detta krรคvs inte fรถr รคndringar som lagras lokalt.", - "rebuild-button":"ร…terskapa", - "rebuilding-status-1":"ร…terskapar...", - "rebuilding-status-2":"Detta kan ta nรฅgra minuter", - "error-permission":"Du har inte behรถrighet att utfรถra denna รฅtgรคrd", - "success-msg":"ร…terskapning lyckades", - "fail-msg":"ร…terskapning misslyckades", - "reload-note":"En omladdning av sidan krรคvs nu fรถr att รคndringarna ska gรคlla", - "reload-button":"Ladda om sidan" + "cloud-sync": { + "title": "Molnsรคkerhetskopiering och รฅterstรคllning", + "intro-l1": "Molnsรคkerhetskopiering och รฅterstรคllning รคr en valfri funktion som gรถr att du kan ladda upp din konfiguration till internet och sedan รฅterstรคlla den pรฅ nรฅgon annan enhet eller instans av Dashy.", + "intro-l2": "All data รคr fullstรคndigt end-to-end krypterad med AES, med ditt lรถsenord som nyckel.", + "intro-l3": "Fรถr mer information, vรคnligen se", + "backup-title-setup": "Gรถr en sรคkerhetskopia", + "backup-title-update": "Uppdatera sรคkerhetskopia", + "password-label-setup": "Vรคlj lรถsenord", + "password-label-update": "Ange ditt lรถsenord", + "backup-button-setup": "Sรคkerhetskopiering", + "backup-button-update": "Uppdatera sรคkerhetskopia", + "backup-id-label": "Ditt sรคkerhetskopierings-ID", + "backup-id-note": "Detta anvรคnds fรถr att รฅterstรคlla frรฅn sรคkerhetskopior senare. Sรฅ fรถrvara det tillsammans med ditt lรถsenord nรฅgonstans sรคkert.", + "restore-title": "ร…terstรคll en sรคkerhetskopia", + "restore-id-label": "ร…terstรคll ID", + "restore-password-label": "Lรถsenord", + "restore-button": "ร…terstรคll", + "backup-missing-password": "Lรถsenord saknas", + "backup-error-unknown": "Begรคran kan inte behandlas", + "backup-error-password": "Fel lรถsenord. Vรคnligen ange ditt aktuella lรถsenord.", + "backup-success-msg": "Slutfรถrt utan problem", + "restore-success-msg": "Konfigurationen har รฅterstรคllts utan problem" }, - "cloud-sync":{ - "title":"Molnsรคkerhetskopiering och รฅterstรคllning", - "intro-l1":"Molnsรคkerhetskopiering och รฅterstรคllning รคr en valfri funktion som gรถr att du kan ladda upp din konfiguration till internet och sedan รฅterstรคlla den pรฅ nรฅgon annan enhet eller instans av Dashy.", - "intro-l2":"All data รคr fullstรคndigt end-to-end krypterad med AES, med ditt lรถsenord som nyckel.", - "intro-l3":"Fรถr mer information, vรคnligen se", - "backup-title-setup":"Gรถr en sรคkerhetskopia", - "backup-title-update":"Uppdatera sรคkerhetskopia", - "password-label-setup":"Vรคlj lรถsenord", - "password-label-update":"Ange ditt lรถsenord", - "backup-button-setup":"Sรคkerhetskopiering", - "backup-button-update":"Uppdatera sรคkerhetskopia", - "backup-id-label":"Ditt sรคkerhetskopierings-ID", - "backup-id-note":"Detta anvรคnds fรถr att รฅterstรคlla frรฅn sรคkerhetskopior senare. Sรฅ fรถrvara det tillsammans med ditt lรถsenord nรฅgonstans sรคkert.", - "restore-title":"ร…terstรคll en sรคkerhetskopia", - "restore-id-label":"ร…terstรคll ID", - "restore-password-label":"Lรถsenord", - "restore-button":"ร…terstรคll", - "backup-missing-password":"Lรถsenord saknas", - "backup-error-unknown":"Begรคran kan inte behandlas", - "backup-error-password":"Fel lรถsenord. Vรคnligen ange ditt aktuella lรถsenord.", - "backup-success-msg":"Slutfรถrt utan problem", - "restore-success-msg":"Konfigurationen har รฅterstรคllts utan problem" + "menu": { + "open-section-title": "ร–ppna i", + "sametab": "Denna flik", + "newtab": "Ny flik", + "modal": "Pop-Up Modal", + "workspace": "Workspace-vy", + "options-section-title": "Alternativ", + "edit-item": "Redigera", + "move-item": "Kopiera eller flytta", + "remove-item": "Ta bort" }, - "menu":{ - "open-section-title":"ร–ppna i", - "sametab":"Denna flik", - "newtab":"Ny flik", - "modal":"Pop-Up Modal", - "workspace":"Workspace-vy", - "options-section-title":"Alternativ", - "edit-item":"Redigera", - "move-item":"Kopiera eller flytta", - "remove-item":"Ta bort" - }, - "context-menus":{ - "item":{ - "open-section-title":"ร–ppna i", - "sametab":"Denna flik", - "newtab":"Ny flik", - "modal":"Pop-Up Modal", - "workspace":"Workspace View", + "context-menus": { + "item": { + "open-section-title": "ร–ppna i", + "sametab": "Denna flik", + "newtab": "Ny flik", + "modal": "Pop-Up Modal", + "workspace": "Workspace View", "clipboard": "Kopiera till urklipp", - "options-section-title":"Alternativ", - "edit-item":"Redigera", - "move-item":"Kopiera eller flytta", - "remove-item":"Ta bort", + "options-section-title": "Alternativ", + "edit-item": "Redigera", + "move-item": "Kopiera eller flytta", + "remove-item": "Ta bort", "copied-toast": "URLen har blivit kopierad till urklipp" }, - "section":{ - "open-section":"ร–ppna sektion", - "edit-section":"Redigera", + "section": { + "open-section": "ร–ppna sektion", + "edit-section": "Redigera", "expand-collapse": "Expandera / Minimera", - "move-section":"Flytta till", - "remove-section":"Ta bort" + "move-section": "Flytta till", + "remove-section": "Ta bort" } }, - "interactive-editor":{ - "menu":{ - "start-editing-tooltip":"ร–ppna den interaktiva redigeraren", - "edit-site-data-subheading":"Redigera webbplatsinformation", - "edit-page-info-btn":"Redigera sidinformation", - "edit-page-info-tooltip":"Appnamn, beskrivning, navigeringslรคnkar, sidfotstext, etc", - "edit-app-config-btn":"Redigera appkonfiguration", - "edit-app-config-tooltip":"ร–vriga appkonfigurationsalternativ", + "interactive-editor": { + "menu": { + "start-editing-tooltip": "ร–ppna den interaktiva redigeraren", + "edit-site-data-subheading": "Redigera webbplatsinformation", + "edit-page-info-btn": "Redigera sidinformation", + "edit-page-info-tooltip": "Appnamn, beskrivning, navigeringslรคnkar, sidfotstext, etc", + "edit-app-config-btn": "Redigera appkonfiguration", + "edit-app-config-tooltip": "ร–vriga appkonfigurationsalternativ", "edit-pages-btn": "Editera sidor", "edit-pages-tooltip": "Lรคgg till eller ta bort ytterligare vyer", - "config-save-methods-subheading":"Alternativ fรถr konfigurationssparande", - "save-locally-btn":"Spara lokalt", - "save-locally-tooltip":"Spara konfigurationen lokalt, till webblรคsarens lagring. Detta pรฅverkar inte din konfigurationsfil, men รคndringarna sparas bara pรฅ denna enhet", - "save-disk-btn":"Spara till disk", - "save-disk-tooltip":"Spara konfiguration till conf.yml-filen pรฅ disk. Detta kommer att sรคkerhetskopiera och sedan skriva รถver din befintliga konfiguration", - "export-config-btn":"Exportera konfiguration", - "export-config-tooltip":"Visa och exportera den nya konfigurationen, antingen till fil eller urklipp", - "cloud-backup-btn":"Sรคkerhetskopiera till molnet", - "cloud-backup-tooltip":"Spara krypterad sรคkerhetskopia av konfigurationen i molnet", - "edit-raw-config-btn":"Redigera rawkonfiguration", - "edit-raw-config-tooltip":"Visa och redigera rawkonfiguration via JSON-redigeraren", - "cancel-changes-btn":"Avbryt redigering", - "cancel-changes-tooltip":"Radera nuvarande รคndringar och lรคmna Redigeringslรคge. Detta kommer inte pรฅverka din sparade konfiguration.", - "edit-mode-name":"Redigeringslรคge", - "edit-mode-subtitle":"Du รคr i Redigeringslรคge", - "edit-mode-description":"Detta innebรคr att du kan gรถra รคndringar i din konfiguration och fรถrhandsgranska resultaten, men tills du sparar kommer inga av dina รคndringar att bevaras.", - "save-stage-btn":"Spara", - "cancel-stage-btn":"Avbryt" + "config-save-methods-subheading": "Alternativ fรถr konfigurationssparande", + "save-locally-btn": "Spara lokalt", + "save-locally-tooltip": "Spara konfigurationen lokalt, till webblรคsarens lagring. Detta pรฅverkar inte din konfigurationsfil, men รคndringarna sparas bara pรฅ denna enhet", + "save-disk-btn": "Spara till disk", + "save-disk-tooltip": "Spara konfiguration till conf.yml-filen pรฅ disk. Detta kommer att sรคkerhetskopiera och sedan skriva รถver din befintliga konfiguration", + "export-config-btn": "Exportera konfiguration", + "export-config-tooltip": "Visa och exportera den nya konfigurationen, antingen till fil eller urklipp", + "cloud-backup-btn": "Sรคkerhetskopiera till molnet", + "cloud-backup-tooltip": "Spara krypterad sรคkerhetskopia av konfigurationen i molnet", + "edit-raw-config-btn": "Redigera rawkonfiguration", + "edit-raw-config-tooltip": "Visa och redigera rawkonfiguration via JSON-redigeraren", + "cancel-changes-btn": "Avbryt redigering", + "cancel-changes-tooltip": "Radera nuvarande รคndringar och lรคmna Redigeringslรคge. Detta kommer inte pรฅverka din sparade konfiguration.", + "edit-mode-name": "Redigeringslรคge", + "edit-mode-subtitle": "Du รคr i Redigeringslรคge", + "edit-mode-description": "Detta innebรคr att du kan gรถra รคndringar i din konfiguration och fรถrhandsgranska resultaten, men tills du sparar kommer inga av dina รคndringar att bevaras.", + "save-stage-btn": "Spara", + "cancel-stage-btn": "Avbryt" }, - "edit-item":{ - "missing-title-err":"Objektet mรฅste ha en titel" + "edit-item": { + "missing-title-err": "Objektet mรฅste ha en titel" }, - "edit-section":{ - "edit-section-title":"Redigera sektion", - "add-section-title":"Lรคgg till ny sektion", - "edit-tooltip":"Tryck fรถr att redigera eller hรถgerklicka fรถr fler alternativ", - "remove-confirm":"ร„r du sรคker pรฅ att du vill ta bort denna sektion? Denna รฅtgรคrd kan รฅngras senare." + "edit-section": { + "edit-section-title": "Redigera sektion", + "add-section-title": "Lรคgg till ny sektion", + "edit-tooltip": "Tryck fรถr att redigera eller hรถgerklicka fรถr fler alternativ", + "remove-confirm": "ร„r du sรคker pรฅ att du vill ta bort denna sektion? Denna รฅtgรคrd kan รฅngras senare." }, - "edit-app-config":{ - "warning-msg-title":"Fortsรคtt med fรถrsiktighet", - "warning-msg-l1":"Fรถljande alternativ รคr fรถr avancerade appkonfigurationer.", - "warning-msg-l2":"Om du รคr osรคker pรฅ nรฅgot av fรคlten, vรคnligen kolla", - "warning-msg-docs":"dokumentationen", - "warning-msg-l3":"fรถr att undvika oavsiktliga konsekvenser." + "edit-app-config": { + "warning-msg-title": "Fortsรคtt med fรถrsiktighet", + "warning-msg-l1": "Fรถljande alternativ รคr fรถr avancerade appkonfigurationer.", + "warning-msg-l2": "Om du รคr osรคker pรฅ nรฅgot av fรคlten, vรคnligen kolla", + "warning-msg-docs": "dokumentationen", + "warning-msg-l3": "fรถr att undvika oavsiktliga konsekvenser." }, - "export":{ - "export-title":"Exportera konfiguration", - "copy-clipboard-btn":"Kopiera till urklipp", - "copy-clipboard-tooltip":"Kopiera alla appkonfigurationer till systemets urklipp i YAML-format", - "download-file-btn":"Ladda ned som fil", - "download-file-tooltip":"Ladda ner alla appkonfigurationer till din enhet som en YAML-fil", - "view-title":"Visa konfiguration" + "export": { + "export-title": "Exportera konfiguration", + "copy-clipboard-btn": "Kopiera till urklipp", + "copy-clipboard-tooltip": "Kopiera alla appkonfigurationer till systemets urklipp i YAML-format", + "download-file-btn": "Ladda ned som fil", + "download-file-tooltip": "Ladda ner alla appkonfigurationer till din enhet som en YAML-fil", + "view-title": "Visa konfiguration" } }, - "widgets":{ - "general":{ - "loading":"Laddar...", - "show-more":"Visa mer info", - "show-less":"Visa mindre", - "open-link":"Lรคs mer" + "widgets": { + "general": { + "loading": "Laddar...", + "show-more": "Visa mer info", + "show-less": "Visa mindre", + "open-link": "Lรคs mer" }, - "pi-hole":{ - "status-heading":"Status" + "pi-hole": { + "status-heading": "Status" }, - "stat-ping":{ - "up":"Online", - "down":"Offline" + "stat-ping": { + "up": "Online", + "down": "Offline" }, - "net-data":{ - "cpu-chart-title":"CPU History", - "mem-chart-title":"Memory Usage", - "mem-breakdown-title":"Memory Breakdown", - "load-chart-title":"System Load" + "net-data": { + "cpu-chart-title": "CPU History", + "mem-chart-title": "Memory Usage", + "mem-breakdown-title": "Memory Breakdown", + "load-chart-title": "System Load" }, "glances": { "disk-space-free": "Ledigt", @@ -288,16 +273,16 @@ "disk-io-write": "Skriv", "system-load-desc": "Antal processer som vรคntar i run-queue, i genomsnitt รถver alla kรคrnor" }, - "system-info":{ - "uptime":"Uptime" + "system-info": { + "uptime": "Uptime" }, - "flight-data":{ - "arrivals":"Ankomster", - "departures":"Avgรฅngar" + "flight-data": { + "arrivals": "Ankomster", + "departures": "Avgรฅngar" }, - "tfl-status":{ - "good-service-all":"God service pรฅ alla linjer", - "good-service-rest":"God Service pรฅ รถvriga linjer" + "tfl-status": { + "good-service-all": "God service pรฅ alla linjer", + "good-service-rest": "God Service pรฅ รถvriga linjer" }, "gluetun-status": { "vpn-ip": "VPN IP", diff --git a/src/assets/locales/tr.json b/src/assets/locales/tr.json index 36da7ed22a..a733825f3a 100644 --- a/src/assets/locales/tr.json +++ b/src/assets/locales/tr.json @@ -47,11 +47,6 @@ }, "app-info": { "title": "Uygulama Bilgisi", - "error-log": "Hata GรผnlรผฤŸรผ", - "no-errors": "Son zamanlarda hata tespit edilmedi", - "help-support": "Yardฤฑm ve Destek", - "help-support-description": "Dashy'nin รงalฤฑลŸtฤฑrฤฑlmasฤฑ veya yapฤฑlandฤฑrฤฑlmasฤฑ konusunda destek almak iรงin ลŸuraya bakฤฑn:", - "help-support-discussions": "TartฤฑลŸmalar", "support-dashy": "Dashy'yi Destekleyin", "support-dashy-description": "Katkฤฑda bulunabileceฤŸiniz yollar iรงin ลŸuraya gรถz atฤฑn:", "support-dashy-link": "Katkฤฑ sayfasฤฑ", @@ -87,7 +82,6 @@ "edit-css-button": "ร–zel CSS Dรผzenle", "cloud-sync-button": "Bulut Senkronizasyonu EtkinleลŸtir", "edit-cloud-sync-button": "Bulut Senkronizasyonu Dรผzenle", - "rebuild-app-button": "Uygulamayฤฑ Tekrar Derle", "change-language-button": "Uygulama Dilini DeฤŸiลŸtir", "reset-settings-button": "Yerel Ayarlarฤฑ Sฤฑfฤฑrla", "disabled-note": "Bazฤฑ yapฤฑlandฤฑrma รถzellikleri yรถneticiniz tarafฤฑndan devre dฤฑลŸฤฑ bฤฑrakฤฑlmฤฑลŸtฤฑr", @@ -181,20 +175,6 @@ "warning-msg-validation": "DoฤŸrulama Uyarฤฑsฤฑ", "not-admin-note": "Yรถnetici olarak giriลŸ yapmadฤฑฤŸฤฑnฤฑz iรงin deฤŸiลŸtirilenleri diske yazamazsฤฑnฤฑz." }, - "app-rebuild": { - "title": "Uygulamayฤฑ Yeniden Derle", - "rebuild-note-l1": "Artฤฑk yeniden derleme gerekli deฤŸildir.", - "rebuild-note-l2": "Bazฤฑ deฤŸiลŸiklikler (giriลŸ noktasฤฑ ve kimlik doฤŸrulama ayarlarฤฑ) derleme sฤฑrasฤฑnda okunur. Bu nedenle bunlarฤฑ uygulamak iรงin buradan yeniden derleme tetiklemelisiniz.", - "rebuild-note-l3": "Bunun yalnฤฑzca Node ve Docker kurulumlarฤฑnda kullanฤฑlabildiฤŸini, statik olarak daฤŸฤฑtฤฑlan รถrneklerde kullanฤฑlamadฤฑฤŸฤฑnฤฑ unutmayฤฑn.", - "rebuild-button": "Derlemeye BaลŸla", - "rebuilding-status-1": "Derleniyor...", - "rebuilding-status-2": "Bu bir kaรง dakika alabilir", - "error-permission": "Bu eylemi tetikleme izniniz yok", - "success-msg": "Derleme baลŸarฤฑyla tamamlandฤฑ", - "fail-msg": "Derleme baลŸarฤฑsฤฑz oldu", - "reload-note": "DeฤŸiลŸikliklerin etkili olmasฤฑ iรงin sayfanฤฑn yeniden yรผklenmesi gerekiyor", - "reload-button": "Sayfayฤฑ Yenile" - }, "cloud-sync": { "title": "Bulut Yedekleme ve Geri Yรผkleme", "intro-l1": "Bulut yedekleme ve geri yรผkleme, yapฤฑlandฤฑrmanฤฑzฤฑ internete yรผklemenizi ve ardฤฑndan herhangi bir baลŸka cihaza veya Dashy รถrneฤŸine geri yรผklemenizi saฤŸlayan isteฤŸe baฤŸlฤฑ bir รถzelliktir.", @@ -253,12 +233,6 @@ "remove-section": "Kaldฤฑr" } }, - "footer": { - "dev-by": "GeliลŸtiren", - "licensed-under": "Lisans tรผrรผ", - "get-the": "Edinin", - "source-code": "Kaynak Kodu" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "EtkileลŸimli Dรผzenleyiciye girin", diff --git a/src/assets/locales/uk.json b/src/assets/locales/uk.json index 9ae4dc29bd..f4362117df 100644 --- a/src/assets/locales/uk.json +++ b/src/assets/locales/uk.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "ะ†ะฝั„ะพั€ะผะฐั†ั–ั ะฟั€ะพ ะฟั€ะพะณั€ะฐะผัƒ", - "error-log": "ะ–ัƒั€ะฝะฐะป ะฟะพะผะธะปะพะบ", - "no-errors": "ะžัั‚ะฐะฝะฝั–ั… ะฟะพะผะธะปะพะบ ะฝะต ะฒะธัะฒะปะตะฝะพ", - "help-support": "ะ”ะพะฟะพะผะพะณะฐ ั‚ะฐ ะฟั–ะดั‚ั€ะธะผะบะฐ", - "help-support-description": "ะฉะพะฑ ะพั‚ั€ะธะผะฐั‚ะธ ะฟั–ะดั‚ั€ะธะผะบัƒ ั‰ะพะดะพ ะทะฐะฟัƒัะบัƒ ั‡ะธ ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั Dashy, ะดะธะฒ.", - "help-support-discussions": "ะžะฑะณะพะฒะพั€ะตะฝะฝั", "support-dashy": "ะŸั–ะดั‚ั€ะธะผะบะฐ Dashy", "support-dashy-description": "ะฉะพะฑ ะดั–ะทะฝะฐั‚ะธัั, ัะบ ะฒะธ ะผะพะถะตั‚ะต ะฒะทัั‚ะธ ัƒั‡ะฐัั‚ัŒ, ะฟะตั€ะตะณะปัะฝัŒั‚ะต", "support-dashy-link": "ะกั‚ะพั€ั–ะฝะบะฐ ะฒะฝะตัะบั–ะฒ", @@ -86,7 +81,6 @@ "edit-css-button": "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ะบะพั€ะธัั‚ัƒะฒะฐั†ัŒะบะธะน CSS", "cloud-sync-button": "ะฃะฒั–ะผะบะฝัƒั‚ะธ ั…ะผะฐั€ะฝัƒ ัะธะฝั…ั€ะพะฝั–ะทะฐั†ั–ัŽ", "edit-cloud-sync-button": "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ั…ะผะฐั€ะฝัƒ ัะธะฝั…ั€ะพะฝั–ะทะฐั†ั–ัŽ", - "rebuild-app-button": "ะŸะตั€ะตะฑัƒะดัƒะฒะฐั‚ะธ ะฟั€ะพะณั€ะฐะผัƒ", "change-language-button": "ะ—ะผั–ะฝะธั‚ะธ ะผะพะฒัƒ ะฟั€ะพะณั€ะฐะผะธ", "reset-settings-button": "ะกะบะธะฝัƒั‚ะธ ะปะพะบะฐะปัŒะฝั– ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั", "disabled-note": "ะ”ะตัะบั– ั„ัƒะฝะบั†ั–ั— ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝัŒ ะฑัƒะปะธ ะฒะธะผะบะฝะตะฝั– ะฐะดะผั–ะฝั–ัั‚ั€ะฐั‚ะพั€ะพะผ", @@ -180,20 +174,6 @@ "warning-msg-validation": "ะŸะพะฟะตั€ะตะดะถะตะฝะฝั ะฟั€ะพ ะฟะตั€ะตะฒั–ั€ะบัƒ", "not-admin-note": "ะ’ะธ ะฝะต ะผะพะถะตั‚ะต ะทะฐะฟะธัะฐั‚ะธ ะทะผั–ะฝะธ ะฝะฐ ะดะธัะบ, ะพัะบั–ะปัŒะบะธ ะฒะธ ะฝะต ัƒะฒั–ะนัˆะปะธ ัะบ ะฐะดะผั–ะฝั–ัั‚ั€ะฐั‚ะพั€" }, - "app-rebuild": { - "title": "ะŸะตั€ะตะฑัƒะดัƒะฒะฐั‚ะธ ะฟั€ะพะณั€ะฐะผัƒ", - "rebuild-note-l1": "ะŸะตั€ะตะฑัƒะดะพะฒะฐ ะฟะพั‚ั€ั–ะฑะฝะฐ, ั‰ะพะฑ ะทะผั–ะฝะธ, ะทะฐะฟะธัะฐะฝั– ัƒ ั„ะฐะนะป conf.yml, ะฝะฐะฑัƒะปะธ ั‡ะธะฝะฝะพัั‚ั–.", - "rebuild-note-l2": "ะฆะต ะผะฐั” ัั‚ะฐั‚ะธัั ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ, ะฐะปะต ัะบั‰ะพ ั†ัŒะพะณะพ ะฝะต ัั‚ะฐะปะพัั, ะฒะธ ะผะพะถะตั‚ะต ะทะฐะฟัƒัั‚ะธั‚ะธ ั†ะต ะทะฒั–ะดัะธ ะฒั€ัƒั‡ะฝัƒ.", - "rebuild-note-l3": "ะฆะต ะฝะต ะฟะพั‚ั€ั–ะฑะฝะพ ะดะปั ะทะผั–ะฝ, ัะบั– ะทะฑะตั€ั–ะณะฐัŽั‚ัŒัั ะปะพะบะฐะปัŒะฝะพ.", - "rebuild-button": "ะŸะพั‡ะฐั‚ะธ ะทะฑั–ั€ะบัƒ", - "rebuilding-status-1": "ะ—ะฑะธั€ะฐั”ะผะพ...", - "rebuilding-status-2": "ะฆะต ะผะพะถะต ะทะฐะนะฝัั‚ะธ ะบั–ะปัŒะบะฐ ั…ะฒะธะปะธะฝ", - "error-permission": "ะฃ ะฒะฐั ะฝะตะผะฐั” ะดะพะทะฒะพะปัƒ ั–ะฝั–ั†ั–ัŽะฒะฐั‚ะธ ั†ัŽ ะดั–ัŽ", - "success-msg": "ะ—ะฑั–ั€ะบัƒ ะทะฐะฒะตั€ัˆะตะฝะพ ัƒัะฟั–ัˆะฝะพ", - "fail-msg": "ะŸะพะผะธะปะบะฐ ะฟั€ะธ ะฒะธะบะพะฝะฐะฝะฝั– ะทะฑั–ั€ะบะธ", - "reload-note": "ะขะตะฟะตั€ ะฟะพั‚ั€ั–ะฑะฝะพ ะฟะตั€ะตะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ ัั‚ะพั€ั–ะฝะบัƒ, ั‰ะพะฑ ะทะผั–ะฝะธ ะฝะฐะฑัƒะปะธ ั‡ะธะฝะฝะพัั‚ั–", - "reload-button": "ะŸะตั€ะตะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ ัั‚ะพั€ั–ะฝะบัƒ" - }, "cloud-sync": { "title": "ะ ะตะทะตั€ะฒะฝะต ะบะพะฟั–ัŽะฒะฐะฝะฝั ั‚ะฐ ะฒั–ะดะฝะพะฒะปะตะฝะฝั ัƒ ั…ะผะฐั€ั–", "intro-l1": "ะ ะตะทะตั€ะฒะฝะต ะบะพะฟั–ัŽะฒะฐะฝะฝั ั‚ะฐ ะฒั–ะดะฝะพะฒะปะตะฝะฝั ะฒ ั…ะผะฐั€ั– ั” ะดะพะดะฐั‚ะบะพะฒะพัŽ ั„ัƒะฝะบั†ั–ั”ัŽ, ัะบะฐ ะดะฐั” ะทะผะพะณัƒ ะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ ะฒะฐัˆะต ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั ะฒ ะ†ะฝั‚ะตั€ะฝะตั‚, ะฐ ะฟะพั‚ั–ะผ ะฒั–ะดะฝะพะฒะธั‚ะธ ั—ั— ะฝะฐ ะฑัƒะดัŒ-ัะบะพะผัƒ ั–ะฝัˆะพะผัƒ ะฟั€ะธัั‚ั€ะพั— ั‡ะธ ะตะบะทะตะผะฟะปัั€ั– Dashy.", @@ -251,12 +231,6 @@ "remove-section": "ะ’ะธะดะฐะปะธั‚ะธ" } }, - "footer": { - "dev-by": "ะ ะพะทั€ะพะฑะปะตะฝะพ", - "licensed-under": "ะ›ั–ั†ะตะฝะทั–ั ะทะณั–ะดะฝะพ", - "get-the": "ะžั‚ั€ะธะผะฐั‚ะธ", - "source-code": "ะ’ะธั…ั–ะดะฝะธะน ะบะพะด" - }, "interactive-editor": { "menu": { "start-editing-tooltip": "ะฃะฒั–ะนั‚ะธ ะฒ ั–ะฝั‚ะตั€ะฐะบั‚ะธะฒะฝะธะน ั€ะตะดะฐะบั‚ะพั€", diff --git a/src/assets/locales/zh-CN.json b/src/assets/locales/zh-CN.json index af9546f156..d2aebcc8b1 100644 --- a/src/assets/locales/zh-CN.json +++ b/src/assets/locales/zh-CN.json @@ -46,11 +46,6 @@ }, "app-info": { "title": "ๅบ”็”จไฟกๆฏ", - "error-log": "้”™่ฏฏๆ—ฅๅฟ—", - "no-errors": "ๆœชๆฃ€ๆต‹ๅˆฐๆœ€่ฟ‘็š„้”™่ฏฏ", - "help-support": "ๅธฎๅŠฉไธŽๆ”ฏๆŒ", - "help-support-description": "ๅฆ‚้œ€ๆœ‰ๅ…ณDashy่ฟ่กŒๆˆ–้…็ฝฎ็š„ๆ”ฏๆŒ๏ผŒ่ฏทๆŸฅ็œ‹", - "help-support-discussions": "่ฎจ่ฎบ", "support-dashy": "ๆ”ฏๆŒDashy", "support-dashy-description": "ไบ†่งฃๅ‚ไธŽDashy้กน็›ฎ็š„ๆ–นๅผ๏ผŒ่ฏทๆŸฅ็œ‹", "support-dashy-link": "่ดก็Œฎ้กต้ข", @@ -86,7 +81,6 @@ "edit-css-button": "่‡ชๅฎšไน‰CSS", "cloud-sync-button": "ไบ‘็ซฏๅŒๆญฅ", "edit-cloud-sync-button": "ไฟฎๆ”นไบ‘็ซฏๅŒๆญฅ", - "rebuild-app-button": "้‡ๅปบๅบ”็”จ", "change-language-button": "ๆ›ดๆ”น่ฏญ่จ€", "reset-settings-button": "ๆขๅค้ป˜่ฎค่ฎพ็ฝฎ", "disabled-note": "ๆ‚จ็š„็ฎก็†ๅ‘˜ๅทฒ็ฆ็”จๆŸไบ›้…็ฝฎๅŠŸ่ƒฝ", @@ -180,20 +174,6 @@ "warning-msg-validation": "้ชŒ่ฏ่ญฆๅ‘Š", "not-admin-note": "ไธ่ƒฝไฟๅญ˜ๅ˜ๆ›ดๅˆฐ้…็ฝฎๆ–‡ไปถ๏ผŒๅ› ไธบไฝ ๆฒกๆœ‰ไปฅ็ฎก็†ๅ‘˜่บซไปฝ็™ปๅฝ•" }, - "app-rebuild": { - "title": "้‡ๅปบๅบ”็”จ", - "rebuild-note-l1": "ๅ†™ๅ…ฅ conf.yml ๆ–‡ไปถ็š„ๆ›ดๆ”น้œ€่ฆ้‡ๅปบๅบ”็”จๆ‰่ƒฝ็”Ÿๆ•ˆใ€‚", - "rebuild-note-l2": "่ฟ™ๅบ”่ฏฅๆ˜ฏ่‡ชๅŠจ่ฟ่กŒ็š„๏ผŒไฝ†ๅฆ‚ๆžœๆฒกๆœ‰็”Ÿๆ•ˆ๏ผŒไฝ ๅฏไปฅๅœจๆญคๅค„ๆ‰‹ๅŠจๆ‰ง่กŒใ€‚", - "rebuild-note-l3": "่ฟ™ๅฏนไบŽๆœฌๅœฐๅญ˜ๅ‚จ็š„ไฟฎๆ”นไธๆ˜ฏๅฟ…้œ€็š„ใ€‚", - "rebuild-button": "ๅผ€ๅง‹้‡ๅปบ", - "rebuilding-status-1": "้‡ๅปบไธญ...", - "rebuilding-status-2": "่ฟ™ๅฐ†ๆŒ็ปญไธ€ๆฎตๆ—ถ้—ด", - "error-permission": "ไฝ ๆฒกๆœ‰ๆƒ้™ๆ‰ง่กŒๆญคๆ“ไฝœ", - "success-msg": "้‡ๅปบๆˆๅŠŸ", - "fail-msg": "้‡ๅปบๅคฑ่ดฅ", - "reload-note": "ไฝ ้œ€่ฆๅˆทๆ–ฐ้กต้ขไปฅไฝฟๅ˜ๆ›ด็”Ÿๆ•ˆ", - "reload-button": "ๅˆทๆ–ฐ้กต้ข" - }, "cloud-sync": { "title": "ไบ‘ๅค‡ไปฝ&ๆขๅค", "intro-l1": "ไบ‘ๅค‡ไปฝๅ’Œไบ‘ๆขๅคๆ˜ฏไธ€้กน่ฏ•้ชŒๆ€งๅŠŸ่ƒฝ๏ผŒไฝ ๅฐ†้…็ฝฎไธŠไผ ๅˆฐ็ฝ‘็ปœ๏ผŒ็„ถๅŽๅœจๅ…ถไป–่ฎพๅค‡ๆˆ– Dashy ๅฎžไพ‹ไธŠๆขๅคใ€‚", @@ -251,12 +231,6 @@ "remove-section": "ๅˆ ้™ค" } }, - "footer": { - "dev-by": "ๅผ€ๅ‘่€…๏ผš", - "licensed-under": "่ฎธๅฏ่ฏๆŽˆๆƒ๏ผš", - "get-the": "่Žทๅ–", - "source-code": "ๆบไปฃ็ " - }, "interactive-editor": { "menu": { "start-editing-tooltip": "่ฟ›ๅ…ฅไบคไบ’็ผ–่พ‘ๅ™จ", diff --git a/src/assets/locales/zh-TW.json b/src/assets/locales/zh-TW.json index 03e07aac74..df7f36116c 100644 --- a/src/assets/locales/zh-TW.json +++ b/src/assets/locales/zh-TW.json @@ -1,446 +1,420 @@ -{ - "home": { - "no-results": "ๆฒ’ๆœ‰็ตๆžœ", - "no-data": "ๆœช่จญๅฎš่ณ‡ๆ–™", - "no-items-section": "็„กๅฏ้กฏ็คบ้ …็›ฎ" - }, - "search": { - "search-label": "ๆœๅฐ‹", - "search-placeholder": "้–‹ๅง‹่ผธๅ…ฅไปฅ็ฏฉ้ธ", - "clear-search-tooltip": "ๆธ…็ฉบๆœๅฐ‹", - "enter-to-search-web": "ๆŒ‰ไธ‹ Enter ้ตไพ†ๆœๅฐ‹็ถฒ้š›็ถฒ่ทฏ" - }, - "splash-screen": { - "loading": "ๆญฃๅœจ่ผ‰ๅ…ฅ" - }, - "login": { - "title": "Dashy", - "guest-label": "่จชๅฎขๅญ˜ๅ–", - "username-label": "ไฝฟ็”จ่€…ๅ็จฑ", - "password-label": "ๅฏ†็ขผ", - "login-button": "็™ปๅ…ฅ", - "remember-me-label": "่จ˜ไฝๅฏ†็ขผ", - "remember-me-never": "ๆฐธไธ", - "remember-me-hour": "4 ๅฐๆ™‚", - "remember-me-day": "1 ๅคฉ", - "remember-me-week": "1 ๅ‘จ", - "remember-me-long-time": "ๅพˆไน…ๅพˆไน…...", - "error-missing-username": "่ซ‹่ผธๅ…ฅไฝฟ็”จ่€…ๅ็จฑ", - "error-missing-password": "่ซ‹่ผธๅ…ฅๅฏ†็ขผ", - "error-incorrect-username": "ไฝฟ็”จ่€…ๅ็จฑไธๅญ˜ๅœจ", - "error-incorrect-password": "ๅฏ†็ขผ้Œฏ่ชค", - "success-message": "ๆญฃๅœจ็™ปๅ…ฅ...", - "logout-message": "ๅทฒ็™ปๅ‡บ", - "already-logged-in-title": "ๅทฒๆˆๅŠŸ็™ปๅ…ฅ", - "already-logged-in-text": "ๆญฃไปฅๆญค่บซๅˆ†็™ปๅ…ฅ", - "proceed-to-dashboard": "ๅ‰ๅพ€ๅ„€่กจๆฟ", - "log-out-button": "็™ปๅ‡บ", - "proceed-guest-button": "ไปฅ่จชๅฎขๆจกๅผ็นผ็บŒ", - "guest-intro-1": "ๆญคๅฏฆไพ‹ๅ•Ÿ็”จไบ†่จชๅฎขๅญ˜ๅ–ใ€‚", - "guest-intro-2": "่จชๅฎขๅƒ…่ƒฝๆชข่ฆ–ๅ„€่กจๆฟ๏ผŒ็„กๆณ•ๅฐ็กฌ็ขŸๅฏซๅ…ฅ่ฎŠๆ›ดใ€‚", - "error": "้Œฏ่ชค", - "error-no-user-configured": "ๆœชๅ•Ÿ็”จ้ฉ—่ญ‰๏ผŒๆˆ–ๆœช่จญๅฎšไปปไฝ•ไฝฟ็”จ่€…", - "error-go-home-button": "่ฟ”ๅ›ž้ฆ–้ ", - "logged-in-guest": "ๅทฒไปฅ่จชๅฎข่บซๅˆ†็™ปๅ…ฅ๏ผŒๆญฃๅœจ้‡ๆ–ฐๅฐŽๅ‘...", - "error-guest-access": "ไธๅ…่จฑ่จชๅฎขๅญ˜ๅ–" - }, - "app-info": { - "title": "ๆ‡‰็”จ็จ‹ๅผ่ณ‡่จŠ", - "error-log": "้Œฏ่ชค็ด€้Œ„", - "no-errors": "่ฟ‘ๆœŸๆœชๅตๆธฌๅˆฐ้Œฏ่ชค", - "help-support": "ๅนซๅŠฉ่ˆ‡ๆ”ฏๆด", - "help-support-description": "้—œๆ–ผๅ–ๅพ—ๅŸท่กŒๆˆ–่จญๅฎš Dashy ็š„ๆ”ฏๆด๏ผŒ่ซ‹ๅ‰ๅพ€", - "help-support-discussions": "่จŽ่ซ–ๅ€", - "support-dashy": "ๆ”ฏๆŒ Dashy", - "support-dashy-description": "ๆ‚จไนŸ่ƒฝๅนซๅŠฉ Dashy๏ผ่ซ‹ๅƒ้–ฑ", - "support-dashy-link": "่ฒข็ป้ ้ข", - "report-bug": "ๅ›žๅ ฑ้Œฏ่ชค", - "report-bug-description": "่‹ฅๆ‚จ่ช็‚บๆ‚จๆ‰พๅˆฐ้Œฏ่ชค๏ผŒ่ซ‹", - "report-bug-link": "ๆๅ‡บๅ•้กŒ", - "more-info": "ๆ›ดๅคš่ณ‡่จŠ", - "source": "ๅŽŸๅง‹็ขผ", - "documentation": "่ชชๆ˜Žๆ–‡ไปถ", - "privacy-and-security": "้šฑ็งๆฌŠๅ’Œๅฎ‰ๅ…จๆ€ง", - "privacy-and-security-l1": "่‹ฅ่ฆไบ†่งฃ Dashy ๆ˜ฏๅฆ‚ไฝ•็ฎก็†ๆ‚จ็š„่ณ‡ๆ–™๏ผŒ่ซ‹ๅƒ้–ฑ", - "privacy-and-security-privacy-policy": "้šฑ็งๆฌŠๆ”ฟ็ญ–", - "privacy-and-security-advice": "้—œๆ–ผๆๅ‡ๅ„€้Œถๆฟๅฎ‰ๅ…จๆ€ง็š„ๅปบ่ญฐ๏ผŒ่ซ‹ๅƒ้–ฑ", - "privacy-and-security-advice-link": "็ฎก็†ๆ–‡ไปถ", - "privacy-and-security-security-issue": "่‹ฅๆ‚จๆ‰พๅˆฐๆฝ›ๅœจ็š„ๅฎ‰ๅ…จๅ•้กŒ๏ผŒ่ซ‹ๅ›žๅ ฑ๏ผŒไธฆ้ต็…งๆˆ‘ๅ€‘็š„", - "privacy-and-security-security-policy": "ๅฎ‰ๅ…จๆ”ฟ็ญ–", - "license": "ๆŽˆๆฌŠๆขๆฌพ", - "license-under": "ๆŽˆๆฌŠๆขๆฌพ็‚บ", - "licence-third-party": "้—œๆ–ผ็ฌฌไธ‰ๆ–นๆจก็ต„็š„ๆŽˆๆฌŠๆขๆฌพ๏ผŒ่ซ‹ๅƒ้–ฑ", - "licence-third-party-link": "ๆณ•ๅพ‹่ฒๆ˜Ž", - "list-contributors": "้—œๆ–ผ่ฒข็ปๅ’Œ่‡ด่ฌ่€…็š„ๅฎŒๆ•ดๅๅ–ฎ๏ผŒ่ซ‹ๅƒ้–ฑ", - "list-contributors-link": "่‡ด่ฌ", - "version": "็‰ˆๆœฌ" - }, - "config": { - "main-tab": "ไธป้ ้ข", - "view-config-tab": "ๆชข่ฆ–่จญๅฎš", - "edit-config-tab": "็ทจ่ผฏ่จญๅฎš", - "custom-css-tab": "่‡ช่จ‚ๆจฃๅผ", - "heading": "่จญๅฎš้ธ้ …", - "download-config-button": "ๆชข่ฆ– / ๅŒฏๅ‡บ่จญๅฎš", - "edit-config-button": "็ทจ่ผฏ่จญๅฎš", - "edit-css-button": "็ทจ่ผฏ่‡ช่จ‚ CSS", - "cloud-sync-button": "ๅ•Ÿ็”จ้›ฒ็ซฏๅŒๆญฅ", - "edit-cloud-sync-button": "็ทจ่ผฏ้›ฒ็ซฏๅŒๆญฅ", - "rebuild-app-button": "้‡ๆ–ฐๅปบ็ฝฎ", - "change-language-button": "ๆ›ดๆ”น่ชž่จ€", - "reset-settings-button": "้‡่จญๆœฌๆฉŸ่จญๅฎš", - "disabled-note": "ๆŸไบ›่จญๅฎšๅŠŸ่ƒฝ่ขซๆ‚จ็š„็ฎก็†ๅ“กๅœ็”จ", - "small-screen-note": "ๆ‚จไฝฟ็”จ็š„่ฃ็ฝฎ่žขๅน•้Žๅฐ๏ผŒๆญค้ธๅ–ฎ็š„ๆŸไบ›็•ซ้ขๅฏ่ƒฝๆœƒ่ท‘็‰ˆ", - "app-info-button": "App ่ฉณ็ดฐ่ณ‡่จŠ", - "backup-note": "ๅปบ่ญฐๅœจๅฐๆ‚จ็š„่จญๅฎšๅšๅ‡บ่ฎŠๆ›ดไน‹ๅ‰ๅ…ˆ้€ฒ่กŒๅ‚™ไปฝใ€‚", - "reset-config-msg-l1": "้€™ๆœƒ็งป้™คๆ‰€ๆœ‰็š„ๆœฌๆฉŸ่จญๅฎš๏ผŒไฝ†ไธๆœƒๅฝฑ้Ÿฟ โ€˜conf.ymlโ€™ ๆช”ๆกˆใ€‚", - "reset-config-msg-l2": "ๅฆ‚ๆžœๆ‚จๆœชไพ†้‚„ๆƒณไฝฟ็”จๆ‚จๆ‰€ๅšๅ‡บ็š„ๆœฌๆฉŸ่ฎŠๆ›ด็š„่ฉฑ๏ผŒ่ซ‹ๅ…ˆๅ‚™ไปฝใ€‚", - "reset-config-msg-l3": "ๆ‚จ็ขบๅฎš่ฆ็นผ็บŒๅ—Ž๏ผŸ", - "data-cleared-msg": "ๅทฒๆˆๅŠŸๆธ…็ฉบ่ณ‡ๆ–™", - "actions-label": "ๅ‹•ไฝœ", - "copy-config-label": "่ค‡่ฃฝ่จญๅฎš", - "data-copied-msg": "่จญๅฎšๅทฒ่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ", - "reset-config-label": "้‡็ฝฎ่จญๅฎš", - "css-save-btn": "ๅ„ฒๅญ˜่ฎŠๆ›ด", - "css-note-label": "ๆณจๆ„", - "css-note-l1": "ๆ‚จ้œ€่ฆ้‡ๆ–ฐๆ•ด็†้ ้ขๆ‰่ƒฝๅฅ—็”จ่ฎŠๆ›ดใ€‚", - "css-note-l2": "ๆจฃๅผ่ฆ†ๅฏซๅชๆœƒๅ„ฒๅญ˜ๅœจๆœฌๆฉŸ๏ผŒๅ› ๆญคๅปบ่ญฐๆ‚จ่ค‡่ฃฝๆ‚จ็š„ CSSใ€‚", - "css-note-l3": "่‹ฅ่ฆๅˆ ้™คๆ‰€ๆœ‰่‡ช่จ‚ๆจฃๅผ๏ผŒ่ซ‹ๅˆช้™คๅ…งๅฎนไธฆ้ปžๆ“Šๅ„ฒๅญ˜่ฎŠๆ›ด", - "custom-css": { - "title": "่‡ช่จ‚ CSS", - "base-theme": "ๅŸบ็คŽไธป้กŒ" - } - }, - "alternate-views": { - "alternate-view-heading": "ๅˆ‡ๆ›ๆชข่ฆ–", - "default": "้ ่จญ", - "workspace": "ๅทฅไฝœๅ€", - "minimal": "ๆœ€ๅฐๅŒ–" - }, - "settings": { - "theme-label": "ไธป้กŒ", - "layout-label": "็‰ˆ้ข้…็ฝฎ", - "layout-auto": "่‡ชๅ‹•", - "layout-horizontal": "ๆฐดๅนณ", - "layout-vertical": "ๅž‚็›ด", - "item-size-label": "ๅฐบๅฏธ", - "item-size-small": "ๅฐ", - "item-size-medium": "ไธญ", - "item-size-large": "ๅคง", - "config-launcher-label": "่จญๅฎš", - "config-launcher-tooltip": "ๆ›ดๆ–ฐ่จญๅฎš", - "sign-out-tooltip": "็™ปๅ‡บ", - "sign-in-tooltip": "็™ปๅ…ฅ", - "sign-in-welcome": "ๆ‚จๅฅฝ {username}๏ผ", - "hide": "้šฑ่—", - "open": "้–‹ๅ•Ÿ" - }, - "updates": { - "app-version-note": "Dashy ็‰ˆๆœฌ", - "up-to-date": "ๅทฒ็ถ“ๆ˜ฏๆœ€ๆ–ฐ็‰ˆๆœฌ", - "out-of-date": "ๆœ‰ๅฏ็”จๆ›ดๆ–ฐ", - "unsupported-version-l1": "ๆ‚จไฝฟ็”จ็š„ๆ˜ฏไธๅ—ๆ”ฏๆด็š„ Dashy ็‰ˆๆœฌ", - "unsupported-version-l2": "็‚บ็ฒๅพ—ๆœ€ไฝณ้ซ”้ฉ—ๅ’Œๆœ€ๆ–ฐ็š„ๅฎ‰ๅ…จๆ€งๆ›ดๆ–ฐ๏ผŒ่ซ‹ๆ›ดๆ–ฐ่‡ณ" - }, - "language-switcher": { - "title": "ๆ›ดๆ”นๆ‡‰็”จ็จ‹ๅผ่ชž่จ€", - "dropdown-label": "้ธๆ“‡่ชž่จ€", - "save-button": "ๅ„ฒๅญ˜", - "success-msg": "่ชž่จ€ๅทฒๅˆ‡ๆ›่‡ณ" - }, - "theme-maker": { - "title": "ไธป้กŒ็ทจ่ผฏๅ™จ", - "export-button": "ๅŒฏๅ‡บ่‡ช่จ‚่ฎŠๆ•ธ", - "reset-button": "้‡็ฝฎๆจฃๅผ", - "show-all-button": "้กฏ็คบๆ‰€ๆœ‰่ฎŠๆ•ธ", - "change-fonts-button": "ๆ›ดๆ”นๅญ—้ซ”", - "save-button": "ๅ„ฒๅญ˜", - "cancel-button": "ๅ–ๆถˆ", - "saved-toast": "{theme} ๆ›ดๆ–ฐๆˆๅŠŸ", - "copied-toast": "{theme} ็š„ไธป้กŒ่ณ‡ๆ–™ๅทฒ่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ", - "reset-toast": "{theme} ็š„่‡ช่จ‚้ก่‰ฒๅทฒ็งป้™ค" - }, - "config-editor": { - "save-location-label": "ๅ„ฒๅญ˜ไฝ็ฝฎ", - "location-local-label": "ๅฅ—็”จๅˆฐๆœฌๆฉŸ", - "location-disk-label": "ๅฐ‡่ฎŠๆ›ดๅฏซๅ…ฅ่จญๅฎšๆช”", - "save-button": "ๅ„ฒๅญ˜่ฎŠๆ›ด", - "preview-button": "้ ่ฆฝ่ฎŠๆ›ด", - "valid-label": "่จญๅฎšๆœ‰ๆ•ˆ", - "status-success-msg": "ๅทฅไฝœๅฎŒๆˆ", - "status-fail-msg": "ๅทฅไฝœๅคฑๆ•—", - "success-msg-disk": "่จญๅฎšๆช”ๅทฒๆˆๅŠŸๅฏซๅ…ฅ็กฌ็ขŸ", - "success-msg-local": "ๆœฌๆฉŸ่ฎŠๆ›ดๅทฒๅ„ฒๅญ˜ๆˆๅŠŸ", - "success-note-l1": "ๆ‡‰็”จ็จ‹ๅผๆ‡‰ๆœƒ่‡ชๅ‹•้‡ๆ–ฐๅปบ็ฝฎใ€‚", - "success-note-l2": "ๅฏ่ƒฝๆœƒ้œ€่ฆไธ€ๅˆ†้˜", - "success-note-l3": "ๆ‚จ้œ€่ฆ้‡ๆ–ฐๆ•ด็†้ ้ขไปฅๅฅ—็”จ่ฎŠๆ›ดใ€‚", - "error-msg-save-mode": "่ฏท้ธๆ“‡ๅ„ฒๅญ˜ไฝ็ฝฎ๏ผšๆœฌๆฉŸๆˆ–่€…ๆช”ๆกˆ", - "error-msg-cannot-save": "ๅ„ฒๅญ˜่จญๅฎšๆ™‚็™ผ็”Ÿ้Œฏ่ชค", - "error-msg-bad-json": "JSON ้Œฏ่ชค๏ผŒๅฏ่ƒฝๆ˜ฏๆ ผๅผ้Œฏ่ชค", - "warning-msg-validation": "้ฉ—่ญ‰่ญฆๅ‘Š", - "not-admin-note": "ๆ‚จ็„กๆณ•ๅฐ‡่ฎŠๆ›ดๅฏซๅ…ฅ็ฃ็ขŸ๏ผŒๅ› ็‚บๆ‚จๆœชไปฅ็ณป็ตฑ็ฎก็†ๅ“ก่บซๅˆ†็™ปๅ…ฅ" - }, - "app-rebuild": { - "title": "้‡ๆ–ฐๅปบ็ฝฎๆ‡‰็”จ็จ‹ๅผ", - "rebuild-note-l1": "ๅฏซๅ…ฅ conf.yml ๆช”ๆกˆ็š„่ฎŠๆ›ด้œ€่ฆ้‡ๆ–ฐๅปบ็ฝฎๆ‡‰็”จ็จ‹ๅผๆ‰ๆœƒ็”Ÿๆ•ˆใ€‚", - "rebuild-note-l2": "้‡ๆ–ฐๅปบ็ฝฎๆ‡‰่ฉฒๆœƒ่‡ชๅ‹•็™ผ็”Ÿใ€‚ๅฆๅ‰‡ๆ‚จๅฏไปฅๅœจๆญคๆ‰‹ๅ‹•ๅŸท่กŒใ€‚", - "rebuild-note-l3": "ๆœฌๆฉŸๅ„ฒๅญ˜็š„่ฎŠๆ›ดไธ้œ€่ฆ้‡ๆ–ฐๅปบ็ฝฎๅณๆœƒ็”Ÿๆ•ˆใ€‚", - "rebuild-button": "้–‹ๅง‹้‡ๆ–ฐๅปบ็ฝฎ", - "rebuilding-status-1": "ๅปบ็ฝฎไธญ...", - "rebuilding-status-2": "้€™ๅฐ‡ๆŒ็บŒไธ€ๆฎตๆ™‚้–“", - "error-permission": "ๆ‚จๆฒ’ๆœ‰ๆฌŠ้™ๅŸท่กŒๆญคๆ“ไฝœ", - "success-msg": "ๅปบ็ฝฎๆˆๅŠŸ", - "fail-msg": "ๅปบ็ฝฎๅคฑๆ•—", - "reload-note": "ไฝ ้œ€่ฆ้‡ๆ–ฐ่ผ‰ๅ…ฅ้ ้ขไปฅไฝฟ่ฎŠๆ›ด็”Ÿๆ•ˆ", - "reload-button": "้‡ๆ–ฐ่ผ‰ๅ…ฅ้ ้ข" - }, - "cloud-sync": { - "title": "้›ฒ็ซฏๅ‚™ไปฝ & ๅพฉๅŽŸ", - "intro-l1": "้›ฒ็ซฏๅ‚™ไปฝๅ’ŒๅพฉๅŽŸๆ˜ฏ้ธ็”จๅŠŸ่ƒฝ๏ผŒ่ฎ“ๆ‚จ่ƒฝๅค ๆŠŠ่จญๅฎšไธŠๅ‚ณๅˆฐ็ถฒ่ทฏ๏ผŒ็„ถๅพŒๅœจๅ…ถไป–่ฃ็ฝฎๆˆ– Dashy ๅฏฆไพ‹ไธŠๅพฉๅŽŸใ€‚", - "intro-l2": "ๆ‰€ๆœ‰่ณ‡ๆ–™้ƒฝไฝฟ็”จ AES ็ซฏๅˆฐ็ซฏๅŠ ๅฏ†๏ผŒไธฆไฝฟ็”จๆ‚จ็š„ๅฏ†็ขผไฝœ็‚บ้‡‘้‘ฐใ€‚", - "intro-l3": "่‹ฅๆƒณไบ†่งฃๆ›ดๅคš่ณ‡่จŠ๏ผŒ่ซ‹ๅƒ่€ƒ", - "intro-docs": "่ชชๆ˜Žๆ–‡ไปถ", - "backup-title-setup": "ๅปบ็ซ‹ๅ‚™ไปฝ", - "backup-title-update": "ๆ›ดๆ–ฐๅ‚™ไปฝ", - "password-label-setup": "้ธๆ“‡ๅฏ†็ขผ", - "password-label-update": "่ผธๅ…ฅๅฏ†็ขผ", - "backup-button-setup": "ๅ‚™ไปฝ", - "backup-button-update": "ๆ›ดๆ–ฐๅ‚™ไปฝ", - "backup-id-label": "ๆ‚จ็š„ๅ‚™ไปฝ ID", - "backup-id-note": "ๆ‚จๅฐ‡้œ€่ฆๆญค ID ไพ†ๅพžๅ‚™ไปฝๅพฉๅŽŸ๏ผŒๆ‰€ไปฅ่ซ‹่ˆ‡ๅฏ†็ขผไธ€่ตทๅฆฅๅ–„ๅ„ฒๅญ˜ใ€‚", - "restore-title": "ๅพฉๅŽŸๅ‚™ไปฝ", - "restore-id-label": "ๅพฉๅŽŸ ID", - "restore-password-label": "ๅฏ†็ขผ", - "restore-button": "ๅพฉๅŽŸ", - "backup-missing-password": "่ซ‹่ผธๅ…ฅๅฏ†็ขผ", - "backup-error-unknown": "็„กๆณ•่™•็†่ซ‹ๆฑ‚", - "backup-error-password": "ๅฏ†็ขผ้Œฏ่ชค๏ผŒ่ซ‹้‡ๆ–ฐ่ผธๅ…ฅใ€‚", - "backup-success-msg": "ๅ‚™ไปฝๆˆๅŠŸ", - "restore-success-msg": "่จญๅฎšๅทฒๆˆๅŠŸๅพฉๅŽŸ" - }, - "menu": { - "open-section-title": "ไปฅ...้–‹ๅ•Ÿ", - "sametab": "็›ฎๅ‰ๅˆ†้ ", - "newtab": "ๆ–ฐๅˆ†้ ", - "modal": "ๅฝˆๅ‡บ่ฆ–็ช—", - "workspace": "ๅทฅไฝœๅ€", - "options-section-title": "้ธ้ …", - "edit-item": "็ทจ่ผฏ", - "move-item": "่ค‡่ฃฝๆˆ–็งปๅ‹•", - "remove-item": "็งป้™ค" - }, - "context-menus": { - "item": { - "open-section-title": "ไปฅ...้–‹ๅ•Ÿ", - "sametab": "็›ฎๅ‰ๅˆ†้ ", - "newtab": "ๆ–ฐๅˆ†้ ", - "modal": "ๅฝˆๅ‡บ่ฆ–็ช—", - "workspace": "ๅทฅไฝœๅ€", - "clipboard": "่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ", - "options-section-title": "้ธ้ …", - "edit-item": "็ทจ่ผฏ", - "move-item": "่ค‡่ฃฝๆˆ–็งปๅ‹•", - "remove-item": "็งป้™ค", - "copied-toast": "ๅทฒๅฐ‡็ถฒๅ€่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ" - }, - "section": { - "open-section": "้–‹ๅ•Ÿๅ€ๅŸŸ", - "edit-section": "็ทจ่ผฏ", - "expand-collapse": "ๅฑ•้–‹ / ๆ”ถๅˆ", - "move-section": "็งปๅ‹•่‡ณ", - "remove-section": "็งป้™ค" - } - }, - "footer": { - "dev-by": "้–‹็™ผ่€…", - "licensed-under": "ๆŽˆๆฌŠๆขๆฌพ็‚บ", - "get-the": "ๅ–ๅพ—", - "source-code": "ๅŽŸๅง‹็ขผ" - }, - "interactive-editor": { - "menu": { - "start-editing-tooltip": "้€ฒๅ…ฅไบ’ๅ‹•ๅผ็ทจ่ผฏๅ™จ", - "edit-site-data-subheading": "็ทจ่ผฏ็ถฒ็ซ™่ณ‡ๆ–™", - "edit-page-info-btn": "็ทจ่ผฏ้ ้ข่ณ‡่จŠ", - "edit-page-info-tooltip": "ๆ‡‰็”จ็จ‹ๅผๆจ™้กŒใ€่ชชๆ˜Žใ€ๅฐŽ่ˆชๅˆ—้€ฃ็ตใ€้ ๅฐพๆ–‡ๅญ—...็ญ‰", - "edit-app-config-btn": "็ทจ่ผฏๆ‡‰็”จ็จ‹ๅผ่จญๅฎš", - "edit-app-config-tooltip": "ๅ…ถ้ค˜ๆ‡‰็”จ็จ‹ๅผ่จญๅฎš้ธ้ …", - "edit-pages-btn": "็ทจ่ผฏ้ ้ข", - "edit-pages-tooltip": "ๆ–ฐๅขžๆˆ–็งป้™ค้กๅค–ๆชข่ฆ–", - "config-save-methods-subheading": "่จญๅฎšๅ„ฒๅญ˜้ธ้ …", - "save-locally-btn": "ๆœฌๆฉŸๅ„ฒๅญ˜", - "save-locally-tooltip": "ๅฐ‡่จญๅฎšๅ„ฒๅญ˜ๅˆฐ็€่ฆฝๅ™จๅ„ฒๅญ˜็ฉบ้–“ไธญใ€‚้€™ไธๆœƒๅฝฑ้Ÿฟๅˆฐๆ‚จ็š„่จญๅฎšๆช”๏ผŒไฝ†่ฎŠๆ›ดๅƒ…ๆœƒๅ„ฒๅญ˜ๅœจๆญค่ฃ็ฝฎ", - "save-disk-btn": "ๅ„ฒๅญ˜่จญๅฎšๆช”", - "save-disk-tooltip": "ๅฐ‡่จญๅฎšๅ„ฒๅญ˜ๅˆฐ็กฌ็ขŸไธŠ็š„ conf.yml ๆช”ๆกˆใ€‚้€™ๅฐ‡ๅ‚™ไปฝ๏ผŒ็„ถๅพŒ่ฆ†ๅฏซๆ‚จ็›ฎๅ‰็š„่จญๅฎš", - "export-config-btn": "ๅŒฏๅ‡บ่จญๅฎš", - "export-config-tooltip": "ๆชข่ฆ–ไธฆๅฐ‡ๆ–ฐ่จญๅฎšๅŒฏๅ‡บๅˆฐๆช”ๆกˆๆˆ–ๅ‰ช่ฒผ็ฐฟ", - "cloud-backup-btn": "ๅ‚™ไปฝ่‡ณ้›ฒ็ซฏ", - "cloud-backup-tooltip": "ๅฐ‡ๅŠ ๅฏ†ๅพŒ็š„ๅ‚™ไปฝ่จญๅฎšๆช”ๅ„ฒๅญ˜่‡ณ้›ฒ็ซฏ", - "edit-raw-config-btn": "็ทจ่ผฏๅŽŸๅง‹่จญๅฎš", - "edit-raw-config-tooltip": "้€้Ž JSON ็ทจ่ผฏๅ™จๆชข่ฆ–ๆˆ–็ทจ่ผฏๅŽŸๅง‹่จญๅฎš", - "cancel-changes-btn": "ๅ–ๆถˆ็ทจ่ผฏ", - "cancel-changes-tooltip": "้‡่จญ็›ฎๅ‰็š„ๆ›ดๅ‹•๏ผŒไธฆ้€€ๅ‡บ็ทจ่ผฏๆจกๅผใ€‚้€™ไธๆœƒๅฝฑ้Ÿฟๆ‚จๅทฒๅ„ฒๅญ˜็š„่จญๅฎš", - "edit-mode-name": "็ทจ่ผฏๆจกๅผ", - "edit-mode-subtitle": "็›ฎๅ‰็‚บ็ทจ่ผฏๆจกๅผ", - "edit-mode-description": "้€™ไปฃ่กจๆ‚จๅฏไปฅ็ทจ่ผฏ่จญๅฎšไธฆ้ ่ฆฝใ€‚ไฝ†ๅœจๆ‚จๅ„ฒๅญ˜ๅ‰๏ผŒ่ฎŠๆ›ดๅฐ‡ไธ่ขซๅ„ฒๅญ˜ใ€‚", - "save-stage-btn": "ๅ„ฒๅญ˜", - "cancel-stage-btn": "ๅ–ๆถˆ", - "save-locally-warning": "่‹ฅ็นผ็บŒ๏ผŒ่ฎŠๆ›ดๅฐ‡ๅƒ…ๅ„ฒๅญ˜ๅœจ็€่ฆฝๅ™จไธญใ€‚ๆ‚จๆ‡‰ๅŒฏๅ‡บ่จญๅฎšๆช”ไปฅๅœจๅ…ถไป–่ฃ็ฝฎไฝฟ็”จใ€‚ๆ‚จ็ขบๅฎš่ฆ็นผ็บŒๅ—Ž๏ผŸ" - }, - "edit-item": { - "missing-title-err": "ๅฟ…้ ˆๅกซๅฏซ้ …็›ฎๆจ™้กŒ" - }, - "edit-section": { - "edit-section-title": "็ทจ่ผฏๅ€ๅกŠ", - "add-section-title": "ๆ–ฐๅขžๅ€ๅกŠ", - "edit-tooltip": "้ปžๆ“Šไปฅ็ทจ่ผฏ๏ผŒๅณ้ตไปฅๆŸฅ็œ‹ๆ›ดๅคš้ธ้ …", - "remove-confirm": "ๆ‚จ็ขบๅฎš่ฆ็งป้™คๆญคๅ€ๅกŠๅ—Ž๏ผŸๆญคๆ“ไฝœๅฏๅพฉๅŽŸใ€‚" - }, - "edit-app-config": { - "warning-msg-title": "่ฌนๆ…Žๆ“ไฝœ", - "warning-msg-l1": "ไธ‹ๅˆ—้ธ้ …็”จๆ–ผ้€ฒ้šŽๆ‡‰็”จ็จ‹ๅผ่จญๅฎšใ€‚", - "warning-msg-l2": "ๅฆ‚ๆžœๆ‚จๅฐไปปไฝ•ๆฌ„ไฝๆœ‰ไธ็ขบๅฎš็š„ๅœฐๆ–น๏ผŒ่ซ‹ๅƒ้–ฑ", - "warning-msg-docs": "่ชชๆ˜Žๆ–‡ไปถ", - "warning-msg-l3": "ไปฅ้ฟๅ…ๆ„ๅค–ๅพŒๆžœใ€‚" - }, - "export": { - "export-title": "ๅŒฏๅ‡บ่จญๅฎš", - "copy-clipboard-btn": "่ค‡่ฃฝ่‡ณๅ‰ช่ฒผ็ฐฟ", - "copy-clipboard-tooltip": "ๅฐ‡ๆ‰€ๆœ‰ๆ‡‰็”จ็จ‹ๅผ่จญๅฎšไปฅ YAML ๆ ผๅผ่ค‡่ฃฝๅˆฐ็ณป็ตฑๅ‰ช่ฒผ็ฐฟใ€‚", - "download-file-btn": "ไธ‹่ผ‰ๆช”ๆกˆ", - "download-file-tooltip": "ๅฐ‡ๆ‰€ๆœ‰ๆ‡‰็”จ็จ‹ๅผ่จญๅฎšไปฅ YAML ๆช”ๆกˆไธ‹่ผ‰ๅˆฐๆ‚จ็š„่ฃ็ฝฎใ€‚", - "view-title": "ๆชข่ฆ–่จญๅฎš" - } - }, - "widgets": { - "general": { - "loading": "ๆญฃๅœจ่ผ‰ๅ…ฅ...", - "show-more": "ๅฑ•้–‹่ฉณ็ดฐ่ณ‡่จŠ", - "show-less": "้กฏ็คบ่ผƒๅฐ‘", - "open-link": "็นผ็บŒ้–ฑ่ฎ€" - }, - "pi-hole": { - "status-heading": "็‹€ๆ…‹" - }, - "stat-ping": { - "up": "็ทšไธŠ", - "down": "้›ข็ทš" - }, - "net-data": { - "cpu-chart-title": "CPU ๆญทๅฒ็ด€้Œ„", - "mem-chart-title": "่จ˜ๆ†ถ้ซ”ไฝฟ็”จ็އ", - "mem-breakdown-title": "Memory Breakdown", - "load-chart-title": "็ณป็ตฑ่ฒ ่ผ‰" - }, - "glances": { - "disk-space-free": "ๅฏ็”จ", - "disk-space-used": "ๅทฒไฝฟ็”จ", - "disk-mount-point": "ๆŽ›่ผ‰้ปž", - "disk-file-system": "ๆช”ๆกˆ็ณป็ตฑ", - "disk-io-read": "่ฎ€ๅ–", - "disk-io-write": "ๅฏซๅ…ฅ", - "system-load-desc": "ๆญฃๅœจๅŸท่กŒ้šŠๅˆ—ไธญ็ญ‰ๅพ…็š„ๅŸท่กŒๅบๆ•ธ้‡๏ผŒๅนณๅ‡ๅˆ†้…ๅˆฐๆ‰€ๆœ‰ๆ ธๅฟƒ" - }, - "system-info": { - "uptime": "้–‹ๆฉŸๆ™‚้–“" - }, - "flight-data": { - "arrivals": "ๆŠต้”", - "departures": "ๅ‡บ็™ผ" - }, - "tfl-status": { - "good-service-all": "ๅ…จ็ทšๆญฃๅธธ็‡Ÿ้‹", - "good-service-rest": "ๆ‰€ๆœ‰ๅ…ถไป–่ทฏ็ทšๆญฃๅธธ็‡Ÿ้‹" - }, - "synology-download": { - "download": "ไธ‹่ผ‰", - "upload": "ไธŠๅ‚ณ", - "downloaded": "ๅทฒไธ‹่ผ‰", - "uploaded": "ๅทฒไธŠๅ‚ณ", - "remaining": "ๅ‰ฉ้ค˜", - "up": "ไธŠๅ‚ณ", - "down": "ไธ‹่ผ‰" - }, - "gluetun-status": { - "vpn-ip": "VPN IP", - "country": "ๅœ‹ๅฎถ", - "region": "ๅ€ๅŸŸ", - "city": "ๅŸŽๅธ‚", - "post-code": "้ƒต้žๅ€่™Ÿ", - "location": "ๅœฐๅ€", - "timezone": "ๆ™‚ๅ€", - "organization": "็ต„็น”" - }, - "nextcloud": { - "active": "ๅ•Ÿ็”จ", - "and": "ๅ’Œ", - "applications": "ๆ‡‰็”จ็จ‹ๅผ", - "available": "ๅฏ็”จ", - "away": "้›ข้–‹", - "cache-full": "ๅฟซๅ–ๅทฒๆปฟ", - "chat-room": "่Šๅคฉๅฎค", - "delete-all": "ๅ…จ้ƒจๅˆช้™ค", - "delete-notification": "ๅˆช้™ค้€š็Ÿฅ", - "disabled": "ๅทฒๅœ็”จ", - "disk-quota": "็กฌ็ขŸ้™้ก", - "disk-space": "็กฌ็ขŸ็ฉบ้–“", - "dnd": "ๅ‹ฟๆ“พ", - "email": "้›ปๅญ้ƒตไปถ", - "enabled": "ๅทฒๅ•Ÿ็”จ", - "federated-shares-ucfirst": "่ฏ็›Ÿๅ…ฑไบซ", - "federated-shares": "่ฏ็›Ÿๅ…ฑไบซ", - "files": "ๆช”ๆกˆ{plural}", - "free": "ๅฏ็”จ", - "groups": "็พค็ต„", - "hit-rate": "ๅ‘ฝไธญ็އ", - "hits": "ๅ‘ฝไธญ", - "home": "้ฆ–้ ", - "in": "ๆ–ผ", - "keys": "้‡‘้‘ฐ", - "last-24-hours": "้ŽๅŽป 24 ๅฐๆ™‚", - "last-5-minutes": "้ŽๅŽป 5 ๅˆ†้˜", - "last-hour": "้ŽๅŽป 1 ๅฐๆ™‚", - "last-login": "ๆœ€ๅพŒ็™ปๅ…ฅ", - "last-restart": "ๆœ€ๅพŒ้‡ๆ–ฐๅ•Ÿๅ‹•", - "load-averages": "ๆ‰€ๆœ‰ CPU ๆ ธๅฟƒ็š„่ฒ ่ผ‰ๅนณๅ‡ๅ€ผ", - "local-shares": "ๆœฌๆฉŸๅˆ†ไบซ", - "local": "ๆœฌๆฉŸ", - "max-keys": "ๆœ€ๅคง้‡‘้‘ฐ", - "memory-used": "ๅทฒไฝฟ็”จ่จ˜ๆ†ถ้ซ”", - "memory-utilisation": "่จ˜ๆ†ถ้ซ”ไฝฟ็”จ็އ", - "memory": "่จ˜ๆ†ถ้ซ”", - "misses": "็ผบๅคฑ", - "no-notifications": "็„ก้€š็Ÿฅ", - "no-pending-updates": "็„กๅพ…่™•็†็š„ๆ›ดๆ–ฐ", - "nothing-to-show": "็›ฎๅ‰ๆฒ’ๆœ‰ๅฏ้กฏ็คบ็š„้ …็›ฎ", - "of-which": "of which", - "of": "of", - "offline": "้›ข็ทš", - "online": "็ทšไธŠ", - "other": "ๅ…ถไป–", - "overall": "็ธฝ้ซ”", - "private-link": "็งไบบ้€ฃ็ต", - "public-link": "ๅ…ฌ้–‹้€ฃ็ต", - "quota-enabled": "็กฌ็ขŸ้™้ก {not}ๆœชๅฐๆญคไฝฟ็”จ่€…ๅ•Ÿ็”จ", - "received": "ๅทฒๆŽฅๆ”ถ", - "scripts": "่…ณๆœฌ", - "sent": "ๅทฒ้€ๅ‡บ", - "started": "ๅทฒๅ•Ÿๅ‹•", - "storages-by-type": "ไพ้กžๅž‹ๅˆ†้กž็š„ๅ„ฒๅญ˜็ฉบ้–“", - "storages": "ๅ„ฒๅญ˜็ฉบ้–“{plural}", - "strings-use": "strings use", - "tasks": "ๅทฅไฝœ", - "total-files": "็ธฝๆช”ๆกˆ", - "total-users": "็ธฝไฝฟ็”จ่€…", - "total": "็ธฝๆ•ธ", - "until": "็›ดๅˆฐ", - "updates-available-for": "ๆœ‰ๅฏ็”จๆ›ดๆ–ฐ๏ผš", - "updates-available": "ๆ›ดๆ–ฐ{plural} ๅฏ็”จ", - "used": "ๅทฒไฝฟ็”จ", - "user": "ไฝฟ็”จ่€…", - "using": "ๆญฃๅœจไฝฟ็”จ", - "version": "็‰ˆๆœฌ", - "wasted": "ๅทฒๆตช่ฒป" - } - } -} +{ + "home": { + "no-results": "ๆฒ’ๆœ‰็ตๆžœ", + "no-data": "ๆœช่จญๅฎš่ณ‡ๆ–™", + "no-items-section": "็„กๅฏ้กฏ็คบ้ …็›ฎ" + }, + "search": { + "search-label": "ๆœๅฐ‹", + "search-placeholder": "้–‹ๅง‹่ผธๅ…ฅไปฅ็ฏฉ้ธ", + "clear-search-tooltip": "ๆธ…็ฉบๆœๅฐ‹", + "enter-to-search-web": "ๆŒ‰ไธ‹ Enter ้ตไพ†ๆœๅฐ‹็ถฒ้š›็ถฒ่ทฏ" + }, + "splash-screen": { + "loading": "ๆญฃๅœจ่ผ‰ๅ…ฅ" + }, + "login": { + "title": "Dashy", + "guest-label": "่จชๅฎขๅญ˜ๅ–", + "username-label": "ไฝฟ็”จ่€…ๅ็จฑ", + "password-label": "ๅฏ†็ขผ", + "login-button": "็™ปๅ…ฅ", + "remember-me-label": "่จ˜ไฝๅฏ†็ขผ", + "remember-me-never": "ๆฐธไธ", + "remember-me-hour": "4 ๅฐๆ™‚", + "remember-me-day": "1 ๅคฉ", + "remember-me-week": "1 ๅ‘จ", + "remember-me-long-time": "ๅพˆไน…ๅพˆไน…...", + "error-missing-username": "่ซ‹่ผธๅ…ฅไฝฟ็”จ่€…ๅ็จฑ", + "error-missing-password": "่ซ‹่ผธๅ…ฅๅฏ†็ขผ", + "error-incorrect-username": "ไฝฟ็”จ่€…ๅ็จฑไธๅญ˜ๅœจ", + "error-incorrect-password": "ๅฏ†็ขผ้Œฏ่ชค", + "success-message": "ๆญฃๅœจ็™ปๅ…ฅ...", + "logout-message": "ๅทฒ็™ปๅ‡บ", + "already-logged-in-title": "ๅทฒๆˆๅŠŸ็™ปๅ…ฅ", + "already-logged-in-text": "ๆญฃไปฅๆญค่บซๅˆ†็™ปๅ…ฅ", + "proceed-to-dashboard": "ๅ‰ๅพ€ๅ„€่กจๆฟ", + "log-out-button": "็™ปๅ‡บ", + "proceed-guest-button": "ไปฅ่จชๅฎขๆจกๅผ็นผ็บŒ", + "guest-intro-1": "ๆญคๅฏฆไพ‹ๅ•Ÿ็”จไบ†่จชๅฎขๅญ˜ๅ–ใ€‚", + "guest-intro-2": "่จชๅฎขๅƒ…่ƒฝๆชข่ฆ–ๅ„€่กจๆฟ๏ผŒ็„กๆณ•ๅฐ็กฌ็ขŸๅฏซๅ…ฅ่ฎŠๆ›ดใ€‚", + "error": "้Œฏ่ชค", + "error-no-user-configured": "ๆœชๅ•Ÿ็”จ้ฉ—่ญ‰๏ผŒๆˆ–ๆœช่จญๅฎšไปปไฝ•ไฝฟ็”จ่€…", + "error-go-home-button": "่ฟ”ๅ›ž้ฆ–้ ", + "logged-in-guest": "ๅทฒไปฅ่จชๅฎข่บซๅˆ†็™ปๅ…ฅ๏ผŒๆญฃๅœจ้‡ๆ–ฐๅฐŽๅ‘...", + "error-guest-access": "ไธๅ…่จฑ่จชๅฎขๅญ˜ๅ–" + }, + "app-info": { + "title": "ๆ‡‰็”จ็จ‹ๅผ่ณ‡่จŠ", + "support-dashy": "ๆ”ฏๆŒ Dashy", + "support-dashy-description": "ๆ‚จไนŸ่ƒฝๅนซๅŠฉ Dashy๏ผ่ซ‹ๅƒ้–ฑ", + "support-dashy-link": "่ฒข็ป้ ้ข", + "report-bug": "ๅ›žๅ ฑ้Œฏ่ชค", + "report-bug-description": "่‹ฅๆ‚จ่ช็‚บๆ‚จๆ‰พๅˆฐ้Œฏ่ชค๏ผŒ่ซ‹", + "report-bug-link": "ๆๅ‡บๅ•้กŒ", + "more-info": "ๆ›ดๅคš่ณ‡่จŠ", + "source": "ๅŽŸๅง‹็ขผ", + "documentation": "่ชชๆ˜Žๆ–‡ไปถ", + "privacy-and-security": "้šฑ็งๆฌŠๅ’Œๅฎ‰ๅ…จๆ€ง", + "privacy-and-security-l1": "่‹ฅ่ฆไบ†่งฃ Dashy ๆ˜ฏๅฆ‚ไฝ•็ฎก็†ๆ‚จ็š„่ณ‡ๆ–™๏ผŒ่ซ‹ๅƒ้–ฑ", + "privacy-and-security-privacy-policy": "้šฑ็งๆฌŠๆ”ฟ็ญ–", + "privacy-and-security-advice": "้—œๆ–ผๆๅ‡ๅ„€้Œถๆฟๅฎ‰ๅ…จๆ€ง็š„ๅปบ่ญฐ๏ผŒ่ซ‹ๅƒ้–ฑ", + "privacy-and-security-advice-link": "็ฎก็†ๆ–‡ไปถ", + "privacy-and-security-security-issue": "่‹ฅๆ‚จๆ‰พๅˆฐๆฝ›ๅœจ็š„ๅฎ‰ๅ…จๅ•้กŒ๏ผŒ่ซ‹ๅ›žๅ ฑ๏ผŒไธฆ้ต็…งๆˆ‘ๅ€‘็š„", + "privacy-and-security-security-policy": "ๅฎ‰ๅ…จๆ”ฟ็ญ–", + "license": "ๆŽˆๆฌŠๆขๆฌพ", + "license-under": "ๆŽˆๆฌŠๆขๆฌพ็‚บ", + "licence-third-party": "้—œๆ–ผ็ฌฌไธ‰ๆ–นๆจก็ต„็š„ๆŽˆๆฌŠๆขๆฌพ๏ผŒ่ซ‹ๅƒ้–ฑ", + "licence-third-party-link": "ๆณ•ๅพ‹่ฒๆ˜Ž", + "list-contributors": "้—œๆ–ผ่ฒข็ปๅ’Œ่‡ด่ฌ่€…็š„ๅฎŒๆ•ดๅๅ–ฎ๏ผŒ่ซ‹ๅƒ้–ฑ", + "list-contributors-link": "่‡ด่ฌ", + "version": "็‰ˆๆœฌ" + }, + "config": { + "main-tab": "ไธป้ ้ข", + "view-config-tab": "ๆชข่ฆ–่จญๅฎš", + "edit-config-tab": "็ทจ่ผฏ่จญๅฎš", + "custom-css-tab": "่‡ช่จ‚ๆจฃๅผ", + "heading": "่จญๅฎš้ธ้ …", + "download-config-button": "ๆชข่ฆ– / ๅŒฏๅ‡บ่จญๅฎš", + "edit-config-button": "็ทจ่ผฏ่จญๅฎš", + "edit-css-button": "็ทจ่ผฏ่‡ช่จ‚ CSS", + "cloud-sync-button": "ๅ•Ÿ็”จ้›ฒ็ซฏๅŒๆญฅ", + "edit-cloud-sync-button": "็ทจ่ผฏ้›ฒ็ซฏๅŒๆญฅ", + "change-language-button": "ๆ›ดๆ”น่ชž่จ€", + "reset-settings-button": "้‡่จญๆœฌๆฉŸ่จญๅฎš", + "disabled-note": "ๆŸไบ›่จญๅฎšๅŠŸ่ƒฝ่ขซๆ‚จ็š„็ฎก็†ๅ“กๅœ็”จ", + "small-screen-note": "ๆ‚จไฝฟ็”จ็š„่ฃ็ฝฎ่žขๅน•้Žๅฐ๏ผŒๆญค้ธๅ–ฎ็š„ๆŸไบ›็•ซ้ขๅฏ่ƒฝๆœƒ่ท‘็‰ˆ", + "app-info-button": "App ่ฉณ็ดฐ่ณ‡่จŠ", + "backup-note": "ๅปบ่ญฐๅœจๅฐๆ‚จ็š„่จญๅฎšๅšๅ‡บ่ฎŠๆ›ดไน‹ๅ‰ๅ…ˆ้€ฒ่กŒๅ‚™ไปฝใ€‚", + "reset-config-msg-l1": "้€™ๆœƒ็งป้™คๆ‰€ๆœ‰็š„ๆœฌๆฉŸ่จญๅฎš๏ผŒไฝ†ไธๆœƒๅฝฑ้Ÿฟ โ€˜conf.ymlโ€™ ๆช”ๆกˆใ€‚", + "reset-config-msg-l2": "ๅฆ‚ๆžœๆ‚จๆœชไพ†้‚„ๆƒณไฝฟ็”จๆ‚จๆ‰€ๅšๅ‡บ็š„ๆœฌๆฉŸ่ฎŠๆ›ด็š„่ฉฑ๏ผŒ่ซ‹ๅ…ˆๅ‚™ไปฝใ€‚", + "reset-config-msg-l3": "ๆ‚จ็ขบๅฎš่ฆ็นผ็บŒๅ—Ž๏ผŸ", + "data-cleared-msg": "ๅทฒๆˆๅŠŸๆธ…็ฉบ่ณ‡ๆ–™", + "actions-label": "ๅ‹•ไฝœ", + "copy-config-label": "่ค‡่ฃฝ่จญๅฎš", + "data-copied-msg": "่จญๅฎšๅทฒ่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ", + "reset-config-label": "้‡็ฝฎ่จญๅฎš", + "css-save-btn": "ๅ„ฒๅญ˜่ฎŠๆ›ด", + "css-note-label": "ๆณจๆ„", + "css-note-l1": "ๆ‚จ้œ€่ฆ้‡ๆ–ฐๆ•ด็†้ ้ขๆ‰่ƒฝๅฅ—็”จ่ฎŠๆ›ดใ€‚", + "css-note-l2": "ๆจฃๅผ่ฆ†ๅฏซๅชๆœƒๅ„ฒๅญ˜ๅœจๆœฌๆฉŸ๏ผŒๅ› ๆญคๅปบ่ญฐๆ‚จ่ค‡่ฃฝๆ‚จ็š„ CSSใ€‚", + "css-note-l3": "่‹ฅ่ฆๅˆ ้™คๆ‰€ๆœ‰่‡ช่จ‚ๆจฃๅผ๏ผŒ่ซ‹ๅˆช้™คๅ…งๅฎนไธฆ้ปžๆ“Šๅ„ฒๅญ˜่ฎŠๆ›ด", + "custom-css": { + "title": "่‡ช่จ‚ CSS", + "base-theme": "ๅŸบ็คŽไธป้กŒ" + } + }, + "alternate-views": { + "alternate-view-heading": "ๅˆ‡ๆ›ๆชข่ฆ–", + "default": "้ ่จญ", + "workspace": "ๅทฅไฝœๅ€", + "minimal": "ๆœ€ๅฐๅŒ–" + }, + "settings": { + "theme-label": "ไธป้กŒ", + "layout-label": "็‰ˆ้ข้…็ฝฎ", + "layout-auto": "่‡ชๅ‹•", + "layout-horizontal": "ๆฐดๅนณ", + "layout-vertical": "ๅž‚็›ด", + "item-size-label": "ๅฐบๅฏธ", + "item-size-small": "ๅฐ", + "item-size-medium": "ไธญ", + "item-size-large": "ๅคง", + "config-launcher-label": "่จญๅฎš", + "config-launcher-tooltip": "ๆ›ดๆ–ฐ่จญๅฎš", + "sign-out-tooltip": "็™ปๅ‡บ", + "sign-in-tooltip": "็™ปๅ…ฅ", + "sign-in-welcome": "ๆ‚จๅฅฝ {username}๏ผ", + "hide": "้šฑ่—", + "open": "้–‹ๅ•Ÿ" + }, + "updates": { + "app-version-note": "Dashy ็‰ˆๆœฌ", + "up-to-date": "ๅทฒ็ถ“ๆ˜ฏๆœ€ๆ–ฐ็‰ˆๆœฌ", + "out-of-date": "ๆœ‰ๅฏ็”จๆ›ดๆ–ฐ", + "unsupported-version-l1": "ๆ‚จไฝฟ็”จ็š„ๆ˜ฏไธๅ—ๆ”ฏๆด็š„ Dashy ็‰ˆๆœฌ", + "unsupported-version-l2": "็‚บ็ฒๅพ—ๆœ€ไฝณ้ซ”้ฉ—ๅ’Œๆœ€ๆ–ฐ็š„ๅฎ‰ๅ…จๆ€งๆ›ดๆ–ฐ๏ผŒ่ซ‹ๆ›ดๆ–ฐ่‡ณ" + }, + "language-switcher": { + "title": "ๆ›ดๆ”นๆ‡‰็”จ็จ‹ๅผ่ชž่จ€", + "dropdown-label": "้ธๆ“‡่ชž่จ€", + "save-button": "ๅ„ฒๅญ˜", + "success-msg": "่ชž่จ€ๅทฒๅˆ‡ๆ›่‡ณ" + }, + "theme-maker": { + "title": "ไธป้กŒ็ทจ่ผฏๅ™จ", + "export-button": "ๅŒฏๅ‡บ่‡ช่จ‚่ฎŠๆ•ธ", + "reset-button": "้‡็ฝฎๆจฃๅผ", + "show-all-button": "้กฏ็คบๆ‰€ๆœ‰่ฎŠๆ•ธ", + "change-fonts-button": "ๆ›ดๆ”นๅญ—้ซ”", + "save-button": "ๅ„ฒๅญ˜", + "cancel-button": "ๅ–ๆถˆ", + "saved-toast": "{theme} ๆ›ดๆ–ฐๆˆๅŠŸ", + "copied-toast": "{theme} ็š„ไธป้กŒ่ณ‡ๆ–™ๅทฒ่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ", + "reset-toast": "{theme} ็š„่‡ช่จ‚้ก่‰ฒๅทฒ็งป้™ค" + }, + "config-editor": { + "save-location-label": "ๅ„ฒๅญ˜ไฝ็ฝฎ", + "location-local-label": "ๅฅ—็”จๅˆฐๆœฌๆฉŸ", + "location-disk-label": "ๅฐ‡่ฎŠๆ›ดๅฏซๅ…ฅ่จญๅฎšๆช”", + "save-button": "ๅ„ฒๅญ˜่ฎŠๆ›ด", + "preview-button": "้ ่ฆฝ่ฎŠๆ›ด", + "valid-label": "่จญๅฎšๆœ‰ๆ•ˆ", + "status-success-msg": "ๅทฅไฝœๅฎŒๆˆ", + "status-fail-msg": "ๅทฅไฝœๅคฑๆ•—", + "success-msg-disk": "่จญๅฎšๆช”ๅทฒๆˆๅŠŸๅฏซๅ…ฅ็กฌ็ขŸ", + "success-msg-local": "ๆœฌๆฉŸ่ฎŠๆ›ดๅทฒๅ„ฒๅญ˜ๆˆๅŠŸ", + "success-note-l1": "ๆ‡‰็”จ็จ‹ๅผๆ‡‰ๆœƒ่‡ชๅ‹•้‡ๆ–ฐๅปบ็ฝฎใ€‚", + "success-note-l2": "ๅฏ่ƒฝๆœƒ้œ€่ฆไธ€ๅˆ†้˜", + "success-note-l3": "ๆ‚จ้œ€่ฆ้‡ๆ–ฐๆ•ด็†้ ้ขไปฅๅฅ—็”จ่ฎŠๆ›ดใ€‚", + "error-msg-save-mode": "่ฏท้ธๆ“‡ๅ„ฒๅญ˜ไฝ็ฝฎ๏ผšๆœฌๆฉŸๆˆ–่€…ๆช”ๆกˆ", + "error-msg-cannot-save": "ๅ„ฒๅญ˜่จญๅฎšๆ™‚็™ผ็”Ÿ้Œฏ่ชค", + "error-msg-bad-json": "JSON ้Œฏ่ชค๏ผŒๅฏ่ƒฝๆ˜ฏๆ ผๅผ้Œฏ่ชค", + "warning-msg-validation": "้ฉ—่ญ‰่ญฆๅ‘Š", + "not-admin-note": "ๆ‚จ็„กๆณ•ๅฐ‡่ฎŠๆ›ดๅฏซๅ…ฅ็ฃ็ขŸ๏ผŒๅ› ็‚บๆ‚จๆœชไปฅ็ณป็ตฑ็ฎก็†ๅ“ก่บซๅˆ†็™ปๅ…ฅ" + }, + "cloud-sync": { + "title": "้›ฒ็ซฏๅ‚™ไปฝ & ๅพฉๅŽŸ", + "intro-l1": "้›ฒ็ซฏๅ‚™ไปฝๅ’ŒๅพฉๅŽŸๆ˜ฏ้ธ็”จๅŠŸ่ƒฝ๏ผŒ่ฎ“ๆ‚จ่ƒฝๅค ๆŠŠ่จญๅฎšไธŠๅ‚ณๅˆฐ็ถฒ่ทฏ๏ผŒ็„ถๅพŒๅœจๅ…ถไป–่ฃ็ฝฎๆˆ– Dashy ๅฏฆไพ‹ไธŠๅพฉๅŽŸใ€‚", + "intro-l2": "ๆ‰€ๆœ‰่ณ‡ๆ–™้ƒฝไฝฟ็”จ AES ็ซฏๅˆฐ็ซฏๅŠ ๅฏ†๏ผŒไธฆไฝฟ็”จๆ‚จ็š„ๅฏ†็ขผไฝœ็‚บ้‡‘้‘ฐใ€‚", + "intro-l3": "่‹ฅๆƒณไบ†่งฃๆ›ดๅคš่ณ‡่จŠ๏ผŒ่ซ‹ๅƒ่€ƒ", + "intro-docs": "่ชชๆ˜Žๆ–‡ไปถ", + "backup-title-setup": "ๅปบ็ซ‹ๅ‚™ไปฝ", + "backup-title-update": "ๆ›ดๆ–ฐๅ‚™ไปฝ", + "password-label-setup": "้ธๆ“‡ๅฏ†็ขผ", + "password-label-update": "่ผธๅ…ฅๅฏ†็ขผ", + "backup-button-setup": "ๅ‚™ไปฝ", + "backup-button-update": "ๆ›ดๆ–ฐๅ‚™ไปฝ", + "backup-id-label": "ๆ‚จ็š„ๅ‚™ไปฝ ID", + "backup-id-note": "ๆ‚จๅฐ‡้œ€่ฆๆญค ID ไพ†ๅพžๅ‚™ไปฝๅพฉๅŽŸ๏ผŒๆ‰€ไปฅ่ซ‹่ˆ‡ๅฏ†็ขผไธ€่ตทๅฆฅๅ–„ๅ„ฒๅญ˜ใ€‚", + "restore-title": "ๅพฉๅŽŸๅ‚™ไปฝ", + "restore-id-label": "ๅพฉๅŽŸ ID", + "restore-password-label": "ๅฏ†็ขผ", + "restore-button": "ๅพฉๅŽŸ", + "backup-missing-password": "่ซ‹่ผธๅ…ฅๅฏ†็ขผ", + "backup-error-unknown": "็„กๆณ•่™•็†่ซ‹ๆฑ‚", + "backup-error-password": "ๅฏ†็ขผ้Œฏ่ชค๏ผŒ่ซ‹้‡ๆ–ฐ่ผธๅ…ฅใ€‚", + "backup-success-msg": "ๅ‚™ไปฝๆˆๅŠŸ", + "restore-success-msg": "่จญๅฎšๅทฒๆˆๅŠŸๅพฉๅŽŸ" + }, + "menu": { + "open-section-title": "ไปฅ...้–‹ๅ•Ÿ", + "sametab": "็›ฎๅ‰ๅˆ†้ ", + "newtab": "ๆ–ฐๅˆ†้ ", + "modal": "ๅฝˆๅ‡บ่ฆ–็ช—", + "workspace": "ๅทฅไฝœๅ€", + "options-section-title": "้ธ้ …", + "edit-item": "็ทจ่ผฏ", + "move-item": "่ค‡่ฃฝๆˆ–็งปๅ‹•", + "remove-item": "็งป้™ค" + }, + "context-menus": { + "item": { + "open-section-title": "ไปฅ...้–‹ๅ•Ÿ", + "sametab": "็›ฎๅ‰ๅˆ†้ ", + "newtab": "ๆ–ฐๅˆ†้ ", + "modal": "ๅฝˆๅ‡บ่ฆ–็ช—", + "workspace": "ๅทฅไฝœๅ€", + "clipboard": "่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ", + "options-section-title": "้ธ้ …", + "edit-item": "็ทจ่ผฏ", + "move-item": "่ค‡่ฃฝๆˆ–็งปๅ‹•", + "remove-item": "็งป้™ค", + "copied-toast": "ๅทฒๅฐ‡็ถฒๅ€่ค‡่ฃฝๅˆฐๅ‰ช่ฒผ็ฐฟ" + }, + "section": { + "open-section": "้–‹ๅ•Ÿๅ€ๅŸŸ", + "edit-section": "็ทจ่ผฏ", + "expand-collapse": "ๅฑ•้–‹ / ๆ”ถๅˆ", + "move-section": "็งปๅ‹•่‡ณ", + "remove-section": "็งป้™ค" + } + }, + "interactive-editor": { + "menu": { + "start-editing-tooltip": "้€ฒๅ…ฅไบ’ๅ‹•ๅผ็ทจ่ผฏๅ™จ", + "edit-site-data-subheading": "็ทจ่ผฏ็ถฒ็ซ™่ณ‡ๆ–™", + "edit-page-info-btn": "็ทจ่ผฏ้ ้ข่ณ‡่จŠ", + "edit-page-info-tooltip": "ๆ‡‰็”จ็จ‹ๅผๆจ™้กŒใ€่ชชๆ˜Žใ€ๅฐŽ่ˆชๅˆ—้€ฃ็ตใ€้ ๅฐพๆ–‡ๅญ—...็ญ‰", + "edit-app-config-btn": "็ทจ่ผฏๆ‡‰็”จ็จ‹ๅผ่จญๅฎš", + "edit-app-config-tooltip": "ๅ…ถ้ค˜ๆ‡‰็”จ็จ‹ๅผ่จญๅฎš้ธ้ …", + "edit-pages-btn": "็ทจ่ผฏ้ ้ข", + "edit-pages-tooltip": "ๆ–ฐๅขžๆˆ–็งป้™ค้กๅค–ๆชข่ฆ–", + "config-save-methods-subheading": "่จญๅฎšๅ„ฒๅญ˜้ธ้ …", + "save-locally-btn": "ๆœฌๆฉŸๅ„ฒๅญ˜", + "save-locally-tooltip": "ๅฐ‡่จญๅฎšๅ„ฒๅญ˜ๅˆฐ็€่ฆฝๅ™จๅ„ฒๅญ˜็ฉบ้–“ไธญใ€‚้€™ไธๆœƒๅฝฑ้Ÿฟๅˆฐๆ‚จ็š„่จญๅฎšๆช”๏ผŒไฝ†่ฎŠๆ›ดๅƒ…ๆœƒๅ„ฒๅญ˜ๅœจๆญค่ฃ็ฝฎ", + "save-disk-btn": "ๅ„ฒๅญ˜่จญๅฎšๆช”", + "save-disk-tooltip": "ๅฐ‡่จญๅฎšๅ„ฒๅญ˜ๅˆฐ็กฌ็ขŸไธŠ็š„ conf.yml ๆช”ๆกˆใ€‚้€™ๅฐ‡ๅ‚™ไปฝ๏ผŒ็„ถๅพŒ่ฆ†ๅฏซๆ‚จ็›ฎๅ‰็š„่จญๅฎš", + "export-config-btn": "ๅŒฏๅ‡บ่จญๅฎš", + "export-config-tooltip": "ๆชข่ฆ–ไธฆๅฐ‡ๆ–ฐ่จญๅฎšๅŒฏๅ‡บๅˆฐๆช”ๆกˆๆˆ–ๅ‰ช่ฒผ็ฐฟ", + "cloud-backup-btn": "ๅ‚™ไปฝ่‡ณ้›ฒ็ซฏ", + "cloud-backup-tooltip": "ๅฐ‡ๅŠ ๅฏ†ๅพŒ็š„ๅ‚™ไปฝ่จญๅฎšๆช”ๅ„ฒๅญ˜่‡ณ้›ฒ็ซฏ", + "edit-raw-config-btn": "็ทจ่ผฏๅŽŸๅง‹่จญๅฎš", + "edit-raw-config-tooltip": "้€้Ž JSON ็ทจ่ผฏๅ™จๆชข่ฆ–ๆˆ–็ทจ่ผฏๅŽŸๅง‹่จญๅฎš", + "cancel-changes-btn": "ๅ–ๆถˆ็ทจ่ผฏ", + "cancel-changes-tooltip": "้‡่จญ็›ฎๅ‰็š„ๆ›ดๅ‹•๏ผŒไธฆ้€€ๅ‡บ็ทจ่ผฏๆจกๅผใ€‚้€™ไธๆœƒๅฝฑ้Ÿฟๆ‚จๅทฒๅ„ฒๅญ˜็š„่จญๅฎš", + "edit-mode-name": "็ทจ่ผฏๆจกๅผ", + "edit-mode-subtitle": "็›ฎๅ‰็‚บ็ทจ่ผฏๆจกๅผ", + "edit-mode-description": "้€™ไปฃ่กจๆ‚จๅฏไปฅ็ทจ่ผฏ่จญๅฎšไธฆ้ ่ฆฝใ€‚ไฝ†ๅœจๆ‚จๅ„ฒๅญ˜ๅ‰๏ผŒ่ฎŠๆ›ดๅฐ‡ไธ่ขซๅ„ฒๅญ˜ใ€‚", + "save-stage-btn": "ๅ„ฒๅญ˜", + "cancel-stage-btn": "ๅ–ๆถˆ", + "save-locally-warning": "่‹ฅ็นผ็บŒ๏ผŒ่ฎŠๆ›ดๅฐ‡ๅƒ…ๅ„ฒๅญ˜ๅœจ็€่ฆฝๅ™จไธญใ€‚ๆ‚จๆ‡‰ๅŒฏๅ‡บ่จญๅฎšๆช”ไปฅๅœจๅ…ถไป–่ฃ็ฝฎไฝฟ็”จใ€‚ๆ‚จ็ขบๅฎš่ฆ็นผ็บŒๅ—Ž๏ผŸ" + }, + "edit-item": { + "missing-title-err": "ๅฟ…้ ˆๅกซๅฏซ้ …็›ฎๆจ™้กŒ" + }, + "edit-section": { + "edit-section-title": "็ทจ่ผฏๅ€ๅกŠ", + "add-section-title": "ๆ–ฐๅขžๅ€ๅกŠ", + "edit-tooltip": "้ปžๆ“Šไปฅ็ทจ่ผฏ๏ผŒๅณ้ตไปฅๆŸฅ็œ‹ๆ›ดๅคš้ธ้ …", + "remove-confirm": "ๆ‚จ็ขบๅฎš่ฆ็งป้™คๆญคๅ€ๅกŠๅ—Ž๏ผŸๆญคๆ“ไฝœๅฏๅพฉๅŽŸใ€‚" + }, + "edit-app-config": { + "warning-msg-title": "่ฌนๆ…Žๆ“ไฝœ", + "warning-msg-l1": "ไธ‹ๅˆ—้ธ้ …็”จๆ–ผ้€ฒ้šŽๆ‡‰็”จ็จ‹ๅผ่จญๅฎšใ€‚", + "warning-msg-l2": "ๅฆ‚ๆžœๆ‚จๅฐไปปไฝ•ๆฌ„ไฝๆœ‰ไธ็ขบๅฎš็š„ๅœฐๆ–น๏ผŒ่ซ‹ๅƒ้–ฑ", + "warning-msg-docs": "่ชชๆ˜Žๆ–‡ไปถ", + "warning-msg-l3": "ไปฅ้ฟๅ…ๆ„ๅค–ๅพŒๆžœใ€‚" + }, + "export": { + "export-title": "ๅŒฏๅ‡บ่จญๅฎš", + "copy-clipboard-btn": "่ค‡่ฃฝ่‡ณๅ‰ช่ฒผ็ฐฟ", + "copy-clipboard-tooltip": "ๅฐ‡ๆ‰€ๆœ‰ๆ‡‰็”จ็จ‹ๅผ่จญๅฎšไปฅ YAML ๆ ผๅผ่ค‡่ฃฝๅˆฐ็ณป็ตฑๅ‰ช่ฒผ็ฐฟใ€‚", + "download-file-btn": "ไธ‹่ผ‰ๆช”ๆกˆ", + "download-file-tooltip": "ๅฐ‡ๆ‰€ๆœ‰ๆ‡‰็”จ็จ‹ๅผ่จญๅฎšไปฅ YAML ๆช”ๆกˆไธ‹่ผ‰ๅˆฐๆ‚จ็š„่ฃ็ฝฎใ€‚", + "view-title": "ๆชข่ฆ–่จญๅฎš" + } + }, + "widgets": { + "general": { + "loading": "ๆญฃๅœจ่ผ‰ๅ…ฅ...", + "show-more": "ๅฑ•้–‹่ฉณ็ดฐ่ณ‡่จŠ", + "show-less": "้กฏ็คบ่ผƒๅฐ‘", + "open-link": "็นผ็บŒ้–ฑ่ฎ€" + }, + "pi-hole": { + "status-heading": "็‹€ๆ…‹" + }, + "stat-ping": { + "up": "็ทšไธŠ", + "down": "้›ข็ทš" + }, + "net-data": { + "cpu-chart-title": "CPU ๆญทๅฒ็ด€้Œ„", + "mem-chart-title": "่จ˜ๆ†ถ้ซ”ไฝฟ็”จ็އ", + "mem-breakdown-title": "Memory Breakdown", + "load-chart-title": "็ณป็ตฑ่ฒ ่ผ‰" + }, + "glances": { + "disk-space-free": "ๅฏ็”จ", + "disk-space-used": "ๅทฒไฝฟ็”จ", + "disk-mount-point": "ๆŽ›่ผ‰้ปž", + "disk-file-system": "ๆช”ๆกˆ็ณป็ตฑ", + "disk-io-read": "่ฎ€ๅ–", + "disk-io-write": "ๅฏซๅ…ฅ", + "system-load-desc": "ๆญฃๅœจๅŸท่กŒ้šŠๅˆ—ไธญ็ญ‰ๅพ…็š„ๅŸท่กŒๅบๆ•ธ้‡๏ผŒๅนณๅ‡ๅˆ†้…ๅˆฐๆ‰€ๆœ‰ๆ ธๅฟƒ" + }, + "system-info": { + "uptime": "้–‹ๆฉŸๆ™‚้–“" + }, + "flight-data": { + "arrivals": "ๆŠต้”", + "departures": "ๅ‡บ็™ผ" + }, + "tfl-status": { + "good-service-all": "ๅ…จ็ทšๆญฃๅธธ็‡Ÿ้‹", + "good-service-rest": "ๆ‰€ๆœ‰ๅ…ถไป–่ทฏ็ทšๆญฃๅธธ็‡Ÿ้‹" + }, + "synology-download": { + "download": "ไธ‹่ผ‰", + "upload": "ไธŠๅ‚ณ", + "downloaded": "ๅทฒไธ‹่ผ‰", + "uploaded": "ๅทฒไธŠๅ‚ณ", + "remaining": "ๅ‰ฉ้ค˜", + "up": "ไธŠๅ‚ณ", + "down": "ไธ‹่ผ‰" + }, + "gluetun-status": { + "vpn-ip": "VPN IP", + "country": "ๅœ‹ๅฎถ", + "region": "ๅ€ๅŸŸ", + "city": "ๅŸŽๅธ‚", + "post-code": "้ƒต้žๅ€่™Ÿ", + "location": "ๅœฐๅ€", + "timezone": "ๆ™‚ๅ€", + "organization": "็ต„็น”" + }, + "nextcloud": { + "active": "ๅ•Ÿ็”จ", + "and": "ๅ’Œ", + "applications": "ๆ‡‰็”จ็จ‹ๅผ", + "available": "ๅฏ็”จ", + "away": "้›ข้–‹", + "cache-full": "ๅฟซๅ–ๅทฒๆปฟ", + "chat-room": "่Šๅคฉๅฎค", + "delete-all": "ๅ…จ้ƒจๅˆช้™ค", + "delete-notification": "ๅˆช้™ค้€š็Ÿฅ", + "disabled": "ๅทฒๅœ็”จ", + "disk-quota": "็กฌ็ขŸ้™้ก", + "disk-space": "็กฌ็ขŸ็ฉบ้–“", + "dnd": "ๅ‹ฟๆ“พ", + "email": "้›ปๅญ้ƒตไปถ", + "enabled": "ๅทฒๅ•Ÿ็”จ", + "federated-shares-ucfirst": "่ฏ็›Ÿๅ…ฑไบซ", + "federated-shares": "่ฏ็›Ÿๅ…ฑไบซ", + "files": "ๆช”ๆกˆ{plural}", + "free": "ๅฏ็”จ", + "groups": "็พค็ต„", + "hit-rate": "ๅ‘ฝไธญ็އ", + "hits": "ๅ‘ฝไธญ", + "home": "้ฆ–้ ", + "in": "ๆ–ผ", + "keys": "้‡‘้‘ฐ", + "last-24-hours": "้ŽๅŽป 24 ๅฐๆ™‚", + "last-5-minutes": "้ŽๅŽป 5 ๅˆ†้˜", + "last-hour": "้ŽๅŽป 1 ๅฐๆ™‚", + "last-login": "ๆœ€ๅพŒ็™ปๅ…ฅ", + "last-restart": "ๆœ€ๅพŒ้‡ๆ–ฐๅ•Ÿๅ‹•", + "load-averages": "ๆ‰€ๆœ‰ CPU ๆ ธๅฟƒ็š„่ฒ ่ผ‰ๅนณๅ‡ๅ€ผ", + "local-shares": "ๆœฌๆฉŸๅˆ†ไบซ", + "local": "ๆœฌๆฉŸ", + "max-keys": "ๆœ€ๅคง้‡‘้‘ฐ", + "memory-used": "ๅทฒไฝฟ็”จ่จ˜ๆ†ถ้ซ”", + "memory-utilisation": "่จ˜ๆ†ถ้ซ”ไฝฟ็”จ็އ", + "memory": "่จ˜ๆ†ถ้ซ”", + "misses": "็ผบๅคฑ", + "no-notifications": "็„ก้€š็Ÿฅ", + "no-pending-updates": "็„กๅพ…่™•็†็š„ๆ›ดๆ–ฐ", + "nothing-to-show": "็›ฎๅ‰ๆฒ’ๆœ‰ๅฏ้กฏ็คบ็š„้ …็›ฎ", + "of-which": "of which", + "of": "of", + "offline": "้›ข็ทš", + "online": "็ทšไธŠ", + "other": "ๅ…ถไป–", + "overall": "็ธฝ้ซ”", + "private-link": "็งไบบ้€ฃ็ต", + "public-link": "ๅ…ฌ้–‹้€ฃ็ต", + "quota-enabled": "็กฌ็ขŸ้™้ก {not}ๆœชๅฐๆญคไฝฟ็”จ่€…ๅ•Ÿ็”จ", + "received": "ๅทฒๆŽฅๆ”ถ", + "scripts": "่…ณๆœฌ", + "sent": "ๅทฒ้€ๅ‡บ", + "started": "ๅทฒๅ•Ÿๅ‹•", + "storages-by-type": "ไพ้กžๅž‹ๅˆ†้กž็š„ๅ„ฒๅญ˜็ฉบ้–“", + "storages": "ๅ„ฒๅญ˜็ฉบ้–“{plural}", + "strings-use": "strings use", + "tasks": "ๅทฅไฝœ", + "total-files": "็ธฝๆช”ๆกˆ", + "total-users": "็ธฝไฝฟ็”จ่€…", + "total": "็ธฝๆ•ธ", + "until": "็›ดๅˆฐ", + "updates-available-for": "ๆœ‰ๅฏ็”จๆ›ดๆ–ฐ๏ผš", + "updates-available": "ๆ›ดๆ–ฐ{plural} ๅฏ็”จ", + "used": "ๅทฒไฝฟ็”จ", + "user": "ไฝฟ็”จ่€…", + "using": "ๆญฃๅœจไฝฟ็”จ", + "version": "็‰ˆๆœฌ", + "wasted": "ๅทฒๆตช่ฒป" + } + } +} diff --git a/src/assets/locales/zz-pirate.json b/src/assets/locales/zz-pirate.json index 766c751bb1..a13cd0022b 100644 --- a/src/assets/locales/zz-pirate.json +++ b/src/assets/locales/zz-pirate.json @@ -1,104 +1,91 @@ -{ - "home": { - "no-results": "Nay Search Results", - "no-data": "Nay Data Configured" - }, - "search": { - "search-placeholder": "Start typin' t' filter", - "enter-to-search-web": "Press enter t' search th' web" - }, - "login": { - "remember-me-label": "Remember me fer", - "error-missing-username": "Missin' Username", - "error-missing-password": "Missin' Password", - "success-message": "Loggin' in...", - "already-logged-in-text": "ye're logged in as", - "proceed-to-dashboard": "Proceed t' Dashboard", - "log-out-button": "Logout Ye All", - "proceed-guest-button": "Proceed as Ye Guest" - }, - "config": { - "main-tab": "Ya Main Menu", - "heading": "Ye Configuration Options", - "download-config-button": "Download Config", - "reset-settings-button": "Reset Ship Settin's", - "change-language-button": "Change Ye Language", - "cloud-sync-button": "Enable Ship Sync", - "app-info-button": "Th' Ship Info", - "backup-note": "It be recommend t' make a backup o' yer configuration before makin' changes.", - "reset-config-msg-l1": "This will remove all user settin's from local storage, but won't effect yer 'conf.yml' file.", - "reset-config-msg-l2": "ye should first backup any changes ye've made locally, if ye want t' use them in th' future.", - "reset-config-msg-l3": "be ye sure ye want t' proceed?", - "data-copied-msg": "Config has been copied t' clipboardd", - "css-note-l1": "ye will need t' refresh th' page fer yer changes t' take effect.", - "css-note-l2": "Styles overrides be only stored locally, so it be recommended t' make a copy o' yer CSS.", - "css-note-l3": "To remove all custom styles, delete th' contents and hit Save Changes" - }, - "settings": { - "sign-in-welcome": "Ahoy {username}!" - }, - "updates": { - "app-version-note": "Dashy version", - "up-to-date": "Up-to-Date", - "out-of-date": "Update Available", - "unsupported-version-l1": "You are using a ye' old version of Dashy", - "unsupported-version-l2": "For th' best experience, and recent security patches, please update to" - }, - "language-switcher": { - "success-msg": "Language Updated t'" - }, - "theme-maker": { - "copied-toast": "Theme data for {theme} copied t' ye clipboard" - }, - "config-editor": { - "save-location-label": "Save Location", - "location-local-label": "Apply Locally", - "location-disk-label": "Write Changes to Config File", - "save-button": "Save Changes", - "valid-label": "Config is Valid", - "status-success-msg": "Task Complete", - "status-fail-msg": "Task Failed", - "success-msg-disk": "Th' config file written to disk successfully", - "success-msg-local": "Ye local changes were successfully saved", - "success-note-l1": "th' app should rebuild automatically.", - "success-note-l2": "This may take up t' a minute.", - "success-note-l3": "ye will need t' refresh th' page fer changes t' take effect.", - "error-msg-cannot-save": "An error occurred savin' config", - "error-msg-bad-json": "Error in ye JSON, possibly malformed", - "warning-msg-validation": "Validation Warnin' Ahead", - "not-admin-note": "ye cannot write changed t' disk, because ye be not logged in as an admin" - }, - "app-rebuild": { - "title": "Rebuild Application", - "rebuild-note-l1": "A rebuild be required fer changes written t' th' conf.yml file t' take effect.", - "rebuild-note-l2": "This should happen automatically, but if it hasn't, ye can manually trigger it here.", - "rebuild-note-l3": "This be not required fer modifications stored locally.", - "rebuild-button": "Start Build", - "rebuilding-status-1": "Buildin...", - "error-permission": "ye dern't have permission t' trigger this action", - "success-msg": "Ayhyo, build did complete successfully!", - "fail-msg": "Build operation did fail", - "reload-note": "A page reload be now required fer changes t' take effect", - "reload-button": "Reload Ye Page" - }, - "cloud-sync": { - "intro-l1": "Cloud backup and restore be an optional feature, that enables ye t' upload yer config t' th' internet, and then restore it on any other device or instance o' Dashy.", - "intro-l2": "All data be fully end-t'-end encrypted with AES, usin' yer password as th' key.", - "intro-l3": "For more info, please see th'", - "backup-title-setup": "Make ye Backup", - "backup-title-update": "Update ye Backup", - "password-label-setup": "Choose ye Password", - "password-label-update": "Enter yer Password", - "backup-id-label": "Yer Backup ID", - "backup-id-note": "This be used t' restore from backups later. So keep it, along with yer password somewhere safe.", - "backup-missing-password": "Missin'g' Password", - "backup-error-unknown": "Unable t' process request", - "backup-error-password": "Incorrect password. Walk the plank! Please enter yer current password." - }, - "menu": { - "sametab": "Stay Aboard", - "newtab": "Walk the Plank", - "modal": "Open in ye Pop-Up Ship", - "workspace": "Open on Workspace Deck" - } -} \ No newline at end of file +{ + "home": { + "no-results": "Nay Search Results", + "no-data": "Nay Data Configured" + }, + "search": { + "search-placeholder": "Start typin' t' filter", + "enter-to-search-web": "Press enter t' search th' web" + }, + "login": { + "remember-me-label": "Remember me fer", + "error-missing-username": "Missin' Username", + "error-missing-password": "Missin' Password", + "success-message": "Loggin' in...", + "already-logged-in-text": "ye're logged in as", + "proceed-to-dashboard": "Proceed t' Dashboard", + "log-out-button": "Logout Ye All", + "proceed-guest-button": "Proceed as Ye Guest" + }, + "config": { + "main-tab": "Ya Main Menu", + "heading": "Ye Configuration Options", + "download-config-button": "Download Config", + "reset-settings-button": "Reset Ship Settin's", + "change-language-button": "Change Ye Language", + "cloud-sync-button": "Enable Ship Sync", + "app-info-button": "Th' Ship Info", + "backup-note": "It be recommend t' make a backup o' yer configuration before makin' changes.", + "reset-config-msg-l1": "This will remove all user settin's from local storage, but won't effect yer 'conf.yml' file.", + "reset-config-msg-l2": "ye should first backup any changes ye've made locally, if ye want t' use them in th' future.", + "reset-config-msg-l3": "be ye sure ye want t' proceed?", + "data-copied-msg": "Config has been copied t' clipboardd", + "css-note-l1": "ye will need t' refresh th' page fer yer changes t' take effect.", + "css-note-l2": "Styles overrides be only stored locally, so it be recommended t' make a copy o' yer CSS.", + "css-note-l3": "To remove all custom styles, delete th' contents and hit Save Changes" + }, + "settings": { + "sign-in-welcome": "Ahoy {username}!" + }, + "updates": { + "app-version-note": "Dashy version", + "up-to-date": "Up-to-Date", + "out-of-date": "Update Available", + "unsupported-version-l1": "You are using a ye' old version of Dashy", + "unsupported-version-l2": "For th' best experience, and recent security patches, please update to" + }, + "language-switcher": { + "success-msg": "Language Updated t'" + }, + "theme-maker": { + "copied-toast": "Theme data for {theme} copied t' ye clipboard" + }, + "config-editor": { + "save-location-label": "Save Location", + "location-local-label": "Apply Locally", + "location-disk-label": "Write Changes to Config File", + "save-button": "Save Changes", + "valid-label": "Config is Valid", + "status-success-msg": "Task Complete", + "status-fail-msg": "Task Failed", + "success-msg-disk": "Th' config file written to disk successfully", + "success-msg-local": "Ye local changes were successfully saved", + "success-note-l1": "th' app should rebuild automatically.", + "success-note-l2": "This may take up t' a minute.", + "success-note-l3": "ye will need t' refresh th' page fer changes t' take effect.", + "error-msg-cannot-save": "An error occurred savin' config", + "error-msg-bad-json": "Error in ye JSON, possibly malformed", + "warning-msg-validation": "Validation Warnin' Ahead", + "not-admin-note": "ye cannot write changed t' disk, because ye be not logged in as an admin" + }, + "cloud-sync": { + "intro-l1": "Cloud backup and restore be an optional feature, that enables ye t' upload yer config t' th' internet, and then restore it on any other device or instance o' Dashy.", + "intro-l2": "All data be fully end-t'-end encrypted with AES, usin' yer password as th' key.", + "intro-l3": "For more info, please see th'", + "backup-title-setup": "Make ye Backup", + "backup-title-update": "Update ye Backup", + "password-label-setup": "Choose ye Password", + "password-label-update": "Enter yer Password", + "backup-id-label": "Yer Backup ID", + "backup-id-note": "This be used t' restore from backups later. So keep it, along with yer password somewhere safe.", + "backup-missing-password": "Missin'g' Password", + "backup-error-unknown": "Unable t' process request", + "backup-error-password": "Incorrect password. Walk the plank! Please enter yer current password." + }, + "menu": { + "sametab": "Stay Aboard", + "newtab": "Walk the Plank", + "modal": "Open in ye Pop-Up Ship", + "workspace": "Open on Workspace Deck" + } +} diff --git a/src/components/Charts/Gauge.vue b/src/components/Charts/Gauge.vue index d4edc5cbed..5fa5f56cd0 100644 --- a/src/components/Charts/Gauge.vue +++ b/src/components/Charts/Gauge.vue @@ -89,7 +89,7 @@ * Heavily inspired by vue-svg-gauge by @hellocomet * See: https://github.com/hellocomet/vue-svg-gauge */ -import ErrorHandler from '@/utils/ErrorHandler'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; // Main radius of the gauge const RADIUS = 100; diff --git a/src/components/Charts/PercentageChart.vue b/src/components/Charts/PercentageChart.vue index 0a2ba53cf5..6de9fa0c73 100644 --- a/src/components/Charts/PercentageChart.vue +++ b/src/components/Charts/PercentageChart.vue @@ -36,11 +36,11 @@ export default { default: true, }, height: { - number: Boolean, + type: Number, default: 1, }, - values: Array, - title: String, + values: { type: Array, required: true }, + title: { type: String, default: '' }, }, data() { return { diff --git a/src/components/Configuration/AccessError.vue b/src/components/Configuration/AccessError.vue index 4b928b3d12..35590efa7e 100644 --- a/src/components/Configuration/AccessError.vue +++ b/src/components/Configuration/AccessError.vue @@ -9,7 +9,7 @@ + + + + diff --git a/src/components/Configuration/AppInfoModal.vue b/src/components/Configuration/AppInfoModal.vue index 19c0caa768..534a6866b5 100644 --- a/src/components/Configuration/AppInfoModal.vue +++ b/src/components/Configuration/AppInfoModal.vue @@ -1,130 +1,16 @@ - - - - diff --git a/src/components/Configuration/AppVersion.vue b/src/components/Configuration/AppVersion.vue index ac48076ef5..66221960e0 100644 --- a/src/components/Configuration/AppVersion.vue +++ b/src/components/Configuration/AppVersion.vue @@ -1,7 +1,7 @@ + + diff --git a/src/components/InteractiveEditor/ExportConfigMenu.vue b/src/components/InteractiveEditor/ExportConfigMenu.vue index 239703cb92..afa9120c3f 100644 --- a/src/components/InteractiveEditor/ExportConfigMenu.vue +++ b/src/components/InteractiveEditor/ExportConfigMenu.vue @@ -1,114 +1,293 @@ @@ -56,27 +36,11 @@ footer { background: var(--footer-background); margin-top: 1.5rem; border-top: 1px solid var(--outline-color); - @include tablet-down { - display: none; - } - span.path-to-config { - float: left; - font-size: 0.75rem; - margin: 0.1rem 0.5rem 0 0; - opacity: var(--dimming-factor); - max-width: 10rem; - overflow: hidden; - text-overflow: ellipsis; - word-break: break-all; - max-height: 1rem; - } } - -footer a{ +:global(footer a) { color: var(--footer-text-color); &:hover { color: var(--footer-text-color-link); } } - diff --git a/src/components/PageStrcture/Header.vue b/src/components/PageStrcture/Header.vue index f0d3f96f5c..10f7666494 100644 --- a/src/components/PageStrcture/Header.vue +++ b/src/components/PageStrcture/Header.vue @@ -6,14 +6,14 @@ :description="pageInfo.description" :logo="pageInfo.logo" /> -
@@ -85,17 +98,56 @@ export default { @import '@/styles/media-queries.scss'; .nav-outer { + position: relative; + min-width: 0; + + &.floating { + position: absolute; + top: 0.5rem; + right: 0.5rem; + z-index: 5; + } + + .burger { + display: flex; + align-items: center; + justify-content: center; + padding: 0.4rem; + background: none; + border: 1px solid transparent; + border-radius: var(--curve-factor); + color: var(--settings-text-color); + cursor: pointer; + transition: background 0.15s, color 0.15s, border-color 0.15s; + &:hover, &:focus-visible, &[aria-expanded="true"] { + background: var(--background); + border-color: var(--primary); + color: var(--primary); + } + &:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; } + svg { width: 1.5rem; height: 1.5rem; } + } + nav { display: flex; align-items: center; + min-width: 0; + max-width: 100%; + overflow-x: auto; + @extend .scroll-bar; + .nav-item { display: inline-block; padding: 0.75rem 0.5rem; margin: 0.5rem; min-width: 5rem; + max-width: 12rem; + flex: 0 0 auto; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; text-align: center; outline: none; - border: none; border-radius: var(--curve-factor); box-shadow: var(--nav-link-shadow); color: var(--nav-link-text-color); @@ -105,22 +157,31 @@ export default { &.router-link-active, &:hover { color: var(--nav-link-text-color-hover); background: var(--nav-link-background-color-hover); - border: 1px solid var(--nav-link-border-color-hover); + border-color: var(--nav-link-border-color-hover); box-shadow: var(--nav-link-shadow-hover); } } + + &.as-menu { + position: absolute; + top: calc(100% + 0.25rem); + right: 0; + z-index: 10; + flex-direction: column; + align-items: stretch; + min-width: 12rem; + max-width: calc(100vw - 1rem); + max-height: calc(100vh - 6rem); + padding: 0.25rem; + overflow-x: hidden; + overflow-y: auto; + background: var(--background-darker); + border: 1px solid var(--primary); + border-radius: var(--curve-factor); + box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25); + .nav-item { margin: 0.25rem 0; max-width: none; min-width: 0; } + } } - /* Mobile and Burger-Menu Styles */ - @extend .svg-button; - @include phone { - width: 100%; - nav { flex-wrap: wrap; } - } - .burger { - display: none; - &.visible { display: block; } - @include phone { display: block; } - } -} +} diff --git a/src/components/PageStrcture/PageTitle.vue b/src/components/PageStrcture/PageTitle.vue index 4c8f3d6664..366fff6243 100644 --- a/src/components/PageStrcture/PageTitle.vue +++ b/src/components/PageStrcture/PageTitle.vue @@ -7,8 +7,7 @@

{{ title }}

{{ description }} - - @@ -16,14 +15,14 @@ diff --git a/src/components/Settings/ConfigLauncher.vue b/src/components/Settings/ConfigLauncher.vue index 7591d704b4..2a482a4e74 100644 --- a/src/components/Settings/ConfigLauncher.vue +++ b/src/components/Settings/ConfigLauncher.vue @@ -1,5 +1,5 @@ @@ -33,13 +40,17 @@ // Import components, and store-key identifiers import ConfigContainer from '@/components/Configuration/ConfigContainer'; import LanguageSwitcher from '@/components/Settings/LanguageSwitcher'; +import AuthButtons from '@/components/Settings/AuthButtons'; import Keys from '@/utils/StoreMutations'; -import { topLevelConfKeys, localStorageKeys, modalNames } from '@/utils/defaults'; +import { topLevelConfKeys, localStorageKeys, modalNames } from '@/utils/config/defaults'; import ViewSwitcher from '@/components/Settings/ViewSwitcher'; +import NavLinksSwitcher from '@/components/Settings/NavLinksSwitcher.vue'; +import { buildAllLinks } from '@/utils/NavLinks'; // Import icons for config launcher buttons import IconSpanner from '@/assets/interface-icons/config-editor.svg'; import IconInteractiveEditor from '@/assets/interface-icons/interactive-editor-edit-mode.svg'; import IconViewMode from '@/assets/interface-icons/application-change-view.svg'; +import IconNavLinks from '@/assets/interface-icons/config-pages.svg'; export default { name: 'ConfigLauncher', @@ -47,15 +58,19 @@ export default { return { modalNames, viewSwitcherOpen: false, + navLinksOpen: false, }; }, components: { ConfigContainer, LanguageSwitcher, + AuthButtons, ViewSwitcher, + NavLinksSwitcher, IconSpanner, IconInteractiveEditor, IconViewMode, + IconNavLinks, }, computed: { sections() { @@ -73,6 +88,9 @@ export default { isEditAllowed() { return this.$store.getters.permissions.allowViewConfig; }, + userState() { + return this.$store.getters.userState; + }, /* Tooltip text for Edit Mode button, to change depending on it in edit mode */ enterEditModeTooltip() { if (!this.isEditAllowed) return 'Config editor not available'; @@ -81,6 +99,12 @@ export default { ? 'edit-mode-subtitle' : 'start-editing-tooltip'}`, ); }, + /* True when there's at least one nav link or visible sub-page to show */ + hasNavLinks() { + void this.$store.state.authRevision; + const nav = (this.pageInfo && this.pageInfo.navLinks) || []; + return buildAllLinks(this.$store, this.$route, nav).length > 0; + }, }, methods: { showEditor: function show() { @@ -100,13 +124,19 @@ export default { return conf; }, tooltip(content) { - return { content, trigger: 'hover focus', delay: 250 }; + return { content }; }, openChangeViewMenu() { this.viewSwitcherOpen = !this.viewSwitcherOpen; + this.navLinksOpen = false; + }, + openNavLinksMenu() { + this.navLinksOpen = !this.navLinksOpen; + this.viewSwitcherOpen = false; }, - closeViewSwitcher() { + closeMenus() { this.viewSwitcherOpen = false; + this.navLinksOpen = false; }, startInteractiveEditor() { if (!this.isEditMode && this.isEditAllowed) { diff --git a/src/components/Settings/CustomThemeMaker.vue b/src/components/Settings/CustomThemeMaker.vue index fa647c1190..4534c0e89e 100644 --- a/src/components/Settings/CustomThemeMaker.vue +++ b/src/components/Settings/CustomThemeMaker.vue @@ -7,24 +7,16 @@ - - - + :id="`color-input-${colorName}`" + type="color" + :value="customColors[colorName]" + class="swatch-input form__input__element" + :style="makeSwatchStyles(colorName)" + @input="customColors[colorName] = $event.target.value; + setVariable(colorName, $event.target.value)" + /> - diff --git a/src/components/Settings/LanguageSwitcher.vue b/src/components/Settings/LanguageSwitcher.vue index 1ccb9bd5e5..40dd73a012 100644 --- a/src/components/Settings/LanguageSwitcher.vue +++ b/src/components/Settings/LanguageSwitcher.vue @@ -1,7 +1,8 @@ - diff --git a/src/components/Settings/LocalConfigWarning.vue b/src/components/Settings/LocalConfigWarning.vue index af38d1509b..a206abc2a2 100644 --- a/src/components/Settings/LocalConfigWarning.vue +++ b/src/components/Settings/LocalConfigWarning.vue @@ -13,21 +13,32 @@ + + + diff --git a/src/components/Settings/OptionsPanel.vue b/src/components/Settings/OptionsPanel.vue new file mode 100644 index 0000000000..94ead5420d --- /dev/null +++ b/src/components/Settings/OptionsPanel.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/src/components/Settings/SearchBar.vue b/src/components/Settings/SearchBar.vue index d5ed456509..19501337d1 100644 --- a/src/components/Settings/SearchBar.vue +++ b/src/components/Settings/SearchBar.vue @@ -23,21 +23,22 @@ diff --git a/src/components/Settings/ThemeSelector.vue b/src/components/Settings/ThemeSelector.vue index 6624c19ca9..54d2a30e73 100644 --- a/src/components/Settings/ThemeSelector.vue +++ b/src/components/Settings/ThemeSelector.vue @@ -5,10 +5,9 @@ -@import 'vue-select/src/scss/vue-select.scss'; +@import 'vue-select/dist/vue-select.css'; @import '@/styles/style-helpers.scss'; .theme-dropdown { div.vs__dropdown-toggle { + width: 100%; border-color: var(--settings-text-color); border-radius: var(--curve-factor); - min-width: 8rem; - max-width: 16rem; height: 1.8rem; font-size: 0.85rem; cursor: pointer; @@ -111,31 +105,26 @@ export default { .theme-selector-section { display: flex; - flex-direction: row; - align-items: flex-start; - justify-content: center; - height: 100%; - span.theme-label { - font-size: 1rem; - color: var(--settings-text-color); - margin: 1px 0 2px 0; + align-items: flex-end; + gap: 0.5rem; + width: 100%; + > div { + flex: 1; + min-width: 0; } } svg.color-button { - path { - fill: var(--settings-text-color); - } - width: 1rem; - height: 1rem; - padding: 0.2rem; - margin: 0.5rem; - align-self: flex-end; - text-align: center; + width: 1.8rem; + height: 1.8rem; + padding: 0.4rem; + box-sizing: border-box; + flex-shrink: 0; background: var(--background); - border: 1px solid var(--settings-text-color);; + border: 1px solid var(--settings-text-color); border-radius: var(--curve-factor); cursor: pointer; + path { fill: var(--settings-text-color); } &:hover, &.selected { background: var(--settings-text-color); path { fill: var(--background); } diff --git a/src/components/Settings/ViewSwitcher.vue b/src/components/Settings/ViewSwitcher.vue index ab9200026e..33b56b619f 100644 --- a/src/components/Settings/ViewSwitcher.vue +++ b/src/components/Settings/ViewSwitcher.vue @@ -2,16 +2,17 @@
  • - + {{ $t('alternate-views.default') }}
  • - + {{ $t('alternate-views.minimal') }} +
  • - + {{ $t('alternate-views.workspace') }}
  • @@ -23,6 +24,7 @@ import IconHome from '@/assets/interface-icons/application-home.svg'; import IconWorkspaceView from '@/assets/interface-icons/open-workspace.svg'; import IconMinimalView from '@/assets/interface-icons/application-minimal.svg'; +import { makeRoutePath, resolveRouteIntent } from '@/utils/config/ConfigHelpers'; export default { components: { @@ -30,9 +32,11 @@ export default { IconWorkspaceView, IconMinimalView, }, - computed: { - subPagePath() { - return this.$route.path.split('/').pop() || ''; + methods: { + /* Make URL to the given view. Includes current sub-page, and section when supported */ + pathFor(view) { + const { pageId, sectionSlug } = resolveRouteIntent(this.$route, this.$store); + return makeRoutePath(view, pageId, sectionSlug); }, }, }; diff --git a/src/components/Widgets/AdGuardDnsInfo.vue b/src/components/Widgets/AdGuardDnsInfo.vue index beb187259d..bf92018ba8 100644 --- a/src/components/Widgets/AdGuardDnsInfo.vue +++ b/src/components/Widgets/AdGuardDnsInfo.vue @@ -10,7 +10,7 @@
    {{ item.lbl }}: - {{ item.val | renderVal }} + {{ renderVal(item.val) }}
@@ -54,7 +54,7 @@ export default { showData: false, }; }, - filters: { + methods: { renderVal(val) { if (val === undefined) return 'N/A'; if (Array.isArray(val) && val.length === 0) return 'N/A'; @@ -63,8 +63,6 @@ export default { if (Array.isArray(val)) return val.join('\n'); return val; }, - }, - methods: { /* Make GET request to AdGuard endpoint */ fetchData() { this.makeRequest(this.basicInoEndpoint, this.authHeaders).then(this.processStatusBasics); diff --git a/src/components/Widgets/AdGuardFilterStatus.vue b/src/components/Widgets/AdGuardFilterStatus.vue index 5997086f1e..13676b9612 100644 --- a/src/components/Widgets/AdGuardFilterStatus.vue +++ b/src/components/Widgets/AdGuardFilterStatus.vue @@ -20,7 +20,7 @@
- Updated {{ filter.last_updated | formatDate }} + Updated {{ formatDate(filter.last_updated) }} View List
@@ -62,13 +62,11 @@ export default { filters: null, }; }, - filters: { + methods: { formatDate(date) { if (!date) return 'Never'; return getTimeAgo(date); }, - }, - methods: { /* Make GET request to AdGuard endpoint */ fetchData() { this.makeRequest(this.endpoint, this.authHeaders).then(this.processData); diff --git a/src/components/Widgets/AnonAddy.vue b/src/components/Widgets/AnonAddy.vue index eb5d4d6ce0..333ca0c2d5 100644 --- a/src/components/Widgets/AnonAddy.vue +++ b/src/components/Widgets/AnonAddy.vue @@ -12,7 +12,7 @@
Bandwidth - {{ meta.bandwidth | formatBytes }} out of + {{ formatBytes(meta.bandwidth) }} out of {{ meta.bandwidthLimit !== 100000000 ? (formatBytes(meta.bandwidthLimit)) : 'โˆž'}}
@@ -66,8 +66,8 @@
Created - {{ alias.createdAt | formatDate }} - {{ alias.createdAt | formatTimeAgo }} + {{ formatDate(alias.createdAt) }} + {{ formatTimeAgo(alias.createdAt) }}
@@ -92,7 +92,7 @@ import Toggle from '@/components/FormElements/Toggle'; import PercentageChart from '@/components/Charts/PercentageChart'; import WidgetMixin from '@/mixins/WidgetMixin'; -import { widgetApiEndpoints } from '@/utils/defaults'; +import { widgetApiEndpoints } from '@/utils/config/defaults'; import { timestampToDate, getTimeAgo, convertBytes } from '@/utils/MiscHelpers'; import ClipboardIcon from '@/assets/interface-icons/open-clipboard.svg'; @@ -167,7 +167,10 @@ export default { return arrOfRange(1, maxNumbers); }, }, - filters: { + created() { + this.fetchAccountInfo(); + }, + methods: { formatDate(timestamp) { return timestampToDate(timestamp); }, @@ -177,14 +180,9 @@ export default { formatBytes(bytes) { return convertBytes(bytes); }, - }, - created() { - this.fetchAccountInfo(); - }, - methods: { copyToClipboard(text) { navigator.clipboard.writeText(text); - this.$toasted.show('Email address copied to clipboard'); + this.$toast('Email address copied to clipboard'); }, fetchData() { this.makeRequest(this.endpoint, this.headers).then(this.processData); @@ -241,7 +239,7 @@ export default { }, toggleAlias(state, id) { if (this.disableControls) { - this.$toasted.show('Error, controls disabled', { className: 'toast-error' }); + this.$toast.error('Error, controls disabled'); } else { const method = state ? 'POST' : 'DELETE'; const path = state ? 'active-aliases' : `active-aliases/${id}`; @@ -249,7 +247,7 @@ export default { const endpoint = `${this.hostname}/api/${this.apiVersion}/${path}`; this.makeRequest(endpoint, this.headers, method, body).then(() => { const successMsg = `Alias successfully ${state ? 'enabled' : 'disabled'}`; - this.$toasted.show(successMsg, { className: 'toast-success' }); + this.$toast.success(successMsg); }); } }, diff --git a/src/components/Widgets/Apod.vue b/src/components/Widgets/Apod.vue index eb3529cbb1..ddacc443fc 100644 --- a/src/components/Widgets/Apod.vue +++ b/src/components/Widgets/Apod.vue @@ -17,7 +17,7 @@ @@ -229,27 +245,24 @@ export default { button.action-btn { height: 1rem; min-width: auto; - width: 1.75rem; + width: 1.25rem; margin: 0; - padding: 0.1rem 0; + padding: 0.25rem; position: absolute; top: 0; border: none; opacity: var(--dimming-factor); color: var(--widget-text-color); + svg { width: 0.75rem; height: 0.75rem; } &:hover { opacity: 1; color: var(--widget-background-color); } - &.update-btn { - right: -0.25rem; - } - - &.open-btn { - right: 1.75rem; - } + &.update-btn { right: -0.25rem; } + &.edit-btn { right: 1rem; } + &.remove-btn { right: 2.25rem; } } // Optional widget label diff --git a/src/components/Widgets/XkcdComic.vue b/src/components/Widgets/XkcdComic.vue index 22bcc10f9d..1ea0037bc5 100644 --- a/src/components/Widgets/XkcdComic.vue +++ b/src/components/Widgets/XkcdComic.vue @@ -9,7 +9,7 @@ diff --git a/src/directives/ClickOutside.js b/src/directives/ClickOutside.js index ca39036651..892e6937f6 100644 --- a/src/directives/ClickOutside.js +++ b/src/directives/ClickOutside.js @@ -17,7 +17,7 @@ function onDocumentClick(event, elem, action) { export default { /* Add event listeners */ - bind(element, binding) { + mounted(element, binding) { const elem = element; elem.dataset.outsideClickIndex = instances.length; @@ -31,7 +31,7 @@ export default { instances.push(click); }, /* Remove event listeners */ - unbind(elem) { + unmounted(elem) { if (!elem.dataset) return; const index = elem.dataset.outsideClickIndex; const handler = instances[index]; diff --git a/src/directives/LongPress.js b/src/directives/LongPress.js index d56f05cd6a..adeae8424e 100644 --- a/src/directives/LongPress.js +++ b/src/directives/LongPress.js @@ -11,7 +11,7 @@ const longPressEvent = new CustomEvent('long-press'); let startTime = null; export default { - bind(element, binding, vnode) { + mounted(element, binding) { const el = element; el.dataset.longPressTimeout = null; @@ -29,7 +29,7 @@ export default { /* Emit event to component */ const triggerEvent = () => { - if (vnode.componentInstance) vnode.componentInstance.$emit('long-press'); + if (binding.instance) binding.instance.$emit('long-press'); else el.dispatchEvent(longPressEvent); el.dataset.elapsed = true; }; @@ -60,7 +60,7 @@ export default { el.$longPressHandler = onPointerDown; el.addEventListener('pointerdown', onPointerDown); }, - unbind(el) { + unmounted(el) { startTime = null; clearTimeout(parseInt(el.dataset.longPressTimeout, 10)); el.removeEventListener('pointerdown', el.$longPressHandler); diff --git a/src/directives/Tooltip.js b/src/directives/Tooltip.js new file mode 100644 index 0000000000..eeecdd2a0f --- /dev/null +++ b/src/directives/Tooltip.js @@ -0,0 +1,375 @@ +/** + * Dashy's custom zero-dependency v-tooltip directive for Vue 3 + * Supports strings or object bindings, HTML content, auto-positioning + * and is designed to be accessible, responsive, performant and configurable. + * + * Usage: it's registered globally already, so no need to import. + * Just add the v-tooltip attribute to any element, passing in text or options + * + * Examples: + * + * ? + * y no tooltip? + * + * + */ +import DOMPurify from 'dompurify'; + +const DEFAULTS = { + triggers: ['hover', 'focus'], + placement: 'auto', + delay: { show: 250, hide: 0 }, +}; +const GAP = 8; +const ARROW_SIZE = 6; +const TRANSITION_MS = 150; + +let stylesInjected = false; +function injectStyles() { + if (stylesInjected) return; + stylesInjected = true; + const style = document.createElement('style'); + style.id = 'dashy-tooltip-styles'; + style.textContent = ` +.dashy-tooltip { + position: absolute; + top: 0; left: 0; + z-index: 10; + max-width: var(--tooltip-width, 250px); + pointer-events: none; + visibility: hidden; + opacity: 0; + transition: opacity ${TRANSITION_MS}ms, visibility ${TRANSITION_MS}ms; + font-size: 0.8rem; +} +.dashy-tooltip.is-visible { + visibility: visible; + opacity: 1; +} +.dashy-tooltip .tooltip-inner { + background: var(--description-tooltip-background, #1a1a2e); + border: 1px solid var(--description-tooltip-color, #7efff5); + border-radius: var(--curve-factor-small, 2px); + color: var(--description-tooltip-color, #7efff5); + padding: var(--tooltip-padding, 0.2rem); + overflow: hidden; + word-wrap: break-word; +} +.dashy-tooltip .tooltip-arrow { + position: absolute; + width: 0; height: 0; + border-style: solid; + border-color: transparent; + border-width: ${ARROW_SIZE}px; +} +.dashy-tooltip[data-placement^="top"] .tooltip-arrow { + bottom: -${ARROW_SIZE}px; + border-bottom-width: 0; + border-top-color: var(--description-tooltip-color, #7efff5); +} +.dashy-tooltip[data-placement^="bottom"] .tooltip-arrow { + top: -${ARROW_SIZE}px; + border-top-width: 0; + border-bottom-color: var(--description-tooltip-color, #7efff5); +} +.dashy-tooltip[data-placement^="left"] .tooltip-arrow { + right: -${ARROW_SIZE}px; + border-right-width: 0; + border-left-color: var(--description-tooltip-color, #7efff5); +} +.dashy-tooltip[data-placement^="right"] .tooltip-arrow { + left: -${ARROW_SIZE}px; + border-left-width: 0; + border-right-color: var(--description-tooltip-color, #7efff5); +} +/* Base z-index already clears modals (8); in-modal-tt nudges above other overlays. */ +.dashy-tooltip.in-modal-tt { z-index: 11; } +@media (prefers-reduced-motion: reduce) { + .dashy-tooltip { transition: none; } +} + `; + document.head.appendChild(style); +} + +const PLACEMENTS = ['top', 'bottom', 'right', 'left']; +const FLIP = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' }; + +function clamp(val, min, max) { return Math.max(min, Math.min(max, val)); } + +function computeCoords(target, tip, placement, sx, sy) { + const cx = target.left + target.width / 2 + sx; + const cy = target.top + target.height / 2 + sy; + switch (placement) { + case 'top': return { left: cx - tip.width / 2, top: target.top + sy - tip.height - GAP }; + case 'bottom': return { left: cx - tip.width / 2, top: target.bottom + sy + GAP }; + case 'bottom-end': return { left: target.right + sx - tip.width, top: target.bottom + sy + GAP }; + case 'left': return { left: target.left + sx - tip.width - GAP, top: cy - tip.height / 2 }; + case 'right': return { left: target.right + sx + GAP, top: cy - tip.height / 2 }; + default: return { left: cx - tip.width / 2, top: target.top + sy - tip.height - GAP }; + } +} + +function fitsViewport(target, tip, vw, vh, placement) { + switch (placement) { + case 'top': return target.top - tip.height - GAP >= 0; + case 'bottom': return target.bottom + tip.height + GAP <= vh; + case 'left': return target.left - tip.width - GAP >= 0; + case 'right': return target.right + tip.width + GAP <= vw; + default: return true; + } +} + +function positionTooltip(targetEl, tipEl, requested) { + const target = targetEl.getBoundingClientRect(); + if (target.width === 0 && target.height === 0) { + const owner = targetEl; + if (owner._tooltip) hide(owner); + return; + } + const tipEl2 = tipEl; + tipEl2.style.visibility = 'hidden'; + tipEl2.style.display = 'block'; + const tip = tipEl2.getBoundingClientRect(); + const sx = window.scrollX; + const sy = window.scrollY; + const vw = document.documentElement.clientWidth; + const vh = document.documentElement.clientHeight; + + let placement = requested; + if (placement === 'auto') { + placement = PLACEMENTS.find(p => fitsViewport(target, tip, vw, vh, p)) || 'top'; + } else if (!placement.includes('-') && !fitsViewport(target, tip, vw, vh, placement)) { + placement = FLIP[placement] || placement; + } + + const coords = computeCoords(target, tip, placement, sx, sy); + coords.left = clamp(coords.left, sx + GAP, sx + vw - tip.width - GAP); + coords.top = clamp(coords.top, sy + GAP, sy + vh - tip.height - GAP); + + tipEl2.style.left = `${coords.left}px`; + tipEl2.style.top = `${coords.top}px`; + tipEl2.setAttribute('data-placement', placement); + + // Arrow: point at target center, clamped within tooltip + const arrow = tipEl2.querySelector('.tooltip-arrow'); + if (!arrow) return; + if (placement === 'top' || placement === 'bottom' || placement === 'bottom-end') { + const targetCx = target.left + target.width / 2 + sx; + const arrowLeft = clamp(targetCx - coords.left - ARROW_SIZE, ARROW_SIZE, tip.width - ARROW_SIZE * 3); + arrow.style.left = `${arrowLeft}px`; + arrow.style.top = ''; + } else { + const targetCy = target.top + target.height / 2 + sy; + const arrowTop = clamp(targetCy - coords.top - ARROW_SIZE, ARROW_SIZE, tip.height - ARROW_SIZE * 3); + arrow.style.top = `${arrowTop}px`; + arrow.style.left = ''; + } + + tipEl2.style.visibility = ''; + tipEl2.style.display = ''; +} + +let idCounter = 0; + +function normalize(value) { + if (!value && value !== 0) return null; + if (typeof value === 'string' || typeof value === 'number') return { content: String(value) }; + if (typeof value === 'object') { + if (value.disabled || !value.content) return null; + return value; + } + return null; +} + +function resolveDelay(raw) { + if (raw == null) return DEFAULTS.delay; + if (typeof raw === 'number') return { show: raw, hide: 0 }; + return { show: raw.show ?? DEFAULTS.delay.show, hide: raw.hide ?? DEFAULTS.delay.hide }; +} + +/* Show / hide */ +function show(el) { + const state = el._tooltip; + if (!state || state.visible) return; + const opts = state.options; + if (!opts) return; + clearTimeout(state.hideTimer); + + state.showTimer = setTimeout(() => { + injectStyles(); + + const tip = document.createElement('div'); + tip.className = 'dashy-tooltip tooltip'; + tip.id = state.id; + tip.setAttribute('role', 'tooltip'); + + // Apply popperClass + if (opts.popperClass) { + const classes = Array.isArray(opts.popperClass) ? opts.popperClass : opts.popperClass.split(' '); + classes.forEach(c => { if (c) tip.classList.add(c); }); + } + + const inner = document.createElement('div'); + inner.className = 'tooltip-inner'; + if (opts.html) { + inner.innerHTML = DOMPurify.sanitize(opts.content); + } else { + inner.textContent = opts.content; + } + + const arrow = document.createElement('div'); + arrow.className = 'tooltip-arrow'; + + tip.appendChild(inner); + tip.appendChild(arrow); + document.body.appendChild(tip); + state.tooltipEl = tip; + + positionTooltip(el, tip, opts.placement || DEFAULTS.placement); + + requestAnimationFrame(() => { tip.classList.add('is-visible'); }); + state.visible = true; + + // Reposition on scroll/resize + state.reposition = () => { + if (state.tooltipEl) positionTooltip(el, state.tooltipEl, opts.placement || DEFAULTS.placement); + }; + window.addEventListener('scroll', state.reposition, { passive: true, capture: true }); + window.addEventListener('resize', state.reposition, { passive: true }); + }, resolveDelay(opts.delay).show); +} + +function hide(el) { + const state = el._tooltip; + if (!state) return; + clearTimeout(state.showTimer); + + const doHide = () => { + if (state.tooltipEl) { + state.tooltipEl.classList.remove('is-visible'); + const tipEl = state.tooltipEl; + setTimeout(() => { tipEl.remove(); }, TRANSITION_MS); + state.tooltipEl = null; + } + state.visible = false; + if (state.reposition) { + window.removeEventListener('scroll', state.reposition, { capture: true }); + window.removeEventListener('resize', state.reposition); + state.reposition = null; + } + }; + + const delay = resolveDelay(state.options?.delay).hide; + if (delay > 0) { + state.hideTimer = setTimeout(doHide, delay); + } else { + doHide(); + } +} + +/* Global click-to-dismiss */ +let globalClickBound = false; +function ensureGlobalClick() { + if (globalClickBound) return; + globalClickBound = true; + document.addEventListener('click', () => { + document.querySelectorAll('.dashy-tooltip.is-visible').forEach((tip) => { + // Find the owner element via the tooltip id + const owner = document.querySelector(`[aria-describedby="${tip.id}"]`); + if (owner) hide(owner); + else tip.remove(); // Orphan โ€” owner no longer in DOM + }); + }, { capture: true }); +} + +/* Event binding */ +function bind(el) { + const state = el._tooltip; + const triggers = state.options?.triggers || DEFAULTS.triggers; + + state.onShow = () => show(el); + state.onHide = () => hide(el); + + if (triggers.includes('hover')) { + el.addEventListener('mouseenter', state.onShow); + el.addEventListener('mouseleave', state.onHide); + } + if (triggers.includes('focus')) { + el.addEventListener('focusin', state.onShow); + el.addEventListener('focusout', state.onHide); + } + // Always hide on click (e.g. opening a modal) + el.addEventListener('click', state.onHide); + ensureGlobalClick(); +} + +function unbind(el) { + const state = el._tooltip; + if (!state || !state.onShow) return; + el.removeEventListener('mouseenter', state.onShow); + el.removeEventListener('mouseleave', state.onHide); + el.removeEventListener('focusin', state.onShow); + el.removeEventListener('focusout', state.onHide); + el.removeEventListener('click', state.onHide); +} + +/* Directive hooks */ +export default { + mounted(el, binding) { + const opts = normalize(binding.value); + const id = `dashy-tt-${idCounter++}`; + el._tooltip = { options: opts, id, tooltipEl: null, visible: false }; + if (!opts) return; + el.setAttribute('aria-describedby', id); + bind(el); + }, + + updated(el, binding) { + const opts = normalize(binding.value); + const state = el._tooltip; + if (!state) return; + + const wasEnabled = !!state.options; + state.options = opts; + + if (!opts) { + if (state.visible) hide(el); + el.removeAttribute('aria-describedby'); + if (wasEnabled) unbind(el); + return; + } + + if (!wasEnabled) { + el.setAttribute('aria-describedby', state.id); + bind(el); + } + + // Update visible tooltip content/position + if (state.visible && state.tooltipEl) { + const inner = state.tooltipEl.querySelector('.tooltip-inner'); + if (inner) { + if (opts.html) { + inner.innerHTML = DOMPurify.sanitize(opts.content); + } else { + inner.textContent = opts.content; + } + } + positionTooltip(el, state.tooltipEl, opts.placement || DEFAULTS.placement); + } + }, + + unmounted(el) { + unbind(el); + const state = el._tooltip; + if (state) { + clearTimeout(state.showTimer); + clearTimeout(state.hideTimer); + if (state.tooltipEl) state.tooltipEl.remove(); + if (state.reposition) { + window.removeEventListener('scroll', state.reposition, { capture: true }); + window.removeEventListener('resize', state.reposition); + } + } + delete el._tooltip; + }, +}; diff --git a/src/main.js b/src/main.js index 5d9b6baeba..a94ab07ee7 100644 --- a/src/main.js +++ b/src/main.js @@ -1,87 +1,78 @@ -/* eslint-disable no-multi-spaces */ + // Import core framework and essential utils -import Vue from 'vue'; -import VueI18n from 'vue-i18n'; // i18n for localization +import { createApp } from 'vue'; // Import component Vue plugins, used throughout the app -import VTooltip from 'v-tooltip'; // A Vue directive for Popper.js, tooltip component -import VModal from 'vue-js-modal'; // Modal component import VSelect from 'vue-select'; // Select dropdown component -import VTabs from 'vue-material-tabs'; // Tab view component, used on the config page -import Toasted from 'vue-toasted'; // Toast component, used to show confirmation notifications -import TreeView from 'vue-json-tree-view'; // Import base Dashy components and utils import Dashy from '@/App.vue'; // Main Dashy Vue app +import Modal from '@/components/FormElements/Modal.vue'; // In-house modal component +import VModal from '@/plugins/modal'; // $modal.show()/hide() plugin import store from '@/store'; // Store, for local state management import router from '@/router'; // Router, for navigation import serviceWorker from '@/utils/InitServiceWorker'; // Service worker initialization -import { messages } from '@/utils/languages'; // Language texts -import ErrorReporting from '@/utils/ErrorReporting'; // Error reporting initializer (off) +import i18n from '@/utils/i18n'; // i18n instance (exported so non-component callers can t()) +import ErrorReporting from '@/utils/logging/ErrorReporting'; // Error reporting initializer (off) import clickOutside from '@/directives/ClickOutside'; // Directive for closing popups, modals, etc -import { toastedOptions, tooltipOptions, language as defaultLanguage } from '@/utils/defaults'; -import { initKeycloakAuth, isKeycloakEnabled } from '@/utils/KeycloakAuth'; -import { initHeaderAuth, isHeaderAuthEnabled } from '@/utils/HeaderAuth'; -import { initOidcAuth, isOidcEnabled } from '@/utils/OidcAuth'; +import tooltip from '@/directives/Tooltip'; // Custom tooltip directive +import { initKeycloakAuth, isKeycloakEnabled } from '@/utils/auth/KeycloakAuth'; +import { initHeaderAuth, isHeaderAuthEnabled } from '@/utils/auth/HeaderAuth'; +import { initOidcAuth, isOidcEnabled } from '@/utils/auth/OidcAuth'; import Keys from '@/utils/StoreMutations'; -import ErrorHandler from '@/utils/ErrorHandler'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; +import Toast from '@/utils/Toast'; + +// Create the Vue 3 app instance +const app = createApp(Dashy); -// Initialize global Vue components -Vue.use(VueI18n); -Vue.use(VTooltip, tooltipOptions); -Vue.use(VModal); -Vue.use(VTabs); -Vue.use(TreeView); -Vue.use(Toasted, toastedOptions); -Vue.component('v-select', VSelect); -Vue.directive('clickOutside', clickOutside); +// Register plugins +app.use(store); +app.use(router); +app.use(i18n); +app.use(VModal); +app.use(Toast); -// When running in dev mode, enable Vue performance tools -const isDevMode = process.env.NODE_ENV === 'development'; -Vue.config.performance = isDevMode; -Vue.config.productionTip = isDevMode; +// Register global components and directives +app.component('modal', Modal); +app.component('v-select', VSelect); +app.directive('clickOutside', clickOutside); +app.directive('tooltip', tooltip); -// Setup i18n translations -const i18n = new VueI18n({ - locale: defaultLanguage, - fallbackLocale: defaultLanguage, - messages, +app.config.errorHandler = (err, instance, info) => { + ErrorHandler(`Vue error in ${info}`, err); +}; + +window.addEventListener('unhandledrejection', (event) => { + ErrorHandler('Unhandled promise rejection', event.reason); }); -// Checks if service worker not disable, and if so will registers it +const isDevMode = import.meta.env.DEV; +app.config.performance = isDevMode; + serviceWorker(); // Checks if user enabled error reporting, and if so will initialize it -ErrorReporting(Vue, router); +ErrorReporting(app, router); -// Render function -const render = (awesome) => awesome(Dashy); +// Mount the app +const mount = () => app.mount('#app'); -// Mount the app, with router, store i18n and render func -const mount = () => new Vue({ - store, router, render, i18n, -}).$mount('#app'); +/* Handle failures of third-party auth initialization */ +const handleAuthFailure = (provider, err) => { + ErrorHandler(`Failed to authenticate with ${provider}`, err); + store.commit(Keys.CRITICAL_ERROR_MSG, `Authentication failed (${provider}). See console for details.`); + mount(); +}; -store.dispatch(Keys.INITIALIZE_CONFIG).then(() => { +router.isReady().then(() => { if (isOidcEnabled()) { - initOidcAuth() - .then(() => mount()) - .catch((e) => { - ErrorHandler('Failed to authenticate with OIDC', e); - }); - } else if (isKeycloakEnabled()) { // If Keycloak is enabled, initialize auth - initKeycloakAuth() - .then(() => mount()) - .catch((e) => { - ErrorHandler('Failed to authenticate with Keycloak', e); - }); - } else if (isHeaderAuthEnabled()) { // If header auth is enabled, initialize auth - initHeaderAuth() - .then(() => mount()) - .catch((e) => { - ErrorHandler('Failed to authenticate with server', e); - }); - } else { // If no third-party auth, just mount the app as normal + initOidcAuth().then(mount).catch((e) => handleAuthFailure('OIDC', e)); + } else if (isKeycloakEnabled()) { + initKeycloakAuth().then(mount).catch((e) => handleAuthFailure('Keycloak', e)); + } else if (isHeaderAuthEnabled()) { + initHeaderAuth().then(mount).catch((e) => handleAuthFailure('Header Auth', e)); + } else { mount(); } }); diff --git a/src/mixins/ConfigSaving.js b/src/mixins/ConfigSaving.js index bde363b737..0c862a8573 100644 --- a/src/mixins/ConfigSaving.js +++ b/src/mixins/ConfigSaving.js @@ -1,9 +1,11 @@ -import jsYaml from 'js-yaml'; +import { dump as yamlDump } from 'js-yaml'; import { Progress } from 'rsup-progress'; import request from '@/utils/request'; - -import ErrorHandler, { InfoHandler } from '@/utils/ErrorHandler'; -import { localStorageKeys, serviceEndpoints } from '@/utils/defaults'; +import ErrorHandler, { InfoHandler } from '@/utils/logging/ErrorHandler'; +import { localStorageKeys, serviceEndpoints } from '@/utils/config/defaults'; +import { + configScope, stripRootOwnedFields, clearScopedLocalConfig, +} from '@/utils/config/ConfigHelpers'; import StoreKeys from '@/utils/StoreMutations'; export default { @@ -16,37 +18,31 @@ export default { }, methods: { writeConfigToDisk(config) { - if (config.appConfig.preventWriteToDisk) { - ErrorHandler('Unable to write changed to disk, as this functionality is disabled'); - return; + const { state } = this.$store; + if (state.config?.appConfig?.preventWriteToDisk) { + ErrorHandler('Unable to write changes to disk, as this functionality is disabled'); + return Promise.resolve(false); } - // 1. Get the config, and strip appConfig if is sub-page - const isSubPag = !!this.$store.state.currentConfigInfo.confId; - const jsonConfig = config; - jsonConfig.sections = jsonConfig.sections.map(({ filteredItems, ...section }) => section); - // If a sub-config, then remove appConfig, and check path isn't an external URL - if (isSubPag) { - delete jsonConfig.appConfig; - if (this.$store.state.currentConfigInfo.confPath.includes('http')) { - ErrorHandler('Cannot save to an external URL'); - return; - } + const isSubPag = !!state.currentConfigInfo.confId; + if (isSubPag && state.currentConfigInfo.confPath?.includes('http')) { + ErrorHandler('Cannot save to an external URL'); + return Promise.resolve(false); } - // 2. Convert JSON into YAML - const yamlOptions = {}; - const strjsonConfig = JSON.stringify(jsonConfig); - const jsonObj = JSON.parse(strjsonConfig); - const yaml = jsYaml.dump(jsonObj, yamlOptions); - // 3. Prepare the request - const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin; + // Strip runtime-only `filteredItems` and (for sub-pages) root-owned fields. + // Spread to avoid mutating the caller's object (may be state.configSource) + const base = isSubPag ? stripRootOwnedFields(config) : { ...(config || {}) }; + const jsonConfig = { + ...base, + sections: (base.sections || []).map(({ filteredItems: _filteredItems, ...s }) => s), + }; + const yaml = yamlDump(JSON.parse(JSON.stringify(jsonConfig))); + const baseUrl = import.meta.env.VITE_APP_DOMAIN || window.location.origin; const endpoint = `${baseUrl}${serviceEndpoints.save}`; - const filename = isSubPag - ? (this.$store.state.currentConfigInfo.confPath || '') : ''; + const filename = isSubPag ? (state.currentConfigInfo.confPath || '') : ''; const body = { config: yaml, timestamp: new Date(), filename }; const saveRequest = request.post(endpoint, body); - // 4. Make the request, and handle response this.progress.start(); - saveRequest.then((response) => { + return saveRequest.then((response) => { this.saveSuccess = response.data.success || false; this.responseText = response.data.message; if (this.saveSuccess) { @@ -58,53 +54,51 @@ export default { InfoHandler('Config has been written to disk successfully', 'Config Update'); this.progress.end(); this.$store.commit(StoreKeys.SET_EDIT_MODE, false); + return this.saveSuccess; }) - .catch((error) => { // fucking hell + .catch((error) => { this.saveSuccess = false; this.responseText = error; this.showToast(error, false); ErrorHandler(`Failed to save config. ${error}`); this.progress.end(); + return false; }); }, + /* Persist the given config to localStorage under keys scoped to the active page */ saveConfigLocally(config) { if (!this.permissions.allowSaveLocally) { ErrorHandler('Unable to save changes locally, this feature has been disabled'); return; } + const { confId } = this.$store.state.currentConfigInfo; + const scope = configScope(confId); + const clean = confId ? stripRootOwnedFields(config) : (config || {}); + const appConfig = clean.appConfig || {}; - const isSubPag = !!this.$store.state.currentConfigInfo.confId; - if (isSubPag) { // Save for sub-page only - const configId = this.$store.state.currentConfigInfo.confId; - const localStorageKeySections = `${localStorageKeys.CONF_SECTIONS}-${configId}`; - const localStorageKeyPageInfo = `${localStorageKeys.PAGE_INFO}-${configId}`; - localStorage.setItem(localStorageKeySections, JSON.stringify(config.sections)); - localStorage.setItem(localStorageKeyPageInfo, JSON.stringify(config.pageInfo)); - } else { // Or save to main config - localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(config.sections)); - localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(config.pageInfo)); - localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(config.appConfig)); + localStorage.setItem(scope.APP_CONFIG, JSON.stringify(appConfig)); + localStorage.setItem(scope.PAGE_INFO, JSON.stringify(clean.pageInfo || {})); + localStorage.setItem(scope.CONF_SECTIONS, JSON.stringify(clean.sections || [])); + const setOrClear = (key, value) => { + if (value) localStorage.setItem(key, value); + else localStorage.removeItem(key); + }; + setOrClear(scope.THEME, appConfig.theme); + setOrClear(scope.LAYOUT, appConfig.layout); + setOrClear(scope.ICON_SIZE, appConfig.iconSize); + setOrClear(scope.LANGUAGE, appConfig.language); + // pages is root-owned - only persisted from root context + if (!confId) { + localStorage.setItem(localStorageKeys.CONF_PAGES, JSON.stringify(clean.pages || [])); } - if (config.appConfig.theme) { - localStorage.setItem(localStorageKeys.THEME, config.appConfig.theme); - } InfoHandler('Config has successfully been saved in browser storage', 'Config Update'); this.showToast(this.$t('config-editor.success-msg-local'), true); this.$store.commit(StoreKeys.SET_EDIT_MODE, false); }, + /* After a successful disk write clear local overrides */ carefullyClearLocalStorage() { - // Delete the main keys - localStorage.removeItem(localStorageKeys.PAGE_INFO); - localStorage.removeItem(localStorageKeys.APP_CONFIG); - localStorage.removeItem(localStorageKeys.CONF_SECTIONS); - // Then, if we've got any sub-pages, delete those too - (this.$store.getters.pages || []).forEach((page) => { - const localStorageKeySections = `${localStorageKeys.CONF_SECTIONS}-${page.id}`; - const localStorageKeyPageInfo = `${localStorageKeys.PAGE_INFO}-${page.id}`; - localStorage.removeItem(localStorageKeySections); - localStorage.removeItem(localStorageKeyPageInfo); - }); + clearScopedLocalConfig(this.$store.getters.pages); }, }, }; diff --git a/src/mixins/HomeMixin.js b/src/mixins/HomeMixin.js index 320c068922..6292f2861d 100644 --- a/src/mixins/HomeMixin.js +++ b/src/mixins/HomeMixin.js @@ -2,17 +2,13 @@ * Mixin for all homepages (default home, minimal home, workspace, etc) */ -import Defaults, { localStorageKeys, iconCdns } from '@/utils/defaults'; +import Defaults, { localStorageKeys, iconCdns } from '@/utils/config/defaults'; import Keys from '@/utils/StoreMutations'; import { searchTiles } from '@/utils/Search'; import { checkItemVisibility } from '@/utils/CheckItemVisibility'; -import ThemingMixin from '@/mixins/ThemingMixin'; +import { resolveRouteIntent, PAGE_STATUS } from '@/utils/config/ConfigHelpers'; const HomeMixin = { - mixins: [ThemingMixin], - props: { - subPageInfo: Object, - }, computed: { sections() { return this.$store.getters.sections; @@ -40,36 +36,30 @@ const HomeMixin = { async $route() { this.loadUpConfig(); }, - pageInfo: { - handler(newPageInfo) { - if (newPageInfo && newPageInfo.title) { - document.title = newPageInfo.title; - } - }, - immediate: true, - }, }, async created() { this.loadUpConfig(); }, methods: { - /* When page loaded / sub-page changed, initiate config fetch */ + /* When page loaded / sub-page changed, initiate config fetch. + * For ROOT / LEGACY_SECTION intent the store loads the root config + * for KNOWN the store loads the matching sub-config + * for UNKNOWN the store triggers the critical error modal */ async loadUpConfig() { const subPage = this.determineConfigFile(); + const current = this.$store.state.currentConfigInfo?.confId || null; + if ((subPage || null) === current) return; // Already on this config, no reload await this.$store.dispatch(Keys.INITIALIZE_CONFIG, subPage); }, - /* Based on the current route, get which config to display, null will use default */ + /* Resolve which sub-config the current route targets. + * Returns a page id from makePageName, or null for the root config */ determineConfigFile() { - const pagePath = this.$router.currentRoute.path; - const isSubPage = new RegExp((/(home|workspace|minimal)\/[a-zA-Z0-9-]+/g)).test(pagePath); - const subPageName = isSubPage ? pagePath.split('/').pop() : null; - return subPageName; - }, - setTheme() { - this.initializeTheme(); + const { status, pageId } = resolveRouteIntent(this.$route, this.$store); + if (status === PAGE_STATUS.ROOT || status === PAGE_STATUS.LEGACY_SECTION) return null; + return pageId; // KNOWN -> load sub-config; UNKNOWN -> store raises critical error }, updateModalVisibility(modalState) { - this.$store.commit('SET_MODAL_OPEN', modalState); + this.$store.commit(Keys.SET_MODAL_OPEN, modalState); }, /* Updates local data with search value, triggered from filter comp */ searching(searchValue) { diff --git a/src/mixins/ItemMixin.js b/src/mixins/ItemMixin.js index 809f878023..586aad86b8 100644 --- a/src/mixins/ItemMixin.js +++ b/src/mixins/ItemMixin.js @@ -2,13 +2,13 @@ import request from '@/utils/request'; import router from '@/router'; import longPress from '@/directives/LongPress'; -import ErrorHandler from '@/utils/ErrorHandler'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; import { openingMethod as defaultOpeningMethod, serviceEndpoints, localStorageKeys, iconSize as defaultSize, -} from '@/utils/defaults'; +} from '@/utils/config/defaults'; export default { directives: { @@ -95,7 +95,7 @@ export default { const encode = (str) => encodeURIComponent(str); this.statusResponse = undefined; // Find base URL, where the API is hosted - const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin; + const baseUrl = import.meta.env.VITE_APP_DOMAIN || window.location.origin; // Find correct URL to check, and encode const urlToCheck = `?&url=${encode(statusCheckUrl || url)}`; // Get, stringify and encode any headers @@ -218,28 +218,26 @@ export default { copyToClipboard(content) { if (navigator.clipboard) { navigator.clipboard.writeText(content); - this.$toasted.show( - this.$t('context-menus.item.copied-toast'), - { className: 'toast-success' }, - ); + this.$toast.success(this.$t('context-menus.item.copied-toast')); } else { ErrorHandler('Clipboard access requires HTTPS. See: https://bit.ly/3N5WuAA'); - this.$toasted.show('Unable to copy, see log', { className: 'toast-error' }); + this.$toast.error('Unable to copy, see log'); } }, /* Used for smart-sort when sorting items by most used apps */ incrementMostUsedCount(itemId) { - const mostUsed = JSON.parse(localStorage.getItem(localStorageKeys.MOST_USED) || '{}'); - let counter = mostUsed[itemId] || 0; - counter += 1; - mostUsed[itemId] = counter; - localStorage.setItem(localStorageKeys.MOST_USED, JSON.stringify(mostUsed)); + try { + const mostUsed = JSON.parse(localStorage.getItem(localStorageKeys.MOST_USED) || '{}'); + mostUsed[itemId] = (mostUsed[itemId] || 0) + 1; + localStorage.setItem(localStorageKeys.MOST_USED, JSON.stringify(mostUsed)); + } catch { /* ignore corrupt localStorage */ } }, - /* Used for smart-sort when sorting by last used apps */ incrementLastUsedCount(itemId) { - const lastUsed = JSON.parse(localStorage.getItem(localStorageKeys.LAST_USED) || '{}'); - lastUsed[itemId] = new Date().getTime(); - localStorage.setItem(localStorageKeys.LAST_USED, JSON.stringify(lastUsed)); + try { + const lastUsed = JSON.parse(localStorage.getItem(localStorageKeys.LAST_USED) || '{}'); + lastUsed[itemId] = new Date().getTime(); + localStorage.setItem(localStorageKeys.LAST_USED, JSON.stringify(lastUsed)); + } catch { /* ignore corrupt localStorage */ } }, }, }; diff --git a/src/mixins/MasonryItem.js b/src/mixins/MasonryItem.js new file mode 100644 index 0000000000..5d508b4229 --- /dev/null +++ b/src/mixins/MasonryItem.js @@ -0,0 +1,53 @@ +/** + * Lets a direct child of `.item-group-container.orientation-auto` participate + * in the masonry grid. Measures its root element's height + vertical margins, + * converts to a `grid-row: span N` value against the container's + * `grid-auto-rows` unit, and keeps it in sync via a ResizeObserver. + * + * Usage: add to a component's `mixins`, then bind `masonryStyle` (a string + * of inline CSS, empty when the current layout isn't masonry) to the root + * element's `:style` attribute. + */ +export default { + data: () => ({ + masonryRowSpan: 0, + masonryResizeObserver: null, + }), + computed: { + isMasonry() { + return this.$store.getters.layout === 'auto'; + }, + masonryStyle() { + if (!this.isMasonry || !this.masonryRowSpan) return ''; + return `grid-row: span ${this.masonryRowSpan}`; + }, + }, + mounted() { + this.updateMasonrySpan(); + this.setupMasonryObserver(); + }, + beforeUnmount() { + if (this.masonryResizeObserver) { + this.masonryResizeObserver.disconnect(); + this.masonryResizeObserver = null; + } + }, + methods: { + updateMasonrySpan() { + const el = this.$el; + if (!el || !el.parentElement) return; + const parentStyle = getComputedStyle(el.parentElement); + const rowUnit = parseFloat(parentStyle.gridAutoRows) || 8; + const style = getComputedStyle(el); + const marginY = (parseFloat(style.marginTop) || 0) + + (parseFloat(style.marginBottom) || 0); + const total = el.offsetHeight + marginY; + this.masonryRowSpan = Math.max(1, Math.ceil(total / rowUnit)); + }, + setupMasonryObserver() { + if (typeof ResizeObserver === 'undefined' || !this.$el) return; + this.masonryResizeObserver = new ResizeObserver(() => this.updateMasonrySpan()); + this.masonryResizeObserver.observe(this.$el); + }, + }, +}; diff --git a/src/mixins/NextcloudMixin.js b/src/mixins/NextcloudMixin.js index bdbe753e3a..01cd1cc6af 100644 --- a/src/mixins/NextcloudMixin.js +++ b/src/mixins/NextcloudMixin.js @@ -1,4 +1,3 @@ -import { serviceEndpoints } from '@/utils/defaults'; import { convertBytes, formatNumber, getTimeAgo, timestampToDateTime, } from '@/utils/MiscHelpers'; @@ -70,10 +69,6 @@ export default { capabilitiesTtl() { return (parseInt(this.options.capabilitiesTtl, 10) || 3600) * 1000; }, - proxyReqEndpoint() { - const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin; - return `${baseUrl}${serviceEndpoints.corsProxy}`; - }, }, methods: { /* Nextcloud API endpoints */ @@ -169,22 +164,22 @@ export default { formatDateTime(time) { return timestampToDateTime(time); }, - /* Add additional formatting to {MiscHelpers.convertBytes()} */ - convertBytes(bytes, decimals = 2, formatHtml = true) { + /* Wraps {MiscHelpers.convertBytes()} with a decorative span; returns plain text when formatHtml=false */ + safeHtmlConvertBytes(bytes, decimals = 2, formatHtml = true) { const formatted = convertBytes(bytes, decimals).toString(); if (!formatHtml) return formatted; const m = formatted.match(/(-?\d+)((\.\d+)?\s(([KMGTPEZY]B|Bytes)))/); return `${m[1]}${m[2]}`; }, - /* Add additional formatting to {MiscHelpers.formatNumber()} */ - formatNumber(number, decimals = 1, formatHtml = true) { + /* Wraps {MiscHelpers.formatNumber()} with a decorative span; returns plain text when formatHtml=false */ + safeHtmlFormatNumber(number, decimals = 1, formatHtml = true) { const formatted = formatNumber(number, decimals).toString(); if (!formatHtml) return formatted; const m = formatted.match(/(\d+)((\.\d+)?([KMBT]?))/); return `${m[1]}${m[2]}`; }, - /* Format a number as percentage value */ - formatPercent(number, decimals = 2) { + /* Format a number as percentage value, wrapped in a decorative span */ + safeHtmlFormatPercent(number, decimals = 2) { const n = parseFloat(number).toFixed(decimals).split('.'); const d = n.length > 1 ? `.${n[1]}` : ''; return `${n[0]}${d}%`; diff --git a/src/mixins/ThemingMixin.js b/src/mixins/ThemingMixin.js index 7659f351c4..18312ae267 100644 --- a/src/mixins/ThemingMixin.js +++ b/src/mixins/ThemingMixin.js @@ -1,151 +1,33 @@ /** - * This mixin can be extended by any component or view which needs to manage themes - * It handles fetching and applying themes from the store, updating themes, - * applying custom CSS variables and loading external stylesheets. - * */ + * Provides dropdown state + computed theme list for components that let the user + * pick a theme (ThemeSelector, CustomThemeMaker, etc). The actual DOM + * application of themes is handled centrally in App.vue via a watcher on + * `$store.getters.theme`, so this mixin deliberately does no DOM work. + */ import Keys from '@/utils/StoreMutations'; -import ErrorHandler from '@/utils/ErrorHandler'; -import { builtInThemes, localStorageKeys, mainCssVars } from '@/utils/defaults'; +import { builtInThemes } from '@/utils/config/defaults'; +import { getExternalThemes, getExtraThemeNames } from '@/utils/Theming'; -const ThemingMixin = { - data: () => ({ - selectedTheme: '', // Used only to bind current them to theme dropdown - }), +export default { + data: () => ({ selectedTheme: '' }), computed: { - /* This is the theme from the central store. When it changes, the UI will update */ - themeFromStore() { - return this.$store.getters.theme; - }, - appConfig() { - return this.$store.getters.appConfig; - }, - /* Any extra user-defined themes, to add to dropdown */ - extraThemeNames() { - const userThemes = this.appConfig?.cssThemes || []; - if (typeof userThemes === 'string') return [userThemes]; - return userThemes; - }, - /* If user specified external stylesheet(s), format and return */ - externalThemes() { - const availableThemes = {}; - if (this.appConfig?.externalStyleSheet) { - const externals = this.appConfig.externalStyleSheet; - if (Array.isArray(externals)) { - externals.forEach((ext, i) => { - availableThemes[`External Stylesheet ${i + 1}`] = ext; - }); - } else if (typeof externals === 'string') { - availableThemes['External Stylesheet'] = this.appConfig.externalStyleSheet; - } else { - ErrorHandler('External stylesheets must be of type string or string[]'); - } - } - return availableThemes; - }, - /* Combines all theme names for dropdown (built-in, user-defined and stylesheets) */ + appConfig() { return this.$store.getters.appConfig; }, + themeFromStore() { return this.$store.getters.theme; }, + externalThemes() { return getExternalThemes(this.appConfig); }, + extraThemeNames() { return getExtraThemeNames(this.appConfig); }, themeNames() { - const externalThemeNames = Object.keys(this.externalThemes); - return [...this.extraThemeNames, ...externalThemeNames, ...builtInThemes]; + return [...this.extraThemeNames, ...Object.keys(this.externalThemes), ...builtInThemes]; }, }, watch: { - /* When theme in VueX store changes, then update theme */ - themeFromStore(newTheme) { - if (newTheme) { - this.resetToDefault(); - this.selectedTheme = newTheme; - this.updateTheme(newTheme); - } - }, + themeFromStore: { immediate: true, handler(t) { this.selectedTheme = t; } }, }, methods: { - /* Called when user changes theme through the UI - * Updates store, which will in turn update theme through watcher - */ + /* Called when the user picks a theme in the dropdown โ€” store commit + * triggers the central watcher in App.vue to apply to the DOM. */ themeChangedInUI() { - this.$store.commit(Keys.SET_THEME, this.selectedTheme); // Update store - this.updateTheme(this.selectedTheme); // Apply theme to UI - }, - /** - * Gets any custom styles the user has applied, wither from local storage, or from the config - * @returns {object} An array of objects, one for each theme, containing kvps for variables - */ - getCustomColors() { - const localColors = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}'); - const configColors = this.appConfig.customColors || {}; - return Object.assign(configColors, localColors); - }, - /* Gets user custom color preferences for current theme, and applies to DOM */ - applyCustomVariables(theme) { - mainCssVars.forEach((vName) => { document.documentElement.style.removeProperty(`--${vName}`); }); - const themeColors = this.getCustomColors()[theme]; - if (themeColors) { - Object.keys(themeColors).forEach((customVar) => { - document.documentElement.style.setProperty(`--${customVar}`, themeColors[customVar]); - }); - } - }, - /* Sets the theme, by updating data-theme attribute on the html tag */ - applyLocalTheme(newTheme) { - const htmlTag = document.getElementsByTagName('html')[0]; - if (htmlTag.hasAttribute('data-theme')) htmlTag.removeAttribute('data-theme'); - htmlTag.setAttribute('data-theme', newTheme); - }, - /* If using an external stylesheet, load it in */ - applyRemoteTheme(href) { - this.resetToDefault(); - const element = document.createElement('link'); - element.setAttribute('rel', 'stylesheet'); - element.setAttribute('type', 'text/css'); - element.setAttribute('id', 'user-defined-stylesheet'); - element.setAttribute('href', href); - document.getElementsByTagName('head')[0].appendChild(element); - }, - /* Determines if a given theme is local / not a custom user stylesheet */ - isThemeLocal(themeToCheck) { - const localThemes = [...builtInThemes, ...this.extraThemeNames]; - return localThemes.includes(themeToCheck); - }, - /* Updates theme. Checks if the new theme is local or external, - and calls appropriate updating function. Updates local storage */ - updateTheme(newTheme) { - if (newTheme.toLowerCase() === 'default') { - this.resetToDefault(); - } else if (this.isThemeLocal(newTheme)) { - this.applyLocalTheme(newTheme); - } else if (this.externalThemes[newTheme]) { - this.applyRemoteTheme(this.externalThemes[newTheme]); - } - this.applyCustomVariables(newTheme); - }, - /* Removes any applied themes, and deletes any externally loaded stylesheets */ - resetToDefault() { - const externalStyles = document.getElementById('user-defined-stylesheet'); - if (externalStyles) document.getElementsByTagName('head')[0].removeChild(externalStyles); - document.getElementsByTagName('html')[0].removeAttribute('data-theme'); - }, - /* Call within mounted hook within a page to apply the correct theme */ - initializeTheme() { - const initialTheme = this.themeFromStore; - this.selectedTheme = initialTheme; - const hasExternal = this.externalThemes && Object.entries(this.externalThemes).length > 0; - - if (this.isThemeLocal(initialTheme)) { - this.updateTheme(initialTheme); - } else if (hasExternal) { - this.applyRemoteTheme(this.externalThemes[initialTheme]); - } - - // Detect OS theme preference and apply the corresponding theme - const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; - const osTheme = prefersDark ? this.appConfig.nightTheme : this.appConfig.dayTheme; - if (osTheme) { - this.$store.commit(Keys.SET_THEME, osTheme); - this.updateTheme(osTheme); - } + this.$store.commit(Keys.SET_THEME, this.selectedTheme); }, }, }; - -export default ThemingMixin; diff --git a/src/mixins/WidgetMixin.js b/src/mixins/WidgetMixin.js index 88251a6740..959ec16b69 100644 --- a/src/mixins/WidgetMixin.js +++ b/src/mixins/WidgetMixin.js @@ -4,8 +4,8 @@ */ import { Progress } from 'rsup-progress'; import request from '@/utils/request'; -import ErrorHandler from '@/utils/ErrorHandler'; -import { serviceEndpoints } from '@/utils/defaults'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; +import { serviceEndpoints } from '@/utils/config/defaults'; const WidgetMixin = { props: { @@ -30,14 +30,14 @@ const WidgetMixin = { this.disableLoader = true; } }, - beforeDestroy() { + beforeUnmount() { if (this.updater) { clearInterval(this.updater); } }, computed: { proxyReqEndpoint() { - const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin; + const baseUrl = import.meta.env.VITE_APP_DOMAIN || window.location.origin; return `${baseUrl}${serviceEndpoints.corsProxy}`; }, useProxy() { @@ -97,7 +97,7 @@ const WidgetMixin = { /* Used as v-tooltip, pass text content in, and will show on hover */ tooltip(content, html = false) { return { - content, html, trigger: 'hover focus', delay: 250, + content, html, }; }, /* Makes data request, returns promise */ @@ -131,18 +131,13 @@ const WidgetMixin = { }); }); }, - /* Check if a value is an environment variable, return its value if so. */ + /* If the string is a build-time env-var placeholder, return its value + * Otherwise, will pass it through to the proxy for it to resolve server-side */ parseAsEnvVar(str) { if (typeof str !== 'string') return str; - if (str.includes('VUE_APP_')) { - const envVar = process.env[str]; - if (!envVar) { - this.error(`Environment variable ${str} not found`); - } else { - return envVar; - } - } - return str; + if (!/^(?:VITE_APP_|VUE_APP_|DASHY_)/.test(str)) return str; + const envKey = str.replace(/^VUE_APP_/, 'VITE_APP_'); + return import.meta.env[envKey] ?? str; }, }, }; diff --git a/src/plugins/modal.js b/src/plugins/modal.js new file mode 100644 index 0000000000..9eed093fc8 --- /dev/null +++ b/src/plugins/modal.js @@ -0,0 +1,30 @@ +import ErrorHandler from '@/utils/logging/ErrorHandler'; + +const registry = new Map(); + +export function register(name, instance) { + registry.set(name, instance); +} + +export function unregister(name) { + registry.delete(name); +} + +export default { + install(app) { + app.config.globalProperties.$modal = { + show(name) { + const instance = registry.get(name); + if (!instance) { + ErrorHandler(`Modal '${name}' is not registered`); + return; + } + instance.open(); + }, + hide(name) { + const instance = registry.get(name); + if (instance) instance.close(); + }, + }; + }, +}; diff --git a/src/router.js b/src/router.js index 57d43783a3..7e6fa26342 100644 --- a/src/router.js +++ b/src/router.js @@ -1,23 +1,25 @@ /** * This is the router config, which defined the location for * each page within the app, and how they should be loaded - * Note that the page paths are defined in @/utils/defaults.js + * Note that the page paths are defined in @/utils/config/defaults.js */ -// Import Vue.js and vue router -import Vue from 'vue'; -import Router from 'vue-router'; +// Import vue router +import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'; import { Progress } from 'rsup-progress'; // Import views, that are not lazy-loaded import Home from '@/views/Home.vue'; // Import helper functions, config data and defaults -import { isAuthEnabled, isLoggedIn, isGuestAccessEnabled } from '@/utils/Auth'; -import { metaTagData, startingView as defaultStartingView, routePaths } from '@/utils/defaults'; -import ErrorHandler from '@/utils/ErrorHandler'; +import store from '@/store'; +import i18n from '@/utils/i18n'; +import Keys from '@/utils/StoreMutations'; +import { isAuthEnabled, isLoggedIn, isGuestAccessEnabled } from '@/utils/auth/Auth'; +import { startingView as defaultStartingView, routePaths } from '@/utils/config/defaults'; +import { VIEW_META } from '@/utils/config/ConfigHelpers'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; -Vue.use(Router); const progress = new Progress({ color: 'var(--progress-bar)' }); /* Returns true if user is already authenticated, or if auth is not enabled */ @@ -28,66 +30,58 @@ const isAuthenticated = () => { return (!authEnabled || userLoggedIn || guestEnabled); }; -// Get the default starting view from environmental variable -const startingView = process.env.VUE_APP_STARTING_VIEW || defaultStartingView; - -/** - * Returns the component that should be rendered at the base path, - * Defaults to Home, but the user can change this to Workspace of Minimal - */ -const getStartingComponent = () => { - switch (startingView) { - case 'minimal': return () => import('./views/Minimal.vue'); - case 'workspace': return () => import('./views/Workspace.vue'); - default: return Home; - } +/* Resolve landing view from appConfig.startingView at runtime if set */ +const resolveStartingView = () => { + const raw = store.state.config?.appConfig?.startingView || defaultStartingView; + const view = raw === 'default' ? 'home' : raw; + return VIEW_META[view] ? view : 'home'; }; -/* Returns the meta tags for each route */ -const makeMetaTags = (defaultTitle) => { - const userTitle = process.env.VUE_APP_TITLE || ''; - const title = userTitle ? `${userTitle} | ${defaultTitle}` : defaultTitle; - return { title, metaTags: metaTagData }; +/* Build the canonical //:page?/:section? routes for a given view + component. + * withSection=false for workspace (no single-section view yet). Page meta is + * owned by App.vue's watcher via PageMeta.js โ€” routes don't carry titles. */ +const makeViewRoutes = (basePath, viewName, component, withSection = true) => { + const routes = [ + { path: basePath, name: viewName, component }, + { path: `${basePath}/:page`, name: `${viewName}-page`, component }, + ]; + if (withSection) { + routes.push({ + path: `${basePath}/:page/:section`, + name: `${viewName}-section`, + component, + }); + } + return routes; }; /* Routing mode, can be either 'hash', 'history' or 'abstract' */ -const mode = process.env.VUE_APP_ROUTING_MODE || 'history'; +const mode = import.meta.env.VITE_APP_ROUTING_MODE || 'history'; + +/* Map mode string to Vue Router 4 history function */ +const history = mode === 'hash' + ? createWebHashHistory(import.meta.env.BASE_URL) + : createWebHistory(import.meta.env.BASE_URL); /* List of all routes, props, components and metadata */ -const router = new Router({ - mode, +const router = createRouter({ + history, routes: [ - // ...makeMultiPageRoutes(pages), - { // The default view can be customized by the user + { path: '/', - name: `landing-page-${startingView}`, - component: getStartingComponent(), - meta: makeMetaTags('Home Page'), - }, - { // Default home page - path: routePaths.home, - name: 'home', + name: 'landing', component: Home, - meta: makeMetaTags('Home Page'), - }, - { // View only single section - path: `${routePaths.home}/:section`, - name: 'home-section', - component: Home, - meta: makeMetaTags('Home Page'), - }, - { // Workspace view page - path: routePaths.workspace, - name: 'workspace', - component: () => import('./views/Workspace.vue'), - meta: makeMetaTags('Workspace'), - }, - { // Minimal view page - path: routePaths.minimal, - name: 'minimal', - component: () => import('./views/Minimal.vue'), - meta: makeMetaTags('Start Page'), + beforeEnter: (to, from, next) => { + const view = resolveStartingView(); + if (!view || view === 'home') next(); + // If user set `startingView`, we redirect to canonical / URL + else next(`/${view}`); + }, }, + // Canonical //:page?/:section? routes for each view + ...makeViewRoutes(routePaths.home, 'home', Home), + ...makeViewRoutes(routePaths.minimal, 'minimal', () => import('./views/Minimal.vue')), + ...makeViewRoutes(routePaths.workspace, 'workspace', () => import('./views/Workspace.vue'), false), { // The login page path: routePaths.login, name: 'login', @@ -98,54 +92,73 @@ const router = new Router({ next(); }, }, - { // The about app page - path: routePaths.about, - name: 'about', // We lazy load the About page so as to not slow down the app - component: () => import('./views/About.vue'), - meta: makeMetaTags('About Dashy'), - }, { // The export config page path: routePaths.download, name: 'download', component: () => import('./views/DownloadConfig.vue'), - meta: makeMetaTags('Download Config'), }, { // Page not found, any non-defined routes will land here path: routePaths.notFound, name: '404', component: () => import('./views/404.vue'), - meta: makeMetaTags('404 Not Found'), + meta: { theme: 'dashy-docs' }, beforeEnter: (to, from, next) => { if (to.redirectedFrom) { // Log error, if redirected here from another route - ErrorHandler(`Route not found: '${to.redirectedFrom}'`); + ErrorHandler(`Route not found: '${to.redirectedFrom.fullPath}'`); } next(); }, }, { // Redirect any not-found routed to the 404 view - path: '*', + path: '/:pathMatch(.*)*', redirect: '/404', }, ], }); /** - * Before loading a route, check if the user has authentication enabled - * if so, then ensure that they are correctly logged in as a valid user - * If not logged in, prevent all access and redirect them to login page - * */ + * On first page load, initialize and wait for the the config loading. + * Also guards against silently leaving an active edit session for a + * different config (unsaved edits would otherwise become untethered + * from whatever page the user switched to). + */ router.beforeEach(async (to, from, next) => { progress.start(); - if (to.name !== 'login' && !isAuthenticated()) next({ name: 'login' }); - else next(); + try { + if (!store.state.rootConfig && !store.state.criticalError) { + await store.dispatch(Keys.INITIALIZE_CONFIG); + } + // If in edit mode and navigating to a DIFFERENT page, confirm + cancel edit. + const pageChanged = from.params?.page !== to.params?.page; + if (store.state.editMode && pageChanged) { + + const ok = confirm(i18n.global.t('interactive-editor.menu.leave-while-editing-confirm')); + if (!ok) { + progress.end(); + next(false); + return; + } + // Discard edits for the page we're leaving and exit edit mode. + await store.dispatch(Keys.INITIALIZE_CONFIG, store.state.currentConfigInfo.confId); + store.commit(Keys.SET_EDIT_MODE, false); + } + if (to.name !== 'login' && !isAuthenticated()) next({ name: 'login' }); + else next(); + } catch (e) { + ErrorHandler('Navigation guard failed', e); + next(); + } +}); + +/* Stop the loading progress bar once navigation settles */ +router.afterEach(() => { + progress.end(); }); -/* If title is missing, then apply default page title */ -router.afterEach((to) => { +/* Catch navigation + lazy-import failures */ +router.onError((err) => { progress.end(); - Vue.nextTick(() => { - document.title = to.meta.title || 'Dashy'; - }); + ErrorHandler('Navigation failed. Try hard-reload (Shift + F5)', err); }); // All done - export the now configured router diff --git a/src/store.js b/src/store.js index eead0d868a..6dae3410bf 100644 --- a/src/store.js +++ b/src/store.js @@ -1,22 +1,27 @@ -/* eslint-disable no-param-reassign, prefer-destructuring */ -import Vue from 'vue'; -import Vuex from 'vuex'; -import yaml from 'js-yaml'; +import { createStore } from 'vuex'; +import { load as yamlLoad } from 'js-yaml'; import request from '@/utils/request'; import Keys from '@/utils/StoreMutations'; -import { makePageName, formatConfigPath, componentVisibility } from '@/utils/ConfigHelpers'; -import { applyItemId } from '@/utils/SectionHelpers'; +import { + makePageName, formatConfigPath, componentVisibility, configScope, stripRootOwnedFields, +} from '@/utils/config/ConfigHelpers'; +import { applyItemId } from '@/utils/config/SectionHelpers'; import filterUserSections from '@/utils/CheckSectionVisibility'; -import ErrorHandler, { InfoHandler, InfoKeys } from '@/utils/ErrorHandler'; -import { isUserAdmin, makeBasicAuthHeaders, isLoggedInAsGuest } from '@/utils/Auth'; -import { localStorageKeys, theme as defaultTheme } from './utils/defaults'; - -Vue.use(Vuex); +import ErrorHandler, { InfoHandler, InfoKeys } from '@/utils/logging/ErrorHandler'; +import { + isUserAdmin, + makeBasicAuthHeaders, + isLoggedInAsGuest, + getUserState, +} from '@/utils/auth/Auth'; +import { localStorageKeys, theme as defaultTheme } from '@/utils/config/defaults'; const { INITIALIZE_CONFIG, INITIALIZE_ROOT_CONFIG, SET_CONFIG, + SET_CONFIG_SOURCE, + APPLY_EDITED_CONFIG, SET_ROOT_CONFIG, SET_CURRENT_CONFIG_INFO, SET_IS_USING_LOCAL_CONFIG, @@ -25,7 +30,6 @@ const { SET_ITEM_LAYOUT, SET_ITEM_SIZE, SET_THEME, - SET_CUSTOM_COLORS, UPDATE_ITEM, USE_MAIN_CONFIG, SET_EDIT_MODE, @@ -39,9 +43,13 @@ const { COPY_ITEM, REMOVE_ITEM, INSERT_ITEM, + INSERT_WIDGET, + UPDATE_WIDGET, + REMOVE_WIDGET, UPDATE_CUSTOM_CSS, CONF_MENU_INDEX, CRITICAL_ERROR_MSG, + AUTH_CHANGED, } = Keys; const emptyConfig = { @@ -50,9 +58,112 @@ const emptyConfig = { sections: [], }; -const store = new Vuex.Store({ +/* Read + JSON-parse a raw localStorage slot, returning undefined on miss/fail. */ +const readLocal = (key) => { + const raw = localStorage.getItem(key); + if (!raw) return undefined; + try { return JSON.parse(raw); } catch (e) { + ErrorHandler(`Malformed local config for '${key}'`, e); + return undefined; + } +}; + +/* Write one top-level config field to both the merged runtime view (`config`) + * and the active page's source. Keeps the two from drifting. + * Item/widget `id`s are runtime-only โ€” applied to `config` for rendering, + * kept out of `configSource` so they never land in persisted YAML. */ +const commitConfigField = (state, field, value) => { + const runtime = field === 'sections' ? applyItemId(value) : value; + state.config = { ...state.config, [field]: runtime }; + state.configSource = { ...state.configSource, [field]: value }; +}; + +/* Patch a single appConfig key. Optionally persists to a localStorage slot + * (used by the quick-pickers; omitted for pure runtime-state updates). */ +const patchAppConfigField = (state, key, value, storageKey) => { + state.config = { ...state.config, appConfig: { ...state.config.appConfig, [key]: value } }; + state.configSource = { + ...state.configSource, + appConfig: { ...(state.configSource.appConfig || {}), [key]: value }, + }; + if (storageKey) localStorage.setItem(storageKey, value); +}; + + /* Read locally saved configs/overrides from localStorage */ +function readLocalOverrides(subConfigId) { + const scope = configScope(subConfigId); + const own = {}; + let hasStructural = false; + + const localAppConfig = readLocal(scope.APP_CONFIG); + const localPageInfo = readLocal(scope.PAGE_INFO); + const localSections = readLocal(scope.CONF_SECTIONS); + + const appConfig = {}; + if (localAppConfig && typeof localAppConfig === 'object') { + Object.assign(appConfig, localAppConfig); + hasStructural = true; + } + // Quick-picker slots layer on top for normal local stuff + const theme = localStorage.getItem(scope.THEME); + const layout = localStorage.getItem(scope.LAYOUT); + const iconSize = localStorage.getItem(scope.ICON_SIZE); + const language = localStorage.getItem(scope.LANGUAGE); + if (theme) appConfig.theme = theme; + if (layout) appConfig.layout = layout; + if (iconSize) appConfig.iconSize = iconSize; + if (language) appConfig.language = language; + if (Object.keys(appConfig).length) own.appConfig = appConfig; + + if (localPageInfo && typeof localPageInfo === 'object') { + own.pageInfo = localPageInfo; + hasStructural = true; + } + if (Array.isArray(localSections) && localSections.length) { + own.sections = localSections; + hasStructural = true; + } + if (!subConfigId) { + const localPages = readLocal(localStorageKeys.CONF_PAGES); + if (Array.isArray(localPages)) { + own.pages = localPages; + hasStructural = true; + } + } + return { own, hasStructural }; +} + +/* Root config with its own local overrides layered on */ +function buildRootEffective(state) { + const root = state.rootConfig || {}; + const { own } = readLocalOverrides(null); + return { + appConfig: { ...(root.appConfig || {}), ...(own.appConfig || {}) }, + pageInfo: { ...(root.pageInfo || {}), ...(own.pageInfo || {}) }, + sections: own.sections || root.sections || [], + pages: own.pages || root.pages || [], + }; +} + +/* Merges root config and sub-page config */ +function mergeWithRoot(root, own) { + const rootApp = root.appConfig || {}; + const ownApp = own.appConfig || {}; + const appConfig = { ...rootApp, ...ownApp }; + if (rootApp.auth !== undefined) appConfig.auth = rootApp.auth; + else delete appConfig.auth; + return { + appConfig, + pageInfo: { ...(root.pageInfo || {}), ...(own.pageInfo || {}) }, + sections: own.sections || [], + pages: root.pages || [], + }; +} + +const store = createStore({ state: { - config: {}, // The current config being used, and rendered to the UI + config: {}, // The current config being used, and rendered to the UI (merged runtime view) + configSource: {}, // The current config as it appears in the file (before root merges) rootConfig: null, // Always the content of main config file, never used directly editMode: false, // While true, the user can drag and edit items + sections modalOpen: false, // KB shortcut functionality will be disabled when modal is open @@ -60,11 +171,18 @@ const store = new Vuex.Store({ isUsingLocalConfig: false, // If true, will use local config instead of fetched criticalError: null, // Will store a message, if a critical error occurs navigateConfToTab: undefined, // Used to switch active tab in config modal + authRevision: 0, // Bumped on login/logout so auth-dependent getters re-run }, getters: { config(state) { return state.config; }, + configSource(state) { + return state.configSource; + }, + isSubConfig(state) { + return !!state.currentConfigInfo.confId; + }, pageInfo(state) { if (!state.config) return {}; return state.config.pageInfo || {}; @@ -74,17 +192,23 @@ const store = new Vuex.Store({ return state.config.appConfig || {}; }, sections(state) { + void state.authRevision; // Re-filter sections when auth state changes return filterUserSections(state.config.sections || []); }, pages(state) { return state.config.pages || []; }, theme(state) { - const localStorageKey = state.currentConfigInfo.confId - ? `${localStorageKeys.THEME}-${state.currentConfigInfo.confId}` : localStorageKeys.THEME; - const localTheme = localStorage[localStorageKey]; - // Return either theme from local storage, or from appConfig - return localTheme || state.config.appConfig.theme || defaultTheme; + // Read reactive deps upfront so Vuex tracks every branch (avoids the + // short-circuit caching bug where unread props wouldn't invalidate). + const cfg = state.config?.appConfig; + const configTheme = cfg?.theme; + const dayTheme = cfg?.dayTheme; + const nightTheme = cfg?.nightTheme; + const prefersDark = window.matchMedia?.('(prefers-color-scheme: dark)').matches; + const fromState = (prefersDark ? nightTheme : dayTheme) || configTheme || defaultTheme; + if (state.editMode) return fromState; + return localStorage.getItem(configScope(state.currentConfigInfo.confId).THEME) || fromState; }, webSearch(state, getters) { return getters.appConfig.webSearch || {}; @@ -94,6 +218,7 @@ const store = new Vuex.Store({ }, /* Make config read/ write permissions object */ permissions(state, getters) { + void state.authRevision; // Re-evaluate when auth state changes const appConfig = getters.appConfig; const perms = { allowWriteToDisk: true, @@ -108,10 +233,6 @@ const store = new Vuex.Store({ if (appConfig.preventWriteToDisk || !isUserAdmin()) { perms.allowWriteToDisk = false; } - // Legacy Option: Will be removed in V 2.1.0 - if (appConfig.allowConfigEdit === false) { - perms.allowWriteToDisk = false; - } // Disable everything if (appConfig.disableConfiguration || (appConfig.disableConfigurationForNonAdmin && !isUserAdmin()) @@ -122,11 +243,16 @@ const store = new Vuex.Store({ } return perms; }, - // eslint-disable-next-line arrow-body-style + userState(state) { + void state.authRevision; // Re-evaluate when auth state changes + return getUserState(); + }, + getSectionByIndex: (state, getters) => (index) => { return getters.sections[index]; }, getItemById: (state, getters) => (id) => { + if (!id) return undefined; let item; getters.sections.forEach(sec => { if (sec.items) { @@ -146,30 +272,34 @@ const store = new Vuex.Store({ return foundSection; }, layout(state) { - const pageId = state.currentConfigInfo.confId; - const layoutStoreKey = pageId - ? `${localStorageKeys.LAYOUT_ORIENTATION}-${pageId}` : localStorageKeys.LAYOUT_ORIENTATION; - const appConfigLayout = state.config.appConfig.layout; - return localStorage.getItem(layoutStoreKey) || appConfigLayout || 'auto'; + const scope = configScope(state.currentConfigInfo.confId); + const fromState = state.configSource?.appConfig?.layout || 'auto'; + if (state.editMode) return fromState; + return localStorage.getItem(scope.LAYOUT) || fromState; }, iconSize(state) { - const pageId = state.currentConfigInfo.confId; - const sizeStoreKey = pageId - ? `${localStorageKeys.ICON_SIZE}-${pageId}` : localStorageKeys.ICON_SIZE; - const appConfigSize = state.config.appConfig.iconSize; - return localStorage.getItem(sizeStoreKey) || appConfigSize || 'medium'; + const scope = configScope(state.currentConfigInfo.confId); + const fromState = state.configSource?.appConfig?.iconSize || 'medium'; + if (state.editMode) return fromState; + return localStorage.getItem(scope.ICON_SIZE) || fromState; }, }, mutations: { - /* Set the master config */ + /* Cache the raw root config so sub-page navigations don't re-fetch the main YAML */ [SET_ROOT_CONFIG](state, config) { if (!config.appConfig) config.appConfig = {}; - state.config = config; + state.rootConfig = config; }, /* The config to display and edit. Will differ from ROOT_CONFIG when using multi-page */ [SET_CONFIG](state, config) { - if (!config.appConfig) config.appConfig = {}; - state.config = config; + const next = { ...(config || {}) }; + if (!next.appConfig) next.appConfig = {}; + if (next.sections) next.sections = applyItemId(next.sections); + state.config = next; + }, + /* The active page's own/intent config (partial for sub-pages). Editor reads this. */ + [SET_CONFIG_SOURCE](state, source) { + state.configSource = source || {}; }, [SET_CURRENT_CONFIG_INFO](state, subConfigInfo) { state.currentConfigInfo = subConfigInfo; @@ -178,9 +308,8 @@ const store = new Vuex.Store({ state.isUsingLocalConfig = isUsingLocalConfig; }, [SET_LANGUAGE](state, lang) { - const newConfig = state.config; - newConfig.appConfig.language = lang; - state.config = newConfig; + patchAppConfigField(state, 'language', lang, configScope(state.currentConfigInfo.confId).LANGUAGE); + InfoHandler('Language updated', InfoKeys.VISUAL); }, [SET_MODAL_OPEN](state, modalOpen) { state.modalOpen = modalOpen; @@ -195,156 +324,131 @@ const store = new Vuex.Store({ if (message) ErrorHandler(message); state.criticalError = message; }, - [UPDATE_ITEM](state, payload) { - const { itemId, newItem } = payload; - const newConfig = { ...state.config }; - newConfig.sections.forEach((section, secIndex) => { - (section.items || []).forEach((item, itemIndex) => { - if (item.id === itemId) { - newConfig.sections[secIndex].items[itemIndex] = newItem; - InfoHandler('Item updated', InfoKeys.EDITOR); - } - }); - }); - state.config = newConfig; - }, - [SET_PAGE_INFO](state, newPageInfo) { - const newConfig = state.config; - newConfig.pageInfo = newPageInfo; - state.config = newConfig; + [SET_PAGE_INFO](state, pageInfo) { + commitConfigField(state, 'pageInfo', pageInfo || {}); InfoHandler('Page info updated', InfoKeys.EDITOR); }, - [SET_APP_CONFIG](state, newAppConfig) { - const newConfig = state.config; - newConfig.appConfig = newAppConfig; - state.config = newConfig; + [SET_APP_CONFIG](state, appConfig) { + commitConfigField(state, 'appConfig', appConfig || {}); InfoHandler('App config updated', InfoKeys.EDITOR); }, [SET_PAGES](state, multiPages) { - const newConfig = state.config; - newConfig.pages = multiPages; - state.config = newConfig; + // `pages` is always root-owned, regardless of the active page. + const pages = Array.isArray(multiPages) ? multiPages : []; + if (state.rootConfig) state.rootConfig = { ...state.rootConfig, pages }; + else ErrorHandler('SET_PAGES called before root config loaded; change may be lost'); + state.config = { ...state.config, pages }; + if (!state.currentConfigInfo.confId) { + state.configSource = { ...state.configSource, pages }; + } InfoHandler('Pages updated', InfoKeys.EDITOR); }, - [SET_SECTIONS](state, newSections) { - const newConfig = state.config; - newConfig.sections = newSections; - state.config = newConfig; + [SET_SECTIONS](state, sections) { + commitConfigField(state, 'sections', sections || []); InfoHandler('Sections updated', InfoKeys.EDITOR); }, - [UPDATE_SECTION](state, payload) { - const { sectionIndex, sectionData } = payload; - const newConfig = { ...state.config }; - newConfig.sections[sectionIndex] = sectionData; - state.config = newConfig; + [UPDATE_ITEM](state, { itemId, newItem }) { + commitConfigField(state, 'sections', state.config.sections.map((section) => ({ + ...section, + items: (section.items || []).map((item) => (item.id === itemId ? newItem : item)), + }))); + InfoHandler('Item updated', InfoKeys.EDITOR); + }, + [UPDATE_SECTION](state, { sectionIndex, sectionData }) { + commitConfigField(state, 'sections', state.config.sections.map((s, i) => ( + i === sectionIndex ? sectionData : s + ))); InfoHandler('Section updated', InfoKeys.EDITOR); }, [INSERT_SECTION](state, newSection) { - const newConfig = { ...state.config }; - newSection.items = []; - newConfig.sections.push(newSection); - state.config = newConfig; + commitConfigField(state, 'sections', [ + ...state.config.sections, + { ...newSection, items: [] }, + ]); InfoHandler('New section added', InfoKeys.EDITOR); }, - [REMOVE_SECTION](state, payload) { - const { sectionIndex, sectionName } = payload; - const newConfig = { ...state.config }; - if (newConfig.sections[sectionIndex].name === sectionName) { - newConfig.sections.splice(sectionIndex, 1); - InfoHandler('Section removed', InfoKeys.EDITOR); - } - state.config = newConfig; - }, - [INSERT_ITEM](state, payload) { - const { newItem, targetSection } = payload; - const config = { ...state.config }; - config.sections.forEach((section) => { - if (section.name === targetSection) { - if (!section.items) section.items = []; - section.items.push(newItem); - InfoHandler('New item added', InfoKeys.EDITOR); - } + [REMOVE_SECTION](state, { sectionIndex, sectionName }) { + const current = state.config.sections; + if (current[sectionIndex]?.name !== sectionName) return; + commitConfigField(state, 'sections', current.filter((_, i) => i !== sectionIndex)); + InfoHandler('Section removed', InfoKeys.EDITOR); + }, + [INSERT_ITEM](state, { newItem, targetSection }) { + const patched = state.config.sections.map((section) => { + if (section.name !== targetSection) return section; + return { ...section, items: [...(section.items || []), newItem] }; }); - config.sections = applyItemId(config.sections); - state.config = config; + commitConfigField(state, 'sections', patched); + InfoHandler('New item added', InfoKeys.EDITOR); }, - [COPY_ITEM](state, payload) { - const { item, toSection, appendTo } = payload; - const config = { ...state.config }; + [COPY_ITEM](state, { item, toSection, appendTo }) { const newItem = { ...item }; - config.sections.forEach((section) => { - if (section.name === toSection) { - if (!section.items) section.items = []; - if (appendTo === 'beginning') { - section.items.unshift(newItem); - } else { - section.items.push(newItem); - } - InfoHandler('Item copied', InfoKeys.EDITOR); - } + const patched = state.config.sections.map((section) => { + if (section.name !== toSection) return section; + const items = appendTo === 'beginning' + ? [newItem, ...(section.items || [])] + : [...(section.items || []), newItem]; + return { ...section, items }; }); - config.sections = applyItemId(config.sections); - state.config = config; - }, - [REMOVE_ITEM](state, payload) { - const { itemId, sectionName } = payload; - const config = { ...state.config }; - config.sections.forEach((section) => { - if (section.name === sectionName && section.items) { - section.items.forEach((item, index) => { - if (item.id === itemId) { - section.items.splice(index, 1); - InfoHandler('Item removed', InfoKeys.EDITOR); - } - }); - } + commitConfigField(state, 'sections', patched); + InfoHandler('Item copied', InfoKeys.EDITOR); + }, + [REMOVE_ITEM](state, { itemId, sectionName }) { + const patched = state.config.sections.map((section) => { + if (section.name !== sectionName) return section; + return { + ...section, + items: (section.items || []).filter((item) => item.id !== itemId), + }; }); - config.sections = applyItemId(config.sections); - state.config = config; + commitConfigField(state, 'sections', patched); + InfoHandler('Item removed', InfoKeys.EDITOR); + }, + [INSERT_WIDGET](state, { sectionIndex, widget }) { + commitConfigField(state, 'sections', state.config.sections.map((s, i) => ( + i === sectionIndex ? { ...s, widgets: [...(s.widgets || []), widget] } : s + ))); + InfoHandler('New widget added', InfoKeys.EDITOR); + }, + [UPDATE_WIDGET](state, { sectionIndex, widgetIndex, widget }) { + commitConfigField(state, 'sections', state.config.sections.map((s, i) => { + if (i !== sectionIndex) return s; + return { + ...s, + widgets: (s.widgets || []).map((w, wi) => (wi === widgetIndex ? widget : w)), + }; + })); + InfoHandler('Widget updated', InfoKeys.EDITOR); + }, + [REMOVE_WIDGET](state, { sectionIndex, widgetIndex }) { + commitConfigField(state, 'sections', state.config.sections.map((s, i) => { + if (i !== sectionIndex) return s; + return { ...s, widgets: (s.widgets || []).filter((_, wi) => wi !== widgetIndex) }; + })); + InfoHandler('Widget removed', InfoKeys.EDITOR); }, [SET_THEME](state, theme) { - const newConfig = { ...state.config }; - newConfig.appConfig.theme = theme; - state.config = newConfig; - const pageId = state.currentConfigInfo.confId; - const themeStoreKey = pageId - ? `${localStorageKeys.THEME}-${pageId}` : localStorageKeys.THEME; - localStorage.setItem(themeStoreKey, theme); + patchAppConfigField(state, 'theme', theme, configScope(state.currentConfigInfo.confId).THEME); InfoHandler('Theme updated', InfoKeys.VISUAL); }, - [SET_CUSTOM_COLORS](state, customColors) { - const newConfig = { ...state.config }; - newConfig.appConfig.customColors = customColors; - state.config = newConfig; - InfoHandler('Color palette updated', InfoKeys.VISUAL); - }, [SET_ITEM_LAYOUT](state, layout) { - const newConfig = { ...state.config }; - newConfig.appConfig.layout = layout; - state.config = newConfig; - const pageId = state.currentConfigInfo.confId; - const layoutStoreKey = pageId - ? `${localStorageKeys.LAYOUT_ORIENTATION}-${pageId}` : localStorageKeys.LAYOUT_ORIENTATION; - localStorage.setItem(layoutStoreKey, layout); + patchAppConfigField(state, 'layout', layout, configScope(state.currentConfigInfo.confId).LAYOUT); InfoHandler('Layout updated', InfoKeys.VISUAL); }, [SET_ITEM_SIZE](state, iconSize) { - const newConfig = { ...state.config }; - newConfig.appConfig.iconSize = iconSize; - state.config = newConfig; - const pageId = state.currentConfigInfo.confId; - const sizeStoreKey = pageId - ? `${localStorageKeys.ICON_SIZE}-${pageId}` : localStorageKeys.ICON_SIZE; - localStorage.setItem(sizeStoreKey, iconSize); + patchAppConfigField(state, 'iconSize', iconSize, configScope(state.currentConfigInfo.confId).ICON_SIZE); InfoHandler('Item size updated', InfoKeys.VISUAL); }, [UPDATE_CUSTOM_CSS](state, customCss) { - state.config.appConfig.customCss = customCss; - InfoHandler('Custom colors updated', InfoKeys.VISUAL); + patchAppConfigField(state, 'customCss', customCss); + InfoHandler('Custom CSS updated', InfoKeys.VISUAL); }, [CONF_MENU_INDEX](state, index) { state.navigateConfToTab = index; }, + [AUTH_CHANGED](state) { + state.authRevision += 1; + }, /* Set config to rootConfig, by calling initialize with no params */ async [USE_MAIN_CONFIG]() { this.dispatch(Keys.INITIALIZE_CONFIG); @@ -353,13 +457,13 @@ const store = new Vuex.Store({ actions: { /* Fetches the root config file, only ever called by INITIALIZE_CONFIG */ async [INITIALIZE_ROOT_CONFIG]({ commit }) { - const configFilePath = process.env.VUE_APP_CONFIG_PATH || '/conf.yml'; + const configFilePath = import.meta.env.VITE_APP_CONFIG_PATH || '/conf.yml'; try { // Attempt to fetch the YAML file const response = await request.get(configFilePath, makeBasicAuthHeaders()); let data; try { - data = yaml.load(response.data); + data = yamlLoad(response.data); } catch (parseError) { commit(CRITICAL_ERROR_MSG, `Failed to parse YAML: ${parseError.message}`); return { ...emptyConfig }; @@ -388,74 +492,81 @@ const store = new Vuex.Store({ } }, /** - * Fetches config and updates state - * If not on sub-page, will trigger the fetch of main config, then use that - * If using sub-page config, then fetch that sub-config, then - * override certain fields (appConfig, pages) and update config + * Loads the active config. Pass a sub-page id to load that sub-page */ async [INITIALIZE_CONFIG]({ commit, state }, subConfigId) { - const rootConfig = state.rootConfig || await this.dispatch(Keys.INITIALIZE_ROOT_CONFIG); - - commit(SET_IS_USING_LOCAL_CONFIG, false); - if (!subConfigId) { // Use root config as config - commit(SET_CONFIG, rootConfig); - commit(SET_CURRENT_CONFIG_INFO, {}); + try { + const targetId = subConfigId || null; + if (!state.rootConfig) await this.dispatch(Keys.INITIALIZE_ROOT_CONFIG); + const { hasStructural: rootHasStructural } = readLocalOverrides(null); + const rootEffective = buildRootEffective(state); - let localSections = []; - const localSectionsRaw = localStorage[localStorageKeys.CONF_SECTIONS]; - if (localSectionsRaw) { - try { - const json = JSON.parse(localSectionsRaw); - if (json.length >= 1) localSections = json; - } catch (e) { - commit(CRITICAL_ERROR_MSG, 'Malformed section data in local storage'); - } - } - if (localSections.length > 0) { - rootConfig.sections = localSections; - commit(SET_IS_USING_LOCAL_CONFIG, true); + if (!targetId) { + commit(SET_CONFIG, rootEffective); + commit(SET_CONFIG_SOURCE, rootEffective); + commit(SET_CURRENT_CONFIG_INFO, {}); + commit(SET_IS_USING_LOCAL_CONFIG, rootHasStructural); + return rootEffective; } - return rootConfig; - } else { - // Find and format path to fetch sub-config from - const subConfigPath = formatConfigPath(rootConfig?.pages?.find( - (page) => makePageName(page.name) === subConfigId, - )?.path); + const subConfigPath = formatConfigPath(rootEffective.pages.find( + (page) => page?.name && makePageName(page.name) === targetId, + )?.path); if (!subConfigPath) { - commit(CRITICAL_ERROR_MSG, `Unable to find config for '${subConfigId}'`); + commit(CRITICAL_ERROR_MSG, `Unable to find config for '${targetId}'`); return { ...emptyConfig }; } - request.get(subConfigPath, makeBasicAuthHeaders()).then((response) => { - // Parse the YAML - const configContent = yaml.load(response.data) || {}; - // Certain values must be inherited from root config - const theme = configContent?.appConfig?.theme || rootConfig.appConfig?.theme || 'default'; - configContent.appConfig = rootConfig.appConfig; - configContent.pages = rootConfig.pages; - configContent.appConfig.theme = theme; - - // Load local sections if they exist - const localSectionsRaw = localStorage[`${localStorageKeys.CONF_SECTIONS}-${subConfigId}`]; - if (localSectionsRaw) { - try { - const json = JSON.parse(localSectionsRaw); - if (json.length >= 1) { - configContent.sections = json; - commit(SET_IS_USING_LOCAL_CONFIG, true); - } - } catch (e) { - commit(CRITICAL_ERROR_MSG, 'Malformed section data in local storage for sub-config'); - } - } - // Set the config - commit(SET_CONFIG, configContent); - commit(SET_CURRENT_CONFIG_INFO, { confPath: subConfigPath, confId: subConfigId }); - }).catch((err) => { - commit(CRITICAL_ERROR_MSG, `Unable to load config from '${subConfigPath}'`, err); + const isRemote = /^https?:\/\//i.test(subConfigPath); + let response; + try { + response = await request.get(subConfigPath, isRemote ? {} : makeBasicAuthHeaders()); + } catch (fetchErr) { + commit(CRITICAL_ERROR_MSG, `Unable to load config from '${subConfigPath}'`); + ErrorHandler(`Sub-config load failed: ${subConfigPath}`, fetchErr); + return { ...emptyConfig }; + } + let subFile; + try { + subFile = yamlLoad(response.data) || {}; + } catch (parseError) { + commit(CRITICAL_ERROR_MSG, `Failed to parse sub-config YAML: ${parseError.message}`); + return { ...emptyConfig }; + } + // Sub-page's own intent: file merged with per-page localStorage, minus root-owned fields. + const { own: subOwnLocal, hasStructural: subHasStructural } = readLocalOverrides(targetId); + const subOwn = stripRootOwnedFields({ + appConfig: { ...(subFile.appConfig || {}), ...(subOwnLocal.appConfig || {}) }, + pageInfo: { ...(subFile.pageInfo || {}), ...(subOwnLocal.pageInfo || {}) }, + sections: subOwnLocal.sections || subFile.sections || [], }); + + commit(SET_CONFIG, mergeWithRoot(rootEffective, subOwn)); + commit(SET_CONFIG_SOURCE, subOwn); + commit(SET_CURRENT_CONFIG_INFO, { confPath: subConfigPath, confId: targetId }); + commit(SET_IS_USING_LOCAL_CONFIG, subHasStructural); + return state.config; + } catch (err) { // If we get here, then somethings really fucked up + commit(CRITICAL_ERROR_MSG, `Unexpected error loading config: ${err.message}`); + ErrorHandler('INITIALIZE_CONFIG failed', err); + return { ...emptyConfig }; + } + }, + + /* Apply edited config content (from the YAML editor or the field modals) to the store. */ + [APPLY_EDITED_CONFIG]({ commit, state }, source) { + const data = source || {}; + if (!state.currentConfigInfo.confId) { + commit(SET_CONFIG, data); + commit(SET_CONFIG_SOURCE, data); + return; } - return { ...emptyConfig }; + const own = stripRootOwnedFields({ + appConfig: data.appConfig || {}, + pageInfo: data.pageInfo || {}, + sections: data.sections || [], + }); + commit(SET_CONFIG, mergeWithRoot(buildRootEffective(state), own)); + commit(SET_CONFIG_SOURCE, own); }, }, modules: {}, diff --git a/src/styles/color-palette.scss b/src/styles/color-palette.scss index d7c3878780..297dc5151c 100644 --- a/src/styles/color-palette.scss +++ b/src/styles/color-palette.scss @@ -5,6 +5,9 @@ --primary: #5cabca; // Main accent color --background: #0b1021; // Page background --background-darker: #05070e; // Used for navigation bar, footer and fills + --foreground: var(--primary); // Default text color + + --primary-transparent-60: color-mix(in srgb, var(--primary), transparent 60%); /* Action Colors */ --info: #04e4f4; @@ -36,9 +39,9 @@ /* Color variables for specific components * all variables are optional, since they inherit initial values from above* * Using specific variables makes overriding for custom themes really easy */ - --heading-text-color: var(--primary); - // Nav-bar links - --nav-link-text-color: var(--primary); + --heading-text-color: var(--foreground); + // Nav-bar links + --nav-link-text-color: var(--foreground); --nav-link-background-color: #607d8b33; --nav-link-text-color-hover: var(--primary); --nav-link-background-color-hover: #607d8b33; @@ -47,7 +50,7 @@ --nav-link-shadow: 1px 1px 2px #232323; --nav-link-shadow-hover: 1px 1px 2px #232323; // Link items and sections - --item-text-color: var(--primary); + --item-text-color: var(--foreground); --item-text-color-hover: var(--item-text-color); --item-group-outer-background: var(--primary); --item-group-heading-text-color: var(--item-group-background); @@ -56,19 +59,19 @@ --settings-text-color: var(--primary); --settings-background: var(--background); // Config menu - --config-settings-color: var(--primary); + --config-settings-color: var(--foreground); --config-settings-background: var(--background-darker); - --config-code-color: var(--background); + --config-code-color: var(--black); --config-code-background: var(--white); --code-editor-color: var(--black); --code-editor-background: var(--white); // Widgets - --widget-text-color: var(--primary); + --widget-text-color: var(--foreground); --widget-background-color: var(--background-darker); --widget-accent-color: var(--background); --widget-base-background: transparent; // Interactive editor - --interactive-editor-color: var(--primary); + --interactive-editor-color: var(--foreground); --interactive-editor-background: var(--background); --interactive-editor-background-darker: var(--background-darker); // Cloud backup/ restore menu @@ -96,19 +99,19 @@ // Minimal view --minimal-view-background-color: var(--background); --minimal-view-title-color: var(--primary); - --minimal-view-settings-color: var(--primary); - --minimal-view-section-heading-color: var(--primary); + --minimal-view-settings-color: var(--foreground); + --minimal-view-section-heading-color: var(--foreground); --minimal-view-section-heading-background: var(--background-darker); --minimal-view-search-background: var(--background-darker); - --minimal-view-search-color: var(--primary); - --minimal-view-group-color: var(--primary); + --minimal-view-search-color: var(--foreground); + --minimal-view-group-color: var(--foreground); --minimal-view-group-background: var(--background-darker); // Login page --login-form-color: var(--primary); --login-form-background: var(--background); --login-form-background-secondary: var(--background-darker); // About page - --about-page-color: var(--white); + --about-page-color: var(--foreground); --about-page-background: var(--background); --about-page-accent: var(--primary); // Webpage colors, highlight, scrollbar diff --git a/src/styles/color-themes.scss b/src/styles/color-themes.scss index ac8676f4f8..74d67d2257 100644 --- a/src/styles/color-themes.scss +++ b/src/styles/color-themes.scss @@ -1,2213 +1,50 @@ - -html[data-theme='callisto'] { - --primary: #00CCB4; - --background: #141b33; - --background-darker: #060913; - --item-group-background: #0b1021; - --item-background: var(--background); - --item-background-hover: var(--background-darker); - --item-hover-shadow: 0 1px 3px #00ccb4b3, 0 1px 2px #00ccb4bf; - --font-body: 'Inconsolata', 'Georgia', sans-serif; - --font-headings: 'PTMono', 'Courier New', monospace; -} - -html[data-theme='thebe'] { - --background: #141b33; - --background-darker: #060913; - --item-group-background: #0b1021; - --item-background: #141b33; - --item-background-hover: var(--background-darker); - --item-hover-shadow: 0 1px 3px #9660ecb3, 0 1px 2px #9660ecbf; - --primary: #b187f5; - --item-group-outer-background: #9660EC - linear-gradient(45deg, #9660ec 2%,#5f60ea 51%,#9660ec 100%); - --font-headings: 'PTMono', 'Courier New', monospace; -} - -html[data-theme='dracula'] { - --font-headings: 'Shrikhand', sans-serif; - --primary: #98ace9; - --background: #44475a; - --background-darker: #282a36; - --item-group-background: var(--background-darker); - --item-background: var(--background-darker); - --item-background-hover: #191b22; - --item-shadow: 1px 1px 3px #000000e6; - --item-hover-shadow: none; - --settings-text-color: var(--primary); - --config-settings-color: var(--primary); - --nav-link-background-color: var(--background); - --nav-link-border-color: none; - --nav-link-border-color-hover: none; - --item-group-outer-background: var(--background-darker); - --login-form-background: var(--background-darker); - .item { border: 1px solid var(--primary); } - h1, h2, h3 { font-weight: normal; } - - .collapsable, .nav a.nav-item { - &:nth-child(1n) { --index-color: #8be9fd; } - &:nth-child(2n) { --index-color: #50fa7b; } - &:nth-child(3n) { --index-color: #ffb86c; } - &:nth-child(4n) { --index-color: #ff79c6; } - &:nth-child(5n) { --index-color: #bd93f9; } - - --item-group-heading-text-color: var(--index-color); - --item-group-heading-text-color-hover: var(--index-color); - --item-group-shadow: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; - --item-hover-shadow: 0 0 2px var(--index-color); - --item-text-color-hover: var(--index-color); - --nav-link-text-color-hover: var(--index-color); - --nav-link-shadow-hover: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; - - .item:hover { border-color: var(--index-color); } - } -} - -html[data-theme='crayola'] { - --primary: #7fd8e7; - --background: #191d2e; - --background-darker: #070912; - --font-headings: 'Sniglet', cursive; - --curve-factor: 8px; - --nav-link-border-color-hover: transparent; - .collapsable, .nav a.nav-item { - &:nth-child(1n) { --index-color: #9b5de5; } - &:nth-child(2n) { --index-color: #f15bb5; } - &:nth-child(3n) { --index-color: #fee440; } - &:nth-child(4n) { --index-color: #00bbf9; } - &:nth-child(5n) { --index-color: #00f5d4; } - --item-group-outer-background: var(--index-color); - --item-text-color: var(--index-color); - --widget-text-color: var(--index-color); - --primary: var(--index-color); - --item-group-shadow: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; - --item-hover-shadow: 0 0 2px var(--index-color); - --item-text-color-hover: var(--index-color); - --nav-link-text-color-hover: var(--index-color); - --nav-link-shadow-hover: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; - .item:hover { background: var(--index-color); color: var(--background); } - } -} - -html[data-theme='bee'] { - --primary: #c3eb5c; - --background: #0b1021; - --item-background: #1c2636; - --item-group-background: var(--background); - --nav-link-background-color: var(--background); - --font-headings: 'Sniglet', cursive; -} - -html[data-theme='raspberry-jam'] { - --primary: #eb2d6c; - --background: #0b1021; - --item-background: #1c2636; - --item-group-background: var(--background); - --nav-link-background-color: var(--background); - --config-code-background: #1c1e24; - --config-code-color: var(--primary); - --font-headings: 'Sniglet', cursive; -} - -html[data-theme='tiger'] { - --primary: #f58233; - --background: #0b1021; - --item-background: #1c2636; - --item-group-background: var(--background); - --nav-link-background-color: var(--background); - --font-headings: 'Sniglet', cursive; -} - -html[data-theme='matrix-red'] { - --background: var(--black); - --background-darker: var(--black); - --primary: #f00; - --outline-color: var(--primary); - --curve-factor: 0; - --font-body: 'Cutive Mono', monospace; - --font-headings: 'VT323', monospace; -} - -html[data-theme='matrix'] { - --background: var(--black); - --background-darker: var(--black); - --primary: #2bca2b; - --outline-color: var(--primary); - --curve-factor: 0px; - --font-body: 'Cutive Mono', monospace; - --font-headings: 'VT323', monospace; - --about-page-background: var(--background); - --context-menu-secondary-color: var(--primary); - .prism-editor-wrapper.my-editor { - border: 1px solid var(--primary); - } - div.context-menu ul li:hover { - color: var(--background); - } -} - -html[data-theme='blue-purple'] { - --primary: #54dbf8; - --background: #e5e8f5; - --background-darker: #5346f3; - --font-headings: 'Sniglet', cursive; - - --dimming-factor: 0.8; - --curve-factor: 6px; - - --settings-text-color: var(--background-darker); - --item-text-color: var(--background-darker); - --item-background: var(--white); - --item-background-hover: var(--primary); - - --item-group-heading-text-color: var(--background-darker); - --item-group-background: var(--background); - --footer-text-color: var(--white); - --context-menu-background: var(--white); - --context-menu-color: var(--background-darker); - --context-menu-secondary-color: var(--primary); - - .item { - box-shadow: none; - border: 1px solid var(--background-darker); - } - section.filter-container form label { - color: var(--primary); - } - footer { - color: var(--white); - } -} - -html[data-theme='hacker-girl'] { - --background: var(--black); - --background-darker: var(--black); - --primary: #e435f1; - --outline-color: var(--primary); - --curve-factor: 0px; - --font-body: 'Cutive Mono', monospace; - --font-headings: 'VT323', monospace; -} - -html[data-theme='high-contrast-light'] { - --primary: var(--black); - --background: var(--white); - --background-darker: var(--white); - --item-group-background: var(--background-darker); - --item-background: var(--background); - --outline-color: var(--primary); - --curve-factor: 0px; - --config-code-color: var(--primary); - --font-headings: 'PTMono', 'Courier New', monospace; -} - -html[data-theme='high-contrast-dark'] { - --primary: var(--white); - --background: var(--black); - --background-darker: var(--black); - --item-group-background: var(--background-darker); - --item-background: var(--background); - --outline-color: var(--primary); - --curve-factor: 0px; - --font-headings: 'PTMono', 'Courier New', monospace; -} - -html[data-theme='nord'] { - --primary: #D8DEE9; - --background: #3B4252; - --background-darker: #2E3440; - --item-background: #434C5E; - --item-background-hover: #4C566A; - .collapsable:nth-child(1n) { background: #BF616A; } - .collapsable:nth-child(2n) { background: #D08770; } - .collapsable:nth-child(3n) { background: #EBCB8B; } - .collapsable:nth-child(4n) { background: #A3BE8C; } -} - -html[data-theme='basic'], -html[data-theme='whimsy'], -html[data-theme='argon'], -html[data-theme='deep-ocean'], -html[data-theme='fallout'] { - --primary: #aabbc3; - --secondary: #aabbc3; - --item-background: none; - --outline-color: none; - --item-shadow: none; - --item-hover-shadow: 2px 3px 5px var(--background-darker); - --item-text-color-hover: var(--secondary); - --item-group-background: none; - --item-group-outer-background: none; - --item-group-heading-text-color: var(--primary); - --item-group-heading-text-color-hover: var(--secondary); - --nav-link-shadow: none; - --nav-link-border-color: transparent; - --nav-link-background-color: none; - --nav-link-shadow-hover: none; - --nav-link-border-color-hover: var(--secondary); - --nav-link-background-color-hover: none; - --font-body: 'Roboto', serif; - --curve-factor-navbar: 10px; - - /* Use secondary color for item description */ - .tile-title p.description { - color: var(--secondary); - } - /* Add line to bottom of settings row */ - section.settings-outer { - .options-container { - border-top: var(--accent-line-width, 1px) solid var(--secondary); - } - form.normal { - border-bottom: var(--accent-line-width, 1px) solid var(--secondary); - border-right: var(--accent-line-width, 1px) solid var(--secondary); - margin-top: 0.5rem; - } - } - /* Display line between sections (depending on orientation) */ - .orientation-horizontal .collapsable { - border-radius: 1px; - &:not(:last-child) { border-bottom: var(--accent-line-width, 1px) solid var(--secondary); } - } - .orientation-vertical .collapsable { - border-radius: 1px; - &:not(:last-child) { border-right: var(--accent-line-width, 1px) solid var(--secondary); } - } - .orientation-auto .collapsable .collapsible-content { - border-top: var(--accent-line-width, 1px) solid var(--secondary); - } -} - -html[data-theme='fallout'] { - --primary: #aabbc3; - --background: #263238; - --background-darker: #1f282c; - --secondary: #ade900cc; -} - -html[data-theme='whimsy'] { - --primary: #aabbc3; - --background: #232138; - --background-darker: #161529; - --secondary: #ed597c; - --item-background-hover: #49476d; - --accent-line-width: 2px; - --curve-factor: 4px; -} - -html[data-theme='deep-ocean'] { - --primary: #aabbc3; - --background: #151e2d; - --background-darker: #151c29; - --secondary: #4afcffb3; - --item-background-hover: #4afcff40; - --accent-line-width: 1px; - --curve-factor: 4px; - .home, .options-container { - background-color: #151e2d; - background-image: url("data:image/svg+xml,%3Csvg width='100' height='20' viewBox='0 0 100 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.184 20c.357-.13.72-.264 1.088-.402l1.768-.661C33.64 15.347 39.647 14 50 14c10.271 0 15.362 1.222 24.629 4.928.955.383 1.869.74 2.75 1.072h6.225c-2.51-.73-5.139-1.691-8.233-2.928C65.888 13.278 60.562 12 50 12c-10.626 0-16.855 1.397-26.66 5.063l-1.767.662c-2.475.923-4.66 1.674-6.724 2.275h6.335zm0-20C13.258 2.892 8.077 4 0 4V2c5.744 0 9.951-.574 14.85-2h6.334zM77.38 0C85.239 2.966 90.502 4 100 4V2c-6.842 0-11.386-.542-16.396-2h-6.225zM0 14c8.44 0 13.718-1.21 22.272-4.402l1.768-.661C33.64 5.347 39.647 4 50 4c10.271 0 15.362 1.222 24.629 4.928C84.112 12.722 89.438 14 100 14v-2c-10.271 0-15.362-1.222-24.629-4.928C65.888 3.278 60.562 2 50 2 39.374 2 33.145 3.397 23.34 7.063l-1.767.662C13.223 10.84 8.163 12 0 12v2z' fill='%231a3f57' fill-opacity='0.18' fill-rule='evenodd'/%3E%3C/svg%3E"); - } -} - -html[data-theme='argon'] { - --primary: #aabbc3; - --background: #15131f; - --background-darker: #0c0a11; - --nav-link-border-color-hover: transparent; - .collapsable, .nav a.nav-item { - &:nth-child(1n) { --index-color: #fd7293; } - &:nth-child(2n) { --index-color: #2af9ae; } - &:nth-child(3n) { --index-color: #fff874; } - &:nth-child(4n) { --index-color: #21c0fc; } - &:nth-child(5n) { --index-color: #dd98fb; } - &:nth-child(6n) { --index-color: #89ccfc; } - --secondary: var(--index-color); - --item-group-heading-text-color: var(--index-color); - // --item-text-color: var(--index-color); - --widget-text-color: var(--index-color); - --primary: var(--index-color); - --item-text-color-hover: var(--index-color); - --nav-link-text-color-hover: var(--index-color); - --nav-link-shadow-hover: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; - .item:hover { - background: var(--index-color); - color: var(--background); - p.description { color: var(--background); }} - } -} - - html[data-theme='nord-frost'] { - --primary: #D8DEE9; - --background: #3B4252; - --background-darker: #2E3440; - --item-background: #434C5E; - --item-background-hover: #4C566A; - .collapsable:nth-child(1n) { background: #8FBCBB; } - .collapsable:nth-child(2n) { background: #88C0D0; } - .collapsable:nth-child(3n) { background: #81A1C1; } - .collapsable:nth-child(4n) { background: #5E81AC; } -} - -html[data-theme='material-original'] { - --font-body: 'Roboto', serif; - --primary: #29B6F6; - --background: #f1f1f1; - --background-darker: #01579B; - --black: #555555; - --settings-text-color: var(--background-darker); - --item-group-heading-text-color: var(--black); - --item-group-shadow: none; - --item-group-outer-background: none; - --item-group-background: none; - --item-background: var(--white); - --item-background-hover: var(--white); - --settings-background: var(--primary); - --search-container-background: var(--primary); - --curve-factor: 2px; - --curve-factor-navbar: 0; - --item-group-padding: 5px 0 0; - --item-text-color: var(--black); - --item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d; - --item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a; - --item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65); - --item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2); - --settings-container-shadow: 0 1px 3px #0000005e, 0 1px 2px #00000085; - --welcome-popup-background: var(--background-darker); - --welcome-popup-text-color: #ffffff; - --config-code-color: var(--black); - --item-group-heading-text-color-hover: var(--background-darker); - --config-settings-background: var(--background-darker); - --config-settings-color: var(--white); - --interactive-editor-background: var(--background-darker); - --interactive-editor-color: var(--white); - --interactive-editor-background-darker: var(--primary); - --heading-text-color: var(--white); - --status-check-tooltip-background: #f2f2f2; - --status-check-tooltip-color: var(--background-darker); - --description-tooltip-background: #f2f2f2; - --description-tooltip-color: var(--background-darker); - --login-form-background: var(--white); - --about-page-accent: var(--black); - --about-page-color: var(--background-darker); - --about-page-background: var(--background); - --context-menu-background: var(--white); - --context-menu-secondary-color: var(--white); - --widget-text-color: var(--black); - --minimal-view-section-heading-background: var(--white); - --minimal-view-search-background: var(--white); - --minimal-view-search-color: var(--background-darker); - --minimal-view-group-background: #e3e3e3; - div.context-menu ul li:hover { - background: var(--primary); - color: var(--white); - } - .widget-base { - background: #f5f5f5; - box-shadow: var(--item-shadow); - padding: 0.5rem; - margin: 0.25rem 0; - } - .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } -} - -html[data-theme='material-dark-original'] { - --primary: #08B0BB; - --background: #39434C; - --background-darker: var(--primary); - --material-dark: #1b252c; - --material-light: #41e2ed; - --settings-text-color: var(--primary); - --settings-background: #092b3a; - --item-group-background: #333C43; - --item-background: #414B55; - --item-background-hover: #414B55; - --settings-background: var(--material-dark); - --search-container-background: var(--material-dark); - --search-field-background: var(--background); - --heading-text-color: var(--material-dark); - --nav-link-text-color: var(--primary); - --nav-link-background-color: var(--material-dark); - --nav-link-text-color-hover: var(--primary); - --nav-link-background-color-hover: var(--material-dark); - --nav-link-border-color-hover: transparent; - --curve-factor: 2px; - --curve-factor-navbar: 0; - --item-group-padding: 5px 0 0; - --item-shadow: 2px 2px 3px #00000082, 0 1px 10px #00000040; - --item-hover-shadow: 4px 4px 3px #00000082, 0 1px 10px #00000040; - --item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65); - --item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2); - --welcome-popup-background: var(--material-dark); - --welcome-popup-text-color: var(--primary); - --config-settings-background: var(--material-dark); - --config-settings-color: var(--material-light); - --interactive-editor-color: var(--material-light); - --interactive-editor-background: var(--material-dark); - --interactive-editor-background-darker: var(--material-dark); - --scroll-bar-color: var(--primary); - --scroll-bar-background: var(--material-dark); - --status-check-tooltip-background: var(--material-dark); - --status-check-tooltip-color: var(--primary); - --description-tooltip-background: var(--material-dark); - --description-tooltip-color: var(--primary); - --widget-text-color: var(--white); - --minimal-view-section-heading-background: var(--material-dark); - --minimal-view-search-background: var(--material-dark); - --minimal-view-search-color: var(--background-darker); - --minimal-view-group-background: var(--material-dark); - &::-webkit-scrollbar-thumb { - border-left: 1px solid var(--material-dark); - } - div.context-menu { - border: none; - background: var(--material-dark); - ul li:hover { - background: #333c43; - } - } - div.minimal-section-heading, .minimal-section-inner.selected, input.minimal-search { - box-shadow: 2px 2px 4px #000000, 0 1px 3px #000000cc; - } - .minimal-section-inner.selected { border-top: none; } -} - -html[data-theme='colorful'] { - --font-headings: 'Podkova', monospace; - --primary: #e8eae1; - --background: #0b1021; - --background-darker: #05070e; - --item-background: var(--background-darker); - --item-background-hover: var(--background); - --item-group-background: transparent; - --item-group-outer-background: var(--background-darker); - --item-group-heading-text-color: var(--primary); - --item-group-heading-text-color-hover: var(--primary); - --item-hover-shadow: 1px 4px 6px var(--black); - --nav-link-background-color: var(--background); - --outline-color: none; - - .item-wrapper, .sub-item-wrapper { - &:nth-child(1n) .item { --current-color: #eb5cad; } - &:nth-child(2n) .item { --current-color: #985ceb; } - &:nth-child(3n) .item { --current-color: #5c90eb; } - &:nth-child(4n) .item { --current-color: #5cdfeb; } - &:nth-child(5n) .item { --current-color: #5ceb8d; } - &:nth-child(6n) .item { --current-color: #afeb5c; } - &:nth-child(7n) .item { --current-color: #ebb75c; } - &:nth-child(8n) .item { --current-color: #eb615c; } - .item { - color: var(--current-color); - border: 1px solid var(--current-color); - &:hover, &:focus { - opacity: 0.85; - outline: none; - background: currentColor; - span.text, p.description { color: var(--background-darker); } - i.fas, i.fab, i.far, i.fal, i.fad { - filter: drop-shadow(1px 3px 2px var(--transparent-50)); - color: var(--background-darker); - } - svg path { fill: var(--background-darker); } - } - } - } - h1, h2, h3, h4 { - font-weight: normal; - } - div.context-menu { - border-color: var(--primary); - } -} - -html[data-theme='minimal-light'], html[data-theme='minimal-dark'], html[data-theme='vaporware'] { - --font-body: 'Courier New', monospace; - --font-headings: 'Courier New', monospace; - --footer-height: 94px; - - .item.size-medium .tile-title { - max-width: 100px; - } - - label.lbl-toggle h3 { - font-size: 1.5rem; - } - .tile-title span.text { - font-size: 1.1rem; - font-weight: bold; - } - - header { - padding: 0.1rem 0.5rem; - .page-titles{ - h1 { - font-size: 1.25rem; - } - span.subtitle { - font-size: 0.8rem; - - } - } - .nav .nav-item { - padding: 0.2rem 0.4rem; - box-shadow: none; - } - } - .item-group-container.orientation-horizontal .collapsable { - border-bottom: 1px dashed #ffffff38; - border-radius: 0; - } - .widget-base { - background: var(--background-darker); - padding: 1rem 0.5rem; - margin: 0.5rem 0; - } - .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } -} - -html[data-theme='material'], html[data-theme='material-dark'] { - --font-body: 'Raleway', serif; - --font-headings: 'Francois One', serif; - --footer-height: 140px; - --curve-factor: 4px; - --curve-factor-navbar: 8px; - --about-page-background: var(--background); - --about-page-color: var(--primary); - - .collapsable { - margin: 0; - padding: 0; - } - /* Custom layout for medium and large icons */ - .item-wrapper .item:not(.size-small) { - display: flex; - flex-direction: row-reverse; - justify-content: flex-end; - text-align: left; - overflow: hidden; - align-items: center; - width: 15rem; - min-width: 15rem; - max-height: 6rem; - margin: 0.2rem; - padding: 0.5rem; - img { - padding: 0.1rem 0.25rem; - } - .tile-title { - height: auto; - padding: 0.1rem 0.25rem; - span.text { - position: relative; - font-weight: bold; - font-size: 1.1rem; - width: 100%; - } - p.description { - display: block; - margin: 0; - white-space: pre-wrap; - font-size: .9em; - text-overflow: ellipsis; - min-height: 2rem; - } - } - } - .item-wrapper.add-new-item { - flex-grow: inherit; - } - .add-new-item a { - flex-grow: inherit; - flex-basis: inherit; - } - .tooltip.item-description-tooltip:not(.tooltip-is-small) { - display: none !important; - } - .orientation-horizontal:not(.single-section-view) { - display: flex; - flex-direction: column; - .there-are-items { - display: grid; - grid-template-columns: repeat(5, 1fr); - @include phone { grid-template-columns: repeat(1, 1fr); } - @include tablet { grid-template-columns: repeat(2, 1fr); } - @include laptop { grid-template-columns: repeat(3, 1fr); } - @include monitor { grid-template-columns: repeat(4, 1fr); } - @include big-screen { grid-template-columns: repeat(5, 1fr); } - @include big-screen-up { grid-template-columns: repeat(6, 1fr); } - } - .there-are-items .item-wrapper .item { - width: auto; - min-width: auto; - max-height: auto; - } - } - a.item { - position: relative; - overflow: hidden; - transition: all 0.2s linear 0s; - div { - transition: all 0.2s linear 0s; - } - .overflow-dots { - display: none; - } - &:before { - content: "\f054"; - font-family: FontAwesome; - display: flex; - align-items: center; - justify-content: center; - position: absolute; - top: 0; - left: 0px; - height: 100%; - width: 1rem; - background: #ccd3dd80; - border-radius: 0 60% 60% 0; - transform: scale(0,1); - transform-origin: left center; - transition: all 0.2s linear 0s; - padding: 0 0.2rem; - } - &:hover, &:focus-within { - div.bounce { - text-indent: 1rem; - } - &:before { - transform: scale(1,1); - text-indent: 0; - } - .opening-method-icon { - display: none; - } - } - &:active { - background: #c7c7c754; - } - &.size-small { - padding-left: 0.5rem; - min-width: 11rem; - } - &.short:not(.size-large) { - min-height: 2rem; - height: auto; - } - } -} - -html[data-theme='material'] { - --primary: #363636; - --background: #eee; - --white2: #f5f5f5; - --grey2: #473f3f; - --background-darker: #4285f4; - --background-darker2: #0c4eba; - --item-group-outer-background: none; - --item-group-shadow: none; - --item-group-background: none; - --item-background: var(--white); - --item-background-hover: var(--white); - --item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d; - --item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a; - --item-text-color: var(--primary); - --item-group-heading-text-color-hover: var(--primary); - --item-icon-transform-hover: none; - --nav-link-background-color: var(--background-darker2); - --nav-link-text-color: var(--white); - --nav-link-border-color: var(--background-darker2); - --settings-text-color: var(--primary); - --config-code-color: var(--primary); - --config-settings-background: var(--white2); - --config-settings-color: var(--grey2); - --interactive-editor-color: var(--grey2); - --interactive-editor-background: var(--white2); - --interactive-editor-background-darker: var(--white); - --heading-text-color: var(--white); - --curve-factor: 3px; - --curve-factor-navbar: 8px; - --search-container-background: var(--background-darker); - --welcome-popup-text-color: var(--white2); - --footer-text-color: var(--white2); - // --login-form-background-secondary: var(--white2); - --context-menu-background: var(--white); - --context-menu-secondary-color: var(--white2); - --transparent-white-50: #00000080; - --status-check-tooltip-background: var(--white); - --description-tooltip-background: var(--white); - --description-tooltip-color: var(--grey2); - --side-bar-background-lighter: var(--background-darker2); - --side-bar-item-background: var(--white2); - - --minimal-view-background-color: var(--background); - --minimal-view-title-color: var(--background-darker); - --minimal-view-settings-color: var(--primary); - --minimal-view-section-heading-color: var(--primary); - --minimal-view-section-heading-background: #f6f6f6; - --minimal-view-search-background: var(--white); - --minimal-view-search-color: var(--primary); - --minimal-view-group-color: var(--primary); - --minimal-view-group-background: var(--white); - - --widget-background-color: var(--background); - - --warning: #d4d015; - - .minimal-section-inner.selected, div.minimal-section-heading { - border: none; - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - } - .title-and-search form input { - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - } - div.minimal-section-heading.selected { - background: var(--background-darker); - } - - div.jsoneditor div.jsoneditor-menu { - background: var(--background-darker) !important; - } - - header { - color: var(--primary); - .page-titles span.subtitle { - text-shadow: none; - } - } - footer { - opacity: 1; - color: var(--white); - } - section.filter-container form label { - color: var(--white); - } - .prism-editor-wrapper { - background: var(--white2); - } - .item:focus { - outline-color: var(--background-darker); - } - .widget-base { - background: var(--white2); - box-shadow: var(--item-shadow); - padding: 0.5rem; - margin: 0.25rem 0; - } - .minimal-widget-wrap .widget-base { box-shadow: none; } -} - -html[data-theme='material-dark'] { - --primary: #08B0BB; - --background: #313941; - --background-darker: #08B0BB; - --settings-background: #092b3a; - --settings-text-color: #08B0BB; - - --widget-text-color: #e0e0e0; - --widget-accent-color: var(--primary); - - --item-group-background: none; - --item-group-outer-background: none; - --item-group-shadow: none; - --item-group-padding: 5px 0 0; - --item-group-heading-text-color: #e0e0e0; - --item-group-heading-text-color-hover: #08B0BB; - - --item-text-color: #e0e0e0; - --item-shadow: 2px 2px 3px #00000082, 0 1px 10px #00000040; - --item-hover-shadow: 4px 4px 3px #00000082, 0 1px 10px #00000040; - --item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65); - --item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2); - --item-background: #414B55; - --item-background-hover: #414B55; - - --settings-background: #131a1f; - --search-container-background: #131a1f; - --search-field-background: #39434c; - --heading-text-color: #131a1f; - --nav-link-text-color: #08B0BB; - --nav-link-background-color: #131a1f; - --nav-link-text-color-hover: #08B0BB; - --nav-link-background-color-hover: #131a1fc7; - --nav-link-border-color-hover: transparent; - - --status-check-tooltip-background: #131a1f; - --status-check-tooltip-color: #e0e0e0; - --description-tooltip-background: #131a1f; - --description-tooltip-color: #e0e0e0; - --curve-factor: 2px; - --curve-factor-navbar: 0; - --side-bar-background: #131a1f; - --welcome-popup-background: #131a1f; - --welcome-popup-text-color: var(--primary); - - --config-settings-background: #131a1f; - --config-settings-color: #41e2ed; - --interactive-editor-background: #242a2f; - --interactive-editor-background-darker: #131a1f; - --interactive-editor-color: #41e2ed; - - --scroll-bar-color: #08B0BB; - --scroll-bar-background: #131a1f; - // --login-form-color: #131a1f; - --login-form-background-secondary: #131a1f; - - // --minimal-view-background-color: var(--background); - // --minimal-view-title-color: var(--primary); - // --minimal-view-settings-color: var(--primary); - --minimal-view-section-heading-color: #131a1f; - --minimal-view-section-heading-background: var(--background); - --minimal-view-search-background: #131a1f; - // --minimal-view-search-color: var(--primary); - // --minimal-view-group-color: var(--primary); - --minimal-view-group-background: #131a1f; - --context-menu-secondary-color: #131a1f; - --widget-accent-color: #131a1fbf; - - div.minimal-section-heading h3, div.minimal-section-heading.selected h3 { - color: #d5d5d5; - } - div.minimal-section-heading, .minimal-section-inner.selected, input.minimal-search { - box-shadow: 2px 2px 4px #000000, 0 1px 3px #000000cc; - border-color: #131a1f80; - } - - - &::-webkit-scrollbar-thumb { - border-left: 1px solid #131a1f; - } - .item { - &:before, &:active { - background: #131a1f !important; - } - } - .widget-base { - background: var(--item-background); - box-shadow: var(--item-shadow); - margin: 0.25rem 0; - padding: 0.5rem; - } - .minimal-widget-wrap .widget-base { box-shadow: none; } -} - -html[data-theme='minimal-light'] { - --primary: #a5a5a5; - --background: #ffffff; - --background-darker: #14171e; - --item-group-outer-background: none; - --item-group-shadow: none; - --item-group-background: none; - --item-background: none; - --item-background-hover: #f2f2f2; - --item-shadow: none; - --item-hover-shadow: none; - --item-text-color: var(--background-darker); - --item-group-heading-text-color-hover: var(--background-darker); - --settings-text-color: var(--background-darker); - --config-code-color: var(--background-darker); - --nav-link-background-color: none; - --search-container-background: var(--white); - --curve-factor: 4px; - --curve-factor-navbar: 8px; - --status-check-tooltip-background: #f2f2f2; - --status-check-tooltip-color: var(--black); - --description-tooltip-background: #f2f2f2; - --description-tooltip-color: var(--black); - --login-form-color: var(--background-darker); - --about-page-background: var(--background); - --about-page-color: var(--background-darker); - --context-menu-color: var(--background-darker); - --context-menu-secondary-color: var(--primary); - --widget-text-color: #4e4e4e; - section.filter-container { - background: var(--white); - border-bottom: 1px dashed #00000038; - input#filter-tiles { - border: 1px solid var(--background-darker); - } - } - .widget-base { - background: #f2f2f2; - } -} - -html[data-theme='minimal-dark'] { - --primary: #a5a5a5; - --background: #14171e; - --background-darker: #090b0e; - --item-group-outer-background: none; - --item-group-shadow: none; - --item-group-background: none; - --item-background: none; - --item-background-hover: var(--background-darker); - --item-shadow: none; - --item-hover-shadow: none; - --item-text-color: var(--white); - --item-group-heading-text-color-hover: var(--white); - --settings-text-color: var(--white); - --config-code-color: var(--white); - --nav-link-background-color: none; - --search-container-background: var(--background); - --curve-factor: 4px; - --curve-factor-navbar: 8px; - --item-group-heading-text-color: var(--white); - --item-group-heading-text-color-hover: #ffffffbf; - --about-page-background: var(--background); - --about-page-color: var(--primary); - - label.lbl-toggle h3 { - font-size: 1.8rem; - } - - section.filter-container { - background: #14171e; - border-bottom: 1px dashed #ffffff38; - input#filter-tiles { - border: 1px solid var(--white); - } - } - - div.context-menu { - border-color: var(--primary); - } -} - -html[data-theme='vaporware'] { - --primary: #09bfe6; - --background: #100e2c; - --background-darker: #7b2af1; - --settings-text-color: #8d51fc; - --item-group-outer-background: #096de6; - --item-group-outer-background: var(--primary); - --item-group-background: var(--background); - --item-group-heading-text-color: var(--background); - --item-group-heading-text-color-hover: var(--background-darker); - --item-text-color: var(--primary); - --item-background: #1a174d; - --item-background-hover: var(--background);; - --footer-text-color: var(--white); - --item-shadow: none; - --curve-factor: 2px; - --curve-factor-navbar: 6px; - --login-form-color: var(--primary); - --config-settings-background: var(--background); - --status-check-tooltip-background: var(--background); - --description-tooltip-background: var(--background); - --heading-text-color: var(--background); - --search-label-color: var(--background); - --widget-accent-color: #1d194f; - - div.item-group-container { - gap: 0.3rem; - margin: 1rem auto; - } - div.collapsable { - margin: 0.2rem; - padding: 0.2rem; - } - div.content-inner { - padding: 0.15rem !important; - } - a.item { - margin: 0.1rem; - border: 0; - &.size-medium { - min-height: 80px; - } - } - section.filter-container { - background: linear-gradient(0deg, var(--background) 25%, #6c27ea 100%); - form { - background: #6c27ea; - height: 2.5rem; - } - form label, i.clear-search { - color: #100e2c; - border-color: #100e2c; - font-weight: bold; - } - } - .tile-title span.text { - font-weight: normal; - } - label.lbl-toggle h3 { - font-size: 1.4rem; - } - footer { - color: var(--white); - } - div.login-page { - background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg'); - background-size: cover; - } - body { - background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg'); - background-size: cover; - background-repeat:no-repeat; - background-position: center center; - // Remove background from certain components - div.home, div.options-outer, div.options-container, section.filter-container, - section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn { - background: none; - } - } - .widget-base { - background: var(--background); - padding: 1rem 0.5rem; - margin: 0.5rem 0; - } -} - -html[data-theme='glow'], html[data-theme=glow-colorful] { - --primary: #5c6da9; - --background: #f6f6f6; - --background-darker: var(--white); - --curve-factor: 12px; - --item-group-background: var(--white); - --item-group-outer-background: var(--white); - --item-background: var(--white); - --font-headings: 'Sniglet', cursive; - - --item-group-heading-text-color: var(--primary); - --item-group-heading-text-color-hover: var(--primary); - --item-group-shadow: 0 5px 16px 0 #9f72ff33; - --item-background-hover: var(--white); - --item-shadow: 0 1px 5px 0 #8656ef80; - --item-hover-shadow: 0 1px 8px 0 #8656efa6; - --item-icon-transform: drop-shadow(1px 2px 3px var(--transparent-50)) saturate(0.95); - --item-icon-transform-hover: drop-shadow(1px 2px 4px var(--transparent-50)) saturate(0.95); - --footer-height: 120px; - --transparent-50: #cfcfcf80; - header { - padding: 0.5rem; - .page-titles{ - h1 { - font-size: 1.8rem; - } - span.subtitle { - font-size: 0.8rem; - text-shadow: none; - - } - } - .nav .nav-item { - padding: 0.2rem 0.4rem; - box-shadow: none; - } - } - .settings-outer { - box-shadow: 0 4px 5px 0 #8656ef1a; - .options-container { - padding: 0.25rem 1.5rem 0.25rem 1rem; - background: var(--background-darker); - } - } - footer { - box-shadow: 0 -4px 5px 0 #8656ef1a; - } - .search-wrap input { - box-shadow: 0 1px 5px 0 #8656ef80; - } - div.collapsable:nth-child(1n) { - a.item { color: #5213dc; } - --item-group-shadow: 0 5px 16px 0 #9f72ff33; - --item-group-heading-text-color: #8656ef; - --item-group-heading-text-color-hover: #783cfb; - --item-background-hover: var(--white); - --item-shadow: 0 1px 5px 0 #8656ef80; - --item-hover-shadow: 0 1px 8px 0 #8656efa6; - --item-icon-transform: drop-shadow(1px 2px 3px #8656ef80) saturate(0.95); - --item-icon-transform-hover: drop-shadow(1px 2px 4px #8656ef80) saturate(0.95); - } - div.collapsable:nth-child(2n) { - a.item { color: #b514d8; } - --item-group-shadow: 0 5px 16px 0 #728cff33; - --item-group-heading-text-color: #d356ef; - --item-group-heading-text-color-hover: #d73bf9; - --item-background-hover: var(--white); - --item-shadow: 0 1px 5px 0 #d356ef80; - --item-hover-shadow: 0 1px 8px 0 #d356efa6; - --item-icon-transform: drop-shadow(1px 2px 3px #d356ef80) saturate(0.95); - --item-icon-transform-hover: drop-shadow(1px 2px 4px #d356ef80) saturate(0.95); - } - div.collapsable:nth-child(3n) { - a.item { color: #07b9d0; } - --item-group-shadow: 0 5px 16px 0 #728cff33; - --item-group-heading-text-color: #56ddef; - --item-group-heading-text-color-hover: #3cdefb; - --item-background-hover: var(--white); - --item-shadow: 0 1px 5px 0 #56ddef80; - --item-hover-shadow: 0 1px 8px 0 #56ddefa6; - --item-icon-transform: drop-shadow(1px 2px 3px #56ddef80) saturate(0.95); - --item-icon-transform-hover: drop-shadow(1px 2px 4px #56ddef80) saturate(0.95); - } -} - -html[data-theme='glow-dark'] { - --primary: #8faeff; - --background: #11111b; - --background-darker: #0a0a0f; - --curve-factor: 12px; - --item-group-background: #1b1b29; - --item-group-outer-background: #171724; - --item-background: #1d1d2b; - --font-headings: 'Sniglet', cursive; - - --item-group-heading-text-color: var(--primary); - --item-group-heading-text-color-hover: #a0bfff; - --item-group-shadow: 0 5px 16px 0 #5c6da933; - --item-background-hover: #33334d; - --item-shadow: 0 1px 5px 0 #5c6da980; - --item-hover-shadow: 0 1px 8px 0 #5c6da9a6; - --item-icon-transform: drop-shadow(1px 2px 3px var(--transparent-50)) saturate(1.1); - --item-icon-transform-hover: drop-shadow(1px 2px 4px var(--transparent-50)) saturate(1.1); - --footer-height: 120px; - --transparent-50: #00000080; - - header { - padding: 0.5rem; - background: var(--background-darker); - .page-titles { - h1 { - font-size: 1.8rem; - color: var(--primary); - } - span.subtitle { - font-size: 0.8rem; - color: #ccc; - text-shadow: none; - } - } - .nav .nav-item { - padding: 0.2rem 0.4rem; - box-shadow: none; - color: #ddd; - } - } - - .settings-outer { - box-shadow: 0 4px 5px 0 #5c6da91a; - .options-container { - padding: 0.25rem 1.5rem 0.25rem 1rem; - background: var(--background-darker); - } - } - - footer { - background: var(--background-darker); - box-shadow: 0 -4px 5px 0 #5c6da91a; - } - - .search-wrap input { - background: #2a2a3d; - color: #eee; - box-shadow: 0 1px 5px 0 #5c6da980; - } - - div.collapsable:nth-child(1n) { - a.item { color: #a88bff; } - --item-group-shadow: 0 5px 16px 0 #9f72ff33; - --item-group-heading-text-color: #bfa2ff; - --item-group-heading-text-color-hover: #cbb8ff; - --item-background-hover: #3a3a55; - --item-shadow: 0 1px 5px 0 #8656ef80; - --item-hover-shadow: 0 1px 8px 0 #8656efa6; - --item-icon-transform: drop-shadow(1px 2px 3px #8656ef80) saturate(1.1); - --item-icon-transform-hover: drop-shadow(1px 2px 4px #8656ef80) saturate(1.1); - } - - div.collapsable:nth-child(2n) { - a.item { color: #e58fff; } - --item-group-shadow: 0 5px 16px 0 #728cff33; - --item-group-heading-text-color: #eaaaff; - --item-group-heading-text-color-hover: #f0c2ff; - --item-background-hover: #3a3a55; - --item-shadow: 0 1px 5px 0 #d356ef80; - --item-hover-shadow: 0 1px 8px 0 #d356efa6; - --item-icon-transform: drop-shadow(1px 2px 3px #d356ef80) saturate(1.1); - --item-icon-transform-hover: drop-shadow(1px 2px 4px #d356ef80) saturate(1.1); - } - - div.collapsable:nth-child(3n) { - a.item { color: #56e0f0; } - --item-group-shadow: 0 5px 16px 0 #728cff33; - --item-group-heading-text-color: #7feeff; - --item-group-heading-text-color-hover: #a0f5ff; - --item-background-hover: #3a3a55; - --item-shadow: 0 1px 5px 0 #56ddef80; - --item-hover-shadow: 0 1px 8px 0 #56ddefa6; - --item-icon-transform: drop-shadow(1px 2px 3px #56ddef80) saturate(1.1); - --item-icon-transform-hover: drop-shadow(1px 2px 4px #56ddef80) saturate(1.1); - } -} - - html[data-theme='cyberpunk'] { ---pink: #ff2a6d; ---pale: #d1f7ff; ---aqua: #05d9e8; ---teal: #005678; ---blue: #01012b; ---gold: #ebeb0f; - ---primary: var(--gold); ---background: var(--blue); ---background-darker: var(--pink); ---heading-text-color: var(--blue); ---nav-link-background-color: var(--blue); ---nav-link-background-color-hover: var(--blue); ---nav-link-text-color: var(--pink); ---nav-link-text-color-hover: var(--gold); ---nav-link-border-color-hover: var(--blue); ---config-settings-background: var(--blue); ---config-settings-color: var(--pink); ---interactive-editor-background: var(--blue); ---interactive-editor-background-darker: var(--blue); ---interactive-editor-color: var(--pink); ---search-label-color: var(--blue); ---item-group-background: var(--blue); ---item-text-color: var(--pale); ---scroll-bar-color: var(--aqua); ---scroll-bar-background: var(--teal); ---footer-background: var(--aqua); ---welcome-popup-background: var(--pink); ---welcome-popup-text-color: var(--blue); ---status-check-tooltip-background: var(--blue); ---description-tooltip-background: var(--blue); ---font-headings: 'Audiowide', cursive; -} - -html[data-theme="oblivion"], -html[data-theme="oblivion-blue"], -html[data-theme="oblivion-mint"], -html[data-theme="oblivion-lemon"], -html[data-theme="oblivion-scotch"] { - --primary: #f35151; - --background: #1b2431; - --background-darker: #121a25; - --item-group-outer-background: none; - --item-group-shadow: none; - --item-group-background: none; - --item-background: var(--background-darker); - --item-background-hover: var(--background-darker); - --item-shadow: 0 1px 5px #18191a; - --item-hover-shadow: 2px 2px 3px #040505; - --item-group-heading-text-color-hover: var(--primary); - --nav-link-background-color: var(--background); - --curve-factor: 3px; - --curve-factor-navbar: 6px; - --item-group-heading-text-color: var(--primary); - --about-page-background: var(--background); - --about-page-color: var(--primary); - div.item-wrapper a.item, a.sub-item-link.item { - border: 1px solid #313d4f; - } - section.filter-container form input#filter-tiles, .widget-base { - border: 1px solid #313d4f; - box-shadow: 0 1px 5px #0c0d0e; - } - .widget-base { - background: var(--item-background); - box-shadow: var(--item-shadow); - padding: 0.5rem; - margin: 1rem 0; - } - .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } - .minimal-home div.item-group-container, input.minimal-search { - box-shadow: 0 1px 6px #00000099, 0 1px 1px #000000cc; - } -} - -html[data-theme="dashy-docs"] { - // Base - --primary: #f5f6f7; - --background: #202020; - --background-darker: #121212; - // Items - --item-background: var(--background); - --item-background-hover: var(--background); - --item-text-color: var(--primary); - // Sections - --item-group-background: none; - --item-group-outer-background: var(--background-darker); - --item-group-heading-text-color: var(--background); - --item-group-heading-text-color-hover: var(--background); - // Misc - --item-group-padding: 0; - --curve-factor: 3px; - --curve-factor-navbar: 6px; - --item-shadow: 4px 4px 6px #00000080, -2px -2px 4px rgb(0 0 0 / 40%); - --item-group-shadow: 0px 3px 2px #222222, 0px 0px 2px #3e3e3e; - --font-headings: 'PTMono', 'Courier New', monospace; - --minimal-view-section-heading-color: var(--background); - // Navbar Links - --nav-link-background-color-hover: none; - --nav-link-border-color-hover: none; - --nav-link-text-color: var(--background); - --nav-link-text-color-hover: var(--background-darker); - - footer { - box-shadow: 0 -3px 4px #010101; - } - - section.settings-outer form input { - box-shadow: 1px 2px 4px #0b0b0b; - } - - @mixin make-colors($first, $second) { - background: $first; box-shadow: 0 4px $second; - &:hover { box-shadow: 0 2px $second; } - } - // Section headings, nav bar items and minimal tabs - div.collapsable:nth-child(1n) label.lbl-toggle, - .minimal-section-heading:nth-child(1n), - a.nav-item:nth-child(1n) { - @include make-colors(#db78fc, #b83ddd); - --nav-link-background-color-hover: #db78fc; - --nav-link-border-color-hover: #db78fc; - } - div.collapsable:nth-child(2n) label.lbl-toggle, - .minimal-section-heading:nth-child(2n), - a.nav-item:nth-child(2n) { - @include make-colors(#5c85f7, #3d48dd); - --nav-link-background-color-hover: #5c85f7; - --nav-link-border-color-hover: #5c85f7; - } - div.collapsable:nth-child(3n) label.lbl-toggle, - .minimal-section-heading:nth-child(3n), - a.nav-item:nth-child(3n) { - @include make-colors(#41ef90, #1e9554); - --nav-link-background-color-hover: #41ef90; - --nav-link-border-color-hover: #41ef90; - } - div.collapsable:nth-child(4n) label.lbl-toggle, - .minimal-section-heading:nth-child(4n), - a.nav-item:nth-child(4n) { - @include make-colors(#dcff5a, #ceb73f); - --nav-link-background-color-hover: #dcff5a; - --nav-link-border-color-hover: #dcff5a; - } - - nav.side-bar { - div div.side-bar-item-container div { - padding: 0.15rem 0; - color: var(--background); - } - - div.side-bar-section:nth-child(1n) { - div.side-bar-item-container div.side-bar-item { - @include make-colors(#db78fc, #b83ddd); - } - .sub-side-bar { background: #b83ddd80; } - } - div.side-bar-section:nth-child(2n) { - div.side-bar-item-container div.side-bar-item { - @include make-colors(#5c85f7, #3d48dd); - } - .sub-side-bar { background: #3d48dd80; } - } - div.side-bar-section:nth-child(3n) { - div.side-bar-item-container div.side-bar-item { - @include make-colors(#41ef90, #1e9554); - } - .sub-side-bar { background: #1e955480; } - } - div.side-bar-section:nth-child(4n) { - div.side-bar-item-container div.side-bar-item { - @include make-colors(#dcff5a, #ceb73f); - } - .sub-side-bar { background: #ceb73f80; } - } - } - - // Section items - div.collapsable:nth-child(1n) { .item-wrapper:hover { .item {box-shadow: 0 2px 3px #db78fc; .tile-title { color: #db78fc; } } } } - div.collapsable:nth-child(2n) { .item-wrapper:hover { .item { box-shadow: 0 2px 3px #5c85f7; .tile-title { color: #5c85f7; } } } } - div.collapsable:nth-child(3n) { .item-wrapper:hover { .item { box-shadow: 0 2px 3px #41ef90; .tile-title { color: #41ef90; } } } } - div.collapsable:nth-child(4n) { .item-wrapper:hover { .item { box-shadow: 0 2px 3px #dcff5a; .tile-title { color: #dcff5a; } } } } - - - div.config-buttons { - .config-button { - border: none; - color: var(--background); - font-weight: bold; - svg path { fill: var(--background); } - &:nth-child(4n + 1) { @include make-colors(#db78fc, #b83ddd); } - &:nth-child(4n + 2) { @include make-colors(#41ef90, #1e9554); } - &:nth-child(4n + 3) { @include make-colors(#5c85f7, #3d48dd); } - &:nth-child(4n + 4) { @include make-colors(#dcff5a, #ceb73f); } - } - } - - a.nav-item, a.nav-item:hover, a.nav-item.router-link-active { - border: none; - color: var(--background); - font-weight: bold; - min-width: 5rem; - text-align: center; - } - - .minimal-section-heading { - border: none !important; - &.selected { - background: var(--primary) !important; - } - } -} - -html[data-theme="adventure"], html[data-theme="adventure-basic"] { - // Main colors - --primary: #ffffffe6; - --background: #0b1021; - --background-darker: #181c3a; - // Typography - --font-headings: 'Podkova', 'Roboto', serif; - --font-body: 'Roboto', serif; - // Items - --item-background: #181c3a80; - --item-background-hover: #181c3a99; - --item-shadow: 1px 1px 2px #130f23; - --item-hover-shadow: 2px 2px 4px #130f23; - // Sections - --item-group-heading-text-color: var(--white); - --item-group-heading-text-color-hover: var(--primary); - --item-group-shadow: none; - --item-group-background: none; - --item-group-outer-background: none; - // Remove background from certain components - div.home, div.options-outer, div.options-container, section.filter-container, - section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn { - background: none; - } - // Style overides - label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; } - .content-inner { border-top: 1px dashed var(--primary); } - a.item.size-large:hover { border-left: 3px solid var(--white); } - .item.size-large .tile-title p.description { height: 3rem; } - .is-collapsed { - background: var(--item-background); - box-shadow: var(--item-shadow); - &:hover { - background: var(--item-background-hover); - box-shadow: var(--item-hover-shadow); - } - } -} - -html[data-theme="adventure"] { - // Background Image - body { - background: url('https://i.ibb.co/wdqSsGh/adventure-bg.jpg'); - background-size: cover; - } -} - -html[data-theme="color-block"] { - // Main colors - --primary: #E94560; - --background: #16213E; - --background-darker: #0e172b; - // Typography - --font-headings: 'Podkova', 'Roboto', serif; - --font-body: 'Roboto', serif; - // Items - --item-background: #1b294c; - --item-background-hover: var(--item-background); - --item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); - --item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black); - // Sections - --item-group-heading-text-color: var(--white); - --item-group-heading-text-color-hover: var(--primary); - --item-group-shadow: none; - --item-group-background: none; - --item-group-outer-background: none; - // Nav Links - --nav-link-background-color: var(--background); - --nav-link-background-color-hover: var(--background); - --nav-link-border-color: transparent; - --nav-link-border-color-hover: transparent; - --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); - --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black); - // Misc - --curve-factor: 4px; - --curve-factor-navbar: 8px; - - --widget-text-color: var(--white); - - // Style overrides - label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; } - .content-inner { border-top: 1px dashed var(--primary); } - .item.size-large .tile-title p.description { height: 3rem; } - .item, .nav-outer nav .nav-item { border-radius: 0; } - .item.size-large { margin: 0.5rem; } - // Show outline when collapsed - .is-collapsed { - background: var(--item-background); - box-shadow: var(--item-shadow); - &:hover { - background: var(--item-background-hover); - box-shadow: var(--item-hover-shadow); - } - } - .widget-base { - background: var(--background-darker); - padding: 1rem 0.5rem; - margin: 0.5rem 0; - } -} - -html[data-theme="one-dark"] { - - // Main colors - --primary: #c5cad3; - --background: #282c33; - --background-darker: #1c1f23; - // Typography - --font-headings: 'Podkova', 'Roboto', serif; - --font-body: 'Roboto', serif; - // Items - --item-background: var(--background-darker); - --item-background-hover: var(--item-background); - --item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); - --item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black); - // Sections - --item-group-heading-text-color: var(--white); - --item-group-heading-text-color-hover: var(--primary); - --item-group-shadow: none; - --item-group-background: none; - --item-group-outer-background: none; - // Nav Links - --nav-link-background-color: var(--background); - --nav-link-background-color-hover: var(--background); - --nav-link-border-color: transparent; - --nav-link-border-color-hover: transparent; - --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); - --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black); - // Misc - --curve-factor: 4px; - --curve-factor-navbar: 6px; - - // Style overrides - label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; } - .content-inner { border-top: 1px dashed var(--primary); } - .item.size-large .tile-title p.description { height: 3rem; } - .item, .nav-outer nav .nav-item { border-radius: 0; } - .item.size-large { margin: 0.5rem; } - // Show outline when collapsed - .is-collapsed { - background: var(--item-background); - box-shadow: var(--item-shadow); - &:hover { - background: var(--item-background-hover); - box-shadow: var(--item-hover-shadow); - } - } - // Colored Item Accents - .item-wrapper:nth-child(1n) { --current: #e06b74; } - .item-wrapper:nth-child(2n) { --current: #98c379; } - .item-wrapper:nth-child(3n) { --current: #e5c07a; } - .item-wrapper:nth-child(4n) { --current: #62aeef; } - .item-wrapper:nth-child(5n) { --current: #c678dd; } - .item-wrapper:nth-child(6n) { --current: #55b6c2; } - .item-wrapper .item { - color: var(--current); - box-shadow: -3px 0px 0px var(--current), 1px 1px 3px #000000e6; - &:hover { - box-shadow: -5px 0px 0px var(--current), 2px 2px 3px #000000e6; - } - } - - // Widgets - .widget-base { - background: var(--item-background); - box-shadow: var(--item-shadow); - padding: 0.5rem; - margin: 1rem 0; - } - .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } -} - - -html[data-theme="oblivion-blue"] { - --primary: #82a5f3; -} -html[data-theme="oblivion-mint"] { - --primary: #4acfd4; -} -html[data-theme="oblivion-lemon"] { - --primary: #d0ed87; -} -html[data-theme="oblivion-scotch"] { - --primary: #d69e3a; -} - -html[data-theme='lissy'] { - // --primary: #f0f; - --primary: #ffffffcc; - --background: #25282c; - --background-darker: #191c20; - --item-group-background: var(--background-darker); - --item-group-outer-background: var(--background-darker); - --item-group-heading-text-color: var(--primary); - --item-group-heading-text-color-hover: var(--primary); - --item-group-shadow: none; - --item-background: var(--background); - --item-background-hover: #101215; - --item-shadow: 1px 1px 1px #00000080; - --item-hover-shadow: 2px 2px 3px #00000099; - --font-headings: 'Shrikhand'; - --curve-factor: 6px; - - h1, h3.section-title { - font-weight: normal; - } - - .side-bar-item-container { - --item-hover-shadow: none; - --item-shadow: none; - } - - .collapsable, .side-bar-section, .workspace-widget { - &:nth-child(1n) { --index-color: #f81392e6; } - &:nth-child(2n) { --index-color: #e026ffe6; } - &:nth-child(3n) { --index-color: #4c64ffe6; } - &:nth-child(4n) { --index-color: #38d9fde6; } - &:nth-child(5n) { --index-color: #15f4a3e6; } - &:nth-child(6n) { --index-color: #e8ff47e6; } - &:nth-child(7n) { --index-color: #ff6c47e6; } - - --item-group-heading-text-color: var(--index-color); - --item-group-shadow: inset 0 2px 1px var(--index-color); - --item-hover-shadow: 0 0 5px var(--index-color); - --side-bar-item-color: var(--index-color); - - transition: all 0.2s ease-in-out 0s; - border: 1px solid #0000004d; - label.lbl-toggle h3 { - font-weight: normal; - } - a.item p.description { - opacity: 0.75; - color: var(--index-color); - } - &:hover, &.workspace-widget { - box-shadow: inset 0px 3px 1px var(--index-color), 1px 1px 5px #00000080; - } - } - - .workspace-widget-view .workspace-widget { - background: var(--background-darker); - padding: 1rem; - margin: 1rem auto; - border-radius: var(--curve-factor); - } - - .home, .options-container, .options-outer, #dashy { - background-color: var(--background); - background-image: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%2314171c' fill-opacity='0.4'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - } - .minimal-home { - background: none; - } - - .home { - padding-bottom: 1.5rem; - } - footer { - margin-top: 0; - } -} - -html[data-theme='glass'], -html[data-theme='glass-2'], -html[data-theme='neomorphic'] { - --primary: #fff; - --item-group-outer-background: rgba(0, 0, 0, 0.25); - --item-group-background: transparent; - --item-group-heading-text-color: #fff; - --item-group-heading-text-color-hover: #ffffffd6; - --item-group-shadow: 5px 2px 20px rgba(0, 0, 0, 0.5); - --background: #190842; - --background-darker: #190842; - --settings-background: transparent; - --search-container-background: transparent; - --font-headings: 'Segoe UI', 'Ariel', 'sans-serif'; - --font-body: 'Roboto', 'Segoe UI', 'Ariel', 'sans-serif'; - --minimal-view-background-color: transparent; - --minimal-view-group-background: rgba(255, 255, 255, 0.15); - --minimal-view-section-heading-background: rgba(255, 255, 255, 0.15); - --minimal-view-section-heading-color: rgba(255, 255, 255, 0.15); - --config-settings-background: #16073de3; - --cloud-backup-background: #16073de3; - - @mixin item-transition-styles($bg: transparent, $hover-bg: rgba(255, 255, 255, 0.15), $hover-shadow: rgba(0, 0, 0, 0.75)) { - background: $bg; - border: 1px solid transparent; - box-shadow: none; - transition: 0.2s all ease-in-out; - - &:hover { - border-radius: 0.35rem; - box-shadow: 0 4px 30px $hover-shadow; - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.19); - background: $hover-bg; - } - } - - @mixin transform-scale($normal-scale: 1, $hover-scale: 1.25) { - transition: 0.1s all ease-in-out; - transform: scale($normal-scale); - - &:hover { - transform: scale($hover-scale); - } - } - - body { - background-size: cover; - background-color: #090317; - .home { - background: transparent; - } - } - - .settings-outer, header, .dashy-modal, .dashy-modal .tabs { - background: transparent; - // backdrop-filter: blur(4px); - } - - // Minimal view components - .minimal-section-inner, div.minimal-section-heading { - backdrop-filter: blur(10px); - border: 1px solid rgba(145, 145, 145, 0.45); - border-bottom: none; - - &.selected { - border: 1px solid rgba(145, 145, 145, 0.45); - background: var(--minimal-view-group-background); - } - } - - .minimal-section-heading { - color: var(--minimal-view-section-heading-background); - - &.selected { - .section-icon, .section-title { - color: var(--primary) !important; - } - } - } - - --glass-button-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); - --glass-button-hover-shadow: 2px 2px 5px rgba(0, 0, 0, 0.7); - - // Forms and inputs - button.save-button, - .action-buttons button, - .cloud-backup-restore-wrapper button, - .tab__nav__item, - div.input-container input.input-field, - form.normal input, - .nav-outer nav .nav-item, - div.edit-mode-bottom-banner .edit-banner-section button, - .v-select.theme-dropdown.vs__dropdown-toggle, - .theme-dropdown div.vs__dropdown-toggle, - .config-buttons > svg, - .display-options svg, - form.minimal input, - .critical-error-wrap button.user-doesnt-care, - a.config-button, button.config-button { - border-radius: 0.35rem; - box-shadow: var(--glass-button-shadow); - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.19); - background: rgba(255, 255, 255, 0.15); - transition: all 0.2s ease-in-out; - text-decoration: none; - &:hover, &.selected { - box-shadow: var(--glass-button-hover-shadow); - border: 1px solid rgba(255, 255, 255, 0.25) !important; - background: #ffffff42 !important; - color: var(--primary) !important; - path { fill: var(--primary); } - } - } - - .tab__nav__items { - gap: 1rem; - margin: 0.5rem 0 0; - .tab__nav__item { - padding: 0.5rem 0.5rem; - &:hover, .active, .active:hover { - background: #ffffff42 !important; - span { color: var(--primary) !important; } - } - } - } - - .main-options-container .config-buttons, div.cloud-backup-restore-wrapper { - background: none; - } - - // Item and collapsable specific styles - .item { - @include item-transition-styles(transparent, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.75)); - .item-icon { - @include transform-scale(1.1, 1.25); - } - } - - .collapsable { - border-radius: 0.5rem; - border: 1px solid rgba(0, 0, 0, 0.45); - box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); - } - - // Modal specific styles - .dashy-modal { - box-shadow: 0 20px 40px -2px #000000b8, 1px 1px 6px #000000a6 !important; - } - - .tab-item { - background: var(--config-settings-background); - } - - .theme-configurator-wrapper, .view-switcher { - backdrop-filter: blur(10px); - background: var(--config-settings-background); - border: 1px solid rgba(255, 255, 255, 0.19); - box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); - } - - .edit-mode-top-banner { - backdrop-filter: blur(10px); - background: #ffffff6b; - border-bottom: 1px solid black; - - span { color: #eaff9d; } - } - - div.edit-mode-bottom-banner, .add-new-section { - background: rgba(255, 255, 255, 0.15); - backdrop-filter: blur(50px); - } - - .critical-error-wrap { - backdrop-filter: blur(15px); - background: #0f0528c4; - } -} - -html[data-theme='glass'] { - body { - background: url('https://zeabur.com/images/bg.png') center center no-repeat; - background-size: cover; - background-color: #090317; - .home { - background: transparent; - } - } -} - -html[data-theme='glass-2'] { - body { - background: url('https://i.ibb.co/FnLH6bj/dashy-glass.jpg') center center no-repeat; - background-size: cover; - background-color: #090317; - } -} - -html[data-theme='neomorphic'] { - --primary: #fff; - --item-group-outer-background: rgba(255, 255, 255, 0.15); - --item-group-background: transparent; - --item-group-heading-text-color: #fff; - --item-group-shadow: 5px 2px 20px rgba(0, 0, 0, 0.5); - --background: #5b56f7; - // --background: #4bdbfd; - --background-darker: #12103c; - --settings-background: transparent; - --search-container-background: transparent; - --font-headings: 'Segoe UI', 'Ariel', 'sans-serif'; - --font-body: 'Roboto', 'Segoe UI', 'Ariel', 'sans-serif'; - --minimal-view-background-color: transparent; - --minimal-view-group-background: rgba(255, 255, 255, 0.15); - --minimal-view-section-heading-background: rgba(255, 255, 255, 0.15); - --minimal-view-section-heading-color: rgba(255, 255, 255, 0.15); - --config-settings-background: #1fb8f4e3; - --cloud-backup-background: #16073de3; - - --glass-button-shadow: 0px 1px 5px rgba(0, 0, 0, 0.5); - --glass-button-hover-shadow: 2px 2px 5px rgba(0, 0, 0, 0.7); - body { - background: var(--background); - } - .item:hover { box-shadow: 0 3px 10px rgba(0, 0, 0, 0.5); } - .collapsable { border: 1px solid rgba(255, 255, 255, 0.25) !important; } -} - - -html[data-theme="night-bat"] { - // Main colors - --primary: #4780ff; - --background: #252931; - --background-darker: #303540; - // Typography - --font-headings: 'Podkova', 'Roboto', serif; - --font-body: 'Roboto', serif; - --heading-text-color: #fff; - // Items - --item-background: #303540; - --item-background-hover: var(--item-background); - --item-shadow: 0px 3px 0px var(--primary), 2px 2px 6px var(--black); - --item-hover-shadow: 0px 20px 0px 0 var(--primary), 2px 2px 6px var(--black); - // Sections - --item-group-heading-text-color: var(--white); - --item-group-heading-text-color-hover: var(--white); - --item-group-shadow: none; - --item-group-background: none; - --item-group-outer-background: none; - // Nav Links - --nav-link-background-color: var(--background); - --nav-link-background-color-hover: var(--background); - --nav-link-border-color: transparent; - --nav-link-border-color-hover: transparent; - --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); - --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black); - // Misc - --curve-factor: 4px; - --curve-factor-navbar: 8px; - - --widget-text-color: var(--white); - - // Style overrides - label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; } - .content-inner { border-top: 1px dashed var(--primary); } - .item.size-large .tile-title p.description { height: 3rem; } - .item, .nav-outer nav .nav-item { border-radius: 1px; } - .item.size-large { margin: 0.5rem; } - // Show outline when collapsed - .is-collapsed { - background: var(--item-background); - box-shadow: var(--item-shadow); - &:hover { - background: var(--item-background-hover); - box-shadow: var(--item-hover-shadow); - } - } - .widget-base { - background: var(--background-darker); - padding: 1rem 0.5rem; - margin: 0.5rem 0; - } - - .item-wrapper { - .item-url { - display: block; - opacity: 0; - position: absolute; - bottom: -1.9rem; - font-size: 0.8rem; - color: var(--background); - transition: all 0.2s cubic-bezier(0.8, 0.8, 0.4, 1.4); - } - a { - transition: all 0.2s cubic-bezier(0.8, 0.8, 0.4, 1.4); - height: calc(100% - 1rem); - } - &:hover { - a { height: calc(100% - 2rem); } - .item-icon { - transform: scale(0.9); - } - .item-url { - display: block; - opacity: 1; - } - } - } -} - - -html[data-theme='cherry-blossom'] { - --primary: #e1e8ee; - --background: #11171d; - --background-darker: #070a0d; - --item-background: #00000040; - --widget-base-background: #00000040; - --widget-base-shadow: var(--item-shadow); - --item-background-hover: #ffffff1a; - --item-group-outer-background: none; - --item-group-background: none; - --item-group-shadow: 1px 1px 2px #080a0d; - --item-group-heading-text-color: var(--background); - --minimal-view-section-heading-color: var(--background-darker); - --minimal-view-group-background: #1b242d; - --minimal-view-group-color: none; - --heading-text-color: var(--background); - --nav-link-text-color: var(--background); - --nav-link-text-color-hover: var(--background); - --nav-link-border-color-hover: #11171d40; - --nav-link-background-color: #00000040; - - --search-container-background: none; - --search-field-background: var(--background-darker); - --font-headings: 'Cutive Mono', monospace; - - .collapsable, .side-bar-section, .workspace-widget, .minimal-section-heading, .minimal-section-inner { - &:nth-child(1n) { --top-color: #d7c1ed; --back-color: #2a2c37; } - &:nth-child(2n) { --top-color: #96cdfb; --back-color: #222e39; } - &:nth-child(3n) { --top-color: #b5e8e0; --back-color: #263135; } - &:nth-child(4n) { --top-color: #f28fad; --back-color: #2d262f; } - - --item-group-outer-background: var(--back-color); - --item-hover-shadow: 0 0 5px var(--top-color); - --side-bar-item-color: var(--top-color); - --minimal-view-section-heading-background: var(--top-color); - - label.lbl-toggle { - background: var(--top-color); - padding: 0.5rem 0.25rem; - min-height: 1.5rem; - border-bottom-left-radius: var(--curve-factor) !important; - border-bottom-right-radius: var(--curve-factor) !important; - } - transition: all 0.2s ease-in-out 0s; - border: 1px solid #0000004d; - a.item p.description { - opacity: 0.75; - color: var(--top-color); - } - &.workspace-widget { - box-shadow: inset 0px 3px 1px var(--top-color), 1px 1px 5px #00000080; - } - } - header { - border-radius: 8px; - max-width: 1200px; - margin: 1rem auto 0 auto; - padding: 0.25rem; - justify-content: space-around; - background-image: linear-gradient(to right, #D7C1ED, #96CDFB, #B5E8E0, #F28FAD); - .subtitle { display: none; } - .page-titles img.site-logo { - margin-right: 0.5rem; - } - .nav-outer nav .nav-item { - padding: 0.5rem; - } - } - .settings-outer { - background: none; - max-width: 1200px; - margin: 0 auto; - } - .collapsable { - max-width: 1200px; - margin: 0.5rem auto; - } - .widget-base { - border-radius: var(--curve-factor); - margin: 0.5rem auto; - padding: 0.2rem; - } - .home .item-group-container { - gap: 0.5rem 1rem; - } - .item-icon svg { border-radius: 6px; } - .work-space nav.side-bar, .work-space .web-content iframe { - border-radius: 8px; - } - section.settings-outer.settings-hidden form { - width: 100%; - display: flex; - justify-content: center; - .search-wrap { - width: fit-content; - input { - margin-top: 1rem; - width: 400px; - } - } - } -} - -html[data-theme="tama"] { - // Main colors - --primary: #ffffffe6; - --background: #0b1021; - --background-darker: #181c3a; - --background-darker-transparent: #181c3ad4; - --background-grey-transparent: #6b6c73c6; - - // Typography - --font-headings: 'Segoe UI', 'Ariel', 'sans-serif'; - --font-body: 'Segoe UI', 'Ariel', 'sans-serif'; - - // Items - --item-background: var(--background-darker-transparent); - --item-background-hover: var(--background-grey-transparent); - --item-shadow: 1px 1px 2px #130f23; - --item-hover-shadow: 2px 2px 4px #130f23; - - // Sections - --item-group-heading-text-color: var(--white); - --item-group-heading-text-color-hover: var(--primary); - --item-group-shadow: none; - --item-group-background: none; - --item-group-outer-background: none; - - // Remove background from certain components - div.home, div.options-outer, div.options-container, section.filter-container, - section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn { - background: none; - } - - // Style overides - label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; } - .content-inner { border-top: 1px dashed var(--primary); } - .item.size-large .tile-title p.description { height: 3rem; } - .is-collapsed { - background: var(--item-background); - box-shadow: var(--item-shadow); - &:hover { - background: var(--item-background-hover); - box-shadow: var(--item-hover-shadow); - } - } - - // Background Image - body { - //update the query terms after the '?', to customize for images you want - background: url('https://picsum.photos/1920/1080'); - background-color: var(--background-darker); - background-size: cover; - } - header, footer, form.normal { background-color: var(--background-darker-transparent); } - - // large tile spacing adjustment - .there-are-items:has(.item-wrapper.wrap-size-large) { padding-top: .25rem; } - .item-wrapper.wrap-size-large { margin: 0rem .5rem .5rem 0rem; overflow: hidden; } - .item.size-large .tile-title { padding: 0rem 0rem 0rem .7rem; } - - // Hide open method icon - .opening-method-icon { opacity: 0; } - - // Widget tile style - .widget-base { - background-color: var(--background-darker-transparent); - margin: .5rem .5rem 1rem .5rem; - padding: 0; - border: 1px solid var(--outline-color); - border-radius: var(--curve-factor); - box-shadow: var(--item-shadow); - } - .widget-base button.action-btn { margin-top: .3rem; margin-right: .5rem; } - .widget-wrap { padding: 1.4rem .8rem .8rem .8rem; } - - // Grow effect for tile-icon & on hover over Item tiles - .item:hover .item-icon img, .item:hover .item-icon i{ - transition: all .35s ease-in-out; - transform: scale(1.22); - } -} +/** + * Built-in theme palettes. Each theme is an `html[data-theme=''] { ... }` + * block of CSS variable overrides, optionally with structural tweaks. + * Partials live in `./themes/` โ€” one per theme family. Themes that share CSS + * (material, glass, minimal, oblivion, adventure, glow, flat) are colocated + * with their shared selector in the same partial. + * + * Import order is preserved from the original monolithic file so cascade + * semantics are identical. Consumed once by App.vue; Vite compiles all + * partials into a single CSS bundle โ€” no runtime change versus before the split. + */ + +@import './themes/callisto'; +@import './themes/thebe'; +@import './themes/dracula'; +@import './themes/crayola'; +@import './themes/bee'; +@import './themes/raspberry-jam'; +@import './themes/tiger'; +@import './themes/matrix'; +@import './themes/blue-purple'; +@import './themes/hacker-girl'; +@import './themes/high-contrast'; +@import './themes/nord'; +@import './themes/flat-themes'; +@import './themes/material'; +@import './themes/colorful'; +@import './themes/minimal'; +@import './themes/glow'; +@import './themes/cyberpunk'; +@import './themes/oblivion'; +@import './themes/dashy-docs'; +@import './themes/adventure'; +@import './themes/color-block'; +@import './themes/one-dark'; +@import './themes/lissy'; +@import './themes/glass'; +@import './themes/night-bat'; +@import './themes/cherry-blossom'; +@import './themes/tama'; +@import './themes/tokyo-night'; +@import './themes/gruvbox'; +@import './themes/rose-pine'; +@import './themes/parchment'; +@import './themes/aurora'; +@import './themes/zinc'; +@import './themes/solarized'; +@import './themes/brutalist'; +@import './themes/midnight'; +@import './themes/catppuccin'; diff --git a/src/styles/global-styles.scss b/src/styles/global-styles.scss index 9c601e6098..2183f8f6fc 100644 --- a/src/styles/global-styles.scss +++ b/src/styles/global-styles.scss @@ -31,40 +31,45 @@ html { [v-cloak] > * { display:none } [v-cloak]::before { content: "loadingโ€ฆ" } -/* Overriding styles for the modal component */ -.vm--modal, .dashy-modal { - box-shadow: 0 40px 70px -2px hsl(0deg 0% 0% / 60%), 1px 1px 6px var(--primary) !important; - min-width: 350px; - min-height: 200px; - background: var(--background-darker); - @include phone { - left: 0.5rem !important; - right: 0.5rem !important; - width: 95% !important; - top: 2rem !important; - } -} -.vm--overlay { - background: #00000080; +/* Default size for inline SVG icons (vite-svg-loader renders them without dimensions) */ +button svg, a svg { + width: 1rem; + height: 1rem; + vertical-align: middle; } -/* Overiding styles for the global toast component */ -.toast-message { - background: var(--toast-background) !important; - color: var(--toast-color) !important; - border: 1px solid var(--toast-color) !important; - border-radius: var(--curve-factor) !important; - font-size: 1.25rem !important; -} -.toast-error { - background: var(--danger) !important; - color: var(--white) !important; - font-size: 1.25rem !important; +/* Small uppercase label above a form control */ +.options-label, +.theme-label { + display: block; + margin-bottom: 0.3rem; + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--config-settings-color); + opacity: 0.75; } -.toast-success { - background: var(--success) !important; - color: var(--white) !important; - font-size: 1.25rem !important; + +/* Row of icon buttons used as a multi-option toggle */ +.display-options { + display: flex; + gap: 0.35rem; + color: var(--settings-text-color); + svg { + flex: 1; + height: 1.75rem; + padding: 0.3rem; + box-sizing: border-box; + background: var(--background); + border: 1px solid currentColor; + border-radius: var(--curve-factor); + cursor: pointer; + &:hover, &.selected { + background: var(--settings-text-color); + color: var(--background); + } + } } /* v-select, dropdown styles */ @@ -94,81 +99,3 @@ html { } } } - -/* Overriding styles for tooltip component */ -.tooltip { - display: block; - z-index: 5; - max-width: var(--tooltip-width); - border: none; - padding: 0; - .tooltip-inner { - background: var(--description-tooltip-background); - border: 1px solid var(--description-tooltip-color); - border-radius: var(--curve-factor-small); - color: var(--description-tooltip-color); - padding: var(--tooltip-padding); - overflow: hidden; - } - .tooltip-arrow { - width: 0; - height: 0; - border-style: solid; - position: absolute; - margin: var(--tooltip-arrow-size); - border-color: transparent; - border-width: var(--tooltip-arrow-size); - z-index: 1; - } - &[x-placement^="top"] { - margin-bottom: var(--tooltip-arrow-size); - .tooltip-arrow { - border-bottom-width: 0; - border-top-color: var(--description-tooltip-color); - bottom: calc(-1 * var(--tooltip-arrow-size)); - left: calc(50% - var(--tooltip-arrow-size)); - margin: 0 var(--tooltip-arrow-size); - } - } - &[x-placement^="bottom"] { - margin-top: var(--tooltip-arrow-size); - .tooltip-arrow { - border-top-width: 0; - border-bottom-color: var(--description-tooltip-color); - top: calc(-1 * var(--tooltip-arrow-size)); - left: calc(50% - var(--tooltip-arrow-size)); - margin: 0 var(--tooltip-arrow-size); - } - } - &[x-placement^="right"] { - margin-left: var(--tooltip-arrow-size); - .tooltip-arrow { - border-left-width: 0; - border-right-color: var(--description-tooltip-color); - left: calc(-1 * var(--tooltip-arrow-size)); - top: calc(50% - var(--tooltip-arrow-size)); - margin: var(--tooltip-arrow-size) 0; - } - } - &[x-placement^="left"] { - margin-right: var(--tooltip-arrow-size); - .tooltip-arrow { - border-right-width: 0; - border-left-color: var(--description-tooltip-color); - right: calc(-1 * var(--tooltip-arrow-size)); - top: calc(50% - var(--tooltip-arrow-size)); - margin: var(--tooltip-arrow-size) 0; - } - } - &[aria-hidden='true'] { - visibility: hidden; - opacity: 0; - transition: opacity .15s, visibility .15s; - } - &[aria-hidden='false'] { - visibility: visible; - opacity: 1; - transition: opacity .15s; - } - &.in-modal-tt { z-index: 999; } -} diff --git a/src/styles/media-queries.scss b/src/styles/media-queries.scss index d592ed1c0e..dc2b103c5a 100644 --- a/src/styles/media-queries.scss +++ b/src/styles/media-queries.scss @@ -83,3 +83,24 @@ $extra-large: 2800px; } } +/* Heights in px for compact landscape viewports @include short to hide non-essential chrome */ +$short-height: 740px; +$tall-height: 1000px; + +@mixin short { + @media (max-height: #{$short-height - 1px}) { + @content; + } +} + +@mixin short-up { + @media (min-height: #{$short-height}) { + @content; + } +} + +@mixin tall { + @media (min-height: #{$tall-height}) { + @content; + } +} diff --git a/src/styles/style-helpers.scss b/src/styles/style-helpers.scss index 6b73c9bc9c..bc5fd96923 100644 --- a/src/styles/style-helpers.scss +++ b/src/styles/style-helpers.scss @@ -19,29 +19,27 @@ .svg-button { color: var(--primary); svg { - path { - fill: var(--settings-text-color); - } + color: var(--settings-text-color); width: 1rem; height: 1rem; margin: 0.2rem; padding: 0.2rem; text-align: center; background: var(--background); - border: 1px solid currentColor; + border: 1px solid var(--primary); border-radius: var(--curve-factor); cursor: pointer; &:hover, &.selected { background: var(--settings-text-color); - path { fill: var(--background); } + color: var(--background); } &.disabled { opacity: var(--dimming-factor); cursor: not-allowed; &:hover { - border: 1px solid currentColor; + border: 1px solid var(--primary); background: var(--background); - path { fill: var(--settings-text-color); } + color: var(--settings-text-color); } } } @@ -59,6 +57,20 @@ } } +/* Modal container shared by the interactive-editor modals */ +.interactive-editor-inner { + padding: 1rem; + height: 100%; + overflow-y: auto; + background: var(--interactive-editor-background); + color: var(--interactive-editor-color); + @extend .scroll-bar; + h3 { + font-size: 1.4rem; + margin: 0.5rem; + } +} + /* Single-style helpers */ .bold { font-weight: bold; } .light { font-weight: lighter; } diff --git a/src/styles/themes/_adventure.scss b/src/styles/themes/_adventure.scss new file mode 100644 index 0000000000..77fff4f291 --- /dev/null +++ b/src/styles/themes/_adventure.scss @@ -0,0 +1,47 @@ +html[data-theme="adventure"], html[data-theme="adventure-basic"] { + // Main colors + --primary: #ffffffe6; + --background: #0b1021; + --background-darker: #181c3a; + // Typography + --font-headings: 'Podkova', 'Roboto', serif; + --font-body: 'Roboto', serif; + // Items + --item-background: #181c3a80; + --item-background-hover: #181c3a99; + --item-shadow: 1px 1px 2px #130f23; + --item-hover-shadow: 2px 2px 4px #130f23; + // Sections + --item-group-heading-text-color: var(--white); + --item-group-heading-text-color-hover: var(--primary); + --item-group-shadow: none; + --item-group-background: none; + --item-group-outer-background: none; + // Remove background from certain components + div.home, div.options-outer, div.options-container, section.filter-container, + section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn { + background: none; + } + // Style overides + .section-header h3 { font-size: 1.3rem; font-weight: bold; } + .content-inner { border-top: 1px dashed var(--primary); } + a.item.size-large:hover { border-left: 3px solid var(--white); } + .item.size-large .tile-title p.description { height: 3rem; } + .is-collapsed { + background: var(--item-background); + box-shadow: var(--item-shadow); + &:hover { + background: var(--item-background-hover); + box-shadow: var(--item-hover-shadow); + } + } +} + +html[data-theme="adventure"] { + // Background Image + body { + background: url('https://i.ibb.co/wdqSsGh/adventure-bg.jpg'); + background-size: cover; + } +} + diff --git a/src/styles/themes/_aurora.scss b/src/styles/themes/_aurora.scss new file mode 100644 index 0000000000..6f5a61aa73 --- /dev/null +++ b/src/styles/themes/_aurora.scss @@ -0,0 +1,58 @@ +/* Aurora โ€” deep-space indigo theme with cycling northern-lights accents. + * Each section takes on a different aurora hue (green, cyan, violet, pink, blue) + * with matching glow shadows, for a subtle rainbow without being gaudy. */ +html[data-theme='aurora'] { + --primary: #a3e4d7; + --background: #0c0e24; + --background-darker: #050617; + --item-group-background: #13152e; + --item-group-outer-background: #1b1f3d; + --item-background: #1b1f3d; + --item-background-hover: #282d52; + --item-shadow: 0 2px 4px #00000080; + --item-hover-shadow: 0 0 12px #a3e4d766; + + --heading-text-color: #e0cafc; + --item-text-color: #e8ecf4; + --item-text-color-hover: #ffffff; + --item-group-heading-text-color: #0c0e24; + --item-group-heading-text-color-hover: #0c0e24; + + --settings-background: #050617; + --settings-text-color: var(--primary); + --nav-link-text-color: #e8ecf4; + --nav-link-background-color: #13152e; + --nav-link-border-color: transparent; + --nav-link-border-color-hover: var(--primary); + + --search-container-background: #050617; + --search-field-background: #13152e; + --outline-color: #a3e4d7; + --highlight-background: #c4a7e7; + --highlight-color: #050617; + + --curve-factor: 6px; + + body, .home, #dashy { + background: radial-gradient(ellipse at top, #1b1f3d 0%, #0c0e24 55%, #050617 100%); + } + + .collapsable, .nav a.nav-item, .side-bar-section { + &:nth-child(1n) { --aurora: #58e3a6; } + &:nth-child(2n) { --aurora: #a3e4d7; } + &:nth-child(3n) { --aurora: #c4a7e7; } + &:nth-child(4n) { --aurora: #f5b5d8; } + &:nth-child(5n) { --aurora: #89a5ff; } + + --item-group-outer-background: var(--aurora); + --item-group-shadow: 0 4px 14px #00000099, inset 0 1px 0 var(--aurora); + --item-hover-shadow: 0 0 10px var(--aurora); + --item-text-color-hover: var(--aurora); + --nav-link-text-color-hover: var(--aurora); + --side-bar-item-color: var(--aurora); + } + + .item { border: 1px solid transparent; transition: border-color 0.2s ease; } + .item:hover { border-color: var(--aurora, var(--primary)); } + h1, h2, h3 { letter-spacing: 0.01em; } +} diff --git a/src/styles/themes/_bee.scss b/src/styles/themes/_bee.scss new file mode 100644 index 0000000000..9f55e6df80 --- /dev/null +++ b/src/styles/themes/_bee.scss @@ -0,0 +1,9 @@ +html[data-theme='bee'] { + --primary: #c3eb5c; + --background: #0b1021; + --item-background: #1c2636; + --item-group-background: var(--background); + --nav-link-background-color: var(--background); + --font-headings: 'Sniglet', cursive; +} + diff --git a/src/styles/themes/_blue-purple.scss b/src/styles/themes/_blue-purple.scss new file mode 100644 index 0000000000..4f5389b681 --- /dev/null +++ b/src/styles/themes/_blue-purple.scss @@ -0,0 +1,33 @@ +html[data-theme='blue-purple'] { + --primary: #54dbf8; + --background: #e5e8f5; + --background-darker: #5346f3; + --font-headings: 'Sniglet', cursive; + + --dimming-factor: 0.8; + --curve-factor: 6px; + + --settings-text-color: var(--background-darker); + --item-text-color: var(--background-darker); + --item-background: var(--white); + --item-background-hover: var(--primary); + + --item-group-heading-text-color: var(--background-darker); + --item-group-background: var(--background); + --footer-text-color: var(--white); + --context-menu-background: var(--white); + --context-menu-color: var(--background-darker); + --context-menu-secondary-color: var(--primary); + + .item { + box-shadow: none; + border: 1px solid var(--background-darker); + } + section.filter-container form label { + color: var(--primary); + } + footer { + color: var(--white); + } +} + diff --git a/src/styles/themes/_brutalist.scss b/src/styles/themes/_brutalist.scss new file mode 100644 index 0000000000..8b82912c9c --- /dev/null +++ b/src/styles/themes/_brutalist.scss @@ -0,0 +1,178 @@ +/* Brutalist โ€” thick black borders, hard offset shadows, flat saturated colors. + * Loud, confident, reads at a glance. */ +html[data-theme='brutalist'] { + --primary: #000000; + --background: #fffcf0; + --background-darker: #000000; + --item-group-background: #ffffff; + --item-group-outer-background: #000000; + --item-background: #ffffff; + --item-background-hover: #ffe156; + --item-shadow: 4px 4px 0 #000000; + --item-hover-shadow: 6px 6px 0 #ff006e; + --item-group-shadow: 6px 6px 0 #000000; + + --heading-text-color: #000000; + --item-text-color: #000000; + --item-text-color-hover: #ff006e; + --item-group-heading-text-color: #fffcf0; + --item-group-heading-text-color-hover: #ffe156; + + --settings-background: #fffcf0; + --settings-text-color: #fffcf0; + --nav-link-text-color: #fffcf0; + --nav-link-text-color-hover: #000000; + --nav-link-background-color: #000000; + --nav-link-background-color-hover: #ffe156; + --nav-link-border-color: #fffcf0; + --nav-link-border-color-hover: #000000; + + --search-container-background: #000000; + --search-field-background: #000000; + --search-label-color: #fffcf0; + --footer-background: #000000; + --footer-text-color: #fffcf0; + --footer-text-color-link: #ffe156; + + --config-settings-background: #000000; + --config-settings-color: #fffcf0; + --interactive-editor-background: #000000; + --interactive-editor-background-darker: #1a1a1a; + --interactive-editor-color: #fffcf0; + --welcome-popup-background: #000000; + --welcome-popup-text-color: #fffcf0; + --side-bar-background: #000000; + --side-bar-color: #fffcf0; + --status-check-tooltip-background: #000000; + --status-check-tooltip-color: #fffcf0; + --scroll-bar-color: #fffcf0; + --scroll-bar-background: #1a1a1a; + + --heading-text-color: #fffcf0; + --widget-background-color: #fffcf0; + --widget-text-color: #000000; + --widget-accent-color: #ff006e; + --description-tooltip-background: #000000; + --description-tooltip-color: #fffcf0; + --context-menu-background: #000000; + --context-menu-color: #fffcf0; + --context-menu-secondary-color: #ff006e; + --login-form-color: #000000; + --login-form-background: #fffcf0; + --login-form-background-secondary: #000000; + --loading-screen-background: #fffcf0; + --loading-screen-color: #000000; + + --minimal-view-background-color: #fffcf0; + --minimal-view-title-color: #000000; + --minimal-view-settings-color: #000000; + --minimal-view-section-heading-background: #000000; + --minimal-view-section-heading-color: #fffcf0; + --minimal-view-search-background: #000000; + --minimal-view-search-color: #fffcf0; + --minimal-view-group-background: #000000; + --minimal-view-group-color: #fffcf0; + + --dimming-factor: 1; + --outline-color: #ff006e; + --highlight-background: #ffe156; + --highlight-color: #000000; + --curve-factor: 0; + --curve-factor-navbar: 0; + --curve-factor-small: 0; + --font-headings: 'Francois One', Impact, sans-serif; + --font-body: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + + .item { + border: 3px solid #000000; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.02em; + } + .item:hover { border-color: #ff006e; } + + .collapsable, .nav a.nav-item { + &:nth-child(1n) { --index-color: #ffe156; } + &:nth-child(2n) { --index-color: #00e5ff; } + &:nth-child(3n) { --index-color: #ff006e; } + &:nth-child(4n) { --index-color: #b6ff00; } + &:nth-child(5n) { --index-color: #ff7a00; } + + --item-group-outer-background: var(--index-color); + --item-group-heading-text-color: #000000; + --item-group-shadow: 6px 6px 0 #000000; + } + + h1, h2, h3 { text-transform: uppercase; letter-spacing: 0.02em; font-weight: 700; } + + .context-menu li:hover:not(.section-title) { color: #000000; } + + .nav-outer nav .nav-item { + border-width: 2px; + box-shadow: 3px 3px 0 #fffcf0; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + transition: box-shadow 0.1s ease, transform 0.1s ease; + &:hover, &.router-link-active { + box-shadow: 5px 5px 0 #ff006e; + transform: translate(-1px, -1px); + } + } + + .options-panel { + .action-btn, .auth-btn, a.view-btn { + background: #000000; + color: #fffcf0; + border: 2px solid #fffcf0; + box-shadow: 3px 3px 0 #fffcf0; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + &:hover:not(:disabled), &:focus-visible { + background: #ffe156; + color: #000000; + border-color: #000000; + box-shadow: 5px 5px 0 #ff006e; + } + &.is-active { + background: #ffe156; + color: #000000; + border-color: #000000; + } + } + .view-switch-row { + background: transparent; + border: none; + padding: 0; + } + .display-options { + color: #fffcf0; + svg { + background: #000000; + border: 2px solid #fffcf0; + &:hover, &.selected { + background: #ffe156; + color: #000000; + border-color: #000000; + } + } + } + svg.color-button { + background: #000000; + border: 2px solid #fffcf0; + path { fill: #fffcf0; } + &:hover { + background: #ffe156; + border-color: #000000; + path { fill: #000000; } + } + } + .theme-dropdown div.vs__dropdown-toggle { + background: #000000; + border: 2px solid #fffcf0; + } + .theme-dropdown span.vs__selected, + .theme-dropdown svg.vs__open-indicator { color: #fffcf0; fill: #fffcf0; } + } +} diff --git a/src/styles/themes/_callisto.scss b/src/styles/themes/_callisto.scss new file mode 100644 index 0000000000..0f2cd6dbca --- /dev/null +++ b/src/styles/themes/_callisto.scss @@ -0,0 +1,12 @@ +html[data-theme='callisto'] { + --primary: #00CCB4; + --background: #141b33; + --background-darker: #060913; + --foreground: #dedede; + --item-group-background: #0b1021; + --item-background: var(--background); + --item-background-hover: var(--background-darker); + --item-hover-shadow: 0 1px 3px #00ccb4b3, 0 1px 2px #00ccb4bf; + --font-body: 'Inconsolata', 'Georgia', sans-serif; + --font-headings: 'PTMono', 'Courier New', monospace; +} diff --git a/src/styles/themes/_catppuccin.scss b/src/styles/themes/_catppuccin.scss new file mode 100644 index 0000000000..798479f708 --- /dev/null +++ b/src/styles/themes/_catppuccin.scss @@ -0,0 +1,56 @@ +/* Catppuccin Mocha โ€” soft pastel dark theme, community-adopted across modern + * dev tooling. Pastel accents rotate per section for gentle colour variation. */ +html[data-theme='catppuccin'] { + --primary: #cba6f7; + --background: #1e1e2e; + --background-darker: #11111b; + --item-group-background: #313244; + --item-group-outer-background: #313244; + --item-background: #181825; + --item-background-hover: #313244; + --item-shadow: 0 1px 2px #00000066; + --item-hover-shadow: 0 0 0 1px var(--primary); + + --heading-text-color: #cdd6f4; + --item-text-color: #cdd6f4; + --item-text-color-hover: #f5e0dc; + --item-group-heading-text-color: #1e1e2e; + --item-group-heading-text-color-hover: #1e1e2e; + + --settings-background: #181825; + --settings-text-color: #bac2de; + --nav-link-text-color: #bac2de; + --nav-link-text-color-hover: #cdd6f4; + --nav-link-background-color: #181825; + --nav-link-border-color: transparent; + --nav-link-border-color-hover: var(--primary); + + --search-container-background: #11111b; + --search-field-background: #313244; + --footer-background: #11111b; + --footer-text-color: #a6adc8; + --footer-text-color-link: var(--primary); + + --outline-color: var(--primary); + --highlight-background: #f5c2e7; + --highlight-color: #1e1e2e; + --curve-factor: 8px; + --font-body: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + --font-headings: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + + .collapsable, .nav a.nav-item { + &:nth-child(1n) { --index-color: #cba6f7; } + &:nth-child(2n) { --index-color: #89dceb; } + &:nth-child(3n) { --index-color: #a6e3a1; } + &:nth-child(4n) { --index-color: #fab387; } + &:nth-child(5n) { --index-color: #f5c2e7; } + &:nth-child(6n) { --index-color: #f38ba8; } + + --item-group-outer-background: var(--index-color); + --item-group-heading-text-color: #1e1e2e; + --nav-link-text-color-hover: var(--index-color); + --item-hover-shadow: 0 0 0 1px var(--index-color); + } + + h1, h2, h3 { font-weight: 500; letter-spacing: -0.005em; } +} diff --git a/src/styles/themes/_cherry-blossom.scss b/src/styles/themes/_cherry-blossom.scss new file mode 100644 index 0000000000..bf2c40c056 --- /dev/null +++ b/src/styles/themes/_cherry-blossom.scss @@ -0,0 +1,103 @@ +html[data-theme='cherry-blossom'] { + --primary: #e1e8ee; + --background: #11171d; + --background-darker: #070a0d; + --item-background: #00000040; + --widget-base-background: #00000040; + --widget-base-shadow: var(--item-shadow); + --item-background-hover: #ffffff1a; + --item-group-outer-background: none; + --item-group-background: none; + --item-group-shadow: 1px 1px 2px #080a0d; + --item-group-heading-text-color: var(--background); + --minimal-view-section-heading-color: var(--background-darker); + --minimal-view-group-background: #1b242d; + --minimal-view-group-color: none; + --heading-text-color: var(--background); + --nav-link-text-color: var(--background); + --nav-link-text-color-hover: var(--background); + --nav-link-border-color-hover: #11171d40; + --nav-link-background-color: #00000040; + + --search-container-background: none; + --search-field-background: var(--background-darker); + --font-headings: 'Cutive Mono', monospace; + + .collapsable, .side-bar-section, .workspace-widget, .minimal-section-heading, .minimal-section-inner { + &:nth-child(1n) { --top-color: #d7c1ed; --back-color: #2a2c37; } + &:nth-child(2n) { --top-color: #96cdfb; --back-color: #222e39; } + &:nth-child(3n) { --top-color: #b5e8e0; --back-color: #263135; } + &:nth-child(4n) { --top-color: #f28fad; --back-color: #2d262f; } + + --item-group-outer-background: var(--back-color); + --item-hover-shadow: 0 0 5px var(--top-color); + --side-bar-item-color: var(--top-color); + --minimal-view-section-heading-background: var(--top-color); + + .section-header { + background: var(--top-color); + padding: 0.5rem 0.25rem; + min-height: 1.5rem; + border-bottom-left-radius: var(--curve-factor) !important; + border-bottom-right-radius: var(--curve-factor) !important; + } + transition: all 0.2s ease-in-out 0s; + border: 1px solid #0000004d; + a.item p.description { + opacity: 0.75; + color: var(--top-color); + } + &.workspace-widget { + box-shadow: inset 0px 3px 1px var(--top-color), 1px 1px 5px #00000080; + } + } + header { + border-radius: 8px; + max-width: 1200px; + margin: 1rem auto 0 auto; + padding: 0.25rem; + justify-content: space-around; + background-image: linear-gradient(to right, #D7C1ED, #96CDFB, #B5E8E0, #F28FAD); + .subtitle { display: none; } + .page-titles img.site-logo { + margin-right: 0.5rem; + } + .nav-outer nav .nav-item { + padding: 0.5rem; + } + } + .settings-outer { + background: none; + max-width: 1200px; + margin: 0 auto; + } + .collapsable { + max-width: 1200px; + margin: 0.5rem auto; + } + .widget-base { + border-radius: var(--curve-factor); + margin: 0.5rem auto; + padding: 0.2rem; + } + .home .item-group-container { + gap: 0.5rem 1rem; + } + .item-icon svg { border-radius: 6px; } + .work-space nav.side-bar, .work-space .web-content iframe { + border-radius: 8px; + } + section.settings-outer.settings-hidden form { + width: 100%; + display: flex; + justify-content: center; + .search-wrap { + width: fit-content; + input { + margin-top: 1rem; + width: 400px; + } + } + } +} + diff --git a/src/styles/themes/_color-block.scss b/src/styles/themes/_color-block.scss new file mode 100644 index 0000000000..8d339988ea --- /dev/null +++ b/src/styles/themes/_color-block.scss @@ -0,0 +1,54 @@ +html[data-theme="color-block"] { + // Main colors + --primary: #E94560; + --background: #16213E; + --background-darker: #0e172b; + // Typography + --font-headings: 'Podkova', 'Roboto', serif; + --font-body: 'Roboto', serif; + // Items + --item-background: #1b294c; + --item-background-hover: var(--item-background); + --item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); + --item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black); + // Sections + --item-group-heading-text-color: var(--white); + --item-group-heading-text-color-hover: var(--primary); + --item-group-shadow: none; + --item-group-background: none; + --item-group-outer-background: none; + // Nav Links + --nav-link-background-color: var(--background); + --nav-link-background-color-hover: var(--background); + --nav-link-border-color: transparent; + --nav-link-border-color-hover: transparent; + --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); + --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black); + // Misc + --curve-factor: 4px; + --curve-factor-navbar: 8px; + + --widget-text-color: var(--white); + + // Style overrides + .section-header h3 { font-size: 1.3rem; font-weight: bold; } + .content-inner { border-top: 1px dashed var(--primary); } + .item.size-large .tile-title p.description { height: 3rem; } + .item, .nav-outer nav .nav-item { border-radius: 0; } + .item.size-large { margin: 0.5rem; } + // Show outline when collapsed + .is-collapsed { + background: var(--item-background); + box-shadow: var(--item-shadow); + &:hover { + background: var(--item-background-hover); + box-shadow: var(--item-hover-shadow); + } + } + .widget-base { + background: var(--background-darker); + padding: 1rem 0.5rem; + margin: 0.5rem 0; + } +} + diff --git a/src/styles/themes/_colorful.scss b/src/styles/themes/_colorful.scss new file mode 100644 index 0000000000..06c12d154e --- /dev/null +++ b/src/styles/themes/_colorful.scss @@ -0,0 +1,48 @@ +html[data-theme='colorful'] { + --font-headings: 'Podkova', monospace; + --primary: #e8eae1; + --background: #0b1021; + --background-darker: #05070e; + --item-background: var(--background-darker); + --item-background-hover: var(--background); + --item-group-background: transparent; + --item-group-outer-background: var(--background-darker); + --item-group-heading-text-color: var(--primary); + --item-group-heading-text-color-hover: var(--primary); + --item-hover-shadow: 1px 4px 6px var(--black); + --nav-link-background-color: var(--background); + --outline-color: none; + + .item-wrapper, .sub-item-wrapper { + &:nth-child(1n) .item { --current-color: #eb5cad; } + &:nth-child(2n) .item { --current-color: #985ceb; } + &:nth-child(3n) .item { --current-color: #5c90eb; } + &:nth-child(4n) .item { --current-color: #5cdfeb; } + &:nth-child(5n) .item { --current-color: #5ceb8d; } + &:nth-child(6n) .item { --current-color: #afeb5c; } + &:nth-child(7n) .item { --current-color: #ebb75c; } + &:nth-child(8n) .item { --current-color: #eb615c; } + .item { + color: var(--current-color); + border: 1px solid var(--current-color); + &:hover, &:focus { + opacity: 0.85; + outline: none; + background: currentColor; + span.text, p.description { color: var(--background-darker); } + i.fas, i.fab, i.far, i.fal, i.fad { + filter: drop-shadow(1px 3px 2px var(--transparent-50)); + color: var(--background-darker); + } + svg path { fill: var(--background-darker); } + } + } + } + h1, h2, h3, h4 { + font-weight: normal; + } + div.context-menu { + border-color: var(--primary); + } +} + diff --git a/src/styles/themes/_crayola.scss b/src/styles/themes/_crayola.scss new file mode 100644 index 0000000000..20b51fff44 --- /dev/null +++ b/src/styles/themes/_crayola.scss @@ -0,0 +1,26 @@ +html[data-theme='crayola'] { + --primary: #7fd8e7; + --background: #191d2e; + --background-darker: #070912; + --font-headings: 'Sniglet', cursive; + --curve-factor: 8px; + --nav-link-border-color-hover: transparent; + .collapsable, .nav a.nav-item { + &:nth-child(1n) { --index-color: #9b5de5; } + &:nth-child(2n) { --index-color: #f15bb5; } + &:nth-child(3n) { --index-color: #fee440; } + &:nth-child(4n) { --index-color: #00bbf9; } + &:nth-child(5n) { --index-color: #00f5d4; } + --item-group-outer-background: var(--index-color); + --item-text-color: var(--index-color); + --widget-text-color: var(--index-color); + --primary: var(--index-color); + --item-group-shadow: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; + --item-hover-shadow: 0 0 2px var(--index-color); + --item-text-color-hover: var(--index-color); + --nav-link-text-color-hover: var(--index-color); + --nav-link-shadow-hover: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; + .item:hover { background: var(--index-color); color: var(--background); } + } +} + diff --git a/src/styles/themes/_cyberpunk.scss b/src/styles/themes/_cyberpunk.scss new file mode 100644 index 0000000000..c1acb817b6 --- /dev/null +++ b/src/styles/themes/_cyberpunk.scss @@ -0,0 +1,34 @@ + html[data-theme='cyberpunk'] { +--pink: #ff2a6d; +--pale: #d1f7ff; +--aqua: #05d9e8; +--teal: #005678; +--blue: #01012b; +--gold: #ebeb0f; + +--primary: var(--gold); +--background: var(--blue); +--background-darker: var(--pink); +--heading-text-color: var(--blue); +--nav-link-background-color: var(--blue); +--nav-link-background-color-hover: var(--blue); +--nav-link-text-color: var(--pink); +--nav-link-text-color-hover: var(--gold); +--nav-link-border-color-hover: var(--blue); +--config-settings-background: var(--blue); +--config-settings-color: var(--pink); +--interactive-editor-background: var(--blue); +--interactive-editor-background-darker: var(--blue); +--interactive-editor-color: var(--pink); +--search-label-color: var(--blue); +--item-group-background: var(--blue); +--item-text-color: var(--pale); +--scroll-bar-color: var(--aqua); +--scroll-bar-background: var(--teal); +--footer-background: var(--aqua); +--welcome-popup-background: var(--pink); +--welcome-popup-text-color: var(--blue); +--status-check-tooltip-background: var(--blue); +--description-tooltip-background: var(--blue); +--font-headings: 'Audiowide', cursive; +} diff --git a/src/styles/themes/_dashy-docs.scss b/src/styles/themes/_dashy-docs.scss new file mode 100644 index 0000000000..15d6d08f24 --- /dev/null +++ b/src/styles/themes/_dashy-docs.scss @@ -0,0 +1,138 @@ +html[data-theme="dashy-docs"] { + // Base + --primary: #f5f6f7; + --background: #202020; + --background-darker: #121212; + // Items + --item-background: var(--background); + --item-background-hover: var(--background); + --item-text-color: var(--primary); + // Sections + --item-group-background: none; + --item-group-outer-background: var(--background-darker); + --item-group-heading-text-color: var(--background); + --item-group-heading-text-color-hover: var(--background); + // Misc + --item-group-padding: 0; + --curve-factor: 3px; + --curve-factor-navbar: 6px; + --item-shadow: 4px 4px 6px #00000080, -2px -2px 4px rgb(0 0 0 / 40%); + --item-group-shadow: 0px 3px 2px #222222, 0px 0px 2px #3e3e3e; + --font-headings: 'PTMono', 'Courier New', monospace; + --minimal-view-section-heading-color: var(--background); + // Navbar Links + --nav-link-background-color-hover: none; + --nav-link-border-color-hover: none; + --nav-link-text-color: var(--background); + --nav-link-text-color-hover: var(--background-darker); + + footer { + box-shadow: 0 -3px 4px #010101; + } + + section.settings-outer form input { + box-shadow: 1px 2px 4px #0b0b0b; + } + + @mixin make-colors($first, $second) { + background: $first; box-shadow: 0 4px $second; + &:hover { box-shadow: 0 2px $second; } + } + // Section headings, nav bar items and minimal tabs + div.collapsable:nth-child(1n) .section-header, + .minimal-section-heading:nth-child(1n), + a.nav-item:nth-child(1n) { + @include make-colors(#db78fc, #b83ddd); + --nav-link-background-color-hover: #db78fc; + --nav-link-border-color-hover: #db78fc; + } + div.collapsable:nth-child(2n) .section-header, + .minimal-section-heading:nth-child(2n), + a.nav-item:nth-child(2n) { + @include make-colors(#5c85f7, #3d48dd); + --nav-link-background-color-hover: #5c85f7; + --nav-link-border-color-hover: #5c85f7; + } + div.collapsable:nth-child(3n) .section-header, + .minimal-section-heading:nth-child(3n), + a.nav-item:nth-child(3n) { + @include make-colors(#41ef90, #1e9554); + --nav-link-background-color-hover: #41ef90; + --nav-link-border-color-hover: #41ef90; + } + div.collapsable:nth-child(4n) .section-header, + .minimal-section-heading:nth-child(4n), + a.nav-item:nth-child(4n) { + @include make-colors(#dcff5a, #ceb73f); + --nav-link-background-color-hover: #dcff5a; + --nav-link-border-color-hover: #dcff5a; + } + + nav.side-bar { + div div.side-bar-item-container div { + padding: 0.15rem 0; + color: var(--background); + } + + div.side-bar-section:nth-child(1n) { + div.side-bar-item-container div.side-bar-item { + @include make-colors(#db78fc, #b83ddd); + } + .sub-side-bar { background: #b83ddd80; } + } + div.side-bar-section:nth-child(2n) { + div.side-bar-item-container div.side-bar-item { + @include make-colors(#5c85f7, #3d48dd); + } + .sub-side-bar { background: #3d48dd80; } + } + div.side-bar-section:nth-child(3n) { + div.side-bar-item-container div.side-bar-item { + @include make-colors(#41ef90, #1e9554); + } + .sub-side-bar { background: #1e955480; } + } + div.side-bar-section:nth-child(4n) { + div.side-bar-item-container div.side-bar-item { + @include make-colors(#dcff5a, #ceb73f); + } + .sub-side-bar { background: #ceb73f80; } + } + } + + // Section items + div.collapsable:nth-child(1n) { .item-wrapper:hover { .item {box-shadow: 0 2px 3px #db78fc; .tile-title { color: #db78fc; } } } } + div.collapsable:nth-child(2n) { .item-wrapper:hover { .item { box-shadow: 0 2px 3px #5c85f7; .tile-title { color: #5c85f7; } } } } + div.collapsable:nth-child(3n) { .item-wrapper:hover { .item { box-shadow: 0 2px 3px #41ef90; .tile-title { color: #41ef90; } } } } + div.collapsable:nth-child(4n) { .item-wrapper:hover { .item { box-shadow: 0 2px 3px #dcff5a; .tile-title { color: #dcff5a; } } } } + + + div.config-buttons { + .config-button { + border: none; + color: var(--background); + font-weight: bold; + svg path { fill: var(--background); } + &:nth-child(4n + 1) { @include make-colors(#db78fc, #b83ddd); } + &:nth-child(4n + 2) { @include make-colors(#41ef90, #1e9554); } + &:nth-child(4n + 3) { @include make-colors(#5c85f7, #3d48dd); } + &:nth-child(4n + 4) { @include make-colors(#dcff5a, #ceb73f); } + } + } + + a.nav-item, a.nav-item:hover, a.nav-item.router-link-active { + border: none; + color: var(--background); + font-weight: bold; + min-width: 5rem; + text-align: center; + } + + .minimal-section-heading { + border: none !important; + &.selected { + background: var(--primary) !important; + } + } +} + diff --git a/src/styles/themes/_dracula.scss b/src/styles/themes/_dracula.scss new file mode 100644 index 0000000000..5762cf9678 --- /dev/null +++ b/src/styles/themes/_dracula.scss @@ -0,0 +1,39 @@ +html[data-theme='dracula'] { + --font-headings: 'Shrikhand', sans-serif; + --primary: #98ace9; + --background: #44475a; + --background-darker: #282a36; + --item-group-background: var(--background-darker); + --item-background: var(--background-darker); + --item-background-hover: #191b22; + --item-shadow: 1px 1px 3px #000000e6; + --item-hover-shadow: none; + --settings-text-color: var(--primary); + --config-settings-color: var(--primary); + --nav-link-background-color: var(--background); + --nav-link-border-color: none; + --nav-link-border-color-hover: none; + --item-group-outer-background: var(--background-darker); + --login-form-background: var(--background-darker); + .item { border: 1px solid var(--primary); } + h1, h2, h3 { font-weight: normal; } + + .collapsable, .nav a.nav-item { + &:nth-child(1n) { --index-color: #8be9fd; } + &:nth-child(2n) { --index-color: #50fa7b; } + &:nth-child(3n) { --index-color: #ffb86c; } + &:nth-child(4n) { --index-color: #ff79c6; } + &:nth-child(5n) { --index-color: #bd93f9; } + + --item-group-heading-text-color: var(--index-color); + --item-group-heading-text-color-hover: var(--index-color); + --item-group-shadow: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; + --item-hover-shadow: 0 0 2px var(--index-color); + --item-text-color-hover: var(--index-color); + --nav-link-text-color-hover: var(--index-color); + --nav-link-shadow-hover: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; + + .item:hover { border-color: var(--index-color); } + } +} + diff --git a/src/styles/themes/_flat-themes.scss b/src/styles/themes/_flat-themes.scss new file mode 100644 index 0000000000..0121d1fc4b --- /dev/null +++ b/src/styles/themes/_flat-themes.scss @@ -0,0 +1,111 @@ +html[data-theme='basic'], +html[data-theme='whimsy'], +html[data-theme='argon'], +html[data-theme='deep-ocean'], +html[data-theme='fallout'] { + --primary: #aabbc3; + --secondary: #aabbc3; + --item-background: none; + --outline-color: none; + --item-shadow: none; + --item-hover-shadow: 2px 3px 5px var(--background-darker); + --item-text-color-hover: var(--secondary); + --item-group-background: none; + --item-group-outer-background: none; + --item-group-heading-text-color: var(--primary); + --item-group-heading-text-color-hover: var(--secondary); + --nav-link-shadow: none; + --nav-link-border-color: transparent; + --nav-link-background-color: none; + --nav-link-shadow-hover: none; + --nav-link-border-color-hover: var(--secondary); + --nav-link-background-color-hover: none; + --font-body: 'Roboto', serif; + --curve-factor-navbar: 10px; + + /* Use secondary color for item description */ + .tile-title p.description { + color: var(--secondary); + } + /* Add line to bottom of settings row */ + section.settings-outer { + .options-container { + border-top: var(--accent-line-width, 1px) solid var(--secondary); + } + form.normal { + border-bottom: var(--accent-line-width, 1px) solid var(--secondary); + border-right: var(--accent-line-width, 1px) solid var(--secondary); + margin-top: 0.5rem; + } + } + /* Display line between sections (depending on orientation) */ + .orientation-horizontal .collapsable { + border-radius: 1px; + &:not(:last-child) { border-bottom: var(--accent-line-width, 1px) solid var(--secondary); } + } + .orientation-vertical .collapsable { + border-radius: 1px; + &:not(:last-child) { border-right: var(--accent-line-width, 1px) solid var(--secondary); } + } + .orientation-auto .collapsable .collapsible-content { + border-top: var(--accent-line-width, 1px) solid var(--secondary); + } +} + +html[data-theme='fallout'] { + --primary: #aabbc3; + --background: #263238; + --background-darker: #1f282c; + --secondary: #ade900cc; +} + +html[data-theme='whimsy'] { + --primary: #aabbc3; + --background: #232138; + --background-darker: #161529; + --secondary: #ed597c; + --item-background-hover: #49476d; + --accent-line-width: 2px; + --curve-factor: 4px; +} + +html[data-theme='deep-ocean'] { + --primary: #aabbc3; + --background: #151e2d; + --background-darker: #151c29; + --secondary: #4afcffb3; + --item-background-hover: #4afcff40; + --accent-line-width: 1px; + --curve-factor: 4px; + .home, .options-container { + background-color: #151e2d; + background-image: url("data:image/svg+xml,%3Csvg width='100' height='20' viewBox='0 0 100 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.184 20c.357-.13.72-.264 1.088-.402l1.768-.661C33.64 15.347 39.647 14 50 14c10.271 0 15.362 1.222 24.629 4.928.955.383 1.869.74 2.75 1.072h6.225c-2.51-.73-5.139-1.691-8.233-2.928C65.888 13.278 60.562 12 50 12c-10.626 0-16.855 1.397-26.66 5.063l-1.767.662c-2.475.923-4.66 1.674-6.724 2.275h6.335zm0-20C13.258 2.892 8.077 4 0 4V2c5.744 0 9.951-.574 14.85-2h6.334zM77.38 0C85.239 2.966 90.502 4 100 4V2c-6.842 0-11.386-.542-16.396-2h-6.225zM0 14c8.44 0 13.718-1.21 22.272-4.402l1.768-.661C33.64 5.347 39.647 4 50 4c10.271 0 15.362 1.222 24.629 4.928C84.112 12.722 89.438 14 100 14v-2c-10.271 0-15.362-1.222-24.629-4.928C65.888 3.278 60.562 2 50 2 39.374 2 33.145 3.397 23.34 7.063l-1.767.662C13.223 10.84 8.163 12 0 12v2z' fill='%231a3f57' fill-opacity='0.18' fill-rule='evenodd'/%3E%3C/svg%3E"); + } +} + +html[data-theme='argon'] { + --primary: #aabbc3; + --background: #15131f; + --background-darker: #0c0a11; + --nav-link-border-color-hover: transparent; + .collapsable, .nav a.nav-item { + &:nth-child(1n) { --index-color: #fd7293; } + &:nth-child(2n) { --index-color: #2af9ae; } + &:nth-child(3n) { --index-color: #fff874; } + &:nth-child(4n) { --index-color: #21c0fc; } + &:nth-child(5n) { --index-color: #dd98fb; } + &:nth-child(6n) { --index-color: #89ccfc; } + --secondary: var(--index-color); + --item-group-heading-text-color: var(--index-color); + // --item-text-color: var(--index-color); + --widget-text-color: var(--index-color); + --primary: var(--index-color); + --item-text-color-hover: var(--index-color); + --nav-link-text-color-hover: var(--index-color); + --nav-link-shadow-hover: inset 0 2px 1px var(--index-color), 1px 1px 2px #000000cc; + .item:hover { + background: var(--index-color); + color: var(--background); + p.description { color: var(--background); }} + } +} diff --git a/src/styles/themes/_glass.scss b/src/styles/themes/_glass.scss new file mode 100644 index 0000000000..d393aea96b --- /dev/null +++ b/src/styles/themes/_glass.scss @@ -0,0 +1,230 @@ +html[data-theme='glass'], +html[data-theme='glass-2'], +html[data-theme='neomorphic'] { + --primary: #fff; + --item-group-outer-background: rgba(0, 0, 0, 0.25); + --item-group-background: transparent; + --item-group-heading-text-color: #fff; + --item-group-heading-text-color-hover: #ffffffd6; + --item-group-shadow: 5px 2px 20px rgba(0, 0, 0, 0.5); + --background: #190842; + --background-darker: #190842; + --settings-background: transparent; + --search-container-background: transparent; + --font-headings: 'Segoe UI', 'Ariel', 'sans-serif'; + --font-body: 'Roboto', 'Segoe UI', 'Ariel', 'sans-serif'; + --minimal-view-background-color: transparent; + --minimal-view-group-background: rgba(255, 255, 255, 0.15); + --minimal-view-section-heading-background: rgba(255, 255, 255, 0.15); + --minimal-view-section-heading-color: rgba(255, 255, 255, 0.15); + --config-settings-background: #16073de3; + --cloud-backup-background: #16073de3; + + @mixin item-transition-styles($bg: transparent, $hover-bg: rgba(255, 255, 255, 0.15), $hover-shadow: rgba(0, 0, 0, 0.75)) { + background: $bg; + border: 1px solid transparent; + box-shadow: none; + transition: 0.2s all ease-in-out; + + &:hover { + border-radius: 0.35rem; + box-shadow: 0 4px 30px $hover-shadow; + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.19); + background: $hover-bg; + } + } + + @mixin transform-scale($normal-scale: 1, $hover-scale: 1.25) { + transition: 0.1s all ease-in-out; + transform: scale($normal-scale); + + &:hover { + transform: scale($hover-scale); + } + } + + body { + background-size: cover; + background-color: #090317; + .home { + background: transparent; + } + } + + .settings-outer, header, .dashy-modal, .dashy-modal .tabs { + background: transparent; + // backdrop-filter: blur(4px); + } + + // Minimal view components + .minimal-section-inner, div.minimal-section-heading { + backdrop-filter: blur(10px); + border: 1px solid rgba(145, 145, 145, 0.45); + border-bottom: none; + + &.selected { + border: 1px solid rgba(145, 145, 145, 0.45); + background: var(--minimal-view-group-background); + } + } + + .minimal-section-heading { + color: var(--minimal-view-section-heading-background); + + &.selected { + .section-icon, .section-title { + color: var(--primary) !important; + } + } + } + + --glass-button-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); + --glass-button-hover-shadow: 2px 2px 5px rgba(0, 0, 0, 0.7); + + // Forms and inputs + button.save-button, + .action-buttons button, + .cloud-backup-restore-wrapper button, + .tab__nav__item, + div.input-container input.input-field, + form.normal input, + .nav-outer nav .nav-item, + div.edit-mode-bottom-banner .edit-banner-section button, + .v-select.theme-dropdown.vs__dropdown-toggle, + .theme-dropdown div.vs__dropdown-toggle, + .config-buttons > svg, + .display-options svg, + form.minimal input, + .critical-error-wrap button.user-doesnt-care, + a.config-button, button.config-button { + border-radius: 0.35rem; + box-shadow: var(--glass-button-shadow); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.19); + background: rgba(255, 255, 255, 0.15); + transition: all 0.2s ease-in-out; + text-decoration: none; + &:hover, &.selected { + box-shadow: var(--glass-button-hover-shadow); + border: 1px solid rgba(255, 255, 255, 0.25) !important; + background: #ffffff42 !important; + color: var(--primary) !important; + path { fill: var(--primary); } + } + } + + .tab__nav__items { + gap: 1rem; + margin: 0.5rem 0 0; + .tab__nav__item { + padding: 0.5rem 0.5rem; + &:hover, .active, .active:hover { + background: #ffffff42 !important; + span { color: var(--primary) !important; } + } + } + } + + .main-options-container .config-buttons, div.cloud-backup-restore-wrapper { + background: none; + } + + // Item and collapsable specific styles + .item { + @include item-transition-styles(transparent, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.75)); + .item-icon { + @include transform-scale(1.1, 1.25); + } + } + + .collapsable { + border-radius: 0.5rem; + border: 1px solid rgba(0, 0, 0, 0.45); + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); + } + + // Modal specific styles + .dashy-modal { + box-shadow: 0 20px 40px -2px #000000b8, 1px 1px 6px #000000a6 !important; + } + + .tab-item { + background: var(--config-settings-background); + } + + .theme-configurator-wrapper, .view-switcher { + backdrop-filter: blur(10px); + background: var(--config-settings-background); + border: 1px solid rgba(255, 255, 255, 0.19); + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); + } + + .edit-mode-top-banner { + backdrop-filter: blur(10px); + background: #ffffff6b; + border-bottom: 1px solid black; + + span { color: #eaff9d; } + } + + div.edit-mode-bottom-banner, .add-new-section { + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(50px); + } + + .critical-error-wrap { + backdrop-filter: blur(15px); + background: #0f0528c4; + } +} + +html[data-theme='glass'] { + body { + background: url('https://zeabur.com/images/bg.png') center center no-repeat; + background-size: cover; + background-color: #090317; + .home { + background: transparent; + } + } +} + +html[data-theme='glass-2'] { + body { + background: url('https://i.ibb.co/FnLH6bj/dashy-glass.jpg') center center no-repeat; + background-size: cover; + background-color: #090317; + } +} + +html[data-theme='neomorphic'] { + --primary: #fff; + --item-group-outer-background: rgba(255, 255, 255, 0.15); + --item-group-background: transparent; + --item-group-heading-text-color: #fff; + --item-group-shadow: 5px 2px 20px rgba(0, 0, 0, 0.5); + --background: #5b56f7; + // --background: #4bdbfd; + --background-darker: #12103c; + --settings-background: transparent; + --search-container-background: transparent; + --font-headings: 'Segoe UI', 'Ariel', 'sans-serif'; + --font-body: 'Roboto', 'Segoe UI', 'Ariel', 'sans-serif'; + --minimal-view-background-color: transparent; + --minimal-view-group-background: rgba(255, 255, 255, 0.15); + --minimal-view-section-heading-background: rgba(255, 255, 255, 0.15); + --minimal-view-section-heading-color: rgba(255, 255, 255, 0.15); + --config-settings-background: #1fb8f4e3; + --cloud-backup-background: #16073de3; + + --glass-button-shadow: 0px 1px 5px rgba(0, 0, 0, 0.5); + --glass-button-hover-shadow: 2px 2px 5px rgba(0, 0, 0, 0.7); + body { + background: var(--background); + } + .item:hover { box-shadow: 0 3px 10px rgba(0, 0, 0, 0.5); } + .collapsable { border: 1px solid rgba(255, 255, 255, 0.25) !important; } +} + + diff --git a/src/styles/themes/_glow.scss b/src/styles/themes/_glow.scss new file mode 100644 index 0000000000..adff70f891 --- /dev/null +++ b/src/styles/themes/_glow.scss @@ -0,0 +1,183 @@ +html[data-theme='glow'], html[data-theme=glow-colorful] { + --primary: #5c6da9; + --background: #f6f6f6; + --background-darker: var(--white); + --curve-factor: 12px; + --item-group-background: var(--white); + --item-group-outer-background: var(--white); + --item-background: var(--white); + --font-headings: 'Sniglet', cursive; + + --item-group-heading-text-color: var(--primary); + --item-group-heading-text-color-hover: var(--primary); + --item-group-shadow: 0 5px 16px 0 #9f72ff33; + --item-background-hover: var(--white); + --item-shadow: 0 1px 5px 0 #8656ef80; + --item-hover-shadow: 0 1px 8px 0 #8656efa6; + --item-icon-transform: drop-shadow(1px 2px 3px var(--transparent-50)) saturate(0.95); + --item-icon-transform-hover: drop-shadow(1px 2px 4px var(--transparent-50)) saturate(0.95); + --footer-height: 120px; + --transparent-50: #cfcfcf80; + header { + padding: 0.5rem; + .page-titles{ + h1 { + font-size: 1.8rem; + } + span.subtitle { + font-size: 0.8rem; + text-shadow: none; + + } + } + .nav .nav-item { + padding: 0.2rem 0.4rem; + box-shadow: none; + } + } + .settings-outer { + box-shadow: 0 4px 5px 0 #8656ef1a; + .options-container { + padding: 0.25rem 1.5rem 0.25rem 1rem; + background: var(--background-darker); + } + } + footer { + box-shadow: 0 -4px 5px 0 #8656ef1a; + } + .search-wrap input { + box-shadow: 0 1px 5px 0 #8656ef80; + } + div.collapsable:nth-child(1n) { + a.item { color: #5213dc; } + --item-group-shadow: 0 5px 16px 0 #9f72ff33; + --item-group-heading-text-color: #8656ef; + --item-group-heading-text-color-hover: #783cfb; + --item-background-hover: var(--white); + --item-shadow: 0 1px 5px 0 #8656ef80; + --item-hover-shadow: 0 1px 8px 0 #8656efa6; + --item-icon-transform: drop-shadow(1px 2px 3px #8656ef80) saturate(0.95); + --item-icon-transform-hover: drop-shadow(1px 2px 4px #8656ef80) saturate(0.95); + } + div.collapsable:nth-child(2n) { + a.item { color: #b514d8; } + --item-group-shadow: 0 5px 16px 0 #728cff33; + --item-group-heading-text-color: #d356ef; + --item-group-heading-text-color-hover: #d73bf9; + --item-background-hover: var(--white); + --item-shadow: 0 1px 5px 0 #d356ef80; + --item-hover-shadow: 0 1px 8px 0 #d356efa6; + --item-icon-transform: drop-shadow(1px 2px 3px #d356ef80) saturate(0.95); + --item-icon-transform-hover: drop-shadow(1px 2px 4px #d356ef80) saturate(0.95); + } + div.collapsable:nth-child(3n) { + a.item { color: #07b9d0; } + --item-group-shadow: 0 5px 16px 0 #728cff33; + --item-group-heading-text-color: #56ddef; + --item-group-heading-text-color-hover: #3cdefb; + --item-background-hover: var(--white); + --item-shadow: 0 1px 5px 0 #56ddef80; + --item-hover-shadow: 0 1px 8px 0 #56ddefa6; + --item-icon-transform: drop-shadow(1px 2px 3px #56ddef80) saturate(0.95); + --item-icon-transform-hover: drop-shadow(1px 2px 4px #56ddef80) saturate(0.95); + } +} + +html[data-theme='glow-dark'] { + --primary: #8faeff; + --background: #11111b; + --background-darker: #0a0a0f; + --curve-factor: 12px; + --item-group-background: #1b1b29; + --item-group-outer-background: #171724; + --item-background: #1d1d2b; + --font-headings: 'Sniglet', cursive; + + --item-group-heading-text-color: var(--primary); + --item-group-heading-text-color-hover: #a0bfff; + --item-group-shadow: 0 5px 16px 0 #5c6da933; + --item-background-hover: #33334d; + --item-shadow: 0 1px 5px 0 #5c6da980; + --item-hover-shadow: 0 1px 8px 0 #5c6da9a6; + --item-icon-transform: drop-shadow(1px 2px 3px var(--transparent-50)) saturate(1.1); + --item-icon-transform-hover: drop-shadow(1px 2px 4px var(--transparent-50)) saturate(1.1); + --footer-height: 120px; + --transparent-50: #00000080; + + header { + padding: 0.5rem; + background: var(--background-darker); + .page-titles { + h1 { + font-size: 1.8rem; + color: var(--primary); + } + span.subtitle { + font-size: 0.8rem; + color: #ccc; + text-shadow: none; + } + } + .nav .nav-item { + padding: 0.2rem 0.4rem; + box-shadow: none; + color: #ddd; + } + } + + .settings-outer { + box-shadow: 0 4px 5px 0 #5c6da91a; + .options-container { + padding: 0.25rem 1.5rem 0.25rem 1rem; + background: var(--background-darker); + } + } + + footer { + background: var(--background-darker); + box-shadow: 0 -4px 5px 0 #5c6da91a; + } + + .search-wrap input { + background: #2a2a3d; + color: #eee; + box-shadow: 0 1px 5px 0 #5c6da980; + } + + div.collapsable:nth-child(1n) { + a.item { color: #a88bff; } + --item-group-shadow: 0 5px 16px 0 #9f72ff33; + --item-group-heading-text-color: #bfa2ff; + --item-group-heading-text-color-hover: #cbb8ff; + --item-background-hover: #3a3a55; + --item-shadow: 0 1px 5px 0 #8656ef80; + --item-hover-shadow: 0 1px 8px 0 #8656efa6; + --item-icon-transform: drop-shadow(1px 2px 3px #8656ef80) saturate(1.1); + --item-icon-transform-hover: drop-shadow(1px 2px 4px #8656ef80) saturate(1.1); + } + + div.collapsable:nth-child(2n) { + a.item { color: #e58fff; } + --item-group-shadow: 0 5px 16px 0 #728cff33; + --item-group-heading-text-color: #eaaaff; + --item-group-heading-text-color-hover: #f0c2ff; + --item-background-hover: #3a3a55; + --item-shadow: 0 1px 5px 0 #d356ef80; + --item-hover-shadow: 0 1px 8px 0 #d356efa6; + --item-icon-transform: drop-shadow(1px 2px 3px #d356ef80) saturate(1.1); + --item-icon-transform-hover: drop-shadow(1px 2px 4px #d356ef80) saturate(1.1); + } + + div.collapsable:nth-child(3n) { + a.item { color: #56e0f0; } + --item-group-shadow: 0 5px 16px 0 #728cff33; + --item-group-heading-text-color: #7feeff; + --item-group-heading-text-color-hover: #a0f5ff; + --item-background-hover: #3a3a55; + --item-shadow: 0 1px 5px 0 #56ddef80; + --item-hover-shadow: 0 1px 8px 0 #56ddefa6; + --item-icon-transform: drop-shadow(1px 2px 3px #56ddef80) saturate(1.1); + --item-icon-transform-hover: drop-shadow(1px 2px 4px #56ddef80) saturate(1.1); + } +} + diff --git a/src/styles/themes/_gruvbox.scss b/src/styles/themes/_gruvbox.scss new file mode 100644 index 0000000000..49d9a58ab5 --- /dev/null +++ b/src/styles/themes/_gruvbox.scss @@ -0,0 +1,38 @@ +/* Gruvbox โ€” warm retro dark theme with sepia greens, reds and ochres. + * Inspired by the classic Gruvbox palette, well-loved in developer circles. */ +html[data-theme='gruvbox'] { + --primary: #fabd2f; + --background: #282828; + --background-darker: #1d2021; + --item-group-background: #3c3836; + --item-group-outer-background: #504945; + --item-background: #32302f; + --item-background-hover: #504945; + --item-shadow: 1px 1px 2px #00000080; + --item-hover-shadow: 2px 3px 6px #000000b3; + --heading-text-color: #fabd2f; + --item-text-color: #ebdbb2; + --item-text-color-hover: #fbf1c7; + --item-group-heading-text-color: #1d2021; + --settings-text-color: var(--primary); + --nav-link-text-color: #ebdbb2; + --nav-link-background-color: #3c3836; + --nav-link-border-color: transparent; + --nav-link-border-color-hover: var(--primary); + --outline-color: var(--primary); + --curve-factor: 4px; + + .collapsable, .nav a.nav-item { + &:nth-child(1n) { --index-color: #fb4934; } + &:nth-child(2n) { --index-color: #b8bb26; } + &:nth-child(3n) { --index-color: #83a598; } + &:nth-child(4n) { --index-color: #d3869b; } + &:nth-child(5n) { --index-color: #8ec07c; } + &:nth-child(6n) { --index-color: #fe8019; } + + --item-group-outer-background: var(--index-color); + --item-group-heading-text-color: #1d2021; + --nav-link-text-color-hover: var(--index-color); + --item-hover-shadow: 0 0 4px var(--index-color); + } +} diff --git a/src/styles/themes/_hacker-girl.scss b/src/styles/themes/_hacker-girl.scss new file mode 100644 index 0000000000..a797f3588e --- /dev/null +++ b/src/styles/themes/_hacker-girl.scss @@ -0,0 +1,10 @@ +html[data-theme='hacker-girl'] { + --background: var(--black); + --background-darker: var(--black); + --primary: #e435f1; + --outline-color: var(--primary); + --curve-factor: 0px; + --font-body: 'Cutive Mono', monospace; + --font-headings: 'VT323', monospace; +} + diff --git a/src/styles/themes/_high-contrast.scss b/src/styles/themes/_high-contrast.scss new file mode 100644 index 0000000000..e119abdccb --- /dev/null +++ b/src/styles/themes/_high-contrast.scss @@ -0,0 +1,23 @@ +html[data-theme='high-contrast-light'] { + --primary: var(--black); + --background: var(--white); + --background-darker: var(--white); + --item-group-background: var(--background-darker); + --item-background: var(--background); + --outline-color: var(--primary); + --curve-factor: 0px; + --config-code-color: var(--primary); + --font-headings: 'PTMono', 'Courier New', monospace; +} + +html[data-theme='high-contrast-dark'] { + --primary: var(--white); + --background: var(--black); + --background-darker: var(--black); + --item-group-background: var(--background-darker); + --item-background: var(--background); + --outline-color: var(--primary); + --curve-factor: 0px; + --font-headings: 'PTMono', 'Courier New', monospace; +} + diff --git a/src/styles/themes/_lissy.scss b/src/styles/themes/_lissy.scss new file mode 100644 index 0000000000..8b24617a08 --- /dev/null +++ b/src/styles/themes/_lissy.scss @@ -0,0 +1,77 @@ +html[data-theme='lissy'] { + // --primary: #f0f; + --primary: #ffffffcc; + --background: #25282c; + --background-darker: #191c20; + --item-group-background: var(--background-darker); + --item-group-outer-background: var(--background-darker); + --item-group-heading-text-color: var(--primary); + --item-group-heading-text-color-hover: var(--primary); + --item-group-shadow: none; + --item-background: var(--background); + --item-background-hover: #101215; + --item-shadow: 1px 1px 1px #00000080; + --item-hover-shadow: 2px 2px 3px #00000099; + --font-headings: 'Shrikhand'; + --curve-factor: 6px; + + h1, h3.section-title { + font-weight: normal; + } + + .side-bar-item-container { + --item-hover-shadow: none; + --item-shadow: none; + } + + .collapsable, .side-bar-section, .workspace-widget { + &:nth-child(1n) { --index-color: #f81392e6; } + &:nth-child(2n) { --index-color: #e026ffe6; } + &:nth-child(3n) { --index-color: #4c64ffe6; } + &:nth-child(4n) { --index-color: #38d9fde6; } + &:nth-child(5n) { --index-color: #15f4a3e6; } + &:nth-child(6n) { --index-color: #e8ff47e6; } + &:nth-child(7n) { --index-color: #ff6c47e6; } + + --item-group-heading-text-color: var(--index-color); + --item-group-shadow: inset 0 2px 1px var(--index-color); + --item-hover-shadow: 0 0 5px var(--index-color); + --side-bar-item-color: var(--index-color); + + transition: all 0.2s ease-in-out 0s; + border: 1px solid #0000004d; + .section-header h3 { + font-weight: normal; + } + a.item p.description { + opacity: 0.75; + color: var(--index-color); + } + &:hover, &.workspace-widget { + box-shadow: inset 0px 3px 1px var(--index-color), 1px 1px 5px #00000080; + } + } + + .workspace-widget-view .workspace-widget { + background: var(--background-darker); + padding: 1rem; + margin: 1rem auto; + border-radius: var(--curve-factor); + } + + .home, .options-container, .options-outer, #dashy { + background-color: var(--background); + background-image: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%2314171c' fill-opacity='0.4'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + } + .minimal-home { + background: none; + } + + .home { + padding-bottom: 1.5rem; + } + footer { + margin-top: 0; + } +} + diff --git a/src/styles/themes/_material.scss b/src/styles/themes/_material.scss new file mode 100644 index 0000000000..ba802e9083 --- /dev/null +++ b/src/styles/themes/_material.scss @@ -0,0 +1,449 @@ +html[data-theme='material-original'] { + --font-body: 'Roboto', serif; + --primary: #29B6F6; + --background: #f1f1f1; + --background-darker: #01579B; + --black: #555555; + --settings-text-color: var(--background-darker); + --item-group-heading-text-color: var(--black); + --item-group-shadow: none; + --item-group-outer-background: none; + --item-group-background: none; + --item-background: var(--white); + --item-background-hover: var(--white); + --settings-background: var(--primary); + --search-container-background: var(--primary); + --curve-factor: 2px; + --curve-factor-navbar: 0; + --item-group-padding: 5px 0 0; + --item-text-color: var(--black); + --item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d; + --item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a; + --item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65); + --item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2); + --settings-container-shadow: 0 1px 3px #0000005e, 0 1px 2px #00000085; + --welcome-popup-background: var(--background-darker); + --welcome-popup-text-color: #ffffff; + --config-code-color: var(--black); + --item-group-heading-text-color-hover: var(--background-darker); + --config-settings-background: var(--background-darker); + --config-settings-color: var(--white); + --interactive-editor-background: var(--background-darker); + --interactive-editor-color: var(--white); + --interactive-editor-background-darker: var(--primary); + --heading-text-color: var(--white); + --status-check-tooltip-background: #f2f2f2; + --status-check-tooltip-color: var(--background-darker); + --description-tooltip-background: #f2f2f2; + --description-tooltip-color: var(--background-darker); + --login-form-background: var(--white); + --about-page-accent: var(--black); + --about-page-color: var(--background-darker); + --about-page-background: var(--background); + --context-menu-background: var(--white); + --context-menu-secondary-color: var(--white); + --widget-text-color: var(--black); + --minimal-view-section-heading-background: var(--white); + --minimal-view-search-background: var(--white); + --minimal-view-search-color: var(--background-darker); + --minimal-view-group-background: #e3e3e3; + div.context-menu ul li:hover { + background: var(--primary); + color: var(--white); + } + .widget-base { + background: #f5f5f5; + box-shadow: var(--item-shadow); + padding: 0.5rem; + margin: 0.25rem 0; + } + .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } +} + +html[data-theme='material-dark-original'] { + --primary: #08B0BB; + --background: #39434C; + --background-darker: var(--primary); + --material-dark: #1b252c; + --material-light: #41e2ed; + --settings-text-color: var(--primary); + --settings-background: #092b3a; + --item-group-background: #333C43; + --item-background: #414B55; + --item-background-hover: #414B55; + --settings-background: var(--material-dark); + --search-container-background: var(--material-dark); + --search-field-background: var(--background); + --heading-text-color: var(--material-dark); + --nav-link-text-color: var(--primary); + --nav-link-background-color: var(--material-dark); + --nav-link-text-color-hover: var(--primary); + --nav-link-background-color-hover: var(--material-dark); + --nav-link-border-color-hover: transparent; + --curve-factor: 2px; + --curve-factor-navbar: 0; + --item-group-padding: 5px 0 0; + --item-shadow: 2px 2px 3px #00000082, 0 1px 10px #00000040; + --item-hover-shadow: 4px 4px 3px #00000082, 0 1px 10px #00000040; + --item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65); + --item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2); + --welcome-popup-background: var(--material-dark); + --welcome-popup-text-color: var(--primary); + --config-settings-background: var(--material-dark); + --config-settings-color: var(--material-light); + --interactive-editor-color: var(--material-light); + --interactive-editor-background: var(--material-dark); + --interactive-editor-background-darker: var(--material-dark); + --scroll-bar-color: var(--primary); + --scroll-bar-background: var(--material-dark); + --status-check-tooltip-background: var(--material-dark); + --status-check-tooltip-color: var(--primary); + --description-tooltip-background: var(--material-dark); + --description-tooltip-color: var(--primary); + --widget-text-color: var(--white); + --minimal-view-section-heading-background: var(--material-dark); + --minimal-view-search-background: var(--material-dark); + --minimal-view-search-color: var(--background-darker); + --minimal-view-group-background: var(--material-dark); + &::-webkit-scrollbar-thumb { + border-left: 1px solid var(--material-dark); + } + div.context-menu { + border: none; + background: var(--material-dark); + ul li:hover { + background: #333c43; + } + } + div.minimal-section-heading, .minimal-section-inner.selected, input.minimal-search { + box-shadow: 2px 2px 4px #000000, 0 1px 3px #000000cc; + } + .minimal-section-inner.selected { border-top: none; } +} + + +html[data-theme='material'], html[data-theme='material-dark'] { + --font-body: 'Raleway', serif; + --font-headings: 'Francois One', serif; + --footer-height: 140px; + --curve-factor: 4px; + --curve-factor-navbar: 8px; + --about-page-background: var(--background); + --about-page-color: var(--primary); + + .collapsable { + margin: 0; + padding: 0; + } + /* Custom layout for medium and large icons */ + .item-wrapper .item:not(.size-small) { + display: flex; + flex-direction: row-reverse; + justify-content: flex-end; + text-align: left; + overflow: hidden; + align-items: center; + width: 15rem; + min-width: 15rem; + max-height: 6rem; + margin: 0.2rem; + padding: 0.5rem; + img { + padding: 0.1rem 0.25rem; + } + .tile-title { + height: auto; + padding: 0.1rem 0.25rem; + span.text { + position: relative; + font-weight: bold; + font-size: 1.1rem; + width: 100%; + } + p.description { + display: block; + margin: 0; + white-space: pre-wrap; + font-size: .9em; + text-overflow: ellipsis; + min-height: 2rem; + } + } + } + .item-wrapper.add-new-item { + flex-grow: inherit; + } + .add-new-item a { + flex-grow: inherit; + flex-basis: inherit; + } + .tooltip.item-description-tooltip:not(.tooltip-is-small) { + display: none !important; + } + .orientation-horizontal:not(.single-section-view) { + display: flex; + flex-direction: column; + .there-are-items { + display: grid; + grid-template-columns: repeat(5, 1fr); + @include phone { grid-template-columns: repeat(1, 1fr); } + @include tablet { grid-template-columns: repeat(2, 1fr); } + @include laptop { grid-template-columns: repeat(3, 1fr); } + @include monitor { grid-template-columns: repeat(4, 1fr); } + @include big-screen { grid-template-columns: repeat(5, 1fr); } + @include big-screen-up { grid-template-columns: repeat(6, 1fr); } + } + .there-are-items .item-wrapper .item { + width: auto; + min-width: auto; + max-height: auto; + } + } + a.item { + position: relative; + overflow: hidden; + transition: all 0.2s linear 0s; + div { + transition: all 0.2s linear 0s; + } + .overflow-dots { + display: none; + } + &:before { + content: "\f054"; + font-family: FontAwesome; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 0; + left: 0px; + height: 100%; + width: 1rem; + background: #ccd3dd80; + border-radius: 0 60% 60% 0; + transform: scale(0,1); + transform-origin: left center; + transition: all 0.2s linear 0s; + padding: 0 0.2rem; + } + &:hover, &:focus-within { + div.bounce { + text-indent: 1rem; + } + &:before { + transform: scale(1,1); + text-indent: 0; + } + .opening-method-icon { + display: none; + } + } + &:active { + background: #c7c7c754; + } + &.size-small { + padding-left: 0.5rem; + min-width: 11rem; + } + &.short:not(.size-large) { + min-height: 2rem; + height: auto; + } + } +} + +html[data-theme='material'] { + --primary: #363636; + --background: #eee; + --white2: #f5f5f5; + --grey2: #473f3f; + --background-darker: #4285f4; + --background-darker2: #0c4eba; + --item-group-outer-background: none; + --item-group-shadow: none; + --item-group-background: none; + --item-background: var(--white); + --item-background-hover: var(--white); + --item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d; + --item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a; + --item-text-color: var(--primary); + --item-group-heading-text-color-hover: var(--primary); + --item-icon-transform-hover: none; + --nav-link-background-color: var(--background-darker2); + --nav-link-text-color: var(--white); + --nav-link-border-color: var(--background-darker2); + --settings-text-color: var(--primary); + --config-code-color: var(--primary); + --config-settings-background: var(--white2); + --config-settings-color: var(--grey2); + --interactive-editor-color: var(--grey2); + --interactive-editor-background: var(--white2); + --interactive-editor-background-darker: var(--white); + --heading-text-color: var(--white); + --curve-factor: 3px; + --curve-factor-navbar: 8px; + --search-container-background: var(--background-darker); + --welcome-popup-text-color: var(--white2); + --footer-text-color: var(--white2); + // --login-form-background-secondary: var(--white2); + --context-menu-background: var(--white); + --context-menu-secondary-color: var(--white2); + --transparent-white-50: #00000080; + --status-check-tooltip-background: var(--white); + --description-tooltip-background: var(--white); + --description-tooltip-color: var(--grey2); + --side-bar-background-lighter: var(--background-darker2); + --side-bar-item-background: var(--white2); + + --minimal-view-background-color: var(--background); + --minimal-view-title-color: var(--background-darker); + --minimal-view-settings-color: var(--primary); + --minimal-view-section-heading-color: var(--primary); + --minimal-view-section-heading-background: #f6f6f6; + --minimal-view-search-background: var(--white); + --minimal-view-search-color: var(--primary); + --minimal-view-group-color: var(--primary); + --minimal-view-group-background: var(--white); + + --widget-background-color: var(--background); + + --warning: #d4d015; + + .minimal-section-inner.selected, div.minimal-section-heading { + border: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + } + .title-and-search form input { + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + } + div.minimal-section-heading.selected { + background: var(--background-darker); + } + + div.jsoneditor div.jsoneditor-menu { + background: var(--background-darker) !important; + } + + header { + color: var(--primary); + .page-titles span.subtitle { + text-shadow: none; + } + } + footer { + opacity: 1; + color: var(--white); + } + section.filter-container form label { + color: var(--white); + } + .prism-editor-wrapper { + background: var(--white2); + } + .item:focus { + outline-color: var(--background-darker); + } + .widget-base { + background: var(--white2); + box-shadow: var(--item-shadow); + padding: 0.5rem; + margin: 0.25rem 0; + } + .minimal-widget-wrap .widget-base { box-shadow: none; } +} + +html[data-theme='material-dark'] { + --primary: #08B0BB; + --background: #313941; + --background-darker: #08B0BB; + --settings-background: #092b3a; + --settings-text-color: #08B0BB; + + --widget-text-color: #e0e0e0; + --widget-accent-color: var(--primary); + + --item-group-background: none; + --item-group-outer-background: none; + --item-group-shadow: none; + --item-group-padding: 5px 0 0; + --item-group-heading-text-color: #e0e0e0; + --item-group-heading-text-color-hover: #08B0BB; + + --item-text-color: #e0e0e0; + --item-shadow: 2px 2px 3px #00000082, 0 1px 10px #00000040; + --item-hover-shadow: 4px 4px 3px #00000082, 0 1px 10px #00000040; + --item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65); + --item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2); + --item-background: #414B55; + --item-background-hover: #414B55; + + --settings-background: #131a1f; + --search-container-background: #131a1f; + --search-field-background: #39434c; + --heading-text-color: #131a1f; + --nav-link-text-color: #08B0BB; + --nav-link-background-color: #131a1f; + --nav-link-text-color-hover: #08B0BB; + --nav-link-background-color-hover: #131a1fc7; + --nav-link-border-color-hover: transparent; + + --status-check-tooltip-background: #131a1f; + --status-check-tooltip-color: #e0e0e0; + --description-tooltip-background: #131a1f; + --description-tooltip-color: #e0e0e0; + --curve-factor: 2px; + --curve-factor-navbar: 0; + --side-bar-background: #131a1f; + --welcome-popup-background: #131a1f; + --welcome-popup-text-color: var(--primary); + + --config-settings-background: #131a1f; + --config-settings-color: #41e2ed; + --interactive-editor-background: #242a2f; + --interactive-editor-background-darker: #131a1f; + --interactive-editor-color: #41e2ed; + + --scroll-bar-color: #08B0BB; + --scroll-bar-background: #131a1f; + // --login-form-color: #131a1f; + --login-form-background-secondary: #131a1f; + + // --minimal-view-background-color: var(--background); + // --minimal-view-title-color: var(--primary); + // --minimal-view-settings-color: var(--primary); + --minimal-view-section-heading-color: #131a1f; + --minimal-view-section-heading-background: var(--background); + --minimal-view-search-background: #131a1f; + // --minimal-view-search-color: var(--primary); + // --minimal-view-group-color: var(--primary); + --minimal-view-group-background: #131a1f; + --context-menu-secondary-color: #131a1f; + --widget-accent-color: #131a1fbf; + + div.minimal-section-heading h3, div.minimal-section-heading.selected h3 { + color: #d5d5d5; + } + div.minimal-section-heading, .minimal-section-inner.selected, input.minimal-search { + box-shadow: 2px 2px 4px #000000, 0 1px 3px #000000cc; + border-color: #131a1f80; + } + + + &::-webkit-scrollbar-thumb { + border-left: 1px solid #131a1f; + } + .item { + &:before, &:active { + background: #131a1f !important; + } + } + .widget-base { + background: var(--item-background); + box-shadow: var(--item-shadow); + margin: 0.25rem 0; + padding: 0.5rem; + } + .minimal-widget-wrap .widget-base { box-shadow: none; } +} + diff --git a/src/styles/themes/_matrix.scss b/src/styles/themes/_matrix.scss new file mode 100644 index 0000000000..2ea3c1bdfe --- /dev/null +++ b/src/styles/themes/_matrix.scss @@ -0,0 +1,28 @@ +html[data-theme='matrix-red'] { + --background: var(--black); + --background-darker: var(--black); + --primary: #f00; + --outline-color: var(--primary); + --curve-factor: 0; + --font-body: 'Cutive Mono', monospace; + --font-headings: 'VT323', monospace; +} + +html[data-theme='matrix'] { + --background: var(--black); + --background-darker: var(--black); + --primary: #2bca2b; + --outline-color: var(--primary); + --curve-factor: 0px; + --font-body: 'Cutive Mono', monospace; + --font-headings: 'VT323', monospace; + --about-page-background: var(--background); + --context-menu-secondary-color: var(--primary); + .prism-editor-wrapper.my-editor { + border: 1px solid var(--primary); + } + div.context-menu ul li:hover { + color: var(--background); + } +} + diff --git a/src/styles/themes/_midnight.scss b/src/styles/themes/_midnight.scss new file mode 100644 index 0000000000..f4421df43d --- /dev/null +++ b/src/styles/themes/_midnight.scss @@ -0,0 +1,44 @@ +/* Midnight โ€” pure black OLED-optimized theme. Muted whites, minimal saturation, + * ideal for always-on wall displays and OLED screens (true-black pixels save power). */ +html[data-theme='midnight'] { + --primary: #e5e5e5; + --background: #000000; + --background-darker: #000000; + --item-group-background: #0a0a0a; + --item-group-outer-background: transparent; + --item-background: #0d0d0d; + --item-background-hover: #1a1a1a; + --item-shadow: 0 0 0 1px #1f1f1f; + --item-hover-shadow: 0 0 0 1px #404040; + + --heading-text-color: #fafafa; + --item-text-color: #e5e5e5; + --item-text-color-hover: #ffffff; + --item-group-heading-text-color: #a3a3a3; + --item-group-heading-text-color-hover: #ffffff; + + --settings-background: #000000; + --settings-text-color: #a3a3a3; + --nav-link-text-color: #a3a3a3; + --nav-link-text-color-hover: #ffffff; + --nav-link-background-color: transparent; + --nav-link-border-color: #1f1f1f; + --nav-link-border-color-hover: #737373; + + --search-container-background: #000000; + --search-field-background: #0a0a0a; + --footer-background: #000000; + --footer-text-color: #737373; + --footer-text-color-link: #e5e5e5; + + --outline-color: #737373; + --highlight-background: #ffffff; + --highlight-color: #000000; + --curve-factor: 6px; + --font-body: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + --font-headings: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + + h1, h2, h3 { font-weight: 300; letter-spacing: -0.01em; } + .item { border: 1px solid transparent; transition: border-color 0.15s ease; } + .item:hover { border-color: #404040; } +} diff --git a/src/styles/themes/_minimal.scss b/src/styles/themes/_minimal.scss new file mode 100644 index 0000000000..52a7baf47e --- /dev/null +++ b/src/styles/themes/_minimal.scss @@ -0,0 +1,214 @@ +html[data-theme='minimal-light'], html[data-theme='minimal-dark'], html[data-theme='vaporware'] { + --font-body: 'Courier New', monospace; + --font-headings: 'Courier New', monospace; + --footer-height: 94px; + + .item.size-medium .tile-title { + max-width: 100px; + } + + .section-header h3 { + font-size: 1.5rem; + } + .tile-title span.text { + font-size: 1.1rem; + font-weight: bold; + } + + header { + padding: 0.1rem 0.5rem; + .page-titles{ + h1 { + font-size: 1.25rem; + } + span.subtitle { + font-size: 0.8rem; + + } + } + .nav .nav-item { + padding: 0.2rem 0.4rem; + box-shadow: none; + } + } + .item-group-container.orientation-horizontal .collapsable { + border-bottom: 1px dashed #ffffff38; + border-radius: 0; + } + .widget-base { + background: var(--background-darker); + padding: 1rem 0.5rem; + margin: 0.5rem 0; + } + .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } +} + + +html[data-theme='minimal-light'] { + --primary: #a5a5a5; + --background: #ffffff; + --background-darker: #14171e; + --item-group-outer-background: none; + --item-group-shadow: none; + --item-group-background: none; + --item-background: none; + --item-background-hover: #f2f2f2; + --item-shadow: none; + --item-hover-shadow: none; + --item-text-color: var(--background-darker); + --item-group-heading-text-color-hover: var(--background-darker); + --settings-text-color: var(--background-darker); + --config-code-color: var(--background-darker); + --nav-link-background-color: none; + --search-container-background: var(--white); + --curve-factor: 4px; + --curve-factor-navbar: 8px; + --status-check-tooltip-background: #f2f2f2; + --status-check-tooltip-color: var(--black); + --description-tooltip-background: #f2f2f2; + --description-tooltip-color: var(--black); + --login-form-color: var(--background-darker); + --about-page-background: var(--background); + --about-page-color: var(--background-darker); + --context-menu-color: var(--background-darker); + --context-menu-secondary-color: var(--primary); + --widget-text-color: #4e4e4e; + section.filter-container { + background: var(--white); + border-bottom: 1px dashed #00000038; + input#filter-tiles { + border: 1px solid var(--background-darker); + } + } + .widget-base { + background: #f2f2f2; + } +} + +html[data-theme='minimal-dark'] { + --primary: #a5a5a5; + --background: #14171e; + --background-darker: #090b0e; + --item-group-outer-background: none; + --item-group-shadow: none; + --item-group-background: none; + --item-background: none; + --item-background-hover: var(--background-darker); + --item-shadow: none; + --item-hover-shadow: none; + --item-text-color: var(--white); + --item-group-heading-text-color-hover: var(--white); + --settings-text-color: var(--white); + --config-code-color: var(--white); + --nav-link-background-color: none; + --search-container-background: var(--background); + --curve-factor: 4px; + --curve-factor-navbar: 8px; + --item-group-heading-text-color: var(--white); + --item-group-heading-text-color-hover: #ffffffbf; + --about-page-background: var(--background); + --about-page-color: var(--primary); + + .section-header h3 { + font-size: 1.8rem; + } + + section.filter-container { + background: #14171e; + border-bottom: 1px dashed #ffffff38; + input#filter-tiles { + border: 1px solid var(--white); + } + } + + div.context-menu { + border-color: var(--primary); + } +} + +html[data-theme='vaporware'] { + --primary: #09bfe6; + --background: #100e2c; + --background-darker: #7b2af1; + --settings-text-color: #8d51fc; + --item-group-outer-background: #096de6; + --item-group-outer-background: var(--primary); + --item-group-background: var(--background); + --item-group-heading-text-color: var(--background); + --item-group-heading-text-color-hover: var(--background-darker); + --item-text-color: var(--primary); + --item-background: #1a174d; + --item-background-hover: var(--background);; + --footer-text-color: var(--white); + --item-shadow: none; + --curve-factor: 2px; + --curve-factor-navbar: 6px; + --login-form-color: var(--primary); + --config-settings-background: var(--background); + --status-check-tooltip-background: var(--background); + --description-tooltip-background: var(--background); + --heading-text-color: var(--background); + --search-label-color: var(--background); + --widget-accent-color: #1d194f; + + div.item-group-container { + gap: 0.3rem; + margin: 1rem auto; + } + div.collapsable { + margin: 0.2rem; + padding: 0.2rem; + } + div.content-inner { + padding: 0.15rem !important; + } + a.item { + margin: 0.1rem; + border: 0; + &.size-medium { + min-height: 80px; + } + } + section.filter-container { + background: linear-gradient(0deg, var(--background) 25%, #6c27ea 100%); + form { + background: #6c27ea; + height: 2.5rem; + } + form label, i.clear-search { + color: #100e2c; + border-color: #100e2c; + font-weight: bold; + } + } + .tile-title span.text { + font-weight: normal; + } + .section-header h3 { + font-size: 1.4rem; + } + footer { + color: var(--white); + } + div.login-page { + background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg'); + background-size: cover; + } + body { + background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg'); + background-size: cover; + background-repeat:no-repeat; + background-position: center center; + // Remove background from certain components + div.home, div.options-outer, div.options-container, section.filter-container, + section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn { + background: none; + } + } + .widget-base { + background: var(--background); + padding: 1rem 0.5rem; + margin: 0.5rem 0; + } +} + diff --git a/src/styles/themes/_night-bat.scss b/src/styles/themes/_night-bat.scss new file mode 100644 index 0000000000..5ab3600860 --- /dev/null +++ b/src/styles/themes/_night-bat.scss @@ -0,0 +1,82 @@ +html[data-theme="night-bat"] { + // Main colors + --primary: #4780ff; + --background: #252931; + --background-darker: #303540; + // Typography + --font-headings: 'Podkova', 'Roboto', serif; + --font-body: 'Roboto', serif; + --heading-text-color: #fff; + // Items + --item-background: #303540; + --item-background-hover: var(--item-background); + --item-shadow: 0px 3px 0px var(--primary), 2px 2px 6px var(--black); + --item-hover-shadow: 0px 20px 0px 0 var(--primary), 2px 2px 6px var(--black); + // Sections + --item-group-heading-text-color: var(--white); + --item-group-heading-text-color-hover: var(--white); + --item-group-shadow: none; + --item-group-background: none; + --item-group-outer-background: none; + // Nav Links + --nav-link-background-color: var(--background); + --nav-link-background-color-hover: var(--background); + --nav-link-border-color: transparent; + --nav-link-border-color-hover: transparent; + --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); + --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black); + // Misc + --curve-factor: 4px; + --curve-factor-navbar: 8px; + + --widget-text-color: var(--white); + + // Style overrides + .section-header h3 { font-size: 1.3rem; font-weight: bold; } + .content-inner { border-top: 1px dashed var(--primary); } + .item.size-large .tile-title p.description { height: 3rem; } + .item, .nav-outer nav .nav-item { border-radius: 1px; } + .item.size-large { margin: 0.5rem; } + // Show outline when collapsed + .is-collapsed { + background: var(--item-background); + box-shadow: var(--item-shadow); + &:hover { + background: var(--item-background-hover); + box-shadow: var(--item-hover-shadow); + } + } + .widget-base { + background: var(--background-darker); + padding: 1rem 0.5rem; + margin: 0.5rem 0; + } + + .item-wrapper { + .item-url { + display: block; + opacity: 0; + position: absolute; + bottom: -1.9rem; + font-size: 0.8rem; + color: var(--background); + transition: all 0.2s cubic-bezier(0.8, 0.8, 0.4, 1.4); + } + a { + transition: all 0.2s cubic-bezier(0.8, 0.8, 0.4, 1.4); + height: calc(100% - 1rem); + } + &:hover { + a { height: calc(100% - 2rem); } + .item-icon { + transform: scale(0.9); + } + .item-url { + display: block; + opacity: 1; + } + } + } +} + + diff --git a/src/styles/themes/_nord.scss b/src/styles/themes/_nord.scss new file mode 100644 index 0000000000..469f6f7e94 --- /dev/null +++ b/src/styles/themes/_nord.scss @@ -0,0 +1,24 @@ +html[data-theme='nord'] { + --primary: #D8DEE9; + --background: #3B4252; + --background-darker: #2E3440; + --item-background: #434C5E; + --item-background-hover: #4C566A; + .collapsable:nth-child(1n) { background: #BF616A; } + .collapsable:nth-child(2n) { background: #D08770; } + .collapsable:nth-child(3n) { background: #EBCB8B; } + .collapsable:nth-child(4n) { background: #A3BE8C; } +} + + + html[data-theme='nord-frost'] { + --primary: #D8DEE9; + --background: #3B4252; + --background-darker: #2E3440; + --item-background: #434C5E; + --item-background-hover: #4C566A; + .collapsable:nth-child(1n) { background: #8FBCBB; } + .collapsable:nth-child(2n) { background: #88C0D0; } + .collapsable:nth-child(3n) { background: #81A1C1; } + .collapsable:nth-child(4n) { background: #5E81AC; } +} diff --git a/src/styles/themes/_oblivion.scss b/src/styles/themes/_oblivion.scss new file mode 100644 index 0000000000..3560660b52 --- /dev/null +++ b/src/styles/themes/_oblivion.scss @@ -0,0 +1,55 @@ +html[data-theme="oblivion"], +html[data-theme="oblivion-blue"], +html[data-theme="oblivion-mint"], +html[data-theme="oblivion-lemon"], +html[data-theme="oblivion-scotch"] { + --primary: #f35151; + --background: #1b2431; + --background-darker: #121a25; + --item-group-outer-background: none; + --item-group-shadow: none; + --item-group-background: none; + --item-background: var(--background-darker); + --item-background-hover: var(--background-darker); + --item-shadow: 0 1px 5px #18191a; + --item-hover-shadow: 2px 2px 3px #040505; + --item-group-heading-text-color-hover: var(--primary); + --nav-link-background-color: var(--background); + --curve-factor: 3px; + --curve-factor-navbar: 6px; + --item-group-heading-text-color: var(--primary); + --about-page-background: var(--background); + --about-page-color: var(--primary); + div.item-wrapper a.item, a.sub-item-link.item { + border: 1px solid #313d4f; + } + section.filter-container form input#filter-tiles, .widget-base { + border: 1px solid #313d4f; + box-shadow: 0 1px 5px #0c0d0e; + } + .widget-base { + background: var(--item-background); + box-shadow: var(--item-shadow); + padding: 0.5rem; + margin: 1rem 0; + } + .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } + .minimal-home div.item-group-container, input.minimal-search { + box-shadow: 0 1px 6px #00000099, 0 1px 1px #000000cc; + } +} + + +html[data-theme="oblivion-blue"] { + --primary: #82a5f3; +} +html[data-theme="oblivion-mint"] { + --primary: #4acfd4; +} +html[data-theme="oblivion-lemon"] { + --primary: #d0ed87; +} +html[data-theme="oblivion-scotch"] { + --primary: #d69e3a; +} + diff --git a/src/styles/themes/_one-dark.scss b/src/styles/themes/_one-dark.scss new file mode 100644 index 0000000000..65f9379055 --- /dev/null +++ b/src/styles/themes/_one-dark.scss @@ -0,0 +1,72 @@ +html[data-theme="one-dark"] { + + // Main colors + --primary: #c5cad3; + --background: #282c33; + --background-darker: #1c1f23; + // Typography + --font-headings: 'Podkova', 'Roboto', serif; + --font-body: 'Roboto', serif; + // Items + --item-background: var(--background-darker); + --item-background-hover: var(--item-background); + --item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); + --item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black); + // Sections + --item-group-heading-text-color: var(--white); + --item-group-heading-text-color-hover: var(--primary); + --item-group-shadow: none; + --item-group-background: none; + --item-group-outer-background: none; + // Nav Links + --nav-link-background-color: var(--background); + --nav-link-background-color-hover: var(--background); + --nav-link-border-color: transparent; + --nav-link-border-color-hover: transparent; + --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black); + --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black); + // Misc + --curve-factor: 4px; + --curve-factor-navbar: 6px; + + // Style overrides + .section-header h3 { font-size: 1.3rem; font-weight: bold; } + .content-inner { border-top: 1px dashed var(--primary); } + .item.size-large .tile-title p.description { height: 3rem; } + .item, .nav-outer nav .nav-item { border-radius: 0; } + .item.size-large { margin: 0.5rem; } + // Show outline when collapsed + .is-collapsed { + background: var(--item-background); + box-shadow: var(--item-shadow); + &:hover { + background: var(--item-background-hover); + box-shadow: var(--item-hover-shadow); + } + } + // Colored Item Accents + .item-wrapper:nth-child(1n) { --current: #e06b74; } + .item-wrapper:nth-child(2n) { --current: #98c379; } + .item-wrapper:nth-child(3n) { --current: #e5c07a; } + .item-wrapper:nth-child(4n) { --current: #62aeef; } + .item-wrapper:nth-child(5n) { --current: #c678dd; } + .item-wrapper:nth-child(6n) { --current: #55b6c2; } + .item-wrapper .item { + color: var(--current); + box-shadow: -3px 0px 0px var(--current), 1px 1px 3px #000000e6; + &:hover { + box-shadow: -5px 0px 0px var(--current), 2px 2px 3px #000000e6; + } + } + + // Widgets + .widget-base { + background: var(--item-background); + box-shadow: var(--item-shadow); + padding: 0.5rem; + margin: 1rem 0; + } + .minimal-widget-wrap .widget-base { box-shadow: none; border: none; } +} + + diff --git a/src/styles/themes/_parchment.scss b/src/styles/themes/_parchment.scss new file mode 100644 index 0000000000..200d7cb051 --- /dev/null +++ b/src/styles/themes/_parchment.scss @@ -0,0 +1,46 @@ +/* Parchment โ€” warm editorial light theme. Aged-paper background, ink-black + * text, burgundy accents. Feels like a classic book layout. AAA contrast. */ +html[data-theme='parchment'] { + --primary: #8b2c2c; + --background: #f5efdc; + --background-darker: #e8dfc4; + --item-group-background: #ffffff; + --item-group-outer-background: #8b2c2c; + --item-background: #fafaf5; + --item-background-hover: #f0e9d0; + --item-shadow: 0 1px 2px #0000001a; + --item-hover-shadow: 2px 3px 6px #0000002e; + --item-group-shadow: 0 2px 4px #0000001a; + + --heading-text-color: #2a2420; + --item-text-color: #2a2420; + --item-text-color-hover: #8b2c2c; + --item-group-heading-text-color: #f5efdc; + --item-group-heading-text-color-hover: #f5efdc; + + --settings-background: #e8dfc4; + --settings-text-color: #2a2420; + --nav-link-text-color: #2a2420; + --nav-link-background-color: #ffffff; + --nav-link-border-color: #d4c9a6; + --nav-link-border-color-hover: #8b2c2c; + --nav-link-text-color-hover: #8b2c2c; + + --search-container-background: #e8dfc4; + --search-field-background: #fafaf5; + --footer-background: #e8dfc4; + --footer-text-color: #2a2420; + --footer-text-color-link: #8b2c2c; + + --outline-color: #8b2c2c; + --highlight-background: #8b2c2c; + --highlight-color: #f5efdc; + --curve-factor: 2px; + --curve-factor-navbar: 4px; + --font-headings: 'Podkova', Georgia, serif; + --font-body: Georgia, 'Times New Roman', serif; + + h1, h2, h3 { font-weight: 500; letter-spacing: 0.01em; } + .item { border: 1px solid #d4c9a6; } + .item:hover { border-color: #8b2c2c; } +} diff --git a/src/styles/themes/_raspberry-jam.scss b/src/styles/themes/_raspberry-jam.scss new file mode 100644 index 0000000000..085f3ed691 --- /dev/null +++ b/src/styles/themes/_raspberry-jam.scss @@ -0,0 +1,11 @@ +html[data-theme='raspberry-jam'] { + --primary: #eb2d6c; + --background: #0b1021; + --item-background: #1c2636; + --item-group-background: var(--background); + --nav-link-background-color: var(--background); + --config-code-background: #1c1e24; + --config-code-color: var(--primary); + --font-headings: 'Sniglet', cursive; +} + diff --git a/src/styles/themes/_rose-pine.scss b/src/styles/themes/_rose-pine.scss new file mode 100644 index 0000000000..3564ee9833 --- /dev/null +++ b/src/styles/themes/_rose-pine.scss @@ -0,0 +1,26 @@ +/* Rose Pine โ€” soft dusty-purple dark theme with rose and gold accents. + * Understated and elegant, optimized for long viewing sessions. */ +html[data-theme='rose-pine'] { + --primary: #ebbcba; + --background: #191724; + --background-darker: #1f1d2e; + --item-group-background: #26233a; + --item-group-outer-background: #26233a; + --item-background: #1f1d2e; + --item-background-hover: #302d44; + --item-shadow: 0 1px 2px #0000004d; + --item-hover-shadow: 0 0 0 1px #ebbcba66; + --heading-text-color: #f6c177; + --item-text-color: #e0def4; + --item-text-color-hover: #eb6f92; + --item-group-heading-text-color: #f6c177; + --settings-text-color: var(--primary); + --nav-link-text-color: #e0def4; + --nav-link-text-color-hover: #eb6f92; + --nav-link-background-color: #1f1d2e; + --nav-link-border-color: transparent; + --nav-link-border-color-hover: #ebbcba; + --outline-color: #c4a7e7; + --highlight-background: #eb6f92; + --highlight-color: #191724; +} diff --git a/src/styles/themes/_solarized.scss b/src/styles/themes/_solarized.scss new file mode 100644 index 0000000000..f2ebf28640 --- /dev/null +++ b/src/styles/themes/_solarized.scss @@ -0,0 +1,64 @@ +/* Solarized โ€” Ethan Schoonover's classic balanced palette. Light + dark share + * the same accent hues, swapping only the base tones. */ +html[data-theme='solarized-dark'] { + --primary: #268bd2; + --background: #002b36; + --background-darker: #001e25; + --item-group-background: #073642; + --item-group-outer-background: #073642; + --item-background: #003641; + --item-background-hover: #073642; + --item-shadow: 0 1px 2px #00000066; + --item-hover-shadow: 0 0 0 1px var(--primary); + + --heading-text-color: #93a1a1; + --item-text-color: #93a1a1; + --item-text-color-hover: #fdf6e3; + --item-group-heading-text-color: #eee8d5; + --settings-text-color: #93a1a1; + + --nav-link-text-color: #93a1a1; + --nav-link-text-color-hover: #fdf6e3; + --nav-link-background-color: #073642; + --nav-link-border-color: transparent; + --nav-link-border-color-hover: var(--primary); + + --outline-color: var(--primary); + --highlight-background: #b58900; + --highlight-color: #002b36; +} + +html[data-theme='solarized-light'] { + --primary: #268bd2; + --background: #fdf6e3; + --background-darker: #eee8d5; + --item-group-background: #ffffff; + --item-group-outer-background: #eee8d5; + --item-background: #ffffff; + --item-background-hover: #eee8d5; + --item-shadow: 0 1px 2px #93a1a140; + --item-hover-shadow: 0 0 0 1px var(--primary); + + --heading-text-color: #073642; + --item-text-color: #586e75; + --item-text-color-hover: #073642; + --item-group-heading-text-color: #073642; + --settings-background: #eee8d5; + --settings-text-color: #586e75; + + --nav-link-text-color: #586e75; + --nav-link-text-color-hover: #073642; + --nav-link-background-color: #ffffff; + --nav-link-border-color: #eee8d5; + --nav-link-border-color-hover: var(--primary); + + --search-container-background: #eee8d5; + --search-field-background: #ffffff; + --footer-background: #eee8d5; + --footer-text-color: #586e75; + --footer-text-color-link: var(--primary); + + --outline-color: var(--primary); + --highlight-background: #b58900; + --highlight-color: #fdf6e3; +} diff --git a/src/styles/themes/_tama.scss b/src/styles/themes/_tama.scss new file mode 100644 index 0000000000..018f6af528 --- /dev/null +++ b/src/styles/themes/_tama.scss @@ -0,0 +1,79 @@ +html[data-theme="tama"] { + // Main colors + --primary: #ffffffe6; + --background: #0b1021; + --background-darker: #181c3a; + --background-darker-transparent: #181c3ad4; + --background-grey-transparent: #6b6c73c6; + + // Typography + --font-headings: 'Segoe UI', 'Ariel', 'sans-serif'; + --font-body: 'Segoe UI', 'Ariel', 'sans-serif'; + + // Items + --item-background: var(--background-darker-transparent); + --item-background-hover: var(--background-grey-transparent); + --item-shadow: 1px 1px 2px #130f23; + --item-hover-shadow: 2px 2px 4px #130f23; + + // Sections + --item-group-heading-text-color: var(--white); + --item-group-heading-text-color-hover: var(--primary); + --item-group-shadow: none; + --item-group-background: none; + --item-group-outer-background: none; + + // Remove background from certain components + div.home, div.options-outer, div.options-container, section.filter-container, + section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn { + background: none; + } + + // Style overides + .section-header h3 { font-size: 1.3rem; font-weight: bold; } + .content-inner { border-top: 1px dashed var(--primary); } + .item.size-large .tile-title p.description { height: 3rem; } + .is-collapsed { + background: var(--item-background); + box-shadow: var(--item-shadow); + &:hover { + background: var(--item-background-hover); + box-shadow: var(--item-hover-shadow); + } + } + + // Background Image + body { + //update the query terms after the '?', to customize for images you want + background: url('https://picsum.photos/1920/1080'); + background-color: var(--background-darker); + background-size: cover; + } + header, footer, form.normal { background-color: var(--background-darker-transparent); } + + // large tile spacing adjustment + .there-are-items:has(.item-wrapper.wrap-size-large) { padding-top: .25rem; } + .item-wrapper.wrap-size-large { margin: 0rem .5rem .5rem 0rem; overflow: hidden; } + .item.size-large .tile-title { padding: 0rem 0rem 0rem .7rem; } + + // Hide open method icon + .opening-method-icon { opacity: 0; } + + // Widget tile style + .widget-base { + background-color: var(--background-darker-transparent); + margin: .5rem .5rem 1rem .5rem; + padding: 0; + border: 1px solid var(--outline-color); + border-radius: var(--curve-factor); + box-shadow: var(--item-shadow); + } + .widget-base button.action-btn { margin-top: .3rem; margin-right: .5rem; } + .widget-wrap { padding: 1.4rem .8rem .8rem .8rem; } + + // Grow effect for tile-icon & on hover over Item tiles + .item:hover .item-icon img, .item:hover .item-icon i{ + transition: all .35s ease-in-out; + transform: scale(1.22); + } +} diff --git a/src/styles/themes/_thebe.scss b/src/styles/themes/_thebe.scss new file mode 100644 index 0000000000..f0b3cccbfc --- /dev/null +++ b/src/styles/themes/_thebe.scss @@ -0,0 +1,13 @@ +html[data-theme='thebe'] { + --background: #141b33; + --background-darker: #060913; + --item-group-background: #0b1021; + --item-background: #141b33; + --item-background-hover: var(--background-darker); + --item-hover-shadow: 0 1px 3px #9660ecb3, 0 1px 2px #9660ecbf; + --primary: #b187f5; + --item-group-outer-background: #9660EC + linear-gradient(45deg, #9660ec 2%,#5f60ea 51%,#9660ec 100%); + --font-headings: 'PTMono', 'Courier New', monospace; +} + diff --git a/src/styles/themes/_tiger.scss b/src/styles/themes/_tiger.scss new file mode 100644 index 0000000000..dd570624f9 --- /dev/null +++ b/src/styles/themes/_tiger.scss @@ -0,0 +1,9 @@ +html[data-theme='tiger'] { + --primary: #f58233; + --background: #0b1021; + --item-background: #1c2636; + --item-group-background: var(--background); + --nav-link-background-color: var(--background); + --font-headings: 'Sniglet', cursive; +} + diff --git a/src/styles/themes/_tokyo-night.scss b/src/styles/themes/_tokyo-night.scss new file mode 100644 index 0000000000..3f663f6974 --- /dev/null +++ b/src/styles/themes/_tokyo-night.scss @@ -0,0 +1,34 @@ +/* Tokyo Night โ€” deep navy dark theme with vibrant cool accents. + * Inspired by the Tokyo Night editor palette. High contrast, calm, focused. */ +html[data-theme='tokyo-night'] { + --primary: #7aa2f7; + --background: #1a1b26; + --background-darker: #16161e; + --item-group-background: #24283b; + --item-group-outer-background: #24283b; + --item-background: #1f2335; + --item-background-hover: #292e42; + --item-shadow: 0 1px 3px #0b0c10cc; + --item-hover-shadow: 0 2px 6px #000000cc, 0 0 1px var(--primary); + --heading-text-color: #c0caf5; + --item-text-color: #c0caf5; + --item-text-color-hover: #bb9af7; + --settings-text-color: var(--primary); + --nav-link-text-color: #c0caf5; + --nav-link-background-color: #16161e; + --nav-link-border-color: transparent; + --nav-link-border-color-hover: #bb9af7; + --outline-color: #7aa2f7; + + .collapsable, .nav a.nav-item { + &:nth-child(1n) { --index-color: #7dcfff; } // cyan + &:nth-child(2n) { --index-color: #9ece6a; } // green + &:nth-child(3n) { --index-color: #ff9e64; } // orange + &:nth-child(4n) { --index-color: #bb9af7; } // magenta + &:nth-child(5n) { --index-color: #f7768e; } // red + + --item-group-heading-text-color: var(--index-color); + --item-group-heading-text-color-hover: var(--index-color); + --nav-link-text-color-hover: var(--index-color); + } +} diff --git a/src/styles/themes/_zinc.scss b/src/styles/themes/_zinc.scss new file mode 100644 index 0000000000..e09d926208 --- /dev/null +++ b/src/styles/themes/_zinc.scss @@ -0,0 +1,44 @@ +/* Zinc โ€” modern SaaS aesthetic. Neutral warm grays with a single violet accent. */ +html[data-theme='zinc'] { + --primary: #8b7cff; + --background: #09090b; + --background-darker: #050506; + --item-group-background: #0f0f12; + --item-group-outer-background: transparent; + --item-background: #18181b; + --item-background-hover: #27272a; + --item-shadow: 0 0 0 1px #27272a; + --item-hover-shadow: 0 0 0 1px var(--primary), 0 8px 24px #0000007a; + --item-group-shadow: 0 0 0 1px #27272a; + + --heading-text-color: #fafafa; + --item-text-color: #fafafa; + --item-text-color-hover: var(--primary); + --item-group-heading-text-color: #a1a1aa; + --item-group-heading-text-color-hover: #fafafa; + + --settings-background: #09090b; + --settings-text-color: #a1a1aa; + --nav-link-text-color: #a1a1aa; + --nav-link-text-color-hover: #fafafa; + --nav-link-background-color: transparent; + --nav-link-border-color: #27272a; + --nav-link-border-color-hover: var(--primary); + + --search-container-background: #09090b; + --search-field-background: #18181b; + --footer-background: #09090b; + --footer-text-color: #71717a; + --footer-text-color-link: var(--primary); + + --outline-color: var(--primary); + --highlight-background: var(--primary); + --highlight-color: #09090b; + --curve-factor: 8px; + --curve-factor-navbar: 10px; + --font-body: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + --font-headings: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + + h1, h2, h3 { font-weight: 600; letter-spacing: -0.01em; } + .item { border: 1px solid transparent; transition: border-color 0.15s ease; } +} diff --git a/src/styles/typography.scss b/src/styles/typography.scss index ae90298339..11d31956a3 100644 --- a/src/styles/typography.scss +++ b/src/styles/typography.scss @@ -2,23 +2,24 @@ /* Fonts used by the default theme, and bundled within the app */ @font-face { font-family: 'Inconsolata'; - src: url('./assets/fonts/Inconsolata-Light.ttf'); + src: url('@/assets/fonts/Inconsolata-Light.ttf'); } @font-face { font-family: 'Raleway'; - src: url('./assets/fonts/Raleway-Variable.ttf'); + src: url('@/assets/fonts/Raleway-Variable.ttf'); } @font-face { font-family: 'PTMono'; - src: url('./assets/fonts/PTMono-Regular.ttf'); + src: url('@/assets/fonts/PTMono-Regular.ttf'); } html { --font-body: 'Raleway', 'Trebuchet MS', sans-serif; --font-headings: 'Inconsolata', 'Georgia', sans-serif; - --font-monospace: 'PTMono', 'Courier New', monospace; + --font-monospace: 'PTMono', ui-monospace, Menlo, Monaco, Consolas, + 'Courier New', monospace; font-size: 1rem; font-weight: normal; diff --git a/src/styles/widgets/nextcloud-shared.scss b/src/styles/widgets/nextcloud-shared.scss index 77360681fe..a4a7d8ebbb 100644 --- a/src/styles/widgets/nextcloud-shared.scss +++ b/src/styles/widgets/nextcloud-shared.scss @@ -54,11 +54,11 @@ } } - ::v-deep span.decimals { + :deep(span.decimals) { font-size: 85%; } - ::v-deep div.percentage-chart { + :deep(div.percentage-chart) { margin: 0; } } diff --git a/src/utils/CheckItemVisibility.js b/src/utils/CheckItemVisibility.js index c467fbaffa..bd234b8a7a 100644 --- a/src/utils/CheckItemVisibility.js +++ b/src/utils/CheckItemVisibility.js @@ -5,7 +5,7 @@ */ // Import helper functions from auth, to get current user, and check if guest -import { getCurrentUser } from '@/utils/Auth'; +import { getCurrentUser } from '@/utils/auth/Auth'; import { isVisibleToUser } from '@/utils/IsVisibleToUser'; /* Putting it all together, the function to export */ diff --git a/src/utils/CheckPageVisibility.js b/src/utils/CheckPageVisibility.js index e9ca8cd12e..e9e605ca9b 100644 --- a/src/utils/CheckPageVisibility.js +++ b/src/utils/CheckPageVisibility.js @@ -5,7 +5,7 @@ */ // Import helper functions from auth, to get current user, and check if guest -import { getCurrentUser } from '@/utils/Auth'; +import { getCurrentUser } from '@/utils/auth/Auth'; import { isVisibleToUser } from '@/utils/IsVisibleToUser'; /* Putting it all together, the function to export */ diff --git a/src/utils/CheckSectionVisibility.js b/src/utils/CheckSectionVisibility.js index 30e4dca777..3b4f09ef21 100644 --- a/src/utils/CheckSectionVisibility.js +++ b/src/utils/CheckSectionVisibility.js @@ -5,7 +5,7 @@ */ // Import helper functions from auth, to get current user, and check if guest -import { getCurrentUser } from '@/utils/Auth'; +import { getCurrentUser } from '@/utils/auth/Auth'; import { isVisibleToUser } from '@/utils/IsVisibleToUser'; /* Putting it all together, the function to export */ diff --git a/src/utils/CloudBackup.js b/src/utils/CloudBackup.js index 7654a5e81b..580bfc5145 100644 --- a/src/utils/CloudBackup.js +++ b/src/utils/CloudBackup.js @@ -2,7 +2,7 @@ import sha256 from 'crypto-js/sha256'; import aes from 'crypto-js/aes'; import Utf8 from 'crypto-js/enc-utf8'; import request from '@/utils/request'; -import { backupEndpoint } from '@/utils/defaults'; +import { backupEndpoint } from '@/utils/config/defaults'; const ENDPOINT = backupEndpoint; // 'https://dashy-sync-service.as93.net'; @@ -46,6 +46,6 @@ export const restore = (backupId, password) => { const decryptedData = decryptData(response.data.userData.userData, password); try { resolve(JSON.parse(decryptedData)); } catch (e) { reject(e); } } - }); + }).catch(reject); }); }; diff --git a/src/utils/ConfigHelpers.js b/src/utils/ConfigHelpers.js deleted file mode 100644 index 92abd80df6..0000000000 --- a/src/utils/ConfigHelpers.js +++ /dev/null @@ -1,102 +0,0 @@ -import ConfigAccumulator from '@/utils/ConfigAccumalator'; -// import $store from '@/store'; -import filterUserSections from '@/utils/CheckSectionVisibility'; -import { languages } from '@/utils/languages'; -import { - visibleComponents, - localStorageKeys, - language as defaultLanguage, -} from '@/utils/defaults'; - -/* Given a page name, converts to lowercase, removes special characters and extension */ -export const makePageName = (pageName) => { - if (!pageName) return 'unnamed-page'; - return pageName - .toLowerCase() - .replaceAll(' ', '-') - .replace('.yml', '') - .replace(/[^\w\s-]/gi, ''); -}; - -/* For a given sub-page, and page type, return the URL */ -export const makePageSlug = (pageName, pageType) => { - const formattedName = makePageName(pageName); - return `/${pageType}/${formattedName}`; -}; - -/* Put fetch path for additional configs in correct format */ -export const formatConfigPath = (configPath) => { - if (!configPath) return configPath; - if (configPath.includes('http')) return configPath; - if (configPath.substring(0, 1) !== '/') return `/${configPath}`; - return configPath; -}; - -/** - * Initiates the Accumulator class and generates a complete config object - * Self-executing function, returns the full user config as a JSON object - */ -export const config = (() => { - const Accumulator = new ConfigAccumulator(); - return { - appConfig: Accumulator.appConfig(), - pageInfo: Accumulator.pageInfo(), - sections: filterUserSections(Accumulator.sections()), - }; -})(); - -/** - * Generates an object containing booleans indicating which - * components should be hidden. This enables the user to hide - * parts of the page and disable functionality that they don't need/ want - * All options fallback on the values defined in the defaults - * @param {object} appConfig The full app config - * @returns {object} result - */ -export const componentVisibility = (appConfig) => { - // Get users choice from app config - const usersChoice = appConfig.hideComponents || {}; - // Checks if value is defined, and is a boolean - const isThere = (userValue) => typeof userValue === 'boolean'; - // For each option, return users choice (if specified), else use the default - return { - pageTitle: isThere(usersChoice.hideHeading) - ? !usersChoice.hideHeading : visibleComponents.pageTitle, - navigation: isThere(usersChoice.hideNav) - ? !usersChoice.hideNav : visibleComponents.navigation, - searchBar: isThere(usersChoice.hideSearch) - ? !usersChoice.hideSearch : visibleComponents.searchBar, - settings: isThere(usersChoice.hideSettings) - ? !usersChoice.hideSettings : visibleComponents.settings, - footer: isThere(usersChoice.hideFooter) - ? !usersChoice.hideFooter : visibleComponents.footer, - }; -}; - -/** - * Returns a list of items which the user has assigned a hotkey to - * So that when the hotkey is pressed, the app/ service can be launched - */ -export const getCustomKeyShortcuts = (sections) => { - const results = []; - sections.forEach((section) => { - const itemsWithHotKeys = section.items.filter(item => item.hotkey); - results.push(itemsWithHotKeys.map(item => ({ hotkey: item.hotkey, url: item.url }))); - }); - return results.flat(); -}; - -/** - * Gets the users chosen language. Defaults to English. - * If for any reason a lang code changes, add to legacyAliases for backwards compat - * @returns {object} Language, including code, name and flag - */ -export const getUsersLanguage = () => { - const langCode = localStorage[localStorageKeys.LANGUAGE] - || config.appConfig.language - || defaultLanguage; - const legacyAliases = { cn: 'zh-CN' }; - const resolvedCode = legacyAliases[langCode] || langCode; - const langObj = languages.find(lang => lang.code === resolvedCode); - return langObj; -}; diff --git a/src/utils/EmojiUnicodeRegex.js b/src/utils/EmojiUnicodeRegex.js index b6384c3493..8978d3016e 100644 --- a/src/utils/EmojiUnicodeRegex.js +++ b/src/utils/EmojiUnicodeRegex.js @@ -1 +1 @@ -module.exports = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32-\ude3a]|[\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/; +export default /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32-\ude3a]|[\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/; diff --git a/src/utils/ErrorReporting.js b/src/utils/ErrorReporting.js deleted file mode 100644 index 536150d3ce..0000000000 --- a/src/utils/ErrorReporting.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * NOTE: No data is EVER sent to any external service without your explicit consent. - * In the case of error reporting, Sentry will not even be initialized unless - * you have purposely set appConfig.enableErrorReporting: true. - * It is false by default. - * You may want to enable error reporting if you have encountered a bug, - * as access to the console errors enable it to be triaged an fixed effectively - */ - -/* eslint-disable global-require */ - -import $store from '@/store'; -import { sentryDsn } from '@/utils/defaults'; - -const ErrorReporting = (Vue, router) => { - // Fetch users config - const appConfig = $store.getters.appConfig || {}; - // Check if error reporting is enabled. Only proceed if user has turned it on. - if (appConfig.enableErrorReporting) { - // Get current app version - const appVersion = process.env.VUE_APP_VERSION ? `Dashy@${process.env.VUE_APP_VERSION}` : ''; - // Import Sentry - const Sentry = require('@sentry/vue'); - const { Integrations } = require('@sentry/tracing'); - // Get the Data Source Name for your or Dashy's Sentry instance - const dsn = appConfig.sentryDsn || sentryDsn; - // Initialize Sentry - Sentry.init({ - Vue, - dsn, - integrations: [ - new Integrations.BrowserTracing({ - routingInstrumentation: Sentry.vueRouterInstrumentation(router), - }), - ], - tracesSampleRate: 1.0, - release: appVersion, - }); - } else { - // Error reporting has not been enabled by the user. Do Nothing. - } -}; - -export default ErrorReporting; diff --git a/src/utils/InitServiceWorker.js b/src/utils/InitServiceWorker.js index 7bdb9995d4..ab322d2f29 100644 --- a/src/utils/InitServiceWorker.js +++ b/src/utils/InitServiceWorker.js @@ -1,94 +1,70 @@ -import yaml from 'js-yaml'; -import { register } from 'register-service-worker'; +import { load as yamlLoad } from 'js-yaml'; import request from '@/utils/request'; -import { sessionStorageKeys } from '@/utils/defaults'; -import { statusMsg, statusErrorMsg } from '@/utils/CoolConsole'; +import i18n from '@/utils/i18n'; +import { statusMsg, statusErrorMsg } from '@/utils/logging/CoolConsole'; +import { toast } from '@/utils/Toast'; -/* Sets a local storage item with the state from the SW lifecycle */ -const setSwStatus = (swStateToSet) => { - const initialSwState = { - ready: false, - registered: false, - cached: false, - updateFound: false, - updated: false, - offline: false, - error: false, - devMode: false, - disabledByUser: false, - }; - const sessionData = sessionStorage[sessionStorageKeys.SW_STATUS]; - const currentSwState = sessionData ? JSON.parse(sessionData) : initialSwState; +const SW_LABEL = 'Service Worker Status'; +const UPDATE_CHECK_INTERVAL_MS = 60 * 60 * 1000; // hourly + +/* Loads conf.yml and returns the parsed object, or null on failure */ +const loadAppConfig = async () => { try { - const newSwState = { ...currentSwState, ...swStateToSet }; - sessionStorage.setItem(sessionStorageKeys.SW_STATUS, JSON.stringify(newSwState)); + const { data } = await request.get('/conf.yml'); + return yamlLoad(data) || null; } catch (e) { - statusErrorMsg('Service Worker Status', 'Error Updating SW Status', e); + statusErrorMsg(SW_LABEL, 'Failed to load config for SW check', e); + return null; } }; -/** - * Checks if service workers should be enabled - * Disable if not running in production - * Or disable if user specified to disable - */ -const shouldEnableServiceWorker = async () => { - const conf = yaml.load((await request.get('/conf.yml')).data); - if (conf && conf.appConfig && conf.appConfig.enableServiceWorker) { - setSwStatus({ disabledByUser: false }); - return true; - } else if (process.env.NODE_ENV !== 'production') { - setSwStatus({ devMode: true }); - return false; - } - setSwStatus({ disabledByUser: true }); - return false; +/* Best-effort cleanup of any prior service worker (used when user opts out) */ +const unregisterAll = async () => { + try { + const regs = await navigator.serviceWorker.getRegistrations(); + if (!regs.length) return; + await Promise.all(regs.map(r => r.unregister().catch(() => {}))); + statusMsg(SW_LABEL, 'Service worker unregistered (opt-out).'); + } catch { /* no-op */ } }; -/* Calls to the print status function */ -const printSwStatus = (msg) => { - statusMsg('Service Worker Status', msg); +/* Sticky toast with a Refresh action that swaps in the new SW and reloads */ +const promptForUpdate = (updateSW) => { + const t = i18n.global.t; + toast(t('updates.sw-update-available'), { + type: 'info', + duration: 0, + dismissible: true, + action: { text: t('updates.sw-update-action'), onClick: () => updateSW(true) }, + }); }; -const swUrl = `${process.env.BASE_URL || '/'}service-worker.js`; +const initServiceWorker = async () => { + if (import.meta.env.DEV) return; + if (!('serviceWorker' in navigator)) return; -/* If service worker enabled, then register it, and print message when status changes */ -const registerServiceWorker = async () => { - if (await shouldEnableServiceWorker()) { - register(swUrl, { - ready() { - setSwStatus({ ready: true }); - printSwStatus( - 'Dashy is being served from cache by a service worker.\n' - + 'For more details, visit https://goo.gl/AFskqB', - ); - }, - registered() { - setSwStatus({ registered: true }); - printSwStatus('Service worker has been registered.'); - }, - cached() { - setSwStatus({ cached: true }); - printSwStatus('App has been cached for offline use.'); - }, - updatefound() { - setSwStatus({ updateFound: true }); - printSwStatus('New content is downloading...'); - }, - updated() { - setSwStatus({ updated: true }); - printSwStatus('New content is available; please refresh the page.'); - }, - offline() { - setSwStatus({ offline: true }); - printSwStatus('No internet connection found. Dashy is running in offline mode.'); - }, - error(error) { - setSwStatus({ error: true }); - statusErrorMsg('Service Worker Status', 'Error during SW registration', error); + const conf = await loadAppConfig(); + if (!conf) return; // network/parse failed โ€” leave any existing SW alone + + if (!conf.appConfig?.enableServiceWorker) { + await unregisterAll(); + return; + } + + try { + const { registerSW } = await import('virtual:pwa-register'); + const updateSW = registerSW({ + onRegisteredSW(swUrl, reg) { + statusMsg(SW_LABEL, `Service worker registered (${swUrl}).`); + if (reg) setInterval(() => reg.update().catch(() => {}), UPDATE_CHECK_INTERVAL_MS); }, + onNeedRefresh: () => promptForUpdate(updateSW), + onOfflineReady: () => statusMsg(SW_LABEL, 'App is ready for offline use.'), + onRegisterError: (e) => statusErrorMsg(SW_LABEL, 'Error during SW registration', e), }); + } catch (e) { + statusErrorMsg(SW_LABEL, 'Error setting up service worker', e); } }; -export default registerServiceWorker; +export default initServiceWorker; diff --git a/src/utils/IsVisibleToUser.js b/src/utils/IsVisibleToUser.js index 9b80bcbadc..97c2f03030 100644 --- a/src/utils/IsVisibleToUser.js +++ b/src/utils/IsVisibleToUser.js @@ -5,8 +5,8 @@ */ // Import helper functions from auth, to get current user, and check if guest -import { localStorageKeys } from '@/utils/defaults'; -import { isLoggedInAsGuest } from '@/utils/Auth'; +import { localStorageKeys } from '@/utils/config/defaults'; +import { isLoggedInAsGuest } from '@/utils/auth/Auth'; /* Helper function, checks if a given testValue is found in the visibility list */ const determineVisibility = (visibilityList, testValue) => { @@ -44,10 +44,14 @@ export const isVisibleToUser = (displayData, currentUser) => { if (showForUsers.length < 1) return true; return determineVisibility(showForUsers, cUsername); }; + const getKeycloakInfo = () => { + try { return JSON.parse(localStorage.getItem(localStorageKeys.KEYCLOAK_INFO) || '{}'); } + catch { return {}; } + }; const checkKeycloakVisibility = () => { if (!displayData.hideForKeycloakUsers) return true; - const { groups, roles } = JSON.parse(localStorage.getItem(localStorageKeys.KEYCLOAK_INFO) || '{}'); + const { groups, roles } = getKeycloakInfo(); const hideForGroups = displayData.hideForKeycloakUsers.groups || []; const hideForRoles = displayData.hideForKeycloakUsers.roles || []; @@ -57,7 +61,7 @@ export const isVisibleToUser = (displayData, currentUser) => { const checkKeycloakHiddenability = () => { if (!displayData.showForKeycloakUsers) return true; - const { groups, roles } = JSON.parse(localStorage.getItem(localStorageKeys.KEYCLOAK_INFO) || '{}'); + const { groups, roles } = getKeycloakInfo(); const showForGroups = displayData.showForKeycloakUsers.groups || []; const showForRoles = displayData.showForKeycloakUsers.roles || []; diff --git a/src/utils/MiscHelpers.js b/src/utils/MiscHelpers.js index dc8863ff60..1e81cf9fe4 100644 --- a/src/utils/MiscHelpers.js +++ b/src/utils/MiscHelpers.js @@ -1,5 +1,5 @@ /* A collection of generic reusable functions for various string processing tasks */ -/* eslint-disable arrow-body-style */ + /* Very rudimentary hash function for generative icons */ export const asciiHash = (input) => { diff --git a/src/utils/NavLinks.js b/src/utils/NavLinks.js new file mode 100644 index 0000000000..0591fb43d5 --- /dev/null +++ b/src/utils/NavLinks.js @@ -0,0 +1,23 @@ +import { makePageSlug, viewFromPath } from '@/utils/config/ConfigHelpers'; +import { checkPageVisibility } from '@/utils/CheckPageVisibility'; + +/* True when the string looks like an absolute http(s) URL */ +export const isHttpUrl = (str) => /^(http|https):\/\/\S+/.test(str); + +/* Map a link's `target` config value to a valid HTML anchor target */ +export const resolveLinkTarget = (link) => { + const t = link && link.target; + if (t === 'sametab') return '_self'; + if (t === 'parent') return '_parent'; + if (t === 'top') return '_top'; + return '_blank'; +}; + +/* Combined list of user-defined nav links + visible sub-pages for the current + * view. Each entry: { path, title, target? }. Empty list means nothing to show. */ +export const buildAllLinks = (store, route, extraLinks = []) => { + const view = viewFromPath(route.path); + const subPages = (store.getters.pages || []).filter(checkPageVisibility) + .map((page) => ({ path: makePageSlug(page.name, view), title: page.name })); + return [...(extraLinks || []), ...subPages]; +}; diff --git a/src/utils/PageMeta.js b/src/utils/PageMeta.js new file mode 100644 index 0000000000..cfbf116fb9 --- /dev/null +++ b/src/utils/PageMeta.js @@ -0,0 +1,109 @@ +/** + * Handles app page meta tags. Like title, description, icon, color, etc. + */ + +import { makePageName, viewFromPath } from '@/utils/config/ConfigHelpers'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; + +const FALLBACK_TITLE = 'Dashy'; + +export const VIEW_LABELS = { home: null, minimal: 'Minimal', workspace: 'Workspace' }; + +export const STATIC_ROUTE_LABELS = { + login: 'Login', + about: 'About', + download: 'Download Config', + 404: 'Not Found', +}; + +/* Resolve the section display name from its URL slug, or undefined if no match */ +const resolveSectionName = (sectionSlug, sections) => { + if (!sectionSlug || !Array.isArray(sections)) return undefined; + const match = sections.find((s) => makePageName(s?.name || '') === sectionSlug); + return match?.name; +}; + +/* Reject bad URLs from favicon path. Only allows URLs, paths and data URI */ +const validateFavicon = (value) => { + if (typeof value !== 'string') return null; + const url = value.trim(); + if (!url) return null; + if (/^(javascript|vbscript):/i.test(url)) { + ErrorHandler(`Unsafe favicon URL rejected: ${value}`); + return null; + } + return url; +}; + +/* Uses the browser's own CSS parser as the source of truth for valid color values. */ +const validateColor = (value) => { + if (typeof value !== 'string') return null; + const color = value.trim(); + if (!color) return null; + if (window.CSS?.supports?.('color', color)) return color; + ErrorHandler(`Invalid theme color rejected: ${value}`); + return null; +}; + +/* Compute the metadata object for the current route + store */ +export const computePageMeta = (route, store) => { + const staticLabel = STATIC_ROUTE_LABELS[route?.name]; + if (staticLabel) return { title: `${staticLabel} | ${FALLBACK_TITLE}`, description: '' }; + + const pageInfo = store?.getters?.pageInfo || {}; + const base = pageInfo.title || FALLBACK_TITLE; + const view = viewFromPath(route?.path); + const viewLabel = VIEW_LABELS[view]; + const sectionName = resolveSectionName(route?.params?.section, store?.getters?.sections); + const title = [sectionName, base, viewLabel].filter(Boolean).join(' | ') || FALLBACK_TITLE; + return { + title, + description: pageInfo.description || '', + themeColor: validateColor(pageInfo.color), + favicon: validateFavicon(pageInfo.favicon), + }; +}; + +/* Upsert a tag in the document head */ +const setMetaTag = (name, content) => { + let tag = document.querySelector(`meta[name="${name}"]`); + if (!tag) { + tag = document.createElement('meta'); + tag.setAttribute('name', name); + document.head.appendChild(tag); + } + tag.setAttribute('content', content || ''); +}; + +/* Update every href, or create one if none exist */ +const setFavicon = (href) => { + const links = document.querySelectorAll('link[rel~="icon"]'); + if (links.length === 0) { + const link = document.createElement('link'); + link.setAttribute('rel', 'icon'); + link.setAttribute('href', href); + document.head.appendChild(link); + return; + } + links.forEach((l) => l.setAttribute('href', href)); +}; + +/* Map of meta-field to DOM writer + * If sub-page doesn't have an override, it will inherit from root */ +const APPLIERS = { + title: (v) => { document.title = v || FALLBACK_TITLE; }, + description: (v) => setMetaTag('description', v), + themeColor: (v) => { if (v) setMetaTag('theme-color', v); }, + favicon: (v) => { if (v) setFavicon(v); }, +}; + +/* Side-effect: push a meta object onto the DOM */ +export const applyPageMeta = (meta) => { + Object.entries(meta || {}).forEach(([key, value]) => { + const apply = APPLIERS[key]; + if (apply) apply(value); + }); +}; + +/* Convenience: compute + apply in one call */ +export const syncPageMeta = (route, store) => applyPageMeta(computePageMeta(route, store)); diff --git a/src/utils/RssParser.js b/src/utils/RssParser.js new file mode 100644 index 0000000000..f4d04913e0 --- /dev/null +++ b/src/utils/RssParser.js @@ -0,0 +1,86 @@ +/** + * Minimal RSS 2.0 / Atom 1.0 parser using the browser's native DOMParser. + * Returns `{ title, link, description, image, author, items }` in a shape + * compatible with `sanitizeRssMeta` and `sanitizeRssItem`. + */ + +const childByName = (el, name) => ( + el ? Array.from(el.children).find((c) => c.localName === name) : null +); + +const childrenByName = (el, name) => ( + el ? Array.from(el.children).filter((c) => c.localName === name) : [] +); + +const childText = (el, name) => childByName(el, name)?.textContent?.trim() || ''; + +const atomLink = (el) => { + const links = childrenByName(el, 'link'); + const alt = links.find((l) => l.getAttribute('rel') === 'alternate') || links[0]; + return alt?.getAttribute('href') || ''; +}; + +const parseAtomItem = (el) => { + const author = childByName(el, 'author'); + const thumb = childByName(el, 'thumbnail') || childByName(el, 'content'); + return { + title: childText(el, 'title'), + link: atomLink(el), + description: childText(el, 'content') || childText(el, 'summary'), + pubDate: childText(el, 'published') || childText(el, 'updated'), + author: author ? childText(author, 'name') : '', + thumbnail: thumb?.getAttribute('url') || '', + }; +}; + +const parseRssItem = (el) => { + const enclosure = childByName(el, 'enclosure'); + const thumb = childByName(el, 'thumbnail'); + return { + title: childText(el, 'title'), + link: childText(el, 'link'), + description: childText(el, 'encoded') || childText(el, 'description'), + pubDate: childText(el, 'pubDate'), + author: childText(el, 'creator') || childText(el, 'author'), + thumbnail: thumb?.getAttribute('url') || enclosure?.getAttribute('url') || '', + }; +}; + +export const parseRssFeed = (xml) => { + if (!xml || typeof xml !== 'string') throw new Error('Empty feed response'); + + const doc = new DOMParser().parseFromString(xml, 'text/xml'); + if (doc.querySelector('parsererror')) throw new Error('Invalid feed XML'); + + const root = doc.documentElement; + const isAtom = root.localName === 'feed'; + const channel = isAtom ? root : childByName(root, 'channel'); + if (!channel) throw new Error('Unrecognized feed format'); + + const meta = isAtom + ? { + title: childText(channel, 'title'), + link: atomLink(channel), + description: childText(channel, 'subtitle'), + image: childText(channel, 'logo') || childText(channel, 'icon'), + author: (() => { + const a = childByName(channel, 'author'); + return a ? childText(a, 'name') : ''; + })(), + } + : { + title: childText(channel, 'title'), + link: childText(channel, 'link'), + description: childText(channel, 'description'), + image: (() => { + const img = childByName(channel, 'image'); + return img ? childText(img, 'url') : ''; + })(), + author: childText(channel, 'managingEditor') || childText(channel, 'author'), + }; + + const itemEls = childrenByName(channel, isAtom ? 'entry' : 'item'); + const items = itemEls.map(isAtom ? parseAtomItem : parseRssItem); + + return { ...meta, items }; +}; diff --git a/src/utils/Sanitizer.js b/src/utils/Sanitizer.js index 73a3c089ae..6e53308693 100644 --- a/src/utils/Sanitizer.js +++ b/src/utils/Sanitizer.js @@ -4,7 +4,7 @@ */ import DOMPurify from 'dompurify'; -import ErrorHandler from '@/utils/ErrorHandler'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; // DOMPurify settings const HTML_SANITIZE_CONFIG = { @@ -64,7 +64,7 @@ export const sanitizeUrl = (url) => { return trimmedUrl; } return null; - } catch (error) { + } catch { return null; } }; diff --git a/src/utils/Search.js b/src/utils/Search.js index 99f3248403..d2f61001b6 100644 --- a/src/utils/Search.js +++ b/src/utils/Search.js @@ -1,7 +1,7 @@ /* Dashy: Licensed under MIT, (C) Alicia Sykes 2024 */ /* Tile filtering utility */ -import ErrorHandler from '@/utils/ErrorHandler'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; /** * Extracts the site name from domain diff --git a/src/utils/SortItems.js b/src/utils/SortItems.js new file mode 100644 index 0000000000..d4de6c12f9 --- /dev/null +++ b/src/utils/SortItems.js @@ -0,0 +1,36 @@ +import { localStorageKeys, sortOrder as defaultSortOrder } from '@/utils/config/defaults'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; + +/* Reads a `{ itemId: count }` map out of local storage, returning {} on any error. */ +const readUsage = (key) => { + try { return JSON.parse(localStorage.getItem(key) || '{}'); } catch { return {}; } +}; + +const byTitle = (items) => [...items].sort( + (a, b) => ((a.title || '').toLowerCase() > (b.title || '').toLowerCase() ? 1 : -1), +); + +const byUsage = (items, key) => { + const counts = readUsage(key); + const get = (item) => counts[item.id] || 0; + return [...items].reverse().sort((a, b) => (get(a) < get(b) ? 1 : -1)); +}; + +const shuffled = (items) => items + .map((value) => ({ value, sort: Math.random() })) + .sort((a, b) => a.sort - b.sort) + .map(({ value }) => value); + +/* If valid sort order provided, then returns a sorted copy of items */ +export default function sortItems(items, order, sectionTitle = '') { + const list = Array.isArray(items) ? items.slice() : []; + const ord = order || defaultSortOrder; + if (ord === 'default') return list; + if (ord === 'alphabetical') return byTitle(list); + if (ord === 'reverse-alphabetical') return byTitle(list).reverse(); + if (ord === 'most-used') return byUsage(list, localStorageKeys.MOST_USED); + if (ord === 'last-used') return byUsage(list, localStorageKeys.LAST_USED); + if (ord === 'random') return shuffled(list); + ErrorHandler(`Unknown Sort order '${ord}'${sectionTitle ? ` under '${sectionTitle}'` : ''}`); + return list; +} diff --git a/src/utils/StoreMutations.js b/src/utils/StoreMutations.js index 0332d8fd8a..dc5beea34a 100644 --- a/src/utils/StoreMutations.js +++ b/src/utils/StoreMutations.js @@ -4,6 +4,8 @@ const KEY_NAMES = [ 'INITIALIZE_ROOT_CONFIG', 'INITIALIZE_MULTI_PAGE_CONFIG', 'SET_CONFIG', + 'SET_CONFIG_SOURCE', + 'APPLY_EDITED_CONFIG', 'SET_ROOT_CONFIG', 'SET_CURRENT_CONFIG_INFO', 'SET_IS_USING_LOCAL_CONFIG', @@ -14,7 +16,6 @@ const KEY_NAMES = [ 'SET_ITEM_LAYOUT', 'SET_ITEM_SIZE', 'SET_THEME', - 'SET_CUSTOM_COLORS', 'USE_MAIN_CONFIG', 'UPDATE_ITEM', 'SET_PAGE_INFO', @@ -27,9 +28,13 @@ const KEY_NAMES = [ 'COPY_ITEM', 'REMOVE_ITEM', 'INSERT_ITEM', + 'INSERT_WIDGET', + 'UPDATE_WIDGET', + 'REMOVE_WIDGET', 'UPDATE_CUSTOM_CSS', 'CONF_MENU_INDEX', 'CRITICAL_ERROR_MSG', + 'AUTH_CHANGED', ]; // Convert array of key names into an object, and export diff --git a/src/utils/Theming.js b/src/utils/Theming.js new file mode 100644 index 0000000000..30d1fbaf52 --- /dev/null +++ b/src/utils/Theming.js @@ -0,0 +1,96 @@ +/** + * Utils for applying user's theme to the document + */ + +import { localStorageKeys, mainCssVars, builtInThemes } from '@/utils/config/defaults'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; + +const EXTERNAL_STYLE_ID = 'user-defined-stylesheet'; +const html = () => document.documentElement; + +/* Map of { label: href } for stylesheets declared in appConfig.externalStyleSheet */ +export const getExternalThemes = (appConfig) => { + const ext = appConfig?.externalStyleSheet; + if (!ext) return {}; + if (Array.isArray(ext)) { + return Object.fromEntries(ext.map((href, i) => [`External Stylesheet ${i + 1}`, href])); + } + if (typeof ext === 'string') return { 'External Stylesheet': ext }; + ErrorHandler('External stylesheets must be of type string or string[]'); + return {}; +}; + +/* Names of user-defined themes (appConfig.cssThemes). Always returns an array. */ +export const getExtraThemeNames = (appConfig) => { + const t = appConfig?.cssThemes; + if (!t) return []; + return typeof t === 'string' ? [t] : t; +}; + +const resetDom = () => { + document.getElementById(EXTERNAL_STYLE_ID)?.remove(); + html().removeAttribute('data-theme'); +}; + +const applyRemote = (href) => { + resetDom(); + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.id = EXTERNAL_STYLE_ID; + link.href = href; + document.head.appendChild(link); +}; + +/* Collect every CSS var name that appears in any theme's custom colors */ +const allKnownVarNames = (colorMap) => { + const names = new Set(); + Object.values(colorMap || {}).forEach((themeVars) => { + Object.keys(themeVars || {}).forEach((v) => names.add(v)); + }); + return names; +}; + +const applyCustomVars = (theme, appConfig) => { + let localColors = {}; + try { + localColors = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}'); + } catch (e) { + ErrorHandler('Corrupted theme data in localstorage', e); + } + const configColors = appConfig?.customColors || {}; + + // Clear any and all vars set by a previous theme + const toClear = new Set([ + ...mainCssVars, + ...allKnownVarNames(configColors), + ...allKnownVarNames(localColors), + ]); + toClear.forEach((v) => html().style.removeProperty(`--${v}`)); + + // Apply the current theme's custom colors (localStorage overrides appConfig) + const vars = { ...configColors, ...localColors }[theme]; + if (!vars) return; + Object.entries(vars).forEach(([k, v]) => html().style.setProperty(`--${k}`, v)); +}; + +/** + * Apply a theme name to the document + * Handles built-in, user-defined, external stylesheets, + * the special "default" reset, and per-theme custom CSS vars + */ +export const applyTheme = (theme, appConfig = {}) => { + if (!theme) return; + const externals = getExternalThemes(appConfig); + const locals = [...builtInThemes, ...getExtraThemeNames(appConfig)]; + + if (theme.toLowerCase() === 'default') { + resetDom(); + } else if (locals.includes(theme)) { + resetDom(); + html().setAttribute('data-theme', theme); + } else if (externals[theme]) { + applyRemote(externals[theme]); + } + applyCustomVars(theme, appConfig); +}; diff --git a/src/utils/Toast.js b/src/utils/Toast.js new file mode 100644 index 0000000000..7cfe554f14 --- /dev/null +++ b/src/utils/Toast.js @@ -0,0 +1,249 @@ +/** + * Dashy's $toast plugin, for action/toast notifications + * + * Usage: registered globally as `$toast` โ€” no import needed in components. + * this.$toast('Saved'); // neutral info toast + * this.$toast.success('Saved successfully'); + * this.$toast.error('Something broke', { duration: 0 }); // 0 = sticky + * this.$toast.show(msg, { type, duration, dismissible, action, html }); + * + * Options: + * type 'info' | 'success' | 'error' | 'warning' (default 'info') + * duration ms before auto-dismiss; 0 = sticky (default 3000) + * dismissible show close button (default false) + * action { text, onClick } (default none) + * html render content as sanitized HTML (default false) + * className extra class(es) on the toast + * onClose callback when toast is removed + * + * Returns { id, dismiss } from show() so callers can dismiss programmatically. + */ +import DOMPurify from 'dompurify'; + +const DEFAULTS = { type: 'info', duration: 3000, dismissible: false }; +const MAX_STACK = 5; +const TRANSITION_MS = 200; +const CONTAINER_ID = 'dashy-toasts'; + +let idCounter = 0; +let stylesInjected = false; +let containerEl = null; +const toasts = new Map(); + +function injectStyles() { + if (stylesInjected) return; + stylesInjected = true; + const style = document.createElement('style'); + style.id = 'dashy-toast-styles'; + style.textContent = ` + #${CONTAINER_ID} { + position: fixed; + bottom: 1rem; + left: 50%; + z-index: 99; + display: flex; + flex-direction: column-reverse; + gap: 0.5rem; + width: max-content; + max-width: min(90vw, 32rem); + pointer-events: none; + transform: translateX(-50%); + } + .dashy-toast { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.6rem 0.9rem; + border: 1px solid var(--toast-color); + border-radius: var(--curve-factor); + background: var(--toast-background); + color: var(--toast-color); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + line-height: 1.3; + pointer-events: auto; + opacity: 0; + transform: translateY(1rem); + transition: opacity ${TRANSITION_MS}ms ease, transform ${TRANSITION_MS}ms ease; + } + .dashy-toast.is-visible { + opacity: 1; + transform: translateY(0); + } + .dashy-toast.is-leaving { + opacity: 0; + } + .dashy-toast--success { + background: var(--success); + border-color: transparent; + color: #fff; + } + .dashy-toast--error { + background: var(--danger); + border-color: transparent; + color: #fff; + } + .dashy-toast--warning { + background: var(--warning); + border-color: transparent; + color: #fff; + } + .dashy-toast__msg { + flex: 1; + min-width: 0; + overflow-wrap: break-word; + } + .dashy-toast__action, + .dashy-toast__close { + background: transparent; + color: inherit; + font: inherit; + cursor: pointer; + } + .dashy-toast__action { + padding: 0.2rem 0.6rem; + border: 1px solid currentColor; + border-radius: 2px; + } + .dashy-toast__close { + padding: 0 0.25rem; + border: 0; + font-size: 1.25rem; + line-height: 1; + opacity: 0.7; + } + .dashy-toast__action:hover, + .dashy-toast__action:focus-visible { + background: rgba(255, 255, 255, 0.15); + } + .dashy-toast__close:hover, + .dashy-toast__close:focus-visible { + opacity: 1; + } + @media (max-width: 600px) { + #${CONTAINER_ID} { + left: 0.5rem; + right: 0.5rem; + width: auto; + max-width: none; + transform: none; + } + } + @media (prefers-reduced-motion: reduce) { + .dashy-toast { + transition: opacity ${TRANSITION_MS}ms ease; transform: none !important; + } + } + `; + document.head.appendChild(style); +} + +function ensureContainer() { + if (containerEl?.isConnected) return containerEl; + containerEl = document.createElement('div'); + containerEl.id = CONTAINER_ID; + containerEl.setAttribute('role', 'region'); + containerEl.setAttribute('aria-label', 'Notifications'); + document.body.appendChild(containerEl); + return containerEl; +} + +function dismiss(id) { + const t = toasts.get(id); + if (!t) return; + clearTimeout(t.timer); + toasts.delete(id); + t.el.classList.add('is-leaving'); + t.el.classList.remove('is-visible'); + setTimeout(() => { + t.el.remove(); + if (containerEl && !containerEl.children.length) { + containerEl.remove(); + containerEl = null; + } + t.onClose?.(); + }, TRANSITION_MS); +} + +function clear() { [...toasts.keys()].forEach(dismiss); } + +function show(message, opts = {}) { + if (message == null || message === '') return { id: null, dismiss: () => {} }; + injectStyles(); + const container = ensureContainer(); + + // Evict oldest if stack full + if (toasts.size >= MAX_STACK) dismiss(toasts.keys().next().value); + + const cfg = { ...DEFAULTS, ...opts }; + const id = ++idCounter; + const isError = cfg.type === 'error'; + + const el = document.createElement('div'); + el.className = `dashy-toast dashy-toast--${cfg.type}`; + if (cfg.className) el.classList.add(...String(cfg.className).split(/\s+/).filter(Boolean)); + el.setAttribute('role', isError ? 'alert' : 'status'); + el.setAttribute('aria-live', isError ? 'assertive' : 'polite'); + el.setAttribute('aria-atomic', 'true'); + + const msg = document.createElement('div'); + msg.className = 'dashy-toast__msg'; + if (cfg.html) msg.innerHTML = DOMPurify.sanitize(String(message)); + else msg.textContent = String(message); + el.appendChild(msg); + + if (cfg.action?.text) { + const btn = document.createElement('button'); + btn.type = 'button'; + btn.className = 'dashy-toast__action'; + btn.textContent = cfg.action.text; + btn.addEventListener('click', () => { cfg.action.onClick?.(); dismiss(id); }); + el.appendChild(btn); + } + + const needsClose = cfg.dismissible || cfg.duration === 0; + if (needsClose) { + const close = document.createElement('button'); + close.type = 'button'; + close.className = 'dashy-toast__close'; + close.setAttribute('aria-label', 'Close notification'); + close.innerHTML = '×'; + close.addEventListener('click', () => dismiss(id)); + el.appendChild(close); + } + + container.appendChild(el); + requestAnimationFrame(() => el.classList.add('is-visible')); + + const entry = { el, timer: null, onClose: cfg.onClose }; + toasts.set(id, entry); + + if (cfg.duration > 0) { + const start = () => { entry.timer = setTimeout(() => dismiss(id), cfg.duration); }; + start(); + el.addEventListener('mouseenter', () => clearTimeout(entry.timer)); + el.addEventListener('mouseleave', start); + el.addEventListener('focusin', () => clearTimeout(entry.timer)); + el.addEventListener('focusout', start); + } + + return { id, dismiss: () => dismiss(id) }; +} + +// Callable API: $toast(msg) + helpers +const toast = (msg, opts) => show(msg, opts); +toast.show = show; +toast.success = (msg, opts) => show(msg, { ...opts, type: 'success' }); +toast.error = (msg, opts) => show(msg, { ...opts, type: 'error' }); +toast.info = (msg, opts) => show(msg, { ...opts, type: 'info' }); +toast.warning = (msg, opts) => show(msg, { ...opts, type: 'warning' }); +toast.dismiss = dismiss; +toast.clear = clear; + +export { toast }; +export function useToast() { return toast; } + +export default { + install(app) { + app.config.globalProperties.$toast = toast; + }, +}; diff --git a/src/utils/Auth.js b/src/utils/auth/Auth.js similarity index 90% rename from src/utils/Auth.js rename to src/utils/auth/Auth.js index 981e39652d..9ab9a3483e 100644 --- a/src/utils/Auth.js +++ b/src/utils/auth/Auth.js @@ -1,9 +1,9 @@ import sha256 from 'crypto-js/sha256'; -import ConfigAccumulator from '@/utils/ConfigAccumalator'; -import ErrorHandler from '@/utils/ErrorHandler'; -import { cookieKeys, localStorageKeys, userStateEnum } from '@/utils/defaults'; -import { isKeycloakEnabled } from '@/utils/KeycloakAuth'; -import { isOidcEnabled } from '@/utils/OidcAuth'; +import ConfigAccumulator from '@/utils/config/ConfigAccumalator'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; +import { cookieKeys, localStorageKeys, userStateEnum } from '@/utils/config/defaults'; +import { isKeycloakEnabled } from '@/utils/auth/KeycloakAuth'; +import { isOidcEnabled } from '@/utils/auth/OidcAuth'; /* Uses config accumulator to get and return app config */ const getAppConfig = () => { @@ -56,7 +56,8 @@ const generateUserToken = (user) => { ErrorHandler('Invalid user object. Must have `user` and either a `hash` or `password` param'); return undefined; } - const passHash = user.hash || sha256(process.env[user.password]).toString().toUpperCase(); + const envKey = (user.password || '').replace(/^VUE_APP_/, 'VITE_APP_'); + const passHash = user.hash || sha256(import.meta.env[envKey]).toString().toUpperCase(); const strAndUpper = (input) => input.toString().toUpperCase(); const sha = sha256(strAndUpper(user.user) + strAndUpper(passHash)); return strAndUpper(sha); @@ -73,10 +74,10 @@ export const makeBasicAuthHeaders = () => { const token = getCookieToken(); const bearerAuth = (token && token.length > 5) ? `Bearer ${token}` : null; - const username = process.env.VUE_APP_BASIC_AUTH_USERNAME + const username = import.meta.env.VITE_APP_BASIC_AUTH_USERNAME || localStorage[localStorageKeys.USERNAME] || 'user'; - const password = process.env.VUE_APP_BASIC_AUTH_PASSWORD || bearerAuth; + const password = import.meta.env.VITE_APP_BASIC_AUTH_PASSWORD || bearerAuth; const basicAuth = `Basic ${btoa(`${username}:${password}`)}`; return password ? { headers: { Authorization: basicAuth } } : {}; @@ -140,13 +141,14 @@ export const checkCredentials = (username, pass, users, messages) => { users.forEach((user) => { if (user.user.toLowerCase() === username.toLowerCase()) { // User found if (user.password) { - if (!user.password.startsWith('VUE_APP_')) { - ErrorHandler('Invalid password format. Please use VUE_APP_ prefix'); + const credEnvKey = user.password.replace(/^VUE_APP_/, 'VITE_APP_'); + if (!user.password.startsWith('VUE_APP_') && !user.password.startsWith('VITE_APP_')) { + ErrorHandler('Invalid password format. Please use VITE_APP_ prefix'); response = { correct: false, msg: messages.incorrectPassword }; - } else if (!process.env[user.password]) { - ErrorHandler(`Missing environmental variable for ${user.password}`); + } else if (!import.meta.env[credEnvKey]) { + ErrorHandler(`Missing environmental variable for ${credEnvKey}`); response = { correct: false, msg: messages.incorrectPassword }; - } else if (process.env[user.password] === pass) { + } else if (import.meta.env[credEnvKey] === pass) { response = { correct: true, msg: messages.successMsg }; } else { response = { correct: false, msg: messages.incorrectPassword }; diff --git a/src/utils/HeaderAuth.js b/src/utils/auth/HeaderAuth.js similarity index 82% rename from src/utils/HeaderAuth.js rename to src/utils/auth/HeaderAuth.js index 6f296ac16a..e16c0bbbdd 100644 --- a/src/utils/HeaderAuth.js +++ b/src/utils/auth/HeaderAuth.js @@ -1,9 +1,9 @@ import sha256 from 'crypto-js/sha256'; import request from '@/utils/request'; -import ConfigAccumulator from '@/utils/ConfigAccumalator'; -import { cookieKeys, localStorageKeys, serviceEndpoints } from '@/utils/defaults'; -import { InfoHandler, ErrorHandler, InfoKeys } from '@/utils/ErrorHandler'; -import { logout as authLogout } from '@/utils/Auth'; +import ConfigAccumulator from '@/utils/config/ConfigAccumalator'; +import { cookieKeys, localStorageKeys, serviceEndpoints } from '@/utils/config/defaults'; +import { InfoHandler, ErrorHandler, InfoKeys } from '@/utils/logging/ErrorHandler'; +import { logout as authLogout } from '@/utils/auth/Auth'; const getAppConfig = () => { const Accumulator = new ConfigAccumulator(); @@ -24,16 +24,16 @@ class HeaderAuth { login() { return new Promise((resolve, reject) => { - const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin; + const baseUrl = import.meta.env.VITE_APP_DOMAIN || window.location.origin; request.get(`${baseUrl}${serviceEndpoints.getUser}`).then((response) => { if (!response.data) { - reject(Error('Error, expected data nout returned')); + reject(Error('Error, expected data not returned')); } else if (response.data.errorMsg) { reject(response.data.errorMsg); } else { try { this.users.forEach((user) => { - if (user.user.toLowerCase() === response.data.user.toLowerCase()) { // User found + if (user.user.toLowerCase() === response.data.user.toLowerCase()) { const strAndUpper = (input) => input.toString().toUpperCase(); const sha = strAndUpper(sha256(strAndUpper(user.user) + strAndUpper(user.hash))); document.cookie = `${cookieKeys.AUTH_TOKEN}=${sha};`; @@ -47,11 +47,11 @@ class HeaderAuth { reject(e); } } - }); + }).catch(reject); }); } - // eslint-disable-next-line class-methods-use-this + logout() { authLogout(); } diff --git a/src/utils/KeycloakAuth.js b/src/utils/auth/KeycloakAuth.js similarity index 89% rename from src/utils/KeycloakAuth.js rename to src/utils/auth/KeycloakAuth.js index 16fb2f44d0..2dcfd86f88 100644 --- a/src/utils/KeycloakAuth.js +++ b/src/utils/auth/KeycloakAuth.js @@ -1,7 +1,6 @@ -import Keycloak from 'keycloak-js'; -import ConfigAccumulator from '@/utils/ConfigAccumalator'; -import { localStorageKeys } from '@/utils/defaults'; -import ErrorHandler from '@/utils/ErrorHandler'; +import ConfigAccumulator from '@/utils/config/ConfigAccumalator'; +import { localStorageKeys } from '@/utils/config/defaults'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; const getAppConfig = () => { const Accumulator = new ConfigAccumulator(); @@ -15,7 +14,7 @@ const isKeycloakGuestAccessEnabled = () => { }; class KeycloakAuth { - constructor() { + constructor(Keycloak) { const { auth } = getAppConfig(); const { serverUrl, realm, clientId, idpHint, legacySupport, @@ -97,8 +96,9 @@ export const isKeycloakEnabled = () => { let keycloak; -export const initKeycloakAuth = () => { - keycloak = new KeycloakAuth(); +export const initKeycloakAuth = async () => { + const { default: Keycloak } = await import('keycloak-js'); + keycloak = new KeycloakAuth(Keycloak); return keycloak.login(); }; diff --git a/src/utils/OidcAuth.js b/src/utils/auth/OidcAuth.js similarity index 86% rename from src/utils/OidcAuth.js rename to src/utils/auth/OidcAuth.js index 029ba77312..77234bcbd1 100644 --- a/src/utils/OidcAuth.js +++ b/src/utils/auth/OidcAuth.js @@ -1,8 +1,7 @@ -import { UserManager, WebStorageStateStore } from 'oidc-client-ts'; -import ConfigAccumulator from '@/utils/ConfigAccumalator'; -import { localStorageKeys } from '@/utils/defaults'; -import ErrorHandler from '@/utils/ErrorHandler'; -import { statusMsg, statusErrorMsg } from '@/utils/CoolConsole'; +import ConfigAccumulator from '@/utils/config/ConfigAccumalator'; +import { localStorageKeys } from '@/utils/config/defaults'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; +import { statusMsg, statusErrorMsg } from '@/utils/logging/CoolConsole'; const getAppConfig = () => { const Accumulator = new ConfigAccumulator(); @@ -16,7 +15,7 @@ const isOidcGuestAccessEnabled = () => { }; class OidcAuth { - constructor() { + constructor(UserManager, WebStorageStateStore) { const { auth } = getAppConfig(); const { clientId, @@ -105,8 +104,9 @@ export const isOidcEnabled = () => { let oidc; -export const initOidcAuth = () => { - oidc = new OidcAuth(); +export const initOidcAuth = async () => { + const { UserManager, WebStorageStateStore } = await import('oidc-client-ts'); + oidc = new OidcAuth(UserManager, WebStorageStateStore); return oidc.login(); }; diff --git a/src/utils/ConfigAccumalator.js b/src/utils/config/ConfigAccumalator.js similarity index 81% rename from src/utils/ConfigAccumalator.js rename to src/utils/config/ConfigAccumalator.js index f6317b0756..facb26593f 100644 --- a/src/utils/ConfigAccumalator.js +++ b/src/utils/config/ConfigAccumalator.js @@ -11,9 +11,10 @@ import { pageInfo as defaultPageInfo, iconSize as defaultIconSize, layout as defaultLayout, -} from '@/utils/defaults'; -import ErrorHandler from '@/utils/ErrorHandler'; -import { applyItemId } from '@/utils/SectionHelpers'; + theme as defaultTheme, +} from '@/utils/config/defaults'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; +import { applyItemId } from '@/utils/config/SectionHelpers'; import $store from '@/store'; export default class ConfigAccumulator { @@ -33,11 +34,12 @@ export default class ConfigAccumulator { appConfigFile = this.conf.appConfig; } // Fill in defaults if anything missing - let usersAppConfig = defaultAppConfig; + let usersAppConfig = { ...defaultAppConfig }; if (localStorage[localStorageKeys.APP_CONFIG]) { - usersAppConfig = JSON.parse(localStorage[localStorageKeys.APP_CONFIG]); + try { usersAppConfig = JSON.parse(localStorage[localStorageKeys.APP_CONFIG]); } + catch { ErrorHandler('Malformed app config in local storage'); } } else if (Object.keys(appConfigFile).length > 0) { - usersAppConfig = appConfigFile; + usersAppConfig = { ...appConfigFile }; } // Some settings have their own local storage keys, apply them here usersAppConfig.layout = localStorage[localStorageKeys.LAYOUT_ORIENTATION] @@ -46,6 +48,9 @@ export default class ConfigAccumulator { usersAppConfig.iconSize = localStorage[localStorageKeys.ICON_SIZE] || appConfigFile.iconSize || defaultIconSize; + usersAppConfig.theme = localStorage[localStorageKeys.THEME] + || appConfigFile.theme + || defaultTheme; // Don't let users modify users locally if (appConfigFile.auth) usersAppConfig.auth = appConfigFile.auth; // All done, return final appConfig object @@ -56,9 +61,9 @@ export default class ConfigAccumulator { pageInfo() { let localPageInfo = {}; if (localStorage[localStorageKeys.PAGE_INFO]) { - // eslint-disable-next-line brace-style + try { localPageInfo = JSON.parse(localStorage[localStorageKeys.PAGE_INFO]); } - catch (e) { ErrorHandler('Malformed pageInfo data in local storage'); } + catch { ErrorHandler('Malformed pageInfo data in local storage'); } } const filePageInfo = (this.conf && this.conf.pageInfo) ? this.conf.pageInfo : {}; return { ...defaultPageInfo, ...filePageInfo, ...localPageInfo }; @@ -73,7 +78,7 @@ export default class ConfigAccumulator { try { const json = JSON.parse(localSections); if (json.length >= 1) sections = json; - } catch (e) { + } catch { ErrorHandler('Malformed section data in local storage'); } } diff --git a/src/utils/config/ConfigHelpers.js b/src/utils/config/ConfigHelpers.js new file mode 100644 index 0000000000..bcbf323edb --- /dev/null +++ b/src/utils/config/ConfigHelpers.js @@ -0,0 +1,209 @@ +import ConfigAccumulator from '@/utils/config/ConfigAccumalator'; +import filterUserSections from '@/utils/CheckSectionVisibility'; +import { languages } from '@/utils/languages'; +import { + visibleComponents, + localStorageKeys, + language as defaultLanguage, +} from '@/utils/config/defaults'; + +/* Page id used in URLs to mean "the root config" */ +export const RESERVED_ROOT = 'main'; + +/* Fields owned exclusively by the root config, sub-pages always inherit */ +const ROOT_OWNED_TOP_LEVEL = ['pages']; +const ROOT_OWNED_APP_CONFIG = ['auth']; + +/* Return a shallow copy of `config` with root-owned fields removed */ +export const stripRootOwnedFields = (config) => { + if (!config || typeof config !== 'object') return config; + const clean = { ...config }; + ROOT_OWNED_TOP_LEVEL.forEach((key) => delete clean[key]); + if (clean.appConfig && typeof clean.appConfig === 'object') { + clean.appConfig = { ...clean.appConfig }; + ROOT_OWNED_APP_CONFIG.forEach((key) => delete clean.appConfig[key]); + } + return clean; +}; + +/* Local storage keys for local settings, if confId is set it's for a sub-page */ +export const configScope = (confId) => { + const suffix = confId ? `-${confId}` : ''; + return { + APP_CONFIG: `${localStorageKeys.APP_CONFIG}${suffix}`, + PAGE_INFO: `${localStorageKeys.PAGE_INFO}${suffix}`, + CONF_SECTIONS: `${localStorageKeys.CONF_SECTIONS}${suffix}`, + THEME: `${localStorageKeys.THEME}${suffix}`, + LAYOUT: `${localStorageKeys.LAYOUT_ORIENTATION}${suffix}`, + ICON_SIZE: `${localStorageKeys.ICON_SIZE}${suffix}`, + LANGUAGE: `${localStorageKeys.LANGUAGE}${suffix}`, + }; +}; + +/* Remove all local config settings from localStorage, leave unrelated stuff */ +export const clearScopedLocalConfig = (pages) => { + const clearScope = (confId) => { + Object.values(configScope(confId)).forEach((key) => localStorage.removeItem(key)); + }; + clearScope(null); + localStorage.removeItem(localStorageKeys.CONF_PAGES); + (pages || []).forEach((page) => { + if (page?.name) clearScope(makePageName(page.name)); + }); +}; + +/* Metadata for each view in the canonical //:page?/:section? URL scheme */ +export const VIEW_META = { + home: { supportsSection: true }, + minimal: { supportsSection: true }, + workspace: { supportsSection: false }, +}; + +/* How a URL's :page segment resolves against the current config */ +export const PAGE_STATUS = Object.freeze({ + ROOT: 'root', // no :page, or :page === RESERVED_ROOT + KNOWN: 'known', // matches a real sub-page in config.pages + LEGACY_SECTION: 'legacy', // one-segment URL naming a section of the root config + UNKNOWN: 'unknown', // no match, store raises a critical error +}); + +/* Given a page or section name, produces a deterministic URL slug. + * - NFC-normalizes, lowercase, replaces whitespace with -, strips extension + * - Drops most punctuation/symbols, except unicode alphanumeric + marks */ +export const makePageName = (pageName) => { + if (!pageName) return 'unnamed-page'; + const cleaned = String(pageName) + .normalize('NFC') + .toLowerCase() + .replace(/\.yml$/i, '') + .replace(/\s+/g, '-') + .replace(/[\uFE00-\uFE0F]|[\u{E0100}-\u{E01EF}]/gu, '') + .replace(/[^\p{L}\p{N}\p{M}_-]/gu, '') + .replace(/^-+|-+$/g, ''); + if (!cleaned) return 'unnamed-page'; + if (cleaned === RESERVED_ROOT) return `${RESERVED_ROOT}-page`; + return cleaned; +}; + +/* Build a canonical Dashy route: /[/[/]] + * pageId is slugified sub-config id or null for root + * If section is present, then page ID is also needed, defaults to RESERVED_ROOT + * Can drop the section if the page type (e.g. workspace) doesn't support sec view */ +export const makeRoutePath = (view, pageId, sectionName) => { + const resolvedView = VIEW_META[view] ? view : 'home'; + const base = `/${resolvedView}`; + if (sectionName && VIEW_META[resolvedView].supportsSection) { + return `${base}/${pageId || RESERVED_ROOT}/${makePageName(sectionName)}`; + } + if (pageId) return `${base}/${pageId}`; + return base; +}; + +/* Convenience wrapper: turn a raw page name into a view URL (e.g. nav links) */ +export const makePageSlug = (pageName, view) => makeRoutePath(view, makePageName(pageName)); + +/* Extract the view segment from a path, defaulting to 'home' */ +export const viewFromPath = (path) => { + const seg = (path || '').split('/').filter(Boolean)[0]; + return VIEW_META[seg] ? seg : 'home'; +}; + +/* Parse a Vue Router route into { view, pageId, sectionSlug, status } */ +export const resolveRouteIntent = (route, store) => { + const view = viewFromPath(route?.path); + const { page: rawPage, section: rawSection } = route?.params || {}; + const sectionSlug = rawSection ? makePageName(rawSection) : null; + + if (!rawPage || rawPage === RESERVED_ROOT) { + return { view, pageId: null, sectionSlug, status: PAGE_STATUS.ROOT }; + } + const pageId = makePageName(rawPage); + const pages = store?.getters?.pages || []; + if (pages.some((p) => p?.name && makePageName(p.name) === pageId)) { + return { view, pageId, sectionSlug, status: PAGE_STATUS.KNOWN }; + } + // Legacy one-segment URL naming a root section (only when no explicit :section) + if (!rawSection) { + const rootSections = store?.state?.rootConfig?.sections || []; + if (rootSections.some((s) => s?.name && makePageName(s.name) === pageId)) { + return { view, pageId: null, sectionSlug: pageId, status: PAGE_STATUS.LEGACY_SECTION }; + } + } + return { view, pageId, sectionSlug, status: PAGE_STATUS.UNKNOWN }; +}; + +/* Put fetch path for additional configs in correct format */ +export const formatConfigPath = (configPath) => { + if (!configPath) return null; + if (configPath.includes('http')) return configPath; + const stripped = configPath.replace(/^\.\//, ''); + if (stripped.substring(0, 1) !== '/') return `/${stripped}`; + return stripped; +}; + +/** + * Initiates the Accumulator class and generates a complete config object + * Self-executing function, returns the full user config as a JSON object + */ +export const config = (() => { + const Accumulator = new ConfigAccumulator(); + return { + appConfig: Accumulator.appConfig(), + pageInfo: Accumulator.pageInfo(), + sections: filterUserSections(Accumulator.sections()), + }; +})(); + +/** + * Generates an object containing booleans indicating which + * components should be hidden. This enables the user to hide + * parts of the page and disable functionality that they don't need/ want + * All options fallback on the values defined in the defaults + * @param {object} appConfig The full app config + * @returns {object} result + */ +export const componentVisibility = (appConfig) => { + // Get users choice from app config + const usersChoice = appConfig.hideComponents || {}; + // Checks if value is defined, and is a boolean + const isThere = (userValue) => typeof userValue === 'boolean'; + // For each option, return users choice (if specified), else use the default + return { + pageTitle: isThere(usersChoice.hideHeading) + ? !usersChoice.hideHeading : visibleComponents.pageTitle, + navigation: isThere(usersChoice.hideNav) + ? !usersChoice.hideNav : visibleComponents.navigation, + searchBar: isThere(usersChoice.hideSearch) + ? !usersChoice.hideSearch : visibleComponents.searchBar, + settings: isThere(usersChoice.hideSettings) + ? !usersChoice.hideSettings : visibleComponents.settings, + }; +}; + +/** + * Returns a list of items which the user has assigned a hotkey to + * So that when the hotkey is pressed, the app/ service can be launched + */ +export const getCustomKeyShortcuts = (sections) => { + const results = []; + sections.forEach((section) => { + const itemsWithHotKeys = section.items.filter(item => item.hotkey); + results.push(itemsWithHotKeys.map(item => ({ hotkey: item.hotkey, url: item.url }))); + }); + return results.flat(); +}; + +/** + * Gets the users chosen language. Defaults to English. + * If for any reason a lang code changes, add to legacyAliases for backwards compat + * @returns {object} Language, including code, name and flag + */ +export const getUsersLanguage = () => { + const langCode = localStorage[localStorageKeys.LANGUAGE] + || config.appConfig.language + || defaultLanguage; + const legacyAliases = { cn: 'zh-CN' }; + const resolvedCode = legacyAliases[langCode] || langCode; + const langObj = languages.find(lang => lang.code === resolvedCode); + return langObj; +}; diff --git a/src/utils/ConfigSchema.json b/src/utils/config/ConfigSchema.json similarity index 96% rename from src/utils/ConfigSchema.json rename to src/utils/config/ConfigSchema.json index b59dd90acc..bd27376df6 100644 --- a/src/utils/ConfigSchema.json +++ b/src/utils/config/ConfigSchema.json @@ -160,9 +160,9 @@ } } }, - "footerText": { - "title": "Footer Text", - "description": "Content to display within the global page footer", + "footer": { + "title": "Footer", + "description": "Content to display within the global page footer. Supports inline HTML (sanitized before render).", "type": "string" }, "logo": { @@ -174,6 +174,21 @@ "/web-icons/dashy-logo.png", "https://i.ibb.co/yhbt6CY/dashy.png" ] + }, + "favicon": { + "title": "Favicon", + "type": "string", + "description": "URL or path to a custom favicon shown in the browser tab. Absolute (https://...), root-relative (/icons/x.png), or a data: URI.", + "examples": [ + "/web-icons/favicon-64x64.png", + "https://example.com/favicon.ico" + ] + }, + "color": { + "title": "Theme Color", + "type": "string", + "description": "Color applied to the browser chrome (mobile address bar). Any valid CSS color value.", + "examples": ["#2a7cf0", "rebeccapurple", "rgb(40, 60, 120)"] } }, "required": [ @@ -188,12 +203,13 @@ "title": "Starting View", "type": "string", "enum": [ + "home", "default", "minimal", "workspace" ], - "default": "default", - "description": "Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI" + "default": "home", + "description": "Which view to land on at /. 'home' (or legacy 'default') for the standard home page, 'minimal' for the minimal start page, or 'workspace' for the workspace view. Users can switch views at any time from the UI." }, "defaultOpeningMethod": { "title": "Default Opening Method", @@ -260,7 +276,18 @@ "material-dark-original", "vaporware", "high-contrast-dark", - "high-contrast-light" + "high-contrast-light", + "tokyo-night", + "gruvbox", + "rose-pine", + "parchment", + "aurora", + "zinc", + "solarized-dark", + "solarized-light", + "brutalist", + "midnight", + "catppuccin" ] }, "dayTheme": { @@ -499,12 +526,6 @@ "type": "boolean", "default": false, "description": "If set to true, the settings buttons will be hidden" - }, - "hideFooter": { - "title": "Hide Footer?", - "type": "boolean", - "default": false, - "description": "If set to true, the page footer will be hidden" } } }, @@ -536,14 +557,13 @@ "title": "Hashed Pass", "type": "string", "description": "A SHA-256 hashed password for that user", - "minLength": 64, - "maxLength": 64 + "pattern": "^[a-fA-F0-9]{64}$" }, "password": { "title": "Password", "type": "string", - "description": "The environmental variable pointing to a plaintext password for that user. Must start with VUE_APP_", - "pattern": "^VUE_APP_.*" + "description": "The environmental variable pointing to a plaintext password for that user. Must start with VITE_APP_", + "pattern": "^VITE_APP_.*" }, "type": { "title": "Privileges", @@ -836,7 +856,8 @@ "minimum": 1, "maximum": 5, "default": 1, - "description": "The amount of space that the section spans vertically" + "deprecated": true, + "description": "Deprecated. Section heights now follow content in the masonry layout; this value is accepted for backwards compatibility but has no effect." }, "cols": { "title": "Num Cols", diff --git a/src/utils/SectionHelpers.js b/src/utils/config/SectionHelpers.js similarity index 59% rename from src/utils/SectionHelpers.js rename to src/utils/config/SectionHelpers.js index dfad7e6780..c31ab3b609 100644 --- a/src/utils/SectionHelpers.js +++ b/src/utils/config/SectionHelpers.js @@ -1,6 +1,6 @@ /* Helper functions for Sections and Items */ -import { hideFurnitureOn } from '@/utils/defaults'; +import { hideFurnitureOn } from '@/utils/config/defaults'; /* Returns false if page furniture should be hidden on said route */ export const shouldBeVisible = (routeName) => { @@ -22,20 +22,20 @@ const makeItemId = (sectionStr, itemStr, index) => { return `${index}_${charSum}_${itemTitleStr}`; }; -/* Given an array of sections, apply a unique ID to each item, and return modified array */ -export const applyItemId = (inputSections) => { - const sections = inputSections || []; - sections.forEach((sec, secIdx) => { - if (sec.items) { - sec.items.forEach((item, itemIdx) => { - sections[secIdx].items[itemIdx].id = makeItemId(sec.name, item.title, itemIdx); - }); - } - if (sec.widgets) { - sec.widgets.forEach((widget, widgetIdx) => { - sections[secIdx].widgets[widgetIdx].id = makeItemId(sec.name, widget.type, widgetIdx); - }); - } - }); - return sections; -}; +/* Return a new array of sections with a unique id on each item and widget */ +export const applyItemId = (inputSections) => (inputSections || []).map((section) => { + const next = { ...section }; + if (Array.isArray(section.items)) { + next.items = section.items.map((item, i) => ({ + ...item, + id: makeItemId(section.name, item.title, i), + })); + } + if (Array.isArray(section.widgets)) { + next.widgets = section.widgets.map((widget, i) => ({ + ...widget, + id: makeItemId(section.name, widget.type, i), + })); + } + return next; +}); diff --git a/src/utils/defaults.js b/src/utils/config/defaults.js similarity index 91% rename from src/utils/defaults.js rename to src/utils/config/defaults.js index da69156977..9917bb790c 100644 --- a/src/utils/defaults.js +++ b/src/utils/config/defaults.js @@ -1,10 +1,10 @@ -module.exports = { +const defaults = { /* Default pageInfo object, used if user does not specify their own */ pageInfo: { title: 'Dashy', description: '', navLinks: [], - footerText: '', + footer: '', }, /* Default appConfig to be used, if user does not specify their own */ appConfig: {}, @@ -28,10 +28,9 @@ module.exports = { openingMethod: 'newtab', /* The page paths for each route within the app for the router */ routePaths: { - home: '/home/:config?/', - minimal: '/minimal/:config?/', - workspace: '/workspace/:config?/', - about: '/about', + home: '/home', + minimal: '/minimal', + workspace: '/workspace', login: '/login', download: '/download', notFound: '/404', @@ -41,7 +40,6 @@ module.exports = { statusPing: '/status-ping', statusCheck: '/status-check', save: '/config-manager/save', - rebuild: '/config-manager/rebuild', systemInfo: '/system-info', corsProxy: '/cors-proxy', getUser: '/get-user', @@ -91,6 +89,17 @@ module.exports = { 'neomorphic', 'glass-2', 'night-bat', + 'tokyo-night', + 'gruvbox', + 'rose-pine', + 'parchment', + 'aurora', + 'zinc', + 'solarized-dark', + 'solarized-light', + 'brutalist', + 'midnight', + 'catppuccin', ], /* Default color options for the theme configurator swatches */ swatches: [ @@ -103,7 +112,7 @@ module.exports = { ['#636363', '#363636', '#313941', '#0d0d0d'], ], /* Which CSS variables to show in the first view of theme configurator */ - mainCssVars: ['primary', 'background', 'background-darker'], + mainCssVars: ['primary', 'foreground', 'background', 'background-darker'], /* Which structural components should be visible by default */ visibleComponents: { splashScreen: false, @@ -111,7 +120,6 @@ module.exports = { pageTitle: true, searchBar: true, settings: true, - footer: true, }, /* A list of route names that page furniture (header, footer, etc) should be hidden on */ hideFurnitureOn: ['minimal', 'login', 'download'], @@ -127,7 +135,6 @@ module.exports = { CUSTOM_COLORS: 'customColors', CONF_SECTIONS: 'confSections', CONF_PAGES: 'confPages', - CONF_WIDGETS: 'confSections', PAGE_INFO: 'pageInfo', APP_CONFIG: 'appConfig', BACKUP_ID: 'backupId', @@ -146,21 +153,19 @@ module.exports = { }, /* Key names for session storage identifiers */ sessionStorageKeys: { - SW_STATUS: 'serviceWorkerStatus', ERROR_LOG: 'errorLog', }, /* Unique IDs of modals within the app */ modalNames: { CONF_EDITOR: 'CONF_EDITOR', - REBUILD_APP: 'REBUILD_APP', ABOUT_APP: 'ABOUT_APP', LANG_SWITCHER: 'LANG_SWITCHER', EDIT_ITEM: 'EDIT_ITEM', EDIT_SECTION: 'EDIT_SECTION', + EDIT_WIDGET: 'EDIT_WIDGET', EDIT_PAGE_INFO: 'EDIT_PAGE_INFO', EDIT_APP_CONFIG: 'EDIT_APP_CONFIG', EDIT_MULTI_PAGES: 'EDIT_MULTI_PAGES', - EXPORT_CONFIG_MENU: 'EXPORT_CONFIG_MENU', MOVE_ITEM_TO: 'MOVE_ITEM_TO', }, /* Key names for the top-level objects in conf.yml */ @@ -171,27 +176,6 @@ module.exports = { }, /* Amount of time to show splash screen, when enabled, in milliseconds */ splashScreenTime: 1000, - /* Page meta-data, rendered in the header of each view */ - metaTagData: [{ name: 'description', content: "A simple static homepage for you're server" }], - /* Default option for Toast messages */ - toastedOptions: { - position: 'bottom-center', - duration: 2500, - keepOnHover: true, - className: 'toast-message', - iconPack: 'fontawesome', - }, - /* Default tooltip options */ - tooltipOptions: { - defaultTrigger: 'hover focus', - defaultHideOnTargetClick: true, - autoHide: true, - defaultHtml: false, - defaultPlacement: 'auto', - defaultLoadingContent: 'Loading...', - defaultDelay: { show: 380, hide: 0 }, - // delay: { show: 380, hide: 0 }, - }, /* Server location of the Backup & Sync cloud function */ backupEndpoint: 'https://sync-service.dashy.to', /* Available services for fetching favicon icon for user apps */ @@ -357,3 +341,43 @@ module.exports = { }, }, }; + +export const { + pageInfo, + appConfig, + language, + startingView, + iconSize, + layout, + theme, + fontAwesomeKey, + faviconApi, + sortOrder, + openingMethod, + routePaths, + serviceEndpoints, + builtInThemes, + swatches, + mainCssVars, + visibleComponents, + hideFurnitureOn, + localStorageKeys, + cookieKeys, + sessionStorageKeys, + modalNames, + topLevelConfKeys, + splashScreenTime, + backupEndpoint, + faviconApiEndpoints, + iconCdns, + widgetApiEndpoints, + searchEngineUrls, + defaultSearchEngine, + defaultSearchOpeningMethod, + searchBangs, + sentryDsn, + userStateEnum, + pwa, +} = defaults; + +export default defaults; diff --git a/src/utils/config/pruneSchemaDefaults.js b/src/utils/config/pruneSchemaDefaults.js new file mode 100644 index 0000000000..04c3cefbd1 --- /dev/null +++ b/src/utils/config/pruneSchemaDefaults.js @@ -0,0 +1,50 @@ +/* Strip leaves that match the schema's `default` (or are empty) so saved YAML + * stays minimal. AJV's `useDefaults: true` in SchemaForm fills untouched + * fields with their schema defaults; without pruning they'd persist verbatim. + * Empty objects/arrays/strings are also dropped. */ + +const DROP = Symbol('prune.drop'); + +const isPlainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v); + +function deepEqualJson(a, b) { + if (a === b) return true; + if (typeof a !== typeof b) return false; + if (a === null || b === null) return false; + if (typeof a !== 'object') return false; + try { return JSON.stringify(a) === JSON.stringify(b); } catch { return false; } +} + +function pruneNode(value, schema) { + if (schema && Object.prototype.hasOwnProperty.call(schema, 'default') + && deepEqualJson(value, schema.default)) { + return DROP; + } + if (Array.isArray(value)) { + const itemSchema = schema && schema.items; + const out = []; + for (const item of value) { + const pruned = pruneNode(item, itemSchema); + if (pruned !== DROP) out.push(pruned); + } + return out.length === 0 ? DROP : out; + } + if (isPlainObject(value)) { + const props = schema && schema.properties; + const out = {}; + for (const [k, v] of Object.entries(value)) { + const childSchema = props && props[k]; + const pruned = pruneNode(v, childSchema); + if (pruned !== DROP) out[k] = pruned; + } + return Object.keys(out).length === 0 ? DROP : out; + } + if (value === undefined || value === null || value === '') return DROP; + return value; +} + +export default function pruneSchemaDefaults(data, schema) { + const result = pruneNode(data, schema); + if (result === DROP) return Array.isArray(data) ? [] : {}; + return result; +} diff --git a/src/utils/config/schemaHover.js b/src/utils/config/schemaHover.js new file mode 100644 index 0000000000..535369ce50 --- /dev/null +++ b/src/utils/config/schemaHover.js @@ -0,0 +1,81 @@ +/** + * An extension for CodeMirror 6, + * Shows schema info as tooltips on attribute names + * Like title, description, type, allowed enum values, etc. + */ +import { hoverTooltip } from '@codemirror/view'; +import { parseDocument } from 'yaml'; +import schema from './ConfigSchema.json'; +import { yamlPathAtOffset, schemaAt } from './schemaPath'; + +const escapeHtml = (s) => String(s).replace(/[&<>"']/g, (c) => ({ + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', +}[c])); + +const describeType = (s) => { + if (Array.isArray(s.type)) return s.type.join(' | '); + if (s.type) return s.type; + if (s.properties) return 'object'; + if (s.items) return 'array'; + return null; +}; + +// Returns HTML for a tooltip bod, or null if the schema has nothing worth saying +const renderBody = (s) => { + if (!s) return null; + const rows = []; + + if (s.title) { + rows.push(`
${escapeHtml(s.title)}
`); + } + if (s.description) { + rows.push(`
${escapeHtml(s.description)}
`); + } + + const type = describeType(s); + if (type) { + rows.push(`
Type ${escapeHtml(type)}
`); + } + if (Array.isArray(s.enum)) { + const opts = s.enum.map((v) => `${escapeHtml(v)}`).join(', '); + rows.push(`
Allowed ${opts}
`); + } + if (s.default !== undefined) { + rows.push(`
Default ${escapeHtml(JSON.stringify(s.default))}
`); + } + + return rows.length ? rows.join('') : null; +}; + +export const schemaHover = hoverTooltip((view, pos) => { + const text = view.state.doc.toString(); + if (!text.trim()) return null; + + let doc; + try { + doc = parseDocument(text); + } catch { + return null; + } + + const path = yamlPathAtOffset(doc, pos); + if (!path.length) return null; + + const body = renderBody(schemaAt(schema, path)); + if (!body) return null; + + return { + pos, + above: true, + create() { + const dom = document.createElement('div'); + dom.className = 'cm-schema-hover'; + dom.innerHTML = body; + return { dom }; + }, + }; +}, { hideOnChange: true, hoverTime: 300 }); diff --git a/src/utils/config/schemaLinter.js b/src/utils/config/schemaLinter.js new file mode 100644 index 0000000000..67269013b6 --- /dev/null +++ b/src/utils/config/schemaLinter.js @@ -0,0 +1,73 @@ +/** + * This is a custom linter plugin for CodeMirror (6), + * used when user editing config as code via the config modal + * Does: + * 1. YAML syntax checker, vie js-yaml + * 2. Ajv schema validator using our ConfigSchema.json + */ +import { load as yamlLoad } from 'js-yaml'; +import { parseDocument } from 'yaml'; +import { compiledValidator as validate, formatIssue } from './validateConfig'; +import { pointerToPath, yamlNodeAt, pairRange } from './schemaPath'; + +const clamp = (n, lo, hi) => Math.max(lo, Math.min(hi, n)); + +export function schemaLinter(view) { + const text = view.state.doc.toString(); + if (!text.trim()) return []; + const docLen = view.state.doc.length; + + let data; + try { + data = yamlLoad(text); + } catch (e) { + const line = e.mark?.line ?? 0; + const col = e.mark?.column ?? 0; + const lineObj = view.state.doc.line(clamp(line + 1, 1, view.state.doc.lines)); + const from = clamp(lineObj.from + col, lineObj.from, lineObj.to); + return [{ + from, + to: clamp(from + 1, from, docLen), + severity: 'error', + source: 'yaml', + message: e.reason || e.message, + }]; + } + + if (validate(data)) return []; + + const doc = parseDocument(text); + const diag = (err, start, end) => { + const from = clamp(start, 0, docLen); + const to = clamp(end || start + 1, from + 1, docLen); + return { + from, + to, + severity: 'warning', + source: 'schema', + message: formatIssue(err), + }; + }; + + return (validate.errors || []).map((err) => { + const path = pointerToPath(err.instancePath); + const node = yamlNodeAt(doc.contents, path); + + // Unknown property: Ajv reports the PARENT's path + the bad key name. + // Narrow the highlight to just the offending key's pair, not the parent. + if (err.keyword === 'additionalProperties' && err.params.additionalProperty) { + const range = pairRange(node, err.params.additionalProperty); + if (range) return diag(err, range[0], range[1]); + } + + // Missing required: no child exists to point at, so shrink to one char + // at the parent's opening โ€” the gutter icon lands on its first line only. + if (err.keyword === 'required') { + const start = node?.range?.[0] ?? 0; + return diag(err, start, start + 1); + } + + const [start, end] = node?.range ?? [0, 0]; + return diag(err, start, end); + }); +} diff --git a/src/utils/config/schemaPath.js b/src/utils/config/schemaPath.js new file mode 100644 index 0000000000..ed8d5eed6a --- /dev/null +++ b/src/utils/config/schemaPath.js @@ -0,0 +1,110 @@ +/** + * Shared YAML + JSON-Schema walkers for the linter and the config tooltip extension + */ +import { isMap, isSeq } from 'yaml'; + +const decodeToken = (s) => s.replace(/~1/g, '/').replace(/~0/g, '~'); + +// JSON Pointer (Ajv's instancePath, e.g. "/sections/0/items/2") -> path parts. +export const pointerToPath = (pointer) => (pointer + ? pointer.split('/').slice(1).map(decodeToken) + : []); + +// Return the source range [start, end] for a specific key's pair inside a map +// (covers both the key and its value). Null if the map or key doesn't exist. +export const pairRange = (map, key) => { + if (!isMap(map)) return null; + const pair = map.items.find((p) => { + const k = p.key && 'value' in p.key ? p.key.value : p.key; + return String(k) === String(key); + }); + if (!pair) return null; + const keyRange = pair.key?.range; + const valRange = pair.value?.range; + const start = keyRange?.[0] ?? valRange?.[0]; + const end = valRange?.[2] ?? valRange?.[1] ?? keyRange?.[1]; + return (start != null && end != null) ? [start, end] : null; +}; + +// Walk a parsed YAML Document by path parts, returning the target Node or null. +export const yamlNodeAt = (root, parts) => { + let node = root; + for (const key of parts) { + if (!node) return null; + if (isMap(node)) { + const pair = node.items.find((p) => { + const k = p.key && 'value' in p.key ? p.key.value : p.key; + return String(k) === String(key); + }); + node = pair ? pair.value : null; + } else if (isSeq(node)) { + node = node.items[Number(key)] ?? null; + } else { + return null; + } + } + return node; +}; + +// yaml Nodes expose range as [start, valueEnd, nodeEnd]; fall back if shorter. +const nodeEnd = (r) => (r ? (r[2] ?? r[1] ?? r[0]) : -1); +const inside = (r, offset) => !!r && offset >= r[0] && offset <= nodeEnd(r); + +// Given a parsed YAML Document and a cursor offset, return the path from +// document root to the smallest containing node (e.g. ['sections', 0, 'url']). +// Returns [] when the cursor isn't inside any addressable node. +export const yamlPathAtOffset = (doc, offset) => { + const path = []; + let node = doc?.contents ?? null; + + while (node) { + if (isMap(node)) { + const pair = node.items.find((p) => inside(p.key?.range, offset) || inside(p.value?.range, offset)); + if (!pair) break; + const keyName = pair.key && 'value' in pair.key ? pair.key.value : pair.key; + path.push(String(keyName)); + // Cursor on the key but not the value โ€” stop here rather than descending. + if (inside(pair.key?.range, offset) && !inside(pair.value?.range, offset)) break; + node = pair.value; + } else if (isSeq(node)) { + const idx = node.items.findIndex((it) => inside(it?.range, offset)); + if (idx < 0) break; + path.push(idx); + node = node.items[idx]; + } else { + break; + } + } + return path; +}; + +// Walk a JSON Schema by path parts, resolving `properties`, `items`, +// `patternProperties` and simple `oneOf`/`anyOf`. Returns the sub-schema at +// the path, or null if the schema doesn't describe that location. +export const schemaAt = (schema, parts) => { + const pickBranch = (s) => { + if (!s) return s; + if (Array.isArray(s.oneOf) && s.oneOf.length) return s.oneOf[0]; + if (Array.isArray(s.anyOf) && s.anyOf.length) return s.anyOf[0]; + return s; + }; + + let cur = pickBranch(schema); + for (const key of parts) { + if (!cur) return null; + if (cur.items) { + cur = pickBranch(cur.items); + } else if (cur.properties && Object.prototype.hasOwnProperty.call(cur.properties, key)) { + cur = pickBranch(cur.properties[key]); + } else if (cur.patternProperties) { + const entry = Object.entries(cur.patternProperties) + .find(([pat]) => new RegExp(pat).test(String(key))); + cur = entry ? pickBranch(entry[1]) : null; + } else if (cur.additionalProperties && typeof cur.additionalProperties === 'object') { + cur = pickBranch(cur.additionalProperties); + } else { + return null; + } + } + return cur; +}; diff --git a/src/utils/config/validateConfig.js b/src/utils/config/validateConfig.js new file mode 100644 index 0000000000..d4882bf142 --- /dev/null +++ b/src/utils/config/validateConfig.js @@ -0,0 +1,62 @@ +/** + * Single shared AJV validator for Dashy's ConfigSchema.json. + * Used by: + * - schemaLinter.js (CodeMirror diagnostics in the JSON editor) + * - ExportConfigMenu (status badges per config in the export dialog) + * Note: SchemaForm.vue keeps its own AJV instance because JSONForms manages it. + */ +import Ajv from 'ajv'; +import addFormats from 'ajv-formats'; +import schema from './ConfigSchema.json'; + +const ajv = new Ajv({ allErrors: true, strict: false }); +addFormats(ajv); + +/* Raw compiled validator: call as a fn, then read .errors. Prefer validateConfig() unless you need positions. */ +export const compiledValidator = ajv.compile(schema); + +/* Convenience wrapper returning { valid, errors }. */ +export function validateConfig(data) { + const valid = compiledValidator(data); + return { valid, errors: valid ? [] : (compiledValidator.errors || []) }; +} + +/* Turn a raw Ajv error into a user-readable message (no path). */ +export function formatError(err) { + const { keyword, params, message } = err; + const plural = (n, word) => `${n} ${word}${n === 1 ? '' : 's'}`; + switch (keyword) { + case 'enum': return `must be one of: ${(params.allowedValues || []).join(', ')}`; + case 'const': return `must be: ${JSON.stringify(params.allowedValue)}`; + case 'required': return `missing required field: ${params.missingProperty}`; + case 'additionalProperties': return `unknown property: ${params.additionalProperty}`; + case 'propertyNames': return `invalid property name: ${params.propertyName}`; + case 'dependencies': + case 'dependentRequired': return `missing required field: ${params.missingProperty} (needed when ${params.property} is set)`; + case 'type': return `must be ${Array.isArray(params.type) ? params.type.join(' or ') : params.type}`; + case 'minLength': return `must be at least ${plural(params.limit, 'character')}`; + case 'maxLength': return `must be at most ${plural(params.limit, 'character')}`; + case 'minimum': + case 'maximum': return `must be ${keyword === 'minimum' ? 'โ‰ฅ' : 'โ‰ค'} ${params.limit}`; + case 'exclusiveMinimum': + case 'exclusiveMaximum': return `must be ${keyword === 'exclusiveMinimum' ? '>' : '<'} ${params.limit}`; + case 'multipleOf': return `must be a multiple of ${params.multipleOf}`; + case 'minItems': return `must have at least ${plural(params.limit, 'item')}`; + case 'maxItems': return `must have at most ${plural(params.limit, 'item')}`; + case 'uniqueItems': return 'must not contain duplicate items'; + case 'minProperties': return `must have at least ${plural(params.limit, 'property')}`; + case 'maxProperties': return `must have at most ${plural(params.limit, 'property')}`; + case 'pattern': return `must match pattern ${params.pattern}`; + case 'format': return `must be a valid ${params.format}`; + case 'anyOf': + case 'oneOf': return 'must match one of the allowed shapes for this field'; + case 'not': return 'must not match the disallowed shape for this field'; + case 'if': return 'does not match the conditional schema for this field'; + default: return message; + } +} + +/* Combined " " with optional path prefix. */ +export function formatIssue(err) { + return `${err.instancePath ? `${err.instancePath} ` : ''}${formatError(err)}`; +} diff --git a/src/utils/i18n.js b/src/utils/i18n.js new file mode 100644 index 0000000000..7aad6ef2fe --- /dev/null +++ b/src/utils/i18n.js @@ -0,0 +1,19 @@ +import { createI18n } from 'vue-i18n'; +import { messages, languages } from '@/utils/languages'; +import { language as defaultLanguage } from '@/utils/config/defaults'; + +// Pre-register every code so `$i18n.availableLocales` lists the full set +// before each locale JSON has been fetched; empty locales fall back to English +const registered = { ...messages }; +languages.forEach(({ code }) => { + if (!registered[code]) registered[code] = {}; +}); + +const i18n = createI18n({ + legacy: true, + locale: defaultLanguage, + fallbackLocale: defaultLanguage, + messages: registered, +}); + +export default i18n; diff --git a/src/utils/languages.js b/src/utils/languages.js index 1021149531..772d2a9248 100644 --- a/src/utils/languages.js +++ b/src/utils/languages.js @@ -1,248 +1,51 @@ -// Locales - Import translation files here! (sort alphabetically) import en from '@/assets/locales/en.json'; -import enGB from '@/assets/locales/en-GB.json'; -import ar from '@/assets/locales/ar.json'; -import bg from '@/assets/locales/bg.json'; -import bn from '@/assets/locales/bn.json'; -import cs from '@/assets/locales/cs.json'; -import da from '@/assets/locales/da.json'; -import de from '@/assets/locales/de.json'; -import el from '@/assets/locales/el.json'; -import es from '@/assets/locales/es.json'; -import fr from '@/assets/locales/fr.json'; -import hi from '@/assets/locales/hi.json'; -import hu from '@/assets/locales/hu.json'; -import it from '@/assets/locales/it.json'; -import ja from '@/assets/locales/ja.json'; -import ko from '@/assets/locales/ko.json'; -import ky from '@/assets/locales/ky.json'; -import nb from '@/assets/locales/nb.json'; -import nl from '@/assets/locales/nl.json'; -import pl from '@/assets/locales/pl.json'; -import pt from '@/assets/locales/pt.json'; -import gl from '@/assets/locales/gl.json'; -import ru from '@/assets/locales/ru.json'; -import ro from '@/assets/locales/ro.json'; -import sk from '@/assets/locales/sk.json'; -import sl from '@/assets/locales/sl.json'; -import sv from '@/assets/locales/sv.json'; -import tr from '@/assets/locales/tr.json'; -import uk from '@/assets/locales/uk.json'; -import zhCN from '@/assets/locales/zh-CN.json'; -import zhTW from '@/assets/locales/zh-TW.json'; -import pirate from '@/assets/locales/zz-pirate.json'; -// Language data - Next register your language by adding it to this list -// Sorted alphabetically by code (except English which is first, and specials at the end) export const languages = [ - { - name: 'English', - code: 'en', - locale: en, - flag: '๐Ÿ‡ฌ๐Ÿ‡ง', - }, - { // Real English (just the overides from en.json) - name: 'English (British)', - code: 'en-GB', - locale: enGB, - flag: '๐Ÿ‡ฌ๐Ÿ‡ง', - }, - { // Arabic - name: 'ุงู„ุนุฑุจูŠุฉ', - code: 'ar', - locale: ar, - flag: '๐Ÿ‡ฆ๐Ÿ‡ช', - }, - { // Bulgarian - name: 'ะ‘ัŠะปะณะฐั€ัะบะธ', - code: 'bg', - locale: bg, - flag: '๐Ÿ‡ง๐Ÿ‡ฌ', - }, - { // Bengali - name: 'เฆฌเฆพเฆ‚เฆฒเฆพ', - code: 'bn', - locale: bn, - flag: '๐Ÿ‡ง๐Ÿ‡ฉ', - }, - { // Czech - name: 'ฤŒeลกtina', - code: 'cs', - locale: cs, - flag: '๐Ÿ‡จ๐Ÿ‡ฟ', - }, - { // Danish - name: 'Dansk', - code: 'da', - locale: da, - flag: '๐Ÿ‡ฉ๐Ÿ‡ฐ', - }, - { // German - name: 'Deutsch', - code: 'de', - locale: de, - flag: '๐Ÿ‡ฉ๐Ÿ‡ช', - }, - { // Greek - name: 'ฮ•ฮปฮปฮทฮฝฮนฮบฮฌ', - code: 'el', - locale: el, - flag: '๐Ÿ‡ฌ๐Ÿ‡ท', - }, - { // Spanish - name: 'Espaรฑol', - code: 'es', - locale: es, - flag: '๐Ÿ‡ช๐Ÿ‡ธ', - }, - { - name: 'Franรงais', - code: 'fr', - locale: fr, - flag: '๐Ÿ‡ฒ๐Ÿ‡ซ', - }, - { // Hindi - name: 'เคนเคฟเคจเฅเคฆเฅ€', - code: 'hi', - locale: hi, - flag: '๐Ÿ‡ฎ๐Ÿ‡ณ', - }, - { // Hungarian - name: 'Magyar', - code: 'hu', - locale: hu, - flag: '๐Ÿ‡ญ๐Ÿ‡บ', - }, - { // Italian - name: 'Italiano', - code: 'it', - locale: it, - flag: '๐Ÿ‡ฎ๐Ÿ‡น', - }, - { // Japanese - name: 'ๆ—ฅๆœฌ่ชž', - code: 'ja', - locale: ja, - flag: '๐Ÿ‡ฏ๐Ÿ‡ต', - }, - { // Korean - name: 'ํ•œ๊ตญ์–ด', - code: 'ko', - locale: ko, - flag: '๐Ÿ‡ฐ๐Ÿ‡ท', - }, - { // Kyrgyz - name: 'ะšั‹ั€ะณั‹ะทั‡ะฐ', - code: 'ky', - locale: ky, - flag: '๐Ÿ‡ฐ๐Ÿ‡ฌ', - }, - { // Norwegian - name: 'Norsk', - code: 'nb', - locale: nb, - flag: '๐Ÿ‡ณ๐Ÿ‡ด', - }, - { // Dutch - name: 'Nederlands', - code: 'nl', - locale: nl, - flag: '๐Ÿ‡ณ๐Ÿ‡ฑ', - }, - { - name: 'polski', - code: 'pl', - locale: pl, - flag: '๐Ÿ‡ต๐Ÿ‡ฑ', - }, - { // Portuguese - name: 'Portuguรชs', - code: 'pt', - locale: pt, - flag: '๐Ÿ‡ต๐Ÿ‡น', - }, - { // Galician - name: 'Galego', - code: 'gl', - locale: gl, - flag: '๐Ÿ›ฐ๏ธ', - }, - { // Russian - name: 'ะ ัƒััะบะธะน', - code: 'ru', - locale: ru, - flag: '๐Ÿ‡ท๐Ÿ‡บ', - }, - { // Romanian - name: 'Romana', - code: 'ro', - locale: ro, - flag: '๐Ÿ‡ท๐Ÿ‡ด', - }, - { // Slovak - name: 'Slovenฤina', - code: 'sk', - locale: sk, - flag: '๐Ÿ‡ธ๐Ÿ‡ฐ', - }, - { - name: 'Slovenลกฤina', - code: 'sl', - locale: sl, - flag: '๐Ÿ‡ธ๐Ÿ‡ฎ', - }, - { // Swedish - name: 'Svenska', - code: 'sv', - locale: sv, - flag: '๐Ÿ‡ธ๐Ÿ‡ช', - }, - { // Turkish - name: 'Tรผrkรงe', - code: 'tr', - locale: tr, - flag: '๐Ÿ‡น๐Ÿ‡ท', - }, - { // Ukrainian - name: 'Ukrainian', - code: 'uk', - locale: uk, - flag: '๐Ÿ‡บ๐Ÿ‡ฆ', - }, - { // Chinese - name: '็ฎ€ไฝ“ไธญๆ–‡', - code: 'zh-CN', - locale: zhCN, - flag: '๐Ÿ‡จ๐Ÿ‡ณ', - }, - { // Chinese - name: '็น้ซ”ไธญๆ–‡', - code: 'zh-TW', - locale: zhTW, - flag: '๐Ÿ‡น๐Ÿ‡ผ', - }, - { // Joke Language - Pirate - name: 'Pirate', - code: 'pirate', - locale: pirate, - flag: '๐Ÿดโ€โ˜ ๏ธ', - }, + { name: 'English', code: 'en', flag: '๐Ÿ‡ฌ๐Ÿ‡ง' }, + { name: 'English (British)', code: 'en-GB', flag: '๐Ÿ‡ฌ๐Ÿ‡ง' }, + { name: 'ุงู„ุนุฑุจูŠุฉ', code: 'ar', flag: '๐Ÿ‡ฆ๐Ÿ‡ช' }, + { name: 'ะ‘ัŠะปะณะฐั€ัะบะธ', code: 'bg', flag: '๐Ÿ‡ง๐Ÿ‡ฌ' }, + { name: 'เฆฌเฆพเฆ‚เฆฒเฆพ', code: 'bn', flag: '๐Ÿ‡ง๐Ÿ‡ฉ' }, + { name: 'ฤŒeลกtina', code: 'cs', flag: '๐Ÿ‡จ๐Ÿ‡ฟ' }, + { name: 'Dansk', code: 'da', flag: '๐Ÿ‡ฉ๐Ÿ‡ฐ' }, + { name: 'Deutsch', code: 'de', flag: '๐Ÿ‡ฉ๐Ÿ‡ช' }, + { name: 'ฮ•ฮปฮปฮทฮฝฮนฮบฮฌ', code: 'el', flag: '๐Ÿ‡ฌ๐Ÿ‡ท' }, + { name: 'Espaรฑol', code: 'es', flag: '๐Ÿ‡ช๐Ÿ‡ธ' }, + { name: 'Franรงais', code: 'fr', flag: '๐Ÿ‡ฒ๐Ÿ‡ซ' }, + { name: 'เคนเคฟเคจเฅเคฆเฅ€', code: 'hi', flag: '๐Ÿ‡ฎ๐Ÿ‡ณ' }, + { name: 'Magyar', code: 'hu', flag: '๐Ÿ‡ญ๐Ÿ‡บ' }, + { name: 'Italiano', code: 'it', flag: '๐Ÿ‡ฎ๐Ÿ‡น' }, + { name: 'ๆ—ฅๆœฌ่ชž', code: 'ja', flag: '๐Ÿ‡ฏ๐Ÿ‡ต' }, + { name: 'ํ•œ๊ตญ์–ด', code: 'ko', flag: '๐Ÿ‡ฐ๐Ÿ‡ท' }, + { name: 'ะšั‹ั€ะณั‹ะทั‡ะฐ', code: 'ky', flag: '๐Ÿ‡ฐ๐Ÿ‡ฌ' }, + { name: 'Norsk', code: 'nb', flag: '๐Ÿ‡ณ๐Ÿ‡ด' }, + { name: 'Nederlands', code: 'nl', flag: '๐Ÿ‡ณ๐Ÿ‡ฑ' }, + { name: 'polski', code: 'pl', flag: '๐Ÿ‡ต๐Ÿ‡ฑ' }, + { name: 'Portuguรชs', code: 'pt', flag: '๐Ÿ‡ต๐Ÿ‡น' }, + { name: 'Galego', code: 'gl', flag: '๐Ÿ›ฐ๏ธ' }, + { name: 'ะ ัƒััะบะธะน', code: 'ru', flag: '๐Ÿ‡ท๐Ÿ‡บ' }, + { name: 'Romana', code: 'ro', flag: '๐Ÿ‡ท๐Ÿ‡ด' }, + { name: 'Slovenฤina', code: 'sk', flag: '๐Ÿ‡ธ๐Ÿ‡ฐ' }, + { name: 'Slovenลกฤina', code: 'sl', flag: '๐Ÿ‡ธ๐Ÿ‡ฎ' }, + { name: 'Svenska', code: 'sv', flag: '๐Ÿ‡ธ๐Ÿ‡ช' }, + { name: 'Tรผrkรงe', code: 'tr', flag: '๐Ÿ‡น๐Ÿ‡ท' }, + { name: 'Ukrainian', code: 'uk', flag: '๐Ÿ‡บ๐Ÿ‡ฆ' }, + { name: '็ฎ€ไฝ“ไธญๆ–‡', code: 'zh-CN', flag: '๐Ÿ‡จ๐Ÿ‡ณ' }, + { name: '็น้ซ”ไธญๆ–‡', code: 'zh-TW', flag: '๐Ÿ‡น๐Ÿ‡ผ' }, + { name: 'Pirate', code: 'zz-pirate', flag: '๐Ÿดโ€โ˜ ๏ธ' }, ]; -/** - * Include the following info: - * name - Human readable name for your language (e.g German) - * code - ISO language code (e.g. de) - * locale - The file that you imported above - * flag - A nice emoji flag (optional, e.g. ๐Ÿ‡ฉ๐Ÿ‡ช) - */ +export const messages = { en }; -// All done :) -// You can also add your language to /README.md and credit yourself if you like +const loaders = import.meta.glob([ + '../assets/locales/*.json', + '!../assets/locales/en.json', // Exclude English, needed as default + fallback +]); -// Prepare each language for export -const i18nMessages = {}; -languages.forEach((lang) => { - i18nMessages[lang.code] = lang.locale; -}); -export const messages = i18nMessages; +export const loadLocale = async (code) => { + if (code === 'en') return en; + const loader = loaders[`../assets/locales/${code}.json`]; + if (!loader) throw new Error(`Unsupported locale: ${code}`); + const mod = await loader(); + return mod.default; +}; diff --git a/src/utils/CoolConsole.js b/src/utils/logging/CoolConsole.js similarity index 95% rename from src/utils/CoolConsole.js rename to src/utils/logging/CoolConsole.js index 8d2dc48daa..cdcbd2cf89 100644 --- a/src/utils/CoolConsole.js +++ b/src/utils/logging/CoolConsole.js @@ -2,7 +2,7 @@ /* Prints the app name and version, helpful for debugging */ export const welcomeMsg = () => { - const v = process.env.VUE_APP_VERSION ? `V${process.env.VUE_APP_VERSION}` : ''; + const v = import.meta.env.VITE_APP_VERSION ? `V${import.meta.env.VITE_APP_VERSION}` : ''; console.log(`\n%cDashy ${v} ๐Ÿš€`, 'color:#0dd8d8; background:#0b1021; font-size:1.5rem; padding:0.15rem 0.25rem; margin: 1rem auto; font-family: Rockwell; border: 2px solid #0dd8d8; border-radius: 4px;font-weight: bold; text-shadow: 1px 1px 1px #00af87bf;'); }; diff --git a/src/utils/ErrorHandler.js b/src/utils/logging/ErrorHandler.js similarity index 84% rename from src/utils/ErrorHandler.js rename to src/utils/logging/ErrorHandler.js index aeaeb4e707..d1d795f51a 100644 --- a/src/utils/ErrorHandler.js +++ b/src/utils/logging/ErrorHandler.js @@ -1,6 +1,6 @@ -import * as Sentry from '@sentry/vue'; -import { warningMsg, statusMsg, statusErrorMsg } from '@/utils/CoolConsole'; -import { sessionStorageKeys } from '@/utils/defaults'; +import { warningMsg, statusMsg, statusErrorMsg } from '@/utils/logging/CoolConsole'; +import { sessionStorageKeys } from '@/utils/config/defaults'; +import { reportError } from '@/utils/logging/SentryRef'; /* Makes the current time, like hh:mm:ss */ const makeTime = () => { @@ -25,7 +25,7 @@ const appendToErrorLog = (msg) => { export const ErrorHandler = function handler(msg, errorStack) { warningMsg(msg, errorStack); // Print to console appendToErrorLog(msg); // Save to local storage - Sentry.captureMessage(`[USER-WARN] ${msg}`); // Report to bug tracker (if enabled) + reportError(`[USER-WARN] ${msg}`); // Report to bug tracker (if enabled) }; /* Similar to error handler, but for recording general info */ diff --git a/src/utils/logging/ErrorReporting.js b/src/utils/logging/ErrorReporting.js new file mode 100644 index 0000000000..93539d91bb --- /dev/null +++ b/src/utils/logging/ErrorReporting.js @@ -0,0 +1,33 @@ +/** + * NOTE: No data is EVER sent to any external service without your explicit consent. + * In the case of error reporting, Sentry will not even be initialized unless + * you have purposely set appConfig.enableErrorReporting: true. + * It is false by default. + * You may want to enable error reporting if you have encountered a bug, + * as access to the console errors enable it to be triaged an fixed effectively + */ + +import $store from '@/store'; +import { sentryDsn } from '@/utils/config/defaults'; +import { setSentryInstance } from '@/utils/logging/SentryRef'; + +const ErrorReporting = async (app, router) => { + const appConfig = $store.getters.appConfig || {}; + if (!appConfig.enableErrorReporting) return; + + const appVersion = import.meta.env.VITE_APP_VERSION ? `Dashy@${import.meta.env.VITE_APP_VERSION}` : ''; + const Sentry = await import('@sentry/vue'); + const dsn = appConfig.sentryDsn || sentryDsn; + + Sentry.init({ + app, + dsn, + integrations: [Sentry.browserTracingIntegration({ router })], + tracesSampleRate: 1.0, + release: appVersion, + }); + + setSentryInstance(Sentry); +}; + +export default ErrorReporting; diff --git a/src/utils/logging/SentryRef.js b/src/utils/logging/SentryRef.js new file mode 100644 index 0000000000..cafe93dccd --- /dev/null +++ b/src/utils/logging/SentryRef.js @@ -0,0 +1,14 @@ +/** + * Handle for lazy-loading Sentry + * So we never load Sentry unless the user has explicitly enabled error reporting + */ + +let sentryInstance = null; + +export const setSentryInstance = (instance) => { + sentryInstance = instance; +}; + +export const reportError = (msg) => { + if (sentryInstance) sentryInstance.captureMessage(msg); +}; diff --git a/src/utils/request.js b/src/utils/request.js index 675afd0e22..d616f6d66c 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -7,12 +7,14 @@ * Throws on non-2xx responses (matching axios behavior) */ +import { makeBasicAuthHeaders } from '@/utils/auth/Auth'; + /** Check if a request URL targets the local Dashy server */ function isLocalRequest(url) { if (!url) return false; if (url.startsWith('/') && !url.startsWith('//')) return true; const { origin } = window.location; - const domain = process.env.VUE_APP_DOMAIN; + const domain = import.meta.env.VITE_APP_DOMAIN; return url.startsWith(origin) || (domain && url.startsWith(domain)); } @@ -63,7 +65,6 @@ async function makeRequest(config) { // For local API requests, include basic auth headers when configured if (isLocalRequest(fullUrl) && !fetchOptions.headers.Authorization) { - const { makeBasicAuthHeaders } = await import('@/utils/Auth'); const authConfig = makeBasicAuthHeaders(); if (authConfig.headers) { Object.assign(fetchOptions.headers, authConfig.headers); @@ -91,7 +92,7 @@ async function makeRequest(config) { // Parse response - try JSON first, fall back to text let responseData; const text = await res.text(); - try { responseData = JSON.parse(text); } catch (_) { responseData = text; } + try { responseData = JSON.parse(text); } catch { responseData = text; } const response = { data: responseData, diff --git a/src/utils/safeClone.js b/src/utils/safeClone.js new file mode 100644 index 0000000000..2e8b239548 --- /dev/null +++ b/src/utils/safeClone.js @@ -0,0 +1,18 @@ +/* Deep-clone that tolerates reactive proxies. `structuredClone` throws + * `DataCloneError` on Vue's proxies in some browsers (Firefox); JSON + * round-trip is a safe fallback for plain JSON-shaped data. */ +import ErrorHandler from '@/utils/logging/ErrorHandler'; + +export default function safeClone(val, fallback = null) { + if (val == null) return fallback; + try { + return structuredClone(val); + } catch { + try { + return JSON.parse(JSON.stringify(val)); + } catch (e) { + ErrorHandler('safeClone failed', e); + return fallback ?? (Array.isArray(val) ? [] : {}); + } + } +} diff --git a/src/views/404.vue b/src/views/404.vue index ef2c11f73a..e1ed43e966 100644 --- a/src/views/404.vue +++ b/src/views/404.vue @@ -12,17 +12,8 @@ diff --git a/src/views/About.vue b/src/views/About.vue deleted file mode 100644 index 253bc6c422..0000000000 --- a/src/views/About.vue +++ /dev/null @@ -1,129 +0,0 @@ - - - - - diff --git a/src/views/DownloadConfig.vue b/src/views/DownloadConfig.vue index e056daa092..f51615a077 100644 --- a/src/views/DownloadConfig.vue +++ b/src/views/DownloadConfig.vue @@ -4,7 +4,7 @@ @@ -149,27 +205,51 @@ export default { /* Outside container wrapping the item groups*/ .item-group-container { - display: grid; - gap: 0 0.5rem; + display: flex; + flex-direction: column; margin: 3rem auto; width: 90%; - grid-template-columns: repeat(var(--col-count), 1fr); @extend .scroll-bar; - &.showing-all { - flex-direction: column; - display: flex; - .headings { - display: none; - } + &.showing-all .minimal-headings-wrap { + display: none; } } - @include phone { - .item-group-container { - display: flex; - flex-direction: column; - } +.minimal-headings-wrap { + display: flex; + align-items: stretch; + gap: 0.25rem; +} +.minimal-headings-row { + flex: 1 1 auto; + display: flex; + gap: 0.25rem; + overflow-x: auto; + scroll-behavior: smooth; + scrollbar-width: none; + &::-webkit-scrollbar { display: none; } + .headings { + flex: 1 0 8rem; + max-width: 14rem; + min-width: 0; + &.center { + flex: 1 0 3rem; + max-width: 4rem; + } + } +} +.tab-scroll-btn { + flex: 0 0 auto; + padding: 0 0.5rem; + font-size: 1.25rem; + line-height: 1; + cursor: pointer; + background: var(--minimal-view-section-heading-background); + color: var(--minimal-view-section-heading-color); + border: 1px solid var(--minimal-view-section-heading-color); + border-radius: var(--curve-factor); + &:disabled { opacity: 0.3; cursor: default; } } .no-data { diff --git a/src/views/Workspace.vue b/src/views/Workspace.vue index 2599c500bc..919e2f6e08 100644 --- a/src/views/Workspace.vue +++ b/src/views/Workspace.vue @@ -18,8 +18,8 @@ import SideBar from '@/components/Workspace/SideBar'; import WebContent from '@/components/Workspace/WebContent'; import WidgetView from '@/components/Workspace/WidgetView'; import MultiTaskingWebComtent from '@/components/Workspace/MultiTaskingWebComtent'; -import Defaults from '@/utils/defaults'; -import ErrorHandler from '@/utils/ErrorHandler'; +import Defaults from '@/utils/config/defaults'; +import ErrorHandler from '@/utils/logging/ErrorHandler'; export default { name: 'Workspace', @@ -55,10 +55,10 @@ export default { } else if (options.target === 'clipboard') { if (navigator.clipboard) { navigator.clipboard.writeText(options.url); - this.$toasted.show(this.$t('context-menus.item.copied-toast'), { className: 'toast-success' }); + this.$toast.success(this.$t('context-menus.item.copied-toast')); } else { ErrorHandler('Clipboard access requires HTTPS. See: https://bit.ly/3N5WuAA'); - this.$toasted.show('Unable to copy, see log', { className: 'toast-error' }); + this.$toast.error('Unable to copy, see log'); } return; } else { @@ -90,7 +90,6 @@ export default { mounted() { this.initiateFontAwesome(); this.initiateMaterialDesignIcons(); - this.setTheme(); this.url = this.getInitialUrl(); }, }; @@ -101,7 +100,4 @@ export default { .work-space { min-height: fit-content; } -:global(footer) { - display: none; -} diff --git a/tests/components/item.test.js b/tests/components/item.test.js index d39f618b58..64e143220f 100644 --- a/tests/components/item.test.js +++ b/tests/components/item.test.js @@ -1,8 +1,8 @@ import { describe, it, expect, beforeEach, afterEach, vi, } from 'vitest'; -import { shallowMount, createLocalVue } from '@vue/test-utils'; -import Vuex from 'vuex'; +import { shallowMount } from '@vue/test-utils'; +import { createStore } from 'vuex'; import Item from '@/components/LinkItems/Item.vue'; import router from '@/router'; @@ -14,17 +14,11 @@ vi.mock('@/utils/request', () => { return { default: fn }; }); vi.mock('@/router', () => ({ default: { push: vi.fn() } })); -vi.mock('@/utils/ErrorHandler', () => ({ default: vi.fn() })); +vi.mock('@/utils/logging/ErrorHandler', () => ({ default: vi.fn() })); vi.mock('@/assets/interface-icons/interactive-editor-edit-mode.svg', () => ({ default: { template: '' }, })); -const localVue = createLocalVue(); -localVue.use(Vuex); -localVue.directive('tooltip', {}); -localVue.directive('longPress', {}); -localVue.directive('clickOutside', {}); - /** Factory โ€” accepts overrides for item, props, appConfig, storeState, etc. */ function mountItem(overrides = {}) { const item = overrides.item || { @@ -47,8 +41,8 @@ function mountItem(overrides = {}) { ...(overrides.storeState || {}), }; - const store = new Vuex.Store({ - state: storeState, + const store = createStore({ + state() { return storeState; }, getters: { appConfig: (state) => state.config.appConfig, iconSize: () => overrides.iconSize || 'medium', @@ -58,24 +52,33 @@ function mountItem(overrides = {}) { }); const wrapper = shallowMount(Item, { - localVue, - store, - propsData: { item, ...(overrides.props || {}) }, - mocks: { - $modal: { show: vi.fn(), hide: vi.fn() }, - $toasted: { show: vi.fn() }, - $t: (key) => key, - ...(overrides.mocks || {}), - }, - stubs: { - Icon: true, - ItemOpenMethodIcon: true, - StatusIndicator: true, - ContextMenu: true, - MoveItemTo: true, - EditItem: true, - EditModeIcon: true, + global: { + plugins: [store], + directives: { + tooltip: {}, + longPress: {}, + clickOutside: {}, + }, + mocks: { + $modal: { show: vi.fn(), hide: vi.fn() }, + $toast: Object.assign(vi.fn(), { + show: vi.fn(), success: vi.fn(), error: vi.fn(), info: vi.fn(), warning: vi.fn(), + dismiss: vi.fn(), clear: vi.fn(), + }), + $t: (key) => key, + ...(overrides.mocks || {}), + }, + stubs: { + Icon: true, + ItemOpenMethodIcon: true, + StatusIndicator: true, + ContextMenu: true, + MoveItemTo: true, + EditItem: true, + EditModeIcon: true, + }, }, + props: { item, ...(overrides.props || {}) }, }); return { wrapper, store, mutations }; @@ -350,24 +353,26 @@ describe('Computed: unicodeOpeningIcon', () => { }); describe('Filter: shortUrl', () => { - const { shortUrl } = Item.filters; - it('extracts hostname from URL', () => { - expect(shortUrl('https://www.example.com/path?q=1')).toBe('www.example.com'); + const { wrapper } = mountItem(); + expect(wrapper.vm.shortUrl('https://www.example.com/path?q=1')).toBe('www.example.com'); }); it('handles IP addresses', () => { - expect(shortUrl('192.168.1.1')).toBe('192.168.1.1'); + const { wrapper } = mountItem(); + expect(wrapper.vm.shortUrl('192.168.1.1')).toBe('192.168.1.1'); }); it('returns empty string for falsy input', () => { - expect(shortUrl(null)).toBe(''); - expect(shortUrl(undefined)).toBe(''); - expect(shortUrl('')).toBe(''); + const { wrapper } = mountItem(); + expect(wrapper.vm.shortUrl(null)).toBe(''); + expect(wrapper.vm.shortUrl(undefined)).toBe(''); + expect(wrapper.vm.shortUrl('')).toBe(''); }); it('returns empty string for invalid input', () => { - expect(shortUrl('not-a-url')).toBe(''); + const { wrapper } = mountItem(); + expect(wrapper.vm.shortUrl('not-a-url')).toBe(''); }); }); @@ -422,21 +427,18 @@ describe('Methods: getTooltipOptions', () => { }); describe('Methods: openItemSettings / closeEditMenu', () => { - it('openItemSettings sets editMenuOpen, shows modal, commits SET_MODAL_OPEN', () => { + it('openItemSettings sets editMenuOpen and commits SET_MODAL_OPEN(true)', () => { const { wrapper, mutations } = mountItem(); wrapper.vm.openItemSettings(); expect(wrapper.vm.editMenuOpen).toBe(true); - expect(wrapper.vm.$modal.show).toHaveBeenCalledWith('EDIT_ITEM'); expect(mutations.SET_MODAL_OPEN).toHaveBeenCalledWith(expect.anything(), true); }); - it('closeEditMenu clears editMenuOpen, hides modal, commits SET_MODAL_OPEN(false)', () => { - const { wrapper, mutations } = mountItem(); + it('closeEditMenu clears editMenuOpen', () => { + const { wrapper } = mountItem(); wrapper.vm.editMenuOpen = true; wrapper.vm.closeEditMenu(); expect(wrapper.vm.editMenuOpen).toBe(false); - expect(wrapper.vm.$modal.hide).toHaveBeenCalledWith('EDIT_ITEM'); - expect(mutations.SET_MODAL_OPEN).toHaveBeenCalledWith(expect.anything(), false); }); }); @@ -589,21 +591,18 @@ describe('Methods: copyToClipboard', () => { const { wrapper } = mountItem(); wrapper.vm.copyToClipboard('hello'); expect(clipboardSpy).toHaveBeenCalledWith('hello'); - expect(wrapper.vm.$toasted.show).toHaveBeenCalled(); + expect(wrapper.vm.$toast.success).toHaveBeenCalled(); }); it('shows error when clipboard unavailable', async () => { - const ErrorHandler = (await import('@/utils/ErrorHandler')).default; + const ErrorHandler = (await import('@/utils/logging/ErrorHandler')).default; Object.defineProperty(navigator, 'clipboard', { value: undefined, writable: true, configurable: true, }); const { wrapper } = mountItem(); wrapper.vm.copyToClipboard('hello'); expect(ErrorHandler).toHaveBeenCalled(); - expect(wrapper.vm.$toasted.show).toHaveBeenCalledWith( - 'Unable to copy, see log', - expect.objectContaining({ className: 'toast-error' }), - ); + expect(wrapper.vm.$toast.error).toHaveBeenCalledWith('Unable to copy, see log'); }); }); @@ -679,7 +678,7 @@ describe('Lifecycle: beforeDestroy', () => { }, }); const { intervalId } = wrapper.vm; - wrapper.destroy(); + wrapper.unmount(); expect(clearSpy).toHaveBeenCalledWith(intervalId); vi.useRealTimers(); }); @@ -705,24 +704,26 @@ describe('Template rendering', () => { id: '1', title: 'X', url: '#', statusCheck: false, }, }); - expect(off.find('statusindicator-stub').exists()).toBe(false); + expect(off.html()).not.toContain('status-indicator'); const { wrapper: on } = mountItem({ item: { id: '1', title: 'X', url: '#', statusCheck: true, }, }); - expect(on.find('statusindicator-stub').exists()).toBe(true); + expect(on.html()).toContain('status-indicator'); }); - it('shows EditModeIcon only in edit mode', () => { + it('shows EditModeIcon only in edit mode', async () => { const { wrapper: normal } = mountItem(); - expect(normal.find('editmodeicon-stub').exists()).toBe(false); + expect(normal.vm.isEditMode).toBe(false); const { wrapper: editing } = mountItem({ storeState: { editMode: true, config: { appConfig: {} } }, }); - expect(editing.find('editmodeicon-stub').exists()).toBe(true); + expect(editing.vm.isEditMode).toBe(true); + // In Vue 3 compat, verify via class since stub rendering may differ + expect(editing.find('.item').classes()).toContain('is-edit-mode'); }); it('sets correct id on anchor', () => { diff --git a/tests/server/cors-proxy.test.js b/tests/server/cors-proxy.test.js index bbebd5506c..7682695aed 100644 --- a/tests/server/cors-proxy.test.js +++ b/tests/server/cors-proxy.test.js @@ -1,8 +1,11 @@ // @vitest-environment node -import { describe, it, expect } from 'vitest'; +import { + describe, it, expect, afterEach, beforeAll, afterAll, vi, +} from 'vitest'; import request from 'supertest'; const app = require('../../services/app'); +const { substituteEnv } = require('../../services/cors-proxy'); describe('CORS proxy', () => { it('rejects missing Target-URL', async () => { @@ -85,4 +88,85 @@ describe('CORS proxy', () => { expect(res.status).toBe(200); expect(res.headers['access-control-allow-origin']).toBe('*'); }); + + it('resolves env-var placeholder in Target-URL before validating', async () => { + process.env.DASHY_TEST_BLOCKED_HOST = '169.254.169.254'; + try { + const res = await request(app).get('/cors-proxy').set('Target-URL', 'http://DASHY_TEST_BLOCKED_HOST/'); + expect(res.status).toBe(403); + expect(res.body.error).toContain('169.254.169.254'); + } finally { + delete process.env.DASHY_TEST_BLOCKED_HOST; + } + }); +}); + +describe('CORS proxy env-var substitution', () => { + const SET_KEYS = []; + const setEnv = (k, v) => { SET_KEYS.push(k); process.env[k] = v; }; + afterEach(() => { while (SET_KEYS.length) delete process.env[SET_KEYS.pop()]; }); + + let warnSpy; + beforeAll(() => { warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); }); + afterAll(() => { warnSpy.mockRestore(); }); + + it('replaces a DASHY_ token with its env value', () => { + setEnv('DASHY_FOO', 'secret'); + expect(substituteEnv('Bearer DASHY_FOO')).toBe('Bearer secret'); + }); + + it('replaces VITE_APP_ and VUE_APP_ tokens (back-compat)', () => { + setEnv('VITE_APP_KEY', 'abc'); + setEnv('VUE_APP_KEY', 'xyz'); + expect(substituteEnv('VITE_APP_KEY')).toBe('abc'); + expect(substituteEnv('VUE_APP_KEY')).toBe('xyz'); + }); + + it('leaves unset placeholders verbatim', () => { + expect(substituteEnv('Bearer DASHY_NOT_SET')).toBe('Bearer DASHY_NOT_SET'); + }); + + it('does not substitute non-prefixed env vars', () => { + setEnv('AWS_SECRET_KEY', 'should-not-leak'); + expect(substituteEnv('AWS_SECRET_KEY')).toBe('AWS_SECRET_KEY'); + }); + + it('replaces multiple placeholders in one string', () => { + setEnv('DASHY_HOST', 'pi.local'); + setEnv('DASHY_KEY', 'k1'); + expect(substituteEnv('http://DASHY_HOST/api?key=DASHY_KEY')).toBe('http://pi.local/api?key=k1'); + }); + + it('walks into objects and arrays', () => { + setEnv('DASHY_PASS', 'p4ss'); + setEnv('DASHY_USER', 'admin'); + const input = { auth: { user: 'DASHY_USER', pass: 'DASHY_PASS' }, tags: ['DASHY_PASS'] }; + expect(substituteEnv(input)).toEqual({ + auth: { user: 'admin', pass: 'p4ss' }, + tags: ['p4ss'], + }); + }); + + it('passes through non-string, non-object values unchanged', () => { + expect(substituteEnv(undefined)).toBe(undefined); + expect(substituteEnv(null)).toBe(null); + expect(substituteEnv(42)).toBe(42); + expect(substituteEnv(true)).toBe(true); + }); + + it('substitutes mixed-case suffix (matches process.env case-sensitively)', () => { + setEnv('VITE_APP_pihole_ip', '10.0.0.1'); + expect(substituteEnv('http://VITE_APP_pihole_ip/api')).toBe('http://10.0.0.1/api'); + }); + + it('warns once per unique unset placeholder, then stays quiet', () => { + warnSpy.mockClear(); + // Use names unlikely to collide with any earlier warnings in this run + substituteEnv('DASHY_WARN_TEST_ONE'); + substituteEnv('DASHY_WARN_TEST_ONE'); // repeat - should not re-log + substituteEnv('DASHY_WARN_TEST_TWO'); + expect(warnSpy).toHaveBeenCalledTimes(2); + expect(warnSpy.mock.calls[0][0]).toContain('DASHY_WARN_TEST_ONE'); + expect(warnSpy.mock.calls[1][0]).toContain('DASHY_WARN_TEST_TWO'); + }); }); diff --git a/tests/server/general.test.js b/tests/server/general.test.js index 3668761bf8..a5167b42ca 100644 --- a/tests/server/general.test.js +++ b/tests/server/general.test.js @@ -42,13 +42,6 @@ describe('Get user', () => { }); }); -describe('Rebuild', () => { - it('ignores POST', async () => { - const res = await request(app).post('/config-manager/rebuild'); - expect(res.status).toBeLessThan(500); - }); -}); - describe('SPA fallback', () => { it('serves content for unknown routes', async () => { const res = await request(app).get('/some/nonexistent/route'); diff --git a/tests/server/save-config.test.js b/tests/server/save-config.test.js index f545545a2d..6b037b56e5 100644 --- a/tests/server/save-config.test.js +++ b/tests/server/save-config.test.js @@ -1,6 +1,14 @@ // @vitest-environment node -import { describe, it, expect } from 'vitest'; +import { describe, it, expect, afterAll } from 'vitest'; import request from 'supertest'; +import fs from 'fs'; +import os from 'os'; +import path from 'path'; + +// Isolate writes to a temp dir so the real user-data/conf.yml is never touched +const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'dashy-save-config-')); +process.env.USER_DATA_DIR = tmpDir; +afterAll(() => fs.rmSync(tmpDir, { recursive: true, force: true })); const app = require('../../services/app'); const save = (body) => request(app).post('/config-manager/save').send(body); diff --git a/tests/setup.js b/tests/setup.js index 7032241f03..8cfdc74d89 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -3,11 +3,6 @@ * This file is run before all tests to configure the testing environment */ -import Vue from 'vue'; - -// Suppress Vue warnings in tests -Vue.config.silent = true; - // Suppress noisy console methods in test output // Vue dev mode prints info messages (devtools, production tips) that clutter results global.console = { diff --git a/tests/unit/config-helpers.test.js b/tests/unit/config-helpers.test.js index fb75874bc2..5a72bb145b 100644 --- a/tests/unit/config-helpers.test.js +++ b/tests/unit/config-helpers.test.js @@ -2,10 +2,15 @@ import { describe, it, expect } from 'vitest'; import { makePageName, makePageSlug, + makeRoutePath, + viewFromPath, + resolveRouteIntent, + PAGE_STATUS, + RESERVED_ROOT, formatConfigPath, componentVisibility, getCustomKeyShortcuts, -} from '@/utils/ConfigHelpers'; +} from '@/utils/config/ConfigHelpers'; describe('ConfigHelpers - makePageName', () => { it('converts page name to lowercase', () => { @@ -35,6 +40,57 @@ describe('ConfigHelpers - makePageName', () => { it('handles empty string', () => { expect(makePageName('')).toBe('unnamed-page'); }); + + it('trims leading dash left by stripped emoji', () => { + expect(makePageName('๐ŸŒ Command Center')).toBe('command-center'); + }); + + it('trims trailing dashes', () => { + expect(makePageName('My Page-')).toBe('my-page'); + }); + + it('falls back to unnamed-page when all chars are stripped', () => { + expect(makePageName('๐ŸŒ๐Ÿš€')).toBe('unnamed-page'); + }); + + it(`reserves "${RESERVED_ROOT}" so user pages cannot shadow the root sentinel`, () => { + expect(makePageName('Main')).toBe(`${RESERVED_ROOT}-page`); + expect(makePageName('main')).toBe(`${RESERVED_ROOT}-page`); + expect(makePageName(' MAIN ')).toBe(`${RESERVED_ROOT}-page`); + }); + + it('is idempotent โ€” slugging an already-slug string returns the same slug', () => { + const slug = makePageName('๐ŸŒ Command Center'); + expect(makePageName(slug)).toBe(slug); + }); + + it('preserves accented Latin so names round-trip (Vue Router percent-encodes the URL)', () => { + expect(makePageName('Secciรณn Configuraciรณn')).toBe('secciรณn-configuraciรณn'); + expect(makePageName('GrรถรŸe')).toBe('grรถรŸe'); + }); + + it('preserves CJK, Cyrillic, and Arabic names', () => { + expect(makePageName('ไธญๆ–‡')).toBe('ไธญๆ–‡'); + expect(makePageName('ๆ—ฅๆœฌ่ชž ๅทฅๅ…ท')).toBe('ๆ—ฅๆœฌ่ชž-ๅทฅๅ…ท'); + expect(makePageName('ะŸั€ะธะฒะตั‚')).toBe('ะฟั€ะธะฒะตั‚'); + expect(makePageName('ู…ุฑุญุจุง')).toBe('ู…ุฑุญุจุง'); + }); + + it('still strips emoji, punctuation and symbols in mixed-script names', () => { + expect(makePageName('๐ŸŒ Command Center!')).toBe('command-center'); + expect(makePageName('โš™๏ธ ่ฎพ็ฝฎ')).toBe('่ฎพ็ฝฎ'); + expect(makePageName('$100 Club')).toBe('100-club'); + }); + + it('NFC-normalizes so composed and decomposed forms produce the same slug', () => { + // 'รฉ' as one codepoint (U+00E9) vs 'e' + combining acute (U+0065 U+0301) + expect(makePageName('cafรฉ')).toBe(makePageName('cafe\u0301')); + }); + + it('collapses whitespace-only names to unnamed-page', () => { + expect(makePageName(' ')).toBe('unnamed-page'); + expect(makePageName('\t\n')).toBe('unnamed-page'); + }); }); describe('ConfigHelpers - makePageSlug', () => { @@ -43,7 +99,206 @@ describe('ConfigHelpers - makePageSlug', () => { }); it('handles page names with special chars', () => { - expect(makePageSlug('Config! Page', 'admin')).toBe('/admin/config-page'); + expect(makePageSlug('Config! Page', 'home')).toBe('/home/config-page'); + }); + + it('falls back to home when view is unknown', () => { + expect(makePageSlug('My Page', 'bogus')).toBe('/home/my-page'); + }); +}); + +describe('ConfigHelpers - makeRoutePath', () => { + it('returns / for root, no sub-page, no section', () => { + expect(makeRoutePath('home')).toBe('/home'); + expect(makeRoutePath('minimal')).toBe('/minimal'); + expect(makeRoutePath('workspace')).toBe('/workspace'); + }); + + it('returns //:page for a sub-page without a section', () => { + expect(makeRoutePath('home', 'homelab')).toBe('/home/homelab'); + expect(makeRoutePath('minimal', 'homelab')).toBe('/minimal/homelab'); + }); + + it('nests section under sub-page id', () => { + expect(makeRoutePath('home', 'homelab', 'My Tools')).toBe('/home/homelab/my-tools'); + }); + + it('uses RESERVED_ROOT sentinel for a section on the root config', () => { + expect(makeRoutePath('home', null, 'My Tools')).toBe(`/home/${RESERVED_ROOT}/my-tools`); + }); + + it('slugifies section names with emoji', () => { + expect(makeRoutePath('minimal', 'dev', '๐Ÿš€ Tools')).toBe('/minimal/dev/tools'); + }); + + it('defaults to home view when view arg is invalid', () => { + expect(makeRoutePath('bogus', 'homelab')).toBe('/home/homelab'); + }); +}); + +describe('ConfigHelpers - viewFromPath', () => { + it('extracts the view segment from a path', () => { + expect(viewFromPath('/home/homelab')).toBe('home'); + expect(viewFromPath('/minimal/homelab/tools')).toBe('minimal'); + expect(viewFromPath('/workspace')).toBe('workspace'); + }); + + it('defaults to home for root or unknown paths', () => { + expect(viewFromPath('/')).toBe('home'); + expect(viewFromPath('/about')).toBe('home'); + expect(viewFromPath('')).toBe('home'); + }); +}); + +describe('ConfigHelpers - resolveRouteIntent', () => { + const fakeStore = ({ pages = [], rootSections = [] } = {}) => ({ + getters: { pages }, + state: { rootConfig: { sections: rootSections } }, + }); + const route = (path, params = {}) => ({ path, params }); + + it('classifies / as ROOT', () => { + const out = resolveRouteIntent(route('/home', {}), fakeStore()); + expect(out).toEqual({ + view: 'home', pageId: null, sectionSlug: null, status: PAGE_STATUS.ROOT, + }); + }); + + it('classifies //main as ROOT (sentinel)', () => { + const out = resolveRouteIntent(route('/minimal/main', { page: 'main' }), fakeStore()); + expect(out.status).toBe(PAGE_STATUS.ROOT); + expect(out.pageId).toBeNull(); + expect(out.view).toBe('minimal'); + }); + + it('classifies //main/:section as ROOT with sectionSlug', () => { + const out = resolveRouteIntent( + route('/home/main/tools', { page: 'main', section: 'Tools' }), + fakeStore(), + ); + expect(out.status).toBe(PAGE_STATUS.ROOT); + expect(out.pageId).toBeNull(); + expect(out.sectionSlug).toBe('tools'); + }); + + it('classifies a known sub-page as KNOWN', () => { + const store = fakeStore({ pages: [{ name: '๐Ÿ  Homelab' }] }); + const out = resolveRouteIntent( + route('/home/homelab/media', { page: 'homelab', section: 'Media' }), + store, + ); + expect(out.status).toBe(PAGE_STATUS.KNOWN); + expect(out.pageId).toBe('homelab'); + expect(out.sectionSlug).toBe('media'); + }); + + it('forgives a legacy // URL as LEGACY_SECTION', () => { + const store = fakeStore({ rootSections: [{ name: 'Getting Started' }] }); + const out = resolveRouteIntent( + route('/home/getting-started', { page: 'getting-started' }), + store, + ); + expect(out.status).toBe(PAGE_STATUS.LEGACY_SECTION); + expect(out.pageId).toBeNull(); + expect(out.sectionSlug).toBe('getting-started'); + }); + + it('does NOT fall through to legacy when the URL has an explicit :section', () => { + const store = fakeStore({ rootSections: [{ name: 'Getting Started' }] }); + const out = resolveRouteIntent( + route('/home/getting-started/whatever', { + page: 'getting-started', section: 'whatever', + }), + store, + ); + expect(out.status).toBe(PAGE_STATUS.UNKNOWN); + }); + + it('returns UNKNOWN for a page that matches neither a sub-page nor a root section', () => { + const store = fakeStore({ pages: [{ name: 'Homelab' }], rootSections: [{ name: 'Tools' }] }); + const out = resolveRouteIntent( + route('/home/bogus', { page: 'bogus' }), + store, + ); + expect(out.status).toBe(PAGE_STATUS.UNKNOWN); + expect(out.pageId).toBe('bogus'); + }); + + it('normalizes raw params โ€” /home/-Homelab resolves to KNOWN homelab', () => { + const store = fakeStore({ pages: [{ name: 'Homelab' }] }); + const out = resolveRouteIntent( + route('/home/-Homelab', { page: '-Homelab' }), + store, + ); + expect(out.status).toBe(PAGE_STATUS.KNOWN); + expect(out.pageId).toBe('homelab'); + }); + + it('resolves a CJK page name (Vue Router hands us the decoded param)', () => { + const store = fakeStore({ pages: [{ name: 'ไธญๆ–‡' }] }); + const out = resolveRouteIntent( + route('/home/ไธญๆ–‡/ๅทฅๅ…ท', { page: 'ไธญๆ–‡', section: 'ๅทฅๅ…ท' }), + store, + ); + expect(out.status).toBe(PAGE_STATUS.KNOWN); + expect(out.pageId).toBe('ไธญๆ–‡'); + expect(out.sectionSlug).toBe('ๅทฅๅ…ท'); + }); + + it('safely accepts undefined route or store', () => { + const out = resolveRouteIntent(undefined, undefined); + expect(out.view).toBe('home'); + expect(out.status).toBe(PAGE_STATUS.ROOT); + }); +}); + +describe('ConfigHelpers - makeRoutePath (view capability)', () => { + it('drops the section when the target view does not support section URLs', () => { + // workspace has supportsSection: false, so /workspace/homelab/tools collapses + expect(makeRoutePath('workspace', 'homelab', 'tools')).toBe('/workspace/homelab'); + }); + + it('keeps the section for views that support it', () => { + expect(makeRoutePath('home', 'homelab', 'tools')).toBe('/home/homelab/tools'); + expect(makeRoutePath('minimal', 'homelab', 'tools')).toBe('/minimal/homelab/tools'); + }); +}); + +describe('Integration: view switching preserves page + section', () => { + const fakeStore = ({ pages = [], rootSections = [] } = {}) => ({ + getters: { pages }, + state: { rootConfig: { sections: rootSections } }, + }); + const route = (path, params) => ({ path, params }); + + // Mirrors ViewSwitcher.pathFor(view) โ€” the single code path responsible for this + const switchTo = (view, r, store) => { + const { pageId, sectionSlug } = resolveRouteIntent(r, store); + return makeRoutePath(view, pageId, sectionSlug); + }; + + it('/home/main/support-dashy -> /minimal/main/support-dashy', () => { + const store = fakeStore({ rootSections: [{ name: 'Support Dashy' }] }); + const r = route('/home/main/support-dashy', { page: 'main', section: 'support-dashy' }); + expect(switchTo('minimal', r, store)).toBe('/minimal/main/support-dashy'); + }); + + it('/home/homelab/media -> /minimal/homelab/media', () => { + const store = fakeStore({ pages: [{ name: 'Homelab' }] }); + const r = route('/home/homelab/media', { page: 'homelab', section: 'media' }); + expect(switchTo('minimal', r, store)).toBe('/minimal/homelab/media'); + }); + + it('/home/homelab/media -> /workspace/homelab (section dropped for workspace)', () => { + const store = fakeStore({ pages: [{ name: 'Homelab' }] }); + const r = route('/home/homelab/media', { page: 'homelab', section: 'media' }); + expect(switchTo('workspace', r, store)).toBe('/workspace/homelab'); + }); + + it('legacy /home/getting-started -> /minimal/main/getting-started', () => { + const store = fakeStore({ rootSections: [{ name: 'Getting Started' }] }); + const r = route('/home/getting-started', { page: 'getting-started' }); + expect(switchTo('minimal', r, store)).toBe('/minimal/main/getting-started'); }); }); @@ -60,6 +315,11 @@ describe('ConfigHelpers - formatConfigPath', () => { it('keeps absolute paths unchanged', () => { expect(formatConfigPath('/config.yml')).toBe('/config.yml'); }); + + it('strips a leading ./ so relative YAML paths resolve correctly', () => { + expect(formatConfigPath('./config.yml')).toBe('/config.yml'); + expect(formatConfigPath('./sub/config.yml')).toBe('/sub/config.yml'); + }); }); describe('ConfigHelpers - componentVisibility', () => { @@ -69,7 +329,6 @@ describe('ConfigHelpers - componentVisibility', () => { expect(result.navigation).toBe(true); expect(result.searchBar).toBe(true); expect(result.settings).toBe(true); - expect(result.footer).toBe(true); }); it('hides components based on config', () => { @@ -88,11 +347,11 @@ describe('ConfigHelpers - componentVisibility', () => { it('handles partial config correctly', () => { const appConfig = { hideComponents: { - hideFooter: true, + hideSettings: true, }, }; const result = componentVisibility(appConfig); - expect(result.footer).toBe(false); + expect(result.settings).toBe(false); expect(result.pageTitle).toBe(true); }); }); diff --git a/tests/unit/config-validator.test.js b/tests/unit/config-validator.test.js index f12a95afa5..6cc71261ba 100644 --- a/tests/unit/config-validator.test.js +++ b/tests/unit/config-validator.test.js @@ -12,7 +12,7 @@ describe('Config Validator', () => { it('validates a correct config file', () => { const Ajv = require('ajv'); - const schema = require('../../src/utils/ConfigSchema.json'); + const schema = require('../../src/utils/config/ConfigSchema.json'); const validConfig = { pageInfo: { title: 'Test' }, @@ -27,7 +27,7 @@ describe('Config Validator', () => { it('rejects config with invalid structure', () => { const Ajv = require('ajv'); - const schema = require('../../src/utils/ConfigSchema.json'); + const schema = require('../../src/utils/config/ConfigSchema.json'); const invalidConfig = { pageInfo: { title: 'Test' }, @@ -42,7 +42,7 @@ describe('Config Validator', () => { it('requires sections to be an array', () => { const Ajv = require('ajv'); - const schema = require('../../src/utils/ConfigSchema.json'); + const schema = require('../../src/utils/config/ConfigSchema.json'); const config = { pageInfo: { title: 'Test' }, @@ -56,7 +56,7 @@ describe('Config Validator', () => { it('allows items with just title', () => { const Ajv = require('ajv'); - const schema = require('../../src/utils/ConfigSchema.json'); + const schema = require('../../src/utils/config/ConfigSchema.json'); const config = { pageInfo: { title: 'Test' }, diff --git a/tests/unit/error-handler.test.js b/tests/unit/error-handler.test.js index 4e854910ec..32d3646568 100644 --- a/tests/unit/error-handler.test.js +++ b/tests/unit/error-handler.test.js @@ -2,7 +2,7 @@ import { describe, it, expect } from 'vitest'; describe('ErrorHandler', () => { it('exports InfoKeys constants', async () => { - const { InfoKeys } = await import('@/utils/ErrorHandler'); + const { InfoKeys } = await import('@/utils/logging/ErrorHandler'); expect(InfoKeys.AUTH).toBe('Authentication'); expect(InfoKeys.CLOUD_BACKUP).toBe('Cloud Backup & Restore'); expect(InfoKeys.EDITOR).toBe('Interactive Editor'); @@ -11,14 +11,14 @@ describe('ErrorHandler', () => { }); it('exports handler functions', async () => { - const handlers = await import('@/utils/ErrorHandler'); + const handlers = await import('@/utils/logging/ErrorHandler'); expect(typeof handlers.ErrorHandler).toBe('function'); expect(typeof handlers.InfoHandler).toBe('function'); expect(typeof handlers.WarningInfoHandler).toBe('function'); }); it('ErrorHandler can be called without throwing', async () => { - const { ErrorHandler } = await import('@/utils/ErrorHandler'); + const { ErrorHandler } = await import('@/utils/logging/ErrorHandler'); expect(() => ErrorHandler('Test error')).not.toThrow(); }); }); diff --git a/tests/unit/smoke.test.js b/tests/unit/smoke.test.js index 672958f753..7cd6d84799 100644 --- a/tests/unit/smoke.test.js +++ b/tests/unit/smoke.test.js @@ -109,7 +109,7 @@ describe('Smoke Tests - Core Dependencies', () => { }); it('should have config schema file', () => { - const schemaPath = path.resolve(__dirname, '../../src/utils/ConfigSchema.json'); + const schemaPath = path.resolve(__dirname, '../../src/utils/config/ConfigSchema.json'); expect(fs.existsSync(schemaPath)).toBe(true); }); }); diff --git a/tsconfig.json b/tsconfig.json index f5bf64d1e6..2949683405 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,41 +1,24 @@ { "compilerOptions": { - "incremental": true, - "tsBuildInfoFile": "/app/.tsbuildinfo", - "target": "esnext", - "module": "esnext", - "strict": false, + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ES2022", "DOM", "DOM.Iterable"], "jsx": "preserve", - "importHelpers": true, - "moduleResolution": "node", - "experimentalDecorators": true, + "allowJs": true, + "checkJs": false, + "noEmit": true, + "strict": false, "esModuleInterop": true, "allowSyntheticDefaultImports": true, - "sourceMap": true, - "baseUrl": ".", - "types": [ - "webpack-env", - "jest", - "node" - ], + "resolveJsonModule": true, + "skipLibCheck": true, + "isolatedModules": true, "paths": { - "@/*": [ - "src/*" - ] + "@/*": ["./src/*"] }, - "lib": [ - "esnext", - "dom", - "dom.iterable", - "scripthost" - ] + "types": ["vite/client", "node"] }, - "include": [ - "src/**/*.ts", - "src/**/*.vue", - "tests/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["src/**/*.js", "src/**/*.vue", "tests/**/*.js"], + "exclude": ["node_modules", "dist", "user-data"] } diff --git a/user-data/conf.yml b/user-data/conf.yml index 2d62014781..01cf86ddd4 100644 --- a/user-data/conf.yml +++ b/user-data/conf.yml @@ -15,32 +15,44 @@ appConfig: # Main content - An array of sections, each containing an array of items sections: -- name: Getting Started - icon: fas fa-rocket - items: - - title: Dashy Live - description: Development a project management links for Dashy - icon: https://i.ibb.co/qWWpD0v/astro-dab-128.png - url: https://live.dashy.to/ - target: newtab - - title: GitHub - description: Source Code, Issues and Pull Requests - url: https://github.com/lissy93/dashy - icon: favicon - - title: Docs - description: Configuring & Usage Documentation - provider: Dashy.to - icon: far fa-book - url: https://dashy.to/docs - - title: Showcase - description: See how others are using Dashy - url: https://github.com/Lissy93/dashy/blob/master/docs/showcase.md - icon: far fa-grin-hearts - - title: Config Guide - description: See full list of configuration options - url: https://github.com/Lissy93/dashy/blob/master/docs/configuring.md - icon: fas fa-wrench - - title: Support - description: Get help with Dashy, raise a bug, or get in contact - url: https://github.com/Lissy93/dashy/blob/master/.github/SUPPORT.md - icon: far fa-hands-helping + - name: Getting Started + icon: fas fa-rocket + items: + - title: GitHub + description: Source Code, Issues and Pull Requests + url: https://github.com/lissy93/dashy + icon: si-github + - title: Docs + description: Configuring & Usage Documentation + provider: Dashy.to + icon: far fa-book + url: https://dashy.to/docs + + - name: Support Dashy + icon: fas fa-heart + displayData: + itemSize: large + widgets: + - type: image + label: Dashy is made possible thanks to our awesome sponsors + options: + imagePath: https://readme-contribs.as93.net/sponsors/lissy93?perRow=5&shape=squircle + items: + - title: Sponsor + url: https://github.com/sponsors/lissy93 + description: Sponsor @Lissy93 on GitHub to support with ongoing development of Dashy + icon: ๐Ÿฉท + color: '#ff78d1' + backgroundColor: '#c30c844a' + + - name: Latest Updates + icon: fas fa-code-branch + displayData: + cols: 1 + rows: 3 + cutToHeight: true + widgets: + - type: rss-feed + options: + rssUrl: https://github.com/lissy93/dashy/releases.atom + limit: 5 diff --git a/vite.config.mjs b/vite.config.mjs new file mode 100644 index 0000000000..b7c49a2172 --- /dev/null +++ b/vite.config.mjs @@ -0,0 +1,134 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import { VitePWA } from 'vite-plugin-pwa'; +import svgLoader from 'vite-svg-loader'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { readFileSync, copyFileSync, existsSync, readdirSync } from 'fs'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const pkg = JSON.parse(readFileSync(path.resolve(__dirname, 'package.json'), 'utf-8')); +const userDataDir = path.resolve(__dirname, process.env.USER_DATA_DIR || 'user-data'); + +function serveUserData() { + return { + name: 'serve-user-data', + configureServer(server) { + server.middlewares.use((req, res, next) => { + if (!req.url) return next(); + const filePath = path.join(userDataDir, req.url.split('?')[0]); + try { + const content = readFileSync(filePath); + const ext = path.extname(filePath); + const types = { '.yml': 'text/yaml', '.yaml': 'text/yaml', '.json': 'application/json', '.png': 'image/png', '.svg': 'image/svg+xml' }; + res.setHeader('Content-Type', types[ext] || 'application/octet-stream'); + res.end(content); + } catch { + next(); + } + }); + }, + }; +} + +function copyUserDataConfig() { + return { + name: 'copy-user-data-config', + closeBundle() { + const outDir = path.resolve(__dirname, 'dist'); + if (!existsSync(userDataDir)) return; + const ymlFiles = readdirSync(userDataDir).filter(f => f.endsWith('.yml') || f.endsWith('.yaml')); + for (const file of ymlFiles) { + const src = path.join(userDataDir, file); + const dest = path.join(outDir, file); + copyFileSync(src, dest); + } + }, + }; +} + +export default defineConfig({ + envPrefix: ['VITE_', 'DASHY_'], + plugins: [ + vue(), + svgLoader(), + serveUserData(), + copyUserDataConfig(), + VitePWA({ + registerType: 'prompt', + manifest: { + name: 'Dashy', + theme_color: '#00af87', + background_color: '#0b1021', + icons: [ + { src: '/web-icons/favicon-64x64.png', sizes: '64x64', type: 'image/png' }, + { src: '/web-icons/favicon-32x32.png', sizes: '32x32', type: 'image/png' }, + { src: '/web-icons/favicon-16x16.png', sizes: '16x16', type: 'image/png' }, + { src: '/web-icons/dashy-logo.png', sizes: '512x512', type: 'image/png' }, + ], + }, + workbox: { + cleanupOutdatedCaches: true, + clientsClaim: true, + skipWaiting: false, + navigateFallback: '/index.html', + navigateFallbackDenylist: [ + /^\/(status-check|system-info|cors-proxy|get-user|config-manager)\b/, + ], + maximumFileSizeToCacheInBytes: 10 * 1024 * 1024, + globIgnores: [ + '**/*.map', + '**/manifest*.js', + '**/.nojekyll', + '**/.gitignore', + '**/*.yml', + '**/*.yaml', + ], + runtimeCaching: [ + { + urlPattern: /\.ya?ml(\?.*)?$/i, + handler: 'NetworkFirst', + options: { + cacheName: 'dashy-config', + networkTimeoutSeconds: 3, + expiration: { maxEntries: 20, maxAgeSeconds: 60 * 60 * 24 }, + cacheableResponse: { statuses: [200] }, + }, + }, + { + urlPattern: /\/(status-check|system-info|cors-proxy|get-user|config-manager)\b/, + handler: 'NetworkOnly', + }, + ], + }, + }), + ], + + resolve: { + extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + + define: { + 'import.meta.env.VITE_APP_VERSION': JSON.stringify(pkg.version), + }, + + css: { + preprocessorOptions: { + scss: { + silenceDeprecations: ['import', 'legacy-js-api'], + }, + }, + }, + + build: { + outDir: 'dist', + chunkSizeWarningLimit: 7000, + }, + + server: { + port: 8080, + }, +}); diff --git a/vitest.config.js b/vitest.config.mjs similarity index 55% rename from vitest.config.js rename to vitest.config.mjs index 3f5fc181bb..e29787a318 100644 --- a/vitest.config.js +++ b/vitest.config.mjs @@ -1,22 +1,17 @@ import { defineConfig } from 'vitest/config'; -import { createVuePlugin } from 'vite-plugin-vue2'; +import vue from '@vitejs/plugin-vue'; import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); export default defineConfig({ - plugins: [createVuePlugin()], + plugins: [vue()], test: { - // Use happy-dom for faster DOM simulation - environment: 'happy-dom', - - // Make test functions available globally (describe, it, expect, etc.) - globals: true, - - // Setup file for global test configuration + environment: 'happy-dom', // Use happy-dom for faster DOM simulation + globals: true, // Makes test funcs available globally (describe, it, expect, etc.) setupFiles: ['./tests/setup.js'], - - // Include patterns include: ['tests/**/*.{test,spec}.{js,ts}', 'src/**/*.{test,spec}.{js,ts}'], - // Coverage configuration coverage: { provider: 'v8', @@ -31,13 +26,10 @@ export default defineConfig({ ], }, }, - resolve: { extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], - // Match the alias configuration from vue.config.js alias: { - '@': path.resolve(__dirname, './src'), - vue: 'vue/dist/vue.esm.js', // Use the full build for tests + '@': path.resolve(__dirname, './src'), // same as the vite.config.ts }, }, }); diff --git a/vue.config.js b/vue.config.js deleted file mode 100644 index c80cdc5c71..0000000000 --- a/vue.config.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Dashy is built using Vue (2). This is the main Vue and Webpack configuration - * - * User Configurable Options: - * - NODE_ENV: Sets the app mode (production, development, test). - * - BASE_URL: Root URL for the app deployment (defaults to '/'). - * - INTEGRITY: Enables SRI, set to 'true' to activate. - * - USER_DATA_DIR: Sets an alternative dir for user data (defaults ./user-data). - * - IS_DOCKER: Indicates if running in a Docker container. - * - IS_SERVER: Indicates if running as a server (as opposed to static build). - * - * Documentation: - * - Vue CLI Config options: https://cli.vuejs.org/config - * - For Dashy docs, see the repo: https://github.com/lissy93/dashy - * - * Note: ES7 syntax is not supported in this configuration context. - * Licensed under the MIT License, (C) Alicia Sykes 2024 (see LICENSE for details). - */ - -const path = require('path'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); - -// Get app mode: production, development, or test -const mode = process.env.NODE_ENV || 'production'; - -// Get current version -process.env.VUE_APP_VERSION = require('./package.json').version; - -// Get default info for PWA -const { pwa } = require('./src/utils/defaults'); - -// Get base URL -const publicPath = process.env.BASE_URL || '/'; - -// Should enable Subresource Integrity (SRI) on link and script tags -const integrity = process.env.INTEGRITY === 'true'; - -// If neither env vars are set, then it's a static build -const isServer = process.env.IS_DOCKER || process.env.IS_SERVER || false; - -// Use copy-webpack-plugin to copy user-data to dist IF not running as a server -const plugins = !isServer ? [ - new CopyWebpackPlugin({ - patterns: [ - { from: './user-data', to: './' }, - ], - }), -] : []; - -// Webpack Config -const configureWebpack = { - devtool: 'source-map', - mode, - plugins, - module: { - rules: [ - { test: /.svg$/, loader: 'vue-svg-loader' }, - { - test: /\.tsx?$/, - loader: 'ts-loader', - options: { appendTsSuffixTo: [/\.vue$/] }, - }, - ], - }, - resolve: { - fallback: { - http: false, - https: false, - url: false, - timers: false, - stream: false, - }, - }, - performance: { - maxEntrypointSize: 10000000, - maxAssetSize: 10000000, - }, -}; - -// Development server config -const userDataDir = path.join(__dirname, process.env.USER_DATA_DIR || 'user-data'); -const devServer = { - static: { - directory: path.join(__dirname, 'public'), - }, - watchFiles: { - paths: [userDataDir], - }, -}; - -// Application pages -const pages = { - index: { - entry: 'src/main.js', - filename: 'index.html', - }, -}; - -// Export the main Vue app config -module.exports = { - publicPath, - pwa, - integrity, - configureWebpack, - pages, - devServer, - chainWebpack: config => { - config.module.rules.delete('svg'); - config.cache({ - type: 'filesystem', - }); - }, -}; diff --git a/yarn.lock b/yarn.lock index 747df75f64..9dc6ccb31b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,32 +2,15 @@ # yarn lockfile v1 -"@achrinza/node-ipc@^9.2.5": - version "9.2.10" - resolved "https://registry.yarnpkg.com/@achrinza/node-ipc/-/node-ipc-9.2.10.tgz#aa17def30e134e8c0a8738ffc13e50c08a753ff0" - integrity sha512-rCkw57K82y1XA9KwBmuMrupFQr9VOS4Rn77vW2UD2j0+HjlP/npSON9COkUIfocd95B4wv5EpfWMr6lGD4lN3A== - dependencies: - "@node-ipc/js-queue" "2.0.3" - event-pubsub "4.3.0" - js-message "1.0.7" - "@apideck/better-ajv-errors@^0.3.1": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" - integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + version "0.3.7" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.7.tgz#89238f689d81a644139a47e0ebc2e236bca1ff2c" + integrity sha512-TajUJwGWbDwkCx/CZi7tRE8PVB7simCvKJfHUsSdvps+aTM/PDPP4gkLmKnc+x3CE//y9i/nj74GqdL/hwk7Iw== dependencies: - json-schema "^0.4.0" - jsonpointer "^5.0.0" + jsonpointer "^5.0.1" leven "^3.1.0" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== @@ -36,12 +19,12 @@ js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.0": +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== -"@babel/core@^7.11.1", "@babel/core@^7.12.16", "@babel/core@^7.14.3", "@babel/core@^7.17.9", "@babel/core@^7.26.0": +"@babel/core@^7.24.4": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== @@ -62,15 +45,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.25.0": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz#6a294a4add732ebe7ded8a8d2792dd03dd81dc3f" - integrity sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - "@babel/generator@^7.29.0": version "7.29.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" @@ -89,7 +63,7 @@ dependencies: "@babel/types" "^7.27.3" -"@babel/helper-compilation-targets@^7.12.16", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.28.6": +"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== @@ -100,7 +74,7 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.28.6": +"@babel/helper-create-class-features-plugin@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb" integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow== @@ -122,10 +96,10 @@ regexpu-core "^6.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.7": - version "0.6.7" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz#8d01cba97de419115ad3497573a476db15dc6c6a" - integrity sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w== +"@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== dependencies: "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" @@ -146,7 +120,7 @@ "@babel/traverse" "^7.28.5" "@babel/types" "^7.28.5" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.27.1", "@babel/helper-module-imports@^7.28.6": +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== @@ -170,7 +144,7 @@ dependencies: "@babel/types" "^7.27.1" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== @@ -193,7 +167,7 @@ "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/traverse" "^7.28.6" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.27.1": +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== @@ -206,7 +180,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.25.9", "@babel/helper-validator-identifier@^7.28.5": +"@babel/helper-validator-identifier@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== @@ -226,27 +200,17 @@ "@babel/types" "^7.28.6" "@babel/helpers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" - integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" + integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== dependencies: "@babel/template" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/highlight@^7.10.4": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" - integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" + "@babel/types" "^7.29.0" -"@babel/parser@^7.17.9", "@babel/parser@^7.23.5", "@babel/parser@^7.28.0", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" - integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== +"@babel/parser@^7.28.6", "@babel/parser@^7.29.0", "@babel/parser@^7.29.2": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" + integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== dependencies: "@babel/types" "^7.29.0" @@ -289,70 +253,11 @@ "@babel/helper-plugin-utils" "^7.28.6" "@babel/traverse" "^7.28.6" -"@babel/plugin-proposal-class-properties@^7.12.13", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-decorators@^7.12.13", "@babel/plugin-proposal-decorators@^7.17.9": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz#d159f26f78740e47bf3ef075882b155b2d54ca81" - integrity sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-syntax-decorators" "^7.28.6" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-object-rest-spread@^7.15.6", "@babel/plugin-proposal-object-rest-spread@^7.17.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-chaining@^7.14.2", "@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-syntax-decorators@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz#8c3293a0fef033e4c786b35ce1e159fc1d676153" - integrity sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - "@babel/plugin-syntax-import-assertions@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz#ae9bc1923a6ba527b70104dd2191b0cd872c8507" @@ -367,41 +272,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.28.6" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee" - integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-typescript@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2" - integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -410,7 +280,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.14.5", "@babel/plugin-transform-arrow-functions@^7.16.7", "@babel/plugin-transform-arrow-functions@^7.27.1": +"@babel/plugin-transform-arrow-functions@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== @@ -442,7 +312,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-block-scoping@^7.14.5", "@babel/plugin-transform-block-scoping@^7.16.7", "@babel/plugin-transform-block-scoping@^7.28.6": +"@babel/plugin-transform-block-scoping@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99" integrity sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw== @@ -477,7 +347,7 @@ "@babel/helper-replace-supers" "^7.28.6" "@babel/traverse" "^7.28.6" -"@babel/plugin-transform-computed-properties@^7.14.5", "@babel/plugin-transform-computed-properties@^7.16.7", "@babel/plugin-transform-computed-properties@^7.28.6": +"@babel/plugin-transform-computed-properties@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz#936824fc71c26cb5c433485776d79c8e7b0202d2" integrity sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ== @@ -485,7 +355,7 @@ "@babel/helper-plugin-utils" "^7.28.6" "@babel/template" "^7.28.6" -"@babel/plugin-transform-destructuring@^7.14.5", "@babel/plugin-transform-destructuring@^7.17.7", "@babel/plugin-transform-destructuring@^7.28.5": +"@babel/plugin-transform-destructuring@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== @@ -687,7 +557,7 @@ "@babel/helper-plugin-utils" "^7.28.6" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" -"@babel/plugin-transform-parameters@^7.14.5", "@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.27.7": +"@babel/plugin-transform-parameters@^7.27.7": version "7.27.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== @@ -740,18 +610,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-runtime@^7.12.15": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz#a5fded13cc656700804bfd6e5ebd7fffd5266803" - integrity sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - semver "^6.3.1" - "@babel/plugin-transform-shorthand-properties@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" @@ -759,7 +617,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-spread@^7.14.5", "@babel/plugin-transform-spread@^7.16.7", "@babel/plugin-transform-spread@^7.28.6": +"@babel/plugin-transform-spread@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz#40a2b423f6db7b70f043ad027a58bcb44a9757b6" integrity sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA== @@ -788,17 +646,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-typescript@^7.16.8": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz#1e93d96da8adbefdfdade1d4956f73afa201a158" - integrity sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.28.6" - "@babel/plugin-transform-unicode-escapes@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" @@ -830,10 +677,10 @@ "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.16", "@babel/preset-env@^7.26.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.0.tgz#c55db400c515a303662faaefd2d87e796efa08d0" - integrity sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w== +"@babel/preset-env@^7.11.0": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.2.tgz#5a173f22c7d8df362af1c9fe31facd320de4a86c" + integrity sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw== dependencies: "@babel/compat-data" "^7.29.0" "@babel/helper-compilation-targets" "^7.28.6" @@ -915,12 +762,12 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.13.10": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b" - integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== +"@babel/runtime@^7.11.2": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" + integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== -"@babel/template@^7.27.2", "@babel/template@^7.28.6": +"@babel/template@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== @@ -929,7 +776,7 @@ "@babel/parser" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== @@ -942,7 +789,7 @@ "@babel/types" "^7.29.0" debug "^4.3.1" -"@babel/types@^7.14.5", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.4.4": +"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.4.4": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== @@ -950,176 +797,342 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@formschema/native@^2.0.0-beta.6": - version "2.0.0-beta.7" - resolved "https://registry.yarnpkg.com/@formschema/native/-/native-2.0.0-beta.7.tgz#8333b0b6daf2f7d73b5c996d649be5d14a9fc694" - integrity sha512-7LfhKpQ06j2frQb3a8TkCeDqrKIXhIO7kQpxPWkxetmiLGyXLMup4m765qnTBN57GuufqAQXe70C/7CQ9bfvYw== - -"@gar/promisify@^1.0.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== +"@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.20.1": + version "6.20.1" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz#4cfbc8b2e1e25f890ec34a081037e58b4e44143e" + integrity sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + +"@codemirror/commands@^6.10.3": + version "6.10.3" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.10.3.tgz#01877060befdec352e8300dec1f185489c300635" + integrity sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.6.0" + "@codemirror/view" "^6.27.0" + "@lezer/common" "^1.1.0" + +"@codemirror/lang-yaml@^6.1.3": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@codemirror/lang-yaml/-/lang-yaml-6.1.3.tgz#4d4127e8339984639715d1e3f8edca1ea5bfabfb" + integrity sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.2.0" + "@lezer/lr" "^1.0.0" + "@lezer/yaml" "^1.0.0" + +"@codemirror/language@^6.0.0", "@codemirror/language@^6.12.3": + version "6.12.3" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.12.3.tgz#0b220182973a4c19850b29f7dd82aec1bbae3d7e" + integrity sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.23.0" + "@lezer/common" "^1.5.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + +"@codemirror/lint@^6.9.5": + version "6.9.5" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.9.5.tgz#c7da006f3335a33014799a7375c82df558e89f90" + integrity sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.35.0" + crelt "^1.0.5" + +"@codemirror/search@^6.7.0": + version "6.7.0" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.7.0.tgz#c6bea0ab0e882395d03a760b1a7d3959b1f3a4ac" + integrity sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.37.0" + crelt "^1.0.5" + +"@codemirror/state@^6.0.0", "@codemirror/state@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.6.0.tgz#b88dbdc14aea4ace3c6d67bb77fe28bb84e4394e" + integrity sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ== + dependencies: + "@marijn/find-cluster-break" "^1.0.0" + +"@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0", "@codemirror/view@^6.41.1": + version "6.41.1" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.41.1.tgz#8ecb39af289e7d03df0f3fb6e3c9b1f8747839bf" + integrity sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg== + dependencies: + "@codemirror/state" "^6.6.0" + crelt "^1.0.6" + style-mod "^4.1.0" + w3c-keyname "^2.2.4" + +"@emnapi/core@^1.4.3": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" -"@hapi/topo@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== +"@emnapi/runtime@^1.4.3": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== dependencies: - "@hapi/hoek" "^9.0.0" + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + +"@esbuild/aix-ppc64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c" + integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA== + +"@esbuild/android-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752" + integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg== + +"@esbuild/android-arm@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a" + integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg== + +"@esbuild/android-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16" + integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg== + +"@esbuild/darwin-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz#79197898ec1ff745d21c071e1c7cc3c802f0c1fd" + integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg== + +"@esbuild/darwin-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e" + integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA== + +"@esbuild/freebsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe" + integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg== + +"@esbuild/freebsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3" + integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ== + +"@esbuild/linux-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977" + integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ== + +"@esbuild/linux-arm@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9" + integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw== + +"@esbuild/linux-ia32@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0" + integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA== + +"@esbuild/linux-loong64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0" + integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng== + +"@esbuild/linux-mips64el@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd" + integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw== + +"@esbuild/linux-ppc64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869" + integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA== + +"@esbuild/linux-riscv64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6" + integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w== + +"@esbuild/linux-s390x@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663" + integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg== + +"@esbuild/linux-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306" + integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw== + +"@esbuild/netbsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4" + integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg== + +"@esbuild/netbsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076" + integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ== + +"@esbuild/openbsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd" + integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A== + +"@esbuild/openbsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679" + integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw== + +"@esbuild/openharmony-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d" + integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg== + +"@esbuild/sunos-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6" + integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w== + +"@esbuild/win32-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323" + integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg== + +"@esbuild/win32-ia32@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267" + integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ== + +"@esbuild/win32-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5" + integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA== + +"@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.8.0": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/config-array@^0.23.5": + version "0.23.5" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.5.tgz#56e86d243049195d8acc0c06a1b3dfdc3fa3de95" + integrity sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA== + dependencies: + "@eslint/object-schema" "^3.0.5" + debug "^4.3.1" + minimatch "^10.2.4" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@eslint/config-helpers@^0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.5.tgz#ae16134e4792ac5fbdc533548a24ac1ea9f7f3ae" + integrity sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" + "@eslint/core" "^1.2.1" -"@humanwhocodes/object-schema@^1.2.0": +"@eslint/core@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.2.1.tgz#c1da7cd1b82fa8787f98b5629fb811848a1b63ce" + integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/js@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-10.0.1.tgz#1e8a876f50117af8ab67e47d5ad94d38d6622583" + integrity sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA== + +"@eslint/object-schema@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.5.tgz#88e9bf4d11d2b19c082e78ebe7ce88724a5eb091" + integrity sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw== + +"@eslint/plugin-kit@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz#c4125fd015eceeb09b793109fdbcd4dd0a02d346" + integrity sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ== + dependencies: + "@eslint/core" "^1.2.1" + levn "^0.4.1" + +"@humanfs/core@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" + integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== + dependencies: + "@humanfs/types" "^0.15.0" + +"@humanfs/node@^0.16.6": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" + integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== + dependencies: + "@humanfs/core" "^0.19.2" + "@humanfs/types" "^0.15.0" + "@humanwhocodes/retry" "^0.4.0" + +"@humanfs/types@^0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" + integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@intlify/core-base@9.14.5": + version "9.14.5" + resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.14.5.tgz#cfed631e98b34f4f6fe1312e6c02dd8ace180197" + integrity sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA== + dependencies: + "@intlify/message-compiler" "9.14.5" + "@intlify/shared" "9.14.5" + +"@intlify/message-compiler@9.14.5": + version "9.14.5" + resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.14.5.tgz#03b0a358c93cb2eed95936531c8a5871fd3841b0" + integrity sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ== + dependencies: + "@intlify/shared" "9.14.5" + source-map-js "^1.0.2" + +"@intlify/shared@9.14.5": + version "9.14.5" + resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.14.5.tgz#2e42193b8356db20ee28c15d1ee6c8f0fda6c0b9" + integrity sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -1133,12 +1146,10 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" +"@isaacs/cliui@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-9.0.0.tgz#4d0a3f127058043bf2e7ee169eaf30ed901302f3" + integrity sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg== "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" @@ -1182,72 +1193,87 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" - integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== - -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== +"@jsonforms/core@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@jsonforms/core/-/core-3.7.0.tgz#444fff8860342d097443e6c33374d90fc076a8cc" + integrity sha512-CE9viWtwi9QWLqlWLeOul1/R1GRAyOA9y6OoUpsCc0FhyR+g5p29F3k0fUExHWxL0Sf4KHcXYkfhtqfRBPS8ww== dependencies: - eslint-scope "5.1.1" - -"@noble/hashes@^1.1.5": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" - integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== + "@types/json-schema" "^7.0.3" + ajv "^8.6.1" + ajv-formats "^2.1.0" + lodash "^4.17.21" -"@node-ipc/js-queue@2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz#ac7fe33d766fa53e233ef8fedaf3443a01c5a4cd" - integrity sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw== +"@jsonforms/vue-vanilla@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@jsonforms/vue-vanilla/-/vue-vanilla-3.7.0.tgz#f5a0e654090c023a3f7424fa5d330e1e45532d69" + integrity sha512-+wCnot4j0dXHx4cZg1bC7GunVhNCn0bYYCzsy+zJGJwQmdjQ/pdaDcF6CaS7crL/rO1lrEfW+03oJNBi50YDyw== dependencies: - easy-stack "1.0.1" + lodash "^4.17.21" -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== +"@jsonforms/vue@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@jsonforms/vue/-/vue-3.7.0.tgz#2d51e912e4b0252951f42bb6380ad005c5a709ab" + integrity sha512-S5NXYeu6lTh2yfNmPz17TRo32dSYqAhOe8Co2mp0lmeq1ODJNBQs8SesXqBRdVMEmMK20ZW/1i7i/38J0TGjdw== dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" + lodash "^4.17.21" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@lezer/common@^1.0.0", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.3.0", "@lezer/common@^1.5.0": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.5.2.tgz#d6840db13779e3f1b42e70c9a97c4086d12fae22" + integrity sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ== -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== +"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.2.0", "@lezer/highlight@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.3.tgz#a20f324b71148a2ea9ba6ff42e58bbfaec702857" + integrity sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g== dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + "@lezer/common" "^1.3.0" -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== +"@lezer/lr@^1.0.0", "@lezer/lr@^1.4.0": + version "1.4.10" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.10.tgz#b3acc36e5ad049b74ddb7719594e7e74d9161ff5" + integrity sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A== dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" + "@lezer/common" "^1.0.0" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== +"@lezer/yaml@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@lezer/yaml/-/yaml-1.0.4.tgz#66a622188f1984a71d34506759b5807699043589" + integrity sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw== dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.4.0" + +"@marijn/find-cluster-break@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" + integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== + +"@napi-rs/wasm-runtime@^0.2.11": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" + integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.10.0" + +"@noble/hashes@^1.1.5": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== "@one-ini/wasm@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323" integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== +"@package-json/types@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@package-json/types/-/types-0.0.12.tgz#4629e833ba128ed9880b6b7a947633ee22952462" + integrity sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw== + "@paralleldrive/cuid2@^2.2.2": version "2.3.1" resolved "https://registry.yarnpkg.com/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz#3d62ea9e7be867d3fa94b9897fab5b0ae187d784" @@ -1362,17 +1388,16 @@ "@babel/helper-module-imports" "^7.10.4" "@rollup/pluginutils" "^3.1.0" -"@rollup/plugin-node-resolve@^11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" - integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== +"@rollup/plugin-node-resolve@^15.2.3": + version "15.3.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz#66008953c2524be786aa319d49e32f2128296a78" + integrity sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA== dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" deepmerge "^4.2.2" is-module "^1.0.0" - resolve "^1.19.0" + resolve "^1.22.1" "@rollup/plugin-replace@^2.4.1": version "2.4.2" @@ -1382,6 +1407,15 @@ "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" +"@rollup/plugin-terser@^0.4.3": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz#15dffdb3f73f121aa4fbb37e7ca6be9aeea91962" + integrity sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A== + dependencies: + serialize-javascript "^6.0.1" + smob "^1.0.0" + terser "^5.17.4" + "@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" @@ -1391,284 +1425,198 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/pluginutils@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== +"@rollup/pluginutils@^5.0.1": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" + integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - -"@rollup/rollup-android-arm-eabi@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz#a6742c74c7d9d6d604ef8a48f99326b4ecda3d82" - integrity sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg== - -"@rollup/rollup-android-arm64@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz#97247be098de4df0c11971089fd2edf80a5da8cf" - integrity sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q== - -"@rollup/rollup-darwin-arm64@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz#674852cf14cf11b8056e0b1a2f4e872b523576cf" - integrity sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg== - -"@rollup/rollup-darwin-x64@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz#36dfd7ed0aaf4d9d89d9ef983af72632455b0246" - integrity sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w== - -"@rollup/rollup-freebsd-arm64@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz#2f87c2074b4220260fdb52a9996246edfc633c22" - integrity sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA== - -"@rollup/rollup-freebsd-x64@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz#9b5a26522a38a95dc06616d1939d4d9a76937803" - integrity sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg== - -"@rollup/rollup-linux-arm-gnueabihf@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz#86aa4859385a8734235b5e40a48e52d770758c3a" - integrity sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw== - -"@rollup/rollup-linux-arm-musleabihf@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz#cbe70e56e6ece8dac83eb773b624fc9e5a460976" - integrity sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA== - -"@rollup/rollup-linux-arm64-gnu@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz#d14992a2e653bc3263d284bc6579b7a2890e1c45" - integrity sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA== - -"@rollup/rollup-linux-arm64-musl@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz#2fdd1ddc434ea90aeaa0851d2044789b4d07f6da" - integrity sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA== - -"@rollup/rollup-linux-loong64-gnu@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz#8a181e6f89f969f21666a743cd411416c80099e7" - integrity sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg== - -"@rollup/rollup-linux-loong64-musl@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz#904125af2babc395f8061daa27b5af1f4e3f2f78" - integrity sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q== - -"@rollup/rollup-linux-ppc64-gnu@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz#a57970ac6864c9a3447411a658224bdcf948be22" - integrity sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA== - -"@rollup/rollup-linux-ppc64-musl@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz#bb84de5b26870567a4267666e08891e80bb56a63" - integrity sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA== - -"@rollup/rollup-linux-riscv64-gnu@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz#72d00d2c7fb375ce3564e759db33f17a35bffab9" - integrity sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg== - -"@rollup/rollup-linux-riscv64-musl@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz#4c166ef58e718f9245bd31873384ba15a5c1a883" - integrity sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg== - -"@rollup/rollup-linux-s390x-gnu@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz#bb5025cde9a61db478c2ca7215808ad3bce73a09" - integrity sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w== - -"@rollup/rollup-linux-x64-gnu@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz#9b66b1f9cd95c6624c788f021c756269ffed1552" - integrity sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg== - -"@rollup/rollup-linux-x64-musl@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz#b007ca255dc7166017d57d7d2451963f0bd23fd9" - integrity sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg== - -"@rollup/rollup-openbsd-x64@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz#e8b357b2d1aa2c8d76a98f5f0d889eabe93f4ef9" - integrity sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ== - -"@rollup/rollup-openharmony-arm64@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz#96c2e3f4aacd3d921981329831ff8dde492204dc" - integrity sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA== - -"@rollup/rollup-win32-arm64-msvc@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz#2d865149d706d938df8b4b8f117e69a77646d581" - integrity sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A== - -"@rollup/rollup-win32-ia32-msvc@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz#abe1593be0fa92325e9971c8da429c5e05b92c36" - integrity sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA== - -"@rollup/rollup-win32-x64-gnu@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz#c4af3e9518c9a5cd4b1c163dc81d0ad4d82e7eab" - integrity sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA== - -"@rollup/rollup-win32-x64-msvc@4.59.0": - version "4.59.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz#4584a8a87b29188a4c1fe987a9fcf701e256d86c" - integrity sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA== - -"@rtsao/scc@^1.1.0": + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz#043f145716234529052ef9e1ce1d847ffbe9e674" + integrity sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA== + +"@rollup/rollup-android-arm64@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz#023e1bd146e7519087dfd9e8b29e4cf9f8ecd35c" + integrity sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA== + +"@rollup/rollup-darwin-arm64@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz#55ccb5487c02419954c57a7a80602885d616e1ee" + integrity sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw== + +"@rollup/rollup-darwin-x64@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz#254b65404b14488c83225e88b8819376ad71a784" + integrity sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew== + +"@rollup/rollup-freebsd-arm64@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz#6377ff38c052c76fcaffb7b2728d3172fe676fe6" + integrity sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w== + +"@rollup/rollup-freebsd-x64@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz#ba3902309d088eaf7139b916f09b7140b28b406d" + integrity sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g== + +"@rollup/rollup-linux-arm-gnueabihf@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz#e011b9a14638267e53b446286e838dbdaf53f167" + integrity sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g== + +"@rollup/rollup-linux-arm-musleabihf@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz#0bce9ce9a009490abd28fd922dd97ed521311afe" + integrity sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg== + +"@rollup/rollup-linux-arm64-gnu@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz#6f6cfbbf324fbb4ceff213abdf7f322fd45d25ff" + integrity sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ== + +"@rollup/rollup-linux-arm64-musl@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz#f7cb3eecaea9c151ef77342af05f38ae924bf795" + integrity sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA== + +"@rollup/rollup-linux-loong64-gnu@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz#499bfac6bb669fd88bb664357bf6be996a28b92f" + integrity sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ== + +"@rollup/rollup-linux-loong64-musl@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz#127dfac08764764396bbe04453c545d38a3ab518" + integrity sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw== + +"@rollup/rollup-linux-ppc64-gnu@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz#6a72f4d95852aac18326c5bf708393e8f3a41b70" + integrity sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw== + +"@rollup/rollup-linux-ppc64-musl@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz#ba8674666b00d6f9066cb9a5771a8430c34d2de6" + integrity sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg== + +"@rollup/rollup-linux-riscv64-gnu@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz#17cc38b2a71e302547cad29bcf78d0db2618c922" + integrity sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg== + +"@rollup/rollup-linux-riscv64-musl@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz#e36a41e2d8bd247331bd5cfc13b8c951d33454a2" + integrity sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg== + +"@rollup/rollup-linux-s390x-gnu@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz#1687265f1f4bdea0726c761a58c2db9933609d68" + integrity sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ== + +"@rollup/rollup-linux-x64-gnu@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz#56a6a0d9076f2a05a976031493b24a20ddcc0e77" + integrity sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg== + +"@rollup/rollup-linux-x64-musl@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz#bc240ebb5b9fd8d41ca8a80cb458452e8c187e0f" + integrity sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w== + +"@rollup/rollup-openbsd-x64@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz#6f80d48a006c4b2ffa7724e95a3e33f6975872af" + integrity sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw== + +"@rollup/rollup-openharmony-arm64@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz#8f6db6f70d0a48abd833b263cd6dd3e7199c4c0e" + integrity sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA== + +"@rollup/rollup-win32-arm64-msvc@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz#b68989bfa815d0b3d4e302ecd90bda744438b177" + integrity sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g== + +"@rollup/rollup-win32-ia32-msvc@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz#c098e45338c50f22f1b288476354f025b746285b" + integrity sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg== + +"@rollup/rollup-win32-x64-gnu@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz#2c9e15be155b79d05999953b1737b2903842e903" + integrity sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg== + +"@rollup/rollup-win32-x64-msvc@4.60.1": + version "4.60.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz#23b860113e9f87eea015d1fa3a4240a52b42fcd4" + integrity sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ== + +"@sentry-internal/browser-utils@9.47.1": + version "9.47.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-9.47.1.tgz#212fd29613e1631c7a490e860845160050962017" + integrity sha512-twv6YhrUlPkvKz4/iQDH4KHgcv9t4cMjmZPf4/dCSCXn4/GOjzjx2d74c1w+1KOdS7lcsQzI+MtbK6SeYLiGfQ== + dependencies: + "@sentry/core" "9.47.1" + +"@sentry-internal/feedback@9.47.1": + version "9.47.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-9.47.1.tgz#b4043e8ba5c687414b3eb091ccfb66c2f1fcfd34" + integrity sha512-xJ4vKvIpAT8e+Sz80YrsNinPU0XV7jPxPjdZ4ex8R2mMvx7pM0gq8JiR/sIVmNiOE0WiUDr6VwLDE8j2APSRMA== + dependencies: + "@sentry/core" "9.47.1" + +"@sentry-internal/replay-canvas@9.47.1": + version "9.47.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-9.47.1.tgz#fd55b9a6bdd60a214a2244a3b7556a096b9fc6ab" + integrity sha512-r9nve+l5+elGB9NXSN1+PUgJy790tXN1e8lZNH2ziveoU91jW4yYYt34mHZ30fU9tOz58OpaRMj3H3GJ/jYZVA== + dependencies: + "@sentry-internal/replay" "9.47.1" + "@sentry/core" "9.47.1" + +"@sentry-internal/replay@9.47.1": + version "9.47.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-9.47.1.tgz#6b62c0b055917279448caf7a79c273562e93d940" + integrity sha512-O9ZEfySpstGtX1f73m3NbdbS2utwPikaFt6sgp74RG4ZX4LlXe99VAjKR464xKECpYsLmj2bYpiK4opURF0pBA== + dependencies: + "@sentry-internal/browser-utils" "9.47.1" + "@sentry/core" "9.47.1" + +"@sentry/browser@9.47.1": + version "9.47.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-9.47.1.tgz#38da62d2d3b4f25aec066a7e7fdc337d75230b85" + integrity sha512-at5JOLziw5QpVYytxTDU6xijdV6lDQ/Rxp/qXJaHXud3gIK4suv2cXW+tupJfwoUoHFCnDNfccjCmPmP0yRqiA== + dependencies: + "@sentry-internal/browser-utils" "9.47.1" + "@sentry-internal/feedback" "9.47.1" + "@sentry-internal/replay" "9.47.1" + "@sentry-internal/replay-canvas" "9.47.1" + "@sentry/core" "9.47.1" + +"@sentry/core@9.47.1": + version "9.47.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-9.47.1.tgz#6b95b8a03ade1ca04f8b9b457bc751eb8be0c06a" + integrity sha512-KX62+qIt4xgy8eHKHiikfhz2p5fOciXd0Cl+dNzhgPFq8klq4MGMNaf148GB3M/vBqP4nw/eFvRMAayFCgdRQw== + +"@sentry/vue@^9.0.0": + version "9.47.1" + resolved "https://registry.yarnpkg.com/@sentry/vue/-/vue-9.47.1.tgz#204459b5fad7b95378a6b7e2177fe1b924283d72" + integrity sha512-ZDBf7tAH9C2b46UMtdJWcGyYRc+XwUpt3gRwe2lgEVyVNE7rXFH38zkgZXr+5N/RQU/TdYmV55mf+IXsrNnosw== + dependencies: + "@sentry/browser" "9.47.1" + "@sentry/core" "9.47.1" + +"@standard-schema/spec@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@sentry-internal/feedback@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.120.4.tgz#d3f1a2a66cb5e93816b67280737cd71f034ee58b" - integrity sha512-eSwgvTdrh03zYYaI6UVOjI9p4VmKg6+c2+CBQfRZX++6wwnCVsNv7XF7WUIpVGBAkJ0N2oapjQmCzJKGKBRWQg== - dependencies: - "@sentry/core" "7.120.4" - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - -"@sentry-internal/replay-canvas@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.120.4.tgz#16bacd5b4d40b83a913a0e045682d71cf12b308e" - integrity sha512-2+W4CgUL1VzrPjArbTid4WhKh7HH21vREVilZdvffQPVwOEpgNTPAb69loQuTlhJVveh9hWTj2nE5UXLbLP+AA== - dependencies: - "@sentry/core" "7.120.4" - "@sentry/replay" "7.120.4" - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - -"@sentry-internal/tracing@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.120.4.tgz#4410e9cb4b6f8333111d97e8be7f01c7eaa008ca" - integrity sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw== - dependencies: - "@sentry/core" "7.120.4" - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - -"@sentry/browser@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.120.4.tgz#cd5ac38a4234a6f076a6a4780d53930ad24205c9" - integrity sha512-ymlNtIPG6HAKzM/JXpWVGCzCNufZNADfy+O/olZuVJW5Be1DtOFyRnBvz0LeKbmxJbXb2lX/XMhuen6PXPdoQw== - dependencies: - "@sentry-internal/feedback" "7.120.4" - "@sentry-internal/replay-canvas" "7.120.4" - "@sentry-internal/tracing" "7.120.4" - "@sentry/core" "7.120.4" - "@sentry/integrations" "7.120.4" - "@sentry/replay" "7.120.4" - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - -"@sentry/core@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.120.4.tgz#b90780621ed8f5a4826c827f0843dc86b3ba4cd4" - integrity sha512-TXu3Q5kKiq8db9OXGkWyXUbIxMMuttB5vJ031yolOl5T/B69JRyAoKuojLBjRv1XX583gS1rSSoX8YXX7ATFGA== - dependencies: - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - -"@sentry/integrations@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.120.4.tgz#bcd21b4981890282dfb38f58e07e6bbfd8954d5b" - integrity sha512-kkBTLk053XlhDCg7OkBQTIMF4puqFibeRO3E3YiVc4PGLnocXMaVpOSCkMqAc1k1kZ09UgGi8DxfQhnFEjUkpA== - dependencies: - "@sentry/core" "7.120.4" - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - localforage "^1.8.1" - -"@sentry/replay@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.120.4.tgz#7594d9352a5daebd492f3a81aae2188fe367970d" - integrity sha512-FW8sPenNFfnO/K7sncsSTX4rIVak9j7VUiLIagJrcqZIC7d1dInFNjy8CdVJUlyz3Y3TOgIl3L3+ZpjfyMnaZg== - dependencies: - "@sentry-internal/tracing" "7.120.4" - "@sentry/core" "7.120.4" - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - -"@sentry/tracing@^7.102.1": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.120.4.tgz#8f30578267a50ac1b550d4e6746d958f37d4e17a" - integrity sha512-cAtpLh23qW3hoqZJ6c36EvFki5NhFWUSK71ALHefqDXEocMlfDc9I+IGn3B/ola2D2TDEDamCy3x32vctKqOag== - dependencies: - "@sentry-internal/tracing" "7.120.4" - -"@sentry/types@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.120.4.tgz#8fab8dceeec4bda079fc6e8e380b982f766de354" - integrity sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q== - -"@sentry/utils@7.120.4": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.120.4.tgz#8995637fc4742ee75df347dcd0f08ee137968c78" - integrity sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw== - dependencies: - "@sentry/types" "7.120.4" - -"@sentry/vue@^7.102.1": - version "7.120.4" - resolved "https://registry.yarnpkg.com/@sentry/vue/-/vue-7.120.4.tgz#b8439c3bf51f07b39ef9689fe09b2c5b51d93f9f" - integrity sha512-dPWNzS0kA8z9IDhOLuCpj6UC1Kw26WnTnjDy5m9qISm8fObalmpG6c+iL4Yj5qSBR0e6Jwak8V1gES2wTQGSLQ== - dependencies: - "@sentry/browser" "7.120.4" - "@sentry/core" "7.120.4" - "@sentry/types" "7.120.4" - "@sentry/utils" "7.120.4" - -"@sideway/address@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" - integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.27.8": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" - integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== - -"@soda/friendly-errors-webpack-plugin@^1.8.0": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz#4d4fbb1108993aaa362116247c3d18188a2c6c85" - integrity sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg== - dependencies: - chalk "^3.0.0" - error-stack-parser "^2.0.6" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -"@soda/get-current-script@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz#a53515db25d8038374381b73af20bb4f2e508d87" - integrity sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w== - -"@sphinxxxx/color-conversion@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz#03ecc29279e3c0c832f6185a5bfa3497858ac8ca" - integrity sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw== + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" @@ -1680,839 +1628,405 @@ magic-string "^0.25.0" string.prototype.matchall "^4.0.6" -"@types/body-parser@*": - version "1.19.6" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" - integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" - integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" - integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== +"@tybys/wasm-util@^0.10.0": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" + integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== dependencies: - "@types/eslint" "*" - "@types/estree" "*" + tslib "^2.4.0" -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== dependencies: - "@types/estree" "*" - "@types/json-schema" "*" + "@types/deep-eql" "*" + assertion-error "^2.0.1" -"@types/eslint@^7.29.0 || ^8.4.1": - version "8.56.12" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a" - integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== -"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== +"@types/esrecurse@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" + integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz#1a77faffee9572d39124933259be2523837d7eaa" - integrity sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.19.8" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz#99b960322a4d576b239a640ab52ef191989b036f" - integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz#2d724b2c990dcb8c8444063f3580a903f6d500cc" - integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "^2" - -"@types/express@^4.17.13": - version "4.17.25" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" - integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "^1" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-errors@*": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" - integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== - -"@types/http-proxy@^1.17.8": - version "1.17.17" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.17.tgz#d9e2c4571fe3507343cb210cd41790375e59a533" - integrity sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== - dependencies: - "@types/node" "*" +"@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.3": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/minimist@^1.2.0": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" - integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== - -"@types/node-forge@^1.3.0": - version "1.3.14" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.14.tgz#006c2616ccd65550560c2757d8472eb6d3ecea0b" - integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== - dependencies: - "@types/node" "*" - "@types/node@*", "@types/node@>=20.0.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" - integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== - dependencies: - undici-types "~7.18.0" - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/q@^1.5.1": - version "1.5.8" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837" - integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw== - -"@types/qs@*": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.0.tgz#963ab61779843fe910639a50661b48f162bc7f79" - integrity sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/send@*": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" - integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== - dependencies: - "@types/node" "*" - -"@types/send@<1": - version "0.17.6" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" - integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.4" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" - integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== - dependencies: - "@types/express" "*" - -"@types/serve-static@^1", "@types/serve-static@^1.13.10": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" - integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "<1" - -"@types/serve-static@^2": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz#d4a447503ead0d1671132d1ab6bd58b805d8de6a" - integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== + version "25.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.6.0.tgz#4e09bad9b469871f2d0f68140198cbd714f4edca" + integrity sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ== dependencies: - "@types/http-errors" "*" - "@types/node" "*" + undici-types "~7.19.0" -"@types/sockjs@^0.3.33": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" - integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== - dependencies: - "@types/node" "*" +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== "@types/trusted-types@^2.0.2", "@types/trusted-types@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/webpack-env@^1.15.2": - version "1.18.8" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.8.tgz#71f083718c094204d7b64443701d32f1db3989e3" - integrity sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A== - "@types/whatwg-mimetype@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz#e5e06dcd3e92d4e622ef0129637707d66c28d6a4" integrity sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA== -"@types/ws@^8.18.1", "@types/ws@^8.5.5": +"@types/ws@^8.18.1": version "8.18.1" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== dependencies: "@types/node" "*" -"@vitest/expect@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.1.tgz#b90c213f587514a99ac0bf84f88cff9042b0f14d" - integrity sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog== - dependencies: - "@vitest/spy" "1.6.1" - "@vitest/utils" "1.6.1" - chai "^4.3.10" +"@typescript-eslint/types@^8.56.0": + version "8.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.0.tgz#cfcc643c6e879016479775850d86d84c14492738" + integrity sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A== -"@vitest/runner@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.1.tgz#10f5857c3e376218d58c2bfacfea1161e27e117f" - integrity sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA== - dependencies: - "@vitest/utils" "1.6.1" - p-limit "^5.0.0" - pathe "^1.1.1" +"@unrs/resolver-binding-android-arm-eabi@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz#9f5b04503088e6a354295e8ea8fe3cb99e43af81" + integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw== -"@vitest/snapshot@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.1.tgz#90414451a634bb36cd539ccb29ae0d048a8c0479" - integrity sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ== - dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" +"@unrs/resolver-binding-android-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz#7414885431bd7178b989aedc4d25cccb3865bc9f" + integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g== -"@vitest/spy@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.1.tgz#33376be38a5ed1ecd829eb986edaecc3e798c95d" - integrity sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw== - dependencies: - tinyspy "^2.2.0" +"@unrs/resolver-binding-darwin-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz#b4a8556f42171fb9c9f7bac8235045e82aa0cbdf" + integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g== -"@vitest/ui@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-1.6.1.tgz#e94c42af392ddb47531b2401d8871bc246f1947e" - integrity sha512-xa57bCPGuzEFqGjPs3vVLyqareG8DX0uMkr5U/v5vLv5/ZUrBrPL7gzxzTJedEyZxFMfsozwTIbbYfEQVo3kgg== - dependencies: - "@vitest/utils" "1.6.1" - fast-glob "^3.3.2" - fflate "^0.8.1" - flatted "^3.2.9" - pathe "^1.1.1" - picocolors "^1.0.0" - sirv "^2.0.4" +"@unrs/resolver-binding-darwin-x64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz#fd4d81257b13f4d1a083890a6a17c00de571f0dc" + integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ== -"@vitest/utils@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.1.tgz#6d2f36cb6d866f2bbf59da854a324d6bf8040f17" - integrity sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g== - dependencies: - diff-sequences "^29.6.3" - estree-walker "^3.0.3" - loupe "^2.3.7" - pretty-format "^29.7.0" +"@unrs/resolver-binding-freebsd-x64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz#d2513084d0f37c407757e22f32bd924a78cfd99b" + integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw== -"@vue/babel-helper-vue-jsx-merge-props@^1.2.1", "@vue/babel-helper-vue-jsx-merge-props@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2" - integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA== +"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz#844d2605d057488d77fab09705f2866b86164e0a" + integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw== -"@vue/babel-helper-vue-transform-on@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz#b7e99d37eeb144d7b9757d7a1f40cd977fde748a" - integrity sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA== +"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz#204892995cefb6bd1d017d52d097193bc61ddad3" + integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw== -"@vue/babel-plugin-jsx@^1.0.3": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz#1b988b497cb1f79725da94463e75cebe60b72e70" - integrity sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.2" - "@vue/babel-helper-vue-transform-on" "1.5.0" - "@vue/babel-plugin-resolve-type" "1.5.0" - "@vue/shared" "^3.5.18" - -"@vue/babel-plugin-resolve-type@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz#6881d7b1478e9fc0ea4bb08aaad1f4d206655568" - integrity sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/parser" "^7.28.0" - "@vue/compiler-sfc" "^3.5.18" +"@unrs/resolver-binding-linux-arm64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz#023eb0c3aac46066a10be7a3f362e7b34f3bdf9d" + integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ== -"@vue/babel-plugin-transform-vue-jsx@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz#4d4b3d46a39ea62b7467dd6e26ce47f7ceafb2fe" - integrity sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - html-tags "^2.0.0" - lodash.kebabcase "^4.1.1" - svg-tags "^1.0.0" - -"@vue/babel-preset-app@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-5.0.9.tgz#5a604e4911f63bbd92f438f305eb93a052ae2c68" - integrity sha512-0rKOF4s/AhaRMJLybxOCgXfwtYhO3pwDSL/q/W8wRs1LzmHAc77FyTXWlun6VyKiSKwSdtH7CvOiWqq+DfofdA== - dependencies: - "@babel/core" "^7.12.16" - "@babel/helper-compilation-targets" "^7.12.16" - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-proposal-class-properties" "^7.12.13" - "@babel/plugin-proposal-decorators" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/plugin-transform-runtime" "^7.12.15" - "@babel/preset-env" "^7.12.16" - "@babel/runtime" "^7.12.13" - "@vue/babel-plugin-jsx" "^1.0.3" - "@vue/babel-preset-jsx" "^1.1.2" - babel-plugin-dynamic-import-node "^2.3.3" - core-js "^3.8.3" - core-js-compat "^3.8.3" - semver "^7.3.4" - -"@vue/babel-preset-jsx@^1.1.2", "@vue/babel-preset-jsx@^1.2.4": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz#f4914ba314235ab097bc4372ed67473c0780bfcc" - integrity sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA== - dependencies: - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - "@vue/babel-sugar-composition-api-inject-h" "^1.4.0" - "@vue/babel-sugar-composition-api-render-instance" "^1.4.0" - "@vue/babel-sugar-functional-vue" "^1.4.0" - "@vue/babel-sugar-inject-h" "^1.4.0" - "@vue/babel-sugar-v-model" "^1.4.0" - "@vue/babel-sugar-v-on" "^1.4.0" - -"@vue/babel-sugar-composition-api-inject-h@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz#187e1389f8871d89ece743bb50aed713be9d6c85" - integrity sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" +"@unrs/resolver-binding-linux-arm64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz#9e6f9abb06424e3140a60ac996139786f5d99be0" + integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w== -"@vue/babel-sugar-composition-api-render-instance@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz#2c1607ae6dffdab47e785bc01fa45ba756e992c1" - integrity sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" +"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz#b111417f17c9d1b02efbec8e08398f0c5527bb44" + integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA== -"@vue/babel-sugar-functional-vue@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz#60da31068567082287c7337c66ef4df04e0a1029" - integrity sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" +"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz#92ffbf02748af3e99873945c9a8a5ead01d508a9" + integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ== -"@vue/babel-sugar-inject-h@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz#bf39aa6631fb1d0399b1c49b4c59e1c8899b4363" - integrity sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA== +"@unrs/resolver-binding-linux-riscv64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz#0bec6f1258fc390e6b305e9ff44256cb207de165" + integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew== + +"@unrs/resolver-binding-linux-s390x-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz#577843a084c5952f5906770633ccfb89dac9bc94" + integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg== + +"@unrs/resolver-binding-linux-x64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz#36fb318eebdd690f6da32ac5e0499a76fa881935" + integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w== + +"@unrs/resolver-binding-linux-x64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz#bfb9af75f783f98f6a22c4244214efe4df1853d6" + integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA== + +"@unrs/resolver-binding-wasm32-wasi@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz#752c359dd875684b27429500d88226d7cc72f71d" + integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ== dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" + "@napi-rs/wasm-runtime" "^0.2.11" -"@vue/babel-sugar-v-model@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz#a51d986609f430c4f70ada3a93cc560a2970f720" - integrity sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ== +"@unrs/resolver-binding-win32-arm64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz#ce5735e600e4c2fbb409cd051b3b7da4a399af35" + integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw== + +"@unrs/resolver-binding-win32-ia32-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz#72fc57bc7c64ec5c3de0d64ee0d1810317bc60a6" + integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ== + +"@unrs/resolver-binding-win32-x64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777" + integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== + +"@vitejs/plugin-vue@^5.0.0": + version "5.2.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8" + integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA== + +"@vitest/expect@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.1.4.tgz#1507e51c53969723c99e8a7f054aa12cfa7c1a4d" + integrity sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww== dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - camelcase "^5.0.0" - html-tags "^2.0.0" - svg-tags "^1.0.0" + "@standard-schema/spec" "^1.1.0" + "@types/chai" "^5.2.2" + "@vitest/spy" "4.1.4" + "@vitest/utils" "4.1.4" + chai "^6.2.2" + tinyrainbow "^3.1.0" -"@vue/babel-sugar-v-on@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz#43b7106a9672d8cbeefc0eb8afe1d376edc6166e" - integrity sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - camelcase "^5.0.0" - -"@vue/cli-overlay@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-5.0.9.tgz#ada72d4832ba3f82dcf8afecc19ba3c4f2bb3c9b" - integrity sha512-aBdZWrYKxLuFz1FDsk/muFD7GycrsW73Gi11yRc7R2W7Bm8mDRc9HKAI790gdg4NV+chkDFmfkegjg5iMDEpAA== - -"@vue/cli-plugin-babel@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.9.tgz#ad6d52631687c7c34e843978a707ffa23a14d1b8" - integrity sha512-oDZt1Kfe4KGNtig3/3zFo2pIeDJij2uS0M6S+tAqQno4Zpla2D8Hk/AR5PrstUd/HmhHZYJoGyF78MOfj3SbWg== - dependencies: - "@babel/core" "^7.12.16" - "@vue/babel-preset-app" "^5.0.9" - "@vue/cli-shared-utils" "^5.0.9" - babel-loader "^8.2.2" - thread-loader "^3.0.0" - webpack "^5.54.0" - -"@vue/cli-plugin-eslint@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.9.tgz#011ae81be6f016a94002aa3b25d453c52f77c83e" - integrity sha512-OfAa85qhP0dKSprI8+9qjbXW8BzOlOvEtXwdrTrAKlD6aN8oa/u6k4vbfJGdYbpsbpkj8FXYdCRkTgNG8KZbxg== - dependencies: - "@vue/cli-shared-utils" "^5.0.9" - eslint-webpack-plugin "^3.1.0" - globby "^11.0.2" - webpack "^5.54.0" - yorkie "^2.0.0" - -"@vue/cli-plugin-pwa@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-5.0.9.tgz#7e1693878a85c14aa5e7913f8279ae661304139b" - integrity sha512-x8yavT2kvD8iyARc5eHMNrYfwWB4+cDtiwz2N2F/SHDMTfxdA2wcmqUHBB3oc1kn+hMbgvf8cDeQc211Uvb3xg== - dependencies: - "@vue/cli-shared-utils" "^5.0.9" - html-webpack-plugin "^5.1.0" - webpack "^5.54.0" - workbox-webpack-plugin "^6.1.0" - -"@vue/cli-plugin-router@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-5.0.9.tgz#8ca4210c549d78abff8f2431357fcf6c81f84a02" - integrity sha512-kopbO/8kIl5CAffwgptXEwV509i+M0FfwW4sSkgQ2RzpxOYBjQZvp+096mjZfFcWKSmryNP/ri/Mnu78vmhlhw== - dependencies: - "@vue/cli-shared-utils" "^5.0.9" - -"@vue/cli-plugin-typescript@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-typescript/-/cli-plugin-typescript-5.0.9.tgz#e9943588d4332dd2fc0850601018e88c5c3771f0" - integrity sha512-68S9rtpLMZLOIjQ9UaLSPupiJlE6ySO68kDVraIkqeQNi0qfcnVOlXTsDd4UnobKv+v+qHnt593+8bt3mjXiyA== - dependencies: - "@babel/core" "^7.12.16" - "@types/webpack-env" "^1.15.2" - "@vue/cli-shared-utils" "^5.0.9" - babel-loader "^8.2.2" - fork-ts-checker-webpack-plugin "^6.4.0" - globby "^11.0.2" - thread-loader "^3.0.0" - ts-loader "^9.2.5" - webpack "^5.54.0" - -"@vue/cli-plugin-vuex@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.9.tgz#29830a46f075c9bb35a00cd37e8c0d133a5c41a8" - integrity sha512-AQhgGNFVd4Pu2crvS0a+hRckgrJv07gzOASdbLd3I72wkT43dd01MLRp8IBRRsu92t3MXenW86AZUCbQBz3//A== - -"@vue/cli-service@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-5.0.9.tgz#e5ec465aca058299e9e2f092b6557b4464f2e539" - integrity sha512-yTX7GVyM19tEbd+y5/gA6MkVKA6K61nVYHYAivD61Hx6odVFmQsaC3/R3cWAHM1P5oVKCevBbumPljbT+tFG2w== - dependencies: - "@babel/helper-compilation-targets" "^7.12.16" - "@soda/friendly-errors-webpack-plugin" "^1.8.0" - "@soda/get-current-script" "^1.0.2" - "@types/minimist" "^1.2.0" - "@vue/cli-overlay" "^5.0.9" - "@vue/cli-plugin-router" "^5.0.9" - "@vue/cli-plugin-vuex" "^5.0.9" - "@vue/cli-shared-utils" "^5.0.9" - "@vue/component-compiler-utils" "^3.3.0" - "@vue/vue-loader-v15" "npm:vue-loader@^15.9.7" - "@vue/web-component-wrapper" "^1.3.0" - acorn "^8.0.5" - acorn-walk "^8.0.2" - address "^1.1.2" - autoprefixer "^10.2.4" - browserslist "^4.16.3" - case-sensitive-paths-webpack-plugin "^2.3.0" - cli-highlight "^2.1.10" - clipboardy "^2.3.0" - cliui "^7.0.4" - copy-webpack-plugin "^9.0.1" - css-loader "^6.5.0" - css-minimizer-webpack-plugin "^3.0.2" - cssnano "^5.0.0" - debug "^4.1.1" - default-gateway "^6.0.3" - dotenv "^10.0.0" - dotenv-expand "^5.1.0" - fs-extra "^9.1.0" - globby "^11.0.2" - hash-sum "^2.0.0" - html-webpack-plugin "^5.1.0" - is-file-esm "^1.0.0" - launch-editor-middleware "^2.2.1" - lodash.defaultsdeep "^4.6.1" - lodash.mapvalues "^4.6.0" - mini-css-extract-plugin "^2.5.3" - minimist "^1.2.5" - module-alias "^2.2.2" - portfinder "^1.0.26" - postcss "^8.2.6" - postcss-loader "^6.1.1" - progress-webpack-plugin "^1.0.12" - ssri "^8.0.1" - terser-webpack-plugin "^5.1.1" - thread-loader "^3.0.0" - vue-loader "^17.0.0" - vue-style-loader "^4.1.3" - webpack "^5.54.0" - webpack-bundle-analyzer "^4.4.0" - webpack-chain "^6.5.1" - webpack-dev-server "^4.7.3" - webpack-merge "^5.7.3" - webpack-virtual-modules "^0.4.2" - whatwg-fetch "^3.6.2" - -"@vue/cli-shared-utils@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.9.tgz#dbb62953e953757773e89e69f369559fced135cf" - integrity sha512-lf4KykiG8j9KwvNVi7fKtASmHuLsxCcCsflVU2b2CHMRuR4weOIV3zuuCrjWKjk0APn/MHJhgCjJGzHMbTtd5w== - dependencies: - "@achrinza/node-ipc" "^9.2.5" - chalk "^4.1.2" - execa "^1.0.0" - joi "^17.4.0" - launch-editor "^2.2.1" - lru-cache "^6.0.0" - node-fetch "^2.6.7" - open "^8.0.2" - ora "^5.3.0" - read-pkg "^5.1.1" - semver "^7.3.4" - strip-ansi "^6.0.0" +"@vitest/mocker@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.1.4.tgz#5d22e99d8dbacf2f77f7a4c30a6e17eece7f25ef" + integrity sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg== + dependencies: + "@vitest/spy" "4.1.4" + estree-walker "^3.0.3" + magic-string "^0.30.21" -"@vue/compiler-core@3.5.29": - version "3.5.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.29.tgz#3fb70630c62a2e715eeddc3c2a48f46aa4507adc" - integrity sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw== +"@vitest/pretty-format@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.1.4.tgz#0ee79cd2ef8321330dabb8cc57ba9bce237e7183" + integrity sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A== dependencies: - "@babel/parser" "^7.29.0" - "@vue/shared" "3.5.29" + tinyrainbow "^3.1.0" + +"@vitest/runner@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.1.4.tgz#8f884f265efabfdd8a5ee393cfe622a01ec849c2" + integrity sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ== + dependencies: + "@vitest/utils" "4.1.4" + pathe "^2.0.3" + +"@vitest/snapshot@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.1.4.tgz#600c04ee1c598d4e6ce219afae684ff21c3e187d" + integrity sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw== + dependencies: + "@vitest/pretty-format" "4.1.4" + "@vitest/utils" "4.1.4" + magic-string "^0.30.21" + pathe "^2.0.3" + +"@vitest/spy@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.1.4.tgz#b955fcef98bcc746e7fc61d17d4725b43b33fa6d" + integrity sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ== + +"@vitest/ui@^4.0.18": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-4.1.4.tgz#ebc7d59e2afcf066aa559887027091981aef59c0" + integrity sha512-EgFR7nlj5iTDYZYCvavjFokNYwr3c3ry0sFiCg+N7B233Nwp+NNx7eoF/XvMWDCKY71xXAG3kFkt97ZHBJVL8A== + dependencies: + "@vitest/utils" "4.1.4" + fflate "^0.8.2" + flatted "^3.4.2" + pathe "^2.0.3" + sirv "^3.0.2" + tinyglobby "^0.2.15" + tinyrainbow "^3.1.0" + +"@vitest/utils@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.1.4.tgz#9518fb0ad0903ae455e82e063fa18e7558aa6065" + integrity sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw== + dependencies: + "@vitest/pretty-format" "4.1.4" + convert-source-map "^2.0.0" + tinyrainbow "^3.1.0" + +"@volar/language-core@2.4.28": + version "2.4.28" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.28.tgz#c21f365a91c1dffe8bd7264fd491770c8d74fef3" + integrity sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ== + dependencies: + "@volar/source-map" "2.4.28" + +"@volar/source-map@2.4.28": + version "2.4.28" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.28.tgz#b40254e8c96199e5f1e0796777c593c617ad270e" + integrity sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ== + +"@volar/typescript@2.4.28": + version "2.4.28" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.28.tgz#83f86356e84eb101b8081a44c104f2f2ced8411f" + integrity sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw== + dependencies: + "@volar/language-core" "2.4.28" + path-browserify "^1.0.1" + vscode-uri "^3.0.8" + +"@vue/compiler-core@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.32.tgz#5115ca099b04fedd8f623f93b522d914c376cbeb" + integrity sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ== + dependencies: + "@babel/parser" "^7.29.2" + "@vue/shared" "3.5.32" entities "^7.0.1" estree-walker "^2.0.2" source-map-js "^1.2.1" -"@vue/compiler-dom@3.5.29": - version "3.5.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz#055cf5492005249591c7fb45868a874468e4ffb3" - integrity sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg== +"@vue/compiler-core@3.5.33": + version "3.5.33" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.33.tgz#69da5fdbeadb86d5a8511cf4b80e6116c21e00f6" + integrity sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw== dependencies: - "@vue/compiler-core" "3.5.29" - "@vue/shared" "3.5.29" + "@babel/parser" "^7.29.2" + "@vue/shared" "3.5.33" + entities "^7.0.1" + estree-walker "^2.0.2" + source-map-js "^1.2.1" -"@vue/compiler-sfc@2.7.16": - version "2.7.16" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz#ff81711a0fac9c68683d8bb00b63f857de77dc83" - integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg== +"@vue/compiler-dom@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz#6069eae2f0d1a38263e9445f3c1da1a06e5f6534" + integrity sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q== dependencies: - "@babel/parser" "^7.23.5" - postcss "^8.4.14" - source-map "^0.6.1" - optionalDependencies: - prettier "^1.18.2 || ^2.0.0" + "@vue/compiler-core" "3.5.32" + "@vue/shared" "3.5.32" -"@vue/compiler-sfc@^3.5.18": - version "3.5.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz#8b1b0707fb53c122fedd566244a564eaf40ee71f" - integrity sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA== +"@vue/compiler-dom@^3.5.0": + version "3.5.33" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz#20ec1f3b4d9c455cc90957e13767cd3ee16c9790" + integrity sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA== dependencies: - "@babel/parser" "^7.29.0" - "@vue/compiler-core" "3.5.29" - "@vue/compiler-dom" "3.5.29" - "@vue/compiler-ssr" "3.5.29" - "@vue/shared" "3.5.29" + "@vue/compiler-core" "3.5.33" + "@vue/shared" "3.5.33" + +"@vue/compiler-sfc@3.5.32", "@vue/compiler-sfc@^3.5.0": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz#1f4bef6d4fbfc0cb8278a08d08c05a3afddbd2c8" + integrity sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg== + dependencies: + "@babel/parser" "^7.29.2" + "@vue/compiler-core" "3.5.32" + "@vue/compiler-dom" "3.5.32" + "@vue/compiler-ssr" "3.5.32" + "@vue/shared" "3.5.32" estree-walker "^2.0.2" magic-string "^0.30.21" - postcss "^8.5.6" + postcss "^8.5.8" source-map-js "^1.2.1" -"@vue/compiler-ssr@3.5.29": - version "3.5.29" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz#83ac28c860271bd1c9822d135ac78c388403f949" - integrity sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw== +"@vue/compiler-ssr@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz#5632a0934cb58cf88dcff1404ecf06b5a16f6816" + integrity sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw== dependencies: - "@vue/compiler-dom" "3.5.29" - "@vue/shared" "3.5.29" + "@vue/compiler-dom" "3.5.32" + "@vue/shared" "3.5.32" -"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" - integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ== - dependencies: - consolidate "^0.15.1" - hash-sum "^1.0.2" - lru-cache "^4.1.2" - merge-source-map "^1.1.0" - postcss "^7.0.36" - postcss-selector-parser "^6.0.2" - source-map "~0.6.1" - vue-template-es2015-compiler "^1.9.0" - optionalDependencies: - prettier "^1.18.2 || ^2.0.0" +"@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.6.4": + version "6.6.4" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343" + integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g== -"@vue/eslint-config-standard@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@vue/eslint-config-standard/-/eslint-config-standard-4.0.0.tgz#6be447ee674e3b0f733c584098fd9a22e6d76fcd" - integrity sha512-bQghq1cw1BuMRHNhr3tRpAJx1tpGy0QtajQX873kLtA9YVuOIoXR7nAWnTN09bBHnSUh2N288vMsqPi2fI4Hzg== - dependencies: - eslint-config-standard "^12.0.0" - eslint-plugin-import "^2.14.0" - eslint-plugin-node "^8.0.0" - eslint-plugin-promise "^4.0.1" - eslint-plugin-standard "^4.0.0" - -"@vue/shared@3.5.29", "@vue/shared@^3.5.18": - version "3.5.29" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.29.tgz#0fe0d7637b05599d56ca58d83a77c637a1774110" - integrity sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg== - -"@vue/test-utils@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.3.6.tgz#6656bd8fa44dd088b4ad80ff1ee28abe7e5ddf87" - integrity sha512-udMmmF1ts3zwxUJEIAj5ziioR900reDrt6C9H3XpWPsLBx2lpHKoA4BTdd9HNIYbkGltWw+JjWJ+5O6QBwiyEw== - dependencies: - dom-event-types "^1.0.0" - lodash "^4.17.15" - pretty "^2.0.0" - -"@vue/vue-loader-v15@npm:vue-loader@^15.9.7": - version "15.11.1" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.11.1.tgz#dee91169211276ed43c5715caef88a56b1f497b0" - integrity sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q== - dependencies: - "@vue/component-compiler-utils" "^3.1.0" - hash-sum "^1.0.2" - loader-utils "^1.1.0" - vue-hot-reload-api "^2.3.0" - vue-style-loader "^4.1.0" - -"@vue/web-component-wrapper@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a" - integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA== - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@vue/language-core@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-3.2.7.tgz#06507ace715e0c22cf686ca2231f2a40f51befe2" + integrity sha512-Gn4q/tRxbpVGLEuARQ43p3YELlNAFgRUVCgW9U5Cr+5q4vfD2bWDWpl3ABbJMXUt5xlE1dF8dkigg2aUq7JYYw== + dependencies: + "@volar/language-core" "2.4.28" + "@vue/compiler-dom" "^3.5.0" + "@vue/shared" "^3.5.0" + alien-signals "^3.1.2" + muggle-string "^0.4.1" + path-browserify "^1.0.1" + picomatch "^4.0.4" + +"@vue/reactivity@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.32.tgz#a4cb973095eade1ae6d899ae60ba9019d2bd21f5" + integrity sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ== + dependencies: + "@vue/shared" "3.5.32" + +"@vue/runtime-core@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.32.tgz#7ab8bc83210886aa4db69e5d72f31188628fe9d4" + integrity sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ== + dependencies: + "@vue/reactivity" "3.5.32" + "@vue/shared" "3.5.32" + +"@vue/runtime-dom@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz#fe7815b25e55df34c6ae82a0d06be79d1342d7cf" + integrity sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ== + dependencies: + "@vue/reactivity" "3.5.32" + "@vue/runtime-core" "3.5.32" + "@vue/shared" "3.5.32" + csstype "^3.2.3" + +"@vue/server-renderer@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.32.tgz#74579f65d271e217bdef0df62474b3c8a8dba55b" + integrity sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ== + dependencies: + "@vue/compiler-ssr" "3.5.32" + "@vue/shared" "3.5.32" + +"@vue/shared@3.5.32": + version "3.5.32" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.32.tgz#dd8ba0d709bf3f758c324a81c8897bad5e1540cf" + integrity sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg== + +"@vue/shared@3.5.33", "@vue/shared@^3.5.0": + version "3.5.33" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.33.tgz#b41070039e91d2921edb4c38cbcc80f498a24f3a" + integrity sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ== + +"@vue/test-utils@^2.4.0": + version "2.4.6" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c" + integrity sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow== + dependencies: + js-beautify "^1.14.9" + vue-component-type-helpers "^2.0.0" abbrev@^2.0.0: version "2.0.0" @@ -2527,81 +2041,41 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -ace-builds@^1.31.1: - version "1.43.6" - resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.43.6.tgz#6feffd0283da5bbf45a2052470fe0fc3c442831a" - integrity sha512-L1ddibQ7F3vyXR2k2fg+I8TQTPWVA6CKeDQr/h2+8CeyTp3W6EQL8xNFZRTztuP8xNOAqL3IYPqdzs31GCjDvg== - -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - -acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.3.2: - version "8.3.5" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" - integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== - dependencies: - acorn "^8.11.0" - -acorn@^7.1.1, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.0.4, acorn@^8.0.5, acorn@^8.11.0, acorn@^8.15.0, acorn@^8.16.0: +acorn@^8.15.0, acorn@^8.16.0: version "8.16.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== -address@^1.1.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: +ajv-formats@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== dependencies: - fast-deep-equal "^3.1.3" + ajv "^8.0.0" -ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: - version "6.14.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" - integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== +ajv@^6.14.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.10.0, ajv@^8.6.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.10.0, ajv@^8.6.0, ajv@^8.6.1: version "8.18.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== @@ -2611,25 +2085,10 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.10.0, ajv@^8.6.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== +alien-signals@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-3.1.2.tgz#26e623e3ed81e401df1a7c503f726e2288a4fa02" + integrity sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw== ansi-regex@^5.0.1: version "5.0.1" @@ -2641,55 +2100,18 @@ ansi-regex@^6.2.2: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - ansi-styles@^6.1.0: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arch@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -2708,72 +2130,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" - integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.0" - es-object-atoms "^1.1.1" - get-intrinsic "^1.3.0" - is-string "^1.1.1" - math-intrinsics "^1.1.0" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.reduce@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz#42f97f5078daedca687d4463fd3c05cbfd83da57" - integrity sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-array-method-boxes-properly "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - is-string "^1.1.1" - arraybuffer.prototype.slice@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" @@ -2792,15 +2148,10 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== async-function@^1.0.0: version "1.0.0" @@ -2822,13 +2173,13 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.2.4: - version "10.4.27" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.27.tgz#51ea301a5c3c5f8642f8e564759c4f573be486f2" - integrity sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA== +autoprefixer@^10.4.27: + version "10.5.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.0.tgz#33d87e443430f020a0f85319d6ff1593cb291be9" + integrity sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong== dependencies: - browserslist "^4.28.1" - caniuse-lite "^1.0.30001774" + browserslist "^4.28.2" + caniuse-lite "^1.0.30001787" fraction.js "^5.3.4" picocolors "^1.1.1" postcss-value-parser "^4.2.0" @@ -2840,69 +2191,44 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -babel-loader@^8.2.2: - version "8.4.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675" - integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.4" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: - version "0.4.16" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz#a1321145f6cde738b0a412616b6bcf77f143ab36" - integrity sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw== +babel-plugin-polyfill-corejs2@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== dependencies: "@babel/compat-data" "^7.28.6" - "@babel/helper-define-polyfill-provider" "^0.6.7" + "@babel/helper-define-polyfill-provider" "^0.6.8" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" - integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" - core-js-compat "^3.43.0" - babel-plugin-polyfill-corejs3@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz#75fb533a1c23c0a976f189cba1d035199705b8ad" - integrity sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw== + version "0.14.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz#6ac08d2f312affb70c4c69c0fbba4cb417ee5587" + integrity sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.7" + "@babel/helper-define-polyfill-provider" "^0.6.8" core-js-compat "^3.48.0" -babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: - version "0.6.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz#eca723d67ef87b798881ad00546db1b6dd72e1ef" - integrity sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA== +babel-plugin-polyfill-regenerator@^0.6.6: + version "0.6.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.7" + "@babel/helper-define-polyfill-provider" "^0.6.8" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== -baseline-browser-mapping@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" - integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== +baseline-browser-mapping@^2.10.12: + version "2.10.19" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.19.tgz#7697721c22f94f66195d0c34299b1a91e3299493" + integrity sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g== basic-auth@^2.0.1: version "2.0.1" @@ -2911,35 +2237,6 @@ basic-auth@^2.0.1: dependencies: safe-buffer "5.1.2" -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@^3.1.1, bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - body-parser@~1.20.3: version "1.20.4" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" @@ -2958,98 +2255,54 @@ body-parser@~1.20.3: type-is "~1.6.18" unpipe "~1.0.0" -bonjour-service@^1.0.11: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" - integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== - dependencies: - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== +brace-expansion@^2.0.1, brace-expansion@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.0.tgz#4f41a41190216ee36067ec381526fe9539c4f0ae" + integrity sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w== dependencies: balanced-match "^1.0.0" - concat-map "0.0.1" -braces@^3.0.3, braces@~3.0.2: +brace-expansion@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== + dependencies: + balanced-match "^4.0.2" + +braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.16.3, browserslist@^4.21.4, browserslist@^4.24.0, browserslist@^4.28.1: - version "4.28.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" - integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== +browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.2: + version "4.28.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" + integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== dependencies: - baseline-browser-mapping "^2.9.0" - caniuse-lite "^1.0.30001759" - electron-to-chromium "^1.5.263" - node-releases "^2.0.27" - update-browserslist-db "^1.2.0" + baseline-browser-mapping "^2.10.12" + caniuse-lite "^1.0.30001782" + electron-to-chromium "^1.5.328" + node-releases "^2.0.36" + update-browserslist-db "^1.2.3" buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-modules@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -bytes@3.1.2, bytes@~3.1.2: +bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== @@ -3058,13 +2311,13 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- function-bind "^1.1.2" call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + version "1.0.9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" + integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + get-intrinsic "^1.3.0" set-function-length "^1.2.2" call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: @@ -3075,103 +2328,15 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001774: - version "1.0.30001777" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz#028f21e4b2718d138b55e692583e6810ccf60691" - integrity sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ== - -case-sensitive-paths-webpack-plugin@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== +caniuse-lite@^1.0.30001782, caniuse-lite@^1.0.30001787: + version "1.0.30001788" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz#31e97d1bfec332b3f2d7eea7781460c97629b3bf" + integrity sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ== -chai@^4.3.10: - version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" - integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.1.0" - -chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" +chai@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.2.tgz#ae41b52c9aca87734505362717f3255facda360e" + integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== chokidar@^4.0.0: version "4.0.3" @@ -3180,112 +2345,6 @@ chokidar@^4.0.0: dependencies: readdirp "^4.0.1" -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - -clean-css@^5.2.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" - integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-highlight@^2.1.10: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -clipboardy@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" - integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ== - dependencies: - arch "^2.1.1" - execa "^1.0.0" - is-wsl "^2.1.1" - -cliui@^7.0.2, cliui@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -3293,26 +2352,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.10: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3335,65 +2379,21 @@ commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +comment-parser@^1.4.1: + version "1.4.6" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.6.tgz#49a6b1d53fa563324f7577ab8c0b26db4e7d1f9a" + integrity sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg== common-tags@^1.8.0: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - component-emitter@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== -compressible@~2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" - integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== - dependencies: - bytes "3.1.2" - compressible "~2.0.18" - debug "2.6.9" - negotiator "~0.6.4" - on-headers "~1.1.0" - safe-buffer "5.2.1" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -condense-newlines@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" - integrity sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg== - dependencies: - extend-shallow "^2.0.1" - is-whitespace "^0.3.0" - kind-of "^3.0.2" - -confbox@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" - integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== - config-chain@^1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -3402,35 +2402,6 @@ config-chain@^1.1.13: ini "^1.3.4" proto-list "~1.2.1" -confusing-browser-globals@^1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consolidate@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" - integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== - dependencies: - bluebird "^3.1.1" - -consolidate@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" - integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== - dependencies: - bluebird "^3.7.2" - content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -3468,95 +2439,19 @@ cookiejar@^2.1.4: resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== -copy-webpack-plugin@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.0.tgz#7fd397af78e0d310dbf6575d1a0f2fe10efd4d59" - integrity sha512-p4eIA0ZWk4UI+xewyxOBTDCSDfjK6nCkr3zhDenoi7SFd+NgDNH/D14IZeFaCEFcK/psNDcAUMOB+sAxZ3SsAA== - dependencies: - cacache "^15.0.5" - fast-glob "^3.2.4" - find-cache-dir "^3.3.1" - glob-parent "^5.1.1" - globby "^11.0.1" - loader-utils "^2.0.0" - normalize-path "^3.0.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - webpack-sources "^1.4.3" - -copy-webpack-plugin@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz#2d2c460c4c4695ec0a58afb2801a1205256c4e6b" - integrity sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^11.0.3" - normalize-path "^3.0.0" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - -core-js-compat@^3.43.0, core-js-compat@^3.48.0, core-js-compat@^3.8.3: - version "3.48.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" - integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== +core-js-compat@^3.48.0: + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" + integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== dependencies: browserslist "^4.28.1" -core-js@^3.8.3: - version "3.48.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.48.0.tgz#1f813220a47bbf0e667e3885c36cd6f0593bf14d" - integrity sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" +crelt@^1.0.5, crelt@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" - integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: +cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -3575,85 +2470,34 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-declaration-sorter@^6.3.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" - integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== - -css-loader@^6.5.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" - integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.33" - postcss-modules-extract-imports "^3.1.0" - postcss-modules-local-by-default "^4.0.5" - postcss-modules-scope "^3.2.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.5.4" - -css-minimizer-webpack-plugin@^3.0.2: - version "3.4.1" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== - dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== +css-select@^5.1.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" + integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== dependencies: boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" nth-check "^2.0.1" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" + mdn-data "2.0.30" + source-map-js "^1.0.1" -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + mdn-data "2.0.28" + source-map-js "^1.0.1" -css-what@^6.0.1: +css-what@^6.1.0: version "6.2.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== @@ -3663,63 +2507,14 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.0, cssnano@^5.0.6: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.0.2, csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== dependencies: - css-tree "^1.1.2" + css-tree "~2.2.0" -csstype@^3.1.0: +csstype@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== @@ -3751,16 +2546,6 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== - -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3768,56 +2553,23 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7, debug@^4.4.3: +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" - integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== - deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -3827,12 +2579,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.2.1: +define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -3851,11 +2598,6 @@ depd@2.0.0, depd@~2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - destroy@1.2.0, destroy@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -3866,11 +2608,6 @@ detect-libc@^2.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -3879,126 +2616,42 @@ dezalgo@^1.0.4: asap "^2.0.0" wrappy "1" -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-packet@^5.2.2: - version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-event-types@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.1.0.tgz#120c1f92ddea7758db1ccee0a100a33c39f4701b" - integrity sha512-jNCX+uNJ3v38BKvPbpki6j5ItVlnSqVV6vDWGS6rExzCMjsc39frLjm1n91o6YaKK6AZl0wLloItW6C6mr61BQ== - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: - domelementtype "^2.2.0" + domelementtype "^2.3.0" dompurify@^3.0.8: - version "3.3.2" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.3.2.tgz#58c515d0f8508b8749452a028aa589ad80b36325" - integrity sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ== + version "3.4.0" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.0.tgz#b1fc33ebdadb373241621e0a30e4ad81573dfd0b" + integrity sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg== optionalDependencies: "@types/trusted-types" "^2.0.7" -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== +domutils@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" @@ -4009,20 +2662,10 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -easy-stack@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.1.tgz#8afe4264626988cabb11f3c704ccd0c835411066" - integrity sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w== + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== editorconfig@^1.0.4: version "1.0.7" @@ -4039,17 +2682,17 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.10, ejs@^3.1.6: +ejs@^3.1.6: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.263: - version "1.5.307" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz#09f8973100c39fb0d003b890393cd1d58932b1c8" - integrity sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg== +electron-to-chromium@^1.5.328: + version "1.5.340" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.340.tgz#fe3f76e8d9b9541c123fb7edbc3381688272f79a" + integrity sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA== emoji-regex@^8.0.0: version "8.0.0" @@ -4061,67 +2704,25 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -end-of-stream@^1.1.0: - version "1.4.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" - integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.20.0: - version "5.20.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" - integrity sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.3.0" - -enquirer@^2.3.5: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - -entities@^2.0.0, entities@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b" integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA== -error-ex@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" - integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.1.4" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" - integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== - dependencies: - stackframe "^1.3.4" - -es-abstract@^1.17.2, es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0: - version "1.24.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" - integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== +es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: + version "1.24.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.2.tgz#2dbd38c180735ee983f77585140a2706a963ed9a" + integrity sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg== dependencies: array-buffer-byte-length "^1.0.2" arraybuffer.prototype.slice "^1.0.4" @@ -4178,11 +2779,6 @@ es-abstract@^1.17.2, es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23 unbox-primitive "^1.1.0" which-typed-array "^1.1.19" -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" @@ -4215,13 +2811,6 @@ es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - es-to-primitive@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" @@ -4231,36 +2820,39 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== +esbuild@^0.25.0: + version "0.25.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.12.tgz#97a1d041f4ab00c2fce2f838d2b9969a2d2a97a5" + integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.1, escalade@^3.2.0: + "@esbuild/aix-ppc64" "0.25.12" + "@esbuild/android-arm" "0.25.12" + "@esbuild/android-arm64" "0.25.12" + "@esbuild/android-x64" "0.25.12" + "@esbuild/darwin-arm64" "0.25.12" + "@esbuild/darwin-x64" "0.25.12" + "@esbuild/freebsd-arm64" "0.25.12" + "@esbuild/freebsd-x64" "0.25.12" + "@esbuild/linux-arm" "0.25.12" + "@esbuild/linux-arm64" "0.25.12" + "@esbuild/linux-ia32" "0.25.12" + "@esbuild/linux-loong64" "0.25.12" + "@esbuild/linux-mips64el" "0.25.12" + "@esbuild/linux-ppc64" "0.25.12" + "@esbuild/linux-riscv64" "0.25.12" + "@esbuild/linux-s390x" "0.25.12" + "@esbuild/linux-x64" "0.25.12" + "@esbuild/netbsd-arm64" "0.25.12" + "@esbuild/netbsd-x64" "0.25.12" + "@esbuild/openbsd-arm64" "0.25.12" + "@esbuild/openbsd-x64" "0.25.12" + "@esbuild/openharmony-arm64" "0.25.12" + "@esbuild/sunos-x64" "0.25.12" + "@esbuild/win32-arm64" "0.25.12" + "@esbuild/win32-ia32" "0.25.12" + "@esbuild/win32-x64" "0.25.12" + +escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -4270,233 +2862,113 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-airbnb-base@^14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" - integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-airbnb@^18.0.1: - version "18.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" - integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== - dependencies: - eslint-config-airbnb-base "^14.2.1" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-standard@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" - integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" - integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998" - integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA== - dependencies: - eslint-utils "^1.4.2" - regexpp "^2.0.1" - -eslint-plugin-import@^2.14.0: - version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" - integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.9" - array.prototype.findlastindex "^1.2.6" - array.prototype.flat "^1.3.3" - array.prototype.flatmap "^1.3.3" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.1" - hasown "^2.0.2" - is-core-module "^2.16.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.1" - semver "^6.3.1" - string.prototype.trimend "^1.0.9" - tsconfig-paths "^3.15.0" - -eslint-plugin-node@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964" - integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w== +eslint-import-context@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe" + integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg== dependencies: - eslint-plugin-es "^1.3.1" - eslint-utils "^1.3.1" - ignore "^5.0.2" - minimatch "^3.0.4" - resolve "^1.8.1" - semver "^5.5.0" - -eslint-plugin-promise@^4.0.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" - integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== + get-tsconfig "^4.10.1" + stable-hash-x "^0.2.0" -eslint-plugin-standard@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== +eslint-plugin-import-x@^4.16.2: + version "4.16.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz#95d1f798795566712c87897317ef8433d101db29" + integrity sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw== + dependencies: + "@package-json/types" "^0.0.12" + "@typescript-eslint/types" "^8.56.0" + comment-parser "^1.4.1" + debug "^4.4.1" + eslint-import-context "^0.1.9" + is-glob "^4.0.3" + minimatch "^9.0.3 || ^10.1.2" + semver "^7.7.2" + stable-hash-x "^0.2.0" + unrs-resolver "^1.9.2" -eslint-plugin-vue@^7.9.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz#98c21885a6bfdf0713c3a92957a5afeaaeed9253" - integrity sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw== +eslint-plugin-vue@^10.9.0: + version "10.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-10.9.0.tgz#ed86013ef5ee704418cb26b245782293588c6541" + integrity sha512-EFNNzu4HqtTRb5DJINpyd+u3bDdzETWDMpCzG+UBHz1tpsnMDCeOcf61u4Wy/cbXnMymK+MT9bjH7KcG1fItSw== dependencies: - eslint-utils "^2.1.0" + "@eslint-community/eslint-utils" "^4.4.0" natural-compare "^1.4.0" - semver "^6.3.0" - vue-eslint-parser "^7.10.0" + nth-check "^2.1.1" + postcss-selector-parser "^7.1.0" + semver "^7.6.3" + xml-name-validator "^4.0.0" -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== +"eslint-scope@^8.2.0 || ^9.0.0", eslint-scope@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.2.tgz#b9de6ace2fab1cff24d2e58d85b74c8fcea39802" + integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== dependencies: + "@types/esrecurse" "^4.3.1" + "@types/estree" "^1.0.8" esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1, eslint-utils@^1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + estraverse "^5.2.0" -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-webpack-plugin@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" - integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== - dependencies: - "@types/eslint" "^7.29.0 || ^8.4.1" - jest-worker "^28.0.2" - micromatch "^4.0.5" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - -eslint@^7.32.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" +"eslint-visitor-keys@^4.2.0 || ^5.0.0", eslint-visitor-keys@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + +eslint@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.2.1.tgz#224b2a6caeb34473eddcf918762363e2e063222a" + integrity sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.2" + "@eslint/config-array" "^0.23.5" + "@eslint/config-helpers" "^0.5.5" + "@eslint/core" "^1.2.1" + "@eslint/plugin-kit" "^0.7.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.14.0" + cross-spawn "^7.0.6" + debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + eslint-scope "^9.1.2" + eslint-visitor-keys "^5.0.1" + espree "^11.2.0" + esquery "^1.7.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^10.2.4" natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + optionator "^0.9.3" + +"espree@^10.3.0 || ^11.0.0", espree@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" + integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== + dependencies: + acorn "^8.16.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^5.0.1" -esquery@^1.4.0: +esquery@^1.6.0, esquery@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== @@ -4510,11 +2982,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -4525,7 +2992,7 @@ estree-walker@^1.0.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== -estree-walker@^2.0.1, estree-walker@^2.0.2: +estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== @@ -4547,76 +3014,10 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -event-pubsub@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" - integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" +expect-type@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.3.0.tgz#0d58ed361877a31bbc4dd6cf71bbfef7faf6bd68" + integrity sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== express-basic-auth@^1.2.1: version "1.2.1" @@ -4625,7 +3026,7 @@ express-basic-auth@^1.2.1: dependencies: basic-auth "^2.0.1" -express@^4.17.3, express@^4.21.0: +express@^4.21.0: version "4.22.1" resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== @@ -4662,29 +3063,11 @@ express@^4.17.3, express@^4.21.0: utils-merge "1.0.1" vary "~1.1.2" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.4, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -4705,38 +3088,22 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== -fastq@^1.6.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" - integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" +fdir@^6.4.4, fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== -fflate@^0.8.1: +fflate@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" filelist@^1.0.4: version "1.0.6" @@ -4765,47 +3132,27 @@ finalhandler@~1.3.1: statuses "~2.0.2" unpipe "~1.0.0" -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - locate-path "^5.0.0" + locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + keyv "^4.5.4" -flatted@^3.2.9: +flatted@^3.2.9, flatted@^3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== -follow-redirects@^1.0.0: - version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== - for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" @@ -4813,7 +3160,7 @@ for-each@^0.3.3, for-each@^0.3.5: dependencies: is-callable "^1.2.7" -foreground-child@^3.1.0: +foreground-child@^3.1.0, foreground-child@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== @@ -4821,25 +3168,6 @@ foreground-child@^3.1.0: cross-spawn "^7.0.6" signal-exit "^4.0.1" -fork-ts-checker-webpack-plugin@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - form-data@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" @@ -4880,16 +3208,7 @@ fresh@~0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -4899,23 +3218,6 @@ fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-monkey@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.1.0.tgz#632aa15a20e71828ed56b24303363fb1414e5997" - integrity sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -4938,11 +3240,6 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: hasown "^2.0.2" is-callable "^1.2.7" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -4958,16 +3255,6 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" @@ -4997,28 +3284,6 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - get-symbol-description@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" @@ -5028,25 +3293,20 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" -glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== +get-tsconfig@^4.10.1: + version "4.14.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" + integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== dependencies: - is-glob "^4.0.1" + resolve-pkg-maps "^1.0.0" -glob-parent@^6.0.1: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@^10.4.2: version "10.5.0" resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" @@ -5059,24 +3319,22 @@ glob@^10.4.2: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@^11.0.1: + version "11.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.1.0.tgz#4f826576e4eb99c7dad383793d2f9f08f67e50a6" + integrity sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" + foreground-child "^3.3.1" + jackspeak "^4.1.1" + minimatch "^10.1.1" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" -globals@^13.6.0, globals@^13.9.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" +globals@^17.5.0: + version "17.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-17.5.0.tgz#a82c641d898f8dfbe0e81f66fdff7d0de43f88c6" + integrity sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g== globalthis@^1.0.4: version "1.0.4" @@ -5086,44 +3344,20 @@ globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.3: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - happy-dom@^20.8.9: - version "20.8.9" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-20.8.9.tgz#aeacc9ab9aacada379bce0ba37b2f02dabbba286" - integrity sha512-Tz23LR9T9jOGVZm2x1EPdXqwA37G/owYMxRwU0E4miurAtFsPMQ1d2Jc2okUaSjZqAFz2oEn3FLXC5a0a+siyA== + version "20.9.0" + resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-20.9.0.tgz#22fa4f2b8a34d2fbd0fb43eb48227e4bf8e206e8" + integrity sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ== dependencies: "@types/node" ">=20.0.0" "@types/whatwg-mimetype" "^3.0.2" @@ -5137,16 +3371,6 @@ has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" @@ -5161,7 +3385,7 @@ has-proto@^1.2.0: dependencies: dunder-proto "^1.0.0" -has-symbols@^1.0.1, has-symbols@^1.0.3, has-symbols@^1.1.0: +has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== @@ -5173,113 +3397,13 @@ has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" -hash-sum@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" - integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA== - -hash-sum@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" - integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== - hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.3.tgz#5e5c2b15b60370a4c7930c383dfb76bf17bc403c" + integrity sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg== dependencies: function-bind "^1.1.2" -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.6.0.tgz#7c64f1ea3b36818ccae3d3fb48b6974208e984f8" - integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== - -html-escaper@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" - integrity sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g== - -html-webpack-plugin@^5.1.0: - version "5.6.6" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz#5321b9579f4a1949318550ced99c2a4a4e60cbaf" - integrity sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@~1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - http-errors@~2.0.0, http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" @@ -5291,41 +3415,6 @@ http-errors@~2.0.0, http-errors@~2.0.1: statuses "~2.0.2" toidentifier "~1.0.1" -http-parser-js@>=0.5.1: - version "0.5.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" - integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== - -http-proxy-middleware@^2.0.3: - version "2.0.9" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef" - integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5333,73 +3422,27 @@ iconv-lite@~0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - idb@^7.0.1: version "7.1.1" resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.0.2, ignore@^5.2.0: +ignore@^5.2.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - -immutable@^5.0.2: +immutable@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.5.tgz#93ee4db5c2a9ab42a4a783069f3c5d8847d40165" integrity sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A== -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5418,21 +3461,11 @@ internal-slot@^1.1.0: hasown "^2.0.2" side-channel "^1.1.0" -ip@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.3.0.tgz#71dce70e1398122208996d1c22f2ba46a24b1abc" - integrity sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg== - is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" @@ -5442,11 +3475,6 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: call-bound "^1.0.3" get-intrinsic "^1.2.6" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - is-async-function@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" @@ -5465,13 +3493,6 @@ is-bigint@^1.1.0: dependencies: has-bigints "^1.0.2" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-boolean-object@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" @@ -5480,24 +3501,12 @@ is-boolean-object@^1.2.1: call-bound "^1.0.3" has-tostringtag "^1.0.2" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - -is-core-module@^2.13.0, is-core-module@^2.16.1: +is-core-module@^2.16.1: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== @@ -5521,28 +3530,11 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: call-bound "^1.0.2" has-tostringtag "^1.0.2" -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-file-esm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-file-esm/-/is-file-esm-1.0.0.tgz#987086b0f5a5318179e9d30f4f2f8d37321e1b5f" - integrity sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA== - dependencies: - read-pkg-up "^7.0.1" - is-finalizationregistry@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" @@ -5550,11 +3542,6 @@ is-finalizationregistry@^1.1.0: dependencies: call-bound "^1.0.3" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -5571,18 +3558,13 @@ is-generator-function@^1.0.10: has-tostringtag "^1.0.2" safe-regex-test "^1.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -5616,18 +3598,6 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-regex@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" @@ -5655,21 +3625,11 @@ is-shared-array-buffer@^1.0.4: dependencies: call-bound "^1.0.3" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-string@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" @@ -5694,11 +3654,6 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: dependencies: which-typed-array "^1.1.16" -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" @@ -5719,38 +3674,16 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" -is-whitespace@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" - integrity sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg== - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" @@ -5760,6 +3693,13 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^4.1.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.2.3.tgz#27ef80f33b93412037c3bea4f8eddf80e1931483" + integrity sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg== + dependencies: + "@isaacs/cliui" "^9.0.0" + jake@^10.8.5: version "10.9.4" resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.4.tgz#d626da108c63d5cfb00ab5c25fadc7e0084af8e6" @@ -5767,62 +3707,9 @@ jake@^10.8.5: dependencies: async "^3.2.6" filelist "^1.0.4" - picocolors "^1.1.1" - -javascript-natural-sort@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" - integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== - -javascript-stringify@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" - integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== - -jest-worker@^26.2.1: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^27.0.2, jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^28.0.2: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jmespath@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" - integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== - -joi@^17.4.0: - version "17.13.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" - integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== - dependencies: - "@hapi/hoek" "^9.3.0" - "@hapi/topo" "^5.1.0" - "@sideway/address" "^4.1.5" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" + picocolors "^1.1.1" -js-beautify@^1.6.12: +js-beautify@^1.14.9: version "1.15.4" resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.15.4.tgz#f579f977ed4c930cef73af8f98f3f0a608acd51e" integrity sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA== @@ -5838,34 +3725,11 @@ js-cookie@^3.0.5: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== -js-message@1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47" - integrity sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA== - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" - integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== - -js-yaml@^3.13.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" - integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" @@ -5883,21 +3747,6 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-loader@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -5908,48 +3757,16 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/json-source-map/-/json-source-map-0.6.1.tgz#e0b1f6f4ce13a9ad57e2ae165a24d06e62c79a0f" - integrity sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: +json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsoneditor@^9.5.3: - version "9.10.5" - resolved "https://registry.yarnpkg.com/jsoneditor/-/jsoneditor-9.10.5.tgz#9aeb3a1482850299826f8f292cec22b0f71d975c" - integrity sha512-fVZ0NMt+zm4rqTKBv2x7zPdLeaRyKo1EjJkaR1QjK4gEM1rMwICILYSW1OPxSc1qqyAoDaA/eeNrluKoxOocCA== - dependencies: - ace-builds "^1.31.1" - ajv "^6.12.6" - javascript-natural-sort "^0.7.1" - jmespath "^0.16.0" - json-source-map "^0.6.1" - jsonrepair "3.1.0" - mobius1-selectr "^2.4.13" - picomodal "^3.0.0" - vanilla-picker "^2.12.2" - jsonfile@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" @@ -5959,68 +3776,28 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonpointer@^5.0.0: +jsonpointer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -jsonrepair@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsonrepair/-/jsonrepair-3.1.0.tgz#02488882080930e6a37a7b080bc77546f2e12676" - integrity sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg== - jwt-decode@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== -keycloak-js@^20.0.3: - version "20.0.5" - resolved "https://registry.yarnpkg.com/keycloak-js/-/keycloak-js-20.0.5.tgz#8dd94d2c813170db5381dabfbe3a3327ce5ed6db" - integrity sha512-7+M5Uni4oNlAmbjM/lDJzFHu2+PGqU6/bvmTBuQssE1fJ7ZyNeCRHgFoaVfFpIU3m6aAFwPUko4lVcn4kPXP5Q== - dependencies: - base64-js "^1.5.1" - js-sha256 "^0.9.0" +keycloak-js@^26.0.0: + version "26.2.4" + resolved "https://registry.yarnpkg.com/keycloak-js/-/keycloak-js-26.2.4.tgz#b96ff33ed08ff6fd8d1e09d9e5055c7b3f2fa918" + integrity sha512-PnXpR3ubETGOt0B/Qt2lxmPbkZr5bc3vlQsOqDoTPPQsZRp7JjhTKxlJ187uWh8qJhvBab6Gsjb06a8ayOPfuw== -keyv@^4.5.3: +keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klona@^2.0.4, klona@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -launch-editor-middleware@^2.2.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.13.1.tgz#f0e2820588b1a4e8cab149a7e7dac72bc122b5c5" - integrity sha512-ZuzP8PJT7eKS4zZ/UWk0ciEOXlpqsHyDGSwQ6mwvszvjwT8/VUft+ISeR/BMvd2VkuaBispslpF5jaAEsD2wlQ== - dependencies: - launch-editor "^2.13.1" - -launch-editor@^2.13.1, launch-editor@^2.2.1, launch-editor@^2.6.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.13.1.tgz#d96ae376a282011661a112479a4bc2b8c1d914be" - integrity sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA== - dependencies: - picocolors "^1.1.1" - shell-quote "^1.8.3" - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -6034,162 +3811,37 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lie@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== - dependencies: - immediate "~3.0.5" - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-runner@^4.1.0, loader-runner@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" - integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== - -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0, loader-utils@^2.0.0, loader-utils@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -local-pkg@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" - integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== - dependencies: - mlly "^1.7.3" - pkg-types "^1.2.1" - -localforage@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" - integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== - dependencies: - lie "3.1.1" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: - p-locate "^4.1.0" + p-locate "^5.0.0" lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.defaultsdeep@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" - integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.mapvalues@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - integrity sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -loupe@^2.3.6, loupe@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" +lodash@^4.17.20, lodash@^4.17.21: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -lru-cache@^4.0.1, lru-cache@^4.1.2: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" +lru-cache@^11.0.0: + version "11.3.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.3.5.tgz#29047d348c0b2793e3112a01c739bb7c6d855637" + integrity sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw== lru-cache@^5.1.1: version "5.1.1" @@ -6198,13 +3850,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -6212,87 +3857,44 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.26.1: - version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - -magic-string@^0.30.21, magic-string@^0.30.5: +magic-string@^0.30.21: version "0.30.21" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.1.2, memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - merge-descriptors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8: +micromatch@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -6305,12 +3907,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -"mime-db@>= 1.43.0 < 2": - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34, mime-types@~2.1.35: +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -6327,124 +3924,32 @@ mime@2.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mini-css-extract-plugin@^2.5.3: - version "2.10.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz#d801a1f388f8fac7333c01b7c15c9222c811def4" - integrity sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g== - dependencies: - schema-utils "^4.0.0" - tapable "^2.2.1" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^5.0.1, minimatch@^9.0.1, minimatch@^9.0.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" - integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== +minimatch@^10.1.1, minimatch@^10.2.4, "minimatch@^9.0.3 || ^10.1.2": + version "10.2.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== dependencies: - minipass "^3.0.0" + brace-expansion "^5.0.5" -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== +minimatch@^5.0.1: + version "5.1.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.9.tgz#1293ef15db0098b394540e8f9f744f9fda8dee4b" + integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== dependencies: - minipass "^3.0.0" + brace-expansion "^2.0.1" -minipass@^3.0.0, minipass@^3.1.1: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== +minimatch@^9.0.1, minimatch@^9.0.4: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + brace-expansion "^2.0.2" "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mlly@^1.7.3, mlly@^1.7.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.1.tgz#2ed89f4fbbbde26db9fcc86df5bfa3153cfacea1" - integrity sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ== - dependencies: - acorn "^8.16.0" - pathe "^2.0.3" - pkg-types "^1.3.1" - ufo "^1.6.3" - -mobius1-selectr@^2.4.13: - version "2.4.13" - resolved "https://registry.yarnpkg.com/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz#0019dfd9f984840d6e40f70683ab3ec78ce3b5df" - integrity sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw== - -module-alias@^2.2.2: - version "2.3.4" - resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.3.4.tgz#7c2b0442ba1114744e97288963db637859db4094" - integrity sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w== - mrmime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" @@ -6455,33 +3960,26 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: +ms@2.1.3, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" +muggle-string@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" + integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +napi-postinstall@^0.3.0: + version "0.3.4" + resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6492,50 +3990,15 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - node-addon-api@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1, node-forge@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" - integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== - -node-releases@^2.0.27: - version "2.0.36" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" - integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== +node-releases@^2.0.36: + version "2.0.37" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.37.tgz#9bd4f10b77ba39c2b9402d4e8399c482a797f671" + integrity sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg== nopt@^7.2.1: version "7.2.1" @@ -6544,79 +4007,13 @@ nopt@^7.2.1: dependencies: abbrev "^2.0.0" -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" - integrity sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-all@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" - integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== - dependencies: - ansi-styles "^3.2.1" - chalk "^2.4.1" - cross-spawn "^6.0.5" - memorystream "^0.3.1" - minimatch "^3.0.4" - pidtree "^0.3.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -nth-check@^1.0.2, nth-check@^2.0.1, nth-check@^2.1.1: +nth-check@^2.0.1, nth-check@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" @@ -6627,7 +4024,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.7: +object.assign@^4.1.7: version "4.1.7" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== @@ -6639,67 +4036,15 @@ object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.7: has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.2: - version "1.1.9" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" - integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.9" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz#bf9e7520f14d50de88dee2b9c9eca841166322dc" - integrity sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g== - dependencies: - array.prototype.reduce "^1.0.8" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.24.0" - es-object-atoms "^1.1.1" - gopd "^1.2.0" - safe-array-concat "^1.1.3" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.0, object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +obug@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" + integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== oidc-client-ts@^3.0.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/oidc-client-ts/-/oidc-client-ts-3.4.1.tgz#7cad95ba7213cb93b7c141965ce03ad658baa30f" - integrity sha512-jNdst/U28Iasukx/L5MP6b274Vr7ftQs6qAhPBCvz6Wt5rPCA+Q/tUmCzfCHHWweWw5szeMy2Gfrm1rITwUKrw== + version "3.5.0" + resolved "https://registry.yarnpkg.com/oidc-client-ts/-/oidc-client-ts-3.5.0.tgz#222c145d35e8d654ea4e1dee71cc5dde5e1c91a2" + integrity sha512-l2q8l9CTCTOlbX+AnK4p3M+4CEpKpyQhle6blQkdFhm0IsBqsxm15bYaSa11G7pWdsYr6epdsRZxJpCyCRbT8A== dependencies: jwt-decode "^4.0.0" @@ -6710,54 +4055,14 @@ on-finished@~2.4.1: dependencies: ee-first "1.1.1" -on-headers@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" - integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^8.0.2, open@^8.0.9: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.9.1: +optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== @@ -6769,21 +4074,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.5" -ora@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - own-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" @@ -6793,18 +4083,6 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -6812,132 +4090,37 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-limit@^5.0.0: +p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + p-limit "^3.0.2" package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" @@ -6952,330 +4135,45 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-scurry@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + path-to-regexp@~0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathe@^2.0.1, pathe@^2.0.3: +pathe@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: +picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== -picomatch@^4.0.3: +picomatch@^4.0.2, picomatch@^4.0.3, picomatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== -picomodal@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/picomodal/-/picomodal-3.0.0.tgz#facd30f4fbf34a809c1e04ea525f004f399c0b82" - integrity sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw== - -pidtree@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" - integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-types@^1.2.1, pkg-types@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" - integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== - dependencies: - confbox "^0.1.8" - mlly "^1.7.4" - pathe "^2.0.1" - -popper.js@^1.16.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -portfinder@^1.0.26: - version "1.0.38" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.38.tgz#e4fb3a2d888b20d2977da050e48ab5e1f57a185e" - integrity sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg== - dependencies: - async "^3.2.6" - debug "^4.3.6" - possible-typed-array-names@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-loader@^6.1.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" - integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== - -postcss-modules-local-by-default@^4.0.5: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" - integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^7.0.0" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" - integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== - dependencies: - postcss-selector-parser "^7.0.0" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^7.0.0: +postcss-selector-parser@^7.1.0: version "7.1.1" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz#e75d2e0d843f620e5df69076166f4e16f891cb9f" integrity sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== @@ -7283,30 +4181,15 @@ postcss-selector-parser@^7.0.0: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.36, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.43, postcss@^8.5.6: - version "8.5.8" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" - integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== +postcss@^8.4.31, postcss@^8.5.3, postcss@^8.5.8: + version "8.5.10" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.10.tgz#8992d8c30acf3f12169e7c09514a12fed7e48356" + integrity sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ== dependencies: nanoid "^3.3.11" picocolors "^1.1.1" @@ -7317,65 +4200,15 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -"prettier@^1.18.2 || ^2.0.0", prettier@^2.6.2: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: +pretty-bytes@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" - integrity sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w== - dependencies: - condense-newlines "^0.2.1" - extend-shallow "^2.0.1" - js-beautify "^1.6.12" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress-webpack-plugin@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz#278f5c1afd21af783aad72c5ec95241520230fe5" - integrity sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA== - dependencies: - chalk "^2.1.0" - figures "^2.0.0" - log-update "^2.3.0" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== +pretty-bytes@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz#38cd6bb46f47afbf667c202cfc754bffd2016a3b" + integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ== proto-list@~1.2.1: version "1.2.4" @@ -7390,29 +4223,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -pump@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" - integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - qs@^6.14.1: version "6.15.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.1.tgz#bdb55aed06bfac257a90c44a446a73fba5575c8f" @@ -7427,24 +4242,7 @@ qs@~6.14.0: dependencies: side-channel "^1.1.0" -querystring@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -7459,73 +4257,11 @@ raw-body@~2.5.3: iconv-lite "~0.4.24" unpipe "~1.0.0" -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.1.1, read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" @@ -7564,16 +4300,6 @@ regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: gopd "^1.2.0" set-function-name "^2.0.2" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - regexpu-core@^6.3.1: version "6.4.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" @@ -7586,182 +4312,84 @@ regexpu-core@^6.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.2.1" -register-service-worker@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/register-service-worker/-/register-service-worker-1.7.2.tgz#6516983e1ef790a98c4225af1216bc80941a4bd2" - integrity sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A== - regjsgen@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== regjsparser@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.0.tgz#01f8351335cf7898d43686bc74d2dd71c847ecc0" - integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== + version "0.13.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.1.tgz#0593cbacb27527927692030928ae4d3b878d6f8d" + integrity sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw== dependencies: jsesc "~3.1.0" -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remedial@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" - integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -requires-port@^1.0.0: +resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.10.0, resolve@^1.19.0, resolve@^1.22.11, resolve@^1.22.4, resolve@^1.8.1: - version "1.22.11" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" - integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== +resolve@^1.22.1, resolve@^1.22.11: + version "1.22.12" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" + integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== dependencies: + es-errors "^1.3.0" is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-terser@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" - integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== - dependencies: - "@babel/code-frame" "^7.10.4" - jest-worker "^26.2.1" - serialize-javascript "^4.0.0" - terser "^5.0.0" - -rollup@^2.43.1, rollup@^2.70.2: +rollup@^2.79.2: version "2.80.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.80.0.tgz#a82efc15b748e986a7c76f0f771221b1fa108a2c" integrity sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ== optionalDependencies: fsevents "~2.3.2" -rollup@^4.20.0: - version "4.59.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.59.0.tgz#cf74edac17c1486f562d728a4d923a694abdf06f" - integrity sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg== +rollup@^4.34.9: + version "4.60.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.60.1.tgz#b4aa2bcb3a5e1437b5fad40d43fe42d4bde7a42d" + integrity sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w== dependencies: "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.59.0" - "@rollup/rollup-android-arm64" "4.59.0" - "@rollup/rollup-darwin-arm64" "4.59.0" - "@rollup/rollup-darwin-x64" "4.59.0" - "@rollup/rollup-freebsd-arm64" "4.59.0" - "@rollup/rollup-freebsd-x64" "4.59.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.59.0" - "@rollup/rollup-linux-arm-musleabihf" "4.59.0" - "@rollup/rollup-linux-arm64-gnu" "4.59.0" - "@rollup/rollup-linux-arm64-musl" "4.59.0" - "@rollup/rollup-linux-loong64-gnu" "4.59.0" - "@rollup/rollup-linux-loong64-musl" "4.59.0" - "@rollup/rollup-linux-ppc64-gnu" "4.59.0" - "@rollup/rollup-linux-ppc64-musl" "4.59.0" - "@rollup/rollup-linux-riscv64-gnu" "4.59.0" - "@rollup/rollup-linux-riscv64-musl" "4.59.0" - "@rollup/rollup-linux-s390x-gnu" "4.59.0" - "@rollup/rollup-linux-x64-gnu" "4.59.0" - "@rollup/rollup-linux-x64-musl" "4.59.0" - "@rollup/rollup-openbsd-x64" "4.59.0" - "@rollup/rollup-openharmony-arm64" "4.59.0" - "@rollup/rollup-win32-arm64-msvc" "4.59.0" - "@rollup/rollup-win32-ia32-msvc" "4.59.0" - "@rollup/rollup-win32-x64-gnu" "4.59.0" - "@rollup/rollup-win32-x64-msvc" "4.59.0" + "@rollup/rollup-android-arm-eabi" "4.60.1" + "@rollup/rollup-android-arm64" "4.60.1" + "@rollup/rollup-darwin-arm64" "4.60.1" + "@rollup/rollup-darwin-x64" "4.60.1" + "@rollup/rollup-freebsd-arm64" "4.60.1" + "@rollup/rollup-freebsd-x64" "4.60.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.60.1" + "@rollup/rollup-linux-arm-musleabihf" "4.60.1" + "@rollup/rollup-linux-arm64-gnu" "4.60.1" + "@rollup/rollup-linux-arm64-musl" "4.60.1" + "@rollup/rollup-linux-loong64-gnu" "4.60.1" + "@rollup/rollup-linux-loong64-musl" "4.60.1" + "@rollup/rollup-linux-ppc64-gnu" "4.60.1" + "@rollup/rollup-linux-ppc64-musl" "4.60.1" + "@rollup/rollup-linux-riscv64-gnu" "4.60.1" + "@rollup/rollup-linux-riscv64-musl" "4.60.1" + "@rollup/rollup-linux-s390x-gnu" "4.60.1" + "@rollup/rollup-linux-x64-gnu" "4.60.1" + "@rollup/rollup-linux-x64-musl" "4.60.1" + "@rollup/rollup-openbsd-x64" "4.60.1" + "@rollup/rollup-openharmony-arm64" "4.60.1" + "@rollup/rollup-win32-arm64-msvc" "4.60.1" + "@rollup/rollup-win32-ia32-msvc" "4.60.1" + "@rollup/rollup-win32-x64-gnu" "4.60.1" + "@rollup/rollup-win32-x64-msvc" "4.60.1" fsevents "~2.3.2" -rss-parser@3.13.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/rss-parser/-/rss-parser-3.13.0.tgz#f1f83b0a85166b8310ec531da6fbaa53ff0f50f0" - integrity sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w== - dependencies: - entities "^2.0.3" - xml2js "^0.5.0" - rsup-progress@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/rsup-progress/-/rsup-progress-3.2.0.tgz#f9f3fa3158b8ced9dace14f33f4e9157717b5837" integrity sha512-icnpDOj4bYrpCJ4cZYWf/jNqfyKwSKh8ULCZ1TWpGFZ3Y3b7SlhFhLz2CIGakcf+RPQ/UGB9WirH5E0mOX9+zg== -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - safe-array-concat@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" @@ -7773,12 +4401,12 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7805,96 +4433,28 @@ safe-regex-test@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-loader@^12.0.0: - version "12.6.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - sass@^1.77.0: - version "1.97.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.97.3.tgz#9cb59339514fa7e2aec592b9700953ac6e331ab2" - integrity sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg== + version "1.99.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.99.0.tgz#ff9d1594da4886249dfaafabbeea2dea2dc74b26" + integrity sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q== dependencies: chokidar "^4.0.0" - immutable "^5.0.2" + immutable "^5.1.5" source-map-js ">=0.6.2 <2.0.0" optionalDependencies: "@parcel/watcher" "^2.4.1" -sax@>=0.6.0, sax@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.5.0.tgz#b5549b671069b7aa392df55ec7574cf411179eb8" - integrity sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA== - -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0, schema-utils@^4.3.0, schema-utils@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" - integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== +sax@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" + integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: +semver@^7.5.3, semver@^7.6.3, semver@^7.7.2: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== @@ -7918,25 +4478,10 @@ send@~0.19.0, send@~0.19.1: range-parser "~1.2.1" statuses "~2.0.2" -serialize-javascript@^4.0.0, serialize-javascript@^5.0.1, serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.2.tgz#2988e3612106d78a5e4849ddff552ce7bd3d9bcb" - integrity sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ== - dependencies: - accepts "~1.3.8" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.8.0" - mime-types "~2.1.35" - parseurl "~1.3.3" +serialize-javascript@^6.0.1, serialize-javascript@^7.0.3: + version "7.0.5" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz#c798cc0552ffbb08981914a42a8756e339d0d5b1" + integrity sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw== serve-static@~1.16.2: version "1.16.3" @@ -7984,20 +4529,6 @@ setprototypeof@1.2.0, setprototypeof@~1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -8005,28 +4536,18 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1, shell-quote@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" - integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== - side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== dependencies: es-errors "^1.3.0" - object-inspect "^1.13.3" + object-inspect "^1.13.4" side-channel-map@^1.0.1: version "1.0.1" @@ -8065,59 +4586,31 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-icons@^16.6.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/simple-icons/-/simple-icons-16.12.0.tgz#17248ac058f4df3a185f975523ebfbe43eecb88d" - integrity sha512-fDJDqXUpkb2twqH+eBQpJsCYUE6jEH7VkuuPL9dH16sbLf6KKnwyijULmcx7SCoy3c2L6pl8WCzt+4rpYjoWfw== - -sirv@^2.0.3, sirv@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" - integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== - dependencies: - "@polka/url" "^1.0.0-next.24" - mrmime "^2.0.0" - totalist "^3.0.0" + version "16.16.0" + resolved "https://registry.yarnpkg.com/simple-icons/-/simple-icons-16.16.0.tgz#08f8f84051b1378cba6ea385d13f8efc5d93b1b1" + integrity sha512-H+Z29a0TrCw6mrG42V2aqHQaKdJCT87x5aojLlPiIXOf1lpMqnKFAR/jP5xkI5hLrVTCBWs33e9sOtyNWqCx1A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== +sirv@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.2.tgz#f775fccf10e22a40832684848d636346f41cd970" + integrity sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g== dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +smob@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.6.1.tgz#930607366738545aee542a93e03e47b54e0303e0" + integrity sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -8130,16 +4623,11 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3, source-map@^0.7.4: - version "0.7.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" - integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== - source-map@^0.8.0-beta.0: version "0.8.0-beta.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" @@ -8152,96 +4640,25 @@ sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.23" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz#b069e687b1291a32f126893ed76a27a745ee2133" - integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stable-hash-x@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" + integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ== stackback@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -stackframe@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" - integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@~2.0.1, statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== -std-env@^3.5.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" - integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== +std-env@^4.0.0-rc.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-4.1.0.tgz#45899abc590d86d682e87f0acd1033a75084cd3f" + integrity sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ== stop-iteration-iterator@^1.1.0: version "1.1.0" @@ -8260,15 +4677,7 @@ stop-iteration-iterator@^1.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8305,16 +4714,6 @@ string.prototype.matchall@^4.0.6: set-function-name "^2.0.2" side-channel "^1.1.0" -string.prototype.padend@^3.0.0: - version "3.1.6" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz#ba79cf8992609a91c872daa47c6bb144ee7f62a5" - integrity sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - string.prototype.trim@^1.2.10: version "1.2.10" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" @@ -8347,20 +4746,6 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -8377,13 +4762,6 @@ stringify-object@^3.3.0: dependencies: ansi-regex "^5.0.1" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -8398,55 +4776,15 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.2.2" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - strip-comments@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-literal@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" - integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== - dependencies: - js-tokens "^9.0.1" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" +style-mod@^4.0.0, style-mod@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.3.tgz#6e9012255bb799bdac37e288f7671b5d71bf9f73" + integrity sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ== superagent@^10.3.0: version "10.3.0" @@ -8472,108 +4810,23 @@ supertest@^7.2.2: methods "^1.1.2" superagent "^10.3.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== - -svg-to-vue@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/svg-to-vue/-/svg-to-vue-0.7.0.tgz#ec86deb1742be38319462e36703af1dfa2f9fad9" - integrity sha512-Tg2nMmf3BQorYCAjxbtTkYyWPVSeox5AZUFvfy4MoWK/5tuQlnA/h3LAlTjV3sEvOC5FtUNovRSj3p784l4KOA== - dependencies: - svgo "^1.3.2" - -svgo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -svgo@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.2.tgz#8e99b7ba5ac9ed7e3a446063865f61e03223fe6b" - integrity sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA== +svgo@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.3.tgz#8246aee0b08791fde3b0ed22b5661b471fadf58e" + integrity sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng== dependencies: commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" picocolors "^1.0.0" sax "^1.5.0" - stable "^0.1.8" - -table@^6.0.9: - version "6.9.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" - integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.2.1, tapable@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" - integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== - -tar@^6.0.2, tar@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" temp-dir@^2.0.0: version "2.0.0" @@ -8590,75 +4843,38 @@ tempy@^0.6.0: type-fest "^0.16.0" unique-string "^2.0.0" -terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.3.17: - version "5.3.17" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz#75ea98876297fbb190d2fbb395e982582b859a67" - integrity sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - terser "^5.31.1" - -terser@^5.0.0, terser@^5.10.0, terser@^5.31.1: - version "5.46.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.0.tgz#1b81e560d584bbdd74a8ede87b4d9477b0ff9695" - integrity sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg== +terser@^5.17.4: + version "5.46.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.1.tgz#40e4b1e35d5f13130f82793a8b3eeb7ec3a92eee" + integrity sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -thread-loader@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-3.0.4.tgz#c392e4c0241fbc80430eb680e4886819b504a31b" - integrity sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA== - dependencies: - json-parse-better-errors "^1.0.2" - loader-runner "^4.1.0" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tinybench@^2.5.1: +tinybench@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== -tinypool@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" - integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== +tinyexec@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.1.1.tgz#e1ff45dfa60d1dedb91b734956b78f6c2a3e821b" + integrity sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg== -tinyspy@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" - integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== +tinyglobby@^0.2.10, tinyglobby@^0.2.13, tinyglobby@^0.2.15: + version "0.2.16" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + +tinyrainbow@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.1.0.tgz#1d8a623893f95cf0a2ddb9e5d11150e191409421" + integrity sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw== to-regex-range@^5.0.1: version "5.0.1" @@ -8667,7 +4883,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.1, toidentifier@~1.0.1: +toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== @@ -8684,33 +4900,7 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-loader@^9.2.5: - version "9.5.4" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.4.tgz#44b571165c10fb5a90744aa5b7e119233c4f4585" - integrity sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - source-map "^0.7.4" - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.0.3: +tslib@^2.4.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -8722,31 +4912,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - type-fest@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -8800,15 +4970,10 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" -typescript@^5.4.4: - version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== - -ufo@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.3.tgz#799666e4e88c122a9659805e30b9dc071c3aed4f" - integrity sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q== +typescript@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" + integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== unbox-primitive@^1.1.0: version "1.1.0" @@ -8820,10 +4985,10 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -undici-types@~7.18.0: - version "7.18.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" - integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== +undici-types@~7.19.0: + version "7.19.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.19.2.tgz#1b67fc26d0f157a0cba3a58a5b5c1e2276b8ba2a" + integrity sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -8848,20 +5013,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -8879,17 +5030,39 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== +unrs-resolver@^1.9.2: + version "1.11.1" + resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9" + integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== + dependencies: + napi-postinstall "^0.3.0" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.11.1" + "@unrs/resolver-binding-android-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-x64" "1.11.1" + "@unrs/resolver-binding-freebsd-x64" "1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-musl" "1.11.1" + "@unrs/resolver-binding-wasm32-wasi" "1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" + "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.2.0: +update-browserslist-db@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== @@ -8904,503 +5077,164 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v-jsoneditor@^1.4.5: - version "1.4.5" - resolved "https://registry.yarnpkg.com/v-jsoneditor/-/v-jsoneditor-1.4.5.tgz#e6164c17a9f7c36fb591d907c0c32f4375409fae" - integrity sha512-xrfCsvu/BC1UV/phzqWOjBqxEOPg8hWg3sntQYihmJUs4fdJjSXI6nGBatvntO9nrqSGLlKsS6RGV+FbhZsERg== - dependencies: - jsoneditor "^9.5.3" - -v-tooltip@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/v-tooltip/-/v-tooltip-2.1.3.tgz#281c2015d1e73787f13c8956aa295b8c3a73f261" - integrity sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w== - dependencies: - "@babel/runtime" "^7.13.10" - lodash "^4.17.21" - popper.js "^1.16.1" - vue-resize "^1.0.1" - -v8-compile-cache@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" - integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vanilla-picker@^2.12.2: - version "2.12.3" - resolved "https://registry.yarnpkg.com/vanilla-picker/-/vanilla-picker-2.12.3.tgz#1cc47b641a2b9c9afc5ac3a9a02febace0f1b17a" - integrity sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ== - dependencies: - "@sphinxxxx/color-conversion" "^2.2.2" - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite-node@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.1.tgz#fff3ef309296ea03ceaa6ca4bb660922f5416c57" - integrity sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA== +vite-plugin-pwa@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-1.2.0.tgz#3c7de17d4eed662f273095a0ac52f7a98d0cde36" + integrity sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw== dependencies: - cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^5.0.0" + debug "^4.3.6" + pretty-bytes "^6.1.1" + tinyglobby "^0.2.10" + workbox-build "^7.4.0" + workbox-window "^7.4.0" -vite-plugin-vue2@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/vite-plugin-vue2/-/vite-plugin-vue2-2.0.3.tgz#19aab2720e13a969b9d9272f85e899c671930ef2" - integrity sha512-t3Tu93GWsMHbpeIv66MTO5e/rRAo8/+/eWoUtFYuAdKDMyEnn1dqsrXh+CfG+SJAlxJvcTP8U0eXkzhLjKNyMg== - dependencies: - "@babel/core" "^7.17.9" - "@babel/parser" "^7.17.9" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-decorators" "^7.17.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.17.3" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.17.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.16.8" - "@rollup/pluginutils" "^4.2.1" - "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" - "@vue/babel-preset-jsx" "^1.2.4" - "@vue/component-compiler-utils" "^3.3.0" - consolidate "^0.16.0" +vite-svg-loader@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/vite-svg-loader/-/vite-svg-loader-5.1.1.tgz#27cbd5e092cc2b2b17ba574cfb2ecf72389e2a3c" + integrity sha512-RPzcXA/EpKJA0585x58DBgs7my2VfeJ+j2j1EoHY4Zh82Y7hV4cR1fElgy2aZi85+QSrcLLoTStQ5uZjD68u+Q== + dependencies: debug "^4.3.4" - fs-extra "^10.1.0" - hash-sum "^2.0.0" - magic-string "^0.26.1" - prettier "^2.6.2" - querystring "^0.2.1" - rollup "^2.70.2" - slash "^3.0.0" - source-map "^0.7.3" - vue-template-babel-compiler "^1.2.0" - -vite@^5.0.0: - version "5.4.21" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" - integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" + svgo "^3.3.3" + +"vite@^6.0.0 || ^7.0.0 || ^8.0.0", vite@^6.2.0: + version "6.4.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.4.2.tgz#a4e548ca3a90ca9f3724582cab35e1ba15efc6f2" + integrity sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ== + dependencies: + esbuild "^0.25.0" + fdir "^6.4.4" + picomatch "^4.0.2" + postcss "^8.5.3" + rollup "^4.34.9" + tinyglobby "^0.2.13" optionalDependencies: fsevents "~2.3.3" -vitest@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.1.tgz#b4a3097adf8f79ac18bc2e2e0024c534a7a78d2f" - integrity sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag== - dependencies: - "@vitest/expect" "1.6.1" - "@vitest/runner" "1.6.1" - "@vitest/snapshot" "1.6.1" - "@vitest/spy" "1.6.1" - "@vitest/utils" "1.6.1" - acorn-walk "^8.3.2" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - tinybench "^2.5.1" - tinypool "^0.8.3" - vite "^5.0.0" - vite-node "1.6.1" - why-is-node-running "^2.2.2" - -vue-cli-plugin-yaml@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vue-cli-plugin-yaml/-/vue-cli-plugin-yaml-1.0.2.tgz#f87fad162a4545e498febdc26d7b76941b7b6a54" - integrity sha512-gdPdHWjLyynzy97krmeSBDarkoYO8MVZUYu38CthNvLDBL+xJoM1jclBneI85x2nLtnqfaf753nMnsV6iIDl3A== - dependencies: - json-loader "^0.5.7" - yaml-loader "^0.6.0" - -vue-eslint-parser@^7.10.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" - integrity sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg== - dependencies: - debug "^4.1.1" - eslint-scope "^5.1.1" - eslint-visitor-keys "^1.1.0" - espree "^6.2.1" - esquery "^1.4.0" - lodash "^4.17.21" - semver "^6.3.0" - -vue-hot-reload-api@^2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" - integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== - -vue-i18n@^8.27.2: - version "8.28.2" - resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.28.2.tgz#913558066e274395c0a9f40b2f3393d5c2636840" - integrity sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA== - -vue-js-modal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-2.0.1.tgz#748ba2533c5b5eaf8234c6320b148663357c1163" - integrity sha512-5FUwsH2zoxRKX4a7wkFAqX0eITCcIMunJDEfIxzHs2bHw9o20+Iqm+uQvBcg1jkzyo1+tVgThR/7NGU8djbD8Q== - dependencies: - resize-observer-polyfill "^1.5.1" - -vue-json-tree-view@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.6.tgz#a153ac1b18432b8671c65930f545ce134e38cf2d" - integrity sha512-gs7VDd1dC5SFQmyMdIq3O0w2IsITZfzyNFe6lsTeQwhFkh0nwWxhKWrS6opNmdOYFYmy52D9DVto78v8mF7IXQ== - dependencies: - lodash "^4.17.4" - vue "^2.5.16" - -vue-loader@^17.0.0: - version "17.4.2" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-17.4.2.tgz#f87f0d8adfcbbe8623de9eba1979d41ba223c6da" - integrity sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w== - dependencies: - chalk "^4.1.0" - hash-sum "^2.0.0" - watchpack "^2.4.0" - -vue-material-tabs@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/vue-material-tabs/-/vue-material-tabs-0.1.5.tgz#255fc0beb27c005eaae61c1534d782a94c30c525" - integrity sha512-ZLFRCxaCS3TM8IwnxQA4S2CVj+tBaILb8fQZDg+Ix+9Zu+k16udrdhLU2GWvJEVPLspuCzKhCEXW4cIg59YkVw== - -vue-resize@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-1.0.1.tgz#c120bed4e09938771d622614f57dbcf58a5147ee" - integrity sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w== - dependencies: - "@babel/runtime" "^7.13.10" - -vue-router@^3.5.3: - version "3.6.5" - resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.6.5.tgz#95847d52b9a7e3f1361cb605c8e6441f202afad8" - integrity sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ== - -vue-select@^3.20.2: - version "3.20.4" - resolved "https://registry.yarnpkg.com/vue-select/-/vue-select-3.20.4.tgz#cf1fee2e0dfad3b692b23895acf959b9971770de" - integrity sha512-pXIsDUnBR1075qHNEM7mKgX7YnHI3MfCO+7VmXSA1Hywplpqi52jOa0j6EHWQU6MnaW/mBZPuaQtgp3yvks2Kw== - -vue-style-loader@^4.1.0, vue-style-loader@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" - integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== - dependencies: - hash-sum "^1.0.2" - loader-utils "^1.0.2" - -vue-svg-loader@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/vue-svg-loader/-/vue-svg-loader-0.16.0.tgz#adccbdc9aca90132bde9c9d96cd49f74efecd345" - integrity sha512-2RtFXlTCYWm8YAEO2qAOZ2SuIF2NvLutB5muc3KDYoZq5ZeCHf8ggzSan3ksbbca7CJ/Aw57ZnDF4B7W/AkGtw== - dependencies: - loader-utils "^1.2.3" - svg-to-vue "^0.7.0" - -vue-swatches@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/vue-swatches/-/vue-swatches-2.1.1.tgz#26c467fb7648ff4ee0887aea36d1e03b15032b83" - integrity sha512-YugkNbByxMz1dnx1nZyHSL3VSf/TnBH3/NQD+t8JKxPSqUmX87sVGBxjEaqH5IMraOLfVmU0pHCHl2BfXNypQg== - -vue-template-babel-compiler@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vue-template-babel-compiler/-/vue-template-babel-compiler-1.2.0.tgz#f77126886e868f64d2acefe5c0ecfd9c323bf943" - integrity sha512-CScBSX1/wCdmmZ/Lvj/63p2CCVTS0FMj0F69VRBo73CuJrjvPAPGmeNJ7D/cwt/VS2PduowRWbO8N4Zh4Z3b0g== - dependencies: - "@babel/core" "^7.14.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.15.6" - "@babel/plugin-proposal-optional-chaining" "^7.14.2" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.5" - "@babel/types" "^7.14.5" - deepmerge "^4.2.2" - -vue-template-compiler@^2.7.0: - version "2.7.16" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz#c81b2d47753264c77ac03b9966a46637482bb03b" - integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== - dependencies: - de-indent "^1.0.2" - he "^1.2.0" - -vue-template-es2015-compiler@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" - integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== - -vue-toasted@^1.1.28: - version "1.1.28" - resolved "https://registry.yarnpkg.com/vue-toasted/-/vue-toasted-1.1.28.tgz#dbabb83acc89f7a9e8765815e491d79f0dc65c26" - integrity sha512-UUzr5LX51UbbiROSGZ49GOgSzFxaMHK6L00JV8fir/CYNJCpIIvNZ5YmS4Qc8Y2+Z/4VVYRpeQL2UO0G800Raw== - -vue@^2.5.16, vue@^2.7.0: - version "2.7.16" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.16.tgz#98c60de9def99c0e3da8dae59b304ead43b967c9" - integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw== - dependencies: - "@vue/compiler-sfc" "2.7.16" - csstype "^3.1.0" - -vuex@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71" - integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw== - -watchpack@^2.4.0, watchpack@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" - integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== +vitest@^4.0.18: + version "4.1.4" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.1.4.tgz#330a3798ce307f88d3eea373e61a5f14da8f3bb1" + integrity sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg== + dependencies: + "@vitest/expect" "4.1.4" + "@vitest/mocker" "4.1.4" + "@vitest/pretty-format" "4.1.4" + "@vitest/runner" "4.1.4" + "@vitest/snapshot" "4.1.4" + "@vitest/spy" "4.1.4" + "@vitest/utils" "4.1.4" + es-module-lexer "^2.0.0" + expect-type "^1.3.0" + magic-string "^0.30.21" + obug "^2.1.1" + pathe "^2.0.3" + picomatch "^4.0.3" + std-env "^4.0.0-rc.1" + tinybench "^2.9.0" + tinyexec "^1.0.2" + tinyglobby "^0.2.15" + tinyrainbow "^3.1.0" + vite "^6.0.0 || ^7.0.0 || ^8.0.0" + why-is-node-running "^2.3.0" + +vscode-uri@^3.0.8: + version "3.1.0" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== + +vue-component-type-helpers@^2.0.0: + version "2.2.12" + resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz#5014787aad185a22f460ad469cc51f14524308bc" + integrity sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw== + +vue-eslint-parser@^10.0.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz#fd7251d0e710a88a6618f50e8a27973bc3c8d69c" + integrity sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg== + dependencies: + debug "^4.4.0" + eslint-scope "^8.2.0 || ^9.0.0" + eslint-visitor-keys "^4.2.0 || ^5.0.0" + espree "^10.3.0 || ^11.0.0" + esquery "^1.6.0" + semver "^7.6.3" + +vue-i18n@^9.14.0: + version "9.14.5" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.14.5.tgz#72fbf4384b83a1c59ec9e01ff5d30224bd9150cf" + integrity sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g== + dependencies: + "@intlify/core-base" "9.14.5" + "@intlify/shared" "9.14.5" + "@vue/devtools-api" "^6.5.0" + +vue-router@^4.4.0: + version "4.6.4" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.6.4.tgz#a0a9cb9ef811a106d249e4bb9313d286718020d8" + integrity sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg== + dependencies: + "@vue/devtools-api" "^6.6.4" + +vue-select@4.0.0-beta.6: + version "4.0.0-beta.6" + resolved "https://registry.yarnpkg.com/vue-select/-/vue-select-4.0.0-beta.6.tgz#7c250cb7c01280b54a311cb446629801b3c8df98" + integrity sha512-K+zrNBSpwMPhAxYLTCl56gaMrWZGgayoWCLqe5rWwkB8aUbAUh7u6sXjIR7v4ckp2WKC7zEEUY27g6h1MRsIHw== + +vue-tsc@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-3.2.7.tgz#3e9a3a759f3e8fe4681ae628c3746aee00a5d1ff" + integrity sha512-zc1tL3HoQni1zGTGrwBVRQb7rGP5SWdu/m4rGB6JcnAC5MT5LFZIxF7Y+EJEnt4hGF23d60rXH7gRjHGb5KQQQ== dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" + "@volar/typescript" "2.4.28" + "@vue/language-core" "3.2.7" -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== +vue@^3.5.0: + version "3.5.32" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.32.tgz#9a7cbeb181aa4b2a71c3ebac4995542cf0353de3" + integrity sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw== dependencies: - minimalistic-assert "^1.0.0" + "@vue/compiler-dom" "3.5.32" + "@vue/compiler-sfc" "3.5.32" + "@vue/runtime-dom" "3.5.32" + "@vue/server-renderer" "3.5.32" + "@vue/shared" "3.5.32" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== +vuex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-4.1.0.tgz#aa1b3ea5c7385812b074c86faeeec2217872e36c" + integrity sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ== dependencies: - defaults "^1.0.3" + "@vue/devtools-api" "^6.0.0-beta.11" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +w3c-keyname@^2.2.4: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-bundle-analyzer@^4.4.0: - version "4.10.2" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" - integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - commander "^7.2.0" - debounce "^1.2.1" - escape-string-regexp "^4.0.0" - gzip-size "^6.0.0" - html-escaper "^2.0.2" - opener "^1.5.2" - picocolors "^1.0.0" - sirv "^2.0.3" - ws "^7.3.1" - -webpack-chain@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-6.5.1.tgz#4f27284cbbb637e3c8fbdef43eef588d4d861206" - integrity sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA== - dependencies: - deepmerge "^1.5.2" - javascript-stringify "^2.0.1" - -webpack-dev-middleware@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" - integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.7.3: - version "4.15.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" - integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.4" - ws "^8.13.0" - -webpack-merge@^5.7.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891" - integrity sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q== - -webpack-virtual-modules@^0.4.2: - version "0.4.6" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" - integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== - -webpack@^5.54.0: - version "5.105.4" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.4.tgz#1b77fcd55a985ac7ca9de80a746caffa38220169" - integrity sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.16.0" - acorn-import-phases "^1.0.3" - browserslist "^4.28.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.20.0" - es-module-lexer "^2.0.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.3.1" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.3" - tapable "^2.3.0" - terser-webpack-plugin "^5.3.17" - watchpack "^2.5.1" - webpack-sources "^3.3.4" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-fetch@^3.6.2: - version "3.6.20" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" - integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== - whatwg-mimetype@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -9463,13 +5297,6 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.19: gopd "^1.2.0" has-tostringtag "^1.0.2" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -9477,7 +5304,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -why-is-node-running@^2.2.2: +why-is-node-running@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== @@ -9485,184 +5312,168 @@ why-is-node-running@^2.2.2: siginfo "^2.0.0" stackback "0.0.2" -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -workbox-background-sync@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" - integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== +workbox-background-sync@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-7.4.0.tgz#5fcf83162b540f799966fdd8df0858f91b787d77" + integrity sha512-8CB9OxKAgKZKyNMwfGZ1XESx89GryWTfI+V5yEj8sHjFH8MFelUwYXEyldEK6M6oKMmn807GoJFUEA1sC4XS9w== dependencies: idb "^7.0.1" - workbox-core "6.6.1" + workbox-core "7.4.0" -workbox-broadcast-update@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" - integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== +workbox-broadcast-update@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-7.4.0.tgz#f0ee7d2af51d199e32213a429dff03f14ba76dea" + integrity sha512-+eZQwoktlvo62cI0b+QBr40v5XjighxPq3Fzo9AWMiAosmpG5gxRHgTbGGhaJv/q/MFVxwFNGh/UwHZ/8K88lA== dependencies: - workbox-core "6.6.1" + workbox-core "7.4.0" -workbox-build@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" - integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== +workbox-build@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-7.4.0.tgz#033f88ebbd9c6312983f3fb9c17a4161369d693f" + integrity sha512-Ntk1pWb0caOFIvwz/hfgrov/OJ45wPEhI5PbTywQcYjyZiVhT3UrwwUPl6TRYbTm4moaFYithYnl1lvZ8UjxcA== dependencies: "@apideck/better-ajv-errors" "^0.3.1" - "@babel/core" "^7.11.1" + "@babel/core" "^7.24.4" "@babel/preset-env" "^7.11.0" "@babel/runtime" "^7.11.2" "@rollup/plugin-babel" "^5.2.0" - "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-node-resolve" "^15.2.3" "@rollup/plugin-replace" "^2.4.1" + "@rollup/plugin-terser" "^0.4.3" "@surma/rollup-plugin-off-main-thread" "^2.2.3" ajv "^8.6.0" common-tags "^1.8.0" fast-json-stable-stringify "^2.1.0" fs-extra "^9.0.1" - glob "^7.1.6" + glob "^11.0.1" lodash "^4.17.20" pretty-bytes "^5.3.0" - rollup "^2.43.1" - rollup-plugin-terser "^7.0.0" + rollup "^2.79.2" source-map "^0.8.0-beta.0" stringify-object "^3.3.0" strip-comments "^2.0.1" tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "6.6.1" - workbox-broadcast-update "6.6.1" - workbox-cacheable-response "6.6.1" - workbox-core "6.6.1" - workbox-expiration "6.6.1" - workbox-google-analytics "6.6.1" - workbox-navigation-preload "6.6.1" - workbox-precaching "6.6.1" - workbox-range-requests "6.6.1" - workbox-recipes "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" - workbox-streams "6.6.1" - workbox-sw "6.6.1" - workbox-window "6.6.1" - -workbox-cacheable-response@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" - integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== - dependencies: - workbox-core "6.6.1" - -workbox-core@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" - integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== - -workbox-expiration@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" - integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== + workbox-background-sync "7.4.0" + workbox-broadcast-update "7.4.0" + workbox-cacheable-response "7.4.0" + workbox-core "7.4.0" + workbox-expiration "7.4.0" + workbox-google-analytics "7.4.0" + workbox-navigation-preload "7.4.0" + workbox-precaching "7.4.0" + workbox-range-requests "7.4.0" + workbox-recipes "7.4.0" + workbox-routing "7.4.0" + workbox-strategies "7.4.0" + workbox-streams "7.4.0" + workbox-sw "7.4.0" + workbox-window "7.4.0" + +workbox-cacheable-response@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-7.4.0.tgz#f684380c07dfce4ed1aa555c8a29a2a1f8421d46" + integrity sha512-0Fb8795zg/x23ISFkAc7lbWes6vbw34DGFIMw31cwuHPgDEC/5EYm6m/ZkylLX0EnEbbOyOCLjKgFS/Z5g0HeQ== + dependencies: + workbox-core "7.4.0" + +workbox-core@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-7.4.0.tgz#5cb59ae7655f2727423268fb1ba698f37809189d" + integrity sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ== + +workbox-expiration@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-7.4.0.tgz#f7162a45ad8b28de84acea478df421b4d0065e61" + integrity sha512-V50p4BxYhtA80eOvulu8xVfPBgZbkxJ1Jr8UUn0rvqjGhLDqKNtfrDfjJKnLz2U8fO2xGQJTx/SKXNTzHOjnHw== dependencies: idb "^7.0.1" - workbox-core "6.6.1" + workbox-core "7.4.0" -workbox-google-analytics@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" - integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== +workbox-google-analytics@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-7.4.0.tgz#208d8e584e8262af8a14140c3a990d13021c8257" + integrity sha512-MVPXQslRF6YHkzGoFw1A4GIB8GrKym/A5+jYDUSL+AeJw4ytQGrozYdiZqUW1TPQHW8isBCBtyFJergUXyNoWQ== dependencies: - workbox-background-sync "6.6.1" - workbox-core "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" + workbox-background-sync "7.4.0" + workbox-core "7.4.0" + workbox-routing "7.4.0" + workbox-strategies "7.4.0" -workbox-navigation-preload@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" - integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== +workbox-navigation-preload@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-7.4.0.tgz#3133983b2690dee733d18f56760fdd5182a6ffaf" + integrity sha512-etzftSgdQfjMcfPgbfaZCfM2QuR1P+4o8uCA2s4rf3chtKTq/Om7g/qvEOcZkG6v7JZOSOxVYQiOu6PbAZgU6w== dependencies: - workbox-core "6.6.1" + workbox-core "7.4.0" -workbox-precaching@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" - integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== +workbox-precaching@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-7.4.0.tgz#daf486953353acaf84142b78cf28a890c466b242" + integrity sha512-VQs37T6jDqf1rTxUJZXRl3yjZMf5JX/vDPhmx2CPgDDKXATzEoqyRqhYnRoxl6Kr0rqaQlp32i9rtG5zTzIlNg== dependencies: - workbox-core "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" + workbox-core "7.4.0" + workbox-routing "7.4.0" + workbox-strategies "7.4.0" -workbox-range-requests@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" - integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== +workbox-range-requests@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-7.4.0.tgz#1be334d6a7a0b158d6094e8698460393863d28a2" + integrity sha512-3Vq854ZNuP6Y0KZOQWLaLC9FfM7ZaE+iuQl4VhADXybwzr4z/sMmnLgTeUZLq5PaDlcJBxYXQ3U91V7dwAIfvw== dependencies: - workbox-core "6.6.1" + workbox-core "7.4.0" -workbox-recipes@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" - integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== +workbox-recipes@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-7.4.0.tgz#217e6394f965bed8fbf15ad83370f03356c885c9" + integrity sha512-kOkWvsAn4H8GvAkwfJTbwINdv4voFoiE9hbezgB1sb/0NLyTG4rE7l6LvS8lLk5QIRIto+DjXLuAuG3Vmt3cxQ== dependencies: - workbox-cacheable-response "6.6.1" - workbox-core "6.6.1" - workbox-expiration "6.6.1" - workbox-precaching "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" + workbox-cacheable-response "7.4.0" + workbox-core "7.4.0" + workbox-expiration "7.4.0" + workbox-precaching "7.4.0" + workbox-routing "7.4.0" + workbox-strategies "7.4.0" -workbox-routing@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" - integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== +workbox-routing@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-7.4.0.tgz#4b5bc90256515dc5cf49b356b101721fd135d013" + integrity sha512-C/ooj5uBWYAhAqwmU8HYQJdOjjDKBp9MzTQ+otpMmd+q0eF59K+NuXUek34wbL0RFrIXe/KKT+tUWcZcBqxbHQ== dependencies: - workbox-core "6.6.1" + workbox-core "7.4.0" -workbox-strategies@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" - integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== +workbox-strategies@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-7.4.0.tgz#59130734400722d39ce4a0a1a22a363e99913946" + integrity sha512-T4hVqIi5A4mHi92+5EppMX3cLaVywDp8nsyUgJhOZxcfSV/eQofcOA6/EMo5rnTNmNTpw0rUgjAI6LaVullPpg== dependencies: - workbox-core "6.6.1" + workbox-core "7.4.0" -workbox-streams@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" - integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== +workbox-streams@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-7.4.0.tgz#e5b8e6b540f08e05f3c51b748c54056d24f20e8c" + integrity sha512-QHPBQrey7hQbnTs5GrEVoWz7RhHJXnPT+12qqWM378orDMo5VMJLCkCM1cnCk+8Eq92lccx/VgRZ7WAzZWbSLg== dependencies: - workbox-core "6.6.1" - workbox-routing "6.6.1" + workbox-core "7.4.0" + workbox-routing "7.4.0" -workbox-sw@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" - integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== - -workbox-webpack-plugin@^6.1.0: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" - integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== - dependencies: - fast-json-stable-stringify "^2.1.0" - pretty-bytes "^5.4.1" - upath "^1.2.0" - webpack-sources "^1.4.3" - workbox-build "6.6.1" +workbox-sw@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-7.4.0.tgz#05c9659399b8f3716e14406be66eb118fcb3968f" + integrity sha512-ltU+Kr3qWR6BtbdlMnCjobZKzeV1hN+S6UvDywBrwM19TTyqA03X66dzw1tEIdJvQ4lYKkBFox6IAEhoSEZ8Xw== -workbox-window@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" - integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== +workbox-window@7.4.0, workbox-window@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-7.4.0.tgz#5399a5261b8c34d9d102f2d832d5857ee4d5748a" + integrity sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw== dependencies: "@types/trusted-types" "^2.0.2" - workbox-core "6.6.1" + workbox-core "7.4.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" @@ -9673,23 +5484,6 @@ workbox-window@6.6.1: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -9704,96 +5498,27 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.3.1: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^8.13.0, ws@^8.18.3: +ws@^8.18.3: version "8.20.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== -xml2js@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" - integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml-loader@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/yaml-loader/-/yaml-loader-0.6.0.tgz#fe1c48b9f4803dace55a59a1474e790ba6ab1b48" - integrity sha512-1bNiLelumURyj+zvVHOv8Y3dpCri0F2S+DCcmps0pA1zWRLjS+FhZQg4o3aUUDYESh73+pKZNI18bj7stpReow== - dependencies: - loader-utils "^1.4.0" - yaml "^1.8.3" - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2, yaml@^1.8.3: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.0.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" +yaml@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.3.tgz#a0d6bd2efb3dd03c59370223701834e60409bd7d" + integrity sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg== yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" - integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== - -yorkie@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" - integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw== - dependencies: - execa "^0.8.0" - is-ci "^1.0.10" - normalize-path "^1.0.0" - strip-indent "^2.0.0"