@nguyenphp/antigravity-marketing 1.0.18 → 1.0.19

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 (127) hide show
  1. package/README.md +186 -78
  2. package/package.json +4 -3
  3. package/templates/.agent/skills/marketing-report-expert/SKILL.md +70 -0
  4. package/templates/.agent/skills/minimax-docx/LICENSE +21 -0
  5. package/templates/.agent/skills/minimax-docx/SKILL.md +274 -0
  6. package/templates/.agent/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
  7. package/templates/.agent/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
  8. package/templates/.agent/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
  9. package/templates/.agent/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
  10. package/templates/.agent/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
  11. package/templates/.agent/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
  12. package/templates/.agent/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
  13. package/templates/.agent/skills/minimax-docx/references/cjk_typography.md +357 -0
  14. package/templates/.agent/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
  15. package/templates/.agent/skills/minimax-docx/references/comments_guide.md +191 -0
  16. package/templates/.agent/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
  17. package/templates/.agent/skills/minimax-docx/references/design_principles.md +819 -0
  18. package/templates/.agent/skills/minimax-docx/references/openxml_element_order.md +308 -0
  19. package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
  20. package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
  21. package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
  22. package/templates/.agent/skills/minimax-docx/references/openxml_namespaces.md +82 -0
  23. package/templates/.agent/skills/minimax-docx/references/openxml_units.md +72 -0
  24. package/templates/.agent/skills/minimax-docx/references/scenario_a_create.md +284 -0
  25. package/templates/.agent/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
  26. package/templates/.agent/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
  27. package/templates/.agent/skills/minimax-docx/references/track_changes_guide.md +200 -0
  28. package/templates/.agent/skills/minimax-docx/references/troubleshooting.md +506 -0
  29. package/templates/.agent/skills/minimax-docx/references/typography_guide.md +294 -0
  30. package/templates/.agent/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
  31. package/templates/.agent/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
  32. package/templates/.agent/skills/minimax-docx/scripts/docx_preview.sh +37 -0
  33. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
  34. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
  35. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
  36. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
  37. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
  38. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
  39. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
  40. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
  41. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
  42. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
  43. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
  44. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
  45. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
  46. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
  47. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
  48. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
  49. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
  50. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
  51. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
  52. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
  53. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
  54. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
  55. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
  56. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
  57. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
  58. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
  59. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
  60. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
  61. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
  62. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
  63. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
  64. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
  65. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
  66. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
  67. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
  68. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
  69. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
  70. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
  71. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
  72. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
  73. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
  74. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
  75. package/templates/.agent/skills/minimax-docx/scripts/env_check.sh +196 -0
  76. package/templates/.agent/skills/minimax-docx/scripts/setup.ps1 +274 -0
  77. package/templates/.agent/skills/minimax-docx/scripts/setup.sh +504 -0
  78. package/templates/.agent/skills/minimax-multimodal-toolkit/SKILL.md +359 -0
  79. package/templates/.agent/skills/minimax-pdf/README.md +222 -0
  80. package/templates/.agent/skills/minimax-pdf/SKILL.md +201 -0
  81. package/templates/.agent/skills/minimax-pdf/design/design.md +381 -0
  82. package/templates/.agent/skills/minimax-pdf/scripts/cover.py +1579 -0
  83. package/templates/.agent/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
  84. package/templates/.agent/skills/minimax-pdf/scripts/fill_write.py +242 -0
  85. package/templates/.agent/skills/minimax-pdf/scripts/make.sh +491 -0
  86. package/templates/.agent/skills/minimax-pdf/scripts/merge.py +112 -0
  87. package/templates/.agent/skills/minimax-pdf/scripts/palette.py +559 -0
  88. package/templates/.agent/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
  89. package/templates/.agent/skills/minimax-pdf/scripts/render_body.py +1055 -0
  90. package/templates/.agent/skills/minimax-pdf/scripts/render_cover.cjs +111 -0
  91. package/templates/.agent/skills/minimax-xlsx/SKILL.md +138 -0
  92. package/templates/.agent/skills/minimax-xlsx/references/create.md +691 -0
  93. package/templates/.agent/skills/minimax-xlsx/references/edit.md +684 -0
  94. package/templates/.agent/skills/minimax-xlsx/references/fix.md +37 -0
  95. package/templates/.agent/skills/minimax-xlsx/references/format.md +768 -0
  96. package/templates/.agent/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
  97. package/templates/.agent/skills/minimax-xlsx/references/read-analyze.md +97 -0
  98. package/templates/.agent/skills/minimax-xlsx/references/validate.md +772 -0
  99. package/templates/.agent/skills/minimax-xlsx/scripts/formula_check.py +422 -0
  100. package/templates/.agent/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
  101. package/templates/.agent/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
  102. package/templates/.agent/skills/minimax-xlsx/scripts/style_audit.py +575 -0
  103. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
  104. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
  105. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
  106. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
  107. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
  108. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
  109. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
  110. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
  111. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
  112. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
  113. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
  114. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
  115. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
  116. package/templates/.agent/skills/pptx-generator/SKILL.md +249 -0
  117. package/templates/.agent/skills/pptx-generator/references/design-system.md +392 -0
  118. package/templates/.agent/skills/pptx-generator/references/editing.md +162 -0
  119. package/templates/.agent/skills/pptx-generator/references/pitfalls.md +112 -0
  120. package/templates/.agent/skills/pptx-generator/references/pptxgenjs.md +420 -0
  121. package/templates/.agent/skills/pptx-generator/references/slide-types.md +413 -0
  122. package/templates/.agent/skills/tutorial-video-expert/SKILL.md +88 -0
  123. package/templates/.agent/skills/ui-ux-pro-max/SKILL.md +170 -585
  124. package/templates/.agent/skills/vision-analysis/SKILL.md +174 -0
  125. package/templates/.agent/workflows/analyze.md +3 -0
  126. package/templates/.agent/workflows/brand-report.md +44 -0
  127. package/templates/.agent/workflows/report.md +49 -0
