diff --git a/backend/drizzle.config.ts b/backend/drizzle.config.ts index 41cdc9b2c..31b96402f 100644 --- a/backend/drizzle.config.ts +++ b/backend/drizzle.config.ts @@ -1,4 +1,5 @@ import { defineConfig } from 'drizzle-kit'; +import { dbConfig } from '#/db/db'; import { env } from './env'; const extendConfig = env.PGLITE ? { driver: 'pglite' } : {}; @@ -7,7 +8,7 @@ export default defineConfig({ schema: './src/db/schema/*', out: './drizzle', dialect: 'postgresql', - casing: 'snake_case', + casing: dbConfig.casing, ...extendConfig, dbCredentials: { url: env.PGLITE ? './.db' : env.DATABASE_URL, diff --git a/backend/src/db/db.ts b/backend/src/db/db.ts index 16279b777..bdb1be237 100644 --- a/backend/src/db/db.ts +++ b/backend/src/db/db.ts @@ -7,7 +7,7 @@ import { config } from 'config'; import { type DrizzleConfig, sql } from 'drizzle-orm'; import type { PgDatabase } from 'drizzle-orm/pg-core'; -const dbConfig: DrizzleConfig = { +export const dbConfig: DrizzleConfig = { logger: config.debug, casing: 'snake_case', }; diff --git a/backend/src/middlewares/index.ts b/backend/src/middlewares/index.ts index 3b4e34832..ba0ac7aeb 100644 --- a/backend/src/middlewares/index.ts +++ b/backend/src/middlewares/index.ts @@ -4,10 +4,10 @@ import { compress } from 'hono/compress'; import { cors } from 'hono/cors'; import { csrf } from 'hono/csrf'; import { secureHeaders } from 'hono/secure-headers'; +import { observatoryMiddleware } from '#/middlewares/observatory/'; import { CustomHono } from '#/types/common'; import { logEvent } from './logger/log-event'; import { logger } from './logger/logger'; -import { observatoryMiddleware } from './observatory-middleware'; import { rateLimiter } from './rate-limiter'; const app = new CustomHono(); diff --git a/backend/src/middlewares/observatory-middleware.ts b/backend/src/middlewares/observatory-middleware.ts deleted file mode 100644 index 8217e1fe8..000000000 --- a/backend/src/middlewares/observatory-middleware.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { trace } from '@opentelemetry/api'; -import type { MiddlewareHandler } from 'hono/types'; -import { Counter } from 'prom-client'; - -// Define a Counter metric for HTTP requests -const httpRequestCounter = new Counter({ - name: 'Requests', - help: 'Total number and date of requests', - labelNames: ['requestsNumber', 'date'], -}); - -export const observatoryMiddleware: MiddlewareHandler = async (ctx, next) => { - const tracer = trace.getTracer('my-tracer'); - const span = tracer.startSpan('traceMiddleware'); - - // Add attributes to the trace - span.setAttribute('method', ctx.req.method); - span.setAttribute('url', ctx.req.url); - const currentCounter = await httpRequestCounter.get(); - try { - // Increment the request counter - httpRequestCounter.inc({ requestsNumber: currentCounter.values.length + 1, date: new Date().getTime() }); - await next(); - - // Set the span status based on the response status - const { status } = ctx.res; - span.setStatus({ code: status }); - } finally { - span.end(); - } -}; diff --git a/backend/src/middlewares/observatory/config.ts b/backend/src/middlewares/observatory/config.ts new file mode 100644 index 000000000..ca692f315 --- /dev/null +++ b/backend/src/middlewares/observatory/config.ts @@ -0,0 +1,18 @@ +import type { MetricOptions } from '#/middlewares/observatory/types'; + +// Define the metrics configuration +export const metricsConfig = { + requestDuration: { + type: 'histogram', + name: 'Request_duration', + help: 'Duration of HTTP requests in seconds', + labelNames: ['method', 'status', 'ok', 'route'], + buckets: [0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10], + }, + requestsTotal: { + type: 'counter', + name: 'Requests_count', + help: 'Total number and date of requests', + labelNames: ['requestsNumber', 'date'], + }, +} satisfies Record; diff --git a/backend/src/middlewares/observatory/index.ts b/backend/src/middlewares/observatory/index.ts new file mode 100644 index 000000000..819331ba8 --- /dev/null +++ b/backend/src/middlewares/observatory/index.ts @@ -0,0 +1,39 @@ +import type { MiddlewareHandler } from 'hono/types'; +import { Counter, Histogram } from 'prom-client'; +import { metricsConfig } from '#/middlewares/observatory/config'; + +// Prometheus metrics Initialize +const observatoryRequestDurationHistogram = new Histogram({ + name: metricsConfig.requestDuration.name, + help: metricsConfig.requestDuration.help, + labelNames: metricsConfig.requestDuration.labelNames, + buckets: metricsConfig.requestDuration.buckets, +}); + +const observatoryRequestsCounter = new Counter({ + name: metricsConfig.requestsTotal.name, + help: metricsConfig.requestsTotal.help, + labelNames: metricsConfig.requestsTotal.labelNames, +}); + +export const observatoryMiddleware: MiddlewareHandler = async (ctx, next) => { + const start = Date.now(); + + // Incrementing request count + const currentCounter = await observatoryRequestsCounter.get(); + observatoryRequestsCounter.inc({ requestsNumber: currentCounter.values.length + 1, date: new Date().getTime() }); + + // Measure request duration and record it in the histogram + const duration = (Date.now() - start) / 1000; // Convert milliseconds to seconds + observatoryRequestDurationHistogram.observe( + { + method: ctx.req.method, + status: ctx.res.status.toString(), + ok: ctx.res.status, + route: ctx.req.url, + }, + duration, + ); + + await next(); +}; diff --git a/backend/src/middlewares/observatory/types.ts b/backend/src/middlewares/observatory/types.ts new file mode 100644 index 000000000..894fec722 --- /dev/null +++ b/backend/src/middlewares/observatory/types.ts @@ -0,0 +1,7 @@ +import type { Context } from 'hono'; +import type { CounterConfiguration, HistogramConfiguration } from 'prom-client'; + +export type MetricOptions = { + disabled?: boolean; + customLabels?: Record string>; +} & (({ type: 'counter' } & CounterConfiguration) | ({ type: 'histogram' } & HistogramConfiguration)); diff --git a/backend/src/modules/metrics/helpers/utils.ts b/backend/src/modules/metrics/helpers/utils.ts index 5b40f50be..35c10345f 100644 --- a/backend/src/modules/metrics/helpers/utils.ts +++ b/backend/src/modules/metrics/helpers/utils.ts @@ -1,20 +1,27 @@ -export const parsePromMetrics = (text: string): Record[] => { +export const parsePromMetrics = (text: string, metricName: string): Record[] => { + // Split the text into lines, trim each line, and keep only the ones starting with the metricName const lines = text .split('\n') .map((line) => line.trim()) - .filter((line) => line.startsWith('Requests')); + .filter((line) => line.startsWith(metricName)); + // Process each line that starts with the metricName to extract labels return lines .map((line) => { - // Match the pattern to extract labels - const match = line.match(/Requests{([^}]*)}\s(\d+)/); + const match = line.match(/{([^}]*)}/); if (!match) return null; + + // Extract the part containing the labels from the match const [, labels] = match; - return labels.split(',').reduce>((acc, label) => { - const [key, val] = label.split('='); - acc[key.trim()] = val.replace(/"/g, '').trim(); - return acc; - }, {}); + + // Transform the labels into valid JSON + const jsonString = `{${labels.replace(/(\w+)=/g, '"$1":')}}`; + + try { + return JSON.parse(jsonString); + } catch (err) { + return null; // If parsing fails, return null + } }) .filter((metric) => metric !== null); }; diff --git a/backend/src/modules/metrics/index.ts b/backend/src/modules/metrics/index.ts index 4ce3b0cdb..36b85cd34 100644 --- a/backend/src/modules/metrics/index.ts +++ b/backend/src/modules/metrics/index.ts @@ -4,6 +4,7 @@ import { db } from '#/db/db'; import { getTableConfig } from 'drizzle-orm/pg-core'; import { register } from 'prom-client'; import { entityTables } from '#/entity-config'; +import { metricsConfig } from '#/middlewares/observatory/config'; import { calculateRequestsPerMinute, parsePromMetrics } from '#/modules/metrics/helpers/utils'; import { CustomHono } from '#/types/common'; import MetricsRoutesConfig from './routes'; @@ -18,8 +19,12 @@ const metricRoutes = app .openapi(MetricsRoutesConfig.getMetrics, async (ctx) => { const metrics = await register.metrics(); - const parsedMetrics = parsePromMetrics(metrics); - const requestsPerMinute = calculateRequestsPerMinute(parsedMetrics); + // get count metrics + const parsedCountMetrics = parsePromMetrics(metrics, metricsConfig.requestsTotal.name); + const requestsPerMinute = calculateRequestsPerMinute(parsedCountMetrics); + + // get duration metrics + // const parsedDurationMetrics = parsePromMetrics(metrics, metricsConfig.requestDuration.name); return ctx.json({ success: true, data: requestsPerMinute }, 200); }) diff --git a/backend/src/modules/organizations/index.ts b/backend/src/modules/organizations/index.ts index 9e199ccc3..5fe730949 100644 --- a/backend/src/modules/organizations/index.ts +++ b/backend/src/modules/organizations/index.ts @@ -237,17 +237,24 @@ const organizationsRoutes = app const user = getContextUser(); const { organizationIds, subject, content } = ctx.req.valid('json'); - // TODO simplify this? // For test purposes - if (typeof env.SEND_ALL_TO_EMAIL === 'string' && env.NODE_ENV === 'development') { + // For test purposes + if (env.NODE_ENV === 'development') { const unsafeUser = await getUserBy('id', user.id, 'unsafe'); - const unsubscribeToken = unsafeUser ? unsafeUser.unsubscribeToken : ''; - const unsubscribeLink = `${config.backendUrl}/unsubscribe?token=${unsubscribeToken}`; + const unsubscribeLink = unsafeUser ? `${config.backendUrl}/unsubscribe?token=${unsafeUser.unsubscribeToken}` : ''; - // generating email html + // Generate email HTML const emailHtml = await render( - organizationsNewsletter({ userLanguage: user.language, subject, content, unsubscribeLink, authorEmail: user.email, orgName: 'SOME NAME' }), + organizationsNewsletter({ + userLanguage: user.language, + subject, + content: user.newsletter ? content : 'You`ve unsubscribed from news letters', + unsubscribeLink, + authorEmail: user.email, + orgName: 'SOME NAME', + }), ); - emailSender.send(env.SEND_ALL_TO_EMAIL, user.newsletter ? subject : 'User unsubscribed from newsletter', emailHtml); + + emailSender.send(env.SEND_ALL_TO_EMAIL ?? user.email, subject, emailHtml); } else { // Get members const organizationsMembersEmails = await db diff --git a/frontend/package.json b/frontend/package.json index 9ebe3d51f..9d30bc275 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,11 +18,11 @@ "@atlaskit/pragmatic-drag-and-drop": "^1.4.0", "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^1.4.0", "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3", - "@blocknote/core": "^0.19.0", - "@blocknote/react": "^0.19.0", - "@blocknote/shadcn": "^0.19.0", - "@electric-sql/client": "^0.7.1", - "@floating-ui/react": "^0.26.27", + "@blocknote/core": "^0.19.1", + "@blocknote/react": "^0.19.1", + "@blocknote/shadcn": "^0.19.1", + "@electric-sql/client": "^0.7.2", + "@floating-ui/react": "^0.26.28", "@github/mini-throttle": "^2.1.1", "@hookform/resolvers": "^3.9.1", "@oslojs/encoding": "^1.1.0", @@ -53,12 +53,12 @@ "@sentry/react": "^8.38.0", "@t3-oss/env-core": "^0.11.1", "@tailwindcss/typography": "^0.5.15", - "@tanstack/query-sync-storage-persister": "^5.59.20", - "@tanstack/react-query": "^5.60.2", - "@tanstack/react-query-devtools": "^5.60.2", - "@tanstack/react-query-persist-client": "^5.60.2", - "@tanstack/react-router": "^1.81.5", - "@tanstack/router-devtools": "^1.81.5", + "@tanstack/query-sync-storage-persister": "^5.60.5", + "@tanstack/react-query": "^5.60.5", + "@tanstack/react-query-devtools": "^5.60.5", + "@tanstack/react-query-persist-client": "^5.60.5", + "@tanstack/react-router": "^1.81.14", + "@tanstack/router-devtools": "^1.81.14", "@uppy/audio": "^2.0.1", "@uppy/core": "^4.2.3", "@uppy/dashboard": "^4.1.2", @@ -82,7 +82,7 @@ "embla-carousel-autoplay": "^8.3.1", "embla-carousel-react": "^8.3.1", "emblor": "^1.4.6", - "framer-motion": "^11.11.16", + "framer-motion": "^11.11.17", "gleap": "^14.0.8", "hono": "4.6.10", "i18next": "^23.16.5", @@ -127,7 +127,7 @@ "@redux-devtools/extension": "^3.3.0", "@rollup/plugin-terser": "^0.4.4", "@sentry/vite-plugin": "^2.22.6", - "@tanstack/router-plugin": "^1.79.0", + "@tanstack/router-plugin": "^1.81.9", "@types/dompurify": "^3.0.5", "@types/lodash.clonedeep": "^4.5.9", "@types/node": "^22.9.0", @@ -142,7 +142,7 @@ "postcss-preset-env": "^10.1.0", "postgres": "^3.4.5", "rollup-plugin-visualizer": "^5.12.0", - "tailwindcss": "^3.4.14", + "tailwindcss": "^3.4.15", "tsx": "^4.19.2", "typescript": "^5.6.3", "vite": "^5.4.11", diff --git a/frontend/src/index.css b/frontend/src/index.css index 6ab5105f7..42da50f67 100755 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -98,7 +98,7 @@ } body { - @apply bg-background text-foreground min-h-full; + @apply bg-background text-foreground min-h-full overscroll-none; } /* For small screens we enlarge all elements by using rem everywhere, and then simply increase font-size */ diff --git a/frontend/src/modules/auth/check-email-form.tsx b/frontend/src/modules/auth/check-email-form.tsx index fa437bf0e..57a0221e1 100644 --- a/frontend/src/modules/auth/check-email-form.tsx +++ b/frontend/src/modules/auth/check-email-form.tsx @@ -4,17 +4,15 @@ import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import type * as z from 'zod'; -import { Button } from '~/modules/ui/button'; +import { SubmitButton } from '~/modules/ui/button'; import { Form, FormControl, FormField, FormItem, FormMessage } from '~/modules/ui/form'; import { Input } from '~/modules/ui/input'; -import { onlineManager } from '@tanstack/react-query'; import { config } from 'config'; import { ArrowRight } from 'lucide-react'; import { useEffect } from 'react'; import { checkEmail as baseCheckEmail } from '~/api/auth'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; import type { Step, TokenData } from '.'; const formSchema = emailBodySchema; @@ -44,8 +42,6 @@ export const CheckEmailForm = ({ tokenData, setStep }: CheckEmailProps) => { }); const onSubmit = (values: z.infer) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - checkEmail(values.email); }; @@ -82,10 +78,10 @@ export const CheckEmailForm = ({ tokenData, setStep }: CheckEmailProps) => { )} /> - + ); diff --git a/frontend/src/modules/auth/reset-password.tsx b/frontend/src/modules/auth/reset-password.tsx index 33cf27a6b..2e31a1432 100644 --- a/frontend/src/modules/auth/reset-password.tsx +++ b/frontend/src/modules/auth/reset-password.tsx @@ -4,9 +4,8 @@ import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import * as z from 'zod'; import AuthPage from '~/modules/auth/auth-page'; -import { Button } from '~/modules/ui/button'; +import { SubmitButton } from '~/modules/ui/button'; -import { onlineManager } from '@tanstack/react-query'; import { passwordSchema } from 'backend/utils/schema/common-schemas'; import { config } from 'config'; import { ArrowRight, Loader2 } from 'lucide-react'; @@ -16,7 +15,6 @@ import type { ApiError } from '~/api'; import { resetPassword as baseResetPassword } from '~/api/auth'; import { checkToken as baseCheckToken } from '~/api/general'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; import { Form, FormControl, FormField, FormItem, FormMessage } from '~/modules/ui/form'; import { Input } from '~/modules/ui/input'; import { ResetPasswordRoute } from '~/routes/auth'; @@ -60,8 +58,6 @@ const ResetPassword = () => { // Submit new password const onSubmit = (values: z.infer) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - const { password } = values; resetPassword({ token, password }); }; @@ -102,10 +98,10 @@ const ResetPassword = () => { )} /> - + ) : (
diff --git a/frontend/src/modules/auth/sign-in-form.tsx b/frontend/src/modules/auth/sign-in-form.tsx index f80cc13a4..0ca7b23c3 100644 --- a/frontend/src/modules/auth/sign-in-form.tsx +++ b/frontend/src/modules/auth/sign-in-form.tsx @@ -5,18 +5,16 @@ import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import type * as z from 'zod'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form, FormControl, FormField, FormItem, FormMessage } from '~/modules/ui/form'; import { Input } from '~/modules/ui/input'; -import { onlineManager } from '@tanstack/react-query'; import { config } from 'config'; import { ArrowRight, ChevronDown, Send } from 'lucide-react'; import { useEffect, useRef } from 'react'; import { toast } from 'sonner'; import { sendResetPasswordEmail as baseSendResetPasswordEmail, signIn as baseSignIn } from '~/api/auth'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; import { dialog } from '~/modules/common/dialoger/state'; import { SignInRoute } from '~/routes/auth'; import { useUserStore } from '~/store/user'; @@ -111,10 +109,10 @@ export const SignInForm = ({ )} /> - + )} @@ -136,8 +134,6 @@ export const ResetPasswordRequest = ({ email }: { email: string }) => { }); const handleResetRequestSubmit = () => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - // TODO maybe find a better way dialog.update('send-reset-password', { content: ( @@ -164,10 +160,10 @@ export const ResetPasswordRequest = ({ email }: { email: string }) => { }} required /> - +
, { id: 'send-reset-password', diff --git a/frontend/src/modules/auth/sign-up-form.tsx b/frontend/src/modules/auth/sign-up-form.tsx index 1e9f6f925..64e45386d 100644 --- a/frontend/src/modules/auth/sign-up-form.tsx +++ b/frontend/src/modules/auth/sign-up-form.tsx @@ -5,15 +5,13 @@ import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import type * as z from 'zod'; -import { onlineManager } from '@tanstack/react-query'; import { config } from 'config'; import { ArrowRight, ChevronDown } from 'lucide-react'; import { Suspense, lazy, useEffect } from 'react'; import { signUp as baseSignUp } from '~/api/auth'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; import { dialog } from '~/modules/common/dialoger/state'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form, FormControl, FormField, FormItem, FormMessage } from '~/modules/ui/form'; import { Input } from '~/modules/ui/input'; import type { TokenData } from '.'; @@ -55,8 +53,6 @@ export const SignUpForm = ({ }); const onSubmit = (values: z.infer) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - signUp({ ...values, token: tokenData?.token, @@ -114,10 +110,10 @@ export const SignUpForm = ({ )} /> - + ); diff --git a/frontend/src/modules/common/accept-invite.tsx b/frontend/src/modules/common/accept-invite.tsx index 2668f0748..64452e509 100644 --- a/frontend/src/modules/common/accept-invite.tsx +++ b/frontend/src/modules/common/accept-invite.tsx @@ -1,7 +1,6 @@ import { Link, useNavigate, useParams } from '@tanstack/react-router'; import { useTranslation } from 'react-i18next'; -import { onlineManager } from '@tanstack/react-query'; import type { checkTokenSchema } from 'backend/modules/general/schema'; import { config } from 'config'; import { ArrowRight, Loader2 } from 'lucide-react'; @@ -11,10 +10,9 @@ import type { z } from 'zod'; import type { ApiError } from '~/api'; import { acceptInvite as baseAcceptInvite, checkToken as baseCheckToken } from '~/api/general'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; import AuthPage from '~/modules/auth/auth-page'; import Spinner from '~/modules/common/spinner'; -import { Button, buttonVariants } from '~/modules/ui/button'; +import { SubmitButton, buttonVariants } from '~/modules/ui/button'; import { acceptInviteRoute } from '~/routes/general'; import { cn } from '~/utils/cn'; @@ -46,8 +44,6 @@ const AcceptInvite = () => { }); const onSubmit = () => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - acceptInvite({ token }); }; @@ -66,10 +62,10 @@ const AcceptInvite = () => { {tokenData?.email && !error ? (
- +
) : (
diff --git a/frontend/src/modules/common/blocknote/custom-formatting-toolbar/custom-block-type-change.tsx b/frontend/src/modules/common/blocknote/custom-formatting-toolbar/custom-block-type-change.tsx index 8f807e614..637b5a5c6 100644 --- a/frontend/src/modules/common/blocknote/custom-formatting-toolbar/custom-block-type-change.tsx +++ b/frontend/src/modules/common/blocknote/custom-formatting-toolbar/custom-block-type-change.tsx @@ -78,7 +78,7 @@ export const CellaCustomBlockTypeselect = () => { - + {fullItems.map((el) => ( {el.title} diff --git a/frontend/src/modules/common/blocknote/custom-slash-menu/custom-slash-menu.tsx b/frontend/src/modules/common/blocknote/custom-slash-menu/custom-slash-menu.tsx index a6537f429..f5a081d9a 100644 --- a/frontend/src/modules/common/blocknote/custom-slash-menu/custom-slash-menu.tsx +++ b/frontend/src/modules/common/blocknote/custom-slash-menu/custom-slash-menu.tsx @@ -97,7 +97,7 @@ export const slashMenu = ( }, []); return ( -
+
{sortedItems.map((item, index) => { const isSelected = selectedIndex === index; return ( diff --git a/frontend/src/modules/common/blocknote/index.tsx b/frontend/src/modules/common/blocknote/index.tsx index 3f556cd87..2c0e5ca61 100644 --- a/frontend/src/modules/common/blocknote/index.tsx +++ b/frontend/src/modules/common/blocknote/index.tsx @@ -270,23 +270,15 @@ export const BlockNote = ({ {sideMenu && } - -
- -
-
+ {members?.length && } {emojiPicker && ( - -
- -
-
+ )} {filePanel && } diff --git a/frontend/src/modules/common/blocknote/styles.css b/frontend/src/modules/common/blocknote/styles.css index fc0bd7cd1..5fd125e7b 100644 --- a/frontend/src/modules/common/blocknote/styles.css +++ b/frontend/src/modules/common/blocknote/styles.css @@ -25,12 +25,24 @@ p.bn-inline-content code { visibility: visible; } +.bn-grid-suggestion-menu-item[aria-selected="true"], +.bn-grid-suggestion-menu-item:hover { + background-color: hsl(var(--accent)) !important; +} + +.bn-grid-suggestion-menu-empty-item, +.bn-grid-suggestion-menu-loader { + padding: 0.5rem; +} + .bn-grid-suggestion-menu { - background-color: hsl(var(--popover)); - border: 1px solid hsl(var(--border)); - z-index: 9999 !important; - max-height: 40vh !important; - overflow-y: auto; + max-height: 25rem !important; + background-color: hsl(var(--popover)) !important; + border: 1px solid hsl(var(--border)) !important; + border-radius: 8px !important; + box-shadow: 0 1px 4px 0 rgb(0 0 0 / 0.1) !important; + gap: 0.75rem !important; + padding: 1rem !important; } .bn-shadcn .bn-block-outer, @@ -107,7 +119,6 @@ p.bn-inline-content code { .slash-menu { max-height: 40vh; overflow-y: auto; - z-index: 9999 !important; background-color: hsl(var(--popover)); border: 1px solid hsl(var(--border)); border-radius: 8px; @@ -154,6 +165,15 @@ p.bn-inline-content code { background-color: hsl(var(--accent)); } +.summary { + padding: 8px; + border-radius: 4px; + font-weight: bold; + border-left: 3px solid hsl(var(--primary)); + background-color: hsl(var(--secondary)); + margin: 8px 0; +} + .notify { display: flex; justify-content: center; diff --git a/frontend/src/modules/common/contact-form/contact-form.tsx b/frontend/src/modules/common/contact-form/contact-form.tsx index 2fe217e7f..f0a2caf87 100644 --- a/frontend/src/modules/common/contact-form/contact-form.tsx +++ b/frontend/src/modules/common/contact-form/contact-form.tsx @@ -5,7 +5,6 @@ import type { SubmitHandler } from 'react-hook-form'; import * as z from 'zod'; import { isDialog as checkDialog, dialog } from '~/modules/common/dialoger/state'; -import { onlineManager } from '@tanstack/react-query'; import { Suspense, lazy, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { createRequest as baseCreateRequest } from '~/api/requests'; @@ -15,7 +14,7 @@ import { useMutation } from '~/hooks/use-mutations'; import { showToast } from '~/lib/toasts'; import InputFormField from '~/modules/common/form-fields/input'; import UnsavedBadge from '~/modules/common/unsaved-badge'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form } from '~/modules/ui/form'; import { useUserStore } from '~/store/user'; @@ -58,8 +57,6 @@ const ContactForm = ({ dialog: isDialog }: { dialog?: boolean }) => { }); const onSubmit: SubmitHandler = async (data) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - const { email, message } = data; createRequest({ email, type: 'contact', message }); }; @@ -88,10 +85,10 @@ const ContactForm = ({ dialog: isDialog }: { dialog?: boolean }) => { } required /> } />
- + diff --git a/frontend/src/modules/common/country-flag.tsx b/frontend/src/modules/common/country-flag.tsx index bcda702e9..f945ad1ba 100644 --- a/frontend/src/modules/common/country-flag.tsx +++ b/frontend/src/modules/common/country-flag.tsx @@ -1,3 +1,4 @@ +import { onlineManager } from '@tanstack/react-query'; import type React from 'react'; import { cn } from '~/utils/cn'; @@ -13,6 +14,7 @@ export const CountryFlag = ({ countryCode, className, imgType = 'svg', width = 1 const flagUrl = imgType === 'svg' ? `/static/flags/${countryCode.toLowerCase()}.svg` : `/static/flags/png/${countryCode.toLowerCase()}.png`; + if (!onlineManager.isOnline()) return null; return ( void; @@ -12,9 +12,9 @@ export const DeleteForm = ({ onDelete, onCancel, pending }: DeleteFormProps) => return (
- + diff --git a/frontend/src/modules/common/main-search.tsx b/frontend/src/modules/common/main-search.tsx index 6656495fe..67d03f59e 100644 --- a/frontend/src/modules/common/main-search.tsx +++ b/frontend/src/modules/common/main-search.tsx @@ -115,14 +115,12 @@ export const MainSearch = () => { {suggestions.total === 0 && ( <> - {!!searchValue.length && ( + {!!searchValue.length && !isFetching && ( )} diff --git a/frontend/src/modules/common/wait-list-form.tsx b/frontend/src/modules/common/wait-list-form.tsx index b3be70f6e..f3cc54912 100644 --- a/frontend/src/modules/common/wait-list-form.tsx +++ b/frontend/src/modules/common/wait-list-form.tsx @@ -13,7 +13,7 @@ import { useMutation } from '~/hooks/use-mutations'; import { showToast } from '~/lib/toasts'; import { LegalNotice } from '~/modules/auth/sign-up-form'; import { dialog } from '~/modules/common/dialoger/state'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form, FormControl, FormField, FormItem, FormMessage } from '~/modules/ui/form'; import { Input } from '~/modules/ui/input'; @@ -107,7 +107,7 @@ export const WaitListForm = ({ )} /> - + ); diff --git a/frontend/src/modules/marketing/newsletter.tsx b/frontend/src/modules/marketing/newsletter.tsx index ab7cb6a2e..7fb0dd6e5 100644 --- a/frontend/src/modules/marketing/newsletter.tsx +++ b/frontend/src/modules/marketing/newsletter.tsx @@ -1,4 +1,3 @@ -import { onlineManager } from '@tanstack/react-query'; import { config } from 'config'; import { Send } from 'lucide-react'; import { useRef } from 'react'; @@ -7,8 +6,7 @@ import { useTranslation } from 'react-i18next'; import { toast } from 'sonner'; import { createRequest as baseCreateRequest } from '~/api/requests'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; -import { Button } from '~/modules/ui/button'; +import { SubmitButton } from '~/modules/ui/button'; const NewsletterForm = () => { const { t } = useTranslation(); @@ -25,8 +23,6 @@ const NewsletterForm = () => { const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - let email = formRef.current?.email.value; if (!email) return; email = email.trim().toLowerCase(); @@ -47,9 +43,9 @@ const NewsletterForm = () => { className="block w-full rounded-2xl border border-gray-300/40 bg-transparent py-4 pl-6 pr-20 text-base/6 text-gray-200 ring-4 ring-primary/10 transition placeholder:text-gray-300/50 focus:border-gray-300 focus:outline-none focus:ring-primary/20" />
- +
diff --git a/frontend/src/modules/organizations/attachments-table/index.tsx b/frontend/src/modules/organizations/attachments-table/index.tsx index 9cb71ff3f..bb5d7f972 100644 --- a/frontend/src/modules/organizations/attachments-table/index.tsx +++ b/frontend/src/modules/organizations/attachments-table/index.tsx @@ -4,7 +4,7 @@ import { Suspense, useCallback, useMemo, useState } from 'react'; import { config } from 'config'; import { motion } from 'framer-motion'; -import { Trash, Upload, XSquare } from 'lucide-react'; +import { Paperclip, Trash, Upload, XSquare } from 'lucide-react'; import { nanoid } from 'nanoid'; import type { RowsChangeData, SortColumn } from 'react-data-grid'; import { useTranslation } from 'react-i18next'; @@ -16,6 +16,7 @@ import { useMutateQueryData } from '~/hooks/use-mutate-query-data'; import useSaveInSearchParams from '~/hooks/use-save-in-search-params'; import { showToast } from '~/lib/toasts'; import { openCarouselDialog } from '~/modules/common/carousel/carousel-dialog'; +import ContentPlaceholder from '~/modules/common/content-placeholder'; import { DataTable } from '~/modules/common/data-table'; import type { ColumnOrColumnGroup } from '~/modules/common/data-table/columns-view'; import ColumnsView from '~/modules/common/data-table/columns-view'; @@ -261,7 +262,9 @@ const AttachmentsTable = ({ organization, isSheet = false }: AttachmentsTablePro ) )} - {selected.length === 0 && } + {!queryResult.isLoading && selected.length === 0 && ( + + )}
@@ -296,6 +299,9 @@ const AttachmentsTable = ({ organization, isSheet = false }: AttachmentsTablePro onSelectedRowsChange: setSelectedRows, sortColumns, onSortColumnsChange: setSortColumns, + NoRowsComponent: ( + + ), }} />
diff --git a/frontend/src/modules/organizations/attachments-table/remove-attachments-form.tsx b/frontend/src/modules/organizations/attachments-table/remove-attachments-form.tsx index 6eda1a483..ddd67665a 100644 --- a/frontend/src/modules/organizations/attachments-table/remove-attachments-form.tsx +++ b/frontend/src/modules/organizations/attachments-table/remove-attachments-form.tsx @@ -1,6 +1,3 @@ -import { onlineManager } from '@tanstack/react-query'; -import { useTranslation } from 'react-i18next'; -import { showToast } from '~/lib/toasts'; import { DeleteForm } from '~/modules/common/delete-form'; import { dialog } from '~/modules/common/dialoger/state'; import { useAttachmentDeleteMutation } from '~/modules/common/query-client-provider/attachments'; @@ -14,13 +11,9 @@ interface Props { } const RemoveAttachmentsForm = ({ attachments, organizationId, callback, dialog: isDialog }: Props) => { - const { t } = useTranslation(); - const { mutate: deleteAttachments, isPending } = useAttachmentDeleteMutation(); const onRemove = () => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - deleteAttachments({ orgIdOrSlug: organizationId, ids: attachments.map((a) => a.id), diff --git a/frontend/src/modules/organizations/create-organization-form.tsx b/frontend/src/modules/organizations/create-organization-form.tsx index 84baac456..676565921 100644 --- a/frontend/src/modules/organizations/create-organization-form.tsx +++ b/frontend/src/modules/organizations/create-organization-form.tsx @@ -8,20 +8,18 @@ import type { z } from 'zod'; import { createOrganizationBodySchema } from 'backend/modules/organizations/schema'; import { createOrganization } from '~/api/organizations'; -import { onlineManager } from '@tanstack/react-query'; import { useNavigate } from '@tanstack/react-router'; import { useEffect, useMemo } from 'react'; import { toast } from 'sonner'; import { useFormWithDraft } from '~/hooks/use-draft-form'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; import { isDialog as checkDialog, dialog } from '~/modules/common/dialoger/state'; import InputFormField from '~/modules/common/form-fields/input'; import { SlugFormField } from '~/modules/common/form-fields/slug'; import { addMenuItem } from '~/modules/common/nav-sheet/helpers/menu-operations'; import { useStepper } from '~/modules/common/stepper/use-stepper'; import UnsavedBadge from '~/modules/common/unsaved-badge'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form, type LabelDirectionType } from '~/modules/ui/form'; import type { Organization } from '~/types/common'; @@ -94,8 +92,6 @@ const CreateOrganizationForm: React.FC = ({ callbac }, [form.unsavedChanges]); const onSubmit = (values: FormValues) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - create(values); }; @@ -113,9 +109,9 @@ const CreateOrganizationForm: React.FC = ({ callbac
{children} - + {!children && ( ) )} - {selectedMembers.length === 0 && } + {!queryResult.isLoading && selectedMembers.length === 0 && ( + + )}
diff --git a/frontend/src/modules/organizations/members-table/remove-member-form.tsx b/frontend/src/modules/organizations/members-table/remove-member-form.tsx index 38765bd9f..21ceddc32 100644 --- a/frontend/src/modules/organizations/members-table/remove-member-form.tsx +++ b/frontend/src/modules/organizations/members-table/remove-member-form.tsx @@ -1,7 +1,4 @@ -import { onlineManager } from '@tanstack/react-query'; -import { useTranslation } from 'react-i18next'; import { queryClient } from '~/lib/router'; -import { showToast } from '~/lib/toasts'; import { DeleteForm } from '~/modules/common/delete-form'; import { dialog } from '~/modules/common/dialoger/state'; import { useMembersDeleteMutation } from '~/modules/common/query-client-provider/members'; @@ -18,13 +15,9 @@ interface Props { } const RemoveMembersForm = ({ members, entityIdOrSlug, entityType = 'organization', organizationId, callback, dialog: isDialog }: Props) => { - const { t } = useTranslation(); - const { mutate: removeMembers, isPending } = useMembersDeleteMutation(); const onRemoveMember = () => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - removeMembers( { orgIdOrSlug: organizationId, diff --git a/frontend/src/modules/organizations/organization-page.tsx b/frontend/src/modules/organizations/organization-page.tsx index 7d356fb73..d4c71e978 100644 --- a/frontend/src/modules/organizations/organization-page.tsx +++ b/frontend/src/modules/organizations/organization-page.tsx @@ -21,7 +21,7 @@ const organizationTabs: PageNavTab[] = [ export const organizationQueryOptions = (idOrSlug: string) => queryOptions({ - queryKey: ['organizations', idOrSlug], + queryKey: ['organization', idOrSlug], queryFn: () => getOrganization(idOrSlug), }); diff --git a/frontend/src/modules/organizations/organizations-table/index.tsx b/frontend/src/modules/organizations/organizations-table/index.tsx index 5bf54e91b..d74f867e9 100644 --- a/frontend/src/modules/organizations/organizations-table/index.tsx +++ b/frontend/src/modules/organizations/organizations-table/index.tsx @@ -70,7 +70,7 @@ const OrganizationsTable = () => { // Map (updated) query data to rows useMapQueryDataToRows({ queryResult, setSelectedRows, setRows, selectedRows, setTotalCount }); - const mutateQuery = useMutateQueryData(['organizations', 'list'], (item) => ['organizations', item.id], ['update', 'delete']); + const mutateQuery = useMutateQueryData(['organizations', 'list']); // Build columns const [columns, setColumns] = useColumns(mutateQuery.update); @@ -208,7 +208,7 @@ const OrganizationsTable = () => { ) )} - {selectedOrganizations.length === 0 && ( + {!queryResult.isLoading && selectedOrganizations.length === 0 && ( )} diff --git a/frontend/src/modules/organizations/organizations-table/update-row.tsx b/frontend/src/modules/organizations/organizations-table/update-row.tsx index 6df8fd22a..b8c83d28b 100644 --- a/frontend/src/modules/organizations/organizations-table/update-row.tsx +++ b/frontend/src/modules/organizations/organizations-table/update-row.tsx @@ -31,6 +31,7 @@ const UpdateRow = ({ organization, callback, tabIndex }: Props) => { side: 'right', className: 'max-w-full lg:max-w-4xl', title: t('common:edit_resource', { resource: t('common:organization').toLowerCase() }), + scrollableOverlay: true, }, ); }; diff --git a/frontend/src/modules/organizations/update-organization-form.tsx b/frontend/src/modules/organizations/update-organization-form.tsx index 2d2f47878..b5e6ba0d6 100644 --- a/frontend/src/modules/organizations/update-organization-form.tsx +++ b/frontend/src/modules/organizations/update-organization-form.tsx @@ -1,5 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod'; -import { type DefaultError, onlineManager, useMutation } from '@tanstack/react-query'; +import { type DefaultError, useMutation } from '@tanstack/react-query'; import { updateOrganizationBodySchema } from 'backend/modules/organizations/schema'; import { useTranslation } from 'react-i18next'; import type { z } from 'zod'; @@ -22,7 +22,7 @@ import SelectTimezone from '~/modules/common/form-fields/select-timezone'; import { SlugFormField } from '~/modules/common/form-fields/slug'; import { sheet } from '~/modules/common/sheeter/state'; import UnsavedBadge from '~/modules/common/unsaved-badge'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '~/modules/ui/form'; import { cleanUrl } from '~/utils/clean-url'; @@ -38,12 +38,12 @@ type FormValues = z.infer; export const useUpdateOrganizationMutation = (idOrSlug: string) => { return useMutation({ - mutationKey: ['organizations', 'update', idOrSlug], + mutationKey: ['organization', 'update', idOrSlug], mutationFn: (params) => updateOrganization(idOrSlug, params), onSuccess: (updatedOrganization) => { - queryClient.setQueryData(['organizations', idOrSlug], updatedOrganization); + queryClient.setQueryData(['organization', idOrSlug], updatedOrganization); queryClient.invalidateQueries({ - queryKey: ['organizations'], + queryKey: ['organization'], }); }, gcTime: 1000 * 10, @@ -77,8 +77,6 @@ const UpdateOrganizationForm = ({ organization, callback, sheet: isSheet }: Prop useBeforeUnload(form.formState.isDirty); const onSubmit = (values: FormValues) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - mutate(values, { onSuccess: (updatedOrganization) => { if (isSheet) sheet.remove('update-organization'); @@ -226,9 +224,9 @@ const UpdateOrganizationForm = ({ organization, callback, sheet: isSheet }: Prop />
- + diff --git a/frontend/src/modules/system/organizations-newsletter-form.tsx b/frontend/src/modules/system/organizations-newsletter-form.tsx index 0542a8c64..83cd3e996 100644 --- a/frontend/src/modules/system/organizations-newsletter-form.tsx +++ b/frontend/src/modules/system/organizations-newsletter-form.tsx @@ -4,7 +4,6 @@ import { useTranslation } from 'react-i18next'; import type { z } from 'zod'; import '@blocknote/shadcn/style.css'; -import { onlineManager } from '@tanstack/react-query'; import { sendNewsletterBodySchema } from 'backend/modules/organizations/schema'; import { Send } from 'lucide-react'; import { Suspense } from 'react'; @@ -12,11 +11,10 @@ import { toast } from 'sonner'; import { sendNewsletter as baseSendNewsletter } from '~/api/organizations'; import { useFormWithDraft } from '~/hooks/use-draft-form'; import { useMutation } from '~/hooks/use-mutations'; -import { showToast } from '~/lib/toasts'; import { BlockNote } from '~/modules/common/blocknote'; import { sheet } from '~/modules/common/sheeter/state'; import UppyFilePanel from '~/modules/common/upload/blocknote-upload-panel'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/modules/ui/form'; import { Input } from '~/modules/ui/input'; @@ -53,8 +51,6 @@ const OrganizationsNewsletterForm: React.FC = ({ organizati }); const onSubmit = (values: FormValues) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - sendNewsletter({ organizationIds: values.organizationIds, subject: values.subject, @@ -128,10 +124,10 @@ const OrganizationsNewsletterForm: React.FC = ({ organizati />
- + diff --git a/frontend/src/modules/system/requests-table/index.tsx b/frontend/src/modules/system/requests-table/index.tsx index 4845dca6f..acb957432 100644 --- a/frontend/src/modules/system/requests-table/index.tsx +++ b/frontend/src/modules/system/requests-table/index.tsx @@ -46,7 +46,7 @@ export const requestsQueryOptions = ({ const offset = rowsLength; return infiniteQueryOptions({ - queryKey: ['requests', q, sort, order], + queryKey: ['requests', 'list', q, sort, order], initialPageParam: 0, retry: 1, refetchOnWindowFocus: false, @@ -150,7 +150,7 @@ const RequestsTable = () => { )} - {selectedRequests.length === 0 && ( + {!queryResult.isLoading && selectedRequests.length === 0 && ( )} diff --git a/frontend/src/modules/ui/button.tsx b/frontend/src/modules/ui/button.tsx index dc4f7c677..f4a462b6c 100644 --- a/frontend/src/modules/ui/button.tsx +++ b/frontend/src/modules/ui/button.tsx @@ -1,9 +1,13 @@ import { Slot } from '@radix-ui/react-slot'; +import { onlineManager } from '@tanstack/react-query'; import { type VariantProps, cva } from 'class-variance-authority'; -import { Loader2 } from 'lucide-react'; +import { t } from 'i18next'; +import { Loader2, TriangleAlert } from 'lucide-react'; import * as React from 'react'; +import { showToast } from '~/lib/toasts'; import { cn } from '~/utils/cn'; +import { TooltipButton } from '../common/tooltip-button'; const buttonVariants = cva( 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none [&:not(.absolute)]:active:translate-y-[.07rem] disabled:opacity-50', @@ -80,4 +84,31 @@ const Button = React.forwardRef( ); Button.displayName = 'Button'; -export { Button, buttonVariants }; +const SubmitButton = React.forwardRef>(({ onClick, children, ...props }, ref) => { + const [isOnline, setIsOnline] = React.useState(onlineManager.isOnline()); + + React.useEffect(() => { + const unsubscribe = onlineManager.subscribe((online) => setIsOnline(online)); + + return () => unsubscribe(); + }, []); + + const handleClick: React.MouseEventHandler = (e) => { + if (!isOnline) { + e.preventDefault(); + return showToast(t('common:action.offline.text'), 'warning'); + } + onClick?.(e); + }; + + const buttonContent = ( + + ); + + return <>{isOnline ? buttonContent : {buttonContent}}; +}); + +export { Button, SubmitButton, buttonVariants }; diff --git a/frontend/src/modules/ui/command.tsx b/frontend/src/modules/ui/command.tsx index 72ad1416e..5d27304e9 100644 --- a/frontend/src/modules/ui/command.tsx +++ b/frontend/src/modules/ui/command.tsx @@ -45,7 +45,7 @@ const CommandInput = React.forwardRef (
{isSearching ? ( - + ) : ( )} diff --git a/frontend/src/modules/users/delete-self.tsx b/frontend/src/modules/users/delete-self.tsx index 3159dd921..61bc71e54 100644 --- a/frontend/src/modules/users/delete-self.tsx +++ b/frontend/src/modules/users/delete-self.tsx @@ -1,12 +1,9 @@ import { deleteSelf as baseDeleteSelf } from '~/api/me'; import type { User } from '~/types/common'; -import { onlineManager } from '@tanstack/react-query'; import { useNavigate } from '@tanstack/react-router'; -import { useTranslation } from 'react-i18next'; import { useMutation } from '~/hooks/use-mutations'; import { queryClient } from '~/lib/router'; -import { showToast } from '~/lib/toasts'; import { DeleteForm } from '~/modules/common/delete-form'; import { dialog } from '~/modules/common/dialoger/state'; import { useAlertStore } from '~/store/alert'; @@ -20,7 +17,6 @@ interface Props { const DeleteSelf = ({ callback, dialog: isDialog }: Props) => { const navigate = useNavigate(); - const { t } = useTranslation(); const { user, clearLastUser } = useUserStore(); const { clearNavigationStore } = useNavigationStore(); const { clearAlertStore } = useAlertStore(); @@ -44,8 +40,6 @@ const DeleteSelf = ({ callback, dialog: isDialog }: Props) => { }); const onDelete = () => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - deleteSelf(); }; diff --git a/frontend/src/modules/users/invite-email-form.tsx b/frontend/src/modules/users/invite-email-form.tsx index 5c4018e0f..038991888 100644 --- a/frontend/src/modules/users/invite-email-form.tsx +++ b/frontend/src/modules/users/invite-email-form.tsx @@ -5,7 +5,6 @@ import { z } from 'zod'; import { type SystemInviteProps, invite as inviteSystem } from '~/api/general'; import { type InviteMemberProps, inviteMembers } from '~/api/memberships'; -import { onlineManager } from '@tanstack/react-query'; import { idOrSlugSchema } from 'backend/utils/schema/common-schemas'; import { config } from 'config'; import { Send } from 'lucide-react'; @@ -18,7 +17,7 @@ import SelectRole from '~/modules/common/form-fields/select-role-radio'; import { MultiEmail } from '~/modules/common/multi-email'; import { useStepper } from '~/modules/common/stepper/use-stepper'; import { Badge } from '~/modules/ui/badge'; -import { Button } from '~/modules/ui/button'; +import { Button, SubmitButton } from '~/modules/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/modules/ui/form'; import type { EntityPage } from '~/types/common'; @@ -78,8 +77,6 @@ const InviteEmailForm = ({ entity, callback, dialog: isDialog, children }: Props }); const onSubmit = (values: FormValues) => { - if (!onlineManager.isOnline()) return showToast(t('common:action.offline.text'), 'warning'); - invite(values); }; @@ -114,13 +111,13 @@ const InviteEmailForm = ({ entity, callback, dialog: isDialog, children }: Props
{children} - + {!children && form.formState.isDirty && ( + {form.formState.isDirty && ( + {!children && ( ) )} - {selectedUsers.length === 0 && } + {!queryResult.isLoading && selectedUsers.length === 0 && ( + + )}
diff --git a/frontend/src/routes/organizations.tsx b/frontend/src/routes/organizations.tsx index abcb81752..c48e7052c 100644 --- a/frontend/src/routes/organizations.tsx +++ b/frontend/src/routes/organizations.tsx @@ -58,7 +58,7 @@ export const OrganizationMembersRoute = createRoute({ }, component: () => { const { idOrSlug } = useParams({ from: OrganizationMembersRoute.id }); - const organization: OrganizationType | undefined = queryClient.getQueryData(['organizations', idOrSlug]); + const organization: OrganizationType | undefined = queryClient.getQueryData(['organization', idOrSlug]); if (!organization) return; return ( @@ -77,7 +77,7 @@ export const OrganizationAttachmentsRoute = createRoute({ loaderDeps: ({ search: { q, sort, order } }) => ({ q, sort, order }), component: () => { const { idOrSlug } = useParams({ from: OrganizationAttachmentsRoute.id }); - const organization: OrganizationType | undefined = queryClient.getQueryData(['organizations', idOrSlug]); + const organization: OrganizationType | undefined = queryClient.getQueryData(['organization', idOrSlug]); if (!organization) return; return ( @@ -94,7 +94,7 @@ export const OrganizationSettingsRoute = createRoute({ getParentRoute: () => OrganizationRoute, component: () => { const { idOrSlug } = useParams({ from: OrganizationSettingsRoute.id }); - const organization: OrganizationType | undefined = queryClient.getQueryData(['organizations', idOrSlug]); + const organization: OrganizationType | undefined = queryClient.getQueryData(['organization', idOrSlug]); if (!organization) return; return ( diff --git a/locales/en/common.json b/locales/en/common.json index 57f10aaf5..a1d02bc06 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -334,7 +334,6 @@ "saved": "Saved!", "schedule_call.text": "Schedule a call", "search": "Search", - "search_in_progress": "Searching for results...", "search_users": "Search & select users", "select": "Select", "select_resource": "Select {{resource}}", diff --git a/locales/nl/common.json b/locales/nl/common.json index 7075e876f..3cb77671d 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -305,7 +305,6 @@ "save": "Opslaan", "saved": "Opgeslagen", "search": "Zoeken", - "search_in_progress": "Searching for results...", "search.text": "Zoek gebruikers, {{resource}}", "select": "Selecteer", "send": "Verzenden", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 71890d108..7cabb1dd5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -143,7 +143,7 @@ importers: version: 9.0.2 jsx-email: specifier: ^2.1.4 - version: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.26.0)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) + version: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.27.2)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) locales: specifier: workspace:* version: link:../locales @@ -307,20 +307,20 @@ importers: specifier: ^1.0.3 version: 1.0.3 '@blocknote/core': - specifier: ^0.19.0 - version: 0.19.0(@types/hast@3.0.4) + specifier: ^0.19.1 + version: 0.19.1(@types/hast@3.0.4) '@blocknote/react': - specifier: ^0.19.0 - version: 0.19.0(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^0.19.1 + version: 0.19.1(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@blocknote/shadcn': - specifier: ^0.19.0 - version: 0.19.0(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) + specifier: ^0.19.1 + version: 0.19.1(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) '@electric-sql/client': - specifier: ^0.7.1 - version: 0.7.1 + specifier: ^0.7.2 + version: 0.7.2 '@floating-ui/react': - specifier: ^0.26.27 - version: 0.26.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^0.26.28 + version: 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@github/mini-throttle': specifier: ^2.1.1 version: 2.1.1 @@ -410,25 +410,25 @@ importers: version: 0.11.1(typescript@5.6.3)(zod@3.23.8) '@tailwindcss/typography': specifier: ^0.5.15 - version: 0.5.15(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))) + version: 0.5.15(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))) '@tanstack/query-sync-storage-persister': - specifier: ^5.59.20 - version: 5.59.20 + specifier: ^5.60.5 + version: 5.60.5 '@tanstack/react-query': - specifier: ^5.60.2 - version: 5.60.2(react@18.3.1) + specifier: ^5.60.5 + version: 5.60.5(react@18.3.1) '@tanstack/react-query-devtools': - specifier: ^5.60.2 - version: 5.60.2(@tanstack/react-query@5.60.2(react@18.3.1))(react@18.3.1) + specifier: ^5.60.5 + version: 5.60.5(@tanstack/react-query@5.60.5(react@18.3.1))(react@18.3.1) '@tanstack/react-query-persist-client': - specifier: ^5.60.2 - version: 5.60.2(@tanstack/react-query@5.60.2(react@18.3.1))(react@18.3.1) + specifier: ^5.60.5 + version: 5.60.5(@tanstack/react-query@5.60.5(react@18.3.1))(react@18.3.1) '@tanstack/react-router': - specifier: ^1.81.5 - version: 1.81.5(@tanstack/router-generator@1.79.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.81.14 + version: 1.81.14(@tanstack/router-generator@1.81.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-devtools': - specifier: ^1.81.5 - version: 1.81.5(@tanstack/react-router@1.81.5(@tanstack/router-generator@1.79.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.81.14 + version: 1.81.14(@tanstack/react-router@1.81.14(@tanstack/router-generator@1.81.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@uppy/audio': specifier: ^2.0.1 version: 2.0.1(@uppy/core@4.2.3) @@ -499,8 +499,8 @@ importers: specifier: ^1.4.6 version: 1.4.6(@swc/core@1.7.26)(@types/react-dom@18.3.1)(@types/react@18.3.12)(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))(typescript@5.6.3) framer-motion: - specifier: ^11.11.16 - version: 11.11.16(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^11.11.17 + version: 11.11.17(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) gleap: specifier: ^14.0.8 version: 14.0.8 @@ -593,7 +593,7 @@ importers: version: 2.5.4 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))) + version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))) use-count-up: specifier: ^3.0.1 version: 3.0.1(react@18.3.1) @@ -629,8 +629,8 @@ importers: specifier: ^2.22.6 version: 2.22.6 '@tanstack/router-plugin': - specifier: ^1.79.0 - version: 1.79.0(vite@5.4.11(@types/node@22.9.0)(terser@5.36.0)) + specifier: ^1.81.9 + version: 1.81.9(vite@5.4.11(@types/node@22.9.0)(terser@5.36.0)) '@types/dompurify': specifier: ^3.0.5 version: 3.0.5 @@ -674,8 +674,8 @@ importers: specifier: ^5.12.0 version: 5.12.0(rollup@2.79.2) tailwindcss: - specifier: ^3.4.14 - version: 3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) + specifier: ^3.4.15 + version: 3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) tsx: specifier: ^4.19.2 version: 4.19.2 @@ -745,6 +745,9 @@ packages: '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@adobe/css-tools@4.4.1': + resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -1525,17 +1528,17 @@ packages: cpu: [x64] os: [win32] - '@blocknote/core@0.19.0': - resolution: {integrity: sha512-GSPTSL3ecMZlpOIHXDXzeLcGHGUYdwAiAUV79BFpl3F8Gx9CP8cjO5bDGml+b5MhmqEEcxZ2cDXqPIO5LxWl1Q==} + '@blocknote/core@0.19.1': + resolution: {integrity: sha512-iscYwOm5F57wA/d+4YK9Cy3k9Gi4d3uW3/QhMOBGzJ9I1OfxzSBQ45gIMLk/3n5chWz/AzeRdG3hizm3zux8iQ==} - '@blocknote/react@0.19.0': - resolution: {integrity: sha512-r/vyMatB7Jm+cvZ+2VnlGeZyD1AKNjTGaxpj/fBmjBGJKLkA5EVhEcDUK2CU/Sb+3olV+sNHWYpgCAuzRZjYGw==} + '@blocknote/react@0.19.1': + resolution: {integrity: sha512-gSG2KNOKdknlRcH/VkDQJbJ9UINy1dQKmiw+r4dI8DBTFEpAbtpVJplIxpSoQM17gMtX9cNWmHxO29lO6dQHSA==} peerDependencies: react: ^18.0 || ^19.0 || >= 19.0.0-rc react-dom: ^18.0 || ^19.0 || >= 19.0.0-rc - '@blocknote/shadcn@0.19.0': - resolution: {integrity: sha512-1p1UVlUua+cF8Ipw6Rpwh2RUKQ4RVpFm3H/FZCEpNYV0ExZMecIdrghinvoTKGKU/1rUZMuAsAP4rOj10PT0jg==} + '@blocknote/shadcn@0.19.1': + resolution: {integrity: sha512-9d79c/e8rMYXP9Yz/O1PewoWLmG5Bwy4j5n3wjBo+urvnBy7A1bcc5NEssMf/owbW3Xay/wmBhF5MOf7H2MrEg==} peerDependencies: react: ^18.0 || ^19.0 || >= 19.0.0-rc react-dom: ^18.0 || ^19.0 || >= 19.0.0-rc @@ -1826,8 +1829,8 @@ packages: '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@electric-sql/client@0.7.1': - resolution: {integrity: sha512-NpKEn5hDSy+NaAdG9Ql8kIGfjrj/XfakJOOHTTutb99db3Dza0uUfnkqycFpyUAarFMQ4hYSKgx8AbOm1PCeFQ==} + '@electric-sql/client@0.7.2': + resolution: {integrity: sha512-5+NGEs7/zQdKQAq9Rtn1Py2RaMVQPGs4+InfO0VAryCOmyhxbLNiSU4ISFLfGT0S72l7LkQbbK+ChFO49b7Erg==} '@electric-sql/pglite@0.2.13': resolution: {integrity: sha512-YRY806NnScVqa21/1L1vaysSQ+0/cAva50z7vlwzaGiBOTS9JhdzIRHN0KfgMhobFAphbznZJ7urMso4RtMBIQ==} @@ -2835,6 +2838,7 @@ packages: '@evilmartians/lefthook@1.8.2': resolution: {integrity: sha512-SZdQk3W9q7tcJwnSwEMUubQqVIK7SHxv52hEAnV7o3nPI+xKcmd+rN0hZIJg07wjBaJRAjzdvoQySKQQYPW5Qw==} + cpu: [x64, arm64, ia32] os: [darwin, linux, win32] hasBin: true @@ -2854,8 +2858,8 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.26.27': - resolution: {integrity: sha512-jLP72x0Kr2CgY6eTYi/ra3VA9LOkTo4C+DUTrbFgFOExKy3omYVmwMjNKqxAHdsnyLS96BIDLcO2SlnsNf8KUQ==} + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -4114,10 +4118,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-icons@1.3.1': - resolution: {integrity: sha512-QvYompk0X+8Yjlo/Fv4McrzxohDdM5GgLHyQcPpcsPvlOSXCGFjdbuyGL5dzRbg0GpknAjQJJZzdiRK7iWVuFQ==} + '@radix-ui/react-icons@1.3.2': + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} peerDependencies: - react: ^16.x || ^17.x || ^18.x || ^19.x + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc '@radix-ui/react-id@1.0.0': resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} @@ -4791,6 +4795,11 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.27.2': + resolution: {integrity: sha512-Tj+j7Pyzd15wAdSJswvs5CJzJNV+qqSUcr/aCD+jpQSBtXvGnV0pnrjoc8zFTe9fcKCatkpFpOO7yAzpO998HA==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.24.0': resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} cpu: [arm64] @@ -4801,6 +4810,11 @@ packages: cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.27.2': + resolution: {integrity: sha512-xsPeJgh2ThBpUqlLgRfiVYBEf/P1nWlWvReG+aBWfNv3XEBpa6ZCmxSVnxJgLgkNz4IbxpLy64h2gCmAAQLneQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.24.0': resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} cpu: [arm64] @@ -4811,6 +4825,11 @@ packages: cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.27.2': + resolution: {integrity: sha512-KnXU4m9MywuZFedL35Z3PuwiTSn/yqRIhrEA9j+7OSkji39NzVkgxuxTYg5F8ryGysq4iFADaU5osSizMXhU2A==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.24.0': resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} cpu: [x64] @@ -4821,16 +4840,31 @@ packages: cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.27.2': + resolution: {integrity: sha512-Hj77A3yTvUeCIx/Vi+4d4IbYhyTwtHj07lVzUgpUq9YpJSEiGJj4vXMKwzJ3w5zp5v3PFvpJNgc/J31smZey6g==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.26.0': resolution: {integrity: sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.27.2': + resolution: {integrity: sha512-RjgKf5C3xbn8gxvCm5VgKZ4nn0pRAIe90J0/fdHUsgztd3+Zesb2lm2+r6uX4prV2eUByuxJNdt647/1KPRq5g==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.26.0': resolution: {integrity: sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.27.2': + resolution: {integrity: sha512-duq21FoXwQtuws+V9H6UZ+eCBc7fxSpMK1GQINKn3fAyd9DFYKPJNcUhdIKOrMFjLEJgQskoMoiuizMt+dl20g==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] @@ -4841,6 +4875,11 @@ packages: cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.27.2': + resolution: {integrity: sha512-6npqOKEPRZkLrMcvyC/32OzJ2srdPzCylJjiTJT2c0bwwSGm7nz2F9mNQ1WrAqCBZROcQn91Fno+khFhVijmFA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] @@ -4851,6 +4890,11 @@ packages: cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.27.2': + resolution: {integrity: sha512-V9Xg6eXtgBtHq2jnuQwM/jr2mwe2EycnopO8cbOvpzFuySCGtKlPCI3Hj9xup/pJK5Q0388qfZZy2DqV2J8ftw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] @@ -4861,6 +4905,11 @@ packages: cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.27.2': + resolution: {integrity: sha512-uCFX9gtZJoQl2xDTpRdseYuNqyKkuMDtH6zSrBTA28yTfKyjN9hQ2B04N5ynR8ILCoSDOrG/Eg+J2TtJ1e/CSA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] @@ -4871,6 +4920,11 @@ packages: cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.27.2': + resolution: {integrity: sha512-/PU9P+7Rkz8JFYDHIi+xzHabOu9qEWR07L5nWLIUsvserrxegZExKCi2jhMZRd0ATdboKylu/K5yAXbp7fYFvA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] @@ -4881,6 +4935,11 @@ packages: cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.27.2': + resolution: {integrity: sha512-eCHmol/dT5odMYi/N0R0HC8V8QE40rEpkyje/ZAXJYNNoSfrObOvG/Mn+s1F/FJyB7co7UQZZf6FuWnN6a7f4g==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] @@ -4891,6 +4950,11 @@ packages: cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.27.2': + resolution: {integrity: sha512-DEP3Njr9/ADDln3kNi76PXonLMSSMiCir0VHXxmGSHxCxDfQ70oWjHcJGfiBugzaqmYdTC7Y+8Int6qbnxPBIQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] @@ -4901,6 +4965,11 @@ packages: cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.27.2': + resolution: {integrity: sha512-NHGo5i6IE/PtEPh5m0yw5OmPMpesFnzMIS/lzvN5vknnC1sXM5Z/id5VgcNPgpD+wHmIcuYYgW+Q53v+9s96lQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] @@ -4911,6 +4980,11 @@ packages: cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.27.2': + resolution: {integrity: sha512-PaW2DY5Tan+IFvNJGHDmUrORadbe/Ceh8tQxi8cmdQVCCYsLoQo2cuaSj+AU+YRX8M4ivS2vJ9UGaxfuNN7gmg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] @@ -4921,6 +4995,11 @@ packages: cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.27.2': + resolution: {integrity: sha512-dOlWEMg2gI91Qx5I/HYqOD6iqlJspxLcS4Zlg3vjk1srE67z5T2Uz91yg/qA8sY0XcwQrFzWWiZhMNERylLrpQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} cpu: [arm64] @@ -4931,6 +5010,11 @@ packages: cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.27.2': + resolution: {integrity: sha512-euMIv/4x5Y2/ImlbGl88mwKNXDsvzbWUlT7DFky76z2keajCtcbAsN9LUdmk31hAoVmJJYSThgdA0EsPeTr1+w==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.24.0': resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} cpu: [ia32] @@ -4941,6 +5025,11 @@ packages: cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.27.2': + resolution: {integrity: sha512-RsnE6LQkUHlkC10RKngtHNLxb7scFykEbEwOFDjr3CeCMG+Rr+cKqlkKc2/wJ1u4u990urRHCbjz31x84PBrSQ==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.24.0': resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} cpu: [x64] @@ -4951,6 +5040,11 @@ packages: cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.27.2': + resolution: {integrity: sha512-foJM5vv+z2KQmn7emYdDLyTbkoO5bkHZE1oth2tWbQNGW7mX32d46Hz6T0MqXdWS2vBZhaEtHqdy9WYwGfiliA==} + cpu: [x64] + os: [win32] + '@rrweb/types@2.0.0-alpha.16': resolution: {integrity: sha512-E6cACNVsm+NUhn7dzocQoKyXI7BHrHRRm5Ab23yrAzEQ2caWocCEYJhqDlc4KRVJBkQfXZfyWm8+2d0uggFuZg==} @@ -5094,15 +5188,27 @@ packages: '@shikijs/core@1.22.2': resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} + '@shikijs/core@1.23.0': + resolution: {integrity: sha512-J4Fo22oBlfRHAXec+1AEzcowv+Qdf4ZQkuP/X/UHYH9+KA9LvyFXSXyS+HxuBRFfon+u7bsmKdRBjoZlbDVRkQ==} + '@shikijs/engine-javascript@1.22.2': resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} + '@shikijs/engine-javascript@1.23.0': + resolution: {integrity: sha512-CcrppseWShG+8Efp1iil9divltuXVdCaU4iu+CKvzTGZO5RmXyAiSx668M7VbX8+s/vt1ZKu75Vn/jWi8O3G/Q==} + '@shikijs/engine-oniguruma@1.22.2': resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} + '@shikijs/engine-oniguruma@1.23.0': + resolution: {integrity: sha512-gS8bZLqVvmZXX+E5JUMJICsBp+kx6gj79MH/UEpKHKIqnUzppgbmEn6zLa6mB5D+sHse2gFei3YYJxQe1EzZXQ==} + '@shikijs/types@1.22.2': resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} + '@shikijs/types@1.23.0': + resolution: {integrity: sha512-HiwzsihRao+IbPk7FER/EQT/D0dEEK3n5LAtHDzL5iRT+JMblA7y9uitUnjEnHeLkKigNM+ZplrP7MuEyyc5kA==} + '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} @@ -5411,44 +5517,44 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' - '@tanstack/history@1.81.3': - resolution: {integrity: sha512-ZNdhkE+Ikv2GPj29m99Bu4qkiH1LeZQkSVjRUbTmNRdvEJmKKrKq1B5p5t1IHlfhoStLu5JIcWeEHHZ88jEfdQ==} + '@tanstack/history@1.81.9': + resolution: {integrity: sha512-9MPknhhnvZKifK4jSvva6NDqYQwsNaptrRzO4ejk6yCLyi4koVG4u3C4VCeClYZY5etLEQbO8wXU9knEFZpMeg==} engines: {node: '>=12'} - '@tanstack/query-core@5.59.20': - resolution: {integrity: sha512-e8vw0lf7KwfGe1if4uPFhvZRWULqHjFcz3K8AebtieXvnMOz5FSzlZe3mTLlPuUBcydCnBRqYs2YJ5ys68wwLg==} + '@tanstack/query-core@5.60.5': + resolution: {integrity: sha512-jiS1aC3XI3BJp83ZiTuDLerTmn9P3U95r6p+6/SNauLJaYxfIC4dMuWygwnBHIZxjn2zJqEpj3nysmPieoxfPQ==} '@tanstack/query-devtools@5.59.20': resolution: {integrity: sha512-vxhuQ+8VV4YWQSFxQLsuM+dnEKRY7VeRzpNabFXdhEwsBYLrjXlF1pM38A8WyKNLqZy8JjyRO8oP4Wd/oKHwuQ==} - '@tanstack/query-persist-client-core@5.59.20': - resolution: {integrity: sha512-RUaDys2zyhCw8MGcp0tirbpp8IjU7zrtdMaEYQ6WetrNvn/IOg9Y2Zpk55P7gjBq8fEyFlmuRM3cHVNn/Usg8w==} + '@tanstack/query-persist-client-core@5.60.5': + resolution: {integrity: sha512-vA5MR5W8jKv9NvdsbXFztBPi+Hs8ZtiVPiLTWk+nfyqmAKXEGZlxZpUo8zTHr7GgmLZCDgx/l+HntlL58Jbl0w==} - '@tanstack/query-sync-storage-persister@5.59.20': - resolution: {integrity: sha512-uM4vxU2jSRE3lPOysi7GWpSJsUz9ZT6mZKX2dONfzIVng/7baW3Q3L/cyTUyLQtvERiuvbbhgCCTa8w8ZOeyaA==} + '@tanstack/query-sync-storage-persister@5.60.5': + resolution: {integrity: sha512-3hL9GuPLYxraF5pntxCThsYfddIQ1Kp0HSwSK88Pob0JmJUFWm7EhAMgvorYH5ZHR+mTIZfu3E3S01w5PCve2Q==} - '@tanstack/react-query-devtools@5.60.2': - resolution: {integrity: sha512-h+4/KwgUuAu4fcfrlSnD9K4gxR9Glbi3SbQUWBl2iF9Nt94aVcmCwAACGHWqqKhDPz1KOiRe9bIq2KZ4UsZMEA==} + '@tanstack/react-query-devtools@5.60.5': + resolution: {integrity: sha512-lzANl0ih3CNKBGUoXhhkAAHI1Y4Yqs9Jf3iuTUsGiPpmF0RWXTeYFaQxc+h1PhJz3VwYrIYCwmPoNts0mSjSuA==} peerDependencies: - '@tanstack/react-query': ^5.60.2 + '@tanstack/react-query': ^5.60.5 react: ^18 || ^19 - '@tanstack/react-query-persist-client@5.60.2': - resolution: {integrity: sha512-gCvgPL7p2lM2ynq8PhFNyfN5rYCSGDkNzsbl03noylcS+WkGDYOLNMI4LYQfalewfaJMitKa2y2IMP1aCrgmmg==} + '@tanstack/react-query-persist-client@5.60.5': + resolution: {integrity: sha512-O+lfL/TVNHQIPIZjQf5LL39ATKgmXXg/uX+MesYUL/v+/R2JiWXysn9LRPNTAQ3EieO91GeH/BTvnvGqnAFMmg==} peerDependencies: - '@tanstack/react-query': ^5.60.2 + '@tanstack/react-query': ^5.60.5 react: ^18 || ^19 - '@tanstack/react-query@5.60.2': - resolution: {integrity: sha512-JhpJNxIAPuE0YCpP1Py4zAsgx+zY0V531McRMtQbwVlJF8+mlZwcOPrzGmPV248K8IP+mPbsfxXToVNMNwjUcw==} + '@tanstack/react-query@5.60.5': + resolution: {integrity: sha512-M77bOsPwj1wYE56gk7iJvxGAr4IC12NWdIDhT+Eo8ldkWRHMvIR8I/rufIvT1OXoV/bl7EECwuRuMlxxWtvW2Q==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router@1.81.5': - resolution: {integrity: sha512-7DHFOcbLvvH9ZpWeZ7hWOEUjfzKKEpejLcHFrOoimOnsbiDIVGU8+X4eJqjIppvoRSHLSHpRCrt4u8f1feDc9Q==} + '@tanstack/react-router@1.81.14': + resolution: {integrity: sha512-+pzpblWgIUGXlyYlUAfGTZv7YfNOEMKupB5cP4CY9K/qu94D1qrUipjZ6PAqwj8yAwUDcBGam/AyzOLLTSNY5w==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-generator': 1.79.0 + '@tanstack/router-generator': 1.81.9 react: '>=18' react-dom: '>=18' peerDependenciesMeta: @@ -5461,20 +5567,20 @@ packages: react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - '@tanstack/router-devtools@1.81.5': - resolution: {integrity: sha512-/yGjvk9DBDuCNgj4iMCxm55fb9x4ecFmL65zKmwws2Iu4F0J4dcYTHIWhmC/YzoUYvx3wBSw/4UIhQXtidmwSQ==} + '@tanstack/router-devtools@1.81.14': + resolution: {integrity: sha512-nigYdVDLWC22tff4Z1gBT26R/RBpW/nhBR4Vgs/0kBLqcj+/DFjZK5Q1MS/xSUUTOR4AW4J9av5zpHNqGFgEYQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.81.5 + '@tanstack/react-router': ^1.81.14 react: '>=18' react-dom: '>=18' - '@tanstack/router-generator@1.79.0': - resolution: {integrity: sha512-HJxmYs7GAA1AJQzyfy4Hiygmg93qCCDiAxQ//zCRMbzVntwpqtZ96o9UGOPjT3Lw0SxbyzbKgpo3zqCdwlv8Ew==} + '@tanstack/router-generator@1.81.9': + resolution: {integrity: sha512-HiInbc11+E65tg5xlgg0z/hqQJkQBUpr4RCEQeEoortlgQ38Yi+PSuoc2IO+n03XPGSqPMhCS6Q1MiMgfRfwZw==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.79.0': - resolution: {integrity: sha512-dY81YyKxON9KhZQlrkkuxsl688pGpZ4HAF5w40ZkJa+nwmEJdg0b2td+MPXWbtmSd1t1cbYlFvc68k+PUSHN/A==} + '@tanstack/router-plugin@1.81.9': + resolution: {integrity: sha512-u12ibRFI/RpWzUmuFEy8HeyjRObkH8NqzOqEGt8xNa/mSQK3sFQLvfXf+lEFwIqg+C5lnrZtl2RvdmoQpRLwHw==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' @@ -5491,8 +5597,8 @@ packages: '@tanstack/store@0.5.5': resolution: {integrity: sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==} - '@tanstack/virtual-file-routes@1.64.0': - resolution: {integrity: sha512-soW+gE9QTmMaqXM17r7y1p8NiQVIIECjdTaYla8BKL5Flj030m3KuxEQoiG1XgjtA0O7ayznFz2YvPcXIy3qDg==} + '@tanstack/virtual-file-routes@1.81.9': + resolution: {integrity: sha512-jV5mWJrsh3QXHpb/by6udSqwva0qK50uYHpIXvKsLaxnlbjbLfflfPjFyRWXbMtZsnzCjSUqp5pm5/p+Wpaerg==} engines: {node: '>=12'} '@tiptap/core@2.9.1': @@ -6984,8 +7090,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.58: - resolution: {integrity: sha512-al2l4r+24ZFL7WzyPTlyD0fC33LLzvxqLCwurtBibVPghRGO9hSTl+tis8t1kD7biPiH/en4U0I7o/nQbYeoVA==} + electron-to-chromium@1.5.62: + resolution: {integrity: sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -7017,6 +7123,9 @@ packages: emoji-mart@5.6.0: resolution: {integrity: sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -7043,8 +7152,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-abstract@1.23.4: - resolution: {integrity: sha512-HR1gxH5OaiN7XH7uiWH0RLw0RcFySiSoW1ctxmD1ahTw3uGBtkmm/ng0tDU1OtYx5OK6EOL5Y6O21cDflG3Jcg==} + es-abstract@1.23.5: + resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} engines: {node: '>= 0.4'} es-define-property@1.0.0: @@ -7280,8 +7389,8 @@ packages: react-dom: optional: true - framer-motion@11.11.16: - resolution: {integrity: sha512-PAK9NkCdRuwNTkKh9chSHokvEkwLJ/JyePNG/Fgmk4ygeQmth8wneITlxQAykOeYWgRvetk1i22PcMiG/VRuWg==} + framer-motion@11.11.17: + resolution: {integrity: sha512-O8QzvoKiuzI5HSAHbcYuL6xU+ZLXbrH7C8Akaato4JzQbX2ULNeniqC2Vo5eiCtFktX9XsJ+7nUhxcl2E2IjpA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 @@ -8765,6 +8874,9 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + oniguruma-to-es@0.1.2: + resolution: {integrity: sha512-sBYKVJlIMB0WPO+tSu/NNB1ytSFeHyyJZ3Ayxfx3f/QUuXu0lvZk0VB4K7npmdlHSC0ldqanzh/sUSlAbgCTfw==} + oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} @@ -8812,8 +8924,8 @@ packages: resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} engines: {node: '>=18'} - p-retry@6.2.0: - resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} p-timeout@6.1.3: @@ -9744,6 +9856,12 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regex-recursion@4.2.1: + resolution: {integrity: sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + regex@4.4.0: resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} @@ -9950,6 +10068,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.27.2: + resolution: {integrity: sha512-KreA+PzWmk2yaFmZVwe6GB2uBD86nXl86OsDkt1bJS9p3vqWuEQ6HnJJ+j/mZi/q0920P99/MVRlB4L3crpF5w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} @@ -10067,6 +10190,9 @@ packages: shiki@1.22.2: resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + shiki@1.23.0: + resolution: {integrity: sha512-xfdu9DqPkIpExH29cmiTlgo0/jBki5la1Tkfhsv+Wu5TT3APLNHslR1acxuKJOCWqVdSc+pIbs/2ozjVRGppdg==} + shikiji@0.8.7: resolution: {integrity: sha512-j5usxwI0yHkDTHOuhuSJl9+wT5CNYeYO82dJMSJBlJ/NYT5SIebGcPoL6y9QOyH15wGrJC4LOP2nz5k8mUDGRQ==} deprecated: Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates @@ -10287,8 +10413,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@3.4.14: - resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} + tailwindcss@3.4.15: + resolution: {integrity: sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==} engines: {node: '>=14.0.0'} hasBin: true @@ -11223,6 +11349,8 @@ snapshots: '@adobe/css-tools@4.4.0': {} + '@adobe/css-tools@4.4.1': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -12496,7 +12624,7 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@blocknote/core@0.19.0(@types/hast@3.0.4)': + '@blocknote/core@0.19.1(@types/hast@3.0.4)': dependencies: '@emoji-mart/data': 1.2.1 '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) @@ -12521,7 +12649,7 @@ snapshots: emoji-mart: 5.6.0 hast-util-from-dom: 4.2.0 prosemirror-dropcursor: 1.8.1 - prosemirror-highlight: 0.9.0(@types/hast@3.0.4)(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-transform@1.10.2)(prosemirror-view@1.36.0)(shiki@1.22.2) + prosemirror-highlight: 0.9.0(@types/hast@3.0.4)(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-transform@1.10.2)(prosemirror-view@1.36.0)(shiki@1.23.0) prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 prosemirror-tables: 1.6.1 @@ -12535,7 +12663,7 @@ snapshots: remark-parse: 10.0.2 remark-rehype: 10.1.0 remark-stringify: 10.0.3 - shiki: 1.22.2 + shiki: 1.23.0 unified: 10.1.2 uuid: 8.3.2 y-prosemirror: 1.2.12(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-view@1.36.0)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20) @@ -12549,10 +12677,10 @@ snapshots: - sugar-high - supports-color - '@blocknote/react@0.19.0(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@blocknote/react@0.19.1(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@blocknote/core': 0.19.0(@types/hast@3.0.4) - '@floating-ui/react': 0.26.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@blocknote/core': 0.19.1(@types/hast@3.0.4) + '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) '@tiptap/react': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lodash.merge: 4.6.2 @@ -12568,10 +12696,10 @@ snapshots: - sugar-high - supports-color - '@blocknote/shadcn@0.19.0(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))': + '@blocknote/shadcn@0.19.1(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))': dependencies: - '@blocknote/core': 0.19.0(@types/hast@3.0.4) - '@blocknote/react': 0.19.0(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@blocknote/core': 0.19.1(@types/hast@3.0.4) + '@blocknote/react': 0.19.1(@tiptap/pm@2.9.1)(@types/hast@3.0.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@hookform/resolvers': 3.9.1(react-hook-form@7.53.2(react@18.3.1)) '@radix-ui/react-dropdown-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -12590,8 +12718,8 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-hook-form: 7.53.2(react@18.3.1) tailwind-merge: 2.5.4 - tailwindcss: 3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) - tailwindcss-animate: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))) + tailwindcss: 3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) + tailwindcss-animate: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))) zod: 3.23.8 transitivePeerDependencies: - '@tiptap/pm' @@ -12903,9 +13031,9 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@electric-sql/client@0.7.1': + '@electric-sql/client@0.7.2': optionalDependencies: - '@rollup/rollup-darwin-arm64': 4.26.0 + '@rollup/rollup-darwin-arm64': 4.27.2 '@electric-sql/pglite@0.2.13': {} @@ -13461,7 +13589,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@floating-ui/react@0.26.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@floating-ui/utils': 0.2.8 @@ -13645,11 +13773,11 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.26.0)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))': + '@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.27.2)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))': dependencies: '@radix-ui/colors': 3.0.0 '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) - '@radix-ui/react-icons': 1.3.1(react@18.3.1) + '@radix-ui/react-icons': 1.3.2(react@18.3.1) '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) '@radix-ui/react-select': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.0.2(@types/react@18.3.12)(react@18.3.1) @@ -13665,7 +13793,7 @@ snapshots: tailwindcss: 3.4.0(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) titleize: 4.0.0 vite: 4.5.5(@types/node@22.9.0)(terser@5.36.0) - vite-plugin-node-polyfills: 0.16.0(rollup@4.26.0)(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0)) + vite-plugin-node-polyfills: 0.16.0(rollup@4.27.2)(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0)) transitivePeerDependencies: - '@types/node' - '@types/react' @@ -13692,16 +13820,16 @@ snapshots: '@jsx-email/plugin-inline@1.0.1(jsx-email@2.1.4)': dependencies: - '@adobe/css-tools': 4.4.0 + '@adobe/css-tools': 4.4.1 hast-util-select: 6.0.3 hast-util-to-string: 3.0.1 - jsx-email: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.26.0)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) + jsx-email: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.27.2)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 '@jsx-email/plugin-minify@1.0.1(jsx-email@2.1.4)': dependencies: - jsx-email: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.26.0)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) + jsx-email: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.27.2)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) rehype-minify-attribute-whitespace: 4.0.1 rehype-minify-css-style: 4.0.1 rehype-minify-enumerated-attribute: 5.0.1 @@ -13723,7 +13851,7 @@ snapshots: '@jsx-email/plugin-pretty@1.0.0(jsx-email@2.1.4)': dependencies: - jsx-email: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.26.0)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) + jsx-email: 2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.27.2)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0) pretty: 2.0.0 '@libsql/client-wasm@0.14.0': @@ -14917,7 +15045,7 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-icons@1.3.1(react@18.3.1)': + '@radix-ui/react-icons@1.3.2(react@18.3.1)': dependencies: react: 18.3.1 @@ -15679,13 +15807,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/plugin-inject@5.0.5(rollup@4.26.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.27.2)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.26.0) + '@rollup/pluginutils': 5.1.3(rollup@4.27.2) estree-walker: 2.0.2 magic-string: 0.30.12 optionalDependencies: - rollup: 4.26.0 + rollup: 4.27.2 '@rollup/plugin-node-resolve@15.3.0(rollup@2.79.2)': dependencies: @@ -15731,13 +15859,13 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/pluginutils@5.1.3(rollup@4.26.0)': + '@rollup/pluginutils@5.1.3(rollup@4.27.2)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.26.0 + rollup: 4.27.2 '@rollup/rollup-android-arm-eabi@4.24.0': optional: true @@ -15745,102 +15873,156 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.26.0': optional: true + '@rollup/rollup-android-arm-eabi@4.27.2': + optional: true + '@rollup/rollup-android-arm64@4.24.0': optional: true '@rollup/rollup-android-arm64@4.26.0': optional: true + '@rollup/rollup-android-arm64@4.27.2': + optional: true + '@rollup/rollup-darwin-arm64@4.24.0': optional: true '@rollup/rollup-darwin-arm64@4.26.0': optional: true + '@rollup/rollup-darwin-arm64@4.27.2': + optional: true + '@rollup/rollup-darwin-x64@4.24.0': optional: true '@rollup/rollup-darwin-x64@4.26.0': optional: true + '@rollup/rollup-darwin-x64@4.27.2': + optional: true + '@rollup/rollup-freebsd-arm64@4.26.0': optional: true + '@rollup/rollup-freebsd-arm64@4.27.2': + optional: true + '@rollup/rollup-freebsd-x64@4.26.0': optional: true + '@rollup/rollup-freebsd-x64@4.27.2': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.26.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.27.2': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.24.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.26.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.27.2': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.24.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.26.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.27.2': + optional: true + '@rollup/rollup-linux-arm64-musl@4.24.0': optional: true '@rollup/rollup-linux-arm64-musl@4.26.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.27.2': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.26.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.27.2': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.24.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.26.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.27.2': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.24.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.26.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.27.2': + optional: true + '@rollup/rollup-linux-x64-gnu@4.24.0': optional: true '@rollup/rollup-linux-x64-gnu@4.26.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.27.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.24.0': optional: true '@rollup/rollup-linux-x64-musl@4.26.0': optional: true + '@rollup/rollup-linux-x64-musl@4.27.2': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.24.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.26.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.27.2': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.24.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.26.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.27.2': + optional: true + '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true '@rollup/rollup-win32-x64-msvc@4.26.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.27.2': + optional: true + '@rrweb/types@2.0.0-alpha.16': dependencies: rrweb-snapshot: 2.0.0-alpha.17 @@ -16020,22 +16202,47 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 + '@shikijs/core@1.23.0': + dependencies: + '@shikijs/engine-javascript': 1.23.0 + '@shikijs/engine-oniguruma': 1.23.0 + '@shikijs/types': 1.23.0 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + '@shikijs/engine-javascript@1.22.2': dependencies: '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 oniguruma-to-js: 0.4.3 + '@shikijs/engine-javascript@1.23.0': + dependencies: + '@shikijs/types': 1.23.0 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-es: 0.1.2 + '@shikijs/engine-oniguruma@1.22.2': dependencies: '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-oniguruma@1.23.0': + dependencies: + '@shikijs/types': 1.23.0 + '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types@1.22.2': dependencies: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 + '@shikijs/types@1.23.0': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + '@shikijs/vscode-textmate@9.3.0': {} '@shopify/semaphore@3.1.0': {} @@ -16455,49 +16662,49 @@ snapshots: optionalDependencies: typescript: 5.6.3 - '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))': + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) + tailwindcss: 3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) - '@tanstack/history@1.81.3': {} + '@tanstack/history@1.81.9': {} - '@tanstack/query-core@5.59.20': {} + '@tanstack/query-core@5.60.5': {} '@tanstack/query-devtools@5.59.20': {} - '@tanstack/query-persist-client-core@5.59.20': + '@tanstack/query-persist-client-core@5.60.5': dependencies: - '@tanstack/query-core': 5.59.20 + '@tanstack/query-core': 5.60.5 - '@tanstack/query-sync-storage-persister@5.59.20': + '@tanstack/query-sync-storage-persister@5.60.5': dependencies: - '@tanstack/query-core': 5.59.20 - '@tanstack/query-persist-client-core': 5.59.20 + '@tanstack/query-core': 5.60.5 + '@tanstack/query-persist-client-core': 5.60.5 - '@tanstack/react-query-devtools@5.60.2(@tanstack/react-query@5.60.2(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.60.5(@tanstack/react-query@5.60.5(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-devtools': 5.59.20 - '@tanstack/react-query': 5.60.2(react@18.3.1) + '@tanstack/react-query': 5.60.5(react@18.3.1) react: 18.3.1 - '@tanstack/react-query-persist-client@5.60.2(@tanstack/react-query@5.60.2(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-persist-client@5.60.5(@tanstack/react-query@5.60.5(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-persist-client-core': 5.59.20 - '@tanstack/react-query': 5.60.2(react@18.3.1) + '@tanstack/query-persist-client-core': 5.60.5 + '@tanstack/react-query': 5.60.5(react@18.3.1) react: 18.3.1 - '@tanstack/react-query@5.60.2(react@18.3.1)': + '@tanstack/react-query@5.60.5(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.59.20 + '@tanstack/query-core': 5.60.5 react: 18.3.1 - '@tanstack/react-router@1.81.5(@tanstack/router-generator@1.79.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-router@1.81.14(@tanstack/router-generator@1.81.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.81.3 + '@tanstack/history': 1.81.9 '@tanstack/react-store': 0.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) jsesc: 3.0.2 react: 18.3.1 @@ -16505,7 +16712,7 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 optionalDependencies: - '@tanstack/router-generator': 1.79.0 + '@tanstack/router-generator': 1.81.9 '@tanstack/react-store@0.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -16514,9 +16721,9 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - '@tanstack/router-devtools@1.81.5(@tanstack/react-router@1.81.5(@tanstack/router-generator@1.79.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/router-devtools@1.81.14(@tanstack/react-router@1.81.14(@tanstack/router-generator@1.81.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-router': 1.81.5(@tanstack/router-generator@1.79.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': 1.81.14(@tanstack/router-generator@1.81.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) react: 18.3.1 @@ -16524,14 +16731,14 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/router-generator@1.79.0': + '@tanstack/router-generator@1.81.9': dependencies: - '@tanstack/virtual-file-routes': 1.64.0 + '@tanstack/virtual-file-routes': 1.81.9 prettier: 3.3.3 tsx: 4.19.2 zod: 3.23.8 - '@tanstack/router-plugin@1.79.0(vite@5.4.11(@types/node@22.9.0)(terser@5.36.0))': + '@tanstack/router-plugin@1.81.9(vite@5.4.11(@types/node@22.9.0)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 '@babel/generator': 7.26.2 @@ -16541,8 +16748,8 @@ snapshots: '@babel/template': 7.25.9 '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 - '@tanstack/router-generator': 1.79.0 - '@tanstack/virtual-file-routes': 1.64.0 + '@tanstack/router-generator': 1.81.9 + '@tanstack/virtual-file-routes': 1.81.9 '@types/babel__core': 7.20.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 @@ -16558,7 +16765,7 @@ snapshots: '@tanstack/store@0.5.5': {} - '@tanstack/virtual-file-routes@1.64.0': {} + '@tanstack/virtual-file-routes@1.81.9': {} '@tiptap/core@2.9.1(@tiptap/pm@2.9.1)': dependencies: @@ -16969,7 +17176,7 @@ snapshots: '@uppy/core': 4.2.3 '@uppy/utils': 6.0.4 namespace-emitter: 2.0.1 - p-retry: 6.2.0 + p-retry: 6.2.1 '@uppy/core@4.2.3': dependencies: @@ -17237,7 +17444,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.4 + es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -17474,7 +17681,7 @@ snapshots: browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001680 - electron-to-chromium: 1.5.58 + electron-to-chromium: 1.5.62 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -18165,7 +18372,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.58: {} + electron-to-chromium@1.5.62: {} elliptic@6.6.1: dependencies: @@ -18217,6 +18424,8 @@ snapshots: emoji-mart@5.6.0: {} + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -18246,7 +18455,7 @@ snapshots: entities@4.5.0: {} - es-abstract@1.23.4: + es-abstract@1.23.5: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -18665,7 +18874,7 @@ snapshots: react: 18.3.1 react-dom: 18.2.0(react@18.3.1) - framer-motion@11.11.16(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@11.11.17(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.8.1 optionalDependencies: @@ -18713,7 +18922,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.4 + es-abstract: 1.23.5 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} @@ -19726,10 +19935,10 @@ snapshots: is-in-browser: 1.1.3 tiny-warning: 1.0.3 - jsx-email@2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.26.0)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0): + jsx-email@2.1.4(@jsx-email/app-preview@1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.27.2)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)))(@jsx-email/plugin-inline@1.0.1)(@jsx-email/plugin-minify@1.0.1)(@jsx-email/plugin-pretty@1.0.0)(@types/node@22.9.0)(@types/react@18.3.12)(react@18.3.1)(terser@5.36.0): dependencies: '@dot/log': 0.1.5 - '@jsx-email/app-preview': 1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.26.0)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) + '@jsx-email/app-preview': 1.2.6(@types/node@22.9.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react@18.3.1)(rollup@4.27.2)(terser@5.36.0)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) '@jsx-email/doiuse-email': 1.0.4 '@jsx-email/plugin-inline': 1.0.1(jsx-email@2.1.4) '@jsx-email/plugin-minify': 1.0.1(jsx-email@2.1.4) @@ -20596,6 +20805,12 @@ snapshots: dependencies: mimic-fn: 4.0.0 + oniguruma-to-es@0.1.2: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 4.4.0 + regex-recursion: 4.2.1 + oniguruma-to-js@0.4.3: dependencies: regex: 4.4.0 @@ -20644,7 +20859,7 @@ snapshots: eventemitter3: 5.0.1 p-timeout: 6.1.3 - p-retry@6.2.0: + p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 is-network-error: 1.1.0 @@ -21241,14 +21456,14 @@ snapshots: prosemirror-state: 1.4.3 prosemirror-view: 1.36.0 - prosemirror-highlight@0.9.0(@types/hast@3.0.4)(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-transform@1.10.2)(prosemirror-view@1.36.0)(shiki@1.22.2): + prosemirror-highlight@0.9.0(@types/hast@3.0.4)(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-transform@1.10.2)(prosemirror-view@1.36.0)(shiki@1.23.0): optionalDependencies: '@types/hast': 3.0.4 prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 prosemirror-view: 1.36.0 - shiki: 1.22.2 + shiki: 1.23.0 prosemirror-history@1.4.1: dependencies: @@ -21675,6 +21890,12 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 + regex-recursion@4.2.1: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + regex@4.4.0: {} regexp.prototype.flags@1.5.3: @@ -22015,6 +22236,30 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.26.0 fsevents: 2.3.3 + rollup@4.27.2: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.27.2 + '@rollup/rollup-android-arm64': 4.27.2 + '@rollup/rollup-darwin-arm64': 4.27.2 + '@rollup/rollup-darwin-x64': 4.27.2 + '@rollup/rollup-freebsd-arm64': 4.27.2 + '@rollup/rollup-freebsd-x64': 4.27.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.2 + '@rollup/rollup-linux-arm-musleabihf': 4.27.2 + '@rollup/rollup-linux-arm64-gnu': 4.27.2 + '@rollup/rollup-linux-arm64-musl': 4.27.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.2 + '@rollup/rollup-linux-riscv64-gnu': 4.27.2 + '@rollup/rollup-linux-s390x-gnu': 4.27.2 + '@rollup/rollup-linux-x64-gnu': 4.27.2 + '@rollup/rollup-linux-x64-musl': 4.27.2 + '@rollup/rollup-win32-arm64-msvc': 4.27.2 + '@rollup/rollup-win32-ia32-msvc': 4.27.2 + '@rollup/rollup-win32-x64-msvc': 4.27.2 + fsevents: 2.3.3 + rope-sequence@1.3.4: {} rrdom@0.1.7: @@ -22164,6 +22409,15 @@ snapshots: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 + shiki@1.23.0: + dependencies: + '@shikijs/core': 1.23.0 + '@shikijs/engine-javascript': 1.23.0 + '@shikijs/engine-oniguruma': 1.23.0 + '@shikijs/types': 1.23.0 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + shikiji@0.8.7: dependencies: hast-util-to-html: 9.0.3 @@ -22299,7 +22553,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.4 + es-abstract: 1.23.5 es-errors: 1.3.0 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 @@ -22314,7 +22568,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.4 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 string.prototype.trimend@1.0.8: @@ -22401,9 +22655,9 @@ snapshots: tailwind-merge@2.5.4: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3))): dependencies: - tailwindcss: 3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) + tailwindcss: 3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)) tailwindcss@3.4.0(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)): dependencies: @@ -22432,7 +22686,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)): + tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.9.0)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -23144,9 +23398,9 @@ snapshots: pathe: 0.2.0 vite: 5.4.11(@types/node@22.9.0)(terser@5.36.0) - vite-plugin-node-polyfills@0.16.0(rollup@4.26.0)(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0)): + vite-plugin-node-polyfills@0.16.0(rollup@4.27.2)(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.26.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.27.2) buffer-polyfill: buffer@6.0.3 node-stdlib-browser: 1.2.1 process: 0.11.10 @@ -23189,7 +23443,7 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.26.0 + rollup: 4.27.2 optionalDependencies: '@types/node': 22.9.0 fsevents: 2.3.3