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.
Files changed (244) hide show
  1. package/SKILL.md +42 -29
  2. package/dist/add/commands.js +1 -1
  3. package/dist/add/index.d.ts +1 -0
  4. package/dist/add/index.d.ts.map +1 -1
  5. package/dist/add/index.js +1 -0
  6. package/dist/add/index.js.map +1 -1
  7. package/dist/add/pages.d.ts +62 -0
  8. package/dist/add/pages.d.ts.map +1 -0
  9. package/dist/add/pages.js +362 -0
  10. package/dist/add/pages.js.map +1 -0
  11. package/dist/add/routes.d.ts +4 -4
  12. package/dist/add/routes.d.ts.map +1 -1
  13. package/dist/add/routes.js +12 -6
  14. package/dist/add/routes.js.map +1 -1
  15. package/dist/add/run-write.d.ts.map +1 -1
  16. package/dist/add/run-write.js +39 -0
  17. package/dist/add/run-write.js.map +1 -1
  18. package/dist/cli/cmd_read.js +17 -1
  19. package/dist/cli/cmd_read.js.map +1 -1
  20. package/dist/cli/config.d.ts +0 -10
  21. package/dist/cli/config.d.ts.map +1 -1
  22. package/dist/cli/config.js +22 -1
  23. package/dist/cli/config.js.map +1 -1
  24. package/dist/cli/keys.d.ts +1 -1
  25. package/dist/cli/keys.d.ts.map +1 -1
  26. package/dist/cli/keys.js +16 -4
  27. package/dist/cli/keys.js.map +1 -1
  28. package/dist/cook/commands.js +1 -1
  29. package/dist/cook/index.d.ts +2 -1
  30. package/dist/cook/index.d.ts.map +1 -1
  31. package/dist/cook/index.js +1 -1
  32. package/dist/cook/index.js.map +1 -1
  33. package/dist/cook/page-art.d.ts +18 -0
  34. package/dist/cook/page-art.d.ts.map +1 -0
  35. package/dist/cook/page-art.js +30 -0
  36. package/dist/cook/page-art.js.map +1 -0
  37. package/dist/cook/page-css.d.ts +9 -0
  38. package/dist/cook/page-css.d.ts.map +1 -0
  39. package/dist/cook/page-css.js +206 -0
  40. package/dist/cook/page-css.js.map +1 -0
  41. package/dist/cook/page-text.d.ts +28 -0
  42. package/dist/cook/page-text.d.ts.map +1 -0
  43. package/dist/cook/page-text.js +65 -0
  44. package/dist/cook/page-text.js.map +1 -0
  45. package/dist/cook/routes.js +4 -4
  46. package/dist/cook/run.d.ts +56 -1
  47. package/dist/cook/run.d.ts.map +1 -1
  48. package/dist/cook/run.js +252 -22
  49. package/dist/cook/run.js.map +1 -1
  50. package/dist/data/commands.d.ts +6 -7
  51. package/dist/data/commands.d.ts.map +1 -1
  52. package/dist/data/commands.js +15 -8
  53. package/dist/data/commands.js.map +1 -1
  54. package/dist/data/index.d.ts +2 -0
  55. package/dist/data/index.d.ts.map +1 -1
  56. package/dist/data/index.js +2 -0
  57. package/dist/data/index.js.map +1 -1
  58. package/dist/data/pages.d.ts +50 -0
  59. package/dist/data/pages.d.ts.map +1 -0
  60. package/dist/data/pages.js +226 -0
  61. package/dist/data/pages.js.map +1 -0
  62. package/dist/data/routes.d.ts +4 -5
  63. package/dist/data/routes.d.ts.map +1 -1
  64. package/dist/data/routes.js +8 -10
  65. package/dist/data/routes.js.map +1 -1
  66. package/dist/data/run-batch.d.ts +21 -0
  67. package/dist/data/run-batch.d.ts.map +1 -0
  68. package/dist/data/run-batch.js +123 -0
  69. package/dist/data/run-batch.js.map +1 -0
  70. package/dist/data/run-query.d.ts +5 -6
  71. package/dist/data/run-query.d.ts.map +1 -1
  72. package/dist/data/run-query.js +113 -28
  73. package/dist/data/run-query.js.map +1 -1
  74. package/dist/help/lookup.d.ts.map +1 -1
  75. package/dist/help/lookup.js +20 -4
  76. package/dist/help/lookup.js.map +1 -1
  77. package/dist/help/sceneData.d.ts +8 -7
  78. package/dist/help/sceneData.d.ts.map +1 -1
  79. package/dist/help/sceneData.js +22 -21
  80. package/dist/help/sceneData.js.map +1 -1
  81. package/dist/history/commands.js +1 -1
  82. package/dist/history/page-css.d.ts +12 -0
  83. package/dist/history/page-css.d.ts.map +1 -0
  84. package/dist/history/page-css.js +208 -0
  85. package/dist/history/page-css.js.map +1 -0
  86. package/dist/history/pages.d.ts +77 -0
  87. package/dist/history/pages.d.ts.map +1 -0
  88. package/dist/history/pages.js +282 -0
  89. package/dist/history/pages.js.map +1 -0
  90. package/dist/history/routes.d.ts +4 -6
  91. package/dist/history/routes.d.ts.map +1 -1
  92. package/dist/history/routes.js +22 -16
  93. package/dist/history/routes.js.map +1 -1
  94. package/dist/history/run-query.d.ts +48 -0
  95. package/dist/history/run-query.d.ts.map +1 -1
  96. package/dist/history/run-query.js +96 -10
  97. package/dist/history/run-query.js.map +1 -1
  98. package/dist/history/run-record.d.ts +12 -2
  99. package/dist/history/run-record.d.ts.map +1 -1
  100. package/dist/history/run-record.js +28 -14
  101. package/dist/history/run-record.js.map +1 -1
  102. package/dist/history/validate.d.ts +22 -0
  103. package/dist/history/validate.d.ts.map +1 -0
  104. package/dist/history/validate.js +69 -0
  105. package/dist/history/validate.js.map +1 -0
  106. package/dist/policy/wakewords.d.ts +1 -1
  107. package/dist/policy/wakewords.d.ts.map +1 -1
  108. package/dist/policy/wakewords.js +23 -2
  109. package/dist/policy/wakewords.js.map +1 -1
  110. package/dist/relation/commands.d.ts +6 -5
  111. package/dist/relation/commands.d.ts.map +1 -1
  112. package/dist/relation/commands.js +23 -6
  113. package/dist/relation/commands.js.map +1 -1
  114. package/dist/relation/index.d.ts +3 -0
  115. package/dist/relation/index.d.ts.map +1 -1
  116. package/dist/relation/index.js +3 -0
  117. package/dist/relation/index.js.map +1 -1
  118. package/dist/relation/pages.d.ts +37 -0
  119. package/dist/relation/pages.d.ts.map +1 -0
  120. package/dist/relation/pages.js +224 -0
  121. package/dist/relation/pages.js.map +1 -0
  122. package/dist/relation/routes.d.ts +6 -5
  123. package/dist/relation/routes.d.ts.map +1 -1
  124. package/dist/relation/routes.js +17 -16
  125. package/dist/relation/routes.js.map +1 -1
  126. package/dist/relation/run-query.d.ts +10 -0
  127. package/dist/relation/run-query.d.ts.map +1 -0
  128. package/dist/relation/run-query.js +104 -0
  129. package/dist/relation/run-query.js.map +1 -0
  130. package/dist/relation/run-write.d.ts +13 -0
  131. package/dist/relation/run-write.d.ts.map +1 -0
  132. package/dist/relation/run-write.js +114 -0
  133. package/dist/relation/run-write.js.map +1 -0
  134. package/dist/relation/shapes.d.ts +8 -0
  135. package/dist/relation/shapes.d.ts.map +1 -0
  136. package/dist/relation/shapes.js +153 -0
  137. package/dist/relation/shapes.js.map +1 -0
  138. package/dist/relation/treeShapes.d.ts +23 -0
  139. package/dist/relation/treeShapes.d.ts.map +1 -0
  140. package/dist/relation/treeShapes.js +289 -0
  141. package/dist/relation/treeShapes.js.map +1 -0
  142. package/dist/render/copyArea.d.ts +67 -0
  143. package/dist/render/copyArea.d.ts.map +1 -0
  144. package/dist/render/copyArea.js +146 -0
  145. package/dist/render/copyArea.js.map +1 -0
  146. package/dist/render/envelope.d.ts.map +1 -1
  147. package/dist/render/envelope.js +4 -0
  148. package/dist/render/envelope.js.map +1 -1
  149. package/dist/render/index.d.ts +7 -0
  150. package/dist/render/index.d.ts.map +1 -1
  151. package/dist/render/index.js +7 -0
  152. package/dist/render/index.js.map +1 -1
  153. package/dist/render/sceneBand.d.ts +36 -0
  154. package/dist/render/sceneBand.d.ts.map +1 -0
  155. package/dist/render/sceneBand.js +166 -0
  156. package/dist/render/sceneBand.js.map +1 -0
  157. package/dist/render/sceneRhythm.d.ts +6 -0
  158. package/dist/render/sceneRhythm.d.ts.map +1 -0
  159. package/dist/render/sceneRhythm.js +149 -0
  160. package/dist/render/sceneRhythm.js.map +1 -0
  161. package/dist/render/sceneShell.d.ts +17 -0
  162. package/dist/render/sceneShell.d.ts.map +1 -0
  163. package/dist/render/sceneShell.js +46 -0
  164. package/dist/render/sceneShell.js.map +1 -0
  165. package/dist/render/skin.d.ts +13 -0
  166. package/dist/render/skin.d.ts.map +1 -0
  167. package/dist/render/skin.js +282 -0
  168. package/dist/render/skin.js.map +1 -0
  169. package/dist/search/routes.d.ts +12 -4
  170. package/dist/search/routes.d.ts.map +1 -1
  171. package/dist/search/routes.js +39 -7
  172. package/dist/search/routes.js.map +1 -1
  173. package/dist/search/run.d.ts +10 -2
  174. package/dist/search/run.d.ts.map +1 -1
  175. package/dist/search/run.js +61 -9
  176. package/dist/search/run.js.map +1 -1
  177. package/dist/setup/commands.d.ts +5 -5
  178. package/dist/setup/commands.d.ts.map +1 -1
  179. package/dist/setup/commands.js +14 -6
  180. package/dist/setup/commands.js.map +1 -1
  181. package/dist/setup/index.d.ts +3 -5
  182. package/dist/setup/index.d.ts.map +1 -1
  183. package/dist/setup/index.js +3 -5
  184. package/dist/setup/index.js.map +1 -1
  185. package/dist/setup/pages.d.ts +19 -0
  186. package/dist/setup/pages.d.ts.map +1 -0
  187. package/dist/setup/pages.js +163 -0
  188. package/dist/setup/pages.js.map +1 -0
  189. package/dist/setup/routes.d.ts +4 -5
  190. package/dist/setup/routes.d.ts.map +1 -1
  191. package/dist/setup/routes.js +7 -8
  192. package/dist/setup/routes.js.map +1 -1
  193. package/dist/setup/run-init.d.ts +11 -0
  194. package/dist/setup/run-init.d.ts.map +1 -0
  195. package/dist/setup/run-init.js +19 -0
  196. package/dist/setup/run-init.js.map +1 -0
  197. package/dist/shared/command-spec.d.ts +5 -3
  198. package/dist/shared/command-spec.d.ts.map +1 -1
  199. package/dist/shopping/commands.js +1 -1
  200. package/dist/shopping/commands.js.map +1 -1
  201. package/dist/shopping/index.d.ts +1 -0
  202. package/dist/shopping/index.d.ts.map +1 -1
  203. package/dist/shopping/index.js +1 -0
  204. package/dist/shopping/index.js.map +1 -1
  205. package/dist/shopping/pages.d.ts +22 -0
  206. package/dist/shopping/pages.d.ts.map +1 -0
  207. package/dist/shopping/pages.js +170 -0
  208. package/dist/shopping/pages.js.map +1 -0
  209. package/dist/shopping/routes.js +4 -4
  210. package/dist/shopping/routes.js.map +1 -1
  211. package/dist/shopping/run.d.ts +9 -5
  212. package/dist/shopping/run.d.ts.map +1 -1
  213. package/dist/shopping/run.js +58 -10
  214. package/dist/shopping/run.js.map +1 -1
  215. package/dist/triggers/chef-scenes.d.ts +3 -2
  216. package/dist/triggers/chef-scenes.d.ts.map +1 -1
  217. package/dist/triggers/chef-scenes.js +16 -15
  218. package/dist/triggers/chef-scenes.js.map +1 -1
  219. package/dist/update/routes.d.ts +6 -4
  220. package/dist/update/routes.d.ts.map +1 -1
  221. package/dist/update/routes.js +20 -6
  222. package/dist/update/routes.js.map +1 -1
  223. package/dist/update/run-write.d.ts.map +1 -1
  224. package/dist/update/run-write.js +211 -1
  225. package/dist/update/run-write.js.map +1 -1
  226. package/dist/view/commands.js +1 -1
  227. package/dist/view/page.d.ts +25 -0
  228. package/dist/view/page.d.ts.map +1 -0
  229. package/dist/view/page.js +306 -0
  230. package/dist/view/page.js.map +1 -0
  231. package/dist/view/pageCss.d.ts +8 -0
  232. package/dist/view/pageCss.d.ts.map +1 -0
  233. package/dist/view/pageCss.js +327 -0
  234. package/dist/view/pageCss.js.map +1 -0
  235. package/dist/view/pageSection.d.ts +21 -0
  236. package/dist/view/pageSection.d.ts.map +1 -0
  237. package/dist/view/pageSection.js +59 -0
  238. package/dist/view/pageSection.js.map +1 -0
  239. package/dist/view/routes.js +7 -7
  240. package/dist/view/run.d.ts +5 -1
  241. package/dist/view/run.d.ts.map +1 -1
  242. package/dist/view/run.js +66 -7
  243. package/dist/view/run.js.map +1 -1
  244. package/package.json +3 -3
