Compare commits

..
Author SHA1 Message Date
ajnart 6c3b584bd2 style: auto-fix lint and format 2026-07-21 08:08:53 +00:00
ajnart e3cf680cbd fix(integrations): support UniFi controller default ports 2026-07-21 10:07:25 +02:00
ajnart 24989ddd16 style: auto-fix lint and format 2026-07-06 00:07:03 +00:00
ajnart 8cd9e8c826 fix(integrations): use Unifi default port 8443 when no port is given
The node-unifi library hardcodes https:// in its base URL and the
Unifi controller API only speaks HTTPS. When a user adds the
integration with a bare http:// or https:// URL, getPortFromUrl
returned 80 or 443, and the library attempted a TLS handshake on
the wrong port. The server's plain HTTP response caused
'EPROTO ... wrong version number'.

Derive the port from the user's explicit port, or fall back to 8443
(the integration's defaultPort). Closes #6207.
2026-07-06 02:05:44 +02:00
homarr-crowdin[bot] 5b91687912 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-07-05 01:57:18 +00:00
Thomas a3df31ff05 Revise Immich API key permissions in documentation
Updated API key permissions for Immich integration documentation.
2026-07-04 21:49:08 +02:00
homarr-renovate[bot] c5c9daf5a5 chore(deps): update dependency undici to v7.28.0 [security] (#6188)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 18:11:47 +00:00
homarr-renovate[bot] ab0e878fbf chore(deps): update dependency posthog-js to ^1.396.2 (#6189)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 16:20:03 +00:00
Thomas 885be1b9a1 fix(widget-secrets): add missing widget_secret migration and add error notifications (#6192)
* fix(widget-secrets): add missing widget_secret migration and add error notifications

The widget_secret table was defined in all three Drizzle schema files but
no SQL migration was ever generated to create it, causing setSecret to
fail with 'no such table: widget_secret' in production (drizzle-kit push
in development hid the problem).

- Add migration SQL for sqlite (0040), mysql (0042), postgresql (0008)
- Update journal entries for all three dialects
- Add onError handlers to setSecret/deleteSecret mutations so errors
  are shown as red notifications instead of silently swallowed

Fixes #6186

* fix(widget-secrets): add missing drizzle snapshots for merge-url and widget_secret migrations

The merge_custom_widget_url migration (0039/0041/0007) was committed
without a corresponding snapshot, breaking drizzle-kit generate for
all future migrations. This adds:
- 0039/0041/0007 snapshots reflecting the merge-url changes
  (base_url+endpoint -> url, add enabled column)
- 0040/0042/0008 snapshots reflecting the widget_secret table

All snapshot chains now match journal entries (41/43/9 entries each).
2026-07-04 17:57:40 +02:00
homarr-renovate[bot] 0f8a86fdde fix(deps): update tailwindcss monorepo to ^4.3.2 (#6190)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 14:55:47 +00:00
11 changed files with 394 additions and 197 deletions

No files matched your search

+21 -8
View File
@@ -39,13 +39,26 @@ import { immichServerStatsWidget } from '../../widgets/immich-server-stats';
'Scroll down to "API Keys"',
'Click "New API Key"',
'Enter a name, e.g. "Homarr"',
(<span>
Select the following permissions:{" "}
<code>album.read</code>,{" "}
<code>user.read</code>,{" "}
<code>server.statistics</code>,{" "}
<code>asset.download</code>
</span>),
(
<span>
Select the following permissions:{" "}
<code>album.statistics</code>,{" "}
<code>album.read</code>,{" "}
<code>album.create</code>,{" "}
<code>user.read</code>,{" "}
<code>user.update</code>,{" "}
<code>asset.read</code>,{" "}
<code>asset.download</code>,{" "}
<code>asset.statistics</code>,{" "}
<code>server.statistics</code>,{" "}
<code>server.about</code>.
<br />
Additional permissions may be required depending on your Immich version. If you encounter authorization errors, grant any missing permissions requested by the server.
</span>
),Ï
'Create the integration in Homarr and copy the API key to there'
]
}]} />
}]} />
@@ -1,40 +1,48 @@
---
title: 'Unifi Controller'
title: "Unifi Controller"
description: "Unifi Controller is a network management platform for Unifi devices."
hide_title: true
---
import { IntegrationHeader } from '@site/src/components/integrations/header';
import { IntegrationCapabilites } from '@site/src/components/integrations/widgets';
import { AddingIntegration } from '@site/src/components/integrations/adding';
import {IntegrationSecrets} from '@site/src/components/integrations/secrets';
import { IntegrationHeader } from "@site/src/components/integrations/header";
import { IntegrationCapabilites } from "@site/src/components/integrations/widgets";
import { AddingIntegration } from "@site/src/components/integrations/adding";
import { IntegrationSecrets } from "@site/src/components/integrations/secrets";
import { IconTopologyFull } from "@tabler/icons-react";
import { unifiControllerIntegration } from '.';
import { networkControllerSummaryWidget } from '@site/docs/widgets/network-controller-summary';
import { networkControllerStatusWidget } from '@site/docs/widgets/network-controller-status';
import { unifiControllerIntegration } from ".";
import { networkControllerSummaryWidget } from "@site/docs/widgets/network-controller-summary";
import { networkControllerStatusWidget } from "@site/docs/widgets/network-controller-status";
<IntegrationHeader
integration={unifiControllerIntegration}
categories={['Network controller']}
/>
<IntegrationHeader integration={unifiControllerIntegration} categories={["Network controller"]} />
This integration is using the [node-unifi](https://www.npmjs.com/package/node-unifi) library under the hood to connect to the Unifi Controller.
Therfore it should support CloudKey Gen1, CloudKey Gen2, UnifiOS-based UDM-Pro controllers as well as self-hosted UniFi controllers.
### Widgets & Capabilities
<IntegrationCapabilites
items={[
{ widget: networkControllerSummaryWidget },
{ widget: networkControllerStatusWidget}
]}
items={[{ widget: networkControllerSummaryWidget }, { widget: networkControllerStatusWidget }]}
/>
### Adding the integration
<AddingIntegration />
Use the local HTTPS address of your controller:
- UniFi OS consoles such as Dream Router, Dream Machine, Cloud Gateway, and CloudKey use `https://<host>` (port 443).
- Self-hosted UniFi Network Servers normally use `https://<host>:8443`.
- If you omit the port, Homarr tries port 443 first and then port 8443 when the first port cannot be reached.
Use a local administrator account. Cloud-only accounts and accounts with multi-factor authentication are not supported by the underlying client.
### Secrets
<IntegrationSecrets secrets={[{
credentials: ['username', 'password'],
steps: []
}]} />
<IntegrationSecrets
secrets={[
{
credentials: ["username", "password"],
steps: [],
},
]}
/>
+2 -2
View File
@@ -32,7 +32,7 @@
"@scalar/api-reference-react": "catalog:",
"@signalwire/docusaurus-plugin-llms-txt": "^1.2.2",
"@tabler/icons-react": "catalog:",
"@tailwindcss/postcss": "^4.3.1",
"@tailwindcss/postcss": "^4.3.2",
"clsx": "catalog:",
"dayjs": "catalog:",
"docusaurus-plugin-image-zoom": "^3.0.1",
@@ -44,7 +44,7 @@
"react": "catalog:",
"react-dom": "catalog:",
"swiper": "^12.2.0",
"tailwindcss": "^4.3.1"
"tailwindcss": "^4.3.2"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.10.1",
@@ -60,8 +60,8 @@ export type HomarrDocumentationPath =
| "/docs/tags/connections"
| "/docs/tags/custom-widgets"
| "/docs/tags/customization"
| "/docs/tags/data-sources"
| "/docs/tags/data"
| "/docs/tags/data-sources"
| "/docs/tags/database"
| "/docs/tags/developer"
| "/docs/tags/development"
@@ -99,8 +99,8 @@ export type HomarrDocumentationPath =
| "/docs/tags/redis"
| "/docs/tags/responsive"
| "/docs/tags/roles"
| "/docs/tags/search-engines"
| "/docs/tags/search"
| "/docs/tags/search-engines"
| "/docs/tags/secrets"
| "/docs/tags/security"
| "/docs/tags/self-signed"
@@ -132,15 +132,6 @@ export type HomarrDocumentationPath =
| "/docs/advanced/running-as-different-user"
| "/docs/advanced/single-sign-on"
| "/docs/advanced/styling"
| "/docs/category/advanced"
| "/docs/category/community"
| "/docs/category/developer-guides"
| "/docs/category/getting-started"
| "/docs/category/installation-1"
| "/docs/category/installation"
| "/docs/category/integrations"
| "/docs/category/management"
| "/docs/category/widgets"
| "/docs/community/donate"
| "/docs/community/faq"
| "/docs/community/get-in-touch"
@@ -168,6 +159,7 @@ export type HomarrDocumentationPath =
| "/docs/integrations/archiveteam-warrior"
| "/docs/integrations/aria2"
| "/docs/integrations/audiobookshelf"
| "/docs/integrations/bazarr"
| "/docs/integrations/beszel"
| "/docs/integrations/coolify"
| "/docs/integrations/dash-dot"
@@ -192,6 +184,7 @@ export type HomarrDocumentationPath =
| "/docs/integrations/opnsense"
| "/docs/integrations/overseerr"
| "/docs/integrations/paperless-ngx"
| "/docs/integrations/patchmon"
| "/docs/integrations/peanut"
| "/docs/integrations/pi-hole"
| "/docs/integrations/plex"
@@ -205,9 +198,11 @@ export type HomarrDocumentationPath =
| "/docs/integrations/slskd"
| "/docs/integrations/sonarr"
| "/docs/integrations/speedtest-tracker"
| "/docs/integrations/synology"
| "/docs/integrations/tdarr"
| "/docs/integrations/technitium-dns"
| "/docs/integrations/tracearr"
| "/docs/integrations/traefik"
| "/docs/integrations/transmission"
| "/docs/integrations/truenas"
| "/docs/integrations/umami"
@@ -230,6 +225,7 @@ export type HomarrDocumentationPath =
| "/docs/widgets/anchor-note"
| "/docs/widgets/app"
| "/docs/widgets/audio-stats"
| "/docs/widgets/bazarr"
| "/docs/widgets/beszel-alerts"
| "/docs/widgets/beszel-system-grid"
| "/docs/widgets/beszel-system-stats"
@@ -249,6 +245,7 @@ export type HomarrDocumentationPath =
| "/docs/widgets/immich-album-carousel"
| "/docs/widgets/immich-server-stats"
| "/docs/widgets/indexer-manager"
| "/docs/widgets/media-missing"
| "/docs/widgets/media-releases"
| "/docs/widgets/media-request-list"
| "/docs/widgets/media-request-stats"
@@ -260,15 +257,18 @@ export type HomarrDocumentationPath =
| "/docs/widgets/notebook"
| "/docs/widgets/notifications"
| "/docs/widgets/paperless-ngx"
| "/docs/widgets/patchmon"
| "/docs/widgets/releases"
| "/docs/widgets/rss-feed"
| "/docs/widgets/smart-home-entity-state"
| "/docs/widgets/smart-home-execute-automation"
| "/docs/widgets/speedtest-tracker"
| "/docs/widgets/stock-price"
| "/docs/widgets/system-disks"
| "/docs/widgets/system-resources"
| "/docs/widgets/timetable"
| "/docs/widgets/tracearr"
| "/docs/widgets/traefik"
| "/docs/widgets/umami"
| "/docs/widgets/ups"
| "/docs/widgets/uptime-kuma"
@@ -0,0 +1,141 @@
import { describe, expect, test, vi } from "vitest";
vi.hoisted(() => {
process.env.SKIP_ENV_VALIDATION = "true";
process.env.SECRET_ENCRYPTION_KEY = "ff3f4f7ce30e870c9630de9e5d244ffa81101a24ed0dfe5f064beb53a7e684f1";
process.env.ENABLE_DNS_CACHING = "false";
});
const controllerCtor = vi.fn();
const controllerLogin = vi.fn().mockResolvedValue(true);
vi.mock("@homarr/redis", () => ({
createGetSetChannel: () => ({
getAsync: vi.fn().mockResolvedValue(null),
setAsync: vi.fn().mockResolvedValue(undefined),
removeAsync: vi.fn().mockResolvedValue(undefined),
}),
}));
vi.mock("@homarr/core/infrastructure/logs", () => ({
createLogger: () => ({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() }),
ErrorWithMetadata: class extends Error {},
}));
vi.mock("@homarr/core/infrastructure/http", () => ({
createCustomCheckServerIdentity: () => (() => undefined) as never,
fetchWithTrustedCertificatesAsync: vi.fn(),
createAxiosCertificateInstanceAsync: vi.fn().mockResolvedValue({}),
createCertificateAgentAsync: vi.fn().mockResolvedValue(undefined),
}));
vi.mock("@homarr/core/infrastructure/certificates", () => ({
getTrustedCertificateHostnamesAsync: vi.fn().mockResolvedValue([]),
getAllTrustedCertificatesAsync: vi.fn().mockResolvedValue([]),
}));
vi.mock("axios", () => ({
AxiosError: Error,
default: {
create: vi.fn().mockReturnValue({}),
},
}));
vi.mock("http-cookie-agent/http", () => ({
HttpCookieAgent: class {},
HttpsCookieAgent: class {},
}));
vi.mock("@homarr/node-unifi", () => {
class FakeController {
public options: Record<string, unknown>;
constructor(options: Record<string, unknown>) {
this.options = options;
controllerCtor(options);
}
public async login(): Promise<true> {
return await controllerLogin(this.options.port);
}
public async getSitesStats(): Promise<unknown[]> {
return [];
}
}
return { default: { Controller: FakeController } };
});
import { UnifiControllerIntegration } from "../unifi-controller-integration";
const createIntegration = (url: string) =>
new UnifiControllerIntegration({
id: "test-unifi",
name: "Test Unifi",
url,
externalUrl: null,
decryptedSecrets: [
{ kind: "username", value: "admin" },
{ kind: "password", value: "secret" },
],
});
describe("UnifiControllerIntegration port resolution", () => {
test("a URL without a port uses the UniFi OS port 443", async () => {
controllerCtor.mockClear();
controllerLogin.mockClear().mockResolvedValue(true);
await createIntegration("http://192.168.1.1").getNetworkSummaryAsync();
expect(controllerCtor).toHaveBeenCalledTimes(1);
expect(controllerCtor).toHaveBeenCalledWith(expect.objectContaining({ host: "192.168.1.1", port: 443 }));
});
test("a connection failure on port 443 falls back to the self-hosted controller port 8443", async () => {
controllerCtor.mockClear();
controllerLogin
.mockClear()
.mockRejectedValueOnce(Object.assign(new Error("connect ECONNREFUSED"), { isAxiosError: true }))
.mockResolvedValueOnce(true);
await createIntegration("http://controller.lan").getNetworkSummaryAsync();
expect(controllerCtor).toHaveBeenNthCalledWith(1, expect.objectContaining({ port: 443 }));
expect(controllerCtor).toHaveBeenNthCalledWith(2, expect.objectContaining({ port: 8443 }));
});
test("https://controller.lan:8443 keeps the user-specified port", async () => {
controllerCtor.mockClear();
controllerLogin.mockClear().mockResolvedValue(true);
await createIntegration("https://controller.lan:8443").getNetworkSummaryAsync();
expect(controllerCtor).toHaveBeenCalledWith(expect.objectContaining({ host: "controller.lan", port: 8443 }));
});
test("https://192.168.1.1:8443 keeps the user-specified port", async () => {
controllerCtor.mockClear();
controllerLogin.mockClear().mockResolvedValue(true);
await createIntegration("https://192.168.1.1:8443").getNetworkSummaryAsync();
expect(controllerCtor).toHaveBeenCalledWith(expect.objectContaining({ host: "192.168.1.1", port: 8443 }));
});
test("an unusual port like 10443 is honored verbatim", async () => {
controllerCtor.mockClear();
controllerLogin.mockClear().mockResolvedValue(true);
await createIntegration("https://192.168.1.1:10443").getNetworkSummaryAsync();
expect(controllerCtor).toHaveBeenCalledWith(expect.objectContaining({ host: "192.168.1.1", port: 10443 }));
});
test("an authentication failure on port 443 does not try another port", async () => {
controllerCtor.mockClear();
controllerLogin.mockClear().mockRejectedValueOnce(
Object.assign(new Error("Request failed with status code 401"), {
isAxiosError: true,
response: { status: 401 },
}),
);
await expect(createIntegration("https://controller.lan").getNetworkSummaryAsync()).rejects.toThrow();
expect(controllerCtor).toHaveBeenCalledTimes(1);
expect(controllerCtor).toHaveBeenCalledWith(expect.objectContaining({ port: 443 }));
});
});
@@ -2,7 +2,6 @@ import type tls from "node:tls";
import axios from "axios";
import { HttpCookieAgent, HttpsCookieAgent } from "http-cookie-agent/http";
import { getPortFromUrl } from "@homarr/common";
import {
getAllTrustedCertificatesAsync,
getTrustedCertificateHostnamesAsync,
@@ -67,26 +66,53 @@ export class UnifiControllerIntegration extends Integration implements NetworkCo
checkServerIdentity: createCustomCheckServerIdentity(await getTrustedCertificateHostnamesAsync()),
};
const client = new Unifi.Controller({
host: url.hostname,
port: getPortFromUrl(url),
username: this.getSecretValue("username"),
password: this.getSecretValue("password"),
createAxiosInstance({ cookies }) {
return axios.create({
adapter: "http",
httpAgent: new HttpCookieAgent({ cookies }),
httpsAgent: new HttpsCookieAgent({
cookies,
requestCert: true,
...certificateOptions,
}),
});
},
});
// ponytail: node-unifi always connects over HTTPS, regardless of the protocol in the
// integration URL. UniFi OS consoles use port 443 while self-hosted controllers normally
// use 8443. If no port was provided, try both without hiding authentication errors.
const ports = url.port ? [Number(url.port)] : [443, 8443];
const createClientForPortAsync = async (port: number) => {
const client = new Unifi.Controller({
host: url.hostname,
port,
username: this.getSecretValue("username"),
password: this.getSecretValue("password"),
createAxiosInstance({ cookies }) {
return axios.create({
adapter: "http",
httpAgent: new HttpCookieAgent({ cookies }),
httpsAgent: new HttpsCookieAgent({
cookies,
requestCert: true,
...certificateOptions,
}),
});
},
});
await client.login(this.getSecretValue("username"), this.getSecretValue("password"), null);
return client;
await client.login(this.getSecretValue("username"), this.getSecretValue("password"), null);
return client;
};
for (const [index, port] of ports.entries()) {
try {
return await createClientForPortAsync(port);
} catch (error) {
const isLastPort = index === ports.length - 1;
if (isLastPort || !this.isPortFallbackError(error)) {
throw error;
}
}
}
throw new Error("Unable to connect to the UniFi controller");
}
private isPortFallbackError(error: unknown) {
if (typeof error === "object" && error !== null && "isAxiosError" in error && error.isAxiosError === true) {
return !("response" in error) || error.response === undefined;
}
return error instanceof Error && error.message === "failed to detect UniFiOS status";
}
private getStatusValueOverAllSites<S extends HealthSubsystem>(
+12 -12
View File
@@ -732,8 +732,8 @@
"displayType": "",
"jsonPath": "",
"jsonPathHint": "",
"label": "",
"unit": "",
"label": "Étiquette",
"unit": "Unité",
"mappings": "",
"tablePath": "",
"tablePathHint": "",
@@ -755,14 +755,14 @@
"striped": "",
"compact": "",
"maxHeight": "",
"color": "",
"color": "Couleur",
"buttonLabel": "",
"buttonColor": "",
"confirmText": "",
"confirmText": "Texte de confirmation",
"confirmTextHint": "",
"successMessage": "",
"successMessage": "Message de réussite",
"successMessageHint": "",
"enabled": "",
"enabled": "Activé",
"template": {
"label": "",
"description": ""
@@ -1017,13 +1017,13 @@
"timetable": "",
"photoService": "",
"documents": "",
"notes": "",
"mediaMonitoring": "",
"speedtest": "",
"notes": "Notes",
"mediaMonitoring": "Supervision",
"speedtest": "Test de débit",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
"mediaLibrary": "Bibliothèque de médias",
"uptimeMonitoring": "Surveillance des disponibilités"
},
"testConnection": {
"action": {
@@ -1298,7 +1298,7 @@
"newLabel": "Nouvelle clé privée"
},
"slug": {
"label": "",
"label": "Slug de la page de statut",
"newLabel": ""
}
}
+11 -11
View File
@@ -1599,7 +1599,7 @@
"menu": {
"label": {
"settings": "Impostazioni",
"refresh": "",
"refresh": "Aggiorna",
"options": "Opzioni",
"actions": "Azioni"
}
@@ -1904,7 +1904,7 @@
"noStation": "Nessuna stazione selezionata",
"option": {
"baseUrl": {
"label": ""
"label": "Url Search.ch"
},
"station": {
"label": "Stazione"
@@ -2791,8 +2791,8 @@
"description": "Visualizza la data dell'immagine e l'indice corrente nella parte inferiore della presentazione"
},
"randomizePhotos": {
"label": "",
"description": ""
"label": "Immagini casuali",
"description": "Mostra le foto in ordine casuale invece di iniziare sempre con lo stesso ordine degli album."
}
},
"description": "Presentazione delle immagini nel tuo album Immich",
@@ -3158,7 +3158,7 @@
"label": "Provider"
},
"providerUrl": {
"label": ""
"label": "URL Provider"
},
"identifier": {
"label": "Identificatore",
@@ -3209,10 +3209,10 @@
"tooltip": "Impossibile analizzare il provider, impostarlo manualmente dopo aver importato le immagini"
},
"tokens": {
"label": "",
"token": "",
"configured": "",
"notConfigured": "",
"label": "Token Provider",
"token": "Token",
"configured": "Token configurato",
"notConfigured": "Nessun token impostato",
"save": "Salva"
}
}
@@ -3236,9 +3236,9 @@
"invalidIdentifier": "Identificatore non valido",
"noMatchingVersion": "Nessuna versione corrispondente trovata",
"noReleasesFound": "Nessun rilascio trovato",
"noProviderSelected": "",
"noProviderSelected": "Nessun provider selezionato",
"noProviderResponse": "Nessuna risposta dal provider",
"unexpected": ""
"unexpected": "Errore provider inaspettato"
}
}
},
+3 -3
View File
@@ -3132,7 +3132,7 @@
"label": ""
},
"showOnlyIcon": {
"label": ""
"label": "Показати тільки іконку"
},
"topReleases": {
"label": "",
@@ -3229,7 +3229,7 @@
"openReleasePage": "",
"releaseDescription": "",
"projectDescription": "",
"created": "",
"created": "Створено",
"error": {
"label": "",
"messages": {
@@ -3350,7 +3350,7 @@
"label": ""
}
},
"latestResult": "",
"latestResult": "Останній результат",
"averages": "",
"tests": "",
"recentResults": "",
+114 -107
View File
@@ -442,7 +442,7 @@ catalogs:
specifier: ^1.18.0
version: 1.18.0
posthog-js:
specifier: ^1.396.1
specifier: ^1.396.2
version: 1.396.3
posthog-node:
specifier: ^4.18.0
@@ -520,8 +520,8 @@ catalogs:
specifier: ^6.0.3
version: 6.0.3
undici:
specifier: 7.27.2
version: 7.27.2
specifier: 7.28.0
version: 7.28.0
use-deep-compare-effect:
specifier: ^1.8.1
version: 1.8.1
@@ -702,7 +702,7 @@ importers:
version: 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@scalar/api-reference-react':
specifier: 'catalog:'
version: 0.9.49(nprogress@0.2.0)(react@19.2.7)(tailwindcss@4.3.1)(typescript@6.0.3)(zod@4.4.3)
version: 0.9.49(nprogress@0.2.0)(react@19.2.7)(tailwindcss@4.3.2)(typescript@6.0.3)(zod@4.4.3)
'@signalwire/docusaurus-plugin-llms-txt':
specifier: ^1.2.2
version: 1.2.2(@docusaurus/core@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.28.1)(postcss@8.5.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(esbuild@0.28.1)(postcss@8.5.16))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.28.1)(postcss@8.5.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))
@@ -710,8 +710,8 @@ importers:
specifier: 'catalog:'
version: 3.44.0(react@19.2.7)
'@tailwindcss/postcss':
specifier: ^4.3.1
version: 4.3.1
specifier: ^4.3.2
version: 4.3.2
clsx:
specifier: 'catalog:'
version: 2.1.1
@@ -746,8 +746,8 @@ importers:
specifier: ^12.2.0
version: 12.2.0
tailwindcss:
specifier: ^4.3.1
version: 4.3.1
specifier: ^4.3.2
version: 4.3.2
devDependencies:
'@docusaurus/module-type-aliases':
specifier: ^3.10.1
@@ -913,7 +913,7 @@ importers:
version: 1.29.0(zod@4.4.3)
'@scalar/api-reference-react':
specifier: 'catalog:'
version: 0.9.49(nprogress@0.2.0)(react@19.2.7)(tailwindcss@4.3.1)(typescript@6.0.3)(zod@4.4.3)
version: 0.9.49(nprogress@0.2.0)(react@19.2.7)(tailwindcss@4.3.2)(typescript@6.0.3)(zod@4.4.3)
'@tabler/icons-react':
specifier: 'catalog:'
version: 3.44.0(react@19.2.7)
@@ -1151,7 +1151,7 @@ importers:
version: 2.2.6
undici:
specifier: 'catalog:'
version: 7.27.2
version: 7.28.0
devDependencies:
'@homarr/tsconfig':
specifier: workspace:^0.1.0
@@ -1500,7 +1500,7 @@ importers:
version: 19.2.7(react@19.2.7)
undici:
specifier: 'catalog:'
version: 7.27.2
version: 7.28.0
zod:
specifier: 'catalog:'
version: 4.4.3
@@ -1923,7 +1923,7 @@ importers:
version: link:../image-proxy
'@homarr/node-unifi':
specifier: 'catalog:'
version: 2.6.0(undici@7.27.2)
version: 2.6.0(undici@7.28.0)
'@homarr/redis':
specifier: workspace:^0.1.0
version: link:../redis
@@ -1959,7 +1959,7 @@ importers:
version: 2.2.2
undici:
specifier: 'catalog:'
version: 7.27.2
version: 7.28.0
ws:
specifier: 'catalog:'
version: 8.21.0
@@ -2264,7 +2264,7 @@ importers:
version: 2.2.6
undici:
specifier: 'catalog:'
version: 7.27.2
version: 7.28.0
zod:
specifier: 'catalog:'
version: 4.4.3
@@ -7172,69 +7172,69 @@ packages:
'@tabler/icons@3.44.0':
resolution: {integrity: sha512-Wn0AOZG9sg0L+bjfMqq4eNhC6pQjIrk94LvvWYNYkY8KH8wC3YILRzQlrnVJc4FUeMxH/AK97QsYCX35H3LndA==}
'@tailwindcss/node@4.3.1':
resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
'@tailwindcss/node@4.3.2':
resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==}
'@tailwindcss/oxide-android-arm64@4.3.1':
resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==}
'@tailwindcss/oxide-android-arm64@4.3.2':
resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [android]
'@tailwindcss/oxide-darwin-arm64@4.3.1':
resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==}
'@tailwindcss/oxide-darwin-arm64@4.3.2':
resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [darwin]
'@tailwindcss/oxide-darwin-x64@4.3.1':
resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==}
'@tailwindcss/oxide-darwin-x64@4.3.2':
resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==}
engines: {node: '>= 20'}
cpu: [x64]
os: [darwin]
'@tailwindcss/oxide-freebsd-x64@4.3.1':
resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==}
'@tailwindcss/oxide-freebsd-x64@4.3.2':
resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==}
engines: {node: '>= 20'}
cpu: [x64]
os: [freebsd]
'@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==}
'@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2':
resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==}
engines: {node: '>= 20'}
cpu: [arm]
os: [linux]
'@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==}
'@tailwindcss/oxide-linux-arm64-gnu@4.3.2':
resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.3.1':
resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==}
'@tailwindcss/oxide-linux-arm64-musl@4.3.2':
resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.3.1':
resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==}
'@tailwindcss/oxide-linux-x64-gnu@4.3.2':
resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.3.1':
resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==}
'@tailwindcss/oxide-linux-x64-musl@4.3.2':
resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.3.1':
resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==}
'@tailwindcss/oxide-wasm32-wasi@4.3.2':
resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
bundledDependencies:
@@ -7245,24 +7245,24 @@ packages:
- '@emnapi/wasi-threads'
- tslib
'@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==}
'@tailwindcss/oxide-win32-arm64-msvc@4.3.2':
resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [win32]
'@tailwindcss/oxide-win32-x64-msvc@4.3.1':
resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==}
'@tailwindcss/oxide-win32-x64-msvc@4.3.2':
resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==}
engines: {node: '>= 20'}
cpu: [x64]
os: [win32]
'@tailwindcss/oxide@4.3.1':
resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==}
'@tailwindcss/oxide@4.3.2':
resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==}
engines: {node: '>= 20'}
'@tailwindcss/postcss@4.3.1':
resolution: {integrity: sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==}
'@tailwindcss/postcss@4.3.2':
resolution: {integrity: sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==}
'@tanstack/match-sorter-utils@8.19.4':
resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==}
@@ -11177,6 +11177,7 @@ packages:
jiti@2.7.0:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
joi@17.13.3:
resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
@@ -14290,8 +14291,8 @@ packages:
tailwind-merge@3.5.0:
resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==}
tailwindcss@4.3.1:
resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==}
tailwindcss@4.3.2:
resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==}
tapable@2.3.3:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
@@ -14661,6 +14662,10 @@ packages:
resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==}
engines: {node: '>=20.18.1'}
undici@7.28.0:
resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==}
engines: {node: '>=20.18.1'}
undici@8.5.0:
resolution: {integrity: sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==}
engines: {node: '>=22.19.0'}
@@ -18408,9 +18413,9 @@ snapshots:
dependencies:
'@hapi/hoek': 9.3.0
'@headlessui/tailwindcss@0.2.2(tailwindcss@4.3.1)':
'@headlessui/tailwindcss@0.2.2(tailwindcss@4.3.2)':
dependencies:
tailwindcss: 4.3.1
tailwindcss: 4.3.2
'@headlessui/vue@1.7.23(vue@3.5.35(typescript@6.0.3))':
dependencies:
@@ -18419,11 +18424,11 @@ snapshots:
'@homarr/gridstack@1.12.0': {}
'@homarr/node-unifi@2.6.0(undici@7.27.2)':
'@homarr/node-unifi@2.6.0(undici@7.28.0)':
dependencies:
axios: 1.9.0
eventemitter2: 6.4.9
http-cookie-agent: 6.0.8(tough-cookie@5.1.2)(undici@7.27.2)
http-cookie-agent: 6.0.8(tough-cookie@5.1.2)(undici@7.28.0)
tough-cookie: 5.1.2
ws: 8.21.0
transitivePeerDependencies:
@@ -20090,11 +20095,11 @@ snapshots:
'@rvf/set-get@7.0.1': {}
'@scalar/agent-chat@0.12.13(nprogress@0.2.0)(tailwindcss@4.3.1)(typescript@6.0.3)(zod@4.4.3)':
'@scalar/agent-chat@0.12.13(nprogress@0.2.0)(tailwindcss@4.3.2)(typescript@6.0.3)(zod@4.4.3)':
dependencies:
'@ai-sdk/vue': 3.0.33(vue@3.5.35(typescript@6.0.3))(zod@4.4.3)
'@scalar/api-client': 3.12.0(nprogress@0.2.0)(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/components': 0.27.4(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/api-client': 3.12.0(nprogress@0.2.0)(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/components': 0.27.4(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/helpers': 0.9.0
'@scalar/icons': 0.7.3(typescript@6.0.3)
'@scalar/json-magic': 0.12.17
@@ -20128,17 +20133,17 @@ snapshots:
- universal-cookie
- zod
'@scalar/api-client@3.12.0(nprogress@0.2.0)(tailwindcss@4.3.1)(typescript@6.0.3)':
'@scalar/api-client@3.12.0(nprogress@0.2.0)(tailwindcss@4.3.2)(typescript@6.0.3)':
dependencies:
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.1)
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.2)
'@headlessui/vue': 1.7.23(vue@3.5.35(typescript@6.0.3))
'@scalar/blocks': 0.1.0(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/components': 0.27.4(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/blocks': 0.1.0(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/components': 0.27.4(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/helpers': 0.9.0
'@scalar/icons': 0.7.3(typescript@6.0.3)
'@scalar/oas-utils': 0.19.1(typescript@6.0.3)
'@scalar/openapi-types': 0.9.1
'@scalar/sidebar': 0.9.25(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/sidebar': 0.9.25(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/snippetz': 0.9.19
'@scalar/themes': 0.16.2
'@scalar/typebox': 0.1.3
@@ -20176,9 +20181,9 @@ snapshots:
- typescript
- universal-cookie
'@scalar/api-reference-react@0.9.49(nprogress@0.2.0)(react@19.2.7)(tailwindcss@4.3.1)(typescript@6.0.3)(zod@4.4.3)':
'@scalar/api-reference-react@0.9.49(nprogress@0.2.0)(react@19.2.7)(tailwindcss@4.3.2)(typescript@6.0.3)(zod@4.4.3)':
dependencies:
'@scalar/api-reference': 1.62.0(nprogress@0.2.0)(tailwindcss@4.3.1)(typescript@6.0.3)(zod@4.4.3)
'@scalar/api-reference': 1.62.0(nprogress@0.2.0)(tailwindcss@4.3.2)(typescript@6.0.3)(zod@4.4.3)
'@scalar/types': 0.16.0
react: 19.2.7
transitivePeerDependencies:
@@ -20198,19 +20203,19 @@ snapshots:
- universal-cookie
- zod
'@scalar/api-reference@1.62.0(nprogress@0.2.0)(tailwindcss@4.3.1)(typescript@6.0.3)(zod@4.4.3)':
'@scalar/api-reference@1.62.0(nprogress@0.2.0)(tailwindcss@4.3.2)(typescript@6.0.3)(zod@4.4.3)':
dependencies:
'@headlessui/vue': 1.7.23(vue@3.5.35(typescript@6.0.3))
'@scalar/agent-chat': 0.12.13(nprogress@0.2.0)(tailwindcss@4.3.1)(typescript@6.0.3)(zod@4.4.3)
'@scalar/api-client': 3.12.0(nprogress@0.2.0)(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/blocks': 0.1.0(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/agent-chat': 0.12.13(nprogress@0.2.0)(tailwindcss@4.3.2)(typescript@6.0.3)(zod@4.4.3)
'@scalar/api-client': 3.12.0(nprogress@0.2.0)(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/blocks': 0.1.0(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/code-highlight': 0.4.0
'@scalar/components': 0.27.4(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/components': 0.27.4(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/helpers': 0.9.0
'@scalar/icons': 0.7.3(typescript@6.0.3)
'@scalar/oas-utils': 0.19.1(typescript@6.0.3)
'@scalar/schemas': 0.7.0
'@scalar/sidebar': 0.9.25(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/sidebar': 0.9.25(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/snippetz': 0.9.19
'@scalar/themes': 0.16.2
'@scalar/types': 0.16.0
@@ -20242,9 +20247,9 @@ snapshots:
- universal-cookie
- zod
'@scalar/blocks@0.1.0(tailwindcss@4.3.1)(typescript@6.0.3)':
'@scalar/blocks@0.1.0(tailwindcss@4.3.2)(typescript@6.0.3)':
dependencies:
'@scalar/components': 0.27.4(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/components': 0.27.4(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/helpers': 0.9.0
'@scalar/icons': 0.7.3(typescript@6.0.3)
'@scalar/snippetz': 0.9.19
@@ -20280,11 +20285,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@scalar/components@0.27.4(tailwindcss@4.3.1)(typescript@6.0.3)':
'@scalar/components@0.27.4(tailwindcss@4.3.2)(typescript@6.0.3)':
dependencies:
'@floating-ui/utils': 0.2.10
'@floating-ui/vue': 1.1.9(vue@3.5.35(typescript@6.0.3))
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.1)
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.2)
'@headlessui/vue': 1.7.23(vue@3.5.35(typescript@6.0.3))
'@scalar/code-highlight': 0.4.0
'@scalar/helpers': 0.9.0
@@ -20342,9 +20347,9 @@ snapshots:
'@scalar/helpers': 0.9.0
'@scalar/validation': 0.6.0
'@scalar/sidebar@0.9.25(tailwindcss@4.3.1)(typescript@6.0.3)':
'@scalar/sidebar@0.9.25(tailwindcss@4.3.2)(typescript@6.0.3)':
dependencies:
'@scalar/components': 0.27.4(tailwindcss@4.3.1)(typescript@6.0.3)
'@scalar/components': 0.27.4(tailwindcss@4.3.2)(typescript@6.0.3)
'@scalar/helpers': 0.9.0
'@scalar/icons': 0.7.3(typescript@6.0.3)
'@scalar/themes': 0.16.2
@@ -20821,7 +20826,7 @@ snapshots:
'@tabler/icons@3.44.0': {}
'@tailwindcss/node@4.3.1':
'@tailwindcss/node@4.3.2':
dependencies:
'@jridgewell/remapping': 2.3.5
enhanced-resolve: 5.21.6
@@ -20829,66 +20834,66 @@ snapshots:
lightningcss: 1.32.0
magic-string: 0.30.21
source-map-js: 1.2.1
tailwindcss: 4.3.1
tailwindcss: 4.3.2
'@tailwindcss/oxide-android-arm64@4.3.1':
'@tailwindcss/oxide-android-arm64@4.3.2':
optional: true
'@tailwindcss/oxide-darwin-arm64@4.3.1':
'@tailwindcss/oxide-darwin-arm64@4.3.2':
optional: true
'@tailwindcss/oxide-darwin-x64@4.3.1':
'@tailwindcss/oxide-darwin-x64@4.3.2':
optional: true
'@tailwindcss/oxide-freebsd-x64@4.3.1':
'@tailwindcss/oxide-freebsd-x64@4.3.2':
optional: true
'@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
'@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2':
optional: true
'@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
'@tailwindcss/oxide-linux-arm64-gnu@4.3.2':
optional: true
'@tailwindcss/oxide-linux-arm64-musl@4.3.1':
'@tailwindcss/oxide-linux-arm64-musl@4.3.2':
optional: true
'@tailwindcss/oxide-linux-x64-gnu@4.3.1':
'@tailwindcss/oxide-linux-x64-gnu@4.3.2':
optional: true
'@tailwindcss/oxide-linux-x64-musl@4.3.1':
'@tailwindcss/oxide-linux-x64-musl@4.3.2':
optional: true
'@tailwindcss/oxide-wasm32-wasi@4.3.1':
'@tailwindcss/oxide-wasm32-wasi@4.3.2':
optional: true
'@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
'@tailwindcss/oxide-win32-arm64-msvc@4.3.2':
optional: true
'@tailwindcss/oxide-win32-x64-msvc@4.3.1':
'@tailwindcss/oxide-win32-x64-msvc@4.3.2':
optional: true
'@tailwindcss/oxide@4.3.1':
'@tailwindcss/oxide@4.3.2':
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.3.1
'@tailwindcss/oxide-darwin-arm64': 4.3.1
'@tailwindcss/oxide-darwin-x64': 4.3.1
'@tailwindcss/oxide-freebsd-x64': 4.3.1
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1
'@tailwindcss/oxide-linux-arm64-gnu': 4.3.1
'@tailwindcss/oxide-linux-arm64-musl': 4.3.1
'@tailwindcss/oxide-linux-x64-gnu': 4.3.1
'@tailwindcss/oxide-linux-x64-musl': 4.3.1
'@tailwindcss/oxide-wasm32-wasi': 4.3.1
'@tailwindcss/oxide-win32-arm64-msvc': 4.3.1
'@tailwindcss/oxide-win32-x64-msvc': 4.3.1
'@tailwindcss/oxide-android-arm64': 4.3.2
'@tailwindcss/oxide-darwin-arm64': 4.3.2
'@tailwindcss/oxide-darwin-x64': 4.3.2
'@tailwindcss/oxide-freebsd-x64': 4.3.2
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2
'@tailwindcss/oxide-linux-arm64-gnu': 4.3.2
'@tailwindcss/oxide-linux-arm64-musl': 4.3.2
'@tailwindcss/oxide-linux-x64-gnu': 4.3.2
'@tailwindcss/oxide-linux-x64-musl': 4.3.2
'@tailwindcss/oxide-wasm32-wasi': 4.3.2
'@tailwindcss/oxide-win32-arm64-msvc': 4.3.2
'@tailwindcss/oxide-win32-x64-msvc': 4.3.2
'@tailwindcss/postcss@4.3.1':
'@tailwindcss/postcss@4.3.2':
dependencies:
'@alloc/quick-lru': 5.2.0
'@tailwindcss/node': 4.3.1
'@tailwindcss/oxide': 4.3.1
postcss: 8.5.15
tailwindcss: 4.3.1
'@tailwindcss/node': 4.3.2
'@tailwindcss/oxide': 4.3.2
postcss: 8.5.16
tailwindcss: 4.3.2
'@tanstack/match-sorter-utils@8.19.4':
dependencies:
@@ -24825,12 +24830,12 @@ snapshots:
http-cache-semantics@4.2.0: {}
http-cookie-agent@6.0.8(tough-cookie@5.1.2)(undici@7.27.2):
http-cookie-agent@6.0.8(tough-cookie@5.1.2)(undici@7.28.0):
dependencies:
agent-base: 7.1.3
tough-cookie: 5.1.2
optionalDependencies:
undici: 7.27.2
undici: 7.28.0
http-deceiver@1.2.7: {}
@@ -28918,7 +28923,7 @@ snapshots:
tailwind-merge@3.5.0: {}
tailwindcss@4.3.1: {}
tailwindcss@4.3.2: {}
tapable@2.3.3: {}
@@ -29309,6 +29314,8 @@ snapshots:
undici@7.27.2: {}
undici@7.28.0: {}
undici@8.5.0: {}
unhead@2.1.15:
+4 -2
View File
@@ -93,7 +93,7 @@ catalog:
"@types/video.js": ^7.3.58
"@types/ws": ^8.18.1
"@types/xml2js": ^0.4.14
posthog-js: ^1.396.1
posthog-js: ^1.396.2
posthog-node: ^4.18.0
"@vitejs/plugin-react": ^6.0.3
"@vitest/coverage-v8": ^4.1.9
@@ -179,7 +179,7 @@ catalog:
turbo: ^2.10.0
typescript: ^6.0.3
vite: ^8.1.0
undici: 7.27.2
undici: 7.28.0
use-deep-compare-effect: ^1.8.1
video.js: ^8.23.9
vite-tsconfig-paths: ^6.1.1
@@ -205,6 +205,8 @@ minimumReleaseAgeExclude:
- turbo@2.9.14
# Renovate security update: form-data@4.0.6
- form-data@4.0.6
# Renovate security update: undici@7.28.0
- undici@7.28.0
overrides:
"@babel/helpers@<7.26.10": ">=7.29.7"
"@babel/runtime@<7.26.10": ">=7.29.7"