@kolbo/kolbo-code-linux-arm64-musl 0.0.0-dev-202604161628

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 (282) hide show
  1. package/bin/kolbo +0 -0
  2. package/package.json +14 -0
  3. package/skills/brainstorming/SKILL.md +164 -0
  4. package/skills/brainstorming/scripts/frame-template.html +214 -0
  5. package/skills/brainstorming/scripts/helper.js +88 -0
  6. package/skills/brainstorming/scripts/server.cjs +354 -0
  7. package/skills/brainstorming/scripts/start-server.sh +148 -0
  8. package/skills/brainstorming/scripts/stop-server.sh +56 -0
  9. package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  10. package/skills/brainstorming/visual-companion.md +287 -0
  11. package/skills/color-grading/SKILL.md +152 -0
  12. package/skills/dispatching-parallel-agents/SKILL.md +182 -0
  13. package/skills/docx/.skillfish.json +10 -0
  14. package/skills/docx/SKILL.md +196 -0
  15. package/skills/docx/docx-js.md +350 -0
  16. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  17. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  18. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  19. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  20. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  21. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  22. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  23. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  24. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  25. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  26. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  27. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  28. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  29. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  30. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  31. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  32. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  33. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  34. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  35. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  36. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  37. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  38. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  39. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  40. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  41. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  42. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  43. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  44. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  45. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  46. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  47. package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  48. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  49. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  50. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  51. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  52. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  53. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  54. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  55. package/skills/docx/ooxml/scripts/pack.py +159 -0
  56. package/skills/docx/ooxml/scripts/unpack.py +29 -0
  57. package/skills/docx/ooxml/scripts/validate.py +69 -0
  58. package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  59. package/skills/docx/ooxml/scripts/validation/base.py +951 -0
  60. package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  61. package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  62. package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  63. package/skills/docx/ooxml.md +599 -0
  64. package/skills/docx/scripts/__init__.py +1 -0
  65. package/skills/docx/scripts/document.py +1272 -0
  66. package/skills/docx/scripts/templates/comments.xml +3 -0
  67. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  68. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  69. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  70. package/skills/docx/scripts/templates/people.xml +3 -0
  71. package/skills/docx/scripts/utilities.py +374 -0
  72. package/skills/executing-plans/SKILL.md +70 -0
  73. package/skills/ffmpeg-patterns/SKILL.md +240 -0
  74. package/skills/finishing-a-development-branch/SKILL.md +200 -0
  75. package/skills/frontend-design/SKILL.md +42 -0
  76. package/skills/fullstack-app/SKILL.md +621 -0
  77. package/skills/image-prompting-guide/SKILL.md +143 -0
  78. package/skills/kolbo/SKILL.md +610 -0
  79. package/skills/music-prompting/SKILL.md +146 -0
  80. package/skills/pdf/.skillfish.json +10 -0
  81. package/skills/pdf/FORMS.md +205 -0
  82. package/skills/pdf/REFERENCE.md +612 -0
  83. package/skills/pdf/SKILL.md +293 -0
  84. package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  85. package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  86. package/skills/pdf/scripts/check_fillable_fields.py +12 -0
  87. package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  88. package/skills/pdf/scripts/create_validation_image.py +41 -0
  89. package/skills/pdf/scripts/extract_form_field_info.py +152 -0
  90. package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  91. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  92. package/skills/photo-studio/SKILL.md +130 -0
  93. package/skills/pptx/.skillfish.json +10 -0
  94. package/skills/pptx/SKILL.md +483 -0
  95. package/skills/pptx/html2pptx.md +626 -0
  96. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  97. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  98. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  99. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  100. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  101. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  102. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  103. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  104. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  105. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  106. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  107. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  108. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  109. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  110. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  111. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  112. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  113. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  114. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  115. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  116. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  117. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  118. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  119. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  120. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  121. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  122. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  123. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  124. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  125. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  126. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  127. package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  128. package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  129. package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  130. package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  131. package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  132. package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  133. package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  134. package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  135. package/skills/pptx/ooxml/scripts/pack.py +159 -0
  136. package/skills/pptx/ooxml/scripts/unpack.py +29 -0
  137. package/skills/pptx/ooxml/scripts/validate.py +69 -0
  138. package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  139. package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  140. package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  141. package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  142. package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  143. package/skills/pptx/ooxml.md +427 -0
  144. package/skills/pptx/scripts/html2pptx.js +995 -0
  145. package/skills/pptx/scripts/inventory.py +1020 -0
  146. package/skills/pptx/scripts/rearrange.py +231 -0
  147. package/skills/pptx/scripts/replace.py +385 -0
  148. package/skills/pptx/scripts/thumbnail.py +450 -0
  149. package/skills/production-review/SKILL.md +152 -0
  150. package/skills/receiving-code-review/SKILL.md +213 -0
  151. package/skills/remotion-best-practices/SKILL.md +62 -0
  152. package/skills/remotion-best-practices/rules/3d.md +86 -0
  153. package/skills/remotion-best-practices/rules/animations.md +27 -0
  154. package/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  155. package/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  156. package/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  157. package/skills/remotion-best-practices/rules/assets.md +78 -0
  158. package/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
  159. package/skills/remotion-best-practices/rules/audio.md +169 -0
  160. package/skills/remotion-best-practices/rules/calculate-metadata.md +134 -0
  161. package/skills/remotion-best-practices/rules/can-decode.md +81 -0
  162. package/skills/remotion-best-practices/rules/charts.md +120 -0
  163. package/skills/remotion-best-practices/rules/compositions.md +154 -0
  164. package/skills/remotion-best-practices/rules/display-captions.md +184 -0
  165. package/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  166. package/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
  167. package/skills/remotion-best-practices/rules/fonts.md +152 -0
  168. package/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  169. package/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  170. package/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
  171. package/skills/remotion-best-practices/rules/gifs.md +141 -0
  172. package/skills/remotion-best-practices/rules/images.md +134 -0
  173. package/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
  174. package/skills/remotion-best-practices/rules/light-leaks.md +73 -0
  175. package/skills/remotion-best-practices/rules/lottie.md +70 -0
  176. package/skills/remotion-best-practices/rules/maps.md +412 -0
  177. package/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  178. package/skills/remotion-best-practices/rules/measuring-text.md +140 -0
  179. package/skills/remotion-best-practices/rules/motion-design.md +215 -0
  180. package/skills/remotion-best-practices/rules/parameters.md +109 -0
  181. package/skills/remotion-best-practices/rules/sequencing.md +118 -0
  182. package/skills/remotion-best-practices/rules/sfx.md +30 -0
  183. package/skills/remotion-best-practices/rules/subtitles.md +36 -0
  184. package/skills/remotion-best-practices/rules/tailwind.md +11 -0
  185. package/skills/remotion-best-practices/rules/text-animations.md +20 -0
  186. package/skills/remotion-best-practices/rules/timing.md +179 -0
  187. package/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
  188. package/skills/remotion-best-practices/rules/transitions.md +197 -0
  189. package/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
  190. package/skills/remotion-best-practices/rules/trimming.md +51 -0
  191. package/skills/remotion-best-practices/rules/videos.md +171 -0
  192. package/skills/remotion-best-practices/rules/voiceover.md +99 -0
  193. package/skills/requesting-code-review/SKILL.md +105 -0
  194. package/skills/requesting-code-review/code-reviewer.md +146 -0
  195. package/skills/short-form-video/SKILL.md +168 -0
  196. package/skills/sound-design/SKILL.md +154 -0
  197. package/skills/storytelling/SKILL.md +139 -0
  198. package/skills/subagent-driven-development/SKILL.md +277 -0
  199. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  200. package/skills/subagent-driven-development/implementer-prompt.md +113 -0
  201. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  202. package/skills/subtitle-production/SKILL.md +244 -0
  203. package/skills/subtitle-production/reference/burn_to_video.py +222 -0
  204. package/skills/subtitle-production/reference/export_srts.py +127 -0
  205. package/skills/subtitle-production/reference/gen_srt.py +42 -0
  206. package/skills/supabase/.skillfish.json +10 -0
  207. package/skills/supabase/SKILL.md +106 -0
  208. package/skills/supabase/assets/feedback-issue-template.md +17 -0
  209. package/skills/supabase/references/skill-feedback.md +17 -0
  210. package/skills/supabase-postgres-best-practices/.skillfish.json +10 -0
  211. package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  212. package/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  213. package/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  214. package/skills/supabase-postgres-best-practices/references/_template.md +34 -0
  215. package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  216. package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  217. package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  218. package/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  219. package/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  220. package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  221. package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  222. package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  223. package/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  224. package/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  225. package/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  226. package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  227. package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  228. package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  229. package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  230. package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  231. package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  232. package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  233. package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  234. package/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  235. package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  236. package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  237. package/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  238. package/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  239. package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  240. package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  241. package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  242. package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  243. package/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  244. package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  245. package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  246. package/skills/supabase-quickstart/SKILL.md +400 -0
  247. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  248. package/skills/systematic-debugging/SKILL.md +296 -0
  249. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  250. package/skills/systematic-debugging/condition-based-waiting.md +115 -0
  251. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  252. package/skills/systematic-debugging/find-polluter.sh +63 -0
  253. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  254. package/skills/systematic-debugging/test-academic.md +14 -0
  255. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  256. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  257. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  258. package/skills/test-driven-development/SKILL.md +371 -0
  259. package/skills/test-driven-development/testing-anti-patterns.md +299 -0
  260. package/skills/typography-video/SKILL.md +182 -0
  261. package/skills/typography-video/reference/KineticTitleScene.tsx +345 -0
  262. package/skills/using-git-worktrees/SKILL.md +218 -0
  263. package/skills/using-superpowers/SKILL.md +115 -0
  264. package/skills/using-superpowers/references/codex-tools.md +100 -0
  265. package/skills/using-superpowers/references/gemini-tools.md +33 -0
  266. package/skills/verification-before-completion/SKILL.md +139 -0
  267. package/skills/video-editing/SKILL.md +128 -0
  268. package/skills/video-production/SKILL.md +247 -0
  269. package/skills/video-prompting-guide/SKILL.md +268 -0
  270. package/skills/writing-plans/SKILL.md +152 -0
  271. package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  272. package/skills/writing-skills/SKILL.md +655 -0
  273. package/skills/writing-skills/anthropic-best-practices.md +1150 -0
  274. package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  275. package/skills/writing-skills/graphviz-conventions.dot +172 -0
  276. package/skills/writing-skills/persuasion-principles.md +187 -0
  277. package/skills/writing-skills/render-graphs.js +168 -0
  278. package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
  279. package/skills/xlsx/.skillfish.json +10 -0
  280. package/skills/xlsx/SKILL.md +288 -0
  281. package/skills/xlsx/recalc.py +178 -0
  282. package/skills/youtube-clipper/SKILL.md +187 -0
