skill-chef 0.3.2 → 0.3.12

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 (240) 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/keys.d.ts +1 -1
  21. package/dist/cli/keys.d.ts.map +1 -1
  22. package/dist/cli/keys.js +16 -4
  23. package/dist/cli/keys.js.map +1 -1
  24. package/dist/cook/commands.js +1 -1
  25. package/dist/cook/index.d.ts +2 -1
  26. package/dist/cook/index.d.ts.map +1 -1
  27. package/dist/cook/index.js +1 -1
  28. package/dist/cook/index.js.map +1 -1
  29. package/dist/cook/page-art.d.ts +18 -0
  30. package/dist/cook/page-art.d.ts.map +1 -0
  31. package/dist/cook/page-art.js +30 -0
  32. package/dist/cook/page-art.js.map +1 -0
  33. package/dist/cook/page-css.d.ts +9 -0
  34. package/dist/cook/page-css.d.ts.map +1 -0
  35. package/dist/cook/page-css.js +206 -0
  36. package/dist/cook/page-css.js.map +1 -0
  37. package/dist/cook/page-text.d.ts +28 -0
  38. package/dist/cook/page-text.d.ts.map +1 -0
  39. package/dist/cook/page-text.js +65 -0
  40. package/dist/cook/page-text.js.map +1 -0
  41. package/dist/cook/routes.js +4 -4
  42. package/dist/cook/run.d.ts +56 -1
  43. package/dist/cook/run.d.ts.map +1 -1
  44. package/dist/cook/run.js +252 -22
  45. package/dist/cook/run.js.map +1 -1
  46. package/dist/data/commands.d.ts +6 -7
  47. package/dist/data/commands.d.ts.map +1 -1
  48. package/dist/data/commands.js +15 -8
  49. package/dist/data/commands.js.map +1 -1
  50. package/dist/data/index.d.ts +2 -0
  51. package/dist/data/index.d.ts.map +1 -1
  52. package/dist/data/index.js +2 -0
  53. package/dist/data/index.js.map +1 -1
  54. package/dist/data/pages.d.ts +50 -0
  55. package/dist/data/pages.d.ts.map +1 -0
  56. package/dist/data/pages.js +226 -0
  57. package/dist/data/pages.js.map +1 -0
  58. package/dist/data/routes.d.ts +4 -5
  59. package/dist/data/routes.d.ts.map +1 -1
  60. package/dist/data/routes.js +8 -10
  61. package/dist/data/routes.js.map +1 -1
  62. package/dist/data/run-batch.d.ts +21 -0
  63. package/dist/data/run-batch.d.ts.map +1 -0
  64. package/dist/data/run-batch.js +123 -0
  65. package/dist/data/run-batch.js.map +1 -0
  66. package/dist/data/run-query.d.ts +5 -6
  67. package/dist/data/run-query.d.ts.map +1 -1
  68. package/dist/data/run-query.js +113 -28
  69. package/dist/data/run-query.js.map +1 -1
  70. package/dist/help/lookup.d.ts.map +1 -1
  71. package/dist/help/lookup.js +20 -4
  72. package/dist/help/lookup.js.map +1 -1
  73. package/dist/help/sceneData.d.ts +8 -7
  74. package/dist/help/sceneData.d.ts.map +1 -1
  75. package/dist/help/sceneData.js +22 -21
  76. package/dist/help/sceneData.js.map +1 -1
  77. package/dist/history/commands.js +1 -1
  78. package/dist/history/page-css.d.ts +12 -0
  79. package/dist/history/page-css.d.ts.map +1 -0
  80. package/dist/history/page-css.js +208 -0
  81. package/dist/history/page-css.js.map +1 -0
  82. package/dist/history/pages.d.ts +77 -0
  83. package/dist/history/pages.d.ts.map +1 -0
  84. package/dist/history/pages.js +282 -0
  85. package/dist/history/pages.js.map +1 -0
  86. package/dist/history/routes.d.ts +4 -6
  87. package/dist/history/routes.d.ts.map +1 -1
  88. package/dist/history/routes.js +22 -16
  89. package/dist/history/routes.js.map +1 -1
  90. package/dist/history/run-query.d.ts +48 -0
  91. package/dist/history/run-query.d.ts.map +1 -1
  92. package/dist/history/run-query.js +96 -10
  93. package/dist/history/run-query.js.map +1 -1
  94. package/dist/history/run-record.d.ts +12 -2
  95. package/dist/history/run-record.d.ts.map +1 -1
  96. package/dist/history/run-record.js +28 -14
  97. package/dist/history/run-record.js.map +1 -1
  98. package/dist/history/validate.d.ts +22 -0
  99. package/dist/history/validate.d.ts.map +1 -0
  100. package/dist/history/validate.js +69 -0
  101. package/dist/history/validate.js.map +1 -0
  102. package/dist/policy/wakewords.d.ts +1 -1
  103. package/dist/policy/wakewords.d.ts.map +1 -1
  104. package/dist/policy/wakewords.js +23 -2
  105. package/dist/policy/wakewords.js.map +1 -1
  106. package/dist/relation/commands.d.ts +6 -5
  107. package/dist/relation/commands.d.ts.map +1 -1
  108. package/dist/relation/commands.js +23 -6
  109. package/dist/relation/commands.js.map +1 -1
  110. package/dist/relation/index.d.ts +3 -0
  111. package/dist/relation/index.d.ts.map +1 -1
  112. package/dist/relation/index.js +3 -0
  113. package/dist/relation/index.js.map +1 -1
  114. package/dist/relation/pages.d.ts +37 -0
  115. package/dist/relation/pages.d.ts.map +1 -0
  116. package/dist/relation/pages.js +224 -0
  117. package/dist/relation/pages.js.map +1 -0
  118. package/dist/relation/routes.d.ts +6 -5
  119. package/dist/relation/routes.d.ts.map +1 -1
  120. package/dist/relation/routes.js +17 -16
  121. package/dist/relation/routes.js.map +1 -1
  122. package/dist/relation/run-query.d.ts +10 -0
  123. package/dist/relation/run-query.d.ts.map +1 -0
  124. package/dist/relation/run-query.js +104 -0
  125. package/dist/relation/run-query.js.map +1 -0
  126. package/dist/relation/run-write.d.ts +13 -0
  127. package/dist/relation/run-write.d.ts.map +1 -0
  128. package/dist/relation/run-write.js +114 -0
  129. package/dist/relation/run-write.js.map +1 -0
  130. package/dist/relation/shapes.d.ts +8 -0
  131. package/dist/relation/shapes.d.ts.map +1 -0
  132. package/dist/relation/shapes.js +153 -0
  133. package/dist/relation/shapes.js.map +1 -0
  134. package/dist/relation/treeShapes.d.ts +23 -0
  135. package/dist/relation/treeShapes.d.ts.map +1 -0
  136. package/dist/relation/treeShapes.js +289 -0
  137. package/dist/relation/treeShapes.js.map +1 -0
  138. package/dist/render/copyArea.d.ts +67 -0
  139. package/dist/render/copyArea.d.ts.map +1 -0
  140. package/dist/render/copyArea.js +146 -0
  141. package/dist/render/copyArea.js.map +1 -0
  142. package/dist/render/envelope.d.ts.map +1 -1
  143. package/dist/render/envelope.js +4 -0
  144. package/dist/render/envelope.js.map +1 -1
  145. package/dist/render/index.d.ts +7 -0
  146. package/dist/render/index.d.ts.map +1 -1
  147. package/dist/render/index.js +7 -0
  148. package/dist/render/index.js.map +1 -1
  149. package/dist/render/sceneBand.d.ts +36 -0
  150. package/dist/render/sceneBand.d.ts.map +1 -0
  151. package/dist/render/sceneBand.js +166 -0
  152. package/dist/render/sceneBand.js.map +1 -0
  153. package/dist/render/sceneRhythm.d.ts +6 -0
  154. package/dist/render/sceneRhythm.d.ts.map +1 -0
  155. package/dist/render/sceneRhythm.js +149 -0
  156. package/dist/render/sceneRhythm.js.map +1 -0
  157. package/dist/render/sceneShell.d.ts +17 -0
  158. package/dist/render/sceneShell.d.ts.map +1 -0
  159. package/dist/render/sceneShell.js +46 -0
  160. package/dist/render/sceneShell.js.map +1 -0
  161. package/dist/render/skin.d.ts +13 -0
  162. package/dist/render/skin.d.ts.map +1 -0
  163. package/dist/render/skin.js +282 -0
  164. package/dist/render/skin.js.map +1 -0
  165. package/dist/search/routes.d.ts +12 -4
  166. package/dist/search/routes.d.ts.map +1 -1
  167. package/dist/search/routes.js +39 -7
  168. package/dist/search/routes.js.map +1 -1
  169. package/dist/search/run.d.ts +10 -2
  170. package/dist/search/run.d.ts.map +1 -1
  171. package/dist/search/run.js +61 -9
  172. package/dist/search/run.js.map +1 -1
  173. package/dist/setup/commands.d.ts +5 -5
  174. package/dist/setup/commands.d.ts.map +1 -1
  175. package/dist/setup/commands.js +14 -6
  176. package/dist/setup/commands.js.map +1 -1
  177. package/dist/setup/index.d.ts +3 -5
  178. package/dist/setup/index.d.ts.map +1 -1
  179. package/dist/setup/index.js +3 -5
  180. package/dist/setup/index.js.map +1 -1
  181. package/dist/setup/pages.d.ts +19 -0
  182. package/dist/setup/pages.d.ts.map +1 -0
  183. package/dist/setup/pages.js +163 -0
  184. package/dist/setup/pages.js.map +1 -0
  185. package/dist/setup/routes.d.ts +4 -5
  186. package/dist/setup/routes.d.ts.map +1 -1
  187. package/dist/setup/routes.js +7 -8
  188. package/dist/setup/routes.js.map +1 -1
  189. package/dist/setup/run-init.d.ts +11 -0
  190. package/dist/setup/run-init.d.ts.map +1 -0
  191. package/dist/setup/run-init.js +19 -0
  192. package/dist/setup/run-init.js.map +1 -0
  193. package/dist/shared/command-spec.d.ts +5 -3
  194. package/dist/shared/command-spec.d.ts.map +1 -1
  195. package/dist/shopping/commands.js +1 -1
  196. package/dist/shopping/commands.js.map +1 -1
  197. package/dist/shopping/index.d.ts +1 -0
  198. package/dist/shopping/index.d.ts.map +1 -1
  199. package/dist/shopping/index.js +1 -0
  200. package/dist/shopping/index.js.map +1 -1
  201. package/dist/shopping/pages.d.ts +22 -0
  202. package/dist/shopping/pages.d.ts.map +1 -0
  203. package/dist/shopping/pages.js +170 -0
  204. package/dist/shopping/pages.js.map +1 -0
  205. package/dist/shopping/routes.js +4 -4
  206. package/dist/shopping/routes.js.map +1 -1
  207. package/dist/shopping/run.d.ts +9 -5
  208. package/dist/shopping/run.d.ts.map +1 -1
  209. package/dist/shopping/run.js +58 -10
  210. package/dist/shopping/run.js.map +1 -1
  211. package/dist/triggers/chef-scenes.d.ts +3 -2
  212. package/dist/triggers/chef-scenes.d.ts.map +1 -1
  213. package/dist/triggers/chef-scenes.js +16 -15
  214. package/dist/triggers/chef-scenes.js.map +1 -1
  215. package/dist/update/routes.d.ts +6 -4
  216. package/dist/update/routes.d.ts.map +1 -1
  217. package/dist/update/routes.js +20 -6
  218. package/dist/update/routes.js.map +1 -1
  219. package/dist/update/run-write.d.ts.map +1 -1
  220. package/dist/update/run-write.js +211 -1
  221. package/dist/update/run-write.js.map +1 -1
  222. package/dist/view/commands.js +1 -1
  223. package/dist/view/page.d.ts +25 -0
  224. package/dist/view/page.d.ts.map +1 -0
  225. package/dist/view/page.js +306 -0
  226. package/dist/view/page.js.map +1 -0
  227. package/dist/view/pageCss.d.ts +8 -0
  228. package/dist/view/pageCss.d.ts.map +1 -0
  229. package/dist/view/pageCss.js +327 -0
  230. package/dist/view/pageCss.js.map +1 -0
  231. package/dist/view/pageSection.d.ts +21 -0
  232. package/dist/view/pageSection.d.ts.map +1 -0
  233. package/dist/view/pageSection.js +59 -0
  234. package/dist/view/pageSection.js.map +1 -0
  235. package/dist/view/routes.js +7 -7
  236. package/dist/view/run.d.ts +5 -1
  237. package/dist/view/run.d.ts.map +1 -1
  238. package/dist/view/run.js +66 -7
  239. package/dist/view/run.js.map +1 -1
  240. package/package.json +3 -3
