foliko 1.1.6 → 1.1.8

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 (307) hide show
  1. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
  2. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
  3. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
  4. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
  5. package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
  6. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
  7. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
  8. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  9. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  10. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  11. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  12. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  13. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  14. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  15. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
  16. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  17. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  18. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  19. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  20. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
  21. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
  22. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  23. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  24. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
  25. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  26. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  27. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
  28. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
  29. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
  30. package/.agent/ARCHITECTURE.md +288 -0
  31. package/.agent/agents/ambient-agent.md +57 -0
  32. package/.agent/agents/debugger.md +55 -0
  33. package/.agent/agents/email-assistant.md +49 -0
  34. package/.agent/agents/file-manager.md +42 -0
  35. package/.agent/agents/python-developer.md +60 -0
  36. package/.agent/agents/scheduler.md +59 -0
  37. package/.agent/agents/web-developer.md +45 -0
  38. package/.agent/data/default.json +412 -3
  39. package/.agent/data/plugins-state.json +177 -174
  40. package/.agent/data/puppeteer-sessions/undefined.json +6 -0
  41. package/.agent/data/weixin-media/2026-04-08/img_1775618677512.jpg +0 -0
  42. package/.agent/data/weixin-media/2026-04-08/img_1775619073340.jpg +0 -0
  43. package/.agent/data/weixin-media/2026-04-08/img_1775619097536.jpg +0 -0
  44. package/.agent/data/weixin-media/2026-04-08/img_1775619209388.jpg +0 -0
  45. package/.agent/mcp_config.json +11 -3
  46. package/.agent/memory/feedback/mnrdvj5i-ca3dkd.md +9 -0
  47. package/.agent/memory/feedback/mnre365e-7s4zax.md +9 -0
  48. package/.agent/memory/feedback/mnre36jn-nkfgmp.md +9 -0
  49. package/.agent/memory/feedback/mnre3805-kjiq6h.md +9 -0
  50. package/.agent/memory/feedback/mnsf66kp-b10rcd.md +9 -0
  51. package/.agent/memory/feedback/mnsi3sz8-p5g2cw.md +9 -0
  52. package/.agent/memory/feedback/mnsibe47-sv2ni1.md +9 -0
  53. package/.agent/memory/feedback/mnsic89w-nn228o.md +9 -0
  54. package/.agent/memory/feedback/mnsj1xe9-x83ba0.md +9 -0
  55. package/.agent/memory/feedback/mnsj21iv-wnwelx.md +9 -0
  56. package/.agent/memory/feedback/mnsj2g4a-cog7a2.md +9 -0
  57. package/.agent/memory/feedback/mnsj4js7-lktjp6.md +9 -0
  58. package/.agent/memory/feedback/mnsj5d4y-uglwvp.md +9 -0
  59. package/.agent/memory/feedback/mnslkuo9-uous66.md +24 -0
  60. package/.agent/memory/feedback/mnsm3vq0-megoil.md +9 -0
  61. package/.agent/memory/feedback/mnsnn5x2-sxcihd.md +9 -0
  62. package/.agent/memory/feedback/mnsnq17s-nabrn9.md +9 -0
  63. package/.agent/memory/feedback/mnsnybet-wz7rn3.md +9 -0
  64. package/.agent/memory/feedback/mnsrw0s7-7s9e30.md +9 -0
  65. package/.agent/memory/feedback/mnu5hpnd-tlm16q.md +9 -0
  66. package/.agent/memory/feedback/mnu60uqe-xuoxp4.md +9 -0
  67. package/.agent/memory/project/mnqx54u5-loqtoe.md +9 -0
  68. package/.agent/memory/project/mnqx84cv-mx6dmd.md +9 -0
  69. package/.agent/memory/project/mnsacuyr-hgtk5n.md +20 -0
  70. package/.agent/memory/project/mnu5hy2x-bjsg7u.md +9 -0
  71. package/.agent/memory/reference/mnre3cww-penbo1.md +9 -0
  72. package/.agent/memory/reference/mns9wn48-luerua.md +14 -0
  73. package/.agent/memory/reference/mns9yz5c-thc2s0.md +16 -0
  74. package/.agent/memory/reference/mnsfy4um-910f1o.md +23 -0
  75. package/.agent/memory/reference/mnsg37dp-lmfj18.md +32 -0
  76. package/.agent/memory/reference/mnsll60q-0j911u.md +36 -0
  77. package/.agent/memory/reference/mnsmlb5y-nej31u.md +16 -0
  78. package/.agent/memory/reference/mnssle72-yrot96.md +9 -0
  79. package/.agent/memory/user/mnsfuon6-l416q1.md +21 -0
  80. package/.agent/memory/user/mnsg9kut-95m7rf.md +20 -0
  81. package/.agent/memory/user/mnu2eo1v-yy6fhe.md +9 -0
  82. package/.agent/memory/user/mnu2etuo-8u8jk8.md +9 -0
  83. package/.agent/plugins/poster-plugin/fonts/NotoColorEmoji-Regular.ttf +0 -0
  84. package/.agent/plugins/poster-plugin/fonts/Symbola_hint.ttf +0 -0
  85. package/.agent/plugins/poster-plugin/package.json +3 -3
  86. package/.agent/plugins/poster-plugin/src/canvas.js +8 -0
  87. package/.agent/plugins/poster-plugin/src/components/barcode.js +5 -2
  88. package/.agent/plugins/poster-plugin/src/components/bubble.js +3 -2
  89. package/.agent/plugins/poster-plugin/src/components/button.js +74 -30
  90. package/.agent/plugins/poster-plugin/src/components/columns.js +97 -83
  91. package/.agent/plugins/poster-plugin/src/components/grid.js +104 -92
  92. package/.agent/plugins/poster-plugin/src/components/highlightText.js +2 -1
  93. package/.agent/plugins/poster-plugin/src/components/imageFrame.js +143 -93
  94. package/.agent/plugins/poster-plugin/src/components/quote.js +85 -13
  95. package/.agent/plugins/poster-plugin/src/components/ribbon.js +13 -9
  96. package/.agent/plugins/poster-plugin/src/components/seal.js +5 -3
  97. package/.agent/plugins/poster-plugin/src/components/star.js +3 -3
  98. package/.agent/plugins/poster-plugin/src/components/table.js +1 -1
  99. package/.agent/plugins/poster-plugin/src/components/watermark.js +4 -2
  100. package/.agent/plugins/poster-plugin/src/composer.js +181 -13
  101. package/.agent/plugins/poster-plugin/src/elements/artText.js +16 -7
  102. package/.agent/plugins/poster-plugin/src/elements/background.js +20 -5
  103. package/.agent/plugins/poster-plugin/src/elements/richText.js +160 -107
  104. package/.agent/plugins/poster-plugin/src/elements/text.js +48 -45
  105. package/.agent/plugins/poster-plugin/src/fonts.js +556 -125
  106. package/.agent/plugins/poster-plugin/src/index.js +46 -1
  107. package/.agent/plugins/poster-plugin/yarn.lock +186 -356
  108. package/.agent/plugins/puppeteer-plugin/README.md +147 -0
  109. package/.agent/plugins/puppeteer-plugin/index.js +1422 -0
  110. package/.agent/plugins/puppeteer-plugin/package.json +9 -0
  111. package/.agent/plugins.json +5 -11
  112. package/.agent/rules/GEMINI.md +273 -0
  113. package/.agent/rules/allow-rule.md +77 -0
  114. package/.agent/rules/log-rule.md +83 -0
  115. package/.agent/rules/security-rule.md +93 -0
  116. package/.agent/scripts/auto_preview.py +148 -0
  117. package/.agent/scripts/checklist.py +217 -0
  118. package/.agent/scripts/session_manager.py +120 -0
  119. package/.agent/scripts/verify_all.py +327 -0
  120. package/.agent/sessions/cli_default.json +128 -5479
  121. package/.agent/skills/api-patterns/SKILL.md +81 -0
  122. package/.agent/skills/api-patterns/api-style.md +42 -0
  123. package/.agent/skills/api-patterns/auth.md +24 -0
  124. package/.agent/skills/api-patterns/documentation.md +26 -0
  125. package/.agent/skills/api-patterns/graphql.md +41 -0
  126. package/.agent/skills/api-patterns/rate-limiting.md +31 -0
  127. package/.agent/skills/api-patterns/response.md +37 -0
  128. package/.agent/skills/api-patterns/rest.md +40 -0
  129. package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  130. package/.agent/skills/api-patterns/security-testing.md +122 -0
  131. package/.agent/skills/api-patterns/trpc.md +41 -0
  132. package/.agent/skills/api-patterns/versioning.md +22 -0
  133. package/.agent/skills/app-builder/SKILL.md +75 -0
  134. package/.agent/skills/app-builder/agent-coordination.md +71 -0
  135. package/.agent/skills/app-builder/feature-building.md +53 -0
  136. package/.agent/skills/app-builder/project-detection.md +34 -0
  137. package/.agent/skills/app-builder/scaffolding.md +118 -0
  138. package/.agent/skills/app-builder/tech-stack.md +40 -0
  139. package/.agent/skills/app-builder/templates/SKILL.md +39 -0
  140. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  141. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  142. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  143. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  144. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  145. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  146. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  147. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  148. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  149. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  150. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  151. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  152. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  153. package/.agent/skills/architecture/SKILL.md +55 -0
  154. package/.agent/skills/architecture/context-discovery.md +43 -0
  155. package/.agent/skills/architecture/examples.md +94 -0
  156. package/.agent/skills/architecture/pattern-selection.md +68 -0
  157. package/.agent/skills/architecture/patterns-reference.md +50 -0
  158. package/.agent/skills/architecture/trade-off-analysis.md +77 -0
  159. package/.agent/skills/clean-code/SKILL.md +201 -0
  160. package/.agent/skills/doc.md +177 -0
  161. package/.agent/skills/frontend-design/SKILL.md +418 -0
  162. package/.agent/skills/frontend-design/animation-guide.md +331 -0
  163. package/.agent/skills/frontend-design/color-system.md +311 -0
  164. package/.agent/skills/frontend-design/decision-trees.md +418 -0
  165. package/.agent/skills/frontend-design/motion-graphics.md +306 -0
  166. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  167. package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  168. package/.agent/skills/frontend-design/typography-system.md +345 -0
  169. package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
  170. package/.agent/skills/frontend-design/visual-effects.md +383 -0
  171. package/.agent/skills/i18n-localization/SKILL.md +154 -0
  172. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  173. package/.agent/skills/mcp-builder/SKILL.md +176 -0
  174. package/.agent/skills/poster-design/SKILL.md +385 -0
  175. package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  176. package/.agent/workflows/brainstorm.md +113 -0
  177. package/.agent/workflows/create.md +59 -0
  178. package/.agent/workflows/debug.md +103 -0
  179. package/.agent/workflows/deploy.md +176 -0
  180. package/.agent/workflows/enhance.md +63 -0
  181. package/.agent/workflows/orchestrate.md +237 -0
  182. package/.agent/workflows/plan.md +89 -0
  183. package/.agent/workflows/preview.md +81 -0
  184. package/.agent/workflows/simple-test.md +42 -0
  185. package/.agent/workflows/status.md +86 -0
  186. package/.agent/workflows/structured-orchestrate.md +180 -0
  187. package/.agent/workflows/test.md +144 -0
  188. package/.agent/workflows/ui-ux-pro-max.md +296 -0
  189. package/.env.example +56 -56
  190. package/README.md +441 -441
  191. package/SPEC.md +735 -696
  192. package/output/foliko-poster.png +0 -0
  193. package/outputs/emoji-font-showcase.png +0 -0
  194. package/outputs/foliko-muji-style.png +0 -0
  195. package/package.json +3 -2
  196. package/plugins/ambient-agent/EventWatcher.js +33 -37
  197. package/plugins/ambient-agent/ExplorerLoop.js +338 -36
  198. package/plugins/ambient-agent/GoalManager.js +7 -3
  199. package/plugins/ambient-agent/StateStore.js +30 -1
  200. package/plugins/ambient-agent/constants.js +15 -1
  201. package/plugins/ambient-agent/index.js +26 -33
  202. package/plugins/coordinator-plugin.js +3 -3
  203. package/plugins/default-plugins.js +4 -3
  204. package/plugins/email/index.js +150 -36
  205. package/plugins/email/monitor.js +79 -5
  206. package/plugins/email/reply.js +15 -25
  207. package/plugins/extension-executor-plugin.js +184 -32
  208. package/plugins/feishu-plugin.js +2 -2
  209. package/plugins/file-system-plugin.js +57 -24
  210. package/plugins/memory-plugin.js +176 -64
  211. package/plugins/python-plugin-loader.js +79 -9
  212. package/plugins/scheduler-plugin.js +64 -24
  213. package/plugins/telegram-plugin.js +2 -2
  214. package/plugins/think-plugin.js +7 -2
  215. package/plugins/web-plugin.js +263 -4
  216. package/plugins/weixin-plugin.js +2 -2
  217. package/skills/ambient-agent/SKILL.md +342 -314
  218. package/skills/find-skills/AGENTS.md +162 -162
  219. package/skills/find-skills/SKILL.md +133 -133
  220. package/src/core/agent-chat.js +64 -9
  221. package/src/core/agent.js +216 -69
  222. package/src/core/tool-registry.js +5 -5
  223. package/src/executors/mcp-executor.js +453 -35
  224. package/src/utils/id.js +5 -0
  225. package/system.md +3629 -0
  226. package/.agent/agents/code-assistant.json +0 -17
  227. package/.agent/agents/email-assistant.json +0 -14
  228. package/.agent/agents/file-assistant.json +0 -18
  229. package/.agent/agents/orchestrator-demo.md +0 -53
  230. package/.agent/agents/orchestrator.json +0 -7
  231. package/.agent/agents/system-assistant.json +0 -15
  232. package/.agent/agents/web-assistant.json +0 -12
  233. package/.agent/data/ambient/goals.json +0 -50
  234. package/.agent/data/ambient/memories.json +0 -7
  235. package/.agent/data/scheduler/tasks.json +0 -1
  236. package/.agent/memory/core.md +0 -1
  237. package/.agent/memory/feedback/mnrsiuoc-e1ru74.md +0 -9
  238. package/.agent/memory/feedback/mnrt2mmz-98az6n.md +0 -9
  239. package/.agent/memory/feedback/mnrtqrhm-kxsicz.md +0 -9
  240. package/.agent/memory/feedback/mnrts8vg-i0ngzp.md +0 -15
  241. package/.agent/memory/feedback/mnrtt7jt-c0trb2.md +0 -9
  242. package/.agent/memory/feedback/mnruc2f0-5s52la.md +0 -16
  243. package/.agent/memory/feedback/mnrumbmx-63sa0v.md +0 -9
  244. package/.agent/memory/project/mnn93ogy-ypjn27.md +0 -9
  245. package/.agent/memory/project/mnn98fqy-5nhc1u.md +0 -25
  246. package/.agent/memory/project/mnrp7p5n-8enm2a.md +0 -31
  247. package/.agent/memory/project/mnrp9ifb-yynks0.md +0 -40
  248. package/.agent/memory/project/mnrpb3b8-f617s4.md +0 -25
  249. package/.agent/memory/project/mnrrmqgg-focprv.md +0 -9
  250. package/.agent/memory/project/mnrtykbh-6atsor.md +0 -9
  251. package/.agent/memory/project/mnru9jiu-kgau16.md +0 -35
  252. package/.agent/memory/reference/mnq3oenw-46haj6.md +0 -63
  253. package/.agent/memory/reference/mnq5qxm2-mjoooh.md +0 -116
  254. package/.agent/memory/reference/mnrnvpwo-rcqv9m.md +0 -52
  255. package/.agent/memory/reference/mnrovxvz-zy9xqm.md +0 -25
  256. package/.agent/memory/reference/mnroxabj-1b3930.md +0 -68
  257. package/.agent/memory/reference/mnrpjtlp-mnb9od.md +0 -35
  258. package/.agent/memory/reference/mnrps1x3-6b8xfm.md +0 -28
  259. package/.agent/memory/reference/mnrpt9ov-15er5w.md +0 -22
  260. package/.agent/memory/reference/mnrq82dn-y9tv9e.md +0 -50
  261. package/.agent/memory/reference/mnrqnr5v-v75drf.md +0 -34
  262. package/.agent/memory/reference/mnrrfzys-urudaf.md +0 -31
  263. package/.agent/memory/reference/mnrrocha-t0027n.md +0 -21
  264. package/.agent/memory/reference/mnrukklc-bxndsb.md +0 -35
  265. package/.agent/memory/user/mnm67t9m-x8rekk.md +0 -9
  266. package/.agent/memory/user/mnn5mmqh-w6aktx.md +0 -11
  267. package/.agent/memory/user/mnnbfhhn-dk1bd1.md +0 -22
  268. package/.agent/memory/user/mnrt39t8-8eosy0.md +0 -9
  269. package/.agent/package.json +0 -8
  270. package/.agent/plugins/__pycache__/file_writer.cpython-312.pyc +0 -0
  271. package/.agent/plugins/daytona/README.md +0 -89
  272. package/.agent/plugins/daytona/index.js +0 -377
  273. package/.agent/plugins/daytona/package.json +0 -12
  274. package/.agent/plugins/marknative/README.md +0 -134
  275. package/.agent/plugins/marknative/fonts/SegoeUI Emoji.ttf +0 -0
  276. package/.agent/plugins/marknative/fonts.zip +0 -0
  277. package/.agent/plugins/marknative/index.js +0 -256
  278. package/.agent/plugins/marknative/package.json +0 -12
  279. package/.agent/plugins/poster-plugin/emojis/rocket.png +0 -1
  280. package/.agent/plugins/poster-plugin/test-background.svg +0 -1
  281. package/.agent/plugins/poster-plugin/test-full-poster.svg +0 -2
  282. package/.agent/plugins/poster-plugin/test-image.png +0 -0
  283. package/.agent/plugins/system-info/index.js +0 -387
  284. package/.agent/plugins/system-info/package.json +0 -4
  285. package/.agent/plugins/system-info/test.js +0 -40
  286. package/.agent/python-scripts/test_sample.py +0 -24
  287. package/.agent/skills/agent-browser/SKILL.md +0 -311
  288. package/.agent/skills/agent-browser/TEST_PLAN.md +0 -200
  289. package/.agent/skills/sysinfo/SKILL.md +0 -38
  290. package/.agent/skills/sysinfo/system-info.sh +0 -130
  291. package/.agent/skills/workflow/SKILL.md +0 -324
  292. package/.agent/test-agent.js +0 -35
  293. package/.agent/weixin.json +0 -6
  294. package/.agent/workflows/email-digest.json +0 -50
  295. package/.agent/workflows/file-backup.json +0 -21
  296. package/.agent/workflows/get-ip-notify.json +0 -32
  297. package/.agent/workflows/news-aggregator.json +0 -93
  298. package/.agent/workflows/news-dashboard-v2.json +0 -94
  299. package/.agent/workflows/notification-batch.json +0 -32
  300. package/foliko-cloud-rising.png +0 -0
  301. package/foliko-dawn-of-ai.png +0 -0
  302. package/foliko-mindful-observation.png +0 -0
  303. package/foliko-stellar-dreams.png +0 -0
  304. package/foliko-zen-jing.png +0 -0
  305. package/foliko-zen-kong.png +0 -0
  306. package/foliko-zen-wu.png +0 -0
  307. package/zen_karesansui.png +0 -0
