slidemark 0.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 (315) hide show
  1. slidemark-0.1.0/.coverage +0 -0
  2. slidemark-0.1.0/.github/workflows/ci.yml +27 -0
  3. slidemark-0.1.0/.github/workflows/publish.yml +41 -0
  4. slidemark-0.1.0/.gitignore +10 -0
  5. slidemark-0.1.0/CHANGELOG.md +57 -0
  6. slidemark-0.1.0/CLAUDE.md +55 -0
  7. slidemark-0.1.0/PKG-INFO +384 -0
  8. slidemark-0.1.0/README.md +357 -0
  9. slidemark-0.1.0/docs/AGENT_COST.md +325 -0
  10. slidemark-0.1.0/docs/AGENT_TIPS.md +51 -0
  11. slidemark-0.1.0/docs/COMPARE.md +1776 -0
  12. slidemark-0.1.0/docs/DAILY_LOG.md +151 -0
  13. slidemark-0.1.0/docs/DESIGN_COVERAGE.md +222 -0
  14. slidemark-0.1.0/docs/DESIGN_FREEDOM.md +116 -0
  15. slidemark-0.1.0/docs/DESIGN_REQUIRED.md +68 -0
  16. slidemark-0.1.0/docs/FEATURES.md +115 -0
  17. slidemark-0.1.0/docs/LESSONS.md +309 -0
  18. slidemark-0.1.0/docs/PLAN.md +728 -0
  19. slidemark-0.1.0/docs/PROPOSAL.md +260 -0
  20. slidemark-0.1.0/docs/RENDERING.md +72 -0
  21. slidemark-0.1.0/docs/SYNTAX.md +1041 -0
  22. slidemark-0.1.0/docs/TARGETS.md +180 -0
  23. slidemark-0.1.0/docs/TOKEN_FLOOR.md +33 -0
  24. slidemark-0.1.0/examples/01-basics.md +44 -0
  25. slidemark-0.1.0/examples/02-jp-dense.md +49 -0
  26. slidemark-0.1.0/examples/03-vi-report.md +26 -0
  27. slidemark-0.1.0/examples/04-jp-kpi.md +47 -0
  28. slidemark-0.1.0/examples/05-jp-process.md +47 -0
  29. slidemark-0.1.0/examples/06-jp-market.md +41 -0
  30. slidemark-0.1.0/examples/07-jp-org.md +44 -0
  31. slidemark-0.1.0/examples/08-jp-roadmap.md +51 -0
  32. slidemark-0.1.0/examples/09-midnight-tech.md +70 -0
  33. slidemark-0.1.0/examples/10-template.md +28 -0
  34. slidemark-0.1.0/examples/11-jp-consulting.md +164 -0
  35. slidemark-0.1.0/examples/12-html-svg-math.md +28 -0
  36. slidemark-0.1.0/examples/13-brand-aurora.md +45 -0
  37. slidemark-0.1.0/examples/14-brand-terracotta.md +22 -0
  38. slidemark-0.1.0/examples/15-html-mixed.md +37 -0
  39. slidemark-0.1.0/examples/16-jp-strategy.md +177 -0
  40. slidemark-0.1.0/examples/17-editorial-css.md +69 -0
  41. slidemark-0.1.0/examples/18-brand-lime.md +41 -0
  42. slidemark-0.1.0/examples/19-vi-consulting-brand.md +58 -0
  43. slidemark-0.1.0/examples/20-jp-retail-dense.md +204 -0
  44. slidemark-0.1.0/examples/21-jp-dark-pitch.md +69 -0
  45. slidemark-0.1.0/examples/22-en-launch-plan.md +112 -0
  46. slidemark-0.1.0/examples/23-vocabulary.md +115 -0
  47. slidemark-0.1.0/examples/24-vocabulary-2.md +77 -0
  48. slidemark-0.1.0/examples/25-roundtrip-forms.md +88 -0
  49. slidemark-0.1.0/pyproject.toml +53 -0
  50. slidemark-0.1.0/scripts/gallery.py +88 -0
  51. slidemark-0.1.0/scripts/gen_metrics.py +94 -0
  52. slidemark-0.1.0/scripts/make_example_assets.py +60 -0
  53. slidemark-0.1.0/src/slidemark/__init__.py +8 -0
  54. slidemark-0.1.0/src/slidemark/build.py +60 -0
  55. slidemark-0.1.0/src/slidemark/cli.py +755 -0
  56. slidemark-0.1.0/src/slidemark/contrast.py +95 -0
  57. slidemark-0.1.0/src/slidemark/critique.py +341 -0
  58. slidemark-0.1.0/src/slidemark/design.py +333 -0
  59. slidemark-0.1.0/src/slidemark/fit.py +459 -0
  60. slidemark-0.1.0/src/slidemark/fix.py +377 -0
  61. slidemark-0.1.0/src/slidemark/fonts/fonts.conf +110 -0
  62. slidemark-0.1.0/src/slidemark/forms.py +184 -0
  63. slidemark-0.1.0/src/slidemark/forms2.py +283 -0
  64. slidemark-0.1.0/src/slidemark/forms3.py +175 -0
  65. slidemark-0.1.0/src/slidemark/honour.py +627 -0
  66. slidemark-0.1.0/src/slidemark/htmlnative.py +950 -0
  67. slidemark-0.1.0/src/slidemark/icons/__init__.py +349 -0
  68. slidemark-0.1.0/src/slidemark/icons/glyphs.py +237 -0
  69. slidemark-0.1.0/src/slidemark/icons/svgfile.py +257 -0
  70. slidemark-0.1.0/src/slidemark/importer/__init__.py +702 -0
  71. slidemark-0.1.0/src/slidemark/importer/design.py +370 -0
  72. slidemark-0.1.0/src/slidemark/importer/diet.py +792 -0
  73. slidemark-0.1.0/src/slidemark/importer/emit.py +467 -0
  74. slidemark-0.1.0/src/slidemark/importer/forms2.py +358 -0
  75. slidemark-0.1.0/src/slidemark/importer/links.py +424 -0
  76. slidemark-0.1.0/src/slidemark/importer/look.py +341 -0
  77. slidemark-0.1.0/src/slidemark/importer/mathml.py +194 -0
  78. slidemark-0.1.0/src/slidemark/importer/read.py +1085 -0
  79. slidemark-0.1.0/src/slidemark/importer/recognise.py +801 -0
  80. slidemark-0.1.0/src/slidemark/importer/recognise2.py +947 -0
  81. slidemark-0.1.0/src/slidemark/importer/recognise3.py +622 -0
  82. slidemark-0.1.0/src/slidemark/importer/runs.py +243 -0
  83. slidemark-0.1.0/src/slidemark/importer/shadows.py +44 -0
  84. slidemark-0.1.0/src/slidemark/importer/structure.py +1603 -0
  85. slidemark-0.1.0/src/slidemark/importer/vocab.py +266 -0
  86. slidemark-0.1.0/src/slidemark/ir.py +415 -0
  87. slidemark-0.1.0/src/slidemark/jsonio.py +53 -0
  88. slidemark-0.1.0/src/slidemark/layout/__init__.py +7 -0
  89. slidemark-0.1.0/src/slidemark/layout/boxpin.py +133 -0
  90. slidemark-0.1.0/src/slidemark/layout/cardlook.py +143 -0
  91. slidemark-0.1.0/src/slidemark/layout/chartnote.py +689 -0
  92. slidemark-0.1.0/src/slidemark/layout/css.py +736 -0
  93. slidemark-0.1.0/src/slidemark/layout/diagram.py +1003 -0
  94. slidemark-0.1.0/src/slidemark/layout/engine.py +5240 -0
  95. slidemark-0.1.0/src/slidemark/layout/forms2.py +1668 -0
  96. slidemark-0.1.0/src/slidemark/layout/gantt.py +397 -0
  97. slidemark-0.1.0/src/slidemark/layout/grid.py +300 -0
  98. slidemark-0.1.0/src/slidemark/layout/htmlslide.py +83 -0
  99. slidemark-0.1.0/src/slidemark/layout/jbreak.py +217 -0
  100. slidemark-0.1.0/src/slidemark/layout/kpirow.py +84 -0
  101. slidemark-0.1.0/src/slidemark/layout/kpirule.py +135 -0
  102. slidemark-0.1.0/src/slidemark/layout/kpiunit.py +77 -0
  103. slidemark-0.1.0/src/slidemark/layout/l3fill.py +1884 -0
  104. slidemark-0.1.0/src/slidemark/layout/measure.py +733 -0
  105. slidemark-0.1.0/src/slidemark/layout/metrics/widths.json +1 -0
  106. slidemark-0.1.0/src/slidemark/layout/pills.py +207 -0
  107. slidemark-0.1.0/src/slidemark/layout/score.py +176 -0
  108. slidemark-0.1.0/src/slidemark/layout/search.py +83 -0
  109. slidemark-0.1.0/src/slidemark/layout/sparsefill.py +221 -0
  110. slidemark-0.1.0/src/slidemark/layout/stepspin.py +116 -0
  111. slidemark-0.1.0/src/slidemark/layout/tablehl.py +103 -0
  112. slidemark-0.1.0/src/slidemark/layout/tables.py +352 -0
  113. slidemark-0.1.0/src/slidemark/layout/vfill.py +478 -0
  114. slidemark-0.1.0/src/slidemark/layout/vocab.py +1171 -0
  115. slidemark-0.1.0/src/slidemark/lint.py +731 -0
  116. slidemark-0.1.0/src/slidemark/parser/__init__.py +34 -0
  117. slidemark-0.1.0/src/slidemark/parser/attrs.py +463 -0
  118. slidemark-0.1.0/src/slidemark/parser/blocks.py +528 -0
  119. slidemark-0.1.0/src/slidemark/parser/core.py +1183 -0
  120. slidemark-0.1.0/src/slidemark/parser/css.py +1114 -0
  121. slidemark-0.1.0/src/slidemark/parser/ctx.py +46 -0
  122. slidemark-0.1.0/src/slidemark/parser/html.py +1105 -0
  123. slidemark-0.1.0/src/slidemark/parser/inline.py +307 -0
  124. slidemark-0.1.0/src/slidemark/parser/lenient.py +250 -0
  125. slidemark-0.1.0/src/slidemark/parser/mermaid.py +346 -0
  126. slidemark-0.1.0/src/slidemark/parser/tabular.py +761 -0
  127. slidemark-0.1.0/src/slidemark/parser/tokens.py +399 -0
  128. slidemark-0.1.0/src/slidemark/presets/default.yaml +26 -0
  129. slidemark-0.1.0/src/slidemark/presets/jp-business.yaml +57 -0
  130. slidemark-0.1.0/src/slidemark/presets/midnight.yaml +23 -0
  131. slidemark-0.1.0/src/slidemark/preview.py +175 -0
  132. slidemark-0.1.0/src/slidemark/redesign.py +685 -0
  133. slidemark-0.1.0/src/slidemark/render/__init__.py +982 -0
  134. slidemark-0.1.0/src/slidemark/render/anim.py +213 -0
  135. slidemark-0.1.0/src/slidemark/render/axis.py +295 -0
  136. slidemark-0.1.0/src/slidemark/render/charthl.py +114 -0
  137. slidemark-0.1.0/src/slidemark/render/design_part.py +337 -0
  138. slidemark-0.1.0/src/slidemark/render/effects.py +308 -0
  139. slidemark-0.1.0/src/slidemark/render/htmlimg.py +262 -0
  140. slidemark-0.1.0/src/slidemark/render/icons.py +101 -0
  141. slidemark-0.1.0/src/slidemark/render/math.py +419 -0
  142. slidemark-0.1.0/src/slidemark/render/media.py +199 -0
  143. slidemark-0.1.0/src/slidemark/render/objects.py +1308 -0
  144. slidemark-0.1.0/src/slidemark/render/svg.py +236 -0
  145. slidemark-0.1.0/src/slidemark/render/text.py +300 -0
  146. slidemark-0.1.0/src/slidemark/render/util.py +155 -0
  147. slidemark-0.1.0/src/slidemark/render/vocabshapes.py +79 -0
  148. slidemark-0.1.0/src/slidemark/render/waterfall.py +137 -0
  149. slidemark-0.1.0/src/slidemark/selfreview.py +514 -0
  150. slidemark-0.1.0/src/slidemark/shapes.py +147 -0
  151. slidemark-0.1.0/src/slidemark/skill/SKILL.md +287 -0
  152. slidemark-0.1.0/src/slidemark/skill/reference/charts-tables.md +52 -0
  153. slidemark-0.1.0/src/slidemark/skill/reference/components.md +65 -0
  154. slidemark-0.1.0/src/slidemark/skill/reference/design.md +55 -0
  155. slidemark-0.1.0/src/slidemark/skill/reference/diagnostics.md +36 -0
  156. slidemark-0.1.0/src/slidemark/skill/reference/icons.md +12 -0
  157. slidemark-0.1.0/src/slidemark/skill/reference/jp-dense.md +29 -0
  158. slidemark-0.1.0/src/slidemark/skill/reference/review.md +16 -0
  159. slidemark-0.1.0/src/slidemark/skill/reference/syntax.md +42 -0
  160. slidemark-0.1.0/src/slidemark/template.py +391 -0
  161. slidemark-0.1.0/src/slidemark/theme.py +2077 -0
  162. slidemark-0.1.0/src/slidemark/units.py +55 -0
  163. slidemark-0.1.0/src/slidemark/xsd.py +149 -0
  164. slidemark-0.1.0/tests/__init__.py +0 -0
  165. slidemark-0.1.0/tests/data/charts_math.md +66 -0
  166. slidemark-0.1.0/tests/data/sparse_ja_dense.md +59 -0
  167. slidemark-0.1.0/tests/data/sparse_ja_short.md +29 -0
  168. slidemark-0.1.0/tests/data/sparse_vi_brand.md +79 -0
  169. slidemark-0.1.0/tests/helpers.py +16 -0
  170. slidemark-0.1.0/tests/test_badge_clip.py +28 -0
  171. slidemark-0.1.0/tests/test_badge_table.py +57 -0
  172. slidemark-0.1.0/tests/test_brand_gaps.py +140 -0
  173. slidemark-0.1.0/tests/test_card_rules.py +238 -0
  174. slidemark-0.1.0/tests/test_chart_axis.py +130 -0
  175. slidemark-0.1.0/tests/test_chart_decisions.py +362 -0
  176. slidemark-0.1.0/tests/test_chart_defaults.py +199 -0
  177. slidemark-0.1.0/tests/test_chart_grouped.py +60 -0
  178. slidemark-0.1.0/tests/test_chart_label_ink.py +62 -0
  179. slidemark-0.1.0/tests/test_chart_note.py +387 -0
  180. slidemark-0.1.0/tests/test_chart_sparse.py +121 -0
  181. slidemark-0.1.0/tests/test_chart_text_scale.py +64 -0
  182. slidemark-0.1.0/tests/test_chevron_five.py +117 -0
  183. slidemark-0.1.0/tests/test_cjk_squeeze.py +156 -0
  184. slidemark-0.1.0/tests/test_cjk_unit_join.py +98 -0
  185. slidemark-0.1.0/tests/test_cli.py +192 -0
  186. slidemark-0.1.0/tests/test_cli_build.py +231 -0
  187. slidemark-0.1.0/tests/test_conclusion_size.py +42 -0
  188. slidemark-0.1.0/tests/test_contrast.py +54 -0
  189. slidemark-0.1.0/tests/test_contrast_derived.py +156 -0
  190. slidemark-0.1.0/tests/test_cover_anchored.py +110 -0
  191. slidemark-0.1.0/tests/test_critique.py +162 -0
  192. slidemark-0.1.0/tests/test_css_apply.py +813 -0
  193. slidemark-0.1.0/tests/test_css_parse.py +504 -0
  194. slidemark-0.1.0/tests/test_design_coverage.py +325 -0
  195. slidemark-0.1.0/tests/test_design_coverage2.py +491 -0
  196. slidemark-0.1.0/tests/test_design_dl2f.py +546 -0
  197. slidemark-0.1.0/tests/test_design_dl2g.py +343 -0
  198. slidemark-0.1.0/tests/test_design_feedback.py +623 -0
  199. slidemark-0.1.0/tests/test_design_native.py +266 -0
  200. slidemark-0.1.0/tests/test_design_roundtrip.py +229 -0
  201. slidemark-0.1.0/tests/test_dl3d_forms.py +569 -0
  202. slidemark-0.1.0/tests/test_dl3d_part2_forms.py +455 -0
  203. slidemark-0.1.0/tests/test_dl3d_part2_geometry.py +410 -0
  204. slidemark-0.1.0/tests/test_e2e.py +21 -0
  205. slidemark-0.1.0/tests/test_element_control.py +656 -0
  206. slidemark-0.1.0/tests/test_eval.py +133 -0
  207. slidemark-0.1.0/tests/test_fit_map.py +199 -0
  208. slidemark-0.1.0/tests/test_fix.py +195 -0
  209. slidemark-0.1.0/tests/test_forms2.py +534 -0
  210. slidemark-0.1.0/tests/test_gantt.py +270 -0
  211. slidemark-0.1.0/tests/test_gantt_pill.py +76 -0
  212. slidemark-0.1.0/tests/test_golden.py +46 -0
  213. slidemark-0.1.0/tests/test_grow_max.py +241 -0
  214. slidemark-0.1.0/tests/test_honour.py +481 -0
  215. slidemark-0.1.0/tests/test_html_slide.py +239 -0
  216. slidemark-0.1.0/tests/test_html_zoom.py +125 -0
  217. slidemark-0.1.0/tests/test_htmlnative.py +222 -0
  218. slidemark-0.1.0/tests/test_icons.py +321 -0
  219. slidemark-0.1.0/tests/test_import.py +314 -0
  220. slidemark-0.1.0/tests/test_import_css.py +152 -0
  221. slidemark-0.1.0/tests/test_import_foreign.py +218 -0
  222. slidemark-0.1.0/tests/test_import_header_rows.py +35 -0
  223. slidemark-0.1.0/tests/test_import_links.py +152 -0
  224. slidemark-0.1.0/tests/test_import_recognise.py +300 -0
  225. slidemark-0.1.0/tests/test_import_recognise2.py +530 -0
  226. slidemark-0.1.0/tests/test_import_recognise3.py +342 -0
  227. slidemark-0.1.0/tests/test_import_runs.py +56 -0
  228. slidemark-0.1.0/tests/test_import_tokens.py +328 -0
  229. slidemark-0.1.0/tests/test_ir.py +27 -0
  230. slidemark-0.1.0/tests/test_jbreak.py +196 -0
  231. slidemark-0.1.0/tests/test_jsonio.py +19 -0
  232. slidemark-0.1.0/tests/test_kpi_hero.py +283 -0
  233. slidemark-0.1.0/tests/test_l3_bar.py +220 -0
  234. slidemark-0.1.0/tests/test_l3_chevron.py +167 -0
  235. slidemark-0.1.0/tests/test_l3_diagram_tree.py +196 -0
  236. slidemark-0.1.0/tests/test_l3_hollow_spread.py +70 -0
  237. slidemark-0.1.0/tests/test_l3_kpi_lone.py +121 -0
  238. slidemark-0.1.0/tests/test_l3_org_grid.py +65 -0
  239. slidemark-0.1.0/tests/test_l3_panel_follow.py +43 -0
  240. slidemark-0.1.0/tests/test_l3_table_header.py +81 -0
  241. slidemark-0.1.0/tests/test_l3_table_text.py +104 -0
  242. slidemark-0.1.0/tests/test_l3_w2a.py +164 -0
  243. slidemark-0.1.0/tests/test_l3_w4_cover.py +65 -0
  244. slidemark-0.1.0/tests/test_layout.py +443 -0
  245. slidemark-0.1.0/tests/test_layout_auto.py +192 -0
  246. slidemark-0.1.0/tests/test_layout_balance.py +150 -0
  247. slidemark-0.1.0/tests/test_layout_band.py +96 -0
  248. slidemark-0.1.0/tests/test_layout_card_table_plot.py +77 -0
  249. slidemark-0.1.0/tests/test_layout_components.py +388 -0
  250. slidemark-0.1.0/tests/test_layout_consulting.py +433 -0
  251. slidemark-0.1.0/tests/test_layout_diagram.py +333 -0
  252. slidemark-0.1.0/tests/test_layout_fill_policy.py +122 -0
  253. slidemark-0.1.0/tests/test_layout_free.py +97 -0
  254. slidemark-0.1.0/tests/test_layout_l3_fill.py +351 -0
  255. slidemark-0.1.0/tests/test_layout_policies.py +541 -0
  256. slidemark-0.1.0/tests/test_layout_review3.py +218 -0
  257. slidemark-0.1.0/tests/test_layout_search.py +292 -0
  258. slidemark-0.1.0/tests/test_layout_sparse_fill.py +55 -0
  259. slidemark-0.1.0/tests/test_layout_sparse_step.py +106 -0
  260. slidemark-0.1.0/tests/test_layout_tokens.py +73 -0
  261. slidemark-0.1.0/tests/test_layout_vfill.py +188 -0
  262. slidemark-0.1.0/tests/test_lint.py +119 -0
  263. slidemark-0.1.0/tests/test_lint_chart_contrast.py +99 -0
  264. slidemark-0.1.0/tests/test_lint_table_contrast.py +105 -0
  265. slidemark-0.1.0/tests/test_look_accent.py +23 -0
  266. slidemark-0.1.0/tests/test_measure.py +70 -0
  267. slidemark-0.1.0/tests/test_media.py +252 -0
  268. slidemark-0.1.0/tests/test_no_hardcoded.py +114 -0
  269. slidemark-0.1.0/tests/test_orphan_muted.py +122 -0
  270. slidemark-0.1.0/tests/test_parser.py +584 -0
  271. slidemark-0.1.0/tests/test_parser_fuzz.py +434 -0
  272. slidemark-0.1.0/tests/test_parser_html.py +230 -0
  273. slidemark-0.1.0/tests/test_parser_lenient.py +214 -0
  274. slidemark-0.1.0/tests/test_parser_mermaid.py +178 -0
  275. slidemark-0.1.0/tests/test_parser_tabular.py +172 -0
  276. slidemark-0.1.0/tests/test_pills.py +150 -0
  277. slidemark-0.1.0/tests/test_preview.py +17 -0
  278. slidemark-0.1.0/tests/test_preview_cmd.py +55 -0
  279. slidemark-0.1.0/tests/test_preview_fonts.py +44 -0
  280. slidemark-0.1.0/tests/test_preview_locale.py +33 -0
  281. slidemark-0.1.0/tests/test_render.py +360 -0
  282. slidemark-0.1.0/tests/test_render_anim.py +192 -0
  283. slidemark-0.1.0/tests/test_render_chart_colors.py +65 -0
  284. slidemark-0.1.0/tests/test_render_charts.py +212 -0
  285. slidemark-0.1.0/tests/test_render_components.py +284 -0
  286. slidemark-0.1.0/tests/test_render_effects.py +275 -0
  287. slidemark-0.1.0/tests/test_render_html.py +104 -0
  288. slidemark-0.1.0/tests/test_render_math.py +110 -0
  289. slidemark-0.1.0/tests/test_render_tables.py +152 -0
  290. slidemark-0.1.0/tests/test_roundtrip.py +206 -0
  291. slidemark-0.1.0/tests/test_roundtrip_compare.py +172 -0
  292. slidemark-0.1.0/tests/test_rowgroups.py +109 -0
  293. slidemark-0.1.0/tests/test_selfreview.py +381 -0
  294. slidemark-0.1.0/tests/test_silent_defects.py +231 -0
  295. slidemark-0.1.0/tests/test_skill.py +44 -0
  296. slidemark-0.1.0/tests/test_slide_ink.py +176 -0
  297. slidemark-0.1.0/tests/test_sparse_lead.py +53 -0
  298. slidemark-0.1.0/tests/test_sparse_slides.py +251 -0
  299. slidemark-0.1.0/tests/test_sparse_wave2.py +313 -0
  300. slidemark-0.1.0/tests/test_steps.py +200 -0
  301. slidemark-0.1.0/tests/test_svg.py +187 -0
  302. slidemark-0.1.0/tests/test_table_card_balance.py +135 -0
  303. slidemark-0.1.0/tests/test_table_fit.py +71 -0
  304. slidemark-0.1.0/tests/test_table_fit_beside.py +31 -0
  305. slidemark-0.1.0/tests/test_table_growth.py +79 -0
  306. slidemark-0.1.0/tests/test_table_hl.py +164 -0
  307. slidemark-0.1.0/tests/test_template.py +194 -0
  308. slidemark-0.1.0/tests/test_token_gate.py +19 -0
  309. slidemark-0.1.0/tests/test_tokens_contract.py +79 -0
  310. slidemark-0.1.0/tests/test_tokens_header.py +207 -0
  311. slidemark-0.1.0/tests/test_tokens_values.py +261 -0
  312. slidemark-0.1.0/tests/test_vocabulary.py +868 -0
  313. slidemark-0.1.0/tests/test_waterfall.py +96 -0
  314. slidemark-0.1.0/tests/test_wrap_dash.py +46 -0
  315. slidemark-0.1.0/tests/test_xsd.py +30 -0
