@agent-native/core 0.75.5 → 0.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +7 -0
- package/corpus/core/docs/AGENTS.md +1 -0
- package/corpus/core/docs/content/client.md +15 -0
- package/corpus/core/docs/content/internationalization.md +145 -0
- package/corpus/core/docs/content/locales/ar-SA/internationalization.md +102 -0
- package/corpus/core/docs/content/locales/de-DE/internationalization.md +102 -0
- package/corpus/core/docs/content/locales/es-ES/internationalization.md +102 -0
- package/corpus/core/docs/content/locales/fr-FR/internationalization.md +102 -0
- package/corpus/core/docs/content/locales/hi-IN/internationalization.md +102 -0
- package/corpus/core/docs/content/locales/ja-JP/internationalization.md +114 -0
- package/corpus/core/docs/content/locales/ko-KR/internationalization.md +102 -0
- package/corpus/core/docs/content/locales/pt-BR/internationalization.md +102 -0
- package/corpus/core/docs/content/locales/zh-CN/internationalization.md +102 -0
- package/corpus/core/docs/content/skills-guide.md +19 -18
- package/corpus/core/package.json +7 -1
- package/corpus/core/src/client/CommandMenu.tsx +16 -0
- package/corpus/core/src/client/app-providers.tsx +26 -1
- package/corpus/core/src/client/i18n.tsx +605 -0
- package/corpus/core/src/client/index.ts +28 -0
- package/corpus/core/src/index.browser.ts +25 -0
- package/corpus/core/src/localization/actions/get-localization-preference.ts +23 -0
- package/corpus/core/src/localization/actions/set-localization-preference.ts +30 -0
- package/corpus/core/src/localization/index.ts +2 -0
- package/corpus/core/src/localization/server.ts +131 -0
- package/corpus/core/src/localization/shared.ts +163 -0
- package/corpus/core/src/server/action-discovery.ts +8 -0
- package/corpus/core/src/server/index.ts +8 -0
- package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
- package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/core/src/templates/default/AGENTS.md +16 -15
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +29 -0
- package/corpus/core/src/templates/default/app/i18n/index.ts +13 -0
- package/corpus/core/src/templates/default/app/root.tsx +20 -1
- package/corpus/core/src/templates/default/app/routes/_index.tsx +24 -9
- package/corpus/core/src/templates/default/app/routes/settings.tsx +67 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/core/src/vite/action-types-plugin.ts +10 -0
- package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/analytics/app/components/layout/Header.tsx +18 -15
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
- package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +9 -3
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +5 -3
- package/corpus/templates/analytics/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/analytics/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/analytics/app/i18n/en-US.ts +3 -0
- package/corpus/templates/analytics/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/analytics/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/analytics/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/analytics/app/i18n/index.ts +31 -0
- package/corpus/templates/analytics/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/analytics/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/analytics/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/analytics/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/analytics/app/i18n-data.ts +433 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +50 -16
- package/corpus/templates/analytics/app/root.tsx +14 -1
- package/corpus/templates/analytics/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
- package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/assets/app/components/layout/Header.tsx +17 -8
- package/corpus/templates/assets/app/components/layout/Layout.tsx +10 -6
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +40 -23
- package/corpus/templates/assets/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/assets/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/assets/app/i18n/en-US.ts +3 -0
- package/corpus/templates/assets/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/assets/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/assets/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/assets/app/i18n/index.ts +31 -0
- package/corpus/templates/assets/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/assets/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/assets/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/assets/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/assets/app/i18n-data.ts +668 -0
- package/corpus/templates/assets/app/root.tsx +40 -15
- package/corpus/templates/assets/app/routes/_index.tsx +9 -10
- package/corpus/templates/assets/app/routes/settings.tsx +37 -6
- package/corpus/templates/assets/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/assets/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +12 -8
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +23 -12
- package/corpus/templates/brain/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/brain/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/brain/app/i18n/en-US.ts +3 -0
- package/corpus/templates/brain/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/brain/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/brain/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/brain/app/i18n/index.ts +31 -0
- package/corpus/templates/brain/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/brain/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/brain/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/brain/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/brain/app/i18n-data.ts +624 -0
- package/corpus/templates/brain/app/root.tsx +27 -12
- package/corpus/templates/brain/app/routes/settings.tsx +45 -8
- package/corpus/templates/brain/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/brain/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
- package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +2 -0
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +16 -9
- package/corpus/templates/calendar/app/i18n/ar-SA.ts +57 -0
- package/corpus/templates/calendar/app/i18n/de-DE.ts +58 -0
- package/corpus/templates/calendar/app/i18n/en-US.ts +57 -0
- package/corpus/templates/calendar/app/i18n/es-ES.ts +58 -0
- package/corpus/templates/calendar/app/i18n/fr-FR.ts +58 -0
- package/corpus/templates/calendar/app/i18n/hi-IN.ts +57 -0
- package/corpus/templates/calendar/app/i18n/index.ts +31 -0
- package/corpus/templates/calendar/app/i18n/ja-JP.ts +58 -0
- package/corpus/templates/calendar/app/i18n/ko-KR.ts +57 -0
- package/corpus/templates/calendar/app/i18n/pt-BR.ts +57 -0
- package/corpus/templates/calendar/app/i18n/zh-CN.ts +57 -0
- package/corpus/templates/calendar/app/i18n-data.ts +516 -0
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +2 -0
- package/corpus/templates/calendar/app/pages/Settings.tsx +63 -28
- package/corpus/templates/calendar/app/root.tsx +78 -7
- package/corpus/templates/calendar/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/calendar/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/chat/app/components/layout/Header.tsx +17 -11
- package/corpus/templates/chat/app/components/layout/Layout.tsx +12 -8
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +47 -18
- package/corpus/templates/chat/app/i18n/ar-SA.ts +62 -0
- package/corpus/templates/chat/app/i18n/de-DE.ts +63 -0
- package/corpus/templates/chat/app/i18n/en-US.ts +63 -0
- package/corpus/templates/chat/app/i18n/es-ES.ts +63 -0
- package/corpus/templates/chat/app/i18n/fr-FR.ts +63 -0
- package/corpus/templates/chat/app/i18n/hi-IN.ts +63 -0
- package/corpus/templates/chat/app/i18n/index.ts +31 -0
- package/corpus/templates/chat/app/i18n/ja-JP.ts +63 -0
- package/corpus/templates/chat/app/i18n/ko-KR.ts +63 -0
- package/corpus/templates/chat/app/i18n/pt-BR.ts +63 -0
- package/corpus/templates/chat/app/i18n/zh-CN.ts +61 -0
- package/corpus/templates/chat/app/i18n-data.ts +475 -0
- package/corpus/templates/chat/app/root.tsx +18 -5
- package/corpus/templates/chat/app/routes/_index.tsx +9 -8
- package/corpus/templates/chat/app/routes/settings.tsx +86 -0
- package/corpus/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/clips/app/components/layout/Header.tsx +23 -17
- package/corpus/templates/clips/app/components/library/empty-state.tsx +10 -34
- package/corpus/templates/clips/app/components/library/library-layout.tsx +45 -34
- package/corpus/templates/clips/app/i18n/ar-SA.ts +182 -0
- package/corpus/templates/clips/app/i18n/de-DE.ts +184 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +179 -0
- package/corpus/templates/clips/app/i18n/es-ES.ts +183 -0
- package/corpus/templates/clips/app/i18n/fr-FR.ts +184 -0
- package/corpus/templates/clips/app/i18n/hi-IN.ts +180 -0
- package/corpus/templates/clips/app/i18n/index.ts +41 -0
- package/corpus/templates/clips/app/i18n/ja-JP.ts +180 -0
- package/corpus/templates/clips/app/i18n/ko-KR.ts +178 -0
- package/corpus/templates/clips/app/i18n/pt-BR.ts +183 -0
- package/corpus/templates/clips/app/i18n/zh-CN.ts +173 -0
- package/corpus/templates/clips/app/root.tsx +104 -10
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +154 -95
- package/corpus/templates/clips/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-24-clips-now-includes-a-language-picker-and-simplified-chinese-ui.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
- package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/content/app/components/EmptyState.tsx +7 -5
- package/corpus/templates/content/app/components/ThemeToggle.tsx +4 -2
- package/corpus/templates/content/app/components/layout/Header.tsx +2 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +8 -7
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +41 -1
- package/corpus/templates/content/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/content/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/content/app/i18n/en-US.ts +3 -0
- package/corpus/templates/content/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/content/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/content/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/content/app/i18n/index.ts +31 -0
- package/corpus/templates/content/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/content/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/content/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/content/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/content/app/i18n-data.ts +490 -0
- package/corpus/templates/content/app/root.tsx +110 -23
- package/corpus/templates/content/app/routes/_app.settings.tsx +84 -0
- package/corpus/templates/content/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/content/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/design/app/components/layout/Header.tsx +16 -8
- package/corpus/templates/design/app/components/layout/Layout.tsx +8 -6
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +25 -9
- package/corpus/templates/design/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/design/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/design/app/i18n/en-US.ts +3 -0
- package/corpus/templates/design/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/design/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/design/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/design/app/i18n/index.ts +31 -0
- package/corpus/templates/design/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/design/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/design/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/design/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +350 -0
- package/corpus/templates/design/app/root.tsx +40 -15
- package/corpus/templates/design/app/routes/settings.tsx +43 -0
- package/corpus/templates/design/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/design/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
- package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/dispatch/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/en-US.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/index.ts +31 -0
- package/corpus/templates/dispatch/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/dispatch/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +267 -0
- package/corpus/templates/dispatch/app/root.tsx +18 -4
- package/corpus/templates/dispatch/app/routes/settings.tsx +86 -0
- package/corpus/templates/dispatch/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/forms/app/components/layout/Header.tsx +16 -9
- package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -4
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +34 -17
- package/corpus/templates/forms/app/i18n/ar-SA.ts +58 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +59 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +59 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +59 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +59 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +59 -0
- package/corpus/templates/forms/app/i18n/index.ts +31 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +59 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +59 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +59 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +56 -0
- package/corpus/templates/forms/app/root.tsx +65 -16
- package/corpus/templates/forms/app/routes/_app.settings.tsx +85 -0
- package/corpus/templates/forms/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/forms/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +29 -17
- package/corpus/templates/macros/app/components/layout/Header.tsx +16 -10
- package/corpus/templates/macros/app/i18n/ar-SA.ts +54 -0
- package/corpus/templates/macros/app/i18n/de-DE.ts +55 -0
- package/corpus/templates/macros/app/i18n/en-US.ts +55 -0
- package/corpus/templates/macros/app/i18n/es-ES.ts +55 -0
- package/corpus/templates/macros/app/i18n/fr-FR.ts +55 -0
- package/corpus/templates/macros/app/i18n/hi-IN.ts +55 -0
- package/corpus/templates/macros/app/i18n/index.ts +31 -0
- package/corpus/templates/macros/app/i18n/ja-JP.ts +55 -0
- package/corpus/templates/macros/app/i18n/ko-KR.ts +55 -0
- package/corpus/templates/macros/app/i18n/pt-BR.ts +55 -0
- package/corpus/templates/macros/app/i18n/zh-CN.ts +53 -0
- package/corpus/templates/macros/app/root.tsx +65 -15
- package/corpus/templates/macros/app/routes/settings.tsx +85 -0
- package/corpus/templates/macros/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/macros/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +9 -4
- package/corpus/templates/mail/app/i18n/ar-SA.ts +33 -0
- package/corpus/templates/mail/app/i18n/de-DE.ts +33 -0
- package/corpus/templates/mail/app/i18n/en-US.ts +32 -0
- package/corpus/templates/mail/app/i18n/es-ES.ts +33 -0
- package/corpus/templates/mail/app/i18n/fr-FR.ts +33 -0
- package/corpus/templates/mail/app/i18n/hi-IN.ts +32 -0
- package/corpus/templates/mail/app/i18n/index.ts +31 -0
- package/corpus/templates/mail/app/i18n/ja-JP.ts +32 -0
- package/corpus/templates/mail/app/i18n/ko-KR.ts +33 -0
- package/corpus/templates/mail/app/i18n/pt-BR.ts +34 -0
- package/corpus/templates/mail/app/i18n/zh-CN.ts +32 -0
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +67 -13
- package/corpus/templates/mail/app/root.tsx +20 -0
- package/corpus/templates/mail/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/mail/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/plan/app/components/layout/Header.tsx +19 -12
- package/corpus/templates/plan/app/components/layout/Layout.tsx +11 -7
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +41 -28
- package/corpus/templates/plan/app/i18n/ar-SA.ts +77 -0
- package/corpus/templates/plan/app/i18n/de-DE.ts +78 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +78 -0
- package/corpus/templates/plan/app/i18n/es-ES.ts +78 -0
- package/corpus/templates/plan/app/i18n/fr-FR.ts +78 -0
- package/corpus/templates/plan/app/i18n/hi-IN.ts +78 -0
- package/corpus/templates/plan/app/i18n/index.ts +31 -0
- package/corpus/templates/plan/app/i18n/ja-JP.ts +79 -0
- package/corpus/templates/plan/app/i18n/ko-KR.ts +77 -0
- package/corpus/templates/plan/app/i18n/pt-BR.ts +78 -0
- package/corpus/templates/plan/app/i18n/zh-CN.ts +74 -0
- package/corpus/templates/plan/app/root.tsx +45 -8
- package/corpus/templates/plan/app/routes/settings.tsx +86 -0
- package/corpus/templates/plan/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/slides/app/components/layout/Header.tsx +23 -11
- package/corpus/templates/slides/app/components/layout/Layout.tsx +7 -6
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +23 -11
- package/corpus/templates/slides/app/i18n/ar-SA.ts +54 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +56 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +55 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +55 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +55 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +55 -0
- package/corpus/templates/slides/app/i18n/index.ts +31 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +55 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +55 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +55 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +53 -0
- package/corpus/templates/slides/app/root.tsx +50 -8
- package/corpus/templates/slides/app/routes/settings.tsx +85 -0
- package/corpus/templates/slides/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/slides/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +14 -9
- package/corpus/templates/videos/app/components/Sidebar.tsx +16 -9
- package/corpus/templates/videos/app/components/StudioHeader.tsx +12 -8
- package/corpus/templates/videos/app/components/layout/Header.tsx +21 -15
- package/corpus/templates/videos/app/components/layout/Layout.tsx +10 -7
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +21 -6
- package/corpus/templates/videos/app/i18n/ar-SA.ts +73 -0
- package/corpus/templates/videos/app/i18n/de-DE.ts +75 -0
- package/corpus/templates/videos/app/i18n/en-US.ts +74 -0
- package/corpus/templates/videos/app/i18n/es-ES.ts +75 -0
- package/corpus/templates/videos/app/i18n/fr-FR.ts +75 -0
- package/corpus/templates/videos/app/i18n/hi-IN.ts +74 -0
- package/corpus/templates/videos/app/i18n/index.ts +31 -0
- package/corpus/templates/videos/app/i18n/ja-JP.ts +74 -0
- package/corpus/templates/videos/app/i18n/ko-KR.ts +74 -0
- package/corpus/templates/videos/app/i18n/pt-BR.ts +75 -0
- package/corpus/templates/videos/app/i18n/zh-CN.ts +72 -0
- package/corpus/templates/videos/app/pages/Index.tsx +11 -9
- package/corpus/templates/videos/app/root.tsx +45 -7
- package/corpus/templates/videos/app/routes/settings.tsx +85 -0
- package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/dist/client/CommandMenu.d.ts +3 -0
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +9 -0
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/app-providers.d.ts +8 -1
- package/dist/client/app-providers.d.ts.map +1 -1
- package/dist/client/app-providers.js +7 -5
- package/dist/client/app-providers.js.map +1 -1
- package/dist/client/i18n.d.ts +54 -0
- package/dist/client/i18n.d.ts.map +1 -0
- package/dist/client/i18n.js +354 -0
- package/dist/client/i18n.js.map +1 -0
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/localization/actions/get-localization-preference.d.ts +4 -0
- package/dist/localization/actions/get-localization-preference.d.ts.map +1 -0
- package/dist/localization/actions/get-localization-preference.js +16 -0
- package/dist/localization/actions/get-localization-preference.js.map +1 -0
- package/dist/localization/actions/set-localization-preference.d.ts +6 -0
- package/dist/localization/actions/set-localization-preference.d.ts.map +1 -0
- package/dist/localization/actions/set-localization-preference.js +24 -0
- package/dist/localization/actions/set-localization-preference.js.map +1 -0
- package/dist/localization/index.d.ts +3 -0
- package/dist/localization/index.d.ts.map +1 -0
- package/dist/localization/index.js +3 -0
- package/dist/localization/index.js.map +1 -0
- package/dist/localization/server.d.ts +25 -0
- package/dist/localization/server.d.ts.map +1 -0
- package/dist/localization/server.js +69 -0
- package/dist/localization/server.js.map +1 -0
- package/dist/localization/shared.d.ts +25 -0
- package/dist/localization/shared.d.ts.map +1 -0
- package/dist/localization/shared.js +134 -0
- package/dist/localization/shared.js.map +1 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +8 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
- package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/dist/templates/default/AGENTS.md +16 -15
- package/dist/templates/default/app/i18n/en-US.ts +29 -0
- package/dist/templates/default/app/i18n/index.ts +13 -0
- package/dist/templates/default/app/root.tsx +20 -1
- package/dist/templates/default/app/routes/_index.tsx +24 -9
- package/dist/templates/default/app/routes/settings.tsx +67 -0
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +8 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/AGENTS.md +1 -0
- package/docs/content/client.md +15 -0
- package/docs/content/internationalization.md +145 -0
- package/docs/content/locales/ar-SA/internationalization.md +102 -0
- package/docs/content/locales/de-DE/internationalization.md +102 -0
- package/docs/content/locales/es-ES/internationalization.md +102 -0
- package/docs/content/locales/fr-FR/internationalization.md +102 -0
- package/docs/content/locales/hi-IN/internationalization.md +102 -0
- package/docs/content/locales/ja-JP/internationalization.md +114 -0
- package/docs/content/locales/ko-KR/internationalization.md +102 -0
- package/docs/content/locales/pt-BR/internationalization.md +102 -0
- package/docs/content/locales/zh-CN/internationalization.md +102 -0
- package/docs/content/skills-guide.md +19 -18
- package/package.json +7 -1
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
- package/src/templates/default/AGENTS.md +16 -15
- package/src/templates/default/app/i18n/en-US.ts +29 -0
- package/src/templates/default/app/i18n/index.ts +13 -0
- package/src/templates/default/app/root.tsx +20 -1
- package/src/templates/default/app/routes/_index.tsx +24 -9
- package/src/templates/default/app/routes/settings.tsx +67 -0
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const messages = {
|
|
2
|
+
root: {
|
|
3
|
+
commandForms: "양식",
|
|
4
|
+
searchForms: "양식 검색",
|
|
5
|
+
appearance: "모양",
|
|
6
|
+
toggleTheme: "테마 전환",
|
|
7
|
+
},
|
|
8
|
+
header: {
|
|
9
|
+
settings: "설정",
|
|
10
|
+
forms: "양식",
|
|
11
|
+
team: "팀",
|
|
12
|
+
responses: "응답",
|
|
13
|
+
form: "양식",
|
|
14
|
+
extensions: "확장",
|
|
15
|
+
},
|
|
16
|
+
navigation: {
|
|
17
|
+
settings: "설정",
|
|
18
|
+
brand: "양식",
|
|
19
|
+
askForms: "Ask Forms",
|
|
20
|
+
team: "팀",
|
|
21
|
+
},
|
|
22
|
+
settings: {
|
|
23
|
+
title: "설정",
|
|
24
|
+
description: "이 앱의 언어 및 워크스페이스 환경설정입니다.",
|
|
25
|
+
languageTitle: "언어",
|
|
26
|
+
languageDescription:
|
|
27
|
+
"인터페이스 언어를 선택하세요. 이 기본 설정은 계정에 저장됩니다.",
|
|
28
|
+
languageLabel: "인터페이스 언어",
|
|
29
|
+
workspaceTitle: "워크스페이스",
|
|
30
|
+
workspaceDescription:
|
|
31
|
+
"팀원, 조직 접근 권한, 공유 워크스페이스 환경설정을 관리합니다.",
|
|
32
|
+
openTeamSettings: "팀 설정 열기",
|
|
33
|
+
openResourceSettings: "리소스 설정 열기",
|
|
34
|
+
agentTitle: "에이전트 설정",
|
|
35
|
+
agentDescription:
|
|
36
|
+
"오른쪽 사이드바의 에이전트 설정을 열어 모델, API 키, 자동화, 음성 및 기타 제어를 관리합니다.",
|
|
37
|
+
openAgentSettings: "에이전트 설정 열기",
|
|
38
|
+
},
|
|
39
|
+
agent: {
|
|
40
|
+
emptyState: "양식에 대해 무엇이든 물어보세요",
|
|
41
|
+
suggestionSurvey: "고객 피드백 설문 만들기",
|
|
42
|
+
suggestionSubmissions: "일별 제출 보기",
|
|
43
|
+
suggestionExport: "응답을 CSV로 내보내기",
|
|
44
|
+
},
|
|
45
|
+
sidebar: {
|
|
46
|
+
formGenerationStale:
|
|
47
|
+
"양식 생성이 예상보다 오래 걸립니다. 다시 시도할 수 있습니다.",
|
|
48
|
+
untitledForm: "제목 없는 양식",
|
|
49
|
+
newForm: "새 양식",
|
|
50
|
+
describeFormPlaceholder: "양식을 설명하세요...",
|
|
51
|
+
skipPrompt: "프롬프트 건너뛰기",
|
|
52
|
+
submitShortcutSuffix: "+Enter로 제출",
|
|
53
|
+
sendPrompt: "프롬프트 보내기",
|
|
54
|
+
openAskFullScreen: "Ask Forms 전체 화면 열기",
|
|
55
|
+
openSidebar: "사이드바 열기",
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default messages;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const messages = {
|
|
2
|
+
root: {
|
|
3
|
+
commandForms: "Formularios",
|
|
4
|
+
searchForms: "Pesquisar formularios",
|
|
5
|
+
appearance: "Aparencia",
|
|
6
|
+
toggleTheme: "Alternar tema",
|
|
7
|
+
},
|
|
8
|
+
header: {
|
|
9
|
+
settings: "Configurações",
|
|
10
|
+
forms: "Formularios",
|
|
11
|
+
team: "Equipe",
|
|
12
|
+
responses: "Respostas",
|
|
13
|
+
form: "Formulario",
|
|
14
|
+
extensions: "Extensoes",
|
|
15
|
+
},
|
|
16
|
+
navigation: {
|
|
17
|
+
settings: "Configurações",
|
|
18
|
+
brand: "Formularios",
|
|
19
|
+
askForms: "Perguntar ao Forms",
|
|
20
|
+
team: "Equipe",
|
|
21
|
+
},
|
|
22
|
+
settings: {
|
|
23
|
+
title: "Configurações",
|
|
24
|
+
description: "Preferências de idioma e espaço de trabalho deste app.",
|
|
25
|
+
languageTitle: "Idioma",
|
|
26
|
+
languageDescription:
|
|
27
|
+
"Escolha o idioma da interface. Essa preferência é salva na sua conta.",
|
|
28
|
+
languageLabel: "Idioma da interface",
|
|
29
|
+
workspaceTitle: "Espaço de trabalho",
|
|
30
|
+
workspaceDescription:
|
|
31
|
+
"Gerencie membros da equipe, acesso da organização e preferências compartilhadas.",
|
|
32
|
+
openTeamSettings: "Abrir configurações da equipe",
|
|
33
|
+
openResourceSettings: "Abrir configurações de recursos",
|
|
34
|
+
agentTitle: "Configurações do agente",
|
|
35
|
+
agentDescription:
|
|
36
|
+
"Abra as configurações do agente na barra lateral para modelos, chaves de API, automações, voz e outros controles.",
|
|
37
|
+
openAgentSettings: "Abrir configurações do agente",
|
|
38
|
+
},
|
|
39
|
+
agent: {
|
|
40
|
+
emptyState: "Pergunte qualquer coisa sobre seus formularios",
|
|
41
|
+
suggestionSurvey: "Criar uma pesquisa de feedback de clientes",
|
|
42
|
+
suggestionSubmissions: "Mostrar envios por dia",
|
|
43
|
+
suggestionExport: "Exportar respostas para CSV",
|
|
44
|
+
},
|
|
45
|
+
sidebar: {
|
|
46
|
+
formGenerationStale:
|
|
47
|
+
"A geracao do formulario esta demorando mais que o esperado. Voce pode tentar de novo.",
|
|
48
|
+
untitledForm: "Formulario sem titulo",
|
|
49
|
+
newForm: "Novo formulario",
|
|
50
|
+
describeFormPlaceholder: "Descreva seu formulario...",
|
|
51
|
+
skipPrompt: "Ignorar prompt",
|
|
52
|
+
submitShortcutSuffix: "+Enter para enviar",
|
|
53
|
+
sendPrompt: "Enviar prompt",
|
|
54
|
+
openAskFullScreen: "Abrir Ask Forms em tela cheia",
|
|
55
|
+
openSidebar: "Abrir barra lateral",
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default messages;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const messages = {
|
|
2
|
+
root: {
|
|
3
|
+
commandForms: "表单",
|
|
4
|
+
searchForms: "搜索表单",
|
|
5
|
+
appearance: "外观",
|
|
6
|
+
toggleTheme: "切换主题",
|
|
7
|
+
},
|
|
8
|
+
header: {
|
|
9
|
+
settings: "设置",
|
|
10
|
+
forms: "表单",
|
|
11
|
+
team: "团队",
|
|
12
|
+
responses: "回复",
|
|
13
|
+
form: "表单",
|
|
14
|
+
extensions: "扩展",
|
|
15
|
+
},
|
|
16
|
+
navigation: {
|
|
17
|
+
settings: "设置",
|
|
18
|
+
brand: "表单",
|
|
19
|
+
askForms: "询问表单",
|
|
20
|
+
team: "团队",
|
|
21
|
+
},
|
|
22
|
+
settings: {
|
|
23
|
+
title: "设置",
|
|
24
|
+
description: "此应用的语言和工作区偏好设置。",
|
|
25
|
+
languageTitle: "语言",
|
|
26
|
+
languageDescription: "选择界面语言。此偏好会保存到你的账户。",
|
|
27
|
+
languageLabel: "界面语言",
|
|
28
|
+
workspaceTitle: "工作区",
|
|
29
|
+
workspaceDescription: "管理团队成员、组织访问权限和共享工作区偏好。",
|
|
30
|
+
openTeamSettings: "打开团队设置",
|
|
31
|
+
openResourceSettings: "打开资源设置",
|
|
32
|
+
agentTitle: "代理设置",
|
|
33
|
+
agentDescription:
|
|
34
|
+
"打开代理侧边栏设置,管理模型、API 密钥、自动化、语音和其他代理控制项。",
|
|
35
|
+
openAgentSettings: "打开代理设置",
|
|
36
|
+
},
|
|
37
|
+
agent: {
|
|
38
|
+
emptyState: "可以问我任何关于表单的问题",
|
|
39
|
+
suggestionSurvey: "创建客户反馈调查",
|
|
40
|
+
suggestionSubmissions: "按天显示提交",
|
|
41
|
+
suggestionExport: "将回复导出为 CSV",
|
|
42
|
+
},
|
|
43
|
+
sidebar: {
|
|
44
|
+
formGenerationStale: "表单生成时间比预期更长。你可以重试。",
|
|
45
|
+
untitledForm: "未命名表单",
|
|
46
|
+
newForm: "新建表单",
|
|
47
|
+
describeFormPlaceholder: "描述你的表单...",
|
|
48
|
+
skipPrompt: "跳过提示",
|
|
49
|
+
submitShortcutSuffix: "+Enter 提交",
|
|
50
|
+
sendPrompt: "发送提示",
|
|
51
|
+
openAskFullScreen: "全屏打开询问表单",
|
|
52
|
+
openSidebar: "打开侧边栏",
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export default messages;
|
|
@@ -19,17 +19,20 @@ import {
|
|
|
19
19
|
CommandMenu,
|
|
20
20
|
appPath,
|
|
21
21
|
createAgentNativeQueryClient,
|
|
22
|
+
getLocaleInitScript,
|
|
22
23
|
useCommandMenuShortcut,
|
|
23
24
|
getThemeInitScript,
|
|
24
25
|
configureTracking,
|
|
25
26
|
markAgentChatHomeHandoff,
|
|
26
27
|
navigateWithAgentChatViewTransition,
|
|
27
28
|
setClientAppState,
|
|
29
|
+
useT,
|
|
28
30
|
} from "@agent-native/core/client";
|
|
29
31
|
import type { LinksFunction } from "react-router";
|
|
30
32
|
import changelog from "../CHANGELOG.md?raw";
|
|
31
33
|
import stylesheet from "./global.css?url";
|
|
32
34
|
import { TAB_ID } from "@/lib/tab-id";
|
|
35
|
+
import { i18nCatalog } from "./i18n";
|
|
33
36
|
|
|
34
37
|
configureTracking({
|
|
35
38
|
getDefaultProps: (_name, properties) => ({
|
|
@@ -42,7 +45,31 @@ export const links: LinksFunction = () => [
|
|
|
42
45
|
{ rel: "stylesheet", href: stylesheet },
|
|
43
46
|
];
|
|
44
47
|
|
|
45
|
-
const
|
|
48
|
+
const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
|
|
49
|
+
const LOCALE_INIT_SCRIPT_SELECTOR = "script[data-agent-native-locale-init]";
|
|
50
|
+
|
|
51
|
+
function getHydrationStableThemeInitScript() {
|
|
52
|
+
if (typeof document !== "undefined") {
|
|
53
|
+
const existing = document.querySelector<HTMLScriptElement>(
|
|
54
|
+
THEME_INIT_SCRIPT_SELECTOR,
|
|
55
|
+
);
|
|
56
|
+
if (existing?.innerHTML) return existing.innerHTML;
|
|
57
|
+
}
|
|
58
|
+
return getThemeInitScript();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function getHydrationStableLocaleInitScript() {
|
|
62
|
+
if (typeof document !== "undefined") {
|
|
63
|
+
const existing = document.querySelector<HTMLScriptElement>(
|
|
64
|
+
LOCALE_INIT_SCRIPT_SELECTOR,
|
|
65
|
+
);
|
|
66
|
+
if (existing?.innerHTML) return existing.innerHTML;
|
|
67
|
+
}
|
|
68
|
+
return getLocaleInitScript();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
|
|
72
|
+
const LOCALE_INIT_SCRIPT = getHydrationStableLocaleInitScript();
|
|
46
73
|
|
|
47
74
|
export function Layout({ children }: { children: React.ReactNode }) {
|
|
48
75
|
return (
|
|
@@ -54,9 +81,15 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
|
|
54
81
|
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
|
|
55
82
|
/>
|
|
56
83
|
<script
|
|
84
|
+
data-agent-native-theme-init
|
|
57
85
|
suppressHydrationWarning
|
|
58
86
|
dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
|
|
59
87
|
/>
|
|
88
|
+
<script
|
|
89
|
+
data-agent-native-locale-init
|
|
90
|
+
suppressHydrationWarning
|
|
91
|
+
dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
|
|
92
|
+
/>
|
|
60
93
|
<link rel="icon" type="image/svg+xml" href={appPath("/favicon.svg")} />
|
|
61
94
|
<link rel="manifest" href={appPath("/manifest.json")} />
|
|
62
95
|
<meta name="theme-color" content="#06B6D4" />
|
|
@@ -177,6 +210,7 @@ function OpenLinkInterceptor() {
|
|
|
177
210
|
|
|
178
211
|
function ThemeToggleItem() {
|
|
179
212
|
const { resolvedTheme, setTheme } = useTheme();
|
|
213
|
+
const t = useT();
|
|
180
214
|
const isDark = resolvedTheme === "dark";
|
|
181
215
|
return (
|
|
182
216
|
<CommandMenu.Item
|
|
@@ -184,34 +218,49 @@ function ThemeToggleItem() {
|
|
|
184
218
|
keywords={["theme", "dark", "light", "mode"]}
|
|
185
219
|
>
|
|
186
220
|
{isDark ? <IconSun size={16} /> : <IconMoon size={16} />}
|
|
187
|
-
|
|
221
|
+
{t("root.toggleTheme")}
|
|
188
222
|
</CommandMenu.Item>
|
|
189
223
|
);
|
|
190
224
|
}
|
|
191
225
|
|
|
226
|
+
function FormsCommandMenu({
|
|
227
|
+
open,
|
|
228
|
+
onOpenChange,
|
|
229
|
+
}: {
|
|
230
|
+
open: boolean;
|
|
231
|
+
onOpenChange: (open: boolean) => void;
|
|
232
|
+
}) {
|
|
233
|
+
const t = useT();
|
|
234
|
+
return (
|
|
235
|
+
<CommandMenu
|
|
236
|
+
open={open}
|
|
237
|
+
onOpenChange={onOpenChange}
|
|
238
|
+
changelog={changelog}
|
|
239
|
+
changelogKey="forms"
|
|
240
|
+
>
|
|
241
|
+
<CommandMenu.Group heading={t("root.commandForms")}>
|
|
242
|
+
<CommandMenu.Item onSelect={() => {}}>
|
|
243
|
+
{t("root.searchForms")}
|
|
244
|
+
</CommandMenu.Item>
|
|
245
|
+
</CommandMenu.Group>
|
|
246
|
+
<CommandMenu.Group heading={t("root.appearance")}>
|
|
247
|
+
<ThemeToggleItem />
|
|
248
|
+
</CommandMenu.Group>
|
|
249
|
+
</CommandMenu>
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
192
253
|
export default function Root() {
|
|
193
254
|
const [queryClient] = useState(() => createAgentNativeQueryClient());
|
|
194
255
|
const [cmdkOpen, setCmdkOpen] = useState(false);
|
|
195
256
|
useCommandMenuShortcut(useCallback(() => setCmdkOpen(true), []));
|
|
196
257
|
return (
|
|
197
|
-
<AppProviders queryClient={queryClient}>
|
|
258
|
+
<AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
|
|
198
259
|
<DbSyncSetup />
|
|
199
260
|
<NavigationStateSync />
|
|
200
261
|
<UrlStateSync />
|
|
201
262
|
<OpenLinkInterceptor />
|
|
202
|
-
<
|
|
203
|
-
open={cmdkOpen}
|
|
204
|
-
onOpenChange={setCmdkOpen}
|
|
205
|
-
changelog={changelog}
|
|
206
|
-
changelogKey="forms"
|
|
207
|
-
>
|
|
208
|
-
<CommandMenu.Group heading="Forms">
|
|
209
|
-
<CommandMenu.Item onSelect={() => {}}>Search forms</CommandMenu.Item>
|
|
210
|
-
</CommandMenu.Group>
|
|
211
|
-
<CommandMenu.Group heading="Appearance">
|
|
212
|
-
<ThemeToggleItem />
|
|
213
|
-
</CommandMenu.Group>
|
|
214
|
-
</CommandMenu>
|
|
263
|
+
<FormsCommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen} />
|
|
215
264
|
<Outlet />
|
|
216
265
|
</AppProviders>
|
|
217
266
|
);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Link } from "react-router";
|
|
2
|
+
import {
|
|
3
|
+
ChangelogSettingsCard,
|
|
4
|
+
LanguagePicker,
|
|
5
|
+
openAgentSettings,
|
|
6
|
+
useT,
|
|
7
|
+
} from "@agent-native/core/client";
|
|
8
|
+
import { useSetPageTitle } from "@/components/layout/HeaderActions";
|
|
9
|
+
import { Button } from "@/components/ui/button";
|
|
10
|
+
import {
|
|
11
|
+
Card,
|
|
12
|
+
CardContent,
|
|
13
|
+
CardDescription,
|
|
14
|
+
CardHeader,
|
|
15
|
+
CardTitle,
|
|
16
|
+
} from "@/components/ui/card";
|
|
17
|
+
import { Label } from "@/components/ui/label";
|
|
18
|
+
import changelog from "../../CHANGELOG.md?raw";
|
|
19
|
+
|
|
20
|
+
export function meta() {
|
|
21
|
+
return [{ title: "Settings - Forms" }];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default function SettingsRoute() {
|
|
25
|
+
const t = useT();
|
|
26
|
+
useSetPageTitle(t("settings.title"));
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<main className="mx-auto w-full max-w-3xl space-y-6 px-4 py-6 sm:px-6 sm:py-10">
|
|
30
|
+
<div className="space-y-1">
|
|
31
|
+
<h1 className="text-2xl font-semibold tracking-tight">
|
|
32
|
+
{t("settings.title")}
|
|
33
|
+
</h1>
|
|
34
|
+
<p className="text-sm leading-6 text-muted-foreground">
|
|
35
|
+
{t("settings.description")}
|
|
36
|
+
</p>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<Card>
|
|
40
|
+
<CardHeader>
|
|
41
|
+
<CardTitle className="text-base">
|
|
42
|
+
{t("settings.languageTitle")}
|
|
43
|
+
</CardTitle>
|
|
44
|
+
<CardDescription>{t("settings.languageDescription")}</CardDescription>
|
|
45
|
+
</CardHeader>
|
|
46
|
+
<CardContent className="max-w-xs space-y-1.5">
|
|
47
|
+
<Label>{t("settings.languageLabel")}</Label>
|
|
48
|
+
<LanguagePicker label={t("settings.languageLabel")} />
|
|
49
|
+
</CardContent>
|
|
50
|
+
</Card>
|
|
51
|
+
|
|
52
|
+
<Card>
|
|
53
|
+
<CardHeader>
|
|
54
|
+
<CardTitle className="text-base">
|
|
55
|
+
{t("settings.workspaceTitle")}
|
|
56
|
+
</CardTitle>
|
|
57
|
+
<CardDescription>
|
|
58
|
+
{t("settings.workspaceDescription")}
|
|
59
|
+
</CardDescription>
|
|
60
|
+
</CardHeader>
|
|
61
|
+
<CardContent>
|
|
62
|
+
<Button variant="outline" asChild>
|
|
63
|
+
<Link to="/team">{t("settings.openTeamSettings")}</Link>
|
|
64
|
+
</Button>
|
|
65
|
+
</CardContent>
|
|
66
|
+
</Card>
|
|
67
|
+
|
|
68
|
+
<Card>
|
|
69
|
+
<CardHeader>
|
|
70
|
+
<CardTitle className="text-base">
|
|
71
|
+
{t("settings.agentTitle")}
|
|
72
|
+
</CardTitle>
|
|
73
|
+
<CardDescription>{t("settings.agentDescription")}</CardDescription>
|
|
74
|
+
</CardHeader>
|
|
75
|
+
<CardContent>
|
|
76
|
+
<Button variant="outline" onClick={() => openAgentSettings()}>
|
|
77
|
+
{t("settings.openAgentSettings")}
|
|
78
|
+
</Button>
|
|
79
|
+
</CardContent>
|
|
80
|
+
</Card>
|
|
81
|
+
|
|
82
|
+
<ChangelogSettingsCard markdown={changelog} />
|
|
83
|
+
</main>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
FeedbackButton,
|
|
13
13
|
agentNativePath,
|
|
14
14
|
appPath,
|
|
15
|
+
useT,
|
|
15
16
|
} from "@agent-native/core/client";
|
|
16
17
|
import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
|
|
17
18
|
import { OrgSwitcher } from "@agent-native/core/client/org";
|
|
@@ -36,15 +37,16 @@ import { Header } from "./Header";
|
|
|
36
37
|
import { HeaderActionsProvider } from "./HeaderActions";
|
|
37
38
|
|
|
38
39
|
const navItems = [
|
|
39
|
-
{ icon: IconFlame,
|
|
40
|
-
{ icon: IconChartBar,
|
|
41
|
-
{ icon: IconSettings,
|
|
40
|
+
{ icon: IconFlame, labelKey: "navigation.entry", href: "/" },
|
|
41
|
+
{ icon: IconChartBar, labelKey: "navigation.analytics", href: "/analytics" },
|
|
42
|
+
{ icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
|
|
42
43
|
];
|
|
43
44
|
|
|
44
45
|
export function AppLayout({ children }: { children: React.ReactNode }) {
|
|
45
46
|
const location = useLocation();
|
|
46
47
|
const navigate = useNavigate();
|
|
47
48
|
const queryClient = useQueryClient();
|
|
49
|
+
const t = useT();
|
|
48
50
|
|
|
49
51
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
50
52
|
const [desktopSidebarCollapsed, setDesktopSidebarCollapsed] = useState(() => {
|
|
@@ -53,6 +55,7 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
|
|
|
53
55
|
});
|
|
54
56
|
|
|
55
57
|
const isAnalytics = location.pathname === "/analytics";
|
|
58
|
+
const isSettings = location.pathname.startsWith("/settings");
|
|
56
59
|
|
|
57
60
|
// Auto-close sidebar on route change (mobile)
|
|
58
61
|
useEffect(() => {
|
|
@@ -68,12 +71,12 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
|
|
|
68
71
|
|
|
69
72
|
// Navigation state sync - write current view to application state
|
|
70
73
|
useEffect(() => {
|
|
71
|
-
const view = isAnalytics ? "analytics" : "entry";
|
|
74
|
+
const view = isSettings ? "settings" : isAnalytics ? "analytics" : "entry";
|
|
72
75
|
apiFetch(agentNativePath("/_agent-native/application-state/navigation"), {
|
|
73
76
|
method: "PUT",
|
|
74
77
|
body: JSON.stringify({ view, path: location.pathname }),
|
|
75
78
|
}).catch(() => {});
|
|
76
|
-
}, [location.pathname, isAnalytics]);
|
|
79
|
+
}, [location.pathname, isAnalytics, isSettings]);
|
|
77
80
|
|
|
78
81
|
// Poll for navigate commands from the agent
|
|
79
82
|
const { data: navCommand } = useQuery({
|
|
@@ -102,6 +105,8 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
|
|
|
102
105
|
: commandValue;
|
|
103
106
|
if (cmd.view === "analytics") {
|
|
104
107
|
navigate("/analytics");
|
|
108
|
+
} else if (cmd.view === "settings") {
|
|
109
|
+
navigate("/settings");
|
|
105
110
|
} else if (cmd.view === "entry") {
|
|
106
111
|
navigate("/");
|
|
107
112
|
}
|
|
@@ -119,11 +124,11 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
|
|
|
119
124
|
position="right"
|
|
120
125
|
defaultOpen={false}
|
|
121
126
|
animateMobile
|
|
122
|
-
emptyStateText="
|
|
127
|
+
emptyStateText={t("agent.emptyState")}
|
|
123
128
|
suggestions={[
|
|
124
|
-
"
|
|
125
|
-
"
|
|
126
|
-
"
|
|
129
|
+
t("agent.suggestionLunch"),
|
|
130
|
+
t("agent.suggestionMacros"),
|
|
131
|
+
t("agent.suggestionRun"),
|
|
127
132
|
]}
|
|
128
133
|
>
|
|
129
134
|
<div className="flex flex-1 overflow-hidden">
|
|
@@ -146,7 +151,9 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
|
|
|
146
151
|
{/* Mobile sidebar sheet */}
|
|
147
152
|
<Sheet open={sidebarOpen} onOpenChange={setSidebarOpen}>
|
|
148
153
|
<SheetContent side="left" className="w-56 p-0">
|
|
149
|
-
<SheetTitle className="sr-only">
|
|
154
|
+
<SheetTitle className="sr-only">
|
|
155
|
+
{t("sidebar.navigation")}
|
|
156
|
+
</SheetTitle>
|
|
150
157
|
<SidebarContent pathname={location.pathname} />
|
|
151
158
|
</SheetContent>
|
|
152
159
|
</Sheet>
|
|
@@ -172,6 +179,7 @@ function SidebarContent({
|
|
|
172
179
|
collapsed?: boolean;
|
|
173
180
|
onToggleCollapsed?: () => void;
|
|
174
181
|
}) {
|
|
182
|
+
const t = useT();
|
|
175
183
|
const ToggleIcon = collapsed
|
|
176
184
|
? IconLayoutSidebarLeftExpand
|
|
177
185
|
: IconLayoutSidebarLeftCollapse;
|
|
@@ -199,7 +207,7 @@ function SidebarContent({
|
|
|
199
207
|
className="hidden h-4 w-auto shrink-0 dark:block"
|
|
200
208
|
/>
|
|
201
209
|
<span className="font-logo truncate text-sm font-bold tracking-tight text-foreground">
|
|
202
|
-
|
|
210
|
+
{t("navigation.brand")}
|
|
203
211
|
</span>
|
|
204
212
|
</div>
|
|
205
213
|
)}
|
|
@@ -211,7 +219,9 @@ function SidebarContent({
|
|
|
211
219
|
variant="ghost"
|
|
212
220
|
size="icon"
|
|
213
221
|
aria-label={
|
|
214
|
-
collapsed
|
|
222
|
+
collapsed
|
|
223
|
+
? t("sidebar.expandLeftSidebar")
|
|
224
|
+
: t("sidebar.collapseLeftSidebar")
|
|
215
225
|
}
|
|
216
226
|
className={cn(
|
|
217
227
|
"hidden h-8 w-8 text-muted-foreground hover:text-foreground md:inline-flex",
|
|
@@ -223,7 +233,7 @@ function SidebarContent({
|
|
|
223
233
|
</Button>
|
|
224
234
|
</TooltipTrigger>
|
|
225
235
|
<TooltipContent side="right">
|
|
226
|
-
{collapsed ? "
|
|
236
|
+
{collapsed ? t("sidebar.expand") : t("sidebar.collapse")}
|
|
227
237
|
</TooltipContent>
|
|
228
238
|
</Tooltip>
|
|
229
239
|
)}
|
|
@@ -232,6 +242,7 @@ function SidebarContent({
|
|
|
232
242
|
<nav className="flex-1 space-y-1 overflow-y-auto px-2 py-2">
|
|
233
243
|
{navItems.map((item) => {
|
|
234
244
|
const Icon = item.icon;
|
|
245
|
+
const label = t(item.labelKey);
|
|
235
246
|
const isActive =
|
|
236
247
|
item.href === "/"
|
|
237
248
|
? pathname === "/" || pathname === "/entry"
|
|
@@ -240,7 +251,7 @@ function SidebarContent({
|
|
|
240
251
|
<Link
|
|
241
252
|
key={item.href}
|
|
242
253
|
to={item.href}
|
|
243
|
-
aria-label={collapsed ?
|
|
254
|
+
aria-label={collapsed ? label : undefined}
|
|
244
255
|
className={cn(
|
|
245
256
|
"flex h-9 items-center rounded-lg text-sm transition-colors",
|
|
246
257
|
collapsed ? "justify-center px-0" : "gap-3 px-3",
|
|
@@ -250,13 +261,13 @@ function SidebarContent({
|
|
|
250
261
|
)}
|
|
251
262
|
>
|
|
252
263
|
<Icon className="h-4 w-4 shrink-0" />
|
|
253
|
-
{!collapsed &&
|
|
264
|
+
{!collapsed && label}
|
|
254
265
|
</Link>
|
|
255
266
|
);
|
|
256
267
|
return collapsed ? (
|
|
257
268
|
<Tooltip key={item.href}>
|
|
258
269
|
<TooltipTrigger asChild>{link}</TooltipTrigger>
|
|
259
|
-
<TooltipContent side="right">{
|
|
270
|
+
<TooltipContent side="right">{label}</TooltipContent>
|
|
260
271
|
</Tooltip>
|
|
261
272
|
) : (
|
|
262
273
|
link
|
|
@@ -282,6 +293,7 @@ function SidebarContent({
|
|
|
282
293
|
}
|
|
283
294
|
|
|
284
295
|
function SyncIndicator({ sidebarCollapsed }: { sidebarCollapsed: boolean }) {
|
|
296
|
+
const t = useT();
|
|
285
297
|
const refetchingActions = useIsFetching({
|
|
286
298
|
predicate: (query) =>
|
|
287
299
|
query.queryKey[0] === "action" && query.state.dataUpdatedAt > 0,
|
|
@@ -326,7 +338,7 @@ function SyncIndicator({ sidebarCollapsed }: { sidebarCollapsed: boolean }) {
|
|
|
326
338
|
)}
|
|
327
339
|
>
|
|
328
340
|
<IconLoader2 className="h-3.5 w-3.5 animate-spin" />
|
|
329
|
-
|
|
341
|
+
{t("sidebar.syncing")}
|
|
330
342
|
</div>
|
|
331
343
|
);
|
|
332
344
|
}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { useLocation } from "react-router";
|
|
2
2
|
import { IconMenu2 } from "@tabler/icons-react";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
AgentToggleButton,
|
|
5
|
+
LanguagePicker,
|
|
6
|
+
useT,
|
|
7
|
+
} from "@agent-native/core/client";
|
|
4
8
|
import { useHeaderTitle, useHeaderActions } from "./HeaderActions";
|
|
5
9
|
|
|
6
10
|
const pageTitles: Record<string, string> = {
|
|
7
|
-
"/": "
|
|
8
|
-
"/entry": "
|
|
9
|
-
"/analytics": "
|
|
10
|
-
"/settings": "
|
|
11
|
-
"/extensions": "
|
|
11
|
+
"/": "header.entry",
|
|
12
|
+
"/entry": "header.entry",
|
|
13
|
+
"/analytics": "header.analytics",
|
|
14
|
+
"/settings": "header.settings",
|
|
15
|
+
"/extensions": "header.extensions",
|
|
12
16
|
};
|
|
13
17
|
|
|
14
18
|
function resolveTitle(pathname: string): string {
|
|
15
19
|
if (pageTitles[pathname]) return pageTitles[pathname];
|
|
16
|
-
if (pathname.startsWith("/extensions")) return "
|
|
17
|
-
return "
|
|
20
|
+
if (pathname.startsWith("/extensions")) return "header.extensions";
|
|
21
|
+
return "header.macros";
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
interface HeaderProps {
|
|
@@ -25,25 +29,27 @@ export function Header({ onOpenSidebar }: HeaderProps) {
|
|
|
25
29
|
const location = useLocation();
|
|
26
30
|
const title = useHeaderTitle();
|
|
27
31
|
const actions = useHeaderActions();
|
|
32
|
+
const t = useT();
|
|
28
33
|
|
|
29
34
|
return (
|
|
30
35
|
<header className="flex h-12 shrink-0 items-center gap-2 border-b border-border bg-background px-3 md:px-4">
|
|
31
36
|
<button
|
|
32
37
|
onClick={onOpenSidebar}
|
|
33
38
|
className="flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground md:hidden"
|
|
34
|
-
aria-label="
|
|
39
|
+
aria-label={t("sidebar.openMenu")}
|
|
35
40
|
>
|
|
36
41
|
<IconMenu2 className="h-5 w-5" />
|
|
37
42
|
</button>
|
|
38
43
|
<div className="flex min-w-0 flex-1 items-center gap-3">
|
|
39
44
|
{title ?? (
|
|
40
45
|
<h1 className="truncate text-sm font-semibold text-foreground">
|
|
41
|
-
{resolveTitle(location.pathname)}
|
|
46
|
+
{t(resolveTitle(location.pathname))}
|
|
42
47
|
</h1>
|
|
43
48
|
)}
|
|
44
49
|
</div>
|
|
45
50
|
<div className="flex shrink-0 items-center gap-2">
|
|
46
51
|
{actions}
|
|
52
|
+
<LanguagePicker variant="icon" />
|
|
47
53
|
<AgentToggleButton />
|
|
48
54
|
</div>
|
|
49
55
|
</header>
|