feat(i18n): language switcher in the profile menu - #224
Merged
Conversation
Completes the i18n MVP loop from the foundation (#222): users can now actually pick a language. A LanguageSwitcher submenu in the profile dropdown lists the supported locales (native names), checks the active one, sets the `locale` cookie (which the proxy reads above Accept-Language), and reloads so the server re-renders with the new x-locale. Its own label is translated (common.language), demonstrating the t() path end-to-end.
0xmanhnv
added a commit
that referenced
this pull request
Aug 3, 2026
* deps(npm): bump the nextjs group with 13 updates
Bumps the nextjs group with 13 updates:
| Package | From | To |
| --- | --- | --- |
| [next](https://github.com/vercel/next.js) | `16.2.9` | `16.2.10` |
| [@next/bundle-analyzer](https://github.com/vercel/next.js/tree/HEAD/packages/next-bundle-analyzer) | `16.2.9` | `16.2.10` |
| [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `16.2.9` | `16.2.10` |
| [@next/env](https://github.com/vercel/next.js/tree/HEAD/packages/next-env) | `16.2.9` | `16.2.10` |
| [@next/eslint-plugin-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-plugin-next) | `16.2.9` | `16.2.10` |
| [@next/swc-darwin-arm64](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/darwin-arm64) | `16.2.9` | `16.2.10` |
| [@next/swc-darwin-x64](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/darwin-x64) | `16.2.9` | `16.2.10` |
| [@next/swc-linux-arm64-gnu](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/linux-arm64-gnu) | `16.2.9` | `16.2.10` |
| [@next/swc-linux-arm64-musl](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/linux-arm64-musl) | `16.2.9` | `16.2.10` |
| [@next/swc-linux-x64-gnu](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/linux-x64-gnu) | `16.2.9` | `16.2.10` |
| [@next/swc-linux-x64-musl](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/linux-x64-musl) | `16.2.9` | `16.2.10` |
| [@next/swc-win32-arm64-msvc](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/win32-arm64-msvc) | `16.2.9` | `16.2.10` |
| [@next/swc-win32-x64-msvc](https://github.com/vercel/next.js/tree/HEAD/crates/next-napi-bindings/npm/win32-x64-msvc) | `16.2.9` | `16.2.10` |
Updates `next` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/compare/v16.2.9...v16.2.10)
Updates `@next/bundle-analyzer` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/packages/next-bundle-analyzer)
Updates `eslint-config-next` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/packages/eslint-config-next)
Updates `@next/env` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/packages/next-env)
Updates `@next/eslint-plugin-next` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/packages/eslint-plugin-next)
Updates `@next/swc-darwin-arm64` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/darwin-arm64)
Updates `@next/swc-darwin-x64` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/darwin-x64)
Updates `@next/swc-linux-arm64-gnu` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/linux-arm64-gnu)
Updates `@next/swc-linux-arm64-musl` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/linux-arm64-musl)
Updates `@next/swc-linux-x64-gnu` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/linux-x64-gnu)
Updates `@next/swc-linux-x64-musl` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/linux-x64-musl)
Updates `@next/swc-win32-arm64-msvc` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/win32-arm64-msvc)
Updates `@next/swc-win32-x64-msvc` from 16.2.9 to 16.2.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/commits/v16.2.10/crates/next-napi-bindings/npm/win32-x64-msvc)
---
updated-dependencies:
- dependency-name: next
dependency-version: 16.2.10
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/bundle-analyzer"
dependency-version: 16.2.10
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: eslint-config-next
dependency-version: 16.2.10
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/env"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/eslint-plugin-next"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-darwin-arm64"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-darwin-x64"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-linux-arm64-gnu"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-linux-arm64-musl"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-linux-x64-gnu"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-linux-x64-musl"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-win32-arm64-msvc"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
- dependency-name: "@next/swc-win32-x64-msvc"
dependency-version: 16.2.10
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: nextjs
...
Signed-off-by: dependabot[bot] <support@github.com>
* deps(npm): bump the linting group with 2 updates
Bumps the linting group with 2 updates: [prettier](https://github.com/prettier/prettier) and [eslint-module-utils](https://github.com/import-js/eslint-plugin-import/tree/HEAD/utils).
Updates `prettier` from 3.9.1 to 3.9.4
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.1...3.9.4)
Updates `eslint-module-utils` from 2.13.0 to 2.14.0
- [Release notes](https://github.com/import-js/eslint-plugin-import/releases)
- [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/utils/CHANGELOG.md)
- [Commits](https://github.com/import-js/eslint-plugin-import/commits/v2.14.0/utils)
---
updated-dependencies:
- dependency-name: prettier
dependency-version: 3.9.4
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: linting
- dependency-name: eslint-module-utils
dependency-version: 2.14.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: linting
...
Signed-off-by: dependabot[bot] <support@github.com>
* deps(npm): bump the tailwind group with 16 updates
Bumps the tailwind group with 16 updates:
| Package | From | To |
| --- | --- | --- |
| [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) | `4.3.1` | `4.3.2` |
| [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) | `4.3.1` | `4.3.2` |
| [@tailwindcss/node](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-node) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-android-arm64](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/android-arm64) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-darwin-arm64](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/darwin-arm64) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-darwin-x64](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/darwin-x64) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-freebsd-x64](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/freebsd-x64) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-linux-arm-gnueabihf](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/linux-arm-gnueabihf) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-linux-arm64-gnu](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/linux-arm64-gnu) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-linux-arm64-musl](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/linux-arm64-musl) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-linux-x64-gnu](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/linux-x64-gnu) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-linux-x64-musl](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/linux-x64-musl) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-wasm32-wasi](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-win32-arm64-msvc](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/win32-arm64-msvc) | `4.3.1` | `4.3.2` |
| [@tailwindcss/oxide-win32-x64-msvc](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/crates/node/npm/win32-x64-msvc) | `4.3.1` | `4.3.2` |
Updates `@tailwindcss/postcss` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/packages/@tailwindcss-postcss)
Updates `tailwindcss` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/packages/tailwindcss)
Updates `@tailwindcss/node` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/packages/@tailwindcss-node)
Updates `@tailwindcss/oxide` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node)
Updates `@tailwindcss/oxide-android-arm64` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/android-arm64)
Updates `@tailwindcss/oxide-darwin-arm64` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/darwin-arm64)
Updates `@tailwindcss/oxide-darwin-x64` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/darwin-x64)
Updates `@tailwindcss/oxide-freebsd-x64` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/freebsd-x64)
Updates `@tailwindcss/oxide-linux-arm-gnueabihf` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/linux-arm-gnueabihf)
Updates `@tailwindcss/oxide-linux-arm64-gnu` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/linux-arm64-gnu)
Updates `@tailwindcss/oxide-linux-arm64-musl` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/linux-arm64-musl)
Updates `@tailwindcss/oxide-linux-x64-gnu` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/linux-x64-gnu)
Updates `@tailwindcss/oxide-linux-x64-musl` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/linux-x64-musl)
Updates `@tailwindcss/oxide-wasm32-wasi` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node)
Updates `@tailwindcss/oxide-win32-arm64-msvc` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/win32-arm64-msvc)
Updates `@tailwindcss/oxide-win32-x64-msvc` from 4.3.1 to 4.3.2
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/crates/node/npm/win32-x64-msvc)
---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
dependency-version: 4.3.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: tailwindcss
dependency-version: 4.3.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/node"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-android-arm64"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-darwin-arm64"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-darwin-x64"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-freebsd-x64"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-linux-arm-gnueabihf"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-linux-arm64-gnu"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-linux-arm64-musl"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-linux-x64-gnu"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-linux-x64-musl"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-wasm32-wasi"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-win32-arm64-msvc"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
- dependency-name: "@tailwindcss/oxide-win32-x64-msvc"
dependency-version: 4.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: tailwind
...
Signed-off-by: dependabot[bot] <support@github.com>
* deps(npm): bump the radix-ui group with 35 updates
Bumps the radix-ui group with 35 updates:
| Package | From | To |
| --- | --- | --- |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.14` | `1.2.15` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.17` | `1.1.18` |
| [@radix-ui/react-aspect-ratio](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/aspect-ratio) | `1.1.10` | `1.1.11` |
| [@radix-ui/react-avatar](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/avatar) | `1.2.0` | `1.2.1` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.5` | `1.3.6` |
| [@radix-ui/react-context-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/context-menu) | `2.3.1` | `2.3.2` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.17` | `1.1.18` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.18` | `2.1.19` |
| [@radix-ui/react-hover-card](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/hover-card) | `1.1.17` | `1.1.18` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.10` | `2.1.11` |
| [@radix-ui/react-menubar](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/menubar) | `1.1.18` | `1.1.19` |
| [@radix-ui/react-navigation-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/navigation-menu) | `1.2.16` | `1.2.17` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.17` | `1.1.18` |
| [@radix-ui/react-progress](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/progress) | `1.1.10` | `1.1.11` |
| [@radix-ui/react-radio-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/radio-group) | `1.4.1` | `1.4.2` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.12` | `1.2.13` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.1` | `2.3.2` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.10` | `1.1.11` |
| [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.1` | `1.4.2` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.1` | `1.3.2` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-toggle-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle-group) | `1.1.13` | `1.1.14` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.10` | `1.2.11` |
| [@radix-ui/react-arrow](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/arrow) | `1.1.10` | `1.1.11` |
| [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/collapsible) | `1.1.14` | `1.1.15` |
| [@radix-ui/react-collection](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/collection) | `1.1.10` | `1.1.11` |
| [@radix-ui/react-dismissable-layer](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dismissable-layer) | `1.1.13` | `1.1.14` |
| [@radix-ui/react-focus-scope](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/focus-scope) | `1.1.10` | `1.1.11` |
| [@radix-ui/react-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/menu) | `2.1.18` | `2.1.19` |
| [@radix-ui/react-popper](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popper) | `1.3.1` | `1.3.2` |
| [@radix-ui/react-portal](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/portal) | `1.1.12` | `1.1.13` |
| [@radix-ui/react-primitive](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/primitive) | `2.1.6` | `2.1.7` |
| [@radix-ui/react-roving-focus](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/roving-focus) | `1.1.13` | `1.1.14` |
| [@radix-ui/react-toggle](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle) | `1.1.12` | `1.1.13` |
| [@radix-ui/react-visually-hidden](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/visually-hidden) | `1.2.6` | `1.2.7` |
Updates `@radix-ui/react-accordion` from 1.2.14 to 1.2.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)
Updates `@radix-ui/react-alert-dialog` from 1.1.17 to 1.1.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)
Updates `@radix-ui/react-aspect-ratio` from 1.1.10 to 1.1.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/aspect-ratio/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/aspect-ratio)
Updates `@radix-ui/react-avatar` from 1.2.0 to 1.2.1
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/avatar/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/avatar)
Updates `@radix-ui/react-checkbox` from 1.3.5 to 1.3.6
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)
Updates `@radix-ui/react-context-menu` from 2.3.1 to 2.3.2
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/context-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/context-menu)
Updates `@radix-ui/react-dialog` from 1.1.17 to 1.1.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)
Updates `@radix-ui/react-dropdown-menu` from 2.1.18 to 2.1.19
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)
Updates `@radix-ui/react-hover-card` from 1.1.17 to 1.1.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/hover-card/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/hover-card)
Updates `@radix-ui/react-label` from 2.1.10 to 2.1.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)
Updates `@radix-ui/react-menubar` from 1.1.18 to 1.1.19
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/menubar/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/menubar)
Updates `@radix-ui/react-navigation-menu` from 1.2.16 to 1.2.17
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/navigation-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/navigation-menu)
Updates `@radix-ui/react-popover` from 1.1.17 to 1.1.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)
Updates `@radix-ui/react-progress` from 1.1.10 to 1.1.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/progress/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/progress)
Updates `@radix-ui/react-radio-group` from 1.4.1 to 1.4.2
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/radio-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/radio-group)
Updates `@radix-ui/react-scroll-area` from 1.2.12 to 1.2.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)
Updates `@radix-ui/react-select` from 2.3.1 to 2.3.2
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)
Updates `@radix-ui/react-separator` from 1.1.10 to 1.1.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)
Updates `@radix-ui/react-slider` from 1.4.1 to 1.4.2
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)
Updates `@radix-ui/react-switch` from 1.3.1 to 1.3.2
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)
Updates `@radix-ui/react-tabs` from 1.1.15 to 1.1.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)
Updates `@radix-ui/react-toggle-group` from 1.1.13 to 1.1.14
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toggle-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toggle-group)
Updates `@radix-ui/react-tooltip` from 1.2.10 to 1.2.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)
Updates `@radix-ui/react-arrow` from 1.1.10 to 1.1.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/arrow/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/arrow)
Updates `@radix-ui/react-collapsible` from 1.1.14 to 1.1.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/collapsible/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/collapsible)
Updates `@radix-ui/react-collection` from 1.1.10 to 1.1.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/collection/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/collection)
Updates `@radix-ui/react-dismissable-layer` from 1.1.13 to 1.1.14
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dismissable-layer/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dismissable-layer)
Updates `@radix-ui/react-focus-scope` from 1.1.10 to 1.1.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/focus-scope/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/focus-scope)
Updates `@radix-ui/react-menu` from 2.1.18 to 2.1.19
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/menu)
Updates `@radix-ui/react-popper` from 1.3.1 to 1.3.2
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popper/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popper)
Updates `@radix-ui/react-portal` from 1.1.12 to 1.1.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/portal/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/portal)
Updates `@radix-ui/react-primitive` from 2.1.6 to 2.1.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/primitive/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/primitive)
Updates `@radix-ui/react-roving-focus` from 1.1.13 to 1.1.14
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/roving-focus/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/roving-focus)
Updates `@radix-ui/react-toggle` from 1.1.12 to 1.1.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toggle/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toggle)
Updates `@radix-ui/react-visually-hidden` from 1.2.6 to 1.2.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/visually-hidden/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/visually-hidden)
---
updated-dependencies:
- dependency-name: "@radix-ui/react-accordion"
dependency-version: 1.2.15
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-alert-dialog"
dependency-version: 1.1.18
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-aspect-ratio"
dependency-version: 1.1.11
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-avatar"
dependency-version: 1.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-checkbox"
dependency-version: 1.3.6
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-context-menu"
dependency-version: 2.3.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dialog"
dependency-version: 1.1.18
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dropdown-menu"
dependency-version: 2.1.19
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-hover-card"
dependency-version: 1.1.18
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-label"
dependency-version: 2.1.11
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-menubar"
dependency-version: 1.1.19
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-navigation-menu"
dependency-version: 1.2.17
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-popover"
dependency-version: 1.1.18
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-progress"
dependency-version: 1.1.11
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-radio-group"
dependency-version: 1.4.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-scroll-area"
dependency-version: 1.2.13
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-select"
dependency-version: 2.3.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-separator"
dependency-version: 1.1.11
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-slider"
dependency-version: 1.4.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-switch"
dependency-version: 1.3.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tabs"
dependency-version: 1.1.16
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toggle-group"
dependency-version: 1.1.14
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tooltip"
dependency-version: 1.2.11
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-arrow"
dependency-version: 1.1.11
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-collapsible"
dependency-version: 1.1.15
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-collection"
dependency-version: 1.1.11
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dismissable-layer"
dependency-version: 1.1.14
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-focus-scope"
dependency-version: 1.1.11
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-menu"
dependency-version: 2.1.19
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-popper"
dependency-version: 1.3.2
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-portal"
dependency-version: 1.1.13
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-primitive"
dependency-version: 2.1.7
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-roving-focus"
dependency-version: 1.1.14
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toggle"
dependency-version: 1.1.13
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
- dependency-name: "@radix-ui/react-visually-hidden"
dependency-version: 1.2.7
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: radix-ui
...
Signed-off-by: dependabot[bot] <support@github.com>
* feat(nav): surface Attack Paths in Prioritization + harden coverage card
- The /attack-paths page (Attack Path Analysis — asset reachability scoring via
the real useAttackPathScoring hook, 445 lines, production-complete) was built
but had no sidebar entry, so users couldn't reach it. Wire it into
Prioritization next to Exposure Chains (icon Waypoints) + route-permission.
A pre-release orphan-route triage confirmed this is the only complete,
real-data feature page that was unreachable (the rest are dashboard-stats
facades or Coming-Soon stubs, deliberately left out).
- ValidationCoverageCard: guard sortBands(data.by_severity ?? []) so the card
can't crash if the API omits by_severity while total > 0.
* feat(i18n): lightweight translation layer (en/vi) on the existing locale scaffold
The app already detects locale (proxy → x-locale header → layout) and drives RTL
direction, but there was no translation layer — every string was hardcoded English.
This wires a dependency-free t() mechanism that can be filled in incrementally.
- src/lib/i18n.ts: getDictionary(locale) + translate(dict, key, fallback?, vars?)
with `{var}` interpolation and en-fallback (a key missing only from a non-en
catalog still renders sensible text). Catalogs: dictionaries/en.json + vi.json
(ar falls back to en; its RTL is already handled).
- I18nProvider + useTranslation() — locale resolved server-side and threaded
through layout → Providers so first paint matches the detected language.
- Pilot: sidebar group titles render via t() (English string as fallback, so
sidebar-data.ts is unchanged and untranslated items degrade gracefully).
- Unit test: locale lookup, en-fallback, key-fallback, interpolation, ar→en,
region-stripping, and RTL-still-from-locale.
Chosen custom-over-next-intl for a zero-dependency, fully-incremental foundation;
next-intl remains a clean future migration if ICU features are needed.
* deps(npm): bump the minor-patch group across 1 directory with 31 updates
Bumps the minor-patch group with 11 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) | `10.62.0` | `10.63.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.80.0` | `7.81.0` |
| [recharts](https://github.com/recharts/recharts) | `3.9.0` | `3.9.2` |
| [baseline-browser-mapping](https://github.com/web-platform-dx/baseline-browser-mapping) | `2.10.40` | `2.10.42` |
| [caniuse-lite](https://github.com/browserslist/caniuse-lite) | `1.0.30001799` | `1.0.30001800` |
| [electron-to-chromium](https://github.com/Kilian/electron-to-chromium) | `1.5.380` | `1.5.387` |
| [fast-uri](https://github.com/fastify/fast-uri) | `3.1.2` | `3.1.3` |
| [oxc-resolver](https://github.com/oxc-project/oxc-resolver) | `11.21.3` | `11.23.0` |
| [tldts](https://github.com/remusao/tldts) | `7.4.5` | `7.4.6` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.62.0` | `8.62.1` |
| [webpack](https://github.com/webpack/webpack) | `5.108.1` | `5.108.4` |
Updates `@sentry/nextjs` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `react-hook-form` from 7.80.0 to 7.81.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.80.0...v7.81.0)
Updates `recharts` from 3.9.0 to 3.9.2
- [Release notes](https://github.com/recharts/recharts/releases)
- [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md)
- [Commits](https://github.com/recharts/recharts/compare/v3.9.0...v3.9.2)
Updates `@apm-js-collab/tracing-hooks` from 0.10.0 to 0.10.1
- [Release notes](https://github.com/apm-js-collab/tracing-hooks/releases)
- [Changelog](https://github.com/apm-js-collab/tracing-hooks/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apm-js-collab/tracing-hooks/compare/tracing-hooks-v0.10.0...tracing-hooks-v0.10.1)
Updates `@opentelemetry/core` from 2.8.0 to 2.9.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-js/compare/v2.8.0...v2.9.0)
Updates `@opentelemetry/resources` from 2.8.0 to 2.9.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-js/compare/v2.8.0...v2.9.0)
Updates `@opentelemetry/sdk-trace-base` from 2.8.0 to 2.9.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-js/compare/v2.8.0...v2.9.0)
Updates `immer` from 10.2.0 to 11.1.11
- [Release notes](https://github.com/immerjs/immer/releases)
- [Commits](https://github.com/immerjs/immer/compare/v10.2.0...v11.1.11)
Updates `@sentry/browser` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/browser-utils` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/core` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/feedback` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/node` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/node-core` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/opentelemetry` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/react` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/replay` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/replay-canvas` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/server-utils` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `@sentry/vercel-edge` from 10.62.0 to 10.63.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.63.0)
Updates `baseline-browser-mapping` from 2.10.40 to 2.10.42
- [Release notes](https://github.com/web-platform-dx/baseline-browser-mapping/releases)
- [Commits](https://github.com/web-platform-dx/baseline-browser-mapping/compare/v2.10.40...v2.10.42)
Updates `caniuse-lite` from 1.0.30001799 to 1.0.30001800
- [Commits](https://github.com/browserslist/caniuse-lite/compare/1.0.30001799...1.0.30001800)
Updates `electron-to-chromium` from 1.5.380 to 1.5.387
- [Changelog](https://github.com/Kilian/electron-to-chromium/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Kilian/electron-to-chromium/compare/v1.5.380...v1.5.387)
Updates `es-module-lexer` from 2.1.0 to 2.3.0
- [Release notes](https://github.com/guybedford/es-module-lexer/releases)
- [Commits](https://github.com/guybedford/es-module-lexer/compare/2.1.0...2.3.0)
Updates `fast-uri` from 3.1.2 to 3.1.3
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.3)
Updates `import-in-the-middle` from 3.2.0 to 3.3.0
- [Release notes](https://github.com/nodejs/import-in-the-middle/releases)
- [Changelog](https://github.com/nodejs/import-in-the-middle/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nodejs/import-in-the-middle/compare/import-in-the-middle-v3.2.0...import-in-the-middle-v3.3.0)
Updates `oxc-resolver` from 11.21.3 to 11.23.0
- [Release notes](https://github.com/oxc-project/oxc-resolver/releases)
- [Changelog](https://github.com/oxc-project/oxc-resolver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc-resolver/compare/v11.21.3...v11.23.0)
Updates `tldts` from 7.4.5 to 7.4.6
- [Release notes](https://github.com/remusao/tldts/releases)
- [Changelog](https://github.com/remusao/tldts/blob/master/CHANGELOG.md)
- [Commits](https://github.com/remusao/tldts/compare/v7.4.5...v7.4.6)
Updates `tldts-core` from 7.4.5 to 7.4.6
- [Release notes](https://github.com/remusao/tldts/releases)
- [Changelog](https://github.com/remusao/tldts/blob/master/CHANGELOG.md)
- [Commits](https://github.com/remusao/tldts/compare/v7.4.5...v7.4.6)
Updates `typescript-eslint` from 8.62.0 to 8.62.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/typescript-eslint)
Updates `webpack` from 5.108.1 to 5.108.4
- [Release notes](https://github.com/webpack/webpack/releases)
- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack/compare/v5.108.1...v5.108.4)
---
updated-dependencies:
- dependency-name: "@sentry/nextjs"
dependency-version: 10.63.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: react-hook-form
dependency-version: 7.81.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: recharts
dependency-version: 3.9.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: "@apm-js-collab/tracing-hooks"
dependency-version: 0.10.1
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: "@opentelemetry/core"
dependency-version: 2.9.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@opentelemetry/resources"
dependency-version: 2.9.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@opentelemetry/sdk-trace-base"
dependency-version: 2.9.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: immer
dependency-version: 11.1.11
dependency-type: indirect
update-type: version-update:semver-major
dependency-group: minor-patch
- dependency-name: "@sentry/browser"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/browser-utils"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/core"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/feedback"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/node"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/node-core"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/opentelemetry"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/react"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/replay"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/replay-canvas"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/server-utils"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: "@sentry/vercel-edge"
dependency-version: 10.63.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: baseline-browser-mapping
dependency-version: 2.10.42
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: caniuse-lite
dependency-version: 1.0.30001800
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: electron-to-chromium
dependency-version: 1.5.387
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: es-module-lexer
dependency-version: 2.3.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: fast-uri
dependency-version: 3.1.3
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: import-in-the-middle
dependency-version: 3.3.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: oxc-resolver
dependency-version: 11.23.0
dependency-type: indirect
update-type: version-update:semver-minor
dependency-group: minor-patch
- dependency-name: tldts
dependency-version: 7.4.6
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: tldts-core
dependency-version: 7.4.6
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: typescript-eslint
dependency-version: 8.62.1
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
- dependency-name: webpack
dependency-version: 5.108.4
dependency-type: indirect
update-type: version-update:semver-patch
dependency-group: minor-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* feat(i18n): language switcher in the profile menu
Completes the i18n MVP loop from the foundation (#222): users can now actually
pick a language. A LanguageSwitcher submenu in the profile dropdown lists the
supported locales (native names), checks the active one, sets the `locale`
cookie (which the proxy reads above Accept-Language), and reloads so the server
re-renders with the new x-locale. Its own label is translated (common.language),
demonstrating the t() path end-to-end.
* fix(export): warn when "export all" is truncated at the page cap
fetchAllPages / fetchAllAssets stop at a hard maxPages cap (~50k rows) to avoid a
runaway loop, but silently returned the partial set — the success toast then
claimed "Exported N rows" as if complete, so a tenant with >50k rows exported an
incomplete CSV believing it was whole.
Both now invoke an onTruncated callback when the cap cuts the result short, and
the export handlers (assets, exposures, components, remediation) surface a
warning toast ("Export limited to the first N … — refine filters to export the
rest"). No truncation → no callback, unchanged behaviour. Adds fetchAllPages
unit tests for the truncated and non-truncated paths.
* feat(i18n): translate all sidebar item labels (Vietnamese)
Extends the i18n foundation (#222) + switcher (#224): the entire sidebar now
localizes, not just the group titles. Adds 95 nav.item.* entries to en + vi
(acronyms/technical terms — API, CI/CD, SBOM, SCIM, SAML, SIEM, MITRE, K8s — kept)
and a NavLabel component that renders each menu item's label via t() with the
English title as fallback (so untranslated items degrade gracefully). Also adds
a catalog-parity test guarding that en and vi keep identical, non-empty keys.
Switch to Tiếng Việt → the whole sidebar reads Bề mặt tấn công / Kho tài sản /
Phát hiện / Kiểm chứng / … Tooltips stay English for now (follow-up).
* fix(shared): break barrel self-import cycle (undefined component on /crown-jewels)
coming-soon-page.tsx is part of the @/features/shared barrel yet imported
PageHeader FROM '@/features/shared' — a circular dependency through the barrel.
Under Turbopack that leaves some barrel exports (e.g. RiskScoreBadge) undefined
at module-init depending on load order, which crashed the crown-jewels table
cell with 'Element type is invalid ... got: undefined'.
Import PageHeader directly from './page-header' to break the cycle. No other
shared component self-imports the barrel.
* feat(assets): make criticality / scope / exposure editable on every asset form
The asset deep-dive found the headline CTEM classification fields were shown but
not settable: the shared asset form hardcoded criticality='medium',
scope='internal', exposure='unknown' on create and never sent them on update —
even though the API accepts them. So an operator could not mark an asset
critical or set its exposure; those fields were backend-inference-only.
- AssetFormDialogShared now renders universal Criticality / Scope / Exposure
selects (a responsive 3-col row) on every asset type, prefilled from the asset
in edit mode and sensible defaults on create, and forwards them in the
submit payload alongside owner_ref.
- asset-page.tsx create/update handlers read these from the form instead of
hardcoding (create) / omitting (update). The updateAsset hook already forwards
them.
Pairs with the backend ingest-seam fix (api #276): the scanner infers exposure/
classification on ingest, and humans can now review and override it in the UI.
tsc clean.
* feat(assets): dedup review UI — approve/reject correlator-flagged merges
The asset deep-dive found the identity/dedup pipeline was built end-to-end on the
backend (correlator enqueues reviews; approve/reject endpoints; useDedupReviews/
approveDedupReview/rejectDedupReview hooks all existed) but had ZERO UI consumers
— merges happened invisibly and operators only saw them after the fact in
Identity History. This ships the missing operator surface.
- DedupReviewPage: lists pending reviews (identity, keep asset + finding count,
merge candidates + finding count, when flagged) with Merge / Keep-separate
actions wired to the existing approve/reject endpoints; toast + SWR revalidate;
AssetsWrite-gated; empty/loading/error states.
- Route /assets/duplicates (covered by the existing /assets/** permission wildcard).
- Sidebar: 'Duplicates' item under Asset Inventory (sidebar-route-consistency
test green — the nav item resolves to a real route).
tsc + lint clean.
* chore(assets): purge ~5.2k lines of dead asset mock-data + unused scaffolding
The asset deep-dive found a large dead mock tree shipping unused: the per-type
mock-data (~3.7k lines across 15 files), mock-relationships.ts (1.3k), the
unused AssetPageTemplate scaffold, and a getCachedAssetStats fetcher (zero
consumers) that was the only thing referencing the mock getAssetStats.
All verified unused: the real inventory hits live APIs (useAssets/useAssetStats
etc.), the only getMock* usage elsewhere is asset-groups' own stats, and tsc
caught + I removed the single latent consumer (getCachedAssetStats). Removed the
two barrel re-exports (features/assets + lib). tsc, lint, and the 49 asset
feature tests all green.
Net: -5,206 lines, smaller bundle graph, and no more mock tree misleading future
readers about what's real.
* feat(remediations): Remediations page — resolve a solution family in one action (RFC-015 Phase 2)
Frontend for the backend remediation-groups API (api#288). A single patch that
fixes many findings can now be resolved in one click instead of closing each
finding.
- src/features/remediation-groups/: types, SWR hooks (useRemediationGroups +
useResolveRemediationGroup), and the ResolveGroupDialog (outcome fix_applied
default / resolved, optional note, large-bulk confirm).
- /remediations page: DataTable of groups (fix title, finding/asset counts,
severity breakdown reusing the shared SeverityBadge), per-row 'Resolve all'
gated by findings:remediation:write.
- Sidebar entry under Mobilization + route-permission entries.
Reuses shared primitives (PageHeader, DataTable, SeverityBadge) and the API
client (CSRF-safe post). Default outcome fix_applied → the next rescan verifies.
Tests: hook URL construction (incl. key URL-encoding). type-check + lint clean;
next build green (/remediations route registered).
* feat(remediation): campaign 'Resolve open findings' action (RFC-015 Phase 3 UI) (#232)
Surfaces the backend campaign-resolve endpoint (api#291) in the UI. The
campaign detail Progress card now shows a 'Resolve open findings' button (when
any remain, gated by findings:remediation:write) that opens a dialog to
transition all the campaign's open findings at once — outcome fix_applied
(default, verify-on-rescan) or resolved, optional note, large-bulk confirm.
- useResolveRemediationCampaign hook (POST /remediation/campaigns/{id}/resolve).
- ResolveCampaignDialog (mirrors the remediation-groups resolve dialog).
- Wired into the campaign detail page; refreshes progress on success.
type-check + lint clean; build green; hook test.
Co-authored-by: Nguyen Manh <0xmanhnv@gmail.com>
* feat(remediation): track a solution-family group as a campaign (#233)
Adds a 'Track as campaign' action to each remediation group row. It creates a
tracked remediation campaign (name + priority) scoped to the group's
remediation_key via finding_filter, then navigates to the campaign — turning a
one-shot bulk-resolve into an ongoing, assignable effort whose progress follows
the whole solution family as new matching findings arrive.
Reuses the existing useCreateRemediationCampaign hook; no new endpoint.
Co-authored-by: Nguyen Manh <0xmanhnv@gmail.com>
* feat(mcp): AI Access (MCP) connect settings page (#234)
Adds settings/integrations/mcp — mint a read-only MCP connection key and copy the
Claude Desktop/Code client config. The key is pre-scoped to exactly the read
permissions the MCP server's tools require (findings:read, assets:read,
compliance:frameworks:read), so a scopeless key can't reach the endpoint.
- Reuses the existing useCreateApiKey hook; no new API surface.
- Reveal-once key + copyable client configuration (URL + Authorization: Bearer),
endpoint defaulted to this origin's /api/v1/mcp.
- Generate action gated on integrations:api_keys:write.
- Sidebar entry under Integrations (Bot icon).
Pairs with api#299 (RFC-016).
Co-authored-by: Nguyen Manh <0xmanhnv@gmail.com>
* deps(npm): bump the testing group with 9 updates (#235)
Bumps the testing group with 9 updates:
| Package | From | To |
| --- | --- | --- |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `4.1.9` | `4.1.10` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.9` | `4.1.10` |
| [@vitest/expect](https://github.com/vitest-dev/vitest/tree/HEAD/packages/expect) | `4.1.9` | `4.1.10` |
| [@vitest/mocker](https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker) | `4.1.9` | `4.1.10` |
| [@vitest/pretty-format](https://github.com/vitest-dev/vitest/tree/HEAD/packages/pretty-format) | `4.1.9` | `4.1.10` |
| [@vitest/runner](https://github.com/vitest-dev/vitest/tree/HEAD/packages/runner) | `4.1.9` | `4.1.10` |
| [@vitest/snapshot](https://github.com/vitest-dev/vitest/tree/HEAD/packages/snapshot) | `4.1.9` | `4.1.10` |
| [@vitest/spy](https://github.com/vitest-dev/vitest/tree/HEAD/packages/spy) | `4.1.9` | `4.1.10` |
| [@vitest/utils](https://github.com/vitest-dev/vitest/tree/HEAD/packages/utils) | `4.1.9` | `4.1.10` |
Updates `@vitest/coverage-v8` from 4.1.9 to 4.1.10
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/coverage-v8)
Up…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Completes the i18n MVP loop on top of the foundation (#222) — users can now actually pick a language.
LanguageSwitchersubmenu in the profile dropdown: lists supported locales by their native name (English / Tiếng Việt / العربية), checks the active one, sets thelocalecookie (which the proxy reads aboveAccept-Language), and reloads so the server re-renders with the newx-locale.t('common.language')(added to en/vi), exercising thet()path end-to-end.Switching to Tiếng Việt now flips the sidebar section titles to Phạm vi / Khám phá / Ưu tiên hóa / … (the strings converted in #222), and
aradditionally flips direction to RTL. Everything else falls back to English until translated incrementally.tsc+ eslint + vitest (i18n 6/6) +npm run buildall green.