claude-code-templates 1.21.13 → 1.21.14

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 (415) hide show
  1. package/.claude/settings.local.json +8 -2
  2. package/.claude-plugin/marketplace.json +251 -0
  3. package/.github/workflows/component-security-validation.yml +129 -0
  4. package/README.md +13 -6
  5. package/cli-tool/README.md +56 -0
  6. package/cli-tool/bin/create-claude-config.js +2 -0
  7. package/cli-tool/components/.claude-plugin/marketplace.json +92 -0
  8. package/cli-tool/components/agents/development-tools/flutter-go-reviewer.md +163 -0
  9. package/cli-tool/components/agents/development-tools/unused-code-cleaner.md +194 -0
  10. package/cli-tool/components/commands/git-workflow/gemini-review.md +293 -0
  11. package/cli-tool/components/commands/testing/add-mutation-testing.md +2 -2
  12. package/cli-tool/components/commands/testing/add-property-based-testing.md +2 -2
  13. package/cli-tool/components/commands/testing/e2e-setup.md +2 -2
  14. package/cli-tool/components/commands/testing/generate-test-cases.md +2 -2
  15. package/cli-tool/components/commands/testing/generate-tests.md +8 -3
  16. package/cli-tool/components/commands/testing/setup-comprehensive-testing.md +2 -2
  17. package/cli-tool/components/commands/testing/setup-load-testing.md +2 -2
  18. package/cli-tool/components/commands/testing/setup-visual-testing.md +2 -2
  19. package/cli-tool/components/commands/testing/test-automation-orchestrator.md +2 -2
  20. package/cli-tool/components/commands/testing/test-changelog-automation.md +2 -2
  21. package/cli-tool/components/commands/testing/test-coverage.md +2 -2
  22. package/cli-tool/components/commands/testing/test-quality-analyzer.md +2 -2
  23. package/cli-tool/components/commands/testing/testing_plan_integration.md +2 -2
  24. package/cli-tool/components/commands/testing/write-tests.md +2 -2
  25. package/cli-tool/components/commands/utilities/ultra-think.md +10 -5
  26. package/cli-tool/components/hooks/git/validate-branch-name.json +1 -1
  27. package/cli-tool/components/mcps/devtools/chrome-devtools.json +9 -0
  28. package/cli-tool/components/mcps/devtools/grafana.json +15 -0
  29. package/cli-tool/components/mcps/devtools/pulumi.json +9 -0
  30. package/cli-tool/components/mcps/devtools/terraform.json +1 -1
  31. package/cli-tool/components/settings/statusline/context-monitor.py +1 -1
  32. package/cli-tool/components/skills/ANTHROPIC_ATTRIBUTION.md +81 -0
  33. package/cli-tool/components/skills/creative-design/algorithmic-art/LICENSE.txt +202 -0
  34. package/cli-tool/components/skills/creative-design/algorithmic-art/SKILL.md +405 -0
  35. package/cli-tool/components/skills/creative-design/algorithmic-art/templates/generator_template.js +223 -0
  36. package/cli-tool/components/skills/creative-design/algorithmic-art/templates/viewer.html +599 -0
  37. package/cli-tool/components/skills/creative-design/canvas-design/LICENSE.txt +202 -0
  38. package/cli-tool/components/skills/creative-design/canvas-design/SKILL.md +130 -0
  39. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  40. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  41. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  42. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  43. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  44. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  45. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  46. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  47. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  48. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  49. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  50. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  51. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  52. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  53. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  54. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  55. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  56. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  57. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  58. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  59. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  60. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  61. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  62. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  63. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  64. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  65. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  66. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  67. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  68. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  69. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  70. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  71. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  72. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  73. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  74. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  75. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  76. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  77. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  78. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  79. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  80. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  81. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  82. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  83. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  84. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  85. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  86. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  87. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  88. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  89. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  90. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  91. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  92. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  93. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  94. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  95. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  96. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  97. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  98. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  99. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  100. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  101. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  102. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  103. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  104. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  105. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  106. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  107. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  108. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  109. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  110. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  111. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  112. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  113. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  114. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  115. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  116. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  117. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  118. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  119. package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  120. package/cli-tool/components/skills/creative-design/slack-gif-creator/LICENSE.txt +202 -0
  121. package/cli-tool/components/skills/creative-design/slack-gif-creator/SKILL.md +646 -0
  122. package/cli-tool/components/skills/creative-design/slack-gif-creator/core/color_palettes.py +302 -0
  123. package/cli-tool/components/skills/creative-design/slack-gif-creator/core/easing.py +230 -0
  124. package/cli-tool/components/skills/creative-design/slack-gif-creator/core/frame_composer.py +469 -0
  125. package/cli-tool/components/skills/creative-design/slack-gif-creator/core/gif_builder.py +246 -0
  126. package/cli-tool/components/skills/creative-design/slack-gif-creator/core/typography.py +357 -0
  127. package/cli-tool/components/skills/creative-design/slack-gif-creator/core/validators.py +264 -0
  128. package/cli-tool/components/skills/creative-design/slack-gif-creator/core/visual_effects.py +494 -0
  129. package/cli-tool/components/skills/creative-design/slack-gif-creator/requirements.txt +4 -0
  130. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/bounce.py +106 -0
  131. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/explode.py +331 -0
  132. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/fade.py +329 -0
  133. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/flip.py +291 -0
  134. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/kaleidoscope.py +211 -0
  135. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/morph.py +329 -0
  136. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/move.py +293 -0
  137. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/pulse.py +268 -0
  138. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/shake.py +127 -0
  139. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/slide.py +291 -0
  140. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/spin.py +269 -0
  141. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/wiggle.py +300 -0
  142. package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/zoom.py +312 -0
  143. package/cli-tool/components/skills/creative-design/theme-factory/LICENSE.txt +202 -0
  144. package/cli-tool/components/skills/creative-design/theme-factory/SKILL.md +59 -0
  145. package/cli-tool/components/skills/creative-design/theme-factory/theme-showcase.pdf +0 -0
  146. package/cli-tool/components/skills/creative-design/theme-factory/themes/arctic-frost.md +19 -0
  147. package/cli-tool/components/skills/creative-design/theme-factory/themes/botanical-garden.md +19 -0
  148. package/cli-tool/components/skills/creative-design/theme-factory/themes/desert-rose.md +19 -0
  149. package/cli-tool/components/skills/creative-design/theme-factory/themes/forest-canopy.md +19 -0
  150. package/cli-tool/components/skills/creative-design/theme-factory/themes/golden-hour.md +19 -0
  151. package/cli-tool/components/skills/creative-design/theme-factory/themes/midnight-galaxy.md +19 -0
  152. package/cli-tool/components/skills/creative-design/theme-factory/themes/modern-minimalist.md +19 -0
  153. package/cli-tool/components/skills/creative-design/theme-factory/themes/ocean-depths.md +19 -0
  154. package/cli-tool/components/skills/creative-design/theme-factory/themes/sunset-boulevard.md +19 -0
  155. package/cli-tool/components/skills/creative-design/theme-factory/themes/tech-innovation.md +19 -0
  156. package/cli-tool/components/skills/development/artifacts-builder/LICENSE.txt +202 -0
  157. package/cli-tool/components/skills/development/artifacts-builder/SKILL.md +74 -0
  158. package/cli-tool/components/skills/development/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  159. package/cli-tool/components/skills/development/artifacts-builder/scripts/init-artifact.sh +322 -0
  160. package/cli-tool/components/skills/development/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  161. package/cli-tool/components/skills/development/git-commit-helper/SKILL.md +203 -0
  162. package/cli-tool/components/skills/development/mcp-builder/LICENSE.txt +202 -0
  163. package/cli-tool/components/skills/development/mcp-builder/SKILL.md +328 -0
  164. package/cli-tool/components/skills/development/mcp-builder/reference/evaluation.md +602 -0
  165. package/cli-tool/components/skills/development/mcp-builder/reference/mcp_best_practices.md +915 -0
  166. package/cli-tool/components/skills/development/mcp-builder/reference/node_mcp_server.md +916 -0
  167. package/cli-tool/components/skills/development/mcp-builder/reference/python_mcp_server.md +752 -0
  168. package/cli-tool/components/skills/development/mcp-builder/scripts/connections.py +151 -0
  169. package/cli-tool/components/skills/development/mcp-builder/scripts/evaluation.py +373 -0
  170. package/cli-tool/components/skills/development/mcp-builder/scripts/example_evaluation.xml +22 -0
  171. package/cli-tool/components/skills/development/mcp-builder/scripts/requirements.txt +2 -0
  172. package/cli-tool/components/skills/development/skill-creator/LICENSE.txt +202 -0
  173. package/cli-tool/components/skills/development/skill-creator/SKILL.md +209 -0
  174. package/cli-tool/components/skills/development/skill-creator/scripts/init_skill.py +303 -0
  175. package/cli-tool/components/skills/development/skill-creator/scripts/package_skill.py +110 -0
  176. package/cli-tool/components/skills/development/skill-creator/scripts/quick_validate.py +65 -0
  177. package/cli-tool/components/skills/development/webapp-testing/LICENSE.txt +202 -0
  178. package/cli-tool/components/skills/development/webapp-testing/SKILL.md +96 -0
  179. package/cli-tool/components/skills/development/webapp-testing/examples/console_logging.py +35 -0
  180. package/cli-tool/components/skills/development/webapp-testing/examples/element_discovery.py +40 -0
  181. package/cli-tool/components/skills/development/webapp-testing/examples/static_html_automation.py +33 -0
  182. package/cli-tool/components/skills/development/webapp-testing/scripts/with_server.py +106 -0
  183. package/cli-tool/components/skills/document-processing/docx/LICENSE.txt +30 -0
  184. package/cli-tool/components/skills/document-processing/docx/SKILL.md +197 -0
  185. package/cli-tool/components/skills/document-processing/docx/docx-js.md +350 -0
  186. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  187. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  188. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  189. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  190. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  191. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  192. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  193. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  194. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  195. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  196. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  197. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  198. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  199. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  200. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  201. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  202. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  203. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  204. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  205. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  206. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  207. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  208. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  209. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  210. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  211. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  212. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  213. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  214. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  215. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  216. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  217. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/mce/mc.xsd +75 -0
  218. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  219. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  220. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  221. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  222. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  223. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  224. package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  225. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/pack.py +159 -0
  226. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/unpack.py +29 -0
  227. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validate.py +69 -0
  228. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/__init__.py +15 -0
  229. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/base.py +951 -0
  230. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/docx.py +274 -0
  231. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/pptx.py +315 -0
  232. package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/redlining.py +279 -0
  233. package/cli-tool/components/skills/document-processing/docx/ooxml.md +610 -0
  234. package/cli-tool/components/skills/document-processing/docx/scripts/__init__.py +1 -0
  235. package/cli-tool/components/skills/document-processing/docx/scripts/document.py +1276 -0
  236. package/cli-tool/components/skills/document-processing/docx/scripts/templates/comments.xml +3 -0
  237. package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsExtended.xml +3 -0
  238. package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsExtensible.xml +3 -0
  239. package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsIds.xml +3 -0
  240. package/cli-tool/components/skills/document-processing/docx/scripts/templates/people.xml +3 -0
  241. package/cli-tool/components/skills/document-processing/docx/scripts/utilities.py +374 -0
  242. package/cli-tool/components/skills/document-processing/pdf-anthropic/LICENSE.txt +30 -0
  243. package/cli-tool/components/skills/document-processing/pdf-anthropic/SKILL.md +294 -0
  244. package/cli-tool/components/skills/document-processing/pdf-anthropic/forms.md +205 -0
  245. package/cli-tool/components/skills/document-processing/pdf-anthropic/reference.md +612 -0
  246. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_bounding_boxes.py +70 -0
  247. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_bounding_boxes_test.py +226 -0
  248. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_fillable_fields.py +12 -0
  249. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/convert_pdf_to_images.py +35 -0
  250. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/create_validation_image.py +41 -0
  251. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/extract_form_field_info.py +152 -0
  252. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/fill_fillable_fields.py +114 -0
  253. package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/fill_pdf_form_with_annotations.py +108 -0
  254. package/cli-tool/components/skills/document-processing/pdf-processing/FORMS.md +143 -0
  255. package/cli-tool/components/skills/document-processing/pdf-processing/SKILL.md +149 -0
  256. package/cli-tool/components/skills/document-processing/pdf-processing-pro/FORMS.md +610 -0
  257. package/cli-tool/components/skills/document-processing/pdf-processing-pro/OCR.md +137 -0
  258. package/cli-tool/components/skills/document-processing/pdf-processing-pro/SKILL.md +296 -0
  259. package/cli-tool/components/skills/document-processing/pdf-processing-pro/TABLES.md +626 -0
  260. package/cli-tool/components/skills/document-processing/pdf-processing-pro/scripts/analyze_form.py +307 -0
  261. package/cli-tool/components/skills/document-processing/pptx/LICENSE.txt +30 -0
  262. package/cli-tool/components/skills/document-processing/pptx/SKILL.md +484 -0
  263. package/cli-tool/components/skills/document-processing/pptx/html2pptx.md +625 -0
  264. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  265. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  266. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  267. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  268. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  269. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  270. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  271. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  272. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  273. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  274. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  275. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  276. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  277. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  278. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  279. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  280. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  281. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  282. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  283. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  284. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  285. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  286. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  287. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  288. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  289. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  290. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  291. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  292. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  293. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  294. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  295. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  296. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  297. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  298. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  299. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  300. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  301. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  302. package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  303. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/pack.py +159 -0
  304. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/unpack.py +29 -0
  305. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validate.py +69 -0
  306. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/__init__.py +15 -0
  307. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/base.py +951 -0
  308. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/docx.py +274 -0
  309. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/pptx.py +315 -0
  310. package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/redlining.py +279 -0
  311. package/cli-tool/components/skills/document-processing/pptx/ooxml.md +427 -0
  312. package/cli-tool/components/skills/document-processing/pptx/scripts/html2pptx.js +979 -0
  313. package/cli-tool/components/skills/document-processing/pptx/scripts/inventory.py +1020 -0
  314. package/cli-tool/components/skills/document-processing/pptx/scripts/rearrange.py +231 -0
  315. package/cli-tool/components/skills/document-processing/pptx/scripts/replace.py +385 -0
  316. package/cli-tool/components/skills/document-processing/pptx/scripts/thumbnail.py +450 -0
  317. package/cli-tool/components/skills/document-processing/xlsx/LICENSE.txt +30 -0
  318. package/cli-tool/components/skills/document-processing/xlsx/SKILL.md +289 -0
  319. package/cli-tool/components/skills/document-processing/xlsx/recalc.py +178 -0
  320. package/cli-tool/components/skills/enterprise-communication/brand-guidelines/LICENSE.txt +202 -0
  321. package/cli-tool/components/skills/enterprise-communication/brand-guidelines/SKILL.md +73 -0
  322. package/cli-tool/components/skills/enterprise-communication/email-composer/SKILL.md +317 -0
  323. package/cli-tool/components/skills/enterprise-communication/excel-analysis/SKILL.md +247 -0
  324. package/cli-tool/components/skills/enterprise-communication/internal-comms/LICENSE.txt +202 -0
  325. package/cli-tool/components/skills/enterprise-communication/internal-comms/SKILL.md +32 -0
  326. package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/3p-updates.md +47 -0
  327. package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/company-newsletter.md +65 -0
  328. package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/faq-answers.md +30 -0
  329. package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/general-comms.md +16 -0
  330. package/cli-tool/package-lock.json +39 -16
  331. package/cli-tool/package.json +7 -2
  332. package/cli-tool/security-report.json +62361 -0
  333. package/cli-tool/src/analytics-web/chats_mobile.html +17 -16
  334. package/cli-tool/src/console-bridge.js +3 -3
  335. package/cli-tool/src/index.js +157 -10
  336. package/cli-tool/src/plugin-dashboard-web/app.js +806 -0
  337. package/cli-tool/src/plugin-dashboard-web/index.html +292 -0
  338. package/cli-tool/src/plugin-dashboard-web/styles.css +1781 -0
  339. package/cli-tool/src/plugin-dashboard.js +689 -0
  340. package/cli-tool/src/security-audit.js +164 -0
  341. package/cli-tool/src/validation/ARCHITECTURE.md +309 -0
  342. package/cli-tool/src/validation/BaseValidator.js +152 -0
  343. package/cli-tool/src/validation/README.md +543 -0
  344. package/cli-tool/src/validation/ValidationOrchestrator.js +305 -0
  345. package/cli-tool/src/validation/validators/IntegrityValidator.js +338 -0
  346. package/cli-tool/src/validation/validators/ProvenanceValidator.js +399 -0
  347. package/cli-tool/src/validation/validators/ReferenceValidator.js +373 -0
  348. package/cli-tool/src/validation/validators/SemanticValidator.js +449 -0
  349. package/cli-tool/src/validation/validators/StructuralValidator.js +376 -0
  350. package/docs/CLAUDE.md +363 -0
  351. package/docs/api/README.md +297 -0
  352. package/docs/api/package.json +7 -0
  353. package/docs/api/track-download-supabase.js +150 -0
  354. package/docs/blog/README.md +199 -0
  355. package/docs/blog/blog-articles.json +133 -0
  356. package/docs/blog/css/blog-controls.css +254 -0
  357. package/docs/blog/e2b-claude-code-sandbox/index.html +8 -0
  358. package/docs/blog/index.html +81 -124
  359. package/docs/blog/js/blog-loader.js +602 -0
  360. package/docs/blog/nextjs-vercel-claude-code-integration/index.html +8 -0
  361. package/docs/blog/supabase-claude-code-integration/index.html +8 -0
  362. package/docs/component.html +226 -48
  363. package/docs/components.json +61610 -604
  364. package/docs/css/blog.css +292 -0
  365. package/docs/css/component-page.css +840 -3
  366. package/docs/css/plugin-page.css +648 -0
  367. package/docs/css/styles.css +504 -1
  368. package/docs/css/trending.css +110 -6
  369. package/docs/download-stats.html +8 -0
  370. package/docs/index.html +48 -22
  371. package/docs/jobs.html +8 -0
  372. package/docs/js/cart-manager.js +21 -8
  373. package/docs/js/component-page.js +1013 -12
  374. package/docs/js/data-loader.js +11 -8
  375. package/docs/js/index-events.js +305 -53
  376. package/docs/js/plugin-page.js +390 -0
  377. package/docs/js/script.js +50 -3
  378. package/docs/js/search-functionality.js +19 -16
  379. package/docs/js/trending.js +55 -20
  380. package/docs/plugin.html +262 -0
  381. package/docs/sandbox-interface.html +8 -0
  382. package/docs/static/favicon/about.txt +6 -0
  383. package/docs/static/favicon/android-chrome-192x192.png +0 -0
  384. package/docs/static/favicon/android-chrome-512x512.png +0 -0
  385. package/docs/static/favicon/apple-touch-icon.png +0 -0
  386. package/docs/static/favicon/favicon-16x16.png +0 -0
  387. package/docs/static/favicon/favicon-32x32.png +0 -0
  388. package/docs/static/favicon/favicon.ico +0 -0
  389. package/docs/static/favicon/site.webmanifest +1 -0
  390. package/docs/trending-data.json +616 -579
  391. package/docs/trending.html +24 -3
  392. package/docs/vercel.json +12 -0
  393. package/docs/workflows.html +8 -0
  394. package/generate_components_json.py +386 -11
  395. package/package.json +1 -1
  396. package/sync-api.sh +50 -0
  397. package/vercel.json +10 -75
  398. package/ROADMAP.md +0 -278
  399. package/test_serpapi.py +0 -36
  400. /package/cli-tool/components/commands/svelte/{svelte:a11y.md → svelte-a11y.md} +0 -0
  401. /package/cli-tool/components/commands/svelte/{svelte:component.md → svelte-component.md} +0 -0
  402. /package/cli-tool/components/commands/svelte/{svelte:debug.md → svelte-debug.md} +0 -0
  403. /package/cli-tool/components/commands/svelte/{svelte:migrate.md → svelte-migrate.md} +0 -0
  404. /package/cli-tool/components/commands/svelte/{svelte:optimize.md → svelte-optimize.md} +0 -0
  405. /package/cli-tool/components/commands/svelte/{svelte:scaffold.md → svelte-scaffold.md} +0 -0
  406. /package/cli-tool/components/commands/svelte/{svelte:storybook-migrate.md → svelte-storybook-migrate.md} +0 -0
  407. /package/cli-tool/components/commands/svelte/{svelte:storybook-mock.md → svelte-storybook-mock.md} +0 -0
  408. /package/cli-tool/components/commands/svelte/{svelte:storybook-setup.md → svelte-storybook-setup.md} +0 -0
  409. /package/cli-tool/components/commands/svelte/{svelte:storybook-story.md → svelte-storybook-story.md} +0 -0
  410. /package/cli-tool/components/commands/svelte/{svelte:storybook-troubleshoot.md → svelte-storybook-troubleshoot.md} +0 -0
  411. /package/cli-tool/components/commands/svelte/{svelte:storybook.md → svelte-storybook.md} +0 -0
  412. /package/cli-tool/components/commands/svelte/{svelte:test-coverage.md → svelte-test-coverage.md} +0 -0
  413. /package/cli-tool/components/commands/svelte/{svelte:test-fix.md → svelte-test-fix.md} +0 -0
  414. /package/cli-tool/components/commands/svelte/{svelte:test-setup.md → svelte-test-setup.md} +0 -0
  415. /package/cli-tool/components/commands/svelte/{svelte:test.md → svelte-test.md} +0 -0