@@ -0,0 +1,626 @@
1
+ # HTML to PowerPoint Guide
2
+
3
+ Convert HTML slides to PowerPoint presentations with accurate positioning using the `html2pptx.js` library.
4
+
5
+ ## Table of Contents
6
+
7
+ 1. [Creating HTML Slides](#creating-html-slides)
8
+ 2. [Using the html2pptx Library](#using-the-html2pptx-library)
9
+ 3. [Using PptxGenJS](#using-pptxgenjs)
10
+
11
+ ---
12
+
13
+ ## Creating HTML Slides
14
+
15
+ Every HTML slide must include proper body dimensions:
16
+
17
+ ### Layout Dimensions
18
+
19
+ - **16:9** (default): `width: 720pt; height: 405pt`
20
+ - **4:3**: `width: 720pt; height: 540pt`
21
+ - **16:10**: `width: 720pt; height: 450pt`
22
+
23
+ ### Supported Elements
24
+
25
+ - `<p>`, `<h1>`-`<h6>` - Text with styling
26
+ - `<ul>`, `<ol>` - Lists (never use manual bullets •, -, *)
27
+ - `<b>`, `<strong>` - Bold text (inline formatting)
28
+ - `<i>`, `<em>` - Italic text (inline formatting)
29
+ - `<u>` - Underlined text (inline formatting)
30
+ - `<span>` - Inline formatting with CSS styles (bold, italic, underline, color)
31
+ - `<div>` with bg/border - Becomes shape
32
+ - `<img>` - Images
33
+ - `class="placeholder"` - Reserved space for charts (returns `{ id, x, y, w, h }`)
34
+
35
+ ### Critical Text Rules
36
+
37
+ **ALL text MUST be inside `<p>`, `<h1>`-`<h6>`, `<ul>`, or `<ol>` tags:**
38
+ - ✅ Correct: `<div><p>Text here</p></div>`
39
+ - ❌ Wrong: `<div>Text here</div>` - **Text will NOT appear in PowerPoint**
40
+ - ❌ Wrong: `<span>Text</span>` - **Text will NOT appear in PowerPoint**
41
+ - Text in `<div>` or `<span>` without a text tag will be silently ignored
42
+
43
+ **NEVER use `<br>` tags** - Use separate text elements for each line
44
+
45
+ **NEVER use manual bullet symbols (•, -, *, etc.)** - Use `<ul>` or `<ol>` lists instead
46
+
47
+ **ONLY use web-safe fonts that are universally available:**
48
+ - ✅ Web-safe fonts: `Arial`, `Helvetica`, `Times New Roman`, `Georgia`, `Courier New`, `Verdana`, `Tahoma`, `Trebuchet MS`, `Impact`, `Comic Sans MS`
49
+ - ❌ Wrong: `'Segoe UI'`, `'SF Pro'`, `'Roboto'`, custom fonts - **Might cause rendering issues**
50
+
51
+ ### Styling
52
+
53
+ - Use `display: flex` on body to prevent margin collapse from breaking overflow validation
54
+ - Use `margin` for spacing (padding included in size)
55
+ - Inline formatting: Use `<b>`, `<i>`, `<u>` tags OR `<span>` with CSS styles
56
+ - `<span>` supports: `font-weight: bold`, `font-style: italic`, `text-decoration: underline`, `color: #rrggbb`
57
+ - `<span>` does NOT support: `margin`, `padding` (not supported in PowerPoint text runs)
58
+ - Example: `<span style="font-weight: bold; color: #667eea;">Bold blue text</span>`
59
+ - Flexbox works - positions calculated from rendered layout
60
+ - Use hex colors with `#` prefix in CSS
61
+ - **Text alignment**: Use CSS `text-align` (`center`, `right`, etc.) when needed as a hint to PptxGenJS for text formatting if text lengths are slightly off
62
+
63
+ ### Shape Styling (DIV elements only)
64
+
65
+ **IMPORTANT: Backgrounds, borders, and shadows only work on `<div>` elements, NOT on text elements (`<p>`, `<h1>`-`<h6>`, `<ul>`, `<ol>`)**
66
+
67
+ - **Backgrounds**: CSS `background` or `background-color` on `<div>` elements only
68
+ - Example: `<div style="background: #f0f0f0;">` - Creates a shape with background
69
+ - **Borders**: CSS `border` on `<div>` elements converts to PowerPoint shape borders
70
+ - Supports uniform borders: `border: 2px solid #333333`
71
+ - Supports partial borders: `border-left`, `border-right`, `border-top`, `border-bottom` (rendered as line shapes)
72
+ - Example: `<div style="border-left: 8pt solid #E76F51;">`
73
+ - **Border radius**: CSS `border-radius` on `<div>` elements for rounded corners
74
+ - `border-radius: 50%` or higher creates circular shape
75
+ - Percentages <50% calculated relative to shape's smaller dimension
76
+ - Supports px and pt units (e.g., `border-radius: 8pt;`, `border-radius: 12px;`)
77
+ - Example: `<div style="border-radius: 25%;">` on 100x200px box = 25% of 100px = 25px radius
78
+ - **Box shadows**: CSS `box-shadow` on `<div>` elements converts to PowerPoint shadows
79
+ - Supports outer shadows only (inset shadows are ignored to prevent corruption)
80
+ - Example: `<div style="box-shadow: 2px 2px 8px rgba(0, 0, 0, 0.3);">`
81
+ - Note: Inset/inner shadows are not supported by PowerPoint and will be skipped
82
+
83
+ ### Icons & Gradients
84
+
85
+ - **CRITICAL: Never use CSS gradients (`linear-gradient`, `radial-gradient`)** - They don't convert to PowerPoint
86
+ - **ALWAYS create gradient/icon PNGs FIRST using Sharp, then reference in HTML**
87
+ - For gradients: Rasterize SVG to PNG background images
88
+ - For icons: Rasterize react-icons SVG to PNG images
89
+ - All visual effects must be pre-rendered as raster images before HTML rendering
90
+
91
+ **Rasterizing Icons with Sharp:**
92
+
93
+ ```javascript
94
+ const React = require('react');
95
+ const ReactDOMServer = require('react-dom/server');
96
+ const sharp = require('sharp');
97
+ const { FaHome } = require('react-icons/fa');
98
+
99
+ async function rasterizeIconPng(IconComponent, color, size = "256", filename) {
100
+ const svgString = ReactDOMServer.renderToStaticMarkup(
101
+ React.createElement(IconComponent, { color: `#${color}`, size: size })
102
+ );
103
+
104
+ // Convert SVG to PNG using Sharp
105
+ await sharp(Buffer.from(svgString))
106
+ .png()
107
+ .toFile(filename);
108
+
109
+ return filename;
110
+ }
111
+
112
+ // Usage: Rasterize icon before using in HTML
113
+ const iconPath = await rasterizeIconPng(FaHome, "4472c4", "256", "home-icon.png");
114
+ // Then reference in HTML: <img src="home-icon.png" style="width: 40pt; height: 40pt;">
115
+ ```
116
+
117
+ **Rasterizing Gradients with Sharp:**
118
+
119
+ ```javascript
120
+ const sharp = require('sharp');
121
+
122
+ async function createGradientBackground(filename) {
123
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="562.5">
124
+ <defs>
125
+ <linearGradient id="g" x1="0%" y1="0%" x2="100%" y2="100%">
126
+ <stop offset="0%" style="stop-color:#COLOR1"/>
127
+ <stop offset="100%" style="stop-color:#COLOR2"/>
128
+ </linearGradient>
129
+ </defs>
130
+ <rect width="100%" height="100%" fill="url(#g)"/>
131
+ </svg>`;
132
+
133
+ await sharp(Buffer.from(svg))
134
+ .png()
135
+ .toFile(filename);
136
+
137
+ return filename;
138
+ }
139
+
140
+ // Usage: Create gradient background before HTML
141
+ const bgPath = await createGradientBackground("gradient-bg.png");
142
+ // Then in HTML: <body style="background-image: url('gradient-bg.png');">
143
+ ```
144
+
145
+ ### Example
146
+
147
+ ```html
148
+ <!DOCTYPE html>
149
+ <html>
150
+ <head>
151
+ <style>
152
+ html { background: #ffffff; }
153
+ body {
154
+ width: 720pt; height: 405pt; margin: 0; padding: 0;
155
+ background: #f5f5f5; font-family: Arial, sans-serif;
156
+ display: flex;
157
+ }
158
+ .content { margin: 30pt; padding: 40pt; background: #ffffff; border-radius: 8pt; }
159
+ h1 { color: #2d3748; font-size: 32pt; }
160
+ .box {
161
+ background: #70ad47; padding: 20pt; border: 3px solid #5a8f37;
162
+ border-radius: 12pt; box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.25);
163
+ }
164
+ </style>
165
+ </head>
166
+ <body>
167
+ <div class="content">
168
+ <h1>Recipe Title</h1>
169
+ <ul>
170
+ <li><b>Item:</b> Description</li>
171
+ </ul>
172
+ <p>Text with <b>bold</b>, <i>italic</i>, <u>underline</u>.</p>
173
+ <div id="chart" class="placeholder" style="width: 350pt; height: 200pt;"></div>
174
+
175
+ <!-- Text MUST be in <p> tags -->
176
+ <div class="box">
177
+ <p>5</p>
178
+ </div>
179
+ </div>
180
+ </body>
181
+ </html>
182
+ ```
183
+
184
+ ## Using the html2pptx Library
185
+
186
+ ### Dependencies
187
+
188
+ These libraries have been globally installed and are available to use:
189
+ - `pptxgenjs`
190
+ - `playwright`
191
+ - `sharp`
192
+
193
+ ### Basic Usage
194
+
195
+ ```javascript
196
+ const pptxgen = require('pptxgenjs');
197
+ const html2pptx = require('./html2pptx');
198
+
199
+ const pptx = new pptxgen();
200
+ pptx.layout = 'LAYOUT_16x9'; // Must match HTML body dimensions
201
+
202
+ const { slide, placeholders } = await html2pptx('slide1.html', pptx);
203
+
204
+ // Add chart to placeholder area
205
+ if (placeholders.length > 0) {
206
+ slide.addChart(pptx.charts.LINE, chartData, placeholders[0]);
207
+ }
208
+
209
+ await pptx.writeFile('output.pptx');
210
+ ```
211
+
212
+ ### API Reference
213
+
214
+ #### Function Signature
215
+ ```javascript
216
+ await html2pptx(htmlFile, pres, options)
217
+ ```
218
+
219
+ #### Parameters
220
+ - `htmlFile` (string): Path to HTML file (absolute or relative)
221
+ - `pres` (pptxgen): PptxGenJS presentation instance with layout already set
222
+ - `options` (object, optional):
223
+ - `tmpDir` (string): Temporary directory for generated files (default: `process.env.TMPDIR || '/tmp'`)
224
+ - `slide` (object): Existing slide to reuse (default: creates new slide)
225
+
226
+ #### Returns
227
+ ```javascript
228
+ {
229
+ slide: pptxgenSlide, // The created/updated slide
230
+ placeholders: [ // Array of placeholder positions
231
+ { id: string, x: number, y: number, w: number, h: number },
232
+ ...
233
+ ]
234
+ }
235
+ ```
236
+
237
+ ### Validation
238
+
239
+ The library automatically validates and collects all errors before throwing:
240
+
241
+ 1. **HTML dimensions must match presentation layout** - Reports dimension mismatches
242
+ 2. **Content must not overflow body** - Reports overflow with exact measurements
243
+ 3. **CSS gradients** - Reports unsupported gradient usage
244
+ 4. **Text element styling** - Reports backgrounds/borders/shadows on text elements (only allowed on divs)
245
+
246
+ **All validation errors are collected and reported together** in a single error message, allowing you to fix all issues at once instead of one at a time.
247
+
248
+ ### Working with Placeholders
249
+
250
+ ```javascript
251
+ const { slide, placeholders } = await html2pptx('slide.html', pptx);
252
+
253
+ // Use first placeholder
254
+ slide.addChart(pptx.charts.BAR, data, placeholders[0]);
255
+
256
+ // Find by ID
257
+ const chartArea = placeholders.find(p => p.id === 'chart-area');
258
+ slide.addChart(pptx.charts.LINE, data, chartArea);
259
+ ```
260
+
261
+ ### Complete Example
262
+
263
+ ```javascript
264
+ const pptxgen = require('pptxgenjs');
265
+ const html2pptx = require('./html2pptx');
266
+
267
+ async function createPresentation() {
268
+ const pptx = new pptxgen();
269
+ pptx.layout = 'LAYOUT_16x9';
270
+ pptx.author = 'Your Name';
271
+ pptx.title = 'My Presentation';
272
+
273
+ // Slide 1: Title
274
+ const { slide: slide1 } = await html2pptx('slides/title.html', pptx);
275
+
276
+ // Slide 2: Content with chart
277
+ const { slide: slide2, placeholders } = await html2pptx('slides/data.html', pptx);
278
+
279
+ const chartData = [{
280
+ name: 'Sales',
281
+ labels: ['Q1', 'Q2', 'Q3', 'Q4'],
282
+ values: [4500, 5500, 6200, 7100]
283
+ }];
284
+
285
+ slide2.addChart(pptx.charts.BAR, chartData, {
286
+ ...placeholders[0],
287
+ showTitle: true,
288
+ title: 'Quarterly Sales',
289
+ showCatAxisTitle: true,
290
+ catAxisTitle: 'Quarter',
291
+ showValAxisTitle: true,
292
+ valAxisTitle: 'Sales ($000s)'
293
+ });
294
+
295
+ // Save
296
+ await pptx.writeFile({ fileName: 'presentation.pptx' });
297
+ console.log('Presentation created successfully!');
298
+ }
299
+
300
+ createPresentation().catch(console.error);
301
+ ```
302
+
303
+ ## Using PptxGenJS
304
+
305
+ After converting HTML to slides with `html2pptx`, you'll use PptxGenJS to add dynamic content like charts, images, and additional elements.
306
+
307
+ ### ⚠️ Critical Rules
308
+
309
+ #### Colors
310
+ - **NEVER use `#` prefix** with hex colors in PptxGenJS - causes file corruption
311
+ - ✅ Correct: `color: "FF0000"`, `fill: { color: "0066CC" }`
312
+ - ❌ Wrong: `color: "#FF0000"` (breaks document)
313
+
314
+ ### Adding Images
315
+
316
+ Always calculate aspect ratios from actual image dimensions:
317
+
318
+ ```javascript
319
+ // Get image dimensions: identify image.png | grep -o '[0-9]* x [0-9]*'
320
+ const imgWidth = 1860, imgHeight = 1519; // From actual file
321
+ const aspectRatio = imgWidth / imgHeight;
322
+
323
+ const h = 3; // Max height
324
+ const w = h * aspectRatio;
325
+ const x = (10 - w) / 2; // Center on 16:9 slide
326
+
327
+ slide.addImage({ path: "chart.png", x, y: 1.5, w, h });
328
+ ```
329
+
330
+ ### Adding Text
331
+
332
+ ```javascript
333
+ // Rich text with formatting
334
+ slide.addText([
335
+ { text: "Bold ", options: { bold: true } },
336
+ { text: "Italic ", options: { italic: true } },
337
+ { text: "Normal" }
338
+ ], {
339
+ x: 1, y: 2, w: 8, h: 1
340
+ });
341
+ ```
342
+
343
+ ### Adding Shapes
344
+
345
+ ```javascript
346
+ // Rectangle
347
+ slide.addShape(pptx.shapes.RECTANGLE, {
348
+ x: 1, y: 1, w: 3, h: 2,
349
+ fill: { color: "4472C4" },
350
+ line: { color: "000000", width: 2 }
351
+ });
352
+
353
+ // Circle
354
+ slide.addShape(pptx.shapes.OVAL, {
355
+ x: 5, y: 1, w: 2, h: 2,
356
+ fill: { color: "ED7D31" }
357
+ });
358
+
359
+ // Rounded rectangle
360
+ slide.addShape(pptx.shapes.ROUNDED_RECTANGLE, {
361
+ x: 1, y: 4, w: 3, h: 1.5,
362
+ fill: { color: "70AD47" },
363
+ rectRadius: 0.2
364
+ });
365
+ ```
366
+
367
+ ### Adding Charts
368
+
369
+ **Required for most charts:** Axis labels using `catAxisTitle` (category) and `valAxisTitle` (value).
370
+
371
+ **Chart Data Format:**
372
+ - Use **single series with all labels** for simple bar/line charts
373
+ - Each series creates a separate legend entry
374
+ - Labels array defines X-axis values
375
+
376
+ **Time Series Data - Choose Correct Granularity:**
377
+ - **< 30 days**: Use daily grouping (e.g., "10-01", "10-02") - avoid monthly aggregation that creates single-point charts
378
+ - **30-365 days**: Use monthly grouping (e.g., "2024-01", "2024-02")
379
+ - **> 365 days**: Use yearly grouping (e.g., "2023", "2024")
380
+ - **Validate**: Charts with only 1 data point likely indicate incorrect aggregation for the time period
381
+
382
+ ```javascript
383
+ const { slide, placeholders } = await html2pptx('slide.html', pptx);
384
+
385
+ // CORRECT: Single series with all labels
386
+ slide.addChart(pptx.charts.BAR, [{
387
+ name: "Sales 2024",
388
+ labels: ["Q1", "Q2", "Q3", "Q4"],
389
+ values: [4500, 5500, 6200, 7100]
390
+ }], {
391
+ ...placeholders[0], // Use placeholder position
392
+ barDir: 'col', // 'col' = vertical bars, 'bar' = horizontal
393
+ showTitle: true,
394
+ title: 'Quarterly Sales',
395
+ showLegend: false, // No legend needed for single series
396
+ // Required axis labels
397
+ showCatAxisTitle: true,
398
+ catAxisTitle: 'Quarter',
399
+ showValAxisTitle: true,
400
+ valAxisTitle: 'Sales ($000s)',
401
+ // Optional: Control scaling (adjust min based on data range for better visualization)
402
+ valAxisMaxVal: 8000,
403
+ valAxisMinVal: 0, // Use 0 for counts/amounts; for clustered data (e.g., 4500-7100), consider starting closer to min value
404
+ valAxisMajorUnit: 2000, // Control y-axis label spacing to prevent crowding
405
+ catAxisLabelRotate: 45, // Rotate labels if crowded
406
+ dataLabelPosition: 'outEnd',
407
+ dataLabelColor: '000000',
408
+ // Use single color for single-series charts
409
+ chartColors: ["4472C4"] // All bars same color
410
+ });
411
+ ```
412
+
413
+ #### Scatter Chart
414
+
415
+ **IMPORTANT**: Scatter chart data format is unusual - first series contains X-axis values, subsequent series contain Y-values:
416
+
417
+ ```javascript
418
+ // Prepare data
419
+ const data1 = [{ x: 10, y: 20 }, { x: 15, y: 25 }, { x: 20, y: 30 }];
420
+ const data2 = [{ x: 12, y: 18 }, { x: 18, y: 22 }];
421
+
422
+ const allXValues = [...data1.map(d => d.x), ...data2.map(d => d.x)];
423
+
424
+ slide.addChart(pptx.charts.SCATTER, [
425
+ { name: 'X-Axis', values: allXValues }, // First series = X values
426
+ { name: 'Series 1', values: data1.map(d => d.y) }, // Y values only
427
+ { name: 'Series 2', values: data2.map(d => d.y) } // Y values only
428
+ ], {
429
+ x: 1, y: 1, w: 8, h: 4,
430
+ lineSize: 0, // 0 = no connecting lines
431
+ lineDataSymbol: 'circle',
432
+ lineDataSymbolSize: 6,
433
+ showCatAxisTitle: true,
434
+ catAxisTitle: 'X Axis',
435
+ showValAxisTitle: true,
436
+ valAxisTitle: 'Y Axis',
437
+ chartColors: ["4472C4", "ED7D31"]
438
+ });
439
+ ```
440
+
441
+ #### Line Chart
442
+
443
+ ```javascript
444
+ slide.addChart(pptx.charts.LINE, [{
445
+ name: "Temperature",
446
+ labels: ["Jan", "Feb", "Mar", "Apr"],
447
+ values: [32, 35, 42, 55]
448
+ }], {
449
+ x: 1, y: 1, w: 8, h: 4,
450
+ lineSize: 4,
451
+ lineSmooth: true,
452
+ // Required axis labels
453
+ showCatAxisTitle: true,
454
+ catAxisTitle: 'Month',
455
+ showValAxisTitle: true,
456
+ valAxisTitle: 'Temperature (°F)',
457
+ // Optional: Y-axis range (set min based on data range for better visualization)
458
+ valAxisMinVal: 0, // For ranges starting at 0 (counts, percentages, etc.)
459
+ valAxisMaxVal: 60,
460
+ valAxisMajorUnit: 20, // Control y-axis label spacing to prevent crowding (e.g., 10, 20, 25)
461
+ // valAxisMinVal: 30, // PREFERRED: For data clustered in a range (e.g., 32-55 or ratings 3-5), start axis closer to min value to show variation
462
+ // Optional: Chart colors
463
+ chartColors: ["4472C4", "ED7D31", "A5A5A5"]
464
+ });
465
+ ```
466
+
467
+ #### Pie Chart (No Axis Labels Required)
468
+
469
+ **CRITICAL**: Pie charts require a **single data series** with all categories in the `labels` array and corresponding values in the `values` array.
470
+
471
+ ```javascript
472
+ slide.addChart(pptx.charts.PIE, [{
473
+ name: "Market Share",
474
+ labels: ["Product A", "Product B", "Other"], // All categories in one array
475
+ values: [35, 45, 20] // All values in one array
476
+ }], {
477
+ x: 2, y: 1, w: 6, h: 4,
478
+ showPercent: true,
479
+ showLegend: true,
480
+ legendPos: 'r', // right
481
+ chartColors: ["4472C4", "ED7D31", "A5A5A5"]
482
+ });
483
+ ```
484
+
485
+ #### Multiple Data Series
486
+
487
+ ```javascript
488
+ slide.addChart(pptx.charts.LINE, [
489
+ {
490
+ name: "Product A",
491
+ labels: ["Q1", "Q2", "Q3", "Q4"],
492
+ values: [10, 20, 30, 40]
493
+ },
494
+ {
495
+ name: "Product B",
496
+ labels: ["Q1", "Q2", "Q3", "Q4"],
497
+ values: [15, 25, 20, 35]
498
+ }
499
+ ], {
500
+ x: 1, y: 1, w: 8, h: 4,
501
+ showCatAxisTitle: true,
502
+ catAxisTitle: 'Quarter',
503
+ showValAxisTitle: true,
504
+ valAxisTitle: 'Revenue ($M)'
505
+ });
506
+ ```
507
+
508
+ ### Chart Colors
509
+
510
+ **CRITICAL**: Use hex colors **without** the `#` prefix - including `#` causes file corruption.
511
+
512
+ **Align chart colors with your chosen design palette**, ensuring sufficient contrast and distinctiveness for data visualization. Adjust colors for:
513
+ - Strong contrast between adjacent series
514
+ - Readability against slide backgrounds
515
+ - Accessibility (avoid red-green only combinations)
516
+
517
+ ```javascript
518
+ // Example: Ocean palette-inspired chart colors (adjusted for contrast)
519
+ const chartColors = ["16A085", "FF6B9D", "2C3E50", "F39C12", "9B59B6"];
520
+
521
+ // Single-series chart: Use one color for all bars/points
522
+ slide.addChart(pptx.charts.BAR, [{
523
+ name: "Sales",
524
+ labels: ["Q1", "Q2", "Q3", "Q4"],
525
+ values: [4500, 5500, 6200, 7100]
526
+ }], {
527
+ ...placeholders[0],
528
+ chartColors: ["16A085"], // All bars same color
529
+ showLegend: false
530
+ });
531
+
532
+ // Multi-series chart: Each series gets a different color
533
+ slide.addChart(pptx.charts.LINE, [
534
+ { name: "Product A", labels: ["Q1", "Q2", "Q3"], values: [10, 20, 30] },
535
+ { name: "Product B", labels: ["Q1", "Q2", "Q3"], values: [15, 25, 20] }
536
+ ], {
537
+ ...placeholders[0],
538
+ chartColors: ["16A085", "FF6B9D"] // One color per series
539
+ });
540
+ ```
541
+
542
+ ### Adding Tables
543
+
544
+ Tables can be added with basic or advanced formatting:
545
+
546
+ #### Basic Table
547
+
548
+ ```javascript
549
+ slide.addTable([
550
+ ["Header 1", "Header 2", "Header 3"],
551
+ ["Row 1, Col 1", "Row 1, Col 2", "Row 1, Col 3"],
552
+ ["Row 2, Col 1", "Row 2, Col 2", "Row 2, Col 3"]
553
+ ], {
554
+ x: 0.5,
555
+ y: 1,
556
+ w: 9,
557
+ h: 3,
558
+ border: { pt: 1, color: "999999" },
559
+ fill: { color: "F1F1F1" }
560
+ });
561
+ ```
562
+
563
+ #### Table with Custom Formatting
564
+
565
+ ```javascript
566
+ const tableData = [
567
+ // Header row with custom styling
568
+ [
569
+ { text: "Product", options: { fill: { color: "4472C4" }, color: "FFFFFF", bold: true } },
570
+ { text: "Revenue", options: { fill: { color: "4472C4" }, color: "FFFFFF", bold: true } },
571
+ { text: "Growth", options: { fill: { color: "4472C4" }, color: "FFFFFF", bold: true } }
572
+ ],
573
+ // Data rows
574
+ ["Product A", "$50M", "+15%"],
575
+ ["Product B", "$35M", "+22%"],
576
+ ["Product C", "$28M", "+8%"]
577
+ ];
578
+
579
+ slide.addTable(tableData, {
580
+ x: 1,
581
+ y: 1.5,
582
+ w: 8,
583
+ h: 3,
584
+ colW: [3, 2.5, 2.5], // Column widths
585
+ rowH: [0.5, 0.6, 0.6, 0.6], // Row heights
586
+ border: { pt: 1, color: "CCCCCC" },
587
+ align: "center",
588
+ valign: "middle",
589
+ fontSize: 14
590
+ });
591
+ ```
592
+
593
+ #### Table with Merged Cells
594
+
595
+ ```javascript
596
+ const mergedTableData = [
597
+ [
598
+ { text: "Q1 Results", options: { colspan: 3, fill: { color: "4472C4" }, color: "FFFFFF", bold: true } }
599
+ ],
600
+ ["Product", "Sales", "Market Share"],
601
+ ["Product A", "$25M", "35%"],
602
+ ["Product B", "$18M", "25%"]
603
+ ];
604
+
605
+ slide.addTable(mergedTableData, {
606
+ x: 1,
607
+ y: 1,
608
+ w: 8,
609
+ h: 2.5,
610
+ colW: [3, 2.5, 2.5],
611
+ border: { pt: 1, color: "DDDDDD" }
612
+ });
613
+ ```
614
+
615
+ ### Table Options
616
+
617
+ Common table options:
618
+ - `x, y, w, h` - Position and size
619
+ - `colW` - Array of column widths (in inches)
620
+ - `rowH` - Array of row heights (in inches)
621
+ - `border` - Border style: `{ pt: 1, color: "999999" }`
622
+ - `fill` - Background color (no # prefix)
623
+ - `align` - Text alignment: "left", "center", "right"
624
+ - `valign` - Vertical alignment: "top", "middle", "bottom"
625
+ - `fontSize` - Text size
626
+ - `autoPage` - Auto-create new slides if content overflows