skill-chef 0.3.2 → 0.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +42 -29
- package/dist/add/commands.js +1 -1
- package/dist/add/index.d.ts +1 -0
- package/dist/add/index.d.ts.map +1 -1
- package/dist/add/index.js +1 -0
- package/dist/add/index.js.map +1 -1
- package/dist/add/pages.d.ts +62 -0
- package/dist/add/pages.d.ts.map +1 -0
- package/dist/add/pages.js +362 -0
- package/dist/add/pages.js.map +1 -0
- package/dist/add/routes.d.ts +4 -4
- package/dist/add/routes.d.ts.map +1 -1
- package/dist/add/routes.js +12 -6
- package/dist/add/routes.js.map +1 -1
- package/dist/add/run-write.d.ts.map +1 -1
- package/dist/add/run-write.js +39 -0
- package/dist/add/run-write.js.map +1 -1
- package/dist/cli/cmd_read.js +17 -1
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/config.d.ts +0 -10
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +22 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/keys.d.ts +1 -1
- package/dist/cli/keys.d.ts.map +1 -1
- package/dist/cli/keys.js +16 -4
- package/dist/cli/keys.js.map +1 -1
- package/dist/cook/commands.js +1 -1
- package/dist/cook/index.d.ts +2 -1
- package/dist/cook/index.d.ts.map +1 -1
- package/dist/cook/index.js +1 -1
- package/dist/cook/index.js.map +1 -1
- package/dist/cook/page-art.d.ts +18 -0
- package/dist/cook/page-art.d.ts.map +1 -0
- package/dist/cook/page-art.js +30 -0
- package/dist/cook/page-art.js.map +1 -0
- package/dist/cook/page-css.d.ts +9 -0
- package/dist/cook/page-css.d.ts.map +1 -0
- package/dist/cook/page-css.js +206 -0
- package/dist/cook/page-css.js.map +1 -0
- package/dist/cook/page-text.d.ts +28 -0
- package/dist/cook/page-text.d.ts.map +1 -0
- package/dist/cook/page-text.js +65 -0
- package/dist/cook/page-text.js.map +1 -0
- package/dist/cook/routes.js +4 -4
- package/dist/cook/run.d.ts +56 -1
- package/dist/cook/run.d.ts.map +1 -1
- package/dist/cook/run.js +252 -22
- package/dist/cook/run.js.map +1 -1
- package/dist/data/commands.d.ts +6 -7
- package/dist/data/commands.d.ts.map +1 -1
- package/dist/data/commands.js +15 -8
- package/dist/data/commands.js.map +1 -1
- package/dist/data/index.d.ts +2 -0
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +2 -0
- package/dist/data/index.js.map +1 -1
- package/dist/data/pages.d.ts +50 -0
- package/dist/data/pages.d.ts.map +1 -0
- package/dist/data/pages.js +226 -0
- package/dist/data/pages.js.map +1 -0
- package/dist/data/routes.d.ts +4 -5
- package/dist/data/routes.d.ts.map +1 -1
- package/dist/data/routes.js +8 -10
- package/dist/data/routes.js.map +1 -1
- package/dist/data/run-batch.d.ts +21 -0
- package/dist/data/run-batch.d.ts.map +1 -0
- package/dist/data/run-batch.js +123 -0
- package/dist/data/run-batch.js.map +1 -0
- package/dist/data/run-query.d.ts +5 -6
- package/dist/data/run-query.d.ts.map +1 -1
- package/dist/data/run-query.js +113 -28
- package/dist/data/run-query.js.map +1 -1
- package/dist/help/lookup.d.ts.map +1 -1
- package/dist/help/lookup.js +20 -4
- package/dist/help/lookup.js.map +1 -1
- package/dist/help/sceneData.d.ts +8 -7
- package/dist/help/sceneData.d.ts.map +1 -1
- package/dist/help/sceneData.js +22 -21
- package/dist/help/sceneData.js.map +1 -1
- package/dist/history/commands.js +1 -1
- package/dist/history/page-css.d.ts +12 -0
- package/dist/history/page-css.d.ts.map +1 -0
- package/dist/history/page-css.js +208 -0
- package/dist/history/page-css.js.map +1 -0
- package/dist/history/pages.d.ts +77 -0
- package/dist/history/pages.d.ts.map +1 -0
- package/dist/history/pages.js +282 -0
- package/dist/history/pages.js.map +1 -0
- package/dist/history/routes.d.ts +4 -6
- package/dist/history/routes.d.ts.map +1 -1
- package/dist/history/routes.js +22 -16
- package/dist/history/routes.js.map +1 -1
- package/dist/history/run-query.d.ts +48 -0
- package/dist/history/run-query.d.ts.map +1 -1
- package/dist/history/run-query.js +96 -10
- package/dist/history/run-query.js.map +1 -1
- package/dist/history/run-record.d.ts +12 -2
- package/dist/history/run-record.d.ts.map +1 -1
- package/dist/history/run-record.js +28 -14
- package/dist/history/run-record.js.map +1 -1
- package/dist/history/validate.d.ts +22 -0
- package/dist/history/validate.d.ts.map +1 -0
- package/dist/history/validate.js +69 -0
- package/dist/history/validate.js.map +1 -0
- package/dist/policy/wakewords.d.ts +1 -1
- package/dist/policy/wakewords.d.ts.map +1 -1
- package/dist/policy/wakewords.js +23 -2
- package/dist/policy/wakewords.js.map +1 -1
- package/dist/relation/commands.d.ts +6 -5
- package/dist/relation/commands.d.ts.map +1 -1
- package/dist/relation/commands.js +23 -6
- package/dist/relation/commands.js.map +1 -1
- package/dist/relation/index.d.ts +3 -0
- package/dist/relation/index.d.ts.map +1 -1
- package/dist/relation/index.js +3 -0
- package/dist/relation/index.js.map +1 -1
- package/dist/relation/pages.d.ts +37 -0
- package/dist/relation/pages.d.ts.map +1 -0
- package/dist/relation/pages.js +224 -0
- package/dist/relation/pages.js.map +1 -0
- package/dist/relation/routes.d.ts +6 -5
- package/dist/relation/routes.d.ts.map +1 -1
- package/dist/relation/routes.js +17 -16
- package/dist/relation/routes.js.map +1 -1
- package/dist/relation/run-query.d.ts +10 -0
- package/dist/relation/run-query.d.ts.map +1 -0
- package/dist/relation/run-query.js +104 -0
- package/dist/relation/run-query.js.map +1 -0
- package/dist/relation/run-write.d.ts +13 -0
- package/dist/relation/run-write.d.ts.map +1 -0
- package/dist/relation/run-write.js +114 -0
- package/dist/relation/run-write.js.map +1 -0
- package/dist/relation/shapes.d.ts +8 -0
- package/dist/relation/shapes.d.ts.map +1 -0
- package/dist/relation/shapes.js +153 -0
- package/dist/relation/shapes.js.map +1 -0
- package/dist/relation/treeShapes.d.ts +23 -0
- package/dist/relation/treeShapes.d.ts.map +1 -0
- package/dist/relation/treeShapes.js +289 -0
- package/dist/relation/treeShapes.js.map +1 -0
- package/dist/render/copyArea.d.ts +67 -0
- package/dist/render/copyArea.d.ts.map +1 -0
- package/dist/render/copyArea.js +146 -0
- package/dist/render/copyArea.js.map +1 -0
- package/dist/render/envelope.d.ts.map +1 -1
- package/dist/render/envelope.js +4 -0
- package/dist/render/envelope.js.map +1 -1
- package/dist/render/index.d.ts +7 -0
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +7 -0
- package/dist/render/index.js.map +1 -1
- package/dist/render/sceneBand.d.ts +36 -0
- package/dist/render/sceneBand.d.ts.map +1 -0
- package/dist/render/sceneBand.js +166 -0
- package/dist/render/sceneBand.js.map +1 -0
- package/dist/render/sceneRhythm.d.ts +6 -0
- package/dist/render/sceneRhythm.d.ts.map +1 -0
- package/dist/render/sceneRhythm.js +149 -0
- package/dist/render/sceneRhythm.js.map +1 -0
- package/dist/render/sceneShell.d.ts +17 -0
- package/dist/render/sceneShell.d.ts.map +1 -0
- package/dist/render/sceneShell.js +46 -0
- package/dist/render/sceneShell.js.map +1 -0
- package/dist/render/skin.d.ts +13 -0
- package/dist/render/skin.d.ts.map +1 -0
- package/dist/render/skin.js +282 -0
- package/dist/render/skin.js.map +1 -0
- package/dist/search/routes.d.ts +12 -4
- package/dist/search/routes.d.ts.map +1 -1
- package/dist/search/routes.js +39 -7
- package/dist/search/routes.js.map +1 -1
- package/dist/search/run.d.ts +10 -2
- package/dist/search/run.d.ts.map +1 -1
- package/dist/search/run.js +61 -9
- package/dist/search/run.js.map +1 -1
- package/dist/setup/commands.d.ts +5 -5
- package/dist/setup/commands.d.ts.map +1 -1
- package/dist/setup/commands.js +14 -6
- package/dist/setup/commands.js.map +1 -1
- package/dist/setup/index.d.ts +3 -5
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +3 -5
- package/dist/setup/index.js.map +1 -1
- package/dist/setup/pages.d.ts +19 -0
- package/dist/setup/pages.d.ts.map +1 -0
- package/dist/setup/pages.js +163 -0
- package/dist/setup/pages.js.map +1 -0
- package/dist/setup/routes.d.ts +4 -5
- package/dist/setup/routes.d.ts.map +1 -1
- package/dist/setup/routes.js +7 -8
- package/dist/setup/routes.js.map +1 -1
- package/dist/setup/run-init.d.ts +11 -0
- package/dist/setup/run-init.d.ts.map +1 -0
- package/dist/setup/run-init.js +19 -0
- package/dist/setup/run-init.js.map +1 -0
- package/dist/shared/command-spec.d.ts +5 -3
- package/dist/shared/command-spec.d.ts.map +1 -1
- package/dist/shopping/commands.js +1 -1
- package/dist/shopping/commands.js.map +1 -1
- package/dist/shopping/index.d.ts +1 -0
- package/dist/shopping/index.d.ts.map +1 -1
- package/dist/shopping/index.js +1 -0
- package/dist/shopping/index.js.map +1 -1
- package/dist/shopping/pages.d.ts +22 -0
- package/dist/shopping/pages.d.ts.map +1 -0
- package/dist/shopping/pages.js +170 -0
- package/dist/shopping/pages.js.map +1 -0
- package/dist/shopping/routes.js +4 -4
- package/dist/shopping/routes.js.map +1 -1
- package/dist/shopping/run.d.ts +9 -5
- package/dist/shopping/run.d.ts.map +1 -1
- package/dist/shopping/run.js +58 -10
- package/dist/shopping/run.js.map +1 -1
- package/dist/triggers/chef-scenes.d.ts +3 -2
- package/dist/triggers/chef-scenes.d.ts.map +1 -1
- package/dist/triggers/chef-scenes.js +16 -15
- package/dist/triggers/chef-scenes.js.map +1 -1
- package/dist/update/routes.d.ts +6 -4
- package/dist/update/routes.d.ts.map +1 -1
- package/dist/update/routes.js +20 -6
- package/dist/update/routes.js.map +1 -1
- package/dist/update/run-write.d.ts.map +1 -1
- package/dist/update/run-write.js +211 -1
- package/dist/update/run-write.js.map +1 -1
- package/dist/view/commands.js +1 -1
- package/dist/view/page.d.ts +25 -0
- package/dist/view/page.d.ts.map +1 -0
- package/dist/view/page.js +306 -0
- package/dist/view/page.js.map +1 -0
- package/dist/view/pageCss.d.ts +8 -0
- package/dist/view/pageCss.d.ts.map +1 -0
- package/dist/view/pageCss.js +327 -0
- package/dist/view/pageCss.js.map +1 -0
- package/dist/view/pageSection.d.ts +21 -0
- package/dist/view/pageSection.d.ts.map +1 -0
- package/dist/view/pageSection.js +59 -0
- package/dist/view/pageSection.js.map +1 -0
- package/dist/view/routes.js +7 -7
- package/dist/view/run.d.ts +5 -1
- package/dist/view/run.d.ts.map +1 -1
- package/dist/view/run.js +66 -7
- package/dist/view/run.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/** #873 查看域页内样式(在公共层皮肤之上追加的一段,只对本域 8 页生效)。
|
|
2
|
+
*
|
|
3
|
+
* 为什么另立一件:装配件(`page.ts`)已经装不下——本包 `AGENTS.md` 钉的告警线是 350 LF,
|
|
4
|
+
* 装配逻辑与一段页内样式混在一处会让那一件长期贴着线走。样式与装配分开之后,两件各自只讲
|
|
5
|
+
* 一件事:本件讲「查看页独有的形状长什么样」,`page.ts` 讲「这一页摆什么」。
|
|
6
|
+
*
|
|
7
|
+
* 三条口径(与前缀口径同源,违反即抛):
|
|
8
|
+
* ① **每一条选择器都挂在根类 `.ilife-page-ui` 之下**:`renderDocShell` → `buildStyleSheet` 的
|
|
9
|
+
* `assertExtraCss` 会抛 `extra-css-root`/`extra-css-forbidden-token`/`extra-css-dark-scheme`;
|
|
10
|
+
* 前缀口径与 `chefSceneCss()` 同(缺省 `ilife-`),两处必须同源,否则规则一条都命中不到。
|
|
11
|
+
* ② **色值只从冻结 token 与既有调色板取**:暖色走 `CHART_PALETTE` 的下标,中性色走
|
|
12
|
+
* `var(--fg)`/`var(--fg2)`/`var(--fg3)`/`var(--line)`/`var(--soft)`/`var(--card)`,
|
|
13
|
+
* 本件不写第二个十六进制色值。
|
|
14
|
+
* ③ **圆角只用闭集 `{8, 14, 999}`、断点只用仓内既有集合**(`1001`=公共层桌面档那条断点)。
|
|
15
|
+
*
|
|
16
|
+
* 这一段的五组规则(每一组对应 `page.ts` 里的一个装配件):
|
|
17
|
+
* ① 分区标题行 `.chef-view-sec`:图标位 + 标题 + 右端读数;正文槽承载锚点 id。
|
|
18
|
+
* ② 分组标签 `.chef-view-tags`:维度名(左轨)+ 值徽章(右),替掉一行 13 枚无名色块。
|
|
19
|
+
* ③ 新手要点 `.chef-view-keys`:一条一枚序号牌,序号由形状承担。
|
|
20
|
+
* ④ 营养瓦片 `.chef-view-nutri`:窄档两列、宽档三列。
|
|
21
|
+
* ⑤ 背景小节 `.chef-view-prose-block`:小标题 + 段落。
|
|
22
|
+
*
|
|
23
|
+
* 只加形状与间距,不改任何区块的标记结构;`content` 一律空串(词不许只活在样式里)。
|
|
24
|
+
*/
|
|
25
|
+
import { CHART_PALETTE } from 'base-paint';
|
|
26
|
+
/** 换行(仓库口径:不写字面换行转义,与 `blocks.ts`/`skin.ts` 同)。 */
|
|
27
|
+
const LF = String.fromCharCode(10);
|
|
28
|
+
/** 圆角闭集(与公共层、皮肤同一条闭集,不新造档位)。 */
|
|
29
|
+
const RADIUS = { sm: 8, md: 14, pill: 999 };
|
|
30
|
+
/** 暖色图标位取调色板里的橙(与皮肤的分区图标位同色基)。 */
|
|
31
|
+
const WARM = CHART_PALETTE[2];
|
|
32
|
+
/** 八枚图标位各自的色基(一律取 `CHART_PALETTE` 上相邻的两色,不新造色值):
|
|
33
|
+
* 食材料理=橙、步骤=红、营养=绿、背景=紫、下厨记录=蓝、标签=青、替换=洋红、要点=黄。 */
|
|
34
|
+
const TONE_HUES = [
|
|
35
|
+
['ingredients', CHART_PALETTE[6], CHART_PALETTE[2]],
|
|
36
|
+
['steps', CHART_PALETTE[3], CHART_PALETTE[8]],
|
|
37
|
+
['nutrition', CHART_PALETTE[1], CHART_PALETTE[9]],
|
|
38
|
+
['background', CHART_PALETTE[4], CHART_PALETTE[5]],
|
|
39
|
+
['history', CHART_PALETTE[0], CHART_PALETTE[5]],
|
|
40
|
+
['tags', CHART_PALETTE[9], CHART_PALETTE[1]],
|
|
41
|
+
['swap', CHART_PALETTE[8], CHART_PALETTE[4]],
|
|
42
|
+
['keys', CHART_PALETTE[6], CHART_PALETTE[2]],
|
|
43
|
+
];
|
|
44
|
+
/** 两色之间的斜向渐变(图标位底盘唯一写法)。 */
|
|
45
|
+
function warmPair(a, b) {
|
|
46
|
+
return 'linear-gradient(135deg, ' + a + ', ' + b + ');';
|
|
47
|
+
}
|
|
48
|
+
/** 查看域页内样式的唯一产出者。恒返回非空 CSS 文本。 */
|
|
49
|
+
export function viewPageCss(input) {
|
|
50
|
+
const p = input !== undefined && input !== null
|
|
51
|
+
&& typeof input.prefix === 'string' && input.prefix !== '' ? input.prefix : 'ilife-';
|
|
52
|
+
const root = '.' + p + 'page-ui';
|
|
53
|
+
const pv = root + ' .chef-view-';
|
|
54
|
+
return [
|
|
55
|
+
'/* #873 查看域页内版式 · 每一条规则都挂在根类 ' + root + ' 之下 */',
|
|
56
|
+
/* ① 分区:标题行一条 hairline 收口,正文槽与标题分开——「一段接一段的无题正文」由这条销账。 */
|
|
57
|
+
pv + 'sec {',
|
|
58
|
+
' margin: 20px 0 0;',
|
|
59
|
+
'}',
|
|
60
|
+
pv + 'sec-head {',
|
|
61
|
+
' display: flex;',
|
|
62
|
+
' align-items: center;',
|
|
63
|
+
' gap: 10px;',
|
|
64
|
+
' padding: 0 0 8px;',
|
|
65
|
+
' border-bottom: 1px solid var(--line);',
|
|
66
|
+
'}',
|
|
67
|
+
pv + 'sec-icon {',
|
|
68
|
+
' flex: 0 0 auto;',
|
|
69
|
+
' display: flex;',
|
|
70
|
+
' width: 26px;',
|
|
71
|
+
' height: 26px;',
|
|
72
|
+
' align-items: center;',
|
|
73
|
+
' justify-content: center;',
|
|
74
|
+
' border-radius: ' + RADIUS.sm + 'px;',
|
|
75
|
+
' background-image: ' + warmPair(CHART_PALETTE[6], WARM),
|
|
76
|
+
' color: var(--card);',
|
|
77
|
+
'}',
|
|
78
|
+
/* 一种分区一种色基(八枚图标位各取调色板上的相邻两色):一页从上到下因此有色彩节奏,
|
|
79
|
+
而不是「一色到底」。色值只从 `CHART_PALETTE` 取,本件不写第二个十六进制色值。 */
|
|
80
|
+
...TONE_HUES.map(([tone, a, b]) => pv + 'icon-' + tone + ' {\n background-image: ' + warmPair(a, b) + '\n}'),
|
|
81
|
+
pv + 'sec-icon svg {',
|
|
82
|
+
' display: block;',
|
|
83
|
+
' width: 16px;',
|
|
84
|
+
' height: 16px;',
|
|
85
|
+
'}',
|
|
86
|
+
pv + 'sec-title {',
|
|
87
|
+
' margin: 0;',
|
|
88
|
+
' color: var(--fg);',
|
|
89
|
+
' font-size: 15px;',
|
|
90
|
+
' font-weight: 700;',
|
|
91
|
+
' line-height: 1.4;',
|
|
92
|
+
'}',
|
|
93
|
+
pv + 'sec-note {',
|
|
94
|
+
' margin-left: auto;',
|
|
95
|
+
' color: var(--fg3);',
|
|
96
|
+
' font-size: 12px;',
|
|
97
|
+
'}',
|
|
98
|
+
pv + 'sec-body {',
|
|
99
|
+
' margin: 10px 0 0;',
|
|
100
|
+
'}',
|
|
101
|
+
/* ② 分组标签:维度名占 3em 左轨,值徽章在右;徽章自身仍走公共层的 `block-chip` 一条不改。 */
|
|
102
|
+
pv + 'tags {',
|
|
103
|
+
' display: grid;',
|
|
104
|
+
' gap: 8px;',
|
|
105
|
+
'}',
|
|
106
|
+
pv + 'tags-row {',
|
|
107
|
+
' display: flex;',
|
|
108
|
+
' flex-wrap: wrap;',
|
|
109
|
+
' align-items: center;',
|
|
110
|
+
' gap: 4px 6px;',
|
|
111
|
+
'}',
|
|
112
|
+
pv + 'tags-key {',
|
|
113
|
+
' flex: 0 0 auto;',
|
|
114
|
+
' min-width: 3em;',
|
|
115
|
+
' margin-right: 4px;',
|
|
116
|
+
' color: var(--fg3);',
|
|
117
|
+
' font-size: 12px;',
|
|
118
|
+
'}',
|
|
119
|
+
/* ②b 标签块与下厨记录的行容器:窄档一列往下排;宽档两栏借位(见 ⑪ 桌面档那一段)。 */
|
|
120
|
+
pv + 'side {',
|
|
121
|
+
' display: grid;',
|
|
122
|
+
' gap: 20px;',
|
|
123
|
+
'}',
|
|
124
|
+
/* ③ 新手要点:序号牌(形状件)+ 一句话;卡与卡之间靠间距分组,不靠分隔符字符。 */
|
|
125
|
+
pv + 'keys {',
|
|
126
|
+
' display: grid;',
|
|
127
|
+
' gap: 8px;',
|
|
128
|
+
' margin: 0;',
|
|
129
|
+
' padding: 0;',
|
|
130
|
+
' list-style: none;',
|
|
131
|
+
'}',
|
|
132
|
+
pv + 'key {',
|
|
133
|
+
' display: flex;',
|
|
134
|
+
' align-items: center;',
|
|
135
|
+
' gap: 10px;',
|
|
136
|
+
' box-sizing: border-box;',
|
|
137
|
+
' padding: 10px 12px;',
|
|
138
|
+
' border: 1px solid var(--line);',
|
|
139
|
+
' border-radius: ' + RADIUS.md + 'px;',
|
|
140
|
+
' background: var(--card);',
|
|
141
|
+
'}',
|
|
142
|
+
pv + 'key-no {',
|
|
143
|
+
' flex: 0 0 auto;',
|
|
144
|
+
' padding: 3px 10px;',
|
|
145
|
+
' border-radius: ' + RADIUS.pill + 'px;',
|
|
146
|
+
' background: var(--soft);',
|
|
147
|
+
' color: var(--blue2);',
|
|
148
|
+
' font-size: 12px;',
|
|
149
|
+
' font-weight: 700;',
|
|
150
|
+
' white-space: nowrap;',
|
|
151
|
+
'}',
|
|
152
|
+
pv + 'key-text {',
|
|
153
|
+
' min-width: 0;',
|
|
154
|
+
' color: var(--fg);',
|
|
155
|
+
' font-size: 15px;',
|
|
156
|
+
' line-height: 1.6;',
|
|
157
|
+
'}',
|
|
158
|
+
/* ④ 营养瓦片:事实条在页内换成栅格——窄档两列、宽档三列(断点取公共层桌面档那一条)。 */
|
|
159
|
+
pv + 'nutri {',
|
|
160
|
+
' display: grid;',
|
|
161
|
+
' grid-template-columns: repeat(2, minmax(0, 1fr));',
|
|
162
|
+
' gap: 8px;',
|
|
163
|
+
'}',
|
|
164
|
+
pv + 'nutri .' + p + 'block-fact-strip-value {',
|
|
165
|
+
' font-size: 17px;',
|
|
166
|
+
'}',
|
|
167
|
+
'@media (min-width: 1001px) {',
|
|
168
|
+
' ' + pv + 'nutri {',
|
|
169
|
+
' grid-template-columns: repeat(3, minmax(0, 1fr));',
|
|
170
|
+
' }',
|
|
171
|
+
'}',
|
|
172
|
+
/* ⑤ 背景小节:小标题一档灰,正文段落间距交给 `block-prose` 自己的 8px,不叠两层外边距。 */
|
|
173
|
+
root + ' .chef-view-prose-block + .chef-view-prose-block {',
|
|
174
|
+
' margin-top: 14px;',
|
|
175
|
+
'}',
|
|
176
|
+
pv + 'prose-title {',
|
|
177
|
+
' margin: 0;',
|
|
178
|
+
' color: var(--fg2);',
|
|
179
|
+
' font-size: 13px;',
|
|
180
|
+
' font-weight: 700;',
|
|
181
|
+
'}',
|
|
182
|
+
/* ⑥ 窄档食材行:公共层把每格排成「列名 + 值」三行(食材/用量/说明),同一批列名因此逐行
|
|
183
|
+
复读——一节 11 味就有 33 枚列名。这里把一行收成两行:**名字与用量同行**(名字左、用量右),
|
|
184
|
+
说明另起一行;重复的列名由分区标题承担,不再逐格复读。桌面档不在本段内,一字不动。
|
|
185
|
+
选择器为什么带 `.ilife-block-data-table` 与 `:has(td[data-label])`:公共层的表格卡片化那一组
|
|
186
|
+
挂在 `.ilife-page-ui .ilife-block-data-table:has(td[data-label]) td`(权重 3 类 2 型)上,
|
|
187
|
+
只写 `.chef-view-sec-body td`(2 类 1 型)会被它按权重压住、一条都不生效(实测:改前那版
|
|
188
|
+
`display`/`content` 全被顶掉,只有 `outline` 这类它没碰的属性看得见)。 */
|
|
189
|
+
'@media (max-width: 640px) {',
|
|
190
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) tr {',
|
|
191
|
+
' display: grid;',
|
|
192
|
+
' grid-template-columns: minmax(0, 1fr) minmax(0, auto);',
|
|
193
|
+
' column-gap: 10px;',
|
|
194
|
+
' padding: 9px 12px;',
|
|
195
|
+
' }',
|
|
196
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) td {',
|
|
197
|
+
' display: block;',
|
|
198
|
+
' padding: 0;',
|
|
199
|
+
/* 斑马纹改挂行、不挂格:格在栅格里各占一段,底色会跟着断成参差的两截。 */
|
|
200
|
+
' background-color: transparent;',
|
|
201
|
+
' }',
|
|
202
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) tr:nth-child(even) {',
|
|
203
|
+
' background-color: var(--soft);',
|
|
204
|
+
' }',
|
|
205
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) td::before {',
|
|
206
|
+
' content: none;',
|
|
207
|
+
' }',
|
|
208
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) td:first-child {',
|
|
209
|
+
' grid-column: 1;',
|
|
210
|
+
' color: var(--fg);',
|
|
211
|
+
' font-weight: 600;',
|
|
212
|
+
' }',
|
|
213
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) td:nth-child(2) {',
|
|
214
|
+
' grid-column: 2;',
|
|
215
|
+
' min-width: 0;',
|
|
216
|
+
' color: var(--fg2);',
|
|
217
|
+
' font-family: inherit;',
|
|
218
|
+
' text-align: right;',
|
|
219
|
+
' }',
|
|
220
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) td:nth-child(3) {',
|
|
221
|
+
' grid-column: 1 / -1;',
|
|
222
|
+
' margin-top: 2px;',
|
|
223
|
+
' color: var(--fg3);',
|
|
224
|
+
' font-size: 12px;',
|
|
225
|
+
' }',
|
|
226
|
+
'}',
|
|
227
|
+
/* ⑦ 页内不再挂装饰带(第三轮撤):族级带由页壳 `renderSceneShell` 插在版面根首节点,
|
|
228
|
+
页内再挂一条就是两带并存=重复装饰。页内只留**载内容的形状**(分区题头、营养瓦片、参数带、行卡),
|
|
229
|
+
色基与族级带共用同一族暖色(`CHART_PALETTE` 上相邻两色)。 */
|
|
230
|
+
/* ⑧ 步骤三件套:图标位 + 标签 + 值。火候/时长/锅温此前是一行事实条(三格白瓦片),
|
|
231
|
+
与页里其它瓦片同形;换成带图标位的参数带之后,每张步骤卡上有一处色彩锚点。
|
|
232
|
+
**窄档一行一件**(图标+标签+值同一行,吃满整宽):三件并排时每格约 100px,
|
|
233
|
+
图标/标签/值挤在一格里被判官读成「字段硬塞、横向拥挤」。 */
|
|
234
|
+
pv + 'params {',
|
|
235
|
+
' display: grid;',
|
|
236
|
+
' gap: 8px;',
|
|
237
|
+
' margin: 12px 0 0;',
|
|
238
|
+
' padding: 0;',
|
|
239
|
+
' list-style: none;',
|
|
240
|
+
'}',
|
|
241
|
+
pv + 'param {',
|
|
242
|
+
' display: flex;',
|
|
243
|
+
' align-items: center;',
|
|
244
|
+
' gap: 8px;',
|
|
245
|
+
' box-sizing: border-box;',
|
|
246
|
+
' min-width: 0;',
|
|
247
|
+
' padding: 8px 10px;',
|
|
248
|
+
' border: 1px solid var(--line);',
|
|
249
|
+
' border-radius: ' + RADIUS.md + 'px;',
|
|
250
|
+
' background: var(--soft);',
|
|
251
|
+
'}',
|
|
252
|
+
pv + 'param-icon {',
|
|
253
|
+
' flex: 0 0 auto;',
|
|
254
|
+
' display: flex;',
|
|
255
|
+
' width: 24px;',
|
|
256
|
+
' height: 24px;',
|
|
257
|
+
' align-items: center;',
|
|
258
|
+
' justify-content: center;',
|
|
259
|
+
' border-radius: ' + RADIUS.sm + 'px;',
|
|
260
|
+
' background-image: ' + warmPair(CHART_PALETTE[6], WARM),
|
|
261
|
+
' color: var(--card);',
|
|
262
|
+
'}',
|
|
263
|
+
pv + 'param-icon svg {',
|
|
264
|
+
' display: block;',
|
|
265
|
+
' width: 15px;',
|
|
266
|
+
' height: 15px;',
|
|
267
|
+
'}',
|
|
268
|
+
pv + 'param-label {',
|
|
269
|
+
' flex: 0 0 auto;',
|
|
270
|
+
' color: var(--fg3);',
|
|
271
|
+
' font-size: 12px;',
|
|
272
|
+
'}',
|
|
273
|
+
pv + 'param-value {',
|
|
274
|
+
' flex: 1 1 auto;',
|
|
275
|
+
' min-width: 0;',
|
|
276
|
+
' margin-left: auto;',
|
|
277
|
+
' color: var(--fg);',
|
|
278
|
+
' font-size: 13px;',
|
|
279
|
+
' font-weight: 700;',
|
|
280
|
+
' text-align: right;',
|
|
281
|
+
'}',
|
|
282
|
+
/* ⑨ 步骤卡的圆底图标位换暖色实底:每张卡一枚色彩锚点(原先与页里别的小圆底同色)。 */
|
|
283
|
+
root + ' .chef-view-sec-body .' + p + 'block-disclosure-summary::before {',
|
|
284
|
+
' background-image: ' + warmPair(CHART_PALETTE[6], WARM),
|
|
285
|
+
' color: var(--card);',
|
|
286
|
+
'}',
|
|
287
|
+
/* ⑩ 分区标题行允许读数换行:窄档上「营养成分」+「每 250g」挤不进一行时,读数整枚落到第二行,
|
|
288
|
+
不把标题压窄、不贴右墙(判官点过「每 250g 字样在小屏偏密」)。 */
|
|
289
|
+
pv + 'sec-head {',
|
|
290
|
+
' flex-wrap: wrap;',
|
|
291
|
+
'}',
|
|
292
|
+
/* ⑪ 宽档把栅格用满(≥1001,与公共层桌面档同一条断点):本席八页的判读里,
|
|
293
|
+
桌面端反复被点「左右大片留白、短块只占左半、表格横向拉伸」。四处收口:
|
|
294
|
+
事实条四格等宽铺满、页内导航四枚等宽、标签块与要点列表各走两栏、食材表按列语义定宽。 */
|
|
295
|
+
'@media (min-width: 1001px) {',
|
|
296
|
+
' ' + root + ' .chef-view-params {',
|
|
297
|
+
' grid-template-columns: repeat(3, minmax(0, 1fr));',
|
|
298
|
+
' }',
|
|
299
|
+
' ' + root + ' .' + p + 'block-toc {',
|
|
300
|
+
' display: grid;',
|
|
301
|
+
' grid-template-columns: repeat(4, minmax(0, 1fr));',
|
|
302
|
+
' gap: 8px;',
|
|
303
|
+
' }',
|
|
304
|
+
' ' + root + ' .' + p + 'block-toc a {',
|
|
305
|
+
' justify-content: center;',
|
|
306
|
+
' }',
|
|
307
|
+
' ' + root + ' .chef-view-tags,',
|
|
308
|
+
' ' + root + ' .chef-view-keys {',
|
|
309
|
+
' grid-template-columns: repeat(2, minmax(0, 1fr));',
|
|
310
|
+
' }',
|
|
311
|
+
/* 宽档借位:标签块与下厨记录并成一行两栏(判官点「桌面版仍堆叠一列未借位」)。
|
|
312
|
+
两栏各自 `stretch`(不收窄、不写 `margin: auto`——栅格项上的 auto 外边距会关掉 `justify-self: stretch`)。 */
|
|
313
|
+
' ' + root + ' .chef-view-side {',
|
|
314
|
+
' grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);',
|
|
315
|
+
' column-gap: 24px;',
|
|
316
|
+
' align-items: start;',
|
|
317
|
+
' }',
|
|
318
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) th:nth-child(1) {',
|
|
319
|
+
' width: 34%;',
|
|
320
|
+
' }',
|
|
321
|
+
' ' + root + ' .chef-view-sec-body .' + p + 'block-data-table:has(td[data-label]) th:nth-child(2) {',
|
|
322
|
+
' width: 18%;',
|
|
323
|
+
' }',
|
|
324
|
+
'}',
|
|
325
|
+
].join(LF);
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=pageCss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageCss.js","sourceRoot":"","sources":["../../src/view/pageCss.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** 分区的形制(内容不同、外壳相同):一段说明 + 一条 hairline + 一块正文槽。 */
|
|
2
|
+
export interface SecHead {
|
|
3
|
+
/** 分区标题(人话,如「食材(11 味)」)。 */
|
|
4
|
+
readonly title: string;
|
|
5
|
+
/** 右端读数(可省;空串即不印那一位)。 */
|
|
6
|
+
readonly note: string;
|
|
7
|
+
}
|
|
8
|
+
/** 图标位字形的种类(同时是配色分组的键:一种分区一种色基)。 */
|
|
9
|
+
export type IconTone = 'ingredients' | 'steps' | 'nutrition' | 'background' | 'history' | 'tags' | 'swap' | 'keys';
|
|
10
|
+
/** 一枚分区:标题行(图标位+标题+右端读数)+正文槽。
|
|
11
|
+
* 锚点 id 落在**正文槽**上(指向内容本体),只看 X 卡与全量页共用同一段字符串。 */
|
|
12
|
+
export declare function sectionOf(anchor: string, tone: IconTone, head: SecHead, inner: string): string;
|
|
13
|
+
/** 步骤三件套的三种图标位(火候/时长/锅温)。 */
|
|
14
|
+
export type ParamTone = 'heat' | 'clock' | 'temp';
|
|
15
|
+
/** 一行「图标位 + 标签 + 值」的参数带(步骤卡的火候/时长/锅温走这一条形状)。 */
|
|
16
|
+
export declare function paramBandOf(items: readonly {
|
|
17
|
+
readonly tone: ParamTone;
|
|
18
|
+
readonly label: string;
|
|
19
|
+
readonly value: string;
|
|
20
|
+
}[]): string;
|
|
21
|
+
//# sourceMappingURL=pageSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageSection.d.ts","sourceRoot":"","sources":["../../src/view/pageSection.ts"],"names":[],"mappings":"AAeA,mDAAmD;AACnD,MAAM,WAAW,OAAO;IACtB,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,oCAAoC;AACpC,MAAM,MAAM,QAAQ,GAChB,aAAa,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAsBhG;mDACmD;AACnD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS9F;AAED,6BAA6B;AAC7B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AASlD,gDAAgD;AAChD,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,MAAM,CAOR"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** #873 查看域的分区件:**一枚分区的外壳**(图标位 + 标题 + 右端读数 + 正文槽)、**页族装饰带**、
|
|
2
|
+
* **带图标位的参数带**,以及这些形状用的图标位字形。
|
|
3
|
+
*
|
|
4
|
+
* 为什么另立一件:`page.ts` 已经贴着本包 `AGENTS.md` 钉的 350 LF 告警线走(装配逻辑本身就在那份文件里);
|
|
5
|
+
* 「一页长什么样」的形状件与「这一页摆什么」的装配逻辑分开之后,两件各自只讲一件事。
|
|
6
|
+
*
|
|
7
|
+
* 图标位一律是**内联 SVG 的纯装饰**:`aria-hidden`,一个字都不进 CSS,也不进可见文本
|
|
8
|
+
* (词不许只活在样式里)。**不用 `<img>`、不引外部图**——验收墙的造册判据拒收带惰性加载属性的产物,
|
|
9
|
+
* 而仓内的图片件(`renderMediaFigure`)产出器会写那个属性。
|
|
10
|
+
*/
|
|
11
|
+
import { escapeHtml } from 'base-paint';
|
|
12
|
+
/** 五字符归一(与区块层同源 `escapeHtml`,不自写第二份字符表)。 */
|
|
13
|
+
const esc = escapeHtml;
|
|
14
|
+
/** 字形一律 16×16、线条取 `currentColor`(16 这个尺寸只写一处,下面十四个字形共用)。 */
|
|
15
|
+
const SVG_OPEN = '<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor"'
|
|
16
|
+
+ ' stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">';
|
|
17
|
+
/** 八个分区图标位。 */
|
|
18
|
+
const ICON = {
|
|
19
|
+
ingredients: SVG_OPEN + '<path d="M3.5 11h17a8.5 8.5 0 0 1-17 0Z"/><path d="M2 11h20"/>'
|
|
20
|
+
+ '<path d="M9.5 8.2c0-1.5 1.7-2.1 1.7-3.7"/><path d="M14 8.2c0-1.5 1.7-2.1 1.7-3.7"/></svg>',
|
|
21
|
+
steps: SVG_OPEN + '<path d="M12 3.4c3.7 4.3 5.5 6.5 5.5 9.4a5.5 5.5 0 0 1-11 0c0-2.9 1.8-5.1 5.5-9.4Z"/>'
|
|
22
|
+
+ '<path d="M12 18.6a2.6 2.6 0 0 0 2.6-2.6c0-1.3-.9-2.3-2.6-4-1.7 1.7-2.6 2.7-2.6 4a2.6 2.6 0 0 0 2.6 2.6Z"/></svg>',
|
|
23
|
+
nutrition: SVG_OPEN + '<path d="M12 20.6S3.4 15.2 3.4 9.7A4.7 4.7 0 0 1 12 7.1a4.7 4.7 0 0 1 8.6 2.6c0 5.5-8.6 10.9-8.6 10.9Z"/></svg>',
|
|
24
|
+
background: SVG_OPEN + '<path d="M12 6.6C10 5 7.6 4.6 4.4 4.8v12.9c3.2-.2 5.6.2 7.6 1.8 2-1.6 4.4-2 7.6-1.8V4.8C16.4 4.6 14 5 12 6.6Z"/>'
|
|
25
|
+
+ '<path d="M12 6.6v12.9"/></svg>',
|
|
26
|
+
history: SVG_OPEN + '<circle cx="12" cy="12" r="8.4"/><path d="M12 7.2V12l3.2 1.9"/></svg>',
|
|
27
|
+
tags: SVG_OPEN + '<path d="M4.4 4.4h7l8.2 8.2-7 7-8.2-8.2Z"/><circle cx="8.6" cy="8.6" r="1.3"/></svg>',
|
|
28
|
+
swap: SVG_OPEN + '<path d="M4 8h13"/><path d="M14 5l3 3-3 3"/><path d="M20 16H7"/><path d="M10 13l-3 3 3 3"/></svg>',
|
|
29
|
+
keys: SVG_OPEN + '<path d="M12 3.6a5.6 5.6 0 0 1 3.4 10.1c-.5.4-.8 1-.8 1.6h-5.2c0-.6-.3-1.2-.8-1.6A5.6 5.6 0 0 1 12 3.6Z"/>'
|
|
30
|
+
+ '<path d="M9.6 18h4.8"/><path d="M10.4 20.6h3.2"/></svg>',
|
|
31
|
+
};
|
|
32
|
+
/** 一枚分区:标题行(图标位+标题+右端读数)+正文槽。
|
|
33
|
+
* 锚点 id 落在**正文槽**上(指向内容本体),只看 X 卡与全量页共用同一段字符串。 */
|
|
34
|
+
export function sectionOf(anchor, tone, head, inner) {
|
|
35
|
+
return '<section class="chef-view-sec">'
|
|
36
|
+
+ '<div class="chef-view-sec-head">'
|
|
37
|
+
+ '<span class="chef-view-sec-icon chef-view-icon-' + tone + '" aria-hidden="true">' + ICON[tone] + '</span>'
|
|
38
|
+
+ '<h2 class="chef-view-sec-title">' + esc(head.title) + '</h2>'
|
|
39
|
+
+ (head.note === '' ? '' : '<span class="chef-view-sec-note">' + esc(head.note) + '</span>')
|
|
40
|
+
+ '</div>'
|
|
41
|
+
+ '<div class="chef-view-sec-body"' + (anchor === '' ? '' : ' id="' + esc(anchor) + '"') + '>'
|
|
42
|
+
+ inner + '</div></section>';
|
|
43
|
+
}
|
|
44
|
+
const PARAM_ICON = {
|
|
45
|
+
heat: ICON.steps,
|
|
46
|
+
clock: SVG_OPEN + '<circle cx="12" cy="12" r="8.4"/><path d="M12 7.2V12l3.2 1.9"/></svg>',
|
|
47
|
+
temp: SVG_OPEN + '<path d="M10.4 13.2V5.6a1.6 1.6 0 0 1 3.2 0v7.6a3.6 3.6 0 1 1-3.2 0Z"/>'
|
|
48
|
+
+ '<path d="M12 10v6.4"/></svg>',
|
|
49
|
+
};
|
|
50
|
+
/** 一行「图标位 + 标签 + 值」的参数带(步骤卡的火候/时长/锅温走这一条形状)。 */
|
|
51
|
+
export function paramBandOf(items) {
|
|
52
|
+
if (items.length === 0)
|
|
53
|
+
return '';
|
|
54
|
+
return '<ul class="chef-view-params">' + items.map((it) => '<li class="chef-view-param">'
|
|
55
|
+
+ '<span class="chef-view-param-icon" aria-hidden="true">' + PARAM_ICON[it.tone] + '</span>'
|
|
56
|
+
+ '<span class="chef-view-param-label">' + esc(it.label) + '</span>'
|
|
57
|
+
+ '<span class="chef-view-param-value">' + esc(it.value) + '</span></li>').join('') + '</ul>';
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=pageSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageSection.js","sourceRoot":"","sources":["../../src/view/pageSection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,4CAA4C;AAC5C,MAAM,GAAG,GAAG,UAAU,CAAC;AAcvB,4DAA4D;AAC5D,MAAM,QAAQ,GAAG,mFAAmF;MAChG,wFAAwF,CAAC;AAE7F,eAAe;AACf,MAAM,IAAI,GAAuC;IAC/C,WAAW,EAAE,QAAQ,GAAG,gEAAgE;UACpF,2FAA2F;IAC/F,KAAK,EAAE,QAAQ,GAAG,uFAAuF;UACrG,kHAAkH;IACtH,SAAS,EAAE,QAAQ,GAAG,iHAAiH;IACvI,UAAU,EAAE,QAAQ,GAAG,kHAAkH;UACrI,gCAAgC;IACpC,OAAO,EAAE,QAAQ,GAAG,uEAAuE;IAC3F,IAAI,EAAE,QAAQ,GAAG,sFAAsF;IACvG,IAAI,EAAE,QAAQ,GAAG,mGAAmG;IACpH,IAAI,EAAE,QAAQ,GAAG,4GAA4G;UACzH,yDAAyD;CAC9D,CAAC;AAEF;mDACmD;AACnD,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,IAAc,EAAE,IAAa,EAAE,KAAa;IACpF,OAAO,iCAAiC;UACpC,kCAAkC;UAClC,iDAAiD,GAAG,IAAI,GAAG,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS;UAC3G,kCAAkC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO;UAC9D,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mCAAmC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;UAC1F,QAAQ;UACR,iCAAiC,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;UAC5F,KAAK,GAAG,kBAAkB,CAAC;AACjC,CAAC;AAKD,MAAM,UAAU,GAAwC;IACtD,IAAI,EAAE,IAAI,CAAC,KAAK;IAChB,KAAK,EAAE,QAAQ,GAAG,uEAAuE;IACzF,IAAI,EAAE,QAAQ,GAAG,yEAAyE;UACtF,8BAA8B;CACnC,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,WAAW,CACzB,KAA8F;IAE9F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,+BAA+B,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACxD,8BAA8B;UAC5B,wDAAwD,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;UAC1F,sCAAsC,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS;UAClE,sCAAsC,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;AAClG,CAAC"}
|
package/dist/view/routes.js
CHANGED
|
@@ -11,43 +11,43 @@ export const VIEW_ROUTES = [
|
|
|
11
11
|
order: 5,
|
|
12
12
|
wakeWord: '查看食谱',
|
|
13
13
|
key: 'chef.recipe.view',
|
|
14
|
-
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"
|
|
14
|
+
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"辣椒炒肉"}\'',
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
order: 6,
|
|
18
18
|
wakeWord: '查看食材',
|
|
19
19
|
key: 'chef.recipe.view',
|
|
20
|
-
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"
|
|
20
|
+
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"辣椒炒肉"}\'',
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
order: 7,
|
|
24
24
|
wakeWord: '查看步骤',
|
|
25
25
|
key: 'chef.recipe.view',
|
|
26
|
-
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"
|
|
26
|
+
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"辣椒炒肉"}\'',
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
order: 8,
|
|
30
30
|
wakeWord: '查看营养',
|
|
31
31
|
key: 'chef.recipe.view',
|
|
32
|
-
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"
|
|
32
|
+
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"辣椒炒肉"}\'',
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
order: 9,
|
|
36
36
|
wakeWord: '查看背景',
|
|
37
37
|
key: 'chef.recipe.view',
|
|
38
|
-
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"
|
|
38
|
+
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"辣椒炒肉"}\'',
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
order: 10,
|
|
42
42
|
wakeWord: '看菜谱',
|
|
43
43
|
key: 'chef.recipe.view',
|
|
44
|
-
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"
|
|
44
|
+
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"辣椒炒肉"}\'',
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
order: 11,
|
|
48
48
|
wakeWord: '看菜',
|
|
49
49
|
key: 'chef.recipe.view',
|
|
50
|
-
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"
|
|
50
|
+
cli: 'chef-cmd-read chef.recipe.view --params \'{"name":"辣椒炒肉"}\'',
|
|
51
51
|
},
|
|
52
52
|
];
|
|
53
53
|
//# sourceMappingURL=routes.js.map
|
package/dist/view/run.d.ts
CHANGED
|
@@ -2,10 +2,14 @@
|
|
|
2
2
|
*
|
|
3
3
|
* 老分派层(`src/cli/cmd_read.ts`)分支逐字节下沉:只改 import 出处,判定与装配一字不动。
|
|
4
4
|
* 缺定位走取数错(`resolveNameOrId` 任务口径,入口映射为 exit 4)。
|
|
5
|
+
*
|
|
6
|
+
* #770 取数面(配方 `t768-页面族配方.md` §4 回写本票领 4 条):营养/背景/六张关联表徽标/
|
|
7
|
+
* 替换食材。替换食材已在行上(`ingredients.substitute`);历史统计走共享原语。
|
|
8
|
+
* 营养无行时显式标未估算,不编数字冒充(票面「不许动的东西」)。
|
|
5
9
|
*/
|
|
6
10
|
import type { ChefDb } from '../fetch/db.js';
|
|
7
11
|
import type { RecipeDetail } from '../render/views.js';
|
|
8
|
-
export declare function recipeDetail(detail: RecipeDetail): {
|
|
12
|
+
export declare function recipeDetail(detail: RecipeDetail, handle?: ChefDb): {
|
|
9
13
|
item: Record<string, unknown>;
|
|
10
14
|
};
|
|
11
15
|
/** 跑 `chef.recipe.view`:按名或 id 取单菜全貌(detail 形)。 */
|
package/dist/view/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/view/run.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/view/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgDvD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAgCrG;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAGtF"}
|
package/dist/view/run.js
CHANGED
|
@@ -2,15 +2,71 @@
|
|
|
2
2
|
*
|
|
3
3
|
* 老分派层(`src/cli/cmd_read.ts`)分支逐字节下沉:只改 import 出处,判定与装配一字不动。
|
|
4
4
|
* 缺定位走取数错(`resolveNameOrId` 任务口径,入口映射为 exit 4)。
|
|
5
|
+
*
|
|
6
|
+
* #770 取数面(配方 `t768-页面族配方.md` §4 回写本票领 4 条):营养/背景/六张关联表徽标/
|
|
7
|
+
* 替换食材。替换食材已在行上(`ingredients.substitute`);历史统计走共享原语。
|
|
8
|
+
* 营养无行时显式标未估算,不编数字冒充(票面「不许动的东西」)。
|
|
5
9
|
*/
|
|
6
|
-
import { getRecipeDetail } from '../fetch/db.js';
|
|
10
|
+
import { getRecipeDetail, historyStats, qAll, qGet, queryHistory } from '../fetch/db.js';
|
|
7
11
|
import { toRecipeItem } from '../render/views.js';
|
|
8
12
|
import { resolveNameOrId } from '../shared/slots.js';
|
|
9
|
-
//
|
|
13
|
+
// 营养行(`nutrition_info`,一菜一行):有行即真数据,无行即显式未估算。
|
|
14
|
+
function queryNutrition(recipeId, h) {
|
|
15
|
+
const row = qGet(h, 'SELECT * FROM nutrition_info WHERE recipe_id = ?', [recipeId]);
|
|
16
|
+
if (!row)
|
|
17
|
+
return { estimated: false, note: '营养估算一期占位(以实际食材称量为准)' };
|
|
18
|
+
return {
|
|
19
|
+
estimated: true,
|
|
20
|
+
serving_size: row.serving_size, serving_unit: row.serving_unit,
|
|
21
|
+
calories: row.calories, protein: row.protein, fat: row.fat,
|
|
22
|
+
carbs: row.carbs, fiber: row.fiber, sodium: row.sodium,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// 背景行(`background_knowledge`,一菜一行):无行即 null(页面不留空块)。
|
|
26
|
+
function queryBackground(recipeId, h) {
|
|
27
|
+
const row = qGet(h, 'SELECT * FROM background_knowledge WHERE recipe_id = ?', [recipeId]);
|
|
28
|
+
if (!row)
|
|
29
|
+
return null;
|
|
30
|
+
return {
|
|
31
|
+
origin_story: row.origin_story,
|
|
32
|
+
historical_background: row.historical_background,
|
|
33
|
+
cultural_significance: row.cultural_significance,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// 页头徽标行(六张关联表,各 1–N 行):只收文本列,无行即空数组(徽章行空即不印)。
|
|
37
|
+
function queryBadges(recipeId, h) {
|
|
38
|
+
const col = (table, field) => qAll(h, 'SELECT ' + field + ' FROM ' + table + ' WHERE recipe_id = ?', [recipeId])
|
|
39
|
+
.map((r) => String(r[field] ?? ''))
|
|
40
|
+
.filter((s) => s !== '');
|
|
41
|
+
const region = qAll(h, 'SELECT region, country FROM recipe_categories WHERE recipe_id = ?', [recipeId]);
|
|
42
|
+
return {
|
|
43
|
+
cuisine: col('recipe_categories', 'cuisine_type'),
|
|
44
|
+
region: region.map((r) => String(r.region ?? '')).filter((s) => s !== ''),
|
|
45
|
+
country: region.map((r) => String(r.country ?? '')).filter((s) => s !== ''),
|
|
46
|
+
flavors: col('recipe_flavors', 'flavor'),
|
|
47
|
+
seasons: col('recipe_seasons', 'season'),
|
|
48
|
+
meal_types: col('recipe_meal_types', 'meal_type'),
|
|
49
|
+
diet_tags: col('recipe_diet_tags', 'tag'),
|
|
50
|
+
cooking_methods: col('recipe_cooking_methods', 'method'),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// 单菜全貌 detail:基本 + 食材 + 步骤 + 历史统计 + 营养(真行或显式占位)+ 背景 + 徽标。
|
|
10
54
|
// 原 `src/render/views.ts`,本域独占(旧址由 `src/render/index.ts` 转出)。
|
|
11
|
-
export function recipeDetail(detail) {
|
|
55
|
+
export function recipeDetail(detail, handle) {
|
|
12
56
|
const ingredients = [...detail.ingredients].sort((a, b) => a.sequence - b.sequence).map((g) => ({ ...g }));
|
|
13
57
|
const steps = [...detail.steps].sort((a, b) => a.sequence - b.sequence).map((s) => ({ ...s }));
|
|
58
|
+
const recipeId = detail.recipe.id;
|
|
59
|
+
const history = detail.history ?? (handle ? historyStats(handle, recipeId) : { count: 0, avgRating: null });
|
|
60
|
+
const timeline = handle
|
|
61
|
+
? queryHistory(handle, recipeId).map((r) => ({
|
|
62
|
+
cook_date: r.cook_date, cook_sequence: r.cook_sequence, rating: r.rating, feedback: r.feedback,
|
|
63
|
+
}))
|
|
64
|
+
: [];
|
|
65
|
+
const nutrition = handle ? queryNutrition(recipeId, handle) : { estimated: false, note: '营养估算一期占位(以实际食材称量为准)' };
|
|
66
|
+
const background = handle ? queryBackground(recipeId, handle) : null;
|
|
67
|
+
const badges = handle ? queryBadges(recipeId, handle) : {
|
|
68
|
+
cuisine: [], region: [], country: [], flavors: [], seasons: [], meal_types: [], diet_tags: [], cooking_methods: [],
|
|
69
|
+
};
|
|
14
70
|
return {
|
|
15
71
|
item: {
|
|
16
72
|
...toRecipeItem(detail.recipe),
|
|
@@ -21,14 +77,17 @@ export function recipeDetail(detail) {
|
|
|
21
77
|
updated_at: detail.recipe.updated_at,
|
|
22
78
|
ingredients,
|
|
23
79
|
steps,
|
|
24
|
-
history
|
|
25
|
-
|
|
26
|
-
nutrition
|
|
80
|
+
history,
|
|
81
|
+
history_timeline: timeline,
|
|
82
|
+
nutrition,
|
|
83
|
+
background,
|
|
84
|
+
badges,
|
|
27
85
|
},
|
|
28
86
|
};
|
|
29
87
|
}
|
|
30
88
|
/** 跑 `chef.recipe.view`:按名或 id 取单菜全貌(detail 形)。 */
|
|
31
89
|
export function runRecipeView(handle, params) {
|
|
32
|
-
|
|
90
|
+
const detail = getRecipeDetail(handle, resolveNameOrId(params));
|
|
91
|
+
return recipeDetail(detail, handle);
|
|
33
92
|
}
|
|
34
93
|
//# sourceMappingURL=run.js.map
|
package/dist/view/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/view/run.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/view/run.ts"],"names":[],"mappings":"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"}
|