@@ -0,0 +1,67 @@
1
+ import type { CopyLogFields } from 'base-paint';
2
+ /** 数据位的纯域数据(四种通用形;信封由本件套,调用方不拼 `version`/`skill`)。 */
3
+ type ChefCopyData = {
4
+ readonly key: string;
5
+ readonly shape: 'detail';
6
+ readonly item: Record<string, unknown>;
7
+ } | {
8
+ readonly key: string;
9
+ readonly shape: 'list';
10
+ readonly items: unknown[];
11
+ readonly total?: number;
12
+ } | {
13
+ readonly key: string;
14
+ readonly shape: 'receipt';
15
+ readonly ok: boolean;
16
+ readonly message: string;
17
+ } | {
18
+ readonly key: string;
19
+ readonly shape: 'stat';
20
+ readonly metrics: Record<string, number>;
21
+ };
22
+ /** 复制日志的入参:本次执行的过程证据(第 1 段「场景标识」由数据信封派生,不在这里填)。
23
+ * 给不出的项如实缺省(`buildLogText` 按 `(未知)` 口径渲染),不编数冒充。 */
24
+ interface ChefCopyLog {
25
+ /** 渲染本页(或写库)的命令原文,可照抄重跑。 */
26
+ readonly command?: string;
27
+ /** 本次数据来源(第 3 段后半)。 */
28
+ readonly source?: string;
29
+ /** 写库回执的 M5 整行(第 4 段后半;库里写了哪些字段、影响几行)。 */
30
+ readonly m5Line?: string;
31
+ /** 时间戳(第 5 段;给得出才给,给不出就缺省)。 */
32
+ readonly actionAt?: string;
33
+ /** 文档版本(第 5 段后半);不给则不写这半句。 */
34
+ readonly version?: string;
35
+ }
36
+ /** `chefCopyArea` 的可填位:给了什么出什么,数据位恒出三格式菜单。 */
37
+ interface ChefCopyAreaInput {
38
+ /** 复制数据按钮的 `actionId`(须页内唯一;不给=公共层缺省)。 */
39
+ readonly dataActionId?: string;
40
+ /** 复制日志按钮的 `actionId`(须页内唯一;不给=公共层缺省)。 */
41
+ readonly logActionId?: string;
42
+ /** 给了就出「复制数据」(三格式菜单),内部走 `buildDataText`。 */
43
+ readonly data?: ChefCopyData;
44
+ /** 复制日志的过程证据(第 2–6 段入参)。**不给也出「复制日志」**——退到 `{ command: data.key }`
45
+ * (见 `chefCopyArea` 头注);给了就按给的填,未给的项照 `buildLogText` 的 `(未知)` 口径。 */
46
+ readonly log?: ChefCopyLog;
47
+ /** 数据与日志两样全没给时的那句话(缺省也有一句,见 `COPY_EMPTY_TEXT`)。 */
48
+ readonly emptyText?: string;
49
+ }
50
+ /** 复制区(**2026-09-22 用户裁定「乙」:卡片与标题全去**)。
51
+ *
52
+ * **不再出区块壳**:没有 `<section class="ilife-block-copy-block">`、没有标题,只剩一行 ghost 动作排
53
+ * —— `复制数据 ▾`(三格式菜单)+ `复制日志`,形状与页面其它动作排同列同宽。
54
+ * 改动只在**本包**(走公共层 `renderActionBar` + `COPY_ACTION_IDS`,不抄常量、不重写编排);
55
+ * `base-render` 的 `copyBlock` 仍留在它的「12 区块闭集」里,其它五个技能的复制区一个字节没动
56
+ * —— 要不要一起推平,等维护者裁(动公共层须先立公共层 issue + 补 CHANGELOG)。
57
+ *
58
+ * **日志位恒出**(同日裁定):调用方给 `log` 就用它,没给则退到 `{ command: data.key }` ——
59
+ * 命令键本来就随 `data` 一起进来,退出的六段仍是**真读数**(调用链=这条命令、数据结构=库名),
60
+ * 不是占位。「给不出就整颗不出」是旧口径,已废:它让 45/53 张页没有复制日志按钮。
61
+ *
62
+ * 两样全不给 = 一句空态、不出按钮(空态不是按钮排,仍走 `renderEmptyBlock`)。 */
63
+ export declare function chefCopyArea(input: ChefCopyAreaInput): string;
64
+ /** 复制日志的第 2–6 段入参:本页由哪条命令渲染、数据从哪来、写了多少行、什么时候。 */
65
+ export declare function chefCopyLog(input: ChefCopyLog): CopyLogFields;
66
+ export {};
67
+ //# sourceMappingURL=copyArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyArea.d.ts","sourceRoot":"","sources":["../../src/render/copyArea.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,aAAa,EAAuC,MAAM,YAAY,CAAC;AAsBrF,sDAAsD;AACtD,KAAK,YAAY,GACb;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC1F;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAE/F;qDACqD;AACrD,UAAU,WAAW;IACnB,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,8CAA8C;AAC9C,UAAU,iBAAiB;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B;0EACsE;IACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAgDD;;;;;;;;;;;;wDAYwD;AACxD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAwB7D;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAY7D"}
@@ -0,0 +1,146 @@
1
+ /** #873 · 复制区共用件:复制数据恒三格式菜单 + 复制日志六段。
2
+ *
3
+ * 本件只装私家大厨要的两样 —— `chefCopyArea`(数据位恒出「复制数据 + 纯文本/JSON/CSV
4
+ * 三选一菜单」,调用方不声明开关)与 `chefCopyLog`(复制日志第 2–6 段入参)。
5
+ * `promptCopyArea`/`notice` 本包没有调用方,不装。
6
+ *
7
+ * **2026-09-22 用户两次裁定,形状与旧版不同(读这段再改)**:
8
+ * ① **日志位恒出**:每张页都要有「复制日志」那颗按钮(改前 53 件产物里只有 8 件有);
9
+ * ② **卡片与标题全去**(裁定「乙」):不再出 `<section class="ilife-block-copy-block">`、
10
+ * 不再出标题,只剩一行 ghost 动作排。**故本件不再走 `renderCopyBlock`**,改直连
11
+ * `base-paint` 的 `renderActionBar` + `COPY_ACTION_IDS`(`renderCopyBlock` 内部调的
12
+ * 就是同一个 `renderActionBar`,本件不重写编排、也不抄常量)。
13
+ *
14
+ * 三件东西只接线、不重造(**base-render 侧改动为零**):
15
+ * ① 复制按钮与动作排 → `base-paint` 的 `renderActionBar({ copyData, copyLog })`
16
+ * (`formats` 与 `text` 互斥,数据位恒走前者);
17
+ * ② 复制文本 → `base-paint` 的 `buildDataText`(`detail`/`list`/`receipt`/`stat` 四种通用形,
18
+ * 调用方给纯域数据、本件套信封)/`buildLogText`(6 段日志);
19
+ * ③ 复制成功与失败的提示 → 页面运行时的菜单委派(`buildSharedHelpersJs`,私家大厨页经
20
+ * `renderSceneShell` → `renderDocShell` 已注入,本件不产第二条提示通道)。
21
+ *
22
+ * ⚠️ **只改了本包**:`base-render` 的 `copyBlock` 仍留在它的「12 区块闭集」里,另外五个技能
23
+ * (卡路里/记账/居家管家/备忘录/作息)的复制区一个字节没动。要不要一起推平,等维护者裁
24
+ * —— 动公共层须先立公共层 issue(总纲 09)+ 补 CHANGELOG。
25
+ *
26
+ * 谁在用(共用位须写得出哪两个在用):录入/做菜/数据管理/历史/派生/开始使用/采购/查看
27
+ * 8 个域装配件 + 搜索筛选/修改 2 个产物驱动器(共 15 处调用,清单见 `t873-席复制按钮.md`)。
28
+ *
29
+ * 对外 2 个名字:`chefCopyArea`/`chefCopyLog`。入参类型不导出 —— 调用方传字面量即可
30
+ * (同卡路里 `copyArea.ts` 的口径)。
31
+ */
32
+ import { COPY_ACTION_IDS, renderEmptyBlock } from 'base-paint/blocks';
33
+ import { buildDataText, buildLogText, renderActionBar } from 'base-paint';
34
+ import { createEnvelope } from 'base-link-core';
35
+ import { CHEF_CONFIG_DEFAULTS } from '../config.js';
36
+ /** 技能名(包名即技能名;与 `render/envelope.ts` 的 `buildChefEnvelope` 同字面)。 */
37
+ const CHEF_SKILL = 'chef';
38
+ /** 日志第 2 段(AI 思考链):本包页面一律由本地命令渲染(含产物驱动器),不落 `(未知)` 占位。 */
39
+ const LOG_THINKING = '本页由本地命令渲染,无 AI 链';
40
+ /** 日志第 6 段(异常):正常产出即「无」。 */
41
+ const LOG_EXCEPTION = '无';
42
+ /** 复制区空态缺省句(数据与日志两样全没给时出这一句、不出按钮)。 */
43
+ const COPY_EMPTY_TEXT = '本页没有可复制的数据';
44
+ /** 三格式菜单里三项的用途提示:本技能一律留空(顺序=`COPY_FORMATS`)。
45
+ *
46
+ * 传空串而非撤掉 `hints` 位:公共层的三格式菜单对空串不渲染那行小字
47
+ * (`controls.ts:1376`),形状与「不给 hints」一致,但不依赖公共层那一支的缺省值
48
+ * (与卡路里 `MENU_HINTS` 同口径)。 */
49
+ const MENU_HINTS = ['', '', ''];
50
+ /** 库文件名(日志第 3 段前半的固定位):唯一定义地是 `config.ts` 的
51
+ * `CHEF_CONFIG_DEFAULTS.db.name`,本件只引用、不重写。 */
52
+ const DB_NAME = CHEF_CONFIG_DEFAULTS.db.name;
53
+ /** 纯域数据 → 数据信封(`createEnvelope` 逐形状全字段校验:缺字段即抛,不返空冒充)。 */
54
+ function dataEnvelopeOf(input) {
55
+ switch (input.shape) {
56
+ case 'detail':
57
+ return createEnvelope({ skill: CHEF_SKILL, shape: 'detail', key: input.key, data: { item: input.item } });
58
+ case 'list':
59
+ return createEnvelope({
60
+ skill: CHEF_SKILL, shape: 'list', key: input.key,
61
+ data: input.total === undefined ? { items: input.items } : { items: input.items, total: input.total },
62
+ });
63
+ case 'receipt':
64
+ return createEnvelope({ skill: CHEF_SKILL, shape: 'receipt', key: input.key, data: { ok: input.ok, message: input.message } });
65
+ case 'stat':
66
+ return createEnvelope({ skill: CHEF_SKILL, shape: 'stat', key: input.key, data: { metrics: input.metrics } });
67
+ }
68
+ }
69
+ /** 场景键归一(口径出处:卡路里 `src/shared/sceneEnvelope.ts` #550)。
70
+ *
71
+ * 公共层场景标识的算式是 `skill + '.' + key`,而本包信封的 `key` 是注册表整名
72
+ * (如 `chef.recipe.write`)⇒ 不归一会印成 `chef.chef.recipe.write`(一个不存在的命令键)。
73
+ * `key` 不以 `{skill}.` 开头时返回入参那一只对象本身(引用相等,逐字节不变)。 */
74
+ function sceneEnvelopeOf(envelope) {
75
+ const skill = typeof envelope.skill === 'string' ? envelope.skill : '';
76
+ const key = typeof envelope.key === 'string' ? envelope.key : '';
77
+ if (skill === '' || key === '')
78
+ return envelope;
79
+ const prefix = skill + '.';
80
+ if (key.indexOf(prefix) !== 0)
81
+ return envelope;
82
+ return { ...envelope, key: key.slice(prefix.length) };
83
+ }
84
+ /** 三格式形态的入参:`data` 位的那份数据 → 三种格式各算一份 + 菜单提示(三空串)。 */
85
+ function formatsOf(data) {
86
+ return {
87
+ text: buildDataText({ ...data, format: 'text' }),
88
+ json: buildDataText({ ...data, format: 'json' }),
89
+ csv: buildDataText({ ...data, format: 'csv' }),
90
+ hints: MENU_HINTS,
91
+ };
92
+ }
93
+ /** 复制区(**2026-09-22 用户裁定「乙」:卡片与标题全去**)。
94
+ *
95
+ * **不再出区块壳**:没有 `<section class="ilife-block-copy-block">`、没有标题,只剩一行 ghost 动作排
96
+ * —— `复制数据 ▾`(三格式菜单)+ `复制日志`,形状与页面其它动作排同列同宽。
97
+ * 改动只在**本包**(走公共层 `renderActionBar` + `COPY_ACTION_IDS`,不抄常量、不重写编排);
98
+ * `base-render` 的 `copyBlock` 仍留在它的「12 区块闭集」里,其它五个技能的复制区一个字节没动
99
+ * —— 要不要一起推平,等维护者裁(动公共层须先立公共层 issue + 补 CHANGELOG)。
100
+ *
101
+ * **日志位恒出**(同日裁定):调用方给 `log` 就用它,没给则退到 `{ command: data.key }` ——
102
+ * 命令键本来就随 `data` 一起进来,退出的六段仍是**真读数**(调用链=这条命令、数据结构=库名),
103
+ * 不是占位。「给不出就整颗不出」是旧口径,已废:它让 45/53 张页没有复制日志按钮。
104
+ *
105
+ * 两样全不给 = 一句空态、不出按钮(空态不是按钮排,仍走 `renderEmptyBlock`)。 */
106
+ export function chefCopyArea(input) {
107
+ const data = input.data;
108
+ const log = input.log;
109
+ if (data !== undefined || log !== undefined) {
110
+ if (data === undefined)
111
+ throw new Error('chefCopyArea: log 位须与 data 位同给(日志场景由数据信封派生)');
112
+ const envelope = dataEnvelopeOf(data);
113
+ const logText = buildLogText({
114
+ envelope: sceneEnvelopeOf(envelope),
115
+ copyLog: chefCopyLog(log ?? { command: data.key }),
116
+ });
117
+ return renderActionBar({
118
+ copyData: {
119
+ actionId: input.dataActionId ?? COPY_ACTION_IDS.actionBar.copyData,
120
+ formats: formatsOf({ envelope }),
121
+ },
122
+ copyLog: {
123
+ actionId: input.logActionId ?? COPY_ACTION_IDS.actionBar.copyLog,
124
+ text: logText,
125
+ },
126
+ });
127
+ }
128
+ return renderEmptyBlock({
129
+ text: input.emptyText ?? COPY_EMPTY_TEXT,
130
+ });
131
+ }
132
+ /** 复制日志的第 2–6 段入参:本页由哪条命令渲染、数据从哪来、写了多少行、什么时候。 */
133
+ export function chefCopyLog(input) {
134
+ const command = input.command ?? '';
135
+ const m5Line = input.m5Line ?? '';
136
+ const actionAt = input.actionAt ?? '';
137
+ const version = input.version ?? '';
138
+ return {
139
+ thinking: LOG_THINKING,
140
+ dataStructure: DB_NAME + (input.source === undefined || input.source === '' ? '' : ' | ' + input.source),
141
+ callChain: m5Line === '' ? command : (command === '' ? m5Line : command + ' | ' + m5Line),
142
+ timestamp: version === '' ? actionAt : (actionAt === '' ? '版本 ' + version : actionAt + ' · 版本 ' + version),
143
+ exception: LOG_EXCEPTION,
144
+ };
145
+ }
146
+ //# sourceMappingURL=copyArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyArea.js","sourceRoot":"","sources":["../../src/render/copyArea.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/render/envelope.ts"],"names":[],"mappings":"AACA,OAAO,EAAmD,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CASzD,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAIvD;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAatE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAG1D"}
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/render/envelope.ts"],"names":[],"mappings":"AACA,OAAO,EAAmD,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAazD,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAIvD;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAatE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAG1D"}
@@ -10,6 +10,10 @@ export const CHEF_KEY_SHAPES = {
10
10
  'chef.history.record': 'receipt',
11
11
  'chef.history.query': 'list',
12
12
  'chef.help.lookup': 'list',
13
+ 'chef.relation.write': 'receipt',
14
+ 'chef.relation.query': 'list',
15
+ 'chef.setup.init': 'receipt',
16
+ 'chef.data.batch': 'receipt',
13
17
  };
