From 1be906a0cde8a421027b3f3f34adef0015669750 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 21:55:53 +0000 Subject: [PATCH 01/10] chore(deps): update dependency isomorphic-dompurify to ^3.15.0 (#5852) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 21 ++++++++++++++------- pnpm-workspace.yaml | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db1a11a3a..6c66801d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -370,8 +370,8 @@ catalogs: specifier: 5.11.0 version: 5.11.0 isomorphic-dompurify: - specifier: ^3.14.0 - version: 3.14.0 + specifier: ^3.15.0 + version: 3.15.0 jotai: specifier: ^2.20.0 version: 2.20.0 @@ -813,7 +813,7 @@ importers: version: 13.0.6 isomorphic-dompurify: specifier: 'catalog:' - version: 3.14.0(@noble/hashes@2.0.1) + version: 3.15.0(@noble/hashes@2.0.1) jotai: specifier: 'catalog:' version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.15)(react@19.2.6) @@ -6327,6 +6327,9 @@ packages: dompurify@3.4.5: resolution: {integrity: sha512-OrwIBKsdNSVEeubdJ1HBv/wNENRM9ytAVCv7YXt//A3vPdVMNuACRqK9mXCGCBW2ln7BT/A4X0jXHo2Gu89miA==} + dompurify@3.4.7: + resolution: {integrity: sha512-2jBxDJY4RR06tQNy4w5FlFH7kfxsQZlufd0sbv+chfHCxeJwrFw2baUDsSwvBISD4K4RDbd0PTfy3uNXsR6siA==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -7186,8 +7189,8 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} - isomorphic-dompurify@3.14.0: - resolution: {integrity: sha512-64W8/lsfqgaDWfEkvrIVk8FdIk29Mya0Fp39excQEdlcLUPg1Cn7CtCYe6CtPbFW90JpEKTXG0QQtIUNENJ7sw==} + isomorphic-dompurify@3.15.0: + resolution: {integrity: sha512-9ZtkbQ8+SgNf6LuDAdu9bq23dVXMIGNM8ZYnyl2MufyZiSD5dqAUJcyjtYZz7B80HuPpEn/f0NCS6zKvavHtfA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} isomorphic-ws@5.0.0: @@ -13683,6 +13686,10 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dompurify@3.4.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -14532,9 +14539,9 @@ snapshots: isexe@3.1.5: optional: true - isomorphic-dompurify@3.14.0(@noble/hashes@2.0.1): + isomorphic-dompurify@3.15.0(@noble/hashes@2.0.1): dependencies: - dompurify: 3.4.5 + dompurify: 3.4.7 jsdom: 29.1.1(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a22e6edf1..54360ad36 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -125,7 +125,7 @@ catalog: glob: ^13.0.6 ical.js: ^2.2.1 ioredis: 5.11.0 - isomorphic-dompurify: ^3.14.0 + isomorphic-dompurify: ^3.15.0 jotai: ^2.20.0 jsdom: ^29.1.1 json5: ^2.2.3 From a63a191203dd78037136ca880b45fd28aa1fbfaa Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 23:54:09 +0000 Subject: [PATCH 02/10] chore(deps): update turbo monorepo to ^2.9.16 (#5851) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 4 ++-- pnpm-workspace.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c66801d5..11b933be6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -205,7 +205,7 @@ catalogs: specifier: ^11.17.0 version: 11.17.0 '@turbo/gen': - specifier: ^2.9.15 + specifier: ^2.9.16 version: 2.9.16 '@types/adm-zip': specifier: 0.5.8 @@ -484,7 +484,7 @@ catalogs: specifier: 4.20.4 version: 4.20.4 turbo: - specifier: ^2.9.15 + specifier: ^2.9.16 version: 2.9.16 typescript: specifier: ^5.9.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 54360ad36..3e087d7ce 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -70,7 +70,7 @@ catalog: "@trpc/react-query": ^11.17.0 "@trpc/server": ^11.17.0 "@trpc/tanstack-react-query": ^11.17.0 - "@turbo/gen": ^2.9.15 + "@turbo/gen": ^2.9.16 "@types/adm-zip": 0.5.8 "@types/bcrypt": 6.0.0 "@types/better-sqlite3": 7.6.13 @@ -163,7 +163,7 @@ catalog: trpc-to-openapi: ^3.3.0 tsdav: ^2.2.2 tsx: 4.20.4 - turbo: ^2.9.15 + turbo: ^2.9.16 typescript: ^5.9.3 undici: 7.24.6 use-deep-compare-effect: ^1.8.1 From 3ff0d72ba1ec89e953381f7f1dde7eb66b18b168 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 04:21:57 +0000 Subject: [PATCH 03/10] chore(deps): update dependency next-intl to v4.13.0 (#5853) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 38 +++++++++++++++++++------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11b933be6..318fb6023 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -403,8 +403,8 @@ catalogs: specifier: 5.0.0-beta.31 version: 5.0.0-beta.31 next-intl: - specifier: 4.12.0 - version: 4.12.0 + specifier: 4.13.0 + version: 4.13.0 node-loader: specifier: ^2.1.0 version: 2.1.0 @@ -2210,7 +2210,7 @@ importers: version: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0) next-intl: specifier: 'catalog:' - version: 4.12.0(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0))(react@19.2.6)(typescript@5.9.3) + version: 4.13.0(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0))(react@19.2.6)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.6 @@ -7014,8 +7014,8 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} - icu-minify@4.12.0: - resolution: {integrity: sha512-zDmM05uav3t3+kxSfRrNlmyXOdj2b+uHA+p04CG32eJabtaHbugXujuL+YfRkwP9joAnf0Uh+RMGCKD5NLa5rQ==} + icu-minify@4.13.0: + resolution: {integrity: sha512-SIFMeUHZJjzS5RvIGvybKvWoHjDm9cGVEs2EpJ8PmywOdJLWyblPm7TdPLLoUtkJtwQD7iGhl2WMptZ+N0on+w==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -7730,11 +7730,11 @@ packages: nodemailer: optional: true - next-intl-swc-plugin-extractor@4.12.0: - resolution: {integrity: sha512-jUxVEu1Nryjt4YgaDktSys7ioOgQfcNPF/SF2dbPNxbVb6U+P1INRgHeCVN+EC59H2rnTFIQwbddmOCrUWFr3g==} + next-intl-swc-plugin-extractor@4.13.0: + resolution: {integrity: sha512-6S/fJI0KXvLCL8nhBo9P8eGaJPzmwJBTCzX0NaUIj0VyU8U89d//T+vjMLdNIXl5MlLaYH7B9MbAjb8Mvu+tqQ==} - next-intl@4.12.0: - resolution: {integrity: sha512-v8KpppWG0yLLlChJ3Of6uoPew9LeRDBAtY6vpJmF7YJmBZlHEzzoEL4w1g1dAU+VleEPNoXNm9hg1eEsKWV5hw==} + next-intl@4.13.0: + resolution: {integrity: sha512-OvNq2v5XLx4EkQOsAhVE9g+6zdb83XHusADCXXtIW4LILYnjEVaeINdr1lkVWKSjzwNUiMSlH5N4K0OQTRiv6A==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -9499,8 +9499,8 @@ packages: peerDependencies: react: '>=16.13' - use-intl@4.12.0: - resolution: {integrity: sha512-r+qVb7UI1+kiOhjYsmsNUCY+jrnjVopwGeFlmMyQj4YInlwZzgMeMSv9n8MqnWWy77HL5BVM8K2WgX50SbtcpA==} + use-intl@4.13.0: + resolution: {integrity: sha512-fAFDrWaASxlhXOipcOyb5VDD+YONqj6+8O8EcG/J7RBoOUF3A8YahRWLN+mBxYMrlMQB8N6Voqk5X+YC+HSL0A==} peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -14400,7 +14400,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icu-minify@4.12.0: + icu-minify@4.13.0: dependencies: '@formatjs/icu-messageformat-parser': 3.5.0 @@ -15195,20 +15195,20 @@ snapshots: next: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0) react: 19.2.6 - next-intl-swc-plugin-extractor@4.12.0: {} + next-intl-swc-plugin-extractor@4.13.0: {} - next-intl@4.12.0(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0))(react@19.2.6)(typescript@5.9.3): + next-intl@4.13.0(next@16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0))(react@19.2.6)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@parcel/watcher': 2.4.1 '@swc/core': 1.15.3 - icu-minify: 4.12.0 + icu-minify: 4.13.0 negotiator: 1.0.0 next: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0) - next-intl-swc-plugin-extractor: 4.12.0 + next-intl-swc-plugin-extractor: 4.13.0 po-parser: 2.1.1 react: 19.2.6 - use-intl: 4.12.0(react@19.2.6) + use-intl: 4.13.0(react@19.2.6) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -17090,11 +17090,11 @@ snapshots: dequal: 2.0.3 react: 19.2.6 - use-intl@4.12.0(react@19.2.6): + use-intl@4.13.0(react@19.2.6): dependencies: '@formatjs/fast-memoize': 3.1.0 '@schummar/icu-type-parser': 1.21.5 - icu-minify: 4.12.0 + icu-minify: 4.13.0 intl-messageformat: 11.1.1 react: 19.2.6 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3e087d7ce..c2bd18e38 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -136,7 +136,7 @@ catalog: mysql2: 3.22.4 next: 16.2.6 next-auth: 5.0.0-beta.31 - next-intl: 4.12.0 + next-intl: 4.13.0 node-loader: ^2.1.0 octokit: ^5.0.5 oxfmt: ^0.52.0 From a755692d81b80b5ff83051a3b7261c01ac10321b Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 3 Jun 2026 08:49:38 +0200 Subject: [PATCH 04/10] fix(ui): restore pre-v9 light variant colors (#5856) --- .../src/app/[locale]/_client-providers/mantine.tsx | 9 +++++++-- apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx b/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx index 508074ead..493d368f1 100644 --- a/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx +++ b/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx @@ -2,7 +2,7 @@ import type { PropsWithChildren } from "react"; import type { MantineColorScheme, MantineColorSchemeManager } from "@mantine/core"; -import { DirectionProvider, MantineProvider } from "@mantine/core"; +import { DirectionProvider, MantineProvider, v8CssVariablesResolver } from "@mantine/core"; import dayjs from "dayjs"; import { clientApi } from "@homarr/api/client"; @@ -18,7 +18,12 @@ export const CustomMantineProvider = ({ const manager = useColorSchemeManager(); return ( - + {children} diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx index 8fa031ad0..0ea5c9cf0 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx @@ -2,7 +2,7 @@ import type { PropsWithChildren } from "react"; import type { MantineColorsTuple } from "@mantine/core"; -import { colorsTuple, createTheme, darken, lighten, MantineProvider, rem } from "@mantine/core"; +import { colorsTuple, createTheme, darken, lighten, MantineProvider, rem, v8CssVariablesResolver } from "@mantine/core"; import { useRequiredBoard } from "@homarr/boards/context"; import type { ColorScheme } from "@homarr/definitions"; @@ -33,7 +33,12 @@ export const BoardMantineProvider = ({ }); return ( - + {children} ); From fe4598f7221a2861b8c5ae0cfd267e8c4fbf48df Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 3 Jun 2026 10:03:37 +0200 Subject: [PATCH 05/10] fix(docker): restore container selection toolbar broken by Mantine v9 (#5855) --- .../manage/tools/docker/docker-table.tsx | 51 ++++++++----------- pnpm-lock.yaml | 28 +++++----- pnpm-workspace.yaml | 2 +- 3 files changed, 37 insertions(+), 44 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx index 4820a3a54..f0a91d904 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx @@ -107,6 +107,23 @@ export function DockerTable(initialData: RouterOutputs["docker"]["getContainers" refetchOnReconnect: false, }); const relativeTime = useTimeAgo(data.timestamp); + const utils = clientApi.useUtils(); + const { mutate, isPending } = clientApi.docker.invalidate.useMutation({ + async onSuccess() { + await utils.docker.getContainers.invalidate(); + showSuccessNotification({ + title: tDocker("action.refresh.notification.success.title"), + message: tDocker("action.refresh.notification.success.message"), + }); + }, + onError() { + showErrorNotification({ + title: tDocker("action.refresh.notification.error.title"), + message: tDocker("action.refresh.notification.error.message"), + }); + }, + }); + const table = useTranslatedMantineReactTable({ data: data.containers, enableDensityToggle: false, @@ -125,35 +142,11 @@ export function DockerTable(initialData: RouterOutputs["docker"]["getContainers" }, initialState: { density: "xs", showGlobalFilter: true }, - renderTopToolbarCustomActions: () => { - const utils = clientApi.useUtils(); - const { mutate, isPending } = clientApi.docker.invalidate.useMutation({ - async onSuccess() { - await utils.docker.getContainers.invalidate(); - showSuccessNotification({ - title: tDocker("action.refresh.notification.success.title"), - message: tDocker("action.refresh.notification.success.message"), - }); - }, - onError() { - showErrorNotification({ - title: tDocker("action.refresh.notification.error.title"), - message: tDocker("action.refresh.notification.error.message"), - }); - }, - }); - - return ( - - ); - }, + renderTopToolbarCustomActions: () => ( + + ), renderToolbarAlertBannerContent: ({ groupedAlert, table }) => { const dockerContainers = table.getSelectedRowModel().rows.map((row) => row.original); return ( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 318fb6023..4e91f385c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -388,8 +388,8 @@ catalogs: specifier: ^4.5.0 version: 4.5.0 mantine-react-table: - specifier: 2.0.0-beta.9 - version: 2.0.0-beta.9 + specifier: npm:mantine-react-table-open@9.0.3 + version: 9.0.3 maria2: specifier: ^0.4.1 version: 0.4.1 @@ -819,7 +819,7 @@ importers: version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.15)(react@19.2.6) mantine-react-table: specifier: 'catalog:' - version: 2.0.0-beta.9(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: mantine-react-table-open@9.0.3(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next: specifier: 'catalog:' version: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0) @@ -2204,7 +2204,7 @@ importers: version: 4.3.1 mantine-react-table: specifier: 'catalog:' - version: 2.0.0-beta.9(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: mantine-react-table-open@9.0.3(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next: specifier: 'catalog:' version: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0) @@ -2259,7 +2259,7 @@ importers: version: 4.2.0 mantine-react-table: specifier: 'catalog:' - version: 2.0.0-beta.9(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: mantine-react-table-open@9.0.3(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next: specifier: 'catalog:' version: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0) @@ -2450,7 +2450,7 @@ importers: version: 1.11.21 mantine-react-table: specifier: 'catalog:' - version: 2.0.0-beta.9(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: mantine-react-table-open@9.0.3(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next: specifier: 'catalog:' version: 16.2.6(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.100.0) @@ -7442,18 +7442,18 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - mantine-react-table@2.0.0-beta.9: - resolution: {integrity: sha512-ZdfcwebWaPERoDvAuk43VYcBCzamohARVclnbuepT0PHZ0wRcDPMBR+zgaocL+pFy8EXUGwvWTOKNh25ITpjNQ==} + mantine-react-table-open@9.0.3: + resolution: {integrity: sha512-HsrBU4KZluj96FPvvH0wcLzog0m5LIMdwB/59oj6BpftLGEibiLxX00G+tDM06PL2jXuiRxiGKPJ4oQOV+VK8w==} engines: {node: '>=16'} peerDependencies: - '@mantine/core': ^7.9 - '@mantine/dates': ^7.9 - '@mantine/hooks': ^7.9 + '@mantine/core': ^9.0.0 + '@mantine/dates': ^9.0.0 + '@mantine/hooks': ^9.0.0 '@tabler/icons-react': '>=2.23.0' clsx: '>=2' dayjs: '>=1.11' - react: '>=18.0' - react-dom: '>=18.0' + react: '>=19.2' + react-dom: '>=19.2' maria2@0.4.1: resolution: {integrity: sha512-3lr8UeB+R+BN9c7eOBkeH1GlHf7+0Kzt0pcEgsT9xoXIA5gfXAzjd1niYiYDsvb62v5rLPqCqDiyYxtmmhGJ3g==} @@ -14795,7 +14795,7 @@ snapshots: dependencies: semver: 7.7.4 - mantine-react-table@2.0.0-beta.9(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + mantine-react-table-open@9.0.3(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: '@mantine/core': 9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mantine/dates': 9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c2bd18e38..0bae29b39 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -131,7 +131,7 @@ catalog: json5: ^2.2.3 ldapts: 8.1.8 lodash.clonedeep: ^4.5.0 - mantine-react-table: 2.0.0-beta.9 + mantine-react-table: npm:mantine-react-table-open@9.0.3 maria2: ^0.4.1 mysql2: 3.22.4 next: 16.2.6 From fd107888385557ededcf51576c6320a1960690f2 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 4 Jun 2026 07:56:34 +0200 Subject: [PATCH 06/10] fix(auth): relax password complexity requirements to suggestions-only (#5764) --- .../init/_steps/user/init-user-form.tsx | 12 ++-- .../_components/create-user-stepper.tsx | 32 ++-------- packages/api/src/router/test/user.spec.ts | 58 ++++++++++++++++--- packages/forms-collection/src/index.tsx | 2 + .../user-create-password-fields.tsx | 33 +++++++++++ packages/translation/src/lang/ca.json | 2 +- packages/translation/src/lang/cn.json | 2 +- packages/translation/src/lang/cr.json | 2 +- packages/translation/src/lang/cs.json | 2 +- packages/translation/src/lang/da.json | 2 +- packages/translation/src/lang/de-CH.json | 2 +- packages/translation/src/lang/de.json | 2 +- packages/translation/src/lang/el.json | 2 +- packages/translation/src/lang/en-gb.json | 2 +- packages/translation/src/lang/en.json | 5 +- packages/translation/src/lang/es.json | 2 +- packages/translation/src/lang/et.json | 2 +- packages/translation/src/lang/fr.json | 2 +- packages/translation/src/lang/he.json | 2 +- packages/translation/src/lang/hr.json | 2 +- packages/translation/src/lang/hu.json | 2 +- packages/translation/src/lang/it.json | 2 +- packages/translation/src/lang/ja.json | 2 +- packages/translation/src/lang/ko.json | 2 +- packages/translation/src/lang/lt.json | 2 +- packages/translation/src/lang/lv.json | 2 +- packages/translation/src/lang/nl.json | 2 +- packages/translation/src/lang/no.json | 2 +- packages/translation/src/lang/pl.json | 2 +- packages/translation/src/lang/pt-br.json | 2 +- packages/translation/src/lang/pt.json | 2 +- packages/translation/src/lang/ro.json | 2 +- packages/translation/src/lang/ru.json | 2 +- packages/translation/src/lang/sk.json | 2 +- packages/translation/src/lang/sl.json | 2 +- packages/translation/src/lang/sv.json | 2 +- packages/translation/src/lang/tr.json | 2 +- packages/translation/src/lang/uk.json | 2 +- packages/translation/src/lang/vi.json | 2 +- packages/translation/src/lang/zh.json | 2 +- .../password-input/password-input.tsx | 6 +- .../password-input/password-requirement.tsx | 19 +++--- .../password-requirements-popover.tsx | 19 ++++-- packages/validation/src/user.ts | 18 +----- 44 files changed, 164 insertions(+), 108 deletions(-) create mode 100644 packages/forms-collection/src/user-create/user-create-password-fields.tsx diff --git a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx index 3a659032f..d3f1c665f 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx @@ -1,15 +1,15 @@ "use client"; -import { Button, PasswordInput, Stack, TextInput } from "@mantine/core"; +import { Button, Stack, TextInput } from "@mantine/core"; import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { signIn } from "@homarr/auth/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; import { useZodForm } from "@homarr/form"; +import { UserCreatePasswordFields } from "@homarr/forms-collection"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { useScopedI18n } from "@homarr/translation/client"; -import { CustomPasswordInput } from "@homarr/ui"; import { userInitSchema } from "@homarr/validation/user"; export const InitUserForm = () => { @@ -59,12 +59,10 @@ export const InitUserForm = () => { > - - diff --git a/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx b/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx index f443ae585..3997bda60 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx @@ -1,20 +1,7 @@ "use client"; import { startTransition, useCallback, useState } from "react"; -import { - Badge, - Button, - Card, - Group, - PasswordInput, - Stack, - Stepper, - Table, - Text, - TextInput, - Title, - Tooltip, -} from "@mantine/core"; +import { Badge, Button, Card, Group, Stack, Stepper, Table, Text, TextInput, Title, Tooltip } from "@mantine/core"; import { useListState } from "@mantine/hooks"; import { IconPlus, IconUserCheck } from "@tabler/icons-react"; import { z } from "zod/v4"; @@ -24,10 +11,11 @@ import type { GroupPermissionKey } from "@homarr/definitions"; import { everyoneGroup, groupPermissions } from "@homarr/definitions"; import type { IsValid } from "@homarr/form"; import { useZodForm } from "@homarr/form"; +import { UserCreatePasswordFields } from "@homarr/forms-collection"; import { useModalAction } from "@homarr/modals"; import { showErrorNotification } from "@homarr/notifications"; import { useI18n, useScopedI18n } from "@homarr/translation/client"; -import { CustomPasswordInput, UserAvatar } from "@homarr/ui"; +import { UserAvatar } from "@homarr/ui"; import { createCustomErrorParams } from "@homarr/validation/form/i18n"; import { userPasswordSchema } from "@homarr/validation/user"; @@ -167,18 +155,10 @@ export const UserCreateStepperComponent = ({ initialGroups }: UserCreateStepperC
- - diff --git a/packages/api/src/router/test/user.spec.ts b/packages/api/src/router/test/user.spec.ts index b3b262846..16cabfd52 100644 --- a/packages/api/src/router/test/user.spec.ts +++ b/packages/api/src/router/test/user.spec.ts @@ -81,13 +81,7 @@ describe("initUser should initialize the first user", () => { await expect(actAsync()).rejects.toThrow("passwordsDoNotMatch"); }); - it.each([ - ["aB2%"], // too short - ["abc123DEF"], // does not contain special characters - ["abcDEFghi+"], // does not contain numbers - ["ABC123+/-"], // does not contain lowercase - ["abc123+/-"], // does not contain uppercase - ])("should throw error that password requirements do not match for '%s' as password", async (password) => { + it.each([["aB2%"], ["short"]])("should reject passwords shorter than 8 characters for '%s'", async (password) => { const db = createDb(); await createOnboardingStepAsync(db, "user"); const caller = userRouter.createCaller({ @@ -103,7 +97,55 @@ describe("initUser should initialize the first user", () => { confirmPassword: password, }); - await expect(actAsync()).rejects.toThrow("passwordRequirements"); + await expect(actAsync()).rejects.toThrow(); + }); + + it("should accept passwords without complexity requirements", async () => { + const db = createDb(); + await createOnboardingStepAsync(db, "user"); + const caller = userRouter.createCaller({ + db, + deviceType: undefined, + session: null, + }); + + await caller.initUser({ + username: "test", + password: "abc123DEF", + confirmPassword: "abc123DEF", + }); + + const user = await db.query.users.findFirst({ + columns: { + id: true, + }, + }); + + expect(user).toBeDefined(); + }); + + it("should accept passwords with special characters like LoveHomarr<3", async () => { + const db = createDb(); + await createOnboardingStepAsync(db, "user"); + const caller = userRouter.createCaller({ + db, + deviceType: undefined, + session: null, + }); + + await caller.initUser({ + username: "test", + password: "LoveHomarr<3", + confirmPassword: "LoveHomarr<3", + }); + + const user = await db.query.users.findFirst({ + columns: { + id: true, + }, + }); + + expect(user).toBeDefined(); }); }); diff --git a/packages/forms-collection/src/index.tsx b/packages/forms-collection/src/index.tsx index 218655cb5..7621bed43 100644 --- a/packages/forms-collection/src/index.tsx +++ b/packages/forms-collection/src/index.tsx @@ -5,3 +5,5 @@ export * from "./icon-picker/icon-picker"; export * from "./new-app/icon-matcher"; export * from "./upload-media/upload-media"; + +export * from "./user-create/user-create-password-fields"; diff --git a/packages/forms-collection/src/user-create/user-create-password-fields.tsx b/packages/forms-collection/src/user-create/user-create-password-fields.tsx new file mode 100644 index 000000000..ad7329307 --- /dev/null +++ b/packages/forms-collection/src/user-create/user-create-password-fields.tsx @@ -0,0 +1,33 @@ +"use client"; + +import { PasswordInput, Stack } from "@mantine/core"; +import type { PasswordInputProps } from "@mantine/core"; + +import { useScopedI18n } from "@homarr/translation/client"; +import { CustomPasswordInput } from "@homarr/ui"; + +interface UserCreatePasswordFieldsProps { + passwordInputProps: PasswordInputProps; + confirmPasswordInputProps: PasswordInputProps; + variant?: PasswordInputProps["variant"]; +} + +export const UserCreatePasswordFields = ({ + passwordInputProps, + confirmPasswordInputProps, + variant, +}: UserCreatePasswordFieldsProps) => { + const t = useScopedI18n("user.field"); + + return ( + + + + + ); +}; diff --git a/packages/translation/src/lang/ca.json b/packages/translation/src/lang/ca.json index 3e5c14996..01709fa33 100644 --- a/packages/translation/src/lang/ca.json +++ b/packages/translation/src/lang/ca.json @@ -132,7 +132,7 @@ }, "password": { "label": "Contrasenya", - "requirement": { + "suggestion": { "length": "Inclou com a mínim 8 caràcters", "lowercase": "Inclou minúscules", "uppercase": "Inclou majúscules", diff --git a/packages/translation/src/lang/cn.json b/packages/translation/src/lang/cn.json index 05caccbe2..991a93b61 100644 --- a/packages/translation/src/lang/cn.json +++ b/packages/translation/src/lang/cn.json @@ -132,7 +132,7 @@ }, "password": { "label": "密码", - "requirement": { + "suggestion": { "length": "至少包含 8 个字符", "lowercase": "包含小写字母", "uppercase": "包含大写字母", diff --git a/packages/translation/src/lang/cr.json b/packages/translation/src/lang/cr.json index ab1fec215..f23abcea3 100644 --- a/packages/translation/src/lang/cr.json +++ b/packages/translation/src/lang/cr.json @@ -132,7 +132,7 @@ }, "password": { "label": "crwdns26:0crwdne26:0", - "requirement": { + "suggestion": { "length": "crwdns28:0crwdne28:0", "lowercase": "crwdns30:0crwdne30:0", "uppercase": "crwdns32:0crwdne32:0", diff --git a/packages/translation/src/lang/cs.json b/packages/translation/src/lang/cs.json index 73bd6774f..d3db5802f 100644 --- a/packages/translation/src/lang/cs.json +++ b/packages/translation/src/lang/cs.json @@ -132,7 +132,7 @@ }, "password": { "label": "Heslo", - "requirement": { + "suggestion": { "length": "Obsahuje alespoň 8 znaků", "lowercase": "Obsahuje malé písmeno", "uppercase": "Obsahuje velké písmeno", diff --git a/packages/translation/src/lang/da.json b/packages/translation/src/lang/da.json index 25088e56d..bc10f4e93 100644 --- a/packages/translation/src/lang/da.json +++ b/packages/translation/src/lang/da.json @@ -132,7 +132,7 @@ }, "password": { "label": "Adgangskode", - "requirement": { + "suggestion": { "length": "Inkluderer mindst 8 tegn", "lowercase": "Inkluderer små bogstaver", "uppercase": "Inkluderer store bogstaver", diff --git a/packages/translation/src/lang/de-CH.json b/packages/translation/src/lang/de-CH.json index 240cc8a8d..49d53f90c 100644 --- a/packages/translation/src/lang/de-CH.json +++ b/packages/translation/src/lang/de-CH.json @@ -132,7 +132,7 @@ }, "password": { "label": "Passwort", - "requirement": { + "suggestion": { "length": "Enthält mindestens 8 Zeichen", "lowercase": "Enthält Kleinbuchstaben", "uppercase": "Enthält Großbuchstaben", diff --git a/packages/translation/src/lang/de.json b/packages/translation/src/lang/de.json index 1ac3c8dcb..729a73ab4 100644 --- a/packages/translation/src/lang/de.json +++ b/packages/translation/src/lang/de.json @@ -132,7 +132,7 @@ }, "password": { "label": "Passwort", - "requirement": { + "suggestion": { "length": "Enthält mindestens 8 Zeichen", "lowercase": "Enthält Kleinbuchstaben", "uppercase": "Enthält Großbuchstaben", diff --git a/packages/translation/src/lang/el.json b/packages/translation/src/lang/el.json index 2e86228dd..8f08912db 100644 --- a/packages/translation/src/lang/el.json +++ b/packages/translation/src/lang/el.json @@ -132,7 +132,7 @@ }, "password": { "label": "Κωδικός", - "requirement": { + "suggestion": { "length": "", "lowercase": "Περιλαμβάνει πεζό γράμμα", "uppercase": "Περιλαμβάνει κεφαλαίο γράμμα", diff --git a/packages/translation/src/lang/en-gb.json b/packages/translation/src/lang/en-gb.json index 04bc5a03c..a54b78e4e 100644 --- a/packages/translation/src/lang/en-gb.json +++ b/packages/translation/src/lang/en-gb.json @@ -132,7 +132,7 @@ }, "password": { "label": "Password", - "requirement": { + "suggestion": { "length": "Includes a minimum of 8 characters", "lowercase": "Includes a lower-case letter", "uppercase": "Includes an upper-case letter", diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index a62728845..2bfe4e223 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -132,8 +132,9 @@ }, "password": { "label": "Password", - "requirement": { - "length": "Includes at least 8 characters", + "suggestionsTitle": "Password suggestions", + "suggestion": { + "length": "At least 8 characters", "lowercase": "Includes lowercase letter", "uppercase": "Includes uppercase letter", "number": "Includes number", diff --git a/packages/translation/src/lang/es.json b/packages/translation/src/lang/es.json index 148c022dd..3cc753819 100644 --- a/packages/translation/src/lang/es.json +++ b/packages/translation/src/lang/es.json @@ -132,7 +132,7 @@ }, "password": { "label": "Contraseña", - "requirement": { + "suggestion": { "length": "Incluye al menos 8 caracteres", "lowercase": "Incluye al menos una letra minúscula", "uppercase": "Incluye al menos una letra mayúscula", diff --git a/packages/translation/src/lang/et.json b/packages/translation/src/lang/et.json index c5e54f495..73952fef8 100644 --- a/packages/translation/src/lang/et.json +++ b/packages/translation/src/lang/et.json @@ -132,7 +132,7 @@ }, "password": { "label": "", - "requirement": { + "suggestion": { "length": "", "lowercase": "", "uppercase": "", diff --git a/packages/translation/src/lang/fr.json b/packages/translation/src/lang/fr.json index 2f173a25c..3f8028496 100644 --- a/packages/translation/src/lang/fr.json +++ b/packages/translation/src/lang/fr.json @@ -132,7 +132,7 @@ }, "password": { "label": "Mot de passe", - "requirement": { + "suggestion": { "length": "Contient au moins 8 caractères", "lowercase": "Inclut une lettre minuscule", "uppercase": "Inclut une lettre majuscule", diff --git a/packages/translation/src/lang/he.json b/packages/translation/src/lang/he.json index 86c2e8ee3..7a5461433 100644 --- a/packages/translation/src/lang/he.json +++ b/packages/translation/src/lang/he.json @@ -132,7 +132,7 @@ }, "password": { "label": "סיסמה", - "requirement": { + "suggestion": { "length": "כולל לפחות 8 תווים", "lowercase": "אפשר אותיות קטנות", "uppercase": "אפשר אותיות גדולות", diff --git a/packages/translation/src/lang/hr.json b/packages/translation/src/lang/hr.json index dd637c9a6..c34436f78 100644 --- a/packages/translation/src/lang/hr.json +++ b/packages/translation/src/lang/hr.json @@ -132,7 +132,7 @@ }, "password": { "label": "Lozinka", - "requirement": { + "suggestion": { "length": "", "lowercase": "Uključuje mala slova", "uppercase": "Uključuje veliko slovo", diff --git a/packages/translation/src/lang/hu.json b/packages/translation/src/lang/hu.json index 1bad936e8..0eeb02f3d 100644 --- a/packages/translation/src/lang/hu.json +++ b/packages/translation/src/lang/hu.json @@ -132,7 +132,7 @@ }, "password": { "label": "Jelszó", - "requirement": { + "suggestion": { "length": "Tartalmazzon legalább 8 karaktert", "lowercase": "Tartalmazzon kisbetűt", "uppercase": "Tartalmazzon nagybetűt", diff --git a/packages/translation/src/lang/it.json b/packages/translation/src/lang/it.json index de53009f1..2420ee584 100644 --- a/packages/translation/src/lang/it.json +++ b/packages/translation/src/lang/it.json @@ -132,7 +132,7 @@ }, "password": { "label": "Password", - "requirement": { + "suggestion": { "length": "Include almeno 8 caratteri", "lowercase": "Include lettera minuscola", "uppercase": "Include lettera maiuscola", diff --git a/packages/translation/src/lang/ja.json b/packages/translation/src/lang/ja.json index aacb952c6..aa945ed76 100644 --- a/packages/translation/src/lang/ja.json +++ b/packages/translation/src/lang/ja.json @@ -132,7 +132,7 @@ }, "password": { "label": "パスワード", - "requirement": { + "suggestion": { "length": "少なくとも 8 文字以上を含む", "lowercase": "小文字を含む", "uppercase": "大文字を含む", diff --git a/packages/translation/src/lang/ko.json b/packages/translation/src/lang/ko.json index 6a8639ffd..41e90f781 100644 --- a/packages/translation/src/lang/ko.json +++ b/packages/translation/src/lang/ko.json @@ -132,7 +132,7 @@ }, "password": { "label": "비밀번호", - "requirement": { + "suggestion": { "length": "", "lowercase": "소문자 포함", "uppercase": "대문자 포함", diff --git a/packages/translation/src/lang/lt.json b/packages/translation/src/lang/lt.json index 6811b62e5..b3b258b83 100644 --- a/packages/translation/src/lang/lt.json +++ b/packages/translation/src/lang/lt.json @@ -132,7 +132,7 @@ }, "password": { "label": "Slaptažodis", - "requirement": { + "suggestion": { "length": "", "lowercase": "", "uppercase": "", diff --git a/packages/translation/src/lang/lv.json b/packages/translation/src/lang/lv.json index e3afee8da..1e9594c8c 100644 --- a/packages/translation/src/lang/lv.json +++ b/packages/translation/src/lang/lv.json @@ -132,7 +132,7 @@ }, "password": { "label": "Parole", - "requirement": { + "suggestion": { "length": "", "lowercase": "Ietver mazo burtu", "uppercase": "Ietver lielo burtu", diff --git a/packages/translation/src/lang/nl.json b/packages/translation/src/lang/nl.json index bf16ada09..91cdf8a9c 100644 --- a/packages/translation/src/lang/nl.json +++ b/packages/translation/src/lang/nl.json @@ -132,7 +132,7 @@ }, "password": { "label": "Wachtwoord", - "requirement": { + "suggestion": { "length": "Bevat ten minste 8 tekens", "lowercase": "Inclusief kleine letter", "uppercase": "Inclusief hoofdletter", diff --git a/packages/translation/src/lang/no.json b/packages/translation/src/lang/no.json index 4badb0f64..e591f6798 100644 --- a/packages/translation/src/lang/no.json +++ b/packages/translation/src/lang/no.json @@ -132,7 +132,7 @@ }, "password": { "label": "Passord", - "requirement": { + "suggestion": { "length": "Inkluderer minst 8 tegn", "lowercase": "Inkluderer liten bokstav", "uppercase": "Inkluderer stor bokstav", diff --git a/packages/translation/src/lang/pl.json b/packages/translation/src/lang/pl.json index ead2f3653..771b6b915 100644 --- a/packages/translation/src/lang/pl.json +++ b/packages/translation/src/lang/pl.json @@ -132,7 +132,7 @@ }, "password": { "label": "Hasło", - "requirement": { + "suggestion": { "length": "Zawiera co najmniej 8 znaków", "lowercase": "Zawiera małą literę", "uppercase": "Zawiera wielką literę", diff --git a/packages/translation/src/lang/pt-br.json b/packages/translation/src/lang/pt-br.json index a436eac1d..c6ac42898 100644 --- a/packages/translation/src/lang/pt-br.json +++ b/packages/translation/src/lang/pt-br.json @@ -132,7 +132,7 @@ }, "password": { "label": "Senha", - "requirement": { + "suggestion": { "length": "Inclua pelo menos 8 caracteres", "lowercase": "Inclui letras minúsculas", "uppercase": "Inclui letras maiúsculas", diff --git a/packages/translation/src/lang/pt.json b/packages/translation/src/lang/pt.json index 5d749ae0d..a57d1fc09 100644 --- a/packages/translation/src/lang/pt.json +++ b/packages/translation/src/lang/pt.json @@ -132,7 +132,7 @@ }, "password": { "label": "", - "requirement": { + "suggestion": { "length": "", "lowercase": "", "uppercase": "", diff --git a/packages/translation/src/lang/ro.json b/packages/translation/src/lang/ro.json index d4244df64..545c53e5b 100644 --- a/packages/translation/src/lang/ro.json +++ b/packages/translation/src/lang/ro.json @@ -132,7 +132,7 @@ }, "password": { "label": "Parola", - "requirement": { + "suggestion": { "length": "", "lowercase": "Să includă litere mici", "uppercase": "Să includă litere mari", diff --git a/packages/translation/src/lang/ru.json b/packages/translation/src/lang/ru.json index 2be2fdabb..d85c608d6 100644 --- a/packages/translation/src/lang/ru.json +++ b/packages/translation/src/lang/ru.json @@ -132,7 +132,7 @@ }, "password": { "label": "Пароль", - "requirement": { + "suggestion": { "length": "Содержит не менее 8 символов", "lowercase": "Содержит строчную букву", "uppercase": "Содержит заглавную букву", diff --git a/packages/translation/src/lang/sk.json b/packages/translation/src/lang/sk.json index bc5796623..30e9bf463 100644 --- a/packages/translation/src/lang/sk.json +++ b/packages/translation/src/lang/sk.json @@ -132,7 +132,7 @@ }, "password": { "label": "Heslo", - "requirement": { + "suggestion": { "length": "Obsahuje aspoň 8 znakov", "lowercase": "Zahŕňa malé písmeno", "uppercase": "Zahŕňa veľké písmená", diff --git a/packages/translation/src/lang/sl.json b/packages/translation/src/lang/sl.json index 51c078175..11153c158 100644 --- a/packages/translation/src/lang/sl.json +++ b/packages/translation/src/lang/sl.json @@ -132,7 +132,7 @@ }, "password": { "label": "Geslo", - "requirement": { + "suggestion": { "length": "", "lowercase": "Vključuje male črke", "uppercase": "Vključuje velike tiskane črke", diff --git a/packages/translation/src/lang/sv.json b/packages/translation/src/lang/sv.json index efe9758ca..f00064a74 100644 --- a/packages/translation/src/lang/sv.json +++ b/packages/translation/src/lang/sv.json @@ -132,7 +132,7 @@ }, "password": { "label": "Lösenord", - "requirement": { + "suggestion": { "length": "Använd minst 8 tecken", "lowercase": "Använd liten bokstav", "uppercase": "Använd stor bokstav", diff --git a/packages/translation/src/lang/tr.json b/packages/translation/src/lang/tr.json index 8b622b9dd..8df25fd60 100644 --- a/packages/translation/src/lang/tr.json +++ b/packages/translation/src/lang/tr.json @@ -132,7 +132,7 @@ }, "password": { "label": "Şifre", - "requirement": { + "suggestion": { "length": "En az 8 karakter içermeli", "lowercase": "Küçük harf içermeli", "uppercase": "Büyük harf içermeli", diff --git a/packages/translation/src/lang/uk.json b/packages/translation/src/lang/uk.json index 9d08afe64..fb1a0f759 100644 --- a/packages/translation/src/lang/uk.json +++ b/packages/translation/src/lang/uk.json @@ -132,7 +132,7 @@ }, "password": { "label": "Пароль", - "requirement": { + "suggestion": { "length": "Включає принаймні 8 символів", "lowercase": "Включає малу літеру", "uppercase": "Включає велику літеру", diff --git a/packages/translation/src/lang/vi.json b/packages/translation/src/lang/vi.json index a9466e9c8..4dfa92c1f 100644 --- a/packages/translation/src/lang/vi.json +++ b/packages/translation/src/lang/vi.json @@ -132,7 +132,7 @@ }, "password": { "label": "Mật khẩu", - "requirement": { + "suggestion": { "length": "Bao gồm ít nhất 8 kí tự", "lowercase": "Bao gồm chữ thường", "uppercase": "Bao gồm chữ in hoa", diff --git a/packages/translation/src/lang/zh.json b/packages/translation/src/lang/zh.json index 7d15715a2..b5a3ef06b 100644 --- a/packages/translation/src/lang/zh.json +++ b/packages/translation/src/lang/zh.json @@ -132,7 +132,7 @@ }, "password": { "label": "密碼", - "requirement": { + "suggestion": { "length": "至少包含 8 個字符", "lowercase": "包含小寫字母", "uppercase": "包含大寫字母", diff --git a/packages/ui/src/components/password-input/password-input.tsx b/packages/ui/src/components/password-input/password-input.tsx index 6164ede02..22d4a75dc 100644 --- a/packages/ui/src/components/password-input/password-input.tsx +++ b/packages/ui/src/components/password-input/password-input.tsx @@ -20,15 +20,15 @@ export const CustomPasswordInput = ({ withPasswordRequirements, ...props }: Cust }; const WithPasswordRequirements = (props: PasswordInputProps) => { - const [value, setValue] = useState(""); + const [password, setPassword] = useState(""); const onChange = (event: ChangeEvent) => { - setValue(event.currentTarget.value); + setPassword(event.currentTarget.value); props.onChange?.(event); }; return ( - + ); diff --git a/packages/ui/src/components/password-input/password-requirement.tsx b/packages/ui/src/components/password-input/password-requirement.tsx index 1e1eca197..99d694d31 100644 --- a/packages/ui/src/components/password-input/password-requirement.tsx +++ b/packages/ui/src/components/password-input/password-requirement.tsx @@ -1,14 +1,19 @@ import { rem, Text } from "@mantine/core"; -import { IconCheck, IconX } from "@tabler/icons-react"; +import { IconCheck, IconPoint } from "@tabler/icons-react"; + +const getRequirementDisplay = (meets: boolean) => + ({ + true: { color: "teal", Icon: IconCheck }, + false: { color: "dimmed", Icon: IconPoint }, + })[String(meets) as "true" | "false"]; export function PasswordRequirement({ meets, label }: { meets: boolean; label: string }) { + const display = getRequirementDisplay(meets); + const Icon = display.Icon; + return ( - - {meets ? ( - - ) : ( - - )} + + {label} diff --git a/packages/ui/src/components/password-input/password-requirements-popover.tsx b/packages/ui/src/components/password-input/password-requirements-popover.tsx index 5d10611f9..33cb30e42 100644 --- a/packages/ui/src/components/password-input/password-requirements-popover.tsx +++ b/packages/ui/src/components/password-input/password-requirements-popover.tsx @@ -1,16 +1,24 @@ import type { PropsWithChildren } from "react"; import { useState } from "react"; -import { Popover, Progress } from "@mantine/core"; +import { Popover, Progress, Text } from "@mantine/core"; import { useScopedI18n } from "@homarr/translation/client"; import { passwordRequirements } from "@homarr/validation/user"; import { PasswordRequirement } from "./password-requirement"; +const strengthColorMap = [ + { min: 100, color: "teal" }, + { min: 51, color: "yellow" }, + { min: 0, color: "dimmed" }, +] as const; + export const PasswordRequirementsPopover = ({ password, children }: PropsWithChildren<{ password: string }>) => { + const tPassword = useScopedI18n("user.field.password"); const requirements = useRequirements(); const strength = useStrength(password); const [popoverOpened, setPopoverOpened] = useState(false); + const strengthColor = strengthColorMap.find(({ min }) => strength >= min)?.color ?? "dimmed"; const checks = ( <> {requirements.map((requirement) => ( @@ -19,8 +27,6 @@ export const PasswordRequirementsPopover = ({ password, children }: PropsWithChi ); - const color = strength === 100 ? "teal" : strength > 50 ? "yellow" : "red"; - return ( @@ -29,7 +35,10 @@ export const PasswordRequirementsPopover = ({ password, children }: PropsWithChi - + + + {tPassword("suggestionsTitle")} + {checks} @@ -37,7 +46,7 @@ export const PasswordRequirementsPopover = ({ password, children }: PropsWithChi }; const useRequirements = () => { - const t = useScopedI18n("user.field.password.requirement"); + const t = useScopedI18n("user.field.password.suggestion"); return passwordRequirements.map(({ check, value }) => ({ check, label: t(value) })); }; diff --git a/packages/validation/src/user.ts b/packages/validation/src/user.ts index 626ba2e8b..824567fa6 100644 --- a/packages/validation/src/user.ts +++ b/packages/validation/src/user.ts @@ -19,24 +19,10 @@ export const passwordRequirements = [ { check: regexCheck(/[$&+,:;=?@#|'<>.^*()%!\-~`"_/\\[\]{}]/), value: "special" }, ] satisfies { check: (value: string) => boolean; - value: keyof TranslationObject["user"]["field"]["password"]["requirement"]; + value: keyof TranslationObject["user"]["field"]["password"]["suggestion"]; }[]; -export const userPasswordSchema = z - .string() - .min(8) - .max(255) - .refine( - (value) => { - return passwordRequirements.every((requirement) => requirement.check(value)); - }, - { - params: createCustomErrorParams({ - key: "passwordRequirements", - params: {}, - }), - }, - ); +export const userPasswordSchema = z.string().min(8).max(255); const addConfirmPasswordRefinement = < TSchema extends z.ZodObject<{ password: z.core.$ZodString; confirmPassword: z.core.$ZodString }, z.core.$strip>, From 2c6b7a818e9d32b414b024d711a3b64533e61cb9 Mon Sep 17 00:00:00 2001 From: Afonso Jorge Ramos Date: Thu, 4 Jun 2026 09:50:02 +0200 Subject: [PATCH 07/10] fix(immich): respect app color scheme in server-stats widget (#5859) --- .../src/immich/server-stats/component.module.css | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/widgets/src/immich/server-stats/component.module.css b/packages/widgets/src/immich/server-stats/component.module.css index 9154643ff..b16fdb597 100644 --- a/packages/widgets/src/immich/server-stats/component.module.css +++ b/packages/widgets/src/immich/server-stats/component.module.css @@ -1,20 +1,10 @@ .statItem { padding: 12px; border-radius: var(--mantine-radius-md); - background-color: var(--mantine-color-gray-0); + background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); transition: all 0.2s ease; &:hover { - background-color: var(--mantine-color-gray-1); - } -} - -@media (prefers-color-scheme: dark) { - .statItem { - background-color: var(--mantine-color-dark-6); - - &:hover { - background-color: var(--mantine-color-dark-5); - } + background-color: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5)); } } From 6eb59d6f53ffaf72e70be8d39d45c711f8b44485 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 08:58:12 +0000 Subject: [PATCH 08/10] chore(deps): update tiptap monorepo to v3.24.0 (#5858) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 642 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 32 +-- 2 files changed, 333 insertions(+), 341 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e91f385c..556a63ae3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -142,53 +142,53 @@ catalogs: specifier: ^12.0.1 version: 12.0.1 '@tiptap/extension-color': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-highlight': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-image': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-link': - specifier: ^3.23.6 - version: 3.23.6 + specifier: ^3.24.0 + version: 3.24.0 '@tiptap/extension-placeholder': - specifier: ^3.23.6 - version: 3.23.6 + specifier: ^3.24.0 + version: 3.24.0 '@tiptap/extension-table': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-table-cell': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-table-header': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-table-row': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-task-item': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-task-list': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-text-align': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-text-style': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/extension-underline': - specifier: 3.23.6 - version: 3.23.6 + specifier: 3.24.0 + version: 3.24.0 '@tiptap/react': - specifier: ^3.23.6 - version: 3.23.6 + specifier: ^3.24.0 + version: 3.24.0 '@tiptap/starter-kit': - specifier: ^3.23.6 - version: 3.23.6 + specifier: ^3.24.0 + version: 3.24.0 '@trpc/client': specifier: ^11.17.0 version: 11.17.0 @@ -756,7 +756,7 @@ importers: version: 9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mantine/tiptap': specifier: 'catalog:' - version: 9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tiptap/extension-link@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))(@tiptap/react@3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tiptap/extension-link@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))(@tiptap/react@3.24.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tabler/icons-react': specifier: 'catalog:' version: 3.44.0(react@19.2.6) @@ -2396,52 +2396,52 @@ importers: version: 3.44.0(react@19.2.6) '@tiptap/extension-color': specifier: 'catalog:' - version: 3.23.6(@tiptap/extension-text-style@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))) + version: 3.24.0(@tiptap/extension-text-style@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))) '@tiptap/extension-highlight': specifier: 'catalog:' - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) '@tiptap/extension-image': specifier: 'catalog:' - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) '@tiptap/extension-link': specifier: 'catalog:' - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + version: 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) '@tiptap/extension-placeholder': specifier: 'catalog:' - version: 3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/extensions@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) '@tiptap/extension-table': specifier: 'catalog:' - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + version: 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) '@tiptap/extension-table-cell': specifier: 'catalog:' - version: 3.23.6(@tiptap/extension-table@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/extension-table@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) '@tiptap/extension-table-header': specifier: 'catalog:' - version: 3.23.6(@tiptap/extension-table@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/extension-table@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) '@tiptap/extension-table-row': specifier: 'catalog:' - version: 3.23.6(@tiptap/extension-table@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/extension-table@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) '@tiptap/extension-task-item': specifier: 'catalog:' - version: 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) '@tiptap/extension-task-list': specifier: 'catalog:' - version: 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) '@tiptap/extension-text-align': specifier: 'catalog:' - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) '@tiptap/extension-text-style': specifier: 'catalog:' - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) '@tiptap/extension-underline': specifier: 'catalog:' - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) + version: 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) '@tiptap/react': specifier: 'catalog:' - version: 3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 3.24.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tiptap/starter-kit': specifier: 'catalog:' - version: 3.23.6 + version: 3.24.0 clsx: specifier: 'catalog:' version: 2.1.1 @@ -3268,15 +3268,9 @@ packages: '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@floating-ui/core@1.7.3': - resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - '@floating-ui/dom@1.7.4': - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} - '@floating-ui/dom@1.7.6': resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} @@ -4932,215 +4926,215 @@ packages: '@testcontainers/redis@12.0.1': resolution: {integrity: sha512-x5iDR6Y2Mc+2rTJYSQlRTtBMCPt77pKxDogpqRwXgJVmWoDrWFpiFcA/dw6IEoNuyxYUg03tbS8/VzCJI5JX6A==} - '@tiptap/core@3.23.6': - resolution: {integrity: sha512-MRB3pHz4Oxqmcawh0cQ5iOGdY5xtNYp/1CoK7hdTLzw5K0C6/gTC2VvanB1R4INaB6EpBkxG/GiWkVirDRnuXw==} + '@tiptap/core@3.24.0': + resolution: {integrity: sha512-GTAsXAI32p4hEZgPzvUv2RPrObxamy9AFhmhG10fXSvN/cDUs8naEYVIqDV3Sh99jMwQEbTFKW1E1mcspsY6ow==} peerDependencies: - '@tiptap/pm': 3.23.6 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-blockquote@3.23.6': - resolution: {integrity: sha512-2RmnqNqTltZ2k1F7IfjoDNs935Uq4rRDR7d98mqkg3OlDktcQIyBpv0t9dTay6H5bkQeZUuS8ogK2S1E8Edjug==} + '@tiptap/extension-blockquote@3.24.0': + resolution: {integrity: sha512-DgwEEJ1GbDQcT054ynxoaZGmB9apGeUklPrinq9o6xdLHpdg+bO9HCQzggdB8n21VLLglb8jfAEWsVNwh3eASQ==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-bold@3.23.6': - resolution: {integrity: sha512-1LMhjnytdbbhWHSoOwnLxZAOQZWPkKyXVCNmaIk0Mhi4tLPUXptG4qKS5sVYTCveE5H6IBPFrbgBFi5dMI6krA==} + '@tiptap/extension-bold@3.24.0': + resolution: {integrity: sha512-CujogYaynasklFKHADUseuvj8X2FnWktTCCo3Hl+nlyRvBTmm5TK2aqiamg3v2P4dBh3O6a70mo8BfRJPuiR1g==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-bubble-menu@3.23.6': - resolution: {integrity: sha512-Mwkyp9LkDHFbqmWRIkp63FinRxFu3ajC4qSb9t4mnHsb4kAdbNLLsGtbFg+le0SWk4CxGwAOwM7SzeJ+6UGqCA==} + '@tiptap/extension-bubble-menu@3.24.0': + resolution: {integrity: sha512-jRXD+JPu9ayvq78g8hsCxx4q/qUFtrdfIYirRSf5YUseuuUbtfrq83AsGabcygpUTefjJkMQoXNITkh6294Ggw==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-bullet-list@3.23.6': - resolution: {integrity: sha512-RMRgfXZykr/13X8UBOwvpgysVOo9KchwqMoEbvqQSj4YFfU56iIn59C8sbxiQ1sKfeltUf0wH4fPc0I4iwKqAA==} + '@tiptap/extension-bullet-list@3.24.0': + resolution: {integrity: sha512-IOpAm5c4XVVVvkOef+V9XYMVpea+3MgBpCQgn83UQRlwO9eIMwmcyxOznu7gQPQVShTEpkt4T6uK+ZN9o8meIA==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.24.0 - '@tiptap/extension-code-block@3.23.6': - resolution: {integrity: sha512-4kccgcn5yHThxrzsIhJny3EwfEZYIk+BjUCL4uIuzOyWvExtGhZ6JMHVCZeMhI8D1/bX1LNkkAKN5DXPzH4lXQ==} + '@tiptap/extension-code-block@3.24.0': + resolution: {integrity: sha512-NZglw4oHoH6oJ5+HvxxQCYk+wODJmsxzUpRQdsOmje08sekQH+Zt9i4UKimBhg4urpd5r+dKXTslab9a5eQ86w==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-code@3.23.6': - resolution: {integrity: sha512-KG8KXFYyLrtYvT7AZ1WGV61ofx8pDe5g9pH658MERxqQGii+Pyfc6xkz04l7XeBts/7+571UQp/0O7i/z560TA==} + '@tiptap/extension-code@3.24.0': + resolution: {integrity: sha512-MAQtrPRQ+HRmcGotWbksdIGeH1gqayFAdvi4lNGeFT7taHXP1o1XD7CQp7iYIKmg8IU4/MQ+RdetSfuC1A9edQ==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-color@3.23.6': - resolution: {integrity: sha512-2WxYc+X+OGFXbq/Ak0VXODEzfK1l5wz33oTWSuhdSw44HAQM7+SSyiDnMCXDQdqi063ANqMmQmlw5WngjQ6wCA==} + '@tiptap/extension-color@3.24.0': + resolution: {integrity: sha512-gVv9zfQ9diq/sk+SVJzqadShsOtDK1XPojBZR1zXg1QxedzdwLKuRDxvnlfIc3kFIyaDP4mNrek+anednTbWBA==} peerDependencies: - '@tiptap/extension-text-style': 3.23.6 + '@tiptap/extension-text-style': 3.24.0 - '@tiptap/extension-document@3.23.6': - resolution: {integrity: sha512-XDAIgG9KcKumFM9KJWUEUhXPbFIhhl47bfy5GknareWTRKke85rcoj/oxKKO9ihLZr8JfpbXjqnS4SCm5yhYPw==} + '@tiptap/extension-document@3.24.0': + resolution: {integrity: sha512-yxgM3+yXy2XZzEwH43y2Kp8D1BkblxEWLXqo0YCoAKtxyKCcEaT8kdlf70kS7D0+VSzYU4D0iN7VdQIYHcL2mA==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-dropcursor@3.23.6': - resolution: {integrity: sha512-+XWEoRKf3lXxi7Le1aOM2xU1XHwxICGpXjT3m4QaYqUgIpsq8gQEuso6kVg8DnTD7biKQs6+oIQ0o2b/gTW9WA==} + '@tiptap/extension-dropcursor@3.24.0': + resolution: {integrity: sha512-Dbv1c5LnvG3PT+yEbCNroyOeeUkHq9wcir2pbC7wri7g7d2sCi0+HvKH0MAxLwY3j5NJJSiSyG2ypMaXOAs4sg==} peerDependencies: - '@tiptap/extensions': 3.23.6 + '@tiptap/extensions': 3.24.0 - '@tiptap/extension-floating-menu@3.23.6': - resolution: {integrity: sha512-2kjuDcEq69lEcECl75xqY5MyzUSh2zcC5aLrpwP1WwhJz5bxsIFHiaps5AP6h9R4A+ZBj5b2haay2Y1wDUU3VA==} + '@tiptap/extension-floating-menu@3.24.0': + resolution: {integrity: sha512-7QEbf3mUzFAkejjQGX9f0L507oMtnOBRwHt2skUTR+9yXgudsN8zaDBSSRHLeMWGk9b7L293ZMA6zCRrZaHrfA==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-gapcursor@3.23.6': - resolution: {integrity: sha512-wbKmxXsszxWacEkrHucRpSQbiKjz4fmOebD6OVyL9AcrmlbxNk8vcM3iyh/8cVeRy09XY+morM165t/u7/z4IQ==} + '@tiptap/extension-gapcursor@3.24.0': + resolution: {integrity: sha512-CzCP5/jni5RFwW9jCfBO6auh83GbaioMTpSk6tyR3sd+CbwlBcUdsJFGJkbaRdiSS9dgIyi+6hRbhjpYdHcp+w==} peerDependencies: - '@tiptap/extensions': 3.23.6 + '@tiptap/extensions': 3.24.0 - '@tiptap/extension-hard-break@3.23.6': - resolution: {integrity: sha512-KeUm+tkUfIVSX9QM9XOIhaay0Fn36sLKUo5NVYjN3uJaxFvaZXZmTlxdO85OTdgF2P5sqh9LomrIgliaFRGk4w==} + '@tiptap/extension-hard-break@3.24.0': + resolution: {integrity: sha512-T/ZEBiHQPMyTqDvXG0tiqBToNeuSemIPmNtdoGSgBN/degVl7VJZqQIrLIvOUHfjf3QkRs7TE/mcqTJsIboO/g==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-heading@3.23.6': - resolution: {integrity: sha512-A/0jPhxnUh9THSZymlu0OGPZe1wdFdwHAXnRCmqvYUCwJjrG7LCC/ahzmcj1tcNzI9hgHyuYPSfev8RXYrNu/w==} + '@tiptap/extension-heading@3.24.0': + resolution: {integrity: sha512-GCSgapIzQPqEGNcVGE0/Pcjg5wITMLYJlrS3GGVw7BPmECJwgexcoOsEwkxtzJnXT/HpFXbvOFW43sM0KeHSjg==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-highlight@3.23.6': - resolution: {integrity: sha512-GWv6R4iZzVrNeB33qtJDBt/BfVjuc5S/sUF/VDFAtK8h86bg4cEm1tGLEsui4T3+vij/t+P+eoGhkzF6NGogdg==} + '@tiptap/extension-highlight@3.24.0': + resolution: {integrity: sha512-+Vx6YKSP+lzCBiTbgQOpR2rIOzL8Ns6UnOBtW4O6tYc7TMTexycaG66RWxXMpAD6QkamwLwX3H5TTYviWtU9RQ==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-horizontal-rule@3.23.6': - resolution: {integrity: sha512-hEUlz4H+I64r+TH6LCuNCRgO7JTHncXGmx9+WbU69EOfY8O0ZurcgeJc8HeiAKL+r9YuC1e5YHfFxgCaaC0jlg==} + '@tiptap/extension-horizontal-rule@3.24.0': + resolution: {integrity: sha512-DFzWJTrb23x+qssLLs85vEyho8ItUGp3RY9XUsVTIAGZn5IsoUw8wMsvIBlH1ux4Ch7gLchtcD6kpTdMdrL9kw==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-image@3.23.6': - resolution: {integrity: sha512-vvNGxArvD2dW+XvV0KdYovRVUzCy8QVNulc2r5pV7umnG1E6cCmMkiHiif8J2ePJu2KtysAvJQe0iF+UqueGMw==} + '@tiptap/extension-image@3.24.0': + resolution: {integrity: sha512-mH+bvsX2cPKuZzV7YMQi4FV2YbDP+Kmq36bY+Bwi/x4mYUc8u0cjQxcu8RzLO7GtsgUJPxGMwfkQxmDqXFLZvw==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-italic@3.23.6': - resolution: {integrity: sha512-wol5KdwCPAvpiYhH9PLlvO8ZnJHwZtIboVevrfOGgBcKlXRA3dedR4OAMXHnUtkkzu9KtliLg1+TYzEx4JZG9Q==} + '@tiptap/extension-italic@3.24.0': + resolution: {integrity: sha512-mf3cbNlbMPUNj3IyUkIke+o3ZpOUrtVeY5Yqs5IM/VhkUUh/PdIzqw74VuqEAJ0Z4oZ6nNDHeYLrl3Be1j99lQ==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-link@3.23.6': - resolution: {integrity: sha512-KNZz7z7P2/qbQsx5bPAbSPjrKDg1VHsedGlLHJCr8U2VRD5VgmDLkMpkouP1CsDg15qgyUKv/nDib5KgPpLNWA==} + '@tiptap/extension-link@3.24.0': + resolution: {integrity: sha512-MwMoNGG2mL5XGFV1tEGunBRglwsIbW+ZOB2QnKiv+Mcbi2JCWMrorndJZBqpVPR5nM+Bef2KnpchEJmYlQLvKQ==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-list-item@3.23.6': - resolution: {integrity: sha512-3zzyhdkUWcHVpXuvy6KiIwjh29rbH6gEDEqPQqHLrl1XGnO9pnShC7pSHctlCDjmcx3O4n9cd4QMtVBlUerbiA==} + '@tiptap/extension-list-item@3.24.0': + resolution: {integrity: sha512-zl/U3viJiV9OzkKM37AHIUN1af1TSLrcbHUUoNLkfJ33Nq+NlpaXpCVK0rKRqiLFJf7zk/a5KWG5CrOy9TxjKA==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.24.0 - '@tiptap/extension-list-keymap@3.23.6': - resolution: {integrity: sha512-x8bPcLViGzg/RAmQM/XtmfqIwQ/Pv9Q8mkd+OgfUiTqjeJqKwVQmiqbLFNa7zw81+H61M+HDU+qGAaQ3vRIMjw==} + '@tiptap/extension-list-keymap@3.24.0': + resolution: {integrity: sha512-69fKcrngYGEKWNn4R5oLwl0YuV3FY4kufEValVcjnihUmqJTE1vx+fwctYoTsOGnIuNGpUIQ7f9YDD/0w34qBw==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.24.0 - '@tiptap/extension-list@3.23.6': - resolution: {integrity: sha512-z6vj9+Qht2sjdQkyyHcUpsC/yCIZqTrQiyHDhs/HGKrfvoANyAZGpqdNeKf1wSyjIso+27tQuIH5NDfk8ygyNw==} + '@tiptap/extension-list@3.24.0': + resolution: {integrity: sha512-GcxDVMMmDGj7OFTBrV7JpVgr5wxlr2vmjwH7U8QxZX7OJI5vrsMYl/U6KRTvUpG8wP+Zmo5jRlLM+BbL+a/W3g==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-ordered-list@3.23.6': - resolution: {integrity: sha512-1m/wWB/ZtXcmG2vNdiUkCqsOgqv5vBjCv/mVaHhF9OvV+zQS8YDjoWE7zEuT/GgELdT77Xq8lHrn4nCDudB3/A==} + '@tiptap/extension-ordered-list@3.24.0': + resolution: {integrity: sha512-buRa6bmBDw0TztH+rAcusIye14DiLDS+yGheo6GiNCTD7kKJnksXagBdxvip3jhW5sx7gyAKvoBmvGSg1BbsGA==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.24.0 - '@tiptap/extension-paragraph@3.23.6': - resolution: {integrity: sha512-+7m58LUSncodjrIyXks4RZ3tLNYrvgT77wRR4l3HnM5OABY3GDsDTqi7c1t1yI29NVOSk/DUacqy6UwYAj1DGg==} + '@tiptap/extension-paragraph@3.24.0': + resolution: {integrity: sha512-wD06aB6hO7LgcrlhGiw7I64k2tus9kNoICX5R+UecBSB1DVJdzKvXoXL2kPNv4DqYvljHdkIeK/OpuOTQd6MJA==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-placeholder@3.23.6': - resolution: {integrity: sha512-8I6b2aevF74aLgymKMxbDxSLxWA2y+2dh0zZDeI8sRZ2m6WHHes+Kyuuwkq1HIPcR+ZLpbec74cmf6lcL/yvqQ==} + '@tiptap/extension-placeholder@3.24.0': + resolution: {integrity: sha512-3jfYYCIuwMADhvZ92vB6c80YiTmgTSFR23JqyLps8qkQtV59Va5CBYpwJtSs1+VrbCVnNxhZBHhVXusZO3uRkA==} peerDependencies: - '@tiptap/extensions': 3.23.6 + '@tiptap/extensions': 3.24.0 - '@tiptap/extension-strike@3.23.6': - resolution: {integrity: sha512-oF7FEZ37f15aCe5kPgzGDYf/m+hr7VdQ/Ko/Hds/UM9pX7AG1fdtmRrl6wqkRqDM/incZaC/AQR2/Dpo2VCNGQ==} + '@tiptap/extension-strike@3.24.0': + resolution: {integrity: sha512-sfN1iQs6Fdlorrfe8wipDkTPwu/Egx3s2fkY7TAWusTGFHwlovuRUGFKqCL9dI4N3u6uqUMpEuWmQNgv+aQGjQ==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-table-cell@3.23.6': - resolution: {integrity: sha512-hS9TmmvRlT9/ikT+0ukACS+hmJuii4zQaH47cg3oJkz/Fv7O7tL7GZniKtK6l2OUZGPhY+4SV2RkDB6bD7DXfw==} + '@tiptap/extension-table-cell@3.24.0': + resolution: {integrity: sha512-jg62iVc1L8tOycSuwZ5i82EGKGuvelCIkpFX7wvHMl9EiPX9fv70enmb4ua9DyLgRtYg/MNrGOdUATRpxWsFRA==} peerDependencies: - '@tiptap/extension-table': 3.23.6 + '@tiptap/extension-table': 3.24.0 - '@tiptap/extension-table-header@3.23.6': - resolution: {integrity: sha512-D6o0a1cJXUU0xWakainBFGPnGHinQkPcdu1YqGd/PoFANY38lnuZt/NW2O/OLfLXu5LXDRfpqF1+dsKww27dUA==} + '@tiptap/extension-table-header@3.24.0': + resolution: {integrity: sha512-z1TGVoBD5lVX48hpKcrQY5vETB8aCR61Enk5wGl45zNO/sMEMNxYfDKTkMydyOFUWfGqvOPnjDHJqJuT36/19w==} peerDependencies: - '@tiptap/extension-table': 3.23.6 + '@tiptap/extension-table': 3.24.0 - '@tiptap/extension-table-row@3.23.6': - resolution: {integrity: sha512-OauWVzkyRQg0rKOqM/a3PuKPc1S7YXMb1LRN7Nh8Ytvglvd7GFRTbl1lVqdZRaz4Jzopag4PQnriIZfMPUpxWw==} + '@tiptap/extension-table-row@3.24.0': + resolution: {integrity: sha512-kASEYMWZF9ZqO6DRGz0LiD11c3LPfzOlFiJQVDrOyLP7xkJpHzIAKH0K+8u4aohOziDLn8nz+8I+3xjRS46oGg==} peerDependencies: - '@tiptap/extension-table': 3.23.6 + '@tiptap/extension-table': 3.24.0 - '@tiptap/extension-table@3.23.6': - resolution: {integrity: sha512-XbhZXjhsS6AP7ThoZxjAnNs+NiR81YRori25l6E+ORqB7quiPkIXOAi5h4AIpkn/CYIqze6ere11lWsYpDjtaQ==} + '@tiptap/extension-table@3.24.0': + resolution: {integrity: sha512-lr5elob3uJnB+ltgqPDEeVQmIPRx6JoS0I6z93tOgKsI2mIsaw5ErghteeiCTpExdyax7aWR0fn5pZzLVDQL8A==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-task-item@3.23.6': - resolution: {integrity: sha512-PIHW+3KZCtEmtC7z34rfkusbC42HYr7uw1h5xNvrazQwJGWhKo1UmI0Yea5vyJNKPrTLPCMEm/mgMrj8nNAZfA==} + '@tiptap/extension-task-item@3.24.0': + resolution: {integrity: sha512-2VtX6VOp4SJk5E/VHeSC2Acfbge6h69TUBhF7hFebbiCDyB73xCaPKcuClIyzOlWJgpWz2ZPXwVB+Y3meXw+yw==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.24.0 - '@tiptap/extension-task-list@3.23.6': - resolution: {integrity: sha512-XNuYbVV7F0TBpxHqqEFvrxwGbmTq01qJrZA6qwbQopOsw5wOsCy4XQsCkeZ8BGkakORCEWGSMjPyVOtIKq2jGA==} + '@tiptap/extension-task-list@3.24.0': + resolution: {integrity: sha512-EIbB/WQ7L92WfaY5AF9upH93nIgBHjGt5zwPYoX+ZTpBncebr1AEDF7rc+LHNuSa1g1ToOKbFB88ep02IIXOjA==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.24.0 - '@tiptap/extension-text-align@3.23.6': - resolution: {integrity: sha512-pE+gDmvnrSMWHADDnDSzaO7YUi9kOywQkyrqZ9bEPLddZred7ICoJ4NtD2DqLjDSur+HijaJuByResWb78c6FA==} + '@tiptap/extension-text-align@3.24.0': + resolution: {integrity: sha512-WKFtYXGthtkUc+Cwy2fItSr+9FKwLZjkJVAY1GhkRdcq35qTuVhkb4Q4wR2Rhkb6QRqtlxF1NDuTf2vxiQmfBQ==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-text-style@3.23.6': - resolution: {integrity: sha512-Auasgj469wkQ5ip+Zi2gaRzvqxx9qKG58+1mkT8yPE3QAGnOIg/AaKyQ7pTV77UyL3FHvLnU+KsWCad+qcobww==} + '@tiptap/extension-text-style@3.24.0': + resolution: {integrity: sha512-1Hy+5tFEAsnoLhZ/eqmza4USvFHwMA8haeAdCGlwTeshBrt+nUKTrEsRHidF60cGsRwlTcuqxSkjT94dULgp5Q==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-text@3.23.6': - resolution: {integrity: sha512-ipoC2TkIAIOTiF5ByiGgvQB1DqDyfP90wrUB3mohBcgvp7lQnwHszCDGv8dNnmcUek8uXV/uoLu2VXeVQlxjPA==} + '@tiptap/extension-text@3.24.0': + resolution: {integrity: sha512-Im7keLPEihxm3+LyF+drYCoaOY5hlq35lvHAp/el6M8pJ/scts88HrYpdR1Yc4BtpZBIhfHSyWgPaupI4qwdeg==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extension-underline@3.23.6': - resolution: {integrity: sha512-P55wGIZGYTVH92Fq0cgI4/O9AhLCaJC3hhxg15RSERP5/YegM9eJHDK/GQ1EE/DvYA+xpYGOV6agKwAUqfA/Iw==} + '@tiptap/extension-underline@3.24.0': + resolution: {integrity: sha512-D4W4X3UMq9dLVIOfPB9+UodQ4eAJ8yDcm8qFWAwq0a15YWH6bnwulCuIdV+U5dEG+yaRxN8haB9GrrID9jmrSA==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.24.0 - '@tiptap/extensions@3.23.6': - resolution: {integrity: sha512-X09/Db1teB+ifXzDGVVFmOeQRx7wTAayE9/280spxpsHkHZvJ5bHRvWIzUzviMIjbBz+NPDIKYPK7gMfh9iaig==} + '@tiptap/extensions@3.24.0': + resolution: {integrity: sha512-z6gRYzy2ucJp07OQ0F2W07NxyhMTxPYH1ia2eGiQkWax1i56oExpjMsDHP8THWlg8Tb7NnbfKpkfh881EsmofA==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 - '@tiptap/pm@3.23.6': - resolution: {integrity: sha512-in5CaMaWlJcH2A1q6GJKFtrodE8WLS3M9tIi/f89jPmIVHJShpodC0KZDNyJkrVBQomYk0DEh86Utm6ASXzQww==} + '@tiptap/pm@3.24.0': + resolution: {integrity: sha512-QQP/78ryOZDN99gNBV7dgh69/8AYaOYQYFklq/iR+ZRFaaL3+qqHFvPVJapGkzPdymBgNJ34xjFM8n5pJ4QmMg==} - '@tiptap/react@3.23.6': - resolution: {integrity: sha512-Tw9KZkYqFMk3vaJAEQKqEYIO/iq3cSJe7OUEGBul4k4GaMQeLItLf5EYhUd0GIPXci1WVVPNntKJsHfX25M37w==} + '@tiptap/react@3.24.0': + resolution: {integrity: sha512-KxnrlQbzOgA02EMsfuGGHtNhfkJQGqVlQttmQctI9DOl/F3gcaRqg+wNTBY1Fof8yDaZ8Z1LL1F0C05W0o3vUw==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0 + '@tiptap/pm': 3.24.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.23.6': - resolution: {integrity: sha512-gykwtGWrnWCmtql1hid3opac/KV8zQvOAnu3bTqIqcHrn1FusbUwKmNzavSbfGvcktHM3hFjb35W48JyVLyu/A==} + '@tiptap/starter-kit@3.24.0': + resolution: {integrity: sha512-Ef4PCP96vcY2GonXN9J0M8iC6zvxPTmQlL/QZiCwuYqqnH/hNpYIjNSQdTndiDpxRKofa32Sr2HWktgEnL32Bg==} '@tree-sitter-grammars/tree-sitter-yaml@0.7.1': resolution: {integrity: sha512-AynBwkIoQCTgjDR33bDUp9Mqq+YTco0is3n5hRApMqG9of/6A4eQsfC1/uSEeHSUyMQSYawcAWamsexnVpIP4Q==} @@ -8313,6 +8307,9 @@ packages: prosemirror-history@1.4.1: resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + prosemirror-keymap@1.2.2: resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} @@ -10463,21 +10460,10 @@ snapshots: '@fastify/forwarded': 3.0.1 ipaddr.js: 2.3.0 - '@floating-ui/core@1.7.3': - dependencies: - '@floating-ui/utils': 0.2.11 - optional: true - '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 - '@floating-ui/dom@1.7.4': - dependencies: - '@floating-ui/core': 1.7.3 - '@floating-ui/utils': 0.2.11 - optional: true - '@floating-ui/dom@1.7.6': dependencies: '@floating-ui/core': 1.7.5 @@ -11010,12 +10996,12 @@ snapshots: dependencies: react: 19.2.6 - '@mantine/tiptap@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tiptap/extension-link@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))(@tiptap/react@3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@mantine/tiptap@9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@9.2.2(react@19.2.6))(@tiptap/extension-link@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))(@tiptap/react@3.24.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@mantine/core': 9.2.2(@mantine/hooks@9.2.2(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mantine/hooks': 9.2.2(react@19.2.6) - '@tiptap/extension-link': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/react': 3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tiptap/extension-link': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + '@tiptap/react': 3.24.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) @@ -12232,174 +12218,175 @@ snapshots: - bare-buffer - supports-color - '@tiptap/core@3.23.6(@tiptap/pm@3.23.6)': + '@tiptap/core@3.24.0(@tiptap/pm@3.24.0)': dependencies: - '@tiptap/pm': 3.23.6 + '@tiptap/pm': 3.24.0 - '@tiptap/extension-blockquote@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-blockquote@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-bold@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-bold@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-bubble-menu@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': - dependencies: - '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 - optional: true - - '@tiptap/extension-bullet-list@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': - dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - - '@tiptap/extension-code-block@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': - dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 - - '@tiptap/extension-code@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': - dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - - '@tiptap/extension-color@3.23.6(@tiptap/extension-text-style@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)))': - dependencies: - '@tiptap/extension-text-style': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - - '@tiptap/extension-document@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': - dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - - '@tiptap/extension-dropcursor@3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': - dependencies: - '@tiptap/extensions': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - - '@tiptap/extension-floating-menu@3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-bubble-menu@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': dependencies: '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 optional: true - '@tiptap/extension-gapcursor@3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-bullet-list@3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extensions': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-hard-break@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-code-block@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 - '@tiptap/extension-heading@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-code@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-highlight@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-color@3.24.0(@tiptap/extension-text-style@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/extension-text-style': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) - '@tiptap/extension-horizontal-rule@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-document@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-image@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-dropcursor@3.24.0(@tiptap/extensions@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/extensions': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-italic@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-floating-menu@3.24.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@floating-ui/dom': 1.7.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 + optional: true - '@tiptap/extension-link@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-gapcursor@3.24.0(@tiptap/extensions@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/extensions': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + + '@tiptap/extension-hard-break@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': + dependencies: + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + + '@tiptap/extension-heading@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': + dependencies: + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + + '@tiptap/extension-highlight@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': + dependencies: + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + + '@tiptap/extension-horizontal-rule@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': + dependencies: + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 + + '@tiptap/extension-image@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': + dependencies: + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + + '@tiptap/extension-italic@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': + dependencies: + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + + '@tiptap/extension-link@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': + dependencies: + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 linkifyjs: 4.3.3 - '@tiptap/extension-list-item@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-list-item@3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-list-keymap@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-list-keymap@3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 - '@tiptap/extension-ordered-list@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-ordered-list@3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-paragraph@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-paragraph@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-placeholder@3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-placeholder@3.24.0(@tiptap/extensions@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extensions': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extensions': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-strike@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-strike@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-table-cell@3.23.6(@tiptap/extension-table@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-table-cell@3.24.0(@tiptap/extension-table@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-table': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-table': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-table-header@3.23.6(@tiptap/extension-table@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-table-header@3.24.0(@tiptap/extension-table@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-table': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-table': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-table-row@3.23.6(@tiptap/extension-table@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-table-row@3.24.0(@tiptap/extension-table@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-table': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-table': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-table@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-table@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 - '@tiptap/extension-task-item@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-task-item@3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-task-list@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-task-list@3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) - '@tiptap/extension-text-align@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-text-align@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-text-style@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-text-style@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-text@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-text@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extension-underline@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-underline@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) - '@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extensions@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 - '@tiptap/pm@3.23.6': + '@tiptap/pm@3.24.0': dependencies: prosemirror-changeset: 2.3.0 prosemirror-commands: 1.6.2 prosemirror-dropcursor: 1.8.1 prosemirror-gapcursor: 1.3.2 prosemirror-history: 1.4.1 + prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.2 prosemirror-model: 1.24.1 prosemirror-schema-list: 1.5.1 @@ -12408,10 +12395,10 @@ snapshots: prosemirror-transform: 1.10.2 prosemirror-view: 1.41.4 - '@tiptap/react@3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tiptap/react@3.24.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 '@types/react': 19.2.15 '@types/react-dom': 19.2.3(@types/react@19.2.15) '@types/use-sync-external-store': 0.0.6 @@ -12420,37 +12407,37 @@ snapshots: react-dom: 19.2.6(react@19.2.6) use-sync-external-store: 1.6.0(react@19.2.6) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-floating-menu': 3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-bubble-menu': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + '@tiptap/extension-floating-menu': 3.24.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.23.6': + '@tiptap/starter-kit@3.24.0': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/extension-blockquote': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-bold': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-bullet-list': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-code': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-code-block': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-document': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-dropcursor': 3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-gapcursor': 3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-hard-break': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-heading': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-horizontal-rule': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-italic': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-link': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-list-item': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-list-keymap': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-ordered-list': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-paragraph': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-strike': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-text': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-underline': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extensions': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) + '@tiptap/extension-blockquote': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-bold': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-bullet-list': 3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) + '@tiptap/extension-code': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-code-block': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + '@tiptap/extension-document': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-dropcursor': 3.24.0(@tiptap/extensions@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) + '@tiptap/extension-gapcursor': 3.24.0(@tiptap/extensions@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) + '@tiptap/extension-hard-break': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-heading': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-horizontal-rule': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + '@tiptap/extension-italic': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-link': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + '@tiptap/extension-list': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + '@tiptap/extension-list-item': 3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) + '@tiptap/extension-list-keymap': 3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) + '@tiptap/extension-ordered-list': 3.24.0(@tiptap/extension-list@3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0)) + '@tiptap/extension-paragraph': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-strike': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-text': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extension-underline': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) + '@tiptap/extensions': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) + '@tiptap/pm': 3.24.0 '@tree-sitter-grammars/tree-sitter-yaml@0.7.1(tree-sitter@0.22.4)': dependencies: @@ -15748,6 +15735,11 @@ snapshots: prosemirror-view: 1.41.4 rope-sequence: 1.3.4 + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + prosemirror-keymap@1.2.2: dependencies: prosemirror-state: 1.4.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0bae29b39..cfa192d3a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -49,22 +49,22 @@ catalog: "@testcontainers/mysql": ^12.0.1 "@testcontainers/postgresql": ^12.0.1 "@testcontainers/redis": ^12.0.1 - "@tiptap/extension-color": 3.23.6 - "@tiptap/extension-highlight": 3.23.6 - "@tiptap/extension-image": 3.23.6 - "@tiptap/extension-link": ^3.23.6 - "@tiptap/extension-placeholder": ^3.23.6 - "@tiptap/extension-table": 3.23.6 - "@tiptap/extension-table-cell": 3.23.6 - "@tiptap/extension-table-header": 3.23.6 - "@tiptap/extension-table-row": 3.23.6 - "@tiptap/extension-task-item": 3.23.6 - "@tiptap/extension-task-list": 3.23.6 - "@tiptap/extension-text-align": 3.23.6 - "@tiptap/extension-text-style": 3.23.6 - "@tiptap/extension-underline": 3.23.6 - "@tiptap/react": ^3.23.6 - "@tiptap/starter-kit": ^3.23.6 + "@tiptap/extension-color": 3.24.0 + "@tiptap/extension-highlight": 3.24.0 + "@tiptap/extension-image": 3.24.0 + "@tiptap/extension-link": ^3.24.0 + "@tiptap/extension-placeholder": ^3.24.0 + "@tiptap/extension-table": 3.24.0 + "@tiptap/extension-table-cell": 3.24.0 + "@tiptap/extension-table-header": 3.24.0 + "@tiptap/extension-table-row": 3.24.0 + "@tiptap/extension-task-item": 3.24.0 + "@tiptap/extension-task-list": 3.24.0 + "@tiptap/extension-text-align": 3.24.0 + "@tiptap/extension-text-style": 3.24.0 + "@tiptap/extension-underline": 3.24.0 + "@tiptap/react": ^3.24.0 + "@tiptap/starter-kit": ^3.24.0 "@trpc/client": ^11.17.0 "@trpc/next": ^11.17.0 "@trpc/react-query": ^11.17.0 From 41fe5928f19207d02b04e64c2caac49d896f72ce Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 4 Jun 2026 11:07:31 +0200 Subject: [PATCH 09/10] fix: add bookmark widget option to toggle card borders (#5854) --- packages/translation/src/lang/en.json | 3 +++ packages/widgets/src/bookmarks/component.tsx | 19 +++++++++++++++++-- packages/widgets/src/bookmarks/index.tsx | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 2bfe4e223..81a04ff76 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -1406,6 +1406,9 @@ "openNewTab": { "label": "Open in new tab" }, + "withBorder": { + "label": "Show border" + }, "items": { "label": "Bookmarks", "add": "Add bookmark" diff --git a/packages/widgets/src/bookmarks/component.tsx b/packages/widgets/src/bookmarks/component.tsx index 09066f90d..51fb6f781 100644 --- a/packages/widgets/src/bookmarks/component.tsx +++ b/packages/widgets/src/bookmarks/component.tsx @@ -16,7 +16,7 @@ export default function BookmarksWidget({ options, itemId }: WidgetComponentProp const board = useRequiredBoard(); const [data] = clientApi.app.byIds.useSuspenseQuery(options.items, { select(data) { - return data.sort((appA, appB) => options.items.indexOf(appA.id) - options.items.indexOf(appB.id)); + return data.toSorted((appA, appB) => options.items.indexOf(appA.id) - options.items.indexOf(appB.id)); }, }); @@ -56,6 +56,7 @@ export default function BookmarksWidget({ options, itemId }: WidgetComponentProp hideIcon={options.hideIcon} hideHostname={options.hideHostname} openNewTab={options.openNewTab} + withBorder={options.withBorder} hasIconColor={board.iconColor !== null} /> )} @@ -67,6 +68,7 @@ export default function BookmarksWidget({ options, itemId }: WidgetComponentProp hideIcon={options.hideIcon} hideHostname={options.hideHostname} openNewTab={options.openNewTab} + withBorder={options.withBorder} hasIconColor={board.iconColor !== null} /> )} @@ -81,6 +83,7 @@ interface FlexLayoutProps { hideIcon: boolean; hideHostname: boolean; openNewTab: boolean; + withBorder: boolean; hasIconColor: boolean; } @@ -91,6 +94,7 @@ const FlexLayout = ({ hideIcon, hideHostname, openNewTab, + withBorder, hasIconColor, }: FlexLayoutProps) => { const board = useRequiredBoard(); @@ -106,7 +110,15 @@ const FlexLayout = ({ key={app.id} w="100%" > - + {direction === "row" ? ( { @@ -168,6 +182,7 @@ const GridLayout = ({ h="100%" className={combineClasses(classes.card, classes["card-grid"])} radius={board.itemRadius} + withBorder={withBorder} p="xs" > {itemDirection === "horizontal" ? ( diff --git a/packages/widgets/src/bookmarks/index.tsx b/packages/widgets/src/bookmarks/index.tsx index 24b3a618c..c57b909fd 100644 --- a/packages/widgets/src/bookmarks/index.tsx +++ b/packages/widgets/src/bookmarks/index.tsx @@ -24,6 +24,7 @@ export const { definition, componentLoader } = createWidgetDefinition("bookmarks hideIcon: factory.switch({ defaultValue: false }), hideHostname: factory.switch({ defaultValue: false }), openNewTab: factory.switch({ defaultValue: true }), + withBorder: factory.switch({ defaultValue: false }), items: factory.sortableItemList({ ItemComponent: ({ item, handle: Handle, removeItem, rootAttributes }) => { return ( From 0167e6d564c108a200a99b4385e1e94ff42878ee Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Thu, 4 Jun 2026 13:39:36 +0200 Subject: [PATCH 10/10] fix(docker): fix logs page font size, sidebar active state, and breadcrumb translations - Set fontSize: 14 on both docker and server logs terminals for consistency - Use startsWith for nav link active state so docker sub-pages highlight Docker - Add missing navigationStructure.manage.tools.docker.logs translation key - Pass dynamicMappings for containerId in breadcrumb to show container name --- .../manage/tools/docker/logs/[containerId]/page.tsx | 13 +++++-------- .../tools/docker/logs/[containerId]/terminal.tsx | 1 + .../src/app/[locale]/manage/tools/logs/terminal.tsx | 1 + .../src/components/layout/navigation-link.tsx | 4 ++-- packages/translation/src/lang/en.json | 5 ++++- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/page.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/page.tsx index 6d41382d5..2c7a84521 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/page.tsx @@ -1,10 +1,9 @@ import { notFound } from "next/navigation"; -import { Box, Group, Title } from "@mantine/core"; +import { Box, Group } from "@mantine/core"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; import { env } from "@homarr/docker/env"; -import { getScopedI18n } from "@homarr/translation/server"; import "@xterm/xterm/css/xterm.css"; @@ -32,16 +31,14 @@ export default async function DockerContainerLogsPage({ params, searchParams }: notFound(); } - const tDocker = await getScopedI18n("docker"); - return ( <> - + - - {tDocker("action.logs.page.title", { name: name ?? containerId })} - diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/terminal.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/terminal.tsx index 6ff6cf196..67e168d3e 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/terminal.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/logs/[containerId]/terminal.tsx @@ -51,6 +51,7 @@ export const DockerLogsTerminal = ({ containerId }: DockerLogsTerminalProps) => cursorBlink: false, disableStdin: true, convertEol: true, + fontSize: 14, }); terminalRef.current.open(ref.current); terminalRef.current.loadAddon(canvasAddon); diff --git a/apps/nextjs/src/app/[locale]/manage/tools/logs/terminal.tsx b/apps/nextjs/src/app/[locale]/manage/tools/logs/terminal.tsx index 9e8c569af..275282b71 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/logs/terminal.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/logs/terminal.tsx @@ -43,6 +43,7 @@ export const TerminalComponent = () => { cursorBlink: false, disableStdin: true, convertEol: true, + fontSize: 14, }); terminalRef.current.open(ref.current); terminalRef.current.loadAddon(canvasAddon); diff --git a/apps/nextjs/src/components/layout/navigation-link.tsx b/apps/nextjs/src/components/layout/navigation-link.tsx index dd6949682..926143b10 100644 --- a/apps/nextjs/src/components/layout/navigation-link.tsx +++ b/apps/nextjs/src/components/layout/navigation-link.tsx @@ -28,7 +28,7 @@ const NavLinkHref = (props: NavigationLinkHref) => { label={props.label} leftSection={props.icon} href={props.href} - active={pathname === props.href} + active={pathname === props.href || pathname.startsWith(`${props.href}/`)} style={{ borderRadius: 5, }} @@ -38,7 +38,7 @@ const NavLinkHref = (props: NavigationLinkHref) => { const NavLinkWithItems = (props: NavigationLinkWithItems) => { const pathname = usePathname(); - const isActive = props.items.some((item) => item.href === pathname); + const isActive = props.items.some((item) => pathname === item.href || pathname.startsWith(`${item.href}/`)); return (