feat(ui): adopt Tailwind v4 design system and archive change

- Add tailwindcss v4 + @tailwindcss/vite to mall, shop-admin, admin
- Add @vmall/shared/theme.css tokens with html[data-accent] presets
- Add @vmall/ui kit (VBtn/VBadge/VField/VInput/VCard/VPanel/VTable/VPage,
  VAccentSwatch, useAccent) as a Nuxt module
- Convert all three apps to kit + utilities; delete ui.css/mall.css and
  every <style scoped>; consoles get accent presets, mall locked to red
- Fix VCard boolean prop default (padding) and PDP/store stale
  useAsyncData keys on param navigation
- Archive adopt-tailwind-design-system; new frontend-ui capability spec
This commit is contained in:
Chengdong Zhang
2026-09-22 18:22:50 +08:00
parent 4d2ee3b0bf
commit 0d0e10b97b
101 changed files with 2833 additions and 7207 deletions
+7 -23
View File
@@ -32,12 +32,12 @@ onMounted(() => void load());
</script>
<template>
<section class="mpanel coupons-panel">
<h1 class="mpanel-title">{{ t("user.couponsTitle") }}</h1>
<p v-if="error" class="error-message">{{ error }}</p>
<div v-else-if="loading" class="loading-state">{{ t("common.loading") }}</div>
<VCard class="min-h-[560px]">
<h1 class="mb-4 text-xl font-bold text-text">{{ t("user.couponsTitle") }}</h1>
<p v-if="error" class="mb-4 border border-danger/30 bg-danger/10 px-3.5 py-2.5 text-danger">{{ error }}</p>
<div v-else-if="loading" class="py-10 text-muted">{{ t("common.loading") }}</div>
<UiEmptyState v-else-if="coupons.length === 0" :text="t('user.noCoupons')" />
<table v-else class="mtable">
<VTable v-else>
<thead>
<tr>
<th>{{ t("user.couponTitle") }}</th>
@@ -56,23 +56,7 @@ onMounted(() => void load());
<td>{{ statusLabels[coupon.status] ?? coupon.status }}</td>
</tr>
</tbody>
</table>
</section>
</VTable>
</VCard>
</template>
<style scoped>
.coupons-panel {
min-height: 560px;
}
.error-message {
margin: 0 0 16px;
padding: 10px 14px;
color: #b42318;
background: #fff1f0;
border: 1px solid #ffd6d2;
}
.loading-state {
padding: 40px 0;
color: var(--mall-muted);
}
</style>