skill-home 0.3.34 → 0.3.52

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 (535) hide show
  1. package/package.json +3 -3
  2. package/templates/space/fixed_spot.html +1 -1
  3. package/templates/space/location_manage.html +1 -1
  4. package/dist/cli/cmd_read.d.ts +0 -3
  5. package/dist/cli/cmd_read.d.ts.map +0 -1
  6. package/dist/cli/cmd_read.js +0 -304
  7. package/dist/cli/cmd_read.js.map +0 -1
  8. package/dist/cli/config.d.ts +0 -20
  9. package/dist/cli/config.d.ts.map +0 -1
  10. package/dist/cli/config.js +0 -100
  11. package/dist/cli/config.js.map +0 -1
  12. package/dist/cli/health.d.ts +0 -7
  13. package/dist/cli/health.d.ts.map +0 -1
  14. package/dist/cli/health.js +0 -32
  15. package/dist/cli/health.js.map +0 -1
  16. package/dist/cli/keys.d.ts +0 -4
  17. package/dist/cli/keys.d.ts.map +0 -1
  18. package/dist/cli/keys.js +0 -55
  19. package/dist/cli/keys.js.map +0 -1
  20. package/dist/cli/registry.d.ts +0 -4
  21. package/dist/cli/registry.d.ts.map +0 -1
  22. package/dist/cli/registry.js +0 -32
  23. package/dist/cli/registry.js.map +0 -1
  24. package/dist/config.d.ts +0 -53
  25. package/dist/config.d.ts.map +0 -1
  26. package/dist/config.js +0 -122
  27. package/dist/config.js.map +0 -1
  28. package/dist/data/commands.d.ts +0 -11
  29. package/dist/data/commands.d.ts.map +0 -1
  30. package/dist/data/commands.js +0 -7
  31. package/dist/data/commands.js.map +0 -1
  32. package/dist/data/index.d.ts +0 -3
  33. package/dist/data/index.d.ts.map +0 -1
  34. package/dist/data/index.js +0 -4
  35. package/dist/data/index.js.map +0 -1
  36. package/dist/data/query.d.ts +0 -23
  37. package/dist/data/query.d.ts.map +0 -1
  38. package/dist/data/query.js +0 -19
  39. package/dist/data/query.js.map +0 -1
  40. package/dist/data/routes.d.ts +0 -3
  41. package/dist/data/routes.d.ts.map +0 -1
  42. package/dist/data/routes.js +0 -2
  43. package/dist/data/routes.js.map +0 -1
  44. package/dist/data/schema.d.ts +0 -15
  45. package/dist/data/schema.d.ts.map +0 -1
  46. package/dist/data/schema.js +0 -18
  47. package/dist/data/schema.js.map +0 -1
  48. package/dist/data/tables.d.ts +0 -48
  49. package/dist/data/tables.d.ts.map +0 -1
  50. package/dist/data/tables.js +0 -82
  51. package/dist/data/tables.js.map +0 -1
  52. package/dist/express/commands.d.ts +0 -3
  53. package/dist/express/commands.d.ts.map +0 -1
  54. package/dist/express/commands.js +0 -6
  55. package/dist/express/commands.js.map +0 -1
  56. package/dist/express/index.d.ts +0 -3
  57. package/dist/express/index.d.ts.map +0 -1
  58. package/dist/express/index.js +0 -4
  59. package/dist/express/index.js.map +0 -1
  60. package/dist/express/pages/express.d.ts +0 -24
  61. package/dist/express/pages/express.d.ts.map +0 -1
  62. package/dist/express/pages/express.js +0 -160
  63. package/dist/express/pages/express.js.map +0 -1
  64. package/dist/express/pages/list.d.ts +0 -24
  65. package/dist/express/pages/list.d.ts.map +0 -1
  66. package/dist/express/pages/list.js +0 -167
  67. package/dist/express/pages/list.js.map +0 -1
  68. package/dist/express/pages/missing.d.ts +0 -24
  69. package/dist/express/pages/missing.d.ts.map +0 -1
  70. package/dist/express/pages/missing.js +0 -146
  71. package/dist/express/pages/missing.js.map +0 -1
  72. package/dist/express/pages/stock.d.ts +0 -24
  73. package/dist/express/pages/stock.d.ts.map +0 -1
  74. package/dist/express/pages/stock.js +0 -176
  75. package/dist/express/pages/stock.js.map +0 -1
  76. package/dist/express/routes.d.ts +0 -3
  77. package/dist/express/routes.d.ts.map +0 -1
  78. package/dist/express/routes.js +0 -8
  79. package/dist/express/routes.js.map +0 -1
  80. package/dist/express/shopping.d.ts +0 -4
  81. package/dist/express/shopping.d.ts.map +0 -1
  82. package/dist/express/shopping.js +0 -145
  83. package/dist/express/shopping.js.map +0 -1
  84. package/dist/family/care.d.ts +0 -4
  85. package/dist/family/care.d.ts.map +0 -1
  86. package/dist/family/care.js +0 -103
  87. package/dist/family/care.js.map +0 -1
  88. package/dist/family/commands.d.ts +0 -3
  89. package/dist/family/commands.d.ts.map +0 -1
  90. package/dist/family/commands.js +0 -6
  91. package/dist/family/commands.js.map +0 -1
  92. package/dist/family/index.d.ts +0 -3
  93. package/dist/family/index.d.ts.map +0 -1
  94. package/dist/family/index.js +0 -4
  95. package/dist/family/index.js.map +0 -1
  96. package/dist/family/pages/family_borrow.d.ts +0 -24
  97. package/dist/family/pages/family_borrow.d.ts.map +0 -1
  98. package/dist/family/pages/family_borrow.js +0 -267
  99. package/dist/family/pages/family_borrow.js.map +0 -1
  100. package/dist/family/pages/family_members.d.ts +0 -24
  101. package/dist/family/pages/family_members.d.ts.map +0 -1
  102. package/dist/family/pages/family_members.js +0 -171
  103. package/dist/family/pages/family_members.js.map +0 -1
  104. package/dist/family/routes.d.ts +0 -3
  105. package/dist/family/routes.d.ts.map +0 -1
  106. package/dist/family/routes.js +0 -20
  107. package/dist/family/routes.js.map +0 -1
  108. package/dist/fetch/archive.d.ts +0 -13
  109. package/dist/fetch/archive.d.ts.map +0 -1
  110. package/dist/fetch/archive.js +0 -115
  111. package/dist/fetch/archive.js.map +0 -1
  112. package/dist/fetch/backup.d.ts +0 -75
  113. package/dist/fetch/backup.d.ts.map +0 -1
  114. package/dist/fetch/backup.js +0 -285
  115. package/dist/fetch/backup.js.map +0 -1
  116. package/dist/fetch/db.d.ts +0 -107
  117. package/dist/fetch/db.d.ts.map +0 -1
  118. package/dist/fetch/db.js +0 -443
  119. package/dist/fetch/db.js.map +0 -1
  120. package/dist/fetch/domains.d.ts +0 -151
  121. package/dist/fetch/domains.d.ts.map +0 -1
  122. package/dist/fetch/domains.js +0 -354
  123. package/dist/fetch/domains.js.map +0 -1
  124. package/dist/fetch/errors.d.ts +0 -11
  125. package/dist/fetch/errors.d.ts.map +0 -1
  126. package/dist/fetch/errors.js +0 -18
  127. package/dist/fetch/errors.js.map +0 -1
  128. package/dist/fetch/index.d.ts +0 -11
  129. package/dist/fetch/index.d.ts.map +0 -1
  130. package/dist/fetch/index.js +0 -14
  131. package/dist/fetch/index.js.map +0 -1
  132. package/dist/fetch/masterKey.d.ts +0 -11
  133. package/dist/fetch/masterKey.d.ts.map +0 -1
  134. package/dist/fetch/masterKey.js +0 -46
  135. package/dist/fetch/masterKey.js.map +0 -1
  136. package/dist/fetch/paths.d.ts +0 -55
  137. package/dist/fetch/paths.d.ts.map +0 -1
  138. package/dist/fetch/paths.js +0 -100
  139. package/dist/fetch/paths.js.map +0 -1
  140. package/dist/health.d.ts +0 -50
  141. package/dist/health.d.ts.map +0 -1
  142. package/dist/health.js +0 -524
  143. package/dist/health.js.map +0 -1
  144. package/dist/help/helpAssets.d.ts +0 -52
  145. package/dist/help/helpAssets.d.ts.map +0 -1
  146. package/dist/help/helpAssets.js +0 -2323
  147. package/dist/help/helpAssets.js.map +0 -1
  148. package/dist/help/helpFile.d.ts +0 -62
  149. package/dist/help/helpFile.d.ts.map +0 -1
  150. package/dist/help/helpFile.js +0 -219
  151. package/dist/help/helpFile.js.map +0 -1
  152. package/dist/help/index.d.ts +0 -6
  153. package/dist/help/index.d.ts.map +0 -1
  154. package/dist/help/index.js +0 -8
  155. package/dist/help/index.js.map +0 -1
  156. package/dist/help/lookup.d.ts +0 -11
  157. package/dist/help/lookup.d.ts.map +0 -1
  158. package/dist/help/lookup.js +0 -52
  159. package/dist/help/lookup.js.map +0 -1
  160. package/dist/help/manifest.d.ts +0 -17
  161. package/dist/help/manifest.d.ts.map +0 -1
  162. package/dist/help/manifest.js +0 -44
  163. package/dist/help/manifest.js.map +0 -1
  164. package/dist/help/output.d.ts +0 -12
  165. package/dist/help/output.d.ts.map +0 -1
  166. package/dist/help/output.js +0 -65
  167. package/dist/help/output.js.map +0 -1
  168. package/dist/index.d.ts +0 -5
  169. package/dist/index.d.ts.map +0 -1
  170. package/dist/index.js +0 -6
  171. package/dist/index.js.map +0 -1
  172. package/dist/items/add.d.ts +0 -3
  173. package/dist/items/add.d.ts.map +0 -1
  174. package/dist/items/add.js +0 -34
  175. package/dist/items/add.js.map +0 -1
  176. package/dist/items/commands.d.ts +0 -3
  177. package/dist/items/commands.d.ts.map +0 -1
  178. package/dist/items/commands.js +0 -22
  179. package/dist/items/commands.js.map +0 -1
  180. package/dist/items/detail.d.ts +0 -3
  181. package/dist/items/detail.d.ts.map +0 -1
  182. package/dist/items/detail.js +0 -31
  183. package/dist/items/detail.js.map +0 -1
  184. package/dist/items/index.d.ts +0 -3
  185. package/dist/items/index.d.ts.map +0 -1
  186. package/dist/items/index.js +0 -4
  187. package/dist/items/index.js.map +0 -1
  188. package/dist/items/inventory.d.ts +0 -4
  189. package/dist/items/inventory.d.ts.map +0 -1
  190. package/dist/items/inventory.js +0 -63
  191. package/dist/items/inventory.js.map +0 -1
  192. package/dist/items/pages/add_form.d.ts +0 -24
  193. package/dist/items/pages/add_form.d.ts.map +0 -1
  194. package/dist/items/pages/add_form.js +0 -174
  195. package/dist/items/pages/add_form.js.map +0 -1
  196. package/dist/items/pages/browse.d.ts +0 -24
  197. package/dist/items/pages/browse.d.ts.map +0 -1
  198. package/dist/items/pages/browse.js +0 -143
  199. package/dist/items/pages/browse.js.map +0 -1
  200. package/dist/items/pages/category_manage.d.ts +0 -24
  201. package/dist/items/pages/category_manage.d.ts.map +0 -1
  202. package/dist/items/pages/category_manage.js +0 -153
  203. package/dist/items/pages/category_manage.js.map +0 -1
  204. package/dist/items/pages/confirm.d.ts +0 -24
  205. package/dist/items/pages/confirm.d.ts.map +0 -1
  206. package/dist/items/pages/confirm.js +0 -149
  207. package/dist/items/pages/confirm.js.map +0 -1
  208. package/dist/items/pages/detail.d.ts +0 -24
  209. package/dist/items/pages/detail.d.ts.map +0 -1
  210. package/dist/items/pages/detail.js +0 -160
  211. package/dist/items/pages/detail.js.map +0 -1
  212. package/dist/items/pages/duplicates.d.ts +0 -24
  213. package/dist/items/pages/duplicates.d.ts.map +0 -1
  214. package/dist/items/pages/duplicates.js +0 -138
  215. package/dist/items/pages/duplicates.js.map +0 -1
  216. package/dist/items/pages/history.d.ts +0 -24
  217. package/dist/items/pages/history.d.ts.map +0 -1
  218. package/dist/items/pages/history.js +0 -213
  219. package/dist/items/pages/history.js.map +0 -1
  220. package/dist/items/pages/inventory_diff.d.ts +0 -24
  221. package/dist/items/pages/inventory_diff.d.ts.map +0 -1
  222. package/dist/items/pages/inventory_diff.js +0 -126
  223. package/dist/items/pages/inventory_diff.js.map +0 -1
  224. package/dist/items/pages/inventory_records.d.ts +0 -24
  225. package/dist/items/pages/inventory_records.d.ts.map +0 -1
  226. package/dist/items/pages/inventory_records.js +0 -147
  227. package/dist/items/pages/inventory_records.js.map +0 -1
  228. package/dist/items/pages/inventory_round.d.ts +0 -24
  229. package/dist/items/pages/inventory_round.d.ts.map +0 -1
  230. package/dist/items/pages/inventory_round.js +0 -145
  231. package/dist/items/pages/inventory_round.js.map +0 -1
  232. package/dist/items/pages/locate.d.ts +0 -24
  233. package/dist/items/pages/locate.d.ts.map +0 -1
  234. package/dist/items/pages/locate.js +0 -129
  235. package/dist/items/pages/locate.js.map +0 -1
  236. package/dist/items/pages/move_checklist.d.ts +0 -24
  237. package/dist/items/pages/move_checklist.d.ts.map +0 -1
  238. package/dist/items/pages/move_checklist.js +0 -112
  239. package/dist/items/pages/move_checklist.js.map +0 -1
  240. package/dist/items/pages/photo_wall.d.ts +0 -24
  241. package/dist/items/pages/photo_wall.d.ts.map +0 -1
  242. package/dist/items/pages/photo_wall.js +0 -145
  243. package/dist/items/pages/photo_wall.js.map +0 -1
  244. package/dist/items/pages/photos.d.ts +0 -24
  245. package/dist/items/pages/photos.d.ts.map +0 -1
  246. package/dist/items/pages/photos.js +0 -182
  247. package/dist/items/pages/photos.js.map +0 -1
  248. package/dist/items/pages/receipt.d.ts +0 -24
  249. package/dist/items/pages/receipt.d.ts.map +0 -1
  250. package/dist/items/pages/receipt.js +0 -252
  251. package/dist/items/pages/receipt.js.map +0 -1
  252. package/dist/items/pages/relations.d.ts +0 -24
  253. package/dist/items/pages/relations.d.ts.map +0 -1
  254. package/dist/items/pages/relations.js +0 -144
  255. package/dist/items/pages/relations.js.map +0 -1
  256. package/dist/items/pages/search_list.d.ts +0 -24
  257. package/dist/items/pages/search_list.d.ts.map +0 -1
  258. package/dist/items/pages/search_list.js +0 -133
  259. package/dist/items/pages/search_list.js.map +0 -1
  260. package/dist/items/pages/tag_manage.d.ts +0 -24
  261. package/dist/items/pages/tag_manage.d.ts.map +0 -1
  262. package/dist/items/pages/tag_manage.js +0 -238
  263. package/dist/items/pages/tag_manage.js.map +0 -1
  264. package/dist/items/pages/undo_select.d.ts +0 -24
  265. package/dist/items/pages/undo_select.d.ts.map +0 -1
  266. package/dist/items/pages/undo_select.js +0 -143
  267. package/dist/items/pages/undo_select.js.map +0 -1
  268. package/dist/items/routes.d.ts +0 -3
  269. package/dist/items/routes.d.ts.map +0 -1
  270. package/dist/items/routes.js +0 -62
  271. package/dist/items/routes.js.map +0 -1
  272. package/dist/items/search.d.ts +0 -3
  273. package/dist/items/search.d.ts.map +0 -1
  274. package/dist/items/search.js +0 -47
  275. package/dist/items/search.js.map +0 -1
  276. package/dist/items/tag.d.ts +0 -25
  277. package/dist/items/tag.d.ts.map +0 -1
  278. package/dist/items/tag.js +0 -147
  279. package/dist/items/tag.js.map +0 -1
  280. package/dist/items/update.d.ts +0 -20
  281. package/dist/items/update.d.ts.map +0 -1
  282. package/dist/items/update.js +0 -211
  283. package/dist/items/update.js.map +0 -1
  284. package/dist/outfit/commands.d.ts +0 -3
  285. package/dist/outfit/commands.d.ts.map +0 -1
  286. package/dist/outfit/commands.js +0 -7
  287. package/dist/outfit/commands.js.map +0 -1
  288. package/dist/outfit/index.d.ts +0 -3
  289. package/dist/outfit/index.d.ts.map +0 -1
  290. package/dist/outfit/index.js +0 -4
  291. package/dist/outfit/index.js.map +0 -1
  292. package/dist/outfit/outfit.d.ts +0 -3
  293. package/dist/outfit/outfit.d.ts.map +0 -1
  294. package/dist/outfit/outfit.js +0 -187
  295. package/dist/outfit/outfit.js.map +0 -1
  296. package/dist/outfit/pages/outfit_picker.d.ts +0 -24
  297. package/dist/outfit/pages/outfit_picker.d.ts.map +0 -1
  298. package/dist/outfit/pages/outfit_picker.js +0 -185
  299. package/dist/outfit/pages/outfit_picker.js.map +0 -1
  300. package/dist/outfit/pages/travel_trip.d.ts +0 -24
  301. package/dist/outfit/pages/travel_trip.d.ts.map +0 -1
  302. package/dist/outfit/pages/travel_trip.js +0 -185
  303. package/dist/outfit/pages/travel_trip.js.map +0 -1
  304. package/dist/outfit/pages/trip_outfit_plan.d.ts +0 -24
  305. package/dist/outfit/pages/trip_outfit_plan.d.ts.map +0 -1
  306. package/dist/outfit/pages/trip_outfit_plan.js +0 -173
  307. package/dist/outfit/pages/trip_outfit_plan.js.map +0 -1
  308. package/dist/outfit/pages/wardrobe_analyze.d.ts +0 -24
  309. package/dist/outfit/pages/wardrobe_analyze.d.ts.map +0 -1
  310. package/dist/outfit/pages/wardrobe_analyze.js +0 -171
  311. package/dist/outfit/pages/wardrobe_analyze.js.map +0 -1
  312. package/dist/outfit/pages/wardrobe_season.d.ts +0 -24
  313. package/dist/outfit/pages/wardrobe_season.d.ts.map +0 -1
  314. package/dist/outfit/pages/wardrobe_season.js +0 -167
  315. package/dist/outfit/pages/wardrobe_season.js.map +0 -1
  316. package/dist/outfit/routes.d.ts +0 -3
  317. package/dist/outfit/routes.d.ts.map +0 -1
  318. package/dist/outfit/routes.js +0 -9
  319. package/dist/outfit/routes.js.map +0 -1
  320. package/dist/outfit/trip.d.ts +0 -3
  321. package/dist/outfit/trip.d.ts.map +0 -1
  322. package/dist/outfit/trip.js +0 -59
  323. package/dist/outfit/trip.js.map +0 -1
  324. package/dist/output.d.ts +0 -13
  325. package/dist/output.d.ts.map +0 -1
  326. package/dist/output.js +0 -57
  327. package/dist/output.js.map +0 -1
  328. package/dist/policy/care.d.ts +0 -4
  329. package/dist/policy/care.d.ts.map +0 -1
  330. package/dist/policy/care.js +0 -12
  331. package/dist/policy/care.js.map +0 -1
  332. package/dist/policy/category.d.ts +0 -8
  333. package/dist/policy/category.d.ts.map +0 -1
  334. package/dist/policy/category.js +0 -44
  335. package/dist/policy/category.js.map +0 -1
  336. package/dist/policy/index.d.ts +0 -9
  337. package/dist/policy/index.d.ts.map +0 -1
  338. package/dist/policy/index.js +0 -6
  339. package/dist/policy/index.js.map +0 -1
  340. package/dist/policy/item.d.ts +0 -18
  341. package/dist/policy/item.d.ts.map +0 -1
  342. package/dist/policy/item.js +0 -81
  343. package/dist/policy/item.js.map +0 -1
  344. package/dist/policy/routes.generated.d.ts +0 -3
  345. package/dist/policy/routes.generated.d.ts.map +0 -1
  346. package/dist/policy/routes.generated.js +0 -128
  347. package/dist/policy/routes.generated.js.map +0 -1
  348. package/dist/policy/ticket.d.ts +0 -6
  349. package/dist/policy/ticket.d.ts.map +0 -1
  350. package/dist/policy/ticket.js +0 -25
  351. package/dist/policy/ticket.js.map +0 -1
  352. package/dist/policy/wakewords.d.ts +0 -16
  353. package/dist/policy/wakewords.d.ts.map +0 -1
  354. package/dist/policy/wakewords.js +0 -38
  355. package/dist/policy/wakewords.js.map +0 -1
  356. package/dist/receipt/commands.d.ts +0 -3
  357. package/dist/receipt/commands.d.ts.map +0 -1
  358. package/dist/receipt/commands.js +0 -6
  359. package/dist/receipt/commands.js.map +0 -1
  360. package/dist/receipt/index.d.ts +0 -3
  361. package/dist/receipt/index.d.ts.map +0 -1
  362. package/dist/receipt/index.js +0 -4
  363. package/dist/receipt/index.js.map +0 -1
  364. package/dist/receipt/pages/accounts.d.ts +0 -24
  365. package/dist/receipt/pages/accounts.d.ts.map +0 -1
  366. package/dist/receipt/pages/accounts.js +0 -217
  367. package/dist/receipt/pages/accounts.js.map +0 -1
  368. package/dist/receipt/pages/certificates.d.ts +0 -24
  369. package/dist/receipt/pages/certificates.d.ts.map +0 -1
  370. package/dist/receipt/pages/certificates.js +0 -231
  371. package/dist/receipt/pages/certificates.js.map +0 -1
  372. package/dist/receipt/pages/purchase_records.d.ts +0 -24
  373. package/dist/receipt/pages/purchase_records.d.ts.map +0 -1
  374. package/dist/receipt/pages/purchase_records.js +0 -267
  375. package/dist/receipt/pages/purchase_records.js.map +0 -1
  376. package/dist/receipt/pages/warranty.d.ts +0 -24
  377. package/dist/receipt/pages/warranty.d.ts.map +0 -1
  378. package/dist/receipt/pages/warranty.js +0 -142
  379. package/dist/receipt/pages/warranty.js.map +0 -1
  380. package/dist/receipt/routes.d.ts +0 -3
  381. package/dist/receipt/routes.d.ts.map +0 -1
  382. package/dist/receipt/routes.js +0 -21
  383. package/dist/receipt/routes.js.map +0 -1
  384. package/dist/receipt/ticket.d.ts +0 -4
  385. package/dist/receipt/ticket.d.ts.map +0 -1
  386. package/dist/receipt/ticket.js +0 -282
  387. package/dist/receipt/ticket.js.map +0 -1
  388. package/dist/render/copyArea.d.ts +0 -64
  389. package/dist/render/copyArea.d.ts.map +0 -1
  390. package/dist/render/copyArea.js +0 -196
  391. package/dist/render/copyArea.js.map +0 -1
  392. package/dist/render/envelope.d.ts +0 -6
  393. package/dist/render/envelope.d.ts.map +0 -1
  394. package/dist/render/envelope.js +0 -42
  395. package/dist/render/envelope.js.map +0 -1
  396. package/dist/render/errors.d.ts +0 -5
  397. package/dist/render/errors.d.ts.map +0 -1
  398. package/dist/render/errors.js +0 -10
  399. package/dist/render/errors.js.map +0 -1
  400. package/dist/render/familyPage.d.ts +0 -20
  401. package/dist/render/familyPage.d.ts.map +0 -1
  402. package/dist/render/familyPage.js +0 -106
  403. package/dist/render/familyPage.js.map +0 -1
  404. package/dist/render/html.d.ts +0 -16
  405. package/dist/render/html.d.ts.map +0 -1
  406. package/dist/render/html.js +0 -135
  407. package/dist/render/html.js.map +0 -1
  408. package/dist/render/index.d.ts +0 -14
  409. package/dist/render/index.d.ts.map +0 -1
  410. package/dist/render/index.js +0 -13
  411. package/dist/render/index.js.map +0 -1
  412. package/dist/render/pageFamilies.d.ts +0 -8
  413. package/dist/render/pageFamilies.d.ts.map +0 -1
  414. package/dist/render/pageFamilies.js +0 -169
  415. package/dist/render/pageFamilies.js.map +0 -1
  416. package/dist/render/pager.d.ts +0 -9
  417. package/dist/render/pager.d.ts.map +0 -1
  418. package/dist/render/pager.js +0 -56
  419. package/dist/render/pager.js.map +0 -1
  420. package/dist/render/sceneNaming.d.ts +0 -14
  421. package/dist/render/sceneNaming.d.ts.map +0 -1
  422. package/dist/render/sceneNaming.js +0 -173
  423. package/dist/render/sceneNaming.js.map +0 -1
  424. package/dist/render/templates.d.ts +0 -5
  425. package/dist/render/templates.d.ts.map +0 -1
  426. package/dist/render/templates.js +0 -68
  427. package/dist/render/templates.js.map +0 -1
  428. package/dist/render/views.d.ts +0 -115
  429. package/dist/render/views.d.ts.map +0 -1
  430. package/dist/render/views.js +0 -81
  431. package/dist/render/views.js.map +0 -1
  432. package/dist/setup/commands.d.ts +0 -3
  433. package/dist/setup/commands.d.ts.map +0 -1
  434. package/dist/setup/commands.js +0 -9
  435. package/dist/setup/commands.js.map +0 -1
  436. package/dist/setup/index.d.ts +0 -3
  437. package/dist/setup/index.d.ts.map +0 -1
  438. package/dist/setup/index.js +0 -4
  439. package/dist/setup/index.js.map +0 -1
  440. package/dist/setup/pages/backup_receipt.d.ts +0 -24
  441. package/dist/setup/pages/backup_receipt.d.ts.map +0 -1
  442. package/dist/setup/pages/backup_receipt.js +0 -198
  443. package/dist/setup/pages/backup_receipt.js.map +0 -1
  444. package/dist/setup/pages/first_use_wizard.d.ts +0 -24
  445. package/dist/setup/pages/first_use_wizard.d.ts.map +0 -1
  446. package/dist/setup/pages/first_use_wizard.js +0 -169
  447. package/dist/setup/pages/first_use_wizard.js.map +0 -1
  448. package/dist/setup/pages/health_report.d.ts +0 -24
  449. package/dist/setup/pages/health_report.d.ts.map +0 -1
  450. package/dist/setup/pages/health_report.js +0 -152
  451. package/dist/setup/pages/health_report.js.map +0 -1
  452. package/dist/setup/pages/import_restore.d.ts +0 -24
  453. package/dist/setup/pages/import_restore.d.ts.map +0 -1
  454. package/dist/setup/pages/import_restore.js +0 -179
  455. package/dist/setup/pages/import_restore.js.map +0 -1
  456. package/dist/setup/routes.d.ts +0 -3
  457. package/dist/setup/routes.d.ts.map +0 -1
  458. package/dist/setup/routes.js +0 -2
  459. package/dist/setup/routes.js.map +0 -1
  460. package/dist/shared/commandSpec.d.ts +0 -34
  461. package/dist/shared/commandSpec.d.ts.map +0 -1
  462. package/dist/shared/commandSpec.js +0 -8
  463. package/dist/shared/commandSpec.js.map +0 -1
  464. package/dist/shared/fail.d.ts +0 -4
  465. package/dist/shared/fail.d.ts.map +0 -1
  466. package/dist/shared/fail.js +0 -16
  467. package/dist/shared/fail.js.map +0 -1
  468. package/dist/shared/params.d.ts +0 -4
  469. package/dist/shared/params.d.ts.map +0 -1
  470. package/dist/shared/params.js +0 -31
  471. package/dist/shared/params.js.map +0 -1
  472. package/dist/space/commands.d.ts +0 -3
  473. package/dist/space/commands.d.ts.map +0 -1
  474. package/dist/space/commands.js +0 -6
  475. package/dist/space/commands.js.map +0 -1
  476. package/dist/space/index.d.ts +0 -3
  477. package/dist/space/index.d.ts.map +0 -1
  478. package/dist/space/index.js +0 -4
  479. package/dist/space/index.js.map +0 -1
  480. package/dist/space/location.d.ts +0 -82
  481. package/dist/space/location.d.ts.map +0 -1
  482. package/dist/space/location.js +0 -324
  483. package/dist/space/location.js.map +0 -1
  484. package/dist/space/pages/fixed_spot.d.ts +0 -24
  485. package/dist/space/pages/fixed_spot.d.ts.map +0 -1
  486. package/dist/space/pages/fixed_spot.js +0 -122
  487. package/dist/space/pages/fixed_spot.js.map +0 -1
  488. package/dist/space/pages/location_manage.d.ts +0 -24
  489. package/dist/space/pages/location_manage.d.ts.map +0 -1
  490. package/dist/space/pages/location_manage.js +0 -182
  491. package/dist/space/pages/location_manage.js.map +0 -1
  492. package/dist/space/pages/space_view.d.ts +0 -24
  493. package/dist/space/pages/space_view.d.ts.map +0 -1
  494. package/dist/space/pages/space_view.js +0 -185
  495. package/dist/space/pages/space_view.js.map +0 -1
  496. package/dist/space/pages/suggest_storage.d.ts +0 -24
  497. package/dist/space/pages/suggest_storage.d.ts.map +0 -1
  498. package/dist/space/pages/suggest_storage.js +0 -179
  499. package/dist/space/pages/suggest_storage.js.map +0 -1
  500. package/dist/space/routes.d.ts +0 -3
  501. package/dist/space/routes.d.ts.map +0 -1
  502. package/dist/space/routes.js +0 -24
  503. package/dist/space/routes.js.map +0 -1
  504. package/dist/stats/commands.d.ts +0 -3
  505. package/dist/stats/commands.d.ts.map +0 -1
  506. package/dist/stats/commands.js +0 -6
  507. package/dist/stats/commands.js.map +0 -1
  508. package/dist/stats/index.d.ts +0 -3
  509. package/dist/stats/index.d.ts.map +0 -1
  510. package/dist/stats/index.js +0 -4
  511. package/dist/stats/index.js.map +0 -1
  512. package/dist/stats/pages/expiring.d.ts +0 -24
  513. package/dist/stats/pages/expiring.d.ts.map +0 -1
  514. package/dist/stats/pages/expiring.js +0 -220
  515. package/dist/stats/pages/expiring.js.map +0 -1
  516. package/dist/stats/pages/idle.d.ts +0 -24
  517. package/dist/stats/pages/idle.d.ts.map +0 -1
  518. package/dist/stats/pages/idle.js +0 -181
  519. package/dist/stats/pages/idle.js.map +0 -1
  520. package/dist/stats/pages/inventory_stat.d.ts +0 -24
  521. package/dist/stats/pages/inventory_stat.d.ts.map +0 -1
  522. package/dist/stats/pages/inventory_stat.js +0 -165
  523. package/dist/stats/pages/inventory_stat.js.map +0 -1
  524. package/dist/stats/pages/overview.d.ts +0 -24
  525. package/dist/stats/pages/overview.d.ts.map +0 -1
  526. package/dist/stats/pages/overview.js +0 -238
  527. package/dist/stats/pages/overview.js.map +0 -1
  528. package/dist/stats/routes.d.ts +0 -3
  529. package/dist/stats/routes.d.ts.map +0 -1
  530. package/dist/stats/routes.js +0 -16
  531. package/dist/stats/routes.js.map +0 -1
  532. package/dist/stats/stats.d.ts +0 -4
  533. package/dist/stats/stats.d.ts.map +0 -1
  534. package/dist/stats/stats.js +0 -92
  535. package/dist/stats/stats.js.map +0 -1
