chore(release): automatic release v1.41.0

This commit is contained in:
homarr-releases[bot]
2025-10-10 19:14:15 +00:00
committed by GitHub
93 changed files with 2922 additions and 1565 deletions

View File

@@ -33,6 +33,7 @@ body:
options: options:
# The below comment is used to insert a new version with on-release.yml # The below comment is used to insert a new version with on-release.yml
#NEXT_VERSION# #NEXT_VERSION#
- 1.40.0
- 1.39.0 - 1.39.0
- 1.38.0 - 1.38.0
- 1.37.0 - 1.37.0

View File

@@ -50,12 +50,12 @@
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.3.2", "@mantine/colors-generator": "^8.3.3",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@mantine/dropzone": "^8.3.2", "@mantine/dropzone": "^8.3.3",
"@mantine/hooks": "^8.3.2", "@mantine/hooks": "^8.3.3",
"@mantine/modals": "^8.3.2", "@mantine/modals": "^8.3.3",
"@mantine/tiptap": "^8.3.2", "@mantine/tiptap": "^8.3.3",
"@million/lint": "1.0.14", "@million/lint": "1.0.14",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"@tanstack/react-query": "^5.90.2", "@tanstack/react-query": "^5.90.2",
@@ -71,7 +71,7 @@
"chroma-js": "^3.1.2", "chroma-js": "^3.1.2",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"dotenv": "^17.2.2", "dotenv": "^17.2.3",
"flag-icons": "^7.5.0", "flag-icons": "^7.5.0",
"glob": "^11.0.3", "glob": "^11.0.3",
"jotai": "^2.15.0", "jotai": "^2.15.0",
@@ -79,13 +79,13 @@
"next": "15.5.4", "next": "15.5.4",
"postcss-preset-mantine": "^1.18.0", "postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0", "prismjs": "^1.30.0",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"react-error-boundary": "^6.0.0", "react-error-boundary": "^6.0.0",
"react-simple-code-editor": "^0.14.1", "react-simple-code-editor": "^0.14.1",
"sass": "^1.93.2", "sass": "^1.93.2",
"superjson": "2.2.2", "superjson": "2.2.2",
"swagger-ui-react": "^5.29.0", "swagger-ui-react": "^5.29.3",
"use-deep-compare-effect": "^1.8.1", "use-deep-compare-effect": "^1.8.1",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
@@ -94,15 +94,15 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "3.1.1", "@types/chroma-js": "3.1.1",
"@types/node": "^22.18.7", "@types/node": "^22.18.8",
"@types/prismjs": "^1.26.5", "@types/prismjs": "^1.26.5",
"@types/react": "19.1.15", "@types/react": "19.2.0",
"@types/react-dom": "19.1.9", "@types/react-dom": "19.2.0",
"@types/swagger-ui-react": "^5.18.0", "@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"node-loader": "^2.1.0", "node-loader": "^2.1.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -0,0 +1,62 @@
import { useCallback } from "react";
import { SegmentedControl } from "@mantine/core";
import type { IntegrationSecretKind } from "@homarr/definitions";
import type { UseFormReturnType } from "@homarr/form";
import { useScopedI18n } from "@homarr/translation/client";
interface FormType {
secrets: { kind: IntegrationSecretKind; value: string | null }[];
}
interface SecretKindsSegmentedControlProps<TFormType extends FormType> {
defaultKinds?: IntegrationSecretKind[];
secretKinds: IntegrationSecretKind[][];
form: UseFormReturnType<TFormType, (values: TFormType) => TFormType>;
}
export const SecretKindsSegmentedControl = <TFormType extends FormType>({
defaultKinds,
secretKinds,
form,
}: SecretKindsSegmentedControlProps<TFormType>) => {
const t = useScopedI18n("integration.secrets");
const defaultValue = defaultKinds?.length === 0 ? "empty" : defaultKinds?.join("-");
const secretKindGroups = secretKinds.map((kinds) => ({
label:
kinds.length === 0
? t("noSecretsRequired.segmentTitle")
: kinds.map((kind) => t(`kind.${kind}.label`)).join(" & "),
value: kinds.length === 0 ? "empty" : kinds.join("-"),
}));
const onChange = useCallback(
(value: string) => {
if (value === "empty") {
const emptyValues = [] satisfies FormType["secrets"];
// @ts-expect-error somehow it is not able to understand that secrets is an array?
form.setFieldValue("secrets", emptyValues);
return;
}
const kinds = value.split("-") as IntegrationSecretKind[];
const secrets = kinds.map((kind) => ({
kind,
value: "",
})) satisfies FormType["secrets"];
// @ts-expect-error somehow it is not able to understand that secrets is an array?
form.setFieldValue("secrets", secrets);
},
[form],
);
return (
<SegmentedControl
fullWidth
data={secretKindGroups}
defaultValue={defaultValue}
onChange={onChange}
></SegmentedControl>
);
};

View File