@@ -0,0 +1,392 @@
1
+ # Design System
2
+
3
+ ## Color Palette Reference
4
+
5
+ | # | Name | Colors | Style | Use Cases | Tips |
6
+ |---|------|--------|-------|-----------|------|
7
+ | 1 | Modern & Wellness | `#006d77` `#83c5be` `#edf6f9` `#ffddd2` `#e29578` | Fresh, soothing | Healthcare, counseling, skincare, yoga/spa | Deep teal for titles, light pink for background |
8
+ | 2 | Business & Authority | `#2b2d42` `#8d99ae` `#edf2f4` `#ef233c` `#d90429` | Formal, classic | Annual reports, financial analysis, corporate intro, government | Deep blue for professionalism, bright red to highlight data |
9
+ | 3 | Nature & Outdoors | `#606c38` `#283618` `#fefae0` `#dda15e` `#bc6c25` | Grounded, earthy | Outdoor gear, environmental, agriculture, historical culture | Dark green base, cream text |
10
+ | 4 | Vintage & Academic | `#780000` `#c1121f` `#fdf0d5` `#003049` `#669bbc` | Classic, scholarly | Academic lectures, history reviews, museums, heritage brands | Strong contrast between deep red and deep blue |
11
+ | 5 | Soft & Creative | `#cdb4db` `#ffc8dd` `#ffafcc` `#bde0fe` `#a2d2ff` | Dreamy, candy-toned | Mother & baby, desserts, women's fashion, kindergarten | Use dark gray or black for text |
12
+ | 6 | Bohemian | `#ccd5ae` `#e9edc9` `#fefae0` `#faedcd` `#d4a373` | Gentle, muted | Wedding planning, home decor, organic food, slow living | Cream background, green-brown accents |
13
+ | 7 | Vibrant & Tech | `#8ecae6` `#219ebc` `#023047` `#ffb703` `#fb8500` | High energy, sporty | Sports events, gyms, startup pitches, youth education | Deep blue for stability, orange as focal accent |
14
+ | 8 | Craft & Artisan | `#7f5539` `#a68a64` `#ede0d4` `#656d4a` `#414833` | Rustic, coffee-toned | Coffee shops, handicrafts, traditional culture, bakery | Suited for paper/leather textures |
15
+ | 9 | Tech & Night | `#000814` `#001d3d` `#003566` `#ffc300` `#ffd60a` | Deep, luminous | Tech launches, astronomy, night economy, luxury automobiles | Must use dark mode |
16
+ | 10 | Education & Charts | `#264653` `#2a9d8f` `#e9c46a` `#f4a261` `#e76f51` | Clear, logical | Statistical reports, education, market analysis, general business | Perfect chart color scheme |
17
+ | 11 | Forest & Eco | `#dad7cd` `#a3b18a` `#588157` `#3a5a40` `#344e41` | Monochrome gradient, forest | Landscape design, ESG reports, environmental causes, botanical | Monochrome palette is safe and cohesive |
18
+ | 12 | Elegant & Fashion | `#edafb8` `#f7e1d7` `#dedbd2` `#b0c4b1` `#4a5759` | Muted, Morandi tones | Haute couture, art galleries, beauty brands, magazine style | Negative space is key |
19
+ | 13 | Art & Food | `#335c67` `#fff3b0` `#e09f3e` `#9e2a2b` `#540b0e` | Rich, vintage-poster | Food documentaries, art exhibitions, ethnic themes, vintage restaurants | Works well with large color blocks |
20
+ | 14 | Luxury & Mysterious | `#22223b` `#4a4e69` `#9a8c98` `#c9ada7` `#f2e9e4` | Cool, purple-toned | Jewelry showcases, hotel management, high-end consulting, psychology | Purple evokes premium atmosphere |
21
+ | 15 | Pure Tech Blue | `#03045e` `#0077b6` `#00b4d8` `#90e0ef` `#caf0f8` | Futuristic, clean | Cloud/AI, water/ocean, hospitals, clean energy | Deep ocean to sky gradient |
22
+ | 16 | Coastal Coral | `#0081a7` `#00afb9` `#fdfcdc` `#fed9b7` `#f07167` | Refreshing, summery | Travel, summer events, beverage brands, ocean themes | Teal and coral as complementary focal colors |
23
+ | 17 | Vibrant Orange Mint | `#ff9f1c` `#ffbf69` `#ffffff` `#cbf3f0` `#2ec4b6` | Bright, cheerful | Children's events, promotional posters, FMCG, social media | Orange grabs attention, mint feels fresh |
24
+ | 18 | Platinum White Gold | `#0a0a0a` `#0070F3` `#D4AF37` `#f5f5f5` `#ffffff` | Premium, professional | Agent products, corporate websites, fintech, luxury brands | White-gold base, blue for action, gold for emphasis |
25
+
26
+ ---
27
+
28
+ ### Agent Design System — Full Color Scale
29
+
30
+ Based on the Platinum White-Gold Theme design tokens. Provides complete color scales for fine-grained design work.
31
+
32
+ #### White Scale (Backgrounds & Light Surfaces)
33
+
34
+ | Token | Value | Usage |
35
+ |-------|-------|-------|
36
+ | white-0 | `#ffffff` | Primary background |
37
+ | white-50 | `#fefefe` | Slightly warm white |
38
+ | white-75 | `#fcfcfc` | Near-white |
39
+ | white-100 | `#fafafa` | Secondary background |
40
+ | white-200 | `#f7f7f7` | Card background |
41
+ | white-300 | `#f5f5f5` | Tertiary background |
42
+ | white-400 | `#f0f0f0` | Separator zones |
43
+ | white-500 | `#ebebeb` | Light border |
44
+ | white-600 | `#e5e5e5` | Disabled background |
45
+ | white-700 | `#e0e0e0` | Deep white-gray |
46
+ | white-800 | `#d9d9d9` | Placeholder |
47
+ | white-900 | `#d4d4d4` | Divider lines |
48
+ | white-1000 | `#cccccc` | Deepest white |
49
+
50
+ #### Gold Scale (Platinum Business Accent)
51
+
52
+ | Token | Value | Usage |
53
+ |-------|-------|-------|
54
+ | gold-25 | `#FFFDF5` | Extremely light gold background |
55
+ | gold-50 | `#FEF9E7` | Light gold background |
56
+ | gold-75 | `#FCF3D0` | Pale gold highlight |
57
+ | gold-100 | `#FAECB8` | Gold hover state |
58
+ | gold-200 | `#F5DC8A` | Bright gold accent |
59
+ | gold-300 | `#E8C860` | Gold hover |
60
+ | gold-400 | `#D4AF37` | **Primary gold (core)** |
61
+ | gold-500 | `#B8972E` | Gold text |
62
+ | gold-600 | `#9A7E26` | Deep gold accent |
63
+ | gold-700 | `#7C651E` | Dark gold border |
64
+ | gold-800 | `#5E4C16` | Deep gold background |
65
+ | gold-900 | `#40330F` | Very deep gold |
66
+ | gold-1000 | `#221A08` | Black gold |
67
+
68
+ #### Blue Scale (Primary Action Color)
69
+
70
+ | Token | Value | Usage |
71
+ |-------|-------|-------|
72
+ | blue-25 | `#F0F7FF` | Extremely light blue background |
73
+ | blue-50 | `#E0EFFF` | Info alert background |
74
+ | blue-75 | `#C2DFFF` | Light blue highlight |
75
+ | blue-100 | `#A3CFFF` | Disabled blue |
76
+ | blue-200 | `#66AFFF` | Bright blue |
77
+ | blue-300 | `#338FFF` | Blue hover |
78
+ | blue-400 | `#0070F3` | **Primary blue (core)** |
79
+ | blue-500 | `#005FCC` | Blue text |
80
+ | blue-600 | `#004FA6` | Deep blue accent |
81
+ | blue-700 | `#003F80` | Dark blue border |
82
+ | blue-800 | `#002F5A` | Deep blue background |
83
+ | blue-900 | `#001F3D` | Very deep blue |
84
+ | blue-1000 | `#001026` | Black blue |
85
+
86
+ #### Gray Scale (Text & Neutral Colors)
87
+
88
+ | Token | Value | Usage |
89
+ |-------|-------|-------|
90
+ | gray-0 | `#ffffff` | White |
91
+ | gray-50 | `#fafafa` | Extremely light gray |
92
+ | gray-75 | `#f5f5f5` | Light gray background |
93
+ | gray-100 | `#ededed` | Light divider |
94
+ | gray-200 | `#d4d4d4` | Light border |
95
+ | gray-300 | `#a3a3a3` | Quaternary text |
96
+ | gray-400 | `#737373` | Tertiary text |
97
+ | gray-500 | `#525252` | Secondary text |
98
+ | gray-600 | `#404040` | Dark gray |
99
+ | gray-700 | `#2e2e2e` | Dark background |
100
+ | gray-800 | `#1f1f1f` | Deep background |
101
+ | gray-900 | `#141414` | Very deep background |
102
+ | gray-1000 | `#0a0a0a` | **Primary text (core)** |
103
+
104
+ #### Opacity Values
105
+
106
+ ##### Opacity Black
107
+
108
+ | Opacity | Value | Usage |
109
+ |---------|-------|-------|
110
+ | 0% | `#0a0a0a00` | Fully transparent |
111
+ | 2% | `#0a0a0a05` | Subtle overlay |
112
+ | 4% | `#0a0a0a0a` | Secondary interactive background |
113
+ | 8% | `#0a0a0a14` | Border / divider |
114
+ | 15% | `#0a0a0a26` | Pressed state |
115
+ | 20% | `#0a0a0a33` | Light overlay |
116
+ | 25% | `#0a0a0a40` | Medium overlay |
117
+ | 50% | `#0a0a0a80` | Semi-transparent |
118
+ | 70% | `#0a0a0ab2` | Deep overlay |
119
+ | 80% | `#0a0a0acc` | Hover state |
120
+ | 90% | `#0a0a0ae5` | Tooltip |
121
+ | 95% | `#0a0a0af2` | Modal |
122
+
123
+ ##### Opacity White
124
+
125
+ | Opacity | Value | Usage |
126
+ |---------|-------|-------|
127
+ | 0% | `#ffffff00` | Fully transparent |
128
+ | 2% | `#ffffff05` | Subtle overlay |
129
+ | 4% | `#ffffff0a` | Secondary interactive background |
130
+ | 8% | `#ffffff12` | Border / divider |
131
+ | 15% | `#ffffff26` | Pressed state |
132
+ | 20% | `#ffffff33` | Light overlay |
133
+ | 25% | `#ffffff40` | Medium overlay |
134
+ | 50% | `#ffffff80` | Semi-transparent |
135
+ | 70% | `#ffffffb2` | Deep overlay |
136
+ | 80% | `#ffffffcc` | Hover state |
137
+ | 90% | `#ffffffe5` | Tooltip |
138
+ | 95% | `#fffffff2` | Modal |
139
+
140
+ ---
141
+
142
+ ## Color Palette Rules (MANDATORY)
143
+
144
+ ### Strict Palette Adherence
145
+
146
+ **Use ONLY the provided color palette. Do NOT create or modify colors.**
147
+
148
+ - All colors must come from the user-provided palette
149
+ - Do NOT use colors outside the palette
150
+ - Do NOT modify palette colors (brightness, saturation, mixing)
151
+ - **Only exception**: Add transparency using the `transparency` property (0-100)
152
+
153
+ ```javascript
154
+ // Correct: Using palette colors
155
+ slide.addShape(pres.shapes.RECTANGLE, { fill: { color: theme.primary } });
156
+ slide.addText("Title", { color: theme.accent });
157
+
158
+ // Wrong: Colors outside palette
159
+ slide.addShape(pres.shapes.RECTANGLE, { fill: { color: "1a1a2e" } });
160
+ ```
161
+
162
+ ### No Gradients
163
+
164
+ **Gradients are prohibited. Use solid colors only.**
165
+
166
+ ### No Animations
167
+
168
+ **Animations and transitions are prohibited.** All slides must be static.
169
+
170
+ ---
171
+
172
+ ## Font Reference
173
+
174
+ ### Recommended Fonts
175
+
176
+ | Language | Default Font | Alternatives |
177
+ |----------|-------------|--------------|
178
+ | **Chinese** | Microsoft YaHei | — |
179
+ | **English** | Arial | Georgia, Calibri, Cambria, Trebuchet MS |
180
+
181
+ - For mixed Chinese-English content: use Microsoft YaHei for Chinese, the chosen font for English
182
+ - Prefer system fonts for cross-platform compatibility
183
+ - Titles and body text can use different font pairings (e.g. Georgia + Calibri)
184
+
185
+ ### Recommended Font Pairings
186
+
187
+ | Header Font | Body Font |
188
+ |-------------|-----------|
189
+ | Georgia | Calibri |
190
+ | Arial Black | Arial |
191
+ | Calibri | Calibri Light |
192
+ | Cambria | Calibri |
193
+ | Trebuchet MS | Calibri |
194
+ | Impact | Arial |
195
+ | Palatino | Garamond |
196
+ | Consolas | Calibri |
197
+
198
+ **Choose an interesting font pairing** — don't default to Arial for everything. Pick a header font with personality and pair it with a clean body font.
199
+
200
+ ### No Bold for Body Text
201
+
202
+ **Plain body text and caption/legend text must NOT use bold.**
203
+
204
+ - Body paragraphs, descriptions → normal weight
205
+ - Captions, legends, footnotes → normal weight
206
+ - Reserve bold for titles and headings only
207
+
208
+ ```javascript
209
+ // Correct
210
+ slide.addText("Main Title", { bold: true, fontSize: 36, fontFace: "Arial" });
211
+ slide.addText("Body text here.", { bold: false, fontSize: 14, fontFace: "Arial" });
212
+
213
+ // Wrong
214
+ slide.addText("Body text here.", { bold: true, fontSize: 14 });
215
+ ```
216
+
217
+ ---
218
+
219
+ ## Style Recipes
220
+
221
+ The same design can be rendered in 4 distinct visual styles by adjusting corner radius (`rectRadius`) and spacing. Choose the style recipe that fits the presentation tone.
222
+
223
+ > **Unit note**: PptxGenJS uses inches. Slide dimensions are 10" x 5.625" (LAYOUT_16x9).
224
+
225
+ ### Style Overview
226
+
227
+ | Style | Corner Radius | Spacing | Best For |
228
+ |-------|--------------|---------|----------|
229
+ | **Sharp & Compact** | 0 ~ 0.05" | Tight | Data-dense, tables, professional reports |
230
+ | **Soft & Balanced** | 0.08" ~ 0.12" | Moderate | Corporate, business presentations, general use |
231
+ | **Rounded & Spacious** | 0.15" ~ 0.25" | Relaxed | Product intros, marketing, creative showcases |
232
+ | **Pill & Airy** | 0.3" ~ 0.5" | Open | Brand showcases, launch events, premium presentations |
233
+
234
+ ### Sharp & Compact
235
+
236
+ **Visual character**: Geometric, high information density, formal and serious.
237
+
238
+ | Category | Value (inches) | Notes |
239
+ |----------|---------------|-------|
240
+ | Corner radius — small | 0" | Full right angle |
241
+ | Corner radius — medium | 0.03" | Micro-rounded |
242
+ | Corner radius — large | 0.05" | Slight rounding |
243
+ | Element padding | 0.1" ~ 0.15" | Compact |
244
+ | Element gap | 0.1" ~ 0.2" | Compact |
245
+ | Page margin | 0.3" | Narrow |
246
+ | Block gap | 0.25" ~ 0.35" | Compact |
247
+
248
+ ### Soft & Balanced
249
+
250
+ **Visual character**: Moderate rounding, comfortable whitespace, professional yet approachable.
251
+
252
+ | Category | Value (inches) | Notes |
253
+ |----------|---------------|-------|
254
+ | Corner radius — small | 0.05" | Slight rounding |
255
+ | Corner radius — medium | 0.08" | Medium rounding |
256
+ | Corner radius — large | 0.12" | Larger rounding |
257
+ | Element padding | 0.15" ~ 0.2" | Moderate |
258
+ | Element gap | 0.15" ~ 0.25" | Moderate |
259
+ | Page margin | 0.4" | Standard |
260
+ | Block gap | 0.35" ~ 0.5" | Moderate |
261
+
262
+ ### Rounded & Spacious
263
+
264
+ **Visual character**: Large corners, generous whitespace, friendly and modern.
265
+
266
+ | Category | Value (inches) | Notes |
267
+ |----------|---------------|-------|
268
+ | Corner radius — small | 0.1" | Medium rounding |
269
+ | Corner radius — medium | 0.15" | Large rounding |
270
+ | Corner radius — large | 0.25" | Very large rounding |
271
+ | Element padding | 0.2" ~ 0.3" | Relaxed |
272
+ | Element gap | 0.25" ~ 0.4" | Relaxed |
273
+ | Page margin | 0.5" | Wide |
274
+ | Block gap | 0.5" ~ 0.7" | Relaxed |
275
+
276
+ ### Pill & Airy
277
+
278
+ **Visual character**: Full pill-shaped corners, abundant whitespace, light and open feel, strong brand presence.
279
+
280
+ | Category | Value (inches) | Notes |
281
+ |----------|---------------|-------|
282
+ | Corner radius — small | 0.2" | Large rounding |
283
+ | Corner radius — medium | 0.3" | Pill shape |
284
+ | Corner radius — large | 0.5" | Full pill |
285
+ | Element padding | 0.25" ~ 0.4" | Open |
286
+ | Element gap | 0.3" ~ 0.5" | Open |
287
+ | Page margin | 0.6" | Wide |
288
+ | Block gap | 0.6" ~ 0.9" | Open |
289
+
290
+ ### Component Style Mapping
291
+
292
+ | Component | Sharp | Soft | Rounded | Pill |
293
+ |-----------|-------|------|---------|------|
294
+ | **Button / Tag** | rectRadius: 0 | rectRadius: 0.05 | rectRadius: 0.1 | rectRadius: 0.2 |
295
+ | **Card / Container** | rectRadius: 0.03 | rectRadius: 0.1 | rectRadius: 0.2 | rectRadius: 0.3 |
296
+ | **Image Container** | rectRadius: 0 | rectRadius: 0.08 | rectRadius: 0.15 | rectRadius: 0.25 |
297
+ | **Input Field** | rectRadius: 0 | rectRadius: 0.05 | rectRadius: 0.1 | rectRadius: 0.2 |
298
+ | **Badge** | rectRadius: 0.02 | rectRadius: 0.05 | rectRadius: 0.08 | rectRadius: 0.15 |
299
+ | **Avatar Frame** | rectRadius: 0 | rectRadius: 0.1 | rectRadius: 0.2 | rectRadius: 0.5 (circle) |
300
+
301
+ #### PptxGenJS Corner Radius Examples
302
+
303
+ ```javascript
304
+ // Sharp style card
305
+ slide.addShape("rect", {
306
+ x: 0.5, y: 1, w: 4, h: 2.5,
307
+ fill: { color: "F5F5F5" },
308
+ rectRadius: 0.03
309
+ });
310
+
311
+ // Rounded style card
312
+ slide.addShape("rect", {
313
+ x: 0.5, y: 1, w: 4, h: 2.5,
314
+ fill: { color: "F5F5F5" },
315
+ rectRadius: 0.2
316
+ });
317
+
318
+ // Pill style button (height 0.4", rectRadius 0.2" = perfect pill)
319
+ slide.addShape("rect", {
320
+ x: 3, y: 4, w: 2, h: 0.4,
321
+ fill: { color: "4A90D9" },
322
+ rectRadius: 0.2
323
+ });
324
+ ```
325
+
326
+ ### Mixing Rules
327
+
328
+ #### 1. Outer container corner >= inner element corner
329
+
330
+ ```javascript
331
+ // Correct: outer > inner
332
+ card: rectRadius: 0.2
333
+ button: rectRadius: 0.1
334
+
335
+ // Wrong: inner > outer → visual overflow effect
336
+ card: rectRadius: 0.1
337
+ button: rectRadius: 0.2
338
+ ```
339
+
340
+ #### 2. Information density drives spacing
341
+
342
+ | Zone Type | Recommended Style |
343
+ |-----------|------------------|
344
+ | Data display zone | Sharp / Soft (compact spacing) |
345
+ | Content browsing zone | Rounded / Pill (relaxed spacing) |
346
+ | Title zone | Soft / Rounded (moderate spacing) |
347
+
348
+ #### 3. Corner radius vs element height
349
+
350
+ | Element Height | Sharp | Soft | Rounded | Pill |
351
+ |---------------|-------|------|---------|------|
352
+ | Small (< 0.3") | 0" | 0.03" | 0.08" | height/2 |
353
+ | Medium (0.3" ~ 0.6") | 0.02" | 0.05" | 0.12" | height/2 |
354
+ | Large (0.6" ~ 1.2") | 0.03" | 0.08" | 0.2" | 0.3" |
355
+ | Extra large (> 1.2") | 0.05" | 0.12" | 0.25" | 0.4" |
356
+
357
+ > **Pill tip**: For a perfect pill shape, set `rectRadius = element height / 2`
358
+
359
+ ### Typography Scale (PPT)
360
+
361
+ | Usage | Size (pt) | Notes |
362
+ |-------|-----------|-------|
363
+ | Annotations / Sources | 10 ~ 12 | Minimum readable size |
364
+ | Body / Description | 14 ~ 16 | Standard body |
365
+ | Subtitle | 18 ~ 22 | Secondary heading |
366
+ | Title | 28 ~ 36 | Page title |
367
+ | Large Title | 44 ~ 60 | Cover / section title |
368
+ | Data Callout | 60 ~ 96 | Key number display |
369
+
370
+ ### Spacing Scale (PPT)
371
+
372
+ Based on 10" x 5.625" slide dimensions:
373
+
374
+ | Usage | Recommended (inches) |
375
+ |-------|---------------------|
376
+ | Icon-to-text gap | 0.08" ~ 0.15" |
377
+ | List item spacing | 0.15" ~ 0.25" |
378
+ | Card inner padding | 0.2" ~ 0.4" |
379
+ | Element group gap | 0.3" ~ 0.5" |
380
+ | Page safe margin | 0.4" ~ 0.6" |
381
+ | Major block gap | 0.5" ~ 0.8" |
382
+
383
+ ### Quick Selection Guide
384
+
385
+ | Presentation Type | Recommended Style | Reason |
386
+ |------------------|------------------|--------|
387
+ | Finance / Data reports | Sharp & Compact | High density, serious and precise |
388
+ | Corporate / Business | Soft & Balanced | Balances professionalism and approachability |
389
+ | Product intro / Marketing | Rounded & Spacious | Modern feel, friendly |
390
+ | Launch events / Brand | Pill & Airy | Premium feel, visual impact |
391
+ | Training / Education | Soft / Rounded | Clear, readable, friendly |
392
+ | Tech sharing | Sharp / Soft | Professional, information-dense |
@@ -0,0 +1,162 @@
1
+ # Editing Existing Presentations
2
+
3
+ ## Template-Based Workflow
4
+
5
+ When using an existing presentation as a template:
6
+
7
+ 1. **Copy and analyze**:
8
+ ```bash
9
+ cp /path/to/user-provided.pptx template.pptx
10
+ python -m markitdown template.pptx > template.md
11
+ ```
12
+ Review `template.md` to see placeholder text and slide structure.
13
+
14
+ 2. **Plan slide mapping**: For each content section, choose a template slide.
15
+
16
+ **USE VARIED LAYOUTS** — monotonous presentations are a common failure mode. Don't default to basic title + bullet slides. Actively seek out:
17
+ - Multi-column layouts (2-column, 3-column)
18
+ - Image + text combinations
19
+ - Full-bleed images with text overlay
20
+ - Quote or callout slides
21
+ - Section dividers
22
+ - Stat/number callouts
23
+ - Icon grids or icon + text rows
24
+
25
+ **Avoid:** Repeating the same text-heavy layout for every slide.
26
+
27
+ Match content type to layout style (e.g., key points -> bullet slide, team info -> multi-column, testimonials -> quote slide).
28
+
29
+ 3. **Unpack**: Extract the PPTX into an editable XML tree using Python's `zipfile` module. Pretty-print the XML for readability.
30
+
31
+ 4. **Build presentation** (do this yourself, not with subagents):
32
+ - Delete unwanted slides (remove from `<p:sldIdLst>`)
33
+ - Duplicate slides you want to reuse (copy slide XML, relationships, and update `Content_Types.xml` and `presentation.xml`)
34
+ - Reorder slides in `<p:sldIdLst>`
35
+ - **Complete all structural changes before step 5**
36
+
37
+ 5. **Edit content**: Update text in each `slide{N}.xml`.
38
+ **Use subagents here if available** — slides are separate XML files, so subagents can edit in parallel.
39
+
40
+ 6. **Clean**: Remove orphaned files — slides not in `<p:sldIdLst>`, unreferenced media, orphaned rels.
41
+
42
+ 7. **Pack**: Repack the XML tree into a PPTX file. Validate, repair, condense XML, re-encode smart quotes.
43
+
44
+ Always write to `/tmp/` first, then copy to the final path. Python's `zipfile` module uses `seek` internally, which fails on some volume mounts (e.g. Docker bind mounts). Writing to a local temp path avoids this.
45
+
46
+ ## Output Structure
47
+
48
+ Copy the user-provided file to `template.pptx` in cwd. This preserves the original and gives a predictable name for all downstream operations.
49
+
50
+ ```bash
51
+ cp /path/to/user-provided.pptx template.pptx
52
+ ```
53
+
54
+ ```text
55
+ ./
56
+ ├── template.pptx # Copy of user-provided file (never modified)
57
+ ├── template.md # markitdown extraction
58
+ ├── unpacked/ # Editable XML tree
59
+ └── edited.pptx # Final repacked deck
60
+ ```
61
+
62
+ Minimum expected deliverable: `edited.pptx`.
63
+
64
+ ## Slide Operations
65
+
66
+ Slide order is in `ppt/presentation.xml` -> `<p:sldIdLst>`.
67
+
68
+ **Reorder**: Rearrange `<p:sldId>` elements.
69
+
70
+ **Delete**: Remove `<p:sldId>`, then clean orphaned files.
71
+
72
+ **Add**: Copy the source slide's XML file, its `.rels` file, and update `Content_Types.xml` and `presentation.xml`. Never manually copy slide files without updating all references — this causes broken notes references and missing relationship IDs.
73
+
74
+ ## Editing Content
75
+
76
+ **Subagents:** If available, use them here (after completing step 4). Each slide is a separate XML file, so subagents can edit in parallel. In your prompt to subagents, include:
77
+ - The slide file path(s) to edit
78
+ - **"Use the Edit tool for all changes"**
79
+ - The formatting rules and common pitfalls below
80
+
81
+ For each slide:
82
+ 1. Read the slide's XML
83
+ 2. Identify ALL placeholder content — text, images, charts, icons, captions
84
+ 3. Replace each placeholder with final content
85
+
86
+ **Use the Edit tool, not sed or Python scripts.** The Edit tool forces specificity about what to replace and where, yielding better reliability.
87
+
88
+ ## Formatting Rules
89
+
90
+ - **Bold all headers, subheadings, and inline labels**: Use `b="1"` on `<a:rPr>`. This includes:
91
+ - Slide titles
92
+ - Section headers within a slide
93
+ - Inline labels like (e.g.: "Status:", "Description:") at the start of a line
94
+ - **Never use unicode bullets**: Use proper list formatting with `<a:buChar>` or `<a:buAutoNum>`
95
+ - **Bullet consistency**: Let bullets inherit from the layout. Only specify `<a:buChar>` or `<a:buNone>`.
96
+
97
+ ## Common Pitfalls — Template Editing
98
+
99
+ ### Template Adaptation
100
+
101
+ When source content has fewer items than the template:
102
+ - **Remove excess elements entirely** (images, shapes, text boxes), don't just clear text
103
+ - Check for orphaned visuals after clearing text content
104
+ - Run content QA with `markitdown` to catch mismatched counts
105
+
106
+ When replacing text with different length content:
107
+ - **Shorter replacements**: Usually safe
108
+ - **Longer replacements**: May overflow or wrap unexpectedly
109
+ - Verify with `markitdown` after text changes
110
+ - Consider truncating or splitting content to fit the template's design constraints
111
+
112
+ **Template slots != Source items**: If template has 4 team members but source has 3 users, delete the 4th member's entire group (image + text boxes), not just the text.
113
+
114
+ ### Multi-Item Content
115
+
116
+ If source has multiple items (numbered lists, multiple sections), create separate `<a:p>` elements for each — **never concatenate into one string**.
117
+
118
+ **WRONG** — all items in one paragraph:
119
+ ```xml
120
+ <a:p>
121
+ <a:r><a:rPr .../><a:t>Step 1: Do the first thing. Step 2: Do the second thing.</a:t></a:r>
122
+ </a:p>
123
+ ```
124
+
125
+ **CORRECT** — separate paragraphs with bold headers:
126
+ ```xml
127
+ <a:p>
128
+ <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
129
+ <a:r><a:rPr lang="en-US" sz="2799" b="1" .../><a:t>Step 1</a:t></a:r>
130
+ </a:p>
131
+ <a:p>
132
+ <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
133
+ <a:r><a:rPr lang="en-US" sz="2799" .../><a:t>Do the first thing.</a:t></a:r>
134
+ </a:p>
135
+ <a:p>
136
+ <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
137
+ <a:r><a:rPr lang="en-US" sz="2799" b="1" .../><a:t>Step 2</a:t></a:r>
138
+ </a:p>
139
+ <!-- continue pattern -->
140
+ ```
141
+
142
+ Copy `<a:pPr>` from the original paragraph to preserve line spacing. Use `b="1"` on headers.
143
+
144
+ ### Smart Quotes
145
+
146
+ The Edit tool converts smart quotes to ASCII. **When adding new text with quotes, use XML entities:**
147
+
148
+ ```xml
149
+ <a:t>the &#x201C;Agreement&#x201D;</a:t>
150
+ ```
151
+
152
+ | Character | Name | Unicode | XML Entity |
153
+ |-----------|------|---------|------------|
154
+ | \u201c | Left double quote | U+201C | `&#x201C;` |
155
+ | \u201d | Right double quote | U+201D | `&#x201D;` |
156
+ | \u2018 | Left single quote | U+2018 | `&#x2018;` |
157
+ | \u2019 | Right single quote | U+2019 | `&#x2019;` |
158
+
159
+ ### Other
160
+
161
+ - **Whitespace**: Use `xml:space="preserve"` on `<a:t>` with leading/trailing spaces
162
+ - **XML parsing**: Use `defusedxml.minidom`, not `xml.etree.ElementTree` (corrupts namespaces)
@@ -0,0 +1,112 @@
1
+ # QA Process & Common Pitfalls
2
+
3
+ ## QA Process
4
+
5
+ **Assume there are problems. Your job is to find them.**
6
+
7
+ Your first render is almost never correct. Approach QA as a bug hunt, not a confirmation step. If you found zero issues on first inspection, you weren't looking hard enough.
8
+
9
+ ### Content QA
10
+
11
+ ```bash
12
+ python -m markitdown output.pptx
13
+ ```
14
+
15
+ Check for missing content, typos, wrong order.
16
+
17
+ **Check for leftover placeholder text:**
18
+
19
+ ```bash
20
+ python -m markitdown output.pptx | grep -iE "xxxx|lorem|ipsum|placeholder|this.*(page|slide).*layout"
21
+ ```
22
+
23
+ If grep returns results, fix them before declaring success.
24
+
25
+ ### Verification Loop
26
+
27
+ 1. Generate slides -> Extract text with `python -m markitdown output.pptx` -> Review content
28
+ 2. **List issues found** (if none found, look again more critically)
29
+ 3. Fix issues
30
+ 4. **Re-verify affected slides** — one fix often creates another problem
31
+ 5. Repeat until a full pass reveals no new issues
32
+
33
+ **Do not declare success until you've completed at least one fix-and-verify cycle.**
34
+
35
+ ### Per-Slide QA (for from-scratch creation)
36
+
37
+ ```bash
38
+ python -m markitdown slide-XX-preview.pptx
39
+ ```
40
+
41
+ Check for missing content, placeholder text, missing page number badge.
42
+
43
+ ---
44
+
45
+ ## Common Mistakes to Avoid
46
+
47
+ - **Don't repeat the same layout** — vary columns, cards, and callouts across slides
48
+ - **Don't center body text** — left-align paragraphs and lists; center only titles
49
+ - **Don't skimp on size contrast** — titles need 36pt+ to stand out from 14-16pt body
50
+ - **Don't default to blue** — pick colors that reflect the specific topic
51
+ - **Don't mix spacing randomly** — choose 0.3" or 0.5" gaps and use consistently
52
+ - **Don't style one slide and leave the rest plain** — commit fully or keep it simple throughout
53
+ - **Don't create text-only slides** — add images, icons, charts, or visual elements; avoid plain title + bullets
54
+ - **Don't forget text box padding** — when aligning lines or shapes with text edges, set `margin: 0` on the text box or offset the shape to account for padding
55
+ - **Don't use low-contrast elements** — icons AND text need strong contrast against the background
56
+ - **NEVER use accent lines under titles** — these are a hallmark of AI-generated slides; use whitespace or background color instead
57
+ - **NEVER use "#" with hex colors** — causes file corruption in PptxGenJS
58
+ - **NEVER encode opacity in hex strings** — use the `opacity` property instead
59
+ - **NEVER use async/await in createSlide()** — compile.js won't await
60
+ - **NEVER reuse option objects across PptxGenJS calls** — PptxGenJS mutates objects in-place
61
+
62
+ ---
63
+
64
+ ## Critical Pitfalls — PptxGenJS
65
+
66
+ ### NEVER use async/await in createSlide()
67
+
68
+ ```javascript
69
+ // WRONG - compile.js won't await
70
+ async function createSlide(pres, theme) { ... }
71
+
72
+ // CORRECT
73
+ function createSlide(pres, theme) { ... }
74
+ ```
75
+
76
+ ### NEVER use "#" with hex colors
77
+
78
+ ```javascript
79
+ color: "FF0000" // CORRECT
80
+ color: "#FF0000" // CORRUPTS FILE
81
+ ```
82
+
83
+ ### NEVER encode opacity in hex strings
84
+
85
+ ```javascript
86
+ shadow: { color: "00000020" } // CORRUPTS FILE
87
+ shadow: { color: "000000", opacity: 0.12 } // CORRECT
88
+ ```
89
+
90
+ ### Prevent text wrapping in titles
91
+
92
+ ```javascript
93
+ // Use fit:'shrink' for long titles
94
+ slide.addText("Long Title Here", {
95
+ x: 0.5, y: 2, w: 9, h: 1,
96
+ fontSize: 48, fit: "shrink"
97
+ });
98
+ ```
99
+
100
+ ### NEVER reuse option objects across calls
101
+
102
+ ```javascript
103
+ // WRONG
104
+ const shadow = { type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.15 };
105
+ slide.addShape(pres.shapes.RECTANGLE, { shadow, ... });
106
+ slide.addShape(pres.shapes.RECTANGLE, { shadow, ... });
107
+
108
+ // CORRECT - factory function
109
+ const makeShadow = () => ({ type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.15 });
110
+ slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });
111
+ slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });
112
+ ```