@@ -0,0 +1,357 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Typography System - Professional text rendering with outlines, shadows, and effects.
4
+
5
+ This module provides high-quality text rendering that looks crisp and professional
6
+ in GIFs, with outlines for readability and effects for visual impact.
7
+ """
8
+
9
+ from PIL import Image, ImageDraw, ImageFont
10
+ from typing import Optional
11
+
12
+
13
+ # Typography scale - proportional sizing system
14
+ TYPOGRAPHY_SCALE = {
15
+ 'h1': 60, # Large headers
16
+ 'h2': 48, # Medium headers
17
+ 'h3': 36, # Small headers
18
+ 'title': 50, # Title text
19
+ 'body': 28, # Body text
20
+ 'small': 20, # Small text
21
+ 'tiny': 16, # Tiny text
22
+ }
23
+
24
+
25
+ def get_font(size: int, bold: bool = False) -> ImageFont.FreeTypeFont:
26
+ """
27
+ Get a font with fallback support.
28
+
29
+ Args:
30
+ size: Font size in pixels
31
+ bold: Use bold variant if available
32
+
33
+ Returns:
34
+ ImageFont object
35
+ """
36
+ # Try multiple font paths for cross-platform support
37
+ font_paths = [
38
+ # macOS fonts
39
+ "/System/Library/Fonts/Helvetica.ttc",
40
+ "/System/Library/Fonts/SF-Pro.ttf",
41
+ "/Library/Fonts/Arial Bold.ttf" if bold else "/Library/Fonts/Arial.ttf",
42
+ # Linux fonts
43
+ "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
44
+ # Windows fonts
45
+ "C:\\Windows\\Fonts\\arialbd.ttf" if bold else "C:\\Windows\\Fonts\\arial.ttf",
46
+ ]
47
+
48
+ for font_path in font_paths:
49
+ try:
50
+ return ImageFont.truetype(font_path, size)
51
+ except:
52
+ continue
53
+
54
+ # Ultimate fallback
55
+ return ImageFont.load_default()
56
+
57
+
58
+ def draw_text_with_outline(
59
+ frame: Image.Image,
60
+ text: str,
61
+ position: tuple[int, int],
62
+ font_size: int = 40,
63
+ text_color: tuple[int, int, int] = (255, 255, 255),
64
+ outline_color: tuple[int, int, int] = (0, 0, 0),
65
+ outline_width: int = 3,
66
+ centered: bool = False,
67
+ bold: bool = True
68
+ ) -> Image.Image:
69
+ """
70
+ Draw text with outline for maximum readability.
71
+
72
+ This is THE most important function for professional-looking text in GIFs.
73
+ The outline ensures text is readable on any background.
74
+
75
+ Args:
76
+ frame: PIL Image to draw on
77
+ text: Text to draw
78
+ position: (x, y) position
79
+ font_size: Font size in pixels
80
+ text_color: RGB color for text fill
81
+ outline_color: RGB color for outline
82
+ outline_width: Width of outline in pixels (2-4 recommended)
83
+ centered: If True, center text at position
84
+ bold: Use bold font variant
85
+
86
+ Returns:
87
+ Modified frame
88
+ """
89
+ draw = ImageDraw.Draw(frame)
90
+ font = get_font(font_size, bold=bold)
91
+
92
+ # Calculate position for centering
93
+ if centered:
94
+ bbox = draw.textbbox((0, 0), text, font=font)
95
+ text_width = bbox[2] - bbox[0]
96
+ text_height = bbox[3] - bbox[1]
97
+ x = position[0] - text_width // 2
98
+ y = position[1] - text_height // 2
99
+ position = (x, y)
100
+
101
+ # Draw outline by drawing text multiple times offset in all directions
102
+ x, y = position
103
+ for offset_x in range(-outline_width, outline_width + 1):
104
+ for offset_y in range(-outline_width, outline_width + 1):
105
+ if offset_x != 0 or offset_y != 0:
106
+ draw.text((x + offset_x, y + offset_y), text, fill=outline_color, font=font)
107
+
108
+ # Draw main text on top
109
+ draw.text(position, text, fill=text_color, font=font)
110
+
111
+ return frame
112
+
113
+
114
+ def draw_text_with_shadow(
115
+ frame: Image.Image,
116
+ text: str,
117
+ position: tuple[int, int],
118
+ font_size: int = 40,
119
+ text_color: tuple[int, int, int] = (255, 255, 255),
120
+ shadow_color: tuple[int, int, int] = (0, 0, 0),
121
+ shadow_offset: tuple[int, int] = (3, 3),
122
+ centered: bool = False,
123
+ bold: bool = True
124
+ ) -> Image.Image:
125
+ """
126
+ Draw text with drop shadow for depth.
127
+
128
+ Args:
129
+ frame: PIL Image to draw on
130
+ text: Text to draw
131
+ position: (x, y) position
132
+ font_size: Font size in pixels
133
+ text_color: RGB color for text
134
+ shadow_color: RGB color for shadow
135
+ shadow_offset: (x, y) offset for shadow
136
+ centered: If True, center text at position
137
+ bold: Use bold font variant
138
+
139
+ Returns:
140
+ Modified frame
141
+ """
142
+ draw = ImageDraw.Draw(frame)
143
+ font = get_font(font_size, bold=bold)
144
+
145
+ # Calculate position for centering
146
+ if centered:
147
+ bbox = draw.textbbox((0, 0), text, font=font)
148
+ text_width = bbox[2] - bbox[0]
149
+ text_height = bbox[3] - bbox[1]
150
+ x = position[0] - text_width // 2
151
+ y = position[1] - text_height // 2
152
+ position = (x, y)
153
+
154
+ # Draw shadow
155
+ shadow_pos = (position[0] + shadow_offset[0], position[1] + shadow_offset[1])
156
+ draw.text(shadow_pos, text, fill=shadow_color, font=font)
157
+
158
+ # Draw main text
159
+ draw.text(position, text, fill=text_color, font=font)
160
+
161
+ return frame
162
+
163
+
164
+ def draw_text_with_glow(
165
+ frame: Image.Image,
166
+ text: str,
167
+ position: tuple[int, int],
168
+ font_size: int = 40,
169
+ text_color: tuple[int, int, int] = (255, 255, 255),
170
+ glow_color: tuple[int, int, int] = (255, 200, 0),
171
+ glow_radius: int = 5,
172
+ centered: bool = False,
173
+ bold: bool = True
174
+ ) -> Image.Image:
175
+ """
176
+ Draw text with glow effect for emphasis.
177
+
178
+ Args:
179
+ frame: PIL Image to draw on
180
+ text: Text to draw
181
+ position: (x, y) position
182
+ font_size: Font size in pixels
183
+ text_color: RGB color for text
184
+ glow_color: RGB color for glow
185
+ glow_radius: Radius of glow effect
186
+ centered: If True, center text at position
187
+ bold: Use bold font variant
188
+
189
+ Returns:
190
+ Modified frame
191
+ """
192
+ draw = ImageDraw.Draw(frame)
193
+ font = get_font(font_size, bold=bold)
194
+
195
+ # Calculate position for centering
196
+ if centered:
197
+ bbox = draw.textbbox((0, 0), text, font=font)
198
+ text_width = bbox[2] - bbox[0]
199
+ text_height = bbox[3] - bbox[1]
200
+ x = position[0] - text_width // 2
201
+ y = position[1] - text_height // 2
202
+ position = (x, y)
203
+
204
+ # Draw glow layers with decreasing opacity (simulated with same color at different offsets)
205
+ x, y = position
206
+ for radius in range(glow_radius, 0, -1):
207
+ for offset_x in range(-radius, radius + 1):
208
+ for offset_y in range(-radius, radius + 1):
209
+ if offset_x != 0 or offset_y != 0:
210
+ draw.text((x + offset_x, y + offset_y), text, fill=glow_color, font=font)
211
+
212
+ # Draw main text
213
+ draw.text(position, text, fill=text_color, font=font)
214
+
215
+ return frame
216
+
217
+
218
+ def draw_text_in_box(
219
+ frame: Image.Image,
220
+ text: str,
221
+ position: tuple[int, int],
222
+ font_size: int = 40,
223
+ text_color: tuple[int, int, int] = (255, 255, 255),
224
+ box_color: tuple[int, int, int] = (0, 0, 0),
225
+ box_alpha: float = 0.7,
226
+ padding: int = 10,
227
+ centered: bool = True,
228
+ bold: bool = True
229
+ ) -> Image.Image:
230
+ """
231
+ Draw text in a semi-transparent box for guaranteed readability.
232
+
233
+ Args:
234
+ frame: PIL Image to draw on
235
+ text: Text to draw
236
+ position: (x, y) position
237
+ font_size: Font size in pixels
238
+ text_color: RGB color for text
239
+ box_color: RGB color for background box
240
+ box_alpha: Opacity of box (0.0-1.0)
241
+ padding: Padding around text in pixels
242
+ centered: If True, center at position
243
+ bold: Use bold font variant
244
+
245
+ Returns:
246
+ Modified frame
247
+ """
248
+ # Create a separate layer for the box with alpha
249
+ overlay = Image.new('RGBA', frame.size, (0, 0, 0, 0))
250
+ draw_overlay = ImageDraw.Draw(overlay)
251
+ draw = ImageDraw.Draw(frame)
252
+
253
+ font = get_font(font_size, bold=bold)
254
+
255
+ # Get text dimensions
256
+ bbox = draw.textbbox((0, 0), text, font=font)
257
+ text_width = bbox[2] - bbox[0]
258
+ text_height = bbox[3] - bbox[1]
259
+
260
+ # Calculate box position
261
+ if centered:
262
+ box_x = position[0] - (text_width + padding * 2) // 2
263
+ box_y = position[1] - (text_height + padding * 2) // 2
264
+ text_x = position[0] - text_width // 2
265
+ text_y = position[1] - text_height // 2
266
+ else:
267
+ box_x = position[0] - padding
268
+ box_y = position[1] - padding
269
+ text_x = position[0]
270
+ text_y = position[1]
271
+
272
+ # Draw semi-transparent box
273
+ box_coords = [
274
+ box_x,
275
+ box_y,
276
+ box_x + text_width + padding * 2,
277
+ box_y + text_height + padding * 2
278
+ ]
279
+ alpha_value = int(255 * box_alpha)
280
+ draw_overlay.rectangle(box_coords, fill=(*box_color, alpha_value))
281
+
282
+ # Composite overlay onto frame
283
+ frame_rgba = frame.convert('RGBA')
284
+ frame_rgba = Image.alpha_composite(frame_rgba, overlay)
285
+ frame = frame_rgba.convert('RGB')
286
+
287
+ # Draw text on top
288
+ draw = ImageDraw.Draw(frame)
289
+ draw.text((text_x, text_y), text, fill=text_color, font=font)
290
+
291
+ return frame
292
+
293
+
294
+ def get_text_size(text: str, font_size: int, bold: bool = True) -> tuple[int, int]:
295
+ """
296
+ Get the dimensions of text without drawing it.
297
+
298
+ Args:
299
+ text: Text to measure
300
+ font_size: Font size in pixels
301
+ bold: Use bold font variant
302
+
303
+ Returns:
304
+ (width, height) tuple
305
+ """
306
+ font = get_font(font_size, bold=bold)
307
+ # Create temporary image to measure
308
+ temp_img = Image.new('RGB', (1, 1))
309
+ draw = ImageDraw.Draw(temp_img)
310
+ bbox = draw.textbbox((0, 0), text, font=font)
311
+ width = bbox[2] - bbox[0]
312
+ height = bbox[3] - bbox[1]
313
+ return (width, height)
314
+
315
+
316
+ def get_optimal_font_size(text: str, max_width: int, max_height: int,
317
+ start_size: int = 60) -> int:
318
+ """
319
+ Find the largest font size that fits within given dimensions.
320
+
321
+ Args:
322
+ text: Text to size
323
+ max_width: Maximum width in pixels
324
+ max_height: Maximum height in pixels
325
+ start_size: Starting font size to try
326
+
327
+ Returns:
328
+ Optimal font size
329
+ """
330
+ font_size = start_size
331
+ while font_size > 10:
332
+ width, height = get_text_size(text, font_size)
333
+ if width <= max_width and height <= max_height:
334
+ return font_size
335
+ font_size -= 2
336
+ return 10 # Minimum font size
337
+
338
+
339
+ def scale_font_for_frame(base_size: int, frame_width: int, frame_height: int) -> int:
340
+ """
341
+ Scale font size proportionally to frame dimensions.
342
+
343
+ Useful for maintaining relative text size across different GIF dimensions.
344
+
345
+ Args:
346
+ base_size: Base font size for 480x480 frame
347
+ frame_width: Actual frame width
348
+ frame_height: Actual frame height
349
+
350
+ Returns:
351
+ Scaled font size
352
+ """
353
+ # Use average dimension for scaling
354
+ avg_dimension = (frame_width + frame_height) / 2
355
+ base_dimension = 480 # Reference dimension
356
+ scale_factor = avg_dimension / base_dimension
357
+ return max(10, int(base_size * scale_factor))
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Validators - Check if GIFs meet Slack's requirements.
4
+
5
+ These validators help ensure your GIFs meet Slack's size and dimension constraints.
6
+ """
7
+
8
+ from pathlib import Path
9
+
10
+
11
+ def check_slack_size(gif_path: str | Path, is_emoji: bool = True) -> tuple[bool, dict]:
12
+ """
13
+ Check if GIF meets Slack size limits.
14
+
15
+ Args:
16
+ gif_path: Path to GIF file
17
+ is_emoji: True for emoji GIF (64KB limit), False for message GIF (2MB limit)
18
+
19
+ Returns:
20
+ Tuple of (passes: bool, info: dict with details)
21
+ """
22
+ gif_path = Path(gif_path)
23
+
24
+ if not gif_path.exists():
25
+ return False, {'error': f'File not found: {gif_path}'}
26
+
27
+ size_bytes = gif_path.stat().st_size
28
+ size_kb = size_bytes / 1024
29
+ size_mb = size_kb / 1024
30
+
31
+ limit_kb = 64 if is_emoji else 2048
32
+ limit_mb = limit_kb / 1024
33
+
34
+ passes = size_kb <= limit_kb
35
+
36
+ info = {
37
+ 'size_bytes': size_bytes,
38
+ 'size_kb': size_kb,
39
+ 'size_mb': size_mb,
40
+ 'limit_kb': limit_kb,
41
+ 'limit_mb': limit_mb,
42
+ 'passes': passes,
43
+ 'type': 'emoji' if is_emoji else 'message'
44
+ }
45
+
46
+ # Print feedback
47
+ if passes:
48
+ print(f"✓ {size_kb:.1f} KB - within {limit_kb} KB limit")
49
+ else:
50
+ print(f"✗ {size_kb:.1f} KB - exceeds {limit_kb} KB limit")
51
+ overage_kb = size_kb - limit_kb
52
+ overage_percent = (overage_kb / limit_kb) * 100
53
+ print(f" Over by: {overage_kb:.1f} KB ({overage_percent:.1f}%)")
54
+ print(f" Try: fewer frames, fewer colors, or simpler design")
55
+
56
+ return passes, info
57
+
58
+
59
+ def validate_dimensions(width: int, height: int, is_emoji: bool = True) -> tuple[bool, dict]:
60
+ """
61
+ Check if dimensions are suitable for Slack.
62
+
63
+ Args:
64
+ width: Frame width in pixels
65
+ height: Frame height in pixels
66
+ is_emoji: True for emoji GIF, False for message GIF
67
+
68
+ Returns:
69
+ Tuple of (passes: bool, info: dict with details)
70
+ """
71
+ info = {
72
+ 'width': width,
73
+ 'height': height,
74
+ 'is_square': width == height,
75
+ 'type': 'emoji' if is_emoji else 'message'
76
+ }
77
+
78
+ if is_emoji:
79
+ # Emoji GIFs should be 128x128
80
+ optimal = width == height == 128
81
+ acceptable = width == height and 64 <= width <= 128
82
+
83
+ info['optimal'] = optimal
84
+ info['acceptable'] = acceptable
85
+
86
+ if optimal:
87
+ print(f"✓ {width}x{height} - optimal for emoji")
88
+ passes = True
89
+ elif acceptable:
90
+ print(f"⚠ {width}x{height} - acceptable but 128x128 is optimal")
91
+ passes = True
92
+ else:
93
+ print(f"✗ {width}x{height} - emoji should be square, 128x128 recommended")
94
+ passes = False
95
+ else:
96
+ # Message GIFs should be square-ish and reasonable size
97
+ aspect_ratio = max(width, height) / min(width, height) if min(width, height) > 0 else float('inf')
98
+ reasonable_size = 320 <= min(width, height) <= 640
99
+
100
+ info['aspect_ratio'] = aspect_ratio
101
+ info['reasonable_size'] = reasonable_size
102
+
103
+ # Check if roughly square (within 2:1 ratio)
104
+ is_square_ish = aspect_ratio <= 2.0
105
+
106
+ if is_square_ish and reasonable_size:
107
+ print(f"✓ {width}x{height} - good for message GIF")
108
+ passes = True
109
+ elif is_square_ish:
110
+ print(f"⚠ {width}x{height} - square-ish but unusual size")
111
+ passes = True
112
+ elif reasonable_size:
113
+ print(f"⚠ {width}x{height} - good size but not square-ish")
114
+ passes = True
115
+ else:
116
+ print(f"✗ {width}x{height} - unusual dimensions for Slack")
117
+ passes = False
118
+
119
+ return passes, info
120
+
121
+
122
+ def validate_gif(gif_path: str | Path, is_emoji: bool = True) -> tuple[bool, dict]:
123
+ """
124
+ Run all validations on a GIF file.
125
+
126
+ Args:
127
+ gif_path: Path to GIF file
128
+ is_emoji: True for emoji GIF, False for message GIF
129
+
130
+ Returns:
131
+ Tuple of (all_pass: bool, results: dict)
132
+ """
133
+ from PIL import Image
134
+
135
+ gif_path = Path(gif_path)
136
+
137
+ if not gif_path.exists():
138
+ return False, {'error': f'File not found: {gif_path}'}
139
+
140
+ print(f"\nValidating {gif_path.name} as {'emoji' if is_emoji else 'message'} GIF:")
141
+ print("=" * 60)
142
+
143
+ # Check file size
144
+ size_pass, size_info = check_slack_size(gif_path, is_emoji)
145
+
146
+ # Check dimensions
147
+ try:
148
+ with Image.open(gif_path) as img:
149
+ width, height = img.size
150
+ dim_pass, dim_info = validate_dimensions(width, height, is_emoji)
151
+
152
+ # Count frames
153
+ frame_count = 0
154
+ try:
155
+ while True:
156
+ img.seek(frame_count)
157
+ frame_count += 1
158
+ except EOFError:
159
+ pass
160
+
161
+ # Get duration if available
162
+ try:
163
+ duration_ms = img.info.get('duration', 100)
164
+ total_duration = (duration_ms * frame_count) / 1000
165
+ fps = frame_count / total_duration if total_duration > 0 else 0
166
+ except:
167
+ duration_ms = None
168
+ total_duration = None
169
+ fps = None
170
+
171
+ except Exception as e:
172
+ return False, {'error': f'Failed to read GIF: {e}'}
173
+
174
+ print(f"\nFrames: {frame_count}")
175
+ if total_duration:
176
+ print(f"Duration: {total_duration:.1f}s @ {fps:.1f} fps")
177
+
178
+ all_pass = size_pass and dim_pass
179
+
180
+ results = {
181
+ 'file': str(gif_path),
182
+ 'passes': all_pass,
183
+ 'size': size_info,
184
+ 'dimensions': dim_info,
185
+ 'frame_count': frame_count,
186
+ 'duration_seconds': total_duration,
187
+ 'fps': fps
188
+ }
189
+
190
+ print("=" * 60)
191
+ if all_pass:
192
+ print("✓ All validations passed!")
193
+ else:
194
+ print("✗ Some validations failed")
195
+ print()
196
+
197
+ return all_pass, results
198
+
199
+
200
+ def get_optimization_suggestions(results: dict) -> list[str]:
201
+ """
202
+ Get suggestions for optimizing a GIF based on validation results.
203
+
204
+ Args:
205
+ results: Results dict from validate_gif()
206
+
207
+ Returns:
208
+ List of suggestion strings
209
+ """
210
+ suggestions = []
211
+
212
+ if not results.get('passes', False):
213
+ size_info = results.get('size', {})
214
+ dim_info = results.get('dimensions', {})
215
+
216
+ # Size suggestions
217
+ if not size_info.get('passes', True):
218
+ overage = size_info['size_kb'] - size_info['limit_kb']
219
+ if size_info['type'] == 'emoji':
220
+ suggestions.append(f"Reduce file size by {overage:.1f} KB:")
221
+ suggestions.append(" - Limit to 10-12 frames")
222
+ suggestions.append(" - Use 32-40 colors maximum")
223
+ suggestions.append(" - Remove gradients (solid colors compress better)")
224
+ suggestions.append(" - Simplify design")
225
+ else:
226
+ suggestions.append(f"Reduce file size by {overage:.1f} KB:")
227
+ suggestions.append(" - Reduce frame count or FPS")
228
+ suggestions.append(" - Use fewer colors (128 → 64)")
229
+ suggestions.append(" - Reduce dimensions")
230
+
231
+ # Dimension suggestions
232
+ if not dim_info.get('optimal', True) and dim_info.get('type') == 'emoji':
233
+ suggestions.append("For optimal emoji GIF:")
234
+ suggestions.append(" - Use 128x128 dimensions")
235
+ suggestions.append(" - Ensure square aspect ratio")
236
+
237
+ return suggestions
238
+
239
+
240
+ # Convenience function for quick checks
241
+ def is_slack_ready(gif_path: str | Path, is_emoji: bool = True, verbose: bool = True) -> bool:
242
+ """
243
+ Quick check if GIF is ready for Slack.
244
+
245
+ Args:
246
+ gif_path: Path to GIF file
247
+ is_emoji: True for emoji GIF, False for message GIF
248
+ verbose: Print detailed feedback
249
+
250
+ Returns:
251
+ True if ready, False otherwise
252
+ """
253
+ if verbose:
254
+ passes, results = validate_gif(gif_path, is_emoji)
255
+ if not passes:
256
+ suggestions = get_optimization_suggestions(results)
257
+ if suggestions:
258
+ print("\nSuggestions:")
259
+ for suggestion in suggestions:
260
+ print(suggestion)
261
+ return passes
262
+ else:
263
+ size_pass, _ = check_slack_size(gif_path, is_emoji)
264
+ return size_pass