@@ -0,0 +1,13 @@
1
+ /** 派生能力的写处理(`chef.relation.write` 的 add/derive 两 op)+ 本域独占的取数。
2
+ *
3
+ * 老件语义来源(只读对照,一行动不动老件):
4
+ * · add:`scripts/relation_manager.py:47-131`(父子存在校验+关系类型枚举+改动说明必填+单 INSERT);
5
+ * · derive:`scripts/派生/ops.py:182-244`(母本校验+新菜创建+关系插入同一事务+母子差异 diff)。
6
+ * 本票不改 schema、不碰真库;缺值按 #818 甲拦下补齐,不写半条脏数据。
7
+ */
8
+ import type { ChefDb } from '../fetch/db.js';
9
+ /** op 路由:add(默认)/derive(从已有派生新菜)。非法 op 入口已拦,落不到这里。 */
10
+ export declare function parseRelationOp(params: Record<string, unknown>): string;
11
+ /** 跑 `chef.relation.write`:op 由入口算好下传,本函数只做本域两路分支。 */
12
+ export declare function runRelationWrite(handle: ChefDb, params: Record<string, unknown>, op: string): unknown;
13
+ //# sourceMappingURL=run-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-write.d.ts","sourceRoot":"","sources":["../../src/relation/run-write.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAgB7C,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAIvE;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CA4ErG"}
@@ -0,0 +1,114 @@
1
+ /** 派生能力的写处理(`chef.relation.write` 的 add/derive 两 op)+ 本域独占的取数。
2
+ *
3
+ * 老件语义来源(只读对照,一行动不动老件):
4
+ * · add:`scripts/relation_manager.py:47-131`(父子存在校验+关系类型枚举+改动说明必填+单 INSERT);
5
+ * · derive:`scripts/派生/ops.py:182-244`(母本校验+新菜创建+关系插入同一事务+母子差异 diff)。
6
+ * 本票不改 schema、不碰真库;缺值按 #818 甲拦下补齐,不写半条脏数据。
7
+ */
8
+ import { randomUUID } from 'node:crypto';
9
+ import { ChefFetchError, ChefPolicyError } from '../fetch/errors.js';
10
+ import { getRecipeDetail, mustRecipe, now, qAll, qGet, qRun } from '../fetch/db.js';
11
+ import { addRecipe } from '../add/index.js';
12
+ import { buildRecipeReceipt } from '../render/index.js';
13
+ /** 关系类型白名单(老件 validators 同语义:派生/变体/改良)。 */
14
+ const RELATION_TYPES = ['派生', '变体', '改良'];
15
+ function needText(params, key) {
16
+ const v = params[key];
17
+ if (typeof v !== 'string' || !v.trim()) {
18
+ throw new ChefPolicyError('POLICY_MISSING_SLOT', '缺槽位 ' + key);
19
+ }
20
+ return v.trim();
21
+ }
22
+ /** op 路由:add(默认)/derive(从已有派生新菜)。非法 op 入口已拦,落不到这里。 */
23
+ export function parseRelationOp(params) {
24
+ const op = params.op === undefined ? 'add' : params.op;
25
+ if (op === 'add' || op === 'derive')
26
+ return op;
27
+ throw new ChefPolicyError('POLICY_BAD_INPUT', 'relation.write 只接受 op=add/derive');
28
+ }
29
+ /** 跑 `chef.relation.write`:op 由入口算好下传,本函数只做本域两路分支。 */
30
+ export function runRelationWrite(handle, params, op) {
31
+ if (op === 'add') {
32
+ const parentName = needText(params, 'parent');
33
+ const childName = needText(params, 'child');
34
+ const relationType = needText(params, 'relation_type');
35
+ const changeSummary = needText(params, 'change_summary');
36
+ if (!RELATION_TYPES.includes(relationType)) {
37
+ throw new ChefPolicyError('POLICY_BAD_INPUT', '关系类型须为派生/变体/改良');
38
+ }
39
+ const parent = mustRecipe(handle, parentName);
40
+ const child = mustRecipe(handle, childName);
41
+ if (parent.id === child.id) {
42
+ throw new ChefPolicyError('POLICY_BAD_INPUT', '不能派生自身');
43
+ }
44
+ const id = randomUUID();
45
+ try {
46
+ qRun(handle, 'INSERT INTO recipe_relations (id, parent_id, child_id, relation_type, change_summary) VALUES (?, ?, ?, ?, ?)', [id, parent.id, child.id, relationType, changeSummary]);
47
+ }
48
+ catch (e) {
49
+ if (e instanceof ChefFetchError)
50
+ throw e;
51
+ throw new ChefFetchError('CHEF_DB_UNREADABLE', '派生关系写盘失败', { cause: e });
52
+ }
53
+ return buildRecipeReceipt('已记派生关系:' + parent.name + '到' + child.name + '(' + relationType + ')');
54
+ }
55
+ if (op === 'derive') {
56
+ const sourceName = needText(params, 'source');
57
+ const targetName = needText(params, 'target');
58
+ const differences = needText(params, 'differences');
59
+ const relationTypeRaw = typeof params.relation_type === 'string' && params.relation_type.trim() ? params.relation_type.trim() : '派生';
60
+ if (!RELATION_TYPES.includes(relationTypeRaw)) {
61
+ throw new ChefPolicyError('POLICY_BAD_INPUT', '关系类型须为派生/变体/改良');
62
+ }
63
+ const mother = getRecipeDetail(handle, sourceName);
64
+ if (mother.recipe.status === '已废弃') {
65
+ throw new ChefFetchError('CHEF_BAD_QUERY', '母本已废弃,不能派生');
66
+ }
67
+ const dup = qGet(handle, 'SELECT COUNT(*) AS c FROM recipes WHERE name = ?', [targetName]);
68
+ if (dup && Number(dup.c) > 0) {
69
+ throw new ChefFetchError('CHEF_RECIPE_CORRUPT', '新菜名已存在:“' + targetName + '”');
70
+ }
71
+ const created = addRecipe(handle, {
72
+ name: targetName,
73
+ description: mother.recipe.description ? mother.recipe.description + '(派生差异:' + differences + ')' : '由' + mother.recipe.name + '派生:' + differences,
74
+ difficulty: mother.recipe.difficulty,
75
+ servings: mother.recipe.servings,
76
+ total_time_minutes: mother.recipe.total_time_minutes,
77
+ status: '未做',
78
+ photo_url: '',
79
+ source: mother.recipe.source,
80
+ source_url: mother.recipe.source_url,
81
+ });
82
+ try {
83
+ handle.db.exec('BEGIN');
84
+ for (const g of [...mother.ingredients].sort((a, b) => a.sequence - b.sequence)) {
85
+ if (g.quantity === null) {
86
+ throw new ChefFetchError('CHEF_BAD_QUERY', '母本食材缺数字用量,派生前请先补齐');
87
+ }
88
+ qRun(handle, 'INSERT INTO ingredients (id, recipe_id, sequence, name, category, quantity, unit, quantity_text, is_optional, substitute) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [randomUUID(), created.id, g.sequence, g.name, g.category, g.quantity, g.unit, g.quantity_text, g.is_optional, g.substitute]);
89
+ }
90
+ for (const s of [...mother.steps].sort((a, b) => a.sequence - b.sequence)) {
91
+ if (s.duration_minutes === null) {
92
+ throw new ChefFetchError('CHEF_BAD_QUERY', '母本步骤缺数字时长,派生前请先补齐');
93
+ }
94
+ qRun(handle, 'INSERT INTO cooking_steps (id, recipe_id, sequence, action, duration_minutes, heat_level, temperature, expected_result) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [randomUUID(), created.id, s.sequence, s.action, s.duration_minutes, s.heat_level, s.temperature, s.expected_result]);
95
+ }
96
+ qRun(handle, 'INSERT INTO recipe_relations (id, parent_id, child_id, relation_type, change_summary) VALUES (?, ?, ?, ?, ?)', [randomUUID(), mother.recipe.id, created.id, relationTypeRaw, differences]);
97
+ handle.db.exec('COMMIT');
98
+ }
99
+ catch (e) {
100
+ try {
101
+ handle.db.exec('ROLLBACK');
102
+ }
103
+ catch { /* 已回滚 */ }
104
+ if (e instanceof ChefFetchError || e instanceof ChefPolicyError)
105
+ throw e;
106
+ throw new ChefFetchError('CHEF_DB_UNREADABLE', '派生写盘失败', { cause: e });
107
+ }
108
+ void now();
109
+ void qAll;
110
+ return buildRecipeReceipt('已从' + mother.recipe.name + '派生新菜:' + targetName + '(差异:' + differences + ')');
111
+ }
112
+ throw new ChefPolicyError('POLICY_BAD_INPUT', 'relation.write 只接受 op=add/derive');
113
+ }
114
+ //# sourceMappingURL=run-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-write.js","sourceRoot":"","sources":["../../src/relation/run-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** #873 派生席 · 回执那两页的页内形状(结论条+状态徽章/关系对图/说明段/动作行),兼页内样式唯一入口。
2
+ *
3
+ * 家族树那一族住同目录的 `treeShapes.ts`:两族的变化频率不同,拆开之后两件都在本包告警线 350 行以内。
4
+ * 规则顺序与拆件前逐行相同(先回执族、后家族树族),因此产物一字不变。
5
+ */
6
+ /** 本域三页的页内形状样式唯一产出者(回执两页 + 家族树)。恒返回非空 CSS 文本。 */
7
+ export declare function relationShapeCss(): string;
8
+ //# sourceMappingURL=shapes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../src/relation/shapes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,iDAAiD;AACjD,wBAAgB,gBAAgB,IAAI,MAAM,CAgJzC"}
@@ -0,0 +1,153 @@
1
+ /** #873 派生席 · 回执那两页的页内形状(结论条+状态徽章/关系对图/说明段/动作行),兼页内样式唯一入口。
2
+ *
3
+ * 家族树那一族住同目录的 `treeShapes.ts`:两族的变化频率不同,拆开之后两件都在本包告警线 350 行以内。
4
+ * 规则顺序与拆件前逐行相同(先回执族、后家族树族),因此产物一字不变。
5
+ */
6
+ import { LF, relationTreeShapeCss, TONE, tint } from './treeShapes.js';
7
+ /** 本域三页的页内形状样式唯一产出者(回执两页 + 家族树)。恒返回非空 CSS 文本。 */
8
+ export function relationShapeCss() {
9
+ const root = '.ilife-page-ui ';
10
+ const node = root + '.ilife-relation-node';
11
+ return [
12
+ '/* #873 派生席 · 页内形状(关系对图 + 三层家族树),只命中本域三页 */',
13
+ /* 结论条与状态徽章配成一行:判定句与它的状态在同一格里。 */
14
+ root + '.ilife-relation-verdict {',
15
+ ' display: flex;',
16
+ ' flex-wrap: wrap;',
17
+ ' align-items: center;',
18
+ ' gap: 10px;',
19
+ ' margin: 0;',
20
+ '}',
21
+ root + '.ilife-relation-verdict > .ilife-block-conclusion {',
22
+ ' flex: 1 1 200px;',
23
+ ' min-width: 0;',
24
+ ' margin: 0;',
25
+ '}',
26
+ root + '.ilife-relation-verdict > .ilife-status-badge {',
27
+ ' flex: 0 0 auto;',
28
+ '}',
29
+ /* 关系对图:两格节点 + 中间一格给关系类型与箭头。箭头自上而下由暖转主色,
30
+ 两端节点各带一条同色的左缘,读起来是「从这一头到那一头」。 */
31
+ root + '.ilife-relation-pair {',
32
+ ' display: grid;',
33
+ ' grid-template-columns: minmax(0, 1fr) 52px minmax(0, 1fr);',
34
+ ' align-items: center;',
35
+ ' margin: 16px 0 0;',
36
+ '}',
37
+ node + ' {',
38
+ ' position: relative;',
39
+ ' display: flex;',
40
+ ' align-items: center;',
41
+ ' gap: 10px;',
42
+ ' box-sizing: border-box;',
43
+ ' min-width: 0;',
44
+ ' padding: 12px 14px;',
45
+ ' border: 1px solid var(--line);',
46
+ ' border-left-width: 4px;',
47
+ ' border-radius: 14px;',
48
+ ' background: var(--card);',
49
+ '}',
50
+ node + '-up {',
51
+ ' border-left-color: ' + TONE.up + ';',
52
+ ' background: ' + tint(TONE.up, 12) + ';',
53
+ '}',
54
+ node + '-down {',
55
+ ' border-left-color: ' + TONE.down + ';',
56
+ ' background: ' + tint(TONE.down, 12) + ';',
57
+ '}',
58
+ root + '.ilife-relation-node-body {',
59
+ ' min-width: 0;',
60
+ '}',
61
+ /* 图标位:一枚圆角方块底 + 一枚箭头字形。纯装饰,字一个都不进样式。 */
62
+ root + '.ilife-relation-icon {',
63
+ ' display: inline-flex;',
64
+ ' align-items: center;',
65
+ ' justify-content: center;',
66
+ ' flex: 0 0 auto;',
67
+ ' width: 22px;',
68
+ ' height: 22px;',
69
+ ' border-radius: 8px;',
70
+ ' color: var(--card);',
71
+ ' background: ' + TONE.up + ';',
72
+ '}',
73
+ root + '.ilife-relation-icon svg {',
74
+ ' display: block;',
75
+ '}',
76
+ root + '.ilife-relation-icon-here {',
77
+ ' background: ' + TONE.here + ';',
78
+ '}',
79
+ root + '.ilife-relation-icon-down {',
80
+ ' background: ' + TONE.down + ';',
81
+ '}',
82
+ root + '.ilife-relation-role {',
83
+ ' display: block;',
84
+ ' color: var(--fg2);',
85
+ ' font-size: 12px;',
86
+ '}',
87
+ root + '.ilife-relation-name {',
88
+ ' display: block;',
89
+ ' margin-top: 3px;',
90
+ ' color: var(--fg);',
91
+ ' font-size: 17px;',
92
+ ' font-weight: 600;',
93
+ ' overflow-wrap: anywhere;',
94
+ '}',
95
+ root + '.ilife-relation-link {',
96
+ ' display: flex;',
97
+ ' flex-direction: column;',
98
+ ' align-items: center;',
99
+ ' gap: 6px;',
100
+ ' min-width: 0;',
101
+ ' padding: 0 6px;',
102
+ '}',
103
+ root + '.ilife-relation-kind {',
104
+ ' max-width: 100%;',
105
+ ' padding: 1px 8px;',
106
+ ' border-radius: 999px;',
107
+ ' background: var(--soft);',
108
+ ' color: var(--blue2);',
109
+ ' font-size: 12px;',
110
+ ' line-height: 1.5;',
111
+ ' white-space: nowrap;',
112
+ ' overflow: hidden;',
113
+ ' text-overflow: ellipsis;',
114
+ '}',
115
+ root + '.ilife-relation-arrow {',
116
+ ' position: relative;',
117
+ ' display: block;',
118
+ ' width: 100%;',
119
+ ' height: 3px;',
120
+ ' border-radius: 999px;',
121
+ ' background-image: linear-gradient(90deg, ' + TONE.up + ', ' + TONE.here + ');',
122
+ '}',
123
+ root + '.ilife-relation-arrow::after {',
124
+ ' content: "";',
125
+ ' position: absolute;',
126
+ ' top: 50%;',
127
+ ' right: 0;',
128
+ ' width: 0;',
129
+ ' height: 0;',
130
+ ' border-top: 5px solid transparent;',
131
+ ' border-bottom: 5px solid transparent;',
132
+ ' border-left: 9px solid ' + TONE.here + ';',
133
+ ' transform: translateY(-50%);',
134
+ '}',
135
+ /* 说明段:一条暖色引线圈住这段正文(不写标签,也就没有「标签贴着值」那种懒写法)。 */
136
+ root + '.ilife-relation-note {',
137
+ ' margin: 14px 0 0;',
138
+ ' padding: 2px 0 2px 12px;',
139
+ ' border-left: 3px solid ' + TONE.up + ';',
140
+ '}',
141
+ root + '.ilife-relation-note > .ilife-block-prose {',
142
+ ' margin: 0;',
143
+ '}',
144
+ /* 动作行:只有一颗按钮时让它铺满整行(两列栅格里一颗按钮只占左半格,读起来像贴边的小件)。 */
145
+ root + '.ilife-relation-actions > .ilife-action-bar > .ilife-action-row > :only-child {',
146
+ ' grid-column: 1 / -1;',
147
+ '}',
148
+ /* 宽档(≥1001px)加宽的是**箭头那一格**(52px→104px):连线跟着变长,中段不再是一块空白。
149
+ 实测记一笔:这一条给第 42 格 -2、第 44 格 -1(两张卡被推开后首屏的紧凑感松了),已撤;
150
+ 留在这里的注释是给下一手省一次同样的试。 */
151
+ ].join(LF) + LF + relationTreeShapeCss();
152
+ }
153
+ //# sourceMappingURL=shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../src/relation/shapes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** #873 派生席 · 家族树那一族的页内形状(三层树/层头/条目行/宽档两栏重排)。
2
+ *
3
+ * 为什么与回执那两页分家:这一族讲的是「上下游三层怎么摆」,回执那两页讲的是「一组关系怎么摆」,
4
+ * 两批改动不同批发生(改家族树时那两页一个字不用动);合成一件会顶到本包告警线以上(拆前 427 LF)。
5
+ *
6
+ * 三层色基 `TONE` 与浅底 `tint()` 住本件,因为三层左缘、层头图标位、条目行圆点读的都是这三个常量,
7
+ * 连回执页那两个节点的左缘也从 `shapes.ts` 取这里;色值只取冻结 token 与既有调色板 `CHART_PALETTE`
8
+ * (唯一定义地= base-paint 的 `spec/charts.ts`),圆角只用闭集 `{8,14,20,999}`。
9
+ */
10
+ /** 换行(仓库口径:不写字面换行转义)。两件的产出器读同一处。 */
11
+ export declare const LF: string;
12
+ /** 三层各自的强调色(上=暖色/中=主色/下=成功色)。三层左缘、层头图标位、条目行圆点、
13
+ * 以及回执页那两个节点的左缘,读的都是这一处。 */
14
+ export declare const TONE: {
15
+ readonly up: "#ff9500";
16
+ readonly here: "var(--blue)";
17
+ readonly down: "var(--ok)";
18
+ };
19
+ /** 强调色的浅底:按百分比与卡片底色混出来,色基仍只来自上面那三个常量(不发明新色值)。 */
20
+ export declare function tint(color: string, pct: number): string;
21
+ /** 家族树那一族的形状样式唯一产出者。恒返回非空 CSS 文本。 */
22
+ export declare function relationTreeShapeCss(): string;
23
+ //# sourceMappingURL=treeShapes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeShapes.d.ts","sourceRoot":"","sources":["../../src/relation/treeShapes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,oCAAoC;AACpC,eAAO,MAAM,EAAE,QAA0B,CAAC;AAE1C;6BAC6B;AAC7B,eAAO,MAAM,IAAI;;;;CAIP,CAAC;AAEX,iDAAiD;AACjD,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,qCAAqC;AACrC,wBAAgB,oBAAoB,IAAI,MAAM,CAuQ7C"}
@@ -0,0 +1,289 @@
1
+ /** #873 派生席 · 家族树那一族的页内形状(三层树/层头/条目行/宽档两栏重排)。
2
+ *
3
+ * 为什么与回执那两页分家:这一族讲的是「上下游三层怎么摆」,回执那两页讲的是「一组关系怎么摆」,
4
+ * 两批改动不同批发生(改家族树时那两页一个字不用动);合成一件会顶到本包告警线以上(拆前 427 LF)。
5
+ *
6
+ * 三层色基 `TONE` 与浅底 `tint()` 住本件,因为三层左缘、层头图标位、条目行圆点读的都是这三个常量,
7
+ * 连回执页那两个节点的左缘也从 `shapes.ts` 取这里;色值只取冻结 token 与既有调色板 `CHART_PALETTE`
8
+ * (唯一定义地= base-paint 的 `spec/charts.ts`),圆角只用闭集 `{8,14,20,999}`。
9
+ */
10
+ import { CHART_PALETTE } from 'base-paint';
11
+ /** 换行(仓库口径:不写字面换行转义)。两件的产出器读同一处。 */
12
+ export const LF = String.fromCharCode(10);
13
+ /** 三层各自的强调色(上=暖色/中=主色/下=成功色)。三层左缘、层头图标位、条目行圆点、
14
+ * 以及回执页那两个节点的左缘,读的都是这一处。 */
15
+ export const TONE = {
16
+ up: CHART_PALETTE[2],
17
+ here: 'var(--blue)',
18
+ down: 'var(--ok)',
19
+ };
20
+ /** 强调色的浅底:按百分比与卡片底色混出来,色基仍只来自上面那三个常量(不发明新色值)。 */
21
+ export function tint(color, pct) {
22
+ return 'color-mix(in srgb, ' + color + ' ' + pct + '%, var(--card))';
23
+ }
24
+ /** 家族树那一族的形状样式唯一产出者。恒返回非空 CSS 文本。 */
25
+ export function relationTreeShapeCss() {
26
+ const root = '.ilife-page-ui ';
27
+ return [
28
+ /* 三层家族树:层与层之间一条竖向连接件(线 + 箭头);三层各带一条同色左缘。 */
29
+ root + '.ilife-relation-tree {',
30
+ ' margin: 16px 0 0;',
31
+ '}',
32
+ root + '.ilife-relation-tier {',
33
+ ' box-sizing: border-box;',
34
+ ' padding: 12px 14px;',
35
+ ' border: 1px solid var(--line);',
36
+ ' border-left-width: 4px;',
37
+ ' border-radius: 14px;',
38
+ ' background: var(--card);',
39
+ '}',
40
+ root + '.ilife-relation-tier-up {',
41
+ ' border-left-color: ' + TONE.up + ';',
42
+ ' background: ' + tint(TONE.up, 8) + ';',
43
+ '}',
44
+ root + '.ilife-relation-tier-here {',
45
+ ' border-color: var(--blue);',
46
+ ' border-left-color: ' + TONE.here + ';',
47
+ ' background: var(--soft);',
48
+ '}',
49
+ root + '.ilife-relation-tier-down {',
50
+ ' border-left-color: ' + TONE.down + ';',
51
+ ' background: ' + tint(TONE.down, 5) + ';',
52
+ '}',
53
+ root + '.ilife-relation-tier-head {',
54
+ ' display: flex;',
55
+ ' align-items: center;',
56
+ ' gap: 8px;',
57
+ ' margin: 0;',
58
+ '}',
59
+ root + '.ilife-relation-tier-name {',
60
+ ' color: var(--fg);',
61
+ ' font-size: 13px;',
62
+ ' font-weight: 600;',
63
+ '}',
64
+ root + '.ilife-relation-tier-kind {',
65
+ ' padding: 1px 8px;',
66
+ ' border-radius: 999px;',
67
+ ' background: var(--soft);',
68
+ ' color: var(--blue2);',
69
+ ' font-size: 12px;',
70
+ ' line-height: 1.6;',
71
+ '}',
72
+ root + '.ilife-relation-tier-count {',
73
+ ' margin-left: auto;',
74
+ ' color: var(--fg3);',
75
+ ' font-size: 12px;',
76
+ '}',
77
+ root + '.ilife-relation-tier-body {',
78
+ ' margin: 8px 0 0;',
79
+ '}',
80
+ /* 空层收成一条瘦条:虚线卡 + 一行占位人话,不再占一整块实心卡片(空的那层白吃掉首屏一截)。 */
81
+ root + '.ilife-relation-tier-empty {',
82
+ ' padding: 10px 14px;',
83
+ ' border-style: dashed;',
84
+ ' background: var(--card);',
85
+ '}',
86
+ root + '.ilife-relation-tier-empty .ilife-relation-tier-body {',
87
+ ' margin: 6px 0 0;',
88
+ '}',
89
+ root + '.ilife-relation-tier-empty .ilife-relation-ghost {',
90
+ ' padding: 0;',
91
+ ' border: 0;',
92
+ ' background: transparent;',
93
+ '}',
94
+ root + '.ilife-relation-here {',
95
+ ' display: inline-flex;',
96
+ ' max-width: 100%;',
97
+ ' box-sizing: border-box;',
98
+ ' padding: 5px 14px;',
99
+ ' border: 1px solid var(--blue);',
100
+ ' border-radius: 999px;',
101
+ ' background: var(--card);',
102
+ ' color: var(--fg);',
103
+ ' font-size: 16px;',
104
+ ' font-weight: 600;',
105
+ ' overflow-wrap: anywhere;',
106
+ '}',
107
+ root + '.ilife-relation-joint {',
108
+ ' position: relative;',
109
+ ' width: 2px;',
110
+ ' height: 20px;',
111
+ ' margin: 0 auto;',
112
+ ' background: var(--line);',
113
+ '}',
114
+ root + '.ilife-relation-joint::after {',
115
+ ' content: "";',
116
+ ' position: absolute;',
117
+ ' left: 50%;',
118
+ ' bottom: 0;',
119
+ ' width: 0;',
120
+ ' height: 0;',
121
+ ' border-left: 5px solid transparent;',
122
+ ' border-right: 5px solid transparent;',
123
+ ' border-top: 7px solid var(--blue);',
124
+ ' transform: translateX(-50%);',
125
+ '}',
126
+ /* 一层里的条目行:左侧一条支线 + 每行一枚本层色的圆点(图形标记,不上字),代次与菜名分槽。 */
127
+ root + '.ilife-relation-branch {',
128
+ ' margin: 0;',
129
+ ' padding: 0 0 0 16px;',
130
+ ' border-left: 2px solid var(--line);',
131
+ ' list-style: none;',
132
+ '}',
133
+ root + '.ilife-relation-tier-down .ilife-relation-branch {',
134
+ ' border-left-color: ' + TONE.down + ';',
135
+ '}',
136
+ root + '.ilife-relation-tier-up .ilife-relation-branch {',
137
+ ' border-left-color: ' + TONE.up + ';',
138
+ '}',
139
+ root + '.ilife-relation-branch-row {',
140
+ ' position: relative;',
141
+ ' box-sizing: border-box;',
142
+ ' padding: 10px 0;',
143
+ '}',
144
+ root + '.ilife-relation-branch-row::before {',
145
+ ' content: "";',
146
+ ' position: absolute;',
147
+ ' left: -21px;',
148
+ ' top: 14px;',
149
+ ' box-sizing: border-box;',
150
+ ' width: 10px;',
151
+ ' height: 10px;',
152
+ ' border: 2px solid var(--card);',
153
+ ' border-radius: 999px;',
154
+ ' background: ' + TONE.up + ';',
155
+ '}',
156
+ root + '.ilife-relation-tier-down .ilife-relation-branch-row::before {',
157
+ ' background: ' + TONE.down + ';',
158
+ '}',
159
+ root + '.ilife-relation-tier-up .ilife-relation-branch-row::before {',
160
+ ' background: ' + TONE.up + ';',
161
+ '}',
162
+ root + '.ilife-relation-branch-head {',
163
+ ' display: flex;',
164
+ ' flex-wrap: wrap;',
165
+ ' align-items: center;',
166
+ ' gap: 6px 8px;',
167
+ '}',
168
+ root + '.ilife-relation-level {',
169
+ ' flex: 0 0 auto;',
170
+ ' padding: 1px 8px;',
171
+ ' border-radius: 999px;',
172
+ ' background: var(--soft);',
173
+ ' color: var(--blue2);',
174
+ ' font-size: 12px;',
175
+ ' font-weight: 600;',
176
+ '}',
177
+ root + '.ilife-relation-branch-name {',
178
+ ' min-width: 0;',
179
+ ' color: var(--fg);',
180
+ ' font-size: 15px;',
181
+ ' font-weight: 600;',
182
+ ' overflow-wrap: anywhere;',
183
+ '}',
184
+ root + '.ilife-relation-branch-note {',
185
+ ' display: flex;',
186
+ ' flex-wrap: wrap;',
187
+ ' align-items: baseline;',
188
+ ' gap: 2px 8px;',
189
+ ' margin-top: 3px;',
190
+ ' overflow-wrap: anywhere;',
191
+ '}',
192
+ /* 改动说明前的图形标记(一支笔):给这行小字当图例,不用再写「改动」两个字。 */
193
+ root + '.ilife-relation-branch-note-mark {',
194
+ ' flex: 0 0 auto;',
195
+ ' display: inline-flex;',
196
+ ' align-items: center;',
197
+ ' color: var(--fg3);',
198
+ '}',
199
+ root + '.ilife-relation-branch-note-text {',
200
+ ' min-width: 0;',
201
+ ' color: var(--fg2);',
202
+ ' font-size: 12px;',
203
+ ' line-height: 1.6;',
204
+ '}',
205
+ /* 宽档(≥1001px):880 版心里三层各自竖成一条「层标 + 层体」两栏,行内左右分槽把空档填掉——
206
+ 层标占左栏(图标、层名、关系类型、条数自上而下),层体占右栏,条目行左边的菜名与右边的改动说明
207
+ 各靠一边,不再是一行字悬在一张长条卡里。 */
208
+ '@media (min-width: 1001px) {',
209
+ root + '.ilife-relation-tier {',
210
+ ' display: grid;',
211
+ ' grid-template-columns: 168px minmax(0, 1fr);',
212
+ ' column-gap: 20px;',
213
+ ' align-items: start;',
214
+ ' }',
215
+ root + '.ilife-relation-tier-head {',
216
+ ' flex-direction: column;',
217
+ ' align-items: flex-start;',
218
+ ' gap: 6px;',
219
+ ' }',
220
+ root + '.ilife-relation-tier-count {',
221
+ ' margin-left: 0;',
222
+ ' }',
223
+ root + '.ilife-relation-tier-body {',
224
+ ' margin: 0;',
225
+ ' }',
226
+ root + '.ilife-relation-branch-row {',
227
+ ' display: flex;',
228
+ ' flex-wrap: wrap;',
229
+ ' align-items: baseline;',
230
+ ' column-gap: 16px;',
231
+ ' row-gap: 4px;',
232
+ ' }',
233
+ root + '.ilife-relation-branch-note {',
234
+ ' margin-top: 0;',
235
+ ' }',
236
+ root + '.ilife-relation-ghost {',
237
+ ' align-items: center;',
238
+ ' }',
239
+ root + '.ilife-relation-ornament {',
240
+ ' display: inline-flex;',
241
+ ' }',
242
+ '}',
243
+ /* 页头右侧那枝装饰树:窄档不出(首屏要留给三层树本体),宽档显出来填掉结论条右侧的空档。 */
244
+ root + '.ilife-relation-ornament {',
245
+ ' display: none;',
246
+ ' flex: 0 0 auto;',
247
+ ' align-items: center;',
248
+ '}',
249
+ root + '.ilife-relation-ornament svg {',
250
+ ' display: block;',
251
+ '}',
252
+ /* 空层的占位件:虚线框,槽位与真条目同规格(换数据不换格子)。 */
253
+ root + '.ilife-relation-ghost {',
254
+ ' display: flex;',
255
+ ' align-items: flex-start;',
256
+ ' gap: 10px;',
257
+ ' box-sizing: border-box;',
258
+ ' padding: 10px 12px;',
259
+ ' border: 1px dashed var(--line);',
260
+ ' border-radius: 14px;',
261
+ ' background: var(--soft);',
262
+ '}',
263
+ root + '.ilife-relation-ghost-mark {',
264
+ ' flex: 0 0 auto;',
265
+ ' width: 12px;',
266
+ ' height: 12px;',
267
+ ' margin-top: 3px;',
268
+ ' border: 2px dashed var(--fg3);',
269
+ ' border-radius: 999px;',
270
+ '}',
271
+ root + '.ilife-relation-ghost-body {',
272
+ ' min-width: 0;',
273
+ '}',
274
+ root + '.ilife-relation-ghost-text {',
275
+ ' margin: 0;',
276
+ ' color: var(--fg2);',
277
+ ' font-size: 14px;',
278
+ ' font-weight: 600;',
279
+ '}',
280
+ root + '.ilife-relation-ghost-hint {',
281
+ ' margin: 2px 0 0;',
282
+ ' color: var(--fg3);',
283
+ ' font-size: 12px;',
284
+ ' line-height: 1.5;',
285
+ ' overflow-wrap: anywhere;',
286
+ '}',
287
+ ].join(LF);
288
+ }
289
+ //# sourceMappingURL=treeShapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeShapes.js","sourceRoot":"","sources":["../../src/relation/treeShapes.ts"],"names":[],"mappings":"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"}