From 1079a5a4c5209f7e076f890e670087b2a5940569 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Wed, 10 Jun 2026 18:32:12 +0200 Subject: [PATCH 1/2] chore: regenerate pnpm-lock.yaml --- pnpm-lock.yaml | 67 +++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e19be9f68..9067979a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -477,6 +477,9 @@ catalogs: semver-parser: specifier: ^4.2.1 version: 4.2.1 + sql.js: + specifier: ^1.12.0 + version: 1.14.1 superjson: specifier: 2.2.6 version: 2.2.6 @@ -840,7 +843,7 @@ importers: version: 17.4.2 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) + version: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) flag-icons: specifier: 'catalog:' version: 7.5.0 @@ -853,12 +856,15 @@ importers: jotai: specifier: 'catalog:' version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.16)(react@19.2.7) + jszip: + specifier: 'catalog:' + version: 3.10.1 lucide-react: specifier: 'catalog:' version: 1.17.0(react@19.2.7) mantine-datatable: specifier: 'catalog:' - version: 9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.2.2(react@19.2.7))(clsx@2.1.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 9.2.2(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(clsx@2.1.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) mantine-react-table: specifier: 'catalog:' version: mantine-react-table-open@9.0.3(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/dates@9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -897,7 +903,7 @@ importers: version: 2.2.6 trpc-to-mcp: specifier: 'catalog:' - version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) + version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) use-deep-compare-effect: specifier: 'catalog:' version: 1.8.1(react@19.2.7) @@ -1204,7 +1210,7 @@ importers: version: 2.2.6 trpc-to-mcp: specifier: 'catalog:' - version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) + version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) trpc-to-openapi: specifier: 'catalog:' version: 3.3.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.4.3))(zod@4.4.3) @@ -1386,7 +1392,7 @@ importers: version: 0.2.9 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) + version: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) ioredis: specifier: 'catalog:' version: 5.11.0 @@ -1558,10 +1564,10 @@ importers: version: 0.31.10 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) + version: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) drizzle-zod: specifier: 'catalog:' - version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(zod@4.4.3) + version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(zod@4.4.3) mysql2: specifier: 'catalog:' version: 3.22.4(@types/node@24.12.4) @@ -2516,7 +2522,7 @@ importers: version: 1.17.0(react@19.2.7) mantine-datatable: specifier: 'catalog:' - version: 9.2.2(@mantine/core@9.2.2(@mantine/hooks@9.2.2(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.2.2(react@19.2.7))(clsx@2.1.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 9.2.2(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(clsx@2.1.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) mantine-react-table: specifier: 'catalog:' version: mantine-react-table-open@9.0.3(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/dates@9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -3511,9 +3517,6 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@floating-ui/vue@1.1.11': - resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} - '@floating-ui/vue@1.1.9': resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} @@ -9537,6 +9540,9 @@ packages: set-cookie-parser@3.1.0: resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -10897,12 +10903,12 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 - '@better-auth/drizzle-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))': + '@better-auth/drizzle-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))': dependencies: '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 optionalDependencies: - drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) + drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) '@better-auth/kysely-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2)': dependencies: @@ -11461,15 +11467,6 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@floating-ui/vue@1.1.11(vue@3.5.35(typescript@5.9.3))': - dependencies: - '@floating-ui/dom': 1.7.6 - '@floating-ui/utils': 0.2.11 - vue-demi: 0.14.10(vue@3.5.35(typescript@5.9.3)) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - '@floating-ui/vue@1.1.9(vue@3.5.35(typescript@5.9.3))': dependencies: '@floating-ui/dom': 1.7.6 @@ -14315,10 +14312,10 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)): + better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)): dependencies: '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) - '@better-auth/drizzle-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)) + '@better-auth/drizzle-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1)) '@better-auth/kysely-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2) '@better-auth/memory-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) '@better-auth/mongo-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) @@ -14337,7 +14334,7 @@ snapshots: optionalDependencies: better-sqlite3: 12.10.0 drizzle-kit: 0.31.10 - drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) + drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) mysql2: 3.22.4(@types/node@24.12.4) next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) pg: 8.21.0 @@ -14897,7 +14894,7 @@ snapshots: esbuild: 0.25.12 tsx: 4.21.0 - drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0): + drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1): optionalDependencies: '@libsql/client-wasm': 0.14.0 '@opentelemetry/api': 1.9.0 @@ -14910,9 +14907,9 @@ snapshots: pg: 8.21.0 sql.js: 1.14.1 - drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(zod@4.4.3): + drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(zod@4.4.3): dependencies: - drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) + drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) zod: 4.4.3 dunder-proto@1.0.1: @@ -16206,6 +16203,14 @@ snapshots: dependencies: semver: 7.7.4 + mantine-datatable@9.2.2(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(clsx@2.1.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + '@mantine/core': 9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@mantine/hooks': 9.3.0(react@19.2.7) + clsx: 2.1.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + mantine-react-table-open@9.0.3(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/dates@9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: '@mantine/core': 9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -17428,7 +17433,7 @@ snapshots: radix-vue@1.9.17(vue@3.5.35(typescript@5.9.3)): dependencies: '@floating-ui/dom': 1.7.6 - '@floating-ui/vue': 1.1.11(vue@3.5.35(typescript@5.9.3)) + '@floating-ui/vue': 1.1.9(vue@3.5.35(typescript@5.9.3)) '@internationalized/date': 3.12.2 '@internationalized/number': 3.6.7 '@tanstack/vue-virtual': 3.13.28(vue@3.5.35(typescript@5.9.3)) @@ -18452,11 +18457,11 @@ snapshots: trough@2.2.0: {} - trpc-to-mcp@1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3): + trpc-to-mcp@1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3): dependencies: '@modelcontextprotocol/sdk': 1.26.0(zod@4.4.3) '@trpc/server': 11.17.0(typescript@5.9.3) - better-auth: 1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)) + better-auth: 1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)) mcp-handler: 1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)) zod: 4.4.3 transitivePeerDependencies: From 29bd7101b180acfb750c7d4414c30bd6450065e2 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 10 Jun 2026 18:45:41 +0200 Subject: [PATCH 2/2] feat(board): add widget hover overlay on dashboard (#5888) --- .../board/items/widget-hover-metadata.ts | 155 ++++++++++++++++++ .../items/widget-hover-overlay.module.css | 116 +++++++++++++ .../board/items/widget-hover-overlay.tsx | 86 ++++++++++ .../src/components/board/sections/content.tsx | 14 +- apps/nextjs/src/styles/gridstack.scss | 4 + packages/widgets/src/index.tsx | 1 + 6 files changed, 372 insertions(+), 4 deletions(-) create mode 100644 apps/nextjs/src/components/board/items/widget-hover-metadata.ts create mode 100644 apps/nextjs/src/components/board/items/widget-hover-overlay.module.css create mode 100644 apps/nextjs/src/components/board/items/widget-hover-overlay.tsx diff --git a/apps/nextjs/src/components/board/items/widget-hover-metadata.ts b/apps/nextjs/src/components/board/items/widget-hover-metadata.ts new file mode 100644 index 000000000..22a75c9b3 --- /dev/null +++ b/apps/nextjs/src/components/board/items/widget-hover-metadata.ts @@ -0,0 +1,155 @@ +import { objectEntries } from "@homarr/common"; +import type { IntegrationKind, WidgetKind } from "@homarr/definitions"; +import type { SettingsContextProps } from "@homarr/settings/creator"; +import type { WidgetOptionDefinition, WidgetOptionType } from "@homarr/widgets"; +import { reduceWidgetOptionsWithDefaultValues, widgetImports } from "@homarr/widgets"; + +import type { SectionItem } from "~/app/[locale]/boards/_types"; + +export type Translator = { + (key: string): string; +}; + +export interface HoverMetadataItem { + label: string; + value: string; +} + +const maxMetadataItems = 3; + +const skippedOptionTypes: Partial> = { + app: true, + anchorNote: true, + dynamicSelect: true, + sortableItemList: true, + multiReleasesRepositories: true, + umamiEventName: true, + umamiEventNames: true, + umamiWebsite: true, +}; + +const isEqualValue = (left: unknown, right: unknown) => JSON.stringify(left) === JSON.stringify(right); + +type OptionDefinitionWithRules = WidgetOptionDefinition & { + shouldHide?: (options: never, integrationKinds: IntegrationKind[]) => boolean; + options?: readonly { value: unknown; label: unknown }[]; +}; + +type OptionFormatter = (value: unknown, definition: OptionDefinitionWithRules, t: Translator) => string | null; + +const resolveSelectLabel = (value: unknown, definition: OptionDefinitionWithRules, t: Translator) => { + const match = definition.options?.find((option) => option.value === value); + const label = match?.label; + const fallbackLabel = () => String(value); + const labelResolvers: Record string> = { + function: () => (label as (translator: Translator) => string)(t), + string: () => label as string, + missing: fallbackLabel, + }; + const labelType = typeof label; + const resolveLabel: () => string = labelResolvers[labelType] ?? fallbackLabel; + return resolveLabel(); +}; + +const optionTypeFormatters: Partial> = { + switch: (value, _, t) => { + const switchLabels: Record = { + true: t("common.action.show"), + false: t("common.action.hide"), + }; + return switchLabels[String(Boolean(value))] ?? null; + }, + text: (value) => { + const text = String(value).trim(); + return text.length > 0 ? text : null; + }, + number: (value) => String(value), + slider: (value) => String(value), + select: (value, definition, t) => resolveSelectLabel(value, definition, t), + multiSelect: (value) => { + const items = value as unknown[]; + return items.length > 0 ? String(items.length) : null; + }, + multiText: (value) => { + const items = (value as string[]).filter((entry) => entry.trim().length > 0); + return items.length > 0 ? items.join(", ") : null; + }, + location: (value) => { + const location = value as { name?: string }; + const name = location.name?.trim() ?? ""; + return name.length > 0 ? name : null; + }, +}; + +const formatOptionValue = ( + type: WidgetOptionType, + value: unknown, + definition: OptionDefinitionWithRules, + t: Translator, +) => { + const formatter = optionTypeFormatters[type]; + return formatter?.(value, definition, t) ?? null; +}; + +const getOptionLabel = (kind: WidgetKind, key: string, t: Translator) => { + const labelKey = `widget.${kind}.option.${key}.label`; + const translated = t(labelKey); + return translated === labelKey ? key : translated; +}; + +export const collectWidgetHoverMetadata = ( + item: SectionItem, + settings: Pick, + integrationKinds: IntegrationKind[], + t: Translator, +): HoverMetadataItem[] => { + const { definition } = widgetImports[item.kind]; + const optionDefinitions = definition.createOptions(settings) as Record; + const resolvedOptions = reduceWidgetOptionsWithDefaultValues(item.kind, settings, item.options); + + return objectEntries(optionDefinitions) + .filter(([key, optionDefinition]) => { + const skip = skippedOptionTypes[optionDefinition.type]; + const hidden = optionDefinition.shouldHide?.(resolvedOptions as never, integrationKinds); + const unchanged = isEqualValue(resolvedOptions[key], optionDefinition.defaultValue); + return !skip && !hidden && !unchanged; + }) + .map(([key, optionDefinition]) => { + const formattedValue = formatOptionValue(optionDefinition.type, resolvedOptions[key], optionDefinition, t); + return { + label: getOptionLabel(item.kind, key, t), + value: formattedValue ?? "", + }; + }) + .filter((entry) => entry.value.length > 0) + .slice(0, maxMetadataItems); +}; + +interface DisplayNameSource { + matches: (item: SectionItem, options: Record) => boolean; + resolve: (item: SectionItem, options: Record) => string; +} + +const displayNameSources: DisplayNameSource[] = [ + { + matches: (item) => Boolean(item.advancedOptions.title?.trim()), + resolve: (item) => item.advancedOptions.title?.trim() ?? "", + }, + { + matches: (item, options) => + item.kind === "clock" && + Boolean(options.customTitleToggle) && + String(options.customTitle ?? "").trim().length > 0, + resolve: (_, options) => String(options.customTitle).trim(), + }, +]; + +export const resolveWidgetDisplayName = ( + item: SectionItem, + settings: Pick, + t: Translator, +) => { + const resolvedOptions = reduceWidgetOptionsWithDefaultValues(item.kind, settings, item.options); + const source = displayNameSources.find((entry) => entry.matches(item, resolvedOptions)); + return source?.resolve(item, resolvedOptions) ?? t(`widget.${item.kind}.name`); +}; diff --git a/apps/nextjs/src/components/board/items/widget-hover-overlay.module.css b/apps/nextjs/src/components/board/items/widget-hover-overlay.module.css new file mode 100644 index 000000000..32201049f --- /dev/null +++ b/apps/nextjs/src/components/board/items/widget-hover-overlay.module.css @@ -0,0 +1,116 @@ +.wrapper { + position: absolute; + left: 10px; + right: 10px; + bottom: calc(100% - 10px); + margin-bottom: 1px; + z-index: 200; + pointer-events: auto; + opacity: 0; + transform: translateY(6px); + transition: + opacity 150ms ease, + transform 150ms ease; +} + +:global(.grid-stack-item[data-type="item"]:not([data-kind="app"]):hover) .wrapper, +:global(.grid-stack-item[data-type="item"]:not([data-kind="app"]):focus-within) .wrapper { + opacity: 1; + transform: translateY(0); +} + +.panel { + @mixin dark { + --background-color: rgb(from var(--mantine-color-dark-7) r g b / 0.96); + --border-color: rgb(from var(--mantine-color-dark-4) r g b / 0.9); + } + @mixin light { + --background-color: rgb(from var(--mantine-color-white) r g b / 0.96); + --border-color: rgb(from var(--mantine-color-gray-3) r g b / 0.9); + } + display: flex; + align-items: center; + gap: 8px; + min-height: 28px; + padding: 4px 8px; + border: 1px solid var(--border-color); + border-radius: var(--mantine-radius-md); + background-color: var(--background-color); + box-shadow: 0 4px 16px rgb(0 0 0 / 0.12); + backdrop-filter: blur(8px); + overflow: hidden; +} + +.nameSection { + display: flex; + align-items: center; + gap: 6px; + min-width: 0; + flex-shrink: 0; +} + +.widgetIcon { + flex-shrink: 0; + color: var(--mantine-color-dimmed); +} + +.name { + font-size: 11px; + font-weight: 600; + line-height: 1.2; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.integrations { + flex-shrink: 0; +} + +.integrationAvatar { + border: none; +} + +.metadata { + display: flex; + align-items: center; + gap: 4px; + min-width: 0; + margin-left: auto; +} + +.metadataItem { + @mixin dark { + --chip-background: rgb(from var(--mantine-color-dark-5) r g b / 0.9); + } + @mixin light { + --chip-background: rgb(from var(--mantine-color-gray-1) r g b / 0.95); + } + display: flex; + align-items: center; + gap: 4px; + max-width: 140px; + padding: 2px 6px; + border-radius: var(--mantine-radius-md); + background-color: var(--chip-background); + font-size: 10px; + line-height: 1.2; + white-space: nowrap; + overflow: hidden; +} + +.metadataLabel { + color: var(--mantine-color-dimmed); + flex-shrink: 0; +} + +.metadataValue { + overflow: hidden; + text-overflow: ellipsis; +} + +@media (max-width: 768px) { + .wrapper { + display: none; + } +} diff --git a/apps/nextjs/src/components/board/items/widget-hover-overlay.tsx b/apps/nextjs/src/components/board/items/widget-hover-overlay.tsx new file mode 100644 index 000000000..40c64d3a1 --- /dev/null +++ b/apps/nextjs/src/components/board/items/widget-hover-overlay.tsx @@ -0,0 +1,86 @@ +"use client"; + +import { Avatar, Group, Text, Tooltip } from "@mantine/core"; + +import type { RouterOutputs } from "@homarr/api"; +import { useEditMode } from "@homarr/boards/edit-mode"; +import { getIconUrl } from "@homarr/definitions"; +import { useSettings } from "@homarr/settings"; +import { useI18n } from "@homarr/translation/client"; +import { widgetImports } from "@homarr/widgets"; + +import type { SectionItem } from "~/app/[locale]/boards/_types"; +import type { Translator } from "./widget-hover-metadata"; +import { collectWidgetHoverMetadata, resolveWidgetDisplayName } from "./widget-hover-metadata"; +import classes from "./widget-hover-overlay.module.css"; + +interface WidgetHoverOverlayProps { + item: SectionItem; + integrations: RouterOutputs["integration"]["all"] | undefined; +} + +export const WidgetHoverOverlay = ({ item, integrations }: WidgetHoverOverlayProps) => { + const [isEditMode] = useEditMode(); + const settings = useSettings(); + const t = useI18n(); + const { definition } = widgetImports[item.kind]; + const WidgetIcon = definition.icon; + + const translate = ((key: string) => t(key as never)) as Translator; + const displayName = resolveWidgetDisplayName(item, settings, translate); + + const connectedIntegrations = (integrations ?? []).filter((integration) => + item.integrationIds.includes(integration.id), + ); + const metadataItems = collectWidgetHoverMetadata( + item, + settings, + connectedIntegrations.map((integration) => integration.kind), + translate, + ); + const hasIntegrations = connectedIntegrations.length > 0; + const hasMetadata = metadataItems.length > 0; + + if (isEditMode) { + return null; + } + + return ( +
+
+
+ + + {displayName} + +
+ + {hasIntegrations && ( + + {connectedIntegrations.map((integration) => ( + + + + ))} + + )} + + {hasMetadata && ( + + {metadataItems.map((metadataItem) => ( +
+ {metadataItem.label} + {metadataItem.value} +
+ ))} +
+ )} +
+
+ ); +}; diff --git a/apps/nextjs/src/components/board/sections/content.tsx b/apps/nextjs/src/components/board/sections/content.tsx index 9c6e475d4..ced30c796 100644 --- a/apps/nextjs/src/components/board/sections/content.tsx +++ b/apps/nextjs/src/components/board/sections/content.tsx @@ -2,8 +2,12 @@ import { useMemo } from "react"; import type { GridItemHTMLElement } from "@homarr/gridstack"; +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/client"; + import type { DynamicSectionItem, SectionItem } from "~/app/[locale]/boards/_types"; import { BoardItemContent } from "../items/item-content"; +import { WidgetHoverOverlay } from "../items/widget-hover-overlay"; import { BoardDynamicSection } from "./dynamic-section"; import { GridStackItem } from "./gridstack/gridstack-item"; import { useSectionContext } from "./section-context"; @@ -11,6 +15,7 @@ import { useSectionItems } from "./use-section-items"; export const SectionContent = () => { const { innerSections, items, refs } = useSectionContext(); + const { data: integrations } = clientApi.integration.all.useQuery(); /** * IMPORTANT: THE ORDER OF THE BELOW ITEMS HAS TO MATCH THE ORDER OF @@ -18,7 +23,7 @@ export const SectionContent = () => { * @see https://github.com/homarr-labs/homarr/pull/1770 */ const sortedItems = useMemo(() => { - return [...items, ...innerSections].sort((itemA, itemB) => { + return [...items, ...innerSections].toSorted((itemA, itemB) => { if (itemA.yOffset === itemB.yOffset) { return itemA.xOffset - itemB.xOffset; } @@ -30,7 +35,7 @@ export const SectionContent = () => { return ( <> {sortedItems.map((item) => ( - + ))} ); @@ -39,12 +44,12 @@ export const SectionContent = () => { interface ItemProps { item: DynamicSectionItem | SectionItem; innerRef: React.RefObject | undefined; + integrations: RouterOutputs["integration"]["all"] | undefined; } -const Item = ({ item, innerRef }: ItemProps) => { +const Item = ({ item, innerRef, integrations }: ItemProps) => { const minWidth = useMinSize(item, "x"); const minHeight = useMinSize(item, "y"); - return ( { minWidth={minWidth} minHeight={minHeight} > + {item.type === "item" && item.kind !== "app" && } {item.type === "item" ? : } ); diff --git a/apps/nextjs/src/styles/gridstack.scss b/apps/nextjs/src/styles/gridstack.scss index 615278f80..1542b0282 100644 --- a/apps/nextjs/src/styles/gridstack.scss +++ b/apps/nextjs/src/styles/gridstack.scss @@ -102,6 +102,10 @@ overflow-y: auto; } +.grid-stack > .grid-stack-item[data-type="item"] { + overflow: visible; +} + .grid-stack.grid-stack-animate { transition: none; } diff --git a/packages/widgets/src/index.tsx b/packages/widgets/src/index.tsx index 460cea320..275114993 100644 --- a/packages/widgets/src/index.tsx +++ b/packages/widgets/src/index.tsx @@ -60,6 +60,7 @@ import * as weather from "./weather"; export type { WidgetDefinition, WidgetOptionsSettings } from "./definition"; export type { WidgetComponentProps }; +export type { WidgetOptionDefinition, WidgetOptionType } from "./options"; export const widgetImports = { clock,