-
- {titleText}
-
+ 'shadow-lg',
+ className,
+ )}
+ >
+
+ {titleText}
+
-
-
-
-
+
+
+
diff --git a/web/i18n/de-DE/common.ts b/web/i18n/de-DE/common.ts
index 9431fbbf6a..d64b295121 100644
--- a/web/i18n/de-DE/common.ts
+++ b/web/i18n/de-DE/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'Alles auswählen',
deSelectAll: 'Alle abwählen',
config: 'Konfiguration',
+ yes: 'Ja',
+ deleteConfirmTitle: 'Löschen?',
+ no: 'Nein',
+ confirmAction: 'Bitte bestätigen Sie Ihre Aktion.',
},
placeholder: {
input: 'Bitte eingeben',
diff --git a/web/i18n/es-ES/common.ts b/web/i18n/es-ES/common.ts
index 74af4a03b6..55c2c5e474 100644
--- a/web/i18n/es-ES/common.ts
+++ b/web/i18n/es-ES/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: 'Deseleccionar todo',
selectAll: 'Seleccionar todo',
config: 'Config',
+ confirmAction: 'Por favor, confirme su acción.',
+ deleteConfirmTitle: '¿Eliminar?',
+ yes: 'Sí',
+ no: 'No',
},
errorMsg: {
fieldRequired: '{{field}} es requerido',
diff --git a/web/i18n/fa-IR/common.ts b/web/i18n/fa-IR/common.ts
index dc6620ce2e..4d7482b143 100644
--- a/web/i18n/fa-IR/common.ts
+++ b/web/i18n/fa-IR/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'انتخاب همه',
deSelectAll: 'همه را انتخاب نکنید',
config: 'تنظیمات',
+ no: 'نه',
+ deleteConfirmTitle: 'حذف شود؟',
+ yes: 'بله',
+ confirmAction: 'لطفاً اقدام خود را تأیید کنید.',
},
errorMsg: {
fieldRequired: '{{field}} الزامی است',
diff --git a/web/i18n/fr-FR/common.ts b/web/i18n/fr-FR/common.ts
index f1e8ad007c..d2f1b6287a 100644
--- a/web/i18n/fr-FR/common.ts
+++ b/web/i18n/fr-FR/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: 'Désélectionner tout',
selectAll: 'Sélectionner tout',
config: 'Config',
+ no: 'Non',
+ confirmAction: 'Veuillez confirmer votre action.',
+ deleteConfirmTitle: 'Supprimer ?',
+ yes: 'Oui',
},
placeholder: {
input: 'Veuillez entrer',
diff --git a/web/i18n/hi-IN/common.ts b/web/i18n/hi-IN/common.ts
index d882b00929..acab7e9172 100644
--- a/web/i18n/hi-IN/common.ts
+++ b/web/i18n/hi-IN/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'सभी चुनें',
deSelectAll: 'सभी चयन हटाएँ',
config: 'कॉन्फ़िगरेशन',
+ no: 'नहीं',
+ yes: 'हाँ',
+ deleteConfirmTitle: 'हटाएं?',
+ confirmAction: 'कृपया अपनी क्रिया की पुष्टि करें।',
},
errorMsg: {
fieldRequired: '{{field}} आवश्यक है',
diff --git a/web/i18n/id-ID/common.ts b/web/i18n/id-ID/common.ts
index b224f153f6..e57b9b3641 100644
--- a/web/i18n/id-ID/common.ts
+++ b/web/i18n/id-ID/common.ts
@@ -67,6 +67,10 @@ const translation = {
sure: 'Saya yakin',
imageCopied: 'Gambar yang disalin',
config: 'Konfigurasi',
+ deleteConfirmTitle: 'Hapus?',
+ confirmAction: 'Silakan konfirmasi tindakan Anda.',
+ yes: 'Ya',
+ no: 'Tidak',
},
errorMsg: {
urlError: 'URL harus dimulai dengan http:// atau https://',
diff --git a/web/i18n/it-IT/common.ts b/web/i18n/it-IT/common.ts
index 4ba4f34240..14f705301a 100644
--- a/web/i18n/it-IT/common.ts
+++ b/web/i18n/it-IT/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'Seleziona tutto',
deSelectAll: 'Deseleziona tutto',
config: 'Config',
+ no: 'No',
+ yes: 'Sì',
+ confirmAction: 'Per favore conferma la tua azione.',
+ deleteConfirmTitle: 'Eliminare?',
},
errorMsg: {
fieldRequired: '{{field}} è obbligatorio',
diff --git a/web/i18n/ko-KR/common.ts b/web/i18n/ko-KR/common.ts
index 9d2948c594..617c0851c8 100644
--- a/web/i18n/ko-KR/common.ts
+++ b/web/i18n/ko-KR/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: '모두 선택',
deSelectAll: '모두 선택 해제',
config: '구성',
+ no: '아니요',
+ yes: '네',
+ deleteConfirmTitle: '삭제하시겠습니까?',
+ confirmAction: '귀하의 행동을 확인해 주세요.',
},
placeholder: {
input: '입력해주세요',
diff --git a/web/i18n/pl-PL/common.ts b/web/i18n/pl-PL/common.ts
index 3f820e14e0..5fa05d3ce4 100644
--- a/web/i18n/pl-PL/common.ts
+++ b/web/i18n/pl-PL/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: 'Odznacz wszystkie',
selectAll: 'Zaznacz wszystkie',
config: 'Konfiguracja',
+ yes: 'Tak',
+ no: 'Nie',
+ deleteConfirmTitle: 'Usunąć?',
+ confirmAction: 'Proszę potwierdzić swoją akcję.',
},
placeholder: {
input: 'Proszę wprowadzić',
diff --git a/web/i18n/pt-BR/common.ts b/web/i18n/pt-BR/common.ts
index 3f5f353fb6..918bc24bf8 100644
--- a/web/i18n/pt-BR/common.ts
+++ b/web/i18n/pt-BR/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: 'Desmarcar tudo',
selectAll: 'Selecionar tudo',
config: 'Configuração',
+ no: 'Não',
+ yes: 'Sim',
+ deleteConfirmTitle: 'Excluir?',
+ confirmAction: 'Por favor, confirme sua ação.',
},
placeholder: {
input: 'Por favor, insira',
diff --git a/web/i18n/ro-RO/common.ts b/web/i18n/ro-RO/common.ts
index 2e36e487fb..1a2f7f98c3 100644
--- a/web/i18n/ro-RO/common.ts
+++ b/web/i18n/ro-RO/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: 'Deselectați tot',
selectAll: 'Selectați tot',
config: 'Configurație',
+ yes: 'Da',
+ deleteConfirmTitle: 'Ștergere?',
+ no: 'Nu',
+ confirmAction: 'Vă rugăm să confirmați acțiunea dumneavoastră.',
},
placeholder: {
input: 'Vă rugăm să introduceți',
diff --git a/web/i18n/ru-RU/common.ts b/web/i18n/ru-RU/common.ts
index 8f1fb3a51b..de5ff494a6 100644
--- a/web/i18n/ru-RU/common.ts
+++ b/web/i18n/ru-RU/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'Выбрать все',
deSelectAll: 'Снять выделение со всех',
config: 'Конфигурация',
+ yes: 'Да',
+ no: 'Нет',
+ deleteConfirmTitle: 'Удалить?',
+ confirmAction: 'Пожалуйста, подтвердите ваше действие.',
},
errorMsg: {
fieldRequired: '{{field}} обязательно',
diff --git a/web/i18n/sl-SI/common.ts b/web/i18n/sl-SI/common.ts
index 2efd6f8de6..169d0997f6 100644
--- a/web/i18n/sl-SI/common.ts
+++ b/web/i18n/sl-SI/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'Izberi vse',
deSelectAll: 'Odberi vse',
config: 'Konfiguracija',
+ no: 'Ne',
+ confirmAction: 'Prosimo, potrdite svoje dejanje.',
+ deleteConfirmTitle: 'Izbrisati?',
+ yes: 'Da',
},
errorMsg: {
fieldRequired: '{{field}} je obvezno',
diff --git a/web/i18n/th-TH/common.ts b/web/i18n/th-TH/common.ts
index a673629d3e..4149843371 100644
--- a/web/i18n/th-TH/common.ts
+++ b/web/i18n/th-TH/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'เลือกทั้งหมด',
deSelectAll: 'ยกเลิกการเลือกทั้งหมด',
config: 'การตั้งค่า',
+ no: 'ไม่',
+ deleteConfirmTitle: 'ลบหรือไม่?',
+ confirmAction: 'กรุณายืนยันการกระทำของคุณ',
+ yes: 'ใช่',
},
errorMsg: {
fieldRequired: '{{field}} เป็นสิ่งจําเป็น',
diff --git a/web/i18n/tr-TR/common.ts b/web/i18n/tr-TR/common.ts
index b198bd5d63..14b4689419 100644
--- a/web/i18n/tr-TR/common.ts
+++ b/web/i18n/tr-TR/common.ts
@@ -61,6 +61,10 @@ const translation = {
selectAll: 'Hepsini Seç',
deSelectAll: 'Hepsini Seçme',
config: 'Konfigürasyon',
+ no: 'Hayır',
+ yes: 'Evet',
+ deleteConfirmTitle: 'Silinsin mi?',
+ confirmAction: 'Lütfen işleminizi onaylayın.',
},
errorMsg: {
fieldRequired: '{{field}} gereklidir',
diff --git a/web/i18n/uk-UA/common.ts b/web/i18n/uk-UA/common.ts
index 69af3cc2db..ef9bccd7ff 100644
--- a/web/i18n/uk-UA/common.ts
+++ b/web/i18n/uk-UA/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: 'Вимкнути все',
selectAll: 'Вибрати все',
config: 'Конфігурація',
+ yes: 'Так',
+ no: 'Ні',
+ deleteConfirmTitle: 'Видалити?',
+ confirmAction: 'Будь ласка, підтвердіть свої дії.',
},
placeholder: {
input: 'Будь ласка, введіть текст',
diff --git a/web/i18n/vi-VN/common.ts b/web/i18n/vi-VN/common.ts
index 216a2e2ed2..e9e1f17f56 100644
--- a/web/i18n/vi-VN/common.ts
+++ b/web/i18n/vi-VN/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: 'Bỏ chọn tất cả',
selectAll: 'Chọn Tất Cả',
config: 'Cấu hình',
+ no: 'Không',
+ yes: 'Vâng',
+ deleteConfirmTitle: 'Xóa?',
+ confirmAction: 'Vui lòng xác nhận hành động của bạn.',
},
placeholder: {
input: 'Vui lòng nhập',
diff --git a/web/i18n/zh-Hant/common.ts b/web/i18n/zh-Hant/common.ts
index a5747ba300..273ecb010f 100644
--- a/web/i18n/zh-Hant/common.ts
+++ b/web/i18n/zh-Hant/common.ts
@@ -61,6 +61,10 @@ const translation = {
deSelectAll: '全不選',
selectAll: '全選',
config: '配置',
+ yes: '是',
+ confirmAction: '請確認您的操作。',
+ deleteConfirmTitle: '刪除?',
+ no: '不',
},
placeholder: {
input: '請輸入',
diff --git a/web/jest.config.ts b/web/jest.config.ts
index ebeb2f7d7e..6c2d88448c 100644
--- a/web/jest.config.ts
+++ b/web/jest.config.ts
@@ -160,7 +160,11 @@ const config: Config = {
testEnvironment: '@happy-dom/jest-environment',
// Options that will be passed to the testEnvironment
- // testEnvironmentOptions: {},
+ testEnvironmentOptions: {
+ // Match happy-dom's default to ensure Node.js environment resolution
+ // This prevents ESM packages like uuid from using browser exports
+ customExportConditions: ['node', 'node-addons'],
+ },
// Adds a location field to test results
// testLocationInResults: false,
@@ -189,10 +193,10 @@ const config: Config = {
// transform: undefined,
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
- // transformIgnorePatterns: [
- // "/node_modules/",
- // "\\.pnp\\.[^\\/]+$"
- // ],
+ // For pnpm: allow transforming uuid ESM package
+ transformIgnorePatterns: [
+ 'node_modules/(?!(.pnpm|uuid))',
+ ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
diff --git a/web/package.json b/web/package.json
index a5cfd387f7..33ba0dc5a4 100644
--- a/web/package.json
+++ b/web/package.json
@@ -143,7 +143,7 @@
"@babel/core": "^7.28.3",
"@chromatic-com/storybook": "^3.1.0",
"@eslint-react/eslint-plugin": "^1.15.0",
- "@happy-dom/jest-environment": "^17.4.4",
+ "@happy-dom/jest-environment": "^20.0.0",
"@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "15.5.4",
diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml
index 0a45f14ba0..2fcd0f17b1 100644
--- a/web/pnpm-lock.yaml
+++ b/web/pnpm-lock.yaml
@@ -345,8 +345,8 @@ importers:
specifier: ^1.15.0
version: 1.52.3(eslint@9.35.0(jiti@2.6.0))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3)
'@happy-dom/jest-environment':
- specifier: ^17.4.4
- version: 17.6.3
+ specifier: ^20.0.0
+ version: 20.0.0(@jest/environment@29.7.0)(@jest/fake-timers@29.7.0)(@jest/types@29.6.3)(jest-mock@29.7.0)(jest-util@29.7.0)
'@mdx-js/loader':
specifier: ^3.1.0
version: 3.1.0(acorn@8.15.0)(webpack@5.100.2(esbuild@0.25.0)(uglify-js@3.19.3))
@@ -1644,9 +1644,15 @@ packages:
'@formatjs/intl-localematcher@0.5.10':
resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
- '@happy-dom/jest-environment@17.6.3':
- resolution: {integrity: sha512-HXuHKvpHLo9/GQ/yKMmKFyS1AYL2t9pL67+GfpYZfOAb29qD80EMozi50zRZk82KmNRBcA2A0/ErjpOwUxJrNg==}
+ '@happy-dom/jest-environment@20.0.0':
+ resolution: {integrity: sha512-dUyMDNJzPDFopSDyzKdbeYs8z9B4jLj9kXnru8TjYdGeLsQKf+6r0lq/9T2XVcu04QFxXMykt64A+KjsaJTaNA==}
engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@jest/environment': '>=25.0.0'
+ '@jest/fake-timers': '>=25.0.0'
+ '@jest/types': '>=25.0.0'
+ jest-mock: '>=25.0.0'
+ jest-util: '>=25.0.0'
'@headlessui/react@2.2.1':
resolution: {integrity: sha512-daiUqVLae8CKVjEVT19P/izW0aGK0GNhMSAeMlrDebKmoVZHcRRwbxzgtnEadUVDXyBsWo9/UH4KHeniO+0tMg==}
@@ -3416,6 +3422,9 @@ packages:
'@types/node@18.15.0':
resolution: {integrity: sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==}
+ '@types/node@20.19.20':
+ resolution: {integrity: sha512-2Q7WS25j4pS1cS8yw3d6buNCVJukOTeQ39bAnwR6sOJbaxvyCGebzTMypDFN82CxBLnl+lSWVdCCWbRY6y9yZQ==}
+
'@types/papaparse@5.3.16':
resolution: {integrity: sha512-T3VuKMC2H0lgsjI9buTB3uuKj3EMD2eap1MOuEQuBQ44EnDx/IkGhU6EwiTf9zG3za4SKlmwKAImdDKdNnCsXg==}
@@ -3475,6 +3484,9 @@ packages:
'@types/uuid@9.0.8':
resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
+ '@types/whatwg-mimetype@3.0.2':
+ resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
+
'@types/yargs-parser@21.0.3':
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
@@ -5542,8 +5554,8 @@ packages:
hachure-fill@0.5.2:
resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
- happy-dom@17.6.3:
- resolution: {integrity: sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==}
+ happy-dom@20.0.0:
+ resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==}
engines: {node: '>=20.0.0'}
has-flag@4.0.0:
@@ -8246,6 +8258,9 @@ packages:
engines: {node: '>=0.8.0'}
hasBin: true
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
unicode-canonical-property-names-ecmascript@2.0.1:
resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
engines: {node: '>=4'}
@@ -8472,10 +8487,6 @@ packages:
webidl-conversions@4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
- webidl-conversions@7.0.0:
- resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
- engines: {node: '>=12'}
-
webpack-bundle-analyzer@4.10.1:
resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==}
engines: {node: '>= 10.13.0'}
@@ -10105,12 +10116,12 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@happy-dom/jest-environment@17.6.3':
+ '@happy-dom/jest-environment@20.0.0(@jest/environment@29.7.0)(@jest/fake-timers@29.7.0)(@jest/types@29.6.3)(jest-mock@29.7.0)(jest-util@29.7.0)':
dependencies:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- happy-dom: 17.6.3
+ happy-dom: 20.0.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -12201,6 +12212,10 @@ snapshots:
'@types/node@18.15.0': {}
+ '@types/node@20.19.20':
+ dependencies:
+ undici-types: 6.21.0
+
'@types/papaparse@5.3.16':
dependencies:
'@types/node': 18.15.0
@@ -12255,6 +12270,8 @@ snapshots:
'@types/uuid@9.0.8': {}
+ '@types/whatwg-mimetype@3.0.2': {}
+
'@types/yargs-parser@21.0.3': {}
'@types/yargs@17.0.33':
@@ -14709,9 +14726,10 @@ snapshots:
hachure-fill@0.5.2: {}
- happy-dom@17.6.3:
+ happy-dom@20.0.0:
dependencies:
- webidl-conversions: 7.0.0
+ '@types/node': 20.19.20
+ '@types/whatwg-mimetype': 3.0.2
whatwg-mimetype: 3.0.0
has-flag@4.0.0: {}
@@ -18125,6 +18143,8 @@ snapshots:
uglify-js@3.19.3: {}
+ undici-types@6.21.0: {}
+
unicode-canonical-property-names-ecmascript@2.0.1: {}
unicode-match-property-ecmascript@2.0.0:
@@ -18351,8 +18371,6 @@ snapshots:
webidl-conversions@4.0.2: {}
- webidl-conversions@7.0.0: {}
-
webpack-bundle-analyzer@4.10.1:
dependencies:
'@discoveryjs/json-ext': 0.5.7