python-pptx2 3.0.0__tar.gz → 3.1.0__tar.gz

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 (683) hide show
  1. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/HISTORY.rst +53 -0
  2. {python_pptx2-3.0.0/src/python_pptx2.egg-info → python_pptx2-3.1.0}/PKG-INFO +1 -1
  3. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/__init__.py +19 -1
  4. python_pptx2-3.1.0/src/pptx2/design/blocks.py +433 -0
  5. python_pptx2-3.1.0/src/pptx2/design/palettes.py +217 -0
  6. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/presentation.py +12 -0
  7. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/render.py +99 -0
  8. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/SKILL.md +108 -19
  9. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/design.md +35 -0
  10. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/render.md +20 -0
  11. python_pptx2-3.1.0/src/pptx2/skill/references/slide-design.md +495 -0
  12. {python_pptx2-3.0.0 → python_pptx2-3.1.0/src/python_pptx2.egg-info}/PKG-INFO +1 -1
  13. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/python_pptx2.egg-info/SOURCES.txt +6 -0
  14. python_pptx2-3.1.0/tests/design/test_blocks.py +180 -0
  15. python_pptx2-3.1.0/tests/design/test_palettes.py +50 -0
  16. python_pptx2-3.1.0/tests/test_render_contact_sheet.py +81 -0
  17. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/LICENSE +0 -0
  18. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/MANIFEST.in +0 -0
  19. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/README.rst +0 -0
  20. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/act-action.feature +0 -0
  21. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/act-hyperlink.feature +0 -0
  22. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-axis-props.feature +0 -0
  23. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-axistitle-props.feature +0 -0
  24. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-category-access.feature +0 -0
  25. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-category-props.feature +0 -0
  26. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-chart.feature +0 -0
  27. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-charttitle-props.feature +0 -0
  28. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-data-props.feature +0 -0
  29. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-datalabels.feature +0 -0
  30. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-gridlines-props.feature +0 -0
  31. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-legend-access.feature +0 -0
  32. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-legend-props.feature +0 -0
  33. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-marker-props.feature +0 -0
  34. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-plot-props.feature +0 -0
  35. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-point-access.feature +0 -0
  36. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-point-props.feature +0 -0
  37. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-replace-data.feature +0 -0
  38. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-series.feature +0 -0
  39. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/cht-ticklabels-props.feature +0 -0
  40. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/dml-color.feature +0 -0
  41. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/dml-effect.feature +0 -0
  42. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/dml-fill.feature +0 -0
  43. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/dml-line.feature +0 -0
  44. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/environment.py +0 -0
  45. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/ph-inherit-props.feature +0 -0
  46. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/ph-insert-shape.feature +0 -0
  47. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/ph-phfmt-props.feature +0 -0
  48. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/ph-placeholder-props.feature +0 -0
  49. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/prs-coreprops.feature +0 -0
  50. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/prs-default-template.feature +0 -0
  51. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/prs-open-save.feature +0 -0
  52. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/prs-presentation-props.feature +0 -0
  53. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-autoshape.feature +0 -0
  54. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-connector.feature +0 -0
  55. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-freeform.feature +0 -0
  56. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-graphicframe.feature +0 -0
  57. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-groupshape.feature +0 -0
  58. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-movie-props.feature +0 -0
  59. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-picture.feature +0 -0
  60. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-placeholder.feature +0 -0
  61. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-shapes.feature +0 -0
  62. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/shp-shared.feature +0 -0
  63. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/sld-background.feature +0 -0
  64. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/sld-slide.feature +0 -0
  65. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/sld-slides.feature +0 -0
  66. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/action.py +0 -0
  67. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/axis.py +0 -0
  68. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/background.py +0 -0
  69. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/category.py +0 -0
  70. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/chart.py +0 -0
  71. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/chartdata.py +0 -0
  72. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/color.py +0 -0
  73. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/coreprops.py +0 -0
  74. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/datalabel.py +0 -0
  75. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/effect.py +0 -0
  76. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/fill.py +0 -0
  77. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/font.py +0 -0
  78. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/font_color.py +0 -0
  79. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/helpers.py +0 -0
  80. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/legend.py +0 -0
  81. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/line.py +0 -0
  82. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/picture.py +0 -0
  83. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/placeholder.py +0 -0
  84. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/plot.py +0 -0
  85. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/presentation.py +0 -0
  86. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/series.py +0 -0
  87. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/shape.py +0 -0
  88. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/shapes.py +0 -0
  89. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/slide.py +0 -0
  90. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/slides.py +0 -0
  91. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/table.py +0 -0
  92. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/72-dpi.tiff +0 -0
  93. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/CVS_LOGO.WMF +0 -0
  94. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/act-props.pptm +0 -0
  95. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/calibriz.ttf +0 -0
  96. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-axis-props.pptx +0 -0
  97. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-category-access.pptx +0 -0
  98. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-chart-props.pptx +0 -0
  99. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-chart-type.pptx +0 -0
  100. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-charts.pptx +0 -0
  101. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-datalabels.pptx +0 -0
  102. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-gridlines-props.pptx +0 -0
  103. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-legend-props.pptx +0 -0
  104. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-legend.pptx +0 -0
  105. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-marker-props.pptx +0 -0
  106. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-plot-props.pptx +0 -0
  107. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-point-access.pptx +0 -0
  108. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-point-props.pptx +0 -0
  109. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-replace-data.pptx +0 -0
  110. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-series.pptx +0 -0
  111. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/cht-ticklabels-props.pptx +0 -0
  112. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/dml-effect.pptx +0 -0
  113. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/dml-fill.pptx +0 -0
  114. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/dml-line.pptx +0 -0
  115. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/ext-rels.pptx +0 -0
  116. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/[Content_Types].xml +0 -0
  117. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/_rels/.rels +0 -0
  118. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/docProps/app.xml +0 -0
  119. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/docProps/core.xml +0 -0
  120. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/docProps/thumbnail.jpeg +0 -0
  121. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/_rels/presentation.xml.rels +0 -0
  122. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/presProps.xml +0 -0
  123. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/presentation.xml +0 -0
  124. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/printerSettings/printerSettings1.bin +0 -0
  125. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
  126. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
  127. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
  128. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
  129. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
  130. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
  131. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
  132. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
  133. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
  134. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
  135. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
  136. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
  137. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
  138. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
  139. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
  140. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
  141. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
  142. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
  143. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
  144. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
  145. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
  146. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
  147. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
  148. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/slideMaster1.xml +0 -0
  149. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
  150. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/slides/slide1.xml +0 -0
  151. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/tableStyles.xml +0 -0
  152. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/theme/theme1.xml +0 -0
  153. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/extracted-pptx/ppt/viewProps.xml +0 -0
  154. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/font-color.pptx +0 -0
  155. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/just-two-mice.mp4 +0 -0
  156. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/just-two-mice.png +0 -0
  157. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/lyt-shapes.pptx +0 -0
  158. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/minimal.pptx +0 -0
  159. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/monty-truth.png +0 -0
  160. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/mst-placeholders.pptx +0 -0
  161. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/mst-shapes.pptx +0 -0
  162. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/mst-slide-layouts.pptx +0 -0
  163. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/ph-inherit-props.pptx +0 -0
  164. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/ph-populated-placeholders.pptx +0 -0
  165. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/ph-unpopulated-placeholders.pptx +0 -0
  166. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/pic.emf +0 -0
  167. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/prs-add-slide.pptx +0 -0
  168. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/prs-notes.pptx +0 -0
  169. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/prs-properties.pptx +0 -0
  170. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/prs-slide-masters.pptx +0 -0
  171. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/python-icon.jpeg +0 -0
  172. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/python-powered.png +0 -0
  173. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/python.bmp +0 -0
  174. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-access-chart.pptx +0 -0
  175. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-access-ole-object.pptx +0 -0
  176. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-autoshape-adjustments.pptx +0 -0
  177. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-autoshape-props.pptx +0 -0
  178. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-common-props.pptx +0 -0
  179. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-connector-props.pptx +0 -0
  180. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-embedded-docx.docx +0 -0
  181. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-embedded-pptx.pptx +0 -0
  182. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-embedded-xlsx.xlsx +0 -0
  183. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-freeform.pptx +0 -0
  184. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-groupshape.pptx +0 -0
  185. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-movie-props.pptx +0 -0
  186. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-picture.pptx +0 -0
  187. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-pos-and-size.pptx +0 -0
  188. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/shp-shapes.pptx +0 -0
  189. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/sld-background.pptx +0 -0
  190. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/sld-blank.pptx +0 -0
  191. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/sld-notes.pptx +0 -0
  192. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/sld-slide.pptx +0 -0
  193. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/sld-slides.pptx +0 -0
  194. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/sonic.gif +0 -0
  195. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/tbl-cell.pptx +0 -0
  196. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/test-image-jpg-mime.pptx +0 -0
  197. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/test.pptx +0 -0
  198. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/txt-fit-text.pptx +0 -0
  199. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/txt-font-props.pptx +0 -0
  200. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/txt-font-typeface.pptx +0 -0
  201. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/txt-paragraph-spacing.pptx +0 -0
  202. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/txt-text-frame.pptx +0 -0
  203. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/test_files/txt-text.pptx +0 -0
  204. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/text.py +0 -0
  205. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/steps/text_frame.py +0 -0
  206. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/tbl-cell.feature +0 -0
  207. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/tbl-column.feature +0 -0
  208. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/tbl-table.feature +0 -0
  209. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/txt-fit-text.feature +0 -0
  210. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/txt-font-color.feature +0 -0
  211. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/txt-font-props.feature +0 -0
  212. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/txt-paragraph.feature +0 -0
  213. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/txt-text.feature +0 -0
  214. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/features/txt-textframe.feature +0 -0
  215. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/pyproject.toml +0 -0
  216. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/setup.cfg +0 -0
  217. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/paper_pptx_doctor/__init__.py +0 -0
  218. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/paper_pptx_doctor/__main__.py +0 -0
  219. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_agent_friendly.py +0 -0
  220. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_color.py +0 -0
  221. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_ownership.py +0 -0
  222. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_slide_importer.py +0 -0
  223. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_svg.py +0 -0
  224. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_template_applier.py +0 -0
  225. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_textstyle.py +0 -0
  226. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_transaction.py +0 -0
  227. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_version.py +0 -0
  228. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/_zipguard.py +0 -0
  229. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/accessibility.py +0 -0
  230. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/action.py +0 -0
  231. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/animation.py +0 -0
  232. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/api.py +0 -0
  233. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/audit.py +0 -0
  234. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/__init__.py +0 -0
  235. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/analytics.py +0 -0
  236. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/axis.py +0 -0
  237. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/category.py +0 -0
  238. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/chart.py +0 -0
  239. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/data.py +0 -0
  240. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/datalabel.py +0 -0
  241. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/legend.py +0 -0
  242. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/marker.py +0 -0
  243. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/palettes.py +0 -0
  244. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/plot.py +0 -0
  245. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/point.py +0 -0
  246. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/quick_layouts.py +0 -0
  247. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/series.py +0 -0
  248. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/xlsx.py +0 -0
  249. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/chart/xmlwriter.py +0 -0
  250. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/compose/__init__.py +0 -0
  251. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/compose/deck_compose.py +0 -0
  252. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/compose/from_spec.py +0 -0
  253. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/design/__init__.py +0 -0
  254. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/design/components.py +0 -0
  255. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/design/figures.py +0 -0
  256. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/design/layout.py +0 -0
  257. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/design/recipes.py +0 -0
  258. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/design/style.py +0 -0
  259. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/design/tokens.py +0 -0
  260. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/diagrams.py +0 -0
  261. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/diff.py +0 -0
  262. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/__init__.py +0 -0
  263. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/chtfmt.py +0 -0
  264. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/color.py +0 -0
  265. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/effect.py +0 -0
  266. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/fill.py +0 -0
  267. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/line.py +0 -0
  268. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/picture.py +0 -0
  269. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/dml/three_d.py +0 -0
  270. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/edit.py +0 -0
  271. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/__init__.py +0 -0
  272. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/action.py +0 -0
  273. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/animation.py +0 -0
  274. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/base.py +0 -0
  275. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/chart.py +0 -0
  276. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/dml.py +0 -0
  277. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/lang.py +0 -0
  278. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/presentation.py +0 -0
  279. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/shapes.py +0 -0
  280. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/enum/text.py +0 -0
  281. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/errors.py +0 -0
  282. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/exc.py +0 -0
  283. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/formats.py +0 -0
  284. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/geometry.py +0 -0
  285. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/hf.py +0 -0
  286. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/inherit.py +0 -0
  287. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/inspect.py +0 -0
  288. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/lint.py +0 -0
  289. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/math.py +0 -0
  290. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/mathml2omml.py +0 -0
  291. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/media.py +0 -0
  292. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/__init__.py +0 -0
  293. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/constants.py +0 -0
  294. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/oxml.py +0 -0
  295. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/package.py +0 -0
  296. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/packuri.py +0 -0
  297. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/serialized.py +0 -0
  298. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/shared.py +0 -0
  299. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/opc/spec.py +0 -0
  300. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/__init__.py +0 -0
  301. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/action.py +0 -0
  302. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/__init__.py +0 -0
  303. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/axis.py +0 -0
  304. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/chart.py +0 -0
  305. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/datalabel.py +0 -0
  306. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/legend.py +0 -0
  307. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/marker.py +0 -0
  308. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/plot.py +0 -0
  309. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/series.py +0 -0
  310. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/chart/shared.py +0 -0
  311. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/coreprops.py +0 -0
  312. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/customprops.py +0 -0
  313. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/dml/__init__.py +0 -0
  314. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/dml/color.py +0 -0
  315. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/dml/effect.py +0 -0
  316. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/dml/fill.py +0 -0
  317. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/dml/line.py +0 -0
  318. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/dml/three_d.py +0 -0
  319. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/ns.py +0 -0
  320. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/presentation.py +0 -0
  321. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/shapes/__init__.py +0 -0
  322. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/shapes/autoshape.py +0 -0
  323. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/shapes/connector.py +0 -0
  324. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/shapes/graphfrm.py +0 -0
  325. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/shapes/groupshape.py +0 -0
  326. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/shapes/picture.py +0 -0
  327. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/shapes/shared.py +0 -0
  328. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/simpletypes.py +0 -0
  329. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/slide.py +0 -0
  330. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/table.py +0 -0
  331. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/text.py +0 -0
  332. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/theme.py +0 -0
  333. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/oxml/xmlchemy.py +0 -0
  334. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/package.py +0 -0
  335. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/__init__.py +0 -0
  336. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/chart.py +0 -0
  337. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/coreprops.py +0 -0
  338. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/customprops.py +0 -0
  339. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/diagram.py +0 -0
  340. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/embeddedpackage.py +0 -0
  341. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/image.py +0 -0
  342. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/media.py +0 -0
  343. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/presentation.py +0 -0
  344. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/parts/slide.py +0 -0
  345. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/py.typed +0 -0
  346. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/rebind.py +0 -0
  347. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/section.py +0 -0
  348. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/__init__.py +0 -0
  349. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/autoshape.py +0 -0
  350. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/base.py +0 -0
  351. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/connector.py +0 -0
  352. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/freeform.py +0 -0
  353. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/graphfrm.py +0 -0
  354. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/group.py +0 -0
  355. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/picture.py +0 -0
  356. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/placeholder.py +0 -0
  357. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shapes/shapetree.py +0 -0
  358. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/shared.py +0 -0
  359. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/__init__.py +0 -0
  360. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/__main__.py +0 -0
  361. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/animations.md +0 -0
  362. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/basics.md +0 -0
  363. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/charts.md +0 -0
  364. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/compose.md +0 -0
  365. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/editing.md +0 -0
  366. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/effects.md +0 -0
  367. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/end-to-end-deck.md +0 -0
  368. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/geometry-and-arrows.md +0 -0
  369. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/lint.md +0 -0
  370. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/math.md +0 -0
  371. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/picture-effects.md +0 -0
  372. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/smart-art.md +0 -0
  373. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/space-aware-authoring.md +0 -0
  374. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/tables.md +0 -0
  375. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/theme.md +0 -0
  376. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/three-d.md +0 -0
  377. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/skill/references/transitions.md +0 -0
  378. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/slide.py +0 -0
  379. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/slideops.py +0 -0
  380. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/smart_art.py +0 -0
  381. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/spec.py +0 -0
  382. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/table.py +0 -0
  383. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/table_styles.py +0 -0
  384. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/default.pptx +0 -0
  385. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/docx-icon.emf +0 -0
  386. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/generic-icon.emf +0 -0
  387. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/notes.xml +0 -0
  388. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/notesMaster.xml +0 -0
  389. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/pptx-icon.emf +0 -0
  390. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/theme.xml +0 -0
  391. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/templates/xlsx-icon.emf +0 -0
  392. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/text/__init__.py +0 -0
  393. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/text/bullet.py +0 -0
  394. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/text/fonts.py +0 -0
  395. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/text/layout.py +0 -0
  396. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/text/text.py +0 -0
  397. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/theme.py +0 -0
  398. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/types.py +0 -0
  399. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/pptx2/util.py +0 -0
  400. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/python_pptx2.egg-info/dependency_links.txt +0 -0
  401. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/python_pptx2.egg-info/entry_points.txt +0 -0
  402. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/python_pptx2.egg-info/requires.txt +0 -0
  403. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/src/python_pptx2.egg-info/top_level.txt +0 -0
  404. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/__init__.py +0 -0
  405. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/__init__.py +0 -0
  406. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_analytics.py +0 -0
  407. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_axis.py +0 -0
  408. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_category.py +0 -0
  409. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_chart.py +0 -0
  410. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_chart_toggles.py +0 -0
  411. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_collision_strategy.py +0 -0
  412. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_data.py +0 -0
  413. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_datalabel.py +0 -0
  414. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_legend.py +0 -0
  415. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_marker.py +0 -0
  416. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_palettes.py +0 -0
  417. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_plot.py +0 -0
  418. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_point.py +0 -0
  419. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_quick_layouts.py +0 -0
  420. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_series.py +0 -0
  421. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_xlsx.py +0 -0
  422. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/chart/test_xmlwriter.py +0 -0
  423. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/design/__init__.py +0 -0
  424. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/design/test_components.py +0 -0
  425. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/design/test_figures.py +0 -0
  426. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/design/test_layout.py +0 -0
  427. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/design/test_recipes.py +0 -0
  428. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/design/test_style.py +0 -0
  429. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/design/test_tokens.py +0 -0
  430. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/dml/__init__.py +0 -0
  431. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/dml/test_chtfmt.py +0 -0
  432. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/dml/test_color.py +0 -0
  433. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/dml/test_effect.py +0 -0
  434. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/dml/test_fill.py +0 -0
  435. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/dml/test_line.py +0 -0
  436. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/dml/test_three_d.py +0 -0
  437. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/enum/__init__.py +0 -0
  438. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/enum/test_base.py +0 -0
  439. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/enum/test_shapes.py +0 -0
  440. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/integration/__init__.py +0 -0
  441. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/integration/round_trip.py +0 -0
  442. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/integration/test_add_slide_layout.py +0 -0
  443. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/integration/test_apply_template.py +0 -0
  444. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/integration/test_compose_package.py +0 -0
  445. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/integration/test_import_slide.py +0 -0
  446. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/integration/test_round_trip.py +0 -0
  447. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/opc/__init__.py +0 -0
  448. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/opc/test_oxml.py +0 -0
  449. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/opc/test_package.py +0 -0
  450. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/opc/test_packuri.py +0 -0
  451. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/opc/test_serialized.py +0 -0
  452. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/__init__.py +0 -0
  453. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/shapes/__init__.py +0 -0
  454. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/shapes/test_autoshape.py +0 -0
  455. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/shapes/test_graphfrm.py +0 -0
  456. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/shapes/test_groupshape.py +0 -0
  457. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/shapes/test_picture.py +0 -0
  458. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test___init__.py +0 -0
  459. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_dml.py +0 -0
  460. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_ns.py +0 -0
  461. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_presentation.py +0 -0
  462. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_simpletypes.py +0 -0
  463. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_slide.py +0 -0
  464. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_table.py +0 -0
  465. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_theme.py +0 -0
  466. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/test_xmlchemy.py +0 -0
  467. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/unitdata/__init__.py +0 -0
  468. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/unitdata/dml.py +0 -0
  469. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/unitdata/shape.py +0 -0
  470. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/oxml/unitdata/text.py +0 -0
  471. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/__init__.py +0 -0
  472. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/_authoring/build_fixtures.py +0 -0
  473. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/_authoring/update_goldens.py +0 -0
  474. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/clock.py +0 -0
  475. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/conftest.py +0 -0
  476. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/contract.py +0 -0
  477. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/corpus.py +0 -0
  478. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/fragval.py +0 -0
  479. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/idlists.py +0 -0
  480. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/lo.py +0 -0
  481. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/relint.py +0 -0
  482. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_autofit.py +0 -0
  483. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_batch.py +0 -0
  484. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_bullets.py +0 -0
  485. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_chart_routing.py +0 -0
  486. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_content_type_coverage.py +0 -0
  487. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_contract_harness.py +0 -0
  488. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_deck_manifest.py +0 -0
  489. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_diff.py +0 -0
  490. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_distribution_doctor.py +0 -0
  491. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_edit_text.py +0 -0
  492. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_effective_inspect.py +0 -0
  493. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_fields_hf.py +0 -0
  494. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_fixture_corpus.py +0 -0
  495. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_hf_apply.py +0 -0
  496. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_image_replace.py +0 -0
  497. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_import.py +0 -0
  498. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_inspect_text.py +0 -0
  499. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_notes.py +0 -0
  500. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_package_io_hardening.py +0 -0
  501. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_package_kernel.py +0 -0
  502. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_package_round_trip.py +0 -0
  503. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_rebind.py +0 -0
  504. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_save_destinations.py +0 -0
  505. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_shape_surgery.py +0 -0
  506. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_slide_ops.py +0 -0
  507. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_slide_partname_allocation.py +0 -0
  508. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_table_ops.py +0 -0
  509. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_transaction.py +0 -0
  510. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_walkthrough_pitchbook.py +0 -0
  511. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_walkthrough_qbr.py +0 -0
  512. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_zipguard_end_record.py +0 -0
  513. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/paper/test_zipguard_structural.py +0 -0
  514. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/__init__.py +0 -0
  515. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_chart.py +0 -0
  516. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_coreprops.py +0 -0
  517. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_customprops.py +0 -0
  518. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_embeddedpackage.py +0 -0
  519. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_image.py +0 -0
  520. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_media.py +0 -0
  521. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_presentation.py +0 -0
  522. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/parts/test_slide.py +0 -0
  523. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/schema/__init__.py +0 -0
  524. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/schema/oxml_schema_validator.py +0 -0
  525. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/schema/test_schema_validity.py +0 -0
  526. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/__init__.py +0 -0
  527. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_anchor.py +0 -0
  528. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_animate.py +0 -0
  529. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_autoshape.py +0 -0
  530. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_base.py +0 -0
  531. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_connector.py +0 -0
  532. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_freeform.py +0 -0
  533. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_graphfrm.py +0 -0
  534. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_group.py +0 -0
  535. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_picture.py +0 -0
  536. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_placeholder.py +0 -0
  537. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/shapes/test_shapetree.py +0 -0
  538. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_accessibility.py +0 -0
  539. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_action.py +0 -0
  540. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_animation.py +0 -0
  541. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_api.py +0 -0
  542. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_audit.py +0 -0
  543. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_compose_from_spec.py +0 -0
  544. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_diagrams.py +0 -0
  545. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/calibriz.ttf +0 -0
  546. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/cdw-logo.eps +0 -0
  547. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/dummy.mp4 +0 -0
  548. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/[Content_Types].xml +0 -0
  549. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/_rels/.rels +0 -0
  550. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/docProps/app.xml +0 -0
  551. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/docProps/core.xml +0 -0
  552. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/docProps/thumbnail.jpeg +0 -0
  553. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/_rels/presentation.xml.rels +0 -0
  554. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/presProps.xml +0 -0
  555. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/presentation.xml +0 -0
  556. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/printerSettings/printerSettings1.bin +0 -0
  557. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
  558. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
  559. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
  560. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
  561. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
  562. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
  563. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
  564. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
  565. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
  566. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
  567. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
  568. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
  569. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
  570. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
  571. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
  572. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
  573. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
  574. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
  575. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
  576. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
  577. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
  578. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
  579. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
  580. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slideMasters/slideMaster1.xml +0 -0
  581. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
  582. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/slides/slide1.xml +0 -0
  583. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/tableStyles.xml +0 -0
  584. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/theme/theme1.xml +0 -0
  585. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/expanded_pptx/ppt/viewProps.xml +0 -0
  586. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/minimal.pptx +0 -0
  587. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/minimal_slide.xml +0 -0
  588. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/missing_rels_item.pptx +0 -0
  589. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/monty-truth.png +0 -0
  590. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/no-core-props.pptx +0 -0
  591. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/no-slides.pptx +0 -0
  592. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/presentation.xml +0 -0
  593. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/python-icon.jpeg +0 -0
  594. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/python-powered.png +0 -0
  595. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/python.bmp +0 -0
  596. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/slideLayout1.xml +0 -0
  597. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/smart_art_org_chart.pptx +0 -0
  598. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-area-date.txt +0 -0
  599. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-area-float.txt +0 -0
  600. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-area-stacked-100.txt +0 -0
  601. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-area-stacked.txt +0 -0
  602. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-area.txt +0 -0
  603. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-bar-clustered-date.txt +0 -0
  604. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-bar-clustered-float.txt +0 -0
  605. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-bar-clustered.txt +0 -0
  606. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-bar-stacked-100.txt +0 -0
  607. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-bar-stacked.txt +0 -0
  608. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-column-clustered.txt +0 -0
  609. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-column-stacked-100.txt +0 -0
  610. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-column-stacked.txt +0 -0
  611. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line-date.txt +0 -0
  612. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line-float.txt +0 -0
  613. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line-markers-stacked-100.txt +0 -0
  614. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line-markers-stacked.txt +0 -0
  615. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line-markers.txt +0 -0
  616. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line-stacked-100.txt +0 -0
  617. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line-stacked.txt +0 -0
  618. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x2-line.txt +0 -0
  619. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x3-bubble-3d.txt +0 -0
  620. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x3-bubble.txt +0 -0
  621. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x3-xy-lines-no-markers.txt +0 -0
  622. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x3-xy-lines.txt +0 -0
  623. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x3-xy-smooth-no-markers.txt +0 -0
  624. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x3-xy-smooth.txt +0 -0
  625. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x3-xy.txt +0 -0
  626. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/2x5-radar.txt +0 -0
  627. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/3x1-pie-exploded.txt +0 -0
  628. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/3x1-pie.txt +0 -0
  629. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/3x2-doughnut-exploded.txt +0 -0
  630. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/3x2-doughnut.txt +0 -0
  631. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/4x2-multi-cat-bar.txt +0 -0
  632. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/adjust-ser-count.txt +0 -0
  633. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/cat-labels.txt +0 -0
  634. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/content-types-xml.txt +0 -0
  635. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/default-notes.txt +0 -0
  636. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/default-notesMaster.txt +0 -0
  637. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/default-theme.txt +0 -0
  638. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/freeform.txt +0 -0
  639. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/package-rels-xml.txt +0 -0
  640. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/placeholders.txt +0 -0
  641. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/presentation-rels-xml.txt +0 -0
  642. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/relationships.txt +0 -0
  643. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/rels-load-from-xml.txt +0 -0
  644. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/rewrite-ser.txt +0 -0
  645. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/snippets/timing.txt +0 -0
  646. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/test.pptx +0 -0
  647. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_files/test_slides.pptx +0 -0
  648. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_formats.py +0 -0
  649. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_geometry.py +0 -0
  650. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_inherit.py +0 -0
  651. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_lint.py +0 -0
  652. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_lint_on_save.py +0 -0
  653. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_math.py +0 -0
  654. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_media.py +0 -0
  655. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_new_features.py +0 -0
  656. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_package.py +0 -0
  657. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_pathlike_inputs.py +0 -0
  658. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_powerpoint_strict_validation.py +0 -0
  659. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_presentation.py +0 -0
  660. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_render.py +0 -0
  661. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_render_slides_alias.py +0 -0
  662. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_section.py +0 -0
  663. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_shape_helpers.py +0 -0
  664. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_shared.py +0 -0
  665. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_skill.py +0 -0
  666. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_slide.py +0 -0
  667. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_smart_art.py +0 -0
  668. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_svg_picture.py +0 -0
  669. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_table.py +0 -0
  670. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_table_extras.py +0 -0
  671. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_theme.py +0 -0
  672. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_transition_morph.py +0 -0
  673. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/test_util.py +0 -0
  674. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/text/__init__.py +0 -0
  675. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/text/test_fonts.py +0 -0
  676. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/text/test_layout.py +0 -0
  677. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/text/test_text.py +0 -0
  678. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/unitdata.py +0 -0
  679. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/unitutil/__init__.py +0 -0
  680. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/unitutil/cxml.py +0 -0
  681. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/unitutil/file.py +0 -0
  682. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tests/unitutil/mock.py +0 -0
  683. {python_pptx2-3.0.0 → python_pptx2-3.1.0}/tox.ini +0 -0