@@ -3,7 +3,8 @@
import { useState } from "react"; import { useState } from "react";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { Button, Fieldset, Group, Stack, TextInput } from "@mantine/core"; import { Alert, Button, Fieldset, Group, Stack, Text, TextInput } from "@mantine/core";
import { IconInfoCircle } from "@tabler/icons-react";
import type { z } from "zod/v4"; import type { z } from "zod/v4";
import type { RouterOutputs } from "@homarr/api"; import type { RouterOutputs } from "@homarr/api";
@@ -18,6 +19,7 @@ import { integrationUpdateSchema } from "@homarr/validation/integration";
import { SecretCard } from "../../_components/secrets/integration-secret-card"; import { SecretCard } from "../../_components/secrets/integration-secret-card";
import { IntegrationSecretInput } from "../../_components/secrets/integration-secret-inputs"; import { IntegrationSecretInput } from "../../_components/secrets/integration-secret-inputs";
import { SecretKindsSegmentedControl } from "../../_components/secrets/integration-secret-segmented-control";
import { IntegrationTestConnectionError } from "../../_components/test-connection/integration-test-connection-error"; import { IntegrationTestConnectionError } from "../../_components/test-connection/integration-test-connection-error";
import type { AnyMappedTestConnectionError } from "../../_components/test-connection/types"; import type { AnyMappedTestConnectionError } from "../../_components/test-connection/types";
@@ -28,19 +30,21 @@ interface EditIntegrationForm {
export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => { export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
const t = useI18n(); const t = useI18n();
const { openConfirmModal } = useConfirmModal(); const { openConfirmModal } = useConfirmModal();
const secretsKinds = const allSecretKinds = getAllSecretKindOptions(integration.kind);
const initialSecretsKinds =
getAllSecretKindOptions(integration.kind).find((secretKinds) => getAllSecretKindOptions(integration.kind).find((secretKinds) =>
integration.secrets.every((secret) => secretKinds.includes(secret.kind)), integration.secrets.every((secret) => secretKinds.includes(secret.kind)),
) ?? getDefaultSecretKinds(integration.kind); ) ?? getDefaultSecretKinds(integration.kind);
const hasUrlSecret = secretsKinds.includes("url"); const hasUrlSecret = initialSecretsKinds.includes("url");
const router = useRouter(); const router = useRouter();
const form = useZodForm(integrationUpdateSchema.omit({ id: true }), { const form = useZodForm(integrationUpdateSchema.omit({ id: true }), {
initialValues: { initialValues: {
name: integration.name, name: integration.name,
url: integration.url, url: integration.url,
secrets: secretsKinds.map((kind) => ({ secrets: initialSecretsKinds.map((kind) => ({
kind, kind,
value: integration.secrets.find((secret) => secret.kind === kind)?.value ?? "", value: integration.secrets.find((secret) => secret.kind === kind)?.value ?? "",
})), })),
@@ -93,6 +97,10 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
); );
}; };
const isInitialSecretKinds =
initialSecretsKinds.every((kind) => form.values.secrets.some((secret) => secret.kind === kind)) &&
form.values.secrets.length === initialSecretsKinds.length;
return ( return (
<form onSubmit={form.onSubmit((values) => void handleSubmitAsync(values))}> <form onSubmit={form.onSubmit((values) => void handleSubmitAsync(values))}>
<Stack> <Stack>
@@ -104,36 +112,60 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
<Fieldset legend={t("integration.secrets.title")}> <Fieldset legend={t("integration.secrets.title")}>
<Stack gap="sm"> <Stack gap="sm">
{secretsKinds.map((kind, index) => ( {allSecretKinds.length > 1 && (
<SecretCard <SecretKindsSegmentedControl
key={kind} defaultKinds={initialSecretsKinds}
secret={secretsMap.get(kind) ?? { kind, value: null, updatedAt: null }} secretKinds={allSecretKinds}
onCancel={() => form={form}
new Promise((resolve) => { />
// When nothing changed, just close the secret card )}
if ((form.values.secrets[index]?.value ?? "") === (secretsMap.get(kind)?.value ?? "")) { {!isInitialSecretKinds
return resolve(true); ? null
: form.values.secrets.map((secret, index) => (
<SecretCard
key={secret.kind}
secret={secretsMap.get(secret.kind) ?? { kind: secret.kind, value: null, updatedAt: null }}
onCancel={() =>
new Promise((resolve) => {
// When nothing changed, just close the secret card
if ((secret.value ?? "") === (secretsMap.get(secret.kind)?.value ?? "")) {
return resolve(true);
}
openConfirmModal({
title: t("integration.secrets.reset.title"),
children: t("integration.secrets.reset.message"),
onCancel: () => resolve(false),
onConfirm: () => {
form.setFieldValue(`secrets.${index}.value`, secretsMap.get(secret.kind)?.value ?? "");
resolve(true);
},
});
})
} }
openConfirmModal({ >
title: t("integration.secrets.reset.title"), <IntegrationSecretInput
children: t("integration.secrets.reset.message"), label={t(`integration.secrets.kind.${secret.kind}.newLabel`)}
onCancel: () => resolve(false), key={secret.kind}
onConfirm: () => { kind={secret.kind}
form.setFieldValue(`secrets.${index}.value`, secretsMap.get(kind)?.value ?? ""); {...form.getInputProps(`secrets.${index}.value`)}
resolve(true); />
}, </SecretCard>
}); ))}
}) {isInitialSecretKinds
} ? null
> : form.values.secrets.map(({ kind }, index) => (
<IntegrationSecretInput <IntegrationSecretInput
label={t(`integration.secrets.kind.${kind}.newLabel`)} withAsterisk
key={kind} key={kind}
kind={kind} kind={kind}
{...form.getInputProps(`secrets.${index}.value`)} {...form.getInputProps(`secrets.${index}.value`)}
/> />
</SecretCard> ))}
))} {form.values.secrets.length === 0 && (
<Alert icon={<IconInfoCircle size={"1rem"} />} color={"blue"}>
<Text c={"blue"}>{t("integration.secrets.noSecretsRequired.text")}</Text>
</Alert>
)}
</Stack> </Stack>
</Fieldset> </Fieldset>

View File

@@ -1,26 +1,15 @@
"use client"; "use client";
import { useCallback, useState } from "react"; import { useState } from "react";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { import { Alert, Button, Checkbox, Collapse, Fieldset, Group, Stack, Text, TextInput } from "@mantine/core";
Alert,
Button,
Checkbox,
Collapse,
Fieldset,
Group,
SegmentedControl,
Stack,
Text,
TextInput,
} from "@mantine/core";
import { IconInfoCircle } from "@tabler/icons-react"; import { IconInfoCircle } from "@tabler/icons-react";
import { z } from "zod/v4"; import { z } from "zod/v4";
import { clientApi } from "@homarr/api/client"; import { clientApi } from "@homarr/api/client";
import { revalidatePathActionAsync } from "@homarr/common/client"; import { revalidatePathActionAsync } from "@homarr/common/client";
import type { IntegrationKind, IntegrationSecretKind } from "@homarr/definitions"; import type { IntegrationKind } from "@homarr/definitions";
import { import {
getAllSecretKindOptions, getAllSecretKindOptions,
getIconUrl, getIconUrl,
@@ -28,14 +17,14 @@ import {
getIntegrationName, getIntegrationName,
integrationDefs, integrationDefs,
} from "@homarr/definitions"; } from "@homarr/definitions";
import type { UseFormReturnType } from "@homarr/form";
import { useZodForm } from "@homarr/form"; import { useZodForm } from "@homarr/form";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useI18n, useScopedI18n } from "@homarr/translation/client"; import { useI18n } from "@homarr/translation/client";
import { appHrefSchema } from "@homarr/validation/app"; import { appHrefSchema } from "@homarr/validation/app";
import { integrationCreateSchema } from "@homarr/validation/integration"; import { integrationCreateSchema } from "@homarr/validation/integration";
import { IntegrationSecretInput } from "../_components/secrets/integration-secret-inputs"; import { IntegrationSecretInput } from "../_components/secrets/integration-secret-inputs";
import { SecretKindsSegmentedControl } from "../_components/secrets/integration-secret-segmented-control";
import { IntegrationTestConnectionError } from "../_components/test-connection/integration-test-connection-error"; import { IntegrationTestConnectionError } from "../_components/test-connection/integration-test-connection-error";
import type { AnyMappedTestConnectionError } from "../_components/test-connection/types"; import type { AnyMappedTestConnectionError } from "../_components/test-connection/types";
@@ -218,40 +207,4 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) =>
); );
}; };
interface SecretKindsSegmentedControlProps {
secretKinds: IntegrationSecretKind[][];
form: UseFormReturnType<FormType, (values: FormType) => FormType>;
}
const SecretKindsSegmentedControl = ({ secretKinds, form }: SecretKindsSegmentedControlProps) => {
const t = useScopedI18n("integration.secrets");
const secretKindGroups = secretKinds.map((kinds) => ({
label:
kinds.length === 0
? t("noSecretsRequired.segmentTitle")
: kinds.map((kind) => t(`kind.${kind}.label`)).join(" & "),
value: kinds.length === 0 ? "empty" : kinds.join("-"),
}));
const onChange = useCallback(
(value: string) => {
if (value === "empty") {
form.setFieldValue("secrets", []);
return;
}
const kinds = value.split("-") as IntegrationSecretKind[];
const secrets = kinds.map((kind) => ({
kind,
value: "",
}));
form.setFieldValue("secrets", secrets);
},
[form],
);
return <SegmentedControl fullWidth data={secretKindGroups} onChange={onChange}></SegmentedControl>;
};
type FormType = z.infer<typeof formSchema>; type FormType = z.infer<typeof formSchema>;

View File

@@ -12,6 +12,7 @@ export class DynamicSectionMockBuilder {
options: { options: {
title: "", title: "",
borderColor: "", borderColor: "",
customCssClasses: [],
}, },
layouts: [], layouts: [],
...section, ...section,

View File

@@ -1,4 +1,5 @@
import { Badge, Box, Card } from "@mantine/core"; import { Badge, Box, Card } from "@mantine/core";
import combineClasses from "clsx";
import { useCurrentLayout, useRequiredBoard } from "@homarr/boards/context"; import { useCurrentLayout, useRequiredBoard } from "@homarr/boards/context";
@@ -24,7 +25,7 @@ export const BoardDynamicSection = ({ section }: Props) => {
}} }}
> >
<Card <Card
className={classes.itemCard} className={combineClasses(classes.itemCard, section.options.customCssClasses.join(" "))}
w="100%" w="100%"
h="100%" h="100%"
withBorder withBorder

View File

@@ -19,6 +19,7 @@ export const addDynamicSectionCallback = () => (board: Board) => {
options: { options: {
title: "", title: "",
borderColor: "", borderColor: "",
customCssClasses: [],
}, },
layouts: createDynamicSectionLayouts(board, firstSection), layouts: createDynamicSectionLayouts(board, firstSection),
} satisfies DynamicSection; } satisfies DynamicSection;

View File

