# Frontend Guidelines (mall / shop-admin / admin) Three Nuxt 3 apps, one design system, one API contract. Ports are fixed: mall 3000, shop-admin 3001, admin 3002. ## Hard rules - **Contract only.** All API access goes through `$api` (the `ApiClient` from `@vmall/shared`). Never build URLs or fetch manually. Contract changes happen in `packages/shared/src/types.ts` + `api.ts` and must keep all three apps building. - **No `any` / `as any` / `@ts-ignore`.** Guard external data with types. - **Money.** `formatMoney(minor, code, exponent, locale)` or the mall's `PriceText` component. Never float math, never hardcode exponent 2. - **i18n.** All copy via `$t()`. Missing keys go to the app's own `locales-extra.ts` (mall: `locales/*.ts` modules), never to the shared packs from an app change. Keep en/zh key sets identical. - **Layout.** Tailwind v4 utilities with theme tokens (`bg-bg`, `text-text`, `border-border`, `bg-surface`, `text-primary`, `text-danger`, `text-success`, `text-muted`). No `