@@ -15,6 +15,59 @@ can sit beside both ``python-pptx`` (``pptx``) and ``power-pptx``
15
15
  .. _`scanny/python-pptx`: https://github.com/scanny/python-pptx
16
16
 
17
17
 
18
+ 3.1.0 (2026-09-03)
19
+ ++++++++++++++++++
20
+
21
+ Slide-design layer: the everyday blocks a content slide is made of, a
22
+ set of curated palettes, a one-image visual check, and a design guide
23
+ that leads generated decks toward calm, consistent layouts.
24
+
25
+ Added
26
+ .....
27
+
28
+ * ``pptx2.design.blocks`` (re-exported at the package root):
29
+
30
+ * ``add_card(slide, bbox, title=, body=, fill=, line=, pad_pt=, ...)``
31
+ — one flat rounded surface (``shadow.clear()``, real
32
+ ``corner_radius``, tint *or* hairline outline) with a padded, fitted
33
+ title and body. ``body`` may be a list, rendered as bullets
34
+ (``numbered=True`` for a numbered list). Returns ``Card`` with
35
+ ``card`` / ``title_box`` / ``body_box`` and ``inner`` (the padded
36
+ content ``BBox``).
37
+ * ``add_bullets(slide, bbox, items=, size_pt=, numbered=, gap_pt=, ...)``
38
+ — real ``a:buChar`` / ``a:buAutoNum`` bullets with a hanging indent
39
+ that scales with the type size, item spacing, and fit-to-box that
40
+ never drops below ``min_size_pt``. Numbering continues across items.
41
+ * ``add_picture_fit(slide, image, bbox, mode="contain"|"cover", align=,
42
+ caption=, ...)`` — places a picture inside a box without distortion,
43
+ letter-boxed or cropped symmetrically to fill, with an optional
44
+ caption. Returns ``FittedPicture`` with the occupied ``frame``.
45
+
46
+ All three tag their shapes with one ``lint_group``.
47
+
48
+ * ``pptx2.design.palettes`` (re-exported at the package root):
49
+ ``Palette`` with named roles (``paper``, ``surface``, ``line``, ``ink``,
50
+ ``muted``, ``accent``, ``accent_soft``, ``accent_ink``), ``PALETTES``
51
+ (``slate``, ``linen``, ``forest``, ``plum``, ``ember``, ``navy``,
52
+ ``graphite``) that pass WCAG AA contrast for their intended pairings,
53
+ ``palette(name)``, and ``Palette.dark()`` for title / section slides.
54
+
55
+ * ``pptx2.render.render_contact_sheet(prs, out_path, cols=, thumb_width=,
56
+ ...)`` and ``Presentation.render_contact_sheet(...)`` — every slide
57
+ rendered and tiled into a single numbered PNG.
58
+
59
+ Skill
60
+ .....
61
+
62
+ * New ``references/slide-design.md``: grid and margins, type scale,
63
+ one-palette colour, surfaces done well, whitespace, pictures, tables /
64
+ diagrams / charts, deliberate vs accidental overlaps, a twelve-archetype
65
+ slide catalog with runnable code, and the visual check.
66
+ * ``SKILL.md`` cheat sheet, house rules and anti-patterns updated for the
67
+ blocks, palettes and contact sheet; ``design.md`` and ``render.md``
68
+ cross-reference them.
69
+
70
+
18
71
  3.0.0 (2026-09-01)