@@ -3,24 +3,30 @@
3
3
  * 支持左右分栏、三栏、四栏等多种布局
4
4
  */
5
5
 
6
- const createColumns = (ctx) => ({
7
- /**
8
- * @param {Object} params
9
- * @param {number} params.x - 起始X坐标
10
- * @param {number} params.y - 起始Y坐标
11
- * @param {number} params.width - 总宽度
12
- * @param {number} params.height - 总高度
13
- * @param {number} [params.columns=2] - 列数
14
- * @param {number} [params.gap=20] - 列间距
15
- * @param {string} [params.background] - 背景色
16
- * @param {string} [params.borderColor] - 边框颜色
17
- * @param {number} [params.borderWidth] - 边框宽度
18
- * @param {number} [params.radius=0] - 圆角
19
- * @param {Array} [params.items] - 列内容配置 [{widthRatio, content}]
20
- * @param {string} [params.direction='horizontal'] - 排列方向: horizontal, vertical
21
- * @param {string} [params.align='top'] - 垂直对齐: top, center, bottom
22
- */
23
- draw({
6
+ const paper = require('paper')
7
+
8
+ /**
9
+ * 创建分栏布局组件
10
+ *
11
+ * @param {Object} project - Paper.js 项目
12
+ * @param {Object} canvas - 画布对象
13
+ * @param {Object} params - 组件参数
14
+ * @param {number} params.x - 起始X坐标
15
+ * @param {number} params.y - 起始Y坐标
16
+ * @param {number} params.width - 总宽度
17
+ * @param {number} params.height - 总高度
18
+ * @param {number} [params.columns=2] - 列数
19
+ * @param {number} [params.gap=20] - 列间距
20
+ * @param {string} [params.background] - 背景色
21
+ * @param {string} [params.borderColor] - 边框颜色
22
+ * @param {number} [params.borderWidth] - 边框宽度
23
+ * @param {number} [params.radius=0] - 圆角
24
+ * @param {Array} [params.items] - 列内容配置 [{widthRatio, content}]
25
+ * @param {string} [params.direction='horizontal'] - 排列方向: horizontal, vertical
26
+ * @param {string} [params.align='top'] - 垂直对齐: top, center, bottom
27
+ */
28
+ function createColumns(project, canvas, params) {
29
+ const {
24
30
  x,
25
31
  y,
26
32
  width,
@@ -31,77 +37,85 @@ const createColumns = (ctx) => ({
31
37
  borderColor,
32
38
  borderWidth = 1,
33
39
  radius = 0,
34
- items = [],
35
40
  direction = 'horizontal',
36
41
  align = 'top'
37
- }) {
38
- const elements = []
39
-
40
- // 计算每列宽度
41
- const totalGap = gap * (columns - 1)
42
- const columnWidth = (width - totalGap) / columns
43
-
44
- // 绘制背景
45
- if (background) {
46
- const bg = new ctx.Path.Rectangle({
47
- point: [x, y],
48
- size: [width, height],
49
- radius: radius
50
- })
51
- bg.fillColor = new ctx.Color(background)
52
- elements.push({ type: 'rectangle', id: bg.id })
53
- }
54
-
55
- // 绘制边框
56
- if (borderColor && borderWidth > 0) {
57
- const border = new ctx.Path.Rectangle({
58
- point: [x, y],
59
- size: [width, height],
60
- radius: radius
61
- })
62
- border.fillColor = new ctx.Color('transparent')
63
- border.strokeColor = new ctx.Color(borderColor)
64
- border.strokeWidth = borderWidth
65
- elements.push({ type: 'rectangle', id: border.id })
42
+ } = params
43
+
44
+ const elements = []
45
+
46
+ // 计算每列宽度
47
+ const totalGap = gap * (columns - 1)
48
+ const columnWidth = (width - totalGap) / columns
49
+
50
+ // 绘制背景
51
+ if (background) {
52
+ const bg = new paper.Path.Rectangle({
53
+ point: [x, y],
54
+ size: [width, height],
55
+ radius: radius
56
+ })
57
+ bg.fillColor = new paper.Color(background)
58
+ if (project && project.activeLayer) {
59
+ project.activeLayer.addChild(bg)
66
60
  }
67
-
68
- // 生成分割线
69
- for (let i = 1; i < columns; i++) {
70
- const lineX = x + columnWidth * i + gap * (i - 1) + gap / 2
71
- const line = new ctx.Path.Line({
72
- from: [lineX, y + 20],
73
- to: [lineX, y + height - 20]
74
- })
75
- line.strokeColor = new ctx.Color('#e0e0e0')
76
- line.strokeWidth = 1
77
- elements.push({ type: 'line', id: line.id })
61
+ elements.push({ type: 'rectangle', id: bg.id })
62
+ }
63
+
64
+ // 绘制边框
65
+ if (borderColor && borderWidth > 0) {
66
+ const border = new paper.Path.Rectangle({
67
+ point: [x, y],
68
+ size: [width, height],
69
+ radius: radius
70
+ })
71
+ border.fillColor = new paper.Color('transparent')
72
+ border.strokeColor = new paper.Color(borderColor)
73
+ border.strokeWidth = borderWidth
74
+ if (project && project.activeLayer) {
75
+ project.activeLayer.addChild(border)
78
76
  }
79
-
80
- // 返回列位置信息
81
- const columnPositions = []
82
- for (let i = 0; i < columns; i++) {
83
- const colX = x + (columnWidth + gap) * i
84
- const colY = align === 'center' ? y + (height - height) / 2 : align === 'bottom' ? y + height - height : y
85
-
86
- columnPositions.push({
87
- index: i,
88
- x: colX,
89
- y: colY,
90
- width: columnWidth,
91
- height: height
92
- })
77
+ elements.push({ type: 'rectangle', id: border.id })
78
+ }
79
+
80
+ // 生成分割线
81
+ for (let i = 1; i < columns; i++) {
82
+ const lineX = x + columnWidth * i + gap * (i - 1) + gap / 2
83
+ const line = new paper.Path.Line({
84
+ from: [lineX, y + 20],
85
+ to: [lineX, y + height - 20]
86
+ })
87
+ line.strokeColor = new paper.Color('#e0e0e0')
88
+ line.strokeWidth = 1
89
+ if (project && project.activeLayer) {
90
+ project.activeLayer.addChild(line)
93
91
  }
92
+ elements.push({ type: 'line', id: line.id })
93
+ }
94
+
95
+ // 返回列位置信息
96
+ const columnPositions = []
97
+ for (let i = 0; i < columns; i++) {
98
+ const colX = x + (columnWidth + gap) * i
99
+ const colY = align === 'center' ? y + (height - height) / 2 : align === 'bottom' ? y + height - height : y
94
100
 
95
- return {
96
- success: true,
97
- elements,
98
- columnPositions,
99
- columnWidth,
100
- totalWidth: width,
101
- totalHeight: height,
102
- type: 'columns'
103
- }
101
+ columnPositions.push({
102
+ index: i,
103
+ x: colX,
104
+ y: colY,
105
+ width: columnWidth,
106
+ height: height
107
+ })
108
+ }
109
+
110
+ return {
111
+ success: true,
112
+ elements,
113
+ columnPositions,
114
+ columnWidth,
115
+ totalWidth: width,
116
+ totalHeight: height,
117
+ type: 'columns'
104
118
  }
105
- })
119
+ }
106
120
 
107
121
  module.exports = createColumns
@@ -3,24 +3,30 @@
3
3
  * 支持任意行列的网格布局
4
4
  */
5
5
 
6
- const createGrid = (ctx) => ({
7
- /**
8
- * @param {Object} params
9
- * @param {number} params.x - 起始X坐标
10
- * @param {number} params.y - 起始Y坐标
11
- * @param {number} params.width - 总宽度
12
- * @param {number} params.height - 总高度
13
- * @param {number} [params.columns=3] - 列数
14
- * @param {number} [params.rows=2] - 行数
15
- * @param {number} [params.gapX=20] - 水平间距
16
- * @param {number} [params.gapY=20] - 垂直间距
17
- * @param {string} [params.background] - 背景色
18
- * @param {string} [params.borderColor] - 边框颜色
19
- * @param {number} [params.borderWidth] - 边框宽度
20
- * @param {number} [params.radius=0] - 圆角
21
- * @param {string} [params.direction='row'] - 排列方向: row(行优先), column(列优先)
22
- */
23
- draw({
6
+ const paper = require('paper')
7
+
8
+ /**
9
+ * 创建网格布局组件
10
+ *
11
+ * @param {Object} project - Paper.js 项目
12
+ * @param {Object} canvas - 画布对象
13
+ * @param {Object} params - 组件参数
14
+ * @param {number} params.x - 起始X坐标
15
+ * @param {number} params.y - 起始Y坐标
16
+ * @param {number} params.width - 总宽度
17
+ * @param {number} params.height - 总高度
18
+ * @param {number} [params.columns=3] - 列数
19
+ * @param {number} [params.rows=2] - 行数
20
+ * @param {number} [params.gapX=20] - 水平间距
21
+ * @param {number} [params.gapY=20] - 垂直间距
22
+ * @param {string} [params.background] - 背景色
23
+ * @param {string} [params.borderColor] - 边框颜色
24
+ * @param {number} [params.borderWidth] - 边框宽度
25
+ * @param {number} [params.radius=0] - 圆角
26
+ * @param {string} [params.direction='row'] - 排列方向: row(行优先), column(列优先)
27
+ */
28
+ function createGrid(project, canvas, params) {
29
+ const {
24
30
  x,
25
31
  y,
26
32
  width,
@@ -34,85 +40,91 @@ const createGrid = (ctx) => ({
34
40
  borderWidth = 1,
35
41
  radius = 0,
36
42
  direction = 'row'
37
- }) {
38
- const elements = []
39
-
40
- // 计算单元格尺寸
41
- const totalGapX = gapX * (columns - 1)
42
- const totalGapY = gapY * (rows - 1)
43
- const cellWidth = (width - totalGapX) / columns
44
- const cellHeight = (height - totalGapY) / rows
45
-
46
- // 绘制背景
47
- if (background) {
48
- const bg = new ctx.Path.Rectangle({
49
- point: [x, y],
50
- size: [width, height],
51
- radius: radius
52
- })
53
- bg.fillColor = new ctx.Color(background)
54
- elements.push({ type: 'rectangle', id: bg.id })
43
+ } = params
44
+
45
+ const elements = []
46
+
47
+ // 计算单元格尺寸
48
+ const totalGapX = gapX * (columns - 1)
49
+ const totalGapY = gapY * (rows - 1)
50
+ const cellWidth = (width - totalGapX) / columns
51
+ const cellHeight = (height - totalGapY) / rows
52
+
53
+ // 绘制背景
54
+ if (background) {
55
+ const bg = new paper.Path.Rectangle({
56
+ point: [x, y],
57
+ size: [width, height],
58
+ radius: radius
59
+ })
60
+ bg.fillColor = new paper.Color(background)
61
+ if (project && project.activeLayer) {
62
+ project.activeLayer.addChild(bg)
55
63
  }
56
-
57
- // 绘制边框
58
- if (borderColor && borderWidth > 0) {
59
- const border = new ctx.Path.Rectangle({
60
- point: [x, y],
61
- size: [width, height],
62
- radius: radius
63
- })
64
- border.fillColor = new ctx.Color('transparent')
65
- border.strokeColor = new ctx.Color(borderColor)
66
- border.strokeWidth = borderWidth
67
- elements.push({ type: 'rectangle', id: border.id })
64
+ elements.push({ type: 'rectangle', id: bg.id })
65
+ }
66
+
67
+ // 绘制边框
68
+ if (borderColor && borderWidth > 0) {
69
+ const border = new paper.Path.Rectangle({
70
+ point: [x, y],
71
+ size: [width, height],
72
+ radius: radius
73
+ })
74
+ border.fillColor = new paper.Color('transparent')
75
+ border.strokeColor = new paper.Color(borderColor)
76
+ border.strokeWidth = borderWidth
77
+ if (project && project.activeLayer) {
78
+ project.activeLayer.addChild(border)
68
79
  }
80
+ elements.push({ type: 'rectangle', id: border.id })
81
+ }
82
+
83
+ // 生成网格位置信息
84
+ const cellPositions = []
85
+ const totalCells = columns * rows
86
+
87
+ for (let i = 0; i < totalCells; i++) {
88
+ let col, row
69
89
 
70
- // 生成网格位置信息
71
- const cellPositions = []
72
- const totalCells = columns * rows
73
-
74
- for (let i = 0; i < totalCells; i++) {
75
- let col, row
76
-
77
- if (direction === 'row') {
78
- col = i % columns
79
- row = Math.floor(i / columns)
80
- } else {
81
- row = i % rows
82
- col = Math.floor(i / rows)
83
- }
84
-
85
- const cellX = x + col * (cellWidth + gapX)
86
- const cellY = y + row * (cellHeight + gapY)
87
-
88
- cellPositions.push({
89
- index: i,
90
- column: col,
91
- row: row,
92
- x: cellX,
93
- y: cellY,
94
- width: cellWidth,
95
- height: cellHeight,
96
- centerX: cellX + cellWidth / 2,
97
- centerY: cellY + cellHeight / 2
98
- })
90
+ if (direction === 'row') {
91
+ col = i % columns
92
+ row = Math.floor(i / columns)
93
+ } else {
94
+ row = i % rows
95
+ col = Math.floor(i / rows)
99
96
  }
100
97
 
101
- // 返回网格布局信息
102
- return {
103
- success: true,
104
- elements,
105
- cellPositions,
106
- cellWidth,
107
- cellHeight,
108
- columns,
109
- rows,
110
- totalCells,
111
- totalWidth: width,
112
- totalHeight: height,
113
- type: 'grid'
114
- }
98
+ const cellX = x + col * (cellWidth + gapX)
99
+ const cellY = y + row * (cellHeight + gapY)
100
+
101
+ cellPositions.push({
102
+ index: i,
103
+ column: col,
104
+ row: row,
105
+ x: cellX,
106
+ y: cellY,
107
+ width: cellWidth,
108
+ height: cellHeight,
109
+ centerX: cellX + cellWidth / 2,
110
+ centerY: cellY + cellHeight / 2
111
+ })
112
+ }
113
+
114
+ // 返回网格布局信息
115
+ return {
116
+ success: true,
117
+ elements,
118
+ cellPositions,
119
+ cellWidth,
120
+ cellHeight,
121
+ columns,
122
+ rows,
123
+ totalCells,
124
+ totalWidth: width,
125
+ totalHeight: height,
126
+ type: 'grid'
115
127
  }
116
- })
128
+ }
117
129
 
118
130
  module.exports = createGrid
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  const paper = require('paper')
6
+ const { getFontFallbackChain, validateFont } = require('../fonts')
6
7
 
7
8
  /**
8
9
  * 创建高亮文字
@@ -30,7 +31,7 @@ function createHighlightText(project, args) {
30
31
  point: [x, y + fontSize],
31
32
  content: text,
32
33
  fontSize,
33
- fontFamily: fontFamily || 'sans-serif',
34
+ fontFamily: getFontFallbackChain(fontFamily, text).join(', '),
34
35
  fillColor: new paper.Color(color),
35
36
  justification: 'left',
36
37
  })