@@ -6,6 +6,7 @@ import type { z } from "zod/v4";
import { useZodForm } from "@homarr/form"; import { useZodForm } from "@homarr/form";
import { createModal } from "@homarr/modals"; import { createModal } from "@homarr/modals";
import { useI18n } from "@homarr/translation/client"; import { useI18n } from "@homarr/translation/client";
import { TextMultiSelect } from "@homarr/ui";
import { dynamicSectionOptionsSchema } from "@homarr/validation/shared"; import { dynamicSectionOptionsSchema } from "@homarr/validation/shared";
interface ModalProps { interface ModalProps {
@@ -31,6 +32,10 @@ export const DynamicSectionEditModal = createModal<ModalProps>(({ actions, inner
> >
<Stack> <Stack>
<TextInput label={t("section.dynamic.option.title.label")} {...form.getInputProps("title")} /> <TextInput label={t("section.dynamic.option.title.label")} {...form.getInputProps("title")} />
<TextMultiSelect
label={t("section.dynamic.option.customCssClasses.label")}
{...form.getInputProps("customCssClasses")}
/>
<ColorInput <ColorInput
label={t("section.dynamic.option.borderColor.label")} label={t("section.dynamic.option.borderColor.label")}
format="hex" format="hex"

View File

@@ -38,7 +38,7 @@
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"dotenv": "^17.2.2", "dotenv": "^17.2.3",
"fastify": "^5.6.1", "fastify": "^5.6.1",
"superjson": "2.2.2", "superjson": "2.2.2",
"undici": "7.16.0" "undici": "7.16.0"
@@ -47,12 +47,12 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node": "^22.18.7", "@types/node": "^22.18.8",
"dotenv-cli": "^10.0.0", "dotenv-cli": "^10.0.0",
"esbuild": "^0.25.10", "esbuild": "^0.25.10",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"tsx": "4.20.4", "tsx": "4.20.4",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -25,7 +25,7 @@
"@homarr/log": "workspace:^", "@homarr/log": "workspace:^",
"@homarr/redis": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"dotenv": "^17.2.2", "dotenv": "^17.2.3",
"tsx": "4.20.4", "tsx": "4.20.4",
"ws": "^8.18.3" "ws": "^8.18.3"
}, },
@@ -35,8 +35,8 @@
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/ws": "^8.18.1", "@types/ws": "^8.18.1",
"esbuild": "^0.25.10", "esbuild": "^0.25.10",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -42,23 +42,23 @@
"@semantic-release/github": "^11.0.6", "@semantic-release/github": "^11.0.6",
"@semantic-release/npm": "^12.0.2", "@semantic-release/npm": "^12.0.2",
"@semantic-release/release-notes-generator": "^14.1.0", "@semantic-release/release-notes-generator": "^14.1.0",
"@testcontainers/redis": "^11.6.0", "@testcontainers/redis": "^11.7.1",
"@turbo/gen": "^2.5.8", "@turbo/gen": "^2.5.8",
"@vitejs/plugin-react": "^5.0.4", "@vitejs/plugin-react": "^5.0.4",
"@vitest/coverage-v8": "^3.2.4", "@vitest/coverage-v8": "^3.2.4",
"@vitest/ui": "^3.2.4", "@vitest/ui": "^3.2.4",
"conventional-changelog-conventionalcommits": "^9.1.0", "conventional-changelog-conventionalcommits": "^9.1.0",
"cross-env": "^10.0.0", "cross-env": "^10.1.0",
"jsdom": "^27.0.0", "jsdom": "^27.0.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"semantic-release": "^24.2.9", "semantic-release": "^24.2.9",
"testcontainers": "^11.6.0", "testcontainers": "^11.7.1",
"turbo": "^2.5.8", "turbo": "^2.5.8",
"typescript": "^5.9.2", "typescript": "^5.9.3",
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4" "vitest": "^3.2.4"
}, },
"packageManager": "pnpm@10.17.1", "packageManager": "pnpm@10.18.0",
"engines": { "engines": {
"node": ">=22.20.0" "node": ">=22.20.0"
}, },
@@ -82,18 +82,18 @@
"brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1", "brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1",
"esbuild@<=0.24.2": ">=0.25.10", "esbuild@<=0.24.2": ">=0.25.10",
"form-data@>=4.0.0 <4.0.4": ">=4.0.4", "form-data@>=4.0.0 <4.0.4": ">=4.0.4",
"hono@<4.6.5": ">=4.9.9", "hono@<4.6.5": ">=4.9.10",
"linkifyjs@<4.3.2": ">=4.3.2", "linkifyjs@<4.3.2": ">=4.3.2",
"nanoid@>=4.0.0 <5.0.9": ">=5.1.6", "nanoid@>=4.0.0 <5.0.9": ">=5.1.6",
"prismjs@<1.30.0": ">=1.30.0", "prismjs@<1.30.0": ">=1.30.0",
"proxmox-api>undici": "7.16.0", "proxmox-api>undici": "7.16.0",
"react-is": "^19.1.1", "react-is": "^19.2.0",
"rollup@>=4.0.0 <4.22.4": ">=4.52.3", "rollup@>=4.0.0 <4.22.4": ">=4.52.4",
"sha.js@<=2.4.11": ">=2.4.12", "sha.js@<=2.4.11": ">=2.4.12",
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.1", "tar-fs@>=3.0.0 <3.0.9": ">=3.1.1",
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.1", "tar-fs@>=2.0.0 <2.1.3": ">=3.1.1",
"tmp@<=0.2.3": ">=0.2.5", "tmp@<=0.2.3": ">=0.2.5",
"vite@>=5.0.0 <=5.4.18": ">=7.1.7" "vite@>=5.0.0 <=5.4.18": ">=7.1.9"
}, },
"patchedDependencies": { "patchedDependencies": {
"@types/node-unifi": "patches/@types__node-unifi.patch", "@types/node-unifi": "patches/@types__node-unifi.patch",

View File

@@ -32,7 +32,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -41,7 +41,7 @@
"@homarr/request-handler": "workspace:^0.1.0", "@homarr/request-handler": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.3.0", "@kubernetes/client-node": "^1.4.0",
"@tanstack/react-query": "^5.90.2", "@tanstack/react-query": "^5.90.2",
"@trpc/client": "^11.6.0", "@trpc/client": "^11.6.0",
"@trpc/react-query": "^11.6.0", "@trpc/react-query": "^11.6.0",
@@ -49,8 +49,8 @@
"@trpc/tanstack-react-query": "^11.6.0", "@trpc/tanstack-react-query": "^11.6.0",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "^4.5.0",
"next": "15.5.4", "next": "15.5.4",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"superjson": "2.2.2", "superjson": "2.2.2",
"trpc-to-openapi": "^3.0.1", "trpc-to-openapi": "^3.0.1",
"zod": "^4.1.11" "zod": "^4.1.11"
@@ -59,8 +59,8 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -4,7 +4,7 @@ import { z } from "zod/v4";
import { createId, objectEntries } from "@homarr/common"; import { createId, objectEntries } from "@homarr/common";
import { decryptSecret, encryptSecret } from "@homarr/common/server"; import { decryptSecret, encryptSecret } from "@homarr/common/server";
import type { Database } from "@homarr/db"; import type { Database } from "@homarr/db";
import { and, asc, eq, handleTransactionsAsync, inArray, like } from "@homarr/db"; import { and, asc, eq, handleTransactionsAsync, inArray, like, or } from "@homarr/db";
import { import {
groupMembers, groupMembers,
groupPermissions, groupPermissions,
@@ -386,6 +386,21 @@ export const integrationRouter = createTRPCRouter({
} }
} }
const removedSecrets = integration.secrets.filter(
(dbSecret) => !input.secrets.some((secret) => dbSecret.kind === secret.kind),
);
if (removedSecrets.length >= 1) {
await ctx.db
.delete(integrationSecrets)
.where(
or(
...removedSecrets.map((secret) =>
and(eq(integrationSecrets.integrationId, input.id), eq(integrationSecrets.kind, secret.kind)),
),
),
);
}
logger.info("Updated integration", { logger.info("Updated integration", {
id: input.id, id: input.id,
name: input.name, name: input.name,

View File

@@ -37,8 +37,8 @@
"ldapts": "8.0.9", "ldapts": "8.0.9",
"next": "15.5.4", "next": "15.5.4",
"next-auth": "5.0.0-beta.29", "next-auth": "5.0.0-beta.29",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
@@ -47,8 +47,8 @@
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/bcrypt": "6.0.0", "@types/bcrypt": "6.0.0",
"@types/cookies": "0.9.1", "@types/cookies": "0.9.1",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -25,14 +25,14 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/api": "workspace:^0.1.0", "@homarr/api": "workspace:^0.1.0",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1" "react-dom": "19.2.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -30,7 +30,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -28,14 +28,14 @@
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"dotenv": "^17.2.2" "dotenv": "^17.2.3"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"esbuild": "^0.25.10", "esbuild": "^0.25.10",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -34,8 +34,8 @@
"dns-caching": "^0.2.7", "dns-caching": "^0.2.7",
"next": "15.5.4", "next": "15.5.4",
"octokit": "^5.0.3", "octokit": "^5.0.3",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"undici": "7.16.0", "undici": "7.16.0",
"zod": "^4.1.11", "zod": "^4.1.11",
"zod-validation-error": "^4.0.2" "zod-validation-error": "^4.0.2"
@@ -44,7 +44,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -47,3 +47,8 @@ export const humanFileSize = (size: number, concat = ""): string => {
} }
return "∞"; return "∞";
}; };
const IMPERIAL_MULTIPLIER = 1.609344;
export const metricToImperial = (metricValue: number) => metricValue / IMPERIAL_MULTIPLIER;
export const imperialToMetric = (imperialValue: number) => imperialValue * IMPERIAL_MULTIPLIER;

View File

@@ -32,7 +32,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -34,7 +34,7 @@
"@trpc/server": "^11.6.0", "@trpc/server": "^11.6.0",
"@trpc/tanstack-react-query": "^11.6.0", "@trpc/tanstack-react-query": "^11.6.0",
"node-cron": "^4.2.1", "node-cron": "^4.2.1",
"react": "19.1.1", "react": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
@@ -42,8 +42,8 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"@types/react": "19.1.15", "@types/react": "19.2.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -29,7 +29,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -33,7 +33,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -44,7 +44,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -49,14 +49,14 @@
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@paralleldrive/cuid2": "^2.2.2", "@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.6.0", "@testcontainers/mysql": "^11.7.1",
"@testcontainers/postgresql": "^11.6.0", "@testcontainers/postgresql": "^11.7.1",
"better-sqlite3": "^12.4.1", "better-sqlite3": "^12.4.1",
"dotenv": "^17.2.2", "dotenv": "^17.2.3",
"drizzle-kit": "^0.31.5", "drizzle-kit": "^0.31.5",
"drizzle-orm": "^0.44.5", "drizzle-orm": "^0.44.6",
"drizzle-zod": "^0.8.3", "drizzle-zod": "^0.8.3",
"mysql2": "3.15.1", "mysql2": "3.15.1",
"pg": "^8.16.3", "pg": "^8.16.3",
@@ -70,9 +70,9 @@
"@types/pg": "^8.15.5", "@types/pg": "^8.15.5",
"dotenv-cli": "^10.0.0", "dotenv-cli": "^10.0.0",
"esbuild": "^0.25.10", "esbuild": "^0.25.10",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"tsx": "4.20.4", "tsx": "4.20.4",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -24,15 +24,15 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"fast-xml-parser": "^5.2.5", "fast-xml-parser": "^5.3.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"tsx": "4.20.4", "tsx": "4.20.4",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -26,14 +26,14 @@
"dependencies": { "dependencies": {
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"dockerode": "^4.0.8" "dockerode": "^4.0.9"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/dockerode": "^3.3.44", "@types/dockerode": "^3.3.44",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -26,7 +26,7 @@
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.3.2", "@mantine/form": "^8.3.3",
"mantine-form-zod-resolver": "^1.3.0", "mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
@@ -34,7 +34,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -29,15 +29,15 @@
"@homarr/notifications": "workspace:^0.1.0", "@homarr/notifications": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"react": "19.1.1", "react": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -31,7 +31,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -33,7 +33,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/bcrypt": "6.0.0", "@types/bcrypt": "6.0.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -25,8 +25,8 @@
}, },
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@ctrl/deluge": "^7.3.0", "@ctrl/deluge": "^7.4.0",
"@ctrl/qbittorrent": "^9.8.0", "@ctrl/qbittorrent": "^9.9.0",
"@ctrl/transmission": "^7.4.0", "@ctrl/transmission": "^7.4.0",
"@gitbeaker/rest": "^43.5.0", "@gitbeaker/rest": "^43.5.0",
"@homarr/certificates": "workspace:^0.1.0", "@homarr/certificates": "workspace:^0.1.0",
@@ -40,7 +40,7 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@jellyfin/sdk": "^0.11.0", "@jellyfin/sdk": "^0.11.0",
"@octokit/auth-app": "^8.1.0", "@octokit/auth-app": "^8.1.1",
"ical.js": "^2.2.1", "ical.js": "^2.2.1",
"maria2": "^0.4.1", "maria2": "^0.4.1",
"node-ical": "^0.21.0", "node-ical": "^0.21.0",
@@ -57,7 +57,7 @@
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-unifi": "^2.5.1", "@types/node-unifi": "^2.5.1",
"@types/xml2js": "^0.4.14", "@types/xml2js": "^0.4.14",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -26,14 +26,14 @@
"dependencies": { "dependencies": {
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"superjson": "2.2.2", "superjson": "2.2.2",
"winston": "3.17.0", "winston": "3.18.3",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -33,19 +33,19 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"next": "15.5.4", "next": "15.5.4",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -24,15 +24,15 @@
"dependencies": { "dependencies": {
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@mantine/hooks": "^8.3.2", "@mantine/hooks": "^8.3.3",
"react": "19.1.1" "react": "19.2.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -24,14 +24,14 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/notifications": "^8.3.2", "@mantine/notifications": "^8.3.3",
"@tabler/icons-react": "^3.35.0" "@tabler/icons-react": "^3.35.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -37,12 +37,12 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@mantine/hooks": "^8.3.2", "@mantine/hooks": "^8.3.3",
"adm-zip": "0.5.16", "adm-zip": "0.5.16",
"next": "15.5.4", "next": "15.5.4",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"superjson": "2.2.2", "superjson": "2.2.2",
"zod": "^4.1.11", "zod": "^4.1.11",
"zod-form-data": "^3.0.1" "zod-form-data": "^3.0.1"
@@ -52,7 +52,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/adm-zip": "0.5.7", "@types/adm-zip": "0.5.7",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -88,6 +88,7 @@ const optionMapping: OptionMapping = {
location: (oldOptions) => oldOptions.location, location: (oldOptions) => oldOptions.location,
showCity: (oldOptions) => oldOptions.displayCityName, showCity: (oldOptions) => oldOptions.displayCityName,
dateFormat: (oldOptions) => (oldOptions.dateFormat === "hide" ? undefined : oldOptions.dateFormat), dateFormat: (oldOptions) => (oldOptions.dateFormat === "hide" ? undefined : oldOptions.dateFormat),
useImperialSpeed: () => undefined,
}, },
iframe: { iframe: {
embedUrl: (oldOptions) => oldOptions.embedUrl, embedUrl: (oldOptions) => oldOptions.embedUrl,

View File

@@ -29,7 +29,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -30,7 +30,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -34,7 +34,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -39,7 +39,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -29,7 +29,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -26,16 +26,16 @@
"@homarr/api": "workspace:^0.1.0", "@homarr/api": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.3.2", "@mantine/dates": "^8.3.3",
"next": "15.5.4", "next": "15.5.4",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1" "react-dom": "19.2.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -33,21 +33,21 @@
"@homarr/settings": "workspace:^0.1.0", "@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@mantine/hooks": "^8.3.2", "@mantine/hooks": "^8.3.3",
"@mantine/spotlight": "^8.3.2", "@mantine/spotlight": "^8.3.3",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"jotai": "^2.15.0", "jotai": "^2.15.0",
"next": "15.5.4", "next": "15.5.4",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"use-deep-compare-effect": "^1.8.1" "use-deep-compare-effect": "^1.8.1"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -34,14 +34,14 @@
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.5.4", "next": "15.5.4",
"next-intl": "4.3.9", "next-intl": "4.3.9",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1" "react-dom": "19.2.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "正在播放", "currentlyPlaying": "正在播放",
"user": "用户", "user": "用户",
"name": "名称", "name": "名称",
"id": "ID" "id": "ID",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "相关的库", "title": "相关的库",
"subtitle": "{count} 用于 Homarr 代码中" "subtitle": "{count} 用于 Homarr 代码中"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "crwdns2847:0crwdne2847:0", "currentlyPlaying": "crwdns2847:0crwdne2847:0",
"user": "crwdns2476:0crwdne2476:0", "user": "crwdns2476:0crwdne2476:0",
"name": "crwdns2478:0crwdne2478:0", "name": "crwdns2478:0crwdne2478:0",
"id": "crwdns2480:0crwdne2480:0" "id": "crwdns2480:0crwdne2480:0",
"metadata": {
"title": "crwdns3744:0crwdne3744:0",
"video": {
"title": "crwdns3746:0crwdne3746:0",
"resolution": "crwdns3748:0crwdne3748:0"
},
"audio": {
"title": "crwdns3750:0crwdne3750:0",
"channelCount": "crwdns3752:0crwdne3752:0",
"codec": "crwdns3754:0crwdne3754:0"
},
"transcoding": {
"title": "crwdns3756:0crwdne3756:0",
"container": "crwdns3758:0crwdne3758:0",
"resolution": "crwdns3760:0crwdne3760:0",
"target": "crwdns3762:0crwdne3762:0"
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "crwdns1888:0crwdne1888:0", "title": "crwdns1888:0crwdne1888:0",
"subtitle": "crwdns1890:0{count}crwdne1890:0" "subtitle": "crwdns1890:0{count}crwdne1890:0"
},
"hotkeys": {
"title": "crwdns3726:0crwdne3726:0",
"subtitle": "crwdns3728:0crwdne3728:0",
"field": {
"shortcut": "crwdns3730:0crwdne3730:0",
"action": "crwdns3732:0crwdne3732:0"
},
"action": {
"toggleBoardEdit": "crwdns3734:0crwdne3734:0",
"toggleColorScheme": "crwdns3736:0crwdne3736:0",
"saveNotebook": "crwdns3738:0crwdne3738:0",
"openSpotlight": "crwdns3740:0crwdne3740:0"
},
"note": "crwdns3742:0crwdne3742:0"
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "Uživatel", "user": "Uživatel",
"name": "Jméno", "name": "Jméno",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Afspiller lige nu", "currentlyPlaying": "Afspiller lige nu",
"user": "Bruger", "user": "Bruger",
"name": "Navn", "name": "Navn",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Biblioteker", "title": "Biblioteker",
"subtitle": "{count} brugt i koden for Homarr" "subtitle": "{count} brugt i koden for Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Aktuelle Wiedergabe", "currentlyPlaying": "Aktuelle Wiedergabe",
"user": "Benutzer", "user": "Benutzer",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Bibliotheken", "title": "Bibliotheken",
"subtitle": "{count} im Code von Homarr verwendet" "subtitle": "{count} im Code von Homarr verwendet"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -946,28 +946,28 @@
"newLabel": "Neues Thema erstellen" "newLabel": "Neues Thema erstellen"
}, },
"url": { "url": {
"label": "", "label": "URL",
"newLabel": "" "newLabel": "Neue URL"
}, },
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "API-Schlüssel (Schlüssel)",
"newLabel": "" "newLabel": "Neuer API-Schlüssel (Schlüssel)"
}, },
"opnsenseApiSecret": { "opnsenseApiSecret": {
"label": "", "label": "API-Schlüssel (Secret)",
"newLabel": "" "newLabel": "Neuer API-Schlüssel (Secret)"
}, },
"githubAppId": { "githubAppId": {
"label": "", "label": "App ID",
"newLabel": "" "newLabel": "Neue App ID"
}, },
"githubInstallationId": { "githubInstallationId": {
"label": "", "label": "Installations ID",
"newLabel": "" "newLabel": "Neue Installations ID"
}, },
"privateKey": { "privateKey": {
"label": "", "label": "Privater Schlüssel",
"newLabel": "" "newLabel": "Neuer privater Schlüssel"
} }
} }
}, },
@@ -1019,7 +1019,7 @@
} }
}, },
"common": { "common": {
"success": "", "success": "Erfolgreich",
"beta": "Beta", "beta": "Beta",
"error": "Fehler", "error": "Fehler",
"action": { "action": {
@@ -1286,21 +1286,21 @@
"label": "Statusüberprüfung aktivieren" "label": "Statusüberprüfung aktivieren"
}, },
"layout": { "layout": {
"label": "", "label": "Ansicht",
"option": { "option": {
"row": "", "row": "Horizontal",
"row-reverse": "", "row-reverse": "Horizontal (invertiert)",
"column": "", "column": "Vertikal",
"column-reverse": "" "column-reverse": "Vertikal (invertiert)"
} }
}, },
"descriptionDisplayMode": { "descriptionDisplayMode": {
"label": "", "label": "Beschreibung des Anzeigemodus",
"description": "", "description": "Wählen Sie, wie die App-Beschreibung angezeigt werden soll",
"option": { "option": {
"normal": "", "normal": "Innerhalb des Widgets",
"tooltip": "", "tooltip": "Als Tooltip",
"hidden": "" "hidden": "Versteckt"
} }
} }
}, },
@@ -1549,11 +1549,11 @@
}, },
"placeholder": "Mit dem Schreiben von Notizen beginnen", "placeholder": "Mit dem Schreiben von Notizen beginnen",
"dismiss": { "dismiss": {
"title": "", "title": "Änderungen verwerfen?",
"message": "", "message": "Sie haben ungespeicherte Änderungen in Ihrem Notizbuch. Sind Sie sicher, dass Sie diese verwerfen möchten?",
"action": { "action": {
"discard": "", "discard": "Änderungen verwerfen",
"keepEditing": "" "keepEditing": "Bearbeitung fortsetzen"
} }
} }
}, },
@@ -1708,7 +1708,7 @@
"name": "Kalender", "name": "Kalender",
"description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an", "description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an",
"duration": { "duration": {
"allDay": "" "allDay": "Ganztägig"
}, },
"option": { "option": {
"releaseType": { "releaseType": {
@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Aktuelle Wiedergabe", "currentlyPlaying": "Aktuelle Wiedergabe",
"user": "Benutzer", "user": "Benutzer",
"name": "Name", "name": "Name",
"id": "Id" "id": "Id",
"metadata": {
"title": "Statistiken für Nerds",
"video": {
"title": "Video",
"resolution": "Auflösung"
},
"audio": {
"title": "Audio",
"channelCount": "Audio Kanäle",
"codec": "Audio Codec"
},
"transcoding": {
"title": "Transkodierung",
"container": "Container",
"resolution": "Auflösung",
"target": "Ziel Codec"
}
}
} }
}, },
"downloads": { "downloads": {
@@ -2288,7 +2306,7 @@
"label": "Limit für Beiträge" "label": "Limit für Beiträge"
}, },
"hideDescription": { "hideDescription": {
"label": "" "label": "Beschreibung ausblenden"
} }
} }
}, },
@@ -2507,24 +2525,24 @@
"description": "CPU, Arbeitsspeicher, Festplatte und andere Hardware-Nutzung Ihres Systems", "description": "CPU, Arbeitsspeicher, Festplatte und andere Hardware-Nutzung Ihres Systems",
"option": { "option": {
"hasShadow": { "hasShadow": {
"label": "" "label": "Schattierung der Diagramme aktivieren"
}, },
"visibleCharts": { "visibleCharts": {
"label": "", "label": "Sichtbare Diagramme",
"description": "", "description": "Wählen Sie die Diagramme aus, die angezeigt werden sollen.",
"option": { "option": {
"cpu": "", "cpu": "CPU",
"memory": "", "memory": "Speicher",
"network": "" "network": "Netzwerk"
} }
}, },
"labelDisplayMode": { "labelDisplayMode": {
"label": "", "label": "Anzeigemodus der Beschriftung",
"option": { "option": {
"textWithIcon": "", "textWithIcon": "Text mit Symbol anzeigen",
"text": "", "text": "Nur Text anzeigen",
"icon": "", "icon": "Nur das Symbol anzeigen",
"hidden": "" "hidden": "Beschriftung ausblenden"
} }
} }
}, },
@@ -3331,10 +3349,10 @@
"weeklyMonday": "Jede Woche am Montag", "weeklyMonday": "Jede Woche am Montag",
"update": { "update": {
"success": { "success": {
"message": "" "message": "Intervall erfolgreich aktualisiert"
}, },
"error": { "error": {
"message": "" "message": "Fehler beim Aktualisieren des Intervalls"
} }
} }
}, },
@@ -3365,33 +3383,33 @@
}, },
"refresh": { "refresh": {
"success": { "success": {
"message": "" "message": "Aufgaben erfolgreich aktualisiert"
}, },
"error": { "error": {
"message": "" "message": "Fehler beim Aktualisieren der Aufgaben"
} }
}, },
"trigger": { "trigger": {
"success": { "success": {
"message": "" "message": "Aufgabe erfolgreich ausgelöst"
}, },
"error": { "error": {
"message": "" "message": "Fehler beim Auslösen der Aufgabe"
} }
}, },
"enable": { "enable": {
"success": { "success": {
"message": "" "message": "Aufgabe erfolgreich aktiviert"
} }
}, },
"disable": { "disable": {
"success": { "success": {
"message": "" "message": "Aufgabe erfolgreich deaktiviert"
} }
}, },
"toggle": { "toggle": {
"error": { "error": {
"message": "" "message": "Fehler beim Umschalten des Aufgabenstatus"
} }
} }
}, },
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Bibliotheken", "title": "Bibliotheken",
"subtitle": "{count} im Code von Homarr verwendet" "subtitle": "{count} im Code von Homarr verwendet"
},
"hotkeys": {
"title": "Tastenkürzel",
"subtitle": "Tastenkürzel zur Verbesserung Ihres Workflows",
"field": {
"shortcut": "Verknüpfung",
"action": "Aktion"
},
"action": {
"toggleBoardEdit": "Bearbeitungsmodus des Boardes umschalten",
"toggleColorScheme": "Hell/Dunkelmodus umschalten",
"saveNotebook": "Notizbuch speichern (nur innerhalb des Notizbuch Widgets)",
"openSpotlight": "Suche öffnen"
},
"note": "Tipp: Mod bezieht sich sowohl auf die Strg-Taste als auch auf die ⌘ Taste auf macOS"
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Group name already taken" "groupNameTaken": "Group name already taken"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "km/h",
"milesPerHour": "mph"
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Title" "label": "Title"
}, },
"customCssClasses": {
"label": "Custom css classes"
},
"borderColor": { "borderColor": {
"label": "Border color" "label": "Border color"
} }
@@ -1744,6 +1753,9 @@
"label": "Show current wind speed", "label": "Show current wind speed",
"description": "Only on current weather" "description": "Only on current weather"
}, },
"useImperialSpeed": {
"label": "Use mph for windspeed"
},
"location": { "location": {
"label": "Weather location" "label": "Weather location"
}, },
@@ -1762,12 +1774,12 @@
"description": "How the date should look like" "description": "How the date should look like"
} }
}, },
"currentWindSpeed": "{currentWindSpeed} km/h", "currentWindSpeed": "{currentWindSpeed} {unit}",
"dailyForecast": { "dailyForecast": {
"sunrise": "Sunrise", "sunrise": "Sunrise",
"sunset": "Sunset", "sunset": "Sunset",
"maxWindSpeed": "Max wind speed: {maxWindSpeed} km/h", "maxWindSpeed": "Max wind speed: {maxWindSpeed} {unit}",
"maxWindGusts": "Max wind gusts: {maxWindGusts} km/h" "maxWindGusts": "Max wind gusts: {maxWindGusts} {unit}"
}, },
"kind": { "kind": {
"clear": "Clear", "clear": "Clear",

View File

@@ -302,7 +302,7 @@
"group": { "group": {
"title": "Grupos", "title": "Grupos",
"name": "Grupo", "name": "Grupo",
"search": "Encontrar un grupo", "search": "Buscar un grupo...",
"field": { "field": {
"name": "Nombre", "name": "Nombre",
"members": "Miembros", "members": "Miembros",
@@ -1043,9 +1043,9 @@
"previous": "Anterior", "previous": "Anterior",
"next": "Siguiente", "next": "Siguiente",
"checkoutDocs": "Consultar la documentación", "checkoutDocs": "Consultar la documentación",
"checkLogs": "Comprobar los registros para más detalles", "checkLogs": "Comprueba los registros para más detalles",
"tryAgain": "Intentar de nuevo", "tryAgain": "Intentar de nuevo",
"loading": "Cargar" "loading": "Cargando"
}, },
"here": "aquí", "here": "aquí",
"iconPicker": { "iconPicker": {
@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Reproducción en curso", "currentlyPlaying": "Reproducción en curso",
"user": "Usuario", "user": "Usuario",
"name": "Nombre", "name": "Nombre",
"id": "ID" "id": "ID",
"metadata": {
"title": "Estadísticas",
"video": {
"title": "Vídeo",
"resolution": "Resolución"
},
"audio": {
"title": "Audio",
"channelCount": "Canales de audio",
"codec": "Códec de audio"
},
"transcoding": {
"title": "Transcodificación",
"container": "Contenedor",
"resolution": "Resolución",
"target": "Códec de destino"
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3135,7 +3153,7 @@
}, },
"members": { "members": {
"title": "Miembros", "title": "Miembros",
"search": "Buscar un miembro", "search": "Buscar un miembro...",
"notFound": "No se han encontrado miembros" "notFound": "No se han encontrado miembros"
}, },
"permissions": { "permissions": {
@@ -3356,7 +3374,7 @@
} }
}, },
"table": { "table": {
"search": "Buscar {count} tareas..." "search": "Buscar una tarea..."
}, },
"action": { "action": {
"refresh": { "refresh": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Librerías", "title": "Librerías",
"subtitle": "{count} usadas en el Código de Homarr" "subtitle": "{count} usadas en el Código de Homarr"
},
"hotkeys": {
"title": "Accesos directos",
"subtitle": "Accesos directos de teclado para mejorar tu flujo de trabajo",
"field": {
"shortcut": "Acceso directo",
"action": "Acción"
},
"action": {
"toggleBoardEdit": "Cambiar a modo de edición de tablero",
"toggleColorScheme": "Cambiar a modo claro/oscuro",
"saveNotebook": "Guardar el bloc de notas (solo dentro del widget de bloc de notas)",
"openSpotlight": "Abrir búsqueda"
},
"note": "Sugerencia: Mod se refiere tanto a la tecla CTRL como a la tecla ⌘ en macOS"
} }
} }
} }
@@ -3575,7 +3608,7 @@
} }
}, },
"error": { "error": {
"internalServerError": "Fallo al obtener contenedores Docker" "internalServerError": "Fallo al obtener los contenedores de Docker"
} }
}, },
"kubernetes": { "kubernetes": {

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -946,24 +946,24 @@
"newLabel": "Nouveau sujet" "newLabel": "Nouveau sujet"
}, },
"url": { "url": {
"label": "", "label": "Url",
"newLabel": "" "newLabel": "Nouvelle url"
}, },
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "Clé API (Key)",
"newLabel": "" "newLabel": "Nouvelle clé API (Key)"
}, },
"opnsenseApiSecret": { "opnsenseApiSecret": {
"label": "", "label": "Clé API (secrète)",
"newLabel": "" "newLabel": "Nouvelle clé API (secrète)"
}, },
"githubAppId": { "githubAppId": {
"label": "", "label": "Identifiant de l'application",
"newLabel": "" "newLabel": "Nouvel Id de l'Application"
}, },
"githubInstallationId": { "githubInstallationId": {
"label": "", "label": "Id d'installation",
"newLabel": "" "newLabel": "Nouvel ID d'installation"
}, },
"privateKey": { "privateKey": {
"label": "", "label": "",
@@ -1980,7 +1980,25 @@
"currentlyPlaying": "En cours de lecture", "currentlyPlaying": "En cours de lecture",
"user": "Utilisateur", "user": "Utilisateur",
"name": "Nom", "name": "Nom",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "Résolution",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -2312,7 +2330,7 @@
"label": "Afficher les détails" "label": "Afficher les détails"
}, },
"showOnlyIcon": { "showOnlyIcon": {
"label": "" "label": "Afficher uniquement l'icône"
}, },
"topReleases": { "topReleases": {
"label": "Meilleures sorties", "label": "Meilleures sorties",
@@ -2331,8 +2349,8 @@
"listAlreadyImportedImages": "Liste des images déjà importées", "listAlreadyImportedImages": "Liste des images déjà importées",
"allImagesAlreadyImported": "Toutes les images déjà importées", "allImagesAlreadyImported": "Toutes les images déjà importées",
"onlyAdminCanImport": "Seuls les administrateurs peuvent importer depuis docker", "onlyAdminCanImport": "Seuls les administrateurs peuvent importer depuis docker",
"selectAll": "", "selectAll": "Tout sélectionner",
"deselectAll": "" "deselectAll": "Tout déselectionner"
}, },
"provider": { "provider": {
"label": "Fournisseur" "label": "Fournisseur"
@@ -2394,7 +2412,7 @@
"starsCount": "Étoiles", "starsCount": "Étoiles",
"forksCount": "", "forksCount": "",
"issuesCount": "Problèmes ouverts", "issuesCount": "Problèmes ouverts",
"markViewed": "", "markViewed": "Marquer comme vu(s)",
"openProjectPage": "Ouvrir la page du projet", "openProjectPage": "Ouvrir la page du projet",
"openReleasePage": "Ouvrir la page de publication", "openReleasePage": "Ouvrir la page de publication",
"releaseDescription": "Description de la publication", "releaseDescription": "Description de la publication",
@@ -2468,21 +2486,21 @@
} }
}, },
"firewall": { "firewall": {
"name": "", "name": "Surveillance du pare-feu",
"description": "", "description": "",
"tab": { "tab": {
"system": "", "system": "Système",
"interfaces": "" "interfaces": "Interfaces"
}, },
"error": { "error": {
"internalServerError": "" "internalServerError": "Impossible d'obtenir les données depuis le pare-feu"
}, },
"option": { "option": {
"interfaces": "" "interfaces": "Interfaces réseau à afficher"
}, },
"widget": { "widget": {
"fwname": "", "fwname": "Nom",
"version": "", "version": "Version",
"versiontitle": "", "versiontitle": "",
"cputitle": "", "cputitle": "",
"memorytitle": "", "memorytitle": "",
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Bibliothèques", "title": "Bibliothèques",
"subtitle": "{count} utilisés dans le Code d'Homarr" "subtitle": "{count} utilisés dans le Code d'Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "מתנגן כרגע", "currentlyPlaying": "מתנגן כרגע",
"user": "משתמש", "user": "משתמש",
"name": "שם", "name": "שם",
"id": "מזהה" "id": "מזהה",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "ספריות", "title": "ספריות",
"subtitle": "{count} בשימוש בקוד של Homarr" "subtitle": "{count} בשימוש בקוד של Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Attualmente in riproduzione", "currentlyPlaying": "Attualmente in riproduzione",
"user": "Utente", "user": "Utente",
"name": "Nome", "name": "Nome",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Librerie", "title": "Librerie",
"subtitle": "{count} utilizzato nel Codice di Homarr" "subtitle": "{count} utilizzato nel Codice di Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -946,8 +946,8 @@
"newLabel": "新規トピック" "newLabel": "新規トピック"
}, },
"url": { "url": {
"label": "", "label": "URL",
"newLabel": "" "newLabel": "新規URL"
}, },
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "API キー (キー)", "label": "API キー (キー)",
@@ -958,16 +958,16 @@
"newLabel": "新しい API キー (シークレット)" "newLabel": "新しい API キー (シークレット)"
}, },
"githubAppId": { "githubAppId": {
"label": "", "label": "App Id",
"newLabel": "" "newLabel": "新規App Id"
}, },
"githubInstallationId": { "githubInstallationId": {
"label": "", "label": "インストール ID",
"newLabel": "" "newLabel": "新規インストール ID"
}, },
"privateKey": { "privateKey": {
"label": "", "label": "秘密鍵",
"newLabel": "" "newLabel": "新しい秘密鍵"
} }
} }
}, },
@@ -1549,11 +1549,11 @@
}, },
"placeholder": "あなたのノートを書き始めましょう", "placeholder": "あなたのノートを書き始めましょう",
"dismiss": { "dismiss": {
"title": "", "title": "変更を放棄しますか?",
"message": "", "message": "ノートブックに保存されていない変更があります。それらを破棄してもよろしいですか?",
"action": { "action": {
"discard": "", "discard": "変更を破棄",
"keepEditing": "" "keepEditing": "編集を続ける"
} }
} }
}, },
@@ -1708,7 +1708,7 @@
"name": "カレンダー", "name": "カレンダー",
"description": "カレンダービューで、特定の相対的な期間内に、連携機能からのイベントを表示します", "description": "カレンダービューで、特定の相対的な期間内に、連携機能からのイベントを表示します",
"duration": { "duration": {
"allDay": "" "allDay": "すべての日"
}, },
"option": { "option": {
"releaseType": { "releaseType": {
@@ -1980,7 +1980,25 @@
"currentlyPlaying": "再生中の曲", "currentlyPlaying": "再生中の曲",
"user": "ユーザー", "user": "ユーザー",
"name": "名称", "name": "名称",
"id": "Id" "id": "Id",
"metadata": {
"title": "詳細統計情報",
"video": {
"title": "動画",
"resolution": "解像度"
},
"audio": {
"title": "音声",
"channelCount": "音声チャンネル",
"codec": "オーディオコーデック"
},
"transcoding": {
"title": "トランスコーディング",
"container": "コンテナー",
"resolution": "対応詳細",
"target": "ターゲットコーデック"
}
}
} }
}, },
"downloads": { "downloads": {
@@ -2288,7 +2306,7 @@
"label": "投稿数の上限" "label": "投稿数の上限"
}, },
"hideDescription": { "hideDescription": {
"label": "" "label": "詳細を非表示"
} }
} }
}, },
@@ -2507,24 +2525,24 @@
"description": "CPU、メモリ、ディスクなどのシステムハードウェアの使用", "description": "CPU、メモリ、ディスクなどのシステムハードウェアの使用",
"option": { "option": {
"hasShadow": { "hasShadow": {
"label": "" "label": "グラフのシェーディングを有効にする"
}, },
"visibleCharts": { "visibleCharts": {
"label": "", "label": "グラフの表示",
"description": "", "description": "表示するグラフを選択します。",
"option": { "option": {
"cpu": "", "cpu": "CPU",
"memory": "", "memory": "メモリ",
"network": "" "network": "ネットワーク"
} }
}, },
"labelDisplayMode": { "labelDisplayMode": {
"label": "", "label": "ラベル表示モード",
"option": { "option": {
"textWithIcon": "", "textWithIcon": "アイコン付きでテキストを表示",
"text": "", "text": "テキストのみ表示",
"icon": "", "icon": "アイコンのみ表示",
"hidden": "" "hidden": "ラベルを隠す"
} }
} }
}, },
@@ -3320,7 +3338,7 @@
"label": "ファイアウォールのインターフェース" "label": "ファイアウォールのインターフェース"
}, },
"weather": { "weather": {
"label": "" "label": "天気"
} }
}, },
"interval": { "interval": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "ライブラリ", "title": "ライブラリ",
"subtitle": "{count} 個が Homarr のコードで使用されています" "subtitle": "{count} 個が Homarr のコードで使用されています"
},
"hotkeys": {
"title": "ホットキー",
"subtitle": "ワークフローを強化するためのキーボードショートカット",
"field": {
"shortcut": "ショートカット",
"action": "アクション"
},
"action": {
"toggleBoardEdit": "ボード編集モードの切り替え",
"toggleColorScheme": "ライト/ダークモードの切り替え",
"saveNotebook": "ノートブックを保存 (ノートブックウィジェット内のみ)",
"openSpotlight": "検索を開く"
},
"note": "ヒントCtrlキーとMacOSの⌘キーの両方を参照します"
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Momenteel aan het afspelen", "currentlyPlaying": "Momenteel aan het afspelen",
"user": "Gebruiker", "user": "Gebruiker",
"name": "Naam", "name": "Naam",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Bibliotheken", "title": "Bibliotheken",
"subtitle": "{count} gebruikt in de code van Homarr" "subtitle": "{count} gebruikt in de code van Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Spilles nå", "currentlyPlaying": "Spilles nå",
"user": "Bruker", "user": "Bruker",
"name": "Navn", "name": "Navn",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Biblioteker", "title": "Biblioteker",
"subtitle": "{count} brukt i koden til Homarr" "subtitle": "{count} brukt i koden til Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1779,7 +1779,7 @@
"freezingRain": "Marznący deszcz", "freezingRain": "Marznący deszcz",
"snowFall": "Opady śniegu", "snowFall": "Opady śniegu",
"snowGrains": "Ziarna śniegu", "snowGrains": "Ziarna śniegu",
"rainShowers": "Deszczownice", "rainShowers": "Przelotne opady deszczu",
"snowShowers": "Przelotne opady śniegu", "snowShowers": "Przelotne opady śniegu",
"thunderstorm": "Burza", "thunderstorm": "Burza",
"thunderstormWithHail": "Burza z gradem", "thunderstormWithHail": "Burza z gradem",
@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Obecnie odtwarzane", "currentlyPlaying": "Obecnie odtwarzane",
"user": "Użytkownik", "user": "Użytkownik",
"name": "Nazwa", "name": "Nazwa",
"id": "ID" "id": "ID",
"metadata": {
"title": "Statystyki dla nerdów",
"video": {
"title": "Wideo",
"resolution": "Rozdzielczość"
},
"audio": {
"title": "Dźwięk",
"channelCount": "Kanały audio",
"codec": "Kodek audio"
},
"transcoding": {
"title": "Transkodowanie",
"container": "Kontener",
"resolution": "Rozdzielczość",
"target": "Kodek docelowy"
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Biblioteki", "title": "Biblioteki",
"subtitle": "{count} używanych w kodzie Homarr" "subtitle": "{count} używanych w kodzie Homarr"
},
"hotkeys": {
"title": "Skróty klawiszowe",
"subtitle": "Skróty klawiaturowe ułatwiające pracę”",
"field": {
"shortcut": "Skrót",
"action": "Akcja"
},
"action": {
"toggleBoardEdit": "Przełącz tryb edycji tablicy",
"toggleColorScheme": "Przełącz tryb jasny/ciemny",
"saveNotebook": "Zapisz notatnik (tylko w widżecie notatnika)",
"openSpotlight": "Otwórz wyszukiwarkę"
},
"note": "Wskazówka: Mod odnosi się zarówno do klawisza Ctrl, jak i ⌘ na macOS"
} }
} }
} }