19
72
  ++++++++++++++++++
20
73
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-pptx2
3
- Version: 3.0.0
3
+ Version: 3.1.0
4
4
  Summary: Create, read, and update PowerPoint 2007+ (.pptx) files. Fork of power-pptx / python-pptx, published as python-pptx2.
5
5
  Author: Matěj Štágl
6
6
  Author-email: stagl@wattlescript.org
@@ -9,6 +9,14 @@ import pptx2.exc as exceptions
9
9
  from pptx2.api import Presentation
10
10
  from pptx2.audit import AuditReport, audit
11
11
  from pptx2.geometry import BBox
12
+ from pptx2.design.blocks import (
13
+ Card,
14
+ FittedPicture,
15
+ add_bullets,
16
+ add_card,
17
+ add_picture_fit,
18
+ )
19
+ from pptx2.design.palettes import PALETTES, Palette, palette
12
20
  from pptx2.design.components import (
13
21
  ArticleCard,
14
22
  Gauge,
@@ -57,7 +65,7 @@ from pptx2.parts.slide import (
57
65
  if TYPE_CHECKING:
58
66
  from pptx2.opc.package import Part
59
67
 
60
- __version__ = "3.0.0"
68
+ __version__ = "3.1.0"
61
69
 
62
70
  sys.modules["pptx2.exceptions"] = exceptions
63
71
  del sys
@@ -91,6 +99,16 @@ __all__ = [
91
99
  "StatusPill",
92
100
  "StatStrip",
93
101
  "ArticleCard",
102
+ # Everyday slide blocks (hex-driven; no token setup required).
103
+ "add_card",
104
+ "add_bullets",
105
+ "add_picture_fit",
106
+ "Card",
107
+ "FittedPicture",
108
+ # Curated colour sets.
109
+ "Palette",
110
+ "PALETTES",
111
+ "palette",
94
112
  ]
95
113
 
96
114
  content_type_to_part_class_map: dict[str, type[Part]] = {
@@ -0,0 +1,433 @@
1
+ """Slide building blocks: the handful of pieces most content slides are made of.
2
+
3
+ Where :mod:`pptx2.design.recipes` builds whole slides and
4
+ :mod:`pptx2.design.components` builds token-driven dashboard widgets, this
5
+ module covers the everyday vocabulary of a teaching or explanatory deck,
6
+ driven by plain hex colours and points so a script needs no token setup:
7
+
8
+ * :func:`add_card` — one calm surface with a padded title and body. The
9
+ card *is* the emphasis: a tinted fill or a hairline outline, generous
10
+ padding, text that fits. No decorative stripes, badges or icons.
11
+ * :func:`add_bullets` — real PowerPoint bullets (``a:buChar`` /
12
+ ``a:buAutoNum``) with a hanging indent and breathing room between
13
+ items, shrunk to fit the box when the list runs long.
14
+ * :func:`add_picture_fit` — a picture placed *inside* a box, either
15
+ letter-boxed (``mode="contain"``) or cropped to fill (``mode="cover"``),
16
+ centred, with an optional caption underneath.
17
+
18
+ Every block tags the shapes it stacks with ``lint_group`` so the linter
19
+ treats a card and the text on it as one deliberate cluster, and every
20
+ block returns the shapes it made so callers can keep styling.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import contextlib
26
+ import os
27
+ from dataclasses import dataclass
28
+ from typing import IO, TYPE_CHECKING, Any, Optional, Sequence, Union
29
+
30
+ from pptx2.enum.shapes import MSO_SHAPE
31
+ from pptx2.geometry import BBox
32
+ from pptx2.util import Emu, Pt
33
+
34
+ if TYPE_CHECKING:
35
+ from pptx2.shapes.autoshape import Shape
36
+ from pptx2.slide import Slide
37
+
38
+ __all__ = (
39
+ "Card",
40
+ "FittedPicture",
41
+ "add_card",
42
+ "add_bullets",
43
+ "add_picture_fit",
44
+ )
45
+
46
+
47
+ def _as_bbox(bbox_or_positional: Sequence[Any]) -> BBox:
48
+ if len(bbox_or_positional) == 1 and isinstance(bbox_or_positional[0], BBox):
49
+ return bbox_or_positional[0]
50
+ if len(bbox_or_positional) == 4:
51
+ left, top, width, height = bbox_or_positional
52
+ return BBox(Emu(int(left)), Emu(int(top)), Emu(int(width)), Emu(int(height)))
53
+ raise TypeError(
54
+ "pass either a BBox or (left, top, width, height); got %d positional arg(s)"
55
+ % len(bbox_or_positional)
56
+ )
57
+
58
+
59
+ def _tag(shapes: Sequence[Any], group: str) -> None:
60
+ for shape in shapes:
61
+ if shape is None:
62
+ continue
63
+ with contextlib.suppress(AttributeError, NotImplementedError):
64
+ shape.lint_group = group
65
+
66
+
67
+ def _fit(tf: Any, *, font: Optional[str], max_pt: float, min_pt: float, bold: bool) -> None:
68
+ """Shrink *tf* to fit its shape, never below *min_pt*; fall back to autofit."""
69
+ from pptx2.enum.text import MSO_AUTO_SIZE
70
+
71
+ try:
72
+ applied = tf.fit_text(font_family=font, max_size=max(1, int(round(max_pt))), bold=bold)
73
+ except (ValueError, OSError):
74
+ applied = None
75
+ if applied is not None and applied < min_pt:
76
+ for para in tf.paragraphs:
77
+ for run in para.runs:
78
+ run.font.size = Pt(min_pt)
79
+ tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
80
+ elif applied is None:
81
+ tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
82
+
83
+
84
+ # ----------------------------------------------------------------------------- bullets
85
+
86
+
87
+ def add_bullets(
88
+ slide: "Slide",
89
+ *bbox_or_positional,
90
+ items: Sequence[str],
91
+ size_pt: float = 18.0,
92
+ color: Any = "#0F172A",
93
+ font: Optional[str] = None,
94
+ bold: bool = False,
95
+ numbered: bool = False,
96
+ bullet: str = "•",
97
+ gap_pt: float = 8.0,
98
+ line_spacing: float = 1.1,
99
+ align: str = "left",
100
+ anchor: str = "top",
101
+ margin_pt: float = 0.0,
102
+ min_size_pt: float = 12.0,
103
+ ) -> "Shape":
104
+ """Add a bulleted (or numbered) list that fits its box.
105
+
106
+ ``items`` become one paragraph each, carrying a real PowerPoint bullet
107
+ with a hanging indent — so wrapped lines align under the first word,
108
+ not under the bullet — and ``gap_pt`` of space after every item.
109
+ Text is measured and shrunk to fit the box, never below
110
+ ``min_size_pt``; if even that overflows, PowerPoint's shrink-on-render
111
+ is switched on as a safety net.
112
+
113
+ Returns the textbox :class:`Shape`.
114
+ """
115
+ from pptx2._color import coerce_color
116
+ from pptx2._textstyle import coerce_align, coerce_anchor
117
+
118
+ bb = _as_bbox(bbox_or_positional)
119
+ items = [str(item) for item in items]
120
+ if not items:
121
+ raise ValueError("items must be non-empty")
122
+
123
+ box = slide.shapes.add_textbox(*bb)
124
+ tf = box.text_frame
125
+ tf.word_wrap = True
126
+ tf.vertical_anchor = coerce_anchor(anchor)
127
+ if margin_pt:
128
+ m = Pt(margin_pt)
129
+ tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = m
130
+ rgb = coerce_color(color)
131
+ align_value = coerce_align(align)
132
+
133
+ for i, item in enumerate(items):
134
+ para = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
135
+ para.alignment = align_value
136
+ para.line_spacing = float(line_spacing)
137
+ if i < len(items) - 1:
138
+ para.space_after = Pt(gap_pt)
139
+ run = para.add_run()
140
+ run.text = item
141
+ if font is not None:
142
+ run.font.name = font
143
+ run.font.size = Pt(size_pt)
144
+ run.font.bold = bool(bold)
145
+ run.font.color.rgb = rgb
146
+ # Hanging list: marker at the left edge, every wrapped line aligned
147
+ # under the first word. The indent scales with the type size so a
148
+ # two-digit number still clears the text.
149
+ hang = Pt(size_pt * 1.4)
150
+ if numbered:
151
+ para.bullet.set_numbered(
152
+ "arabicPeriod", start_at=1, left_margin=hang, hanging_indent=hang
153
+ )
154
+ if i > 0:
155
+ # Only the first item pins the start number; the rest
156
+ # continue the sequence (an explicit startAt on every
157
+ # paragraph would restart each one at 1).
158
+ para._p.pPr.buAutoNum.startAt = None
159
+ else:
160
+ para.bullet.set_character(bullet, left_margin=hang, hanging_indent=hang)
161
+
162
+ _fit(tf, font=font, max_pt=size_pt, min_pt=min_size_pt, bold=bold)
163
+ return box
164
+
165
+
166
+ # ----------------------------------------------------------------------------- card
167
+
168
+
169
+ @dataclass
170
+ class Card:
171
+ """Shapes produced by :func:`add_card`."""
172
+
173
+ card: Any
174
+ title_box: Optional[Any]
175
+ body_box: Optional[Any]
176
+ inner: BBox
177
+ """The padded content area, for placing extra shapes inside the card."""
178
+
179
+ @property
180
+ def shapes(self) -> list:
181
+ return [s for s in (self.card, self.title_box, self.body_box) if s is not None]
182
+
183
+
184
+ def add_card(
185
+ slide: "Slide",
186
+ *bbox_or_positional,
187
+ title: Optional[str] = None,
188
+ body: Union[str, Sequence[str], None] = None,
189
+ fill: Any = "#F1F5F9",
190
+ line: Any = None,
191
+ line_pt: float = 1.0,
192
+ radius_pt: float = 12.0,
193
+ pad_pt: float = 20.0,
194
+ title_size_pt: float = 20.0,
195
+ body_size_pt: float = 16.0,
196
+ title_color: Any = "#0F172A",
197
+ body_color: Any = "#334155",
198
+ font: Optional[str] = None,
199
+ align: str = "left",
200
+ anchor: str = "top",
201
+ title_gap_pt: float = 6.0,
202
+ body_min_size_pt: float = 12.0,
203
+ numbered: bool = False,
204
+ ) -> Card:
205
+ """Add a card: one surface, padded title and body, nothing else.
206
+
207
+ The surface is a rounded rectangle with a flat ``fill`` (and no theme
208
+ shadow). Give it *either* a tinted fill *or* a ``line`` outline — a
209
+ tint reads as a surface on its own, an outline reads as a frame; both
210
+ at once compete. Text sits inside ``pad_pt`` of padding on every side.
211
+
212
+ ``body`` may be a string (one paragraph, wrapped) or a sequence of
213
+ strings (rendered through :func:`add_bullets`, numbered when
214
+ ``numbered=True``). Body text is fitted to the remaining height and
215
+ never shrinks below ``body_min_size_pt``.
216
+
217
+ Returns a :class:`Card` exposing ``card``, ``title_box``, ``body_box``
218
+ and ``inner`` (the padded content box) so a picture, equation or
219
+ diagram can be dropped inside the same card.
220
+ """
221
+ from pptx2._color import coerce_color
222
+ from pptx2._textstyle import coerce_align, coerce_anchor
223
+
224
+ bb = _as_bbox(bbox_or_positional)
225
+ pad = Pt(pad_pt)
226
+ inner = bb.inset(all=pad)
227
+
228
+ surface = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, *bb)
229
+ surface.fill.solid()
230
+ surface.fill.fore_color.rgb = coerce_color(fill)
231
+ if line is not None:
232
+ surface.line.color.rgb = coerce_color(line)
233
+ surface.line.width = Pt(line_pt)
234
+ else:
235
+ surface.line.fill.background()
236
+ surface.shadow.clear()
237
+ short_edge = min(int(bb.width), int(bb.height))
238
+ surface.corner_radius = Emu(min(int(Pt(radius_pt)), short_edge // 2))
239
+ surface.text_frame.text = ""
240
+
241
+ title_box = None
242
+ body_box = None
243
+ cursor_top = int(inner.top)
244
+ remaining = int(inner.height)
245
+
246
+ if title:
247
+ title_h = int(Pt(title_size_pt * 1.45))
248
+ title_h = min(title_h, remaining)
249
+ title_box = slide.shapes.add_textbox(inner.left, Emu(cursor_top), inner.width, Emu(title_h))
250
+ tf = title_box.text_frame
251
+ tf.word_wrap = True
252
+ tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Emu(0)
253
+ tf.vertical_anchor = coerce_anchor("top")
254
+ para = tf.paragraphs[0]
255
+ para.alignment = coerce_align(align)
256
+ run = para.add_run()
257
+ run.text = title
258
+ if font is not None:
259
+ run.font.name = font
260
+ run.font.size = Pt(title_size_pt)
261
+ run.font.bold = True
262
+ run.font.color.rgb = coerce_color(title_color)
263
+ _fit(tf, font=font, max_pt=title_size_pt, min_pt=max(12.0, title_size_pt * 0.7), bold=True)
264
+ cursor_top += title_h + int(Pt(title_gap_pt))
265
+ remaining = int(inner.bottom) - cursor_top
266
+
267
+ if body is not None and remaining > int(Pt(body_size_pt)):
268
+ body_bb = BBox(inner.left, Emu(cursor_top), inner.width, Emu(remaining))
269
+ if isinstance(body, str):
270
+ body_box = slide.shapes.add_textbox(*body_bb)
271
+ tf = body_box.text_frame
272
+ tf.word_wrap = True
273
+ tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Emu(0)
274
+ tf.vertical_anchor = coerce_anchor(anchor if title is None else "top")
275
+ para = tf.paragraphs[0]
276
+ para.alignment = coerce_align(align)
277
+ para.line_spacing = 1.1
278
+ run = para.add_run()
279
+ run.text = body
280
+ if font is not None:
281
+ run.font.name = font
282
+ run.font.size = Pt(body_size_pt)
283
+ run.font.color.rgb = coerce_color(body_color)
284
+ _fit(tf, font=font, max_pt=body_size_pt, min_pt=body_min_size_pt, bold=False)
285
+ else:
286
+ body_box = add_bullets(
287
+ slide,
288
+ body_bb,
289
+ items=list(body),
290
+ size_pt=body_size_pt,
291
+ color=body_color,
292
+ font=font,
293
+ numbered=numbered,
294
+ align=align,
295
+ anchor=anchor if title is None else "top",
296
+ min_size_pt=body_min_size_pt,
297
+ )
298
+
299
+ card = Card(card=surface, title_box=title_box, body_box=body_box, inner=inner)
300
+ _tag(card.shapes, f"card@{int(bb.left)},{int(bb.top)}")
301
+ return card
302
+
303
+
304
+ # ----------------------------------------------------------------------------- picture
305
+
306
+
307
+ @dataclass
308
+ class FittedPicture:
309
+ """Shapes produced by :func:`add_picture_fit`."""
310
+
311
+ picture: Any
312
+ caption_box: Optional[Any]
313
+ frame: BBox
314
+ """The box the picture actually occupies (after contain/cover)."""
315
+
316
+
317
+ def _image_size(image: Union[str, "os.PathLike[str]", IO[bytes]]) -> tuple[int, int]:
318
+ from PIL import Image as _PIL
319
+
320
+ if hasattr(image, "read"):
321
+ pos = image.tell() # type: ignore[union-attr]
322
+ with _PIL.open(image) as im: # type: ignore[arg-type]
323
+ size = im.size
324
+ image.seek(pos) # type: ignore[union-attr]
325
+ return size
326
+ with _PIL.open(image) as im: # type: ignore[arg-type]
327
+ return im.size
328
+
329
+
330
+ def add_picture_fit(
331
+ slide: "Slide",
332
+ image: Union[str, "os.PathLike[str]", IO[bytes]],
333
+ *bbox_or_positional,
334
+ mode: str = "contain",
335
+ align: str = "center",
336
+ caption: Optional[str] = None,
337
+ caption_size_pt: float = 12.0,
338
+ caption_color: Any = "#64748B",
339
+ caption_gap_pt: float = 6.0,
340
+ caption_height_pt: float = 22.0,
341
+ font: Optional[str] = None,
342
+ ) -> FittedPicture:
343
+ """Place *image* inside a box without distorting it.
344
+
345
+ ``mode="contain"`` scales the picture to fit entirely inside the box
346
+ (letter-boxed, positioned by ``align``: ``"center"``, ``"left"``,
347
+ ``"right"``, ``"top"``, ``"bottom"`` or corner pairs like
348
+ ``"top-left"``). ``mode="cover"`` fills the whole box and crops the
349
+ overflow symmetrically — the right choice for photographic
350
+ backgrounds and edge-to-edge hero images.
351
+
352
+ When ``caption`` is given, ``caption_height_pt`` is reserved at the
353
+ bottom of the box and the picture is fitted above it.
354
+
355
+ Returns a :class:`FittedPicture` with the picture, the caption box
356
+ (or ``None``) and the box the picture finally occupies.
357
+ """
358
+ bb = _as_bbox(bbox_or_positional)
359
+ if mode not in ("contain", "cover"):
360
+ raise ValueError("mode must be 'contain' or 'cover', got %r" % (mode,))
361
+
362
+ caption_box = None
363
+ pic_area = bb
364
+ if caption:
365
+ cap_h = int(Pt(caption_height_pt))
366
+ gap = int(Pt(caption_gap_pt))
367
+ pic_area = BBox(bb.left, bb.top, bb.width, Emu(max(1, int(bb.height) - cap_h - gap)))
368
+
369
+ iw, ih = _image_size(image)
370
+ box_w, box_h = int(pic_area.width), int(pic_area.height)
371
+ img_ratio = iw / float(ih)
372
+ box_ratio = box_w / float(box_h)
373
+
374
+ if mode == "contain":
375
+ if img_ratio >= box_ratio:
376
+ w = box_w
377
+ h = int(round(box_w / img_ratio))
378
+ else:
379
+ h = box_h
380
+ w = int(round(box_h * img_ratio))
381
+ a = align.lower()
382
+ if "left" in a:
383
+ left = int(pic_area.left)
384
+ elif "right" in a:
385
+ left = int(pic_area.right) - w
386
+ else:
387
+ left = int(pic_area.left) + (box_w - w) // 2
388
+ if "top" in a:
389
+ top = int(pic_area.top)
390
+ elif "bottom" in a:
391
+ top = int(pic_area.bottom) - h
392
+ else:
393
+ top = int(pic_area.top) + (box_h - h) // 2
394
+ frame = BBox(Emu(left), Emu(top), Emu(w), Emu(h))
395
+ picture = slide.shapes.add_picture(image, frame.left, frame.top, frame.width, frame.height)
396
+ else:
397
+ frame = pic_area
398
+ picture = slide.shapes.add_picture(image, frame.left, frame.top, frame.width, frame.height)
399
+ if img_ratio > box_ratio:
400
+ # Image is wider than the box: trim left/right.
401
+ keep = box_ratio / img_ratio
402
+ trim = (1.0 - keep) / 2.0
403
+ picture.crop_left = trim
404
+ picture.crop_right = trim
405
+ elif img_ratio < box_ratio:
406
+ keep = img_ratio / box_ratio
407
+ trim = (1.0 - keep) / 2.0
408
+ picture.crop_top = trim
409
+ picture.crop_bottom = trim
410
+
411
+ if caption:
412
+ cap_top = int(frame.bottom) + int(Pt(caption_gap_pt))
413
+ cap_h = int(bb.bottom) - cap_top
414
+ if cap_h > 0:
415
+ a = align.lower()
416
+ caption_align = "left" if "left" in a else "right" if "right" in a else "center"
417
+ caption_box = slide.shapes.add_text(
418
+ BBox(bb.left, Emu(cap_top), bb.width, Emu(cap_h)),
419
+ text=caption,
420
+ font=font,
421
+ size_pt=caption_size_pt,
422
+ italic=True,
423
+ color=caption_color,
424
+ align=caption_align,
425
+ anchor="top",
426
+ margin_pt=0,
427
+ )
428
+ from pptx2.enum.text import MSO_AUTO_SIZE
429
+
430
+ caption_box.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
431
+
432
+ _tag([picture, caption_box], f"picture@{int(bb.left)},{int(bb.top)}")
433
+ return FittedPicture(picture=picture, caption_box=caption_box, frame=frame)