更新若干功能

This commit is contained in:
2026-08-19 08:16:49 +08:00
parent 4979bb83d2
commit 72bc6502eb
56 changed files with 3627 additions and 343 deletions

View File

@@ -24,6 +24,7 @@ return [
['title' => '商品相册', 'name' => 'GoodsImage', 'path' => '/goods/image', 'component' => '/goods/image/index', 'icon' => 'lucide:images', 'sort' => 3],
['title' => '轮播图', 'name' => 'GoodsCarousel', 'path' => '/goods/carousel', 'component' => '/goods/carousel/index', 'icon' => 'lucide:gallery-horizontal', 'sort' => 4],
['title' => '报价单', 'name' => 'GoodsQuote', 'path' => '/goods/quote', 'component' => '/goods/quote/index', 'icon' => 'lucide:file-text', 'sort' => 5],
['title' => '套餐搭配', 'name' => 'GoodsPackage', 'path' => '/goods/package', 'component' => '/goods/package/index', 'icon' => 'lucide:package', 'sort' => 6],
],
],
[

222
config/wx_card_schemes.php Normal file
View File

@@ -0,0 +1,222 @@
<?php
/**
* 30 套结构互异的轻奢 / 欧美 / 手作卡片
*
* 图层坐标以 340×420 为画布。deco.asset 是渲染器内置配饰名CSS 画),
* deco.tone 只取主题 tokenprimary / accent / surface…禁止写死纯黑。
* 每套开窗、边框、题签至少两项不同,拒绝只换色。
*/
$layer = static function (string $id, string $type, array $opts): array {
return array_merge([
'id' => $id,
'type' => $type,
'x' => 0,
'y' => 0,
'w' => 100,
'h' => 40,
'rotate' => 0,
'z' => 1,
'visible' => true,
'locked' => false,
], $opts);
};
$pack = static function (string $code, string $name, string $family, array $layers): array {
return [
'code' => $code,
'name' => $name,
'family' => $family,
'is_preset' => 1,
'size' => ['w' => 340, 'h' => 420],
'layers' => $layers,
];
};
return [
$pack('clay-edge', '素胚纸边', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('edge', 'deco', ['asset' => 'paper-edge', 'tone' => 'primary', 'x' => 10, 'y' => 10, 'w' => 320, 'h' => 400, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 36, 'y' => 40, 'w' => 268, 'h' => 220, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 36, 'y' => 288, 'w' => 268, 'h' => 72, 'font' => 'title', 'z' => 5]),
]),
$pack('pearl-line', '珠贝双线', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('line', 'deco', ['asset' => 'pearl-line', 'tone' => 'primary_soft', 'x' => 14, 'y' => 14, 'w' => 312, 'h' => 392, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 40, 'y' => 28, 'w' => 260, 'h' => 260, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 40, 'y' => 308, 'w' => 260, 'h' => 56, 'font' => 'caption', 'z' => 5]),
]),
$pack('walnut-frame', '胡桃厚框', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'bg_soft', 'z' => 0, 'locked' => true]),
$layer('frame', 'deco', ['asset' => 'walnut-frame', 'tone' => 'primary_strong', 'x' => 8, 'y' => 8, 'w' => 324, 'h' => 404, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 36, 'y' => 36, 'w' => 268, 'h' => 268, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 36, 'y' => 322, 'w' => 268, 'h' => 56, 'font' => 'title', 'z' => 5]),
]),
$pack('champagne-foil', '香槟金箔', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('foil', 'deco', ['asset' => 'gold-foil', 'tone' => 'primary', 'x' => 16, 'y' => 16, 'w' => 308, 'h' => 388, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 32, 'y' => 32, 'w' => 276, 'h' => 232, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 32, 'y' => 280, 'w' => 220, 'h' => 48, 'font' => 'title', 'z' => 5]),
$layer('stamp', 'deco', ['asset' => 'wax-seal', 'tone' => 'accent', 'x' => 264, 'y' => 348, 'w' => 52, 'h' => 52, 'z' => 6]),
]),
$pack('museum-mat', '博物馆卡纸', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface_soft', 'z' => 0, 'locked' => true]),
$layer('mat', 'deco', ['asset' => 'museum-mat', 'tone' => 'border', 'x' => 12, 'y' => 12, 'w' => 316, 'h' => 292, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 40, 'y' => 40, 'w' => 260, 'h' => 236, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 328, 'w' => 292, 'h' => 52, 'font' => 'caption', 'z' => 5]),
]),
$pack('folio-line', '刊页双线', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('folio', 'deco', ['asset' => 'folio-line', 'tone' => 'primary', 'x' => 18, 'y' => 18, 'w' => 304, 'h' => 384, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 36, 'y' => 48, 'w' => 268, 'h' => 220, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 36, 'y' => 292, 'w' => 268, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('gold-corner', '金角护片', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('corners', 'deco', ['asset' => 'gold-corner', 'tone' => 'primary', 'x' => 8, 'y' => 8, 'w' => 324, 'h' => 404, 'z' => 6]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 24, 'y' => 24, 'w' => 292, 'h' => 260, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 304, 'w' => 292, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('emboss-plate', '浮雕铭牌', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 20, 'y' => 20, 'w' => 300, 'h' => 250, 'z' => 2]),
$layer('plate', 'deco', ['asset' => 'emboss-plate', 'tone' => 'primary_soft', 'x' => 48, 'y' => 292, 'w' => 244, 'h' => 88, 'z' => 4]),
$layer('title', 'text', ['bind' => 'name', 'x' => 60, 'y' => 312, 'w' => 220, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('thin-rule', '细金线题签', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 16, 'y' => 16, 'w' => 308, 'h' => 268, 'z' => 2]),
$layer('rule', 'deco', ['asset' => 'thin-rule', 'tone' => 'primary', 'x' => 24, 'y' => 300, 'w' => 120, 'h' => 8, 'z' => 4]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 318, 'w' => 292, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('inset-slot', '内凹卡槽', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'bg_soft', 'z' => 0, 'locked' => true]),
$layer('slot', 'deco', ['asset' => 'inset-shadow', 'tone' => 'border', 'x' => 20, 'y' => 20, 'w' => 300, 'h' => 268, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 36, 'y' => 36, 'w' => 268, 'h' => 236, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 28, 'y' => 312, 'w' => 284, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('double-frame', '双线金框', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('outer', 'deco', ['asset' => 'double-frame', 'tone' => 'primary', 'x' => 10, 'y' => 10, 'w' => 320, 'h' => 400, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 34, 'y' => 34, 'w' => 272, 'h' => 248, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 34, 'y' => 304, 'w' => 272, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('arch-mat', '拱形衬纸', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('arch', 'deco', ['asset' => 'arch-mat', 'tone' => 'primary_soft', 'x' => 28, 'y' => 20, 'w' => 284, 'h' => 280, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 44, 'y' => 36, 'w' => 252, 'h' => 248, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 28, 'y' => 320, 'w' => 284, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('circle-window', '圆形开窗', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('ring', 'deco', ['asset' => 'circle-crop', 'tone' => 'primary', 'x' => 46, 'y' => 24, 'w' => 248, 'h' => 248, 'z' => 3]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 58, 'y' => 36, 'w' => 224, 'h' => 224, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 300, 'w' => 292, 'h' => 52, 'font' => 'title', 'z' => 5]),
]),
$pack('l-bracket', 'L 型护角', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 28, 'y' => 28, 'w' => 284, 'h' => 252, 'z' => 2]),
$layer('br', 'deco', ['asset' => 'corner-bracket', 'tone' => 'accent', 'x' => 12, 'y' => 12, 'w' => 316, 'h' => 284, 'z' => 6]),
$layer('title', 'text', ['bind' => 'name', 'x' => 28, 'y' => 308, 'w' => 284, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('vignette', '暗角剧照', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 0, 'y' => 0, 'w' => 340, 'h' => 300, 'z' => 2]),
$layer('vig', 'deco', ['asset' => 'vignette', 'tone' => 'text', 'x' => 0, 'y' => 0, 'w' => 340, 'h' => 300, 'z' => 3]),
$layer('title', 'text', ['bind' => 'name', 'x' => 20, 'y' => 324, 'w' => 300, 'h' => 52, 'font' => 'title', 'z' => 5]),
]),
$pack('cap-rail', '上沿帽檐', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('cap', 'deco', ['asset' => 'cap-rail', 'tone' => 'primary', 'x' => 0, 'y' => 0, 'w' => 340, 'h' => 28, 'z' => 6]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 16, 'y' => 36, 'w' => 308, 'h' => 252, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 20, 'y' => 308, 'w' => 300, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('gutter-fold', '对开折页', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 16, 'y' => 16, 'w' => 308, 'h' => 268, 'z' => 2]),
$layer('fold', 'deco', ['asset' => 'gutter-fold', 'tone' => 'border', 'x' => 164, 'y' => 16, 'w' => 12, 'h' => 268, 'z' => 4]),
$layer('title', 'text', ['bind' => 'name', 'x' => 20, 'y' => 308, 'w' => 300, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('pearl-bead', '软圆角珠边', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('bead', 'deco', ['asset' => 'pearl-bead', 'tone' => 'accent', 'x' => 12, 'y' => 12, 'w' => 316, 'h' => 396, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 36, 'y' => 36, 'w' => 268, 'h' => 236, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 36, 'y' => 296, 'w' => 268, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('vert-caption', '侧向竖排', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 16, 'y' => 16, 'w' => 248, 'h' => 388, 'z' => 2]),
$layer('rail', 'deco', ['asset' => 'vert-caption', 'tone' => 'primary', 'x' => 276, 'y' => 24, 'w' => 48, 'h' => 372, 'z' => 4]),
$layer('title', 'text', ['bind' => 'name', 'x' => 268, 'y' => 80, 'w' => 64, 'h' => 260, 'font' => 'caption', 'rotate' => 90, 'z' => 5]),
]),
$pack('ribbon-bow', '缎带压角', 'lux', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 24, 'y' => 36, 'w' => 292, 'h' => 248, 'z' => 2]),
$layer('bow', 'deco', ['asset' => 'ribbon', 'tone' => 'accent', 'x' => 236, 'y' => 8, 'w' => 88, 'h' => 56, 'rotate' => 8, 'z' => 6]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 308, 'w' => 292, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('polaroid', '宝丽来题签', 'editorial', [
$layer('bg', 'shape', ['x' => 18, 'y' => 12, 'w' => 304, 'h' => 396, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 34, 'y' => 28, 'w' => 272, 'h' => 272, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 34, 'y' => 320, 'w' => 272, 'h' => 56, 'font' => 'caption', 'z' => 5]),
]),
$pack('stacked-offset', '错层影卡', 'editorial', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('deck', 'deco', ['asset' => 'shadow-deck', 'tone' => 'border', 'x' => 52, 'y' => 40, 'w' => 236, 'h' => 200, 'rotate' => 7, 'z' => 1]),
$layer('photo-back', 'photo', ['bind' => 'gallery', 'x' => 52, 'y' => 40, 'w' => 236, 'h' => 200, 'rotate' => 7, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 28, 'y' => 52, 'w' => 236, 'h' => 200, 'rotate' => -3, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 292, 'w' => 292, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('film-sprocket', '胶片齿孔', 'editorial', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface_soft', 'z' => 0, 'locked' => true]),
$layer('film', 'deco', ['asset' => 'film-sprocket', 'tone' => 'text_soft', 'x' => 8, 'y' => 36, 'w' => 324, 'h' => 248, 'z' => 3]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 36, 'y' => 52, 'w' => 268, 'h' => 216, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 312, 'w' => 292, 'h' => 48, 'font' => 'caption', 'z' => 5]),
]),
$pack('folio-number', '刊号页码', 'editorial', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('num', 'deco', ['asset' => 'folio-number', 'tone' => 'primary', 'x' => 20, 'y' => 16, 'w' => 88, 'h' => 36, 'z' => 6]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 20, 'y' => 60, 'w' => 300, 'h' => 240, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 20, 'y' => 320, 'w' => 300, 'h' => 48, 'font' => 'title', 'z' => 5]),
$layer('text-vol', 'text', ['text' => 'VOL. 08', 'x' => 24, 'y' => 18, 'w' => 80, 'h' => 28, 'font' => 'caption', 'z' => 7]),
]),
$pack('stamp-ring', '邮戳圆环', 'editorial', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 24, 'y' => 24, 'w' => 292, 'h' => 252, 'z' => 2]),
$layer('stamp', 'deco', ['asset' => 'stamp-ring', 'tone' => 'accent', 'x' => 232, 'y' => 300, 'w' => 84, 'h' => 84, 'rotate' => -12, 'z' => 6]),
$layer('title', 'text', ['bind' => 'name', 'x' => 24, 'y' => 300, 'w' => 196, 'h' => 56, 'font' => 'title', 'z' => 5]),
]),
$pack('lace-corner', '蕾丝角花', 'editorial', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('lace', 'deco', ['asset' => 'lace-corner', 'tone' => 'primary_soft', 'x' => 6, 'y' => 6, 'w' => 328, 'h' => 408, 'z' => 6]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 36, 'y' => 40, 'w' => 268, 'h' => 236, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 36, 'y' => 300, 'w' => 268, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('washi-tape', '和纸胶带', 'atelier', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 28, 'y' => 40, 'w' => 284, 'h' => 236, 'z' => 2]),
$layer('tape-t', 'deco', ['asset' => 'washi-1', 'tone' => 'accent', 'x' => 44, 'y' => 16, 'w' => 96, 'h' => 26, 'rotate' => 8, 'z' => 6]),
$layer('tape-b', 'deco', ['asset' => 'washi-1', 'tone' => 'primary_soft', 'x' => 200, 'y' => 252, 'w' => 88, 'h' => 24, 'rotate' => -7, 'z' => 6]),
$layer('title', 'text', ['bind' => 'name', 'x' => 28, 'y' => 304, 'w' => 284, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('botanical', '干花压角', 'atelier', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 32, 'y' => 40, 'w' => 276, 'h' => 236, 'z' => 2]),
$layer('leaf-tl', 'deco', ['asset' => 'botanical', 'tone' => 'accent', 'x' => 4, 'y' => 4, 'w' => 80, 'h' => 80, 'rotate' => -14, 'z' => 6]),
$layer('leaf-br', 'deco', ['asset' => 'botanical', 'tone' => 'primary', 'x' => 256, 'y' => 336, 'w' => 72, 'h' => 72, 'rotate' => 148, 'z' => 6]),
$layer('title', 'text', ['bind' => 'name', 'x' => 32, 'y' => 296, 'w' => 276, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('torn-edge', '撕边剪贴', 'atelier', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('torn', 'deco', ['asset' => 'torn-edge', 'tone' => 'text_soft', 'x' => 20, 'y' => 24, 'w' => 300, 'h' => 260, 'rotate' => -1, 'z' => 1]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 32, 'y' => 36, 'w' => 276, 'h' => 236, 'z' => 2]),
$layer('title', 'text', ['bind' => 'name', 'x' => 28, 'y' => 308, 'w' => 284, 'h' => 48, 'font' => 'title', 'z' => 5]),
]),
$pack('handwriting', '手写题签', 'atelier', [
$layer('bg', 'shape', ['x' => 0, 'y' => 0, 'w' => 340, 'h' => 420, 'fill' => 'surface', 'z' => 0, 'locked' => true]),
$layer('photo', 'photo', ['bind' => 'cover', 'x' => 24, 'y' => 20, 'w' => 292, 'h' => 268, 'z' => 2]),
$layer('tag', 'deco', ['asset' => 'handwriting', 'tone' => 'primary', 'x' => 28, 'y' => 348, 'w' => 200, 'h' => 36, 'rotate' => -3, 'z' => 6]),
$layer('title', 'text', ['bind' => 'name', 'x' => 36, 'y' => 308, 'w' => 240, 'h' => 40, 'font' => 'caption', 'rotate' => -2, 'z' => 5]),
]),
];

419
config/wx_page_presets.php Normal file
View File

@@ -0,0 +1,419 @@
<?php
/**
* 6 × 30 套整页预设:只描述组合,不写 Vue
*
* 套用时写入 layout.page_presets.{page} + pages.{page}.sections / skin / density / frame
*/
$sec = static function (string $type, string $variant, bool $visible = true, array $props = []): array {
return [
'id' => $type,
'type' => $type,
'variant' => $variant,
'visible' => $visible,
'props' => $props,
];
};
$row = static function (
string $code,
string $name,
string $page,
array $sections,
string $cardScheme = 'clay-edge',
string $density = 'regular',
string $frame = 'none',
string $skin = 'shop',
string $family = '',
): array {
return [
'code' => $code,
'name' => $name,
'page' => $page,
'card_scheme' => $cardScheme,
'density' => $density,
'frame' => $frame,
'skin' => $skin,
'family' => $family,
'sections' => $sections,
];
};
$home = [
$row('home-01-classic', '经典轮播宫格', 'home', [
$sec('search', 'bar'), $sec('hero', 'carousel', true, ['height' => 480]),
$sec('category', 'grid', true, ['cols' => 3]), $sec('product', 'grid', false),
], 'clay-edge', 'regular', 'none', 'shop', '店面'),
$row('home-02-banner-pills', '横幅胶囊', 'home', [
$sec('search', 'pill'), $sec('hero', 'banner', true, ['height' => 280]),
$sec('category', 'pills'), $sec('product', 'grid', false),
], 'pearl-line', 'compact', 'none', 'shop', '店面'),
$row('home-03-split-card', '对开卡片', 'home', [
$sec('search', 'bar'), $sec('hero', 'split', true, ['height' => 420]),
$sec('category', 'card', true, ['cols' => 2]), $sec('product', 'grid', false),
], 'walnut-frame', 'regular', 'inset', 'shop', '店面'),
$row('home-04-full-scroll', '全屏横滑', 'home', [
$sec('search', 'bar'), $sec('hero', 'fullscreen', true, ['height' => 640]),
$sec('category', 'scroll'), $sec('product', 'waterfall', false),
], 'champagne-foil', 'airy', 'none', 'shop', '店面'),
$row('home-05-stack-grid', '堆叠宫格', 'home', [
$sec('search', 'bar'), $sec('hero', 'stack', true, ['height' => 520]),
$sec('category', 'grid', true, ['cols' => 3]), $sec('product', 'grid', false),
], 'double-frame', 'regular', 'none', 'shop', '店面'),
$row('home-06-coverflow-tile', '封面流瓷砖', 'home', [
$sec('search', 'float'), $sec('hero', 'coverflow', true, ['height' => 480]),
$sec('category', 'tile'), $sec('product', 'grid', false),
], 'gold-corner', 'regular', 'inset', 'shop', '店面'),
$row('home-07-fade-mosaic', '叠化马赛克', 'home', [
$sec('search', 'bar'), $sec('hero', 'fade', true, ['height' => 500]),
$sec('category', 'mosaic'), $sec('product', 'grid', false),
], 'museum-mat', 'airy', 'none', 'shop', '店面'),
$row('home-08-peek-featured', '露边首图', 'home', [
$sec('search', 'pill'), $sec('hero', 'peek', true, ['height' => 460]),
$sec('category', 'featured'), $sec('product', 'list', false),
], 'cap-rail', 'regular', 'none', 'shop', '店面'),
$row('home-09-cube-sidebar', '立方侧栏', 'home', [
$sec('search', 'bar'), $sec('hero', 'cube', true, ['height' => 440]),
$sec('category', 'sidebar'), $sec('product', 'grid', false),
], 'l-bracket', 'compact', 'inset', 'shop', '店面'),
$row('home-10-caption-grid', '刊名条宫格', 'home', [
$sec('search', 'bar'), $sec('hero', 'caption', true, ['height' => 520]),
$sec('category', 'grid', true, ['cols' => 4]), $sec('product', 'grid', false),
], 'thin-rule', 'regular', 'ornament', 'shop', '店面'),
$row('home-11-carousel-card', '轮播大卡', 'home', [
$sec('search', 'bar'), $sec('hero', 'carousel', true, ['height' => 400]),
$sec('category', 'card', true, ['cols' => 2]), $sec('product', 'waterfall', false),
], 'inset-slot', 'regular', 'none', 'shop', '店面'),
$row('home-12-banner-tile', '横幅瓷砖', 'home', [
$sec('search', 'float'), $sec('hero', 'banner', true, ['height' => 240]),
$sec('category', 'tile'), $sec('product', 'grid', false),
], 'pearl-bead', 'compact', 'none', 'shop', '店面'),
$row('home-13-split-scroll', '对开横滑', 'home', [
$sec('search', 'pill'), $sec('hero', 'split', true, ['height' => 400]),
$sec('category', 'scroll'), $sec('product', 'grid', false),
], 'gutter-fold', 'regular', 'none', 'shop', '店面'),
$row('home-14-full-pills', '全屏胶囊', 'home', [
$sec('search', 'overlay'), $sec('hero', 'fullscreen', true, ['height' => 680]),
$sec('category', 'pills'), $sec('product', 'grid', false),
], 'vignette', 'airy', 'none', 'shop', '店面'),
$row('home-15-stack-mosaic', '堆叠马赛克', 'home', [
$sec('search', 'bar'), $sec('hero', 'stack', true, ['height' => 500]),
$sec('category', 'mosaic'), $sec('product', 'grid', false),
], 'arch-mat', 'regular', 'inset', 'shop', '店面'),
$row('home-16-coverflow-sidebar', '封面流侧栏', 'home', [
$sec('search', 'bar'), $sec('hero', 'coverflow', true, ['height' => 460]),
$sec('category', 'sidebar'), $sec('product', 'list', false),
], 'circle-window', 'compact', 'none', 'shop', '店面'),
$row('home-17-fade-card', '叠化卡片', 'home', [
$sec('search', 'bar'), $sec('hero', 'fade', true, ['height' => 480]),
$sec('category', 'card', true, ['cols' => 2]), $sec('product', 'grid', false),
], 'emboss-plate', 'airy', 'ornament', 'shop', '店面'),
$row('home-18-peek-grid', '露边宫格', 'home', [
$sec('search', 'pill'), $sec('hero', 'peek', true, ['height' => 440]),
$sec('category', 'grid', true, ['cols' => 3]), $sec('product', 'grid', false),
], 'vert-caption', 'regular', 'none', 'shop', '店面'),
$row('home-19-cube-featured', '立方首图', 'home', [
$sec('search', 'bar'), $sec('hero', 'cube', true, ['height' => 460]),
$sec('category', 'featured'), $sec('product', 'waterfall', false),
], 'ribbon-bow', 'regular', 'inset', 'shop', '店面'),
$row('home-20-caption-scroll', '刊名横滑', 'home', [
$sec('search', 'float'), $sec('hero', 'caption', true, ['height' => 500]),
$sec('category', 'scroll'), $sec('product', 'grid', false),
], 'folio-line', 'airy', 'none', 'shop', '店面'),
$row('home-21-carousel-mosaic', '轮播马赛克', 'home', [
$sec('search', 'bar'), $sec('hero', 'carousel', true, ['height' => 460]),
$sec('category', 'mosaic'), $sec('product', 'grid', false),
], 'washi-tape', 'regular', 'none', 'shop', '店面'),
$row('home-22-banner-sidebar', '横幅侧栏', 'home', [
$sec('search', 'bar'), $sec('hero', 'banner', true, ['height' => 260]),
$sec('category', 'sidebar'), $sec('product', 'list', false),
], 'botanical', 'compact', 'inset', 'shop', '店面'),
$row('home-23-split-pills', '对开胶囊', 'home', [
$sec('search', 'pill'), $sec('hero', 'split', true, ['height' => 400]),
$sec('category', 'pills'), $sec('product', 'grid', false),
], 'handwriting', 'regular', 'none', 'shop', '店面'),
$row('home-24-stack-tile', '堆叠瓷砖', 'home', [
$sec('search', 'bar'), $sec('hero', 'stack', true, ['height' => 500]),
$sec('category', 'tile'), $sec('product', 'grid', false),
], 'torn-edge', 'regular', 'none', 'shop', '店面'),
$row('home-25-peek-card', '露边大卡', 'home', [
$sec('search', 'overlay'), $sec('hero', 'peek', true, ['height' => 480]),
$sec('category', 'card', true, ['cols' => 2]), $sec('product', 'grid', false),
], 'polaroid', 'airy', 'ornament', 'shop', '店面'),
$row('home-26-cube-grid', '立方宫格', 'home', [
$sec('search', 'bar'), $sec('hero', 'cube', true, ['height' => 440]),
$sec('category', 'grid', true, ['cols' => 3]), $sec('product', 'grid', false),
], 'stacked-offset', 'regular', 'none', 'shop', '店面'),
$row('home-magazine-folio', '刊页封面目录', 'home', [
$sec('search', 'overlay'), $sec('hero', 'caption', true, ['height' => 640]),
$sec('category', 'contents'), $sec('product', 'grid', false),
], 'folio-number', 'airy', 'ornament', 'magazine', '刊页'),
$row('home-magazine-spread', '刊页对开目录', 'home', [
$sec('search', 'overlay'), $sec('hero', 'split', true, ['height' => 560]),
$sec('category', 'contents'), $sec('product', 'grid', false),
], 'folio-line', 'airy', 'ornament', 'magazine', '刊页'),
$row('home-magazine-fade', '刊页叠化目录', 'home', [
$sec('search', 'overlay'), $sec('hero', 'fade', true, ['height' => 620]),
$sec('category', 'contents'), $sec('product', 'grid', false),
], 'vignette', 'airy', 'ornament', 'magazine', '刊页'),
$row('home-magazine-film', '刊页胶片目录', 'home', [
$sec('search', 'overlay'), $sec('hero', 'peek', true, ['height' => 520]),
$sec('category', 'contents'), $sec('product', 'grid', false),
], 'film-sprocket', 'airy', 'ornament', 'magazine', '刊页'),
];
$schemes = [
'clay-edge', 'pearl-line', 'walnut-frame', 'champagne-foil', 'museum-mat',
'double-frame', 'arch-mat', 'circle-window', 'polaroid', 'film-sprocket',
];
/** 图册10 列表 × 3 顶栏,两套之间至少差列表+顶栏 */
$catalogPairs = [];
foreach (['waterfall', 'grid', 'list', 'masonry', 'featured', 'shelf', 'compact', 'airy', 'mosaic', 'duo'] as $list) {
foreach (['chip', 'bar', 'sidebar'] as $filter) {
$catalogPairs[] = [$list, $filter];
}
}
$catalogNames = [
'瀑布·分类条', '瀑布·仅搜索', '瀑布·侧栏',
'双列·分类条', '双列·仅搜索', '双列·侧栏',
'单列·分类条', '单列·仅搜索', '单列·侧栏',
'砌石·分类条', '砌石·仅搜索', '砌石·侧栏',
'首图·分类条', '首图·仅搜索', '首图·侧栏',
'货架·分类条', '货架·仅搜索', '货架·侧栏',
'紧凑·分类条', '紧凑·仅搜索', '紧凑·侧栏',
'疏朗·分类条', '疏朗·仅搜索', '疏朗·侧栏',
'马赛克·分类条', '马赛克·仅搜索', '马赛克·侧栏',
'对开·分类条', '对开·仅搜索', '对开·侧栏',
];
$catalog = [];
foreach ($catalogPairs as $i => [$list, $filter]) {
$n = str_pad((string) ($i + 1), 2, '0', STR_PAD_LEFT);
$catalog[] = $row(
'catalog-' . $n . '-' . $list,
$catalogNames[$i],
'catalog',
[$sec('filter', $filter), $sec('list', $list, true, ['card_scheme' => $schemes[$i % 10]])],
$schemes[$i % 10],
'regular',
'none',
'shop',
'图册',
);
}
/** 搜索10 列表 × 3 搜索条 */
$searchPairs = [];
foreach (['waterfall', 'grid', 'list', 'masonry', 'featured', 'shelf', 'compact', 'airy', 'mosaic', 'duo'] as $list) {
foreach (['bar', 'pill', 'float'] as $searchVar) {
$searchPairs[] = [$list, $searchVar];
}
}
$searchNames = [
'瀑布·搜索条', '瀑布·胶囊', '瀑布·悬浮',
'双列·搜索条', '双列·胶囊', '双列·悬浮',
'单列·搜索条', '单列·胶囊', '单列·悬浮',
'砌石·搜索条', '砌石·胶囊', '砌石·悬浮',
'首图·搜索条', '首图·胶囊', '首图·悬浮',
'货架·搜索条', '货架·胶囊', '货架·悬浮',
'紧凑·搜索条', '紧凑·胶囊', '紧凑·悬浮',
'疏朗·搜索条', '疏朗·胶囊', '疏朗·悬浮',
'马赛克·搜索条', '马赛克·胶囊', '马赛克·悬浮',
'对开·搜索条', '对开·胶囊', '对开·悬浮',
];
$search = [];
foreach ($searchPairs as $i => [$list, $searchVar]) {
$n = str_pad((string) ($i + 1), 2, '0', STR_PAD_LEFT);
$search[] = $row(
'search-' . $n . '-' . $list,
$searchNames[$i],
'search',
[$sec('search', $searchVar), $sec('list', $list, true, ['card_scheme' => $schemes[$i % 10]])],
$schemes[$i % 10],
'regular',
'none',
'shop',
'搜索',
);
}
/** 详情30 套互异交叉spec 与 action 不再锁死同一余数 */
$productCombos = [
['swiper', 'plain', 'plain', 'inline', 'fixed', '轮播·表·底栏'],
['swiper', 'editorial', 'table', 'card', 'inline', '轮播·编辑表·跟文'],
['stack', 'plain', 'chips', 'inline', 'split', '叠图·芯片·拆开'],
['stack', 'split', 'cards', 'card', 'fixed', '叠图·分栏卡·底栏'],
['fullbleed', 'plain', 'table', 'sticky', 'fixed', '全出血·吸顶表'],
['fullbleed', 'overlay', 'plain', 'sticky', 'split', '全出血·压字·拆开'],
['peek', 'editorial', 'chips', 'inline', 'inline', '露边·编辑芯片'],
['peek', 'split', 'cards', 'card', 'fixed', '露边·分栏卡'],
['fade', 'plain', 'table', 'inline', 'split', '叠化·表·拆开'],
['fade', 'overlay', 'chips', 'sticky', 'fixed', '叠化·压字芯片'],
['coverflow', 'editorial', 'cards', 'card', 'inline', '封面流·编辑卡'],
['coverflow', 'split', 'plain', 'inline', 'fixed', '封面流·分栏表'],
['mosaic', 'plain', 'chips', 'card', 'split', '拼贴·芯片卡'],
['mosaic', 'editorial', 'table', 'sticky', 'inline', '拼贴·编辑吸顶'],
['filmstrip', 'overlay', 'cards', 'inline', 'fixed', '胶卷·压字卡'],
['filmstrip', 'split', 'plain', 'card', 'split', '胶卷·分栏拆开'],
['swiper', 'split', 'cards', 'sticky', 'inline', '轮播·分栏吸顶卡'],
['stack', 'overlay', 'table', 'sticky', 'inline', '叠图·压字吸顶'],
['fullbleed', 'editorial', 'chips', 'card', 'inline', '全出血·编辑芯片'],
['peek', 'plain', 'plain', 'card', 'split', '露边·报价卡拆开'],
['fade', 'editorial', 'cards', 'card', 'fixed', '叠化·编辑卡底栏'],
['coverflow', 'overlay', 'table', 'sticky', 'split', '封面流·压字吸顶'],
['mosaic', 'split', 'plain', 'sticky', 'fixed', '拼贴·分栏吸顶'],
['filmstrip', 'plain', 'table', 'sticky', 'inline', '胶卷·吸顶表'],
['swiper', 'overlay', 'chips', 'inline', 'split', '轮播·压字芯片'],
['stack', 'editorial', 'plain', 'card', 'fixed', '叠图·编辑报价卡'],
['fullbleed', 'split', 'cards', 'inline', 'fixed', '全出血·分栏卡'],
['peek', 'overlay', 'table', 'sticky', 'inline', '露边·压字吸顶'],
['fade', 'split', 'plain', 'card', 'inline', '叠化·分栏报价卡'],
['coverflow', 'plain', 'chips', 'card', 'split', '封面流·芯片拆开'],
];
$product = [];
foreach ($productCombos as $i => [$g, $info, $spec, $priceMode, $act, $name]) {
$n = str_pad((string) ($i + 1), 2, '0', STR_PAD_LEFT);
$product[] = $row(
'product-' . $n . '-' . $g,
$name,
'product',
[
$sec('gallery', $g),
$sec('info', $info),
$sec('spec', $spec),
$sec('price', $priceMode),
$sec('action', $act),
],
$schemes[$i % 10],
'regular',
'none',
$info === 'overlay' ? 'magazine' : 'shop',
'详情',
);
}
/** 清单6 形态各出现一次主结构,再用 5 组不同卡片方案拉开,避免同形态连号克隆 */
$cartModes = [
['card', '卡片陈列'],
['table', '表格清单'],
['timeline', '时间线'],
['compact', '紧凑条'],
['ticket', '票根'],
['stacked', '层叠'],
];
$cart = [];
for ($i = 0; $i < 30; $i++) {
$n = str_pad((string) ($i + 1), 2, '0', STR_PAD_LEFT);
[$mode, $label] = $cartModes[$i % 6];
$scheme = $schemes[intdiv($i, 6) % 10];
$cart[] = $row(
'cart-' . $n . '-' . $mode,
$label . ' · ' . ['素胚', '珠贝', '胡桃', '香槟', '卡纸'][intdiv($i, 6) % 5],
'cart',
[$sec('list', $mode)],
$scheme,
'regular',
'none',
'shop',
'清单',
);
}
/** 我的5 头 × 5 菜单 = 25 互异,后 5 套刊页皮肤换菜单 */
$minePairs = [];
foreach (['gradient', 'image', 'plain', 'split', 'editorial'] as $h) {
foreach (['grid', 'list', 'card', 'tile', 'compact'] as $m) {
$minePairs[] = [$h, $m, 'shop'];
}
}
$minePairs[] = ['editorial', 'list', 'magazine'];
$minePairs[] = ['plain', 'tile', 'magazine'];
$minePairs[] = ['split', 'card', 'magazine'];
$minePairs[] = ['image', 'compact', 'magazine'];
$minePairs[] = ['gradient', 'grid', 'magazine'];
$mineLabels = [
'gradient' => '渐变', 'image' => '头图', 'plain' => '素底', 'split' => '分栏', 'editorial' => '编辑',
];
$menuLabels = [
'grid' => '宫格', 'list' => '列表', 'card' => '卡片', 'tile' => '瓷砖', 'compact' => '紧凑',
];
$mine = [];
foreach ($minePairs as $i => [$h, $m, $skin]) {
$n = str_pad((string) ($i + 1), 2, '0', STR_PAD_LEFT);
$mine[] = $row(
'mine-' . $n . '-' . $h,
($mineLabels[$h] ?? $h) . '·' . ($menuLabels[$m] ?? $m) . ($skin === 'magazine' ? '·刊页' : ''),
'mine',
[$sec('header', $h), $sec('menu', $m)],
$schemes[$i % 10],
'regular',
$skin === 'magazine' ? 'ornament' : 'none',
$skin,
'我的',
);
}
/** 每页最前一条可选「默认」,详情钉在底部 */
array_unshift($home, $row('home-00-default', '默认', 'home', [
$sec('search', 'bar'), $sec('hero', 'carousel', true, ['height' => 480]),
$sec('category', 'grid', true, ['cols' => 3]), $sec('product', 'grid', false),
], 'clay-edge', 'regular', 'none', 'shop', '默认'));
array_unshift($catalog, $row('catalog-00-default', '默认', 'catalog', [
$sec('filter', 'chip'), $sec('list', 'waterfall', true, ['card_scheme' => 'clay-edge']),
], 'clay-edge', 'regular', 'none', 'shop', '默认'));
array_unshift($search, $row('search-00-default', '默认', 'search', [
$sec('search', 'bar'), $sec('list', 'waterfall', true, ['card_scheme' => 'clay-edge']),
], 'clay-edge', 'regular', 'none', 'shop', '默认'));
array_unshift($product, $row('product-00-default', '默认', 'product', [
$sec('gallery', 'swiper'), $sec('info', 'plain'), $sec('spec', 'plain'),
$sec('price', 'inline'), $sec('action', 'fixed'),
], 'clay-edge', 'regular', 'none', 'shop', '默认'));
array_unshift($cart, $row('cart-00-default', '默认', 'cart', [
$sec('list', 'card'),
], 'clay-edge', 'regular', 'none', 'shop', '默认'));
array_unshift($mine, $row('mine-00-default', '默认', 'mine', [
$sec('header', 'gradient'), $sec('menu', 'list'),
], 'clay-edge', 'regular', 'none', 'shop', '默认'));
// 旧首页预设没有套餐段,插在分类后面,避免初始化预设把热门套餐漏掉
foreach ($home as &$homeRow) {
$sections = $homeRow['sections'] ?? [];
$has = false;
foreach ($sections as $section) {
if (($section['type'] ?? '') === 'package') {
$has = true;
break;
}
}
if ($has) {
continue;
}
$next = [];
foreach ($sections as $section) {
$next[] = $section;
if (($section['type'] ?? '') === 'category') {
$next[] = $sec('package', 'card');
}
}
$homeRow['sections'] = $next;
}
unset($homeRow);
$package = [
$row('package-00-default', '默认', 'package', [$sec('list', 'card')], 'clay-edge', 'regular', 'none', 'shop', '默认'),
$row('package-01-card', '封面卡片', 'package', [$sec('list', 'card')], 'champagne-foil', 'regular', 'none', 'shop', '套餐'),
$row('package-02-featured', '首图通栏', 'package', [$sec('list', 'featured')], 'walnut-frame', 'regular', 'inset', 'shop', '套餐'),
$row('package-03-magazine', '刊名目录', 'package', [$sec('list', 'magazine')], 'thin-rule', 'airy', 'ornament', 'magazine', '套餐'),
$row('package-04-list', '单列图文', 'package', [$sec('list', 'list')], 'pearl-line', 'compact', 'none', 'shop', '套餐'),
];
return [
'home' => $home,
'catalog' => $catalog,
'search' => $search,
'product' => $product,
'cart' => $cart,
'mine' => $mine,
'package' => $package,
];

View File

@@ -1,234 +1,382 @@
<?php
/**
* 小程序装修模板预设(20 套)
* 小程序装修模板预设(4 套店面轻奢 + 1 刊页
*
* 每套模板的差异不只是主色:字体族与字号梯度、圆角、阴影、动效时长与曲线、
* 以及首页/详情/清单/我的四个页面的排布都不一样。这里用紧凑的规格描述,
* WxTemplatePresetService 展开成完整令牌,避免 20 份手抄 JSON 互相抄错
*
* scale/radius/shadow/motion 的取值见 WxTemplatePresetService 里的对应表。
* 首期精修「轻奢」系列(前 4 套),其余先占位可用,后续按期打磨。
* 色板共用一族暖中性,差异只在主色/底色深浅。layout 同时带旧枚举
* (小程序未升级时仍能用)和 pages.sections装修工作室拖拽编排
* card_scheme 指向 30 canvas 卡片预设之一
*/
$section = static function (string $id, string $type, string $variant, array $props = [], bool $visible = true): array {
return [
'id' => $id,
'type' => $type,
'variant' => $variant,
'visible' => $visible,
'props' => $props,
];
};
$buildPages = static function (
array $home,
array $product,
string $cardScheme,
string $goodsList,
string $listStyle,
string $mineHeader,
string $mineMenu,
string $homePreset = 'home-01-classic',
string $homeSkin = 'shop',
string $searchVariant = 'bar',
string $categoryVariant = '',
array $homeMeta = [],
array $pageCodes = [],
array $chrome = [],
) use ($section): array {
$cat = $categoryVariant !== '' ? $categoryVariant : $home['category'];
return [
'card_scheme' => $cardScheme,
'chrome' => array_merge([
'tabbar' => 'plain',
'navbar' => 'solid',
'tabbar_anim' => 'slide',
], $chrome),
'page_presets' => array_merge([
'home' => $homePreset,
'catalog' => 'catalog-01-waterfall',
'search' => 'search-01-waterfall',
'product' => 'product-00-default',
'cart' => 'cart-01-card',
'mine' => 'mine-01-gradient',
'package' => 'package-00-default',
], $pageCodes),
'pages' => [
'home' => [
'skin' => $homeSkin,
'density' => $homeMeta['density'] ?? 'regular',
'frame' => $homeMeta['frame'] ?? 'none',
'card_scheme' => $cardScheme,
'sections' => [
$section('search', 'search', $searchVariant),
$section('hero', 'hero', $home['hero'], ['height' => (int) ($homeMeta['hero_height'] ?? 480)]),
$section('category', 'category', $cat, ['cols' => 3]),
$section('package', 'package', 'card'),
// 原首页没有商品流,默认关,装修里可再打开
$section('product', 'product', $home['product'], ['card_scheme' => $cardScheme], false),
],
],
'package' => [
'card_scheme' => $cardScheme,
'sections' => [
$section('list', 'list', 'card'),
],
],
'catalog' => [
'card_scheme' => $cardScheme,
'sections' => [
$section('filter', 'filter', 'chip'),
$section('list', 'list', $goodsList, ['card_scheme' => $cardScheme]),
],
],
'search' => [
'card_scheme' => $cardScheme,
'sections' => [
$section('search', 'search', 'bar'),
$section('list', 'list', $goodsList, ['card_scheme' => $cardScheme]),
],
],
'product' => [
'card_scheme' => $cardScheme,
'sections' => [
$section('gallery', 'gallery', $product['gallery']),
$section('info', 'info', $product['info'] ?? 'plain'),
$section('spec', 'spec', $product['spec'] ?? 'plain'),
$section('price', 'price', $product['price'] ?? 'inline'),
$section('action', 'action', $product['action'] ?? 'fixed'),
],
],
'cart' => [
'card_scheme' => $cardScheme,
'sections' => [
$section('list', 'list', $listStyle),
],
],
'mine' => [
'card_scheme' => $cardScheme,
'sections' => [
$section('header', 'header', $mineHeader),
$section('menu', 'menu', $mineMenu),
],
],
],
];
};
return [
[
'code' => 'lux-champagne',
'name' => '轻奢·香槟金',
'code' => 'nature-clay',
'name' => '素胚',
'style_tag' => '轻奢',
'palette' => ['primary' => '#B08D57', 'accent' => '#8C6A3F', 'bg' => '#FAF7F2', 'surface' => '#FFFFFF', 'text' => '#1C1917', 'border' => '#E7DFD3'],
'scale' => 'serif-elegant',
'palette' => [
'primary' => '#8A8178',
'accent' => '#C4B8A8',
'bg' => '#F4EFE6',
'surface' => '#EFE8DC',
'text' => '#1C1917',
'border' => '#E7DFD3',
],
'scale' => 'serif-book',
'radius' => 'soft',
'shadow' => 'airy',
'motion' => 'silk',
'layout' => ['home' => ['hero' => 'fullscreen', 'category' => 'scroll', 'product' => 'magazine'], 'product' => ['gallery' => 'fullbleed', 'price' => 'sticky', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'list'], 'effect' => ['transition' => 'fade', 'skeleton' => 'shimmer']],
],
[
'code' => 'lux-ink',
'name' => '轻奢·墨玉',
'style_tag' => '轻奢',
'palette' => ['primary' => '#C9A063', 'accent' => '#E8D5AE', 'bg' => '#14110F', 'surface' => '#1F1B18', 'text' => '#F5F0E8', 'border' => '#332C25'],
'scale' => 'serif-elegant',
'radius' => 'soft',
'shadow' => 'deep',
'motion' => 'silk',
'layout' => ['home' => ['hero' => 'fullscreen', 'category' => 'sidebar', 'product' => 'grid'], 'product' => ['gallery' => 'stack', 'price' => 'card', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'image', 'menu' => 'list'], 'effect' => ['transition' => 'fade', 'skeleton' => 'shimmer']],
'shadow' => 'flat',
'motion' => 'gentle',
'layout' => array_merge(
[
'home' => ['hero' => 'split', 'category' => 'card', 'product' => 'waterfall'],
'product' => ['gallery' => 'swiper', 'price' => 'card', 'action' => 'fixed'],
'list' => ['style' => 'card'],
'mine' => ['header' => 'plain', 'menu' => 'list'],
'effect' => [
'transition' => 'fade',
'skeleton' => 'pulse',
'card' => 'plain',
'icon' => 'line',
],
],
$buildPages(
['hero' => 'split', 'category' => 'card', 'product' => 'waterfall'],
['gallery' => 'swiper', 'action' => 'fixed', 'info' => 'editorial', 'spec' => 'table', 'price' => 'card'],
'clay-edge',
'waterfall',
'card',
'plain',
'list',
'home-03-split-card',
'shop',
'bar',
'',
[],
[
'catalog' => 'catalog-02-waterfall',
'search' => 'search-02-waterfall',
'product' => 'product-00-default',
'cart' => 'cart-02-table',
'mine' => 'mine-11-plain',
],
['tabbar' => 'plain', 'navbar' => 'solid', 'tabbar_anim' => 'none'],
),
),
],
[
'code' => 'lux-pearl',
'name' => '轻奢·珠贝白',
'style_tag' => '轻奢',
'palette' => ['primary' => '#9C8E7E', 'accent' => '#CBBFA8', 'bg' => '#FFFFFF', 'surface' => '#F7F5F1', 'text' => '#2B2724', 'border' => '#EAE5DC'],
'palette' => [
'primary' => '#9C8E7E',
'accent' => '#D4C4A8',
'bg' => '#FFFCF8',
'surface' => '#F7F4EF',
'text' => '#1C1917',
'border' => '#E7DFD3',
],
'scale' => 'sans-refined',
'radius' => 'sharp',
'shadow' => 'airy',
'motion' => 'silk',
'layout' => ['home' => ['hero' => 'split', 'category' => 'grid', 'product' => 'waterfall'], 'product' => ['gallery' => 'swiper', 'price' => 'inline', 'action' => 'inline'], 'list' => ['style' => 'table'], 'mine' => ['header' => 'plain', 'menu' => 'grid'], 'effect' => ['transition' => 'slide', 'skeleton' => 'shimmer']],
'layout' => array_merge(
[
'home' => ['hero' => 'split', 'category' => 'grid', 'product' => 'waterfall'],
'product' => ['gallery' => 'swiper', 'price' => 'inline', 'action' => 'fixed'],
'list' => ['style' => 'table'],
'mine' => ['header' => 'plain', 'menu' => 'grid'],
'effect' => [
'transition' => 'fade',
'skeleton' => 'shimmer',
'card' => 'elevated',
'icon' => 'line',
],
],
$buildPages(
['hero' => 'split', 'category' => 'grid', 'product' => 'waterfall'],
['gallery' => 'swiper', 'action' => 'fixed', 'info' => 'plain', 'spec' => 'plain', 'price' => 'inline'],
'pearl-line',
'waterfall',
'table',
'plain',
'grid',
'home-01-classic',
'shop',
'bar',
'',
[],
[
'catalog' => 'catalog-04-grid',
'search' => 'search-04-grid',
'product' => 'product-00-default',
'cart' => 'cart-02-table',
'mine' => 'mine-03-gradient',
],
['tabbar' => 'line', 'navbar' => 'line', 'tabbar_anim' => 'slide'],
),
),
],
[
'code' => 'lux-walnut',
'name' => '轻奢·胡桃木',
'style_tag' => '轻奢',
'palette' => ['primary' => '#6F4E37', 'accent' => '#A9784F', 'bg' => '#F6F1EA', 'surface' => '#FFFDFA', 'text' => '#241B14', 'border' => '#E2D6C7'],
'palette' => [
'primary' => '#6F4E37',
'accent' => '#A9784F',
'bg' => '#F6F1EA',
'surface' => '#FFFDFA',
'text' => '#1C1917',
'border' => '#E7DFD3',
],
'scale' => 'serif-elegant',
'radius' => 'round',
'shadow' => 'soft',
'motion' => 'gentle',
'layout' => ['home' => ['hero' => 'carousel', 'category' => 'card', 'product' => 'magazine'], 'product' => ['gallery' => 'fullbleed', 'price' => 'card', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'list'], 'effect' => ['transition' => 'fade', 'skeleton' => 'pulse']],
'layout' => array_merge(
[
'home' => ['hero' => 'carousel', 'category' => 'card', 'product' => 'waterfall'],
'product' => ['gallery' => 'fullbleed', 'price' => 'card', 'action' => 'fixed'],
'list' => ['style' => 'card'],
'mine' => ['header' => 'gradient', 'menu' => 'list'],
'effect' => [
'transition' => 'fade',
'skeleton' => 'shimmer',
'card' => 'elevated',
'icon' => 'line',
],
],
$buildPages(
['hero' => 'carousel', 'category' => 'card', 'product' => 'waterfall'],
['gallery' => 'fullbleed', 'action' => 'fixed', 'info' => 'plain', 'spec' => 'table', 'price' => 'card'],
'walnut-frame',
'featured',
'card',
'gradient',
'list',
'home-11-carousel-card',
'shop',
'bar',
'',
[],
[
'catalog' => 'catalog-13-featured',
'search' => 'search-13-featured',
'product' => 'product-00-default',
'cart' => 'cart-01-card',
'mine' => 'mine-01-gradient',
],
['tabbar' => 'pill', 'navbar' => 'solid', 'tabbar_anim' => 'spring'],
),
),
],
[
'code' => 'minimal-linen',
'name' => '极简·亚麻',
'style_tag' => '极简',
'palette' => ['primary' => '#3F3F46', 'accent' => '#A1A1AA', 'bg' => '#FAFAF9', 'surface' => '#FFFFFF', 'text' => '#18181B', 'border' => '#E4E4E7'],
'scale' => 'sans-compact',
'radius' => 'sharp',
'shadow' => 'flat',
'motion' => 'snappy',
'layout' => ['home' => ['hero' => 'banner', 'category' => 'grid', 'product' => 'grid'], 'product' => ['gallery' => 'swiper', 'price' => 'inline', 'action' => 'inline'], 'list' => ['style' => 'table'], 'mine' => ['header' => 'plain', 'menu' => 'list'], 'effect' => ['transition' => 'none', 'skeleton' => 'pulse']],
],
[
'code' => 'minimal-mono',
'name' => '极简·黑白',
'style_tag' => '极简',
'palette' => ['primary' => '#000000', 'accent' => '#525252', 'bg' => '#FFFFFF', 'surface' => '#F5F5F5', 'text' => '#0A0A0A', 'border' => '#D4D4D4'],
'scale' => 'sans-wide',
'radius' => 'none',
'shadow' => 'flat',
'motion' => 'snappy',
'layout' => ['home' => ['hero' => 'split', 'category' => 'scroll', 'product' => 'list'], 'product' => ['gallery' => 'stack', 'price' => 'inline', 'action' => 'inline'], 'list' => ['style' => 'table'], 'mine' => ['header' => 'plain', 'menu' => 'list'], 'effect' => ['transition' => 'slide', 'skeleton' => 'none']],
],
[
'code' => 'modern-indigo',
'name' => '现代·靛蓝',
'style_tag' => '现代',
'palette' => ['primary' => '#4F46E5', 'accent' => '#818CF8', 'bg' => '#F8FAFC', 'surface' => '#FFFFFF', 'text' => '#0F172A', 'border' => '#E2E8F0'],
'scale' => 'sans-refined',
'radius' => 'round',
'shadow' => 'soft',
'motion' => 'bouncy',
'layout' => ['home' => ['hero' => 'carousel', 'category' => 'card', 'product' => 'waterfall'], 'product' => ['gallery' => 'swiper', 'price' => 'card', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'grid'], 'effect' => ['transition' => 'zoom', 'skeleton' => 'shimmer']],
],
[
'code' => 'modern-teal',
'name' => '现代·青瓷',
'style_tag' => '现代',
'palette' => ['primary' => '#0D9488', 'accent' => '#5EEAD4', 'bg' => '#F0FDFA', 'surface' => '#FFFFFF', 'text' => '#134E4A', 'border' => '#CCFBF1'],
'scale' => 'sans-refined',
'radius' => 'round',
'shadow' => 'soft',
'motion' => 'gentle',
'layout' => ['home' => ['hero' => 'banner', 'category' => 'grid', 'product' => 'grid'], 'product' => ['gallery' => 'swiper', 'price' => 'inline', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'grid'], 'effect' => ['transition' => 'fade', 'skeleton' => 'shimmer']],
],
[
'code' => 'warm-terracotta',
'name' => '暖调·陶土',
'style_tag' => '暖调',
'palette' => ['primary' => '#C05621', 'accent' => '#F6AD55', 'bg' => '#FFFAF0', 'surface' => '#FFFFFF', 'text' => '#2D2016', 'border' => '#FBD9B5'],
'scale' => 'sans-compact',
'radius' => 'round',
'shadow' => 'soft',
'motion' => 'bouncy',
'layout' => ['home' => ['hero' => 'carousel', 'category' => 'scroll', 'product' => 'waterfall'], 'product' => ['gallery' => 'swiper', 'price' => 'card', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'image', 'menu' => 'grid'], 'effect' => ['transition' => 'slide', 'skeleton' => 'pulse']],
],
[
'code' => 'warm-sand',
'name' => '暖调·沙丘',
'style_tag' => '暖调',
'palette' => ['primary' => '#A16207', 'accent' => '#FDE68A', 'bg' => '#FEFCE8', 'surface' => '#FFFFFF', 'text' => '#292524', 'border' => '#F3E8C8'],
'scale' => 'serif-book',
'code' => 'lux-champagne',
'name' => '轻奢·香槟金',
'style_tag' => '轻奢',
'palette' => [
'primary' => '#B08D57',
'accent' => '#8C6A3F',
'bg' => '#FAF7F2',
'surface' => '#FFFFFF',
'text' => '#1C1917',
'border' => '#E7DFD3',
],
'scale' => 'serif-elegant',
'radius' => 'soft',
'shadow' => 'airy',
'motion' => 'gentle',
'layout' => ['home' => ['hero' => 'split', 'category' => 'card', 'product' => 'magazine'], 'product' => ['gallery' => 'stack', 'price' => 'inline', 'action' => 'inline'], 'list' => ['style' => 'timeline'], 'mine' => ['header' => 'plain', 'menu' => 'list'], 'effect' => ['transition' => 'fade', 'skeleton' => 'shimmer']],
],
[
'code' => 'cool-slate',
'name' => '冷调·石板',
'style_tag' => '冷调',
'palette' => ['primary' => '#334155', 'accent' => '#94A3B8', 'bg' => '#F1F5F9', 'surface' => '#FFFFFF', 'text' => '#0F172A', 'border' => '#CBD5E1'],
'scale' => 'sans-wide',
'radius' => 'sharp',
'shadow' => 'flat',
'motion' => 'snappy',
'layout' => ['home' => ['hero' => 'banner', 'category' => 'sidebar', 'product' => 'list'], 'product' => ['gallery' => 'swiper', 'price' => 'sticky', 'action' => 'fixed'], 'list' => ['style' => 'table'], 'mine' => ['header' => 'plain', 'menu' => 'list'], 'effect' => ['transition' => 'slide', 'skeleton' => 'pulse']],
],
[
'code' => 'cool-mist',
'name' => '冷调·雾蓝',
'style_tag' => '冷调',
'palette' => ['primary' => '#0369A1', 'accent' => '#7DD3FC', 'bg' => '#F0F9FF', 'surface' => '#FFFFFF', 'text' => '#0C4A6E', 'border' => '#BAE6FD'],
'scale' => 'sans-refined',
'radius' => 'round',
'shadow' => 'airy',
'motion' => 'silk',
'layout' => ['home' => ['hero' => 'carousel', 'category' => 'grid', 'product' => 'grid'], 'product' => ['gallery' => 'swiper', 'price' => 'card', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'grid'], 'effect' => ['transition' => 'fade', 'skeleton' => 'shimmer']],
'layout' => array_merge(
[
'home' => ['hero' => 'fullscreen', 'category' => 'scroll', 'product' => 'waterfall'],
'product' => ['gallery' => 'fullbleed', 'price' => 'sticky', 'action' => 'fixed'],
'list' => ['style' => 'ticket'],
'mine' => ['header' => 'split', 'menu' => 'card'],
'effect' => [
'transition' => 'fade',
'skeleton' => 'shimmer',
'card' => 'canvas-frame',
'icon' => 'line',
],
],
$buildPages(
['hero' => 'fullscreen', 'category' => 'scroll', 'product' => 'waterfall'],
['gallery' => 'fullbleed', 'action' => 'fixed', 'info' => 'overlay', 'spec' => 'plain', 'price' => 'sticky'],
'champagne-foil',
'shelf',
'ticket',
'split',
'card',
'home-04-full-scroll',
'shop',
'bar',
'',
[],
[
'catalog' => 'catalog-16-shelf',
'search' => 'search-16-shelf',
'product' => 'product-00-default',
'cart' => 'cart-05-ticket',
'mine' => 'mine-16-split',
],
['tabbar' => 'pill', 'navbar' => 'line', 'tabbar_anim' => 'fade'],
),
),
],
[
'code' => 'nature-olive',
'name' => '自然·橄榄',
'style_tag' => '自然',
'palette' => ['primary' => '#4D7C0F', 'accent' => '#BEF264', 'bg' => '#F7FEE7', 'surface' => '#FFFFFF', 'text' => '#1A2E05', 'border' => '#D9F99D'],
'scale' => 'sans-compact',
'radius' => 'soft',
'shadow' => 'soft',
'motion' => 'gentle',
'layout' => ['home' => ['hero' => 'banner', 'category' => 'scroll', 'product' => 'waterfall'], 'product' => ['gallery' => 'swiper', 'price' => 'inline', 'action' => 'inline'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'image', 'menu' => 'grid'], 'effect' => ['transition' => 'fade', 'skeleton' => 'pulse']],
],
[
'code' => 'nature-clay',
'name' => '自然·素坯',
'style_tag' => '自然',
'palette' => ['primary' => '#78716C', 'accent' => '#D6D3D1', 'bg' => '#FAFAF9', 'surface' => '#F5F5F4', 'text' => '#1C1917', 'border' => '#E7E5E4'],
'scale' => 'serif-book',
'radius' => 'soft',
'shadow' => 'flat',
'motion' => 'gentle',
'layout' => ['home' => ['hero' => 'split', 'category' => 'card', 'product' => 'magazine'], 'product' => ['gallery' => 'fullbleed', 'price' => 'inline', 'action' => 'inline'], 'list' => ['style' => 'timeline'], 'mine' => ['header' => 'plain', 'menu' => 'list'], 'effect' => ['transition' => 'fade', 'skeleton' => 'shimmer']],
],
[
'code' => 'bold-crimson',
'name' => '张扬·绛红',
'style_tag' => '浓烈',
'palette' => ['primary' => '#9F1239', 'accent' => '#FB7185', 'bg' => '#FFF1F2', 'surface' => '#FFFFFF', 'text' => '#4C0519', 'border' => '#FECDD3'],
'scale' => 'sans-wide',
'radius' => 'round',
'shadow' => 'deep',
'motion' => 'bouncy',
'layout' => ['home' => ['hero' => 'fullscreen', 'category' => 'card', 'product' => 'grid'], 'product' => ['gallery' => 'stack', 'price' => 'sticky', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'grid'], 'effect' => ['transition' => 'zoom', 'skeleton' => 'shimmer']],
],
[
'code' => 'bold-violet',
'name' => '张扬·紫罗兰',
'style_tag' => '浓烈',
'palette' => ['primary' => '#7E22CE', 'accent' => '#D8B4FE', 'bg' => '#FAF5FF', 'surface' => '#FFFFFF', 'text' => '#3B0764', 'border' => '#E9D5FF'],
'scale' => 'sans-refined',
'radius' => 'pill',
'shadow' => 'deep',
'motion' => 'bouncy',
'layout' => ['home' => ['hero' => 'carousel', 'category' => 'scroll', 'product' => 'waterfall'], 'product' => ['gallery' => 'swiper', 'price' => 'card', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'grid'], 'effect' => ['transition' => 'zoom', 'skeleton' => 'shimmer']],
],
[
'code' => 'dark-graphite',
'name' => '暗色·石墨',
'style_tag' => '暗色',
'palette' => ['primary' => '#E5E5E5', 'accent' => '#A3A3A3', 'bg' => '#0A0A0A', 'surface' => '#171717', 'text' => '#FAFAFA', 'border' => '#262626'],
'scale' => 'sans-compact',
'code' => 'lux-folio',
'name' => '轻奢·刊页',
'style_tag' => '刊页',
'palette' => [
'primary' => '#C4A574',
'accent' => '#A3845A',
'bg' => '#F7F1E6',
'surface' => '#FFF9F0',
'text' => '#3F2F24',
'border' => '#E4D6C2',
],
'scale' => 'serif-elegant',
'radius' => 'sharp',
'shadow' => 'deep',
'motion' => 'snappy',
'layout' => ['home' => ['hero' => 'banner', 'category' => 'grid', 'product' => 'grid'], 'product' => ['gallery' => 'stack', 'price' => 'sticky', 'action' => 'fixed'], 'list' => ['style' => 'table'], 'mine' => ['header' => 'plain', 'menu' => 'list'], 'effect' => ['transition' => 'slide', 'skeleton' => 'pulse']],
],
[
'code' => 'dark-emerald',
'name' => '暗色·祖母绿',
'style_tag' => '暗色',
'palette' => ['primary' => '#34D399', 'accent' => '#065F46', 'bg' => '#04120D', 'surface' => '#0B1F18', 'text' => '#ECFDF5', 'border' => '#14392C'],
'scale' => 'sans-refined',
'radius' => 'round',
'shadow' => 'deep',
'motion' => 'silk',
'layout' => ['home' => ['hero' => 'fullscreen', 'category' => 'sidebar', 'product' => 'waterfall'], 'product' => ['gallery' => 'fullbleed', 'price' => 'card', 'action' => 'fixed'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'image', 'menu' => 'list'], 'effect' => ['transition' => 'fade', 'skeleton' => 'shimmer']],
],
[
'code' => 'retro-cream',
'name' => '复古·奶油',
'style_tag' => '复古',
'palette' => ['primary' => '#92400E', 'accent' => '#FBBF24', 'bg' => '#FFFBEB', 'surface' => '#FEF3C7', 'text' => '#451A03', 'border' => '#FDE68A'],
'scale' => 'serif-book',
'radius' => 'soft',
'shadow' => 'soft',
'motion' => 'gentle',
'layout' => ['home' => ['hero' => 'split', 'category' => 'card', 'product' => 'magazine'], 'product' => ['gallery' => 'swiper', 'price' => 'inline', 'action' => 'inline'], 'list' => ['style' => 'timeline'], 'mine' => ['header' => 'image', 'menu' => 'list'], 'effect' => ['transition' => 'fade', 'skeleton' => 'pulse']],
],
[
'code' => 'retro-ocean',
'name' => '复古·海蓝',
'style_tag' => '复古',
'palette' => ['primary' => '#155E75', 'accent' => '#67E8F9', 'bg' => '#ECFEFF', 'surface' => '#FFFFFF', 'text' => '#083344', 'border' => '#A5F3FC'],
'scale' => 'sans-wide',
'radius' => 'pill',
'shadow' => 'airy',
'motion' => 'bouncy',
'layout' => ['home' => ['hero' => 'carousel', 'category' => 'scroll', 'product' => 'list'], 'product' => ['gallery' => 'swiper', 'price' => 'card', 'action' => 'inline'], 'list' => ['style' => 'card'], 'mine' => ['header' => 'gradient', 'menu' => 'grid'], 'effect' => ['transition' => 'slide', 'skeleton' => 'shimmer']],
'motion' => 'silk',
'layout' => array_merge(
[
'home' => ['hero' => 'caption', 'category' => 'contents', 'product' => 'waterfall'],
'product' => ['gallery' => 'filmstrip', 'price' => 'sticky', 'action' => 'fixed'],
'list' => ['style' => 'stacked'],
'mine' => ['header' => 'editorial', 'menu' => 'list'],
'effect' => [
'transition' => 'fade',
'skeleton' => 'shimmer',
'card' => 'canvas-frame',
'icon' => 'line',
],
],
$buildPages(
['hero' => 'caption', 'category' => 'contents', 'product' => 'waterfall'],
['gallery' => 'filmstrip', 'action' => 'fixed', 'info' => 'overlay', 'spec' => 'cards', 'price' => 'sticky'],
'folio-number',
'featured',
'stacked',
'editorial',
'list',
'home-magazine-folio',
'magazine',
'overlay',
'contents',
['density' => 'airy', 'frame' => 'ornament', 'hero_height' => 640],
[
'catalog' => 'catalog-13-featured',
'search' => 'search-13-featured',
'product' => 'product-00-default',
'cart' => 'cart-06-stacked',
'mine' => 'mine-26-editorial',
],
['tabbar' => 'dot', 'navbar' => 'line', 'tabbar_anim' => 'spring'],
),
),
],
];