@@ -1,173 +0,0 @@
1
- // outfit能力·trip_outfit_plan页装配(#805 脚手架生成,#810 填内容)。
2
- //
3
- // 一族一个装配件:模板 `templates/outfit/trip_outfit_plan.html` 的装配入口。
4
- // 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
5
- // 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
6
- // 空态与异常态位:`renderFamilyPage` 按 REQUIRED_BLOCKS.empty 原样输出槽位,域票把真空态填进来。
7
- // 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
8
- //
9
- // #810 说明:可见文案一律中文(机审 ascii 门);`data-need` 属性保留块原文作机器锚点,
10
- // 其中 2 处可见改写(去英文与三段以上并列,见 scene-outfit.md 映射表);页族与命令标识只进
11
- // `data-*` 属性,不进可见文案(同 style-audit 干净页口径)。温度无外部来源:温度位写「—」,
12
- // 不写占位说明句(见 scene-outfit.md 老实现缺口)。
13
- import { readFileSync } from 'node:fs';
14
- import { fillTemplate, escapeHtml, latinFree, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
15
- export const FAMILY = 'trip_outfit_plan';
16
- export const PAGE_META = {
17
- domain: 'outfit',
18
- family: FAMILY,
19
- key: 'home.outfit.pick',
20
- shape: 'list',
21
- preset: { "kind": "trip-plan" },
22
- rows: [{ "key": "home.outfit.pick", "preset": { "kind": "trip-plan" } }],
23
- };
24
- export const REQUIRED_BLOCKS = {
25
- "empty": [
26
- "空态:没有可计划的衣物",
27
- "无冲突态:衣物充足无重复冲突",
28
- "异常:数据解析失败/数据校验失败"
29
- ],
30
- "fields": [
31
- "目的地/天数",
32
- "每日计划(第N天+温度+组合)",
33
- "冲突提示",
34
- "行李汇总",
35
- "汇总"
36
- ],
37
- "operations": [
38
- "日期按钮",
39
- "采纳这天",
40
- "生成行李清单",
41
- "复制数据",
42
- "复制日志"
43
- ],
44
- "status": [
45
- "每日温度"
46
- ]
47
- };
48
- /** 块原文→可见文案(只改会被机审 ascii 门判红的 2 处,其余原文直出;映射见 scene-outfit.md)。 */
49
- const DISPLAY = {
50
- '目的地/天数': '目的地天数',
51
- '每日计划(第N天+温度+组合)': '每日计划(天数温度组合)',
52
- };
53
- function sectionOf(group, title) {
54
- const items = REQUIRED_BLOCKS[group].map((b) => '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(DISPLAY[b] ?? b) + '</li>').join('');
55
- return '<section hidden data-block="' + group + '"><h2>' + title + '</h2><ul>' + items + '</ul></section>';
56
- }
57
- const SLOT_ORDER = ['outer', 'inner', 'bottom', 'shoes', 'hat', 'acce'];
58
- const SLOT_LABEL = { outer: '外套', inner: '内搭', bottom: '下装', shoes: '鞋', hat: '帽子', acce: '配饰' };
59
- const arr = (v) => (Array.isArray(v) ? v : []);
60
- const str = (v) => (typeof v === 'string' ? v : '');
61
- const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
62
- const CSS = '<style>'
63
- + '.of-eye{color:#8a744f;font-size:12px;letter-spacing:.12em;margin:4px 0 10px}'
64
- + '.of-metrics{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}'
65
- + '.of-metrics span{background:#fff;border:1px solid #e4d9c2;border-radius:99px;padding:8px 14px;font-size:13px;color:#8a744f;min-height:44px;display:inline-flex;align-items:center;box-sizing:border-box}'
66
- + '.of-card{background:linear-gradient(180deg,#fdfaf4,#f6efe0);border:1px solid #eadfc8;border-radius:20px;padding:16px;margin:0 0 12px;max-width:100%;box-sizing:border-box}'
67
- + '.of-card h2{font-size:16px;margin:0 0 10px;color:#4a3d28}'
68
- + '.of-days{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px}'
69
- + '.of-dayhead{font-size:15px;font-weight:700;color:#4a3d28;margin:6px 0;overflow-wrap:anywhere}'
70
- + '.of-temp{font-size:13px;color:#8a744f;margin-bottom:8px;overflow-wrap:anywhere}'
71
- + '.of-slots,.of-confs,.of-lugs{width:100%;border-collapse:collapse}'
72
- + '.of-slots th,.of-slots td,.of-confs td,.of-lugs td{padding:8px 4px;border-bottom:1px dashed #e4d9c2;min-height:44px;text-align:left;vertical-align:middle;box-sizing:border-box}'
73
- + '.of-slots tr:last-child th,.of-slots tr:last-child td,.of-lugs tr:last-child td{border-bottom:none}'
74
- + '.of-part{flex:0 0 52px;background:#8a744f;color:#fff;border-radius:8px;font-size:12px;text-align:center;padding:6px 0}'
75
- + '.of-nm{font-size:15px;font-weight:700;color:#4a3d28;overflow-wrap:anywhere}'
76
- + '.of-conf{background:#fdeee3;border:1px solid #f5d9c4;border-radius:12px;padding:10px 14px;font-size:13px;color:#b4552d;margin:6px 0;overflow-wrap:anywhere}'
77
- + '.of-note{font-size:13px;color:#8a744f;margin:10px 0 0;overflow-wrap:anywhere}'
78
- + '.of-lug{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}'
79
- + '.of-lug span{background:#fff;border:1px solid #e4d9c2;border-radius:10px;padding:8px 12px;font-size:13px;color:#4a3d28;min-height:44px;display:inline-flex;align-items:center;box-sizing:border-box;overflow-wrap:anywhere}'
80
- + '.of-btn{border:1px solid #e4d9c2;background:#fff;border-radius:99px;padding:8px 16px;font-size:14px;color:#8a744f;min-height:44px;box-sizing:border-box;cursor:pointer}'
81
- + '.of-btn.on{background:#8a744f;border-color:#8a744f;color:#fff;font-weight:700}'
82
- + '.of-btn.primary{background:#8a744f;border-color:#8a744f;color:#fff;font-weight:700}'
83
- + '.of-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-top:14px}'
84
- + '.of-empty{background:#fdfaf4;border:1px solid #eadfc8;border-radius:16px;padding:28px 16px;text-align:center;color:#8a744f;font-size:14px;overflow-wrap:anywhere}'
85
- + '@media(max-width:560px){.of-card{padding:12px}.of-part{flex-basis:46px}}'
86
- + '</style>';
87
- // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
88
- // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
89
- // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
90
- export function renderFamilyPage(env, ctx) {
91
- const template = readFileSync(new URL('../../../templates/outfit/trip_outfit_plan.html', import.meta.url), 'utf8');
92
- const data = (env.data ?? {});
93
- const p = (data.tripPlan ?? {});
94
- const destination = str(p.destination) || '远行';
95
- const plans = arr(p.plans).map((x) => ({
96
- day: num(x.day), tempDesc: str(x.tempDesc),
97
- style: str(x.style) || '日常', reason: str(x.reason),
98
- slots: (x.slots ?? {}),
99
- }));
100
- const conflicts = arr(p.conflicts).map((x) => str(x.hint)).filter(Boolean);
101
- const luggage = arr(p.luggage).map((x) => ({ id: num(x.id), name: str(x.name), days: num(x.days) || 1 }));
102
- const metrics = '<div class="of-metrics">'
103
- + '<span>' + escapeHtml(destination) + '</span>'
104
- + '<span>共' + plans.length + '天</span>'
105
- + '<span>行李' + luggage.length + '件</span>'
106
- + '</div>';
107
- let planHtml = '<div class="of-card"><h2>每日穿搭</h2>';
108
- if (!plans.length) {
109
- planHtml += '<div class="of-empty">没有可计划的衣物,先录入几件再来规划旅行穿搭</div>';
110
- }
111
- else {
112
- const first = plans[0];
113
- planHtml += '<div class="of-days">'
114
- + plans.map((x, i) => '<button class="of-btn' + (i === 0 ? ' on' : '') + '" data-day="' + i + '">第' + x.day + '天</button>').join('')
115
- + '</div><div id="ofDay">'
116
- + '<div class="of-dayhead">第' + first.day + '天 ' + escapeHtml(first.style) + '</div>'
117
- + '<div class="of-temp">温度' + escapeHtml(first.tempDesc || '—') + '</div>'
118
- + '<table class="of-slots">'
119
- + SLOT_ORDER.filter((k) => first.slots[k]).map((k) => '<tr><th class="of-part">'
120
- + SLOT_LABEL[k] + '</th><td class="of-nm">' + escapeHtml(first.slots[k].name || '') + '</td></tr>').join('')
121
- + (first.reason ? '<tr><td class="of-temp" colspan="2">' + escapeHtml(first.reason) + '</td></tr>' : '')
122
- + '</table></div>'
123
- + '<div class="of-actions"><button class="of-btn primary" id="ofAdopt">采纳这天</button></div>'
124
- + homeCopyArea({
125
- data: { envelope: env },
126
- log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
127
- });
128
- }
129
- planHtml += '</div>';
130
- let confHtml = '<div class="of-card"><h2>冲突提示</h2>';
131
- confHtml += conflicts.length
132
- ? '<table class="of-confs">' + conflicts.map((h) => '<tr><td class="of-conf">' + escapeHtml(h) + '</td></tr>').join('') + '</table>'
133
- : '<div class="of-empty">衣物数量充足,无重复冲突</div>';
134
- confHtml += '</div>';
135
- let lugHtml = '<div class="of-card"><h2>行李汇总</h2>';
136
- lugHtml += luggage.length
137
- ? '<table class="of-lugs">' + luggage.map((x) => '<tr><td class="of-nm">' + escapeHtml(latinFree(x.name)) + '</td><td class="of-temp">穿' + x.days + '天</td></tr>').join('') + '</table>'
138
- + '<div class="of-actions"><button class="of-btn" id="ofLug">生成行李清单</button></div>'
139
- : '<div class="of-empty">暂无</div>';
140
- lugHtml += '</div>';
141
- const payload = JSON.stringify({ destination, plans, conflicts, luggage }).replace(/</g, '\\u003c');
142
- const js = '<script>'
143
- + 'var TP=' + payload + ';var DAYI=0;'
144
- + 'function tpToast(m){var t=document.getElementById("tpToast");if(!t){t=document.createElement("div");t.style.cssText="position:fixed;left:50%;bottom:26px;transform:translateX(-50%);background:#4a3d28;color:#fdfaf4;padding:9px 18px;border-radius:99px;font-size:13px;z-index:120";document.body.appendChild(t);}t.textContent=m;t.style.opacity="1";setTimeout(function(){t.style.opacity="0";},1600);}'
145
- + 'function tpCopy(t){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t).then(function(){tpToast("已复制");}).catch(function(){tpToast("复制失败");});}else{var ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");tpToast("已复制");}catch(e){tpToast("复制失败");}ta.remove();}}'
146
- + 'var PART={outer:"外套",inner:"内搭",bottom:"下装",shoes:"鞋",hat:"帽子",acce:"配饰"};'
147
- + 'function tpEsc(s){return String(s).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");}'
148
- + 'function tpShow(i){DAYI=(i+TP.plans.length)%TP.plans.length;var p=TP.plans[DAYI];var el=document.getElementById("ofDay");if(!el)return;'
149
- + 'var h="<div class=\'of-dayhead\'>第"+p.day+"天 "+tpEsc(p.style)+"</div><div class=\'of-temp\'>温度"+(p.tempDesc?tpEsc(p.tempDesc):"—")+"</div>";'
150
- + '["outer","inner","bottom","shoes","hat","acce"].forEach(function(k){var c=p.slots[k];if(c)h+="<div class=\'of-slot\'><span class=\'of-part\'>"+PART[k]+"</span><span class=\'of-nm\'>"+tpEsc(c.name)+"</span></div>";});'
151
- + 'if(p.reason)h+="<div class=\'of-temp\'>"+tpEsc(p.reason)+"</div>";el.innerHTML=h;'
152
- + 'var btns=document.querySelectorAll("[data-day]");for(var k=0;k<btns.length;k++){btns[k].className="of-btn"+(Number(btns[k].getAttribute("data-day"))===DAYI?" on":"");}}'
153
- + 'document.querySelectorAll("[data-day]").forEach(function(b){b.onclick=function(){tpShow(Number(b.getAttribute("data-day")));};});'
154
- + 'var ad=document.getElementById("ofAdopt");if(ad)ad.onclick=function(){var p=TP.plans[DAYI];if(!p)return;'
155
- + 'var L=["旅行穿搭确认:采纳第"+p.day+"天("+p.style+")",""];'
156
- + '["outer","inner","bottom","shoes","hat","acce"].forEach(function(k){var c=p.slots[k];if(c)L.push("穿搭:"+c.name+"(标记使用)");});tpCopy(L.join("\\n"));}'
157
- // 上面这个 `}` 收的是 `function(){…}`;**必须**跟一个 `;`——整段脚本是一行拼出来的,
158
- // 没有换行,ASI 不会补分号,缺了它整段脚本不解析、页上按钮与勾选全死(同 travel_trip 那处)。
159
- + ';var cd=document.getElementById("ofCopyData");if(cd)cd.onclick=function(){tpCopy(JSON.stringify(TP.plans[DAYI]||{},null,2));};'
160
- + 'var cl=document.getElementById("ofCopyLog");if(cl)cl.onclick=function(){tpCopy("旅行穿搭日志:第"+(TP.plans[DAYI]||{}).day+"天");};'
161
- + 'var lg=document.getElementById("ofLug");if(lg)lg.onclick=function(){tpCopy("请生成出行行李清单,行程类型旅行天数"+TP.plans.length+"天。计划涉及衣物"+TP.luggage.map(function(x){return x.name;}).join(" "));};'
162
- + '</script>';
163
- const head = '<div class="of-eye">穿搭出行 旅行穿搭</div>';
164
- const marker = '<div data-family="' + FAMILY + '" data-key="' + escapeHtml(PAGE_META.key) + '"></div>';
165
- const content = CSS + head + metrics + planHtml + confHtml + lugHtml + marker
166
- + js
167
- + sectionOf('fields', '字段')
168
- + sectionOf('operations', '操作')
169
- + sectionOf('empty', '空态与异常')
170
- + sectionOf('status', '状态词');
171
- return fillTemplate(template, content);
172
- }
173
- //# sourceMappingURL=trip_outfit_plan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trip_outfit_plan.js","sourceRoot":"","sources":["../../../src/outfit/pages/trip_outfit_plan.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- import type { Envelope } from 'base-link-core';
2
- export declare const FAMILY: "wardrobe_analyze";
3
- export declare const PAGE_META: {
4
- readonly domain: "outfit";
5
- readonly family: "wardrobe_analyze";
6
- readonly key: "home.outfit.pick";
7
- readonly shape: "list";
8
- readonly preset: Record<string, unknown>;
9
- readonly rows: readonly {
10
- readonly key: string;
11
- readonly preset: Record<string, unknown>;
12
- }[];
13
- };
14
- export declare const REQUIRED_BLOCKS: {
15
- readonly fields: readonly string[];
16
- readonly operations: readonly string[];
17
- readonly empty: readonly string[];
18
- readonly status: readonly string[];
19
- };
20
- export declare function renderFamilyPage(env: Envelope, ctx?: {
21
- readonly command?: string;
22
- readonly actionAt?: string;
23
- }): string;
24
- //# sourceMappingURL=wardrobe_analyze.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wardrobe_analyze.d.ts","sourceRoot":"","sources":["../../../src/outfit/pages/wardrobe_analyze.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,kBAA2B,CAAC;AAElD,eAAO,MAAM,SAAS;;;;;qBAKW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACa,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACxI,CAAC;AAEX,eAAO,MAAM,eAAe,EAwBvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAkDF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAqFvH"}
@@ -1,171 +0,0 @@
1
- // outfit能力·wardrobe_analyze页装配(#805 脚手架生成,#810 填内容)。
2
- //
3
- // 一族一个装配件:模板 `templates/outfit/wardrobe_analyze.html` 的装配入口。
4
- // 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
5
- // 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
6
- // 空态与异常态位:`renderFamilyPage` 按 REQUIRED_BLOCKS.empty 原样输出槽位,域票把真空态填进来。
7
- // 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
8
- //
9
- // #810 说明:可见文案一律中文(机审 ascii 门);`data-need` 属性保留块原文作机器锚点,
10
- // 其中 1 处可见改写(「智能建议一句话」,见 scene-outfit.md 映射表);页族与命令标识只进
11
- // `data-*` 属性,不进可见文案(同 style-audit 干净页口径)。
12
- import { readFileSync } from 'node:fs';
13
- import { fillTemplate, escapeHtml, latinFree, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
14
- export const FAMILY = 'wardrobe_analyze';
15
- export const PAGE_META = {
16
- domain: 'outfit',
17
- family: FAMILY,
18
- key: 'home.outfit.pick',
19
- shape: 'list',
20
- preset: { "kind": "wardrobe" },
21
- rows: [{ "key": "home.outfit.pick", "preset": { "kind": "wardrobe" } }],
22
- };
23
- export const REQUIRED_BLOCKS = {
24
- "empty": [
25
- "空态:衣橱还没有在家衣物",
26
- "无闲置态:衣橱状态良好",
27
- "异常:数据解析失败/数据校验失败"
28
- ],
29
- "fields": [
30
- "衣橱构成",
31
- "闲置清单",
32
- "AI建议一句",
33
- "汇总"
34
- ],
35
- "operations": [
36
- "标记废弃",
37
- "送人",
38
- "先不处理",
39
- "缺口加入购物清单",
40
- "复制数据",
41
- "复制日志"
42
- ],
43
- "status": [
44
- "物品状态",
45
- "在家口径"
46
- ]
47
- };
48
- /** 块原文→可见文案(只改会被机审 ascii 门判红的 1 处,其余原文直出;映射见 scene-outfit.md)。 */
49
- const DISPLAY = {
50
- 'AI建议一句': '智能建议一句话',
51
- };
52
- function sectionOf(group, title) {
53
- const items = REQUIRED_BLOCKS[group].map((b) => '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(DISPLAY[b] ?? b) + '</li>').join('');
54
- return '<section hidden data-block="' + group + '"><h2>' + title + '</h2><ul>' + items + '</ul></section>';
55
- }
56
- const arr = (v) => (Array.isArray(v) ? v : []);
57
- const str = (v) => (typeof v === 'string' ? v : '');
58
- const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
59
- const CSS = '<style>'
60
- + '.of-eye{color:#8a744f;font-size:12px;letter-spacing:.12em;margin:4px 0 10px}'
61
- + '.of-metrics{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}'
62
- + '.of-metrics span{background:#fff;border:1px solid #e4d9c2;border-radius:99px;padding:8px 14px;font-size:13px;color:#8a744f;min-height:44px;display:inline-flex;align-items:center;box-sizing:border-box}'
63
- + '.of-card{background:linear-gradient(180deg,#fdfaf4,#f6efe0);border:1px solid #eadfc8;border-radius:20px;padding:16px;margin:0 0 12px;max-width:100%;box-sizing:border-box}'
64
- + '.of-card h2{font-size:16px;margin:0 0 10px;color:#4a3d28}'
65
- + '.of-bar{margin:8px 0}'
66
- + '.of-bar .of-row{display:grid;grid-template-columns:minmax(0,1fr) auto 46px;gap:10px;align-items:baseline;font-size:13px;color:#4a3d28;margin-bottom:4px;overflow-wrap:anywhere}'
67
- + '.of-p{text-align:right;color:#8a744f;font-variant-numeric:tabular-nums}'
68
- + '.of-track{background:#eee5d2;border-radius:99px;height:12px;overflow:hidden}'
69
- + '.of-fill{background:#8a744f;border-radius:99px;height:12px}'
70
- + '.of-advice{background:#f3ecdc;border:1px solid #e4d9c2;border-radius:12px;padding:10px 14px;font-size:14px;color:#6d5c3d;overflow-wrap:anywhere}'
71
- + '.of-idle{display:flex;gap:10px;align-items:center;padding:10px 4px;border-bottom:1px dashed #e4d9c2;min-height:56px;box-sizing:border-box;cursor:pointer}'
72
- + '.of-idle:last-of-type{border-bottom:none}'
73
- + '.of-check{flex:0 0 24px;height:24px;border:2px solid #c9b896;border-radius:6px;background:#fff;box-sizing:border-box}'
74
- + '.of-idle.on .of-check{background:#8a744f;border-color:#8a744f}'
75
- + '.of-nm{font-size:15px;font-weight:700;color:#4a3d28;overflow-wrap:anywhere}'
76
- + '.of-est{background:#b4552d;color:#fff;border-radius:4px;padding:1px 6px;font-size:11px;margin-left:6px}'
77
- + '.of-m{width:100%;border-collapse:collapse}.of-m td{padding:1px 0;border:0;vertical-align:top}'
78
- + '.of-k{width:64px;color:#8a744f;font-size:12px;white-space:nowrap}'
79
- + '.of-v{color:#6d5c3d;font-size:13px;overflow-wrap:anywhere}'
80
- + '.of-btn{border:1px solid #e4d9c2;background:#fff;border-radius:99px;padding:8px 16px;font-size:14px;color:#8a744f;min-height:44px;box-sizing:border-box;cursor:pointer}'
81
- + '.of-btn.primary{background:#8a744f;border-color:#8a744f;color:#fff;font-weight:700}'
82
- + '.of-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-top:14px}'
83
- + '.of-empty{background:#fdfaf4;border:1px solid #eadfc8;border-radius:16px;padding:28px 16px;text-align:center;color:#8a744f;font-size:14px;overflow-wrap:anywhere}'
84
- + '@media(max-width:560px){.of-card{padding:12px}}'
85
- + '</style>';
86
- // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
87
- // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
88
- // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
89
- export function renderFamilyPage(env, ctx) {
90
- const template = readFileSync(new URL('../../../templates/outfit/wardrobe_analyze.html', import.meta.url), 'utf8');
91
- const data = (env.data ?? {});
92
- const w = (data.wardrobe ?? {});
93
- const dist = arr(w.distribution).map((x) => ({ label: str(x.label), count: num(x.count), pct: num(x.pct) }));
94
- const dormant = arr(w.dormant).map((x) => ({
95
- id: num(x.id), name: str(x.name), slot: str(x.slot) || '衣物',
96
- daysIdle: typeof x.daysIdle === 'number' ? x.daysIdle : null,
97
- lastUsed: str(x.lastUsed) || '从未使用', location: str(x.location), estimated: x.estimated === true,
98
- }));
99
- const advice = str(w.advice);
100
- const summary = arr(w.summary);
101
- const metrics = '<div class="of-metrics">'
102
- + summary.map((m) => '<span>' + escapeHtml(str(m.label)) + escapeHtml(str(m.value)) + '</span>').join('')
103
- + '</div>';
104
- let distHtml = '<div class="of-card"><h2>衣橱构成</h2>';
105
- if (!dist.length)
106
- distHtml += '<div class="of-empty">衣橱还没有在家衣物,先去录入第一批再来看构成</div>';
107
- else {
108
- const max = Math.max(1, ...dist.map((d) => d.count));
109
- // #817(⑥分隔符不懒政):原来件数与占比贴成一个串(「外套 5件36%」)——占比移独立列、右对齐。
110
- distHtml += dist.map((d) => '<div class="of-bar"><div class="of-row"><span class="of-lb">' + escapeHtml(d.label)
111
- + '</span><span class="of-n">' + escapeHtml(d.count + '件') + '</span><span class="of-p">' + escapeHtml(d.pct + '%') + '</span></div>'
112
- + '<div class="of-track"><div class="of-fill" style="width:' + Math.round((d.count * 100) / max) + '%"></div></div></div>').join('');
113
- }
114
- distHtml += '</div>';
115
- // #886:复制区提到「闲置清单空不空」的分支之外——空态下也留数据位与日志位(口径同同批 45 族:
116
- // 复制区不跟着内容多少开合)。原来两样都关在 `else` 里,空态这页一条复制通道都没有
117
- // (`scaffold.test.mjs` ⑥ 门实测点名 outfit_picker/wardrobe_analyze/wardrobe_season 三族)。
118
- const copyZone = homeCopyArea({
119
- data: { envelope: env },
120
- log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
121
- });
122
- let dormantHtml = '<div class="of-card"><h2>闲置清单</h2>';
123
- if (!dormant.length)
124
- dormantHtml += '<div class="of-empty">衣橱状态良好,没有长期闲置衣物</div>';
125
- else {
126
- // #817(⑥分隔符不懒政):副文原来把类别/闲置/最后使用/位置用逗号+斜杠挤成一行
127
- // (「闲置许久,从未使用过,放在玄关/鞋柜」)——拆成字段列(一格一个事实、左标签右值);
128
- // 值仍写在 `<td>` 里(判据件的重复句豁免按单元格算,两件物品的值可逐字相同)。
129
- // 位置值本身仍是「房间/容器」复合串,拆成两个字段要数据层给拆好的字段。
130
- dormantHtml += dormant.map((x, i) => '<div class="of-idle" data-pick="' + i + '"><span class="of-check"></span>'
131
- + '<div style="flex:1"><div class="of-nm">' + escapeHtml(latinFree(x.name))
132
- + (x.estimated ? '<span class="of-est">估算</span>' : '') + '</div>'
133
- + '<table class="of-m">'
134
- + (x.name.includes(x.slot) ? '' : '<tr><td class="of-k">类别</td><td class="of-v">' + escapeHtml(x.slot) + '</td></tr>')
135
- + '<tr><td class="of-k">闲置时长</td><td class="of-v">' + (x.daysIdle === null ? '许久' : x.daysIdle + ' 天') + '</td></tr>'
136
- + '<tr><td class="of-k">最后使用</td><td class="of-v">' + (x.lastUsed === '从未使用' ? '从未使用' : escapeHtml(x.lastUsed)) + '</td></tr>'
137
- + (x.location ? '<tr><td class="of-k">位置</td><td class="of-v">' + escapeHtml(x.location) + '</td></tr>' : '')
138
- + '</table></div></div>').join('')
139
- + '<div class="of-actions"><button class="of-btn primary" id="ofDrop">标记废弃</button>'
140
- + '<button class="of-btn" id="ofGive">送人</button><button class="of-btn" id="ofHold">先不处理</button>'
141
- + '<button class="of-btn" id="ofShop">加入购物清单</button></div>';
142
- }
143
- dormantHtml += copyZone + '</div>';
144
- const adviceHtml = advice ? '<div class="of-card"><h2>智能建议</h2><div class="of-advice">' + escapeHtml(advice) + '</div></div>' : '';
145
- const payload = JSON.stringify({ dormant, advice }).replace(/</g, '\\u003c');
146
- const js = '<script>'
147
- + 'var WD=' + payload + ';var PICK={};'
148
- + 'function wdToast(m){var t=document.getElementById("wdToast");if(!t){t=document.createElement("div");t.style.cssText="position:fixed;left:50%;bottom:26px;transform:translateX(-50%);background:#4a3d28;color:#fdfaf4;padding:9px 18px;border-radius:99px;font-size:13px;z-index:120";document.body.appendChild(t);}t.textContent=m;t.style.opacity="1";setTimeout(function(){t.style.opacity="0";},1600);}'
149
- + 'function wdCopy(t){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t).then(function(){wdToast("已复制");}).catch(function(){wdToast("复制失败");});}else{var ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");wdToast("已复制");}catch(e){wdToast("复制失败");}ta.remove();}}'
150
- + 'function wdPicked(){return Object.keys(PICK).filter(function(k){return PICK[k];}).map(function(k){return WD.dormant[Number(k)];}).filter(Boolean);}'
151
- + 'document.querySelectorAll(".of-idle").forEach(function(el){el.onclick=function(){var i=el.getAttribute("data-pick");PICK[i]=!PICK[i];el.className="of-idle"+(PICK[i]?" on":"");};});'
152
- + 'function wdAct(kind){var p=wdPicked();if(!p.length){wdToast("请先勾选要处理的衣物");return;}'
153
- + 'var L=["闲置处理:"+kind+" "+p.length+"件",""];p.forEach(function(x){L.push("处理:"+x.name+"("+(kind==="送人"?"标记废弃加备注送人":kind==="标记废弃"?"标记废弃":"暂不处理")+")");});wdCopy(L.join("\\n"));}'
154
- + 'var dr=document.getElementById("ofDrop");if(dr)dr.onclick=function(){wdAct("标记废弃");};'
155
- + 'var gv=document.getElementById("ofGive");if(gv)gv.onclick=function(){wdAct("送人");};'
156
- + 'var hd=document.getElementById("ofHold");if(hd)hd.onclick=function(){wdAct("先不处理");};'
157
- + 'var sh=document.getElementById("ofShop");if(sh)sh.onclick=function(){wdCopy("请加入购物清单:参考衣橱分析缺口建议「"+WD.advice+"」");};'
158
- + 'var cd=document.getElementById("ofCopyData");if(cd)cd.onclick=function(){wdCopy(JSON.stringify(WD.dormant,null,2));};'
159
- + 'var cl=document.getElementById("ofCopyLog");if(cl)cl.onclick=function(){wdCopy("衣橱分析日志:闲置"+WD.dormant.length+"件");};'
160
- + '</script>';
161
- const head = '<div class="of-eye">穿搭出行 衣橱分析</div>';
162
- const marker = '<div data-family="' + FAMILY + '" data-key="' + escapeHtml(PAGE_META.key) + '"></div>';
163
- const content = CSS + head + metrics + distHtml + adviceHtml + dormantHtml + marker
164
- + js
165
- + sectionOf('fields', '字段')
166
- + sectionOf('operations', '操作')
167
- + sectionOf('empty', '空态与异常')
168
- + sectionOf('status', '状态词');
169
- return fillTemplate(template, content);
170
- }
171
- //# sourceMappingURL=wardrobe_analyze.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wardrobe_analyze.js","sourceRoot":"","sources":["../../../src/outfit/pages/wardrobe_analyze.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,6DAA6D;AAC7D,6DAA6D;AAC7D,qDAAqD;AACrD,uEAAuE;AACvE,0CAA0C;AAC1C,EAAE;AACF,yDAAyD;AACzD,wDAAwD;AACxD,2CAA2C;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErH,MAAM,CAAC,MAAM,MAAM,GAAG,kBAA2B,CAAC;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,kBAAkB;IACvB,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,EAAC,MAAM,EAAC,UAAU,EAA4B;IACtD,IAAI,EAAE,CAAC,EAAC,KAAK,EAAC,kBAAkB,EAAC,QAAQ,EAAC,EAAC,MAAM,EAAC,UAAU,EAAC,EAAC,CAAkF;CACxI,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE;QACP,cAAc;QACd,aAAa;QACb,kBAAkB;KACnB;IACD,QAAQ,EAAE;QACR,MAAM;QACN,MAAM;QACN,QAAQ;QACR,IAAI;KACL;IACD,YAAY,EAAE;QACZ,MAAM;QACN,IAAI;QACJ,MAAM;QACN,UAAU;QACV,MAAM;QACN,MAAM;KACP;IACD,QAAQ,EAAE;QACR,MAAM;QACN,MAAM;KACP;CAMF,CAAC;AAEF,kEAAkE;AAClE,MAAM,OAAO,GAA2B;IACtC,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF,SAAS,SAAS,CAAC,KAAmD,EAAE,KAAa;IACnF,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3I,OAAO,8BAA8B,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,iBAAiB,CAAC;AAC7G,CAAC;AAKD,MAAM,GAAG,GAAG,CAAC,CAAU,EAA6B,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAA8B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAChH,MAAM,GAAG,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACrE,MAAM,GAAG,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1F,MAAM,GAAG,GAAG,SAAS;MACjB,8EAA8E;MAC9E,kEAAkE;MAClE,0MAA0M;MAC1M,4KAA4K;MAC5K,2DAA2D;MAC3D,uBAAuB;MACvB,iLAAiL;MACjL,yEAAyE;MACzE,8EAA8E;MAC9E,6DAA6D;MAC7D,kJAAkJ;MAClJ,2JAA2J;MAC3J,2CAA2C;MAC3C,uHAAuH;MACvH,gEAAgE;MAChE,6EAA6E;MAC7E,yGAAyG;MACzG,+FAA+F;MAC/F,mEAAmE;MACnE,4DAA4D;MAC5D,yKAAyK;MACzK,qFAAqF;MACrF,0FAA0F;MAC1F,mKAAmK;MACnK,iDAAiD;MACjD,UAAU,CAAC;AAEf,uCAAuC;AACvC,8CAA8C;AAC9C,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,GAA+D;IAC7G,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,iDAAiD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACnH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;IACzD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAW,CAAA,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;QAC3D,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;QAC5D,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI;KACpF,CAAA,CAAC,CAAC;IACf,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,OAAO,GAAG,0BAA0B;UACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;UACvG,QAAQ,CAAC;IAEb,IAAI,QAAQ,GAAG,oCAAoC,CAAC;IACpD,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,QAAQ,IAAI,oDAAoD,CAAC;SAC9E,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,sDAAsD;QACtD,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,8DAA8D,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;cAC5G,4BAA4B,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,4BAA4B,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,eAAe;cACnI,0DAA0D,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzI,CAAC;IACD,QAAQ,IAAI,QAAQ,CAAC;IAErB,qDAAqD;IACrD,+CAA+C;IAC/C,mFAAmF;IACnF,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC5B,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;QACvB,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,gBAAgB,GAAG,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,EAAE,EAAE,CAAC,EAAE;KACvJ,CAAC,CAAC;IACH,IAAI,WAAW,GAAG,oCAAoC,CAAC;IACvD,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,WAAW,IAAI,6CAA6C,CAAC;SAC7E,CAAC;QACJ,6CAA6C;QAC7C,gDAAgD;QAChD,8CAA8C;QAC9C,uCAAuC;QACvC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,kCAAkC,GAAG,CAAC,GAAG,kCAAkC;cAC5G,yCAAyC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;cACzE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ;cAChE,sBAAsB;cACtB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,+CAA+C,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;cACpH,iDAAiD,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,YAAY;cACnH,iDAAiD,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,YAAY;cAC5H,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,+CAA+C,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;cAC3G,sBAAsB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;cAChC,kFAAkF;cAClF,gGAAgG;cAChG,0DAA0D,CAAC;IACjE,CAAC;IACD,WAAW,IAAI,QAAQ,GAAG,QAAQ,CAAC;IAEnC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,2DAA2D,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnI,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,EAAE,GAAG,UAAU;UACjB,SAAS,GAAG,OAAO,GAAG,eAAe;UACrC,4YAA4Y;UAC5Y,iXAAiX;UACjX,qJAAqJ;UACrJ,sLAAsL;UACtL,oFAAoF;UACpF,8KAA8K;UAC9K,uFAAuF;UACvF,qFAAqF;UACrF,uFAAuF;UACvF,qHAAqH;UACrH,uHAAuH;UACvH,sHAAsH;UACtH,WAAW,CAAC;IAEhB,MAAM,IAAI,GAAG,qCAAqC,CAAC;IACnD,MAAM,MAAM,GAAG,oBAAoB,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;IACvG,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM;UAC/E,EAAE;UACF,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;UACzB,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC;UAC7B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;UAC3B,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
@@ -1,24 +0,0 @@
1
- import type { Envelope } from 'base-link-core';
2
- export declare const FAMILY: "wardrobe_season";
3
- export declare const PAGE_META: {
4
- readonly domain: "outfit";
5
- readonly family: "wardrobe_season";
6
- readonly key: "home.outfit.pick";
7
- readonly shape: "list";
8
- readonly preset: Record<string, unknown>;
9
- readonly rows: readonly {
10
- readonly key: string;
11
- readonly preset: Record<string, unknown>;
12
- }[];
13
- };
14
- export declare const REQUIRED_BLOCKS: {
15
- readonly fields: readonly string[];
16
- readonly operations: readonly string[];
17
- readonly empty: readonly string[];
18
- readonly status: readonly string[];
19
- };
20
- export declare function renderFamilyPage(env: Envelope, ctx?: {
21
- readonly command?: string;
22
- readonly actionAt?: string;
23
- }): string;
24
- //# sourceMappingURL=wardrobe_season.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wardrobe_season.d.ts","sourceRoot":"","sources":["../../../src/outfit/pages/wardrobe_season.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,iBAA0B,CAAC;AAEjD,eAAO,MAAM,SAAS;;;;;qBAKS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACa,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACtI,CAAC;AAEX,eAAO,MAAM,eAAe,EAyBvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AA2DF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAwEvH"}
@@ -1,167 +0,0 @@
1
- // outfit能力·wardrobe_season页装配(#805 脚手架生成,#810 填内容)。
2
- //
3
- // 一族一个装配件:模板 `templates/outfit/wardrobe_season.html` 的装配入口。
4
- // 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
5
- // 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
6
- // 空态与异常态位:`renderFamilyPage` 按 REQUIRED_BLOCKS.empty 原样输出槽位,域票把真空态填进来。
7
- // 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
8
- //
9
- // #810 说明:本族块原文无英文标识,可见直接沿用原文;页族与命令标识只进 `data-*`
10
- // 属性,不进可见文案(同 style-audit 干净页口径)。
11
- import { readFileSync } from 'node:fs';
12
- import { fillTemplate, escapeHtml, latinFree, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
13
- export const FAMILY = 'wardrobe_season';
14
- export const PAGE_META = {
15
- domain: 'outfit',
16
- family: FAMILY,
17
- key: 'home.outfit.pick',
18
- shape: 'list',
19
- preset: { "kind": "season" },
20
- rows: [{ "key": "home.outfit.pick", "preset": { "kind": "season" } }],
21
- };
22
- export const REQUIRED_BLOCKS = {
23
- "empty": [
24
- "空态:没有带季节标签的在家衣物+打标签引导",
25
- "异常:数据解析失败/数据校验失败"
26
- ],
27
- "fields": [
28
- "季节",
29
- "操作(收纳/拿出)",
30
- "季节衣物清单",
31
- "收纳位置下拉",
32
- "候选位置",
33
- "汇总"
34
- ],
35
- "operations": [
36
- "收纳位置下拉",
37
- "自定义",
38
- "全选/全不选",
39
- "确认收纳/确认拿出",
40
- "复制数据",
41
- "复制日志"
42
- ],
43
- "status": [
44
- "物品状态",
45
- "已收纳"
46
- ]
47
- };
48
- function sectionOf(group, title) {
49
- const items = REQUIRED_BLOCKS[group].map((b) => '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(b) + '</li>').join('');
50
- return '<section hidden data-block="' + group + '"><h2>' + title + '</h2><ul>' + items + '</ul></section>';
51
- }
52
- const arr = (v) => (Array.isArray(v) ? v : []);
53
- const str = (v) => (typeof v === 'string' ? v : '');
54
- /** 类别/标签各自成一枚徽章(不拿空格把多个标签拼成一行)。类别名缺位时退回标签,再缺位写「衣物」。 */
55
- function catBadges(x) {
56
- const bits = x.categoryName !== '' ? [x.categoryName] : x.tags;
57
- const use = bits.length > 0 ? bits : ['衣物'];
58
- return use.map((t) => '<span class="of-tag">' + escapeHtml(latinFree(t)) + '</span>').join('');
59
- }
60
- /** 位置值分段呈现(`›` 连接):值本身是「房间/容器」路径串,正文里不留斜杠拼接(同 items 域 receipt.ts 的写法)。 */
61
- function locSegs(loc) {
62
- return loc.split('/').map((s) => s.trim()).filter(Boolean)
63
- .map((s) => '<span class="of-seg">' + escapeHtml(s) + '</span>')
64
- .join('<span class="of-sep">›</span>');
65
- }
66
- const CSS = '<style>'
67
- + '.of-eye{color:#8a744f;font-size:12px;letter-spacing:.12em;margin:4px 0 10px}'
68
- + '.of-metrics{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}'
69
- + '.of-metrics span{background:#fff;border:1px solid #e4d9c2;border-radius:99px;padding:8px 14px;font-size:13px;color:#8a744f;min-height:44px;display:inline-flex;align-items:center;box-sizing:border-box}'
70
- + '.of-card{background:linear-gradient(180deg,#fdfaf4,#f6efe0);border:1px solid #eadfc8;border-radius:20px;padding:16px;margin:0 0 12px;max-width:100%;box-sizing:border-box}'
71
- + '.of-card h2{font-size:16px;margin:0 0 10px;color:#4a3d28}'
72
- + '.of-opt{display:flex;gap:10px;align-items:center;flex-wrap:wrap;font-size:14px;color:#4a3d28}'
73
- + '.of-opt select{font-size:14px;min-height:44px;border:1px solid #e4d9c2;border-radius:10px;background:#fff;color:#4a3d28;max-width:100%;box-sizing:border-box}'
74
- + '.of-line{display:flex;gap:10px;align-items:center;padding:10px 4px;border-bottom:1px dashed #e4d9c2;min-height:56px;box-sizing:border-box;cursor:pointer}'
75
- + '.of-line:last-of-type{border-bottom:none}'
76
- + '.of-check{flex:0 0 24px;height:24px;border:2px solid #c9b896;border-radius:6px;background:#fff;box-sizing:border-box}'
77
- + '.of-line.on .of-check{background:#8a744f;border-color:#8a744f}'
78
- + '.of-nm{font-size:15px;font-weight:700;color:#4a3d28;overflow-wrap:anywhere}'
79
- + '.of-body{flex:1;min-width:0}'
80
- // #817(⑥分隔符不懒政)第二波:类别升成徽章、位置独立成列——此前一句副文把「类别,放在位置」
81
- // 用逗号挤在一行(位置值内部又是「房间/容器」斜杠拼接)。现在两件各占一个元素:
82
- // 类别一行徽章(多个标签各成一个徽章,不拿空格拼),位置一行带字段名,值按 `›` 分段。
83
- + '.of-sub{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-top:4px}'
84
- + '.of-tag{display:inline-block;background:#fff;border:1px solid #e4d9c2;border-radius:99px;padding:1px 9px;font-size:12px;color:#8a744f}'
85
- + '.of-loc{display:flex;gap:4px;align-items:baseline;margin-top:3px;font-size:12px;color:#4a3d28;overflow-wrap:anywhere}'
86
- + '.of-lb{flex:0 0 28px;color:#a8957a;font-size:12px}'
87
- + '.of-seg{display:inline-block}'
88
- + '.of-sep{color:#c9b896;margin:0 3px;font-size:11px}'
89
- + '.of-btn{border:1px solid #e4d9c2;background:#fff;border-radius:99px;padding:8px 16px;font-size:14px;color:#8a744f;min-height:44px;box-sizing:border-box;cursor:pointer}'
90
- + '.of-btn.primary{background:#8a744f;border-color:#8a744f;color:#fff;font-weight:700}'
91
- + '.of-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-top:14px}'
92
- + '.of-empty{background:#fdfaf4;border:1px solid #eadfc8;border-radius:16px;padding:28px 16px;text-align:center;color:#8a744f;font-size:14px;overflow-wrap:anywhere}'
93
- + '@media(max-width:560px){.of-card{padding:12px}}'
94
- + '</style>';
95
- // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
96
- // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
97
- // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
98
- export function renderFamilyPage(env, ctx) {
99
- const template = readFileSync(new URL('../../../templates/outfit/wardrobe_season.html', import.meta.url), 'utf8');
100
- const data = (env.data ?? {});
101
- const s = (data.season ?? {});
102
- const season = str(s.season) || '冬季';
103
- const action = s.action === '拿出' ? '拿出' : '收纳';
104
- const items = arr(s.items).map((x) => ({
105
- id: typeof x.id === 'number' ? x.id : 0, name: str(x.name),
106
- categoryName: str(x.categoryName), tags: Array.isArray(x.tags) ? x.tags.map(String) : [],
107
- location: str(x.location),
108
- }));
109
- const places = arr(s.places).map(String).filter(Boolean);
110
- const metrics = '<div class="of-metrics">'
111
- + '<span>' + escapeHtml(season) + '</span>'
112
- + '<span>' + action + items.length + '件</span>'
113
- + '<span>候选位置' + places.length + '处</span>'
114
- + '</div>';
115
- let placeHtml = '<div class="of-card"><h2>目标位置</h2><div class="of-opt"><span>收纳位置</span><select id="ofPlace">'
116
- + places.map((p) => '<option>' + escapeHtml(p) + '</option>').join('')
117
- + (places.length ? '' : '<option>自定义(复制回执时填)</option>')
118
- + '</select></div></div>';
119
- // #886:复制区提到「这一季有没有衣物」的分支之外(口径同同批 45 族:复制区不跟着内容多少开合)。
120
- // 原来两样都关在 `else` 里,空清单这页一条复制通道都没有(`scaffold.test.mjs` ⑥ 门实测点名三族)。
121
- const copyZone = homeCopyArea({
122
- data: { envelope: env },
123
- log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
124
- });
125
- let listHtml = '<div class="of-card"><h2>' + escapeHtml(season) + '衣物清单</h2>';
126
- if (!items.length) {
127
- listHtml += '<div class="of-empty">没有带「' + escapeHtml(season) + '」标签的在家衣物,建议先给衣物打季节标签再来换季</div>';
128
- }
129
- else {
130
- listHtml += items.map((x, i) => '<div class="of-line" data-pick="' + i + '"><span class="of-check"></span>'
131
- + '<div class="of-body"><div class="of-nm">' + escapeHtml(latinFree(x.name)) + '</div>'
132
- + '<div class="of-sub">' + catBadges(x) + '</div>'
133
- + '<div class="of-loc"><span class="of-lb">位置</span>'
134
- + (x.location !== '' ? locSegs(x.location) : '<span class="of-seg">未记</span>') + '</div></div></div>').join('')
135
- + '<div class="of-actions"><button class="of-btn" id="ofAll">全选切换</button>'
136
- + '<button class="of-btn primary" id="ofGo">确认' + action + '</button></div>';
137
- }
138
- listHtml += copyZone + '</div>';
139
- const payload = JSON.stringify({ season, action, items }).replace(/</g, '\\u003c');
140
- const js = '<script>'
141
- + 'var SN=' + payload + ';var PICK={};'
142
- + 'function snToast(m){var t=document.getElementById("snToast");if(!t){t=document.createElement("div");t.style.cssText="position:fixed;left:50%;bottom:26px;transform:translateX(-50%);background:#4a3d28;color:#fdfaf4;padding:9px 18px;border-radius:99px;font-size:13px;z-index:120";document.body.appendChild(t);}t.textContent=m;t.style.opacity="1";setTimeout(function(){t.style.opacity="0";},1600);}'
143
- + 'function snCopy(t){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t).then(function(){snToast("已复制");}).catch(function(){snToast("复制失败");});}else{var ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");snToast("已复制");}catch(e){snToast("复制失败");}ta.remove();}}'
144
- + 'document.querySelectorAll(".of-line").forEach(function(el){el.onclick=function(){var i=el.getAttribute("data-pick");PICK[i]=!PICK[i];el.className="of-line"+(PICK[i]?" on":"");};});'
145
- + 'var al=document.getElementById("ofAll");if(al)al.onclick=function(){var any=SN.items.some(function(_,i){return !PICK[i];});'
146
- + 'SN.items.forEach(function(_,i){PICK[i]=any;});document.querySelectorAll(".of-line").forEach(function(el){var i=el.getAttribute("data-pick");el.className="of-line"+(PICK[i]?" on":"");});};'
147
- + 'var go=document.getElementById("ofGo");if(go)go.onclick=function(){var p=SN.items.filter(function(_,i){return PICK[i];});'
148
- + 'if(!p.length){snToast("请先勾选衣物");return;}var sel=document.getElementById("ofPlace");var place=sel?sel.value:"";'
149
- + 'var L=[SN.action+"确认:"+SN.season+"季 "+p.length+"件",""];'
150
- + 'if(SN.action==="收纳"&&place)L.push("目标位置:"+place);'
151
- + 'p.forEach(function(x){if(SN.action==="收纳")L.push("收纳:"+x.name+"(移入"+(place||"收纳位")+"加已收纳标)");else L.push("拿出:"+x.name+"(恢复在家去已收纳标)");});snCopy(L.join("\\n"));}'
152
- // 上面这个 `}` 收的是 `function(){…}`;**必须**跟一个 `;`——整段脚本是一行拼出来的,
153
- // 没有换行,ASI 不会补分号,缺了它整段脚本不解析、页上按钮与勾选全死(同 travel_trip 那处)。
154
- + ';var cd=document.getElementById("ofCopyData");if(cd)cd.onclick=function(){snCopy(JSON.stringify(SN.items,null,2));};'
155
- + 'var cl=document.getElementById("ofCopyLog");if(cl)cl.onclick=function(){snCopy("换季日志:"+SN.season+"季"+SN.action+SN.items.length+"件");};'
156
- + '</script>';
157
- const head = '<div class="of-eye">穿搭出行 换季</div>';
158
- const marker = '<div data-family="' + FAMILY + '" data-key="' + escapeHtml(PAGE_META.key) + '"></div>';
159
- const content = CSS + head + metrics + placeHtml + listHtml + marker
160
- + js
161
- + sectionOf('fields', '字段')
162
- + sectionOf('operations', '操作')
163
- + sectionOf('empty', '空态与异常')
164
- + sectionOf('status', '状态词');
165
- return fillTemplate(template, content);
166
- }
167
- //# sourceMappingURL=wardrobe_season.js.map