Binary file
@@ -0,0 +1,27 @@
1
+ name: ci
2
+ # GitHub Actions minutes are limited on this private repo. The daily routine already runs ruff + the full
3
+ # pytest suite locally before every push, so CI runs once a day on the latest main (and on demand),
4
+ # not on every push. Re-add `push:` only if the repo becomes public or gets more minutes.
5
+ on:
6
+ schedule:
7
+ - cron: "0 23 * * *" # 08:00 JST, after the 02:45 JST routine run
8
+ workflow_dispatch:
9
+ concurrency:
10
+ group: ci-${{ github.ref }}
11
+ cancel-in-progress: true
12
+ jobs:
13
+ test:
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 30
16
+ strategy:
17
+ matrix:
18
+ python: ["3.10", "3.12"]
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - uses: astral-sh/setup-uv@v3
22
+ - run: uv venv --python ${{ matrix.python }} .venv
23
+ - run: uv pip install -e ".[dev,html]" --python .venv
24
+ - run: .venv/bin/playwright install --with-deps chromium
25
+ - run: .venv/bin/ruff check .
26
+ - run: .venv/bin/ruff format --check .
27
+ - run: .venv/bin/pytest -q --cov=slidemark --cov-report=term:skip-covered
@@ -0,0 +1,41 @@
1
+ name: publish
2
+ # Publishes the package to PyPI through Trusted Publishing (OpenID Connect): no API token is stored.
3
+ # PyPI side: project `slidemark`, owner `LeDat98`, repository `SlideMark`, workflow `publish.yml`,
4
+ # environment `pypi`. GitHub side: Settings > Environments > `pypi` (add the owner as a required reviewer
5
+ # so a release is approved by hand). Runs on a published GitHub release or on demand; the version comes
6
+ # from `pyproject.toml`, so bump it and tag `vX.Y.Z` first.
7
+ on:
8
+ release:
9
+ types: [published]
10
+ workflow_dispatch:
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 15
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: astral-sh/setup-uv@v3
18
+ - run: uv build
19
+ - run: uv venv .venv && uv pip install --python .venv dist/*.whl
20
+ - run: .venv/bin/slidemark version
21
+ - run: printf '# Hello\n- one\n- two\n' | .venv/bin/slidemark build - -o /tmp/smoke.pptx
22
+ - uses: actions/upload-artifact@v4
23
+ with:
24
+ name: dist
25
+ path: dist/
26
+ publish:
27
+ needs: build
28
+ runs-on: ubuntu-latest
29
+ timeout-minutes: 10
30
+ environment:
31
+ name: pypi
32
+ url: https://pypi.org/p/slidemark
33
+ permissions:
34
+ id-token: write # the OIDC token PyPI trusts
35
+ contents: read
36
+ steps:
37
+ - uses: actions/download-artifact@v4
38
+ with:
39
+ name: dist
40
+ path: dist/
41
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,10 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ /out/
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ *.egg-info/
8
+ dist/
9
+ .claude/worktrees/
10
+ .hypothesis/
@@ -0,0 +1,57 @@
1
+ # Changelog
2
+
3
+ All notable changes. Versions follow semver once 0.1.0 is published.
4
+
5
+ ## 0.1.0 (2026-10-07)
6
+
7
+ ### Design freedom
8
+ - DL3d lane A (foreign-deck round trip): span attributes `[420億円]{size=28 bold=true color=primary}` (exact pt, mixed sizes / colours in one line: paragraphs, list items, `@rows`, table cells, headings, KPI values; the importer writes them back, `importer/runs.py`), per-card stripe colours `box.stripe=a,b,c` / `item.stripe` / `kpi.stripe` + `.stripe_h` / `.stripe.side` / `{stripe=teal}`, number headings `@4 num=text` / `## 01 {.num}` / `box.num.color=a,b,c`, number tiles `@kpi tile`, `cover.bottom.bar`, readable ink on a box with its own `{fill=}`, `<br>` in table cells without a warning; `examples/25-roundtrip-forms.md`.
9
+ - DL2 lane G: `kpi.band=<color>` (`kpi.band.color`, `kpi.band.size`: a header band behind the label of every `.kpi` card) and `kpi.unit.size=22` (`kpi.unit.color`: the trailing unit of a KPI value in its own run size, `Run.size`); `sizes: kpi=NN` now sets the KPI number size (it was a silent no-op) and counts as an explicit size; KPI value width estimates measure the unit at its own size; t2 / t3 ports re-done with every form that exists.
10
+ - DL3b part 1 (composition vocabulary): `@timeline` (h / v, marks), `@vs` (verdict, winner), `@matrix` (axis labels + arrows), `@funnel`, `@pyramid`, `@cycle`, `@agenda`, `@statement`, each one `@word` line with secondary keys (`dir=` `marks=` `x=` `y=` `align=` `valign=` + `size=` `fill=` `gap=`) and `<form>.*` tokens; native custom-geometry stages and arc arrows; importer round trip; `examples/23-vocabulary.md`.
11
+ - DL2 lane F: `@items` / `box.items=cards` (item cards), `@num` (numbered heading badges), `heading.rule`, `title.rule2`, `@rows plain` with `rows.glyph` / `rows.stripe`, cover `bar@edge` / `rule_w` / `rule_pos` / `stripes`, `render.chevron_shape` as a list, `table.num_pad`, `kpi.fill` / `kpi.line`; lint reads a KPI label against a tall stripe.
12
+ - No fixed look: every color, font, size, spacing, band, card style and layout constant is a token
13
+ (`slidemark tokens`); built-in themes are YAML presets (`src/slidemark/presets/`); `theme: none` is a neutral canvas.
14
+ - Header token lines `colors:` `fonts:` `sizes:` `style:` (new classes such as `hero.fill=` too), validated with
15
+ did-you-mean hints; shorthands `border="0.75pt solid #B08D57"`, `fill=none`, `shadow=none`.
16
+ - ` ```css ` fences (deck or slide): 34 CSS properties mapped to native PowerPoint (gradients, shadows, per-side
17
+ borders, letter-spacing, text-transform, rotation, grid templates, table cell styles), selector matching.
18
+ - `@html` slides and `slidemark build deck.html`: Chromium layout converted to native shapes (gradients, shadows,
19
+ rotation, ellipses, pills, simple inline SVG); theme tokens as CSS custom properties.
20
+ - `@free` slides: explicit `{x y w h}` positions, no automatic arrangement.
21
+ - The design source (tokens, CSS, HTML) survives `slidemark import` (customXml part).
22
+
23
+ ### Syntax
24
+ - Headings as structure (`#` slide, `##` box), one `@` grid line (`@3`, `@2x2`, `@1:2`, `@aab/aac`), `@end`.
25
+ - Components: `.kpi` boxes, callouts `> [!note|tip|warn|caution]`, badges `[x]{.badge}`, connectors `@ a>b a-b`,
26
+ `flow` arrows, `chevron` steps.
27
+ - Charts as CSV fences (10 kinds) with options `legend labels fmt min max colors axis`; tables with merges and
28
+ options `widths align header hcol .zebra`; CSV edge cases (quotes, `1,240`, `12%`, full-width digits, `▲`).
29
+ - SVG images (`![x](a.svg)`, ` ```svg `): native Office SVG with a PNG fallback, sanitized.
30
+ - Video/audio: `![alt](x.mp4)` / `.mp3` embed native media (poster, `autoplay`, `loop`).
31
+ - ` ```html {render=native} `: any HTML/CSS laid out in Chromium and converted to native shapes.
32
+ - ` ```math ` → native OMML equations; ` ```mermaid ` flowcharts → native shapes + connectors; HTML subset input.
33
+ - Lenient input: Marp/Slidev/Markdown variants accepted with warnings and did-you-mean hints.
34
+
35
+ ### Layout and rendering
36
+ - Auto arrangement, 12-column tracks, full-width rows below a grid, sparse-slide growth and vertical balance.
37
+ - Consulting-grade layout: top-anchored body, content-sized cards/chevrons/trees/table columns, distinct chart
38
+ palettes with contrast-aware data labels.
39
+ - Bounded layout search (≤ 6 candidates scored like the design critic; rule choice wins ties).
40
+ - Real font metrics, autofit with `min_font_size`, CJK measurement and kinsoku line breaking.
41
+ - Themes `default`, `midnight`, `jp-business`; user `.pptx`/`.potx`/`.yaml` themes with native footer and
42
+ slide-number placeholders.
43
+
44
+ ### Tooling
45
+ - CLI: `build`, `check` (`--format json`, layout linter), `preview`, `docs [topic]`, `schema`, `skill install`,
46
+ JSON and HTML deck input.
47
+ - Linter: overflow, off-slide, overlap, contrast, tiny-text, alt, connector-crosses, missing-end.
48
+ - Skill: `SKILL.md` (≤ 1,500 tokens) + 5 reference pages (≤ 800 tokens each).
49
+ - Bench: token corpus + gate, layout-inference metric, agent eval harness.
50
+ - `slidemark review` (design critique + score), `slidemark check --fix` (mechanical source repairs).
51
+ - `.pptx` import round trip: 98% of 111 decks lossless (OMML → LaTeX, transitions, build, sections, code
52
+ language); foreign python-pptx decks import at 0.975 fidelity.
53
+ - `python -m slidemark.xsd deck.pptx`: ECMA-376 schema validation (markup compatibility resolved to the
54
+ fallback); `bench/xsd_fuzz.py` validates fuzzed decks. CI on Python 3.10–3.12 with a coverage report.
55
+ - `build` prints one fit line per slide (form used, text size asked->reached, free space, attributes that took or
56
+ were ignored; `--quiet` / `fit: off`) and warns `attr-ignored` for attributes and `style:` tokens the layout does
57
+ not honour, with the form that works. `{.kpi h= y=}` on a lone KPI row pins the whole row.
@@ -0,0 +1,55 @@
1
+ # SlideMark: notes for coding sessions
2
+
3
+ Python library: token-efficient Markdown/HTML → native, editable .pptx for AI agents.
4
+ Design: `docs/PROPOSAL.md`. Plan: `docs/PLAN.md`. Syntax: `docs/SYNTAX.md`.
5
+
6
+ ## Before you start
7
+ 1. Read `docs/LESSONS.md` (known bugs, pitfalls, fixes). It is short on purpose.
8
+ 2. Check today's tasks in `docs/PLAN.md`.
9
+ 3. Read `docs/AGENT_COST.md`: what to optimize (model calls first, then output tokens, then input).
10
+
11
+ ## Setup and commands
12
+ ```bash
13
+ uv venv .venv && uv pip install -e ".[dev,html]" --python .venv # html = Playwright; Chromium is pre-installed in the cloud env
14
+ .venv/bin/pytest -q # all tests
15
+ .venv/bin/ruff check . && .venv/bin/ruff format --check .
16
+ .venv/bin/python bench/count_tokens.py --record # token metrics, append to bench/history.jsonl
17
+ .venv/bin/python scripts/gallery.py # rebuild examples -> docs/gallery PNGs + README section
18
+ ```
19
+ Previews use the repo's `src/slidemark/fonts/fonts.conf` (Meiryo / Yu Gothic -> IPAPGothic, Arial / Inter -> Liberation
20
+ Sans, Georgia -> Liberation Serif) so renders and goldens are the same everywhere: `docs/RENDERING.md`. Optional:
21
+ `apt-get install fonts-noto-cjk` (~60 MB) gives a real bold CJK face, but goldens are made without it.
22
+
23
+ ## Architecture (contract: `src/slidemark/ir.py`)
24
+ `parser/` Markdown → `Deck` · `layout/` `Slide` → `list[Placed]` (absolute EMU) · `render/` → .pptx ·
25
+ `theme.py` design tokens · `units.py` lengths. The renderer never decides positions; layout never touches pptx.
26
+ Changing `ir.py` affects every module: keep changes additive and update all users in the same commit.
27
+
28
+ ## Definition of Done (every feature)
29
+ docs entry with shortest example → parser test → fuzz-safe (no crash, diagnostic instead) → render test
30
+ (reopen the .pptx and assert) → opens in LibreOffice → golden/gallery image looks right → lint rule if it can
31
+ break the visual → bench has no token regression. Mark progress in `docs/FEATURES.md`.
32
+
33
+ ## Workflow
34
+ - **Language: everything in the repo is English** (code, comments, docs, commit messages, logs) **except
35
+ `README.md`, which is Vietnamese.** `scripts/gallery.py` must keep the README text Vietnamese.
36
+ Slide *content* in `examples/` and `bench/corpus/` may be Japanese/Vietnamese on purpose (test data).
37
+ - Push straight to `main` (allowed by the owner). No pull requests needed.
38
+ - GitHub Actions minutes are limited (private repo): CI runs once a day (08:00 JST) and on demand, not on push.
39
+ Always run ruff + the full pytest suite locally before pushing; push once per wave, not per commit.
40
+ - Runs are led by an Opus orchestrator, last ≥ 2 hours, and use at most 2 Sonnet subagents at a time
41
+ (lane A front, lane B back), in waves; see "Run routine" in `docs/PLAN.md`.
42
+
43
+ ## Rules
44
+ - **Design freedom first (`docs/DESIGN_FREEDOM.md`).** Never hard-code a visual decision: colors, fonts, sizes,
45
+ spacing, bands, card looks and layout constants are tokens an agent can override from the deck (tokens, CSS or
46
+ HTML). Built-in themes are YAML presets in the public token schema, with no theme-specific code paths.
47
+ - Token cost is the main product metric, and it means the cost of the whole agent run to an accepted deck
48
+ (`docs/AGENT_COST.md`): model calls first, then output tokens, then input. SKILL.md must be all an agent
49
+ reads. New syntax must be the shortest unambiguous form that adds no lookup and no decision; measure it.
50
+ - Never raise on bad user input: append a `Diagnostic` with a one-line, actionable `hint`.
51
+ - Dense Japanese business slides (many boxes, 10–12pt text, tables, arrows, footnotes) are a first-class
52
+ target. Always test CJK text (`<a:ea>` font, full-width width ≈ 1em).
53
+ - When you hit a bug, pitfall or non-obvious fix, add one line to `docs/LESSONS.md`.
54
+ - When you verify a usage pattern that saves agents tokens or retries, add it to `docs/AGENT_TIPS.md`.
55
+ - Every working day ends with: tests green, `scripts/gallery.py` run, README gallery updated, bench recorded.
@@ -0,0 +1,384 @@
1
+ Metadata-Version: 2.5
2
+ Name: slidemark
3
+ Version: 0.1.0
4
+ Summary: Token-efficient Markdown/HTML to native, editable PowerPoint for AI agents
5
+ License: MIT
6
+ Requires-Python: >=3.10
7
+ Requires-Dist: budoux>=0.7
8
+ Requires-Dist: markdown-it-py>=3.0
9
+ Requires-Dist: mdit-py-plugins>=0.4
10
+ Requires-Dist: pillow>=10.0
11
+ Requires-Dist: pydantic>=2.6
12
+ Requires-Dist: pygments>=2.17
13
+ Requires-Dist: python-pptx>=1.0
14
+ Requires-Dist: pyyaml>=6.0
15
+ Provides-Extra: dev
16
+ Requires-Dist: hypothesis>=6; extra == 'dev'
17
+ Requires-Dist: pypdfium2>=4.20; extra == 'dev'
18
+ Requires-Dist: pytest-cov>=5; extra == 'dev'
19
+ Requires-Dist: pytest>=8; extra == 'dev'
20
+ Requires-Dist: ruff>=0.6; extra == 'dev'
21
+ Requires-Dist: tiktoken>=0.7; extra == 'dev'
22
+ Provides-Extra: html
23
+ Requires-Dist: playwright>=1.40; extra == 'html'
24
+ Provides-Extra: preview
25
+ Requires-Dist: pypdfium2>=4.20; extra == 'preview'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # SlideMark
29
+
30
+ Thư viện Python giúp AI Agent tạo file PowerPoint (.pptx) **native, chỉnh sửa được** chỉ bằng cách viết văn bản
31
+ theo cú pháp riêng của SlideMark: ngắn gọn, tốn ít token và hỗ trợ cả slide dày đặc kiểu Nhật.
32
+
33
+ > Trạng thái: đang phát triển (đã xong 7 ngày nền móng, đang leo các cấp L2 → L4). Mục tiêu từng cấp L1 → L7: [docs/TARGETS.md](docs/TARGETS.md).
34
+
35
+ ## Cài đặt
36
+
37
+ ```bash
38
+ pip install slidemark # thư viện + CLI `slidemark`
39
+ pip install "slidemark[html]" # thêm Playwright nếu dùng khối HTML (cần `playwright install chromium`)
40
+ ```
41
+
42
+ Dùng nhanh: viết `deck.md` theo cú pháp bên dưới rồi chạy `slidemark build deck.md -o deck.pptx`.
43
+ Xem trước ảnh PNG (`slidemark preview`) cần LibreOffice cài sẵn trên máy.
44
+
45
+ ## Ví dụ
46
+
47
+ ```markdown
48
+ theme: jp-business
49
+ lang: ja
50
+
51
+ # 新規事業の検討状況と今後の方針
52
+ > 3つの課題を解決し、2027年度の黒字化を目指す
53
+ @aab/aac
54
+ ## 現状
55
+ - 売上:12.4億円(前年比 +8%)
56
+ ## 課題
57
+ - 解約率が ==2.1%== に上昇
58
+ ## 施策
59
+ 1. 導入テンプレートの整備
60
+ ※ 出所:社内CRMデータ
61
+ ```
62
+
63
+ - `#` mở slide mới, mỗi `##` là một box, các box tự sắp xếp.
64
+ - `@aab/aac` là layout lưới viết trong 1 dòng.
65
+ - `>` dưới tiêu đề là thông điệp chính, dòng `※` là chú thích nguồn.
66
+
67
+ Cú pháp đầy đủ: [docs/SYNTAX.md](docs/SYNTAX.md).
68
+
69
+ ## Tính năng chính
70
+
71
+ - Box, lưới `@`, KPI `{.kpi}`, callout `> [!warn]`, badge `[x]{.badge}`, mũi tên nối `@ a>b`, chevron/flow.
72
+ - 10 loại biểu đồ native từ CSV (nhãn, legend, định dạng số), bảng có gộp ô, công thức toán (OMML),
73
+ sơ đồ Mermaid → shape native, HTML → native (hoặc ảnh dự phòng qua Chromium).
74
+ - Theme `default`, `midnight`, `jp-business` hoặc template `.pptx/.potx` của bạn; hiệu ứng xuất hiện, chuyển slide, section.
75
+ - **Thiết kế tự do:** không có giao diện cố định. Theme chỉ là preset token (YAML); agent tự khai báo màu, font,
76
+ cỡ chữ, bo góc, gradient, bóng đổ bằng vài dòng `colors:` / `fonts:` / `sizes:` / `style:`, bằng khối ` ```css `
77
+ (34 thuộc tính CSS → shape gốc), hoặc viết cả slide bằng HTML (`@html`, `build deck.html`) và vẫn ra shape sửa được.
78
+ - `slidemark check` kiểm tra tràn chữ, chồng lấn, tương phản, alt ảnh… và gợi ý cách sửa trên 1 dòng (JSON được).
79
+ - `slidemark docs` / `skill install`: tài liệu cho agent, SKILL.md ≤ 1.500 token.
80
+
81
+ ```bash
82
+ pip install -e .
83
+ slidemark check deck.md && slidemark build deck.md -o deck.pptx
84
+ slidemark skill install # cài skill cho Claude Code
85
+ ```
86
+
87
+ Windows: `slidemark preview` / `review --png` tự tìm LibreOffice trong `C:\Program Files\LibreOffice`; nếu cài chỗ khác,
88
+ đặt biến môi trường `SLIDEMARK_SOFFICE` trỏ tới `soffice.exe`. Build .pptx không cần LibreOffice.
89
+
90
+ ## So sánh với python-pptx (cùng đề, 5 / 15 / 25 slide)
91
+
92
+ Cùng một agent (Sonnet), cùng đề bài, mỗi bên chạy 1 lần, đo từ lúc nhận yêu cầu đến lúc có file .pptx đạt yêu cầu
93
+ (2026-10-06). Chi tiết, mã nguồn hai bên đặt cạnh nhau và ảnh slide: [docs/COMPARE.md](docs/COMPARE.md).
94
+
95
+ | Số slide | Lần gọi model (SlideMark / python-pptx) | Thời gian | Token output | Chi phí |
96
+ |---|---|---|---|---|
97
+ | 5 | 4 / 8 | 18 s / 86 s | 1,4k / 10,1k | 32% |
98
+ | 15 | 5 / 11 | 40 s / 140 s | 6,7k / 18,2k | 40% |
99
+ | 25 | 7 / 10 | 70 s / 198 s | 7,5k / 41,5k | 32% |
100
+
101
+ ### Thiết kế là quyết định của agent (2026-10-07)
102
+
103
+ SlideMark hỗ trợ quyết định thiết kế chứ không thay agent quyết định. Từ wave 3, SKILL.md yêu cầu agent nêu rõ
104
+ lựa chọn của mình cho cả deck (`colors:` `fonts:` `sizes:` `style:` `footer:`) và từng slide (dạng, một điểm
105
+ nhấn, ghi đè vị trí/cỡ/màu khi cần); `build` cảnh báo `design-none` / `design-slide` và in dòng
106
+ `design: colors fonts sizes style footer; 14/14 slides decided form+emphasis+values`. Không có lựa chọn nào được coi là "đúng"
107
+ (`docs/DESIGN_REQUIRED.md`, `docs/DESIGN_FREEDOM.md`).
108
+
109
+ Cùng đề 15 slide, giám khảo thiết kế chấm mù (Opus, cùng một vòng):
110
+
111
+ | Deck | Điểm | Lần gọi | Thời gian | Chi phí | Token mã nguồn |
112
+ |---|---|---|---|---|---|
113
+ | SlideMark sau AC7 (nêu quyết định, build in bản đồ fit từng slide) | **3,5** / 3,0 (2 lần chạy) | 4 / 5 | 29 s / 39 s | 29% / 35% | 1,5k / 1,4k |
114
+ | SlideMark wave 3 (nêu quyết định, chưa có bản đồ fit) | 3,5 | 9 | 90 s | 61% | 1,6k |
115
+ | SlideMark wave 2 (chỉ nội dung) | 3,0 | 5 | 36 s | 34% | 1,3k |
116
+ | python-pptx | 2,5 / 3,0 | 11 | 140 s | 100% | 5,3k |
117
+
118
+ Bản đồ fit: `build` in một dòng cho mỗi slide (`slide 2: lead + 4 kpi cards 72% of body, value 48->29pt (shrunk to
119
+ fit), free 16% below`) nên agent biết quyết định của mình có hiệu lực không mà không cần mở ảnh; thuộc tính bị bỏ qua
120
+ báo `attr-ignored` kèm dạng đúng. Mục tiêu AC7–AC9 (≤ 5 lần gọi, chi phí và thời gian ≤ 50% python-pptx) đã đạt.
121
+
122
+ Toàn bộ thiết kế mà agent python-pptx tự viết (64 quyết định) nêu lại được trong SlideMark với 43% token
123
+ (`bench/lengthbench/t2/slidemark-ported/REPORT.md`, `docs/DESIGN_COVERAGE.md`).
124
+
125
+ ## Ảnh slide mẫu (cập nhật hằng ngày)
126
+
127
+ <!-- gallery:start -->
128
+ Cập nhật: 2026-10-07 · commit `2d3e402` · tạo tự động bởi `scripts/gallery.py`.
129
+
130
+ ### Cơ bản: tiêu đề, danh sách, box, bảng, biểu đồ
131
+
132
+ Nguồn: [`examples/01-basics.md`](examples/01-basics.md)
133
+
134
+ ![01-basics slide 1](docs/gallery/01-basics/slide-01.png)
135
+ ![01-basics slide 2](docs/gallery/01-basics/slide-02.png)
136
+ ![01-basics slide 3](docs/gallery/01-basics/slide-03.png)
137
+ ![01-basics slide 4](docs/gallery/01-basics/slide-04.png)
138
+
139
+ ### Slide dày đặc kiểu Nhật (jp-business)
140
+
141
+ Nguồn: [`examples/02-jp-dense.md`](examples/02-jp-dense.md)
142
+
143
+ ![02-jp-dense slide 1](docs/gallery/02-jp-dense/slide-01.png)
144
+ ![02-jp-dense slide 2](docs/gallery/02-jp-dense/slide-02.png)
145
+
146
+ ### Báo cáo tiếng Việt
147
+
148
+ Nguồn: [`examples/03-vi-report.md`](examples/03-vi-report.md)
149
+
150
+ ![03-vi-report slide 1](docs/gallery/03-vi-report/slide-01.png)
151
+ ![03-vi-report slide 2](docs/gallery/03-vi-report/slide-02.png)
152
+ ![03-vi-report slide 3](docs/gallery/03-vi-report/slide-03.png)
153
+
154
+ ### Tiếng Nhật: KPI, badge, bảng kết quả, mũi tên nối
155
+
156
+ Nguồn: [`examples/04-jp-kpi.md`](examples/04-jp-kpi.md)
157
+
158
+ ![04-jp-kpi slide 1](docs/gallery/04-jp-kpi/slide-01.png)
159
+ ![04-jp-kpi slide 2](docs/gallery/04-jp-kpi/slide-02.png)
160
+
161
+ ### Tiếng Nhật: quy trình chevron + bảng, luồng phê duyệt
162
+
163
+ Nguồn: [`examples/05-jp-process.md`](examples/05-jp-process.md)
164
+
165
+ ![05-jp-process slide 1](docs/gallery/05-jp-process/slide-01.png)
166
+ ![05-jp-process slide 2](docs/gallery/05-jp-process/slide-02.png)
167
+
168
+ ### Tiếng Nhật: biểu đồ thị trường, bảng so sánh đối thủ
169
+
170
+ Nguồn: [`examples/06-jp-market.md`](examples/06-jp-market.md)
171
+
172
+ ![06-jp-market slide 1](docs/gallery/06-jp-market/slide-01.png)
173
+ ![06-jp-market slide 2](docs/gallery/06-jp-market/slide-02.png)
174
+
175
+ ### Tiếng Nhật: sơ đồ tổ chức, ma trận rủi ro
176
+
177
+ Nguồn: [`examples/07-jp-org.md`](examples/07-jp-org.md)
178
+
179
+ ![07-jp-org slide 1](docs/gallery/07-jp-org/slide-01.png)
180
+ ![07-jp-org slide 2](docs/gallery/07-jp-org/slide-02.png)
181
+
182
+ ### Tiếng Nhật: kế hoạch trung hạn, lộ trình
183
+
184
+ Nguồn: [`examples/08-jp-roadmap.md`](examples/08-jp-roadmap.md)
185
+
186
+ ![08-jp-roadmap slide 1](docs/gallery/08-jp-roadmap/slide-01.png)
187
+ ![08-jp-roadmap slide 2](docs/gallery/08-jp-roadmap/slide-02.png)
188
+ ![08-jp-roadmap slide 3](docs/gallery/08-jp-roadmap/slide-03.png)
189
+
190
+ ### Theme tối (midnight): KPI, biểu đồ, Mermaid, công thức, code
191
+
192
+ Nguồn: [`examples/09-midnight-tech.md`](examples/09-midnight-tech.md)
193
+
194
+ ![09-midnight-tech slide 1](docs/gallery/09-midnight-tech/slide-01.png)
195
+ ![09-midnight-tech slide 2](docs/gallery/09-midnight-tech/slide-02.png)
196
+ ![09-midnight-tech slide 3](docs/gallery/09-midnight-tech/slide-03.png)
197
+ ![09-midnight-tech slide 4](docs/gallery/09-midnight-tech/slide-04.png)
198
+ ![09-midnight-tech slide 5](docs/gallery/09-midnight-tech/slide-05.png)
199
+ ![09-midnight-tech slide 6](docs/gallery/09-midnight-tech/slide-06.png)
200
+
201
+ ### Template .pptx của người dùng, ảnh (cover crop), biểu đồ, callout
202
+
203
+ Nguồn: [`examples/10-template.md`](examples/10-template.md)
204
+
205
+ ![10-template slide 1](docs/gallery/10-template/slide-01.png)
206
+ ![10-template slide 2](docs/gallery/10-template/slide-02.png)
207
+ ![10-template slide 3](docs/gallery/10-template/slide-03.png)
208
+
209
+ ### Tiếng Nhật: bộ 9 slide tư vấn dày đặc (tóm tắt, KPI, tổ chức, lộ trình, rủi ro)
210
+
211
+ Nguồn: [`examples/11-jp-consulting.md`](examples/11-jp-consulting.md)
212
+
213
+ ![11-jp-consulting slide 1](docs/gallery/11-jp-consulting/slide-01.png)
214
+ ![11-jp-consulting slide 2](docs/gallery/11-jp-consulting/slide-02.png)
215
+ ![11-jp-consulting slide 3](docs/gallery/11-jp-consulting/slide-03.png)
216
+ ![11-jp-consulting slide 4](docs/gallery/11-jp-consulting/slide-04.png)
217
+ ![11-jp-consulting slide 5](docs/gallery/11-jp-consulting/slide-05.png)
218
+ ![11-jp-consulting slide 6](docs/gallery/11-jp-consulting/slide-06.png)
219
+ ![11-jp-consulting slide 7](docs/gallery/11-jp-consulting/slide-07.png)
220
+ ![11-jp-consulting slide 8](docs/gallery/11-jp-consulting/slide-08.png)
221
+ ![11-jp-consulting slide 9](docs/gallery/11-jp-consulting/slide-09.png)
222
+
223
+ ### HTML/CSS → shape gốc (đo bằng Chromium), logo SVG, công thức
224
+
225
+ Nguồn: [`examples/12-html-svg-math.md`](examples/12-html-svg-math.md)
226
+
227
+ ![12-html-svg-math slide 1](docs/gallery/12-html-svg-math/slide-01.png)
228
+ ![12-html-svg-math slide 2](docs/gallery/12-html-svg-math/slide-02.png)
229
+
230
+ ### Thiết kế tự do: thương hiệu tối, gradient, bóng đổ (theme: none + token)
231
+
232
+ Nguồn: [`examples/13-brand-aurora.md`](examples/13-brand-aurora.md)
233
+
234
+ ![13-brand-aurora slide 1](docs/gallery/13-brand-aurora/slide-01.png)
235
+ ![13-brand-aurora slide 2](docs/gallery/13-brand-aurora/slide-02.png)
236
+ ![13-brand-aurora slide 3](docs/gallery/13-brand-aurora/slide-03.png)
237
+
238
+ ### Thiết kế tự do: thương hiệu sáng, font serif, màu đất nung (token)
239
+
240
+ Nguồn: [`examples/14-brand-terracotta.md`](examples/14-brand-terracotta.md)
241
+
242
+ ![14-brand-terracotta slide 1](docs/gallery/14-brand-terracotta/slide-01.png)
243
+
244
+ ### Slide HTML toàn trang (@html) + slide SlideMark dùng chung token
245
+
246
+ Nguồn: [`examples/15-html-mixed.md`](examples/15-html-mixed.md)
247
+
248
+ ![15-html-mixed slide 1](docs/gallery/15-html-mixed/slide-01.png)
249
+ ![15-html-mixed slide 2](docs/gallery/15-html-mixed/slide-02.png)
250
+ ![15-html-mixed slide 3](docs/gallery/15-html-mixed/slide-03.png)
251
+
252
+ ### Tiếng Nhật: chiến lược dịch vụ, Gantt, quyết định
253
+
254
+ Nguồn: [`examples/16-jp-strategy.md`](examples/16-jp-strategy.md)
255
+
256
+ ![16-jp-strategy slide 1](docs/gallery/16-jp-strategy/slide-01.png)
257
+ ![16-jp-strategy slide 2](docs/gallery/16-jp-strategy/slide-02.png)
258
+ ![16-jp-strategy slide 3](docs/gallery/16-jp-strategy/slide-03.png)
259
+ ![16-jp-strategy slide 4](docs/gallery/16-jp-strategy/slide-04.png)
260
+ ![16-jp-strategy slide 5](docs/gallery/16-jp-strategy/slide-05.png)
261
+ ![16-jp-strategy slide 6](docs/gallery/16-jp-strategy/slide-06.png)
262
+ ![16-jp-strategy slide 7](docs/gallery/16-jp-strategy/slide-07.png)
263
+ ![16-jp-strategy slide 8](docs/gallery/16-jp-strategy/slide-08.png)
264
+ ![16-jp-strategy slide 9](docs/gallery/16-jp-strategy/slide-09.png)
265
+ ![16-jp-strategy slide 10](docs/gallery/16-jp-strategy/slide-10.png)
266
+
267
+ ### Thiết kế tự do bằng CSS fence: phong cách tạp chí
268
+
269
+ Nguồn: [`examples/17-editorial-css.md`](examples/17-editorial-css.md)
270
+
271
+ ![17-editorial-css slide 1](docs/gallery/17-editorial-css/slide-01.png)
272
+ ![17-editorial-css slide 2](docs/gallery/17-editorial-css/slide-02.png)
273
+ ![17-editorial-css slide 3](docs/gallery/17-editorial-css/slide-03.png)
274
+ ![17-editorial-css slide 4](docs/gallery/17-editorial-css/slide-04.png)
275
+ ![17-editorial-css slide 5](docs/gallery/17-editorial-css/slide-05.png)
276
+
277
+ ### Thiết kế tự do: thương hiệu xanh chanh
278
+
279
+ Nguồn: [`examples/18-brand-lime.md`](examples/18-brand-lime.md)
280
+
281
+ ![18-brand-lime slide 1](docs/gallery/18-brand-lime/slide-01.png)
282
+ ![18-brand-lime slide 2](docs/gallery/18-brand-lime/slide-02.png)
283
+ ![18-brand-lime slide 3](docs/gallery/18-brand-lime/slide-03.png)
284
+ ![18-brand-lime slide 4](docs/gallery/18-brand-lime/slide-04.png)
285
+
286
+ ### Tiếng Việt: bộ tư vấn theo thương hiệu (theme: none)
287
+
288
+ Nguồn: [`examples/19-vi-consulting-brand.md`](examples/19-vi-consulting-brand.md)
289
+
290
+ ![19-vi-consulting-brand slide 1](docs/gallery/19-vi-consulting-brand/slide-01.png)
291
+ ![19-vi-consulting-brand slide 2](docs/gallery/19-vi-consulting-brand/slide-02.png)
292
+ ![19-vi-consulting-brand slide 3](docs/gallery/19-vi-consulting-brand/slide-03.png)
293
+ ![19-vi-consulting-brand slide 4](docs/gallery/19-vi-consulting-brand/slide-04.png)
294
+ ![19-vi-consulting-brand slide 5](docs/gallery/19-vi-consulting-brand/slide-05.png)
295
+
296
+ ### Tiếng Nhật: bộ 11 slide dày đặc (biểu đồ cầu, Gantt, ghi chú biểu đồ)
297
+
298
+ Nguồn: [`examples/20-jp-retail-dense.md`](examples/20-jp-retail-dense.md)
299
+
300
+ ![20-jp-retail-dense slide 1](docs/gallery/20-jp-retail-dense/slide-01.png)
301
+ ![20-jp-retail-dense slide 2](docs/gallery/20-jp-retail-dense/slide-02.png)
302
+ ![20-jp-retail-dense slide 3](docs/gallery/20-jp-retail-dense/slide-03.png)
303
+ ![20-jp-retail-dense slide 4](docs/gallery/20-jp-retail-dense/slide-04.png)
304
+ ![20-jp-retail-dense slide 5](docs/gallery/20-jp-retail-dense/slide-05.png)
305
+ ![20-jp-retail-dense slide 6](docs/gallery/20-jp-retail-dense/slide-06.png)
306
+ ![20-jp-retail-dense slide 7](docs/gallery/20-jp-retail-dense/slide-07.png)
307
+ ![20-jp-retail-dense slide 8](docs/gallery/20-jp-retail-dense/slide-08.png)
308
+ ![20-jp-retail-dense slide 9](docs/gallery/20-jp-retail-dense/slide-09.png)
309
+ ![20-jp-retail-dense slide 10](docs/gallery/20-jp-retail-dense/slide-10.png)
310
+ ![20-jp-retail-dense slide 11](docs/gallery/20-jp-retail-dense/slide-11.png)
311
+
312
+ ### Tiếng Nhật: pitch tối thiết kế bằng CSS/HTML
313
+
314
+ Nguồn: [`examples/21-jp-dark-pitch.md`](examples/21-jp-dark-pitch.md)
315
+
316
+ ![21-jp-dark-pitch slide 1](docs/gallery/21-jp-dark-pitch/slide-01.png)
317
+ ![21-jp-dark-pitch slide 2](docs/gallery/21-jp-dark-pitch/slide-02.png)
318
+ ![21-jp-dark-pitch slide 3](docs/gallery/21-jp-dark-pitch/slide-03.png)
319
+ ![21-jp-dark-pitch slide 4](docs/gallery/21-jp-dark-pitch/slide-04.png)
320
+
321
+ ### Tiếng Anh: kế hoạch ra mắt, chevron khớp cột bảng, ghi chú biểu đồ (hl=, note=)
322
+
323
+ Nguồn: [`examples/22-en-launch-plan.md`](examples/22-en-launch-plan.md)
324
+
325
+ ![22-en-launch-plan slide 1](docs/gallery/22-en-launch-plan/slide-01.png)
326
+ ![22-en-launch-plan slide 2](docs/gallery/22-en-launch-plan/slide-02.png)
327
+ ![22-en-launch-plan slide 3](docs/gallery/22-en-launch-plan/slide-03.png)
328
+ ![22-en-launch-plan slide 4](docs/gallery/22-en-launch-plan/slide-04.png)
329
+ ![22-en-launch-plan slide 5](docs/gallery/22-en-launch-plan/slide-05.png)
330
+ ![22-en-launch-plan slide 6](docs/gallery/22-en-launch-plan/slide-06.png)
331
+ ![22-en-launch-plan slide 7](docs/gallery/22-en-launch-plan/slide-07.png)
332
+
333
+ ### Từ vựng bố cục: @timeline, @vs, @matrix, @funnel, @pyramid, @cycle, @agenda, @statement
334
+
335
+ Nguồn: [`examples/23-vocabulary.md`](examples/23-vocabulary.md)
336
+
337
+ ![23-vocabulary slide 1](docs/gallery/23-vocabulary/slide-01.png)
338
+ ![23-vocabulary slide 2](docs/gallery/23-vocabulary/slide-02.png)
339
+ ![23-vocabulary slide 3](docs/gallery/23-vocabulary/slide-03.png)
340
+ ![23-vocabulary slide 4](docs/gallery/23-vocabulary/slide-04.png)
341
+ ![23-vocabulary slide 5](docs/gallery/23-vocabulary/slide-05.png)
342
+ ![23-vocabulary slide 6](docs/gallery/23-vocabulary/slide-06.png)
343
+ ![23-vocabulary slide 7](docs/gallery/23-vocabulary/slide-07.png)
344
+ ![23-vocabulary slide 8](docs/gallery/23-vocabulary/slide-08.png)
345
+ ![23-vocabulary slide 9](docs/gallery/23-vocabulary/slide-09.png)
346
+ ![23-vocabulary slide 10](docs/gallery/23-vocabulary/slide-10.png)
347
+
348
+ ### Từ vựng bố cục 2: iconlist, quote, split, proscons, progress, harvey, heatmap, pins
349
+
350
+ Nguồn: [`examples/24-vocabulary-2.md`](examples/24-vocabulary-2.md)
351
+
352
+ ![24-vocabulary-2 slide 1](docs/gallery/24-vocabulary-2/slide-01.png)
353
+ ![24-vocabulary-2 slide 2](docs/gallery/24-vocabulary-2/slide-02.png)
354
+ ![24-vocabulary-2 slide 3](docs/gallery/24-vocabulary-2/slide-03.png)
355
+ ![24-vocabulary-2 slide 4](docs/gallery/24-vocabulary-2/slide-04.png)
356
+ ![24-vocabulary-2 slide 5](docs/gallery/24-vocabulary-2/slide-05.png)
357
+ ![24-vocabulary-2 slide 6](docs/gallery/24-vocabulary-2/slide-06.png)
358
+ ![24-vocabulary-2 slide 7](docs/gallery/24-vocabulary-2/slide-07.png)
359
+ ![24-vocabulary-2 slide 8](docs/gallery/24-vocabulary-2/slide-08.png)
360
+ ![24-vocabulary-2 slide 9](docs/gallery/24-vocabulary-2/slide-09.png)
361
+
362
+ ### 25-roundtrip-forms
363
+
364
+ Nguồn: [`examples/25-roundtrip-forms.md`](examples/25-roundtrip-forms.md)
365
+
366
+ ![25-roundtrip-forms slide 1](docs/gallery/25-roundtrip-forms/slide-01.png)
367
+ ![25-roundtrip-forms slide 2](docs/gallery/25-roundtrip-forms/slide-02.png)
368
+ ![25-roundtrip-forms slide 3](docs/gallery/25-roundtrip-forms/slide-03.png)
369
+ ![25-roundtrip-forms slide 4](docs/gallery/25-roundtrip-forms/slide-04.png)
370
+ ![25-roundtrip-forms slide 5](docs/gallery/25-roundtrip-forms/slide-05.png)
371
+ ![25-roundtrip-forms slide 6](docs/gallery/25-roundtrip-forms/slide-06.png)
372
+ ![25-roundtrip-forms slide 7](docs/gallery/25-roundtrip-forms/slide-07.png)
373
+ <!-- gallery:end -->
374
+
375
+ ## Tài liệu
376
+
377
+ | File | Nội dung |
378
+ |---|---|
379
+ | [docs/SYNTAX.md](docs/SYNTAX.md) | Cú pháp |
380
+ | [docs/PLAN.md](docs/PLAN.md) | Kế hoạch 7 ngày và quy trình chạy hằng ngày |
381
+ | [docs/TARGETS.md](docs/TARGETS.md) | Mục tiêu L1–L7 |
382
+ | [docs/AGENT_TIPS.md](docs/AGENT_TIPS.md) | Mẹo cho Agent khi dùng thư viện |
383
+ | [docs/LESSONS.md](docs/LESSONS.md) | Lỗi đã gặp và cách giải quyết |
384
+ | [docs/DAILY_LOG.md](docs/DAILY_LOG.md) | Nhật ký hằng ngày |