From 1ce5117dc8da96d55470db1e256c3d2c12fdc8f7 Mon Sep 17 00:00:00 2001 From: David Rios Date: Tue, 14 Apr 2026 12:35:11 -0400 Subject: [PATCH] feat(apollo-react): add i18n support for canvas components [MST-8210] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add Lingui localization to the sticky note formatting toolbar with a new canvas locale catalog (13 locales). Simplify the i18n build by switching compileNamespace from 'es' to 'ts' so rslib handles ESM/CJS/d.ts output natively — removing plugin-copy-locales and the ambient *.mjs type hack. Remove the Lingui Babel macro from Storybook since canvas components no longer use msg(). Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 2 +- packages/apollo-react/lingui.config.ts | 5 + packages/apollo-react/rslib.config.ts | 4 - .../scripts/plugin-copy-locales.ts | 84 ----- .../StickyNoteNode/FormattingToolbar.test.tsx | 84 ++++- .../StickyNoteNode/FormattingToolbar.tsx | 73 +++- .../StickyNoteNode/StickyNoteNode.tsx | 5 +- .../apollo-react/src/canvas/locales/de.json | 8 + .../apollo-react/src/canvas/locales/en.json | 8 + .../src/canvas/locales/es-MX.json | 8 + .../apollo-react/src/canvas/locales/es.json | 8 + .../apollo-react/src/canvas/locales/fr.json | 8 + .../apollo-react/src/canvas/locales/ja.json | 8 + .../apollo-react/src/canvas/locales/ko.json | 8 + .../src/canvas/locales/pt-BR.json | 8 + .../apollo-react/src/canvas/locales/pt.json | 8 + .../apollo-react/src/canvas/locales/ru.json | 8 + .../apollo-react/src/canvas/locales/tr.json | 8 + .../src/canvas/locales/zh-CN.json | 8 + .../src/canvas/locales/zh-TW.json | 8 + .../apollo-react/src/i18n/locale-registry.ts | 181 +++++----- packages/apollo-react/vitest.config.ts | 8 + pnpm-lock.yaml | 311 ++++++------------ 23 files changed, 443 insertions(+), 418 deletions(-) delete mode 100644 packages/apollo-react/scripts/plugin-copy-locales.ts create mode 100644 packages/apollo-react/src/canvas/locales/de.json create mode 100644 packages/apollo-react/src/canvas/locales/en.json create mode 100644 packages/apollo-react/src/canvas/locales/es-MX.json create mode 100644 packages/apollo-react/src/canvas/locales/es.json create mode 100644 packages/apollo-react/src/canvas/locales/fr.json create mode 100644 packages/apollo-react/src/canvas/locales/ja.json create mode 100644 packages/apollo-react/src/canvas/locales/ko.json create mode 100644 packages/apollo-react/src/canvas/locales/pt-BR.json create mode 100644 packages/apollo-react/src/canvas/locales/pt.json create mode 100644 packages/apollo-react/src/canvas/locales/ru.json create mode 100644 packages/apollo-react/src/canvas/locales/tr.json create mode 100644 packages/apollo-react/src/canvas/locales/zh-CN.json create mode 100644 packages/apollo-react/src/canvas/locales/zh-TW.json diff --git a/.gitignore b/.gitignore index 71793887a..1f443e8e5 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ storybook-static/ *.tsbuildinfo # Compiled locale files (generated by lingui compile) -**/locales/*.js +**/locales/*.ts # Playwright MCP .playwright-mcp diff --git a/packages/apollo-react/lingui.config.ts b/packages/apollo-react/lingui.config.ts index 7ca308c33..c1b9e7b29 100644 --- a/packages/apollo-react/lingui.config.ts +++ b/packages/apollo-react/lingui.config.ts @@ -13,8 +13,13 @@ const config: LinguiConfig = { path: 'src/material/components/ap-tool-call/locales/{locale}', include: ['src/material/components/ap-tool-call'], }, + { + path: 'src/canvas/locales/{locale}', + include: ['src/canvas'], + }, ], format: formatter({ style: 'minimal' }), + compileNamespace: 'ts', }; export default config; diff --git a/packages/apollo-react/rslib.config.ts b/packages/apollo-react/rslib.config.ts index 37078ee10..b3dc61222 100644 --- a/packages/apollo-react/rslib.config.ts +++ b/packages/apollo-react/rslib.config.ts @@ -3,8 +3,6 @@ import { pluginReact } from '@rsbuild/plugin-react'; import type { RslibConfig } from '@rslib/core'; import { defineConfig } from '@rslib/core'; -import { pluginCopyLocales } from './scripts/plugin-copy-locales'; - // Shared externals list to avoid duplication const externals = [ 'react', @@ -60,7 +58,6 @@ export default defineConfig({ '!./src/test/**', '!./src/icons/.cache', '!./src/**/*.md', - '!./src/**/locales/*.js', '!./src/**/locales/*.json', '!./src/**/.DS_Store', ], @@ -79,7 +76,6 @@ export default defineConfig({ return opts; }, }), - pluginCopyLocales(), ], output: { target: 'web', diff --git a/packages/apollo-react/scripts/plugin-copy-locales.ts b/packages/apollo-react/scripts/plugin-copy-locales.ts deleted file mode 100644 index 43931f81b..000000000 --- a/packages/apollo-react/scripts/plugin-copy-locales.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - existsSync, - mkdirSync, - readFileSync, - readdirSync, - statSync, - writeFileSync, -} from 'fs'; -import { - dirname, - join, -} from 'path'; -import { fileURLToPath } from 'url'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const packageRoot = dirname(__dirname); - -/** - * Convert CommonJS locale module to ESM format - * From: module.exports={messages:JSON.parse("{...}")}; - * To: export default {messages:JSON.parse("{...}")}; - */ -function convertToESM(content: string): string { - return content.replace(/module\.exports\s*=\s*/, 'export default '); -} - -export function pluginCopyLocales() { - return { - name: 'plugin-copy-locales', - setup(api) { - api.onAfterBuild(() => { - const srcDir = join(packageRoot, 'src'); - const distDir = join(packageRoot, 'dist'); - - function findAndCopyLocales(dir: string, basePath = '') { - for (const entry of readdirSync(dir)) { - const fullPath = join(dir, entry); - const relativePath = join(basePath, entry); - - if (entry === 'locales') { - const srcLocales = fullPath; - const distLocales = join(distDir, relativePath); - - if (existsSync(srcLocales)) { - // Ensure dist directory exists - mkdirSync(distLocales, { recursive: true }); - - // Process each locale file - const files = readdirSync(srcLocales); - for (const file of files) { - if (file.endsWith('.js')) { - const srcFile = join(srcLocales, file); - const content = readFileSync(srcFile, 'utf-8'); - - // Write .cjs (CommonJS format) - const cjsFile = join(distLocales, file.replace('.js', '.cjs')); - writeFileSync(cjsFile, content, 'utf-8'); - - // Write .js (ESM format) - const esmFile = join(distLocales, file); - const esmContent = convertToESM(content); - writeFileSync(esmFile, esmContent, 'utf-8'); - } else if (file.endsWith('.json')) { - // Copy JSON files as-is - const srcFile = join(srcLocales, file); - const destFile = join(distLocales, file); - const content = readFileSync(srcFile, 'utf-8'); - writeFileSync(destFile, content, 'utf-8'); - } - } - - console.log(`✓ Copied locales: ${relativePath}`); - } - } else if (statSync(fullPath).isDirectory()) { - findAndCopyLocales(fullPath, relativePath); - } - } - } - - findAndCopyLocales(srcDir); - }); - }, - }; -} diff --git a/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.test.tsx b/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.test.tsx index a5b5f637f..81570a973 100644 --- a/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.test.tsx +++ b/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.test.tsx @@ -1,5 +1,7 @@ +import { i18n } from '@lingui/core'; import { fireEvent, render, screen } from '@testing-library/react'; import { describe, expect, it, vi } from 'vitest'; +import { ApI18nProvider, type SupportedLocale } from '../../../i18n'; import { FormattingToolbar } from './FormattingToolbar'; import type { ActiveFormats } from './markdown-formatting'; @@ -21,12 +23,20 @@ function createMockTextArea(value = '', selectionStart = 0, selectionEnd = 0) { return { current: textarea }; } +function renderWithI18n(ui: React.ReactElement, locale: SupportedLocale = 'en') { + return render( + + {ui} + + ); +} + describe('FormattingToolbar', () => { it('calls onFormat when a button is clicked', () => { const onFormat = vi.fn(); const ref = createMockTextArea('hello world', 6, 11); - render( + renderWithI18n( { const onFormat = vi.fn(); const ref = { current: null } as React.RefObject; - render( + renderWithI18n( { expect(onFormat).not.toHaveBeenCalled(); }); + it('exposes the container as an accessible toolbar', () => { + const ref = { current: null } as React.RefObject; + renderWithI18n( + + ); + + expect(screen.getByRole('toolbar', { name: /Text formatting/i })).toBeTruthy(); + }); + + it('exposes an accessible name on every toolbar button', () => { + const ref = { current: null } as React.RefObject; + renderWithI18n( + + ); + + // All five icon-only buttons must resolve via accessible name so screen + // readers announce them. Shortcut text comes from ICU interpolation — if + // that breaks, these queries surface the regression. + expect(screen.getByRole('button', { name: /^Bold \(.+\+B\)$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Italic \(.+\+I\)$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Strikethrough \(.+X\)$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Bullet list$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Numbered list$/ })).toBeTruthy(); + }); + + it('renders translated labels when a non-English locale is active', () => { + const ref = { current: null } as React.RefObject; + + // Load a fake Spanish catalog with translations for the toolbar keys + i18n.load('es', { + 'sticky-note.formatting.bold': ['Negrita (', ['boldShortcut'], ')'], + 'sticky-note.formatting.italic': ['Cursiva (', ['italicShortcut'], ')'], + 'sticky-note.formatting.strikethrough': ['Tachado (', ['strikethroughShortcut'], ')'], + 'sticky-note.formatting.bullet-list': ['Lista con viñetas'], + 'sticky-note.formatting.numbered-list': ['Lista numerada'], + 'sticky-note.formatting.toolbar': ['Formato de texto'], + }); + + renderWithI18n( + , + 'es' + ); + + expect(screen.getByRole('toolbar', { name: 'Formato de texto' })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Negrita \(.+\+B\)$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Cursiva \(.+\+I\)$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Tachado \(.+X\)$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Lista con viñetas$/ })).toBeTruthy(); + expect(screen.getByRole('button', { name: /^Lista numerada$/ })).toBeTruthy(); + }); + it('prevents textarea blur on mousedown', () => { const ref = { current: null } as React.RefObject; - const { container } = render( + const { container } = renderWithI18n( { /> ); - const toolbarContainer = container.firstChild as HTMLElement; + const toolbarContainer = container.querySelector('[class]') as HTMLElement; const mouseDownEvent = new MouseEvent('mousedown', { bubbles: true, cancelable: true }); const prevented = !toolbarContainer.dispatchEvent(mouseDownEvent); expect(prevented).toBe(true); diff --git a/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.tsx b/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.tsx index 1e5e34759..0be2f0616 100644 --- a/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.tsx +++ b/packages/apollo-react/src/canvas/components/StickyNoteNode/FormattingToolbar.tsx @@ -1,3 +1,4 @@ +import { useLingui } from '@lingui/react'; import { CanvasIcon } from '@uipath/apollo-react/canvas'; import { memo, type RefObject, useCallback } from 'react'; import { CanvasTooltip } from '../CanvasTooltip'; @@ -30,6 +31,10 @@ const FormattingToolbarComponent = ({ activeFormats, onFormat, }: FormattingToolbarProps) => { + const { _ } = useLingui(); + const mod = getModifierKey(); + const shift = isMac() ? '⇧' : '+Shift+'; + const applyFormat = useCallback( (formatFn: (input: TextSelection) => TextSelection) => { const textarea = textAreaRef.current; @@ -53,40 +58,84 @@ const FormattingToolbarComponent = ({ const handleBulletList = useCallback(() => applyFormat(toggleBulletList), [applyFormat]); const handleNumberedList = useCallback(() => applyFormat(toggleNumberedList), [applyFormat]); - const mod = getModifierKey(); - const shift = isMac() ? '⇧' : '+Shift+'; + // Hoisted so each label is used for both the tooltip text AND the button's + // aria-label — icon-only buttons otherwise have no accessible name. + // Values go inside the descriptor (Lingui v5 `_(descriptor)` overload does not + // take a separate values arg). + const boldLabel = _({ + id: 'sticky-note.formatting.bold', + message: 'Bold ({boldShortcut})', + values: { boldShortcut: `${mod}+B` }, + }); + const italicLabel = _({ + id: 'sticky-note.formatting.italic', + message: 'Italic ({italicShortcut})', + values: { italicShortcut: `${mod}+I` }, + }); + const strikethroughLabel = _({ + id: 'sticky-note.formatting.strikethrough', + message: 'Strikethrough ({strikethroughShortcut})', + values: { strikethroughShortcut: `${mod}${shift}X` }, + }); + const bulletListLabel = _({ + id: 'sticky-note.formatting.bullet-list', + message: 'Bullet list', + }); + const numberedListLabel = _({ + id: 'sticky-note.formatting.numbered-list', + message: 'Numbered list', + }); + const toolbarLabel = _({ id: 'sticky-note.formatting.toolbar', message: 'Text formatting' }); return ( e.preventDefault()} className="nodrag nowheel" > - - + + - - + + - - + + - - + + - - + + diff --git a/packages/apollo-react/src/canvas/components/StickyNoteNode/StickyNoteNode.tsx b/packages/apollo-react/src/canvas/components/StickyNoteNode/StickyNoteNode.tsx index b50eaa81b..3b8424164 100644 --- a/packages/apollo-react/src/canvas/components/StickyNoteNode/StickyNoteNode.tsx +++ b/packages/apollo-react/src/canvas/components/StickyNoteNode/StickyNoteNode.tsx @@ -5,6 +5,7 @@ import { NodeResizeControl, useReactFlow } from '@uipath/apollo-react/canvas/xyf import type { ResizeDragEvent, ResizeParams } from '@uipath/apollo-react/canvas/xyflow/system'; import { AnimatePresence } from 'motion/react'; import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { ApI18nProvider } from '../../../i18n'; import ReactMarkdown from 'react-markdown'; import remarkBreaks from 'remark-breaks'; import remarkGfm from 'remark-gfm'; @@ -348,7 +349,7 @@ const StickyNoteNodeComponent = ({ {isEditing ? ( - <> + - + ) : ( {localContent ? ( diff --git a/packages/apollo-react/src/canvas/locales/de.json b/packages/apollo-react/src/canvas/locales/de.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/de.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/en.json b/packages/apollo-react/src/canvas/locales/en.json new file mode 100644 index 000000000..37f336024 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/en.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "Bold ({boldShortcut})", + "sticky-note.formatting.italic": "Italic ({italicShortcut})", + "sticky-note.formatting.strikethrough": "Strikethrough ({strikethroughShortcut})", + "sticky-note.formatting.bullet-list": "Bullet list", + "sticky-note.formatting.numbered-list": "Numbered list", + "sticky-note.formatting.toolbar": "Text formatting" +} diff --git a/packages/apollo-react/src/canvas/locales/es-MX.json b/packages/apollo-react/src/canvas/locales/es-MX.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/es-MX.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/es.json b/packages/apollo-react/src/canvas/locales/es.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/es.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/fr.json b/packages/apollo-react/src/canvas/locales/fr.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/fr.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/ja.json b/packages/apollo-react/src/canvas/locales/ja.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/ja.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/ko.json b/packages/apollo-react/src/canvas/locales/ko.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/ko.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/pt-BR.json b/packages/apollo-react/src/canvas/locales/pt-BR.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/pt-BR.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/pt.json b/packages/apollo-react/src/canvas/locales/pt.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/pt.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/ru.json b/packages/apollo-react/src/canvas/locales/ru.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/ru.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/tr.json b/packages/apollo-react/src/canvas/locales/tr.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/tr.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/zh-CN.json b/packages/apollo-react/src/canvas/locales/zh-CN.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/zh-CN.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/canvas/locales/zh-TW.json b/packages/apollo-react/src/canvas/locales/zh-TW.json new file mode 100644 index 000000000..378816c94 --- /dev/null +++ b/packages/apollo-react/src/canvas/locales/zh-TW.json @@ -0,0 +1,8 @@ +{ + "sticky-note.formatting.bold": "", + "sticky-note.formatting.italic": "", + "sticky-note.formatting.strikethrough": "", + "sticky-note.formatting.bullet-list": "", + "sticky-note.formatting.numbered-list": "", + "sticky-note.formatting.toolbar": "" +} diff --git a/packages/apollo-react/src/i18n/locale-registry.ts b/packages/apollo-react/src/i18n/locale-registry.ts index 1203df265..8a7c98899 100644 --- a/packages/apollo-react/src/i18n/locale-registry.ts +++ b/packages/apollo-react/src/i18n/locale-registry.ts @@ -3,110 +3,99 @@ * All locales are statically imported at build time for better performance */ -// @ts-expect-error - CommonJS modules without type definitions -import apChatDe from '../material/components/ap-chat/locales/de.js'; +// Pre-import all locales for canvas component +import { messages as canvasDe } from '../canvas/locales/de'; +import { messages as canvasEn } from '../canvas/locales/en'; +import { messages as canvasEs } from '../canvas/locales/es'; +import { messages as canvasEsMX } from '../canvas/locales/es-MX'; +import { messages as canvasFr } from '../canvas/locales/fr'; +import { messages as canvasJa } from '../canvas/locales/ja'; +import { messages as canvasKo } from '../canvas/locales/ko'; +import { messages as canvasPt } from '../canvas/locales/pt'; +import { messages as canvasPtBR } from '../canvas/locales/pt-BR'; +import { messages as canvasRu } from '../canvas/locales/ru'; +import { messages as canvasTr } from '../canvas/locales/tr'; +import { messages as canvasZhCN } from '../canvas/locales/zh-CN'; +import { messages as canvasZhTW } from '../canvas/locales/zh-TW'; // Pre-import all locales for ap-chat component -// @ts-expect-error - CommonJS modules without type definitions -import apChatEn from '../material/components/ap-chat/locales/en.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatEs from '../material/components/ap-chat/locales/es.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatEsMX from '../material/components/ap-chat/locales/es-MX.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatFr from '../material/components/ap-chat/locales/fr.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatJa from '../material/components/ap-chat/locales/ja.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatKo from '../material/components/ap-chat/locales/ko.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatPt from '../material/components/ap-chat/locales/pt.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatPtBR from '../material/components/ap-chat/locales/pt-BR.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatRu from '../material/components/ap-chat/locales/ru.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatTr from '../material/components/ap-chat/locales/tr.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatZhCN from '../material/components/ap-chat/locales/zh-CN.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apChatZhTW from '../material/components/ap-chat/locales/zh-TW.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallDe from '../material/components/ap-tool-call/locales/de.js'; +import { messages as apChatDe } from '../material/components/ap-chat/locales/de'; +import { messages as apChatEn } from '../material/components/ap-chat/locales/en'; +import { messages as apChatEs } from '../material/components/ap-chat/locales/es'; +import { messages as apChatEsMX } from '../material/components/ap-chat/locales/es-MX'; +import { messages as apChatFr } from '../material/components/ap-chat/locales/fr'; +import { messages as apChatJa } from '../material/components/ap-chat/locales/ja'; +import { messages as apChatKo } from '../material/components/ap-chat/locales/ko'; +import { messages as apChatPt } from '../material/components/ap-chat/locales/pt'; +import { messages as apChatPtBR } from '../material/components/ap-chat/locales/pt-BR'; +import { messages as apChatRu } from '../material/components/ap-chat/locales/ru'; +import { messages as apChatTr } from '../material/components/ap-chat/locales/tr'; +import { messages as apChatZhCN } from '../material/components/ap-chat/locales/zh-CN'; +import { messages as apChatZhTW } from '../material/components/ap-chat/locales/zh-TW'; // Pre-import all locales for ap-tool-call component -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallEn from '../material/components/ap-tool-call/locales/en.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallEs from '../material/components/ap-tool-call/locales/es.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallEsMX from '../material/components/ap-tool-call/locales/es-MX.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallFr from '../material/components/ap-tool-call/locales/fr.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallJa from '../material/components/ap-tool-call/locales/ja.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallKo from '../material/components/ap-tool-call/locales/ko.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallPt from '../material/components/ap-tool-call/locales/pt.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallPtBR from '../material/components/ap-tool-call/locales/pt-BR.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallRu from '../material/components/ap-tool-call/locales/ru.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallTr from '../material/components/ap-tool-call/locales/tr.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallZhCN from '../material/components/ap-tool-call/locales/zh-CN.js'; -// @ts-expect-error - CommonJS modules without type definitions -import apToolCallZhTW from '../material/components/ap-tool-call/locales/zh-TW.js'; +import { messages as apToolCallDe } from '../material/components/ap-tool-call/locales/de'; +import { messages as apToolCallEn } from '../material/components/ap-tool-call/locales/en'; +import { messages as apToolCallEs } from '../material/components/ap-tool-call/locales/es'; +import { messages as apToolCallEsMX } from '../material/components/ap-tool-call/locales/es-MX'; +import { messages as apToolCallFr } from '../material/components/ap-tool-call/locales/fr'; +import { messages as apToolCallJa } from '../material/components/ap-tool-call/locales/ja'; +import { messages as apToolCallKo } from '../material/components/ap-tool-call/locales/ko'; +import { messages as apToolCallPt } from '../material/components/ap-tool-call/locales/pt'; +import { messages as apToolCallPtBR } from '../material/components/ap-tool-call/locales/pt-BR'; +import { messages as apToolCallRu } from '../material/components/ap-tool-call/locales/ru'; +import { messages as apToolCallTr } from '../material/components/ap-tool-call/locales/tr'; +import { messages as apToolCallZhCN } from '../material/components/ap-tool-call/locales/zh-CN'; +import { messages as apToolCallZhTW } from '../material/components/ap-tool-call/locales/zh-TW'; +import type { Messages } from '@lingui/core'; import type { SupportedLocale } from './ApI18nProvider'; -type LocaleMessages = Record; - -/** - * Extract messages from compiled Lingui locale module - * Lingui compiles to: module.exports={messages:JSON.parse("{...}")}; - */ -function extractMessages(localeModule: unknown): LocaleMessages { - if (typeof localeModule === 'object' && localeModule !== null && 'messages' in localeModule) { - return (localeModule as { messages: LocaleMessages }).messages; - } - // Fallback for unexpected format - console.warn('Unexpected locale module format:', localeModule); - return {}; -} - /** * Registry mapping component paths to their pre-imported locale messages */ -const localeRegistry: Record> = { +const localeRegistry: Record> = { 'material/components/ap-chat': { - en: extractMessages(apChatEn), - es: extractMessages(apChatEs), - pt: extractMessages(apChatPt), - de: extractMessages(apChatDe), - fr: extractMessages(apChatFr), - ja: extractMessages(apChatJa), - ko: extractMessages(apChatKo), - ru: extractMessages(apChatRu), - tr: extractMessages(apChatTr), - 'zh-CN': extractMessages(apChatZhCN), - 'zh-TW': extractMessages(apChatZhTW), - 'pt-BR': extractMessages(apChatPtBR), - 'es-MX': extractMessages(apChatEsMX), + en: apChatEn, + es: apChatEs, + pt: apChatPt, + de: apChatDe, + fr: apChatFr, + ja: apChatJa, + ko: apChatKo, + ru: apChatRu, + tr: apChatTr, + 'zh-CN': apChatZhCN, + 'zh-TW': apChatZhTW, + 'pt-BR': apChatPtBR, + 'es-MX': apChatEsMX, }, 'material/components/ap-tool-call': { - en: extractMessages(apToolCallEn), - es: extractMessages(apToolCallEs), - pt: extractMessages(apToolCallPt), - de: extractMessages(apToolCallDe), - fr: extractMessages(apToolCallFr), - ja: extractMessages(apToolCallJa), - ko: extractMessages(apToolCallKo), - ru: extractMessages(apToolCallRu), - tr: extractMessages(apToolCallTr), - 'zh-CN': extractMessages(apToolCallZhCN), - 'zh-TW': extractMessages(apToolCallZhTW), - 'pt-BR': extractMessages(apToolCallPtBR), - 'es-MX': extractMessages(apToolCallEsMX), + en: apToolCallEn, + es: apToolCallEs, + pt: apToolCallPt, + de: apToolCallDe, + fr: apToolCallFr, + ja: apToolCallJa, + ko: apToolCallKo, + ru: apToolCallRu, + tr: apToolCallTr, + 'zh-CN': apToolCallZhCN, + 'zh-TW': apToolCallZhTW, + 'pt-BR': apToolCallPtBR, + 'es-MX': apToolCallEsMX, + }, + canvas: { + en: canvasEn, + es: canvasEs, + pt: canvasPt, + de: canvasDe, + fr: canvasFr, + ja: canvasJa, + ko: canvasKo, + ru: canvasRu, + tr: canvasTr, + 'zh-CN': canvasZhCN, + 'zh-TW': canvasZhTW, + 'pt-BR': canvasPtBR, + 'es-MX': canvasEsMX, }, }; @@ -117,7 +106,7 @@ const localeRegistry: Record> = export function getPreImportedMessages( component: string, locale: SupportedLocale -): LocaleMessages | undefined { +): Messages | undefined { const componentLocales = localeRegistry[component]; if (!componentLocales) { return undefined; @@ -130,6 +119,6 @@ export function getPreImportedMessages( */ export function getAllPreImportedLocales( component: string -): Record | undefined { +): Record | undefined { return localeRegistry[component]; } diff --git a/packages/apollo-react/vitest.config.ts b/packages/apollo-react/vitest.config.ts index 23b3d3123..7f0cdf5a9 100644 --- a/packages/apollo-react/vitest.config.ts +++ b/packages/apollo-react/vitest.config.ts @@ -1,8 +1,16 @@ import { fileURLToPath } from 'node:url'; +import react from '@vitejs/plugin-react'; import { defineConfig } from 'vitest/config'; export default defineConfig({ + plugins: [ + react({ + babel: { + plugins: ['@lingui/babel-plugin-lingui-macro'], + }, + }), + ], test: { globals: true, environment: 'happy-dom', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06727a7a0..3b86ea20e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -501,7 +501,7 @@ importers: version: 10.2.15(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) tailwindcss: specifier: ^4.1.17 - version: 4.2.2 + version: 4.1.17 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -2222,8 +2222,8 @@ packages: '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -2877,8 +2877,8 @@ packages: '@iconify/utils@3.1.0': resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.34.5': @@ -3953,166 +3953,84 @@ packages: cpu: [x64] os: [win32] - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - '@parcel/watcher-darwin-arm64@2.5.6': resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - '@parcel/watcher-darwin-x64@2.5.6': resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - '@parcel/watcher-freebsd-x64@2.5.6': resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - '@parcel/watcher-linux-arm-glibc@2.5.6': resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - '@parcel/watcher-win32-ia32@2.5.6': resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - '@parcel/watcher-win32-x64@2.5.6': resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} - engines: {node: '>= 10.0.0'} - '@parcel/watcher@2.5.6': resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} @@ -5307,6 +5225,9 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -5486,6 +5407,9 @@ packages: '@swc/helpers@0.5.19': resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@tailwindcss/cli@4.1.17': resolution: {integrity: sha512-jUIxcyUNlCC2aNPnyPEWU/L2/ik3pB4fF3auKGXr8AvN3T3OFESVctFKOBoPZQaZJIeUpPn1uCLp0MRxuek8gg==} hasBin: true @@ -6636,8 +6560,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.8: - resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} + baseline-browser-mapping@2.10.18: + resolution: {integrity: sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A==} engines: {node: '>=6.0.0'} hasBin: true @@ -6751,8 +6675,8 @@ packages: caniuse-lite@1.0.30001756: resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} - caniuse-lite@1.0.30001786: - resolution: {integrity: sha512-4oxTZEvqmLLrERwxO76yfKM7acZo310U+v4kqexI2TL1DkkUEMT8UijrxxcnVdxR3qkVf5awGRX+4Z6aPHVKrA==} + caniuse-lite@1.0.30001787: + resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -7544,11 +7468,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -7567,6 +7486,10 @@ packages: resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -7689,10 +7612,6 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - enhanced-resolve@5.18.4: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} @@ -9858,6 +9777,10 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} @@ -11358,6 +11281,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@2.0.0-next.6: resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} engines: {node: '>= 0.4'} @@ -13915,7 +13843,7 @@ snapshots: '@base-ui/utils@0.2.4(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@floating-ui/utils': 0.2.10 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -14293,7 +14221,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 optional: true @@ -14306,7 +14234,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -14639,7 +14567,7 @@ snapshots: dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -14660,7 +14588,7 @@ snapshots: ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 - minimatch: 10.2.4 + minimatch: 10.2.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -14762,7 +14690,7 @@ snapshots: '@iconify/types': 2.0.0 mlly: 1.8.0 - '@img/colour@1.0.0': + '@img/colour@1.1.0': optional: true '@img/sharp-darwin-arm64@0.34.5': @@ -14847,7 +14775,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.9.2 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -14981,7 +14909,7 @@ snapshots: '@lingui/babel-plugin-lingui-macro@5.6.1(babel-plugin-macros@3.1.0)(typescript@5.9.3)': dependencies: '@babel/core': 7.28.5 - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@babel/types': 7.29.0 '@lingui/conf': 5.6.1(typescript@5.9.3) '@lingui/core': 5.6.1(@lingui/babel-plugin-lingui-macro@5.6.1(babel-plugin-macros@3.1.0)(typescript@5.9.3))(babel-plugin-macros@3.1.0) @@ -15153,10 +15081,10 @@ snapshots: '@rushstack/rig-package': 0.7.2 '@rushstack/terminal': 0.22.3(@types/node@24.10.1) '@rushstack/ts-command-line': 5.3.3(@types/node@24.10.1) - diff: 8.0.3 + diff: 8.0.4 lodash: 4.18.1 - minimatch: 10.2.4 - resolve: 1.22.11 + minimatch: 10.2.5 + resolve: 1.22.12 semver: 7.5.4 source-map: 0.6.1 typescript: 5.8.2 @@ -15169,7 +15097,7 @@ snapshots: '@microsoft/tsdoc': 0.16.0 ajv: 8.18.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 optional: true '@microsoft/tsdoc@0.16.0': @@ -15258,7 +15186,7 @@ snapshots: '@mui/base@5.0.0-beta.70(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@mui/types': 7.2.24(@types/react@19.2.8) '@mui/utils': 6.4.9(@types/react@19.2.8)(react@19.2.3) @@ -15321,7 +15249,7 @@ snapshots: '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 csstype: 3.2.3 @@ -15382,7 +15310,7 @@ snapshots: '@mui/types@7.4.9(@types/react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 optionalDependencies: '@types/react': 19.2.8 @@ -15400,7 +15328,7 @@ snapshots: '@mui/utils@6.4.9(@types/react@19.2.8)(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@mui/types': 7.2.24(@types/react@19.2.8) '@types/prop-types': 15.7.15 clsx: 2.1.1 @@ -15412,7 +15340,7 @@ snapshots: '@mui/utils@7.3.6(@types/react@19.2.8)(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@mui/types': 7.4.9(@types/react@19.2.8) '@types/prop-types': 15.7.15 clsx: 2.1.1 @@ -15468,7 +15396,7 @@ snapshots: '@mui/x-internals@8.26.0(@types/react@19.2.8)(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 '@mui/utils': 7.3.6(@types/react@19.2.8)(react@19.2.3) react: 19.2.3 reselect: 5.1.1 @@ -15562,7 +15490,7 @@ snapshots: '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.9.2 '@tybys/wasm-util': 0.10.1 optional: true @@ -15806,105 +15734,45 @@ snapshots: '@pagefind/windows-x64@1.4.0': optional: true - '@parcel/watcher-android-arm64@2.5.1': - optional: true - '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': - optional: true - '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.1': - optional: true - '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': - optional: true - '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': - optional: true - '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': - optional: true - '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': - optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': - optional: true - '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': - optional: true - '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': - optional: true - '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.1': - optional: true - '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.1': - optional: true - '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.1': - optional: true - '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.1': - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.8 - node-addon-api: 7.1.1 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 - '@parcel/watcher@2.5.6': dependencies: detect-libc: 2.1.2 @@ -15925,7 +15793,6 @@ snapshots: '@parcel/watcher-win32-arm64': 2.5.6 '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 - optional: true '@pnpm/config.env-replace@1.1.0': {} @@ -16691,7 +16558,7 @@ snapshots: '@react-aria/interactions': 3.25.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.19 + '@swc/helpers': 0.5.21 clsx: 2.1.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -16702,13 +16569,13 @@ snapshots: '@react-aria/utils': 3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@react-stately/flags': 3.1.2 '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.19 + '@swc/helpers': 0.5.21 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) '@react-aria/ssr@3.9.10(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.19 + '@swc/helpers': 0.5.21 react: 19.2.3 '@react-aria/utils@3.31.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -16717,18 +16584,18 @@ snapshots: '@react-stately/flags': 3.1.2 '@react-stately/utils': 3.10.8(react@19.2.3) '@react-types/shared': 3.32.1(react@19.2.3) - '@swc/helpers': 0.5.19 + '@swc/helpers': 0.5.21 clsx: 2.1.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) '@react-stately/flags@3.1.2': dependencies: - '@swc/helpers': 0.5.19 + '@swc/helpers': 0.5.21 '@react-stately/utils@3.10.8(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.19 + '@swc/helpers': 0.5.21 react: 19.2.3 '@react-types/shared@3.32.1(react@19.2.3)': @@ -17000,7 +16867,7 @@ snapshots: fs-extra: 11.3.4 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 optionalDependencies: '@types/node': 24.10.1 @@ -17013,7 +16880,7 @@ snapshots: '@rushstack/rig-package@0.7.2': dependencies: - resolve: 1.22.11 + resolve: 1.22.12 strip-json-comments: 3.1.1 optional: true @@ -17225,6 +17092,8 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@standard-schema/spec@1.0.0': {} + '@standard-schema/spec@1.1.0': {} '@standard-schema/utils@0.3.0': {} @@ -17499,12 +17368,16 @@ snapshots: dependencies: tslib: 2.8.1 + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + '@tailwindcss/cli@4.1.17': dependencies: - '@parcel/watcher': 2.5.1 + '@parcel/watcher': 2.5.6 '@tailwindcss/node': 4.1.17 '@tailwindcss/oxide': 4.1.17 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.20.0 mri: 1.2.0 picocolors: 1.1.1 tailwindcss: 4.1.17 @@ -17860,7 +17733,7 @@ snapshots: '@tmcp/adapter-valibot@0.1.5(tmcp@1.19.2(typescript@5.9.3))(valibot@1.2.0(typescript@5.9.3))': dependencies: - '@standard-schema/spec': 1.1.0 + '@standard-schema/spec': 1.0.0 '@valibot/to-json-schema': 1.5.0(valibot@1.2.0(typescript@5.9.3)) tmcp: 1.19.2(typescript@5.9.3) valibot: 1.2.0(typescript@5.9.3) @@ -17899,7 +17772,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -17911,7 +17784,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': @@ -18694,8 +18567,8 @@ snapshots: autoprefixer@10.4.22(postcss@8.5.6): dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001786 + browserslist: 4.28.0 + caniuse-lite: 1.0.30001756 fraction.js: 5.3.4 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -18722,7 +18595,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 cosmiconfig: 7.1.0 resolve: 1.22.11 @@ -18762,7 +18635,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.8: {} + baseline-browser-mapping@2.10.18: {} baseline-browser-mapping@2.8.30: {} @@ -18828,8 +18701,8 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.10.8 - caniuse-lite: 1.0.30001786 + baseline-browser-mapping: 2.10.18 + caniuse-lite: 1.0.30001787 electron-to-chromium: 1.5.307 node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -18885,13 +18758,13 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001786 + caniuse-lite: 1.0.30001787 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-lite@1.0.30001756: {} - caniuse-lite@1.0.30001786: {} + caniuse-lite@1.0.30001787: {} ccount@2.0.1: {} @@ -19757,8 +19630,6 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@1.0.3: {} - detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -19771,6 +19642,9 @@ snapshots: diff@8.0.3: {} + diff@8.0.4: + optional: true + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -19789,7 +19663,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 csstype: 3.2.3 dom-serializer@2.0.0: @@ -19902,11 +19776,6 @@ snapshots: engine.io-parser@5.2.3: {} - enhanced-resolve@5.18.3: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 @@ -20230,7 +20099,7 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 10.2.4 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -22656,6 +22525,10 @@ snapshots: dependencies: brace-expansion: 5.0.5 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + minimist@1.2.7: {} minimist@1.2.8: {} @@ -22768,8 +22641,8 @@ snapshots: dependencies: '@next/env': 16.2.3 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.10.8 - caniuse-lite: 1.0.30001786 + baseline-browser-mapping: 2.10.18 + caniuse-lite: 1.0.30001787 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -23775,7 +23648,7 @@ snapshots: react-clientside-effect@1.2.8(react@19.2.3): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.2 react: 19.2.3 react-compiler-runtime@19.1.0-rc.3(react@19.2.3): @@ -24344,6 +24217,14 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + optional: true + resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 @@ -24728,7 +24609,7 @@ snapshots: sharp@0.34.5: dependencies: - '@img/colour': 1.0.0 + '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.7.4 optionalDependencies: @@ -25459,7 +25340,7 @@ snapshots: tmcp@1.19.2(typescript@5.9.3): dependencies: - '@standard-schema/spec': 1.1.0 + '@standard-schema/spec': 1.0.0 json-rpc-2.0: 1.7.1 sqids: 0.3.0 uri-template-matcher: 1.1.2