+
+
+
+
+
+
+
diff --git a/apps/mall/plugins/api.ts b/apps/mall/plugins/api.ts
index 1678a49..85a5c19 100644
--- a/apps/mall/plugins/api.ts
+++ b/apps/mall/plugins/api.ts
@@ -1,10 +1,16 @@
import { createApi } from "@vmall/shared";
+import { createMockApi } from "~/mock/api";
export default defineNuxtPlugin(() => {
const config = useRuntimeConfig();
- const api = createApi({
- baseUrl: config.public.apiBase as string,
- getToken: () => (import.meta.client ? localStorage.getItem("vmall.token") : null),
- });
+ // Mock-first MVP: default to the fixed-data adapter; set NUXT_PUBLIC_MOCK_API=false
+ // (or runtimeConfig.public.mockApi) to talk to the live backend again.
+ const useMock = (config.public.mockApi as boolean | undefined) !== false;
+ const api = useMock
+ ? createMockApi()
+ : createApi({
+ baseUrl: config.public.apiBase as string,
+ getToken: () => (import.meta.client ? localStorage.getItem("vmall.token") : null),
+ });
return { provide: { api } };
});
diff --git a/apps/mall/public/mock/avatar.svg b/apps/mall/public/mock/avatar.svg
new file mode 100644
index 0000000..df977b4
--- /dev/null
+++ b/apps/mall/public/mock/avatar.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/banner-1.svg b/apps/mall/public/mock/banner-1.svg
new file mode 100644
index 0000000..c01f6d8
--- /dev/null
+++ b/apps/mall/public/mock/banner-1.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/banner-2.svg b/apps/mall/public/mock/banner-2.svg
new file mode 100644
index 0000000..ed84c9d
--- /dev/null
+++ b/apps/mall/public/mock/banner-2.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/banner-3.svg b/apps/mall/public/mock/banner-3.svg
new file mode 100644
index 0000000..1b0fcf7
--- /dev/null
+++ b/apps/mall/public/mock/banner-3.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/collective-banner.svg b/apps/mall/public/mock/collective-banner.svg
new file mode 100644
index 0000000..49768b6
--- /dev/null
+++ b/apps/mall/public/mock/collective-banner.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/floor-adv-1.svg b/apps/mall/public/mock/floor-adv-1.svg
new file mode 100644
index 0000000..bc55bcc
--- /dev/null
+++ b/apps/mall/public/mock/floor-adv-1.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/floor-adv-2.svg b/apps/mall/public/mock/floor-adv-2.svg
new file mode 100644
index 0000000..76ae7ba
--- /dev/null
+++ b/apps/mall/public/mock/floor-adv-2.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/floor-adv-3.svg b/apps/mall/public/mock/floor-adv-3.svg
new file mode 100644
index 0000000..baca5e0
--- /dev/null
+++ b/apps/mall/public/mock/floor-adv-3.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/floor-adv-4.svg b/apps/mall/public/mock/floor-adv-4.svg
new file mode 100644
index 0000000..7b21ad7
--- /dev/null
+++ b/apps/mall/public/mock/floor-adv-4.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/floor-adv-5.svg b/apps/mall/public/mock/floor-adv-5.svg
new file mode 100644
index 0000000..4e0baae
--- /dev/null
+++ b/apps/mall/public/mock/floor-adv-5.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/floor-adv-6.svg b/apps/mall/public/mock/floor-adv-6.svg
new file mode 100644
index 0000000..b4bcaeb
--- /dev/null
+++ b/apps/mall/public/mock/floor-adv-6.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/integral-banner.svg b/apps/mall/public/mock/integral-banner.svg
new file mode 100644
index 0000000..e95d314
--- /dev/null
+++ b/apps/mall/public/mock/integral-banner.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/login-bg.svg b/apps/mall/public/mock/login-bg.svg
new file mode 100644
index 0000000..ded7e9a
--- /dev/null
+++ b/apps/mall/public/mock/login-bg.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-1.svg b/apps/mall/public/mock/product-1.svg
new file mode 100644
index 0000000..08bd89f
--- /dev/null
+++ b/apps/mall/public/mock/product-1.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-10.svg b/apps/mall/public/mock/product-10.svg
new file mode 100644
index 0000000..0bec15b
--- /dev/null
+++ b/apps/mall/public/mock/product-10.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-11.svg b/apps/mall/public/mock/product-11.svg
new file mode 100644
index 0000000..b4221bb
--- /dev/null
+++ b/apps/mall/public/mock/product-11.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-12.svg b/apps/mall/public/mock/product-12.svg
new file mode 100644
index 0000000..5b17fc6
--- /dev/null
+++ b/apps/mall/public/mock/product-12.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-13.svg b/apps/mall/public/mock/product-13.svg
new file mode 100644
index 0000000..3b5ef53
--- /dev/null
+++ b/apps/mall/public/mock/product-13.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-14.svg b/apps/mall/public/mock/product-14.svg
new file mode 100644
index 0000000..60b259b
--- /dev/null
+++ b/apps/mall/public/mock/product-14.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-15.svg b/apps/mall/public/mock/product-15.svg
new file mode 100644
index 0000000..3922d0e
--- /dev/null
+++ b/apps/mall/public/mock/product-15.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-16.svg b/apps/mall/public/mock/product-16.svg
new file mode 100644
index 0000000..44d3c80
--- /dev/null
+++ b/apps/mall/public/mock/product-16.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-17.svg b/apps/mall/public/mock/product-17.svg
new file mode 100644
index 0000000..31b4d72
--- /dev/null
+++ b/apps/mall/public/mock/product-17.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-18.svg b/apps/mall/public/mock/product-18.svg
new file mode 100644
index 0000000..cef8fb6
--- /dev/null
+++ b/apps/mall/public/mock/product-18.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-19.svg b/apps/mall/public/mock/product-19.svg
new file mode 100644
index 0000000..0e2b41d
--- /dev/null
+++ b/apps/mall/public/mock/product-19.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-2.svg b/apps/mall/public/mock/product-2.svg
new file mode 100644
index 0000000..ff3442a
--- /dev/null
+++ b/apps/mall/public/mock/product-2.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-20.svg b/apps/mall/public/mock/product-20.svg
new file mode 100644
index 0000000..3efdf66
--- /dev/null
+++ b/apps/mall/public/mock/product-20.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-21.svg b/apps/mall/public/mock/product-21.svg
new file mode 100644
index 0000000..d59ea65
--- /dev/null
+++ b/apps/mall/public/mock/product-21.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-22.svg b/apps/mall/public/mock/product-22.svg
new file mode 100644
index 0000000..7816214
--- /dev/null
+++ b/apps/mall/public/mock/product-22.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-23.svg b/apps/mall/public/mock/product-23.svg
new file mode 100644
index 0000000..a4b9b22
--- /dev/null
+++ b/apps/mall/public/mock/product-23.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-24.svg b/apps/mall/public/mock/product-24.svg
new file mode 100644
index 0000000..e413e33
--- /dev/null
+++ b/apps/mall/public/mock/product-24.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-3.svg b/apps/mall/public/mock/product-3.svg
new file mode 100644
index 0000000..e5e7b82
--- /dev/null
+++ b/apps/mall/public/mock/product-3.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-4.svg b/apps/mall/public/mock/product-4.svg
new file mode 100644
index 0000000..3584aab
--- /dev/null
+++ b/apps/mall/public/mock/product-4.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-5.svg b/apps/mall/public/mock/product-5.svg
new file mode 100644
index 0000000..2fabcd7
--- /dev/null
+++ b/apps/mall/public/mock/product-5.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-6.svg b/apps/mall/public/mock/product-6.svg
new file mode 100644
index 0000000..2f04119
--- /dev/null
+++ b/apps/mall/public/mock/product-6.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-7.svg b/apps/mall/public/mock/product-7.svg
new file mode 100644
index 0000000..e77edcb
--- /dev/null
+++ b/apps/mall/public/mock/product-7.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-8.svg b/apps/mall/public/mock/product-8.svg
new file mode 100644
index 0000000..fc05cd1
--- /dev/null
+++ b/apps/mall/public/mock/product-8.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/product-9.svg b/apps/mall/public/mock/product-9.svg
new file mode 100644
index 0000000..4c5810f
--- /dev/null
+++ b/apps/mall/public/mock/product-9.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/promo-1.svg b/apps/mall/public/mock/promo-1.svg
new file mode 100644
index 0000000..b859607
--- /dev/null
+++ b/apps/mall/public/mock/promo-1.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/promo-2.svg b/apps/mall/public/mock/promo-2.svg
new file mode 100644
index 0000000..bb8835f
--- /dev/null
+++ b/apps/mall/public/mock/promo-2.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/promo-3.svg b/apps/mall/public/mock/promo-3.svg
new file mode 100644
index 0000000..f94718e
--- /dev/null
+++ b/apps/mall/public/mock/promo-3.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/store-1.svg b/apps/mall/public/mock/store-1.svg
new file mode 100644
index 0000000..3c915ca
--- /dev/null
+++ b/apps/mall/public/mock/store-1.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/store-2.svg b/apps/mall/public/mock/store-2.svg
new file mode 100644
index 0000000..054209e
--- /dev/null
+++ b/apps/mall/public/mock/store-2.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/store-3.svg b/apps/mall/public/mock/store-3.svg
new file mode 100644
index 0000000..7f809a4
--- /dev/null
+++ b/apps/mall/public/mock/store-3.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/public/mock/store-4.svg b/apps/mall/public/mock/store-4.svg
new file mode 100644
index 0000000..8e1fd53
--- /dev/null
+++ b/apps/mall/public/mock/store-4.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/apps/mall/stores/cart.ts b/apps/mall/stores/cart.ts
new file mode 100644
index 0000000..8c80f03
--- /dev/null
+++ b/apps/mall/stores/cart.ts
@@ -0,0 +1,20 @@
+import { defineStore } from "pinia";
+
+/** Cart badge state; mirrors the (mock or live) cart item count. */
+export const useCartStore = defineStore("mallCart", {
+ state: () => ({ count: 0 }),
+ actions: {
+ async refresh(): Promise {
+ const { $api } = useNuxtApp();
+ try {
+ const cart = await $api.getCart();
+ this.count = cart.items.reduce((sum, i) => sum + i.qty, 0);
+ } catch {
+ this.count = 0;
+ }
+ },
+ setCount(n: number): void {
+ this.count = n;
+ },
+ },
+});
diff --git a/openspec/changes/archive/2026-09-17-mall-pc-storefront-replica/agent-contracts.md b/openspec/changes/archive/2026-09-17-mall-pc-storefront-replica/agent-contracts.md
new file mode 100644
index 0000000..ddb4e14
--- /dev/null
+++ b/openspec/changes/archive/2026-09-17-mall-pc-storefront-replica/agent-contracts.md
@@ -0,0 +1,39 @@
+# Agent contracts — mall-pc-storefront-replica
+
+Read this whole file plus `proposal.md` and `design-reference.md` before editing.
+
+## Hard rules
+- `apps/mall` only. NEVER edit `packages/shared`, other apps, or backend.
+- TS strict: no `any` / `as any` / `@ts-ignore`. Vue 3 `