diff --git a/.nvmrc b/.nvmrc index 1d9b7831b..6fa8dec4c 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.12.0 +22.13.0 diff --git a/Dockerfile b/Dockerfile index a799e8152..59d40428f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.12.0-alpine AS base +FROM node:22.13.0-alpine AS base FROM base AS builder RUN apk add --no-cache libc6-compat @@ -12,9 +12,6 @@ COPY . . RUN corepack enable pnpm && pnpm install --recursive --frozen-lockfile -# Install sharp for image optimization -RUN corepack enable pnpm && pnpm install sharp -w - # Copy static data as it is not part of the build COPY static-data ./static-data ARG SKIP_ENV_VALIDATION='true' @@ -42,7 +39,7 @@ RUN mkdir -p /var/cache/nginx && \ touch /run/nginx/nginx.pid && \ mkdir -p /etc/nginx/templates /etc/nginx/ssl/certs -COPY --from=builder /app/apps/nextjs/next.config.mjs . +COPY --from=builder /app/apps/nextjs/next.config.ts . COPY --from=builder /app/apps/nextjs/package.json . COPY --from=builder /app/apps/tasks/tasks.cjs ./apps/tasks/tasks.cjs diff --git a/apps/nextjs/next.config.mjs b/apps/nextjs/next.config.ts similarity index 81% rename from apps/nextjs/next.config.mjs rename to apps/nextjs/next.config.ts index bd57eb1a2..5e36315b1 100644 --- a/apps/nextjs/next.config.mjs +++ b/apps/nextjs/next.config.ts @@ -3,6 +3,7 @@ import "@homarr/auth/env.mjs"; import "@homarr/db/env.mjs"; import "@homarr/common/env.mjs"; +import type { NextConfig } from "next"; import MillionLint from "@million/lint"; import createNextIntlPlugin from "next-intl/plugin"; @@ -11,14 +12,22 @@ import "./src/env.mjs"; // Package path does not work... so we need to use relative path const withNextIntl = createNextIntlPlugin("../../packages/translation/src/request.ts"); -/** @type {import("next").NextConfig} */ -const nextConfig = { +interface WebpackConfig { + module: { + rules: { + test: RegExp; + loader: string; + }[]; + }; +} + +const nextConfig: NextConfig = { output: "standalone", reactStrictMode: true, /** We already do linting and typechecking as separate tasks in CI */ eslint: { ignoreDuringBuilds: true }, typescript: { ignoreBuildErrors: true }, - webpack: (config, { isServer }) => { + webpack: (config: WebpackConfig, { isServer }) => { if (isServer) { config.module.rules.push({ test: /\.node$/, @@ -38,6 +47,7 @@ const nextConfig = { }; // Skip transform is used because of webpack loader, without it for example 'Tooltip.Floating' will not work and show an error +// eslint-disable-next-line @typescript-eslint/no-unused-vars const withMillionLint = MillionLint.next({ rsc: true, skipTransform: true, telemetry: false }); export default withNextIntl(nextConfig); diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 9c4864f44..d43f482d0 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "pnpm with-env next build", "clean": "git clean -xdf .next .turbo node_modules", - "dev": "pnpm with-env next dev", + "dev": "pnpm with-env next dev --turbopack", "format": "prettier --check . --ignore-path ../../.gitignore", "lint": "eslint", "start": "pnpm with-env next start", @@ -23,7 +23,7 @@ "@homarr/db": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", "@homarr/form": "workspace:^0.1.0", - "@homarr/gridstack": "^1.11.2", + "@homarr/gridstack": "^1.11.3", "@homarr/integrations": "workspace:^0.1.0", "@homarr/log": "workspace:^", "@homarr/modals": "workspace:^0.1.0", @@ -38,18 +38,18 @@ "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0", - "@mantine/colors-generator": "^7.15.2", - "@mantine/core": "^7.15.2", - "@mantine/dropzone": "^7.15.2", - "@mantine/hooks": "^7.15.2", - "@mantine/modals": "^7.15.2", - "@mantine/tiptap": "^7.15.2", + "@mantine/colors-generator": "^7.15.3", + "@mantine/core": "^7.15.3", + "@mantine/dropzone": "^7.15.3", + "@mantine/hooks": "^7.15.3", + "@mantine/modals": "^7.15.3", + "@mantine/tiptap": "^7.15.3", "@million/lint": "1.0.14", "@t3-oss/env-nextjs": "^0.11.1", - "@tabler/icons-react": "^3.26.0", - "@tanstack/react-query": "^5.62.12", - "@tanstack/react-query-devtools": "^5.62.12", - "@tanstack/react-query-next-experimental": "5.62.12", + "@tabler/icons-react": "^3.28.1", + "@tanstack/react-query": "^5.63.0", + "@tanstack/react-query-devtools": "^5.63.0", + "@tanstack/react-query-next-experimental": "5.63.0", "@trpc/client": "next", "@trpc/next": "next", "@trpc/react-query": "next", @@ -62,17 +62,17 @@ "dayjs": "^1.11.13", "dotenv": "^16.4.7", "flag-icons": "^7.2.3", - "glob": "^11.0.0", + "glob": "^11.0.1", "jotai": "^2.11.0", - "mantine-react-table": "2.0.0-beta.7", - "next": "^14.2.22", + "mantine-react-table": "2.0.0-beta.8", + "next": "15.1.4", "postcss-preset-mantine": "^1.17.0", "prismjs": "^1.29.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "19.0.0", + "react-dom": "19.0.0", "react-error-boundary": "^5.0.0", "react-simple-code-editor": "^0.14.1", - "sass": "^1.83.0", + "sass": "^1.83.1", "superjson": "2.2.2", "swagger-ui-react": "^5.18.2", "use-deep-compare-effect": "^1.8.1" @@ -81,16 +81,16 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/chroma-js": "2.4.5", + "@types/chroma-js": "3.1.0", "@types/node": "^22.10.5", "@types/prismjs": "^1.26.5", - "@types/react": "^19.0.2", - "@types/react-dom": "^19.0.2", + "@types/react": "19.0.4", + "@types/react-dom": "19.0.2", "@types/swagger-ui-react": "^4.18.3", "concurrently": "^9.1.2", "eslint": "^9.17.0", "node-loader": "^2.1.0", "prettier": "^3.4.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/apps/nextjs/src/app/[locale]/_client-providers/trpc.tsx b/apps/nextjs/src/app/[locale]/_client-providers/trpc.tsx index 45249c800..52d5c10b7 100644 --- a/apps/nextjs/src/app/[locale]/_client-providers/trpc.tsx +++ b/apps/nextjs/src/app/[locale]/_client-providers/trpc.tsx @@ -18,7 +18,8 @@ import superjson from "superjson"; import type { SuperJSONResult } from "superjson"; import type { AppRouter } from "@homarr/api"; -import { clientApi, createHeadersCallbackForSource, getTrpcUrl } from "@homarr/api/client"; +import { clientApi, getTrpcUrl } from "@homarr/api/client"; +import { createHeadersCallbackForSource } from "@homarr/api/shared"; import { env } from "~/env.mjs"; diff --git a/apps/nextjs/src/app/[locale]/auth/invite/[id]/page.tsx b/apps/nextjs/src/app/[locale]/auth/invite/[id]/page.tsx index 5edeabcd0..7de11ff0f 100644 --- a/apps/nextjs/src/app/[locale]/auth/invite/[id]/page.tsx +++ b/apps/nextjs/src/app/[locale]/auth/invite/[id]/page.tsx @@ -11,15 +11,17 @@ import { HomarrLogoWithTitle } from "~/components/layout/logo/homarr-logo"; import { RegistrationForm } from "./_registration-form"; interface InviteUsagePageProps { - params: { + params: Promise<{ id: string; - }; - searchParams: { + }>; + searchParams: Promise<{ token: string; - }; + }>; } -export default async function InviteUsagePage({ params, searchParams }: InviteUsagePageProps) { +export default async function InviteUsagePage(props: InviteUsagePageProps) { + const searchParams = await props.searchParams; + const params = await props.params; if (!isProviderEnabled("credentials")) notFound(); const session = await auth(); diff --git a/apps/nextjs/src/app/[locale]/auth/login/page.tsx b/apps/nextjs/src/app/[locale]/auth/login/page.tsx index b20d3fce1..9b5dfbd83 100644 --- a/apps/nextjs/src/app/[locale]/auth/login/page.tsx +++ b/apps/nextjs/src/app/[locale]/auth/login/page.tsx @@ -9,12 +9,13 @@ import { HomarrLogoWithTitle } from "~/components/layout/logo/homarr-logo"; import { LoginForm } from "./_login-form"; interface LoginProps { - searchParams: { + searchParams: Promise<{ callbackUrl?: string; - }; + }>; } -export default async function Login({ searchParams }: LoginProps) { +export default async function Login(props: LoginProps) { + const searchParams = await props.searchParams; const session = await auth(); if (session) { diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx index e5d634e33..36818573a 100644 --- a/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx +++ b/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx @@ -31,15 +31,15 @@ import { GeneralSettingsContent } from "./_general"; import { LayoutSettingsContent } from "./_layout"; interface Props { - params: { + params: Promise<{ name: string; - }; - searchParams: { + }>; + searchParams: Promise<{ tab?: keyof TranslationObject["board"]["setting"]["section"]; - }; + }>; } -const getBoardAndPermissionsAsync = async (params: Props["params"]) => { +const getBoardAndPermissionsAsync = async (params: Awaited) => { try { const board = await api.board.getBoardByName({ name: params.name }); const { hasFullAccess } = await getBoardPermissionsAsync(board); @@ -63,7 +63,9 @@ const getBoardAndPermissionsAsync = async (params: Props["params"]) => { } }; -export default async function BoardSettingsPage({ params, searchParams }: Props) { +export default async function BoardSettingsPage(props: Props) { + const searchParams = await props.searchParams; + const params = await props.params; const { board, permissions } = await getBoardAndPermissionsAsync(params); const boardSettings = await getServerSettingByKeyAsync(db, "board"); const { hasFullAccess, hasChangeAccess } = await getBoardPermissionsAsync(board); diff --git a/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx b/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx index 9172515b9..22a4e53c0 100644 --- a/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx +++ b/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx @@ -28,9 +28,9 @@ export const createBoardLayout = ({ params, children, }: PropsWithChildren<{ - params: TParams; + params: Promise; }>) => { - const initialBoard = await getInitialBoard(params).catch((error) => { + const initialBoard = await getInitialBoard(await params).catch((error) => { if (error instanceof TRPCError && error.code === "NOT_FOUND") { logger.warn(error); notFound(); diff --git a/apps/nextjs/src/app/[locale]/layout.tsx b/apps/nextjs/src/app/[locale]/layout.tsx index afa2e413e..6469ddd39 100644 --- a/apps/nextjs/src/app/[locale]/layout.tsx +++ b/apps/nextjs/src/app/[locale]/layout.tsx @@ -14,6 +14,7 @@ import { auth } from "@homarr/auth/next"; import { ModalProvider } from "@homarr/modals"; import { Notifications } from "@homarr/notifications"; import { SpotlightProvider } from "@homarr/spotlight"; +import type { SupportedLanguage } from "@homarr/translation"; import { isLocaleRTL, isLocaleSupported } from "@homarr/translation"; import { getI18nMessages } from "@homarr/translation/server"; @@ -63,14 +64,17 @@ export const viewport: Viewport = { ], }; -export default async function Layout(props: { children: React.ReactNode; params: { locale: string } }) { - if (!isLocaleSupported(props.params.locale)) { +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ locale: SupportedLanguage }>; +}) { + if (!isLocaleSupported((await props.params).locale)) { notFound(); } const session = await auth(); const colorScheme = await getCurrentColorSchemeAsync(); - const direction = isLocaleRTL(props.params.locale) ? "rtl" : "ltr"; + const direction = isLocaleRTL((await props.params).locale) ? "rtl" : "ltr"; const i18nMessages = await getI18nMessages(); const StackedProvider = composeWrappers([ @@ -89,7 +93,7 @@ export default async function Layout(props: { children: React.ReactNode; params: return ( // Instead of ColorSchemScript we use data-mantine-color-scheme to prevent flickering { +const getHostAsync = async () => { if (process.env.HOSTNAME) { return `${process.env.HOSTNAME}:3000`; } - return headers().get("host"); + return (await headers()).get("host"); }; export default async function AboutPage() { - const baseServerUrl = `http://${getHost()}`; + const baseServerUrl = `http://${await getHostAsync()}`; const t = await getScopedI18n("management.page.about"); const attributes = await getPackageAttributesAsync(); const githubContributors = (await fetch(`${baseServerUrl}/api/about/contributors/github`).then((res) => diff --git a/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/page.tsx b/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/page.tsx index f5fbc5d6f..a931b2ece 100644 --- a/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/page.tsx @@ -9,10 +9,11 @@ import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; import { AppEditForm } from "./_app-edit-form"; interface AppEditPageProps { - params: { id: string }; + params: Promise<{ id: string }>; } -export default async function AppEditPage({ params }: AppEditPageProps) { +export default async function AppEditPage(props: AppEditPageProps) { + const params = await props.params; const session = await auth(); if (!session?.user.permissions.includes("app-modify-all")) { diff --git a/apps/nextjs/src/app/[locale]/manage/apps/page.tsx b/apps/nextjs/src/app/[locale]/manage/apps/page.tsx index f95882a56..5193166f3 100644 --- a/apps/nextjs/src/app/[locale]/manage/apps/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/apps/page.tsx @@ -6,7 +6,10 @@ import { IconBox, IconPencil } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; +import type { inferSearchParamsFromSchema } from "@homarr/common/types"; import { getI18n, getScopedI18n } from "@homarr/translation/server"; +import { SearchInput, TablePagination } from "@homarr/ui"; +import { z } from "@homarr/validation"; import { ManageContainer } from "~/components/manage/manage-container"; import { MobileAffixButton } from "~/components/manage/mobile-affix-button"; @@ -14,22 +17,35 @@ import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; import { NoResults } from "~/components/no-results"; import { AppDeleteButton } from "./_app-delete-button"; -export default async function AppsPage() { +const searchParamsSchema = z.object({ + search: z.string().optional(), + pageSize: z.string().regex(/\d+/).transform(Number).catch(10), + page: z.string().regex(/\d+/).transform(Number).catch(1), +}); + +interface AppsPageProps { + searchParams: Promise>; +} + +export default async function AppsPage(props: AppsPageProps) { const session = await auth(); if (!session) { redirect("/auth/login"); } - const apps = await api.app.all(); + const searchParams = searchParamsSchema.parse(await props.searchParams); + + const { items: apps, totalCount } = await api.app.getPaginated(searchParams); const t = await getScopedI18n("app"); return ( + {t("page.list.title")} - {t("page.list.title")} + {session.user.permissions.includes("app-create") && ( {t("page.create.title")} @@ -44,6 +60,10 @@ export default async function AppsPage() { ))} )} + + + + ); diff --git a/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx b/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx index dd7794db8..eef7dedb2 100644 --- a/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx +++ b/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx @@ -3,12 +3,14 @@ import { useCallback } from "react"; import Link from "next/link"; import { Menu } from "@mantine/core"; -import { IconHome, IconSettings, IconTrash } from "@tabler/icons-react"; +import { IconCopy, IconHome, IconSettings, IconTrash } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; +import { useSession } from "@homarr/auth/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; -import { useConfirmModal } from "@homarr/modals"; +import { useConfirmModal, useModalAction } from "@homarr/modals"; +import { DuplicateBoardModal } from "@homarr/modals-collection"; import { useScopedI18n } from "@homarr/translation/client"; import { useBoardPermissions } from "~/components/board/permissions/client"; @@ -30,8 +32,10 @@ export const BoardCardMenuDropdown = ({ board }: BoardCardMenuDropdownProps) => const tCommon = useScopedI18n("common"); const { hasFullAccess, hasChangeAccess } = useBoardPermissions(board); + const { data: session } = useSession(); const { openConfirmModal } = useConfirmModal(); + const { openModal: openDuplicateModal } = useModalAction(DuplicateBoardModal); const setHomeBoardMutation = clientApi.board.setHomeBoard.useMutation({ onSettled: async () => { @@ -64,11 +68,28 @@ export const BoardCardMenuDropdown = ({ board }: BoardCardMenuDropdownProps) => await setHomeBoardMutation.mutateAsync({ id: board.id }); }, [board.id, setHomeBoardMutation]); + const handleDuplicateBoard = useCallback(() => { + openDuplicateModal({ + board: { + id: board.id, + name: board.name, + }, + onSuccess: async () => { + await revalidatePathActionAsync("/manage/boards"); + }, + }); + }, [board.id, board.name, openDuplicateModal]); + return ( }> {t("setHomeBoard.label")} + {session?.user.permissions.includes("board-create") && ( + }> + {t("duplicate.label")} + + )} {hasChangeAccess && ( <> diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/page.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/page.tsx index ede3d7a71..8cd8bf01b 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/page.tsx @@ -11,10 +11,11 @@ import { IntegrationAccessSettings } from "../../_components/integration-access- import { EditIntegrationForm } from "./_integration-edit-form"; interface EditIntegrationPageProps { - params: { id: string }; + params: Promise<{ id: string }>; } -export default async function EditIntegrationPage({ params }: EditIntegrationPageProps) { +export default async function EditIntegrationPage(props: EditIntegrationPageProps) { + const params = await props.params; const editT = await getScopedI18n("integration.page.edit"); const t = await getI18n(); const integration = await api.integration.byId({ id: params.id }).catch(catchTrpcNotFound); diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx index fc77ba479..4237c1422 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx @@ -13,12 +13,15 @@ import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; import { NewIntegrationForm } from "./_integration-new-form"; interface NewIntegrationPageProps { - searchParams: Partial> & { - kind: IntegrationKind; - }; + searchParams: Promise< + Partial> & { + kind: IntegrationKind; + } + >; } -export default async function IntegrationsNewPage({ searchParams }: NewIntegrationPageProps) { +export default async function IntegrationsNewPage(props: NewIntegrationPageProps) { + const searchParams = await props.searchParams; const session = await auth(); if (!session?.user.permissions.includes("integration-create")) { notFound(); diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx index 853630698..38a0a2cdf 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx @@ -46,12 +46,13 @@ import { DeleteIntegrationActionButton } from "./_integration-buttons"; import { IntegrationCreateDropdownContent } from "./new/_integration-new-dropdown"; interface IntegrationsPageProps { - searchParams: { + searchParams: Promise<{ tab?: IntegrationKind; - }; + }>; } -export default async function IntegrationsPage({ searchParams }: IntegrationsPageProps) { +export default async function IntegrationsPage(props: IntegrationsPageProps) { + const searchParams = await props.searchParams; const session = await auth(); if (!session) { diff --git a/apps/nextjs/src/app/[locale]/manage/medias/_actions/upload-media.tsx b/apps/nextjs/src/app/[locale]/manage/medias/_actions/upload-media.tsx index 72b880fc9..f8164cdac 100644 --- a/apps/nextjs/src/app/[locale]/manage/medias/_actions/upload-media.tsx +++ b/apps/nextjs/src/app/[locale]/manage/medias/_actions/upload-media.tsx @@ -1,15 +1,40 @@ "use client"; +import type { JSX } from "react"; import { Button, FileButton } from "@mantine/core"; import { IconUpload } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; +import type { MaybePromise } from "@homarr/common/types"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { useI18n } from "@homarr/translation/client"; import { supportedMediaUploadFormats } from "@homarr/validation"; -export const UploadMedia = () => { +export const UploadMediaButton = () => { + const t = useI18n(); + const onSettledAsync = async () => { + await revalidatePathActionAsync("/manage/medias"); + }; + + return ( + + {({ onClick, loading }) => ( + + )} + + ); +}; + +interface UploadMediaProps { + children: (props: { onClick: () => void; loading: boolean }) => JSX.Element; + onSettled?: () => MaybePromise; + onSuccess?: (media: { id: string; url: string }) => MaybePromise; +} + +export const UploadMedia = ({ children, onSettled, onSuccess }: UploadMediaProps) => { const t = useI18n(); const { mutateAsync, isPending } = clientApi.media.uploadMedia.useMutation(); @@ -18,10 +43,14 @@ export const UploadMedia = () => { const formData = new FormData(); formData.append("file", file); await mutateAsync(formData, { - onSuccess() { + async onSuccess(mediaId) { showSuccessNotification({ message: t("media.action.upload.notification.success.message"), }); + await onSuccess?.({ + id: mediaId, + url: `/api/user-medias/${mediaId}`, + }); }, onError() { showErrorNotification({ @@ -29,18 +58,14 @@ export const UploadMedia = () => { }); }, async onSettled() { - await revalidatePathActionAsync("/manage/medias"); + await onSettled?.(); }, }); }; return ( - {({ onClick }) => ( - - )} + {({ onClick }) => children({ onClick, loading: isPending })} ); }; diff --git a/apps/nextjs/src/app/[locale]/manage/medias/page.tsx b/apps/nextjs/src/app/[locale]/manage/medias/page.tsx index 5052194c9..102e54cd8 100644 --- a/apps/nextjs/src/app/[locale]/manage/medias/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/medias/page.tsx @@ -7,6 +7,7 @@ import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; import { humanFileSize } from "@homarr/common"; +import type { inferSearchParamsFromSchema } from "@homarr/common/types"; import { getI18n } from "@homarr/translation/server"; import { SearchInput, TablePagination, UserAvatar } from "@homarr/ui"; import { z } from "@homarr/validation"; @@ -16,7 +17,7 @@ import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; import { CopyMedia } from "./_actions/copy-media"; import { DeleteMedia } from "./_actions/delete-media"; import { IncludeFromAllUsersSwitch } from "./_actions/show-all"; -import { UploadMedia } from "./_actions/upload-media"; +import { UploadMediaButton } from "./_actions/upload-media"; const searchParamsSchema = z.object({ search: z.string().optional(), @@ -29,12 +30,8 @@ const searchParamsSchema = z.object({ page: z.string().regex(/\d+/).transform(Number).catch(1), }); -type SearchParamsSchemaInputFromSchema> = Partial<{ - [K in keyof TSchema]: Exclude extends unknown[] ? string[] : string; -}>; - interface MediaListPageProps { - searchParams: SearchParamsSchemaInputFromSchema>; + searchParams: Promise>; } export default async function GroupsListPage(props: MediaListPageProps) { @@ -45,7 +42,7 @@ export default async function GroupsListPage(props: MediaListPageProps) { } const t = await getI18n(); - const searchParams = searchParamsSchema.parse(props.searchParams); + const searchParams = searchParamsSchema.parse(await props.searchParams); const { items: medias, totalCount } = await api.media.getPaginated(searchParams); return ( @@ -61,7 +58,7 @@ export default async function GroupsListPage(props: MediaListPageProps) { )} - {session.user.permissions.includes("media-upload") && } + {session.user.permissions.includes("media-upload") && } diff --git a/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/page.tsx b/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/page.tsx index 39dfd8f63..9d618ad82 100644 --- a/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/page.tsx @@ -10,10 +10,11 @@ import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; import { SearchEngineEditForm } from "./_search-engine-edit-form"; interface SearchEngineEditPageProps { - params: { id: string }; + params: Promise<{ id: string }>; } -export default async function SearchEngineEditPage({ params }: SearchEngineEditPageProps) { +export default async function SearchEngineEditPage(props: SearchEngineEditPageProps) { + const params = await props.params; const session = await auth(); if (!session?.user.permissions.includes("search-engine-modify-all")) { diff --git a/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx b/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx index 8fe7254ec..8caeefbe7 100644 --- a/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx @@ -6,6 +6,7 @@ import { IconPencil, IconSearch } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; +import type { inferSearchParamsFromSchema } from "@homarr/common/types"; import { getI18n, getScopedI18n } from "@homarr/translation/server"; import { SearchInput, TablePagination } from "@homarr/ui"; import { z } from "@homarr/validation"; @@ -22,12 +23,8 @@ const searchParamsSchema = z.object({ page: z.string().regex(/\d+/).transform(Number).catch(1), }); -type SearchParamsSchemaInputFromSchema> = Partial<{ - [K in keyof TSchema]: Exclude extends unknown[] ? string[] : string; -}>; - interface SearchEnginesPageProps { - searchParams: SearchParamsSchemaInputFromSchema>; + searchParams: Promise>; } export default async function SearchEnginesPage(props: SearchEnginesPageProps) { @@ -37,7 +34,7 @@ export default async function SearchEnginesPage(props: SearchEnginesPageProps) { redirect("/auth/login"); } - const searchParams = searchParamsSchema.parse(props.searchParams); + const searchParams = searchParamsSchema.parse(await props.searchParams); const { items: searchEngines, totalCount } = await api.searchEngine.getPaginated(searchParams); const tEngine = await getScopedI18n("search.engine"); diff --git a/apps/nextjs/src/app/[locale]/manage/settings/_components/search-settings-form.tsx b/apps/nextjs/src/app/[locale]/manage/settings/_components/search-settings-form.tsx new file mode 100644 index 000000000..a39cab70d --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/settings/_components/search-settings-form.tsx @@ -0,0 +1,29 @@ +"use client"; + +import { Select } from "@mantine/core"; + +import { clientApi } from "@homarr/api/client"; +import type { ServerSettings } from "@homarr/server-settings"; +import { useScopedI18n } from "@homarr/translation/client"; + +import { CommonSettingsForm } from "./common-form"; + +export const SearchSettingsForm = ({ defaultValues }: { defaultValues: ServerSettings["search"] }) => { + const tSearch = useScopedI18n("management.page.settings.section.search"); + const [selectableSearchEngines] = clientApi.searchEngine.getSelectable.useSuspenseQuery({ withIntegrations: false }); + + return ( + + {(form) => ( + <> + + + + + + + + ); +}; + +type FormType = z.infer; diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx index e41d38536..8753412b2 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx @@ -11,6 +11,7 @@ import { DangerZoneItem, DangerZoneRoot } from "~/components/manage/danger-zone" import { catchTrpcNotFound } from "~/errors/trpc-catch-error"; import { createMetaTitle } from "~/metadata"; import { canAccessUserEditPage } from "../access"; +import { ChangeDefaultSearchEngineForm } from "./_components/_change-default-search-engine"; import { ChangeHomeBoardForm } from "./_components/_change-home-board"; import { DeleteUserButton } from "./_components/_delete-user-button"; import { FirstDayOfWeek } from "./_components/_first-day-of-week"; @@ -19,12 +20,13 @@ import { UserProfileAvatarForm } from "./_components/_profile-avatar-form"; import { UserProfileForm } from "./_components/_profile-form"; interface Props { - params: { + params: Promise<{ userId: string; - }; + }>; } -export async function generateMetadata({ params }: Props) { +export async function generateMetadata(props: Props) { + const params = await props.params; const session = await auth(); const user = await api.user .getById({ @@ -43,7 +45,8 @@ export async function generateMetadata({ params }: Props) { }; } -export default async function EditUserPage({ params }: Props) { +export default async function EditUserPage(props: Props) { + const params = await props.params; const t = await getI18n(); const tGeneral = await getScopedI18n("management.page.user.setting.general"); const session = await auth(); @@ -58,6 +61,7 @@ export default async function EditUserPage({ params }: Props) { } const boards = await api.board.getAllBoards(); + const searchEngines = await api.searchEngine.getSelectable(); const isCredentialsUser = user.provider === "credentials"; @@ -95,6 +99,11 @@ export default async function EditUserPage({ params }: Props) { /> + + {tGeneral("item.defaultSearchEngine")} + + + {tGeneral("item.firstDayOfWeek")} diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/layout.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/layout.tsx index c7158379d..e2a43ccef 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/layout.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/layout.tsx @@ -15,10 +15,14 @@ import { NavigationLink } from "../groups/[id]/_navigation"; import { canAccessUserEditPage } from "./access"; interface LayoutProps { - params: { userId: string }; + params: Promise<{ userId: string }>; } -export default async function Layout({ children, params }: PropsWithChildren) { +export default async function Layout(props: PropsWithChildren) { + const params = await props.params; + + const { children } = props; + const session = await auth(); const t = await getI18n(); const tUser = await getScopedI18n("management.page.user"); diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/security/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/security/page.tsx index 9897268b2..f3098258b 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/security/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/security/page.tsx @@ -10,12 +10,13 @@ import { canAccessUserEditPage } from "../access"; import { ChangePasswordForm } from "./_components/_change-password-form"; interface Props { - params: { + params: Promise<{ userId: string; - }; + }>; } -export default async function UserSecurityPage({ params }: Props) { +export default async function UserSecurityPage(props: Props) { + const params = await props.params; const session = await auth(); const tSecurity = await getScopedI18n("management.page.user.setting.security"); const user = await api.user diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/layout.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/layout.tsx index 42d9acbc6..c10037abd 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/layout.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/layout.tsx @@ -10,10 +10,14 @@ import { ManageContainer } from "~/components/manage/manage-container"; import { NavigationLink } from "./_navigation"; interface LayoutProps { - params: { id: string }; + params: Promise<{ id: string }>; } -export default async function Layout({ children, params }: PropsWithChildren) { +export default async function Layout(props: PropsWithChildren) { + const params = await props.params; + + const { children } = props; + const t = await getI18n(); const tGroup = await getScopedI18n("management.page.group"); const group = await api.group.getById({ id: params.id }); diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx index 11c6d1dad..9609a2089 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx @@ -17,15 +17,17 @@ import { AddGroupMember } from "./_add-group-member"; import { RemoveGroupMember } from "./_remove-group-member"; interface GroupsDetailPageProps { - params: { + params: Promise<{ id: string; - }; - searchParams: { + }>; + searchParams: Promise<{ search: string | undefined; - }; + }>; } -export default async function GroupsDetailPage({ params, searchParams }: GroupsDetailPageProps) { +export default async function GroupsDetailPage(props: GroupsDetailPageProps) { + const searchParams = await props.searchParams; + const params = await props.params; const session = await auth(); if (!session?.user.permissions.includes("admin")) { diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/page.tsx index 8ec60e2f3..9a99aebc7 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/page.tsx @@ -14,12 +14,13 @@ import { ReservedGroupAlert } from "./_reserved-group-alert"; import { TransferGroupOwnership } from "./_transfer-group-ownership"; interface GroupsDetailPageProps { - params: { + params: Promise<{ id: string; - }; + }>; } -export default async function GroupsDetailPage({ params }: GroupsDetailPageProps) { +export default async function GroupsDetailPage(props: GroupsDetailPageProps) { + const params = await props.params; const session = await auth(); if (!session?.user.permissions.includes("admin")) { diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/permissions/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/permissions/page.tsx index f44397ab4..037c040c9 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/permissions/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/permissions/page.tsx @@ -12,12 +12,13 @@ import { getI18n, getScopedI18n } from "@homarr/translation/server"; import { PermissionForm, PermissionSwitch, SaveAffix } from "./_group-permission-form"; interface GroupPermissionsPageProps { - params: { + params: Promise<{ id: string; - }; + }>; } -export default async function GroupPermissionsPage({ params }: GroupPermissionsPageProps) { +export default async function GroupPermissionsPage(props: GroupPermissionsPageProps) { + const params = await props.params; const session = await auth(); if (!session?.user.permissions.includes("admin")) { diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/page.tsx index 3fce6db2a..d1113bf4f 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/page.tsx @@ -5,6 +5,7 @@ import { Anchor, Group, Stack, Table, TableTbody, TableTd, TableTh, TableThead, import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; +import type { inferSearchParamsFromSchema } from "@homarr/common/types"; import { getI18n } from "@homarr/translation/server"; import { SearchInput, TablePagination, UserAvatarGroup } from "@homarr/ui"; import { z } from "@homarr/validation"; @@ -19,12 +20,8 @@ const searchParamsSchema = z.object({ page: z.string().regex(/\d+/).transform(Number).catch(1), }); -type SearchParamsSchemaInputFromSchema> = Partial<{ - [K in keyof TSchema]: Exclude extends unknown[] ? string[] : string; -}>; - interface GroupsListPageProps { - searchParams: SearchParamsSchemaInputFromSchema>; + searchParams: Promise>; } export default async function GroupsListPage(props: GroupsListPageProps) { @@ -35,7 +32,7 @@ export default async function GroupsListPage(props: GroupsListPageProps) { } const t = await getI18n(); - const searchParams = searchParamsSchema.parse(props.searchParams); + const searchParams = searchParamsSchema.parse(await props.searchParams); const { items: groups, totalCount } = await api.group.getPaginated(searchParams); return ( diff --git a/apps/nextjs/src/app/[locale]/widgets/[kind]/page.tsx b/apps/nextjs/src/app/[locale]/widgets/[kind]/page.tsx index 87be98a9b..bc3af8b27 100644 --- a/apps/nextjs/src/app/[locale]/widgets/[kind]/page.tsx +++ b/apps/nextjs/src/app/[locale]/widgets/[kind]/page.tsx @@ -9,11 +9,11 @@ import { env } from "~/env.mjs"; import { WidgetPreviewPageContent } from "./_content"; interface Props { - params: { kind: string }; + params: Promise<{ kind: string }>; } export default async function WidgetPreview(props: Props) { - if (!(props.params.kind in widgetImports || env.NODE_ENV !== "development")) { + if (!((await props.params).kind in widgetImports || env.NODE_ENV !== "development")) { notFound(); } @@ -26,7 +26,7 @@ export default async function WidgetPreview(props: Props) { }, }); - const sort = props.params.kind as WidgetKind; + const sort = (await props.params).kind as WidgetKind; return (
diff --git a/apps/nextjs/src/app/api/[...trpc]/route.ts b/apps/nextjs/src/app/api/[...trpc]/route.ts index 8d1d30f26..42a09e316 100644 --- a/apps/nextjs/src/app/api/[...trpc]/route.ts +++ b/apps/nextjs/src/app/api/[...trpc]/route.ts @@ -1,11 +1,10 @@ -import { headers } from "next/headers"; -import { userAgent } from "next/server"; import type { NextRequest } from "next/server"; +import { userAgent } from "next/server"; import { createOpenApiFetchHandler } from "trpc-to-openapi"; import { appRouter, createTRPCContext } from "@homarr/api"; -import { hashPasswordAsync } from "@homarr/auth"; import type { Session } from "@homarr/auth"; +import { hashPasswordAsync } from "@homarr/auth"; import { createSessionAsync } from "@homarr/auth/server"; import { db, eq } from "@homarr/db"; import { apiKeys } from "@homarr/db/schema"; @@ -13,7 +12,7 @@ import { logger } from "@homarr/log"; const handlerAsync = async (req: NextRequest) => { const apiKeyHeaderValue = req.headers.get("ApiKey"); - const ipAddress = req.ip ?? headers().get("x-forwarded-for"); + const ipAddress = req.headers.get("x-forwarded-for"); const { ua } = userAgent(req); const session: Session | null = await getSessionOrDefaultFromHeadersAsync(apiKeyHeaderValue, ipAddress, ua); @@ -88,9 +87,9 @@ const getSessionOrDefaultFromHeadersAsync = async ( }; export { + handlerAsync as DELETE, handlerAsync as GET, + handlerAsync as PATCH, handlerAsync as POST, handlerAsync as PUT, - handlerAsync as DELETE, - handlerAsync as PATCH, }; diff --git a/apps/nextjs/src/app/api/auth/[...nextauth]/route.ts b/apps/nextjs/src/app/api/auth/[...nextauth]/route.ts index ec6065d0c..e04a79859 100644 --- a/apps/nextjs/src/app/api/auth/[...nextauth]/route.ts +++ b/apps/nextjs/src/app/api/auth/[...nextauth]/route.ts @@ -1,16 +1,17 @@ import { NextRequest } from "next/server"; -import { createHandlers } from "@homarr/auth"; +import { createHandlersAsync } from "@homarr/auth"; import type { SupportedAuthProvider } from "@homarr/definitions"; import { logger } from "@homarr/log"; export const GET = async (req: NextRequest) => { - return await createHandlers(extractProvider(req), isSecureCookieEnabled(req)).handlers.GET(reqWithTrustedOrigin(req)); + const { handlers } = await createHandlersAsync(extractProvider(req), isSecureCookieEnabled(req)); + + return await handlers.GET(reqWithTrustedOrigin(req)); }; export const POST = async (req: NextRequest) => { - return await createHandlers(extractProvider(req), isSecureCookieEnabled(req)).handlers.POST( - reqWithTrustedOrigin(req), - ); + const { handlers } = await createHandlersAsync(extractProvider(req), isSecureCookieEnabled(req)); + return await handlers.POST(reqWithTrustedOrigin(req)); }; /** diff --git a/apps/nextjs/src/app/api/user-medias/[id]/route.ts b/apps/nextjs/src/app/api/user-medias/[id]/route.ts index 751895381..f00b3e089 100644 --- a/apps/nextjs/src/app/api/user-medias/[id]/route.ts +++ b/apps/nextjs/src/app/api/user-medias/[id]/route.ts @@ -5,7 +5,8 @@ import type { NextRequest } from "next/server"; import { db, eq } from "@homarr/db"; import { medias } from "@homarr/db/schema"; -export async function GET(_req: NextRequest, { params }: { params: { id: string } }) { +export async function GET(_req: NextRequest, props: { params: Promise<{ id: string }> }) { + const params = await props.params; const image = await db.query.medias.findFirst({ where: eq(medias.id, params.id), columns: { diff --git a/apps/nextjs/src/components/board/items/item-content.tsx b/apps/nextjs/src/components/board/items/item-content.tsx index bd9d7c8e3..db9323c66 100644 --- a/apps/nextjs/src/components/board/items/item-content.tsx +++ b/apps/nextjs/src/components/board/items/item-content.tsx @@ -36,6 +36,7 @@ export const BoardItemContent = ({ item }: BoardItemContentProps) => { root: { "--opacity": board.opacity / 100, containerType: "size", + overflow: item.kind === "iframe" ? "hidden" : undefined, }, }} p={0} @@ -87,7 +88,14 @@ const InnerContent = ({ item, ...dimensions }: InnerContentProps) => { isEditMode={isEditMode} boardId={board.id} itemId={item.id} - setOptions={updateOptions} + setOptions={(partialNewOptions) => + updateOptions({ + newOptions: { + ...partialNewOptions.newOptions, + ...options, + }, + }) + } {...dimensions} /> diff --git a/apps/nextjs/src/components/board/items/item-select-modal.tsx b/apps/nextjs/src/components/board/items/item-select-modal.tsx index 3789ebca3..a2fce1264 100644 --- a/apps/nextjs/src/components/board/items/item-select-modal.tsx +++ b/apps/nextjs/src/components/board/items/item-select-modal.tsx @@ -1,21 +1,67 @@ -import { Button, Card, Center, Grid, Stack, Text } from "@mantine/core"; +import { useMemo, useState } from "react"; +import { Button, Card, Center, Grid, Input, Stack, Text } from "@mantine/core"; +import { IconSearch } from "@tabler/icons-react"; import { objectEntries } from "@homarr/common"; import type { WidgetKind } from "@homarr/definitions"; import { createModal } from "@homarr/modals"; import { useI18n } from "@homarr/translation/client"; +import type { TablerIcon } from "@homarr/ui"; import { widgetImports } from "@homarr/widgets"; -import type { WidgetDefinition } from "@homarr/widgets"; import { useItemActions } from "./item-actions"; export const ItemSelectModal = createModal(({ actions }) => { + const [search, setSearch] = useState(""); + const t = useI18n(); + const { createItem } = useItemActions(); + + const items = useMemo( + () => + objectEntries(widgetImports) + .map(([kind, value]) => ({ + kind, + icon: value.definition.icon, + name: t(`widget.${kind}.name`), + description: t(`widget.${kind}.description`), + })) + .sort((itemA, itemB) => itemA.name.localeCompare(itemB.name)), + [t], + ); + + const filteredItems = useMemo( + () => items.filter((item) => item.name.toLowerCase().includes(search.toLowerCase())), + [items, search], + ); + + const handleAdd = (kind: WidgetKind) => { + createItem({ kind }); + actions.closeModal(); + }; + return ( - - {objectEntries(widgetImports).map(([key, value]) => { - return ; - })} - + + setSearch(event.currentTarget.value)} + leftSection={} + placeholder={`${t("item.create.search")}...`} + data-autofocus + onKeyDown={(event) => { + // Add item if there is only one item in the list and user presses Enter + if (event.key === "Enter" && filteredItems.length === 1) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + handleAdd(filteredItems[0]!.kind); + } + }} + /> + + + {filteredItems.map((item) => ( + handleAdd(item.kind)} /> + ))} + + ); }).withOptions({ defaultTitle: (t) => t("item.create.title"), @@ -23,20 +69,18 @@ export const ItemSelectModal = createModal(({ actions }) => { }); const WidgetItem = ({ - kind, - definition, - closeModal, + item, + onSelect, }: { - kind: WidgetKind; - definition: WidgetDefinition; - closeModal: () => void; + item: { + kind: WidgetKind; + name: string; + description: string; + icon: TablerIcon; + }; + onSelect: () => void; }) => { const t = useI18n(); - const { createItem } = useItemActions(); - const handleAdd = (kind: WidgetKind) => { - createItem({ kind }); - closeModal(); - }; return ( @@ -44,25 +88,16 @@ const WidgetItem = ({
- +
- {t(`widget.${kind}.name`)} + {item.name} - {t(`widget.${kind}.description`)} + {item.description}
-
diff --git a/apps/nextjs/src/components/icons/picker/icon-picker.tsx b/apps/nextjs/src/components/icons/picker/icon-picker.tsx index 432142dbf..d0758a66e 100644 --- a/apps/nextjs/src/components/icons/picker/icon-picker.tsx +++ b/apps/nextjs/src/components/icons/picker/icon-picker.tsx @@ -1,10 +1,12 @@ import type { FocusEventHandler } from "react"; import { startTransition, useState } from "react"; import { + ActionIcon, Box, Card, Combobox, Flex, + Group, Image, Indicator, InputBase, @@ -16,10 +18,13 @@ import { useCombobox, } from "@mantine/core"; import { useDebouncedValue } from "@mantine/hooks"; +import { IconUpload } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; +import { useSession } from "@homarr/auth/client"; import { useScopedI18n } from "@homarr/translation/client"; +import { UploadMedia } from "~/app/[locale]/manage/medias/_actions/upload-media"; import classes from "./icon-picker.module.css"; interface IconPickerProps { @@ -34,6 +39,7 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I const [value, setValue] = useState(initialValue ?? ""); const [search, setSearch] = useState(initialValue ?? ""); const [previewUrl, setPreviewUrl] = useState(initialValue ?? null); + const { data: session } = useSession(); const tCommon = useScopedI18n("common"); @@ -105,40 +111,61 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I return ( - } - leftSection={ - previewUrl ? ( - // eslint-disable-next-line @next/next/no-img-element - - ) : null - } - value={search} - onChange={(event) => { - combobox.openDropdown(); - combobox.updateSelectedOptionIndex(); - setSearch(event.currentTarget.value); - setValue(event.currentTarget.value); - setPreviewUrl(null); - onChange(event.currentTarget.value); - }} - onClick={() => combobox.openDropdown()} - onFocus={(event) => { - onFocus?.(event); - combobox.openDropdown(); - }} - onBlur={(event) => { - onBlur?.(event); - combobox.closeDropdown(); - setPreviewUrl(value); - setSearch(value || ""); - }} - rightSectionPointerEvents="none" - withAsterisk - error={error} - label={tCommon("iconPicker.label")} - placeholder={tCommon("iconPicker.header", { countIcons: data?.countIcons ?? 0 })} - /> + + } + leftSection={ + previewUrl ? ( + // eslint-disable-next-line @next/next/no-img-element + + ) : null + } + value={search} + onChange={(event) => { + combobox.openDropdown(); + combobox.updateSelectedOptionIndex(); + setSearch(event.currentTarget.value); + setValue(event.currentTarget.value); + setPreviewUrl(null); + onChange(event.currentTarget.value); + }} + onClick={() => combobox.openDropdown()} + onFocus={(event) => { + onFocus?.(event); + combobox.openDropdown(); + }} + onBlur={(event) => { + onBlur?.(event); + combobox.closeDropdown(); + setPreviewUrl(value); + setSearch(value || ""); + }} + rightSectionPointerEvents="none" + withAsterisk + error={error} + label={tCommon("iconPicker.label")} + placeholder={tCommon("iconPicker.header", { countIcons: data?.countIcons ?? 0 })} + /> + {session?.user.permissions.includes("media-upload") && ( + { + startTransition(() => { + setValue(url); + setPreviewUrl(url); + setSearch(url); + onChange(url); + }); + }} + > + {({ onClick, loading }) => ( + + + + )} + + )} + diff --git a/apps/nextjs/src/components/user-avatar-menu.tsx b/apps/nextjs/src/components/user-avatar-menu.tsx index df5f63549..d7a53f901 100644 --- a/apps/nextjs/src/components/user-avatar-menu.tsx +++ b/apps/nextjs/src/components/user-avatar-menu.tsx @@ -88,7 +88,7 @@ export const UserAvatarMenu = ({ children, availableUpdates }: UserAvatarMenuPro - + @@ -113,7 +113,7 @@ export const UserAvatarMenu = ({ children, availableUpdates }: UserAvatarMenuPro {t("logout")} ) : ( - router.push("/auth/login")} leftSection={}> + }> {t("login")} )} diff --git a/apps/nextjs/src/middleware.ts b/apps/nextjs/src/middleware.ts index 7d38cfa48..8db4c4108 100644 --- a/apps/nextjs/src/middleware.ts +++ b/apps/nextjs/src/middleware.ts @@ -4,7 +4,7 @@ import { createTRPCClient, httpLink } from "@trpc/client"; import SuperJSON from "superjson"; import type { AppRouter } from "@homarr/api"; -import { createHeadersCallbackForSource } from "@homarr/api/client"; +import { createHeadersCallbackForSource } from "@homarr/api/shared"; import { createI18nMiddleware } from "@homarr/translation/middleware"; export async function middleware(request: NextRequest) { diff --git a/apps/nextjs/src/theme/color-scheme.ts b/apps/nextjs/src/theme/color-scheme.ts index 4f069a1ef..284b636b4 100644 --- a/apps/nextjs/src/theme/color-scheme.ts +++ b/apps/nextjs/src/theme/color-scheme.ts @@ -7,7 +7,7 @@ import type { ColorScheme } from "@homarr/definitions"; import { colorSchemeCookieKey } from "@homarr/definitions"; export const getCurrentColorSchemeAsync = cache(async () => { - const cookieValue = cookies().get(colorSchemeCookieKey)?.value; + const cookieValue = (await cookies()).get(colorSchemeCookieKey)?.value; if (cookieValue) { return cookieValue as ColorScheme; diff --git a/apps/tasks/package.json b/apps/tasks/package.json index 01b5f9e15..1ef0e5267 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -38,7 +38,7 @@ "dayjs": "^1.11.13", "dotenv": "^16.4.7", "superjson": "2.2.2", - "undici": "7.2.0" + "undici": "7.2.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -49,6 +49,6 @@ "eslint": "^9.17.0", "prettier": "^3.4.2", "tsx": "4.19.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/apps/websocket/package.json b/apps/websocket/package.json index 8b76172fe..32220cd6d 100644 --- a/apps/websocket/package.json +++ b/apps/websocket/package.json @@ -36,6 +36,6 @@ "@types/ws": "^8.5.13", "eslint": "^9.17.0", "prettier": "^3.4.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/package.json b/package.json index 427101e29..166f9028f 100644 --- a/package.json +++ b/package.json @@ -43,18 +43,18 @@ "@vitest/ui": "^2.1.8", "conventional-changelog-conventionalcommits": "^8.0.0", "cross-env": "^7.0.3", - "jsdom": "^25.0.1", + "jsdom": "^26.0.0", "prettier": "^3.4.2", "semantic-release": "^24.2.1", "testcontainers": "^10.16.0", "turbo": "^2.3.3", - "typescript": "^5.7.2", + "typescript": "^5.7.3", "vite-tsconfig-paths": "^5.1.4", "vitest": "^2.1.8" }, - "packageManager": "pnpm@9.15.2", + "packageManager": "pnpm@9.15.3", "engines": { - "node": ">=22.12.0" + "node": ">=22.13.0" }, "pnpm": { "allowNonAppliedPatches": true, diff --git a/packages/analytics/package.json b/packages/analytics/package.json index bdc330845..ede56c834 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -33,6 +33,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/api/package.json b/packages/api/package.json index 7e7e4e959..70e50144a 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -8,7 +8,8 @@ ".": "./src/index.ts", "./client": "./src/client.ts", "./server": "./src/server.ts", - "./websocket": "./src/websocket.ts" + "./websocket": "./src/websocket.ts", + "./shared": "./src/shared.ts" }, "main": "./index.ts", "types": "./index.ts", @@ -40,20 +41,21 @@ "@trpc/client": "next", "@trpc/react-query": "next", "@trpc/server": "next", - "dockerode": "^4.0.2", + "dockerode": "^4.0.3", "lodash.clonedeep": "^4.5.0", - "next": "^14.2.22", - "react": "^19.0.0", + "next": "15.1.4", + "react": "19.0.0", + "react-dom": "19.0.0", "superjson": "2.2.2", - "trpc-to-openapi": "^2.1.1" + "trpc-to-openapi": "^2.1.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/dockerode": "^3.3.33", + "@types/dockerode": "^3.3.34", "eslint": "^9.17.0", "prettier": "^3.4.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/api/src/client.ts b/packages/api/src/client.ts index f39a3eba6..985446a6b 100644 --- a/packages/api/src/client.ts +++ b/packages/api/src/client.ts @@ -1,7 +1,10 @@ +"use client"; + import { createTRPCClient, createTRPCReact, httpLink } from "@trpc/react-query"; import SuperJSON from "superjson"; import type { AppRouter } from "."; +import { createHeadersCallbackForSource } from "./shared"; export const clientApi = createTRPCReact(); export const fetchApi = createTRPCClient({ @@ -26,42 +29,3 @@ function getBaseUrl() { export function getTrpcUrl() { return `${getBaseUrl()}/api/trpc`; } - -/** - * Creates a headers callback for a given source - * It will set the x-trpc-source header and cookies if needed - * @param source trpc source request comes from - * @returns headers callback - */ -export function createHeadersCallbackForSource(source: string) { - return async () => { - const headers = new Headers(); - headers.set("x-trpc-source", source); - - const cookies = await importCookiesAsync(); - // We need to set cookie for ssr requests (for example with useSuspenseQuery or middleware) - if (cookies) { - headers.set("cookie", cookies); - } - - return headers; - }; -} - -/** - * This is a workarround as cookies are not passed to the server - * when using useSuspenseQuery or middleware - * @returns cookie string on server or null on client - */ -async function importCookiesAsync() { - if (typeof window === "undefined") { - return await import("next/headers").then(({ cookies }) => - cookies() - .getAll() - .map(({ name, value }) => `${name}=${value}`) - .join(";"), - ); - } - - return null; -} diff --git a/packages/api/src/router/app.ts b/packages/api/src/router/app.ts index da4184e89..43cc24031 100644 --- a/packages/api/src/router/app.ts +++ b/packages/api/src/router/app.ts @@ -3,13 +3,36 @@ import { TRPCError } from "@trpc/server"; import { asc, createId, eq, inArray, like } from "@homarr/db"; import { apps } from "@homarr/db/schema"; import { selectAppSchema } from "@homarr/db/validationSchemas"; +import { getIconForName } from "@homarr/icons"; import { validation, z } from "@homarr/validation"; import { convertIntersectionToZodObject } from "../schema-merger"; import { createTRPCRouter, permissionRequiredProcedure, protectedProcedure, publicProcedure } from "../trpc"; import { canUserSeeAppAsync } from "./app/app-access-control"; +const defaultIcon = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/homarr.svg"; + export const appRouter = createTRPCRouter({ + getPaginated: protectedProcedure + .input(validation.common.paginated) + .output(z.object({ items: z.array(selectAppSchema), totalCount: z.number() })) + .meta({ openapi: { method: "GET", path: "/api/apps/paginated", tags: ["apps"], protect: true } }) + .query(async ({ input, ctx }) => { + const whereQuery = input.search ? like(apps.name, `%${input.search.trim()}%`) : undefined; + const totalCount = await ctx.db.$count(apps, whereQuery); + + const dbApps = await ctx.db.query.apps.findMany({ + limit: input.pageSize, + offset: (input.page - 1) * input.pageSize, + where: whereQuery, + orderBy: asc(apps.name), + }); + + return { + items: dbApps, + totalCount, + }; + }), all: protectedProcedure .input(z.void()) .output(z.array(selectAppSchema)) @@ -98,6 +121,21 @@ export const appRouter = createTRPCRouter({ href: input.href, }); }), + createMany: permissionRequiredProcedure + .requiresPermission("app-create") + .input(validation.app.createMany) + .output(z.void()) + .mutation(async ({ ctx, input }) => { + await ctx.db.insert(apps).values( + input.map((app) => ({ + id: createId(), + name: app.name, + description: app.description, + iconUrl: app.iconUrl ?? getIconForName(ctx.db, app.name).sync()?.url ?? defaultIcon, + href: app.href, + })), + ); + }), update: permissionRequiredProcedure .requiresPermission("app-modify-all") .input(convertIntersectionToZodObject(validation.app.edit)) diff --git a/packages/api/src/router/board.ts b/packages/api/src/router/board.ts index 291ce54a4..182fc90d4 100644 --- a/packages/api/src/router/board.ts +++ b/packages/api/src/router/board.ts @@ -2,7 +2,7 @@ import { TRPCError } from "@trpc/server"; import superjson from "superjson"; import { constructBoardPermissions } from "@homarr/auth/shared"; -import type { Database, SQL } from "@homarr/db"; +import type { Database, InferInsertModel, SQL } from "@homarr/db"; import { and, createId, eq, inArray, like, or } from "@homarr/db"; import { getServerSettingByKeyAsync } from "@homarr/db/queries"; import { @@ -11,7 +11,9 @@ import { boardUserPermissions, groupMembers, groupPermissions, + integrationGroupPermissions, integrationItems, + integrationUserPermissions, items, sections, users, @@ -216,6 +218,111 @@ export const boardRouter = createTRPCRouter({ }); }); }), + duplicateBoard: permissionRequiredProcedure + .requiresPermission("board-create") + .input(validation.board.duplicate) + .mutation(async ({ ctx, input }) => { + await throwIfActionForbiddenAsync(ctx, eq(boards.id, input.id), "view"); + await noBoardWithSimilarNameAsync(ctx.db, input.name); + + const board = await ctx.db.query.boards.findFirst({ + where: eq(boards.id, input.id), + with: { + sections: { + with: { + items: { + with: { + integrations: true, + }, + }, + }, + }, + }, + }); + + if (!board) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Board not found", + }); + } + + const { sections: boardSections, ...boardProps } = board; + + const newBoardId = createId(); + const sectionMap = new Map(boardSections.map((section) => [section.id, createId()])); + const sectionsToInsert: InferInsertModel[] = boardSections.map(({ items: _, ...section }) => ({ + ...section, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: sectionMap.get(section.id)!, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + parentSectionId: section.parentSectionId ? sectionMap.get(section.parentSectionId)! : null, + boardId: newBoardId, + })); + const flatItems = boardSections.flatMap((section) => section.items); + const itemMap = new Map(flatItems.map((item) => [item.id, createId()])); + const itemsToInsert: InferInsertModel[] = flatItems.map(({ integrations: _, ...item }) => ({ + ...item, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: itemMap.get(item.id)!, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + sectionId: sectionMap.get(item.sectionId)!, + })); + + // Creates a list with all integration ids the user has access to + const hasAccessForAll = ctx.session.user.permissions.includes("integration-use-all"); + const integrationIdsWithAccess = hasAccessForAll + ? [] + : await ctx.db + .selectDistinct({ + id: integrationGroupPermissions.integrationId, + }) + .from(integrationGroupPermissions) + .leftJoin(groupMembers, eq(integrationGroupPermissions.groupId, groupMembers.groupId)) + .where(eq(groupMembers.userId, ctx.session.user.id)) + .union( + ctx.db + .selectDistinct({ id: integrationUserPermissions.integrationId }) + .from(integrationUserPermissions) + .where(eq(integrationUserPermissions.userId, ctx.session.user.id)), + ) + .then((result) => result.map((row) => row.id)); + + const itemIntegrationsToInsert = flatItems.flatMap((item) => + item.integrations + // Restrict integrations to only those the user has access to + .filter(({ integrationId }) => integrationIdsWithAccess.includes(integrationId) || hasAccessForAll) + .map((integration) => ({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + itemId: itemMap.get(item.id)!, + integrationId: integration.integrationId, + })), + ); + + ctx.db.transaction((transaction) => { + transaction + .insert(boards) + .values({ + ...boardProps, + id: newBoardId, + name: input.name, + creatorId: ctx.session.user.id, + }) + .run(); + + if (sectionsToInsert.length > 0) { + transaction.insert(sections).values(sectionsToInsert).run(); + } + + if (itemsToInsert.length > 0) { + transaction.insert(items).values(itemsToInsert).run(); + } + + if (itemIntegrationsToInsert.length > 0) { + transaction.insert(integrationItems).values(itemIntegrationsToInsert).run(); + } + }); + }), renameBoard: protectedProcedure.input(validation.board.rename).mutation(async ({ ctx, input }) => { await throwIfActionForbiddenAsync(ctx, eq(boards.id, input.id), "full"); diff --git a/packages/api/src/router/search-engine/search-engine-router.ts b/packages/api/src/router/search-engine/search-engine-router.ts index 0d48ab226..49aab777c 100644 --- a/packages/api/src/router/search-engine/search-engine-router.ts +++ b/packages/api/src/router/search-engine/search-engine-router.ts @@ -1,12 +1,13 @@ import { TRPCError } from "@trpc/server"; -import { createId, eq, like, sql } from "@homarr/db"; -import { searchEngines } from "@homarr/db/schema"; +import { asc, createId, eq, like, sql } from "@homarr/db"; +import { getServerSettingByKeyAsync } from "@homarr/db/queries"; +import { searchEngines, users } from "@homarr/db/schema"; import { integrationCreator } from "@homarr/integrations"; -import { validation } from "@homarr/validation"; +import { validation, z } from "@homarr/validation"; import { createOneIntegrationMiddleware } from "../../middlewares/integration"; -import { createTRPCRouter, permissionRequiredProcedure, protectedProcedure } from "../../trpc"; +import { createTRPCRouter, permissionRequiredProcedure, protectedProcedure, publicProcedure } from "../../trpc"; export const searchEngineRouter = createTRPCRouter({ getPaginated: protectedProcedure.input(validation.common.paginated).query(async ({ input, ctx }) => { @@ -29,6 +30,21 @@ export const searchEngineRouter = createTRPCRouter({ totalCount: searchEngineCount[0]?.count ?? 0, }; }), + getSelectable: protectedProcedure + .input(z.object({ withIntegrations: z.boolean() }).default({ withIntegrations: true })) + .query(async ({ ctx, input }) => { + return await ctx.db.query.searchEngines + .findMany({ + orderBy: asc(searchEngines.name), + where: input.withIntegrations ? undefined : eq(searchEngines.type, "generic"), + columns: { + id: true, + name: true, + }, + }) + .then((engines) => engines.map((engine) => ({ value: engine.id, label: engine.name }))); + }), + byId: protectedProcedure.input(validation.common.byId).query(async ({ ctx, input }) => { const searchEngine = await ctx.db.query.searchEngines.findFirst({ where: eq(searchEngines.id, input.id), @@ -55,6 +71,54 @@ export const searchEngineRouter = createTRPCRouter({ urlTemplate: searchEngine.urlTemplate!, }; }), + getDefaultSearchEngine: publicProcedure.query(async ({ ctx }) => { + const userDefaultId = ctx.session?.user.id + ? ((await ctx.db.query.users + .findFirst({ + where: eq(users.id, ctx.session.user.id), + columns: { + defaultSearchEngineId: true, + }, + }) + .then((user) => user?.defaultSearchEngineId)) ?? null) + : null; + + if (userDefaultId) { + return await ctx.db.query.searchEngines.findFirst({ + where: eq(searchEngines.id, userDefaultId), + with: { + integration: { + columns: { + kind: true, + url: true, + id: true, + }, + }, + }, + }); + } + + const serverDefaultId = await getServerSettingByKeyAsync(ctx.db, "search").then( + (setting) => setting.defaultSearchEngineId, + ); + + if (serverDefaultId) { + return await ctx.db.query.searchEngines.findFirst({ + where: eq(searchEngines.id, serverDefaultId), + with: { + integration: { + columns: { + kind: true, + url: true, + id: true, + }, + }, + }, + }); + } + + return null; + }), search: protectedProcedure.input(validation.common.search).query(async ({ ctx, input }) => { return await ctx.db.query.searchEngines.findMany({ where: like(searchEngines.short, `${input.query.toLowerCase().trim()}%`), diff --git a/packages/api/src/router/test/integration/integration-router.spec.ts b/packages/api/src/router/test/integration/integration-router.spec.ts index 3a3efb1ed..6b8b48cc8 100644 --- a/packages/api/src/router/test/integration/integration-router.spec.ts +++ b/packages/api/src/router/test/integration/integration-router.spec.ts @@ -240,7 +240,7 @@ describe("create should create a new integration", () => { expect(dbSearchEngine!.short).toBe("j"); expect(dbSearchEngine!.name).toBe(input.name); expect(dbSearchEngine!.iconUrl).toBe( - "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/jellyseerr.png", + "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/jellyseerr.png", ); }); diff --git a/packages/api/src/router/user.ts b/packages/api/src/router/user.ts index 4d1691f29..168d850bb 100644 --- a/packages/api/src/router/user.ts +++ b/packages/api/src/router/user.ts @@ -211,6 +211,7 @@ export const userRouter = createTRPCRouter({ homeBoardId: true, firstDayOfWeek: true, pingIconsEnabled: true, + defaultSearchEngineId: true, }), ) .meta({ openapi: { method: "GET", path: "/api/users/{userId}", tags: ["users"], protect: true } }) @@ -233,6 +234,7 @@ export const userRouter = createTRPCRouter({ homeBoardId: true, firstDayOfWeek: true, pingIconsEnabled: true, + defaultSearchEngineId: true, }, where: eq(users.id, input.userId), }); @@ -406,6 +408,43 @@ export const userRouter = createTRPCRouter({ }) .where(eq(users.id, input.userId)); }), + changeDefaultSearchEngine: protectedProcedure + .input( + convertIntersectionToZodObject(validation.user.changeDefaultSearchEngine.and(z.object({ userId: z.string() }))), + ) + .output(z.void()) + .meta({ openapi: { method: "PATCH", path: "/api/users/changeSearchEngine", tags: ["users"], protect: true } }) + .mutation(async ({ input, ctx }) => { + const user = ctx.session.user; + // Only admins can change other users passwords + if (!user.permissions.includes("admin") && user.id !== input.userId) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "User not found", + }); + } + + const dbUser = await ctx.db.query.users.findFirst({ + columns: { + id: true, + }, + where: eq(users.id, input.userId), + }); + + if (!dbUser) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "User not found", + }); + } + + await ctx.db + .update(users) + .set({ + defaultSearchEngineId: input.defaultSearchEngineId, + }) + .where(eq(users.id, input.userId)); + }), changeColorScheme: protectedProcedure .input(validation.user.changeColorScheme) .output(z.void()) diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index c7522c0af..08fc5e1e3 100644 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -9,7 +9,7 @@ import { auth } from "@homarr/auth/next"; * handling a tRPC call from a React Server Component. */ const createContext = cache(async () => { - const heads = new Headers(headers()); + const heads = new Headers(await headers()); heads.set("x-trpc-source", "rsc"); return createTRPCContext({ diff --git a/packages/api/src/shared.ts b/packages/api/src/shared.ts new file mode 100644 index 000000000..b8ebcfcc6 --- /dev/null +++ b/packages/api/src/shared.ts @@ -0,0 +1,38 @@ +/** + * Creates a headers callback for a given source + * It will set the x-trpc-source header and cookies if needed + * @param source trpc source request comes from + * @returns headers callback + */ +export function createHeadersCallbackForSource(source: string) { + return async () => { + const headers = new Headers(); + headers.set("x-trpc-source", source); + + const cookies = await importCookiesAsync(); + // We need to set cookie for ssr requests (for example with useSuspenseQuery or middleware) + if (cookies) { + headers.set("cookie", cookies); + } + + return headers; + }; +} + +/** + * This is a workarround as cookies are not passed to the server + * when using useSuspenseQuery or middleware + * @returns cookie string on server or null on client + */ +async function importCookiesAsync() { + if (typeof window !== "undefined") { + return null; + } + + const { cookies } = await import("next/headers"); + + return (await cookies()) + .getAll() + .map(({ name, value }) => `${name}=${value}`) + .join(";"); +} diff --git a/packages/auth/configuration.ts b/packages/auth/configuration.ts index f13765536..49dd7126a 100644 --- a/packages/auth/configuration.ts +++ b/packages/auth/configuration.ts @@ -74,7 +74,7 @@ export const createConfiguration = ( userId: user.id, }); - cookies().set(sessionTokenCookieName, sessionToken, { + (await cookies()).set(sessionTokenCookieName, sessionToken, { path: "/", expires: expires, httpOnly: true, @@ -99,8 +99,9 @@ export const createConfiguration = ( error: "/auth/login", }, jwt: { - encode() { - const cookie = cookies().get(sessionTokenCookieName)?.value; + // eslint-disable-next-line no-restricted-syntax + async encode() { + const cookie = (await cookies()).get(sessionTokenCookieName)?.value; return cookie ?? ""; }, diff --git a/packages/auth/env.mjs b/packages/auth/env.mjs index ebc4555df..9105ee776 100644 --- a/packages/auth/env.mjs +++ b/packages/auth/env.mjs @@ -74,6 +74,7 @@ export const env = createEnv({ AUTH_OIDC_AUTO_LOGIN: booleanSchema, AUTH_OIDC_SCOPE_OVERWRITE: z.string().min(1).default("openid email profile groups"), AUTH_OIDC_GROUPS_ATTRIBUTE: z.string().default("groups"), // Is used in the signIn event to assign the correct groups, key is from object of decoded id_token + AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE: z.string().optional(), } : {}), ...(authProviders.includes("ldap") @@ -117,6 +118,7 @@ export const env = createEnv({ AUTH_LDAP_USER_MAIL_ATTRIBUTE: process.env.AUTH_LDAP_USER_MAIL_ATTRIBUTE, AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG: process.env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG, AUTH_OIDC_AUTO_LOGIN: process.env.AUTH_OIDC_AUTO_LOGIN, + AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE: process.env.AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE, }, skipValidation, }); diff --git a/packages/auth/events.ts b/packages/auth/events.ts index 92987e0cf..31713ac7d 100644 --- a/packages/auth/events.ts +++ b/packages/auth/events.ts @@ -9,6 +9,7 @@ import { colorSchemeCookieKey, everyoneGroup } from "@homarr/definitions"; import { logger } from "@homarr/log"; import { env } from "./env.mjs"; +import { extractProfileName } from "./providers/oidc/oidc-provider"; export const createSignInEventHandler = (db: Database): Exclude["signIn"] => { return async ({ user, profile }) => { @@ -43,18 +44,24 @@ export const createSignInEventHandler = (db: Database): Exclude - createConfiguration(provider, headers(), useSecureCookies); +export const createHandlersAsync = async (provider: SupportedAuthProvider | "unknown", useSecureCookies: boolean) => + createConfiguration(provider, await headers(), useSecureCookies); export { getSessionFromTokenAsync as getSessionFromToken, sessionTokenCookieName } from "./session"; diff --git a/packages/auth/package.json b/packages/auth/package.json index 3ade1c401..d5db197f7 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -33,11 +33,11 @@ "@t3-oss/env-nextjs": "^0.11.1", "bcrypt": "^5.1.1", "cookies": "^0.9.1", - "ldapts": "7.3.0", - "next": "^14.2.22", + "ldapts": "7.3.1", + "next": "15.1.4", "next-auth": "5.0.0-beta.25", - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "19.0.0", + "react-dom": "19.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -47,6 +47,6 @@ "@types/cookies": "0.9.0", "eslint": "^9.17.0", "prettier": "^3.4.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/auth/providers/oidc/oidc-provider.ts b/packages/auth/providers/oidc/oidc-provider.ts index 406b13871..5d4570564 100644 --- a/packages/auth/providers/oidc/oidc-provider.ts +++ b/packages/auth/providers/oidc/oidc-provider.ts @@ -1,18 +1,10 @@ import type { ReadonlyHeaders } from "next/dist/server/web/spec-extension/adapters/headers"; -import type { OIDCConfig } from "next-auth/providers"; +import type { OIDCConfig } from "@auth/core/providers"; +import type { Profile } from "@auth/core/types"; import { env } from "../../env.mjs"; import { createRedirectUri } from "../../redirect"; -interface Profile { - sub: string; - name: string; - email: string; - groups: string[]; - preferred_username: string; - email_verified: boolean; -} - export const OidcProvider = (headers: ReadonlyHeaders | null): OIDCConfig => ({ id: "oidc", name: env.AUTH_OIDC_CLIENT_NAME, @@ -28,12 +20,28 @@ export const OidcProvider = (headers: ReadonlyHeaders | null): OIDCConfig { + if (!env.AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE) { + // Use the name as the username if the preferred_username is an email address + return profile.preferred_username?.includes("@") ? profile.name : profile.preferred_username; + } + + return profile[env.AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE as keyof typeof profile] as string; +}; diff --git a/packages/auth/test/events.spec.ts b/packages/auth/test/events.spec.ts index 5fb37a9a2..2bd4ad921 100644 --- a/packages/auth/test/events.spec.ts +++ b/packages/auth/test/events.spec.ts @@ -29,7 +29,7 @@ vi.mock("next/headers", async (importOriginal) => { vi.spyOn(result, "set"); - const cookies = () => result; + const cookies = () => Promise.resolve(result); return { ...mod, cookies } satisfies HeadersExport; }); @@ -238,7 +238,7 @@ describe("createSignInEventHandler should create signInEventHandler", () => { }); // Assert - expect(cookies().set).toHaveBeenCalledWith( + expect((await cookies()).set).toHaveBeenCalledWith( colorSchemeCookieKey, "dark", expect.objectContaining({ diff --git a/packages/cli/package.json b/packages/cli/package.json index 1dfb7b67f..3286f23ec 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -34,6 +34,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/common/package.json b/packages/common/package.json index b294e9abf..a85a7d5f5 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -28,14 +28,15 @@ "dependencies": { "@homarr/log": "workspace:^0.1.0", "dayjs": "^1.11.13", - "next": "^14.2.22", - "react": "^19.0.0" + "next": "15.1.4", + "react": "19.0.0", + "react-dom": "19.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/common/src/types.ts b/packages/common/src/types.ts index 1dcd019bc..e6b0621ff 100644 --- a/packages/common/src/types.ts +++ b/packages/common/src/types.ts @@ -1,3 +1,5 @@ +import type { z } from "zod"; + export type MaybePromise = T | Promise; export type AtLeastOneOf = [T, ...T[]]; @@ -16,3 +18,11 @@ export type Inverse = { }; type Invertible = Record; + +export type inferSearchParamsFromSchema = inferSearchParamsFromSchemaInner< + z.infer +>; + +type inferSearchParamsFromSchemaInner> = Partial<{ + [K in keyof TSchema]: Exclude extends unknown[] ? string[] : string; +}>; diff --git a/packages/cron-job-runner/package.json b/packages/cron-job-runner/package.json index 0c797ea51..b642f94e4 100644 --- a/packages/cron-job-runner/package.json +++ b/packages/cron-job-runner/package.json @@ -31,6 +31,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/cron-job-status/package.json b/packages/cron-job-status/package.json index 148c40604..6143cd192 100644 --- a/packages/cron-job-status/package.json +++ b/packages/cron-job-status/package.json @@ -30,6 +30,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/cron-jobs-core/package.json b/packages/cron-jobs-core/package.json index 08ec4866a..d40a59fb2 100644 --- a/packages/cron-jobs-core/package.json +++ b/packages/cron-jobs-core/package.json @@ -33,6 +33,6 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/node-cron": "^3.0.11", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/cron-jobs/package.json b/packages/cron-jobs/package.json index 6635fa036..3791dab57 100644 --- a/packages/cron-jobs/package.json +++ b/packages/cron-jobs/package.json @@ -46,6 +46,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/cron-jobs/src/jobs/icons-updater.ts b/packages/cron-jobs/src/jobs/icons-updater.ts index 48fa0c59c..e818020d6 100644 --- a/packages/cron-jobs/src/jobs/icons-updater.ts +++ b/packages/cron-jobs/src/jobs/icons-updater.ts @@ -1,7 +1,7 @@ import { splitToNChunks, Stopwatch } from "@homarr/common"; import { EVERY_WEEK } from "@homarr/cron-jobs-core/expressions"; import type { InferInsertModel } from "@homarr/db"; -import { db, inArray } from "@homarr/db"; +import { db, inArray, sql } from "@homarr/db"; import { createId } from "@homarr/db/client"; import { iconRepositories, icons } from "@homarr/db/schema"; import { fetchIconsAsync } from "@homarr/icons"; @@ -22,13 +22,13 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { `Successfully fetched ${countIcons} icons from ${repositoryIconGroups.length} repositories within ${stopWatch.getElapsedInHumanWords()}`, ); - const databaseIconGroups = await db.query.iconRepositories.findMany({ + const databaseIconRepositories = await db.query.iconRepositories.findMany({ with: { icons: true, }, }); - const skippedChecksums: string[] = []; + const skippedChecksums: `${string}.${string}`[] = []; let countDeleted = 0; let countInserted = 0; @@ -43,18 +43,24 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { continue; } - const repositoryInDb = databaseIconGroups.find((dbIconGroup) => dbIconGroup.slug === repositoryIconGroup.slug); - const repositoryIconGroupId: string = repositoryInDb?.id ?? createId(); + const repositoryInDb = databaseIconRepositories.find( + (dbIconGroup) => dbIconGroup.slug === repositoryIconGroup.slug, + ); + const iconRepositoryId: string = repositoryInDb?.id ?? createId(); if (!repositoryInDb?.id) { newIconRepositories.push({ - id: repositoryIconGroupId, + id: iconRepositoryId, slug: repositoryIconGroup.slug, }); } for (const icon of repositoryIconGroup.icons) { - if (databaseIconGroups.flatMap((group) => group.icons).some((dbIcon) => dbIcon.checksum === icon.checksum)) { - skippedChecksums.push(icon.checksum); + if ( + databaseIconRepositories + .flatMap((repository) => repository.icons) + .some((dbIcon) => dbIcon.checksum === icon.checksum && dbIcon.iconRepositoryId === iconRepositoryId) + ) { + skippedChecksums.push(`${iconRepositoryId}.${icon.checksum}`); continue; } @@ -63,34 +69,54 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { checksum: icon.checksum, name: icon.fileNameWithExtension, url: icon.imageUrl, - iconRepositoryId: repositoryIconGroupId, + iconRepositoryId, }); countInserted++; } } - const deadIcons = databaseIconGroups - .flatMap((group) => group.icons) - .filter((icon) => !skippedChecksums.includes(icon.checksum)); + const deadIcons = databaseIconRepositories + .flatMap((repository) => repository.icons) + .filter((icon) => !skippedChecksums.includes(`${icon.iconRepositoryId}.${icon.checksum}`)); - await db.transaction(async (transaction) => { + const deadIconRepositories = databaseIconRepositories.filter( + (iconRepository) => !repositoryIconGroups.some((group) => group.slug === iconRepository.slug), + ); + + db.transaction((transaction) => { if (newIconRepositories.length >= 1) { - await transaction.insert(iconRepositories).values(newIconRepositories); + transaction.insert(iconRepositories).values(newIconRepositories).run(); } if (newIcons.length >= 1) { // We only insert 5000 icons at a time to avoid SQLite limitations for (const chunck of splitToNChunks(newIcons, Math.ceil(newIcons.length / 5000))) { - await transaction.insert(icons).values(chunck); + transaction.insert(icons).values(chunck).run(); } } if (deadIcons.length >= 1) { - await transaction.delete(icons).where( - inArray( - icons.checksum, - deadIcons.map((icon) => icon.checksum), - ), - ); + transaction + .delete(icons) + .where( + inArray( + // Combine iconRepositoryId and checksum to allow same icons on different repositories + sql`concat(${icons.iconRepositoryId}, '.', ${icons.checksum})`, + deadIcons.map((icon) => `${icon.iconRepositoryId}.${icon.checksum}`), + ), + ) + .run(); + } + + if (deadIconRepositories.length >= 1) { + transaction + .delete(iconRepositories) + .where( + inArray( + iconRepositories.id, + deadIconRepositories.map((iconRepository) => iconRepository.id), + ), + ) + .run(); } countDeleted += deadIcons.length; diff --git a/packages/db/migrations/mysql/0019_crazy_marvel_zombies.sql b/packages/db/migrations/mysql/0019_crazy_marvel_zombies.sql new file mode 100644 index 000000000..16985974f --- /dev/null +++ b/packages/db/migrations/mysql/0019_crazy_marvel_zombies.sql @@ -0,0 +1,2 @@ +ALTER TABLE `user` ADD `default_search_engine_id` varchar(64);--> statement-breakpoint +ALTER TABLE `user` ADD CONSTRAINT `user_default_search_engine_id_search_engine_id_fk` FOREIGN KEY (`default_search_engine_id`) REFERENCES `search_engine`(`id`) ON DELETE set null ON UPDATE no action; \ No newline at end of file diff --git a/packages/db/migrations/mysql/meta/0019_snapshot.json b/packages/db/migrations/mysql/meta/0019_snapshot.json new file mode 100644 index 000000000..91325ec34 --- /dev/null +++ b/packages/db/migrations/mysql/meta/0019_snapshot.json @@ -0,0 +1,1684 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "0587ca9d-bbfc-4241-ba82-e52a7664a1dc", + "prevId": "028a5116-ccea-4095-9434-7ac3bf726c9a", + "tables": { + "account": { + "name": "account", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_account_id": { + "name": "provider_account_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_type": { + "name": "token_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "session_state": { + "name": "session_state", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "userId_idx": { + "name": "userId_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "account_provider_provider_account_id_pk": { + "name": "account_provider_provider_account_id_pk", + "columns": ["provider", "provider_account_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "apiKey": { + "name": "apiKey", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "api_key": { + "name": "api_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "apiKey_user_id_user_id_fk": { + "name": "apiKey_user_id_user_id_fk", + "tableFrom": "apiKey", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "apiKey_id": { + "name": "apiKey_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "app": { + "name": "app", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "href": { + "name": "href", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "app_id": { + "name": "app_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "boardGroupPermission": { + "name": "boardGroupPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "boardGroupPermission_board_id_board_id_fk": { + "name": "boardGroupPermission_board_id_board_id_fk", + "tableFrom": "boardGroupPermission", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "boardGroupPermission_group_id_group_id_fk": { + "name": "boardGroupPermission_group_id_group_id_fk", + "tableFrom": "boardGroupPermission", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "boardGroupPermission_board_id_group_id_permission_pk": { + "name": "boardGroupPermission_board_id_group_id_permission_pk", + "columns": ["board_id", "group_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "boardUserPermission": { + "name": "boardUserPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "boardUserPermission_board_id_board_id_fk": { + "name": "boardUserPermission_board_id_board_id_fk", + "tableFrom": "boardUserPermission", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "boardUserPermission_user_id_user_id_fk": { + "name": "boardUserPermission_user_id_user_id_fk", + "tableFrom": "boardUserPermission", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "boardUserPermission_board_id_user_id_permission_pk": { + "name": "boardUserPermission_board_id_user_id_permission_pk", + "columns": ["board_id", "user_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "board": { + "name": "board", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "creator_id": { + "name": "creator_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "page_title": { + "name": "page_title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "meta_title": { + "name": "meta_title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "logo_image_url": { + "name": "logo_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "favicon_image_url": { + "name": "favicon_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "background_image_url": { + "name": "background_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "background_image_attachment": { + "name": "background_image_attachment", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('fixed')" + }, + "background_image_repeat": { + "name": "background_image_repeat", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('no-repeat')" + }, + "background_image_size": { + "name": "background_image_size", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('cover')" + }, + "primary_color": { + "name": "primary_color", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('#fa5252')" + }, + "secondary_color": { + "name": "secondary_color", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('#fd7e14')" + }, + "opacity": { + "name": "opacity", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "custom_css": { + "name": "custom_css", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "column_count": { + "name": "column_count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + } + }, + "indexes": {}, + "foreignKeys": { + "board_creator_id_user_id_fk": { + "name": "board_creator_id_user_id_fk", + "tableFrom": "board", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "board_id": { + "name": "board_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "board_name_unique": { + "name": "board_name_unique", + "columns": ["name"] + } + }, + "checkConstraint": {} + }, + "groupMember": { + "name": "groupMember", + "columns": { + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupMember_group_id_group_id_fk": { + "name": "groupMember_group_id_group_id_fk", + "tableFrom": "groupMember", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "groupMember_user_id_user_id_fk": { + "name": "groupMember_user_id_user_id_fk", + "tableFrom": "groupMember", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "groupMember_group_id_user_id_pk": { + "name": "groupMember_group_id_user_id_pk", + "columns": ["group_id", "user_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "groupPermission": { + "name": "groupPermission", + "columns": { + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupPermission_group_id_group_id_fk": { + "name": "groupPermission_group_id_group_id_fk", + "tableFrom": "groupPermission", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "group": { + "name": "group", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "group_owner_id_user_id_fk": { + "name": "group_owner_id_user_id_fk", + "tableFrom": "group", + "tableTo": "user", + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "group_id": { + "name": "group_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "group_name_unique": { + "name": "group_name_unique", + "columns": ["name"] + } + }, + "checkConstraint": {} + }, + "iconRepository": { + "name": "iconRepository", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(150)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "iconRepository_id": { + "name": "iconRepository_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "icon": { + "name": "icon", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(250)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "checksum": { + "name": "checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_repository_id": { + "name": "icon_repository_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "icon_icon_repository_id_iconRepository_id_fk": { + "name": "icon_icon_repository_id_iconRepository_id_fk", + "tableFrom": "icon", + "tableTo": "iconRepository", + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "icon_id": { + "name": "icon_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integrationGroupPermissions": { + "name": "integrationGroupPermissions", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integrationGroupPermissions_integration_id_integration_id_fk": { + "name": "integrationGroupPermissions_integration_id_integration_id_fk", + "tableFrom": "integrationGroupPermissions", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integrationGroupPermissions_group_id_group_id_fk": { + "name": "integrationGroupPermissions_group_id_group_id_fk", + "tableFrom": "integrationGroupPermissions", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integration_group_permission__pk": { + "name": "integration_group_permission__pk", + "columns": ["integration_id", "group_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integration_item": { + "name": "integration_item", + "columns": { + "item_id": { + "name": "item_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integration_item_item_id_item_id_fk": { + "name": "integration_item_item_id_item_id_fk", + "tableFrom": "integration_item", + "tableTo": "item", + "columnsFrom": ["item_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integration_item_integration_id_integration_id_fk": { + "name": "integration_item_integration_id_integration_id_fk", + "tableFrom": "integration_item", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integration_item_item_id_integration_id_pk": { + "name": "integration_item_item_id_integration_id_pk", + "columns": ["item_id", "integration_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integrationSecret": { + "name": "integrationSecret", + "columns": { + "kind": { + "name": "kind", + "type": "varchar(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "integration_secret__kind_idx": { + "name": "integration_secret__kind_idx", + "columns": ["kind"], + "isUnique": false + }, + "integration_secret__updated_at_idx": { + "name": "integration_secret__updated_at_idx", + "columns": ["updated_at"], + "isUnique": false + } + }, + "foreignKeys": { + "integrationSecret_integration_id_integration_id_fk": { + "name": "integrationSecret_integration_id_integration_id_fk", + "tableFrom": "integrationSecret", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integrationSecret_integration_id_kind_pk": { + "name": "integrationSecret_integration_id_kind_pk", + "columns": ["integration_id", "kind"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integrationUserPermission": { + "name": "integrationUserPermission", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integrationUserPermission_integration_id_integration_id_fk": { + "name": "integrationUserPermission_integration_id_integration_id_fk", + "tableFrom": "integrationUserPermission", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integrationUserPermission_user_id_user_id_fk": { + "name": "integrationUserPermission_user_id_user_id_fk", + "tableFrom": "integrationUserPermission", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integrationUserPermission_integration_id_user_id_permission_pk": { + "name": "integrationUserPermission_integration_id_user_id_permission_pk", + "columns": ["integration_id", "user_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integration": { + "name": "integration", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "integration__kind_idx": { + "name": "integration__kind_idx", + "columns": ["kind"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "integration_id": { + "name": "integration_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "invite": { + "name": "invite", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expiration_date": { + "name": "expiration_date", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "creator_id": { + "name": "creator_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "invite_creator_id_user_id_fk": { + "name": "invite_creator_id_user_id_fk", + "tableFrom": "invite", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "invite_id": { + "name": "invite_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "invite_token_unique": { + "name": "invite_token_unique", + "columns": ["token"] + } + }, + "checkConstraint": {} + }, + "item": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "section_id": { + "name": "section_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "options": { + "name": "options", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"json\": {}}')" + }, + "advanced_options": { + "name": "advanced_options", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"json\": {}}')" + } + }, + "indexes": {}, + "foreignKeys": { + "item_section_id_section_id_fk": { + "name": "item_section_id_section_id_fk", + "tableFrom": "item", + "tableTo": "section", + "columnsFrom": ["section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "item_id": { + "name": "item_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "media": { + "name": "media", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "BLOB", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "size": { + "name": "size", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "creator_id": { + "name": "creator_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "media_creator_id_user_id_fk": { + "name": "media_creator_id_user_id_fk", + "tableFrom": "media", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "media_id": { + "name": "media_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "onboarding": { + "name": "onboarding", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "step": { + "name": "step", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "previous_step": { + "name": "previous_step", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "onboarding_id": { + "name": "onboarding_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "search_engine": { + "name": "search_engine", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "short": { + "name": "short", + "type": "varchar(8)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url_template": { + "name": "url_template", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'generic'" + }, + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "search_engine_integration_id_integration_id_fk": { + "name": "search_engine_integration_id_integration_id_fk", + "tableFrom": "search_engine", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "search_engine_id": { + "name": "search_engine_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "search_engine_short_unique": { + "name": "search_engine_short_unique", + "columns": ["short"] + } + }, + "checkConstraint": {} + }, + "section": { + "name": "section", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "parent_section_id": { + "name": "parent_section_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "section_board_id_board_id_fk": { + "name": "section_board_id_board_id_fk", + "tableFrom": "section", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "section_parent_section_id_section_id_fk": { + "name": "section_parent_section_id_section_id_fk", + "tableFrom": "section", + "tableTo": "section", + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "section_id": { + "name": "section_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "serverSetting": { + "name": "serverSetting", + "columns": { + "setting_key": { + "name": "setting_key", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"json\": {}}')" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "serverSetting_setting_key": { + "name": "serverSetting_setting_key", + "columns": ["setting_key"] + } + }, + "uniqueConstraints": { + "serverSetting_settingKey_unique": { + "name": "serverSetting_settingKey_unique", + "columns": ["setting_key"] + } + }, + "checkConstraint": {} + }, + "session": { + "name": "session", + "columns": { + "session_token": { + "name": "session_token", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "session_session_token": { + "name": "session_session_token", + "columns": ["session_token"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'credentials'" + }, + "home_board_id": { + "name": "home_board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "default_search_engine_id": { + "name": "default_search_engine_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "color_scheme": { + "name": "color_scheme", + "type": "varchar(5)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'dark'" + }, + "first_day_of_week": { + "name": "first_day_of_week", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "ping_icons_enabled": { + "name": "ping_icons_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_home_board_id_board_id_fk": { + "name": "user_home_board_id_board_id_fk", + "tableFrom": "user", + "tableTo": "board", + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "user_default_search_engine_id_search_engine_id_fk": { + "name": "user_default_search_engine_id_search_engine_id_fk", + "tableFrom": "user", + "tableTo": "search_engine", + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_id": { + "name": "user_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "verificationToken": { + "name": "verificationToken", + "columns": { + "identifier": { + "name": "identifier", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verificationToken_identifier_token_pk": { + "name": "verificationToken_identifier_token_pk", + "columns": ["identifier", "token"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} diff --git a/packages/db/migrations/mysql/meta/_journal.json b/packages/db/migrations/mysql/meta/_journal.json index cd5f87398..381e67a28 100644 --- a/packages/db/migrations/mysql/meta/_journal.json +++ b/packages/db/migrations/mysql/meta/_journal.json @@ -134,6 +134,13 @@ "when": 1735593853768, "tag": "0018_mighty_shaman", "breakpoints": true + }, + { + "idx": 19, + "version": "5", + "when": 1735651231818, + "tag": "0019_crazy_marvel_zombies", + "breakpoints": true } ] } diff --git a/packages/db/migrations/sqlite/0019_steady_darkhawk.sql b/packages/db/migrations/sqlite/0019_steady_darkhawk.sql new file mode 100644 index 000000000..a3da46c8d --- /dev/null +++ b/packages/db/migrations/sqlite/0019_steady_darkhawk.sql @@ -0,0 +1 @@ +ALTER TABLE `user` ADD `default_search_engine_id` text REFERENCES search_engine(id); \ No newline at end of file diff --git a/packages/db/migrations/sqlite/meta/0019_snapshot.json b/packages/db/migrations/sqlite/meta/0019_snapshot.json new file mode 100644 index 000000000..92fd5590b --- /dev/null +++ b/packages/db/migrations/sqlite/meta/0019_snapshot.json @@ -0,0 +1,1609 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "08cb7257-ba7e-4d4e-9fe7-85656fc115b0", + "prevId": "79b4322d-1df0-4d65-afef-e9b576874eeb", + "tables": { + "account": { + "name": "account", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_account_id": { + "name": "provider_account_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_type": { + "name": "token_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "session_state": { + "name": "session_state", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "userId_idx": { + "name": "userId_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "account_provider_provider_account_id_pk": { + "columns": ["provider", "provider_account_id"], + "name": "account_provider_provider_account_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "apiKey": { + "name": "apiKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "api_key": { + "name": "api_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "apiKey_user_id_user_id_fk": { + "name": "apiKey_user_id_user_id_fk", + "tableFrom": "apiKey", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "app": { + "name": "app", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "href": { + "name": "href", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "boardGroupPermission": { + "name": "boardGroupPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "boardGroupPermission_board_id_board_id_fk": { + "name": "boardGroupPermission_board_id_board_id_fk", + "tableFrom": "boardGroupPermission", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "boardGroupPermission_group_id_group_id_fk": { + "name": "boardGroupPermission_group_id_group_id_fk", + "tableFrom": "boardGroupPermission", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "boardGroupPermission_board_id_group_id_permission_pk": { + "columns": ["board_id", "group_id", "permission"], + "name": "boardGroupPermission_board_id_group_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "boardUserPermission": { + "name": "boardUserPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "boardUserPermission_board_id_board_id_fk": { + "name": "boardUserPermission_board_id_board_id_fk", + "tableFrom": "boardUserPermission", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "boardUserPermission_user_id_user_id_fk": { + "name": "boardUserPermission_user_id_user_id_fk", + "tableFrom": "boardUserPermission", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "boardUserPermission_board_id_user_id_permission_pk": { + "columns": ["board_id", "user_id", "permission"], + "name": "boardUserPermission_board_id_user_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "board": { + "name": "board", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "creator_id": { + "name": "creator_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "page_title": { + "name": "page_title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "meta_title": { + "name": "meta_title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "logo_image_url": { + "name": "logo_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "favicon_image_url": { + "name": "favicon_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "background_image_url": { + "name": "background_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "background_image_attachment": { + "name": "background_image_attachment", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'fixed'" + }, + "background_image_repeat": { + "name": "background_image_repeat", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'no-repeat'" + }, + "background_image_size": { + "name": "background_image_size", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'cover'" + }, + "primary_color": { + "name": "primary_color", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#fa5252'" + }, + "secondary_color": { + "name": "secondary_color", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#fd7e14'" + }, + "opacity": { + "name": "opacity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "custom_css": { + "name": "custom_css", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "column_count": { + "name": "column_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + } + }, + "indexes": { + "board_name_unique": { + "name": "board_name_unique", + "columns": ["name"], + "isUnique": true + } + }, + "foreignKeys": { + "board_creator_id_user_id_fk": { + "name": "board_creator_id_user_id_fk", + "tableFrom": "board", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "groupMember": { + "name": "groupMember", + "columns": { + "group_id": { + "name": "group_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupMember_group_id_group_id_fk": { + "name": "groupMember_group_id_group_id_fk", + "tableFrom": "groupMember", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "groupMember_user_id_user_id_fk": { + "name": "groupMember_user_id_user_id_fk", + "tableFrom": "groupMember", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "groupMember_group_id_user_id_pk": { + "columns": ["group_id", "user_id"], + "name": "groupMember_group_id_user_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "groupPermission": { + "name": "groupPermission", + "columns": { + "group_id": { + "name": "group_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupPermission_group_id_group_id_fk": { + "name": "groupPermission_group_id_group_id_fk", + "tableFrom": "groupPermission", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "group": { + "name": "group", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "group_name_unique": { + "name": "group_name_unique", + "columns": ["name"], + "isUnique": true + } + }, + "foreignKeys": { + "group_owner_id_user_id_fk": { + "name": "group_owner_id_user_id_fk", + "tableFrom": "group", + "tableTo": "user", + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "iconRepository": { + "name": "iconRepository", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "icon": { + "name": "icon", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "checksum": { + "name": "checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_repository_id": { + "name": "icon_repository_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "icon_icon_repository_id_iconRepository_id_fk": { + "name": "icon_icon_repository_id_iconRepository_id_fk", + "tableFrom": "icon", + "tableTo": "iconRepository", + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integrationGroupPermissions": { + "name": "integrationGroupPermissions", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integrationGroupPermissions_integration_id_integration_id_fk": { + "name": "integrationGroupPermissions_integration_id_integration_id_fk", + "tableFrom": "integrationGroupPermissions", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integrationGroupPermissions_group_id_group_id_fk": { + "name": "integrationGroupPermissions_group_id_group_id_fk", + "tableFrom": "integrationGroupPermissions", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integrationGroupPermissions_integration_id_group_id_permission_pk": { + "columns": ["integration_id", "group_id", "permission"], + "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integration_item": { + "name": "integration_item", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integration_item_item_id_item_id_fk": { + "name": "integration_item_item_id_item_id_fk", + "tableFrom": "integration_item", + "tableTo": "item", + "columnsFrom": ["item_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integration_item_integration_id_integration_id_fk": { + "name": "integration_item_integration_id_integration_id_fk", + "tableFrom": "integration_item", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integration_item_item_id_integration_id_pk": { + "columns": ["item_id", "integration_id"], + "name": "integration_item_item_id_integration_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integrationSecret": { + "name": "integrationSecret", + "columns": { + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "integration_secret__kind_idx": { + "name": "integration_secret__kind_idx", + "columns": ["kind"], + "isUnique": false + }, + "integration_secret__updated_at_idx": { + "name": "integration_secret__updated_at_idx", + "columns": ["updated_at"], + "isUnique": false + } + }, + "foreignKeys": { + "integrationSecret_integration_id_integration_id_fk": { + "name": "integrationSecret_integration_id_integration_id_fk", + "tableFrom": "integrationSecret", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integrationSecret_integration_id_kind_pk": { + "columns": ["integration_id", "kind"], + "name": "integrationSecret_integration_id_kind_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integrationUserPermission": { + "name": "integrationUserPermission", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integrationUserPermission_integration_id_integration_id_fk": { + "name": "integrationUserPermission_integration_id_integration_id_fk", + "tableFrom": "integrationUserPermission", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integrationUserPermission_user_id_user_id_fk": { + "name": "integrationUserPermission_user_id_user_id_fk", + "tableFrom": "integrationUserPermission", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integrationUserPermission_integration_id_user_id_permission_pk": { + "columns": ["integration_id", "user_id", "permission"], + "name": "integrationUserPermission_integration_id_user_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integration": { + "name": "integration", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "integration__kind_idx": { + "name": "integration__kind_idx", + "columns": ["kind"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "invite": { + "name": "invite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expiration_date": { + "name": "expiration_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "creator_id": { + "name": "creator_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "invite_token_unique": { + "name": "invite_token_unique", + "columns": ["token"], + "isUnique": true + } + }, + "foreignKeys": { + "invite_creator_id_user_id_fk": { + "name": "invite_creator_id_user_id_fk", + "tableFrom": "invite", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "item": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "section_id": { + "name": "section_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "options": { + "name": "options", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'{\"json\": {}}'" + }, + "advanced_options": { + "name": "advanced_options", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'{\"json\": {}}'" + } + }, + "indexes": {}, + "foreignKeys": { + "item_section_id_section_id_fk": { + "name": "item_section_id_section_id_fk", + "tableFrom": "item", + "tableTo": "section", + "columnsFrom": ["section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "media": { + "name": "media", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "blob", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "size": { + "name": "size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(unixepoch())" + }, + "creator_id": { + "name": "creator_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "media_creator_id_user_id_fk": { + "name": "media_creator_id_user_id_fk", + "tableFrom": "media", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "onboarding": { + "name": "onboarding", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "step": { + "name": "step", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "previous_step": { + "name": "previous_step", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "search_engine": { + "name": "search_engine", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "short": { + "name": "short", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url_template": { + "name": "url_template", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'generic'" + }, + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "search_engine_short_unique": { + "name": "search_engine_short_unique", + "columns": ["short"], + "isUnique": true + } + }, + "foreignKeys": { + "search_engine_integration_id_integration_id_fk": { + "name": "search_engine_integration_id_integration_id_fk", + "tableFrom": "search_engine", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "section": { + "name": "section", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "board_id": { + "name": "board_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "parent_section_id": { + "name": "parent_section_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "section_board_id_board_id_fk": { + "name": "section_board_id_board_id_fk", + "tableFrom": "section", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "section_parent_section_id_section_id_fk": { + "name": "section_parent_section_id_section_id_fk", + "tableFrom": "section", + "tableTo": "section", + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serverSetting": { + "name": "serverSetting", + "columns": { + "setting_key": { + "name": "setting_key", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'{\"json\": {}}'" + } + }, + "indexes": { + "serverSetting_settingKey_unique": { + "name": "serverSetting_settingKey_unique", + "columns": ["setting_key"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "session": { + "name": "session", + "columns": { + "session_token": { + "name": "session_token", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'credentials'" + }, + "home_board_id": { + "name": "home_board_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "default_search_engine_id": { + "name": "default_search_engine_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "color_scheme": { + "name": "color_scheme", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'dark'" + }, + "first_day_of_week": { + "name": "first_day_of_week", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "ping_icons_enabled": { + "name": "ping_icons_enabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_home_board_id_board_id_fk": { + "name": "user_home_board_id_board_id_fk", + "tableFrom": "user", + "tableTo": "board", + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "user_default_search_engine_id_search_engine_id_fk": { + "name": "user_default_search_engine_id_search_engine_id_fk", + "tableFrom": "user", + "tableTo": "search_engine", + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "verificationToken": { + "name": "verificationToken", + "columns": { + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verificationToken_identifier_token_pk": { + "columns": ["identifier", "token"], + "name": "verificationToken_identifier_token_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} diff --git a/packages/db/migrations/sqlite/meta/_journal.json b/packages/db/migrations/sqlite/meta/_journal.json index f98702c73..6de47a722 100644 --- a/packages/db/migrations/sqlite/meta/_journal.json +++ b/packages/db/migrations/sqlite/meta/_journal.json @@ -134,6 +134,13 @@ "when": 1735593831501, "tag": "0018_cheerful_tattoo", "breakpoints": true + }, + { + "idx": 19, + "version": "6", + "when": 1735651175378, + "tag": "0019_steady_darkhawk", + "breakpoints": true } ] } diff --git a/packages/db/package.json b/packages/db/package.json index 3d1ecbd43..4a666265f 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -45,7 +45,7 @@ "@paralleldrive/cuid2": "^2.2.2", "@t3-oss/env-nextjs": "^0.11.1", "@testcontainers/mysql": "^10.16.0", - "better-sqlite3": "^11.7.0", + "better-sqlite3": "^11.7.2", "dotenv": "^16.4.7", "drizzle-kit": "^0.30.1", "drizzle-orm": "^0.38.3", @@ -61,6 +61,6 @@ "eslint": "^9.17.0", "prettier": "^3.4.2", "tsx": "4.19.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/db/schema/mysql.ts b/packages/db/schema/mysql.ts index eee05d801..9c7408e24 100644 --- a/packages/db/schema/mysql.ts +++ b/packages/db/schema/mysql.ts @@ -62,6 +62,9 @@ export const users = mysqlTable("user", { homeBoardId: varchar({ length: 64 }).references((): AnyMySqlColumn => boards.id, { onDelete: "set null", }), + defaultSearchEngineId: varchar({ length: 64 }).references(() => searchEngines.id, { + onDelete: "set null", + }), colorScheme: varchar({ length: 5 }).$type().default("dark").notNull(), firstDayOfWeek: tinyint().$type().default(1).notNull(), // Defaults to Monday pingIconsEnabled: boolean().default(false).notNull(), @@ -409,13 +412,17 @@ export const accountRelations = relations(accounts, ({ one }) => ({ }), })); -export const userRelations = relations(users, ({ many }) => ({ +export const userRelations = relations(users, ({ one, many }) => ({ accounts: many(accounts), boards: many(boards), boardPermissions: many(boardUserPermissions), groups: many(groupMembers), ownedGroups: many(groups), invites: many(invites), + defaultSearchEngine: one(searchEngines, { + fields: [users.defaultSearchEngineId], + references: [searchEngines.id], + }), })); export const mediaRelations = relations(medias, ({ one }) => ({ @@ -573,9 +580,10 @@ export const integrationItemRelations = relations(integrationItems, ({ one }) => }), })); -export const searchEngineRelations = relations(searchEngines, ({ one }) => ({ +export const searchEngineRelations = relations(searchEngines, ({ one, many }) => ({ integration: one(integrations, { fields: [searchEngines.integrationId], references: [integrations.id], }), + usersWithDefault: many(users), })); diff --git a/packages/db/schema/sqlite.ts b/packages/db/schema/sqlite.ts index e88a92297..5da9caa16 100644 --- a/packages/db/schema/sqlite.ts +++ b/packages/db/schema/sqlite.ts @@ -45,6 +45,9 @@ export const users = sqliteTable("user", { homeBoardId: text().references((): AnySQLiteColumn => boards.id, { onDelete: "set null", }), + defaultSearchEngineId: text().references(() => searchEngines.id, { + onDelete: "set null", + }), colorScheme: text().$type().default("dark").notNull(), firstDayOfWeek: int().$type().default(1).notNull(), // Defaults to Monday pingIconsEnabled: int({ mode: "boolean" }).default(false).notNull(), @@ -395,7 +398,7 @@ export const accountRelations = relations(accounts, ({ one }) => ({ }), })); -export const userRelations = relations(users, ({ many }) => ({ +export const userRelations = relations(users, ({ one, many }) => ({ accounts: many(accounts), boards: many(boards), boardPermissions: many(boardUserPermissions), @@ -403,6 +406,10 @@ export const userRelations = relations(users, ({ many }) => ({ ownedGroups: many(groups), invites: many(invites), medias: many(medias), + defaultSearchEngine: one(searchEngines, { + fields: [users.defaultSearchEngineId], + references: [searchEngines.id], + }), })); export const mediaRelations = relations(medias, ({ one }) => ({ @@ -560,9 +567,10 @@ export const integrationItemRelations = relations(integrationItems, ({ one }) => }), })); -export const searchEngineRelations = relations(searchEngines, ({ one }) => ({ +export const searchEngineRelations = relations(searchEngines, ({ one, many }) => ({ integration: one(integrations, { fields: [searchEngines.integrationId], references: [integrations.id], }), + usersWithDefault: many(users), })); diff --git a/packages/definitions/package.json b/packages/definitions/package.json index 105aa402b..151d26d84 100644 --- a/packages/definitions/package.json +++ b/packages/definitions/package.json @@ -30,6 +30,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/definitions/src/integration.ts b/packages/definitions/src/integration.ts index 1ace6b955..82f6e2080 100644 --- a/packages/definitions/src/integration.ts +++ b/packages/definitions/src/integration.ts @@ -20,122 +20,122 @@ export const integrationDefs = { sabNzbd: { name: "SABnzbd", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/sabnzbd.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/sabnzbd.png", category: ["downloadClient", "usenet"], }, nzbGet: { name: "NZBGet", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/nzbget.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/nzbget.png", category: ["downloadClient", "usenet"], }, deluge: { name: "Deluge", secretKinds: [["password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/deluge.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/deluge.png", category: ["downloadClient", "torrent"], }, transmission: { name: "Transmission", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/transmission.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/transmission.png", category: ["downloadClient", "torrent"], }, qBittorrent: { name: "qBittorrent", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/qbittorrent.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/qbittorrent.png", category: ["downloadClient", "torrent"], }, sonarr: { name: "Sonarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/sonarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/sonarr.png", category: ["calendar"], }, radarr: { name: "Radarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/radarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/radarr.png", category: ["calendar"], }, lidarr: { name: "Lidarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/lidarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/lidarr.png", category: ["calendar"], }, readarr: { name: "Readarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/readarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/readarr.png", category: ["calendar"], }, prowlarr: { name: "Prowlarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/prowlarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/prowlarr.png", category: ["indexerManager"], }, jellyfin: { name: "Jellyfin", secretKinds: [["username", "password"], ["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/jellyfin.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/jellyfin.png", category: ["mediaService"], }, plex: { name: "Plex", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/plex.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/plex.png", category: ["mediaService"], }, jellyseerr: { name: "Jellyseerr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/jellyseerr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/jellyseerr.png", category: ["mediaSearch", "mediaRequest", "search"], }, overseerr: { name: "Overseerr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/overseerr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/overseerr.png", category: ["mediaSearch", "mediaRequest", "search"], }, piHole: { name: "Pi-hole", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/pi-hole.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/pi-hole.png", category: ["dnsHole"], }, adGuardHome: { name: "AdGuard Home", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/adguard-home.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/adguard-home.png", category: ["dnsHole"], }, homeAssistant: { name: "Home Assistant", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/home-assistant.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/home-assistant.png", category: ["smartHomeServer"], }, openmediavault: { name: "OpenMediaVault", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/openmediavault.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/openmediavault.png", category: ["healthMonitoring"], }, dashDot: { name: "Dash.", secretKinds: [[]], category: ["healthMonitoring"], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/dashdot.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/dashdot.png", }, tdarr: { name: "Tdarr", secretKinds: [[]], category: ["mediaTranscoding"], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/tdarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/tdarr.png", }, } as const satisfies Record; diff --git a/packages/form/package.json b/packages/form/package.json index e3d903a74..fd34708fc 100644 --- a/packages/form/package.json +++ b/packages/form/package.json @@ -26,13 +26,13 @@ "@homarr/common": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/form": "^7.15.2" + "@mantine/form": "^7.15.3" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/icons/package.json b/packages/icons/package.json index d0bc89830..6dcaf8b77 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -32,6 +32,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/icons/src/auto-icon-searcher.ts b/packages/icons/src/auto-icon-searcher.ts index 0eef30e5e..06f3d9b76 100644 --- a/packages/icons/src/auto-icon-searcher.ts +++ b/packages/icons/src/auto-icon-searcher.ts @@ -2,8 +2,8 @@ import type { Database } from "@homarr/db"; import { like } from "@homarr/db"; import { icons } from "@homarr/db/schema"; -export const getIconForNameAsync = async (db: Database, name: string) => { - return await db.query.icons.findFirst({ +export const getIconForName = (db: Database, name: string) => { + return db.query.icons.findFirst({ where: like(icons.name, `%${name}%`), }); }; diff --git a/packages/icons/src/icons-fetcher.ts b/packages/icons/src/icons-fetcher.ts index d1be6a75a..b9ab3c450 100644 --- a/packages/icons/src/icons-fetcher.ts +++ b/packages/icons/src/icons-fetcher.ts @@ -5,12 +5,12 @@ import type { RepositoryIconGroup } from "./types"; const repositories = [ new GitHubIconRepository( - "Walkxcode", - "walkxcode/dashboard-icons", + "Dashboard Icons", + "homarr-labs/dashboard-icons", undefined, - new URL("https://github.com/walkxcode/dashboard-icons"), - new URL("https://api.github.com/repos/walkxcode/dashboard-icons/git/trees/main?recursive=true"), - "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/{0}", + new URL("https://github.com/homarr-labs/dashboard-icons"), + new URL("https://api.github.com/repos/homarr-labs/dashboard-icons/git/trees/main?recursive=true"), + "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/{0}", ), new GitHubIconRepository( "selfh.st", diff --git a/packages/integrations/package.json b/packages/integrations/package.json index e1dab49da..69052c2da 100644 --- a/packages/integrations/package.json +++ b/packages/integrations/package.json @@ -43,6 +43,6 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/xml2js": "^0.4.14", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/log/package.json b/packages/log/package.json index 967383b46..52735d96c 100644 --- a/packages/log/package.json +++ b/packages/log/package.json @@ -35,6 +35,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/modals-collection/package.json b/packages/modals-collection/package.json index e7afee8fa..6a3cad5cd 100644 --- a/packages/modals-collection/package.json +++ b/packages/modals-collection/package.json @@ -32,17 +32,18 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.15.2", - "@tabler/icons-react": "^3.26.0", + "@mantine/core": "^7.15.3", + "@tabler/icons-react": "^3.28.1", "dayjs": "^1.11.13", - "next": "^14.2.22", - "react": "^19.0.0" + "next": "15.1.4", + "react": "19.0.0", + "react-dom": "19.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/modals-collection/src/boards/duplicate-board-modal.tsx b/packages/modals-collection/src/boards/duplicate-board-modal.tsx new file mode 100644 index 000000000..083cb716b --- /dev/null +++ b/packages/modals-collection/src/boards/duplicate-board-modal.tsx @@ -0,0 +1,96 @@ +import { Button, Group, Stack, Text, TextInput } from "@mantine/core"; + +import { clientApi } from "@homarr/api/client"; +import type { MaybePromise } from "@homarr/common/types"; +import { useZodForm } from "@homarr/form"; +import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; +import { useI18n } from "@homarr/translation/client"; +import { validation } from "@homarr/validation"; + +import { createModal } from "../../../modals/src/creator"; +import { useBoardNameStatus } from "./add-board-modal"; + +interface InnerProps { + board: { + id: string; + name: string; + }; + onSuccess: () => MaybePromise; +} + +export const DuplicateBoardModal = createModal(({ actions, innerProps }) => { + const t = useI18n(); + const form = useZodForm(validation.board.duplicate.omit({ id: true }), { + mode: "controlled", + initialValues: { + name: innerProps.board.name, + }, + }); + const boardNameStatus = useBoardNameStatus(form.values.name); + const { mutateAsync, isPending } = clientApi.board.duplicateBoard.useMutation(); + + return ( +
{ + // Prevent submit before name availability check + if (!boardNameStatus.canSubmit) return; + await mutateAsync( + { + ...values, + id: innerProps.board.id, + }, + { + async onSuccess() { + actions.closeModal(); + showSuccessNotification({ + title: t("board.action.duplicate.notification.success.title"), + message: t("board.action.duplicate.notification.success.message"), + }); + await innerProps.onSuccess(); + }, + onError() { + showErrorNotification({ + title: t("board.action.duplicate.notification.error.title"), + message: t("board.action.duplicate.notification.error.message"), + }); + }, + }, + ); + })} + > + + + {t("board.action.duplicate.message", { name: innerProps.board.name })} + + + + {boardNameStatus.description.icon ? : null} + {boardNameStatus.description.label} + + ) : null + } + withAsterisk + /> + + + + + + + + ); +}).withOptions({ + defaultTitle(t) { + return t("board.action.duplicate.title"); + }, +}); diff --git a/packages/modals-collection/src/boards/index.ts b/packages/modals-collection/src/boards/index.ts index 3da35c853..8594bb424 100644 --- a/packages/modals-collection/src/boards/index.ts +++ b/packages/modals-collection/src/boards/index.ts @@ -1,2 +1,3 @@ export { AddBoardModal } from "./add-board-modal"; export { ImportBoardModal } from "./import-board-modal"; +export { DuplicateBoardModal } from "./duplicate-board-modal"; diff --git a/packages/modals-collection/src/docker/add-docker-app-to-homarr.tsx b/packages/modals-collection/src/docker/add-docker-app-to-homarr.tsx new file mode 100644 index 000000000..9a5f2d5fc --- /dev/null +++ b/packages/modals-collection/src/docker/add-docker-app-to-homarr.tsx @@ -0,0 +1,91 @@ +import { Button, Group, Image, List, LoadingOverlay, Stack, Text, TextInput } from "@mantine/core"; + +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/client"; +import { useZodForm } from "@homarr/form"; +import { createModal } from "@homarr/modals"; +import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; +import { useI18n } from "@homarr/translation/client"; +import { z } from "@homarr/validation"; + +interface AddDockerAppToHomarrProps { + selectedContainers: RouterOutputs["docker"]["getContainers"]["containers"]; +} + +export const AddDockerAppToHomarrModal = createModal(({ actions, innerProps }) => { + const t = useI18n(); + const form = useZodForm( + z.object({ + containerUrls: z.array(z.string().url().nullable()), + }), + { + initialValues: { + containerUrls: innerProps.selectedContainers.map((container) => { + if (container.ports[0]) { + return `http://${container.ports[0].IP}:${container.ports[0].PublicPort}`; + } + + return null; + }), + }, + }, + ); + const { mutate, isPending } = clientApi.app.createMany.useMutation({ + onSuccess() { + actions.closeModal(); + showSuccessNotification({ + title: t("docker.action.addToHomarr.notification.success.title"), + message: t("docker.action.addToHomarr.notification.success.message"), + }); + }, + onError() { + showErrorNotification({ + title: t("docker.action.addToHomarr.notification.error.title"), + message: t("docker.action.addToHomarr.notification.error.message"), + }); + }, + }); + const handleSubmit = () => { + mutate( + innerProps.selectedContainers.map((container, index) => ({ + name: container.name, + iconUrl: container.iconUrl, + description: null, + href: form.values.containerUrls[index] ?? null, + })), + ); + }; + return ( +
+ + + + {innerProps.selectedContainers.map((container, index) => ( + } + key={container.id} + > + + {container.name} + + + + ))} + + + + + + + + ); +}).withOptions({ + defaultTitle(t) { + return t("docker.action.addToHomarr.modal.title"); + }, +}); diff --git a/packages/modals-collection/src/docker/index.ts b/packages/modals-collection/src/docker/index.ts new file mode 100644 index 000000000..31b956245 --- /dev/null +++ b/packages/modals-collection/src/docker/index.ts @@ -0,0 +1 @@ +export { AddDockerAppToHomarrModal as AddDockerAppToHomarr } from "./add-docker-app-to-homarr"; diff --git a/packages/modals-collection/src/index.ts b/packages/modals-collection/src/index.ts index 66672e577..30d81d892 100644 --- a/packages/modals-collection/src/index.ts +++ b/packages/modals-collection/src/index.ts @@ -2,3 +2,4 @@ export * from "./boards"; export * from "./invites"; export * from "./groups"; export * from "./search-engines"; +export * from "./docker"; diff --git a/packages/modals/package.json b/packages/modals/package.json index e940aa1f6..eb3fd39b9 100644 --- a/packages/modals/package.json +++ b/packages/modals/package.json @@ -24,15 +24,15 @@ "dependencies": { "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", - "@mantine/core": "^7.15.2", - "@mantine/hooks": "^7.15.2", - "react": "^19.0.0" + "@mantine/core": "^7.15.3", + "@mantine/hooks": "^7.15.3", + "react": "19.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/notifications/package.json b/packages/notifications/package.json index fc5726a6d..7fc6c70d3 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -24,14 +24,14 @@ "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/ui": "workspace:^0.1.0", - "@mantine/notifications": "^7.15.2", - "@tabler/icons-react": "^3.26.0" + "@mantine/notifications": "^7.15.3", + "@tabler/icons-react": "^3.28.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/old-import/package.json b/packages/old-import/package.json index ec29f8684..c8d7c7d02 100644 --- a/packages/old-import/package.json +++ b/packages/old-import/package.json @@ -37,11 +37,12 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.15.2", - "@mantine/hooks": "^7.15.2", + "@mantine/core": "^7.15.3", + "@mantine/hooks": "^7.15.3", "adm-zip": "0.5.16", - "next": "^14.2.22", - "react": "^19.0.0", + "next": "15.1.4", + "react": "19.0.0", + "react-dom": "19.0.0", "superjson": "2.2.2", "zod": "^3.24.1", "zod-form-data": "^2.0.5" @@ -52,6 +53,6 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/adm-zip": "0.5.7", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/old-schema/package.json b/packages/old-schema/package.json index 25c082f6f..afdbd2a93 100644 --- a/packages/old-schema/package.json +++ b/packages/old-schema/package.json @@ -30,6 +30,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/ping/package.json b/packages/ping/package.json index a4efede52..bf31c713a 100644 --- a/packages/ping/package.json +++ b/packages/ping/package.json @@ -30,6 +30,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/redis/package.json b/packages/redis/package.json index 12ae812ce..4627813dc 100644 --- a/packages/redis/package.json +++ b/packages/redis/package.json @@ -34,6 +34,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/request-handler/package.json b/packages/request-handler/package.json index e50417232..aa6900035 100644 --- a/packages/request-handler/package.json +++ b/packages/request-handler/package.json @@ -29,7 +29,7 @@ "@homarr/log": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0", "dayjs": "^1.11.13", - "octokit": "^4.0.3", + "octokit": "^4.1.0", "pretty-print-error": "^1.1.2", "superjson": "2.2.2" }, @@ -38,6 +38,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/server-settings/package.json b/packages/server-settings/package.json index 6e391a324..812e2af4f 100644 --- a/packages/server-settings/package.json +++ b/packages/server-settings/package.json @@ -30,6 +30,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/server-settings/src/index.ts b/packages/server-settings/src/index.ts index 779490f00..1381dc98f 100644 --- a/packages/server-settings/src/index.ts +++ b/packages/server-settings/src/index.ts @@ -7,6 +7,7 @@ export const defaultServerSettingsKeys = [ "board", "appearance", "culture", + "search", ] as const; export type ServerSettingsRecord = Record<(typeof defaultServerSettingsKeys)[number], Record>; @@ -33,6 +34,9 @@ export const defaultServerSettings = { culture: { defaultLocale: "en" as SupportedLanguage, }, + search: { + defaultSearchEngineId: null as string | null, + }, } satisfies ServerSettingsRecord; export type ServerSettings = typeof defaultServerSettings; diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index 0c18f9c04..f4bae441b 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -32,13 +32,14 @@ "@homarr/modals-collection": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", - "@mantine/core": "^7.15.2", - "@mantine/hooks": "^7.15.2", - "@mantine/spotlight": "^7.15.2", - "@tabler/icons-react": "^3.26.0", + "@mantine/core": "^7.15.3", + "@mantine/hooks": "^7.15.3", + "@mantine/spotlight": "^7.15.3", + "@tabler/icons-react": "^3.28.1", "jotai": "^2.11.0", - "next": "^14.2.22", - "react": "^19.0.0", + "next": "15.1.4", + "react": "19.0.0", + "react-dom": "19.0.0", "use-deep-compare-effect": "^1.8.1" }, "devDependencies": { @@ -46,6 +47,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/spotlight/src/components/actions/items/group-action-item.tsx b/packages/spotlight/src/components/actions/items/group-action-item.tsx index 6dd70c5ff..a4221f514 100644 --- a/packages/spotlight/src/components/actions/items/group-action-item.tsx +++ b/packages/spotlight/src/components/actions/items/group-action-item.tsx @@ -45,7 +45,9 @@ export const SpotlightGroupActionItem = diff --git a/packages/spotlight/src/components/spotlight.tsx b/packages/spotlight/src/components/spotlight.tsx index 70c0da866..1f4158076 100644 --- a/packages/spotlight/src/components/spotlight.tsx +++ b/packages/spotlight/src/components/spotlight.tsx @@ -1,10 +1,10 @@ "use client"; import type { Dispatch, SetStateAction } from "react"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { useMemo, useRef, useState } from "react"; import { ActionIcon, Center, Group, Kbd } from "@mantine/core"; import { Spotlight as MantineSpotlight } from "@mantine/spotlight"; -import { IconSearch, IconX } from "@tabler/icons-react"; +import { IconQuestionMark, IconSearch, IconX } from "@tabler/icons-react"; import type { TranslationObject } from "@homarr/translation"; import { useI18n } from "@homarr/translation/client"; @@ -12,53 +12,32 @@ import { useI18n } from "@homarr/translation/client"; import type { inferSearchInteractionOptions } from "../lib/interaction"; import type { SearchMode } from "../lib/mode"; import { searchModes } from "../modes"; -import { useSpotlightContextResults } from "../modes/home/context"; import { selectAction, spotlightStore } from "../spotlight-store"; import { SpotlightChildrenActions } from "./actions/children-actions"; import { SpotlightActionGroups } from "./actions/groups/action-group"; type SearchModeKey = keyof TranslationObject["search"]["mode"]; +const defaultMode = "home"; export const Spotlight = () => { - const items = useSpotlightContextResults(); - // We fallback to help if no context results are available - const defaultMode = items.length >= 1 ? "home" : "help"; const searchModeState = useState(defaultMode); const mode = searchModeState[0]; const activeMode = useMemo(() => searchModes.find((searchMode) => searchMode.modeKey === mode), [mode]); - /** - * The below logic is used to switch to home page if any context results are registered - * or to help page if context results are unregistered - */ - const previousLengthRef = useRef(items.length); - useEffect(() => { - if (items.length >= 1 && previousLengthRef.current === 0) { - searchModeState[1]("home"); - } else if (items.length === 0 && previousLengthRef.current >= 1) { - searchModeState[1]("help"); - } - - previousLengthRef.current = items.length; - }, [items.length, searchModeState]); - if (!activeMode) { return null; } // We use the "key" below to prevent the 'Different amounts of hooks' error - return ( - - ); + return ; }; interface SpotlightWithActiveModeProps { modeState: [SearchModeKey, Dispatch>]; activeMode: SearchMode; - defaultMode: SearchModeKey; } -const SpotlightWithActiveMode = ({ modeState, activeMode, defaultMode }: SpotlightWithActiveModeProps) => { +const SpotlightWithActiveMode = ({ modeState, activeMode }: SpotlightWithActiveModeProps) => { const [query, setQuery] = useState(""); const [mode, setMode] = modeState; const [childrenOptions, setChildrenOptions] = useState | null>(null); @@ -77,7 +56,7 @@ const SpotlightWithActiveMode = ({ modeState, activeMode, defaultMode }: Spotlig }} query={query} onQueryChange={(query) => { - if ((mode !== "help" && mode !== "home") || query.length !== 1) { + if (mode !== "help" || query.length !== 1) { setQuery(query); } @@ -110,7 +89,17 @@ const SpotlightWithActiveMode = ({ modeState, activeMode, defaultMode }: Spotlig }, }} rightSection={ - mode === defaultMode ? undefined : ( + mode === defaultMode ? ( + { + setMode("help"); + inputRef.current?.focus(); + }} + variant="subtle" + > + + + ) : ( { setMode(defaultMode); diff --git a/packages/spotlight/src/lib/group.ts b/packages/spotlight/src/lib/group.ts index 4049d1a8e..d68a1e05c 100644 --- a/packages/spotlight/src/lib/group.ts +++ b/packages/spotlight/src/lib/group.ts @@ -1,5 +1,4 @@ import type { JSX } from "react"; -import type { UseTRPCQueryResult } from "@trpc/react-query/shared"; import type { stringOrTranslation } from "@homarr/translation"; @@ -29,9 +28,12 @@ export type SearchGroup = any> = { filter: (query: string, option: TOption) => boolean; sort?: (query: string, options: [TOption, TOption]) => number; - useOptions: () => TOption[]; + useOptions: (query: string) => TOption[]; } > - | CommonSearchGroup UseTRPCQueryResult }>; + | CommonSearchGroup< + TOption, + { useQueryOptions: (query: string) => { data: TOption[] | undefined; isLoading: boolean; isError: boolean } } + >; export const createGroup = >(group: SearchGroup) => group; diff --git a/packages/spotlight/src/lib/interaction.ts b/packages/spotlight/src/lib/interaction.ts index b917b3bcd..1854c8c48 100644 --- a/packages/spotlight/src/lib/interaction.ts +++ b/packages/spotlight/src/lib/interaction.ts @@ -4,7 +4,7 @@ import type { TranslationObject } from "@homarr/translation"; import type { CreateChildrenOptionsProps } from "./children"; const createSearchInteraction = (type: TType) => ({ - optionsType: >() => ({ type, _inferOptions: {} as TOption }), + optionsType: | undefined>() => ({ type, _inferOptions: {} as TOption }), }); // This is used to define search interactions with their options @@ -20,20 +20,23 @@ const searchInteractions = [ // eslint-disable-next-line @typescript-eslint/no-explicit-any option: any; }>(), + createSearchInteraction("none").optionsType(), ] as const; // Union of all search interactions types export type SearchInteraction = (typeof searchInteractions)[number]["type"]; // Infer the options for the specified search interaction -export type inferSearchInteractionOptions = Extract< - (typeof searchInteractions)[number], - { type: TInteraction } ->["_inferOptions"]; +export type inferSearchInteractionOptions = Exclude< + Extract<(typeof searchInteractions)[number], { type: TInteraction }>["_inferOptions"], + undefined +>; // Infer the search interaction definition (type + options) for the specified search interaction export type inferSearchInteractionDefinition = { - [interactionKey in TInteraction]: { type: interactionKey } & inferSearchInteractionOptions; + [interactionKey in TInteraction]: inferSearchInteractionOptions extends never + ? { type: interactionKey } + : { type: interactionKey } & inferSearchInteractionOptions; }[TInteraction]; // Type used for helper functions to define basic search interactions diff --git a/packages/spotlight/src/modes/external/search-engines-search-group.tsx b/packages/spotlight/src/modes/external/search-engines-search-group.tsx index 2d73ba2e9..57bde8cb6 100644 --- a/packages/spotlight/src/modes/external/search-engines-search-group.tsx +++ b/packages/spotlight/src/modes/external/search-engines-search-group.tsx @@ -11,9 +11,11 @@ import { useScopedI18n } from "@homarr/translation/client"; import { createChildrenOptions } from "../../lib/children"; import { createGroup } from "../../lib/group"; +import type { inferSearchInteractionDefinition } from "../../lib/interaction"; import { interaction } from "../../lib/interaction"; type SearchEngine = RouterOutputs["searchEngine"]["search"][number]; +type FromIntegrationSearchResult = RouterOutputs["integration"]["searchInIntegration"][number]; // eslint-disable-next-line @typescript-eslint/consistent-type-definitions type MediaRequestChildrenProps = { @@ -33,6 +35,52 @@ type MediaRequestChildrenProps = { }; }; +export const useFromIntegrationSearchInteraction = ( + searchEngine: SearchEngine, + searchResult: FromIntegrationSearchResult, +): inferSearchInteractionDefinition<"link" | "javaScript" | "children"> => { + if (searchEngine.type !== "fromIntegration") { + throw new Error("Invalid search engine type"); + } + + if (!searchEngine.integration) { + throw new Error("Invalid search engine integration"); + } + + if ( + getIntegrationKindsByCategory("mediaRequest").some( + (categoryKind) => categoryKind === searchEngine.integration?.kind, + ) && + "type" in searchResult + ) { + const type = searchResult.type; + if (type === "person") { + return { + type: "link", + href: searchResult.link, + newTab: true, + }; + } + + return { + type: "children", + ...mediaRequestsChildrenOptions({ + result: { + ...searchResult, + type, + }, + integration: searchEngine.integration, + }), + }; + } + + return { + type: "link", + href: searchResult.link, + newTab: true, + }; +}; + const mediaRequestsChildrenOptions = createChildrenOptions({ useActions() { const { openModal } = useModalAction(RequestMediaModal); @@ -162,47 +210,8 @@ export const searchEnginesChildrenOptions = createChildrenOptions( ); }, - useInteraction(searchEngine) { - if (searchEngine.type !== "fromIntegration") { - throw new Error("Invalid search engine type"); - } - - if (!searchEngine.integration) { - throw new Error("Invalid search engine integration"); - } - - if ( - getIntegrationKindsByCategory("mediaRequest").some( - (categoryKind) => categoryKind === searchEngine.integration?.kind, - ) && - "type" in searchResult - ) { - const type = searchResult.type; - if (type === "person") { - return { - type: "link", - href: searchResult.link, - newTab: true, - }; - } - - return { - type: "children", - ...mediaRequestsChildrenOptions({ - result: { - ...searchResult, - type, - }, - integration: searchEngine.integration, - }), - }; - } - - return { - type: "link", - href: searchResult.link, - newTab: true, - }; + useInteraction() { + return useFromIntegrationSearchInteraction(searchEngine, searchResult); }, })); }, diff --git a/packages/spotlight/src/modes/home/home-search-engine-group.tsx b/packages/spotlight/src/modes/home/home-search-engine-group.tsx new file mode 100644 index 000000000..d99cb3713 --- /dev/null +++ b/packages/spotlight/src/modes/home/home-search-engine-group.tsx @@ -0,0 +1,173 @@ +import { Box, Group, Stack, Text } from "@mantine/core"; +import type { TablerIcon } from "@tabler/icons-react"; +import { IconCaretUpDown, IconSearch, IconSearchOff } from "@tabler/icons-react"; + +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/client"; +import type { Session } from "@homarr/auth"; +import { useSession } from "@homarr/auth/client"; +import type { TranslationFunction } from "@homarr/translation"; +import { useI18n } from "@homarr/translation/client"; + +import { createGroup } from "../../lib/group"; +import type { inferSearchInteractionDefinition, SearchInteraction } from "../../lib/interaction"; +import { useFromIntegrationSearchInteraction } from "../external/search-engines-search-group"; + +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +type GroupItem = { + id: string; + name: string; + description?: string; + icon: TablerIcon | string; + useInteraction: (query: string) => inferSearchInteractionDefinition; +}; + +export const homeSearchEngineGroup = createGroup({ + title: (t) => t("search.mode.home.group.search.title"), + keyPath: "id", + Component(item) { + const icon = + typeof item.icon !== "string" ? ( + + ) : ( + + {item.name} + + ); + + return ( + + {icon} + + {item.name} + {item.description && ( + + {item.description} + + )} + + + ); + }, + useInteraction(item, query) { + return item.useInteraction(query); + }, + filter() { + return true; + }, + useQueryOptions(query) { + const t = useI18n(); + const { data: session, status } = useSession(); + const { data: defaultSearchEngine, ...defaultSearchEngineQuery } = + clientApi.searchEngine.getDefaultSearchEngine.useQuery(undefined, { + enabled: status !== "loading", + }); + const fromIntegrationEnabled = defaultSearchEngine?.type === "fromIntegration" && query.length > 0; + const { data: results, ...resultQuery } = clientApi.integration.searchInIntegration.useQuery( + { + query, + integrationId: defaultSearchEngine?.integrationId ?? "", + }, + { + enabled: fromIntegrationEnabled, + select: (data) => data.slice(0, 5), + }, + ); + + return { + isLoading: + defaultSearchEngineQuery.isLoading || (resultQuery.isLoading && fromIntegrationEnabled) || status === "loading", + isError: defaultSearchEngineQuery.isError || (resultQuery.isError && fromIntegrationEnabled), + data: [ + ...createDefaultSearchEntries(defaultSearchEngine, results, session, query, t), + { + id: "other", + name: t("search.mode.home.group.search.option.other.label"), + icon: IconCaretUpDown, + useInteraction() { + return { + type: "mode", + mode: "external", + }; + }, + }, + ], + }; + }, +}); + +const createDefaultSearchEntries = ( + defaultSearchEngine: RouterOutputs["searchEngine"]["getDefaultSearchEngine"] | null, + results: RouterOutputs["integration"]["searchInIntegration"] | undefined, + session: Session | null, + query: string, + t: TranslationFunction, +): GroupItem[] => { + if (!session?.user && !defaultSearchEngine) { + return []; + } + + if (!defaultSearchEngine) { + return [ + { + id: "no-default", + name: t("search.mode.home.group.search.option.no-default.label"), + description: t("search.mode.home.group.search.option.no-default.description"), + icon: IconSearchOff, + useInteraction() { + return { + type: "link", + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + href: `/manage/users/${session!.user.id}/general`, + }; + }, + }, + ]; + } + + if (defaultSearchEngine.type === "generic") { + return [ + { + id: "search", + name: t("search.mode.home.group.search.option.search.label", { + query, + name: defaultSearchEngine.name, + }), + icon: defaultSearchEngine.iconUrl, + useInteraction(query) { + return { + type: "link", + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + href: defaultSearchEngine.urlTemplate!.replace("%s", query), + }; + }, + }, + ]; + } + + if (!results) { + return [ + { + id: "from-integration", + name: defaultSearchEngine.name, + icon: defaultSearchEngine.iconUrl, + description: t("search.mode.home.group.search.option.from-integration.description"), + useInteraction() { + return { + type: "none", + }; + }, + }, + ]; + } + + return results.map((result) => ({ + id: `search-${result.id}`, + name: result.name, + description: result.text, + icon: result.image ?? IconSearch, + useInteraction() { + return useFromIntegrationSearchInteraction(defaultSearchEngine, result); + }, + })); +}; diff --git a/packages/spotlight/src/modes/home/index.tsx b/packages/spotlight/src/modes/home/index.tsx index e306437f2..7851e6a39 100644 --- a/packages/spotlight/src/modes/home/index.tsx +++ b/packages/spotlight/src/modes/home/index.tsx @@ -1,8 +1,9 @@ import type { SearchMode } from "../../lib/mode"; import { contextSpecificSearchGroups } from "./context-specific-group"; +import { homeSearchEngineGroup } from "./home-search-engine-group"; export const homeMode = { character: undefined, modeKey: "home", - groups: [contextSpecificSearchGroups], + groups: [homeSearchEngineGroup, contextSpecificSearchGroups], } satisfies SearchMode; diff --git a/packages/translation/package.json b/packages/translation/package.json index fa20dedd4..3217e0e3b 100644 --- a/packages/translation/package.json +++ b/packages/translation/package.json @@ -31,16 +31,17 @@ "@homarr/definitions": "workspace:^0.1.0", "dayjs": "^1.11.13", "deepmerge": "4.3.1", - "mantine-react-table": "2.0.0-beta.7", - "next": "^14.2.22", + "mantine-react-table": "2.0.0-beta.8", + "next": "15.1.4", "next-intl": "3.26.3", - "react": "^19.0.0" + "react": "19.0.0", + "react-dom": "19.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/translation/src/lang/cn.json b/packages/translation/src/lang/cn.json index 6bfa200b6..3fc7317c1 100644 --- a/packages/translation/src/lang/cn.json +++ b/packages/translation/src/lang/cn.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "默认搜索引擎更改成功" + }, + "error": { + "message": "无法更改默认的搜索引擎" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -232,10 +242,10 @@ }, "manageAvatar": { "changeImage": { - "label": "更改图像", + "label": "更改头像", "notification": { "success": { - "message": "图像修改成功" + "message": "头像修改成功" }, "error": { "message": "无法更改图像" @@ -284,9 +294,9 @@ } }, "group": { - "title": "用户组", + "title": "群组", "name": "组", - "search": "查找用户组", + "search": "查找群组", "field": { "name": "名称", "members": "成员" @@ -417,13 +427,13 @@ }, "action": { "create": { - "label": "新建用户组", + "label": "新建群组", "notification": { "success": { - "message": "用户组已成功创建" + "message": "群组已成功创建" }, "error": { - "message": "无法创建用户组" + "message": "无法创建群组" } } }, @@ -489,6 +499,7 @@ } }, "app": { + "search": "查找应用", "page": { "list": { "title": "应用", @@ -1532,7 +1543,7 @@ }, "added": { "columnTitle": "已添加", - "detailsTitle": "日期已添加" + "detailsTitle": "添加日期" }, "category": { "columnTitle": "扩展的", @@ -1573,7 +1584,7 @@ }, "size": { "columnTitle": "文件大小", - "detailsTitle": "选择/文件的总大小" + "detailsTitle": "文件大小" }, "state": { "columnTitle": "状态", @@ -1581,7 +1592,7 @@ }, "time": { "columnTitle": "完成时间", - "detailsTitle": "结束/结束时间" + "detailsTitle": "完成时间" }, "type": { "columnTitle": "类型", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "复制面板", + "message": "这将复制面板{name}及其所有内容。如果组件引用了不允许使用的集成,它们将被删除。", + "notification": { + "success": { + "title": "面板已复制", + "message": "面板已成功复制" + }, + "error": { + "title": "无法复制面板", + "message": "无法复制面板" + } + } + }, "edit": { "notification": { "success": { @@ -1838,7 +1863,7 @@ "label": "页面标题" }, "metaTitle": { - "label": "Meta标题" + "label": "Meta 标题" }, "logoImageUrl": { "label": "Logo 图像 URL" @@ -1853,7 +1878,7 @@ "label": "背景图片附件", "option": { "fixed": { - "label": "已修复", + "label": "固定", "description": "背景保持不变。" }, "scroll": { @@ -1935,7 +1960,7 @@ "unrecognizedLink": "提供的链接未被识别,无法预览,但它可能仍然有效。" }, "layout": { - "title": "显示布局" + "title": "布局" }, "background": { "title": "背景" @@ -2057,7 +2082,7 @@ "boards": "面板", "apps": "应用", "integrations": "集成", - "searchEngies": "搜索引擎", + "searchEngies": "搜索", "medias": "媒体", "users": { "label": "用户", @@ -2080,10 +2105,10 @@ "help": { "label": "帮助", "items": { - "documentation": "文档", + "documentation": "帮助文档", "submitIssue": "提交问题", "discord": "Discord 社区", - "sourceCode": "源码" + "sourceCode": "源码仓库" } }, "about": "关于" @@ -2125,6 +2150,9 @@ "tooltip": "此面板将显示为您的主面板" } }, + "duplicate": { + "label": "复制面板" + }, "delete": { "label": "永久删除", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "语言与地区", "board": "主面板", + "defaultSearchEngine": "默认搜索引擎", "firstDayOfWeek": "一周的第一天", "accessibility": "无障碍服务" } @@ -2320,6 +2349,13 @@ "description": "只有公共面板可供选择" } }, + "search": { + "title": "搜索", + "defaultSearchEngine": { + "label": "全局默认搜索引擎", + "description": "无法在这里选择集成搜索引擎" + } + }, "appearance": { "title": "外观", "defaultColorScheme": { @@ -2435,15 +2471,15 @@ "accordion": { "contributors": { "title": "贡献人员", - "subtitle": "{count} 维护代码和 Homarr" + "subtitle": "{count} 人在维护代码和 Homarr" }, "translators": { "title": "翻译人员", - "subtitle": "{count}翻译了许多语言" + "subtitle": "{count} 名人员翻译了许多语言" }, "libraries": { - "title": "资源库", - "subtitle": "{count} 在 Homarr 代码中使用" + "title": "相关的库", + "subtitle": "{count} 个相关的库在 Homarr 代码中被使用" } } } @@ -2544,6 +2580,22 @@ "message": "刷新容器时出现错误" } } + }, + "addToHomarr": { + "label": "添加到 Homarr", + "notification": { + "success": { + "title": "已添加到 Homarr", + "message": "所选应用已被添加到 Homarr" + }, + "error": { + "title": "无法添加到 Homarr", + "message": "所选应用无法添加到 Homarr" + } + }, + "modal": { + "title": "将 docker 容器添加到 Homarr" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "搜索", + "option": { + "other": { + "label": "使用另一个搜索引擎搜索" + }, + "no-default": { + "label": "没有默认的搜索引擎", + "description": "在首选项中设置默认搜索引擎" + }, + "search": { + "label": "用{name}搜索“{query}”" + }, + "from-integration": { + "description": "输入内容以搜索" + } + } + }, "local": { "title": "本地结果" } @@ -2930,7 +3000,7 @@ "label": "名称" }, "short": { - "label": "不足" + "label": "短的" }, "urlTemplate": { "label": "URL搜索模板" diff --git a/packages/translation/src/lang/cs.json b/packages/translation/src/lang/cs.json index a3c7712fd..8d4222466 100644 --- a/packages/translation/src/lang/cs.json +++ b/packages/translation/src/lang/cs.json @@ -36,7 +36,7 @@ }, "summary": { "title": "Přehled importu", - "description": "", + "description": "V následujícím přehledu můžete vidět, co bude importováno", "action": { "import": "Potvrdit import a pokračovat" }, @@ -65,7 +65,7 @@ }, "user": { "title": "Správce", - "subtitle": "", + "subtitle": "Zadejte přihlašovací údaje pro administrátora.", "notification": { "success": { "title": "Uživatel byl vytvořen", @@ -78,7 +78,7 @@ }, "group": { "title": "Externí skupina", - "subtitle": "", + "subtitle": "Zadejte skupinu, která by měla být použita pro externí uživatele.", "form": { "name": { "label": "Název skupiny", @@ -88,7 +88,7 @@ }, "settings": { "title": "Nastavení", - "subtitle": "" + "subtitle": "Konfigurace nastavení serveru." }, "finish": { "title": "Dokončit nastavení", @@ -113,7 +113,7 @@ "subtitle": "Vítejte zpět! Zadejte prosím Vaše přihlašovací údaje" }, "invite": { - "title": "", + "title": "Připojit se k Homarrovi", "subtitle": "Vítejte v Homarru! Vytvořte si prosím svůj účet", "description": "Byli jste pozváni {username}" }, @@ -125,7 +125,7 @@ "field": { "email": { "label": "E-mail", - "verified": "" + "verified": "Ověřeno" }, "username": { "label": "Uživatelské jméno" @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -428,8 +438,8 @@ } }, "transfer": { - "label": "", - "description": "", + "label": "Převést vlastnictví", + "description": "Převést vlastnictví této skupiny na jiného uživatele.", "confirm": "Jste si jisti, že chcete převést vlastnictví skupiny {name} na {username}?", "notification": { "success": { @@ -441,19 +451,19 @@ } }, "addMember": { - "label": "" + "label": "Přidat člena" }, "removeMember": { - "label": "", + "label": "Odebrat člena", "confirm": "Jste si jisti, že chcete odstranit {user} z této skupiny?" }, "delete": { - "label": "", - "description": "", + "label": "Vymazat skupinu", + "description": "Jakmile smažete skupinu, není možné se vrátit zpět. Prosím, buďte si jistí.", "confirm": "Jste si jisti, že chcete odstranit skupinu {name}?", "notification": { "success": { - "message": "" + "message": "Skupina {name} byla úspěšně smazána" }, "error": { "message": "Nelze odstranit skupinu {name}" @@ -463,19 +473,19 @@ "changePermissions": { "notification": { "success": { - "title": "", - "message": "" + "title": "Oprávnění byla uložena", + "message": "Oprávnění byla úspěšně uložena" }, "error": { - "title": "", - "message": "" + "title": "Oprávnění nebyla uložena", + "message": "Oprávnění nebyla uložena" } } }, "update": { "notification": { "success": { - "message": "" + "message": "Skupina {name} byla úspěšně uložena" }, "error": { "message": "Nelze uložit skupinu {name}" @@ -483,12 +493,13 @@ } }, "select": { - "label": "", - "notFound": "" + "label": "Vyberte skupinu", + "notFound": "Nebyla nalezena žádná skupina" } } }, "app": { + "search": "", "page": { "list": { "title": "Aplikace", @@ -654,19 +665,19 @@ }, "unauthorized": { "title": "", - "message": "" + "message": "Pravděpodobně špatné přihlašovací údaje" }, "forbidden": { - "title": "", - "message": "" + "title": "Zakázáno", + "message": "Pravděpodobně chybějící oprávnění" }, "notFound": { "title": "", - "message": "" + "message": "Pravděpodobně špatná adresa URL nebo cesta" }, "internalServerError": { - "title": "", - "message": "" + "title": "Interní chyba serveru", + "message": "Server zaznamenal chybu" }, "serviceUnavailable": { "title": "", @@ -690,7 +701,7 @@ }, "wrongPath": { "title": "", - "message": "" + "message": "Cesta pravděpodobně není správná" } } }, @@ -911,29 +922,29 @@ } }, "action": { - "create": "", - "edit": "", - "remove": "", + "create": "Nová kategorie", + "edit": "Přejmenovat kategorii", + "remove": "Odstranit kategorii", "moveUp": "Posunout nahoru", "moveDown": "Posunout dolů", - "createAbove": "", - "createBelow": "" + "createAbove": "Nová kategorie nad", + "createBelow": "Nová kategorie pod" }, "create": { - "title": "", - "submit": "" + "title": "Nová kategorie", + "submit": "Přidat kategorii" }, "remove": { - "title": "", + "title": "Odstranit kategorii", "message": "Jste si jisti, že chcete odstranit kategorii {name}?" }, "edit": { - "title": "", - "submit": "" + "title": "Přejmenovat kategorii", + "submit": "Přejmenovat kategorii" }, "menu": { "label": { - "create": "", + "create": "Nová kategorie", "changePosition": "Změnit pozici" } } @@ -943,10 +954,10 @@ "action": { "create": "", "import": "", - "edit": "", - "moveResize": "", - "duplicate": "", - "remove": "" + "edit": "Upravit položku", + "moveResize": "Přesunout / změnit velikost položky", + "duplicate": "Duplikovat položku", + "remove": "Odstranit položku" }, "menu": { "label": { @@ -977,7 +988,7 @@ "edit": { "title": "", "advancedOptions": { - "label": "", + "label": "Pokročilé možnosti", "title": "" }, "field": { @@ -1312,7 +1323,7 @@ "releaseType": { "label": "Typ vydání filmu pro Radarr", "options": { - "inCinemas": "", + "inCinemas": "V kinech", "digitalRelease": "", "physicalRelease": "" } @@ -1330,24 +1341,24 @@ "description": "Zobrazuje aktuální informace o počasí na nastaveném místě.", "option": { "isFormatFahrenheit": { - "label": "" + "label": "Teplota ve Fahrenheitech" }, "location": { "label": "Lokalita pro počasí" }, "showCity": { - "label": "" + "label": "Zobrazit město" }, "hasForecast": { "label": "Zobrazit předpověď" }, "forecastDayCount": { "label": "", - "description": "" + "description": "Když widget není dostatečně široký, zobrazí se méně dní" }, "dateFormat": { - "label": "", - "description": "" + "label": "Formát data", + "description": "Jak by datum mělo vypadat" } }, "kind": { @@ -1369,16 +1380,16 @@ }, "indexerManager": { "name": "Stav správce indexeru", - "description": "", + "description": "Stav Vašich indexerů", "option": { "openIndexerSiteInNewTab": { - "label": "" + "label": "Otevřít stránku indexeru v nové kartě" } }, "title": "Správce indexeru", "testAll": "Otestovat vše", "error": { - "internalServerError": "" + "internalServerError": "Nepodařilo se načíst stav indexerů" } }, "healthMonitoring": { @@ -1513,7 +1524,7 @@ "label": "" }, "categoryFilter": { - "label": "" + "label": "Kategorie/štítky k filtrování" }, "filterIsWhitelist": { "label": "" @@ -1535,8 +1546,8 @@ "detailsTitle": "Datum přidání" }, "category": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Doplňky", + "detailsTitle": "Kategorie (nebo další informace)" }, "downSpeed": { "columnTitle": "Stahování", @@ -1667,7 +1678,7 @@ }, "users": { "main": "Top uživatelé", - "requests": "" + "requests": "Žádosti" } } }, @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -1835,19 +1860,19 @@ }, "field": { "pageTitle": { - "label": "" + "label": "Nadpis strany" }, "metaTitle": { "label": "" }, "logoImageUrl": { - "label": "" + "label": "URL adresa loga" }, "faviconImageUrl": { - "label": "" + "label": "URL obrázku Favicon" }, "backgroundImageUrl": { - "label": "" + "label": "Adresa URL obrázku na pozadí" }, "backgroundImageAttachment": { "label": "Příloha obrázku na pozadí", @@ -1866,8 +1891,8 @@ "label": "", "option": { "repeat": { - "label": "", - "description": "" + "label": "Opakovat", + "description": "Obrázek se opakuje tak často, jak je potřeba, aby pokryl celou oblast obrazu na pozadí." }, "no-repeat": { "label": "", @@ -1957,7 +1982,7 @@ "label": "" }, "full": { - "label": "" + "label": "Plný přístup" } } } @@ -2025,12 +2050,12 @@ "admin": { "description": "", "link": "", - "notice": "" + "notice": "Chcete-li tuto stránku schovat pro všechny uživatele, nastavte domovskou plochu pro server" }, "user": { - "description": "", - "link": "", - "notice": "" + "description": "Zatím jste nenastavili domovskou plochu.", + "link": "Nastavit Vaší domovskou plochu", + "notice": "Chcete-li tuto stránku schovat, nastavte si domovskou plochu ve vašich preferencích" }, "anonymous": { "description": "", @@ -2043,9 +2068,9 @@ "management": { "metaTitle": "", "title": { - "morning": "", - "afternoon": "", - "evening": "" + "morning": "Dobré ráno, {username}", + "afternoon": "Dobré odpoledne, {username}", + "evening": "Dobrý večer, {username}" }, "notFound": { "title": "", @@ -2064,7 +2089,7 @@ "items": { "manage": "Spravovat", "invites": "Pozvánky", - "groups": "" + "groups": "Skupiny" } }, "tools": { @@ -2097,7 +2122,7 @@ "invite": "Pozvánky", "integration": "", "app": "Aplikace", - "group": "" + "group": "Skupiny" }, "statisticLabel": { "boards": "Plochy", @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Trvale smazat", "confirm": { @@ -2151,14 +2179,15 @@ "includeFromAllUsers": "" }, "user": { - "back": "", - "fieldsDisabledExternalProvider": "", + "back": "Zpět na uživatele", + "fieldsDisabledExternalProvider": "Některá pole jsou vypnuta, protože jsou spravována externím poskytovatelem ověřování.", "setting": { "general": { "title": "Obecné", "item": { "language": "Jazyk & oblast", - "board": "", + "board": "Domovská plocha", + "defaultSearchEngine": "Výchozí vyhledávač", "firstDayOfWeek": "První den v týdnu", "accessibility": "Přístupnost" } @@ -2175,50 +2204,50 @@ "title": "Uživatelé" }, "edit": { - "metaTitle": "" + "metaTitle": "Upravit uživatele {username}" }, "create": { "metaTitle": "Vytvořit uživatele", - "title": "", + "title": "Vytvořit nového uživatele", "step": { "personalInformation": { - "label": "" + "label": "Osobní údaje" }, "security": { "label": "Bezpečnost" }, "groups": { - "label": "", - "title": "", - "description": "" + "label": "Skupiny", + "title": "Vyberte všechny skupiny, jejichž členem by měl uživatel být", + "description": "Skupina {everyoneGroup} je přiřazena všem uživatelům a nemůže být odstraněna." }, "review": { "label": "" }, "completed": { - "title": "" + "title": "Uživatel byl vytvořen" }, "error": { - "title": "" + "title": "Vytvoření uživatele se nezdařilo" } }, "action": { - "createAnother": "", - "back": "" + "createAnother": "Vytvořit nového uživatele", + "back": "Zpět na seznam uživatelů" } }, "invite": { "title": "Správa pozvánek uživatelů", "action": { "new": { - "title": "", + "title": "Nová pozvánka", "description": "Po vypršení platnosti pozvánka přestane být platná a příjemce pozvánky si nebude moci vytvořit účet." }, "copy": { - "title": "", - "description": "", + "title": "Zkopírovat pozvánku", + "description": "Vaše pozvánka byla vygenerována. Po zavření tohoto okna již nebude možné tento odkaz zkopírovat. Pokud si již nepřejete uvedenou osobu pozvat, můžete tuto pozvánku kdykoli smazat.", "link": "Odkaz na pozvánku", - "button": "" + "button": "Zkopírovat a zavřít" }, "delete": { "title": "Odstranit pozvánku", @@ -2236,29 +2265,29 @@ "label": "Datum konce platnosti" }, "token": { - "label": "" + "label": "Token" } } } }, "group": { - "back": "", + "back": "Zpět na skupiny", "setting": { "general": { "title": "Obecné", "owner": "Vlastník", - "ownerOfGroup": "", - "ownerOfGroupDeleted": "" + "ownerOfGroup": "Vlastník této skupiny", + "ownerOfGroupDeleted": "Vlastník této skupiny byl odstraněn. V současné době nemá žádného vlastníka." }, "members": { - "title": "", - "search": "", - "notFound": "" + "title": "Členové", + "search": "Najít člena", + "notFound": "Žádný člen nebyl nenalezen" }, "permissions": { - "title": "", + "title": "Oprávnění", "form": { - "unsavedChanges": "" + "unsavedChanges": "Máte neuložené změny!" } } } @@ -2289,7 +2318,7 @@ "text": "" }, "usersData": { - "title": "", + "title": "Uživatelská data", "text": "" } }, @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Vzhled", "defaultColorScheme": { @@ -2381,7 +2417,7 @@ "label": "" }, "indexerManager": { - "label": "" + "label": "Správce indexeru" }, "healthMonitoring": { "label": "" @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2551,32 +2603,32 @@ } }, "permission": { - "title": "", + "title": "Oprávnění", "userSelect": { - "title": "" + "title": "Přidat oprávnění uživatele" }, "groupSelect": { - "title": "" + "title": "Přidat oprávnění ke skupině" }, "tab": { "user": "Uživatelé", - "group": "", - "inherited": "" + "group": "Skupiny", + "inherited": "Zděděné skupiny" }, "field": { "user": { "label": "Uživatel" }, "group": { - "label": "" + "label": "Skupina" }, "permission": { - "label": "" + "label": "Oprávnění" } }, "action": { - "saveUser": "", - "saveGroup": "" + "saveUser": "Uložit oprávnění uživatele", + "saveGroup": "Uložit oprávnění skupiny" } }, "navigationStructure": { @@ -2624,7 +2676,7 @@ "security": "Bezpečnost", "board": "Plochy", "groups": { - "label": "" + "label": "Skupiny" }, "invites": { "label": "Pozvánky" @@ -2719,7 +2771,7 @@ } }, "newBoard": { - "label": "" + "label": "Vytvořit novou plochu" }, "importBoard": { "label": "" @@ -2736,7 +2788,7 @@ } }, "newUser": { - "label": "" + "label": "Vytvořit nového uživatele" }, "newInvite": { "label": "" @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } @@ -2886,37 +2956,37 @@ } }, "userGroup": { - "help": "", + "help": "Hledat uživatele nebo skupiny", "group": { "user": { "title": "Uživatelé", "children": { "action": { "detail": { - "label": "" + "label": "Zobrazit detaily uživatele" } }, "detail": { - "title": "" + "title": "Vyberte akci pro uživatele" } } }, "group": { - "title": "", + "title": "Skupiny", "children": { "action": { "detail": { - "label": "" + "label": "Zobrazit detaily skupiny" }, "manageMember": { - "label": "" + "label": "Spravovat členy" }, "managePermission": { - "label": "" + "label": "Spravovat oprávnění" } }, "detail": { - "title": "" + "title": "Vyberte akci pro uživatele" } } } diff --git a/packages/translation/src/lang/da.json b/packages/translation/src/lang/da.json index 20e1491d1..8ef017d61 100644 --- a/packages/translation/src/lang/da.json +++ b/packages/translation/src/lang/da.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Slet permanent", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Første ugedag", "accessibility": "Hjælpefunktioner" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Udseende", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/de.json b/packages/translation/src/lang/de.json index e9a188f18..daab5627a 100644 --- a/packages/translation/src/lang/de.json +++ b/packages/translation/src/lang/de.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Apps", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Dauerhaft löschen", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Erster Tag der Woche", "accessibility": "Barrierefreiheit" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Aussehen", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/el.json b/packages/translation/src/lang/el.json index cce979434..cb9a84885 100644 --- a/packages/translation/src/lang/el.json +++ b/packages/translation/src/lang/el.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Εφαρμογές", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Οριστική διαγραφή", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Πρώτη ημέρα της εβδομάδας", "accessibility": "Προσβασιμότητα" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Εμφάνιση", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 9a87ad643..0f7f627c2 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "Default search engine changed successfully" + }, + "error": { + "message": "Unable to change default search engine" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "Find an app", "page": { "list": { "title": "Apps", @@ -955,6 +966,7 @@ }, "create": { "title": "Choose item to add", + "search": "Filter items", "addToBoard": "Add to board" }, "moveResize": { @@ -1080,7 +1092,8 @@ "adsBlockedTodayPercentage": "Blocked today", "dnsQueriesToday": "Queries today", "domainsBeingBlocked": "Domains on blocklist" - } + }, + "domainsTooltip": "Due to multiple integrations Homarr can't calculate the exact number of domains being blocked" }, "dnsHoleControls": { "name": "DNS Hole Controls", @@ -1269,6 +1282,7 @@ }, "error": { "noUrl": "No iFrame URL provided", + "unsupportedProtocol": "The URL provided is using an unsupported protocol. Please use one of ({supportedProtocols})", "noBrowerSupport": "Your Browser does not support iframes. Please update your browser." } }, @@ -1760,6 +1774,20 @@ }, "board": { "action": { + "duplicate": { + "title": "Duplicate board", + "message": "This will duplicate the board {name} with all its content. If widgets reference integrations, that you are not allowed to use, they will be removed.", + "notification": { + "success": { + "title": "Board duplicated", + "message": "The board was successfully duplicated" + }, + "error": { + "title": "Unable to duplicate board", + "message": "The board could not be duplicated" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2153,9 @@ "tooltip": "This board will show as your home board" } }, + "duplicate": { + "label": "Duplicate board" + }, "delete": { "label": "Delete permanently", "confirm": { @@ -2159,6 +2190,7 @@ "item": { "language": "Language & Region", "board": "Home board", + "defaultSearchEngine": "Default search engine", "firstDayOfWeek": "First day of the week", "accessibility": "Accessibility" } @@ -2320,6 +2352,13 @@ "description": "Only public boards are available for selection" } }, + "search": { + "title": "Search", + "defaultSearchEngine": { + "label": "Global default search engine", + "description": "Integration search engines can not be selected here" + } + }, "appearance": { "title": "Appearance", "defaultColorScheme": { @@ -2544,6 +2583,22 @@ "message": "Something went wrong while refreshing the containers" } } + }, + "addToHomarr": { + "label": "Add to Homarr", + "notification": { + "success": { + "title": "Added to Homarr", + "message": "Selected apps have been added to Homarr" + }, + "error": { + "title": "Could not add to Homarr", + "message": "Selected apps could not be added to Homarr" + } + }, + "modal": { + "title": "Add docker container(-s) to Homarr" + } } }, "error": { @@ -2819,6 +2874,24 @@ }, "home": { "group": { + "search": { + "title": "Search", + "option": { + "other": { + "label": "Search with another search engine" + }, + "no-default": { + "label": "No default search engine", + "description": "Set a default search engine in preferences" + }, + "search": { + "label": "Search for \"{query}\" with {name}" + }, + "from-integration": { + "description": "Start typing to search" + } + } + }, "local": { "title": "Local results" } diff --git a/packages/translation/src/lang/es.json b/packages/translation/src/lang/es.json index d6a1419aa..a9f549ebe 100644 --- a/packages/translation/src/lang/es.json +++ b/packages/translation/src/lang/es.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Aplicaciones", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Eliminar permanentemente", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Primer día de la semana", "accessibility": "Accesibilidad" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Apariencia", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/et.json b/packages/translation/src/lang/et.json index fcd6e1d09..4df6c37de 100644 --- a/packages/translation/src/lang/et.json +++ b/packages/translation/src/lang/et.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "", "accessibility": "" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/fr.json b/packages/translation/src/lang/fr.json index c0b186944..2d2235a14 100644 --- a/packages/translation/src/lang/fr.json +++ b/packages/translation/src/lang/fr.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Applications", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Supprimer définitivement", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Premier jour de la semaine", "accessibility": "Accessibilité" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Apparence", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/he.json b/packages/translation/src/lang/he.json index d31e6b2f2..7eaef9264 100644 --- a/packages/translation/src/lang/he.json +++ b/packages/translation/src/lang/he.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "אפליקציות", @@ -1171,7 +1182,7 @@ }, "status": { "online": "", - "offline": "" + "offline": "לא מקוון" } }, "notebook": { @@ -1482,9 +1493,9 @@ "description": "הצג את הזרמים הנוכחיים בשרתי המדיה שלך", "option": {}, "items": { - "user": "", - "name": "", - "id": "" + "user": "משתמש", + "name": "שם", + "id": "מזהה" } }, "downloads": { @@ -1543,7 +1554,7 @@ "detailsTitle": "מהירות הורדה" }, "index": { - "columnTitle": "", + "columnTitle": "#", "detailsTitle": "מדד נוכחי בתוך הלקוח" }, "id": { @@ -1553,7 +1564,7 @@ "columnTitle": "אינטגרציה" }, "name": { - "columnTitle": "" + "columnTitle": "שם המשימה" }, "progress": { "columnTitle": "התקדמות", @@ -1577,7 +1588,7 @@ }, "state": { "columnTitle": "מצב", - "detailsTitle": "" + "detailsTitle": "מצב המשימה" }, "time": { "columnTitle": "זמן סיום", @@ -1599,8 +1610,8 @@ "completed": "הושלם", "failed": "נכשל", "processing": "מעבד", - "leeching": "", - "stalled": "", + "leeching": "בשיתוף", + "stalled": "נתקע", "unknown": "לא ידוע", "seeding": "זריעה" }, @@ -1619,9 +1630,9 @@ "resume": "המשך פריט", "delete": { "title": "מחק פריט", - "modalTitle": "", - "entry": "", - "entryAndFiles": "" + "modalTitle": "האם את/ה בטוח/ה שברצונך למחוק את העבודה הזו?", + "entry": "מחיקת רשומה", + "entryAndFiles": "מחיקת רשומה וקבצים" } } }, @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "שכפול לוח", + "message": "פעולה זו תשכפל את הלוח {name} עם כל התוכן שלו. אם ווידג'טים מתייחסים לאינטגרציות שאינך מורשה להשתמש בהן, הם יוסרו.", + "notification": { + "success": { + "title": "הלוח שוכפל", + "message": "הלוח שוכפל בהצלחה" + }, + "error": { + "title": "לא ניתן לשכפל את הלוח", + "message": "לא ניתן לשכפל את הלוח" + } + } + }, "edit": { "notification": { "success": { @@ -1821,7 +1846,7 @@ "description": "סרגלי צד הוסרו ב- 1.0, אתה יכול לבחור מה צריך לקרות עם הפריטים שבתוכם.", "option": { "lastSection": { - "label": "", + "label": "החלק האחרון", "description": "סרגל צד יוצג מתחת לקטע האחרון" }, "removeItems": { @@ -1976,31 +2001,31 @@ "visibility": { "label": "שנה את נראות הלוח", "description": { - "public": "", - "private": "" + "public": "הלוח הזה כרגע ציבורי.", + "private": "הלוח הזה כרגע פרטי." }, "button": { - "public": "", - "private": "" + "public": "הפוך לפרטי", + "private": "הפוך לציבורי" }, "confirm": { "public": { - "title": "", - "description": "" + "title": "הפיכת לוח לפרטי", + "description": "האם את/ה בטוח/ה להפוך את הלוח הזה לפרטי? פעולה זו תסתיר את הלוח מציבורי. קישורים למשתמשים אורחים יוסרו." }, "private": { - "title": "", - "description": "" + "title": "הפיכת לוח לציבורי", + "description": "האם את/ה בטוח/ה להפוך את הלוח הזה לציבורי? הפעולה תהפוך את הלוח נגיש לכולם." } } }, "delete": { - "label": "", - "description": "", - "button": "", + "label": "מחיקת לוח זה", + "description": "ברגע שהלוח נמחק, אין דרך חזרה. אנא וודא/י זאת בוודאות.", + "button": "מחיקת לוח זה", "confirm": { "title": "מחיקת לוח", - "description": "" + "description": "האם את/ה בטוח/ה שברצונך למחוק לוח זה? הלוח ותוכנו יימחקו לצמיתות." } } } @@ -2010,22 +2035,22 @@ "error": { "noBoard": { "title": "ברוכים הבאים ל- Homarr", - "description": "", + "description": "לוח בקרה מעוצב ומודרני שמביא את כל האפליקציות והשירותים שלך בהישג יד.", "link": "צור את הלוח הראשון שלך", - "notice": "" + "notice": "כדי להעלים דף זה, יש ליצור לוח ולקבוע אותו כלוח בית" }, "notFound": { - "title": "", - "description": "", + "title": "לא נמצא לוח", + "description": "הלוח לא נמצא או שאין לך הרשאה לגשת אליו.", "link": "הצגת כל הלוחות", - "notice": "" + "notice": "בדוק את הקישור או צור קשר עם מנהל אם אתה סבור שהוא אמור להיות נגיש" }, "homeBoard": { - "title": "", + "title": "אין לוח בית", "admin": { - "description": "", - "link": "", - "notice": "" + "description": "לא הוגדר לוח בית לשרת עדיין.", + "link": "הגדר לוח בית לשרת", + "notice": "כדי לגרום לדף זה להעלם עבור כל המשתמש, יש להגדיר לוח בית עבור השרת" }, "user": { "description": "", @@ -2048,7 +2073,7 @@ "evening": "" }, "notFound": { - "title": "", + "title": "לא נמצא", "text": "" }, "navbar": { @@ -2071,9 +2096,9 @@ "label": "כלים", "items": { "docker": "דוקר", - "logs": "", + "logs": "קובצי לוג", "api": "ממשק API", - "tasks": "" + "tasks": "משימות" } }, "settings": "הגדרות", @@ -2113,29 +2138,32 @@ "label": "" }, "open": { - "label": "" + "label": "פתיחת לוח" }, "settings": { "label": "הגדרות" }, "setHomeBoard": { - "label": "", + "label": "קביעה כלוח בית", "badge": { "label": "מסך הבית", - "tooltip": "" + "tooltip": "הלוח הזה יוצג כלוח הבית שלך" } }, + "duplicate": { + "label": "שכפול לוח" + }, "delete": { "label": "מחיקה לצמיתות", "confirm": { "title": "מחיקת לוח", - "description": "" + "description": "האם את/ה בטוח/ה שברצונך למחוק את הלוח {name}?" } } }, "visibility": { - "public": "", - "private": "" + "public": "הלוח הזה ציבורי", + "private": "הלוח הזה פרטי" }, "modal": { "createBoard": { @@ -2148,10 +2176,10 @@ } }, "media": { - "includeFromAllUsers": "" + "includeFromAllUsers": "כלול מדיה מכל המשתמשים" }, "user": { - "back": "", + "back": "חזרה למשתמשים", "fieldsDisabledExternalProvider": "", "setting": { "general": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "לוח בית", + "defaultSearchEngine": "", "firstDayOfWeek": "היום הראשון בשבוע", "accessibility": "נגישות" } @@ -2211,14 +2240,14 @@ "title": "נהל הזמנות משתמש", "action": { "new": { - "title": "", + "title": "הזמנה חדשה", "description": "לאחר התפוגה, הזמנה לא תהיה תקפה יותר ומקבל ההזמנה לא יוכל ליצור חשבון." }, "copy": { - "title": "", - "description": "", + "title": "העתקת הזמנה", + "description": "ההזמנה שלך נוצרה. לאחר שחלון זה ייסגר, לא תוכל להעתיק את הקישור הזה יותר. אם אינך מעוניין להזמין את האדם הנ\"ל, תוכל למחוק את ההזמנה בכל זמן.", "link": "קישור הזמנה", - "button": "" + "button": "העתקה וסגירה" }, "delete": { "title": "מחיקת הזמנה", @@ -2242,23 +2271,23 @@ } }, "group": { - "back": "", + "back": "חזרה לקבוצות", "setting": { "general": { "title": "כללי", "owner": "בעלים", - "ownerOfGroup": "", - "ownerOfGroupDeleted": "" + "ownerOfGroup": "בעלים של קבוצה זו", + "ownerOfGroupDeleted": "הבעלים של קבוצה זו נמחק. כרגע אין בעלים." }, "members": { "title": "חברים", - "search": "", - "notFound": "" + "search": "חיפוש חבר בקבוצה", + "notFound": "לא נמצא חברים בקבוצה" }, "permissions": { - "title": "", + "title": "הרשאות", "form": { - "unsavedChanges": "" + "unsavedChanges": "ישנם שינויים שלא נשמרו!" } } } @@ -2267,15 +2296,15 @@ "title": "הגדרות", "notification": { "success": { - "message": "" + "message": "ההגדרות נשמרו בהצלחה" }, "error": { - "message": "" + "message": "נכשל בשמירת הגדרות" } }, "section": { "analytics": { - "title": "", + "title": "ניתוחים", "general": { "title": "", "text": "" @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "מראה", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/hr.json b/packages/translation/src/lang/hr.json index f78c4fce4..2655126da 100644 --- a/packages/translation/src/lang/hr.json +++ b/packages/translation/src/lang/hr.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "aplikacije", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Izbriši trajno", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Prvi dan u tjednu", "accessibility": "Pristupačnost" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Izgled", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/hu.json b/packages/translation/src/lang/hu.json index d1d74ed35..787689b68 100644 --- a/packages/translation/src/lang/hu.json +++ b/packages/translation/src/lang/hu.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Alkalmazások", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Végleges törlés", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "Főoldal", + "defaultSearchEngine": "", "firstDayOfWeek": "A hét első napja", "accessibility": "Kisegítő lehetőségek" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Megjelenés", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/it.json b/packages/translation/src/lang/it.json index 0eaf3a837..1704b856d 100644 --- a/packages/translation/src/lang/it.json +++ b/packages/translation/src/lang/it.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Applicazioni", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Elimina definitivamente", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Primo giorno della settimana", "accessibility": "Accessibilità" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Aspetto", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/ja.json b/packages/translation/src/lang/ja.json index ac57e8a0d..f0519d0cc 100644 --- a/packages/translation/src/lang/ja.json +++ b/packages/translation/src/lang/ja.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "アプリ", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "永久削除", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "週の初日", "accessibility": "アクセシビリティ" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "外観", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/ko.json b/packages/translation/src/lang/ko.json index 279e9da68..815501a58 100644 --- a/packages/translation/src/lang/ko.json +++ b/packages/translation/src/lang/ko.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "앱", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "영구 삭제", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "요일별 요일", "accessibility": "접근성" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "모양", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/lt.json b/packages/translation/src/lang/lt.json index d7ca7ec58..75d008056 100644 --- a/packages/translation/src/lang/lt.json +++ b/packages/translation/src/lang/lt.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Programėlės", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Ištrinti visam laikui", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "", "accessibility": "" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Išvaizda", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/lv.json b/packages/translation/src/lang/lv.json index 6ecae92c3..15fd286da 100644 --- a/packages/translation/src/lang/lv.json +++ b/packages/translation/src/lang/lv.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Lietotnes", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Neatgriezeniski dzēst", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Nedēļas pirmā diena", "accessibility": "Piekļūstamība" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Izskats", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/nl.json b/packages/translation/src/lang/nl.json index 20a8f8b91..aa54ea68b 100644 --- a/packages/translation/src/lang/nl.json +++ b/packages/translation/src/lang/nl.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Apps", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "Dit bord wordt weergegeven als je home-bord" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Permanent verwijderen", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "Taal & regio", "board": "Home-bord", + "defaultSearchEngine": "", "firstDayOfWeek": "Eerste dag van de week", "accessibility": "Toegankelijkheid" } @@ -2320,6 +2349,13 @@ "description": "Alleen openbare borden zijn beschikbaar voor selectie" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Weergave", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "Er is iets misgegaan tijdens het verversen van de containers" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "Lokale resultaten" } diff --git a/packages/translation/src/lang/no.json b/packages/translation/src/lang/no.json index 6a92b3006..367d209a1 100644 --- a/packages/translation/src/lang/no.json +++ b/packages/translation/src/lang/no.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Apper", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Slett permanent", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Første dag i uken", "accessibility": "Hjelpemidler" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Utseende", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/pl.json b/packages/translation/src/lang/pl.json index 197ec08ae..0beae6363 100644 --- a/packages/translation/src/lang/pl.json +++ b/packages/translation/src/lang/pl.json @@ -2,130 +2,130 @@ "init": { "step": { "start": { - "title": "", - "subtitle": "", - "description": "", + "title": "Witaj w Homarrze", + "subtitle": "Zacznijmy od konfiguracji twojego Homarra.", + "description": "Aby rozpocząć, wybierz jak chcesz skonfigurować Homarra.", "action": { - "scratch": "", - "importOldmarr": "" + "scratch": "Zacznij od zera", + "importOldmarr": "Importuj z Homarr przed 1.0" } }, "import": { - "title": "", - "subtitle": "", + "title": "Importuj dane", + "subtitle": "Możesz zaimportować dane z istniejącej instancji Homarra.", "dropzone": { - "title": "", - "description": "" + "title": "Przeciągnij tutaj plik zip lub kliknij, aby przeglądać", + "description": "Przesłany zip zostanie przetworzony i będziesz mógł wybrać co chcesz zaimportować" }, "fileInfo": { "action": { - "change": "" + "change": "Zmień plik" } }, "importSettings": { - "title": "", - "description": "" + "title": "Importuj ustawienia", + "description": "Skonfiguruj zachowanie importu" }, "boardSelection": { - "title": "", - "description": "", + "title": "Znaleziono {count} tablic", + "description": "Wybierz wszystkie działy o rozmiarze do zaimportowania", "action": { - "selectAll": "", - "unselectAll": "" + "selectAll": "Zaznacz wszystkie", + "unselectAll": "Odznacz wszystkie" } }, "summary": { - "title": "", - "description": "", + "title": "Podsumowanie importu", + "description": "W poniższym podsumowaniu możesz zobaczyć, co zostanie zaimportowane", "action": { - "import": "" + "import": "Potwierdź import i kontynuuj" }, "entities": { "apps": "Aplikacje", "boards": "Tablice", - "integrations": "", - "credentialUsers": "" + "integrations": "Integracje", + "credentialUsers": "Dane użytkowników" } }, "tokenModal": { - "title": "", + "title": "Wpisz token importu", "field": { "token": { - "label": "", - "description": "" + "label": "Token", + "description": "Wprowadź token importu z poprzedniej instancji hommara" } }, "notification": { "error": { - "title": "", - "message": "" + "title": "Nieprawidłowy token", + "message": "Wprowadzony token jest nieprawidłowy" } } } }, "user": { - "title": "", - "subtitle": "", + "title": "Administrator", + "subtitle": "Określ dane uwierzytelniające dla administratora", "notification": { "success": { - "title": "", - "message": "" + "title": "Użytkownik został utworzony", + "message": "Użytkownik został pomyślnie utworzony" }, "error": { - "title": "" + "title": "Błąd podczas tworzenia użytkownika" } } }, "group": { - "title": "", - "subtitle": "", + "title": "Zewnętrzna grupa", + "subtitle": "Określ grupę, która powinna być używana przez użytkowników zewnętrznych.", "form": { "name": { - "label": "", - "description": "" + "label": "Nazwa grupy", + "description": "Nazwa musi być zgodna z grupą administratora zewnętrznego dostawcy" } } }, "settings": { "title": "Ustawienia", - "subtitle": "" + "subtitle": "Konfiguruj ustawienia serwera" }, "finish": { - "title": "", - "subtitle": "", - "description": "", + "title": "Zakończ konfigurację", + "subtitle": "Gotowe!", + "description": "Pomyślnie zakończyłeś proces konfiguracji. Teraz możesz zacząć używać Homarr. Wybierz następną akcję:", "action": { - "goToBoard": "", - "createBoard": "", - "inviteUser": "", - "docs": "" + "goToBoard": "Idź do tablicy {name}", + "createBoard": "Stwórz swoją pierwszą tablicę", + "inviteUser": "Zaproś innych użytkowników", + "docs": "Przeczytaj dokumentację!" } } }, - "backToStart": "" + "backToStart": "Powrót do początku" }, "user": { "title": "Użytkownicy", "name": "Użytkownik", "page": { "login": { - "title": "", - "subtitle": "" + "title": "Zaloguj się do swojego konta", + "subtitle": "Witamy ponownie! Wprowadź swoje dane logowania" }, "invite": { - "title": "", - "subtitle": "", - "description": "" + "title": "Dołącz do Homarr", + "subtitle": "Witamy w Homarr! Utwórz swoje konto", + "description": "Zostałeś(aś) zaproszony(a) przez {username}" }, "init": { - "title": "", - "subtitle": "" + "title": "Nowa instalacja Homarra", + "subtitle": "Proszę utworzyć użytkownika dla podstawowego administratora" } }, "field": { "email": { "label": "E-mail", - "verified": "" + "verified": "Zweryfikowany" }, "username": { "label": "Nazwa użytkownika" @@ -133,46 +133,46 @@ "password": { "label": "Hasło", "requirement": { - "length": "", + "length": "Zawiera co najmniej 8 znaków", "lowercase": "Zawiera małą literę", "uppercase": "Zawiera wielką literę", "number": "Zawiera cyfrę", - "special": "" + "special": "Zawiera specjalny symbol" } }, "passwordConfirm": { "label": "Potwierdź hasło" }, "previousPassword": { - "label": "" + "label": "Stare hasło:" }, "homeBoard": { - "label": "" + "label": "Tablica główna" }, "pingIconsEnabled": { - "label": "" + "label": "Użyj ikon dla pingów" } }, "error": { - "usernameTaken": "" + "usernameTaken": "Nazwa użytkownika jest już zajęta" }, "action": { "login": { "label": "Zaloguj się", - "labelWith": "", + "labelWith": "Zaloguj się przez {provider}", "notification": { "success": { - "title": "", - "message": "" + "title": "Logowanie zakończone pomyślnie", + "message": "Jesteś teraz zalogowany!" }, "error": { - "title": "", - "message": "" + "title": "Logowanie nieudane", + "message": "Twoje logowanie nie powiodło się" } }, "forgotPassword": { - "label": "", - "description": "" + "label": "Zapomniałeś(aś) hasła?", + "description": "Administrator może użyć następującej komendy do zresetowania hasła:" } }, "register": { @@ -180,27 +180,37 @@ "notification": { "success": { "title": "Utworzono konto", - "message": "" + "message": "Zaloguj się, aby kontynuować" }, "error": { - "title": "", - "message": "" + "title": "Tworzenie konta nie powiodło się", + "message": "Twoje konto nie może zostać utworzone" } } }, "create": "Dodaj użytkownika", "changePassword": { - "label": "", + "label": "Zmień hasło", "notification": { "success": { - "message": "" + "message": "Hasło zostało pomyślnie zmienione" }, "error": { - "message": "" + "message": "Problem ze zmianą hasła" } } }, "changeHomeBoard": { + "notification": { + "success": { + "message": "Tablica główna zmieniona pomyślnie" + }, + "error": { + "message": "Nie można zmienić tablicy głównej" + } + } + }, + "changeDefaultSearchEngine": { "notification": { "success": { "message": "" @@ -213,48 +223,48 @@ "changeFirstDayOfWeek": { "notification": { "success": { - "message": "" + "message": "Pierwszy dzień tygodnia został pomyślnie zmieniony" }, "error": { - "message": "" + "message": "Nie można zmienić pierwszego dnia tygodnia" } } }, "changePingIconsEnabled": { "notification": { "success": { - "message": "" + "message": "Włączono ping na ikonach" }, "error": { - "message": "" + "message": "Nie można włączyć pingowania ikon" } } }, "manageAvatar": { "changeImage": { - "label": "", + "label": "Zmień obraz", "notification": { "success": { - "message": "" + "message": "Obraz zmieniony pomyślnie" }, "error": { - "message": "" + "message": "Nie można zmienić obrazu" }, "toLarge": { - "title": "", - "message": "" + "title": "Obraz jest zbyt duży", + "message": "Maksymalny rozmiar obrazu to {size}" } } }, "removeImage": { - "label": "", - "confirm": "", + "label": "Usuń obraz", + "confirm": "Czy na pewno chcesz usunąć ten obraz?", "notification": { "success": { - "message": "" + "message": "Obraz został pomyślnie usunięty." }, "error": { - "message": "" + "message": "Nie można usunąć obrazu" } } } @@ -262,42 +272,42 @@ "editProfile": { "notification": { "success": { - "message": "" + "message": "Pomyślnie zaktualizowano profil" }, "error": { - "message": "" + "message": "Problem z aktualizacją profilu" } } }, "delete": { - "label": "", - "description": "", - "confirm": "" + "label": "Usuń trwale użytkownika", + "description": "Usuwa tego użytkownika, w tym jego preferencje. To nie usunie żadnych tablic. Użytkownik nie będzie powiadamiany.", + "confirm": "Czy na pewno chcesz usunąć użytkownika {username} z jego preferencjami?" }, "select": { - "label": "", - "notFound": "" + "label": "Wybierz użytkownika", + "notFound": "Nie znaleziono użytkownika" }, "transfer": { - "label": "" + "label": "Wybierz nowego właściciela" } } }, "group": { - "title": "", - "name": "", - "search": "", + "title": "Grupy", + "name": "Grupa", + "search": "Znajdź grupę", "field": { "name": "Nazwa", - "members": "" + "members": "Członkowie" }, "permission": { "admin": { - "title": "", + "title": "Admin", "item": { "admin": { - "label": "", - "description": "" + "label": "Administrator", + "description": "Członkowie z tym uprawnieniem mają pełny dostęp do wszystkich funkcji i ustawień" } } }, @@ -305,20 +315,20 @@ "title": "Aplikacje", "item": { "create": { - "label": "", - "description": "" + "label": "Utwórz aplikacje", + "description": "Zezwól użytkownikom na tworzenie aplikacji" }, "use-all": { - "label": "", - "description": "" + "label": "Używaj wszystkich aplikacji", + "description": "Zezwalaj użytkownikom na dodawanie aplikacji do ich tablic" }, "modify-all": { - "label": "", - "description": "" + "label": "Modyfikuj wszystkie aplikacje", + "description": "Zezwalaj użytkownikom na modyfikowanie wszystkich aplikacji" }, "full-all": { - "label": "", - "description": "" + "label": "Pełny dostęp do aplikacji", + "description": "Zezwalaj użytkownikom na zarządzanie, używanie i usuwanie dowolnej aplikacji" } } }, @@ -326,214 +336,215 @@ "title": "Tablice", "item": { "create": { - "label": "", - "description": "" + "label": "Utwórz tablice", + "description": "Zezwalaj użytkownikom na tworzenie tablic" }, "view-all": { - "label": "", - "description": "" + "label": "Wyświetl wszystkie tablice", + "description": "Zezwalaj użytkownikom na wyświetlanie wszystkich tablic" }, "modify-all": { - "label": "", - "description": "" + "label": "Modyfikuj wszystkie tablice", + "description": "Zezwalaj użytkownikom na modyfikowanie wszystkich tablic (nie uwzględnia kontroli dostępu i strefy niebezpiecznej)" }, "full-all": { - "label": "", - "description": "" + "label": "Pełny dostęp do tablicy", + "description": "Zezwalaj użytkownikom na przeglądanie, modyfikowanie i usuwanie wszystkich tablic (w tym kontroli dostępu i strefy niebezpiecznej)" } } }, "integration": { - "title": "", + "title": "Integracje", "item": { "create": { - "label": "", - "description": "" + "label": "Utwórz integracje", + "description": "Zezwalaj użytkownikom na tworzenie integracji" }, "use-all": { - "label": "", - "description": "" + "label": "Używaj wszystkich integracji", + "description": "Pozwala członkom na dodawanie integracji do ich tablic" }, "interact-all": { - "label": "", - "description": "" + "label": "Interakcja z dowolną integracją", + "description": "Zezwalaj użytkownikom na interakcję z dowolną integracją" }, "full-all": { - "label": "", - "description": "" + "label": "Pełny dostęp do integracji", + "description": "Zezwalaj użytkownikom na zarządzanie, używanie i interakcję z dowolną integracją" } } }, "media": { - "title": "", + "title": "Media", "item": { "upload": { - "label": "", - "description": "" + "label": "Prześlij media", + "description": "Zezwalaj użytkownikom na przesyłanie mediów" }, "view-all": { - "label": "", - "description": "" + "label": "Wyświetl wszystkie media", + "description": "Zezwalaj użytkownikom na wyświetlanie wszystkich mediów" }, "full-all": { - "label": "", - "description": "" + "label": "Pełny dostęp do mediów", + "description": "Zezwalaj użytkownikom na zarządzanie i usuwanie wszelkich mediów" } } }, "other": { - "title": "", + "title": "Inne", "item": { "view-logs": { - "label": "", - "description": "" + "label": "Wyświetl logi", + "description": "Zezwalaj użytkownikom na przeglądanie logów" } } }, "search-engine": { - "title": "", + "title": "Wyszukiwarki", "item": { "create": { - "label": "", - "description": "" + "label": "Utwórz wyszukiwarki", + "description": "Zezwalaj użytkownikom na tworzenie wyszukiwarek" }, "modify-all": { - "label": "", - "description": "" + "label": "Modyfikuj wszystkie wyszukiwarki", + "description": "Zezwalaj użytkownikom na modyfikację wszystkich wyszukiwarek" }, "full-all": { - "label": "", - "description": "" + "label": "Pełny dostęp do wyszukiwarki", + "description": "Zezwól użytkownikom na zarządzanie i usuwanie dowolnej wyszukiwarki" } } } }, "memberNotice": { - "mixed": "", - "external": "" + "mixed": "Niektórzy członkowie pochodzą od zewnętrznych dostawców i nie mogą być tutaj zarządzani", + "external": "Wszyscy członkowie pochodzą od zewnętrznych dostawców i nie mogą być tutaj zarządzani" }, "reservedNotice": { - "message": "" + "message": "Ta grupa jest zarezerwowana dla użycia systemowego i ogranicza niektóre działania. " }, "action": { "create": { - "label": "", + "label": "Nowa grupa", "notification": { "success": { - "message": "" + "message": "Grupa została pomyślnie utworzona" }, "error": { - "message": "" + "message": "Nie udało się utworzyć grupy" } } }, "transfer": { - "label": "", - "description": "", - "confirm": "", + "label": "Przenieś własność", + "description": "Przenieś właściciela tej grupy na innego użytkownika.", + "confirm": "Czy na pewno chcesz przenieść właściciela grupy {name} na {username}?", "notification": { "success": { - "message": "" + "message": "Przeniesiono pomyślnie właściciela grupy {group} do {user} " }, "error": { - "message": "" + "message": "Nie można przenieść właściciela" } } }, "addMember": { - "label": "" + "label": "Dodaj członka" }, "removeMember": { - "label": "", - "confirm": "" + "label": "Usuń użytkownika", + "confirm": "Czy na pewno chcesz usunąć {user} z tej grupy?" }, "delete": { - "label": "", - "description": "", - "confirm": "", + "label": "Usuń grupę", + "description": "Kiedy usuniesz grupę, nie da się jej przywrócić. Proszę się upewnić czy na pewno chcesz to zrobić.", + "confirm": "Czy na pewno chcesz usunąć grupę {name}?", "notification": { "success": { - "message": "" + "message": "Usunięto grupę {name}" }, "error": { - "message": "" + "message": "Nie udało się usunąć grupy {name}" } } }, "changePermissions": { "notification": { "success": { - "title": "", - "message": "" + "title": "Uprawnienia zostały zapisane", + "message": "Uprawnienia zostały pomyślnie zapisane" }, "error": { - "title": "", - "message": "" + "title": "Nie zapisano uprawnień", + "message": "Uprawnienia nie zostały zapisane" } } }, "update": { "notification": { "success": { - "message": "" + "message": "Grupa {name} została pomyślnie zapisana" }, "error": { - "message": "" + "message": "Nie udało się zapisać grupy {name}" } } }, "select": { - "label": "", - "notFound": "" + "label": "Wybierz grupę", + "notFound": "Nie znaleziono grupy" } } }, "app": { + "search": "", "page": { "list": { "title": "Aplikacje", "noResults": { - "title": "", - "action": "" + "title": "Nie ma jeszcze żadnych aplikacji", + "action": "Utwórz swoją pierwszą aplikację" } }, "create": { - "title": "", + "title": "Nowa aplikacja", "notification": { "success": { - "title": "", - "message": "" + "title": "Pomyślnie utworzono", + "message": "Aplikacja została pomyślnie utworzona" }, "error": { - "title": "", - "message": "" + "title": "Tworzenie nieudane", + "message": "Aplikacja nie mogła zostać utworzona" } } }, "edit": { - "title": "", + "title": "Edytuj aplikację", "notification": { "success": { - "title": "", - "message": "" + "title": "Zmiany zostały pomyślnie zastosowane", + "message": "Aplikacja została pomyślnie zapisana" }, "error": { - "title": "", - "message": "" + "title": "Nie można wprowadzić zmian", + "message": "Nie można zapisać aplikacji" } } }, "delete": { - "title": "", - "message": "", + "title": "Usuń aplikację", + "message": "Czy na pewno chcesz usunąć aplikację {name}?", "notification": { "success": { - "title": "", - "message": "" + "title": "Usunięto pomyślnie", + "message": "Aplikacja została pomyślnie usunięta" }, "error": { - "title": "", - "message": "" + "title": "Nie udało się usunąć", + "message": "Nie można usunąć aplikacji" } } } @@ -543,65 +554,65 @@ "label": "Nazwa" }, "description": { - "label": "" + "label": "Opis" }, "url": { - "label": "" + "label": "Adres URL" } }, "action": { "select": { - "label": "", - "notFound": "" + "label": "Wybierz aplikację", + "notFound": "Nie znaleziono aplikacji" } } }, "integration": { "page": { "list": { - "title": "", - "search": "", + "title": "Integracje", + "search": "Wyszukaj integrację", "noResults": { - "title": "" + "title": "Nie ma jeszcze integracji" } }, "create": { - "title": "", + "title": "Nowa integracja {name}", "notification": { "success": { - "title": "", - "message": "" + "title": "Utworzenie udało się", + "message": "Integracja została pomyślnie utworzona" }, "error": { - "title": "", - "message": "" + "title": "Nie udało się utworzyć", + "message": "Integracja nie może zostać utworzona" } } }, "edit": { - "title": "", + "title": "Edytuj integrację z {name}", "notification": { "success": { - "title": "", - "message": "" + "title": "Zmiany zostały pomyślnie zastosowane", + "message": "Integracja została pomyślnie zapisana" }, "error": { - "title": "", - "message": "" + "title": "Nie można wprowadzić zmian", + "message": "Integracja nie mogła zostać zapisana" } } }, "delete": { - "title": "", - "message": "", + "title": "Usuń integrację", + "message": "Czy na pewno chcesz usunąć integrację z {name}?", "notification": { "success": { - "title": "", - "message": "" + "title": "Usunięto pomyślnie", + "message": "Integracja została pomyślnie usunięta" }, "error": { - "title": "", - "message": "" + "title": "Nie udało się usunąć", + "message": "Nie udało się usunąć integracji" } } } @@ -611,113 +622,113 @@ "label": "Nazwa" }, "url": { - "label": "" + "label": "Adres URL" }, "attemptSearchEngineCreation": { - "label": "", - "description": "" + "label": "Utwórz wyszukiwarkę", + "description": "Integracja \"{kind}\" może być używana z wyszukiwarkami. Zaznacz to, aby automatycznie skonfigurować wyszukiwarkę." } }, "action": { - "create": "" + "create": "Nowa integracja" }, "testConnection": { "action": { - "create": "", - "edit": "" + "create": "Sprawdź połączenie i utwórz", + "edit": "Sprawdź połączenie i zapisz" }, - "alertNotice": "", + "alertNotice": "Przycisk Zapisz jest włączony po nawiązaniu pomyślnego połączenia", "notification": { "success": { - "title": "", - "message": "" + "title": "Połączenie przebiegło pomyślnie", + "message": "Połączenie zostało pomyślnie nawiązane" }, "invalidUrl": { "title": "Nieprawidłowy URL", - "message": "" + "message": "Adres URL jest nieprawidłowy" }, "secretNotDefined": { - "title": "", - "message": "" + "title": "Brakujące poświadczenia", + "message": "Nie podano wszystkich poświadczeń" }, "invalidCredentials": { - "title": "", - "message": "" + "title": "Nieprawidłowe poświadczenia", + "message": "Poświadczenia są nieprawidłowe" }, "commonError": { - "title": "", - "message": "" + "title": "Nie udało się połączyć", + "message": "Nie udało się nawiązać połączenia" }, "badRequest": { - "title": "", - "message": "" + "title": "Błędne zapytanie", + "message": "Zapytanie zostało uszkodzone" }, "unauthorized": { - "title": "", - "message": "" + "title": "Błąd uwierzytelnienia", + "message": "Prawdopodobnie nieprawidłowe poświadczenia" }, "forbidden": { - "title": "", - "message": "" + "title": "Odmowa dostępu", + "message": "Prawdopodobnie brakuje uprawnień" }, "notFound": { - "title": "", - "message": "" + "title": "Nie znaleziono", + "message": "Prawdopodobnie błędny adres URL lub ścieżka" }, "internalServerError": { - "title": "", - "message": "" + "title": "Wewnętrzny błąd serwera", + "message": "Wystąpił błąd serwera" }, "serviceUnavailable": { - "title": "", - "message": "" + "title": "Usługa niedostępna", + "message": "Serwer jest obecnie niedostępny" }, "connectionAborted": { - "title": "", - "message": "" + "title": "Połączenie przerwano", + "message": "Połączenie zostało przerwane" }, "domainNotFound": { - "title": "", - "message": "" + "title": "Domena nie została znaleziona", + "message": "Nie można odnaleźć domeny" }, "connectionRefused": { - "title": "", - "message": "" + "title": "Połączenie odrzucone", + "message": "Połączenie zostało odrzucone" }, "invalidJson": { - "title": "", - "message": "" + "title": "Nieprawidłowy JSON", + "message": "Odpowiedź nie była prawidłowym JSON'em" }, "wrongPath": { - "title": "", - "message": "" + "title": "Błędna ścieżka", + "message": "Ścieżka jest prawdopodobnie niepoprawna" } } }, "secrets": { - "title": "", - "lastUpdated": "", + "title": "Sekrety", + "lastUpdated": "Data ostatniej aktualizacji: {date}", "notSet": { - "label": "", - "tooltip": "" + "label": "Nie ustawiono wartości", + "tooltip": "Ten wymagany sekret nie został jeszcze ustawiony" }, - "secureNotice": "", + "secureNotice": "Ten sekret nie może zostać pobrany po utworzeniu", "reset": { - "title": "", - "message": "" + "title": "Resetuj sekret", + "message": "Czy na pewno chcesz zresetować ten sekret?" }, "noSecretsRequired": { - "segmentTitle": "", - "text": "" + "segmentTitle": "Brak sekretów", + "text": "Dla tej integracji nie są wymagane żadne sekrety" }, "kind": { "username": { "label": "Nazwa użytkownika", - "newLabel": "" + "newLabel": "Nowa nazwa użytkownika" }, "apiKey": { - "label": "", - "newLabel": "" + "label": "Klucz API", + "newLabel": "Nowy klucz API" }, "password": { "label": "Hasło", @@ -726,14 +737,14 @@ } }, "permission": { - "use": "", - "interact": "", - "full": "" + "use": "Wybierz integrację w elementach", + "interact": "Interakcja z integracjami", + "full": "Pełny dostęp do integracji" } }, "media": { - "plural": "", - "search": "", + "plural": "Medias", + "search": "Znajdź media", "field": { "name": "Nazwa", "size": "Rozmiar", @@ -741,127 +752,127 @@ }, "action": { "upload": { - "label": "", - "file": "", + "label": "Prześlij media", + "file": "Wybierz plik", "notification": { "success": { - "message": "" + "message": "Plik multimedialny został przesłany pomyślnie" }, "error": { - "message": "" + "message": "Nie można przesłać multimediów" } } }, "delete": { - "label": "", - "description": "", + "label": "Usuń media", + "description": "Czy na pewno chcesz usunąć media ?", "notification": { "success": { - "message": "" + "message": "Plik został usunięty pomyślnie" }, "error": { - "message": "" + "message": "Nie udało się usunąć mediów" } } }, "copy": { - "label": "" + "label": "Kopiuj adres URL" } } }, "common": { - "beta": "", + "beta": "Wersja beta", "error": "Błąd", "action": { "add": "Dodaj", "apply": "Zastosuj", - "backToOverview": "", + "backToOverview": "Powrót do widoku ogólnego", "create": "Utwórz", "edit": "Edytuj", - "import": "", + "import": "Importuj", "insert": "Wstaw", "remove": "Usuń", "save": "Zapisz", "saveChanges": "Zapisz zmiany", "cancel": "Anuluj", "delete": "Usuń", - "discard": "", + "discard": "Odrzuć", "confirm": "Potwierdź", - "continue": "", + "continue": "Kontynuuj", "previous": "Poprzedni", "next": "Dalej", - "checkoutDocs": "", - "checkLogs": "", + "checkoutDocs": "Sprawdź dokumentację", + "checkLogs": "Sprawdź logi, aby uzyskać więcej informacji.", "tryAgain": "Spróbuj ponownie", - "loading": "" + "loading": "Ładowanie" }, - "here": "", + "here": "tutaj", "iconPicker": { - "label": "", - "header": "" + "label": "adres URL ikony", + "header": "Wpisz nazwę lub obiekty do filtrowania ikon... Homarr przeszuka dla Ciebie ikony {countIcons}." }, "colorScheme": { "options": { - "light": "", - "dark": "" + "light": "Jasny", + "dark": "Ciemny" } }, "information": { - "min": "", - "max": "", - "days": "", - "hours": "", - "minutes": "" + "min": "Min", + "max": "Max.", + "days": "Dni", + "hours": "Godziny", + "minutes": "Minuty" }, "notification": { "create": { - "success": "", - "error": "" + "success": "Utworzenie udało się", + "error": "Tworzenie nie powiodło się" }, "delete": { - "success": "", - "error": "" + "success": "Usunięto pomyślnie", + "error": "Nie udało się usunąć" }, "update": { - "success": "", - "error": "" + "success": "Zmiany zostały pomyślnie zastosowane", + "error": "Nie można wprowadzić zmian" }, "transfer": { - "success": "", - "error": "" + "success": "Pomyślnie przesłano", + "error": "Przesłanie się nie powiodło" } }, "multiSelect": { - "placeholder": "" + "placeholder": "Wybierz jedną lub więcej wartości" }, "multiText": { - "placeholder": "", - "addLabel": "" + "placeholder": "Dodaj więcej wartości", + "addLabel": "Dodaj {value}" }, "select": { - "placeholder": "", + "placeholder": "Wybierz wartość", "badge": { - "recommended": "" + "recommended": "Rekomendowane" } }, "userAvatar": { "menu": { - "switchToDarkMode": "", - "switchToLightMode": "", - "management": "", + "switchToDarkMode": "Przełącz na tryb nocny", + "switchToLightMode": "Przełącz na tryb jasny", + "management": "Zarządzanie", "preferences": "Twoje preferencje", - "logout": "", + "logout": "Wyloguj się", "login": "Zaloguj się", - "homeBoard": "", - "loggedOut": "", - "updateAvailable": "" + "homeBoard": "Twoja tablica główna", + "loggedOut": "Wylogowano", + "updateAvailable": "Dostępne aktualizacje {countUpdates} : {tag}" } }, "dangerZone": "Strefa zagrożenia", "noResults": "Nie znaleziono żadnych wyników", "preview": { - "show": "", - "hide": "" + "show": "Pokaż podgląd", + "hide": "Ukryj podgląd" }, "zod": { "errors": { @@ -871,7 +882,7 @@ "startsWith": "To pole musi zaczynać się od {startsWith}", "endsWith": "To pole musi kończyć się na {endsWith}", "includes": "Pole to musi zawierać {includes}", - "invalidEmail": "" + "invalidEmail": "W tym polu musi znajdować się prawidłowy adres e-mail" }, "tooSmall": { "string": "To pole musi mieć co najmniej {minimum} znaków", @@ -882,13 +893,13 @@ "number": "Wartość tego pola musi być mniejsza lub równa {maximum}" }, "custom": { - "passwordsDoNotMatch": "", - "passwordRequirements": "", - "boardAlreadyExists": "", - "invalidFileType": "", - "fileTooLarge": "", - "invalidConfiguration": "", - "groupNameTaken": "" + "passwordsDoNotMatch": "Wprowadzone hasła nie zgadzają się", + "passwordRequirements": "Twoje hasło nie spełnia wymagań.", + "boardAlreadyExists": "Tablica o tej nazwie już istnieje", + "invalidFileType": "Nieprawidłowy typ pliku, oczekiwany {expected}", + "fileTooLarge": "Plik jest zbyt duży, maksymalny rozmiar to {maxSize}", + "invalidConfiguration": "Nieprawidłowa konfiguracja", + "groupNameTaken": "Nazwa użytkownika jest już zajęta" } } } @@ -896,12 +907,12 @@ "section": { "dynamic": { "action": { - "create": "", - "remove": "" + "create": "Nowa sekcja dynamiczna", + "remove": "Usuń sekcję dynamiczną" }, "remove": { - "title": "", - "message": "" + "title": "Usuń sekcję dynamiczną", + "message": "Czy na pewno chcesz usunąć tę sekcję dynamiczną? Elementy zostaną przeniesione w tej samej lokalizacji w sekcji nadrzędnej." } }, "category": { @@ -911,29 +922,29 @@ } }, "action": { - "create": "", - "edit": "", - "remove": "", + "create": "Nowa kategoria", + "edit": "Zmień nazwę kategorii", + "remove": "Usuń kategorię", "moveUp": "Przenieś w górę", "moveDown": "Przenieś w dół", - "createAbove": "", - "createBelow": "" + "createAbove": "Nowa kategoria powyżej", + "createBelow": "Nowa kategoria poniżej" }, "create": { - "title": "", - "submit": "" + "title": "Nowa kategoria", + "submit": "Dodaj kategorię" }, "remove": { - "title": "", - "message": "" + "title": "Usuń kategorię", + "message": "Czy na pewno chcesz usunąć kategorię {name}?" }, "edit": { - "title": "", - "submit": "" + "title": "Zmień nazwę kategorii", + "submit": "Zmień nazwę kategorii" }, "menu": { "label": { - "create": "", + "create": "Nowa kategoria", "changePosition": "Zmiana pozycji" } } @@ -941,12 +952,12 @@ }, "item": { "action": { - "create": "", - "import": "", - "edit": "", - "moveResize": "", - "duplicate": "", - "remove": "" + "create": "Nowa pozycja", + "import": "Importuj pozycję", + "edit": "Edytuj pozycję", + "moveResize": "Przenieś / zmień rozmiar pozycji", + "duplicate": "Duplikuj pozycję", + "remove": "Usuń pozycję" }, "menu": { "label": { @@ -954,11 +965,11 @@ } }, "create": { - "title": "", - "addToBoard": "" + "title": "Wybierz element do dodania", + "addToBoard": "Dodaj do tablicy" }, "moveResize": { - "title": "", + "title": "Przenieś / zmień rozmiar pozycji", "field": { "width": { "label": "Szerokość" @@ -967,67 +978,67 @@ "label": "Wysokość" }, "xOffset": { - "label": "" + "label": "Przesunięcie X" }, "yOffset": { - "label": "" + "label": "Przesunięcie Y" } } }, "edit": { - "title": "", + "title": "Edytuj pozycje", "advancedOptions": { - "label": "", - "title": "" + "label": "Ustawienia zaawansowane", + "title": "Zaawansowane opcje pozycji" }, "field": { "integrations": { - "label": "" + "label": "Integracje" }, "customCssClasses": { - "label": "" + "label": "Niestandardowe klasy CSS" } } }, "remove": { - "title": "", - "message": "" + "title": "Usuń pozycję", + "message": "Jesteś pewien, że chcesz usunąć ten element?" } }, "widget": { "app": { - "name": "", - "description": "", + "name": "Aplikacja", + "description": "Osadza aplikację w płytce.", "option": { "appId": { - "label": "" + "label": "Wybierz aplikację" }, "openInNewTab": { "label": "Otwórz w nowej karcie" }, "showTitle": { - "label": "" + "label": "Pokaż nazwę aplikacji" }, "showDescriptionTooltip": { - "label": "" + "label": "Pokaż opis podpowiedzi" }, "pingEnabled": { - "label": "" + "label": "Włącz prosty ping" } }, "error": { "notFound": { - "label": "", - "tooltip": "" + "label": "Brak aplikacji", + "tooltip": "Nie wybrano prawidłowej aplikacji" } } }, "bookmarks": { - "name": "", - "description": "", + "name": "Zakładki", + "description": "Wyświetla wiele linków do aplikacji", "option": { "title": { - "label": "" + "label": "Tytuł" }, "layout": { "label": "Układ", @@ -1039,19 +1050,19 @@ "label": "Pionowy" }, "grid": { - "label": "" + "label": "Siatka" } } }, "items": { - "label": "", - "add": "" + "label": "Zakładki", + "add": "Dodaj zakładkę" } } }, "dnsHoleSummary": { - "name": "", - "description": "", + "name": "Podsumowanie Hole DNS", + "description": "Wyświetla podsumowanie Twojego hosta DNS", "option": { "layout": { "label": "Układ", @@ -1063,27 +1074,27 @@ "label": "Pionowy" }, "grid": { - "label": "" + "label": "Siatka" } } }, "usePiHoleColors": { - "label": "" + "label": "Użyj kolorów Pi-Hole" } }, "error": { - "internalServerError": "", - "integrationsDisconnected": "" + "internalServerError": "Nie udało się pobrać podsumowanie Hole DNS", + "integrationsDisconnected": "Brak dostępnych danych, wszystkie integracje odłączone" }, "data": { "adsBlockedToday": "Zablokowane dzisiaj", "adsBlockedTodayPercentage": "Zablokowane dzisiaj", "dnsQueriesToday": "Zapytania dzisiaj", - "domainsBeingBlocked": "" + "domainsBeingBlocked": "Domeny na liście blokowanych" } }, "dnsHoleControls": { - "name": "", + "name": "Sterowanie dziurami DNS", "description": "Kontroluj PiHole lub AdGuard ze swojego pulpitu", "option": { "layout": { @@ -1096,87 +1107,87 @@ "label": "Pionowy" }, "grid": { - "label": "" + "label": "Siatka" } } }, "showToggleAllButtons": { - "label": "" + "label": "Pokaż \"pokaż wszystkie przyciski\" przycisk" } }, "error": { - "internalServerError": "" + "internalServerError": "Nie udało się kontrolować funkcji DNS Hole" }, "controls": { - "enableAll": "", - "disableAll": "", - "setTimer": "", - "set": "", + "enableAll": "Włącz wszystkie", + "disableAll": "Wyłącz wszystkie", + "setTimer": "Ustaw wyłącznik czasowy", + "set": "Ustaw", "enabled": "Włączony", "disabled": "Wyłączony", - "processing": "", - "disconnected": "", - "hours": "", - "minutes": "", - "unlimited": "" + "processing": "Przetwarzanie", + "disconnected": "Rozłączono", + "hours": "Godziny", + "minutes": "Minuty", + "unlimited": "Pozostaw puste do nieograniczonej" } }, "clock": { - "name": "", + "name": "Data i czas", "description": "Wyświetla bieżącą datę i godzinę.", "option": { "customTitleToggle": { - "label": "", - "description": "" + "label": "Niestandardowe wyświetlanie tytułu/miasta", + "description": "Pokaż własny tytuł lub nazwę miasta/kraju na górze zegara." }, "customTitle": { - "label": "" + "label": "Tytuł" }, "is24HourFormat": { - "label": "", - "description": "" + "label": "Format 24-godzinny", + "description": "Użyj 24-godzinnego formatu zamiast 12-godzinnego" }, "showSeconds": { - "label": "" + "label": "Wyświetlaj sekundy" }, "useCustomTimezone": { - "label": "" + "label": "Użyj stałej strefy czasowej" }, "timezone": { "label": "Strefa czasowa", - "description": "" + "description": "Wybierz strefę czasową zgodnie ze standardem IANA" }, "showDate": { - "label": "" + "label": "Pokaż datę" }, "dateFormat": { - "label": "", - "description": "" + "label": "Format daty", + "description": "Jak powinna wyglądać data" } } }, "minecraftServerStatus": { - "name": "", - "description": "", + "name": "Status serwera Minecraft", + "description": "Wyświetla status serwera Minecraft", "option": { "title": { - "label": "" + "label": "Tytuł" }, "domain": { - "label": "" + "label": "Adres serwera" }, "isBedrockServer": { - "label": "" + "label": "Serwer Bedrock" } }, "status": { - "online": "", - "offline": "" + "online": "Dostępny", + "offline": "Niedostępny" } }, "notebook": { "name": "Notatnik", - "description": "", + "description": "Prosty widżet notatnika obsługujący markdown", "option": { "showToolbar": { "label": "Pokaż pasek narzędzi ułatwiający pisanie w markdown" @@ -1236,7 +1247,7 @@ } }, "iframe": { - "name": "", + "name": "iFrame", "description": "Osadzaj dowolne treści z internetu. Niektóre strony internetowe mogą ograniczać dostęp.", "option": { "embedUrl": { @@ -1268,31 +1279,31 @@ } }, "error": { - "noUrl": "", + "noUrl": "Adres URL iFrame nie został podany", "noBrowerSupport": "Twoja przeglądarka nie obsługuje ramek iframe. Zaktualizuj przeglądarkę." } }, "smartHome-entityState": { - "name": "", - "description": "", + "name": "Stan obiektu", + "description": "Wyświetl stan obiektu i przełącz go opcjonalnie", "option": { "entityId": { "label": "ID obiektu" }, "displayName": { - "label": "" + "label": "Wyświetlana nazwa" }, "entityUnit": { - "label": "" + "label": "Jednostka" }, "clickable": { - "label": "" + "label": "Element klikalny" } } }, "smartHome-executeAutomation": { - "name": "", - "description": "", + "name": "Wykonaj automatyzację", + "description": "Uruchom automatyzację jednym kliknięciem", "option": { "displayName": { "label": "Nazwa wyświetlana" @@ -1302,26 +1313,26 @@ } }, "spotlightAction": { - "run": "" + "run": "Uruchom {name}" } }, "calendar": { "name": "Kalendarz", - "description": "", + "description": "Wyświetlaj zdarzenia z integracji w widoku kalendarza w określonym okresie czasowym", "option": { "releaseType": { "label": "Rodzaj premiery w Radarr", "options": { - "inCinemas": "", - "digitalRelease": "", - "physicalRelease": "" + "inCinemas": "W kinach", + "digitalRelease": "Wydanie cyfrowe", + "physicalRelease": "Wydanie fizyczne" } }, "filterPastMonths": { - "label": "" + "label": "Początek od" }, "filterFutureMonths": { - "label": "" + "label": "Koniec o" } } }, @@ -1330,24 +1341,24 @@ "description": "Wyświetla aktualne informacje o pogodzie w ustawionej lokalizacji.", "option": { "isFormatFahrenheit": { - "label": "" + "label": "Temperatura w Fahrenheit" }, "location": { "label": "Lokalizacja pogody" }, "showCity": { - "label": "" + "label": "Pokaż miasto" }, "hasForecast": { - "label": "" + "label": "Pokaż Prognozę" }, "forecastDayCount": { - "label": "", - "description": "" + "label": "Liczba dni prognozy", + "description": "Kiedy widżet nie jest wystarczająco szeroki, mniej dni jest wyświetlane" }, "dateFormat": { - "label": "", - "description": "" + "label": "Format daty", + "description": "Jak powinna wyglądać data" } }, "kind": { @@ -1368,72 +1379,72 @@ } }, "indexerManager": { - "name": "", - "description": "", + "name": "Status menedżera indeksu", + "description": "Status Twoich indeksów", "option": { "openIndexerSiteInNewTab": { - "label": "" + "label": "Otwórz stronę indeksującą w nowej karcie" } }, - "title": "", - "testAll": "", + "title": "Menedżer indeksów", + "testAll": "Przetestuj wszystkie", "error": { - "internalServerError": "" + "internalServerError": "Nie udało się pobrać statusu indeksów" } }, "healthMonitoring": { - "name": "", - "description": "", + "name": "Monitorowanie zdrowia systemu", + "description": "Wyświetla informacje o stanie Twojego systemu(ów).", "option": { "fahrenheit": { - "label": "" + "label": "Temperatura procesora w Fahrenheit" }, "cpu": { - "label": "" + "label": "Pokaż informacje o procesorze" }, "memory": { - "label": "" + "label": "Pokaż informacje o pamięci" }, "fileSystem": { - "label": "" + "label": "Pokaż informacje o systemie plików" } }, "popover": { - "information": "", - "processor": "", - "memory": "", - "memoryAvailable": "", - "version": "", + "information": "Informacja", + "processor": "Procesor: {cpuModelName}", + "memory": "Pamięć: {memory}GiB", + "memoryAvailable": "Dostępna pamięć {memoryAvailable} GB ({percent}%)", + "version": "Wersja: {version}", "uptime": "", - "loadAverage": "", - "minute": "", - "minutes": "", - "used": "", - "available": "", - "lastSeen": "" + "loadAverage": "Średnie obciążenie", + "minute": "1 minuta", + "minutes": "{count} minut", + "used": "Używane", + "available": "Dostępne", + "lastSeen": "Ostatnia aktualizacja statusu: {lastSeen}" }, "memory": {}, "error": { - "internalServerError": "" + "internalServerError": "Nie udało się pobrać stanu zdrowia" } }, "common": { "location": { - "query": "", - "latitude": "", - "longitude": "", - "disabledTooltip": "", - "unknownLocation": "", + "query": "Miasto / kod pocztowy", + "latitude": "Szerokość geograficzna (Latitude)", + "longitude": "Długość geograficzna (Longitude)", + "disabledTooltip": "Podaj miasto lub kod pocztowy.", + "unknownLocation": "Nieznana lokalizacja", "search": "Szukaj", "table": { "header": { - "city": "", - "country": "", - "coordinates": "", - "population": "" + "city": "Miasto", + "country": "Kraj", + "coordinates": "Współrzędne", + "population": "Populacja" }, "action": { - "select": "" + "select": "Wybierz {city}, {countryCode}" }, "population": { "fallback": "Nieznany" @@ -1441,16 +1452,16 @@ } }, "integration": { - "noData": "", - "description": "" + "noData": "Nie znaleziono integracji", + "description": "Kliknij aby utworzyć nową integrację" }, "app": { - "noData": "", - "description": "" + "noData": "Nie znaleziono aplikacji", + "description": "Kliknij aby utworzyć nową aplikację" }, "error": { - "noIntegration": "", - "noData": "" + "noIntegration": "Nie wybrano integracji", + "noData": "Brak danych dotyczących integracji" }, "option": {} }, @@ -1463,79 +1474,79 @@ }, "hasAutoPlay": { "label": "Autoodtwarzanie", - "description": "" + "description": "Automatyczne odtwarzanie działa tylko po wyciszeniu odtwarzacza z powodu ograniczeń przeglądarki" }, "isMuted": { - "label": "" + "label": "Wyciszono" }, "hasControls": { - "label": "" + "label": "Pokaż klawisze nawigacyjne" } }, "error": { - "noUrl": "", - "forYoutubeUseIframe": "" + "noUrl": "Nie podano adresu URL wideo", + "forYoutubeUseIframe": "Dla filmów YouTube użyj opcji iframe" } }, "mediaServer": { - "name": "", - "description": "", + "name": "Bieżące strumienie serwera multimediów", + "description": "Pokaż bieżące strumienie na serwerach multimedialnych", "option": {}, "items": { - "user": "", - "name": "", - "id": "" + "user": "Użytkownik", + "name": "Nazwa", + "id": "ID" } }, "downloads": { - "name": "", - "description": "", + "name": "Klient pobierania", + "description": "Pozwala na oglądanie i zarządzanie pobieraniem zarówno przez klientów Torrent, jak i Usenet.", "option": { "columns": { - "label": "" + "label": "Kolumny do pokazania" }, "enableRowSorting": { - "label": "" + "label": "Włącz sortowanie przedmiotów" }, "defaultSort": { - "label": "" + "label": "Kolumna używana do sortowania domyślnie" }, "descendingDefaultSort": { - "label": "" + "label": "Odwróć sortowanie" }, "showCompletedUsenet": { - "label": "" + "label": "Pokaż wpisy usenet oznaczone jako zakończone" }, "showCompletedTorrent": { - "label": "" + "label": "Pokaż wpisy torrent oznaczone jako ukończone" }, "activeTorrentThreshold": { - "label": "" + "label": "Ukryj ukończony torrent poniżej tego progu (w kiB/s)" }, "categoryFilter": { - "label": "" + "label": "Kategorie/etykiety do filtrowania" }, "filterIsWhitelist": { - "label": "" + "label": "Filtruj jako białą listę" }, "applyFilterToRatio": { - "label": "" + "label": "Użyj filtra do obliczenia współczynnika" } }, "errors": { - "noColumns": "", - "noCommunications": "" + "noColumns": "Wybierz kolumny w elementach", + "noCommunications": "Nie można załadować danych z integracji" }, "items": { "actions": { - "columnTitle": "" + "columnTitle": "Sterowanie" }, "added": { - "columnTitle": "", + "columnTitle": "Dodano", "detailsTitle": "Data dodania" }, "category": { - "columnTitle": "", + "columnTitle": "Dodatki", "detailsTitle": "" }, "downSpeed": { @@ -1543,66 +1554,66 @@ "detailsTitle": "Prędkość pobierania" }, "index": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "#", + "detailsTitle": "Bieżący indeks w ramach klienta" }, "id": { - "columnTitle": "" + "columnTitle": "ID" }, "integration": { "columnTitle": "Integracja" }, "name": { - "columnTitle": "" + "columnTitle": "Nazwa zlecenia" }, "progress": { "columnTitle": "Postęp", - "detailsTitle": "" + "detailsTitle": "Postęp pobierania" }, "ratio": { "columnTitle": "Proporcja", - "detailsTitle": "" + "detailsTitle": "Współczynnik torrenta (otrzymany/wysłany)" }, "received": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Łączne pobieranie", + "detailsTitle": "Łącznie pobrano" }, "sent": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Łączne wysyłanie", + "detailsTitle": "Łącznie wysłano" }, "size": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Rozmiar pliku", + "detailsTitle": "Całkowity rozmiar zaznaczenia/plików" }, "state": { "columnTitle": "Status", - "detailsTitle": "" + "detailsTitle": "Stan pracy" }, "time": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Czas zakończenia", + "detailsTitle": "Czas od/do zakończenia" }, "type": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Typ", + "detailsTitle": "Pobierz typ klienta" }, "upSpeed": { "columnTitle": "Udostępnianie", - "detailsTitle": "" + "detailsTitle": "Prędkość wysyłania" } }, "states": { "downloading": "Pobieranie", - "queued": "", + "queued": "W kolejce", "paused": "Zatrzymane", "completed": "Zakończono", - "failed": "", - "processing": "", - "leeching": "", - "stalled": "", + "failed": "Nieudane", + "processing": "Przetwarzanie", + "leeching": "Leeching", + "stalled": "Zatrzymano", "unknown": "Nieznany", - "seeding": "" + "seeding": "Wysyłanie" }, "actions": { "clients": { @@ -1689,7 +1700,7 @@ }, "currentIndex": "", "healthCheck": { - "title": "", + "title": "Ocena stanu zdrowia", "queued": "", "status": { "healthy": "", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -1800,7 +1825,7 @@ "description": "" }, "onlyImportApps": { - "label": "", + "label": "Import tylko aplikacje", "description": "" } }, @@ -1928,7 +1953,7 @@ "metaTitle": "" }, "setting": { - "title": "", + "title": "Ustawienia tablicy {boardName}", "section": { "general": { "title": "Ogólne", @@ -1986,7 +2011,7 @@ "confirm": { "public": { "title": "", - "description": "" + "description": "Czy na pewno chcesz sprawić, by ta tablica była prywatna? Tablica nie będzie publiczna. Linki dla gości nie będą działać." }, "private": { "title": "", @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Usuń trwale", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Pierwszy dzień tygodnia", "accessibility": "Ułatwienia dostępu" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Wygląd", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/pt.json b/packages/translation/src/lang/pt.json index 0bc16005b..7a8163149 100644 --- a/packages/translation/src/lang/pt.json +++ b/packages/translation/src/lang/pt.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Aplicativos", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Excluir permanentemente", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Primeiro dia da semana", "accessibility": "Acessibilidade" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Aparência", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/ro.json b/packages/translation/src/lang/ro.json index 0b9244d47..6b26f70eb 100644 --- a/packages/translation/src/lang/ro.json +++ b/packages/translation/src/lang/ro.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Aplicații", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Șterge definitiv", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Prima zi a săptămâni", "accessibility": "Accesibilitate" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Aspect", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/ru.json b/packages/translation/src/lang/ru.json index 51110f68e..5c85f790f 100644 --- a/packages/translation/src/lang/ru.json +++ b/packages/translation/src/lang/ru.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Приложения", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "Эта панель будет показываться как ваша домашняя панель" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Удалить навсегда", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "Язык и регион", "board": "Домашняя панель", + "defaultSearchEngine": "", "firstDayOfWeek": "Первый день недели", "accessibility": "Специальные возможности" } @@ -2320,6 +2349,13 @@ "description": "Для выбора доступны только публичные панели" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Внешний вид", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "Произошла ошибка при обновлении данных о контейнерах" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "Локальные результаты" } diff --git a/packages/translation/src/lang/sk.json b/packages/translation/src/lang/sk.json index 1f7447e38..827c328a5 100644 --- a/packages/translation/src/lang/sk.json +++ b/packages/translation/src/lang/sk.json @@ -2,12 +2,12 @@ "init": { "step": { "start": { - "title": "Vitajte na Homár", + "title": "Víta Vás Homár", "subtitle": "Začnime s nastavením inštancie Homár.", "description": "Ak chcete začať, vyberte, ako chcete nastaviť inštanciu Homár.", "action": { "scratch": "Začať odznova", - "importOldmarr": "Import z Homarru pred 1.0" + "importOldmarr": "Import z Homarr pred 1.0" } }, "import": { @@ -114,7 +114,7 @@ }, "invite": { "title": "Pridajte sa k Homarrovi", - "subtitle": "Vitajte v Homarr! Prosím, vytvorte si účet", + "subtitle": "Vítajte v Homarr! Prosím, vytvorte si účet", "description": "Pozval vás {username}" }, "init": { @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "Predvolený vyhľadávací nástroj sa úspešne zmenil" + }, + "error": { + "message": "Nie je možné zmeniť predvolený vyhľadávací nástroj" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "Vyhľadať aplikáciu", "page": { "list": { "title": "Aplikácie", @@ -615,7 +626,7 @@ }, "attemptSearchEngineCreation": { "label": "Vytvorte vyhľadávače", - "description": "" + "description": "Integrácia \"{kind}\" môže byť použitá s vyhľadávačmi. Toto začiarknite, ak chcete automaticky nakonfigurovať vyhľadávací nástroj." } }, "action": { @@ -1157,7 +1168,7 @@ }, "minecraftServerStatus": { "name": "Minecraft Server Stav", - "description": "", + "description": "Zobraziť status Minecraft servera", "option": { "title": { "label": "Názov" @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "Duplikovať dosku", + "message": "Tým sa duplikuje nástenka {name} s celým jej obsahom. Ak widgety odkazujú na integrácie, ktoré nemáte povolené používať, budú odstránené.", + "notification": { + "success": { + "title": "Doska duplikovaná", + "message": "Doska bola úspešne duplikovaná" + }, + "error": { + "title": "Nieje možné duplikovať dosku", + "message": "Tabuľu nebolo možné duplikovať" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "Táto tabuľa sa zobrazí ako vaša domovská tabuľa" } }, + "duplicate": { + "label": "Duplikovať dosku" + }, "delete": { "label": "Odstrániť natrvalo", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "Jazyk a región", "board": "Domáca doska", + "defaultSearchEngine": "Predvolený vyhľadávací nástroj", "firstDayOfWeek": "Prvý deň v týždni", "accessibility": "Prístupnosť" } @@ -2320,6 +2349,13 @@ "description": "Na výber sú k dispozícii iba verejné tabule" } }, + "search": { + "title": "Hladať", + "defaultSearchEngine": { + "label": "Predvolený vyhľadávací nástroj", + "description": "Integračné vyhľadávače tu nie je možné vybrať" + } + }, "appearance": { "title": "Vzhľad", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "Pri obnovovaní kontajnerov sa niečo pokazilo" } } + }, + "addToHomarr": { + "label": "Pridať do Homarr", + "notification": { + "success": { + "title": "Pridané do Homarr", + "message": "Vybrané aplikácie boli pridané do Homarr" + }, + "error": { + "title": "Nepodarilo sa pridať do Homarr", + "message": "Vybrané aplikácie nebolo možné pridať do Homarr" + } + }, + "modal": { + "title": "Pridajte docker kontajner/y do Homarr" + } } }, "error": { @@ -2749,9 +2801,9 @@ } }, "media": { - "requestMovie": "", - "requestSeries": "", - "openIn": "" + "requestMovie": "Vyžiadať film", + "requestSeries": "Vyžiadať seriál", + "openIn": "Otvoriť v {kind}" }, "external": { "help": "Používanie externého vyhľadávača", @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "Hladať", + "option": { + "other": { + "label": "Hľadajte pomocou iného vyhľadávača" + }, + "no-default": { + "label": "Žiadny predvolený vyhľadávací nástroj", + "description": "Nastavte predvolený vyhľadávací nástroj v preferenciách" + }, + "search": { + "label": "Hľadať '{query}' s {name}" + }, + "from-integration": { + "description": "Ak chcete hľadať, začnite písať" + } + } + }, "local": { "title": "Miestne výsledky" } @@ -2997,15 +3067,15 @@ "media": { "request": { "modal": { - "title": "", + "title": "Vyžiadať \"{name}\"", "table": { "header": { - "season": "", - "episodes": "" + "season": "Séria", + "episodes": "Epizódy" } }, "button": { - "send": "" + "send": "Poslať požiadavku" } } } diff --git a/packages/translation/src/lang/sl.json b/packages/translation/src/lang/sl.json index f7ec5401b..0860a8e71 100644 --- a/packages/translation/src/lang/sl.json +++ b/packages/translation/src/lang/sl.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Aplikacije", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Trajno izbriši", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Prvi dan v tednu", "accessibility": "Dostopnost" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Videz", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/sv.json b/packages/translation/src/lang/sv.json index b7ec6e965..62b72c4a4 100644 --- a/packages/translation/src/lang/sv.json +++ b/packages/translation/src/lang/sv.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Appar", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Radera permanent", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Första veckodagen", "accessibility": "Tillgänglighet" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Utseende", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/tr.json b/packages/translation/src/lang/tr.json index 3cae5879f..36d6dc062 100644 --- a/packages/translation/src/lang/tr.json +++ b/packages/translation/src/lang/tr.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "Öntanımlı arama motoru başarıyla değiştirildi" + }, + "error": { + "message": "Öntanımlı arama motoru değiştirilemiyor" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "Uygulama Bulun", "page": { "list": { "title": "Uygulamalar", @@ -866,7 +877,7 @@ "zod": { "errors": { "default": "Bu alan geçersiz", - "required": "Bu alan gereklidir", + "required": "Bu alan gerekli", "string": { "startsWith": "Bu alan {startsWith} ile başlamalıdır", "endsWith": "Bu alan {endsWith} ile bitmelidir", @@ -1280,7 +1291,7 @@ "label": "Varlık Kimliği" }, "displayName": { - "label": "Ekran adı" + "label": "Görünen isim" }, "entityUnit": { "label": "Varlık Birimi" @@ -1295,7 +1306,7 @@ "description": "Tek tıklamayla otomasyonu tetikleyin", "option": { "displayName": { - "label": "Ekran adı" + "label": "Görünen isim" }, "automationId": { "label": "Otomasyon Kimliği" @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "Paneli Kopyala", + "message": "{name} panelini tüm içerikleri ile birlikte kopyalamayı seçtiniz. Kullanım yetkiniz olmayan entegrasyonlar ve bunları içeren araçlar dahil edilmeyecektir.", + "notification": { + "success": { + "title": "Panel Kopyalandı", + "message": "Panel başarıyla kopyalandı" + }, + "error": { + "title": "Panel Kopyalanamıyor", + "message": "Panel kopyalanamadı" + } + } + }, "edit": { "notification": { "success": { @@ -2119,12 +2144,15 @@ "label": "Ayarlar" }, "setHomeBoard": { - "label": "Öntanımlı panel olarak ayarlayın", + "label": "Öntanımlı Panel Olarak Ata", "badge": { "label": "Ana Sayfa", "tooltip": "Bu panel sizin öntanımlı paneliniz olarak görüntülenecektir" } }, + "duplicate": { + "label": "Paneli Kopyala" + }, "delete": { "label": "Kalıcı olarak sil", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "Dil & Bölge", "board": "Öntanımlı panel", + "defaultSearchEngine": "Öntanımlı arama motoru", "firstDayOfWeek": "Haftanın ilk günü", "accessibility": "Erişilebilirlik" } @@ -2320,6 +2349,13 @@ "description": "Seçim yalnızca herkese açık paneller için kullanılabilir" } }, + "search": { + "title": "Ara", + "defaultSearchEngine": { + "label": "Genel öntanımlı arama motoru", + "description": "Entegrasyona bağlı arama motorları burada seçilemez" + } + }, "appearance": { "title": "Görünüş", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "Konteynerler yenilenirken bir şeyler ters gitti" } } + }, + "addToHomarr": { + "label": "Homarr'a Ekle", + "notification": { + "success": { + "title": "Homarr'a Eklendi", + "message": "Seçili uygulamalar Homarr'a eklendi" + }, + "error": { + "title": "Homarr'a Eklenemedi", + "message": "Seçilen uygulamalar Homarr'a eklenemedi" + } + }, + "modal": { + "title": "Homarr'a docker konteyner(-ler)i ekleyin" + } } }, "error": { @@ -2648,7 +2700,7 @@ } }, "search": { - "placeholder": "Ara (\"!\" İle Başlamalı)", + "placeholder": "Aramak için yaz", "nothingFound": "Hiçbir şey bulunamadı", "error": { "fetch": "Veriler alınırken bir hata oluştu" @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "Ara", + "option": { + "other": { + "label": "Farklı bir arama motoruyla arama yap" + }, + "no-default": { + "label": "Öntanımlı arama motoru yapılandırılmadı", + "description": "Tercihlerde öntanımlı arama motoru belirleyin" + }, + "search": { + "label": "{name} ile '{query}' ifadesini arayın" + }, + "from-integration": { + "description": "Aramak için yazmaya başla" + } + } + }, "local": { "title": "Yerel sonuçlar" } diff --git a/packages/translation/src/lang/uk.json b/packages/translation/src/lang/uk.json index 70f32201f..e9986da6e 100644 --- a/packages/translation/src/lang/uk.json +++ b/packages/translation/src/lang/uk.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Додатки", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Видалити назавжди", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Перший день тижня", "accessibility": "Доступність" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Вигляд", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/vi.json b/packages/translation/src/lang/vi.json index ca5198343..38ce91177 100644 --- a/packages/translation/src/lang/vi.json +++ b/packages/translation/src/lang/vi.json @@ -210,6 +210,16 @@ } } }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "" + }, + "error": { + "message": "" + } + } + }, "changeFirstDayOfWeek": { "notification": { "success": { @@ -489,6 +499,7 @@ } }, "app": { + "search": "", "page": { "list": { "title": "Ứng dụng", @@ -1760,6 +1771,20 @@ }, "board": { "action": { + "duplicate": { + "title": "", + "message": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + }, "edit": { "notification": { "success": { @@ -2125,6 +2150,9 @@ "tooltip": "" } }, + "duplicate": { + "label": "" + }, "delete": { "label": "Xóa vĩnh viễn", "confirm": { @@ -2159,6 +2187,7 @@ "item": { "language": "", "board": "", + "defaultSearchEngine": "", "firstDayOfWeek": "Ngày đầu tiên trong tuần", "accessibility": "Trợ năng" } @@ -2320,6 +2349,13 @@ "description": "" } }, + "search": { + "title": "", + "defaultSearchEngine": { + "label": "", + "description": "" + } + }, "appearance": { "title": "Hiển thị", "defaultColorScheme": { @@ -2544,6 +2580,22 @@ "message": "" } } + }, + "addToHomarr": { + "label": "", + "notification": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + }, + "modal": { + "title": "" + } } }, "error": { @@ -2819,6 +2871,24 @@ }, "home": { "group": { + "search": { + "title": "", + "option": { + "other": { + "label": "" + }, + "no-default": { + "label": "", + "description": "" + }, + "search": { + "label": "" + }, + "from-integration": { + "description": "" + } + } + }, "local": { "title": "" } diff --git a/packages/translation/src/lang/zh.json b/packages/translation/src/lang/zh.json index aea4140da..9800a9eab 100644 --- a/packages/translation/src/lang/zh.json +++ b/packages/translation/src/lang/zh.json @@ -2,259 +2,269 @@ "init": { "step": { "start": { - "title": "", - "subtitle": "", - "description": "", + "title": "歡迎使用 Homarr", + "subtitle": "讓我們開始設定 Homarr", + "description": "請選擇設定 Homarr 方式", "action": { - "scratch": "", - "importOldmarr": "" + "scratch": "重新開始", + "importOldmarr": "從 1.0 版本的 Homarr 匯入設定" } }, "import": { - "title": "", - "subtitle": "", + "title": "匯入數據", + "subtitle": "從現有的 Homarr 匯入數據", "dropzone": { - "title": "", - "description": "" + "title": "將 ZIP 壓縮檔拖曳至此處或點擊瀏覽", + "description": "上傳的壓縮檔將被處理,您可以選擇要匯入的內容" }, "fileInfo": { "action": { - "change": "" + "change": "更改檔案" } }, "importSettings": { - "title": "", - "description": "" + "title": "匯入設定", + "description": "設定匯入方式" }, "boardSelection": { - "title": "", - "description": "", + "title": "找到 {count} 個面板", + "description": "選擇要匯入的面板", "action": { - "selectAll": "", - "unselectAll": "" + "selectAll": "選擇全部", + "unselectAll": "取消全選" } }, "summary": { - "title": "", - "description": "", + "title": "匯入概況", + "description": "於下方的概況中,可以看到即將匯入的內容", "action": { - "import": "" + "import": "確認匯入並繼續" }, "entities": { - "apps": "", - "boards": "", - "integrations": "", - "credentialUsers": "" + "apps": "應用程式", + "boards": "面板", + "integrations": "集成", + "credentialUsers": "使用者憑證" } }, "tokenModal": { - "title": "", + "title": "輸入匯入密鑰", "field": { "token": { - "label": "", - "description": "" + "label": "密鑰", + "description": "輸入之前 Homarr 中顯示導入之密鑰匙" } }, "notification": { "error": { - "title": "", - "message": "" + "title": "無效密鑰", + "message": "輸入的密鑰無效" } } } }, "user": { - "title": "", - "subtitle": "", + "title": "管理員", + "subtitle": "指定管理員的使用者憑證", "notification": { "success": { - "title": "", - "message": "" + "title": "創建使用者", + "message": "使用者已成功創建" }, "error": { - "title": "" + "title": "使用者創建失敗" } } }, "group": { - "title": "", - "subtitle": "", + "title": "外部使用者", + "subtitle": "指定用於外部使用者的用戶組", "form": { "name": { - "label": "", - "description": "" + "label": "用戶組名稱", + "description": "名稱必須與外部提供者的管理員匹配" } } }, "settings": { - "title": "", - "subtitle": "" + "title": "設定", + "subtitle": "設定伺服器的設定" }, "finish": { - "title": "", - "subtitle": "", - "description": "", + "title": "設定完成", + "subtitle": "已設定完成", + "description": "已成功完成設定,開始使用 Homarr,請選擇下一步操作", "action": { - "goToBoard": "", - "createBoard": "", - "inviteUser": "", - "docs": "" + "goToBoard": "進入 {name} 面板", + "createBoard": "創建第一個面板", + "inviteUser": "邀請其他使用者", + "docs": "閱讀說明書" } } }, - "backToStart": "" + "backToStart": "返回起點" }, "user": { - "title": "", - "name": "", + "title": "使用者", + "name": "使用者", "page": { "login": { - "title": "", - "subtitle": "" + "title": "登入帳戶", + "subtitle": "歡迎回來!請輸入憑證" }, "invite": { - "title": "", - "subtitle": "", - "description": "" + "title": "加入 Homarr", + "subtitle": "歡迎來到 Homarr!請創建帳戶", + "description": "您受到 {username} 的邀請" }, "init": { - "title": "", - "subtitle": "" + "title": "新建 Homarr 安裝", + "subtitle": "請創建初始管理員" } }, "field": { "email": { - "label": "", - "verified": "" + "label": "E-Mail", + "verified": "已驗證" }, "username": { - "label": "" + "label": "使用者名稱" }, "password": { - "label": "", + "label": "密碼", "requirement": { - "length": "", - "lowercase": "", - "uppercase": "", - "number": "", - "special": "" + "length": "至少包含 8 個字符", + "lowercase": "包含小寫字母", + "uppercase": "包含大寫字母", + "number": "包含數字", + "special": "包含特殊符號" } }, "passwordConfirm": { - "label": "" + "label": "確認密碼" }, "previousPassword": { - "label": "" + "label": "過去的密碼" }, "homeBoard": { - "label": "" + "label": "主面板" }, "pingIconsEnabled": { - "label": "" + "label": "為 Pings 使用 icon" } }, "error": { - "usernameTaken": "" + "usernameTaken": "使用者名稱已存在" }, "action": { "login": { - "label": "", - "labelWith": "", + "label": "登入", + "labelWith": "使用 {provider} 登入", "notification": { "success": { - "title": "", - "message": "" + "title": "登入成功", + "message": "您已登入" }, "error": { - "title": "", - "message": "" + "title": "登入失敗", + "message": "您已登入失敗" } }, "forgotPassword": { - "label": "", - "description": "" + "label": "忘記密碼嗎?", + "description": "管理員可以使用以下命令重設密碼" } }, "register": { - "label": "", + "label": "創建帳戶", "notification": { "success": { - "title": "", - "message": "" + "title": "帳戶已創建", + "message": "請登入後繼續" }, "error": { - "title": "", - "message": "" + "title": "帳戶創建失敗", + "message": "無法創建帳戶" } } }, - "create": "", + "create": "創建使用者", "changePassword": { - "label": "", + "label": "更改密碼", "notification": { "success": { - "message": "" + "message": "密碼已成功更改" }, "error": { - "message": "" + "message": "無法更改密碼" } } }, "changeHomeBoard": { "notification": { "success": { - "message": "" + "message": "主面板已更改成功" }, "error": { - "message": "" + "message": "無法更改主面板" + } + } + }, + "changeDefaultSearchEngine": { + "notification": { + "success": { + "message": "預設搜尋引擎已變更成功" + }, + "error": { + "message": "預設搜尋引擎無法變更" } } }, "changeFirstDayOfWeek": { "notification": { "success": { - "message": "" + "message": "成功編輯一周的第一天" }, "error": { - "message": "" + "message": "無法編輯一周的第一天" } } }, "changePingIconsEnabled": { "notification": { "success": { - "message": "" + "message": "Pings icon 切換成功" }, "error": { - "message": "" + "message": "無法切換 Pings icon" } } }, "manageAvatar": { "changeImage": { - "label": "", + "label": "更改圖案", "notification": { "success": { - "message": "" + "message": "圖案編輯成功" }, "error": { - "message": "" + "message": "無法更改圖案" }, "toLarge": { - "title": "", - "message": "" + "title": "圖案太大", + "message": "最大圖案尺寸為 {size}" } } }, "removeImage": { - "label": "", - "confirm": "", + "label": "移除圖案", + "confirm": "確認要移除圖案嗎?", "notification": { "success": { - "message": "" + "message": "圖案移除成功" }, "error": { - "message": "" + "message": "無法移除圖案" } } } @@ -262,633 +272,634 @@ "editProfile": { "notification": { "success": { - "message": "" + "message": "數據更新成功" }, "error": { - "message": "" + "message": "數據無法更新" } } }, "delete": { - "label": "", - "description": "", - "confirm": "" + "label": "永久移除使用者", + "description": "移除此使用者,包括其偏好設定,這不會移除任何面板,且用戶不會收到通知", + "confirm": "你確認移除使用者 {username} 及其偏好設定嗎?" }, "select": { - "label": "", - "notFound": "" + "label": "選擇使用者", + "notFound": "使用者不存在" }, "transfer": { - "label": "" + "label": "選擇新的所有者" } } }, "group": { - "title": "", - "name": "", - "search": "", + "title": "用戶組", + "name": "組", + "search": "尋找用戶組", "field": { - "name": "", - "members": "" + "name": "名稱", + "members": "成員" }, "permission": { "admin": { - "title": "", + "title": "管理員", "item": { "admin": { - "label": "", - "description": "" + "label": "管理員", + "description": "擁有此權限的使用者可完全訪問全部功能和設定" } } }, "app": { - "title": "", + "title": "應用程式", "item": { "create": { - "label": "", - "description": "" + "label": "創建應用程式", + "description": "允許成員創建應用程式" }, "use-all": { - "label": "", - "description": "" + "label": "使用全部應用程式", + "description": "允許成員編輯全部應用程式" }, "modify-all": { - "label": "", - "description": "" + "label": "編輯全部應用程式", + "description": "允許成員編輯全部應用程式" }, "full-all": { - "label": "", - "description": "" + "label": "完整應用程式權限", + "description": "允許成員編輯全部應用程式" } } }, "board": { - "title": "", + "title": "面板", "item": { "create": { - "label": "", - "description": "" + "label": "創建面板", + "description": "允許成員創建面板" }, "view-all": { - "label": "", - "description": "" + "label": "查看全部面板", + "description": "允許成員查看全部面板" }, "modify-all": { - "label": "", - "description": "" + "label": "編輯全部面板", + "description": "允許成員編輯全部面板,不包括訪問控制和危險區域" }, "full-all": { - "label": "", - "description": "" + "label": "完整面板權限", + "description": "允許成員查看、編輯和移除全部面板,包括訪問控制和危險區域" } } }, "integration": { - "title": "", + "title": "集成", "item": { "create": { - "label": "", - "description": "" + "label": "創建集成", + "description": "允許成員創建集成" }, "use-all": { - "label": "", - "description": "" + "label": "使用全部集成", + "description": "允許成員將任何應用程式新增至他們的面板" }, "interact-all": { - "label": "", - "description": "" + "label": "與任何集成進行互動", + "description": "允許成員與任何集成進行交互" }, "full-all": { - "label": "", - "description": "" + "label": "完整的集成訪問權限", + "description": "允許成員管理、使用並與任何集成交互" } } }, "media": { - "title": "", + "title": "多媒體", "item": { "upload": { - "label": "", - "description": "" + "label": "上傳多媒體", + "description": "允許成員上傳多媒體" }, "view-all": { - "label": "", - "description": "" + "label": "查看全部多媒體", + "description": "允許成員查看全部多媒體" }, "full-all": { - "label": "", - "description": "" + "label": "圖案移除成功", + "description": "允許使用者管理、使用、移除任何應用" } } }, "other": { - "title": "", + "title": "其他", "item": { "view-logs": { - "label": "", - "description": "" + "label": "檢視 Logs", + "description": "允許使用者檢視 Logs" } } }, "search-engine": { - "title": "", + "title": "搜尋引擎", "item": { "create": { - "label": "", - "description": "" + "label": "創建搜尋引擎", + "description": "允許使用者創建搜尋引擎" }, "modify-all": { - "label": "", - "description": "" + "label": "編輯全部搜尋引擎", + "description": "允許使用者編輯全部搜尋引擎" }, "full-all": { - "label": "", - "description": "" + "label": "完整搜尋引擎的訪問權限", + "description": "允許使用者管理、移除任何搜尋引擎" } } } }, "memberNotice": { - "mixed": "", - "external": "" + "mixed": "部分使用者來自外部提供者,無法在此處管理", + "external": "全部成員都來自外部提供者,無法在此處管理" }, "reservedNotice": { - "message": "" + "message": "此用戶組保留供系統使用並限制部分操作 " }, "action": { "create": { - "label": "", + "label": "創建用戶組", "notification": { "success": { - "message": "" + "message": "用戶組已創建成功" }, "error": { - "message": "" + "message": "用戶組創建失敗" } } }, "transfer": { - "label": "", - "description": "", - "confirm": "", + "label": "移轉所有權", + "description": "將此用戶組的所有權移轉至其他用戶", + "confirm": "確認將用戶組 {name} 的所有權移轉至 {username} 嗎?", "notification": { "success": { - "message": "" + "message": "將用戶組 {group} 的所有權移轉至 {user} 成功" }, "error": { - "message": "" + "message": "無法移轉所有權" } } }, "addMember": { - "label": "" + "label": "新增成員" }, "removeMember": { - "label": "", - "confirm": "" + "label": "移除成員", + "confirm": "確認將 {user} 移除此用戶組嗎?" }, "delete": { - "label": "", - "description": "", - "confirm": "", + "label": "移除用戶組", + "description": "用戶組一旦刪除將無法恢復,請謹慎操作", + "confirm": "確認移除用戶組 {name} 嗎?", "notification": { "success": { - "message": "" + "message": "移除用戶組 {name} 成功" }, "error": { - "message": "" + "message": "無法移除用戶組 {name}" } } }, "changePermissions": { "notification": { "success": { - "title": "", - "message": "" + "title": "權限已儲存", + "message": "權限已儲存成功" }, "error": { - "title": "", - "message": "" + "title": "權限未儲存", + "message": "權限尚未儲存" } } }, "update": { "notification": { "success": { - "message": "" + "message": "用戶組 {name} 已儲存成功" }, "error": { - "message": "" + "message": "無法儲存用戶組 {name}" } } }, "select": { - "label": "", - "notFound": "" + "label": "選擇用戶組", + "notFound": "用戶組不存在" } } }, "app": { + "search": "尋找應用程式", "page": { "list": { - "title": "", + "title": "應用程式", "noResults": { - "title": "", - "action": "" + "title": "尚無應用程式", + "action": "創建第一個應用程式" } }, "create": { - "title": "", + "title": "創建應用程式", "notification": { "success": { - "title": "", - "message": "" + "title": "創建成功", + "message": "應用程式已創建成功" }, "error": { - "title": "", - "message": "" + "title": "創建失敗", + "message": "應用程式無法創建" } } }, "edit": { - "title": "", + "title": "編輯應用程式", "notification": { "success": { - "title": "", - "message": "" + "title": "應用程式編輯成功", + "message": "應用程式儲存成功" }, "error": { - "title": "", - "message": "" + "title": "無法更改", + "message": "應用程式無法儲存" } } }, "delete": { - "title": "", - "message": "", + "title": "移除應用程式", + "message": "確認移除此應用程式 {name} 嗎?", "notification": { "success": { - "title": "", - "message": "" + "title": "移除成功", + "message": "應用程式已移除成功" }, "error": { - "title": "", - "message": "" + "title": "移除失敗", + "message": "無法移除應用程式" } } } }, "field": { "name": { - "label": "" + "label": "名稱" }, "description": { - "label": "" + "label": "描述" }, "url": { - "label": "" + "label": "網址" } }, "action": { "select": { - "label": "", - "notFound": "" + "label": "選擇應用程式", + "notFound": "應用程式不存在" } } }, "integration": { "page": { "list": { - "title": "", - "search": "", + "title": "集成", + "search": "選擇集成", "noResults": { - "title": "" + "title": "尚無集成" } }, "create": { - "title": "", + "title": "創建 {name} 集成", "notification": { "success": { - "title": "", - "message": "" + "title": "創建成功", + "message": "集成創建成功" }, "error": { - "title": "", - "message": "" + "title": "創建失敗", + "message": "此集成無法被創建" } } }, "edit": { - "title": "", + "title": "編輯 {name} 集成", "notification": { "success": { - "title": "", - "message": "" + "title": "編輯成功", + "message": "集成已儲存成功" }, "error": { - "title": "", - "message": "" + "title": "無法應用變更", + "message": "集成無法被儲存" } } }, "delete": { - "title": "", - "message": "", + "title": "移除集成", + "message": "確認移除集成 {name} 嗎?", "notification": { "success": { - "title": "", - "message": "" + "title": "移除成功", + "message": "集成移除成功" }, "error": { - "title": "", - "message": "" + "title": "移除失敗", + "message": "集成移除失敗" } } } }, "field": { "name": { - "label": "" + "label": "名稱" }, "url": { - "label": "" + "label": "網址" }, "attemptSearchEngineCreation": { - "label": "", - "description": "" + "label": "創建搜尋引擎", + "description": "集成 {kind} 可以與搜尋引擎共同使用,勾選此選項可自動設定搜尋引擎" } }, "action": { - "create": "" + "create": "創建集成" }, "testConnection": { "action": { - "create": "", - "edit": "" + "create": "測試連線並創建", + "edit": "測試連線並儲存" }, - "alertNotice": "", + "alertNotice": "成功建立連線後儲存按鈕將啟用", "notification": { "success": { - "title": "", - "message": "" + "title": "連線成功", + "message": "已成功建立連線" }, "invalidUrl": { - "title": "", - "message": "" + "title": "無效網址", + "message": "此網址無效" }, "secretNotDefined": { - "title": "", - "message": "" + "title": "缺少憑證", + "message": "並非全部憑證都已提供" }, "invalidCredentials": { - "title": "", - "message": "" + "title": "無效憑證", + "message": "憑證無效" }, "commonError": { - "title": "", - "message": "" + "title": "連線失敗", + "message": "無法建立連線" }, "badRequest": { - "title": "", - "message": "" + "title": "錯誤請求", + "message": "請求格式不正確" }, "unauthorized": { - "title": "", - "message": "" + "title": "未授權", + "message": "可能是錯誤的憑證" }, "forbidden": { - "title": "", - "message": "" + "title": "禁止", + "message": "可能缺少權限" }, "notFound": { - "title": "", - "message": "" + "title": "不存在", + "message": "可能是錯誤的網址或路徑" }, "internalServerError": { - "title": "", - "message": "" + "title": "伺服器內部錯誤", + "message": "伺服器遇到錯誤" }, "serviceUnavailable": { - "title": "", - "message": "" + "title": "服務暫時不可用", + "message": "伺服器當前不可用" }, "connectionAborted": { - "title": "", - "message": "" + "title": "連線終止", + "message": "連線被終止" }, "domainNotFound": { - "title": "", - "message": "" + "title": "網域不存在", + "message": "網域不存在" }, "connectionRefused": { - "title": "", - "message": "" + "title": "連線拒絕", + "message": "連線被拒絕" }, "invalidJson": { - "title": "", - "message": "" + "title": "無效的 JSON", + "message": "無效的 JSON 回應" }, "wrongPath": { - "title": "", - "message": "" + "title": "路徑錯誤", + "message": "路徑可能是錯誤" } } }, "secrets": { - "title": "", - "lastUpdated": "", + "title": "密鑰", + "lastUpdated": "最後更新於 {date}", "notSet": { - "label": "", - "tooltip": "" + "label": "未設定值", + "tooltip": "尚未設定此必填的密鑰" }, - "secureNotice": "", + "secureNotice": "創建後無法再次取得此密鑰", "reset": { - "title": "", - "message": "" + "title": "重設密鑰", + "message": "確認重設密鑰嗎?" }, "noSecretsRequired": { - "segmentTitle": "", - "text": "" + "segmentTitle": "無密鑰", + "text": "此集成無需密鑰" }, "kind": { "username": { - "label": "", - "newLabel": "" + "label": "使用者名稱", + "newLabel": "新使用者名稱" }, "apiKey": { - "label": "", - "newLabel": "" + "label": "API Key", + "newLabel": "新 API Key" }, "password": { - "label": "", - "newLabel": "" + "label": "密碼", + "newLabel": "新密碼" } } }, "permission": { - "use": "", - "interact": "", - "full": "" + "use": "選擇項目中的集成", + "interact": "與集成進行互動", + "full": "完整的集成訪問權限" } }, "media": { - "plural": "", - "search": "", + "plural": "多媒體", + "search": "尋找多媒體", "field": { - "name": "", - "size": "", - "creator": "" + "name": "名稱", + "size": "大小", + "creator": "創建者" }, "action": { "upload": { - "label": "", - "file": "", + "label": "上傳多媒體", + "file": "選擇檔案", "notification": { "success": { - "message": "" + "message": "多媒體已上傳成功" }, "error": { - "message": "" + "message": "多媒體無法上傳" } } }, "delete": { - "label": "", - "description": "", + "label": "移除多媒體", + "description": "確認移除多媒體 嗎?", "notification": { "success": { - "message": "" + "message": "多媒體已移除成功" }, "error": { - "message": "" + "message": "多媒體無法移除" } } }, "copy": { - "label": "" + "label": "複製網址" } } }, "common": { - "beta": "", - "error": "", + "beta": "測試版", + "error": "錯誤", "action": { - "add": "", - "apply": "", - "backToOverview": "", - "create": "", - "edit": "", - "import": "", - "insert": "", - "remove": "", - "save": "", - "saveChanges": "", - "cancel": "", - "delete": "", - "discard": "", - "confirm": "", - "continue": "", - "previous": "", - "next": "", - "checkoutDocs": "", - "checkLogs": "", - "tryAgain": "", - "loading": "" - }, - "here": "", + "add": "新增", + "apply": "應用", + "backToOverview": "返回總覽", + "create": "創建", + "edit": "編輯", + "import": "匯入", + "insert": "插入", + "remove": "移除", + "save": "儲存", + "saveChanges": "儲存變更", + "cancel": "取消", + "delete": "移除", + "discard": "丟棄", + "confirm": "確認", + "continue": "繼續", + "previous": "上一步", + "next": "下一步", + "checkoutDocs": "查閱說明書", + "checkLogs": "檢查 Logs 以取得更多詳情", + "tryAgain": "重試", + "loading": "正在讀取" + }, + "here": "此處", "iconPicker": { - "label": "", - "header": "" + "label": "Icon 網址", + "header": "輸入名稱或物件來篩選 icons,Homarr 會自動搜尋 {countIcons}" }, "colorScheme": { "options": { - "light": "", - "dark": "" + "light": "日間", + "dark": "暗黑" } }, "information": { - "min": "", - "max": "", - "days": "", - "hours": "", - "minutes": "" + "min": "最小", + "max": "最大", + "days": "天", + "hours": "時", + "minutes": "分" }, "notification": { "create": { - "success": "", - "error": "" + "success": "創建成功", + "error": "創建失敗" }, "delete": { - "success": "", - "error": "" + "success": "移除成功", + "error": "移除失敗" }, "update": { - "success": "", - "error": "" + "success": "應用變更成功", + "error": "無法應用變更" }, "transfer": { - "success": "", - "error": "" + "success": "移轉成功", + "error": "移轉失敗" } }, "multiSelect": { - "placeholder": "" + "placeholder": "選擇一個或多個值" }, "multiText": { - "placeholder": "", - "addLabel": "" + "placeholder": "新增更多值", + "addLabel": "新增 {value}" }, "select": { - "placeholder": "", + "placeholder": "選擇值", "badge": { - "recommended": "" + "recommended": "建議" } }, "userAvatar": { "menu": { - "switchToDarkMode": "", - "switchToLightMode": "", - "management": "", - "preferences": "", - "logout": "", - "login": "", - "homeBoard": "", - "loggedOut": "", - "updateAvailable": "" + "switchToDarkMode": "切換至暗黑模式", + "switchToLightMode": "切換至日間模式", + "management": "管理中心", + "preferences": "偏好設定", + "logout": "登出", + "login": "登入", + "homeBoard": "首頁", + "loggedOut": "已登出", + "updateAvailable": "{countUpdates} 可用更新:{tag}" } }, - "dangerZone": "", - "noResults": "", + "dangerZone": "危險區域", + "noResults": "未找到結果", "preview": { - "show": "", - "hide": "" + "show": "顯示預覽", + "hide": "隱藏預覽" }, "zod": { "errors": { - "default": "", - "required": "", + "default": "此欄位無效", + "required": "此欄位為必填", "string": { - "startsWith": "", - "endsWith": "", - "includes": "", - "invalidEmail": "" + "startsWith": "此欄位必須以 {startsWith} 開頭", + "endsWith": "此欄位必須以 {endsWith} 結尾", + "includes": "此欄位必須包含 {includes}", + "invalidEmail": "此欄位必須是有效的 E-Mail" }, "tooSmall": { - "string": "", - "number": "" + "string": "此欄位必須至少為 {minimum} 個字符", + "number": "此欄位必須大於或等於 {minimum}" }, "tooBig": { - "string": "", - "number": "" + "string": "此欄位長度不得超過 {maximum}", + "number": "此欄位必須小於或等於 {maximum}" }, "custom": { - "passwordsDoNotMatch": "", - "passwordRequirements": "", - "boardAlreadyExists": "", - "invalidFileType": "", - "fileTooLarge": "", - "invalidConfiguration": "", - "groupNameTaken": "" + "passwordsDoNotMatch": "兩次輸入的密碼不一致", + "passwordRequirements": "密碼不符合要求", + "boardAlreadyExists": "此面板名稱已存在", + "invalidFileType": "無效的檔案類型,例如 {expected}", + "fileTooLarge": "檔案太大,最大大小為 {maxSize}", + "invalidConfiguration": "無效設定", + "groupNameTaken": "用戶組名稱已存在" } } } @@ -896,937 +907,951 @@ "section": { "dynamic": { "action": { - "create": "", - "remove": "" + "create": "創建動態區段", + "remove": "移除動態區段" }, "remove": { - "title": "", - "message": "" + "title": "移除動態區段", + "message": "確認要移除此動態區段嗎?項目將移動到父區段的相同位置" } }, "category": { "field": { "name": { - "label": "" + "label": "名稱" } }, "action": { - "create": "", - "edit": "", - "remove": "", - "moveUp": "", - "moveDown": "", - "createAbove": "", - "createBelow": "" + "create": "創建分類", + "edit": "移除分類", + "remove": "移除分類", + "moveUp": "上移", + "moveDown": "下移", + "createAbove": "新分類之上", + "createBelow": "新分類之下" }, "create": { - "title": "", - "submit": "" + "title": "創建分類", + "submit": "創建分類" }, "remove": { - "title": "", - "message": "" + "title": "移除分類", + "message": "確認移除分類 {name} 嗎?" }, "edit": { - "title": "", - "submit": "" + "title": "重新命名分類", + "submit": "重新命名分類" }, "menu": { "label": { - "create": "", - "changePosition": "" + "create": "創建分類", + "changePosition": "變更位置" } } } }, "item": { "action": { - "create": "", - "import": "", - "edit": "", - "moveResize": "", - "duplicate": "", - "remove": "" + "create": "創建項目", + "import": "匯入項目", + "edit": "編輯項目", + "moveResize": "移動 / 調整大小項目", + "duplicate": "複製項目", + "remove": "移除項目" }, "menu": { "label": { - "settings": "" + "settings": "設定" } }, "create": { - "title": "", - "addToBoard": "" + "title": "選擇要新增的項目", + "addToBoard": "新增至面板" }, "moveResize": { - "title": "", + "title": "移動 / 調整大小項目", "field": { "width": { - "label": "" + "label": "寬度" }, "height": { - "label": "" + "label": "高度" }, "xOffset": { - "label": "" + "label": "X 軸" }, "yOffset": { - "label": "" + "label": "Y 軸" } } }, "edit": { - "title": "", + "title": "編輯項目", "advancedOptions": { - "label": "", - "title": "" + "label": "進階選項", + "title": "進階項目選項" }, "field": { "integrations": { - "label": "" + "label": "集成" }, "customCssClasses": { - "label": "" + "label": "自定義 CSS html" } } }, "remove": { - "title": "", - "message": "" + "title": "移除項目", + "message": "確認要移除此項目嗎?" } }, "widget": { "app": { - "name": "", - "description": "", + "name": "應用程式", + "description": "將應用程式新增至面板中", "option": { "appId": { - "label": "" + "label": "選擇應用程式" }, "openInNewTab": { - "label": "" + "label": "於新分頁中開啟" }, "showTitle": { - "label": "" + "label": "顯示應用程式名稱" }, "showDescriptionTooltip": { - "label": "" + "label": "顯示描述提示" }, "pingEnabled": { - "label": "" + "label": "啟用簡單的 Ping" } }, "error": { "notFound": { - "label": "", - "tooltip": "" + "label": "無應用程式", + "tooltip": "未選擇有效的應用程式" } } }, "bookmarks": { - "name": "", - "description": "", + "name": "書籤", + "description": "顯示多個應用程式鏈結", "option": { "title": { - "label": "" + "label": "標題" }, "layout": { - "label": "", + "label": "顯示布局", "option": { "row": { - "label": "" + "label": "橫向" }, "column": { - "label": "" + "label": "垂直" }, "grid": { - "label": "" + "label": "網格" } } }, "items": { - "label": "", - "add": "" + "label": "書籤", + "add": "新增書籤" } } }, "dnsHoleSummary": { - "name": "", - "description": "", + "name": "DNS Hole 概況", + "description": "顯示 DNS Hole 的概況", "option": { "layout": { - "label": "", + "label": "顯示布局", "option": { "row": { - "label": "" + "label": "橫向" }, "column": { - "label": "" + "label": "垂直" }, "grid": { - "label": "" + "label": "網格" } } }, "usePiHoleColors": { - "label": "" + "label": "使用 Pi-Hole 顏色" } }, "error": { - "internalServerError": "", - "integrationsDisconnected": "" + "internalServerError": "取得 DNS Hole 概況失敗", + "integrationsDisconnected": "無可用的數據,所有集成已斷線" }, "data": { - "adsBlockedToday": "", - "adsBlockedTodayPercentage": "", - "dnsQueriesToday": "", - "domainsBeingBlocked": "" + "adsBlockedToday": "今日封鎖", + "adsBlockedTodayPercentage": "今日封鎖", + "dnsQueriesToday": "今日查詢", + "domainsBeingBlocked": "黑名單的網域" } }, "dnsHoleControls": { - "name": "", - "description": "", + "name": "DNS Hole 控制", + "description": "從面板控制 Pi-Hole 或 AdGuard", "option": { "layout": { - "label": "", + "label": "顯示布局", "option": { "row": { - "label": "" + "label": "橫向" }, "column": { - "label": "" + "label": "垂直" }, "grid": { - "label": "" + "label": "網格" } } }, "showToggleAllButtons": { - "label": "" + "label": "顯示全部按鈕" } }, "error": { - "internalServerError": "" + "internalServerError": "無法控制 DNS Hole" }, "controls": { - "enableAll": "", - "disableAll": "", - "setTimer": "", - "set": "", - "enabled": "", - "disabled": "", - "processing": "", - "disconnected": "", - "hours": "", - "minutes": "", - "unlimited": "" + "enableAll": "啟用全部", + "disableAll": "停用全部", + "setTimer": "設定計時", + "set": "設定", + "enabled": "已啟用", + "disabled": "已停用", + "processing": "處理中", + "disconnected": "斷線", + "hours": "時", + "minutes": "分", + "unlimited": "留空表示無限制" } }, "clock": { - "name": "", - "description": "", + "name": "日期和時間", + "description": "顯示當前日期和時間", "option": { "customTitleToggle": { - "label": "", - "description": "" + "label": "自定義標題/城市顯示\n", + "description": "在時鐘上顯示自定義的標題或城市/國家名稱" }, "customTitle": { - "label": "" + "label": "標題" }, "is24HourFormat": { - "label": "", - "description": "" + "label": "24 小時制", + "description": "使用 24 小時制替代 12 小時制" }, "showSeconds": { - "label": "" + "label": "顯示秒數" }, "useCustomTimezone": { - "label": "" + "label": "使用固定時區" }, "timezone": { - "label": "", - "description": "" + "label": "時區", + "description": "選擇遵循 IANA 標準的時區" }, "showDate": { - "label": "" + "label": "顯示日期" }, "dateFormat": { - "label": "", - "description": "" + "label": "日期格式", + "description": "日期應該是什麼樣式" } } }, "minecraftServerStatus": { - "name": "", - "description": "", + "name": "Minecraft 伺服器狀態", + "description": "顯示 Minecraft 伺服器狀態", "option": { "title": { - "label": "" + "label": "標題" }, "domain": { - "label": "" + "label": "伺服器地址" }, "isBedrockServer": { - "label": "" + "label": "Bedrock 伺服器" } }, "status": { - "online": "", - "offline": "" + "online": "在線", + "offline": "離線" } }, "notebook": { - "name": "", - "description": "", + "name": "筆記", + "description": "支持 Markdown 的簡單筆記小工具", "option": { "showToolbar": { - "label": "" + "label": "顯示幫助寫下 Markdown 的工具欄" }, "allowReadOnlyCheck": { - "label": "" + "label": "允許於唯讀模式中檢查" }, "content": { - "label": "" + "label": "筆記的內容" } }, "controls": { - "bold": "", - "italic": "", - "strikethrough": "", - "underline": "", - "colorText": "", - "colorHighlight": "", - "code": "", - "clear": "", - "heading": "", - "align": "", - "blockquote": "", - "horizontalLine": "", - "bulletList": "", - "orderedList": "", - "checkList": "", - "increaseIndent": "", - "decreaseIndent": "", - "link": "", - "unlink": "", - "image": "", - "addTable": "", - "deleteTable": "", - "colorCell": "", - "mergeCell": "", - "addColumnLeft": "", - "addColumnRight": "", - "deleteColumn": "", - "addRowTop": "", - "addRowBelow": "", - "deleteRow": "" + "bold": "粗體", + "italic": "斜體", + "strikethrough": "刪除線", + "underline": "底線", + "colorText": "文字顏色", + "colorHighlight": "彩色高亮文字", + "code": "代碼", + "clear": "清除格式", + "heading": "標題 {level}", + "align": "對齊文字:{position}", + "blockquote": "引用", + "horizontalLine": "橫線", + "bulletList": "符號列表", + "orderedList": "順序列表", + "checkList": "檢查列表", + "increaseIndent": "增加縮進", + "decreaseIndent": "減少縮進", + "link": "鏈結", + "unlink": "移除鏈結", + "image": "崁入圖案", + "addTable": "新增表格", + "deleteTable": "移除表格", + "colorCell": "單元格顏色", + "mergeCell": "切換單元格合併", + "addColumnLeft": "於前方新增列", + "addColumnRight": "於後方新增列", + "deleteColumn": "移除整列", + "addRowTop": "於前方新增行", + "addRowBelow": "於後方新增行", + "deleteRow": "移除整行" }, "align": { - "left": "", - "center": "", - "right": "" + "left": "左方", + "center": "置中", + "right": "右方" }, "popover": { - "clearColor": "", - "source": "", - "widthPlaceholder": "", - "columns": "", - "rows": "", - "width": "", - "height": "" + "clearColor": "清除顏色", + "source": "來源", + "widthPlaceholder": "百分比或像素值", + "columns": "列數", + "rows": "行數", + "width": "寬度", + "height": "高度" } }, "iframe": { - "name": "", - "description": "", + "name": "iFrame", + "description": "崁入網路上的任何內容,某些網站可能限制訪問", "option": { "embedUrl": { - "label": "" + "label": "崁入網址" }, "allowFullScreen": { - "label": "" + "label": "允許全螢幕" }, "allowTransparency": { - "label": "" + "label": "允取透明" }, "allowScrolling": { - "label": "" + "label": "允許滾動" }, "allowPayment": { - "label": "" + "label": "允許支付" }, "allowAutoPlay": { - "label": "" + "label": "允許自動播放" }, "allowMicrophone": { - "label": "" + "label": "允許麥克風" }, "allowCamera": { - "label": "" + "label": "允許攝影機" }, "allowGeolocation": { - "label": "" + "label": "允許地址位置" } }, "error": { - "noUrl": "", - "noBrowerSupport": "" + "noUrl": "未提供 iFrame 網址", + "noBrowerSupport": "此瀏覽器不支持 iFrame,請使用其他瀏覽器" } }, "smartHome-entityState": { - "name": "", - "description": "", + "name": "設備狀態", + "description": "顯示設備狀態並可選切換", "option": { "entityId": { - "label": "" + "label": "設備 ID" }, "displayName": { - "label": "" + "label": "顯示名稱" }, "entityUnit": { - "label": "" + "label": "顯示單位" }, "clickable": { - "label": "" + "label": "可點擊" } } }, "smartHome-executeAutomation": { - "name": "", - "description": "", + "name": "執行自動化", + "description": "一鍵觸發自動化", "option": { "displayName": { - "label": "" + "label": "顯示名稱" }, "automationId": { - "label": "" + "label": "自動化 ID" } }, "spotlightAction": { - "run": "" + "run": "執行 {name}" } }, "calendar": { - "name": "", - "description": "", + "name": "日曆", + "description": "在特定的相對時間範圍內,將來自您的集成事件以日曆視圖顯示", "option": { "releaseType": { - "label": "", + "label": "Radarr 發行類型", "options": { - "inCinemas": "", - "digitalRelease": "", - "physicalRelease": "" + "inCinemas": "上映中", + "digitalRelease": "數位發行", + "physicalRelease": "實體發行" } }, "filterPastMonths": { - "label": "" + "label": "開始於" }, "filterFutureMonths": { - "label": "" + "label": "終止於" } } }, "weather": { - "name": "", - "description": "", + "name": "天氣", + "description": "顯示指定位置的當前天氣狀況", "option": { "isFormatFahrenheit": { - "label": "" + "label": "華氏溫度" }, "location": { - "label": "" + "label": "天氣位置" }, "showCity": { - "label": "" + "label": "顯示城市" }, "hasForecast": { - "label": "" + "label": "顯示預報" }, "forecastDayCount": { - "label": "", - "description": "" + "label": "預報天數", + "description": "當小工具寬度不足時,顯示的天數將減少" }, "dateFormat": { - "label": "", - "description": "" + "label": "日期格式", + "description": "日期應該是什麼樣式" } }, "kind": { - "clear": "", - "mainlyClear": "", - "fog": "", - "drizzle": "", - "freezingDrizzle": "", - "rain": "", - "freezingRain": "", - "snowFall": "", - "snowGrains": "", - "rainShowers": "", - "snowShowers": "", - "thunderstorm": "", - "thunderstormWithHail": "", - "unknown": "" + "clear": "晴朗", + "mainlyClear": "大多晴朗", + "fog": "起霧", + "drizzle": "細雨", + "freezingDrizzle": "凍細雨", + "rain": "雨天", + "freezingRain": "凍雨天", + "snowFall": "降雪", + "snowGrains": "冰霰", + "rainShowers": "陣雨", + "snowShowers": "陣雪", + "thunderstorm": "雷暴", + "thunderstormWithHail": "雷暴伴冰雹", + "unknown": "未知" } }, "indexerManager": { - "name": "", - "description": "", + "name": "索引器管理狀態", + "description": "索引器狀態", "option": { "openIndexerSiteInNewTab": { - "label": "" + "label": "於新分頁中開啟索引器站點" } }, - "title": "", - "testAll": "", + "title": "索引器管理器", + "testAll": "測試全部", "error": { - "internalServerError": "" + "internalServerError": "無法取得索引器狀態" } }, "healthMonitoring": { - "name": "", - "description": "", + "name": "系統健康監測", + "description": "顯示系統運行狀態", "option": { "fahrenheit": { - "label": "" + "label": "處理器溫度" }, "cpu": { - "label": "" + "label": "顯示處理器訊息" }, "memory": { - "label": "" + "label": "顯示記憶體訊息" }, "fileSystem": { - "label": "" + "label": "顯示檔案系統訊息" } }, "popover": { - "information": "", - "processor": "", - "memory": "", - "memoryAvailable": "", - "version": "", - "uptime": "", - "loadAverage": "", - "minute": "", - "minutes": "", - "used": "", - "available": "", - "lastSeen": "" + "information": "訊息", + "processor": "處理器:{cpuModelName}", + "memory": "記憶體:{memory} GiB", + "memoryAvailable": "可用:{memoryAvailable} Gib ({percent}%)", + "version": "版本:{version}", + "uptime": "運行時間:{months} 月,{days} 天,{hours} 時,{minutes} 分", + "loadAverage": "平均負載:", + "minute": "1 分鐘", + "minutes": "{count} 分鐘", + "used": "已使用", + "available": "可用", + "lastSeen": "最後狀態更新:{lastSeen}" }, "memory": {}, "error": { - "internalServerError": "" + "internalServerError": "取得健康狀態失敗" } }, "common": { "location": { - "query": "", - "latitude": "", - "longitude": "", - "disabledTooltip": "", - "unknownLocation": "", - "search": "", + "query": "城市 / 郵遞區號", + "latitude": "緯度", + "longitude": "經度", + "disabledTooltip": "請輸入城市或郵遞區號", + "unknownLocation": "未知", + "search": "未找到集成", "table": { "header": { - "city": "", - "country": "", - "coordinates": "", - "population": "" + "city": "城市", + "country": "國家", + "coordinates": "座標", + "population": "人口" }, "action": { - "select": "" + "select": "選擇 {city},{countryCode}" }, "population": { - "fallback": "" + "fallback": "未知" } } }, "integration": { - "noData": "", - "description": "" + "noData": "未找到集成", + "description": "點擊 創建新的集成" }, "app": { - "noData": "", - "description": "" + "noData": "未找到應用程式", + "description": "點擊 創建新的應用程式" }, "error": { - "noIntegration": "", - "noData": "" + "noIntegration": "未選擇集成", + "noData": "無可用的集成數據" }, "option": {} }, "video": { - "name": "", - "description": "", + "name": "串流影音", + "description": "崁入來自攝影機或網站的影音", "option": { "feedUrl": { - "label": "" + "label": "訂閱網址" }, "hasAutoPlay": { - "label": "", - "description": "" + "label": "自動播放", + "description": "由於瀏覽器限制,自動播放僅在靜音時有效" }, "isMuted": { - "label": "" + "label": "靜音" }, "hasControls": { - "label": "" + "label": "顯示控制" } }, "error": { - "noUrl": "", - "forYoutubeUseIframe": "" + "noUrl": "無提供影音網址", + "forYoutubeUseIframe": "Youtube 影音使用 iFrame 選項" } }, "mediaServer": { - "name": "", - "description": "", + "name": "當前多媒體伺服器串流", + "description": "顯示當前多媒體伺服器的串流", "option": {}, "items": { - "user": "", - "name": "", - "id": "" + "user": "使用者", + "name": "名稱", + "id": "ID" } }, "downloads": { - "name": "", - "description": "", + "name": "下載器", + "description": "允許查看和管理來自 Torrent 和 Usenet 的下載器", "option": { "columns": { - "label": "" + "label": "顯示的列" }, "enableRowSorting": { - "label": "" + "label": "啟用項目排序" }, "defaultSort": { - "label": "" + "label": "默認排序列" }, "descendingDefaultSort": { - "label": "" + "label": "倒序" }, "showCompletedUsenet": { - "label": "" + "label": "顯示標記為已完成的 Usenet 項目" }, "showCompletedTorrent": { - "label": "" + "label": "顯示標記為已完成的 Torrent 項目" }, "activeTorrentThreshold": { - "label": "" + "label": "隱藏在此閥值下完成的 Torrent (kiB/s)" }, "categoryFilter": { - "label": "" + "label": "要過濾的分類/標籤" }, "filterIsWhitelist": { - "label": "" + "label": "以白名單篩選" }, "applyFilterToRatio": { - "label": "" + "label": "使用篩選器來計算速率" } }, "errors": { - "noColumns": "", - "noCommunications": "" + "noColumns": "於項目中選擇列", + "noCommunications": "無法從集成中加載數據" }, "items": { "actions": { - "columnTitle": "" + "columnTitle": "控制" }, "added": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "已新增", + "detailsTitle": "日期已新增" }, "category": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "擴展的", + "detailsTitle": "分類 (額外訊息)" }, "downSpeed": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "下載", + "detailsTitle": "下載速度" }, "index": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "#", + "detailsTitle": "下載器中的當前索引" }, "id": { - "columnTitle": "" + "columnTitle": "ID" }, "integration": { - "columnTitle": "" + "columnTitle": "集成" }, "name": { - "columnTitle": "" + "columnTitle": "工作名稱" }, "progress": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "進度", + "detailsTitle": "下載進度" }, "ratio": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "分享率", + "detailsTitle": "Torrent 速率 (接收/發送)" }, "received": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "總下載", + "detailsTitle": "總下載量" }, "sent": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "總上傳", + "detailsTitle": "總上傳量" }, "size": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "檔案大小", + "detailsTitle": "選擇/檔案的總大小" }, "state": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "狀態", + "detailsTitle": "工作狀態" }, "time": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "完成時間", + "detailsTitle": "剩餘完成時間" }, "type": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "類型", + "detailsTitle": "下載器類型" }, "upSpeed": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "上傳", + "detailsTitle": "上傳速度" } }, "states": { - "downloading": "", - "queued": "", - "paused": "", - "completed": "", - "failed": "", - "processing": "", - "leeching": "", - "stalled": "", - "unknown": "", - "seeding": "" + "downloading": "下載中", + "queued": "隊列中", + "paused": "已暫停", + "completed": "已完成", + "failed": "已失敗", + "processing": "進行中", + "leeching": "吸血中", + "stalled": "已暫停", + "unknown": "未知", + "seeding": "做種中" }, "actions": { "clients": { - "modalTitle": "", - "pause": "", - "resume": "" + "modalTitle": "下載器列表", + "pause": "暫停全部下載器/項目", + "resume": "恢復全部下載器/項目" }, "client": { - "pause": "", - "resume": "" + "pause": "暫停下載器", + "resume": "恢復下載器" }, "item": { - "pause": "", - "resume": "", + "pause": "暫停項目", + "resume": "恢復項目", "delete": { - "title": "", - "modalTitle": "", - "entry": "", - "entryAndFiles": "" + "title": "移除項目", + "modalTitle": "確認要移除此工作嗎?", + "entry": "移除項目", + "entryAndFiles": "移除項目和檔案" } } }, - "globalRatio": "" + "globalRatio": "全局速率" }, "mediaRequests-requestList": { - "name": "", - "description": "", + "name": "多媒體請求列表", + "description": "查看 Overrseerr 或 Jellyseerr 中所有多媒體請求列表", "option": { "linksTargetNewTab": { - "label": "" + "label": "於新分頁中開啟鏈結" } }, "pending": { - "approve": "", - "approving": "", - "decline": "" + "approve": "批准請求", + "approving": "正在批准請求中 ...", + "decline": "拒絕請求" }, "availability": { - "unknown": "", - "pending": "", - "processing": "", - "partiallyAvailable": "", - "available": "" + "unknown": "未知", + "pending": "等待處理中", + "processing": "處理中", + "partiallyAvailable": "部分", + "available": "待定" }, - "toBeDetermined": "" + "toBeDetermined": "多媒體請求狀態" }, "mediaRequests-requestStats": { - "name": "", - "description": "", + "name": "多媒體請求狀態", + "description": "多媒體請求統計", "option": {}, "titles": { "stats": { - "main": "", - "approved": "", - "pending": "", - "processing": "", - "declined": "", - "available": "", - "tv": "", - "movie": "", - "total": "" + "main": "多媒體狀態", + "approved": "已批准", + "pending": "等待批准", + "processing": "處理中", + "declined": "已拒絕", + "available": "已可用", + "tv": "電視劇請求", + "movie": "電影請求", + "total": "總計" }, "users": { - "main": "", - "requests": "" + "main": "使用者排行", + "requests": "請求" } } }, "mediaTranscoding": { - "name": "", - "description": "", + "name": "多媒體轉碼", + "description": "多媒體轉碼統計,當前隊列和工作狀態", "option": { "defaultView": { - "label": "" + "label": "預設瀏覽" }, "queuePageSize": { - "label": "" + "label": "隊列頁面大小" } }, "tab": { - "workers": "", - "queue": "", - "statistics": "" + "workers": "工作中", + "queue": "隊列", + "statistics": "統計" }, - "currentIndex": "", + "currentIndex": "{total} 的 {start} - {end}", "healthCheck": { - "title": "", - "queued": "", + "title": "健康檢查", + "queued": "隊列中", "status": { - "healthy": "", - "unhealthy": "" + "healthy": "健康", + "unhealthy": "不良" } }, "panel": { "statistics": { - "empty": "", - "transcodes": "", - "transcodesCount": "", - "healthChecksCount": "", - "filesCount": "", - "savedSpace": "", - "healthChecks": "", - "videoCodecs": "", - "videoContainers": "", - "videoResolutions": "" + "empty": "空", + "transcodes": "轉碼", + "transcodesCount": "轉碼:{value}", + "healthChecksCount": "健康檢查:{value}", + "filesCount": "檔案:{value}", + "savedSpace": "節省空間:{value}", + "healthChecks": "健康檢查", + "videoCodecs": "編碼", + "videoContainers": "容器", + "videoResolutions": "解析度" }, "workers": { - "empty": "", + "empty": "空", "table": { - "file": "", - "eta": "", - "progress": "", - "transcode": "", - "healthCheck": "" + "file": "檔案", + "eta": "剩餘時間", + "progress": "進度", + "transcode": "轉碼", + "healthCheck": "健康檢查" } }, "queue": { - "empty": "", + "empty": "空", "table": { - "file": "", - "size": "", - "transcode": "", - "healthCheck": "" + "file": "檔案", + "size": "大小", + "transcode": "轉碼", + "healthCheck": "健康檢查" } } } }, "rssFeed": { - "name": "", - "description": "", + "name": "RSS 訂閱", + "description": "顯示一個或多個 RSS、ATOM、JSON 源", "option": { "feedUrls": { - "label": "" + "label": "Feed 網址" }, "enableRtl": { - "label": "" + "label": "啟用 RTL" }, "textLinesClamp": { - "label": "" + "label": "描述行數限制" }, "maximumAmountPosts": { - "label": "" + "label": "帖子數量限制" } } } }, "widgetPreview": { "toggle": { - "enabled": "", - "disabled": "" + "enabled": "啟用編輯模式", + "disabled": "停用編輯模式" }, "dimensions": { - "title": "" + "title": "編輯尺寸" } }, "board": { "action": { + "duplicate": { + "title": "複製面板", + "message": "這將複製看板 {name} 及其所有內容。如果小工具引用了無法使用的集成,它們將被移除", + "notification": { + "success": { + "title": "面板已複製", + "message": "面板已複製成功" + }, + "error": { + "title": "面板無法複製", + "message": "此面板無法被複製" + } + } + }, "edit": { "notification": { "success": { - "title": "", - "message": "" + "title": "成功應用編輯", + "message": "面板儲存成功" }, "error": { - "title": "", - "message": "" + "title": "無法應用編輯", + "message": "面板無法儲存" } }, "confirmLeave": { - "title": "", - "message": "" + "title": "未儲存編輯", + "message": "尚未保存編輯,確認要離開嗎?" } }, "oldImport": { - "label": "", + "label": "從 1.0.0 之前的 Homarr 匯入", "notification": { "success": { - "title": "", - "message": "" + "title": "匯入成功", + "message": "面板匯入成功" }, "error": { - "title": "", - "message": "" + "title": "匯入失敗", + "message": "無法匯入面板,請查閱 Logs 以取得更多詳情" } }, "form": { "file": { - "label": "", - "invalidError": "" + "label": "選擇 JSON 檔案", + "invalidError": "無效的設定檔案" }, "apps": { - "label": "", + "label": "應用程式", "avoidDuplicates": { - "label": "", - "description": "" + "label": "避免重複", + "description": "忽略已存在具有相同鏈結的應用程式" }, "onlyImportApps": { - "label": "", - "description": "" + "label": "僅匯入應用程式", + "description": "僅新增應用程式,面板需要手動重新創建" } }, "name": { - "label": "" + "label": "面板名稱" }, "screenSize": { - "label": "", - "description": "", + "label": "螢幕大小", + "description": "在 1.0 之前的版本中,有三種不同的模式,因此可以根據螢幕大小選擇列的數量", "option": { - "sm": "", - "md": "", - "lg": "" + "sm": "小號", + "md": "中等", + "lg": "大號" } }, "sidebarBehavior": { - "label": "", - "description": "", + "label": "側邊欄行為", + "description": "側邊欄在 1.0 中被移除了,你可以選擇該怎麼處理其中的項目", "option": { "lastSection": { - "label": "", - "description": "" + "label": "最後區段", + "description": "側邊欄將顯示在最後區段的下方" }, "removeItems": { - "label": "", - "description": "" + "label": "移除項目", + "description": "側邊欄中包含的項目將被移除" } } } @@ -1835,172 +1860,172 @@ }, "field": { "pageTitle": { - "label": "" + "label": "頁面標題" }, "metaTitle": { - "label": "" + "label": "Meta 標題" }, "logoImageUrl": { - "label": "" + "label": "Logo 圖案網址" }, "faviconImageUrl": { - "label": "" + "label": "Favicon 圖案網址" }, "backgroundImageUrl": { - "label": "" + "label": "背景圖案網址" }, "backgroundImageAttachment": { - "label": "", + "label": "背景圖案附件", "option": { "fixed": { - "label": "", - "description": "" + "label": "固定", + "description": "背景保持不變" }, "scroll": { - "label": "", - "description": "" + "label": "滾動", + "description": "用滑鼠滾動背景" } } }, "backgroundImageRepeat": { - "label": "", + "label": "背景圖案重複", "option": { "repeat": { - "label": "", - "description": "" + "label": "重複", + "description": "為了覆蓋整個背景圖案區域,將會重複使用來填充整個畫面" }, "no-repeat": { - "label": "", - "description": "" + "label": "不重複", + "description": "圖案不重複,無法填充整個畫面" }, "repeat-x": { - "label": "", - "description": "" + "label": "水平重複", + "description": "與 \"重複\" 相同,但僅於水平軸上" }, "repeat-y": { - "label": "", - "description": "" + "label": "垂直重複", + "description": "與 \"重複\" 相同,但僅於垂直軸上" } } }, "backgroundImageSize": { - "label": "", + "label": "背景圖案大小", "option": { "cover": { - "label": "", - "description": "" + "label": "封面", + "description": "通過剪裁多餘的畫面,將圖案縮放至盡可能小以覆蓋整個畫面" }, "contain": { - "label": "", - "description": "" + "label": "包含", + "description": "將圖案縮放於容器中,但不剪裁或拉伸圖案" } } }, "primaryColor": { - "label": "" + "label": "主體色" }, "secondaryColor": { - "label": "" + "label": "輔助色" }, "opacity": { - "label": "" + "label": "不透明度" }, "customCss": { - "label": "", - "description": "", + "label": "自定義此面板 CSS html", + "description": "僅推薦有經驗的使用者使用 CSS html", "customClassesAlert": { - "title": "", - "description": "" + "title": "自定義類別", + "description": "可以於每個項目中的進階選項中新增自定義類別至面板,並於自定義 CSS html 中使用他們" } }, "columnCount": { - "label": "" + "label": "列數" }, "name": { - "label": "" + "label": "名稱" }, "isPublic": { - "label": "", - "description": "" + "label": "公開", + "description": "每個人皆可訪問公共面板,即使沒有帳號" } }, "content": { - "metaTitle": "" + "metaTitle": "{boardName} 面板" }, "setting": { - "title": "", + "title": "{boardName} 面板設定", "section": { "general": { - "title": "", - "unrecognizedLink": "" + "title": "一般", + "unrecognizedLink": "提供的鏈結未被識別,無法預覽,但可能仍然有效" }, "layout": { - "title": "" + "title": "顯示布局" }, "background": { - "title": "" + "title": "背景" }, "color": { - "title": "" + "title": "配色" }, "customCss": { - "title": "" + "title": "自定義 CSS html" }, "access": { - "title": "", + "title": "訪問控制", "permission": { "item": { "view": { - "label": "" + "label": "查看面板" }, "modify": { - "label": "" + "label": "編輯面板" }, "full": { - "label": "" + "label": "完全訪問" } } } }, "dangerZone": { - "title": "", + "title": "危險區域", "action": { "rename": { - "label": "", - "description": "", - "button": "", + "label": "重新命名面板", + "description": "更改面板可見性", + "button": "更改名稱", "modal": { - "title": "" + "title": "重新命名面板" } }, "visibility": { - "label": "", + "label": "更改面板可見性", "description": { - "public": "", - "private": "" + "public": "此面板目前為公開狀態", + "private": "此面板目前為私人狀態" }, "button": { - "public": "", - "private": "" + "public": "設定私人", + "private": "設定公開" }, "confirm": { "public": { - "title": "", - "description": "" + "title": "設定為私人面板", + "description": "確認要將此面板設為私人嗎?這將隱藏於公眾面前的面板" }, "private": { - "title": "", - "description": "" + "title": "設定為公開面板", + "description": "確認要將此面板設為公開嗎?這將使全部人皆可訪問此面板" } } }, "delete": { - "label": "", - "description": "", - "button": "", + "label": "移除此面板", + "description": "面板一旦移除就無法恢復,請謹慎操作", + "button": "移除此面板", "confirm": { - "title": "", - "description": "" + "title": "移除面板", + "description": "確認要移除此面板嗎?這將永久移除面板及其所有內容" } } } @@ -2009,420 +2034,431 @@ }, "error": { "noBoard": { - "title": "", - "description": "", - "link": "", - "notice": "" + "title": "歡迎來到 Homarr", + "description": "時尚、現代的儀表板,讓所有應用程式和伺服器觸手可及", + "link": "創建第一個面板", + "notice": "要讓這個頁面消失,請創建一個面板並將其設定為主面板" }, "notFound": { - "title": "", - "description": "", - "link": "", - "notice": "" + "title": "不存在面板", + "description": "未找到指定的面板,或者是沒有訪問權限", + "link": "查看全部面板", + "notice": "如果認為鏈結應該可以訪問,請檢察鏈結或連繫管理員" }, "homeBoard": { - "title": "", + "title": "沒有主面板", "admin": { - "description": "", - "link": "", - "notice": "" + "description": "尚為伺服器設定主面板", + "link": "設定伺服器主面板", + "notice": "要讓這個頁面消失,請為伺服器設定主面板" }, "user": { - "description": "", - "link": "", - "notice": "" + "description": "尚未設定主面板", + "link": "設定主面板", + "notice": "要讓這個頁面消失,請於偏好設定中指定主面板" }, "anonymous": { - "description": "", - "link": "", - "notice": "" + "description": "伺服器管理員尚未設定主面板", + "link": "查看公開面板", + "notice": "要讓這個頁面消失,請伺服器管理員為伺服器設定一個主面板" } } } }, "management": { - "metaTitle": "", + "metaTitle": "管理中心", "title": { - "morning": "", - "afternoon": "", - "evening": "" + "morning": "早安,{username}", + "afternoon": "午安,{username}", + "evening": "晚安,{username}" }, "notFound": { - "title": "", - "text": "" + "title": "不存在", + "text": "找不到請求的資源" }, "navbar": { "items": { - "home": "", - "boards": "", - "apps": "", - "integrations": "", - "searchEngies": "", - "medias": "", + "home": "首頁", + "boards": "面板", + "apps": "應用程式", + "integrations": "集成", + "searchEngies": "搜尋引擎", + "medias": "多媒體", "users": { - "label": "", + "label": "使用者", "items": { - "manage": "", - "invites": "", - "groups": "" + "manage": "管理", + "invites": "邀情", + "groups": "群組" } }, "tools": { - "label": "", + "label": "工具", "items": { - "docker": "", - "logs": "", - "api": "", - "tasks": "" + "docker": "Docker", + "logs": "Logs", + "api": "API", + "tasks": "任務" } }, - "settings": "", + "settings": "設定", "help": { - "label": "", + "label": "幫助", "items": { - "documentation": "", - "submitIssue": "", - "discord": "", - "sourceCode": "" + "documentation": "說明書", + "submitIssue": "提交問題", + "discord": "Discord 社群", + "sourceCode": "源碼" } }, - "about": "" + "about": "關於" } }, "page": { "home": { "statistic": { - "board": "", - "user": "", - "invite": "", - "integration": "", - "app": "", - "group": "" + "board": "面板", + "user": "使用者", + "invite": "邀請", + "integration": "集成", + "app": "應用程式", + "group": "群組" }, "statisticLabel": { - "boards": "", - "resources": "", - "authentication": "", - "authorization": "" + "boards": "面板", + "resources": "資源", + "authentication": "認證", + "authorization": "認證" } }, "board": { - "title": "", + "title": "你的面板", "action": { "new": { - "label": "" + "label": "創建面板" }, "open": { - "label": "" + "label": "開啟面板" }, "settings": { - "label": "" + "label": "設定" }, "setHomeBoard": { - "label": "", + "label": "設定為首頁", "badge": { - "label": "", - "tooltip": "" + "label": "首頁", + "tooltip": "此面板將顯示為主面板" } }, + "duplicate": { + "label": "複製面板" + }, "delete": { - "label": "", + "label": "永久移除", "confirm": { - "title": "", - "description": "" + "title": "移除面板", + "description": "確認移除此面板 {name} 嗎?" } } }, "visibility": { - "public": "", - "private": "" + "public": "此面板是公開的", + "private": "此面板是私人的" }, "modal": { "createBoard": { "field": { "name": { - "label": "" + "label": "名稱" } } } } }, "media": { - "includeFromAllUsers": "" + "includeFromAllUsers": "包含來自全部使用者的多媒體" }, "user": { - "back": "", - "fieldsDisabledExternalProvider": "", + "back": "返回使用者", + "fieldsDisabledExternalProvider": "某些字段被進用,因為它們是由外部認證提供者管理的", "setting": { "general": { - "title": "", + "title": "一般", "item": { - "language": "", - "board": "", - "firstDayOfWeek": "", - "accessibility": "" + "language": "語言與地區", + "board": "主面板", + "defaultSearchEngine": "預設搜尋引擎", + "firstDayOfWeek": "一周的第一天", + "accessibility": "無障礙服務" } }, "security": { - "title": "" + "title": "安全" }, "board": { - "title": "" + "title": "面板" } }, "list": { - "metaTitle": "", - "title": "" + "metaTitle": "管理使用者", + "title": "使用者" }, "edit": { - "metaTitle": "" + "metaTitle": "編輯使用者 {username}" }, "create": { - "metaTitle": "", - "title": "", + "metaTitle": "創建使用者", + "title": "創建新使用者", "step": { "personalInformation": { - "label": "" + "label": "個人資料" }, "security": { - "label": "" + "label": "安全" }, "groups": { - "label": "", - "title": "", - "description": "" + "label": "群組", + "title": "選擇使用者的用戶組", + "description": "{everyoneGroup} 用戶組將分配給全部使用者,無法被移除" }, "review": { - "label": "" + "label": "預覽" }, "completed": { - "title": "" + "title": "使用者已創建" }, "error": { - "title": "" + "title": "使用者創建失敗" } }, "action": { - "createAnother": "", - "back": "" + "createAnother": "創建其他使用者", + "back": "返回使用者列表" } }, "invite": { - "title": "", + "title": "管理使用者邀請", "action": { "new": { - "title": "", - "description": "" + "title": "創建邀請", + "description": "過期後,邀請將失效,被邀請的收件人無法創建帳號" }, "copy": { - "title": "", - "description": "", - "link": "", - "button": "" + "title": "複製邀請", + "description": "邀請已生成,此模式關閉後,將無法再複製此鏈結,如果不想再邀請此人,可以隨時移除此邀請", + "link": "邀請鏈結", + "button": "複製 & 關閉" }, "delete": { - "title": "", - "description": "" + "title": "移除邀請", + "description": "確認移除此邀請嗎?,此鏈結將無法再邀請任何人" } }, "field": { "id": { - "label": "" + "label": "ID" }, "creator": { - "label": "" + "label": "創建者" }, "expirationDate": { - "label": "" + "label": "過期時間" }, "token": { - "label": "" + "label": "密鑰" } } } }, "group": { - "back": "", + "back": "返回用戶組", "setting": { "general": { - "title": "", - "owner": "", - "ownerOfGroup": "", - "ownerOfGroupDeleted": "" + "title": "一般", + "owner": "所有者", + "ownerOfGroup": "該用戶組的所有者", + "ownerOfGroupDeleted": "此用戶組的所有者已被移除,目前沒有所有者" }, "members": { - "title": "", - "search": "", - "notFound": "" + "title": "成員", + "search": "尋找成員", + "notFound": "不存在的成員" }, "permissions": { - "title": "", + "title": "權限", "form": { - "unsavedChanges": "" + "unsavedChanges": "尚有未儲存的變更" } } } }, "settings": { - "title": "", + "title": "設定", "notification": { "success": { - "message": "" + "message": "設定儲存成功" }, "error": { - "message": "" + "message": "設定儲存失敗" } }, "section": { "analytics": { - "title": "", + "title": "分析", "general": { - "title": "", - "text": "" + "title": "發送匿名分析", + "text": "Homarr 使用開源軟體 Umami 發送匿名分析,他從不收集任何個人資料,因此完全符合 GDPR 和 CCPA 要求,我們鼓勵啟用分析,因為可以幫助我們的團隊識別問題,並確認待辦事項的優先級別" }, "widgetData": { - "title": "", - "text": "" + "title": "小工具數據", + "text": "發送已設定的小工具 (及其數量),不包括網址、名稱或任何其他數據" }, "integrationData": { - "title": "", - "text": "" + "title": "集成數據", + "text": "發送已設定的集成 (及其數量),不包括網址、名稱或任何其他數據" }, "usersData": { - "title": "", - "text": "" + "title": "使用者資料", + "text": "發送使用者數量以及是否激活了 SSO" } }, "crawlingAndIndexing": { - "title": "", - "warning": "", + "title": "爬取和索引", + "warning": "啟用或禁用這裡的任何設定將嚴重影響搜尋引擎如何索引或抓取頁面,任何設定都是一個請求,是否應用這些設定取決於爬蟲,任何編輯可能需要數天或數周才能申請,某設定可能是搜尋引擎特定的", "noIndex": { - "title": "", - "text": "" + "title": "不要索引", + "text": "不要在搜尋引擎上索引網址,也不要在任何搜尋結果中顯示" }, "noFollow": { - "title": "", - "text": "" + "title": "不要追蹤", + "text": "索引不要追蹤任何鏈結,禁用此功能將導致爬蟲程式試圖跟蹤 Homarr 上的全部鏈結" }, "noTranslate": { - "title": "", - "text": "" + "title": "不要翻譯", + "text": "當網站的語言不是使用者想要閱讀的語言時,Google 將在搜尋結果中顯示一個翻譯鏈結" }, "noSiteLinksSearchBox": { - "title": "", - "text": "" + "title": "沒有網站鏈結搜索框", + "text": "Google 將與爬取的鏈結以及其他直接鏈結構建一個搜索框,啟用此功能將要求 Google 禁用該框" } }, "board": { - "title": "", + "title": "面板", "homeBoard": { - "label": "", - "description": "" + "label": "全局主面板", + "description": "只有公開面板可供選擇" + } + }, + "search": { + "title": "搜尋", + "defaultSearchEngine": { + "label": "全局預設搜尋引擎", + "description": "舞法在此選擇極盛的搜尋引擎" } }, "appearance": { - "title": "", + "title": "外觀", "defaultColorScheme": { - "label": "", + "label": "預設配色方案", "options": { - "light": "", - "dark": "" + "light": "日間", + "dark": "暗黑" } } }, "culture": { - "title": "", + "title": "區域", "defaultLocale": { - "label": "" + "label": "預設語言" } } } }, "tool": { "tasks": { - "title": "", + "title": "任務", "status": { - "idle": "", - "running": "", - "error": "" + "idle": "空閒", + "running": "運行中", + "error": "錯誤" }, "job": { "minecraftServerStatus": { - "label": "" + "label": "Minecraft 伺服器狀態" }, "iconsUpdater": { - "label": "" + "label": "icon 上傳器" }, "analytics": { - "label": "" + "label": "分析" }, "smartHomeEntityState": { - "label": "" + "label": "智能居家狀態" }, "ping": { - "label": "" + "label": "Pings" }, "mediaServer": { - "label": "" + "label": "多媒體伺服器" }, "mediaOrganizer": { - "label": "" + "label": "多媒體組織者" }, "downloads": { - "label": "" + "label": "正在下載" }, "mediaRequestStats": { - "label": "" + "label": "多媒體請求狀態" }, "mediaRequestList": { - "label": "" + "label": "多媒體請求列表" }, "rssFeeds": { - "label": "" + "label": "RSS 訂閱" }, "indexerManager": { - "label": "" + "label": "索引器管理" }, "healthMonitoring": { - "label": "" + "label": "健康監測" }, "dnsHole": { - "label": "" + "label": "DNS Hole 數據" }, "sessionCleanup": { - "label": "" + "label": "會話清理" }, "updateChecker": { - "label": "" + "label": "更新檢查" }, "mediaTranscoding": { - "label": "" + "label": "多媒體轉碼中" } } }, "api": { - "title": "", + "title": "API", "modal": { "createApiToken": { - "title": "", - "description": "", - "button": "" + "title": "API 密鑰已創建", + "description": "API 密鑰已創建,請小心,此密鑰於數據庫中是加密的,永遠不再提供,如果丟失,將無法再檢索這個特定密鑰", + "button": "複製和關閉" } }, "tab": { "documentation": { - "label": "" + "label": "說明書" }, "apiKey": { - "label": "", - "title": "", + "label": "認證", + "title": "API 密鑰\n", "button": { - "createApiToken": "" + "createApiToken": "創建 API 密鑰" }, "table": { "header": { - "id": "", - "createdBy": "" + "id": "ID", + "createdBy": "創建者" } } } @@ -2430,367 +2466,383 @@ } }, "about": { - "version": "", - "text": "", + "version": "版本 {version}", + "text": "Homarr 是由社區推動的開源項目,是志願者們在維護,多虧了這些人,從 2021 年起,Homarr 一直在發展壯大,我們團隊來自許多不同的國家,完全遠程工作,於空閒時無償維護 Homarr", "accordion": { "contributors": { - "title": "", - "subtitle": "" + "title": "貢獻人員", + "subtitle": "{count} 維護代碼 & Homarr" }, "translators": { - "title": "", - "subtitle": "" + "title": "翻譯人員", + "subtitle": "{count} 翻譯了許多語言" }, "libraries": { - "title": "", - "subtitle": "" + "title": "資料庫", + "subtitle": "{count} 於 Homarr 待碼中使用" } } } } }, "docker": { - "title": "", + "title": "容器", "table": { - "updated": "", - "search": "", - "selected": "" + "updated": "已更新於 {when}", + "search": "搜尋 {count} 容器", + "selected": "{totalCount} 容器的 {selectCount}" }, "field": { "name": { - "label": "" + "label": "名稱" }, "state": { - "label": "", + "label": "狀態", "option": { - "created": "", - "running": "", - "paused": "", - "restarting": "", - "exited": "", - "removing": "", - "dead": "" + "created": "已創建", + "running": "運行中", + "paused": "已暫停", + "restarting": "正在重啟", + "exited": "已退出", + "removing": "移除中", + "dead": "廢棄" } }, "containerImage": { - "label": "" + "label": "鏡像" }, "ports": { - "label": "" + "label": "端口" } }, "action": { "start": { - "label": "", + "label": "啟動", "notification": { "success": { - "title": "", - "message": "" + "title": "容器已啟動", + "message": "容器已成功啟動" }, "error": { - "title": "", - "message": "" + "title": "容易未啟動", + "message": "容器無法啟動" } } }, "stop": { - "label": "", + "label": "停止", "notification": { "success": { - "title": "", - "message": "" + "title": "容器已停止", + "message": "容器已停止成功" }, "error": { - "title": "", - "message": "" + "title": "容器未停止", + "message": "容器無法停止" } } }, "restart": { - "label": "", + "label": "重啟", "notification": { "success": { - "title": "", - "message": "" + "title": "容器已重啟", + "message": "容器已重啟成功" }, "error": { - "title": "", - "message": "" + "title": "容器未重啟", + "message": "容器無法重啟" } } }, "remove": { - "label": "", + "label": "移除", "notification": { "success": { - "title": "", - "message": "" + "title": "容器已移除", + "message": "容器已移除成功" }, "error": { - "title": "", - "message": "" + "title": "容器未移除", + "message": "容器無法移除" } } }, "refresh": { - "label": "", + "label": "刷新", "notification": { "success": { - "title": "", - "message": "" + "title": "容器已刷新", + "message": "正在查看最新數據" }, "error": { - "title": "", - "message": "" + "title": "容器未刷新", + "message": "刷新容器時出現錯誤" } } + }, + "addToHomarr": { + "label": "新增至 Homarr", + "notification": { + "success": { + "title": "已新增至 Homarr", + "message": "已選擇的應用程式已新增至 Homarr" + }, + "error": { + "title": "無法新增至 Homarr", + "message": "已選擇的應用程式無法新增至 Homarr" + } + }, + "modal": { + "title": "新增 Docker 容器至 Homarr" + } } }, "error": { - "internalServerError": "" + "internalServerError": "取得 Docker 容器失敗" } }, "permission": { - "title": "", + "title": "權限", "userSelect": { - "title": "" + "title": "新增使用者權限" }, "groupSelect": { - "title": "" + "title": "新增用戶組權限" }, "tab": { - "user": "", - "group": "", - "inherited": "" + "user": "使用者", + "group": "用戶組", + "inherited": "繼承的用戶組" }, "field": { "user": { - "label": "" + "label": "使用者" }, "group": { - "label": "" + "label": "用戶組" }, "permission": { - "label": "" + "label": "權限" } }, "action": { - "saveUser": "", - "saveGroup": "" + "saveUser": "儲存使用者權限", + "saveGroup": "儲存用戶組權限" } }, "navigationStructure": { "manage": { - "label": "", + "label": "管理", "boards": { - "label": "" + "label": "面板" }, "integrations": { - "label": "", + "label": "集成", "edit": { - "label": "" + "label": "編輯" }, "new": { - "label": "" + "label": "創建" } }, "search-engines": { - "label": "", + "label": "搜尋引擎", "new": { - "label": "" + "label": "創建" }, "edit": { - "label": "" + "label": "編輯" } }, "medias": { - "label": "" + "label": "多媒體" }, "apps": { - "label": "", + "label": "應用程式", "new": { - "label": "" + "label": "創建" }, "edit": { - "label": "" + "label": "編輯" } }, "users": { - "label": "", + "label": "使用者", "create": { - "label": "" + "label": "創建" }, - "general": "", - "security": "", - "board": "", + "general": "一般", + "security": "安全", + "board": "面板", "groups": { - "label": "" + "label": "用戶組" }, "invites": { - "label": "" + "label": "邀請" } }, "tools": { - "label": "", + "label": "工具", "docker": { - "label": "" + "label": "Docker" }, "logs": { - "label": "" + "label": "Logs" } }, "settings": { - "label": "" + "label": "設定" }, "about": { - "label": "" + "label": "關於" } } }, "search": { - "placeholder": "", - "nothingFound": "", + "placeholder": "搜尋任意內容", + "nothingFound": "不存在", "error": { - "fetch": "" + "fetch": "取得數據時發生錯誤" }, "mode": { "appIntegrationBoard": { - "help": "", + "help": "搜尋應用程式,集成或面板", "group": { "app": { - "title": "", + "title": "應用程式", "children": { "action": { "open": { - "label": "" + "label": "開啟應用程式網址" }, "edit": { - "label": "" + "label": "編輯應用程式" } }, "detail": { - "title": "" + "title": "為應用程式選擇一個動作" } } }, "board": { - "title": "", + "title": "面板", "children": { "action": { "open": { - "label": "" + "label": "開啟面板" }, "homeBoard": { - "label": "" + "label": "設定為主面板" }, "settings": { - "label": "" + "label": "開啟設定" } }, "detail": { - "title": "" + "title": "為面板選擇一個動作" } } }, "integration": { - "title": "" + "title": "集成" } } }, "command": { - "help": "", + "help": "啟用命令模式", "group": { "localCommand": { - "title": "" + "title": "本地命令" }, "globalCommand": { - "title": "", + "title": "全局命令", "option": { "colorScheme": { - "light": "", - "dark": "" + "light": "切換日間模式", + "dark": "切換暗黑模式" }, "language": { - "label": "", + "label": "編輯語言", "children": { "detail": { - "title": "" + "title": "選擇主要語言" } } }, "newBoard": { - "label": "" + "label": "創建新面板" }, "importBoard": { - "label": "" + "label": "匯入面板" }, "newApp": { - "label": "" + "label": "創建新應用程式" }, "newIntegration": { - "label": "", + "label": "創建新集成", "children": { "detail": { - "title": "" + "title": "選擇創建集成的類別" } } }, "newUser": { - "label": "" + "label": "創建新使用者" }, "newInvite": { - "label": "" + "label": "創建新邀請" }, "newGroup": { - "label": "" + "label": "創建新用戶組" } } } } }, "media": { - "requestMovie": "", - "requestSeries": "", - "openIn": "" + "requestMovie": "請求電影", + "requestSeries": "請求系列", + "openIn": "開啟於 {kind}" }, "external": { - "help": "", + "help": "使用外部搜尋引擎", "group": { "searchEngine": { - "title": "", + "title": "搜尋引擎", "children": { "action": { "search": { - "label": "" + "label": "使用 {name} 搜尋" } }, "detail": { - "title": "" + "title": "為搜尋引擎選擇一個動作" }, "searchResults": { - "title": "" + "title": "選擇搜尋結果進行操作" } }, "option": { "google": { - "name": "", - "description": "" + "name": "Google", + "description": "使用 Google 搜尋網路" }, "bing": { - "name": "", - "description": "" + "name": "Bing", + "description": "使用 Bing 搜尋網路" }, "duckduckgo": { - "name": "", - "description": "" + "name": "DuckDuckGo", + "description": "使用 DuckDuckGo 搜尋網路" }, "torrent": { - "name": "", - "description": "" + "name": "種子", + "description": "於 torrentdownloads.pro 上搜尋種子" }, "youTube": { - "name": "", - "description": "" + "name": "YouTube", + "description": "使用 YouTube 搜尋影音" } } } @@ -2799,19 +2851,19 @@ "help": { "group": { "mode": { - "title": "" + "title": "模式" }, "help": { - "title": "", + "title": "幫助", "option": { "documentation": { - "label": "" + "label": "說明書" }, "submitIssue": { - "label": "" + "label": "提交問題" }, "discord": { - "label": "" + "label": "Discord 社群" } } } @@ -2819,104 +2871,122 @@ }, "home": { "group": { + "search": { + "title": "搜尋", + "option": { + "other": { + "label": "使用其他搜尋引擎進行搜尋" + }, + "no-default": { + "label": "無預設搜尋引擎", + "description": "於偏好設定中設定預設搜尋引擎" + }, + "search": { + "label": "使用 {name} 搜尋 {query}" + }, + "from-integration": { + "description": "開始輸入以進行搜尋" + } + } + }, "local": { - "title": "" + "title": "本地結果" } } }, "page": { - "help": "", + "help": "搜尋頁面", "group": { "page": { - "title": "", + "title": "頁面", "option": { "manageHome": { - "label": "" + "label": "管理首頁" }, "manageBoard": { - "label": "" + "label": "管理面板" }, "manageApp": { - "label": "" + "label": "管理應用程式" }, "manageIntegration": { - "label": "" + "label": "管理集成" }, "manageSearchEngine": { - "label": "" + "label": "管理搜尋引擎" }, "manageMedia": { - "label": "" + "label": "管理多媒體" }, "manageUser": { - "label": "" + "label": "管理使用者" }, "manageInvite": { - "label": "" + "label": "管理邀請" }, "manageGroup": { - "label": "" + "label": "管理用戶組" }, "manageDocker": { - "label": "" + "label": "管理 Docker" }, "manageApi": { - "label": "" + "label": "Swagger API" }, "manageLog": { - "label": "" + "label": "查看 Logs" }, "manageTask": { - "label": "" + "label": "管理任務" }, "manageSettings": { - "label": "" + "label": "全局設定" }, "about": { - "label": "" + "label": "關於" }, "homeBoard": { - "label": "" + "label": "主面板" }, "preferences": { - "label": "" + "label": "偏好設定" } } } } }, "userGroup": { - "help": "", + "help": "搜尋使用者或用戶組", "group": { "user": { - "title": "", + "title": "使用者", "children": { "action": { "detail": { - "label": "" + "label": "顯示使用者詳情" } }, "detail": { - "title": "" + "title": "為使用者選擇一個動作" } } }, "group": { - "title": "", + "title": "用戶組", "children": { "action": { "detail": { - "label": "" + "label": "顯示用戶組詳情" }, "manageMember": { - "label": "" + "label": "管理成員" }, "managePermission": { - "label": "" + "label": "管理權限" } }, "detail": { - "title": "" + "title": "為用戶組選擇一個動作" } } } @@ -2924,72 +2994,72 @@ } }, "engine": { - "search": "", + "search": "尋找搜尋引擎", "field": { "name": { - "label": "" + "label": "名稱" }, "short": { - "label": "" + "label": "不足" }, "urlTemplate": { - "label": "" + "label": "網址搜尋面板" }, "description": { - "label": "" + "label": "描述" } }, "page": { "list": { - "title": "", + "title": "搜尋引擎", "noResults": { - "title": "", - "action": "" + "title": "尚未設定搜尋引擎", + "action": "創建搜尋引情" }, - "interactive": "" + "interactive": "交互,使用集成" }, "create": { - "title": "", + "title": "創建搜尋引擎", "notification": { "success": { - "title": "", - "message": "" + "title": "搜尋引擎已創建", + "message": "搜尋引擎已創建成功" }, "error": { - "title": "", - "message": "" + "title": "搜尋引擎未創建", + "message": "搜尋引擎無法創建" } } }, "edit": { - "title": "", + "title": "編輯搜尋引擎", "notification": { "success": { - "title": "", - "message": "" + "title": "應用編輯成功", + "message": "搜尋引擎已儲存成功" }, "error": { - "title": "", - "message": "" + "title": "無法應用變更", + "message": "搜尋引擎無法儲存" } }, - "configControl": "", + "configControl": "設定", "searchEngineType": { - "generic": "", - "fromIntegration": "" + "generic": "一般", + "fromIntegration": "來自集成" } }, "delete": { - "title": "", - "message": "", + "title": "移除搜尋引擎", + "message": "確認要移除此搜尋引擎 {name} 嗎?", "notification": { "success": { - "title": "", - "message": "" + "title": "搜尋引擎已移除", + "message": "搜尋引擎已移除成功" }, "error": { - "title": "", - "message": "" + "title": "搜尋引擎未移除", + "message": "搜尋引擎無法移除" } } } @@ -2997,15 +3067,15 @@ "media": { "request": { "modal": { - "title": "", + "title": "請求 {name}", "table": { "header": { - "season": "", - "episodes": "" + "season": "季", + "episodes": "劇集" } }, "button": { - "send": "" + "send": "發送請求" } } } diff --git a/packages/ui/package.json b/packages/ui/package.json index c0272e5c5..9e2b87db8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -29,13 +29,14 @@ "@homarr/log": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.15.2", - "@mantine/dates": "^7.15.2", - "@mantine/hooks": "^7.15.2", - "@tabler/icons-react": "^3.26.0", - "mantine-react-table": "2.0.0-beta.7", - "next": "^14.2.22", - "react": "^19.0.0" + "@mantine/core": "^7.15.3", + "@mantine/dates": "^7.15.3", + "@mantine/hooks": "^7.15.3", + "@tabler/icons-react": "^3.28.1", + "mantine-react-table": "2.0.0-beta.8", + "next": "15.1.4", + "react": "19.0.0", + "react-dom": "19.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -43,6 +44,6 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/css-modules": "^1.0.5", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/validation/package.json b/packages/validation/package.json index 13b77aeca..3706fe60e 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -33,6 +33,6 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/validation/src/app.ts b/packages/validation/src/app.ts index 6ac45ac35..dfe1a749a 100644 --- a/packages/validation/src/app.ts +++ b/packages/validation/src/app.ts @@ -4,12 +4,19 @@ const manageAppSchema = z.object({ name: z.string().min(1).max(64), description: z.string().max(512).nullable(), iconUrl: z.string().min(1), - href: z.string().nullable(), + href: z + .string() + .url() + .regex(/^https?:\/\//) // Only allow http and https for security reasons (javascript: is not allowed) + .nullable(), }); const editAppSchema = manageAppSchema.and(z.object({ id: z.string() })); export const appSchemas = { manage: manageAppSchema, + createMany: z + .array(manageAppSchema.omit({ iconUrl: true }).and(z.object({ iconUrl: z.string().min(1).nullable() }))) + .min(1), edit: editAppSchema, }; diff --git a/packages/validation/src/board.ts b/packages/validation/src/board.ts index 2783f7a88..1fd121a95 100644 --- a/packages/validation/src/board.ts +++ b/packages/validation/src/board.ts @@ -28,6 +28,11 @@ const renameSchema = z.object({ name: boardNameSchema, }); +const duplicateSchema = z.object({ + id: z.string(), + name: boardNameSchema, +}); + const changeVisibilitySchema = z.object({ id: z.string(), visibility: z.enum(["public", "private"]), @@ -85,6 +90,7 @@ export const boardSchemas = { savePartialSettings: savePartialSettingsSchema, save: saveSchema, create: createSchema, + duplicate: duplicateSchema, rename: renameSchema, changeVisibility: changeVisibilitySchema, permissions: permissionsSchema, diff --git a/packages/validation/src/integration.ts b/packages/validation/src/integration.ts index ad22d8eeb..e9606a268 100644 --- a/packages/validation/src/integration.ts +++ b/packages/validation/src/integration.ts @@ -7,7 +7,10 @@ import { createSavePermissionsSchema } from "./permissions"; const integrationCreateSchema = z.object({ name: z.string().nonempty().max(127), - url: z.string().url(), + url: z + .string() + .url() + .regex(/^https?:\/\//), // Only allow http and https for security reasons (javascript: is not allowed) kind: zodEnumFromArray(integrationKinds), secrets: z.array( z.object({ diff --git a/packages/validation/src/search-engine.ts b/packages/validation/src/search-engine.ts index dbf9b0f4b..720f5fb86 100644 --- a/packages/validation/src/search-engine.ts +++ b/packages/validation/src/search-engine.ts @@ -5,7 +5,7 @@ import type { SearchEngineType } from "@homarr/definitions"; const genericSearchEngine = z.object({ type: z.literal("generic" satisfies SearchEngineType), - urlTemplate: z.string().min(1).startsWith("http").includes("%s"), + urlTemplate: z.string().min(1).startsWith("http").includes("%s"), // Only allow http and https for security reasons (javascript: is not allowed) }); const fromIntegrationSearchEngine = z.object({ diff --git a/packages/validation/src/user.ts b/packages/validation/src/user.ts index f06fb67ec..6688cdcd8 100644 --- a/packages/validation/src/user.ts +++ b/packages/validation/src/user.ts @@ -109,6 +109,10 @@ const changeHomeBoardSchema = z.object({ homeBoardId: z.string().min(1), }); +const changeDefaultSearchEngineSchema = z.object({ + defaultSearchEngineId: z.string().min(1), +}); + const changeColorSchemeSchema = z.object({ colorScheme: zodEnumFromArray(colorSchemes), }); @@ -132,6 +136,7 @@ export const userSchemas = { editProfile: editProfileSchema, changePassword: changePasswordSchema, changeHomeBoard: changeHomeBoardSchema, + changeDefaultSearchEngine: changeDefaultSearchEngineSchema, changePasswordApi: changePasswordApiSchema, changeColorScheme: changeColorSchemeSchema, firstDayOfWeek: firstDayOfWeekSchema, diff --git a/packages/widgets/package.json b/packages/widgets/package.json index a6bc44136..061c65334 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -41,29 +41,30 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.15.2", - "@mantine/hooks": "^7.15.2", - "@tabler/icons-react": "^3.26.0", - "@tiptap/extension-color": "2.11.0", - "@tiptap/extension-highlight": "2.11.0", - "@tiptap/extension-image": "2.11.0", - "@tiptap/extension-link": "^2.11.0", - "@tiptap/extension-table": "2.11.0", - "@tiptap/extension-table-cell": "2.11.0", - "@tiptap/extension-table-header": "2.11.0", - "@tiptap/extension-table-row": "2.11.0", - "@tiptap/extension-task-item": "2.11.0", - "@tiptap/extension-task-list": "2.11.0", - "@tiptap/extension-text-align": "2.11.0", - "@tiptap/extension-text-style": "2.11.0", - "@tiptap/extension-underline": "2.11.0", - "@tiptap/react": "^2.11.0", - "@tiptap/starter-kit": "^2.11.0", + "@mantine/core": "^7.15.3", + "@mantine/hooks": "^7.15.3", + "@tabler/icons-react": "^3.28.1", + "@tiptap/extension-color": "2.11.2", + "@tiptap/extension-highlight": "2.11.2", + "@tiptap/extension-image": "2.11.2", + "@tiptap/extension-link": "^2.11.2", + "@tiptap/extension-table": "2.11.2", + "@tiptap/extension-table-cell": "2.11.2", + "@tiptap/extension-table-header": "2.11.2", + "@tiptap/extension-table-row": "2.11.2", + "@tiptap/extension-task-item": "2.11.2", + "@tiptap/extension-task-list": "2.11.2", + "@tiptap/extension-text-align": "2.11.2", + "@tiptap/extension-text-style": "2.11.2", + "@tiptap/extension-underline": "2.11.2", + "@tiptap/react": "^2.11.2", + "@tiptap/starter-kit": "^2.11.2", "clsx": "^2.1.1", "dayjs": "^1.11.13", - "mantine-react-table": "2.0.0-beta.7", - "next": "^14.2.22", - "react": "^19.0.0", + "mantine-react-table": "2.0.0-beta.8", + "next": "15.1.4", + "react": "19.0.0", + "react-dom": "19.0.0", "video.js": "^8.21.0" }, "devDependencies": { @@ -72,6 +73,6 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/video.js": "^7.3.58", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/packages/widgets/src/dns-hole/summary/component.tsx b/packages/widgets/src/dns-hole/summary/component.tsx index ff4634dff..50d06de42 100644 --- a/packages/widgets/src/dns-hole/summary/component.tsx +++ b/packages/widgets/src/dns-hole/summary/component.tsx @@ -2,7 +2,7 @@ import { useMemo } from "react"; import type { BoxProps } from "@mantine/core"; -import { Avatar, AvatarGroup, Box, Card, Flex, Stack, Text, Tooltip } from "@mantine/core"; +import { Avatar, AvatarGroup, Box, Card, Flex, Stack, Text, Tooltip, TooltipFloating } from "@mantine/core"; import { useElementSize } from "@mantine/hooks"; import { IconBarrierBlock, IconPercentage, IconSearch, IconWorldWww } from "@tabler/icons-react"; @@ -98,11 +98,11 @@ const stats = [ }, { icon: IconPercentage, - value: (data) => - `${formatNumber( - data.reduce((count, { adsBlockedTodayPercentage }) => count + adsBlockedTodayPercentage, 0), - 2, - )}%`, + value: (data) => { + const totalCount = data.reduce((count, { dnsQueriesToday }) => count + dnsQueriesToday, 0); + const blocked = data.reduce((count, { adsBlockedToday }) => count + adsBlockedToday, 0); + return `${formatNumber(totalCount === 0 ? 0 : (blocked / totalCount) * 100, 2)}%`; + }, label: (t) => t("widget.dnsHoleSummary.data.adsBlockedTodayPercentage"), color: "rgba(255, 165, 20, 0.4)", // YELLOW }, @@ -118,11 +118,17 @@ const stats = [ }, { icon: IconWorldWww, - value: (data) => - formatNumber( - data.reduce((count, { domainsBeingBlocked }) => count + domainsBeingBlocked, 0), - 2, - ), + value: (data) => { + // We use a suffix to indicate that there might be more domains in the at least two lists. + const suffix = data.length >= 2 ? "+" : ""; + return ( + formatNumber( + data.reduce((count, { domainsBeingBlocked }) => count + domainsBeingBlocked, 0), + 2, + ) + suffix + ); + }, + tooltip: (data, t) => (data.length >= 2 ? t("widget.dnsHoleSummary.domainsTooltip") : undefined), label: (t) => t("widget.dnsHoleSummary.data.domainsBeingBlocked"), color: "rgba(0, 176, 96, 0.4)", // GREEN }, @@ -130,7 +136,8 @@ const stats = [ interface StatItem { icon: TablerIcon; - value: (x: DnsHoleSummary[]) => string; + value: (summaries: DnsHoleSummary[]) => string; + tooltip?: (summaries: DnsHoleSummary[], t: TranslationFunction) => string | undefined; label: stringOrTranslation; color: string; } @@ -144,58 +151,61 @@ interface StatCardProps { const StatCard = ({ item, data, usePiHoleColors, t }: StatCardProps) => { const { ref, height, width } = useElementSize(); const isLong = width > height + 20; + const tooltip = item.tooltip?.(data, t); return ( - - + - - + - {item.value(data)} - - {item.label && ( - - {translateIfNecessary(t, item.label)} + + {item.value(data)} - )} + {item.label && ( + + {translateIfNecessary(t, item.label)} + + )} + - - + + ); }; diff --git a/packages/widgets/src/iframe/component.tsx b/packages/widgets/src/iframe/component.tsx index b561bd060..3f32742c7 100644 --- a/packages/widgets/src/iframe/component.tsx +++ b/packages/widgets/src/iframe/component.tsx @@ -1,7 +1,7 @@ "use client"; import { Box, Stack, Text, Title } from "@mantine/core"; -import { IconBrowserOff } from "@tabler/icons-react"; +import { IconBrowserOff, IconProtocol } from "@tabler/icons-react"; import { objectEntries } from "@homarr/common"; import { useI18n } from "@homarr/translation/client"; @@ -15,6 +15,9 @@ export default function IFrameWidget({ options, isEditMode }: WidgetComponentPro const allowedPermissions = getAllowedPermissions(permissions); if (embedUrl.trim() === "") return ; + if (!isSupportedProtocol(embedUrl)) { + return ; + } return ( @@ -31,6 +34,17 @@ export default function IFrameWidget({ options, isEditMode }: WidgetComponentPro ); } +const supportedProtocols = ["http", "https"]; + +const isSupportedProtocol = (url: string) => { + try { + const parsedUrl = new URL(url); + return supportedProtocols.map((protocol) => `${protocol}:`).includes(`${parsedUrl.protocol}`); + } catch { + return false; + } +}; + const NoUrl = () => { const t = useI18n(); @@ -42,6 +56,21 @@ const NoUrl = () => { ); }; +const UnsupportedProtocol = () => { + const t = useI18n(); + + return ( + + + + {t("widget.iframe.error.unsupportedProtocol", { + supportedProtocols: supportedProtocols.map((protocol) => protocol).join(", "), + })} + + + ); +}; + const getAllowedPermissions = (permissions: Omit["options"], "embedUrl">) => { return objectEntries(permissions) .filter(([_key, value]) => value) diff --git a/packages/widgets/src/notebook/component.tsx b/packages/widgets/src/notebook/component.tsx index 5231e1db9..a9847eceb 100644 --- a/packages/widgets/src/notebook/component.tsx +++ b/packages/widgets/src/notebook/component.tsx @@ -1,3 +1,5 @@ +"use client"; + import dynamic from "next/dynamic"; import "@mantine/tiptap/styles.css"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05bd7e0fb..ad195b8c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,28 +18,28 @@ importers: version: link:tooling/prettier '@semantic-release/changelog': specifier: ^6.0.3 - version: 6.0.3(semantic-release@24.2.1(typescript@5.7.2)) + version: 6.0.3(semantic-release@24.2.1(typescript@5.7.3)) '@semantic-release/commit-analyzer': specifier: ^13.0.1 - version: 13.0.1(semantic-release@24.2.1(typescript@5.7.2)) + version: 13.0.1(semantic-release@24.2.1(typescript@5.7.3)) '@semantic-release/git': specifier: ^10.0.1 - version: 10.0.1(semantic-release@24.2.1(typescript@5.7.2)) + version: 10.0.1(semantic-release@24.2.1(typescript@5.7.3)) '@semantic-release/github': specifier: ^11.0.1 - version: 11.0.1(semantic-release@24.2.1(typescript@5.7.2)) + version: 11.0.1(semantic-release@24.2.1(typescript@5.7.3)) '@semantic-release/npm': specifier: ^12.0.1 - version: 12.0.1(semantic-release@24.2.1(typescript@5.7.2)) + version: 12.0.1(semantic-release@24.2.1(typescript@5.7.3)) '@semantic-release/release-notes-generator': specifier: ^14.0.3 - version: 14.0.3(semantic-release@24.2.1(typescript@5.7.2)) + version: 14.0.3(semantic-release@24.2.1(typescript@5.7.3)) '@turbo/gen': specifier: ^2.3.3 - version: 2.3.3(@types/node@22.10.5)(typescript@5.7.2) + version: 2.3.3(@types/node@22.10.5)(typescript@5.7.3) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + version: 4.3.4(vite@5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/coverage-v8': specifier: ^2.1.8 version: 2.1.8(vitest@2.1.8) @@ -53,14 +53,14 @@ importers: specifier: ^7.0.3 version: 7.0.3 jsdom: - specifier: ^25.0.1 - version: 25.0.1 + specifier: ^26.0.0 + version: 26.0.0 prettier: specifier: ^3.4.2 version: 3.4.2 semantic-release: specifier: ^24.2.1 - version: 24.2.1(typescript@5.7.2) + version: 24.2.1(typescript@5.7.3) testcontainers: specifier: ^10.16.0 version: 10.16.0 @@ -68,14 +68,14 @@ importers: specifier: ^2.3.3 version: 2.3.3 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.7.2)(vite@5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + version: 5.1.4(typescript@5.7.3)(vite@5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) vitest: specifier: ^2.1.8 - version: 2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@25.0.1)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + version: 2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@26.0.0)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) apps/nextjs: dependencies: @@ -104,8 +104,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../packages/form '@homarr/gridstack': - specifier: ^1.11.2 - version: 1.11.2 + specifier: ^1.11.3 + version: 1.11.3 '@homarr/integrations': specifier: workspace:^0.1.0 version: link:../../packages/integrations @@ -149,53 +149,53 @@ importers: specifier: workspace:^0.1.0 version: link:../../packages/widgets '@mantine/colors-generator': - specifier: ^7.15.2 - version: 7.15.2(chroma-js@3.1.2) + specifier: ^7.15.3 + version: 7.15.3(chroma-js@3.1.2) '@mantine/core': - specifier: ^7.15.2 - version: 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/dropzone': - specifier: ^7.15.2 - version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.15.2 - version: 7.15.2(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(react@19.0.0) '@mantine/modals': - specifier: ^7.15.2 - version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/tiptap': - specifier: ^7.15.2 - version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tiptap/extension-link@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0))(@tiptap/react@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(@tiptap/extension-link@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2))(@tiptap/react@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@million/lint': specifier: 1.0.14 version: 1.0.14(rollup@4.21.3)(webpack-sources@3.2.3) '@t3-oss/env-nextjs': specifier: ^0.11.1 - version: 0.11.1(typescript@5.7.2)(zod@3.24.1) + version: 0.11.1(typescript@5.7.3)(zod@3.24.1) '@tabler/icons-react': - specifier: ^3.26.0 - version: 3.26.0(react@19.0.0) + specifier: ^3.28.1 + version: 3.28.1(react@19.0.0) '@tanstack/react-query': - specifier: ^5.62.12 - version: 5.62.12(react@19.0.0) + specifier: ^5.63.0 + version: 5.63.0(react@19.0.0) '@tanstack/react-query-devtools': - specifier: ^5.62.12 - version: 5.62.12(@tanstack/react-query@5.62.12(react@19.0.0))(react@19.0.0) + specifier: ^5.63.0 + version: 5.63.0(@tanstack/react-query@5.63.0(react@19.0.0))(react@19.0.0) '@tanstack/react-query-next-experimental': - specifier: 5.62.12 - version: 5.62.12(@tanstack/react-query@5.62.12(react@19.0.0))(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react@19.0.0) + specifier: 5.63.0 + version: 5.63.0(@tanstack/react-query@5.63.0(react@19.0.0))(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react@19.0.0) '@trpc/client': specifier: next - version: 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) + version: 11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3) '@trpc/next': specifier: next - version: 11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@trpc/react-query': specifier: next - version: 11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@trpc/server': specifier: next - version: 11.0.0-rc.682(typescript@5.7.2) + version: 11.0.0-rc.694(typescript@5.7.3) '@xterm/addon-canvas': specifier: ^0.7.0 version: 0.7.0(@xterm/xterm@5.5.0) @@ -221,17 +221,17 @@ importers: specifier: ^7.2.3 version: 7.2.3 glob: - specifier: ^11.0.0 - version: 11.0.0 + specifier: ^11.0.1 + version: 11.0.1 jotai: specifier: ^2.11.0 - version: 2.11.0(@types/react@19.0.2)(react@19.0.0) + version: 2.11.0(@types/react@19.0.4)(react@19.0.0) mantine-react-table: - specifier: 2.0.0-beta.7 - version: 2.0.0-beta.7(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tabler/icons-react@3.26.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 2.0.0-beta.8 + version: 2.0.0-beta.8(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(@tabler/icons-react@3.28.1(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) postcss-preset-mantine: specifier: ^1.17.0 version: 1.17.0(postcss@8.4.47) @@ -239,10 +239,10 @@ importers: specifier: ^1.29.0 version: 1.29.0 react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 react-dom: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0(react@19.0.0) react-error-boundary: specifier: ^5.0.0 @@ -251,14 +251,14 @@ importers: specifier: ^0.14.1 version: 0.14.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: - specifier: ^1.83.0 - version: 1.83.0 + specifier: ^1.83.1 + version: 1.83.1 superjson: specifier: 2.2.2 version: 2.2.2 swagger-ui-react: specifier: ^5.18.2 - version: 5.18.2(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 5.18.2(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) use-deep-compare-effect: specifier: ^1.8.1 version: 1.8.1(react@19.0.0) @@ -273,8 +273,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript '@types/chroma-js': - specifier: 2.4.5 - version: 2.4.5 + specifier: 3.1.0 + version: 3.1.0 '@types/node': specifier: ^22.10.5 version: 22.10.5 @@ -282,11 +282,11 @@ importers: specifier: ^1.26.5 version: 1.26.5 '@types/react': - specifier: ^19.0.2 - version: 19.0.2 + specifier: 19.0.4 + version: 19.0.4 '@types/react-dom': - specifier: ^19.0.2 - version: 19.0.2(@types/react@19.0.2) + specifier: 19.0.2 + version: 19.0.2(@types/react@19.0.4) '@types/swagger-ui-react': specifier: ^4.18.3 version: 4.18.3 @@ -303,8 +303,8 @@ importers: specifier: ^3.4.2 version: 3.4.2 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 apps/tasks: dependencies: @@ -363,8 +363,8 @@ importers: specifier: 2.2.2 version: 2.2.2 undici: - specifier: 7.2.0 - version: 7.2.0 + specifier: 7.2.1 + version: 7.2.1 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -391,8 +391,8 @@ importers: specifier: 4.19.2 version: 4.19.2 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 apps/websocket: dependencies: @@ -449,8 +449,8 @@ importers: specifier: ^3.4.2 version: 3.4.2 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/analytics: dependencies: @@ -483,8 +483,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/api: dependencies: @@ -541,31 +541,34 @@ importers: version: link:../validation '@trpc/client': specifier: next - version: 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) + version: 11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3) '@trpc/react-query': specifier: next - version: 11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@trpc/server': specifier: next - version: 11.0.0-rc.682(typescript@5.7.2) + version: 11.0.0-rc.694(typescript@5.7.3) dockerode: - specifier: ^4.0.2 - version: 4.0.2 + specifier: ^4.0.3 + version: 4.0.3 lodash.clonedeep: specifier: ^4.5.0 version: 4.5.0 next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) superjson: specifier: 2.2.2 version: 2.2.2 trpc-to-openapi: - specifier: ^2.1.1 - version: 2.1.1(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1) + specifier: ^2.1.2 + version: 2.1.2(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -577,8 +580,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript '@types/dockerode': - specifier: ^3.3.33 - version: 3.3.33 + specifier: ^3.3.34 + version: 3.3.34 eslint: specifier: ^9.17.0 version: 9.17.0 @@ -586,8 +589,8 @@ importers: specifier: ^3.4.2 version: 3.4.2 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/auth: dependencies: @@ -614,7 +617,7 @@ importers: version: link:../validation '@t3-oss/env-nextjs': specifier: ^0.11.1 - version: 0.11.1(typescript@5.7.2)(zod@3.24.1) + version: 0.11.1(typescript@5.7.3)(zod@3.24.1) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -622,19 +625,19 @@ importers: specifier: ^0.9.1 version: 0.9.1 ldapts: - specifier: 7.3.0 - version: 7.3.0 + specifier: 7.3.1 + version: 7.3.1 next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) next-auth: specifier: 5.0.0-beta.25 - version: 5.0.0-beta.25(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react@19.0.0) + version: 5.0.0-beta.25(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react@19.0.0) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 react-dom: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0(react@19.0.0) devDependencies: '@homarr/eslint-config': @@ -659,8 +662,8 @@ importers: specifier: ^3.4.2 version: 3.4.2 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/cli: dependencies: @@ -693,8 +696,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/common: dependencies: @@ -705,11 +708,14 @@ importers: specifier: ^1.11.13 version: 1.11.13 next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -724,8 +730,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/cron-job-runner: dependencies: @@ -752,8 +758,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/cron-job-status: dependencies: @@ -774,8 +780,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/cron-jobs: dependencies: @@ -847,8 +853,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/cron-jobs-core: dependencies: @@ -875,8 +881,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/db: dependencies: @@ -900,13 +906,13 @@ importers: version: 2.2.2 '@t3-oss/env-nextjs': specifier: ^0.11.1 - version: 0.11.1(typescript@5.7.2)(zod@3.24.1) + version: 0.11.1(typescript@5.7.3)(zod@3.24.1) '@testcontainers/mysql': specifier: ^10.16.0 version: 10.16.0 better-sqlite3: - specifier: ^11.7.0 - version: 11.7.0 + specifier: ^11.7.2 + version: 11.7.2 dotenv: specifier: ^16.4.7 version: 16.4.7 @@ -915,10 +921,10 @@ importers: version: 0.30.1 drizzle-orm: specifier: ^0.38.3 - version: 0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.2)(better-sqlite3@11.7.0)(mysql2@3.12.0)(react@19.0.0) + version: 0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.4)(better-sqlite3@11.7.2)(mysql2@3.12.0)(react@19.0.0) drizzle-zod: specifier: ^0.6.1 - version: 0.6.1(drizzle-orm@0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.2)(better-sqlite3@11.7.0)(mysql2@3.12.0)(react@19.0.0))(zod@3.24.1) + version: 0.6.1(drizzle-orm@0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.4)(better-sqlite3@11.7.2)(mysql2@3.12.0)(react@19.0.0))(zod@3.24.1) mysql2: specifier: 3.12.0 version: 3.12.0 @@ -948,8 +954,8 @@ importers: specifier: 4.19.2 version: 4.19.2 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/definitions: dependencies: @@ -970,8 +976,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/form: dependencies: @@ -985,8 +991,8 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/form': - specifier: ^7.15.2 - version: 7.15.2(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(react@19.0.0) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1001,8 +1007,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/icons: dependencies: @@ -1029,8 +1035,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/integrations: dependencies: @@ -1087,8 +1093,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/log: dependencies: @@ -1115,8 +1121,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/modals: dependencies: @@ -1127,13 +1133,13 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/core': - specifier: ^7.15.2 - version: 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.15.2 - version: 7.15.2(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(react@19.0.0) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 devDependencies: '@homarr/eslint-config': @@ -1149,8 +1155,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/modals-collection: dependencies: @@ -1185,20 +1191,23 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.15.2 - version: 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tabler/icons-react': - specifier: ^3.26.0 - version: 3.26.0(react@19.0.0) + specifier: ^3.28.1 + version: 3.28.1(react@19.0.0) dayjs: specifier: ^1.11.13 version: 1.11.13 next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1213,8 +1222,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/notifications: dependencies: @@ -1222,11 +1231,11 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/notifications': - specifier: ^7.15.2 - version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tabler/icons-react': - specifier: ^3.26.0 - version: 3.26.0(react@19.0.0) + specifier: ^3.28.1 + version: 3.28.1(react@19.0.0) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1241,8 +1250,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/old-import: dependencies: @@ -1280,20 +1289,23 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.15.2 - version: 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.15.2 - version: 7.15.2(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(react@19.0.0) adm-zip: specifier: 0.5.16 version: 0.5.16 next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) superjson: specifier: 2.2.2 version: 2.2.2 @@ -1320,8 +1332,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/old-schema: dependencies: @@ -1345,8 +1357,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/ping: dependencies: @@ -1370,8 +1382,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/redis: dependencies: @@ -1407,8 +1419,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/request-handler: dependencies: @@ -1434,8 +1446,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 octokit: - specifier: ^4.0.3 - version: 4.0.3 + specifier: ^4.1.0 + version: 4.1.0 pretty-print-error: specifier: ^1.1.2 version: 1.1.2(patch_hash=4arrfgbz7em6s4gqywse7esg4u) @@ -1456,8 +1468,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/server-settings: dependencies: @@ -1481,8 +1493,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/spotlight: dependencies: @@ -1514,26 +1526,29 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/core': - specifier: ^7.15.2 - version: 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.15.2 - version: 7.15.2(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(react@19.0.0) '@mantine/spotlight': - specifier: ^7.15.2 - version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tabler/icons-react': - specifier: ^3.26.0 - version: 3.26.0(react@19.0.0) + specifier: ^3.28.1 + version: 3.28.1(react@19.0.0) jotai: specifier: ^2.11.0 - version: 2.11.0(@types/react@18.3.13)(react@19.0.0) + version: 2.11.0(@types/react@19.0.4)(react@19.0.0) next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) use-deep-compare-effect: specifier: ^1.8.1 version: 1.8.1(react@19.0.0) @@ -1551,8 +1566,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/translation: dependencies: @@ -1569,17 +1584,20 @@ importers: specifier: 4.3.1 version: 4.3.1 mantine-react-table: - specifier: 2.0.0-beta.7 - version: 2.0.0-beta.7(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tabler/icons-react@3.26.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 2.0.0-beta.8 + version: 2.0.0-beta.8(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(@tabler/icons-react@3.28.1(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) next-intl: specifier: 3.26.3 - version: 3.26.3(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react@19.0.0) + version: 3.26.3(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react@19.0.0) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1594,8 +1612,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/ui: dependencies: @@ -1615,26 +1633,29 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.15.2 - version: 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/dates': - specifier: ^7.15.2 - version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.15.2 - version: 7.15.2(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(react@19.0.0) '@tabler/icons-react': - specifier: ^3.26.0 - version: 3.26.0(react@19.0.0) + specifier: ^3.28.1 + version: 3.28.1(react@19.0.0) mantine-react-table: - specifier: 2.0.0-beta.7 - version: 2.0.0-beta.7(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tabler/icons-react@3.26.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 2.0.0-beta.8 + version: 2.0.0-beta.8(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(@tabler/icons-react@3.28.1(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1652,8 +1673,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/validation: dependencies: @@ -1683,8 +1704,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 packages/widgets: dependencies: @@ -1740,59 +1761,59 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.15.2 - version: 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.15.2 - version: 7.15.2(react@19.0.0) + specifier: ^7.15.3 + version: 7.15.3(react@19.0.0) '@tabler/icons-react': - specifier: ^3.26.0 - version: 3.26.0(react@19.0.0) + specifier: ^3.28.1 + version: 3.28.1(react@19.0.0) '@tiptap/extension-color': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/extension-text-style@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/extension-text-style@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))) '@tiptap/extension-highlight': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-image': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-link': - specifier: ^2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + specifier: ^2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) '@tiptap/extension-table': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) '@tiptap/extension-table-cell': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-table-header': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-table-row': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-task-item': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) '@tiptap/extension-task-list': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-text-align': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-text-style': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/extension-underline': - specifier: 2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + specifier: 2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) '@tiptap/react': - specifier: ^2.11.0 - version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^2.11.2 + version: 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tiptap/starter-kit': - specifier: ^2.11.0 - version: 2.11.0 + specifier: ^2.11.2 + version: 2.11.2 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -1800,14 +1821,17 @@ importers: specifier: ^1.11.13 version: 1.11.13 mantine-react-table: - specifier: 2.0.0-beta.7 - version: 2.0.0-beta.7(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tabler/icons-react@3.26.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 2.0.0-beta.8 + version: 2.0.0-beta.8(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(@tabler/icons-react@3.28.1(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: ^14.2.22 - version: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + specifier: 15.1.4 + version: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) video.js: specifier: ^8.21.0 version: 8.21.0 @@ -1828,14 +1852,14 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 tooling/eslint: dependencies: '@next/eslint-plugin-next': - specifier: ^14.2.22 - version: 14.2.22 + specifier: ^15.1.4 + version: 15.1.4 eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@9.17.0) @@ -1844,7 +1868,7 @@ importers: version: 2.3.3(eslint@9.17.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0) + version: 2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.17.0)(typescript@5.7.3))(eslint@9.17.0) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@9.17.0) @@ -1855,8 +1879,8 @@ importers: specifier: ^5.1.0 version: 5.1.0(eslint@9.17.0) typescript-eslint: - specifier: ^8.19.0 - version: 8.19.0(eslint@9.17.0)(typescript@5.7.2) + specifier: ^8.19.1 + version: 8.19.1(eslint@9.17.0)(typescript@5.7.3) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -1868,8 +1892,8 @@ importers: specifier: ^9.17.0 version: 9.17.0 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 tooling/github: {} @@ -1889,8 +1913,8 @@ importers: specifier: ^2.5.6 version: 2.5.6(prettier@3.4.2) typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 tooling/typescript: {} @@ -1904,6 +1928,9 @@ packages: resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} hasBin: true + '@asamuzakjp/css-color@2.8.2': + resolution: {integrity: sha512-RtWv9jFN2/bLExuZgFFZ0I3pWWeezAHGgrmjqGGWclATl1aDe3yhCUaI0Ilkp6OCk9zX7+FjvDasEX8Q9Rxc5w==} + '@auth/core@0.37.2': resolution: {integrity: sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw==} peerDependencies: @@ -2058,6 +2085,34 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@csstools/color-helpers@5.0.1': + resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.1': + resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-color-parser@3.0.7': + resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + '@ctrl/deluge@7.1.0': resolution: {integrity: sha512-A7MUxhVDpblfUloUYCtQTZJXWDUQ6V5oQnWvtNTDhzGjQU4vez2b0uQqzpywyrAkiBtdjWFgm61cESaivJGNXA==} engines: {node: '>=18'} @@ -2113,6 +2168,9 @@ packages: '@drizzle-team/brocli@0.11.0': resolution: {integrity: sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg==} + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -2889,11 +2947,20 @@ packages: '@formatjs/intl-localematcher@0.5.5': resolution: {integrity: sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==} + '@grpc/grpc-js@1.12.5': + resolution: {integrity: sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} - '@homarr/gridstack@1.11.2': - resolution: {integrity: sha512-WhoXMJtwE7N64Yajn1eoFZ+9JNZpE+6+Eea0uo8sAvVRbEKkJ0kirOK0QL1DW4j16wkvnyHZoxPfdx1DO+hRpQ==} + '@homarr/gridstack@1.11.3': + resolution: {integrity: sha512-7qVEH8DfLBQRJNHBMUTsrt1C1QwPRYcv9hq2vrQ/0M4bZXlxRxMEyUamDNJ1aBMtjDoiOkvirTUJUrZVZV6XBg==} '@hono/node-server@1.13.0': resolution: {integrity: sha512-kz323qIQkNQElEGroo/E9MKPDuIR5pkuk/XEWd50K+cSEKdmdiYx0PKWUdaNY2ecJYngtF+njDMsMKplL6zfEg==} @@ -2930,6 +2997,111 @@ packages: '@vue/compiler-sfc': optional: true + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -2970,6 +3142,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@libsql/client-wasm@0.14.0': resolution: {integrity: sha512-gB/jtz0xuwrqAHApBv9e9JSew2030Fhj2edyZ83InZ4yPj/Q2LTUlEhaspEYT0T0xsAGqPy38uGrmq/OGS+DdQ==} bundledDependencies: @@ -2978,79 +3153,79 @@ packages: '@libsql/core@0.14.0': resolution: {integrity: sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==} - '@mantine/colors-generator@7.15.2': - resolution: {integrity: sha512-EqOWuOq0ZoPrVZiQVxkyr0uEoZAn5bfCVssrY0qAu47ZGxeodiJ6gKOrY68TYN/ep9AV74d7mFTl8d42Q08QmQ==} + '@mantine/colors-generator@7.15.3': + resolution: {integrity: sha512-SQjiilxzGHJ1yatcRjmgm0PY9W6tWswYHC5GNT1QAMzKIVwrN3Jo8944OJSX/6I+8dYVjqVqxEpKGF79F+HfCA==} peerDependencies: chroma-js: '>=2.4.2' - '@mantine/core@7.15.2': - resolution: {integrity: sha512-640ns0L/HZAXYjz3+FRffr8UNcH1fU7ENUVxKLzqNA311Dcx0qS3byVKTY/IVJYln6AkjoEfIJMiixT9fCZBiQ==} + '@mantine/core@7.15.3': + resolution: {integrity: sha512-8IMTq5xDJDjByDUYkDNKImikASStzrnPtVumKsrEnyEY0zhAWkAe/z/+PjTUMcN44ncJ/PrXQkJ6qMaVWzSZwA==} peerDependencies: - '@mantine/hooks': 7.15.2 + '@mantine/hooks': 7.15.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/dates@7.15.2': - resolution: {integrity: sha512-WeJ+a16bZC+7k9Fr6jiC5NrdZi23Hp28xGBa3kKYk0Nanz/lTgg2DTBgFB537+4MVD1kOmqso+7z1VO9uLeaEw==} + '@mantine/dates@7.15.3': + resolution: {integrity: sha512-lv71dcfA8qB43v03cRELC2/G7FQXfAgj0tSMImj2p2FL3PSWWF4WRvW6byiB+hszk4lgooSo7kppzkSMVUlsdA==} peerDependencies: - '@mantine/core': 7.15.2 - '@mantine/hooks': 7.15.2 + '@mantine/core': 7.15.3 + '@mantine/hooks': 7.15.3 dayjs: '>=1.0.0' react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/dropzone@7.15.2': - resolution: {integrity: sha512-6jT1tFfUEhjWeZywohC8OMJnii0omOnqlqqGMQc0MZBpdMQmmTGJ3Z6oLkCadVH97FrROm8rtUOnMSA9CqiAGw==} + '@mantine/dropzone@7.15.3': + resolution: {integrity: sha512-3BZNKqfWyE6/DXOUoYbT72kVDiAu4jRLxUM7KsWojlSy1ucgd8X5oC6yvMlCa2nSDbrVlCNzsDADrezh2MxaNA==} peerDependencies: - '@mantine/core': 7.15.2 - '@mantine/hooks': 7.15.2 + '@mantine/core': 7.15.3 + '@mantine/hooks': 7.15.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/form@7.15.2': - resolution: {integrity: sha512-ADXLw/e0/ddNIj9EtJb5aes2VEpoR7GIVgKnzFhq8DXMfOZqaMn4rSVY8LmVOAtcMyocPR7hk8uQQ3ihmpzFaw==} + '@mantine/form@7.15.3': + resolution: {integrity: sha512-E+xrY/z6Y4JoHqL4f91AoMeNspuAe+nET667wKVBSUu4yLQX0FS8uvdypoaasb3LcTk7GRmnDNYyfC37zz4zkg==} peerDependencies: react: ^18.x || ^19.x - '@mantine/hooks@7.15.2': - resolution: {integrity: sha512-p8dsW0fdJxzYhULbm1noFYRHuBvJHleYviC0BlwbkVySC8AsvFI8AmC3sMssWV3dQ3yQ/SidYo9U+K/czpDpZw==} + '@mantine/hooks@7.15.3': + resolution: {integrity: sha512-rZYObhrmww3OIb4O30pDox/rc+9k3AExO0FSw13t7cfz5/Di+Ho1cChswVFAshnp81ucGEod1fiDOfuyGW7JhA==} peerDependencies: react: ^18.x || ^19.x - '@mantine/modals@7.15.2': - resolution: {integrity: sha512-Boy3h3meNbhttMpGh9t7Phjvoc/tqL3v+U21w389KEf/NBdpAHVZVPxJL6rdVsP+vgNDpYDSCyfcxTL4zPvJaA==} + '@mantine/modals@7.15.3': + resolution: {integrity: sha512-S/nu/4OcQw2sBbFVEIU1FfyiLDKVN9qOxnxhQBxaR9BFk4gEALzuU2uCorlu4f8TKUMo2kho0b0iTuYluQ07Dw==} peerDependencies: - '@mantine/core': 7.15.2 - '@mantine/hooks': 7.15.2 + '@mantine/core': 7.15.3 + '@mantine/hooks': 7.15.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/notifications@7.15.2': - resolution: {integrity: sha512-SZYUJV+BMakyoURj1is5aKXyM6pHpwl3V28FVx7nExyXcHJyzmPmqaSPumo0ZjFo+ysQ8/0P9UnYP0kNRwrjdQ==} + '@mantine/notifications@7.15.3': + resolution: {integrity: sha512-C1obM5dQsSHIB3B3Kajk0TdLnBpLXFMOIy0otG5khoL/8c8qOU4U0kHxtPVFBFvU/hw4rx7/idiiJdjp8DepDQ==} peerDependencies: - '@mantine/core': 7.15.2 - '@mantine/hooks': 7.15.2 + '@mantine/core': 7.15.3 + '@mantine/hooks': 7.15.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/spotlight@7.15.2': - resolution: {integrity: sha512-wN0Glp7NjxQyRzr1djHFbZfDZRMhvNXmKpd4OxFpwcdE5W8Iqo1MTv5yzL/qx45F8o2wzdqd4wgfvlnTVsKs9g==} + '@mantine/spotlight@7.15.3': + resolution: {integrity: sha512-O+r8QLqo93A1h5CJJotZuMVywVVo6d8vJ/DYhxq18QzGuPF8bHoXPD3m+unEA34aSO4Y70kyXyFdZRyCVmOS0g==} peerDependencies: - '@mantine/core': 7.15.2 - '@mantine/hooks': 7.15.2 + '@mantine/core': 7.15.3 + '@mantine/hooks': 7.15.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/store@7.15.2': - resolution: {integrity: sha512-8ZVRr6D/8GEu2VmUVU447w4H+hl9dwefl//GpSGI2vKxXBqlud5X9PJQkSwi5J7I5FAxvlG5dr/zCxC3r3nsIQ==} + '@mantine/store@7.15.3': + resolution: {integrity: sha512-E3pCEm5ozRF/iK/jM1liKntjqaKhotvPtNAqSBcx6AkWSJ8bt16JhNrmrs3J3RmWvfqzF+fftT8HI/3HYbgu9w==} peerDependencies: react: ^18.x || ^19.x - '@mantine/tiptap@7.15.2': - resolution: {integrity: sha512-fQqq41eAoGmC0vcDDnGsj9IVCAG0fN3XsR7dJKIz6jS51qfHSzbMCQgV8gRNKXkGDKet5B73TwUU/tD67+dkvg==} + '@mantine/tiptap@7.15.3': + resolution: {integrity: sha512-hMtRIpT1ujpGrjr2b2iX34cBaAoryCKpoPFPK9hrwmES2/53asYYyC+8Y47RBBpZmpuFlqM2VOy2Nk83gXqZGQ==} peerDependencies: - '@mantine/core': 7.15.2 - '@mantine/hooks': 7.15.2 + '@mantine/core': 7.15.3 + '@mantine/hooks': 7.15.3 '@tiptap/extension-link': '>=2.1.12' '@tiptap/react': '>=2.1.12' react: ^18.x || ^19.x @@ -3068,62 +3243,56 @@ packages: resolution: {integrity: sha512-u6/kglVwZRu5+GMmtkNlGLqJVkgTl0TtM+hLa9rBg7pldx+5NG5bk45NvL37uZmAr2Xfa1C6qHb7GrFwfP372g==} hasBin: true - '@next/env@14.2.22': - resolution: {integrity: sha512-EQ6y1QeNQglNmNIXvwP/Bb+lf7n9WtgcWvtoFsHquVLCJUuxRs+6SfZ5EK0/EqkkLex4RrDySvKgKNN7PXip7Q==} + '@next/env@15.1.4': + resolution: {integrity: sha512-2fZ5YZjedi5AGaeoaC0B20zGntEHRhi2SdWcu61i48BllODcAmmtj8n7YarSPt4DaTsJaBFdxQAVEVzgmx2Zpw==} - '@next/eslint-plugin-next@14.2.22': - resolution: {integrity: sha512-8xCmBMd+hUapMpviPp5g3oDhoWRtbE/QeN/Nvth+SZrdt7xt9TBsH8cePkRwRjXFpwHndpRDNVQROxR/1HiVbg==} + '@next/eslint-plugin-next@15.1.4': + resolution: {integrity: sha512-HwlEXwCK3sr6zmVGEvWBjW9tBFs1Oe6hTmTLoFQtpm4As5HCdu8jfSE0XJOp7uhfEGLniIx8yrGxEWwNnY0fmQ==} - '@next/swc-darwin-arm64@14.2.22': - resolution: {integrity: sha512-HUaLiehovgnqY4TMBZJ3pDaOsTE1spIXeR10pWgdQVPYqDGQmHJBj3h3V6yC0uuo/RoY2GC0YBFRkOX3dI9WVQ==} + '@next/swc-darwin-arm64@15.1.4': + resolution: {integrity: sha512-wBEMBs+np+R5ozN1F8Y8d/Dycns2COhRnkxRc+rvnbXke5uZBHkUGFgWxfTXn5rx7OLijuUhyfB+gC/ap58dDw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.22': - resolution: {integrity: sha512-ApVDANousaAGrosWvxoGdLT0uvLBUC+srqOcpXuyfglA40cP2LBFaGmBjhgpxYk5z4xmunzqQvcIgXawTzo2uQ==} + '@next/swc-darwin-x64@15.1.4': + resolution: {integrity: sha512-7sgf5rM7Z81V9w48F02Zz6DgEJulavC0jadab4ZsJ+K2sxMNK0/BtF8J8J3CxnsJN3DGcIdC260wEKssKTukUw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.22': - resolution: {integrity: sha512-3O2J99Bk9aM+d4CGn9eEayJXHuH9QLx0BctvWyuUGtJ3/mH6lkfAPRI4FidmHMBQBB4UcvLMfNf8vF0NZT7iKw==} + '@next/swc-linux-arm64-gnu@15.1.4': + resolution: {integrity: sha512-JaZlIMNaJenfd55kjaLWMfok+vWBlcRxqnRoZrhFQrhM1uAehP3R0+Aoe+bZOogqlZvAz53nY/k3ZyuKDtT2zQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.22': - resolution: {integrity: sha512-H/hqfRz75yy60y5Eg7DxYfbmHMjv60Dsa6IWHzpJSz4MRkZNy5eDnEW9wyts9bkxwbOVZNPHeb3NkqanP+nGPg==} + '@next/swc-linux-arm64-musl@15.1.4': + resolution: {integrity: sha512-7EBBjNoyTO2ipMDgCiORpwwOf5tIueFntKjcN3NK+GAQD7OzFJe84p7a2eQUeWdpzZvhVXuAtIen8QcH71ZCOQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.22': - resolution: {integrity: sha512-LckLwlCLcGR1hlI5eiJymR8zSHPsuruuwaZ3H2uudr25+Dpzo6cRFjp/3OR5UYJt8LSwlXv9mmY4oI2QynwpqQ==} + '@next/swc-linux-x64-gnu@15.1.4': + resolution: {integrity: sha512-9TGEgOycqZFuADyFqwmK/9g6S0FYZ3tphR4ebcmCwhL8Y12FW8pIBKJvSwV+UBjMkokstGNH+9F8F031JZKpHw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.22': - resolution: {integrity: sha512-qGUutzmh0PoFU0fCSu0XYpOfT7ydBZgDfcETIeft46abPqP+dmePhwRGLhFKwZWxNWQCPprH26TjaTxM0Nv8mw==} + '@next/swc-linux-x64-musl@15.1.4': + resolution: {integrity: sha512-0578bLRVDJOh+LdIoKvgNDz77+Bd85c5JrFgnlbI1SM3WmEQvsjxTA8ATu9Z9FCiIS/AliVAW2DV/BDwpXbtiQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.22': - resolution: {integrity: sha512-K6MwucMWmIvMb9GlvT0haYsfIPxfQD8yXqxwFy4uLFMeXIb2TcVYQimxkaFZv86I7sn1NOZnpOaVk5eaxThGIw==} + '@next/swc-win32-arm64-msvc@15.1.4': + resolution: {integrity: sha512-JgFCiV4libQavwII+kncMCl30st0JVxpPOtzWcAI2jtum4HjYaclobKhj+JsRu5tFqMtA5CJIa0MvYyuu9xjjQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.22': - resolution: {integrity: sha512-5IhDDTPEbzPR31ZzqHe90LnNe7BlJUZvC4sA1thPJV6oN5WmtWjZ0bOYfNsyZx00FJt7gggNs6SrsX0UEIcIpA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.22': - resolution: {integrity: sha512-nvRaB1PyG4scn9/qNzlkwEwLzuoPH3Gjp7Q/pLuwUgOTt1oPMlnCI3A3rgkt+eZnU71emOiEv/mR201HoURPGg==} + '@next/swc-win32-x64-msvc@15.1.4': + resolution: {integrity: sha512-xxsJy9wzq7FR5SqPCUqdgSXiNXrMuidgckBa8nH9HtjjxsilgcN6VgXF6tZ3uEWuVEadotQJI8/9EQ6guTC4Yw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3144,38 +3313,42 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@octokit/app@15.1.1': - resolution: {integrity: sha512-fk8xrCSPTJGpyBdBNI+DcZ224dm0aApv4vi6X7/zTmANXlegKV2Td+dJ+fd7APPaPN7R+xttUsj2Fm+AFDSfMQ==} + '@octokit/app@15.1.2': + resolution: {integrity: sha512-6aKmKvqnJKoVK+kx0mLlBMKmQYoziPw4Rd/PWr0j65QVQlrDXlu6hGU8fmTXt7tNkf/DsubdIaTT4fkoWzCh5g==} engines: {node: '>= 18'} - '@octokit/auth-app@7.1.3': - resolution: {integrity: sha512-GZdkOp2kZTIy5dG9oXqvzUAZiPvDx4C/lMlN6yQjtG9d/+hYa7W8WXTJoOrXE8UdfL9A/sZMl206dmtkl9lwVQ==} + '@octokit/auth-app@7.1.4': + resolution: {integrity: sha512-5F+3l/maq9JfWQ4bV28jT2G/K8eu9OJ317yzXPTGe4Kw+lKDhFaS4dQ3Ltmb6xImKxfCQdqDqMXODhc9YLipLw==} engines: {node: '>= 18'} - '@octokit/auth-oauth-app@8.1.1': - resolution: {integrity: sha512-5UtmxXAvU2wfcHIPPDWzVSAWXVJzG3NWsxb7zCFplCWEmMCArSZV0UQu5jw5goLQXbFyOr5onzEH37UJB3zQQg==} + '@octokit/auth-oauth-app@8.1.2': + resolution: {integrity: sha512-3woNZgq5/S6RS+9ZTq+JdymxVr7E0s4EYxF20ugQvgX3pomdPUL5r/XdTY9wALoBM2eHVy4ettr5fKpatyTyHw==} engines: {node: '>= 18'} - '@octokit/auth-oauth-device@7.1.1': - resolution: {integrity: sha512-HWl8lYueHonuyjrKKIup/1tiy0xcmQCdq5ikvMO1YwkNNkxb6DXfrPjrMYItNLyCP/o2H87WuijuE+SlBTT8eg==} + '@octokit/auth-oauth-device@7.1.2': + resolution: {integrity: sha512-gTOIzDeV36OhVfxCl69FmvJix7tJIiU6dlxuzLVAzle7fYfO8UDyddr9B+o4CFQVaMBLMGZ9ak2CWMYcGeZnPw==} engines: {node: '>= 18'} - '@octokit/auth-oauth-user@5.1.1': - resolution: {integrity: sha512-rRkMz0ErOppdvEfnemHJXgZ9vTPhBuC6yASeFaB7I2yLMd7QpjfrL1mnvRPlyKo+M6eeLxrKanXJ9Qte29SRsw==} + '@octokit/auth-oauth-user@5.1.2': + resolution: {integrity: sha512-PgVDDPJgZYb3qSEXK4moksA23tfn68zwSAsQKZ1uH6IV9IaNEYx35OXXI80STQaLYnmEE86AgU0tC1YkM4WjsA==} engines: {node: '>= 18'} '@octokit/auth-token@5.1.1': resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} engines: {node: '>= 18'} - '@octokit/auth-unauthenticated@6.1.0': - resolution: {integrity: sha512-zPSmfrUAcspZH/lOFQnVnvjQZsIvmfApQH6GzJrkIunDooU1Su2qt2FfMTSVPRp7WLTQyC20Kd55lF+mIYaohQ==} + '@octokit/auth-unauthenticated@6.1.1': + resolution: {integrity: sha512-bGXqdN6RhSFHvpPq46SL8sN+F3odQ6oMNLWc875IgoqcC3qus+fOL2th6Tkl94wvdSTy8/OeHzWy/lZebmnhog==} engines: {node: '>= 18'} '@octokit/core@6.1.2': resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} engines: {node: '>= 18'} + '@octokit/core@6.1.3': + resolution: {integrity: sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==} + engines: {node: '>= 18'} + '@octokit/endpoint@10.1.1': resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} engines: {node: '>= 18'} @@ -3184,21 +3357,28 @@ packages: resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} engines: {node: '>= 18'} - '@octokit/oauth-app@7.1.3': - resolution: {integrity: sha512-EHXbOpBkSGVVGF1W+NLMmsnSsJRkcrnVmDKt0TQYRBb6xWfWzoi9sBD4DIqZ8jGhOWO/V8t4fqFyJ4vDQDn9bg==} + '@octokit/graphql@8.1.2': + resolution: {integrity: sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==} + engines: {node: '>= 18'} + + '@octokit/oauth-app@7.1.5': + resolution: {integrity: sha512-/Y2MiwWDlGUK4blKKfjJiwjzu/FzwKTTTfTZAAQ0QbdBIDEGJPWhOFH6muSN86zaa4tNheB4YS3oWIR2e4ydzA==} engines: {node: '>= 18'} '@octokit/oauth-authorization-url@7.1.1': resolution: {integrity: sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==} engines: {node: '>= 18'} - '@octokit/oauth-methods@5.1.2': - resolution: {integrity: sha512-C5lglRD+sBlbrhCUTxgJAFjWgJlmTx5bQ7Ch0+2uqRjYv7Cfb5xpX4WuSC9UgQna3sqRGBL9EImX9PvTpMaQ7g==} + '@octokit/oauth-methods@5.1.3': + resolution: {integrity: sha512-M+bDBi5H8FnH0xhCTg0m9hvcnppdDnxUqbZyOkxlLblKpLAR+eT2nbDPvJDp0eLrvJWA1I8OX0KHf/sBMQARRA==} engines: {node: '>= 18'} '@octokit/openapi-types@22.2.0': resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + '@octokit/openapi-types@23.0.1': + resolution: {integrity: sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==} + '@octokit/openapi-webhooks-types@8.5.1': resolution: {integrity: sha512-i3h1b5zpGSB39ffBbYdSGuAd0NhBAwPyA3QV3LYi/lx4lsbZiu7u2UHgXVUR6EpvOI8REOuVh1DZTRfHoJDvuQ==} @@ -3214,8 +3394,14 @@ packages: peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@13.2.6': - resolution: {integrity: sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==} + '@octokit/plugin-paginate-rest@11.4.0': + resolution: {integrity: sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-rest-endpoint-methods@13.3.0': + resolution: {integrity: sha512-LUm44shlmkp/6VC+qQgHl3W5vzUP99ZM54zH6BuqkJK4DqfFLhegANd+fM4YRLapTvPm4049iG7F3haANKMYvQ==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': '>=6' @@ -3226,29 +3412,52 @@ packages: peerDependencies: '@octokit/core': '>=6' + '@octokit/plugin-retry@7.1.3': + resolution: {integrity: sha512-8nKOXvYWnzv89gSyIvgFHmCBAxfQAOPRlkacUHL9r5oWtp5Whxl8Skb2n3ACZd+X6cYijD6uvmrQuPH/UCL5zQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + '@octokit/plugin-throttling@9.3.2': resolution: {integrity: sha512-FqpvcTpIWFpMMwIeSoypoJXysSAQ3R+ALJhXXSG1HTP3YZOIeLmcNcimKaXxTcws+Sh6yoRl13SJ5r8sXc1Fhw==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': ^6.0.0 + '@octokit/plugin-throttling@9.4.0': + resolution: {integrity: sha512-IOlXxXhZA4Z3m0EEYtrrACkuHiArHLZ3CvqWwOez/pURNqRuwfoFlTPbN5Muf28pzFuztxPyiUiNwz8KctdZaQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^6.1.3 + '@octokit/request-error@6.1.5': resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} engines: {node: '>= 18'} + '@octokit/request-error@6.1.6': + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} + engines: {node: '>= 18'} + '@octokit/request@9.1.3': resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} engines: {node: '>= 18'} + '@octokit/request@9.1.4': + resolution: {integrity: sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==} + engines: {node: '>= 18'} + '@octokit/types@13.6.2': resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} + '@octokit/types@13.7.0': + resolution: {integrity: sha512-BXfRP+3P3IN6fd4uF3SniaHKOO4UXWBfkdR3vA8mIvaoO/wLjGN5qivUtW0QRitBHHMcfC41SLhNVYIZZE+wkA==} + '@octokit/webhooks-methods@5.1.0': resolution: {integrity: sha512-yFZa3UH11VIxYnnoOYCVoJ3q4ChuSOk2IVBBQ0O3xtKX4x9bmKb/1t+Mxixv2iUhzMdOl1qeWJqEhouXXzB3rQ==} engines: {node: '>= 18'} - '@octokit/webhooks@13.4.1': - resolution: {integrity: sha512-I5YPUtfWidh+OzyrlDahJsUpkpGK0kCTmDRbuqGmlCUzOtxdEkX3R4d6Cd08ijQYwkVXQJanPdbKuZBeV2NMaA==} + '@octokit/webhooks@13.4.2': + resolution: {integrity: sha512-fakbgkCScapQXPxyqx2jZs/Y3jGlyezwUp7ATL7oLAGJ0+SqBKWKstoKZpiQ+REeHutKpYjY9UtxdLSurwl2Tg==} engines: {node: '>= 18'} '@panva/hkdf@1.2.1': @@ -3364,6 +3573,36 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} @@ -3619,8 +3858,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@t3-oss/env-core@0.11.1': resolution: {integrity: sha512-MaxOwEoG1ntCFoKJsS7nqwgcxLW1SJw238AJwfJeaz3P/8GtkxXZsPPolsz1AdYvUTbe3XvqZ/VCdfjt+3zmKw==} @@ -3640,39 +3879,39 @@ packages: typescript: optional: true - '@tabler/icons-react@3.26.0': - resolution: {integrity: sha512-t18Zmu1ROktB7M8hWQ6vJw+mNpI/LPk5PPxLuE+kNB+4Zzf38GfETL8VF98inhzcfHohsggdROzMzwSAfjcAxw==} + '@tabler/icons-react@3.28.1': + resolution: {integrity: sha512-KNBpA2kbxr3/2YK5swt7b/kd/xpDP1FHYZCxDFIw54tX8slELRFEf95VMxsccQHZeIcUbdoojmUUuYSbt/sM5Q==} peerDependencies: react: '>= 16' - '@tabler/icons@3.26.0': - resolution: {integrity: sha512-oO3D4ss+DxzxqU1aDy0f1HmToyrO0gcQWIMpzHAfV1quPUx0BZYvNm5xz1DQb4DxNm/+xNvbBGLJy4pzTLYWag==} + '@tabler/icons@3.28.1': + resolution: {integrity: sha512-h7nqKEvFooLtFxhMOC1/2eiV+KRXhBUuDUUJrJlt6Ft6tuMw2eU/9GLQgrTk41DNmIEzp/LI83K9J9UUU8YBYQ==} '@tanstack/match-sorter-utils@8.19.4': resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.62.12': - resolution: {integrity: sha512-6igFeBgymHkCxVgaEk+yiLwkMf9haui/EQLmI3o9CatOyDThEoFKe8toLWvWliZC/Jf+h7NwHi/zjfyLArr1ow==} + '@tanstack/query-core@5.62.16': + resolution: {integrity: sha512-9Sgft7Qavcd+sN0V25xVyo0nfmcZXBuODy3FVG7BMWTg1HMLm8wwG5tNlLlmSic1u7l1v786oavn+STiFaPH2g==} - '@tanstack/query-devtools@5.62.9': - resolution: {integrity: sha512-b1NZzDLVf6laJsB1Cfm3ieuYzM+WqoO8qpm9v+3Etwd+Ph4zkhUMiT+wcWj5AhEPsXiRodKYiiW048VDNdBxNg==} + '@tanstack/query-devtools@5.62.16': + resolution: {integrity: sha512-3ff6UBJr0H3nIhfLSl9911rvKqXf0u4B58jl0uYdDWLqPk9pCvYIbxC35cGxK2+8INl4IaFVUHb/IdgWrNkg3Q==} - '@tanstack/react-query-devtools@5.62.12': - resolution: {integrity: sha512-UvkqYOplVRn6D5wMC14XHu1MCJC0ssi3FJuiQW1iSYA4cxh4GD/cy8ScMCEOtcY7j2JCFw2d3grSWxT4c66cdg==} + '@tanstack/react-query-devtools@5.63.0': + resolution: {integrity: sha512-j3+22r6srSJVy8oiLUpOOupI4g7IHwbISeEGM+5ASIzzOnVUUSsY6e4nu5pxxj7ODJbiag3GpkHU/otG9B9sAA==} peerDependencies: - '@tanstack/react-query': ^5.62.12 + '@tanstack/react-query': ^5.63.0 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.62.12': - resolution: {integrity: sha512-6otw/+R4pm6OBnf6mO6Icw37ViNS4Sc7RuzHWIr8z7J9tBwt3xZKD2HPDXs3AbzJCY9s4bJAOsCzhUPwQO1SiA==} + '@tanstack/react-query-next-experimental@5.63.0': + resolution: {integrity: sha512-km5aJnrxL8LMvSN6J4DV85s0wu3QKG+78j6ZoFLFbVvqwIXIxdhNuVKOsfo5gwE0XlaJOPYRnRG+5He8WI2WOg==} peerDependencies: - '@tanstack/react-query': ^5.62.12 + '@tanstack/react-query': ^5.63.0 next: ^13 || ^14 || ^15 react: ^18 || ^19 - '@tanstack/react-query@5.62.12': - resolution: {integrity: sha512-yt8p7l5MlHA3QCt6xF1Cu9dw1Anf93yTK+DMDJQ64h/mshAymVAtcwj8TpsyyBrZNWAAZvza/m76bnTSR79ZtQ==} + '@tanstack/react-query@5.63.0': + resolution: {integrity: sha512-QWizLzSiog8xqIRYmuJRok9VELlXVBAwtINgVCgW1SNvamQwWDO5R0XFSkjoBEj53x9Of1KAthLRBUC5xmtVLQ==} peerDependencies: react: ^18 || ^19 @@ -3683,233 +3922,233 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-virtual@3.10.8': - resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} + '@tanstack/react-virtual@3.11.2': + resolution: {integrity: sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@tanstack/table-core@8.20.5': resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.10.8': - resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} + '@tanstack/virtual-core@3.11.2': + resolution: {integrity: sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==} '@testcontainers/mysql@10.16.0': resolution: {integrity: sha512-GyxWqKfpY13lUrTEBmkKrAXyN7RZ//ntMdY/5Eyo/SukDM9LNGu3j5aNuDTGlYr4AEMJuzJ8CHxqUDAFGnCB/w==} - '@tiptap/core@2.11.0': - resolution: {integrity: sha512-0S3AWx6E2QqwdQqb6z0/q6zq2u9lA9oL3BLyAaITGSC9zt8OwjloS2k1zN6wLa9hp2rO0c0vDnWsTPeFaEaMdw==} + '@tiptap/core@2.11.2': + resolution: {integrity: sha512-Z437c/sQg31yrRVgLJVkQuih+7Og5tjRx6FE/zE47QgEayqQ9yXH0LrTAbPiY6IfY1X+f2A0h3e5Y/WGD6rC3Q==} peerDependencies: '@tiptap/pm': ^2.7.0 - '@tiptap/extension-blockquote@2.11.0': - resolution: {integrity: sha512-DBjWbgmbAAR879WAsk0+5xxgqpOTweWNnY7kEqWv3EJtLUvECXN63smiv3o4fREwwbEJqgihBu5/YugRC5z1dg==} + '@tiptap/extension-blockquote@2.11.2': + resolution: {integrity: sha512-5XeU1o5UfjMCFX3AwgeErwDKlpUr5YPhta2tQqNsQUQ7QvumIdK/3apNT15/d8pySAjdAphDWEd/CZ2di5hq6A==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bold@2.11.0': - resolution: {integrity: sha512-3x9BQZHYD5xFA0pCEneEMHZyIoxYo4NKcbhR4CLxGad1Xd+5g109nr1+eZ1JgvnChkeVf1eD6SaQE2A28lxR5g==} + '@tiptap/extension-bold@2.11.2': + resolution: {integrity: sha512-pSls6UnKiPMm2c0m1viuZ0aFexxUmTRm17vDA2Gy5PhRm5qSsnHlSxyEuEcKNOi/rIx+oJehvG1oO4uI+kmCKg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bubble-menu@2.11.0': - resolution: {integrity: sha512-21KyB7+QSQjw72Oxzs3Duw9WErAUrigFZCyoCZNjp24wP7mFVsy1jAcnRiAi8pBVwlwHBZ29IW1PeavqCSFFVA==} + '@tiptap/extension-bubble-menu@2.11.2': + resolution: {integrity: sha512-G+m7JLhe6SGcDugm8q3RXVLVnCm4t67FGNlOLRzq25VNgD7FDNwjgISp04W+qcJa0+Z5cbQt/4naUji5QEH97A==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-bullet-list@2.11.0': - resolution: {integrity: sha512-UALypJvO+cPSk/nC1HhkX/ImS9FxbKe2Pr0iDofakvZU1U1msumLVn2M/iq+ax1Mm9thodpvJv0hGDtFRwm7lQ==} + '@tiptap/extension-bullet-list@2.11.2': + resolution: {integrity: sha512-zqZYT7lmmivEDEO+6w5bl5kV3UP1L2dw5mksyMGtxpvoDgbFHZ85+ron6SeHee8C7vJc6aIptc1p6NxIS5/l0A==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-code-block@2.11.0': - resolution: {integrity: sha512-8of3qTOLjpveHBrrk8KVliSUVd6R2i2TNrBj0f/21HcFVAy0fP++02p6vI6UPOhwM3+p3CprGdSM48DFCu1rqw==} + '@tiptap/extension-code-block@2.11.2': + resolution: {integrity: sha512-O6gVfql3uFZNq9yaUDa98VgV58BqaUSeOUnhZwLzpB/4VlqzTyW6/kvFxhKcSp7f+GmrMQaV4PXRs+tZcq6EFw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code@2.11.0': - resolution: {integrity: sha512-2roNZxcny1bGjyZ8x6VmGTuKbwfJyTZ1hiqPc/CRTQ1u42yOhbjF4ziA5kfyUoQlzygZrWH9LR5IMYGzPQ1N3w==} + '@tiptap/extension-code@2.11.2': + resolution: {integrity: sha512-G8vvb17QAYQij3haz9RoDvArK1LSOZHqGzQ2dJ3/d0W5oqOyUrTnseN66fRZjWhBT3pns0VL2erwe/NBIqLOIw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-color@2.11.0': - resolution: {integrity: sha512-9dO6zr7Zzz7vvJAct+IGHvYpV6pHcNyifLjmXNdJdKY118lnoeQfu1dsxiPGl9KXCv5bHgn4dUg3CsrnAlb9OQ==} + '@tiptap/extension-color@2.11.2': + resolution: {integrity: sha512-KUfASlEXrZeioBeSnpQWmCIiWtVaHDXJ+ZD0giSGSTQ4JwqdsIYZd8HpUrQjsfTkrqxW13zxQ1VklfvSPM8PQA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/extension-text-style': ^2.7.0 - '@tiptap/extension-document@2.11.0': - resolution: {integrity: sha512-9YI0AT3mxyUZD7NHECHyV1uAjQ8KwxOS5ACwvrK1MU8TqY084LmodYNTXPKwpqbr51yvt3qZq1R7UIVu4/22Cg==} + '@tiptap/extension-document@2.11.2': + resolution: {integrity: sha512-/EZhIAN1x7DYgGM0xv7y7wo5ceBmHb0+rOIPuBerVFeTn+VcC3tST/Q64bdvcxgNe2E59Ti0CUdYEA51wc2u5Q==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-dropcursor@2.11.0': - resolution: {integrity: sha512-p7tUtlz7KzBa+06+7W2LJ8AEiHG5chdnUIapojZ7SqQCrFRVw70R+orpkzkoictxNNHsun0A9FCUy4rz8L0+nQ==} + '@tiptap/extension-dropcursor@2.11.2': + resolution: {integrity: sha512-HbXC9cMVZUY3kyKwbDtVH452CY1qlyLbIvTaN0+dxkFgcVeQZZtfIxU7DwMmqCDmDnsh0CdDqUgUvcXS2UQTwA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-floating-menu@2.11.0': - resolution: {integrity: sha512-dexhhUJm0x9OolbeVCa7RpxuALU3bJZC7dFpu/rPG3ZetXKhVw8hTrqUQD5w1DjXpczBzScnLgLrvnjxbG66pw==} + '@tiptap/extension-floating-menu@2.11.2': + resolution: {integrity: sha512-DoFGgguE24rxPkZTD7sH3GFi9E3JKQGeGw0sFTwXx1ZFnyCtqbLcPOfT4THlvUEcixt68Mk48M1NTFVOGn/dyA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-gapcursor@2.11.0': - resolution: {integrity: sha512-1TVOthPkUYwTQnQwP0BzuIHVz09epOiXJQ3GqgNZsmTehwcMzz2vGCpx1JXhZ5DoMaREHNLCdraXb1n2FdhDNA==} + '@tiptap/extension-gapcursor@2.11.2': + resolution: {integrity: sha512-ssJOrcc8dzlo5/Qq3+EixASDHTj3mqCyAv7Ohed1QYEYr+TsSpsTbjR0eMLjWHlgbt24TXL2Wr0ldjYCU8T1ZA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.11.0': - resolution: {integrity: sha512-7pMgPNk2FnPT0LcWaWNNxOLK3LQnRSYFgrdBGMXec3sy+y3Lit3hM+EZhbZcHpTIQTbWWs+eskh1waRMIt0ZaQ==} + '@tiptap/extension-hard-break@2.11.2': + resolution: {integrity: sha512-FNcXemfuwkiP4drZ9m90BC6GD4nyikfYHYEUyYuVd74Mm6w5vXpueWXus3mUcdT78xTs1XpQVibDorilLu7X8w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-heading@2.11.0': - resolution: {integrity: sha512-vrYvxibsY7/Sd2wYQDZ8AfIORfFi/UHZAWI7JmaMtDkILuMLYQ+jXb7p4K2FFW/1nN7C8QqgLLFI5AfjZUusgw==} + '@tiptap/extension-heading@2.11.2': + resolution: {integrity: sha512-y/wAEXYB0a8y5WmSYGCIXAhus1ydudn0pokKIzT/OD00XutAVh14qOB5h/+m8iXwGU/UYMP7SUCtK82txZqwKA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-highlight@2.11.0': - resolution: {integrity: sha512-+szogL1ux8HMOuIn+TyB5PNhS0mdy4so5ejT2KAMtdZioPNS3Awj1FypimrXJV1kDjaN6LHRkF+w8/bV0qX4hA==} + '@tiptap/extension-highlight@2.11.2': + resolution: {integrity: sha512-ztq2lGthTIY/zPYtdYrG7+0dc4R4abkZqDVAmLxkFcwjs/mejq7nMG7WM2Unn2cIGo96m8Ibz/UtoOPJDt/+/Q==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-history@2.11.0': - resolution: {integrity: sha512-eEUEDoOtS17AHVEPbGfZ+x2L5A87SiIsppWYTkpfIH/8EnVQmzu+3i1tcT9cWvHC31d9JTG7TDptVuuHr30TJw==} + '@tiptap/extension-history@2.11.2': + resolution: {integrity: sha512-BamS6YjKsETgP7msmm0oIpqmNSLJWbivm3XurR3uSUqJZYrQo1Fv+No4HAR7eAACxoOnYGcDmYsrombRVs9lxw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-horizontal-rule@2.11.0': - resolution: {integrity: sha512-ZbkILwmcccmwQB2VTA/dzHRMB+xoJQ8UJdafcUiaAUlQfvDgl898+AYMa2GRTZkLPvzCKjXMC9hybSyy54Lz3Q==} + '@tiptap/extension-horizontal-rule@2.11.2': + resolution: {integrity: sha512-R7MkTQzxkBy0bXJfq6L+6ax01/hmTEUvPPoyjwDSfU1Ktc1ihBJGUdTNtohT1KoQGQYt2d9khBohVspsXoCmFw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-image@2.11.0': - resolution: {integrity: sha512-R+JkK5ocX35ag1c42aAw6rcb9QlLUBB0ju8A7b+8qZXN5yWKE0yO/oixYFmnZN7WSnBYtzuCVDX8cvRG+BPbgA==} + '@tiptap/extension-image@2.11.2': + resolution: {integrity: sha512-Ag+Arj6sclTqhvR+v5I2UD5e2lsWTcXLj0aS2aEsfGpytltk6rcLj6iDjx/SmJrE1BN8ognJsdzmFdZF/rNLpg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-italic@2.11.0': - resolution: {integrity: sha512-T+jjS0gOsvNzQXVTSArmUp/kt2R9OikPQaV1DI60bfjO0rknOgtG0tbwZmfbugzwc07RbpxOYFy3vBxMLDsksA==} + '@tiptap/extension-italic@2.11.2': + resolution: {integrity: sha512-652oTa+iDiR7sMtmePSy+303HSNJxvxmV/6IvQoMdffJU0oPiWcWnCCL0qrWgtHh15dplj36EtB/znENWbvVOw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-link@2.11.0': - resolution: {integrity: sha512-hvJSj0Ul4h8uxivtFtqaSy08s9G3smaW0He0ybYJ7rcJIsZ1zSrxQLGvIr/J8/yUq8VoVNspNR5cGUoyQaaw4A==} + '@tiptap/extension-link@2.11.2': + resolution: {integrity: sha512-Mbre+JotLMUg9jdWWrwIReiRVMkA2kMzmtD2Aqy/n5P+wuI84898qIZSkhPEzDOGzp0mluUO/iGsz0NdTto/JQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-list-item@2.11.0': - resolution: {integrity: sha512-Jikcg0fccpM13a3hAFLtguMcpVg4eMWI8NnC0aUULD9rFhvWZQYQYQuoK3fO6vQrAQpNhsV4oa0dfSq1btu9kg==} + '@tiptap/extension-list-item@2.11.2': + resolution: {integrity: sha512-cxysDCvw45bem53qLZtTCkle1pttO4Y/FGqYm1hl66ol3cZsuLbjpOb4aDB6wRhyd701Ws6MjOYM+cZsmtTNpw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-ordered-list@2.11.0': - resolution: {integrity: sha512-i6pNsDHA2QvBAebwjAuvhHKwz+bZVJ929PCIJaN8mxg0ldiAmFbAsf+rwIIFHWogMp+5xEX2RBzux20usNVZ9w==} + '@tiptap/extension-ordered-list@2.11.2': + resolution: {integrity: sha512-TR8OqwKkQ0OCp40V9hcRJUcO1PSzCYWXy0mvW351lOYO8D6uE+1ouVkEV9qjXBC30sVCnQykSp/FR9UjsIuiVw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-paragraph@2.11.0': - resolution: {integrity: sha512-xLNC05An3SQq0bVHJtOTLa8As5r6NxDZFpK0NZqO2hTq/fAIRL/9VPeZ8E0tziXULwIvIPp+L0Taw3TvaUkRUg==} + '@tiptap/extension-paragraph@2.11.2': + resolution: {integrity: sha512-iydTjeZbPJuqctOaAx7QebLPvz9J/hBxPptuhe4GZmqInknAk7+SFJagYeGNb14wfXKOvDZ9DMqv6mBiqSA90Q==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-strike@2.11.0': - resolution: {integrity: sha512-71i2IZT58kY2ohlhyO+ucyAioNNCkNkuPkrVERc9lXhmcCKOff5y6ekDHQHO2jNjnejkVE5ibyDO3Z7RUXjh1A==} + '@tiptap/extension-strike@2.11.2': + resolution: {integrity: sha512-n/rznmhqFlENGSlFY9t3pWnWzSmvDpUj3sjVhdpYteis+OCzabN9+c5KdQTBPMjtwRuRleQiKWnHmxvif0heEg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table-cell@2.11.0': - resolution: {integrity: sha512-05lXXaGPWzVi/mVYRzsiLbaZ1VVU42buCkoTZrduvJsGEu6K+Cut2fqo7I29CJmJ0P/hDSyMEJDKqdKSP9xalA==} + '@tiptap/extension-table-cell@2.11.2': + resolution: {integrity: sha512-m//QPQ/GN4mMuj2/PcT2HmUGF3bFk41zN3hDcOmfrszClsmcEVIViApVr7U6HqlIq4TFAFDLXtIK79FW9ByIDg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table-header@2.11.0': - resolution: {integrity: sha512-pOKz1E7VT9v37psA0lFJ0mcj2DAa/KNqNqO3TGOUnNOYaN+/6w01i6tA7rAinULsxaFTZx5x1BGLMqonc6n0fw==} + '@tiptap/extension-table-header@2.11.2': + resolution: {integrity: sha512-y2MCki8jZWT/cM4eG/3sPwUvtsj5d/+7RibbhjWnz1u42XyPoHKTZr9ZqUOAJ67vwB8LF8n8qb7D1YDqvDyA9Q==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table-row@2.11.0': - resolution: {integrity: sha512-j+o5Lr1JynSWcd/NN+4mNELvcVwj6CxcNT3J37oc5uy0a6CBhHlmp1d9eEbEnk95tMEsibunVV73wRqE150nEw==} + '@tiptap/extension-table-row@2.11.2': + resolution: {integrity: sha512-8eCWoaijS6JD0gJOsqg8BhcTNW6I1uvq6JwnAnpv3lznHj19Q5mevC7ixuFRe9Wk/qiYZaCBXk6NcpzaqB8o/g==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table@2.11.0': - resolution: {integrity: sha512-RH9pw2L2eilFjQxEGaWdk7929rm4NLxCs/aXuFVY+zL3ZHzHovsMDM5SZiyk4pTnVpE2Bj8+NcDZ8r/zMcvYIA==} + '@tiptap/extension-table@2.11.2': + resolution: {integrity: sha512-s3pVORRDrm1AHuENhvuONpI4KtLLGJbg8QLxO/a7qeScAjHR0V9lOqdpweNfPgiMwj5zMV45tGF/tweM4x2fJQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-task-item@2.11.0': - resolution: {integrity: sha512-qu6VuRc8qF80Bwr82CItFcrKtC67LJkwpxESLEIi42zWZ5sXF/3DJEPPS/4Kk+nAc9UCBoEMFAULibPq7rRl/w==} + '@tiptap/extension-task-item@2.11.2': + resolution: {integrity: sha512-TvEfOq81lg7QcaP6VLolSEFQVoop4v0PxWZuzmtpOSywrdelPtLE0PuStfu0FIJIrw1V7axEwoapPCaVwTM8Mg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-task-list@2.11.0': - resolution: {integrity: sha512-+dZRjeXLXxyliFt3J7uQADxfOwi6ntyepVM+ri1rnmIaqVZUHJbUFodOc0LivI+Z5iZZ10u3TId8gehqWJHD+w==} + '@tiptap/extension-task-list@2.11.2': + resolution: {integrity: sha512-Wy4EYZQJqt/Z6oTlZ+RvaPrDivkyyVuca5cOwcGavrFsUtqvEv/QKxvAl59fsRgofYW6QsfK72K2GpppBBlVUw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-align@2.11.0': - resolution: {integrity: sha512-VRXBqO17po6ddqhoWLBa2aCX/tqHdzdKPLfjnBy1fF8hjQKbidzjMWhb4CMm31ApvJjKK/DTkM3EnyYS/XDhng==} + '@tiptap/extension-text-align@2.11.2': + resolution: {integrity: sha512-0QfjepmK+iHubjTsJshuhSZvF54M+vaqpReDraf9NKVx+WkiZ+mxJX4S5nZwoFsp21sEz7Q7z03+uXgb/yj7mQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-style@2.11.0': - resolution: {integrity: sha512-vuA16wMZ6J3fboL7FObwV2f5uN9Vg0WYmqU7971vxzJyaRj9VE1eeH8Kh5fq4RgwDzc13MZGvZZV4HcE1R8o8A==} + '@tiptap/extension-text-style@2.11.2': + resolution: {integrity: sha512-RAa7BTwEOJRZN3EB2lg03KXyu7JC/Ce96cerh3D0Fo78yrtKOArPaiVHoTki6ZEIG43ccHEit1PPjMYxivPPeg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text@2.11.0': - resolution: {integrity: sha512-LcyrP+7ZEVx3YaKzjMAeujq+4xRt4mZ3ITGph2CQ4vOKFaMI8bzSR909q18t7Qyyvek0a9VydEU1NHSaq4G5jw==} + '@tiptap/extension-text@2.11.2': + resolution: {integrity: sha512-fJZeKYM5jeJ7NpS3FWLnC/NAvg+mZNbcTaRgXMo5ljBCgiMcYHhYg9p/RHk4SeICZBBpR9WSSZXHMACd9CbJiA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-underline@2.11.0': - resolution: {integrity: sha512-DE1piq441y1+9Aj1pvvuq1dcc5B2HZ2d1SPtO4DTMjCxrhok12biTkMxxq0q1dzA5/BouLlUW6WTPpinhmrUWA==} + '@tiptap/extension-underline@2.11.2': + resolution: {integrity: sha512-Gq7hfV3D/3E1zoE6JXSYZ3boKfbjebFu7IuQZ6w6QSS/IkGN8c6kW+WtkhOKN3jV7Z5uF5KIVp3XCqNIwChWNQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/pm@2.11.0': - resolution: {integrity: sha512-4RU6bpODkMY+ZshzdRFcuUc5jWlMW82LWXR6UOsHK/X/Mav41ZFS0Cyf+hQM6gxxTB09YFIICmGpEpULb+/CuA==} + '@tiptap/pm@2.11.2': + resolution: {integrity: sha512-lNOMFRcD0mGy7Hf8tFMHW/fnglvq3dA0grs0QrSY4cHyYbH9BHtQjLMDceczXdXbXZq7nEqC40UBWNnqtaclpw==} - '@tiptap/react@2.11.0': - resolution: {integrity: sha512-AALzHbqNq/gerJpkbXmN2OXFmHAs2bQENH7rXbnH70bpxVdIfQVtvjK4dIb+cQQvAuTWZvhsISnTrFY2BesT3Q==} + '@tiptap/react@2.11.2': + resolution: {integrity: sha512-fhrfgXQwyc34L6ju+zzNGMa6J94+W20yww0BHyrqojUzjpYskVdO7/37h4OBfFGEhrAhLEXXDxRZcrNPtBf86A==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.11.0': - resolution: {integrity: sha512-lrYmkeaAFiuUjN5nGnCowdjponrsR7eRmeTf/15/5oZsNrMN7t/fvPb014AqhG/anNasa0ism4CKZns3D+4pKQ==} + '@tiptap/starter-kit@2.11.2': + resolution: {integrity: sha512-FUIblP9BSmBzskf/aX7AIcUK5XP5Gi/VqUqm5evCkzlR1FrggLoy+vY+CX0me4oE/WYk4KAgIRXkE9tcbwotQA==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trpc/client@11.0.0-rc.682': - resolution: {integrity: sha512-zfM6t4tkbQPm/FHK85jcJjJle7FJTj9U8t/ieDzIe3X6DNo66sg6KqQpjkeTJcaj5u2hga1lmv3rc4uob/7D0g==} + '@trpc/client@11.0.0-rc.694': + resolution: {integrity: sha512-e3HwqeNT1VkIn1juC8dwY2a/gWuSWZw6jbYGzVInib45LuIhUKA0Bokky1KRbDGCnwC4Ii2l3wa1Zgd3Fy0/qA==} peerDependencies: - '@trpc/server': 11.0.0-rc.682+8650a22e8 + '@trpc/server': 11.0.0-rc.694+3d80a2221 typescript: '>=5.7.2' - '@trpc/next@11.0.0-rc.682': - resolution: {integrity: sha512-3LhlwyZiVEMTBKfpxSbD00Ea/uuW9vfTmlFpKRbuU22BBkcW/QNtfcHWL5QtyDHnr8/SIvReTJQ+BfDnqNUSLA==} + '@trpc/next@11.0.0-rc.694': + resolution: {integrity: sha512-HlFgcS0UyCbkQPUNBMZKvLjFWmGQZhQszbp6JUJRLLEPe4sSpDThyq4hyPI99a2B/OwaUeBvL9HqcRRekbNniw==} peerDependencies: '@tanstack/react-query': ^5.59.15 - '@trpc/client': 11.0.0-rc.682+8650a22e8 - '@trpc/react-query': 11.0.0-rc.682+8650a22e8 - '@trpc/server': 11.0.0-rc.682+8650a22e8 + '@trpc/client': 11.0.0-rc.694+3d80a2221 + '@trpc/react-query': 11.0.0-rc.694+3d80a2221 + '@trpc/server': 11.0.0-rc.694+3d80a2221 next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' @@ -3920,18 +4159,18 @@ packages: '@trpc/react-query': optional: true - '@trpc/react-query@11.0.0-rc.682': - resolution: {integrity: sha512-Ghuk7e7jGRvxOD32X/ImGZTqERZ3R03vaPVzfmdWnBeTyOeqBr0Tb8ylTVyCclqBHpTrRhdM3pWlaXR4M/LKDg==} + '@trpc/react-query@11.0.0-rc.694': + resolution: {integrity: sha512-P9611TGBIyO5UQUG7EyrJ7QA0lS+zgdvpO1PAyypPcxHfByRhJ6baM9Y1XIVqENSgAj94WtW5tNRAOjYYABNAA==} peerDependencies: '@tanstack/react-query': ^5.62.8 - '@trpc/client': 11.0.0-rc.682+8650a22e8 - '@trpc/server': 11.0.0-rc.682+8650a22e8 + '@trpc/client': 11.0.0-rc.694+3d80a2221 + '@trpc/server': 11.0.0-rc.694+3d80a2221 react: '>=18.2.0' react-dom: '>=18.2.0' typescript: '>=5.7.2' - '@trpc/server@11.0.0-rc.682': - resolution: {integrity: sha512-y8FhLW/UJ8SOyHByvSQW7WvCnbvYioOYhviWD+sRvqkB9f0O8/sEBPJt1mBadWaO/0tygOghkeNC9o1wAsJ8cg==} + '@trpc/server@11.0.0-rc.694': + resolution: {integrity: sha512-LkgryLrKHWP0bk7uFPDeZuUKMP3o7zXx9hzTZbIK263ZARV41urPVFciwBv0cvASRc4ylKJYqiic71+Xv+awSg==} peerDependencies: typescript: '>=5.7.2' @@ -3988,8 +4227,8 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - '@types/chroma-js@2.4.5': - resolution: {integrity: sha512-6ISjhzJViaPCy2q2e6PgK+8HcHQDQ0V2LDiKmYAh+jJlLqDa6HbwDh0wOevHY0kHHUx0iZwjSRbVD47WOUx5EQ==} + '@types/chroma-js@3.1.0': + resolution: {integrity: sha512-Uwl3SOtUkbQ6Ye6ZYu4q4xdLGBzmY839sEHYtOT7i691neeyd+7fXWT5VIkcUSfNwIFrIjQutNYQn9h4q5HFvg==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -4015,8 +4254,8 @@ packages: '@types/docker-modem@3.0.6': resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} - '@types/dockerode@3.3.33': - resolution: {integrity: sha512-7av8lVOhkW7Xd11aZTSq5zhdpyNraldXwQR0pxUCiSNTvIzsP86KrFrmrZgxtrXD2Zrtzwt4H6OYLbATONWzWg==} + '@types/dockerode@3.3.34': + resolution: {integrity: sha512-mH9SuIb8NuTDsMus5epcbTzSbEo52fKLBMo0zapzYIAIyfDqoIFn7L3trekHLKC8qmxGV++pPUP4YqQ9n5v2Zg==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -4081,9 +4320,6 @@ packages: '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - '@types/qs@6.9.16': resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} @@ -4098,11 +4334,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@18.3.13': - resolution: {integrity: sha512-ii/gswMmOievxAJed4PAHT949bpYjPKXvXo1v6cRB/kqc2ZR4n+SgyCyvyc5Fec5ez8VnUumI1Vk7j6fRyRogg==} - - '@types/react@19.0.2': - resolution: {integrity: sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==} + '@types/react@19.0.4': + resolution: {integrity: sha512-3O4QisJDYr1uTUMZHA2YswiQZRq+Pd8D+GdVFYikTutYsTz+QZgWkAPnP7rx9txoI6EXKcPiluMqWPFV3tT9Wg==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -4152,51 +4385,51 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.19.0': - resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} + '@typescript-eslint/eslint-plugin@8.19.1': + resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.19.0': - resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} + '@typescript-eslint/parser@8.19.1': + resolution: {integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.19.0': - resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} + '@typescript-eslint/scope-manager@8.19.1': + resolution: {integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.19.0': - resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} + '@typescript-eslint/type-utils@8.19.1': + resolution: {integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.19.0': - resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} + '@typescript-eslint/types@8.19.1': + resolution: {integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.19.0': - resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} + '@typescript-eslint/typescript-estree@8.19.1': + resolution: {integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.19.0': - resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} + '@typescript-eslint/utils@8.19.1': + resolution: {integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.19.0': - resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} + '@typescript-eslint/visitor-keys@8.19.1': + resolution: {integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.4.0': @@ -4384,6 +4617,10 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -4626,8 +4863,8 @@ packages: resolution: {integrity: sha512-Wjss+Bc674ZABPr+SCKWTqA4V1pyYFhzDTjNBJy4jdmgOv0oGIGXeKBRJyINwP5tIy+iIZD9SfgZpztduzQ5QA==} engines: {node: '>= 18.4'} - better-sqlite3@11.7.0: - resolution: {integrity: sha512-mXpa5jnIKKHeoGzBrUJrc65cXFKcILGZpU3FXR0pradUEm9MA7UZz02qfEejaMcm9iXrSOCenwwYMJ/tZ1y5Ig==} + better-sqlite3@11.7.2: + resolution: {integrity: sha512-10a57cHVDmfNQS4jrZ9AH2t+2ekzYh5Rhbcnb4ytpmYweoLdogDmyTt5D+hLiY9b44Mx9foowb/4iXBTO2yP3Q==} big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -4884,6 +5121,10 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorspace@1.1.4: resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} @@ -5061,8 +5302,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@4.1.0: - resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + cssstyle@4.2.1: + resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} engines: {node: '>=18'} csstype@3.1.3: @@ -5238,16 +5479,16 @@ packages: resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} engines: {node: '>= 8.0'} - docker-modem@5.0.3: - resolution: {integrity: sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==} + docker-modem@5.0.5: + resolution: {integrity: sha512-Cxw8uEcvNTRmsQuGqzzfiCnfGgf96tVJItLh8taOX0miTcIBALKH5TckCSuZbpbjP7uhAl81dOL9sxfa6HgCIg==} engines: {node: '>= 8.0'} dockerode@3.3.5: resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} engines: {node: '>= 8.0'} - dockerode@4.0.2: - resolution: {integrity: sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==} + dockerode@4.0.3: + resolution: {integrity: sha512-QSXJFcBQNaGZO6U3qWW4B7p8yRIJn/dWmvL2AQWfO/bjptBBO6QYdVkYSYFz9qoivP2jsOHZfmXMAfrK0BMKyg==} engines: {node: '>= 8.0'} doctrine@2.1.0: @@ -5723,12 +5964,19 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5850,6 +6098,10 @@ packages: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -5990,17 +6242,12 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} engines: {node: 20 || >=22} hasBin: true @@ -6171,6 +6418,10 @@ packages: resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -6579,10 +6830,6 @@ packages: resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} engines: {node: '>= 0.4'} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -6632,11 +6879,11 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsdom@25.0.1: - resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + jsdom@26.0.0: + resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==} engines: {node: '>=18'} peerDependencies: - canvas: ^2.11.2 + canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true @@ -6706,8 +6953,8 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} - ldapts@7.3.0: - resolution: {integrity: sha512-hj+cOy50uwu496x66IrqeY0WY35pMnkKrOgdYtZFu0uii4Xzw39Wng1hgzmGYWmzK9On4jYiiYyz1ZdVc857XA==} + ldapts@7.3.1: + resolution: {integrity: sha512-g8mxobOSeuxVkXRT9JZBGUvfDjXIpQPEHH5kYG9UjrIlWV5Rqxq+MMmqzlSh4OqSXh+3lFvzyYu+lsJldoZvvA==} engines: {node: '>=18'} levn@0.4.1: @@ -6746,6 +6993,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.capitalize@4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} @@ -6816,8 +7066,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.0.1: - resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6851,8 +7101,8 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - mantine-react-table@2.0.0-beta.7: - resolution: {integrity: sha512-jpM3hXLL+DHURmm1AJ2uOyxu3xiZvlzS7NOtDh5qHo2AIv9zEEkXK/mrvKmRvXJ0O8pVPHLuYKAel9RBY5NfUA==} + mantine-react-table@2.0.0-beta.8: + resolution: {integrity: sha512-3Ey0jbLtqcN89n24kDRiOeYwhR5zcfHzzCz7KOip5fXvvrtn6N7vj+Fw2jYFFbPQr7TLzBviSSQkPcVyQbs+/w==} engines: {node: '>=16'} peerDependencies: '@mantine/core': ^7.9 @@ -7092,21 +7342,24 @@ packages: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - next@14.2.22: - resolution: {integrity: sha512-Ps2caobQ9hlEhscLPiPm3J3SYhfwfpMqzsoCMZGWxt9jBRK9hoBZj2A37i8joKhsyth2EuVKDVJCTF5/H4iEDw==} - engines: {node: '>=18.17.0'} + next@15.1.4: + resolution: {integrity: sha512-mTaq9dwaSuwwOrcu3ebjDYObekkxRnXpuVL21zotM8qE2W0HBOdVIdg2Li9QjMEZrj73LN96LcWcz62V19FjAg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true '@playwright/test': optional: true + babel-plugin-react-compiler: + optional: true sass: optional: true @@ -7285,8 +7538,8 @@ packages: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} oauth4webapi@3.0.0: resolution: {integrity: sha512-Rw9SxQYuQX9J41VgM4rVNGtm1ng0Qcd8ndv7JmhmwqQ3hHBokX+WjV379IJhKk7bVPHefgvrDgHoO/rB2dY7YA==} @@ -7338,8 +7591,8 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - octokit@4.0.3: - resolution: {integrity: sha512-kfqH80Yuuux4fLbZ4SvObjCvVu89U0eCh5+fulh6tr/hJkDYS1inXDGnNJDOp312GANMEhWWMLYmjQR8MvSSMQ==} + octokit@4.1.0: + resolution: {integrity: sha512-/UrQAOSvkc+lUUWKNzy4ByAgYU9KpFzZQt8DnC962YmQuDiZb1SNJ90YukCCK5aMzKqqCA+z1kkAlmzYvdYKag==} engines: {node: '>= 18'} ofetch@1.4.1: @@ -7493,8 +7746,8 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} pascal-case@2.0.1: resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} @@ -7783,6 +8036,10 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} @@ -7891,11 +8148,11 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-number-format@5.4.2: - resolution: {integrity: sha512-cg//jVdS49PYDgmcYoBnMMHl4XNTMuV723ZnHD2aXYtWWWqbVF3hjQ8iB+UZEuXapLbeA8P8H+1o6ZB1lcw3vg==} + react-number-format@5.4.3: + resolution: {integrity: sha512-VCY5hFg/soBighAoGcdE+GagkJq0230qN6jcS5sp8wQX1qy1fYN/RX7/BXkrs0oyzzwqR8/+eSUrqXbGeywdUQ==} peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-redux@9.1.2: resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} @@ -7913,22 +8170,22 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.6: - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - react-remove-scroll@2.6.0: - resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + react-remove-scroll@2.6.2: + resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -7953,6 +8210,16 @@ packages: '@types/react': optional: true + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-syntax-highlighter@15.5.0: resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} peerDependencies: @@ -8133,8 +8400,8 @@ packages: rrdom@0.1.7: resolution: {integrity: sha512-ZLd8f14z9pUy2Hk9y636cNv5Y2BMnNEY99wxzW9tD2BLDfe1xFxtLjB4q/xCBYo6HRe0wofzKzjm4JojmpBfFw==} - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} rrweb-player@1.0.0-alpha.4: resolution: {integrity: sha512-Wlmn9GZ5Fdqa37vd3TzsYdLl/JWEvXNUrLCrYpnOwEgmY409HwVIvvA5aIo7k582LoKgdRCsB87N+f0oWAR0Kg==} @@ -8191,8 +8458,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.83.0: - resolution: {integrity: sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==} + sass@1.83.1: + resolution: {integrity: sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==} engines: {node: '>=14.0.0'} hasBin: true @@ -8275,6 +8542,10 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -8545,13 +8816,13 @@ packages: strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' peerDependenciesMeta: '@babel/core': optional: true @@ -8803,18 +9074,18 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - trpc-to-openapi@2.1.1: - resolution: {integrity: sha512-61VvDOSLHk7+vZnjswvD4yPThvCo+4ymZ2NbOqYQPbkbr5qRyyfVPdBV5YaJCUcCsIzxxgjq46DELxKYXlM6uA==} + trpc-to-openapi@2.1.2: + resolution: {integrity: sha512-v6GmrXchDdHUGtPz0foviSYZBkNQePmZF4fvnw8TPhdyDFdiMpVHbkz8QNIWVeqPOG6qKAyCVAvXTO+14/dHWw==} peerDependencies: '@trpc/server': ^11.0.0-rc.648 zod: ^3.23.8 zod-openapi: ^4.1.0 - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} @@ -8855,6 +9126,9 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} @@ -8924,10 +9198,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.28.0: - resolution: {integrity: sha512-jXMwges/FVbFRe5lTMJZVEZCrO9kI9c8k0PA/z7nF3bo0JSCCLysvokFjNPIUK/itEMas10MQM+AiHoHt/T/XA==} - engines: {node: '>=16'} - type-fest@4.30.2: resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} engines: {node: '>=16'} @@ -8974,15 +9244,15 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript-eslint@8.19.0: - resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==} + typescript-eslint@8.19.1: + resolution: {integrity: sha512-LKPUQpdEMVOeKluHi8md7rwLcoXHhwvWp3x+sJkMuq3gGm9yaYJtPo8sRZSblMFJ5pcOGCAak/scKf1mvZDlQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -9021,8 +9291,8 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - undici@7.2.0: - resolution: {integrity: sha512-klt+0S55GBViA9nsq48/NSCo4YX5mjydjypxD7UmHh/brMu8h/Mhd/F7qAeoH2NOO8SDTk6kjnTFc4WpzmfYpQ==} + undici@7.2.1: + resolution: {integrity: sha512-U2k0XHLJfaciARRxDcqTk2AZQsGXerHzdvfCZcy1hNhSf5KCAF4jIQQxL+apQviOekhRFPqED6Of5/+LcUSLzQ==} engines: {node: '>=20.18.1'} unenv@1.10.0: @@ -9106,12 +9376,12 @@ packages: url-toolkit@2.2.5: resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -9168,8 +9438,12 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.0.3: - resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@11.0.4: + resolution: {integrity: sha512-IzL6VtTTYcAhA/oghbFJ1Dkmqev+FpQWnCBaKq/gUluLxliWvO8DPFWfIviRmYbtaavtSQe4WBL++rFjdcGWEg==} hasBin: true uuid@8.3.2: @@ -9330,10 +9604,6 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} - whatwg-url@14.1.0: resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} engines: {node: '>=18'} @@ -9551,6 +9821,14 @@ snapshots: '@antfu/ni@0.21.12': {} + '@asamuzakjp/css-color@2.8.2': + dependencies: + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + lru-cache: 11.0.2 + '@auth/core@0.37.2': dependencies: '@panva/hkdf': 1.2.1 @@ -9733,6 +10011,26 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@csstools/color-helpers@5.0.1': {} + + '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/color-helpers': 5.0.1 + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-tokenizer@3.0.3': {} + '@ctrl/deluge@7.1.0': dependencies: '@ctrl/magnet-link': 4.0.2 @@ -9811,6 +10109,11 @@ snapshots: '@drizzle-team/brocli@0.11.0': {} + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -10245,30 +10548,42 @@ snapshots: dependencies: '@formatjs/fast-memoize': 2.2.1 '@formatjs/intl-localematcher': 0.5.5 - tslib: 2.7.0 + tslib: 2.8.1 '@formatjs/fast-memoize@2.2.1': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 '@formatjs/icu-messageformat-parser@2.8.0': dependencies: '@formatjs/ecma402-abstract': 2.2.0 '@formatjs/icu-skeleton-parser': 1.8.4 - tslib: 2.7.0 + tslib: 2.8.1 '@formatjs/icu-skeleton-parser@1.8.4': dependencies: '@formatjs/ecma402-abstract': 2.2.0 - tslib: 2.7.0 + tslib: 2.8.1 '@formatjs/intl-localematcher@0.5.5': dependencies: tslib: 2.7.0 + '@grpc/grpc-js@1.12.5': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@hapi/bourne@3.0.0': {} - '@homarr/gridstack@1.11.2': {} + '@homarr/gridstack@1.11.3': {} '@hono/node-server@1.13.0(hono@4.6.1)': dependencies: @@ -10298,6 +10613,81 @@ snapshots: transitivePeerDependencies: - supports-color + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -10342,6 +10732,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@js-sdsl/ordered-map@4.4.2': {} + '@libsql/client-wasm@0.14.0': dependencies: '@libsql/core': 0.14.0 @@ -10353,108 +10745,85 @@ snapshots: js-base64: 3.7.7 optional: true - '@mantine/colors-generator@7.15.2(chroma-js@3.1.2)': + '@mantine/colors-generator@7.15.3(chroma-js@3.1.2)': dependencies: chroma-js: 3.1.2 - '@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) - clsx: 2.1.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-number-format: 5.4.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-remove-scroll: 2.6.0(@types/react@18.3.13)(react@19.0.0) - react-textarea-autosize: 8.5.6(@types/react@18.3.13)(react@19.0.0) - type-fest: 4.28.0 - transitivePeerDependencies: - - '@types/react' - - '@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-number-format: 5.4.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-remove-scroll: 2.6.0(@types/react@19.0.2)(react@19.0.0) - react-textarea-autosize: 8.5.6(@types/react@19.0.2)(react@19.0.0) - type-fest: 4.28.0 + react-number-format: 5.4.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.4)(react@19.0.0) + react-textarea-autosize: 8.5.6(@types/react@19.0.4)(react@19.0.0) + type-fest: 4.30.2 transitivePeerDependencies: - '@types/react' - '@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/dates@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) + '@mantine/core': 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) clsx: 2.1.1 dayjs: 1.11.13 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/dropzone@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) - clsx: 2.1.1 - dayjs: 1.11.13 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@mantine/dropzone@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) + '@mantine/core': 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-dropzone-esm: 15.2.0(react@19.0.0) - '@mantine/form@7.15.2(react@19.0.0)': + '@mantine/form@7.15.3(react@19.0.0)': dependencies: fast-deep-equal: 3.1.3 klona: 2.0.6 react: 19.0.0 - '@mantine/hooks@7.15.2(react@19.0.0)': + '@mantine/hooks@7.15.3(react@19.0.0)': dependencies: react: 19.0.0 - '@mantine/modals@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/modals@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) + '@mantine/core': 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mantine/notifications@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/notifications@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) - '@mantine/store': 7.15.2(react@19.0.0) + '@mantine/core': 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) + '@mantine/store': 7.15.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/spotlight@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/spotlight@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) - '@mantine/store': 7.15.2(react@19.0.0) + '@mantine/core': 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) + '@mantine/store': 7.15.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mantine/store@7.15.2(react@19.0.0)': + '@mantine/store@7.15.3(react@19.0.0)': dependencies: react: 19.0.0 - '@mantine/tiptap@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tiptap/extension-link@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0))(@tiptap/react@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/tiptap@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(@tiptap/extension-link@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2))(@tiptap/react@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) - '@tiptap/extension-link': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/react': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/core': 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) + '@tiptap/extension-link': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/react': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -10526,37 +10895,34 @@ snapshots: - utf-8-validate - webpack-sources - '@next/env@14.2.22': {} + '@next/env@15.1.4': {} - '@next/eslint-plugin-next@14.2.22': + '@next/eslint-plugin-next@15.1.4': dependencies: - glob: 10.3.10 - - '@next/swc-darwin-arm64@14.2.22': - optional: true + fast-glob: 3.3.1 - '@next/swc-darwin-x64@14.2.22': + '@next/swc-darwin-arm64@15.1.4': optional: true - '@next/swc-linux-arm64-gnu@14.2.22': + '@next/swc-darwin-x64@15.1.4': optional: true - '@next/swc-linux-arm64-musl@14.2.22': + '@next/swc-linux-arm64-gnu@15.1.4': optional: true - '@next/swc-linux-x64-gnu@14.2.22': + '@next/swc-linux-arm64-musl@15.1.4': optional: true - '@next/swc-linux-x64-musl@14.2.22': + '@next/swc-linux-x64-gnu@15.1.4': optional: true - '@next/swc-win32-arm64-msvc@14.2.22': + '@next/swc-linux-x64-musl@15.1.4': optional: true - '@next/swc-win32-ia32-msvc@14.2.22': + '@next/swc-win32-arm64-msvc@15.1.4': optional: true - '@next/swc-win32-x64-msvc@14.2.22': + '@next/swc-win32-x64-msvc@15.1.4': optional: true '@noble/hashes@1.5.0': {} @@ -10573,56 +10939,56 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@octokit/app@15.1.1': + '@octokit/app@15.1.2': dependencies: - '@octokit/auth-app': 7.1.3 - '@octokit/auth-unauthenticated': 6.1.0 - '@octokit/core': 6.1.2 - '@octokit/oauth-app': 7.1.3 - '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) - '@octokit/types': 13.6.2 - '@octokit/webhooks': 13.4.1 + '@octokit/auth-app': 7.1.4 + '@octokit/auth-unauthenticated': 6.1.1 + '@octokit/core': 6.1.3 + '@octokit/oauth-app': 7.1.5 + '@octokit/plugin-paginate-rest': 11.4.0(@octokit/core@6.1.3) + '@octokit/types': 13.7.0 + '@octokit/webhooks': 13.4.2 - '@octokit/auth-app@7.1.3': + '@octokit/auth-app@7.1.4': dependencies: - '@octokit/auth-oauth-app': 8.1.1 - '@octokit/auth-oauth-user': 5.1.1 - '@octokit/request': 9.1.3 - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.2 + '@octokit/auth-oauth-app': 8.1.2 + '@octokit/auth-oauth-user': 5.1.2 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 toad-cache: 3.7.0 universal-github-app-jwt: 2.2.0 universal-user-agent: 7.0.2 - '@octokit/auth-oauth-app@8.1.1': + '@octokit/auth-oauth-app@8.1.2': dependencies: - '@octokit/auth-oauth-device': 7.1.1 - '@octokit/auth-oauth-user': 5.1.1 - '@octokit/request': 9.1.3 - '@octokit/types': 13.6.2 + '@octokit/auth-oauth-device': 7.1.2 + '@octokit/auth-oauth-user': 5.1.2 + '@octokit/request': 9.1.4 + '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 - '@octokit/auth-oauth-device@7.1.1': + '@octokit/auth-oauth-device@7.1.2': dependencies: - '@octokit/oauth-methods': 5.1.2 - '@octokit/request': 9.1.3 - '@octokit/types': 13.6.2 + '@octokit/oauth-methods': 5.1.3 + '@octokit/request': 9.1.4 + '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 - '@octokit/auth-oauth-user@5.1.1': + '@octokit/auth-oauth-user@5.1.2': dependencies: - '@octokit/auth-oauth-device': 7.1.1 - '@octokit/oauth-methods': 5.1.2 - '@octokit/request': 9.1.3 - '@octokit/types': 13.6.2 + '@octokit/auth-oauth-device': 7.1.2 + '@octokit/oauth-methods': 5.1.3 + '@octokit/request': 9.1.4 + '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 '@octokit/auth-token@5.1.1': {} - '@octokit/auth-unauthenticated@6.1.0': + '@octokit/auth-unauthenticated@6.1.1': dependencies: - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.2 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 '@octokit/core@6.1.2': dependencies: @@ -10634,6 +11000,16 @@ snapshots: before-after-hook: 3.0.2 universal-user-agent: 7.0.2 + '@octokit/core@6.1.3': + dependencies: + '@octokit/auth-token': 5.1.1 + '@octokit/graphql': 8.1.2 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + '@octokit/endpoint@10.1.1': dependencies: '@octokit/types': 13.6.2 @@ -10645,43 +11021,56 @@ snapshots: '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 - '@octokit/oauth-app@7.1.3': + '@octokit/graphql@8.1.2': dependencies: - '@octokit/auth-oauth-app': 8.1.1 - '@octokit/auth-oauth-user': 5.1.1 - '@octokit/auth-unauthenticated': 6.1.0 - '@octokit/core': 6.1.2 + '@octokit/request': 9.1.4 + '@octokit/types': 13.7.0 + universal-user-agent: 7.0.2 + + '@octokit/oauth-app@7.1.5': + dependencies: + '@octokit/auth-oauth-app': 8.1.2 + '@octokit/auth-oauth-user': 5.1.2 + '@octokit/auth-unauthenticated': 6.1.1 + '@octokit/core': 6.1.3 '@octokit/oauth-authorization-url': 7.1.1 - '@octokit/oauth-methods': 5.1.2 + '@octokit/oauth-methods': 5.1.3 '@types/aws-lambda': 8.10.146 universal-user-agent: 7.0.2 '@octokit/oauth-authorization-url@7.1.1': {} - '@octokit/oauth-methods@5.1.2': + '@octokit/oauth-methods@5.1.3': dependencies: '@octokit/oauth-authorization-url': 7.1.1 - '@octokit/request': 9.1.3 - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.2 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 '@octokit/openapi-types@22.2.0': {} + '@octokit/openapi-types@23.0.1': {} + '@octokit/openapi-webhooks-types@8.5.1': {} - '@octokit/plugin-paginate-graphql@5.2.4(@octokit/core@6.1.2)': + '@octokit/plugin-paginate-graphql@5.2.4(@octokit/core@6.1.3)': dependencies: - '@octokit/core': 6.1.2 + '@octokit/core': 6.1.3 '@octokit/plugin-paginate-rest@11.3.6(@octokit/core@6.1.2)': dependencies: '@octokit/core': 6.1.2 '@octokit/types': 13.6.2 - '@octokit/plugin-rest-endpoint-methods@13.2.6(@octokit/core@6.1.2)': + '@octokit/plugin-paginate-rest@11.4.0(@octokit/core@6.1.3)': dependencies: - '@octokit/core': 6.1.2 - '@octokit/types': 13.6.2 + '@octokit/core': 6.1.3 + '@octokit/types': 13.7.0 + + '@octokit/plugin-rest-endpoint-methods@13.3.0(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/types': 13.7.0 '@octokit/plugin-retry@7.1.2(@octokit/core@6.1.2)': dependencies: @@ -10690,16 +11079,33 @@ snapshots: '@octokit/types': 13.6.2 bottleneck: 2.19.5 + '@octokit/plugin-retry@7.1.3(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 + bottleneck: 2.19.5 + '@octokit/plugin-throttling@9.3.2(@octokit/core@6.1.2)': dependencies: '@octokit/core': 6.1.2 '@octokit/types': 13.6.2 bottleneck: 2.19.5 + '@octokit/plugin-throttling@9.4.0(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/types': 13.7.0 + bottleneck: 2.19.5 + '@octokit/request-error@6.1.5': dependencies: '@octokit/types': 13.6.2 + '@octokit/request-error@6.1.6': + dependencies: + '@octokit/types': 13.7.0 + '@octokit/request@9.1.3': dependencies: '@octokit/endpoint': 10.1.1 @@ -10707,16 +11113,28 @@ snapshots: '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 + '@octokit/request@9.1.4': + dependencies: + '@octokit/endpoint': 10.1.1 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.2 + '@octokit/types@13.6.2': dependencies: '@octokit/openapi-types': 22.2.0 + '@octokit/types@13.7.0': + dependencies: + '@octokit/openapi-types': 23.0.1 + '@octokit/webhooks-methods@5.1.0': {} - '@octokit/webhooks@13.4.1': + '@octokit/webhooks@13.4.2': dependencies: '@octokit/openapi-webhooks-types': 8.5.1 - '@octokit/request-error': 6.1.5 + '@octokit/request-error': 6.1.6 '@octokit/webhooks-methods': 5.1.0 '@panva/hkdf@1.2.1': {} @@ -10808,6 +11226,29 @@ snapshots: '@popperjs/core@2.11.8': {} + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@remirror/core-constants@3.0.0': {} '@rollup/pluginutils@5.1.0(rollup@4.21.3)': @@ -10879,15 +11320,15 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@semantic-release/changelog@6.0.3(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/changelog@6.0.3(semantic-release@24.2.1(typescript@5.7.3))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 fs-extra: 11.2.0 lodash: 4.17.21 - semantic-release: 24.2.1(typescript@5.7.2) + semantic-release: 24.2.1(typescript@5.7.3) - '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.1(typescript@5.7.3))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 @@ -10897,7 +11338,7 @@ snapshots: import-from-esm: 2.0.0 lodash-es: 4.17.21 micromatch: 4.0.8 - semantic-release: 24.2.1(typescript@5.7.2) + semantic-release: 24.2.1(typescript@5.7.3) transitivePeerDependencies: - supports-color @@ -10905,7 +11346,7 @@ snapshots: '@semantic-release/error@4.0.0': {} - '@semantic-release/git@10.0.1(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/git@10.0.1(semantic-release@24.2.1(typescript@5.7.3))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 @@ -10915,11 +11356,11 @@ snapshots: lodash: 4.17.21 micromatch: 4.0.8 p-reduce: 2.1.0 - semantic-release: 24.2.1(typescript@5.7.2) + semantic-release: 24.2.1(typescript@5.7.3) transitivePeerDependencies: - supports-color - '@semantic-release/github@11.0.1(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/github@11.0.1(semantic-release@24.2.1(typescript@5.7.3))': dependencies: '@octokit/core': 6.1.2 '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) @@ -10936,12 +11377,12 @@ snapshots: lodash-es: 4.17.21 mime: 4.0.4 p-filter: 4.1.0 - semantic-release: 24.2.1(typescript@5.7.2) + semantic-release: 24.2.1(typescript@5.7.3) url-join: 5.0.0 transitivePeerDependencies: - supports-color - '@semantic-release/npm@12.0.1(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/npm@12.0.1(semantic-release@24.2.1(typescript@5.7.3))': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 @@ -10954,11 +11395,11 @@ snapshots: rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.0.2 - semantic-release: 24.2.1(typescript@5.7.2) + semantic-release: 24.2.1(typescript@5.7.3) semver: 7.6.3 tempy: 3.1.0 - '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.1(typescript@5.7.3))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 @@ -10970,7 +11411,7 @@ snapshots: into-stream: 7.0.0 lodash-es: 4.17.21 read-package-up: 11.0.0 - semantic-release: 24.2.1(typescript@5.7.2) + semantic-release: 24.2.1(typescript@5.7.3) transitivePeerDependencies: - supports-color @@ -11316,54 +11757,53 @@ snapshots: '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.5': + '@swc/helpers@0.5.15': dependencies: - '@swc/counter': 0.1.3 - tslib: 2.7.0 + tslib: 2.8.1 - '@t3-oss/env-core@0.11.1(typescript@5.7.2)(zod@3.24.1)': + '@t3-oss/env-core@0.11.1(typescript@5.7.3)(zod@3.24.1)': dependencies: zod: 3.24.1 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 - '@t3-oss/env-nextjs@0.11.1(typescript@5.7.2)(zod@3.24.1)': + '@t3-oss/env-nextjs@0.11.1(typescript@5.7.3)(zod@3.24.1)': dependencies: - '@t3-oss/env-core': 0.11.1(typescript@5.7.2)(zod@3.24.1) + '@t3-oss/env-core': 0.11.1(typescript@5.7.3)(zod@3.24.1) zod: 3.24.1 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 - '@tabler/icons-react@3.26.0(react@19.0.0)': + '@tabler/icons-react@3.28.1(react@19.0.0)': dependencies: - '@tabler/icons': 3.26.0 + '@tabler/icons': 3.28.1 react: 19.0.0 - '@tabler/icons@3.26.0': {} + '@tabler/icons@3.28.1': {} '@tanstack/match-sorter-utils@8.19.4': dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.62.12': {} + '@tanstack/query-core@5.62.16': {} - '@tanstack/query-devtools@5.62.9': {} + '@tanstack/query-devtools@5.62.16': {} - '@tanstack/react-query-devtools@5.62.12(@tanstack/react-query@5.62.12(react@19.0.0))(react@19.0.0)': + '@tanstack/react-query-devtools@5.63.0(@tanstack/react-query@5.63.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/query-devtools': 5.62.9 - '@tanstack/react-query': 5.62.12(react@19.0.0) + '@tanstack/query-devtools': 5.62.16 + '@tanstack/react-query': 5.63.0(react@19.0.0) react: 19.0.0 - '@tanstack/react-query-next-experimental@5.62.12(@tanstack/react-query@5.62.12(react@19.0.0))(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react@19.0.0)': + '@tanstack/react-query-next-experimental@5.63.0(@tanstack/react-query@5.63.0(react@19.0.0))(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react@19.0.0)': dependencies: - '@tanstack/react-query': 5.62.12(react@19.0.0) - next: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + '@tanstack/react-query': 5.63.0(react@19.0.0) + next: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: 19.0.0 - '@tanstack/react-query@5.62.12(react@19.0.0)': + '@tanstack/react-query@5.63.0(react@19.0.0)': dependencies: - '@tanstack/query-core': 5.62.12 + '@tanstack/query-core': 5.62.16 react: 19.0.0 '@tanstack/react-table@8.20.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -11372,15 +11812,15 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@tanstack/react-virtual@3.10.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@tanstack/react-virtual@3.11.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/virtual-core': 3.10.8 + '@tanstack/virtual-core': 3.11.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) '@tanstack/table-core@8.20.5': {} - '@tanstack/virtual-core@3.10.8': {} + '@tanstack/virtual-core@3.11.2': {} '@testcontainers/mysql@10.16.0': dependencies: @@ -11388,157 +11828,157 @@ snapshots: transitivePeerDependencies: - supports-color - '@tiptap/core@2.11.0(@tiptap/pm@2.11.0)': + '@tiptap/core@2.11.2(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/pm': 2.11.0 + '@tiptap/pm': 2.11.2 - '@tiptap/extension-blockquote@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-blockquote@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-bold@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-bold@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-bubble-menu@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-bubble-menu@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-bullet-list@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-code-block@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-code-block@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 - '@tiptap/extension-code@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-code@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-color@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/extension-text-style@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)))': + '@tiptap/extension-color@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/extension-text-style@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-text-style': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/extension-text-style': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) - '@tiptap/extension-document@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-document@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-dropcursor@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-dropcursor@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 - '@tiptap/extension-floating-menu@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-floating-menu@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-gapcursor@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 - '@tiptap/extension-hard-break@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-hard-break@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-heading@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-heading@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-highlight@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-highlight@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-history@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-history@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 - '@tiptap/extension-horizontal-rule@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-horizontal-rule@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 - '@tiptap/extension-image@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-image@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-italic@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-italic@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-link@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-link@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 linkifyjs: 4.2.0 - '@tiptap/extension-list-item@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-list-item@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-ordered-list@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-ordered-list@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-paragraph@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-paragraph@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-strike@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-strike@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-table-cell@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-table-cell@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-table-header@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-table-header@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-table-row@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-table-row@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-table@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-table@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 - '@tiptap/extension-task-item@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': + '@tiptap/extension-task-item@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 - '@tiptap/extension-task-list@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-task-list@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-text-align@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-text-align@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-text-style@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-text-style@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-text@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-text@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/extension-underline@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': + '@tiptap/extension-underline@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) - '@tiptap/pm@2.11.0': + '@tiptap/pm@2.11.2': dependencies: prosemirror-changeset: 2.2.1 prosemirror-collab: 1.3.1 @@ -11559,73 +11999,73 @@ snapshots: prosemirror-transform: 1.10.2 prosemirror-view: 1.37.0 - '@tiptap/react@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@tiptap/react@2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-bubble-menu': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/extension-floating-menu': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/pm': 2.11.0 + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/extension-bubble-menu': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/extension-floating-menu': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/pm': 2.11.2 '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) use-sync-external-store: 1.2.2(react@19.0.0) - '@tiptap/starter-kit@2.11.0': - dependencies: - '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-blockquote': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-bold': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-bullet-list': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-code': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-code-block': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/extension-document': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-dropcursor': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/extension-gapcursor': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/extension-hard-break': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-heading': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-history': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/extension-horizontal-rule': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) - '@tiptap/extension-italic': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-list-item': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-ordered-list': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-paragraph': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-strike': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-text': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-text-style': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/pm': 2.11.0 + '@tiptap/starter-kit@2.11.2': + dependencies: + '@tiptap/core': 2.11.2(@tiptap/pm@2.11.2) + '@tiptap/extension-blockquote': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-bold': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-bullet-list': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-code': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-code-block': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/extension-document': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-dropcursor': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/extension-gapcursor': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/extension-hard-break': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-heading': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-history': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/extension-horizontal-rule': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2))(@tiptap/pm@2.11.2) + '@tiptap/extension-italic': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-list-item': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-ordered-list': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-paragraph': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-strike': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-text': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/extension-text-style': 2.11.2(@tiptap/core@2.11.2(@tiptap/pm@2.11.2)) + '@tiptap/pm': 2.11.2 '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2)': + '@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3)': dependencies: - '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) - typescript: 5.7.2 + '@trpc/server': 11.0.0-rc.694(typescript@5.7.3) + typescript: 5.7.3 - '@trpc/next@11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@trpc/next@11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@trpc/client': 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) - '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) - next: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + '@trpc/client': 11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3) + '@trpc/server': 11.0.0-rc.694(typescript@5.7.3) + next: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - typescript: 5.7.2 + typescript: 5.7.3 optionalDependencies: - '@tanstack/react-query': 5.62.12(react@19.0.0) - '@trpc/react-query': 11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@tanstack/react-query': 5.63.0(react@19.0.0) + '@trpc/react-query': 11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@trpc/react-query@11.0.0-rc.682(@tanstack/react-query@5.62.12(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@trpc/react-query@11.0.0-rc.694(@tanstack/react-query@5.63.0(react@19.0.0))(@trpc/client@11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@tanstack/react-query': 5.62.12(react@19.0.0) - '@trpc/client': 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) - '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) + '@tanstack/react-query': 5.63.0(react@19.0.0) + '@trpc/client': 11.0.0-rc.694(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(typescript@5.7.3) + '@trpc/server': 11.0.0-rc.694(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - typescript: 5.7.2 + typescript: 5.7.3 - '@trpc/server@11.0.0-rc.682(typescript@5.7.2)': + '@trpc/server@11.0.0-rc.694(typescript@5.7.3)': dependencies: - typescript: 5.7.2 + typescript: 5.7.3 '@tsconfig/node10@1.0.11': {} @@ -11637,7 +12077,7 @@ snapshots: '@tsconfig/svelte@1.0.13': {} - '@turbo/gen@2.3.3(@types/node@22.10.5)(typescript@5.7.2)': + '@turbo/gen@2.3.3(@types/node@22.10.5)(typescript@5.7.3)': dependencies: '@turbo/workspaces': 2.3.3 commander: 10.0.1 @@ -11647,7 +12087,7 @@ snapshots: node-plop: 0.26.3 picocolors: 1.0.1 proxy-agent: 6.4.0 - ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.2) + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -11715,7 +12155,7 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 22.10.5 - '@types/chroma-js@2.4.5': {} + '@types/chroma-js@3.1.0': {} '@types/connect@3.4.38': dependencies: @@ -11745,7 +12185,7 @@ snapshots: '@types/node': 22.10.5 '@types/ssh2': 1.15.1 - '@types/dockerode@3.3.33': + '@types/dockerode@3.3.34': dependencies: '@types/docker-modem': 3.0.6 '@types/node': 22.10.5 @@ -11818,9 +12258,6 @@ snapshots: '@types/prismjs@1.26.5': {} - '@types/prop-types@15.7.12': - optional: true - '@types/qs@6.9.16': {} '@types/ramda@0.30.2': @@ -11829,17 +12266,11 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.0.2(@types/react@19.0.2)': + '@types/react-dom@19.0.2(@types/react@19.0.4)': dependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 - '@types/react@18.3.13': - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - optional: true - - '@types/react@19.0.2': + '@types/react@19.0.4': dependencies: csstype: 3.1.3 @@ -11871,7 +12302,7 @@ snapshots: '@types/swagger-ui-react@4.18.3': dependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 '@types/through@0.0.33': dependencies: @@ -11897,81 +12328,81 @@ snapshots: dependencies: '@types/node': 22.10.5 - '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0)(typescript@5.7.3))(eslint@9.17.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/parser': 8.19.1(eslint@9.17.0)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/type-utils': 8.19.1(eslint@9.17.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.19.1 eslint: 9.17.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/parser@8.19.1(eslint@9.17.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.19.1 debug: 4.4.0 eslint: 9.17.0 - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.19.0': + '@typescript-eslint/scope-manager@8.19.1': dependencies: - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/visitor-keys': 8.19.1 - '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.19.1(eslint@9.17.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0)(typescript@5.7.3) debug: 4.4.0 eslint: 9.17.0 - ts-api-utils: 1.3.0(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.19.0': {} + '@typescript-eslint/types@8.19.1': {} - '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.19.1(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/visitor-keys': 8.19.1 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.19.1(eslint@9.17.0)(typescript@5.7.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) eslint: 9.17.0 - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.19.0': + '@typescript-eslint/visitor-keys@8.19.1': dependencies: - '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/types': 8.19.1 eslint-visitor-keys: 4.2.0 '@umami/node@0.4.0': {} @@ -12004,14 +12435,14 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@4.3.4(vite@5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -12029,7 +12460,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@25.0.1)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@26.0.0)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -12040,13 +12471,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': + '@vitest/mocker@2.1.8(vite@5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) '@vitest/pretty-format@2.1.8': dependencies: @@ -12076,7 +12507,7 @@ snapshots: sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@25.0.1)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@26.0.0)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) '@vitest/utils@2.1.8': dependencies: @@ -12224,6 +12655,8 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.3: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -12415,15 +12848,15 @@ snapshots: ast-types@0.13.4: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 ast-types@0.14.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 ast-types@0.16.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 async-lock@1.4.1: {} @@ -12433,7 +12866,7 @@ snapshots: autolinker@3.16.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 available-typed-arrays@1.0.7: dependencies: @@ -12509,7 +12942,7 @@ snapshots: bellajs@11.2.0: {} - better-sqlite3@11.7.0: + better-sqlite3@11.7.2: dependencies: bindings: 1.5.0 prebuild-install: 7.1.2 @@ -12791,6 +13224,12 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + colorspace@1.1.4: dependencies: color: 3.2.1 @@ -12910,14 +13349,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.7.2): + cosmiconfig@9.0.0(typescript@5.7.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 cpu-features@0.0.10: dependencies: @@ -12972,9 +13411,10 @@ snapshots: cssesc@3.0.0: {} - cssstyle@4.1.0: + cssstyle@4.2.1: dependencies: - rrweb-cssom: 0.7.1 + '@asamuzakjp/css-color': 2.8.2 + rrweb-cssom: 0.8.0 csstype@3.1.3: {} @@ -12985,7 +13425,7 @@ snapshots: data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + whatwg-url: 14.1.0 data-view-buffer@1.0.1: dependencies: @@ -13130,9 +13570,9 @@ snapshots: transitivePeerDependencies: - supports-color - docker-modem@5.0.3: + docker-modem@5.0.5: dependencies: - debug: 4.3.7 + debug: 4.4.0 readable-stream: 3.6.2 split-ca: 1.0.1 ssh2: 1.16.0 @@ -13147,11 +13587,15 @@ snapshots: transitivePeerDependencies: - supports-color - dockerode@4.0.2: + dockerode@4.0.3: dependencies: '@balena/dockerignore': 1.0.2 - docker-modem: 5.0.3 + '@grpc/grpc-js': 1.12.5 + '@grpc/proto-loader': 0.7.13 + docker-modem: 5.0.5 + protobufjs: 7.4.0 tar-fs: 2.0.1 + uuid: 10.0.0 transitivePeerDependencies: - supports-color @@ -13200,18 +13644,18 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.2)(better-sqlite3@11.7.0)(mysql2@3.12.0)(react@19.0.0): + drizzle-orm@0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.4)(better-sqlite3@11.7.2)(mysql2@3.12.0)(react@19.0.0): optionalDependencies: '@libsql/client-wasm': 0.14.0 '@types/better-sqlite3': 7.6.12 - '@types/react': 19.0.2 - better-sqlite3: 11.7.0 + '@types/react': 19.0.4 + better-sqlite3: 11.7.2 mysql2: 3.12.0 react: 19.0.0 - drizzle-zod@0.6.1(drizzle-orm@0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.2)(better-sqlite3@11.7.0)(mysql2@3.12.0)(react@19.0.0))(zod@3.24.1): + drizzle-zod@0.6.1(drizzle-orm@0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.4)(better-sqlite3@11.7.2)(mysql2@3.12.0)(react@19.0.0))(zod@3.24.1): dependencies: - drizzle-orm: 0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.2)(better-sqlite3@11.7.0)(mysql2@3.12.0)(react@19.0.0) + drizzle-orm: 0.38.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.4)(better-sqlite3@11.7.2)(mysql2@3.12.0)(react@19.0.0) zod: 3.24.1 dunder-proto@1.0.1: @@ -13621,17 +14065,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.1(eslint@9.17.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.1(eslint@9.17.0)(typescript@5.7.3) eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.17.0)(typescript@5.7.3))(eslint@9.17.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -13642,7 +14086,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.1(eslint@9.17.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -13654,7 +14098,7 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.1(eslint@9.17.0)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -13844,10 +14288,20 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + fast-content-type-parse@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -13956,6 +14410,12 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + format@0.2.2: {} from2@2.3.0: @@ -14117,14 +14577,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.10: - dependencies: - foreground-child: 3.3.0 - jackspeak: 2.3.6 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.11.1 - glob@10.4.5: dependencies: foreground-child: 3.3.0 @@ -14134,7 +14586,7 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 - glob@11.0.0: + glob@11.0.1: dependencies: foreground-child: 3.3.0 jackspeak: 4.0.1 @@ -14335,6 +14787,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -14445,7 +14904,7 @@ snapshots: '@formatjs/ecma402-abstract': 2.2.0 '@formatjs/fast-memoize': 2.2.1 '@formatjs/icu-messageformat-parser': 2.8.0 - tslib: 2.7.0 + tslib: 2.8.1 into-stream@7.0.0: dependencies: @@ -14753,12 +15212,6 @@ snapshots: reflect.getprototypeof: 1.0.9 set-function-name: 2.0.2 - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -14783,14 +15236,9 @@ snapshots: jose@5.9.6: {} - jotai@2.11.0(@types/react@18.3.13)(react@19.0.0): + jotai@2.11.0(@types/react@19.0.4)(react@19.0.0): optionalDependencies: - '@types/react': 18.3.13 - react: 19.0.0 - - jotai@2.11.0(@types/react@19.0.2)(react@19.0.0): - optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 react: 19.0.0 js-base64@3.7.7: @@ -14806,19 +15254,19 @@ snapshots: jsbn@1.1.0: {} - jsdom@25.0.1: + jsdom@26.0.0: dependencies: - cssstyle: 4.1.0 + cssstyle: 4.2.1 data-urls: 5.0.0 decimal.js: 10.4.3 - form-data: 4.0.0 + form-data: 4.0.1 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.12 - parse5: 7.1.2 - rrweb-cssom: 0.7.1 + nwsapi: 2.2.16 + parse5: 7.2.1 + rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 5.0.0 @@ -14826,7 +15274,7 @@ snapshots: webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + whatwg-url: 14.1.0 ws: 8.18.0 xml-name-validator: 5.0.0 transitivePeerDependencies: @@ -14889,13 +15337,13 @@ snapshots: dependencies: readable-stream: 2.3.8 - ldapts@7.3.0: + ldapts@7.3.1: dependencies: '@types/asn1': 0.2.4 asn1: 0.2.6 debug: 4.4.0 strict-event-emitter-types: 2.0.0 - uuid: 11.0.3 + uuid: 11.0.4 whatwg-url: 14.1.0 transitivePeerDependencies: - supports-color @@ -14939,6 +15387,8 @@ snapshots: lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} + lodash.capitalize@4.2.1: {} lodash.clonedeep@4.5.0: {} @@ -15002,7 +15452,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.0.1: {} + lru-cache@11.0.2: {} lru-cache@5.1.1: dependencies: @@ -15038,29 +15488,15 @@ snapshots: make-error@1.3.6: {} - mantine-react-table@2.0.0-beta.7(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tabler/icons-react@3.26.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + mantine-react-table@2.0.0-beta.8(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(@tabler/icons-react@3.28.1(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/dates': 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@18.3.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) - '@tabler/icons-react': 3.26.0(react@19.0.0) + '@mantine/core': 7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/dates': 7.15.3(@mantine/core@7.15.3(@mantine/hooks@7.15.3(react@19.0.0))(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.15.3(react@19.0.0) + '@tabler/icons-react': 3.28.1(react@19.0.0) '@tanstack/match-sorter-utils': 8.19.4 '@tanstack/react-table': 8.20.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/react-virtual': 3.10.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - clsx: 2.1.1 - dayjs: 1.11.13 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - mantine-react-table@2.0.0-beta.7(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tabler/icons-react@3.26.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/dates': 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.15.2(react@19.0.0) - '@tabler/icons-react': 3.26.0(react@19.0.0) - '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-table': 8.20.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/react-virtual': 3.10.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-virtual': 3.11.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 dayjs: 1.11.13 react: 19.0.0 @@ -15239,43 +15675,43 @@ snapshots: netmask@2.0.2: {} - next-auth@5.0.0-beta.25(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react@19.0.0): + next-auth@5.0.0-beta.25(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react@19.0.0): dependencies: '@auth/core': 0.37.2 - next: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + next: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: 19.0.0 - next-intl@3.26.3(next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react@19.0.0): + next-intl@3.26.3(next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1))(react@19.0.0): dependencies: '@formatjs/intl-localematcher': 0.5.5 negotiator: 1.0.0 - next: 14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) + next: 15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: 19.0.0 use-intl: 3.26.3(react@19.0.0) - next@14.2.22(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0): + next@15.1.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1): dependencies: - '@next/env': 14.2.22 - '@swc/helpers': 0.5.5 + '@next/env': 15.1.4 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 busboy: 1.6.0 caniuse-lite: 1.0.30001679 - graceful-fs: 4.2.11 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - styled-jsx: 5.1.1(@babel/core@7.26.0)(react@19.0.0) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.22 - '@next/swc-darwin-x64': 14.2.22 - '@next/swc-linux-arm64-gnu': 14.2.22 - '@next/swc-linux-arm64-musl': 14.2.22 - '@next/swc-linux-x64-gnu': 14.2.22 - '@next/swc-linux-x64-musl': 14.2.22 - '@next/swc-win32-arm64-msvc': 14.2.22 - '@next/swc-win32-ia32-msvc': 14.2.22 - '@next/swc-win32-x64-msvc': 14.2.22 + '@next/swc-darwin-arm64': 15.1.4 + '@next/swc-darwin-x64': 15.1.4 + '@next/swc-linux-arm64-gnu': 15.1.4 + '@next/swc-linux-arm64-musl': 15.1.4 + '@next/swc-linux-x64-gnu': 15.1.4 + '@next/swc-linux-x64-musl': 15.1.4 + '@next/swc-win32-arm64-msvc': 15.1.4 + '@next/swc-win32-x64-msvc': 15.1.4 '@playwright/test': 1.49.1 - sass: 1.83.0 + sass: 1.83.1 + sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -15388,7 +15824,7 @@ snapshots: gauge: 3.0.2 set-blocking: 2.0.0 - nwsapi@2.2.12: {} + nwsapi@2.2.16: {} oauth4webapi@3.0.0: {} @@ -15450,18 +15886,18 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - octokit@4.0.3: + octokit@4.1.0: dependencies: - '@octokit/app': 15.1.1 - '@octokit/core': 6.1.2 - '@octokit/oauth-app': 7.1.3 - '@octokit/plugin-paginate-graphql': 5.2.4(@octokit/core@6.1.2) - '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) - '@octokit/plugin-rest-endpoint-methods': 13.2.6(@octokit/core@6.1.2) - '@octokit/plugin-retry': 7.1.2(@octokit/core@6.1.2) - '@octokit/plugin-throttling': 9.3.2(@octokit/core@6.1.2) - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.2 + '@octokit/app': 15.1.2 + '@octokit/core': 6.1.3 + '@octokit/oauth-app': 7.1.5 + '@octokit/plugin-paginate-graphql': 5.2.4(@octokit/core@6.1.3) + '@octokit/plugin-paginate-rest': 11.4.0(@octokit/core@6.1.3) + '@octokit/plugin-rest-endpoint-methods': 13.3.0(@octokit/core@6.1.3) + '@octokit/plugin-retry': 7.1.3(@octokit/core@6.1.3) + '@octokit/plugin-throttling': 9.4.0(@octokit/core@6.1.3) + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 ofetch@1.4.1: dependencies: @@ -15640,7 +16076,7 @@ snapshots: parse5@6.0.1: {} - parse5@7.1.2: + parse5@7.2.1: dependencies: entities: 4.5.0 @@ -15672,7 +16108,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.0.1 + lru-cache: 11.0.2 minipass: 7.1.2 path-type@4.0.0: {} @@ -15957,6 +16393,21 @@ snapshots: proto-list@1.2.4: {} + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.10.5 + long: 5.2.3 + proxy-agent@6.4.0: dependencies: agent-base: 7.1.1 @@ -16070,59 +16521,40 @@ snapshots: react-is@16.13.1: {} - react-number-format@5.4.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-number-format@5.4.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-redux@9.1.2(@types/react@19.0.2)(react@19.0.0)(redux@5.0.1): + react-redux@9.1.2(@types/react@19.0.4)(react@19.0.0)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.3 react: 19.0.0 use-sync-external-store: 1.2.2(react@19.0.0) optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 redux: 5.0.1 react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.6(@types/react@18.3.13)(react@19.0.0): - dependencies: - react: 19.0.0 - react-style-singleton: 2.2.1(@types/react@18.3.13)(react@19.0.0) - tslib: 2.7.0 - optionalDependencies: - '@types/react': 18.3.13 - - react-remove-scroll-bar@2.3.6(@types/react@19.0.2)(react@19.0.0): + react-remove-scroll-bar@2.3.8(@types/react@19.0.4)(react@19.0.0): dependencies: react: 19.0.0 - react-style-singleton: 2.2.1(@types/react@19.0.2)(react@19.0.0) - tslib: 2.7.0 + react-style-singleton: 2.2.3(@types/react@19.0.4)(react@19.0.0) + tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 - react-remove-scroll@2.6.0(@types/react@18.3.13)(react@19.0.0): + react-remove-scroll@2.6.2(@types/react@19.0.4)(react@19.0.0): dependencies: react: 19.0.0 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.13)(react@19.0.0) - react-style-singleton: 2.2.1(@types/react@18.3.13)(react@19.0.0) - tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.13)(react@19.0.0) - use-sidecar: 1.1.2(@types/react@18.3.13)(react@19.0.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.0.4)(react@19.0.0) + react-style-singleton: 2.2.1(@types/react@19.0.4)(react@19.0.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.0.4)(react@19.0.0) + use-sidecar: 1.1.2(@types/react@19.0.4)(react@19.0.0) optionalDependencies: - '@types/react': 18.3.13 - - react-remove-scroll@2.6.0(@types/react@19.0.2)(react@19.0.0): - dependencies: - react: 19.0.0 - react-remove-scroll-bar: 2.3.6(@types/react@19.0.2)(react@19.0.0) - react-style-singleton: 2.2.1(@types/react@19.0.2)(react@19.0.0) - tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@19.0.2)(react@19.0.0) - use-sidecar: 1.1.2(@types/react@19.0.2)(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 react-scan@0.0.31: dependencies: @@ -16137,23 +16569,22 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-style-singleton@2.2.1(@types/react@18.3.13)(react@19.0.0): + react-style-singleton@2.2.1(@types/react@19.0.4)(react@19.0.0): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 19.0.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.13 + '@types/react': 19.0.4 - react-style-singleton@2.2.1(@types/react@19.0.2)(react@19.0.0): + react-style-singleton@2.2.3(@types/react@19.0.4)(react@19.0.0): dependencies: get-nonce: 1.0.1 - invariant: 2.2.4 react: 19.0.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 react-syntax-highlighter@15.5.0(react@19.0.0): dependencies: @@ -16164,21 +16595,12 @@ snapshots: react: 19.0.0 refractor: 3.6.0 - react-textarea-autosize@8.5.6(@types/react@18.3.13)(react@19.0.0): - dependencies: - '@babel/runtime': 7.25.6 - react: 19.0.0 - use-composed-ref: 1.3.0(react@19.0.0) - use-latest: 1.2.1(@types/react@18.3.13)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - react-textarea-autosize@8.5.6(@types/react@19.0.2)(react@19.0.0): + react-textarea-autosize@8.5.6(@types/react@19.0.4)(react@19.0.0): dependencies: '@babel/runtime': 7.25.6 react: 19.0.0 use-composed-ref: 1.3.0(react@19.0.0) - use-latest: 1.2.1(@types/react@19.0.2)(react@19.0.0) + use-latest: 1.2.1(@types/react@19.0.4)(react@19.0.0) transitivePeerDependencies: - '@types/react' @@ -16243,7 +16665,7 @@ snapshots: esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.7.0 + tslib: 2.8.1 redis-errors@1.2.0: {} @@ -16395,7 +16817,7 @@ snapshots: dependencies: rrweb-snapshot: 2.0.0-alpha.4 - rrweb-cssom@0.7.1: {} + rrweb-cssom@0.8.0: {} rrweb-player@1.0.0-alpha.4: dependencies: @@ -16468,7 +16890,7 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.83.0: + sass@1.83.1: dependencies: chokidar: 4.0.0 immutable: 5.0.2 @@ -16490,15 +16912,15 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - semantic-release@24.2.1(typescript@5.7.2): + semantic-release@24.2.1(typescript@5.7.3): dependencies: - '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.1(typescript@5.7.2)) + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.1(typescript@5.7.3)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 11.0.1(semantic-release@24.2.1(typescript@5.7.2)) - '@semantic-release/npm': 12.0.1(semantic-release@24.2.1(typescript@5.7.2)) - '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.1(typescript@5.7.2)) + '@semantic-release/github': 11.0.1(semantic-release@24.2.1(typescript@5.7.3)) + '@semantic-release/npm': 12.0.1(semantic-release@24.2.1(typescript@5.7.3)) + '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.1(typescript@5.7.3)) aggregate-error: 5.0.0 - cosmiconfig: 9.0.0(typescript@5.7.2) + cosmiconfig: 9.0.0(typescript@5.7.3) debug: 4.4.0 env-ci: 11.1.0 execa: 9.5.2 @@ -16583,6 +17005,33 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -16918,7 +17367,7 @@ snapshots: strnum@1.0.5: {} - styled-jsx@5.1.1(@babel/core@7.26.0)(react@19.0.0): + styled-jsx@5.1.6(@babel/core@7.26.0)(react@19.0.0): dependencies: client-only: 0.0.1 react: 19.0.0 @@ -16982,7 +17431,7 @@ snapshots: transitivePeerDependencies: - debug - swagger-ui-react@5.18.2(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + swagger-ui-react@5.18.2(@types/react@19.0.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@babel/runtime-corejs3': 7.25.6 '@braintree/sanitize-url': 7.0.4 @@ -17007,7 +17456,7 @@ snapshots: react-immutable-proptypes: 2.2.0(immutable@3.8.2) react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-inspector: 6.0.2(react@19.0.0) - react-redux: 9.1.2(@types/react@19.0.2)(react@19.0.0)(redux@5.0.1) + react-redux: 9.1.2(@types/react@19.0.4)(react@19.0.0)(redux@5.0.1) react-syntax-highlighter: 15.5.0(react@19.0.0) redux: 5.0.1 redux-immutable: 4.0.0(immutable@3.8.2) @@ -17119,7 +17568,7 @@ snapshots: testcontainers@10.16.0: dependencies: '@balena/dockerignore': 1.0.2 - '@types/dockerode': 3.3.33 + '@types/dockerode': 3.3.34 archiver: 7.0.1 async-lock: 1.4.1 byline: 5.0.0 @@ -17250,9 +17699,9 @@ snapshots: triple-beam@1.4.1: {} - trpc-to-openapi@2.1.1(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1): + trpc-to-openapi@2.1.2(@trpc/server@11.0.0-rc.694(typescript@5.7.3))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1): dependencies: - '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) + '@trpc/server': 11.0.0-rc.694(typescript@5.7.3) co-body: 6.2.0 h3: 1.13.0 openapi3-ts: 4.4.0 @@ -17261,13 +17710,13 @@ snapshots: optionalDependencies: '@rollup/rollup-linux-x64-gnu': 4.6.1 - ts-api-utils@1.3.0(typescript@5.7.2): + ts-api-utils@2.0.0(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 ts-mixer@6.0.4: {} - ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.2): + ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -17281,15 +17730,15 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.7.2 + typescript: 5.7.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 ts-toolbelt@9.6.0: {} - tsconfck@3.1.3(typescript@5.7.2): + tsconfck@3.1.3(typescript@5.7.3): optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 tsconfig-paths@3.15.0: dependencies: @@ -17302,6 +17751,8 @@ snapshots: tslib@2.7.0: {} + tslib@2.8.1: {} + tsscmp@1.0.6: {} tsx@4.19.2: @@ -17356,8 +17807,6 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.28.0: {} - type-fest@4.30.2: {} type-is@1.6.18: @@ -17438,17 +17887,17 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.19.0(eslint@9.17.0)(typescript@5.7.2): + typescript-eslint@8.19.1(eslint@9.17.0)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0)(typescript@5.7.3))(eslint@9.17.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.19.1(eslint@9.17.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0)(typescript@5.7.3) eslint: 9.17.0 - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - typescript@5.7.2: {} + typescript@5.7.3: {} uc.micro@2.1.0: {} @@ -17483,7 +17932,7 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@7.2.0: {} + undici@7.2.1: {} unenv@1.10.0: dependencies: @@ -17575,19 +18024,12 @@ snapshots: url-toolkit@2.2.5: {} - use-callback-ref@1.3.2(@types/react@18.3.13)(react@19.0.0): + use-callback-ref@1.3.3(@types/react@19.0.4)(react@19.0.0): dependencies: react: 19.0.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.13 - - use-callback-ref@1.3.2(@types/react@19.0.2)(react@19.0.0): - dependencies: - react: 19.0.0 - tslib: 2.7.0 - optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 use-composed-ref@1.3.0(react@19.0.0): dependencies: @@ -17605,47 +18047,26 @@ snapshots: intl-messageformat: 10.7.1 react: 19.0.0 - use-isomorphic-layout-effect@1.1.2(@types/react@18.3.13)(react@19.0.0): + use-isomorphic-layout-effect@1.1.2(@types/react@19.0.4)(react@19.0.0): dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 18.3.13 + '@types/react': 19.0.4 - use-isomorphic-layout-effect@1.1.2(@types/react@19.0.2)(react@19.0.0): + use-latest@1.2.1(@types/react@19.0.4)(react@19.0.0): dependencies: react: 19.0.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@19.0.4)(react@19.0.0) optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 - use-latest@1.2.1(@types/react@18.3.13)(react@19.0.0): - dependencies: - react: 19.0.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.13)(react@19.0.0) - optionalDependencies: - '@types/react': 18.3.13 - - use-latest@1.2.1(@types/react@19.0.2)(react@19.0.0): - dependencies: - react: 19.0.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@19.0.2)(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.2 - - use-sidecar@1.1.2(@types/react@18.3.13)(react@19.0.0): - dependencies: - detect-node-es: 1.1.0 - react: 19.0.0 - tslib: 2.7.0 - optionalDependencies: - '@types/react': 18.3.13 - - use-sidecar@1.1.2(@types/react@19.0.2)(react@19.0.0): + use-sidecar@1.1.2(@types/react@19.0.4)(react@19.0.0): dependencies: detect-node-es: 1.1.0 react: 19.0.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.4 use-sync-external-store@1.2.2(react@19.0.0): dependencies: @@ -17653,7 +18074,9 @@ snapshots: util-deprecate@1.0.2: {} - uuid@11.0.3: {} + uuid@10.0.0: {} + + uuid@11.0.4: {} uuid@8.3.2: {} @@ -17694,13 +18117,13 @@ snapshots: dependencies: global: 4.4.0 - vite-node@2.1.8(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vite-node@2.1.8(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - '@types/node' - less @@ -17712,18 +18135,18 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)): + vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 - tsconfck: 3.1.3(typescript@5.7.2) + tsconfck: 3.1.3(typescript@5.7.3) optionalDependencies: - vite: 5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vite@5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -17731,14 +18154,14 @@ snapshots: optionalDependencies: '@types/node': 22.10.5 fsevents: 2.3.3 - sass: 1.83.0 + sass: 1.83.1 sugarss: 4.0.1(postcss@8.4.47) terser: 5.32.0 - vitest@2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@25.0.1)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vitest@2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(jsdom@26.0.0)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + '@vitest/mocker': 2.1.8(vite@5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -17754,13 +18177,13 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.5(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - vite-node: 2.1.8(@types/node@22.10.5)(sass@1.83.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite-node: 2.1.8(@types/node@22.10.5)(sass@1.83.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.10.5 '@vitest/ui': 2.1.8(vitest@2.1.8) - jsdom: 25.0.1 + jsdom: 26.0.0 transitivePeerDependencies: - less - lightningcss @@ -17838,11 +18261,6 @@ snapshots: whatwg-mimetype@4.0.0: {} - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-url@14.1.0: dependencies: tr46: 5.0.0 diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index cc04a35c2..38f739bcb 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -17,19 +17,19 @@ }, "prettier": "@homarr/prettier-config", "dependencies": { - "@next/eslint-plugin-next": "^14.2.22", + "@next/eslint-plugin-next": "^15.1.4", "eslint-config-prettier": "^9.1.0", "eslint-config-turbo": "^2.3.3", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.3", "eslint-plugin-react-hooks": "^5.1.0", - "typescript-eslint": "^8.19.0" + "typescript-eslint": "^8.19.1" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.17.0", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/tooling/prettier/package.json b/tooling/prettier/package.json index 1f384f858..e6ce38088 100644 --- a/tooling/prettier/package.json +++ b/tooling/prettier/package.json @@ -16,6 +16,6 @@ "devDependencies": { "@homarr/tsconfig": "workspace:^0.1.0", "prettier-plugin-packagejson": "^2.5.6", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } diff --git a/turbo.json b/turbo.json index b3732c66e..e259bcb22 100644 --- a/turbo.json +++ b/turbo.json @@ -17,6 +17,7 @@ "AUTH_OIDC_ISSUER", "AUTH_OIDC_SCOPE_OVERWRITE", "AUTH_OIDC_GROUPS_ATTRIBUTE", + "AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE", "AUTH_LDAP_USERNAME_ATTRIBUTE", "AUTH_LDAP_USER_MAIL_ATTRIBUTE", "AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG",