feat(automation): add coming soon page and navigation entry
Add Automation route and navigation item with in-development badge Include localized wordings, icon, and design docs for the new section
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
- Pokopia Wiki 是一个面向 Pokopia 游戏资料的社区 Wiki。
|
- Pokopia Wiki 是一个面向 Pokopia 游戏资料的社区 Wiki。
|
||||||
- 所有人都可以浏览 Wiki 内容。
|
- 所有人都可以浏览 Wiki 内容。
|
||||||
- 已注册并完成邮箱验证且拥有对应权限的用户可以创建、编辑、删除 Wiki 内容。
|
- 已注册并完成邮箱验证且拥有对应权限的用户可以创建、编辑、删除 Wiki 内容。
|
||||||
- 前台以 Pokemon、栖息地、物品、材料单、每日 CheckList、Life、Dish、Events、Actions、Dream Island、Clothes 为主要浏览入口。
|
- 前台以 Pokemon、栖息地、物品、材料单、每日 CheckList、Life、Automation、Dish、Events、Actions、Dream Island、Clothes 为主要浏览入口。
|
||||||
- 管理入口用于维护全局配置、语言、系统文案、列表排序和每日 CheckList。
|
- 管理入口用于维护全局配置、语言、系统文案、列表排序和每日 CheckList。
|
||||||
|
|
||||||
## 技术栈
|
## 技术栈
|
||||||
@@ -606,6 +606,7 @@ API 暴露边界:
|
|||||||
|
|
||||||
以下前台公开入口当前仅展示“正在开发中”占位页,不提供数据模型、后端 API、编辑表单、管理入口或排序能力:
|
以下前台公开入口当前仅展示“正在开发中”占位页,不提供数据模型、后端 API、编辑表单、管理入口或排序能力:
|
||||||
|
|
||||||
|
- Automation:未来用于分享自动化基地(亦称工厂)创建方案、材料产出、所需 Pokemon、生产顺序和共同喜好物品。
|
||||||
- Dish
|
- Dish
|
||||||
- Events
|
- Events
|
||||||
- Actions:游戏内快捷动作,例如挥手、跳舞等。
|
- Actions:游戏内快捷动作,例如挥手、跳舞等。
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import AppShell from './components/AppShell.vue';
|
|||||||
import {
|
import {
|
||||||
iconAction,
|
iconAction,
|
||||||
iconAdmin,
|
iconAdmin,
|
||||||
|
iconAutomation,
|
||||||
iconChecklist,
|
iconChecklist,
|
||||||
iconClothes,
|
iconClothes,
|
||||||
iconDish,
|
iconDish,
|
||||||
@@ -45,6 +46,7 @@ const navItems = computed(() => {
|
|||||||
{ label: t('nav.habitats'), to: '/habitats', icon: iconHabitat },
|
{ label: t('nav.habitats'), to: '/habitats', icon: iconHabitat },
|
||||||
{ label: t('nav.items'), to: '/items', icon: iconItem },
|
{ label: t('nav.items'), to: '/items', icon: iconItem },
|
||||||
{ label: t('nav.recipes'), to: '/recipes', icon: iconRecipe },
|
{ label: t('nav.recipes'), to: '/recipes', icon: iconRecipe },
|
||||||
|
{ label: t('nav.automation'), to: '/automation', icon: iconAutomation, badge: inDevBadge() },
|
||||||
{ label: t('nav.dish'), to: '/dish', icon: iconDish, badge: inDevBadge() },
|
{ label: t('nav.dish'), to: '/dish', icon: iconDish, badge: inDevBadge() },
|
||||||
{ label: t('nav.events'), to: '/events', icon: iconEvent, badge: inDevBadge() },
|
{ label: t('nav.events'), to: '/events', icon: iconEvent, badge: inDevBadge() },
|
||||||
{ label: t('nav.actions'), to: '/actions', icon: iconAction, badge: inDevBadge() },
|
{ label: t('nav.actions'), to: '/actions', icon: iconAction, badge: inDevBadge() },
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ export type AppIcon = string;
|
|||||||
export const iconAdd: AppIcon = 'mdi:plus';
|
export const iconAdd: AppIcon = 'mdi:plus';
|
||||||
export const iconAdmin: AppIcon = 'mdi:tune-variant';
|
export const iconAdmin: AppIcon = 'mdi:tune-variant';
|
||||||
export const iconAction: AppIcon = 'mdi:gesture-tap-button';
|
export const iconAction: AppIcon = 'mdi:gesture-tap-button';
|
||||||
|
export const iconAutomation: AppIcon = 'mdi:factory';
|
||||||
export const iconBack: AppIcon = 'mdi:arrow-left';
|
export const iconBack: AppIcon = 'mdi:arrow-left';
|
||||||
export const iconCancel: AppIcon = 'mdi:close';
|
export const iconCancel: AppIcon = 'mdi:close';
|
||||||
export const iconCheck: AppIcon = 'mdi:check';
|
export const iconCheck: AppIcon = 'mdi:check';
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ export const router = createRouter({
|
|||||||
{ path: '/recipes/new', name: 'recipe-new', component: RecipeList, meta: { requiredPermission: 'recipes.create', editorModal: true } },
|
{ path: '/recipes/new', name: 'recipe-new', component: RecipeList, meta: { requiredPermission: 'recipes.create', editorModal: true } },
|
||||||
{ path: '/recipes/:id/edit', name: 'recipe-edit', component: RecipeDetail, meta: { requiredPermission: 'recipes.update', editorModal: true } },
|
{ path: '/recipes/:id/edit', name: 'recipe-edit', component: RecipeDetail, meta: { requiredPermission: 'recipes.update', editorModal: true } },
|
||||||
{ path: '/recipes/:id', name: 'recipe-detail', component: RecipeDetail },
|
{ path: '/recipes/:id', name: 'recipe-detail', component: RecipeDetail },
|
||||||
|
{ path: '/automation', name: 'automation', component: ComingSoonView, props: { page: 'automation' } },
|
||||||
{ path: '/dish', name: 'dish', component: ComingSoonView, props: { page: 'dish' } },
|
{ path: '/dish', name: 'dish', component: ComingSoonView, props: { page: 'dish' } },
|
||||||
{ path: '/events', name: 'events', component: ComingSoonView, props: { page: 'events' } },
|
{ path: '/events', name: 'events', component: ComingSoonView, props: { page: 'events' } },
|
||||||
{ path: '/actions', name: 'actions', component: ComingSoonView, props: { page: 'actions' } },
|
{ path: '/actions', name: 'actions', component: ComingSoonView, props: { page: 'actions' } },
|
||||||
|
|||||||
@@ -2439,6 +2439,10 @@ button:disabled,
|
|||||||
--soon-accent: var(--pokemon-yellow);
|
--soon-accent: var(--pokemon-yellow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.coming-soon-panel--automation {
|
||||||
|
--soon-accent: var(--type-steel);
|
||||||
|
}
|
||||||
|
|
||||||
.coming-soon-panel--events {
|
.coming-soon-panel--events {
|
||||||
--soon-accent: var(--pokemon-red);
|
--soon-accent: var(--pokemon-red);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import PageHeader from '../components/PageHeader.vue';
|
|||||||
import StatusBadge from '../components/StatusBadge.vue';
|
import StatusBadge from '../components/StatusBadge.vue';
|
||||||
import {
|
import {
|
||||||
iconAction,
|
iconAction,
|
||||||
|
iconAutomation,
|
||||||
iconClothes,
|
iconClothes,
|
||||||
iconDish,
|
iconDish,
|
||||||
iconDreamIsland,
|
iconDreamIsland,
|
||||||
@@ -13,11 +14,11 @@ import {
|
|||||||
type AppIcon
|
type AppIcon
|
||||||
} from '../icons';
|
} from '../icons';
|
||||||
|
|
||||||
type ComingSoonPage = 'dish' | 'events' | 'actions' | 'dreamIsland' | 'clothes';
|
type ComingSoonPage = 'automation' | 'dish' | 'events' | 'actions' | 'dreamIsland' | 'clothes';
|
||||||
|
|
||||||
type ComingSoonConfig = {
|
type ComingSoonConfig = {
|
||||||
icon: AppIcon;
|
icon: AppIcon;
|
||||||
accent: 'dish' | 'events' | 'actions' | 'dream' | 'clothes';
|
accent: 'automation' | 'dish' | 'events' | 'actions' | 'dream' | 'clothes';
|
||||||
previewKeys: Array<'one' | 'two' | 'three'>;
|
previewKeys: Array<'one' | 'two' | 'three'>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ const props = defineProps<{
|
|||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const pageConfigByPage: Record<ComingSoonPage, ComingSoonConfig> = {
|
const pageConfigByPage: Record<ComingSoonPage, ComingSoonConfig> = {
|
||||||
|
automation: { icon: iconAutomation, accent: 'automation', previewKeys: ['one', 'two', 'three'] },
|
||||||
dish: { icon: iconDish, accent: 'dish', previewKeys: ['one', 'two', 'three'] },
|
dish: { icon: iconDish, accent: 'dish', previewKeys: ['one', 'two', 'three'] },
|
||||||
events: { icon: iconEvent, accent: 'events', previewKeys: ['one', 'two', 'three'] },
|
events: { icon: iconEvent, accent: 'events', previewKeys: ['one', 'two', 'three'] },
|
||||||
actions: { icon: iconAction, accent: 'actions', previewKeys: ['one', 'two', 'three'] },
|
actions: { icon: iconAction, accent: 'actions', previewKeys: ['one', 'two', 'three'] },
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ export const systemWordingMessages = {
|
|||||||
habitats: 'Habitats',
|
habitats: 'Habitats',
|
||||||
items: 'Items',
|
items: 'Items',
|
||||||
recipes: 'Recipes',
|
recipes: 'Recipes',
|
||||||
|
automation: 'Automation',
|
||||||
dish: 'Dish',
|
dish: 'Dish',
|
||||||
events: 'Events',
|
events: 'Events',
|
||||||
actions: 'Actions',
|
actions: 'Actions',
|
||||||
@@ -301,6 +302,17 @@ export const systemWordingMessages = {
|
|||||||
heading: 'This wiki section is being prepared.',
|
heading: 'This wiki section is being prepared.',
|
||||||
previewLabel: 'Section preview',
|
previewLabel: 'Section preview',
|
||||||
sections: {
|
sections: {
|
||||||
|
automation: {
|
||||||
|
kicker: 'Automation',
|
||||||
|
title: 'Automation',
|
||||||
|
subtitle: 'Factory and automation base guides will be shared here.',
|
||||||
|
body: 'Automation pages will help players compare production setups, material outputs, required Pokemon, production order, and shared favourites.',
|
||||||
|
preview: {
|
||||||
|
one: 'Factory guides will focus on the base layout and production goal.',
|
||||||
|
two: 'Material output, Pokemon needs, and production order will stay easy to scan.',
|
||||||
|
three: 'Shared favourite items can help players plan compatible teams and workflows.'
|
||||||
|
}
|
||||||
|
},
|
||||||
dish: {
|
dish: {
|
||||||
kicker: 'Dish',
|
kicker: 'Dish',
|
||||||
title: 'Dish',
|
title: 'Dish',
|
||||||
@@ -756,6 +768,7 @@ export const systemWordingMessages = {
|
|||||||
habitats: '栖息地',
|
habitats: '栖息地',
|
||||||
items: '物品',
|
items: '物品',
|
||||||
recipes: '材料单',
|
recipes: '材料单',
|
||||||
|
automation: '自动化',
|
||||||
dish: '料理',
|
dish: '料理',
|
||||||
events: '活动',
|
events: '活动',
|
||||||
actions: '动作',
|
actions: '动作',
|
||||||
@@ -1011,6 +1024,17 @@ export const systemWordingMessages = {
|
|||||||
heading: '这个 Wiki 分区正在准备中。',
|
heading: '这个 Wiki 分区正在准备中。',
|
||||||
previewLabel: '分区预览',
|
previewLabel: '分区预览',
|
||||||
sections: {
|
sections: {
|
||||||
|
automation: {
|
||||||
|
kicker: 'Automation',
|
||||||
|
title: '自动化',
|
||||||
|
subtitle: '自动化基地和工厂方案会在这里分享。',
|
||||||
|
body: '自动化分区会帮助玩家对比生产配置、材料产出、所需 Pokemon、生产顺序和共同喜好物品。',
|
||||||
|
preview: {
|
||||||
|
one: '工厂方案会围绕基地布局和生产目标整理。',
|
||||||
|
two: '材料产出、Pokemon 需求和生产顺序会保持易读。',
|
||||||
|
three: '共同喜好物品可用于规划更适合协作的队伍和流程。'
|
||||||
|
}
|
||||||
|
},
|
||||||
dish: {
|
dish: {
|
||||||
kicker: 'Dish',
|
kicker: 'Dish',
|
||||||
title: '料理',
|
title: '料理',
|
||||||
|
|||||||
Reference in New Issue
Block a user