View File

@@ -153,10 +153,10 @@
"label": "Usar ícone para pings" "label": "Usar ícone para pings"
}, },
"defaultSearchEngine": { "defaultSearchEngine": {
"label": "" "label": "Mecanismo de busca padrão"
}, },
"openSearchInNewTab": { "openSearchInNewTab": {
"label": "" "label": "Abrir resultados da busca em uma nova aba"
} }
}, },
"error": { "error": {
@@ -219,10 +219,10 @@
"changeSearchPreferences": { "changeSearchPreferences": {
"notification": { "notification": {
"success": { "success": {
"message": "" "message": "Preferências de busca alteradas com sucesso"
}, },
"error": { "error": {
"message": "" "message": "Não foi possível alterar as preferências de busca"
} }
} }
}, },
@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "Пользователь", "user": "Пользователь",
"name": "Название", "name": "Название",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Библиотеки", "title": "Библиотеки",
"subtitle": "{count} используются в коде Homarr" "subtitle": "{count} используются в коде Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Momentálne sa prehráva", "currentlyPlaying": "Momentálne sa prehráva",
"user": "Používateľ", "user": "Používateľ",
"name": "Názov", "name": "Názov",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Knižnice", "title": "Knižnice",
"subtitle": "{count} používané v Homarrskom kódexe" "subtitle": "{count} používané v Homarrskom kódexe"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1708,7 +1708,7 @@
"name": "Takvim", "name": "Takvim",
"description": "Entegrasyonlarınızdaki etkinlikleri belirli bir göreli zaman dilimi içinde bir takvim görünümünde görüntüleyin", "description": "Entegrasyonlarınızdaki etkinlikleri belirli bir göreli zaman dilimi içinde bir takvim görünümünde görüntüleyin",
"duration": { "duration": {
"allDay": "" "allDay": "Bütün gün"
}, },
"option": { "option": {
"releaseType": { "releaseType": {
@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Şuan Oynatılan", "currentlyPlaying": "Şuan Oynatılan",
"user": "Kullanıcı", "user": "Kullanıcı",
"name": "İsim", "name": "İsim",
"id": "Kimlik" "id": "Kimlik",
"metadata": {
"title": "Meraklısı için istatistikler",
"video": {
"title": "Video",
"resolution": "Çözünürlük"
},
"audio": {
"title": "Ses",
"channelCount": "Ses kanalları",
"codec": "Ses kodekleri"
},
"transcoding": {
"title": "Kod Dönüştürme",
"container": "Konteyner",
"resolution": "Çözünürlük",
"target": "Hedef Kodek"
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3320,7 +3338,7 @@
"label": "Güvenlik Duvarı Arayüzleri" "label": "Güvenlik Duvarı Arayüzleri"
}, },
"weather": { "weather": {
"label": "" "label": "Hava Durumu"
} }
}, },
"interval": { "interval": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Kütüphaneler", "title": "Kütüphaneler",
"subtitle": "Homarr kodlamasında {count} kütüphane kullanılıyor" "subtitle": "Homarr kodlamasında {count} kütüphane kullanılıyor"
},
"hotkeys": {
"title": "Kısayollar",
"subtitle": "İş akışınızı geliştirmek için klavye kısayolları",
"field": {
"shortcut": "Kısayol",
"action": "Eylem"
},
"action": {
"toggleBoardEdit": "Panonun düzenleme modunu değiştir",
"toggleColorScheme": "Aydınlık/karanlık mod",
"saveNotebook": "Not defterini kaydet (sadece not defteri widget'ının içinde)",
"openSpotlight": "Aramayı aç"
},
"note": "İpucu: Mod, macOS'ta hem Ctrl tuşunu hem de ⌘ tuşunu ifade eder"
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "Користувач", "user": "Користувач",
"name": "Назва", "name": "Назва",
"id": "Id" "id": "Id",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Бібліотеки", "title": "Бібліотеки",
"subtitle": "{count} - стільки бібліотек використано в коді Homarr" "subtitle": "{count} - стільки бібліотек використано в коді Homarr"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "", "currentlyPlaying": "",
"user": "", "user": "",
"name": "", "name": "",
"id": "" "id": "",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "", "title": "",
"subtitle": "" "subtitle": ""
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "目前播放中", "currentlyPlaying": "目前播放中",
"user": "使用者", "user": "使用者",
"name": "名稱", "name": "名稱",
"id": "ID" "id": "ID",
"metadata": {
"title": "",
"video": {
"title": "",
"resolution": ""
},
"audio": {
"title": "",
"channelCount": "",
"codec": ""
},
"transcoding": {
"title": "",
"container": "",
"resolution": "",
"target": ""
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "資料庫", "title": "資料庫",
"subtitle": "{count} 於 Homarr 待碼中使用" "subtitle": "{count} 於 Homarr 待碼中使用"
},
"hotkeys": {
"title": "",
"subtitle": "",
"field": {
"shortcut": "",
"action": ""
},
"action": {
"toggleBoardEdit": "",
"toggleColorScheme": "",
"saveNotebook": "",
"openSpotlight": ""
},
"note": ""
} }
} }
} }

View File

@@ -30,14 +30,14 @@
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@mantine/dates": "^8.3.2", "@mantine/dates": "^8.3.3",
"@mantine/hooks": "^8.3.2", "@mantine/hooks": "^8.3.3",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.5.4", "next": "15.5.4",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"svgson": "^5.3.1" "svgson": "^5.3.1"
}, },
"devDependencies": { "devDependencies": {
@@ -45,7 +45,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/css-modules": "^1.0.5", "@types/css-modules": "^1.0.5",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -31,7 +31,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -62,6 +62,7 @@ const emptySectionSchema = z.object({
export const dynamicSectionOptionsSchema = z.object({ export const dynamicSectionOptionsSchema = z.object({
title: z.string().max(20).default(""), title: z.string().max(20).default(""),
customCssClasses: z.array(z.string()).default([]),
borderColor: z.string().default(""), borderColor: z.string().default(""),
}); });

View File

@@ -48,9 +48,9 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/charts": "^8.3.2", "@mantine/charts": "^8.3.3",
"@mantine/core": "^8.3.2", "@mantine/core": "^8.3.3",
"@mantine/hooks": "^8.3.2", "@mantine/hooks": "^8.3.3",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"@tiptap/extension-color": "2.26.2", "@tiptap/extension-color": "2.26.2",
"@tiptap/extension-highlight": "2.26.2", "@tiptap/extension-highlight": "2.26.2",
@@ -73,8 +73,8 @@
"mantine-form-zod-resolver": "^1.3.0", "mantine-form-zod-resolver": "^1.3.0",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.5.4", "next": "15.5.4",
"react": "19.1.1", "react": "19.2.0",
"react-dom": "19.1.1", "react-dom": "19.2.0",
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",
"recharts": "^2.15.4", "recharts": "^2.15.4",
"video.js": "^8.23.4", "video.js": "^8.23.4",
@@ -85,7 +85,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/video.js": "^7.3.58", "@types/video.js": "^7.3.58",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -7,6 +7,7 @@ import dayjs from "dayjs";
import type { RouterOutputs } from "@homarr/api"; import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client"; import { clientApi } from "@homarr/api/client";
import { metricToImperial } from "@homarr/common";
import { useScopedI18n } from "@homarr/translation/client"; import { useScopedI18n } from "@homarr/translation/client";
import type { WidgetComponentProps } from "../definition"; import type { WidgetComponentProps } from "../definition";
@@ -52,6 +53,7 @@ interface WeatherProps extends Pick<WidgetComponentProps<"weather">, "options">
const DailyWeather = ({ options, weather }: WeatherProps) => { const DailyWeather = ({ options, weather }: WeatherProps) => {
const t = useScopedI18n("widget.weather"); const t = useScopedI18n("widget.weather");
const tCommon = useScopedI18n("common");
return ( return (
<> <>
@@ -78,7 +80,17 @@ const DailyWeather = ({ options, weather }: WeatherProps) => {
{options.showCurrentWindSpeed && ( {options.showCurrentWindSpeed && (
<Group className="weather-current-wind-speed-group" wrap="nowrap" gap="xs"> <Group className="weather-current-wind-speed-group" wrap="nowrap" gap="xs">
<IconWind size={16} /> <IconWind size={16} />
<Text fz={16}>{t("currentWindSpeed", { currentWindSpeed: String(weather.current.windspeed) })}</Text> <Text fz={16}>
{t("currentWindSpeed", {
currentWindSpeed: (options.useImperialSpeed
? metricToImperial(weather.current.windspeed)
: weather.current.windspeed
).toFixed(1),
unit: options.useImperialSpeed
? tCommon("unit.speed.milesPerHour")
: tCommon("unit.speed.kilometersPerHour"),
})}
</Text>
</Group> </Group>
)} )}
<Group className="weather-max-min-temp-group" wrap="nowrap" gap="sm"> <Group className="weather-max-min-temp-group" wrap="nowrap" gap="sm">
@@ -180,6 +192,7 @@ function Forecast({ weather, options }: WeatherProps) {
</HoverCard.Target> </HoverCard.Target>
<HoverCard.Dropdown> <HoverCard.Dropdown>
<WeatherDescription <WeatherDescription
useImperialSpeed={options.useImperialSpeed}
dateFormat={dateFormat} dateFormat={dateFormat}
time={dayWeather.time} time={dayWeather.time}
weatherCode={dayWeather.weatherCode} weatherCode={dayWeather.weatherCode}

View File

@@ -15,6 +15,7 @@ import {
} from "@tabler/icons-react"; } from "@tabler/icons-react";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { metricToImperial } from "@homarr/common";
import type { TranslationObject } from "@homarr/translation"; import type { TranslationObject } from "@homarr/translation";
import { useScopedI18n } from "@homarr/translation/client"; import { useScopedI18n } from "@homarr/translation/client";
import type { TablerIcon } from "@homarr/ui"; import type { TablerIcon } from "@homarr/ui";
@@ -40,6 +41,7 @@ export const WeatherIcon = ({ code, size = 50 }: WeatherIconProps) => {
interface WeatherDescriptionProps { interface WeatherDescriptionProps {
weatherOnly?: boolean; weatherOnly?: boolean;
useImperialSpeed?: boolean;
dateFormat?: WidgetProps<"weather">["options"]["dateFormat"]; dateFormat?: WidgetProps<"weather">["options"]["dateFormat"];
time?: string; time?: string;
weatherCode: number; weatherCode: number;
@@ -66,6 +68,7 @@ interface WeatherDescriptionProps {
*/ */
export const WeatherDescription = ({ export const WeatherDescription = ({
weatherOnly, weatherOnly,
useImperialSpeed,
dateFormat, dateFormat,
time, time,
weatherCode, weatherCode,
@@ -96,12 +99,18 @@ export const WeatherDescription = ({
<List.Item icon={<IconMoon size={15} />}>{`${t("dailyForecast.sunset")}: ${sunset}`}</List.Item> <List.Item icon={<IconMoon size={15} />}>{`${t("dailyForecast.sunset")}: ${sunset}`}</List.Item>
{maxWindSpeed !== undefined && ( {maxWindSpeed !== undefined && (
<List.Item icon={<IconWind size={15} />}> <List.Item icon={<IconWind size={15} />}>
{t("dailyForecast.maxWindSpeed", { maxWindSpeed: String(maxWindSpeed) })} {t("dailyForecast.maxWindSpeed", {
maxWindSpeed: (useImperialSpeed ? metricToImperial(maxWindSpeed) : maxWindSpeed).toFixed(1),
unit: useImperialSpeed ? tCommon("unit.speed.milesPerHour") : tCommon("unit.speed.kilometersPerHour"),
})}
</List.Item> </List.Item>
)} )}
{maxWindGusts !== undefined && ( {maxWindGusts !== undefined && (
<List.Item icon={<IconWind size={15} />}> <List.Item icon={<IconWind size={15} />}>
{t("dailyForecast.maxWindGusts", { maxWindGusts: String(maxWindGusts) })} {t("dailyForecast.maxWindGusts", {
maxWindGusts: (useImperialSpeed ? metricToImperial(maxWindGusts) : maxWindGusts).toFixed(1),
unit: useImperialSpeed ? tCommon("unit.speed.milesPerHour") : tCommon("unit.speed.kilometersPerHour"),
})}
</List.Item> </List.Item>
)} )}
</List> </List>

View File

@@ -13,6 +13,7 @@ export const { definition, componentLoader } = createWidgetDefinition("weather",
isFormatFahrenheit: factory.switch(), isFormatFahrenheit: factory.switch(),
disableTemperatureDecimals: factory.switch(), disableTemperatureDecimals: factory.switch(),
showCurrentWindSpeed: factory.switch({ withDescription: true }), showCurrentWindSpeed: factory.switch({ withDescription: true }),
useImperialSpeed: factory.switch(),
location: factory.location({ location: factory.location({
defaultValue: { defaultValue: {
name: "Paris", name: "Paris",

2483
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -23,13 +23,13 @@
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^6.1.1",
"typescript-eslint": "^8.44.1" "typescript-eslint": "^8.45.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.36.0", "eslint": "^9.37.0",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }

View File

@@ -16,6 +16,6 @@
"devDependencies": { "devDependencies": {
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"prettier-plugin-packagejson": "^2.5.19", "prettier-plugin-packagejson": "^2.5.19",
"typescript": "^5.9.2" "typescript": "^5.9.3"
} }
} }