雨霖铃
aa23a263fe
refactor: 迁移 i18n 系统从 react-i18next 到 chrome.i18n
...
- 移除 react-i18next、i18next 及相关依赖
- 删除旧的 i18n/ 目录和 useLazyTranslation 工具
- 新增 utils/chromeI18n.ts 类型安全 wrapper(useI18n Hook + getMessage)
- 生成 public/_locales/{zh,en}/messages.json(298 个翻译 key)
- 批量更新 39+ 组件文件的导入和翻译调用
- 转换翻译键格式:namespace:key → namespace_key
- 修复 ErrorBoundary/PageErrorBoundary 从 withTranslation HOC 改为直接调用 getMessage
- 更新 vitest.setup.ts mock 加载实际翻译文本
- 修复 11 个测试文件的断言以匹配中文翻译
- TypeScript、ESLint、547 项测试全部通过
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-28 19:21:54 +08:00
LingandRX
d4c29a1bf4
Develop ( #54 )
...
* fix(ci): fix release workflow artifact upload issue
- Split artifact upload into 3 separate steps (Chrome, Firefox, Source)
- Update download steps to match new artifact names
- Add if-no-files-found: error for better error handling
- Fix Node.js 20 compatibility issue with upload-artifact@v4 glob pattern
* docs: 更新 AGENTS.md,添加测试工具和翻译文件结构说明
* docs: 更新 AGENTS.md,完善 CI 步骤和存储键名格式说明
* fix: remove unnecessary animations from StorageCleaner page
- Remove entrance animations (animate-in, fade-in, zoom-in) from all components
- Remove scale effect (active:scale-[0.99]) from clean button
- Remove transition effects (transition-all, transition-colors) from OptionItem, StorageOptionsGrid, AutoRefreshToggle
- Remove bouncing animation from error icon
- Remove pulsing animation from warning banner
- Keep animate-spin on button loading spinner as functional indicator
* fix: remove unnecessary animations from RightClickRestorer page
* fix: remove all unnecessary animations from all pages
- Remove dead code animations (animate-in, fade-in, slide-in, zoom-in, shake) from tailwindcss-animate plugin (not installed)
- Remove decorative transition effects (transition-all, transition-colors) from all page components
- Remove scale effects (active:scale-95) from buttons
- Remove bounce animations (animate-bounce) from icons
- Keep functional animate-spin on loading spinners as they provide essential loading feedback
Affected pages: Dashboard, Timestamp, Jwt, JsonTools, Base64Converter, HtmlToMarkdown, MarkdownToHtml, QrCode, TextStatistics
* docs: 添加项目文档(copilot-instructions、编码规范、各目录 README)
- 新增 .github/copilot-instructions.md:Copilot 指令文件,涵盖构建命令、CI 流水线、项目架构、关键规范
- 新增 .github/CODING_STANDARDS.md:完整的代码编写规范文档(TypeScript、React、样式、错误处理、命名、测试、Hook、i18n、存储等 12 个章节)
- 新增 11 个目录的 README.md:components、components/ui、config、entrypoints、i18n、lib、pages、providers、public、src、types、utils
- 更新 AGENTS.md:补充页面组件模式说明和 components/ui 目录
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(CopyButton): use shadcn buttonVariants instead of duplicated variant classes
Remove hand-written variantClasses/sizeClasses that duplicated shadcn's
buttonVariants. Now extends ButtonProps and imports buttonVariants from
components/ui/button for consistent styling.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(ErrorBoundary): use shadcn destructive tokens instead of hardcoded red colors
Replace hardcoded red-200/red-50/red-600 with border-destructive,
bg-destructive/5, text-destructive. Use variant='destructive' on
Button. Align error log styling with PageErrorBoundary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(TextInputArea): replace hardcoded Chinese strings with i18n t() calls
Use existing translation keys for clear success, copy success, and
copy error messages instead of hardcoded Chinese text.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(QrCodePreview): use shadcn Button instead of manual button styles
Replace hand-written button class strings with shadcn Button component
using outline and default variants. Removes ~15 lines of duplicated
Tailwind classes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* docs(GlobalSnackbar): clarify relationship with sonner toast
Add note explaining when to use GlobalSnackbar (provider context,
severity levels, custom positioning) vs sonner toast (simple one-off
messages).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(ImageUploader): wrap handleClearFile with useCallback
Prevents unnecessary re-renders by memoizing the callback, consistent
with handleFileChange which already uses useCallback.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(SwitchButtonGroup): remove redundant containerPadding conditional
Both branches of the ternary returned 'p-1'. Inline the constant
directly into the className string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(TopBar): add missing openExtensionPage import
The function was called in handleOpenInTab but never imported from
utils/chromeTabs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(TopBar): add selectedIndex boundary protection in keyboard nav
Guard against out-of-bounds access when search results change during
keyboard navigation. Check selectedIndex < totalItems before accessing
arrays.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(RouterContainer): remove unnecessary empty-dep useMemo
getEntryPointType() is a simple config getter. Replace useMemo(() => ..., [])
with a direct call — the empty dep array made the memo pointless.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* feat(i18n): add missing translation keys for error boundaries and copy messages
Add keys for errorBoundary, pageErrorBoundary, router, and
messages.copyEmpty in both zh and en locales.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(CopyButton): replace hardcoded Chinese strings with i18n t() calls
Use useTranslation('common') for tooltip, copy empty/success/error
toast messages.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(ErrorBoundary): replace hardcoded Chinese with i18n via withTranslation HOC
Use react-i18next withTranslation HOC for class component to translate
title, description, and refresh button text.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(PageErrorBoundary): replace hardcoded Chinese with i18n via withTranslation HOC
Use react-i18next withTranslation HOC for class component to translate
title, description, and retry button text.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(RouterContainer): replace hardcoded Chinese with i18n t() calls
Use useTranslation('common') for 404 page title and description with
entryPointType interpolation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(pages): 修复 TypeScript 错误、硬编码字符串,移除死代码
- 修复 LiveClock.tsx CopyButton size 属性类型错误 (small → sm)
- 修复 ToolCard.tsx 紫色 RGB 值拼写错误 (147,51,2 purple → 147,51,232)
- 替换 4 处硬编码中文为 i18n 调用 (StorageCleaner, JsonTools)
- MarkdownToHtml 预览链接色改为 CSS 变量以支持暗黑模式
- 移除 Base64Converter 中已被 Base64ConverterSection 替代的死代码
(FileMode.tsx, ImageMode.tsx 及其测试文件)
- 更新 README.md 移除对已删除文件的引用
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
* fix(CopyButton, LiveClock): 修改按钮大小为 'icon',移除硬编码颜色配置
* refactor(TextInputArea): 复用 CopyButton 组件替换内联复制逻辑
* fix(test): 修复 CopyButton mock 未捕获 clipboard writeText 异常
---------
Co-authored-by: Ubuntu <ubuntu@localhost.localdomain >
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-28 00:40:54 +08:00
雨霖铃
64e23994a6
fix(test): 修复 CopyButton mock 未捕获 clipboard writeText 异常
2026-05-28 00:39:47 +08:00
雨霖铃
528621f16e
fix(tests): 修复 CI 失败的测试 - 补充 withTranslation 和 CopyButton mock
...
- vitest.setup.ts: react-i18next mock 添加 withTranslation HOC(读取 zh/common.json 翻译)
- vitest.setup.ts: 添加 @/components/CopyButton 全局 mock
- App 测试: 补充 withTranslation 导出
- TextMode 测试: 修复多个 CopyButton 实例导致的 getByTestId 冲突,改用 getByRole
2026-05-28 00:13:09 +08:00
雨霖铃
c735a0aa1a
refactor(TextInputArea): 复用 CopyButton 组件替换内联复制逻辑
2026-05-27 22:55:28 +08:00
雨霖铃
62c880b0a8
fix(CopyButton, LiveClock): 修改按钮大小为 'icon',移除硬编码颜色配置
2026-05-27 17:07:39 +08:00
雨霖铃
e263b63ced
fix(pages): 修复 TypeScript 错误、硬编码字符串,移除死代码
...
- 修复 LiveClock.tsx CopyButton size 属性类型错误 (small → sm)
- 修复 ToolCard.tsx 紫色 RGB 值拼写错误 (147,51,2 purple → 147,51,232)
- 替换 4 处硬编码中文为 i18n 调用 (StorageCleaner, JsonTools)
- MarkdownToHtml 预览链接色改为 CSS 变量以支持暗黑模式
- 移除 Base64Converter 中已被 Base64ConverterSection 替代的死代码
(FileMode.tsx, ImageMode.tsx 及其测试文件)
- 更新 README.md 移除对已删除文件的引用
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 16:56:27 +08:00
雨霖铃
1e4b6eddc7
fix(RouterContainer): replace hardcoded Chinese with i18n t() calls
...
Use useTranslation('common') for 404 page title and description with
entryPointType interpolation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 14:14:19 +08:00
雨霖铃
4316bb57d2
fix(PageErrorBoundary): replace hardcoded Chinese with i18n via withTranslation HOC
...
Use react-i18next withTranslation HOC for class component to translate
title, description, and retry button text.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 14:11:44 +08:00
雨霖铃
f40485e2dc
fix(ErrorBoundary): replace hardcoded Chinese with i18n via withTranslation HOC
...
Use react-i18next withTranslation HOC for class component to translate
title, description, and refresh button text.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 14:10:11 +08:00
雨霖铃
0908358f97
fix(CopyButton): replace hardcoded Chinese strings with i18n t() calls
...
Use useTranslation('common') for tooltip, copy empty/success/error
toast messages.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 14:08:10 +08:00
雨霖铃
a3f89d07ea
feat(i18n): add missing translation keys for error boundaries and copy messages
...
Add keys for errorBoundary, pageErrorBoundary, router, and
messages.copyEmpty in both zh and en locales.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 14:06:19 +08:00
雨霖铃
003dad5d8b
fix(RouterContainer): remove unnecessary empty-dep useMemo
...
getEntryPointType() is a simple config getter. Replace useMemo(() => ..., [])
with a direct call — the empty dep array made the memo pointless.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:55:54 +08:00
雨霖铃
27d3360f9d
fix(TopBar): add selectedIndex boundary protection in keyboard nav
...
Guard against out-of-bounds access when search results change during
keyboard navigation. Check selectedIndex < totalItems before accessing
arrays.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:54:38 +08:00
雨霖铃
67629263f9
fix(TopBar): add missing openExtensionPage import
...
The function was called in handleOpenInTab but never imported from
utils/chromeTabs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:53:48 +08:00
雨霖铃
8b58dcf02e
fix(SwitchButtonGroup): remove redundant containerPadding conditional
...
Both branches of the ternary returned 'p-1'. Inline the constant
directly into the className string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:53:11 +08:00
雨霖铃
2e2f6e9835
fix(ImageUploader): wrap handleClearFile with useCallback
...
Prevents unnecessary re-renders by memoizing the callback, consistent
with handleFileChange which already uses useCallback.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:52:11 +08:00
雨霖铃
cdad9bda68
docs(GlobalSnackbar): clarify relationship with sonner toast
...
Add note explaining when to use GlobalSnackbar (provider context,
severity levels, custom positioning) vs sonner toast (simple one-off
messages).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:51:30 +08:00
雨霖铃
fae8dea971
fix(QrCodePreview): use shadcn Button instead of manual button styles
...
Replace hand-written button class strings with shadcn Button component
using outline and default variants. Removes ~15 lines of duplicated
Tailwind classes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:50:36 +08:00
雨霖铃
e0de152645
fix(TextInputArea): replace hardcoded Chinese strings with i18n t() calls
...
Use existing translation keys for clear success, copy success, and
copy error messages instead of hardcoded Chinese text.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:49:31 +08:00
雨霖铃
e005d4d95d
fix(ErrorBoundary): use shadcn destructive tokens instead of hardcoded red colors
...
Replace hardcoded red-200/red-50/red-600 with border-destructive,
bg-destructive/5, text-destructive. Use variant='destructive' on
Button. Align error log styling with PageErrorBoundary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:48:30 +08:00
雨霖铃
601260797e
fix(CopyButton): use shadcn buttonVariants instead of duplicated variant classes
...
Remove hand-written variantClasses/sizeClasses that duplicated shadcn's
buttonVariants. Now extends ButtonProps and imports buttonVariants from
components/ui/button for consistent styling.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 13:48:02 +08:00
雨霖铃
c61b599287
docs: 添加项目文档(copilot-instructions、编码规范、各目录 README)
...
- 新增 .github/copilot-instructions.md:Copilot 指令文件,涵盖构建命令、CI 流水线、项目架构、关键规范
- 新增 .github/CODING_STANDARDS.md:完整的代码编写规范文档(TypeScript、React、样式、错误处理、命名、测试、Hook、i18n、存储等 12 个章节)
- 新增 11 个目录的 README.md:components、components/ui、config、entrypoints、i18n、lib、pages、providers、public、src、types、utils
- 更新 AGENTS.md:补充页面组件模式说明和 components/ui 目录
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-27 11:54:21 +08:00
LingandRX
42d3fedbaa
develop → main: 合并开发分支 ( #51 )
...
* fix(ci): fix release workflow artifact upload issue
- Split artifact upload into 3 separate steps (Chrome, Firefox, Source)
- Update download steps to match new artifact names
- Add if-no-files-found: error for better error handling
- Fix Node.js 20 compatibility issue with upload-artifact@v4 glob pattern
* docs: 更新 AGENTS.md,添加测试工具和翻译文件结构说明
* docs: 更新 AGENTS.md,完善 CI 步骤和存储键名格式说明
* fix: remove unnecessary animations from StorageCleaner page
- Remove entrance animations (animate-in, fade-in, zoom-in) from all components
- Remove scale effect (active:scale-[0.99]) from clean button
- Remove transition effects (transition-all, transition-colors) from OptionItem, StorageOptionsGrid, AutoRefreshToggle
- Remove bouncing animation from error icon
- Remove pulsing animation from warning banner
- Keep animate-spin on button loading spinner as functional indicator
* fix: remove unnecessary animations from RightClickRestorer page
* fix: remove all unnecessary animations from all pages
- Remove dead code animations (animate-in, fade-in, slide-in, zoom-in, shake) from tailwindcss-animate plugin (not installed)
- Remove decorative transition effects (transition-all, transition-colors) from all page components
- Remove scale effects (active:scale-95) from buttons
- Remove bounce animations (animate-bounce) from icons
- Keep functional animate-spin on loading spinners as they provide essential loading feedback
Affected pages: Dashboard, Timestamp, Jwt, JsonTools, Base64Converter, HtmlToMarkdown, MarkdownToHtml, QrCode, TextStatistics
---------
Co-authored-by: Ubuntu <ubuntu@localhost.localdomain >
2026-05-26 15:08:53 +08:00
雨霖铃
0f3b6c4cd8
fix: remove all unnecessary animations from all pages
...
- Remove dead code animations (animate-in, fade-in, slide-in, zoom-in, shake) from tailwindcss-animate plugin (not installed)
- Remove decorative transition effects (transition-all, transition-colors) from all page components
- Remove scale effects (active:scale-95) from buttons
- Remove bounce animations (animate-bounce) from icons
- Keep functional animate-spin on loading spinners as they provide essential loading feedback
Affected pages: Dashboard, Timestamp, Jwt, JsonTools, Base64Converter, HtmlToMarkdown, MarkdownToHtml, QrCode, TextStatistics
2026-05-25 20:29:12 +08:00
雨霖铃
af2262d2c9
fix: remove unnecessary animations from RightClickRestorer page
2026-05-25 20:15:23 +08:00
雨霖铃
e5ae802ab2
fix: remove unnecessary animations from StorageCleaner page
...
- Remove entrance animations (animate-in, fade-in, zoom-in) from all components
- Remove scale effect (active:scale-[0.99]) from clean button
- Remove transition effects (transition-all, transition-colors) from OptionItem, StorageOptionsGrid, AutoRefreshToggle
- Remove bouncing animation from error icon
- Remove pulsing animation from warning banner
- Keep animate-spin on button loading spinner as functional indicator
2026-05-25 20:11:39 +08:00
雨霖铃
dec43f89da
docs: 更新 AGENTS.md,完善 CI 步骤和存储键名格式说明
2026-05-25 19:21:22 +08:00
雨霖铃
61e741f198
docs: 更新 AGENTS.md,添加测试工具和翻译文件结构说明
2026-05-25 19:15:31 +08:00
雨霖铃
c98f767809
Merge branch 'main' into develop
2026-05-24 08:44:32 +08:00
LingandRX
92d524d832
fix(tsconfig): remove unused baseUrl and paths configuration ( #50 )
2026-05-24 08:44:04 +08:00
Ubuntu
63f47fd2b1
Merge branch 'main' into develop
2026-05-23 18:58:15 +08:00
LingandRX
6abdf4add4
fix(ci): sync manifest version from tag before build ( #49 )
...
The release workflow was always building with the hardcoded version
from package.json (1.0.0), causing Chrome Web Store to reject uploads
because 1.0.0 equals the already-published 1.0 (trailing zeros ignored).
Added a step to extract the version from the git tag and update
package.json before the build, so the zip contains the correct version.
Co-authored-by: Ubuntu <ubuntu@localhost.localdomain >
v1.0.4
2026-05-23 18:58:08 +08:00
Ubuntu
e95ca1297c
merge: resolve conflict by taking main version of release.yml
2026-05-23 14:46:44 +08:00
LingandRX
a0d6e76cad
Merge pull request #48 from LingandRX/hotfix/fix-release-workflow
...
fix(ci): fix release workflow artifact upload
2026-05-23 14:46:05 +08:00
Ubuntu
cc6d414d10
fix(ci): fix release workflow artifact upload
...
- Copy zip files to fixed directory before upload to avoid glob pattern issues
- Add debug steps to verify output and downloaded artifacts
- Fix Node.js 20 compatibility issue with upload-artifact@v4
2026-05-23 14:43:36 +08:00
Ubuntu
c8ad2a2283
fix(ci): fix release workflow artifact upload issue
...
- Split artifact upload into 3 separate steps (Chrome, Firefox, Source)
- Update download steps to match new artifact names
- Add if-no-files-found: error for better error handling
- Fix Node.js 20 compatibility issue with upload-artifact@v4 glob pattern
2026-05-23 14:37:39 +08:00
LingandRX
5daa151b5e
Refactor GitHub Actions workflow for clarity and efficiency ( #46 )
2026-05-23 14:27:57 +08:00
LingandRX
e93b5c817f
Merge pull request #45 from LingandRX/develop
...
chore: release v1.0.4
2026-05-23 14:15:07 +08:00
雨霖铃
d678f14549
ci(release): fix typecheck command and add missing WXT prepare steps
...
- Replace non-existent
pm run compile with correct
pm run typecheck
- Add
px wxt prepare before typecheck and test steps (aligned with ci.yml)
- Update AGENTS.md to remove fixed issue note
2026-05-23 14:13:27 +08:00
LingandRX
c95e028482
Merge pull request #44 from LingandRX/develop
...
chore: release v1.0.4
2026-05-23 14:07:13 +08:00
雨霖铃
8ec36ac3b3
test: fix i18n namespace assertions in Base64Converter and QrCode tests
...
Align test selectors with useLazyTranslation mock which prefixes keys
with namespace (e.g. base64Converter:encode). Also remove obsolete
page title assertions for components that no longer render titles.
2026-05-23 14:04:10 +08:00
雨霖铃
262c5e9255
Merge remote-tracking branch 'origin/main' into develop
2026-05-23 13:39:28 +08:00
雨霖铃
e4993cb0ce
docs: update README with current project state
...
- Add Right Click Restorer feature description
- Remove non-existent pageTheme.ts from project structure
- Update UI components to mention shadcn/ui
- Add missing permissions: contextMenus, alarms, unlimitedStorage
- Clarify permission descriptions
2026-05-23 13:23:53 +08:00
雨霖铃
0d60961a82
docs: update AGENTS.md outdated info
...
- Remove non-existent config/pageTheme.ts and config/theme.ts
- Update style guide from MUI sx to Tailwind CSS + shadcn/ui
- Replace MUI with Tailwind CSS and shadcn/ui in tech stack
2026-05-23 13:21:50 +08:00
雨霖铃
df3eee8749
refactor: 移除所有页面的 PageHeader 组件
...
删除 PageHeader 组件及其测试文件,清理相关不再使用的导入和变量。
2026-05-23 13:15:25 +08:00
雨霖铃
cf05df7022
fix(i18n): replace useTranslation with useLazyTranslation in Base64Converter
...
Fix missing translations by ensuring base64Converter namespace is dynamically loaded.
2026-05-23 13:07:31 +08:00
雨霖铃
e0888c7fb3
refactor: remove remaining config/pageTheme dependencies
...
- Replace base64ConverterPageStyles.primaryColor with inline text-indigo-800
- Replace qrCodePageStyles.primaryColor with inline text-green-700
- Remove obsolete page-error-boundary design doc
2026-05-23 12:58:35 +08:00
雨霖铃
8b2bca9eef
refactor(timestamp): migrate pageTheme constants to Timestamp feature
...
Remove config/pageTheme.ts and move DATE_FORMAT, ZONES, UnitType, ZoneType
to pages/Timestamp/constants.ts for better feature cohesion.
2026-05-23 12:57:51 +08:00
雨霖铃
6bac88fbc4
feat(right-click-restorer): add unsupported page detection
...
- Detect and block chrome://, chrome-extension://, about://, edge://, brave:// pages
- Show 'Unsupported' badge with warning icon and disabled button
- Add 'unsupported' and 'unsupportedDesc' i18n keys (zh/en)
- Update useRightClickRestorer hook with isUnsupported state
- Add unit tests for unsupported page behavior
- Update page UI to render conditional unsupported layout
2026-05-23 12:46:20 +08:00