14
18
  export function chefShapeFor(key) {
15
19
  const s = CHEF_KEY_SHAPES[key];
@@ -1 +1 @@
1
- {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/render/envelope.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAqC,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,kBAAkB,EAAE,QAAQ;IAC5B,oBAAoB,EAAE,MAAM;IAC5B,mBAAmB,EAAE,SAAS;IAC9B,kBAAkB,EAAE,MAAM;IAC1B,qBAAqB,EAAE,MAAM;IAC7B,qBAAqB,EAAE,SAAS;IAChC,oBAAoB,EAAE,MAAM;IAC5B,kBAAkB,EAAE,MAAM;CAC3B,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,IAAa;IAC1D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC;QAAC,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,KAAK,GAAG,SAAS,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC;QAAC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,cAAc,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACrG,CAAC"}
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/render/envelope.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAqC,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,kBAAkB,EAAE,QAAQ;IAC5B,oBAAoB,EAAE,MAAM;IAC5B,mBAAmB,EAAE,SAAS;IAC9B,kBAAkB,EAAE,MAAM;IAC1B,qBAAqB,EAAE,MAAM;IAC7B,qBAAqB,EAAE,SAAS;IAChC,oBAAoB,EAAE,MAAM;IAC5B,kBAAkB,EAAE,MAAM;IAC1B,qBAAqB,EAAE,SAAS;IAChC,qBAAqB,EAAE,MAAM;IAC7B,iBAAiB,EAAE,SAAS;IAC5B,iBAAiB,EAAE,SAAS;CAC7B,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,IAAa;IAC1D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC;QAAC,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,KAAK,GAAG,SAAS,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC;QAAC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,cAAc,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACrG,CAAC"}
@@ -4,6 +4,13 @@ export { CHEF_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, ass
4
4
  export { CHEF_TEMPLATES, templateFor, loadTemplate } from './templates.js';
5
5
  export type { ChefTemplate } from './templates.js';
6
6
  export { toRecipeItem, buildRecipeReceipt, buildHistoryQuery, buildHelpItems } from './views.js';
7
+ export { CHEF_SKIN_CSS, chefSkinCss, chefSceneCss } from './skin.js';
8
+ export type { ChefSkinCssInput } from './skin.js';
9
+ export { SCENE_FAMILIES, renderSceneBand, sceneBandClass, sceneBandCss } from './sceneBand.js';
10
+ export type { SceneFamily } from './sceneBand.js';
11
+ export { sceneFamilyCss } from './sceneRhythm.js';
12
+ export { renderSceneShell } from './sceneShell.js';
13
+ export type { SceneShellInput } from './sceneShell.js';
7
14
  export { recipeDetail } from '../view/run.js';
8
15
  export { buildRecipeSearch } from '../search/run.js';
9
16
  export { buildCookingRun } from '../cook/run.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnN,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjG,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnN,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/F,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -3,6 +3,13 @@ export { CHEF_KEY_SHAPES, chefShapeFor, buildChefEnvelope, parseChefEnvelope } f
3
3
  export { CHEF_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, assertHtmlSize, SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, CONTENT_MARKER, SHARED_CSS, SHARED_HELPERS, fillTemplate } from './html.js';
4
4
  export { CHEF_TEMPLATES, templateFor, loadTemplate } from './templates.js';
5
5
  export { toRecipeItem, buildRecipeReceipt, buildHistoryQuery, buildHelpItems } from './views.js';
6
+ // #873 公共层席:私家大厨视觉皮肤(页面样式层的单一入口 `chefSceneCss`)。域页壳与
7
+ // `docs/skills/skill-chef/t77*-run-*.mjs` 两个驱动器都只从这一处取样式入口。
8
+ export { CHEF_SKIN_CSS, chefSkinCss, chefSceneCss } from './skin.js';
9
+ // #873 第三轮:页族共用的两条视觉标准(一条装饰带 × 三族 + 族级节奏)与页壳装配的单一入口。
10
+ export { SCENE_FAMILIES, renderSceneBand, sceneBandClass, sceneBandCss } from './sceneBand.js';
11
+ export { sceneFamilyCss } from './sceneRhythm.js';
12
+ export { renderSceneShell } from './sceneShell.js';
6
13
  // #839 搬迁债务(到期=收口票把测试改打域接口后删):下六件的新家在域目录,
7
14
  // 本 barrel 只转出、不断言内容(结构纪律铁律五:过渡期旧共用 barrel 对新家内部件的深路径直引用)。
8
15
  export { recipeDetail } from '../view/run.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnN,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjG,0CAA0C;AAC1C,2DAA2D;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnN,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjG,qDAAqD;AACrD,4DAA4D;AAC5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAErE,qDAAqD;AACrD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,0CAA0C;AAC1C,2DAA2D;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /** #873 第三轮 · 私家大厨页族的**一条共用装饰带**(内联 SVG,按页族三条变体)。
2
+ *
3
+ * 为什么另立一件:第一轮的皮肤只做到「一条 6px 暖色渐变」——它证明了色彩锚点有用,但**物件的可辨识度**
4
+ * 没做起来。第三轮把两轮实测的差口收成一份共用标准:第 21 格(92 分)页头那条带里是**认得出的器物**
5
+ * (碗/椒/放大镜),第 47 格(70 分)那条是**白块压米色底、几乎看不见**。判官对后者的原话是
6
+ * 「装饰条占位较空/静态灰白缺品牌温度」。本件就是那条带的标准:**器物剪影 + 饱和色填充**,
7
+ * 色值只取 `CHART_PALETTE` 与冻结 token 的派生,不凭空发明。
8
+ *
9
+ * 为什么是内联 `<svg>` 而不是图:验收墙的造册判据**拒收含 `loading="lazy"` 的产物**,而图件产出器会写它;
10
+ * 内联 SVG 不带 `loading`、不引外部资源、不占一次网络往返。见 `t778-验收墙.mjs:154`。
11
+ *
12
+ * 三族怎么分(与 `t768-页面族配方.md` 的三族同名):
13
+ * · `result`(结果型「查到了什么」)= 碗 + 椒 + 放大镜 + 盘(搜索/查看/历史/采购);
14
+ * · `process`(过程型「正在做」) = 炒锅 + 锅铲 + 火苗 + 计时器(做菜/开始使用);
15
+ * · `receipt`(回执型「写下了什么」)= 砧板 + 菜刀 + 勾印记 + 椒(录入/修改/派生/数据管理)。
16
+ * 切换粒度=**按域**(页壳一处一个值),与派单的「能按域或按族切换」同口径。
17
+ *
18
+ * 构图(一条连续构图,不是一排等大的图标):画布 720×56,主构图压在 x∈[170,560],
19
+ * 两侧只放**可被裁掉也不伤构图**的散点与热气;窄档(390)按 `slice` 居中裁切后可见区约
20
+ * x∈[150,570] ⇒ 主构图整条都在,两侧只裁掉散点。
21
+ */
22
+ /** 页族闭集(三个值,与页面族配方同名;页壳一处一个)。 */
23
+ export declare const SCENE_FAMILIES: readonly ["result", "process", "receipt"];
24
+ /** 页族名。 */
25
+ export type SceneFamily = (typeof SCENE_FAMILIES)[number];
26
+ /** 装饰带的根类(页壳装配件用它当锚点;族名进类名,便于按族切换与断言)。 */
27
+ export declare function sceneBandClass(family: SceneFamily): string;
28
+ /** 一条族级装饰带的标记。纯装饰:`aria-hidden`,**一个字的可见文本都不出**(判据=机审⑤⑥ 零命中)。 */
29
+ export declare function renderSceneBand(family: SceneFamily): string;
30
+ /** 装饰带的样式唯一产出者:一条满宽定高的带(窄档 52px/宽档 58px),底是暖色浅渐变,
31
+ * 物件由 SVG 出。**窄档不缩成细线**:只收 6px,物件按 `slice` 居中裁切后仍是整条构图。
32
+ * 上下负边距把带拉到版面根的两缘(版面根的内距是 32px 20px/窄档 20px 16px)。 */
33
+ export declare function sceneBandCss(input?: {
34
+ readonly prefix?: string;
35
+ }): string;
36
+ //# sourceMappingURL=sceneBand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneBand.d.ts","sourceRoot":"","sources":["../../src/render/sceneBand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,iCAAiC;AACjC,eAAO,MAAM,cAAc,2CAA4C,CAAC;AAExE,WAAW;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAiH1D,0CAA0C;AAC1C,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAQ3D;AAED;;uDAEuD;AACvD,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA4BzE"}
@@ -0,0 +1,166 @@
1
+ /** #873 第三轮 · 私家大厨页族的**一条共用装饰带**(内联 SVG,按页族三条变体)。
2
+ *
3
+ * 为什么另立一件:第一轮的皮肤只做到「一条 6px 暖色渐变」——它证明了色彩锚点有用,但**物件的可辨识度**
4
+ * 没做起来。第三轮把两轮实测的差口收成一份共用标准:第 21 格(92 分)页头那条带里是**认得出的器物**
5
+ * (碗/椒/放大镜),第 47 格(70 分)那条是**白块压米色底、几乎看不见**。判官对后者的原话是
6
+ * 「装饰条占位较空/静态灰白缺品牌温度」。本件就是那条带的标准:**器物剪影 + 饱和色填充**,
7
+ * 色值只取 `CHART_PALETTE` 与冻结 token 的派生,不凭空发明。
8
+ *
9
+ * 为什么是内联 `<svg>` 而不是图:验收墙的造册判据**拒收含 `loading="lazy"` 的产物**,而图件产出器会写它;
10
+ * 内联 SVG 不带 `loading`、不引外部资源、不占一次网络往返。见 `t778-验收墙.mjs:154`。
11
+ *
12
+ * 三族怎么分(与 `t768-页面族配方.md` 的三族同名):
13
+ * · `result`(结果型「查到了什么」)= 碗 + 椒 + 放大镜 + 盘(搜索/查看/历史/采购);
14
+ * · `process`(过程型「正在做」) = 炒锅 + 锅铲 + 火苗 + 计时器(做菜/开始使用);
15
+ * · `receipt`(回执型「写下了什么」)= 砧板 + 菜刀 + 勾印记 + 椒(录入/修改/派生/数据管理)。
16
+ * 切换粒度=**按域**(页壳一处一个值),与派单的「能按域或按族切换」同口径。
17
+ *
18
+ * 构图(一条连续构图,不是一排等大的图标):画布 720×56,主构图压在 x∈[170,560],
19
+ * 两侧只放**可被裁掉也不伤构图**的散点与热气;窄档(390)按 `slice` 居中裁切后可见区约
20
+ * x∈[150,570] ⇒ 主构图整条都在,两侧只裁掉散点。
21
+ */
22
+ /** 换行(仓库口径:不写字面换行转义,与 `skin.ts`/`pageShapes.ts` 同)。 */
23
+ const LF = String.fromCharCode(10);
24
+ /** 页族闭集(三个值,与页面族配方同名;页壳一处一个)。 */
25
+ export const SCENE_FAMILIES = ['result', 'process', 'receipt'];
26
+ /** 器物色:全部是 `CHART_PALETTE` 的下标取值(唯一定义地=`base-paint` 的 `spec/charts.ts`),
27
+ * 再加两个冻结 token 的派生(`--line` 的金属灰、`--soft` 的浅底改由 CSS 出)。 */
28
+ const P = ['#007aff', '#34c759', '#ff9500', '#ff3b30', '#af52de', '#5ac8fa', '#ffcc00', '#8e8e93', '#ff2d55', '#00c7be'];
29
+ /** 金属器物的灰(锅/铲/刀):取调色板里的中性档,不新造色。 */
30
+ const METAL = P[7];
31
+ /** 金属的亮面(刀背/铲面)。 */
32
+ const METAL_LIGHT = '#c7c7cc';
33
+ /** 热气的暖色(蒸汽笔触)。 */
34
+ const STEAM = P[2];
35
+ /** 散点(两侧可裁掉的背景记号):一排大小不匀的圆点,让裁切后两侧不空。 */
36
+ const SPECKLES = '<circle cx="52" cy="20" r="3" fill="' + P[6] + '" opacity=".75"/>'
37
+ + '<circle cx="86" cy="36" r="2.5" fill="' + P[2] + '" opacity=".7"/>'
38
+ + '<circle cx="126" cy="18" r="4" fill="' + P[1] + '" opacity=".6"/>'
39
+ + '<circle cx="146" cy="40" r="2.5" fill="' + P[3] + '" opacity=".6"/>'
40
+ + '<circle cx="600" cy="22" r="3.5" fill="' + P[9] + '" opacity=".65"/>'
41
+ + '<circle cx="636" cy="38" r="2.5" fill="' + P[2] + '" opacity=".7"/>'
42
+ + '<circle cx="672" cy="20" r="4" fill="' + P[1] + '" opacity=".6"/>'
43
+ + '<circle cx="700" cy="36" r="2.5" fill="' + P[4] + '" opacity=".55"/>';
44
+ /** 热气三缕(碗/锅/杯都能用):一条 S 形笔触,疏密不匀。 */
45
+ function steam(x, y, h, w) {
46
+ return '<path d="M' + x + ' ' + y + 'c' + (w) + ' -' + (h * 0.6) + ' -' + w + ' -' + (h * 0.9)
47
+ + ' 0 -' + h + '" stroke="' + STEAM + '" stroke-width="' + (w * 0.9)
48
+ + '" fill="none" stroke-linecap="round" opacity=".8"/>';
49
+ }
50
+ /** 碗(`result`):一只下凸的半球 + 一枚碗沿,碗里三样菜,头顶两缕热气。 */
51
+ const BOWL = '<path d="M180 33a26 26 0 0 0 52 0Z" fill="' + P[2] + '"/>'
52
+ + '<rect x="176" y="29" width="60" height="5" rx="2.5" fill="' + P[6] + '"/>'
53
+ + '<circle cx="197" cy="26" r="4" fill="' + P[1] + '"/>'
54
+ + '<circle cx="206" cy="23" r="4.5" fill="' + P[3] + '"/>'
55
+ + '<circle cx="215" cy="26" r="4" fill="' + P[1] + '"/>'
56
+ + steam(198, 14, 11, 4) + steam(214, 15, 9, 3.4);
57
+ /** 辣椒(`result`/`receipt`共用):弯月形椒身 + 绿蒂 + 一道高光。两个族里各摆一处(位置不同)。 */
58
+ function chili(x, y) {
59
+ return '<path d="M' + x + ' ' + y + 'c9-2 17 3 20 11 3 9-1 16-8 17-7 1-13-4-16-13-2-8-1-14 4-15Z" fill="' + P[3] + '"/>'
60
+ + '<path d="M' + (x - 2) + ' ' + (y - 2) + 'c-3-3-1-8 4-9 1 4-1 7-4 9Z" fill="' + P[1] + '"/>'
61
+ + '<path d="M' + (x + 5) + ' ' + (y + 4) + 'c4 1 7 4 8 8" stroke="' + P[8]
62
+ + '" stroke-width="2" fill="none" stroke-linecap="round" opacity=".55"/>';
63
+ }
64
+ /** 放大镜(`result`):一枚带蓝玻璃的环 + 一段握把。 */
65
+ const LENS = '<circle cx="382" cy="26" r="14" fill="#d9ecff" stroke="' + P[0] + '" stroke-width="5"/>'
66
+ + '<path d="M370 17a13 13 0 0 1 9-4" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round"/>'
67
+ + '<path d="M393 37l11 11" stroke="' + P[0] + '" stroke-width="7" stroke-linecap="round"/>';
68
+ /** 盘(`result`):一只椭圆盘 + 盘心浅底。 */
69
+ const PLATE = '<ellipse cx="486" cy="33" rx="34" ry="11" fill="' + P[6] + '"/>'
70
+ + '<ellipse cx="486" cy="31" rx="23" ry="6" fill="#fff6dd"/>'
71
+ + '<circle cx="478" cy="30" r="3" fill="' + P[1] + '"/><circle cx="494" cy="30" r="3" fill="' + P[3] + '"/>';
72
+ /** 炒锅(`process`):宽口浅锅 + 右侧木柄,锅里三样料,锅上两缕热气。 */
73
+ const WOK = '<path d="M186 30h92a46 46 0 0 1-92 0Z" fill="' + METAL + '"/>'
74
+ + '<rect x="184" y="27" width="96" height="4" rx="2" fill="' + METAL_LIGHT + '"/>'
75
+ + '<path d="M278 30l34-11" stroke="' + P[2] + '" stroke-width="8" stroke-linecap="round"/>'
76
+ + '<circle cx="215" cy="24" r="4" fill="' + P[1] + '"/>'
77
+ + '<circle cx="230" cy="22" r="4.5" fill="' + P[3] + '"/>'
78
+ + '<circle cx="246" cy="24" r="4" fill="' + P[6] + '"/>'
79
+ + steam(214, 12, 10, 4) + steam(240, 13, 8, 3.4);
80
+ /** 锅铲(`process`):一枚方圆铲面 + 一根长柄。 */
81
+ const SPATULA = '<rect x="348" y="8" width="18" height="26" rx="6" fill="' + METAL_LIGHT + '"/>'
82
+ + '<rect x="352" y="32" width="10" height="4" fill="' + METAL + '"/>'
83
+ + '<path d="M357 36v14" stroke="' + P[2] + '" stroke-width="6" stroke-linecap="round"/>';
84
+ /** 火苗(`process`):外焰暖橙 + 内焰亮黄,两笔套画。 */
85
+ const FLAME = '<path d="M424 6c10 11 16 19 16 27a16 16 0 0 1-32 0c0-8 6-16 16-27Z" fill="' + P[2] + '"/>'
86
+ + '<path d="M424 20c4 5 7 9 7 13a7 7 0 0 1-14 0c0-4 3-8 7-13Z" fill="' + P[6] + '"/>';
87
+ /** 计时器(`process`):青色表盘 + 白芯 + 蓝指针 + 顶钮。 */
88
+ const TIMER = '<rect x="498" y="6" width="12" height="5" rx="2.5" fill="' + METAL + '"/>'
89
+ + '<circle cx="504" cy="30" r="17" fill="' + P[9] + '"/>'
90
+ + '<circle cx="504" cy="30" r="12" fill="#e8fffd"/>'
91
+ + '<path d="M504 23v8l6 3.5" stroke="' + P[0] + '" stroke-width="3.4" fill="none" stroke-linecap="round"/>';
92
+ /** 砧板(`receipt`):一块圆角板 + 内圈切面 + 挂孔 + 板上两样料。 */
93
+ const BOARD = '<rect x="172" y="19" width="80" height="26" rx="9" fill="' + P[6] + '"/>'
94
+ + '<rect x="177" y="23" width="70" height="18" rx="7" fill="#fff6dd"/>'
95
+ + '<circle cx="184" cy="32" r="3.4" fill="' + P[2] + '"/>'
96
+ + '<circle cx="216" cy="28" r="4" fill="' + P[1] + '"/><circle cx="232" cy="30" r="4.5" fill="' + P[3] + '"/>';
97
+ /** 菜刀(`receipt`):方刀身(右上圆角)+ 亮口一条 + 木柄一段。 */
98
+ const CLEAVER = '<path d="M286 11h46a8 8 0 0 1 8 8v13h-54Z" fill="' + METAL_LIGHT + '"/>'
99
+ + '<path d="M286 32h54v4a3 3 0 0 1-3 3h-48a3 3 0 0 1-3-3Z" fill="' + METAL + '"/>'
100
+ + '<path d="M340 18h22a4 4 0 0 1 4 4v6a4 4 0 0 1-4 4h-22Z" fill="' + P[2] + '"/>';
101
+ /** 回执单(`receipt`):一张白纸 + 下缘撕口 + 两行字。为什么不是「绿底白勾」那枚印记:
102
+ * 那一版在复评里被读成「与功能无关的圆形应用标记,喧宾夺主」——同一个形状撞上了别的品牌。
103
+ * 回执族要的语义是「写下了什么」,一张撕口单子本身就是回执。 */
104
+ const NOTE = '<path d="M392 11h46v32l-5.8-3.6-5.8 3.6-5.8-3.6-5.8 3.6-5.8-3.6-5.8 3.6-5.4-3.6Z" fill="#ffffff"'
105
+ + ' stroke="rgba(142, 142, 147, .45)" stroke-width="1.6"/>'
106
+ + '<path d="M399 19h32M399 26h22" stroke="' + P[7] + '" stroke-width="2.6" stroke-linecap="round" opacity=".65"/>';
107
+ /** 笔(`receipt`):黄杆 + 白尖 + 灰铅芯 + 红尾,斜摆 40 度。 */
108
+ const PENCIL = '<g transform="rotate(40 476 30)">'
109
+ + '<rect x="450" y="26" width="44" height="9" rx="2" fill="' + P[6] + '"/>'
110
+ + '<rect x="446" y="26" width="5" height="9" fill="' + P[3] + '"/>'
111
+ + '<path d="M494 26l11 4.5-11 4.5Z" fill="#ffffff" stroke="' + P[7] + '" stroke-width="1.4"/>'
112
+ + '<path d="M505 30.5l4 1.6-4 1.6Z" fill="' + P[7] + '"/>'
113
+ + '</g>';
114
+ /** 三族的构图(主区各自一条连续排布,两侧共用同一组散点)。 */
115
+ const ART = Object.freeze({
116
+ result: BOWL + chili(292, 20) + LENS + PLATE + steam(540, 22, 12, 4.2),
117
+ process: WOK + SPATULA + FLAME + TIMER + steam(560, 24, 11, 4),
118
+ receipt: BOARD + CLEAVER + NOTE + PENCIL,
119
+ });
120
+ /** 装饰带的根类(页壳装配件用它当锚点;族名进类名,便于按族切换与断言)。 */
121
+ export function sceneBandClass(family) {
122
+ return 'ilife-scene-band ilife-scene-band-' + family;
123
+ }
124
+ /** 一条族级装饰带的标记。纯装饰:`aria-hidden`,**一个字的可见文本都不出**(判据=机审⑤⑥ 零命中)。 */
125
+ export function renderSceneBand(family) {
126
+ if (!SCENE_FAMILIES.includes(family)) {
127
+ throw new Error('renderSceneBand: family 只许 ' + SCENE_FAMILIES.join('/'));
128
+ }
129
+ return '<figure class="' + sceneBandClass(family) + '" aria-hidden="true">'
130
+ + '<svg viewBox="0 0 720 56" preserveAspectRatio="xMidYMid slice" focusable="false">'
131
+ + SPECKLES + ART[family]
132
+ + '</svg></figure>';
133
+ }
134
+ /** 装饰带的样式唯一产出者:一条满宽定高的带(窄档 52px/宽档 58px),底是暖色浅渐变,
135
+ * 物件由 SVG 出。**窄档不缩成细线**:只收 6px,物件按 `slice` 居中裁切后仍是整条构图。
136
+ * 上下负边距把带拉到版面根的两缘(版面根的内距是 32px 20px/窄档 20px 16px)。 */
137
+ export function sceneBandCss(input) {
138
+ const p = input !== undefined && input !== null
139
+ && typeof input.prefix === 'string' && input.prefix !== '' ? input.prefix : 'ilife-';
140
+ const root = '.' + p + 'page-ui';
141
+ const band = root + ' .ilife-scene-band';
142
+ return [
143
+ '/* #873 第三轮 · 页族装饰带(内联 SVG,三族各一条变体;纯装饰、不可点、无可见文本) */',
144
+ band + ' {',
145
+ ' display: block;',
146
+ ' box-sizing: border-box;',
147
+ ' overflow: hidden;',
148
+ ' margin: -32px -20px 14px;',
149
+ ' height: 58px;',
150
+ ' background-image: linear-gradient(100deg, rgba(255, 204, 0, .34), rgba(255, 149, 0, .24) 46%,'
151
+ + ' rgba(0, 199, 190, .18) 74%, rgba(0, 122, 255, .16));',
152
+ '}',
153
+ band + ' svg {',
154
+ ' display: block;',
155
+ ' width: 100%;',
156
+ ' height: 100%;',
157
+ '}',
158
+ '@media (max-width: 640px) {',
159
+ ' ' + band + ' {',
160
+ ' margin: -20px -16px 12px;',
161
+ ' height: 52px;',
162
+ ' }',
163
+ '}',
164
+ ].join(LF);
165
+ }
166
+ //# sourceMappingURL=sceneBand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneBand.js","sourceRoot":"","sources":["../../src/render/sceneBand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SceneFamily } from './sceneBand.js';
2
+ /** 按族出这一段(页壳装配件把它拼进 `extraCss`)。恒返回非空 CSS 文本。 */
3
+ export declare function sceneFamilyCss(family: SceneFamily, input?: {
4
+ readonly prefix?: string;
5
+ }): string;
6
+ //# sourceMappingURL=sceneRhythm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneRhythm.d.ts","sourceRoot":"","sources":["../../src/render/sceneRhythm.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA8HlD,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAOhG"}