@nguyenphp/antigravity-marketing 1.0.18 → 1.0.20
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.
- package/README.md +130 -78
- package/package.json +4 -3
- package/templates/.agent/skills/marketing-report-expert/SKILL.md +70 -0
- package/templates/.agent/skills/minimax-docx/LICENSE +21 -0
- package/templates/.agent/skills/minimax-docx/SKILL.md +274 -0
- package/templates/.agent/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/templates/.agent/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/templates/.agent/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/templates/.agent/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/templates/.agent/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/templates/.agent/skills/minimax-docx/references/comments_guide.md +191 -0
- package/templates/.agent/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/templates/.agent/skills/minimax-docx/references/design_principles.md +819 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_units.md +72 -0
- package/templates/.agent/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/templates/.agent/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/templates/.agent/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/templates/.agent/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/templates/.agent/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/templates/.agent/skills/minimax-docx/references/typography_guide.md +294 -0
- package/templates/.agent/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/templates/.agent/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/templates/.agent/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/templates/.agent/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/templates/.agent/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/templates/.agent/skills/minimax-docx/scripts/setup.sh +504 -0
- package/templates/.agent/skills/minimax-multimodal-toolkit/SKILL.md +359 -0
- package/templates/.agent/skills/minimax-pdf/README.md +222 -0
- package/templates/.agent/skills/minimax-pdf/SKILL.md +201 -0
- package/templates/.agent/skills/minimax-pdf/design/design.md +381 -0
- package/templates/.agent/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/templates/.agent/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/templates/.agent/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/templates/.agent/skills/minimax-pdf/scripts/make.sh +491 -0
- package/templates/.agent/skills/minimax-pdf/scripts/merge.py +112 -0
- package/templates/.agent/skills/minimax-pdf/scripts/palette.py +559 -0
- package/templates/.agent/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/templates/.agent/skills/minimax-pdf/scripts/render_body.py +1055 -0
- package/templates/.agent/skills/minimax-pdf/scripts/render_cover.cjs +111 -0
- package/templates/.agent/skills/minimax-xlsx/SKILL.md +138 -0
- package/templates/.agent/skills/minimax-xlsx/references/create.md +691 -0
- package/templates/.agent/skills/minimax-xlsx/references/edit.md +684 -0
- package/templates/.agent/skills/minimax-xlsx/references/fix.md +37 -0
- package/templates/.agent/skills/minimax-xlsx/references/format.md +768 -0
- package/templates/.agent/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/templates/.agent/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/templates/.agent/skills/minimax-xlsx/references/validate.md +772 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/templates/.agent/skills/pptx-generator/SKILL.md +249 -0
- package/templates/.agent/skills/pptx-generator/references/design-system.md +392 -0
- package/templates/.agent/skills/pptx-generator/references/editing.md +162 -0
- package/templates/.agent/skills/pptx-generator/references/pitfalls.md +112 -0
- package/templates/.agent/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/templates/.agent/skills/pptx-generator/references/slide-types.md +413 -0
- package/templates/.agent/skills/tutorial-video-expert/SKILL.md +88 -0
- package/templates/.agent/skills/ui-ux-pro-max/SKILL.md +170 -585
- package/templates/.agent/skills/vision-analysis/SKILL.md +174 -0
- package/templates/.agent/workflows/analyze.md +3 -0
- package/templates/.agent/workflows/brand-report.md +44 -0
- package/templates/.agent/workflows/report.md +49 -0
- package/templates/.agent/agents/backend-specialist.md +0 -263
- package/templates/.agent/agents/database-architect.md +0 -226
- package/templates/.agent/agents/debugger.md +0 -225
- package/templates/.agent/agents/devops-engineer.md +0 -242
- package/templates/.agent/agents/frontend-specialist.md +0 -527
- package/templates/.agent/agents/game-developer.md +0 -162
- package/templates/.agent/agents/mobile-developer.md +0 -377
- package/templates/.agent/agents/penetration-tester.md +0 -188
- package/templates/.agent/agents/security-auditor.md +0 -170
- package/templates/.agent/agents/test-engineer.md +0 -158
- package/templates/.agent/skills/api-patterns/SKILL.md +0 -81
- package/templates/.agent/skills/api-patterns/api-style.md +0 -42
- package/templates/.agent/skills/api-patterns/auth.md +0 -24
- package/templates/.agent/skills/api-patterns/documentation.md +0 -26
- package/templates/.agent/skills/api-patterns/graphql.md +0 -41
- package/templates/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/templates/.agent/skills/api-patterns/response.md +0 -37
- package/templates/.agent/skills/api-patterns/rest.md +0 -40
- package/templates/.agent/skills/api-patterns/scripts/api_validator.py +0 -211
- package/templates/.agent/skills/api-patterns/security-testing.md +0 -122
- package/templates/.agent/skills/api-patterns/trpc.md +0 -41
- package/templates/.agent/skills/api-patterns/versioning.md +0 -22
- package/templates/.agent/skills/app-builder/SKILL.md +0 -75
- package/templates/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/templates/.agent/skills/app-builder/feature-building.md +0 -53
- package/templates/.agent/skills/app-builder/project-detection.md +0 -34
- package/templates/.agent/skills/app-builder/scaffolding.md +0 -118
- package/templates/.agent/skills/app-builder/tech-stack.md +0 -40
- package/templates/.agent/skills/app-builder/templates/SKILL.md +0 -39
- package/templates/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
- package/templates/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
- package/templates/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
- package/templates/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
- package/templates/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
- package/templates/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
- package/templates/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
- package/templates/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -82
- package/templates/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -100
- package/templates/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -106
- package/templates/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -101
- package/templates/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
- package/templates/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -93
- package/templates/.agent/skills/architecture/SKILL.md +0 -55
- package/templates/.agent/skills/architecture/context-discovery.md +0 -43
- package/templates/.agent/skills/architecture/examples.md +0 -94
- package/templates/.agent/skills/architecture/pattern-selection.md +0 -68
- package/templates/.agent/skills/architecture/patterns-reference.md +0 -50
- package/templates/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/templates/.agent/skills/bash-linux/SKILL.md +0 -199
- package/templates/.agent/skills/behavioral-modes/SKILL.md +0 -242
- package/templates/.agent/skills/clean-code/SKILL.md +0 -201
- package/templates/.agent/skills/code-review-checklist/SKILL.md +0 -109
- package/templates/.agent/skills/database-design/SKILL.md +0 -52
- package/templates/.agent/skills/database-design/database-selection.md +0 -43
- package/templates/.agent/skills/database-design/indexing.md +0 -39
- package/templates/.agent/skills/database-design/migrations.md +0 -48
- package/templates/.agent/skills/database-design/optimization.md +0 -36
- package/templates/.agent/skills/database-design/orm-selection.md +0 -30
- package/templates/.agent/skills/database-design/schema-design.md +0 -56
- package/templates/.agent/skills/database-design/scripts/schema_validator.py +0 -172
- package/templates/.agent/skills/deployment-procedures/SKILL.md +0 -241
- package/templates/.agent/skills/docker-expert/SKILL.md +0 -409
- package/templates/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/templates/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/templates/.agent/skills/game-development/SKILL.md +0 -167
- package/templates/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/templates/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/templates/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/templates/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/templates/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/templates/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/templates/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/templates/.agent/skills/game-development/web-games/SKILL.md +0 -150
- package/templates/.agent/skills/lint-and-validate/SKILL.md +0 -45
- package/templates/.agent/skills/lint-and-validate/scripts/lint_runner.py +0 -172
- package/templates/.agent/skills/lint-and-validate/scripts/type_coverage.py +0 -173
- package/templates/.agent/skills/mcp-builder/SKILL.md +0 -176
- package/templates/.agent/skills/nestjs-expert/SKILL.md +0 -552
- package/templates/.agent/skills/nextjs-best-practices/SKILL.md +0 -203
- package/templates/.agent/skills/nodejs-best-practices/SKILL.md +0 -333
- package/templates/.agent/skills/parallel-agents/SKILL.md +0 -175
- package/templates/.agent/skills/performance-profiling/SKILL.md +0 -143
- package/templates/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +0 -76
- package/templates/.agent/skills/powershell-windows/SKILL.md +0 -167
- package/templates/.agent/skills/prisma-expert/SKILL.md +0 -355
- package/templates/.agent/skills/python-patterns/SKILL.md +0 -441
- package/templates/.agent/skills/react-patterns/SKILL.md +0 -198
- package/templates/.agent/skills/red-team-tactics/SKILL.md +0 -199
- package/templates/.agent/skills/server-management/SKILL.md +0 -161
- package/templates/.agent/skills/systematic-debugging/SKILL.md +0 -109
- package/templates/.agent/skills/tdd-workflow/SKILL.md +0 -149
- package/templates/.agent/skills/testing-patterns/SKILL.md +0 -178
- package/templates/.agent/skills/testing-patterns/scripts/test_runner.py +0 -219
- package/templates/.agent/skills/typescript-expert/SKILL.md +0 -429
- package/templates/.agent/skills/vue-expert/SKILL.md +0 -374
- package/templates/.agent/skills/vulnerability-scanner/SKILL.md +0 -276
- package/templates/.agent/skills/vulnerability-scanner/checklists.md +0 -121
- package/templates/.agent/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
- package/templates/.agent/skills/webapp-testing/SKILL.md +0 -187
- package/templates/.agent/skills/webapp-testing/scripts/playwright_runner.py +0 -173
- package/templates/.agent/workflows/debug.md +0 -103
- package/templates/.agent/workflows/deploy.md +0 -176
- package/templates/.agent/workflows/enhance.md +0 -63
- package/templates/.agent/workflows/test.md +0 -144
|
@@ -0,0 +1,819 @@
|
|
|
1
|
+
# Design Principles for Document Typography
|
|
2
|
+
|
|
3
|
+
WHY certain typographic choices look good -- the perceptual and psychological
|
|
4
|
+
reasons behind professional document design. Use this to make judgment calls
|
|
5
|
+
when exact specs are not provided.
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [White Space & Breathing Room](#1-white-space--breathing-room)
|
|
10
|
+
2. [Contrast & Scale](#2-contrast--scale)
|
|
11
|
+
3. [Proximity & Grouping](#3-proximity--grouping)
|
|
12
|
+
4. [Alignment & Grid](#4-alignment--grid)
|
|
13
|
+
5. [Repetition & Consistency](#5-repetition--consistency)
|
|
14
|
+
6. [Visual Hierarchy & Flow](#6-visual-hierarchy--flow)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. White Space & Breathing Room
|
|
19
|
+
|
|
20
|
+
### Why It Works
|
|
21
|
+
|
|
22
|
+
The human eye does not read continuously. It jumps in saccades, fixating on
|
|
23
|
+
small clusters of words. White space provides landing zones for these fixations
|
|
24
|
+
and gives the reader's peripheral vision a "frame" that makes each text block
|
|
25
|
+
feel manageable. When a page is packed to the edges, every glance returns more
|
|
26
|
+
text than working memory can buffer, triggering fatigue and avoidance.
|
|
27
|
+
|
|
28
|
+
Research on content density consistently shows:
|
|
29
|
+
|
|
30
|
+
- **60-70% content coverage** feels comfortable and professional.
|
|
31
|
+
- **80%+** starts to feel dense and bureaucratic.
|
|
32
|
+
- **90%+** feels oppressive -- the reader unconsciously rushes or skips.
|
|
33
|
+
- **Below 50%** feels wasteful or pretentious (unless intentional, like poetry).
|
|
34
|
+
|
|
35
|
+
Wider margins also carry cultural signals. Academic and luxury documents use
|
|
36
|
+
generous margins (1.25-1.5 inches). Internal memos and drafts use narrower
|
|
37
|
+
margins (0.75-1.0 inches). The margin width tells the reader how much care
|
|
38
|
+
went into the document before they read a single word.
|
|
39
|
+
|
|
40
|
+
Line spacing has a direct physiological basis: the eye must track back to the
|
|
41
|
+
start of the next line after each line break. If lines are too close, the eye
|
|
42
|
+
"slips" to the wrong line. If too far apart, the eye loses its sense of
|
|
43
|
+
continuity. The sweet spot is 120-145% of the font size.
|
|
44
|
+
|
|
45
|
+
**Rule of thumb: when in doubt, add more space, not less.**
|
|
46
|
+
|
|
47
|
+
### Good Example
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Margins: 1 inch (1440 twips) all sides for business documents.
|
|
51
|
+
Line spacing: 1.15 (276 twips at 240 twips-per-line = 115%).
|
|
52
|
+
Paragraph spacing after: 8pt (160 twips) between body paragraphs.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```xml
|
|
56
|
+
<!-- Page margins: 1 inch = 1440 twips on all sides -->
|
|
57
|
+
<w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440"
|
|
58
|
+
w:header="720" w:footer="720" w:gutter="0"/>
|
|
59
|
+
|
|
60
|
+
<!-- Body paragraph: 1.15 line spacing, 8pt after -->
|
|
61
|
+
<w:pPr>
|
|
62
|
+
<w:spacing w:after="160" w:line="276" w:lineRule="auto"/>
|
|
63
|
+
</w:pPr>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
This produces a page where content occupies roughly 65% of the area. The
|
|
67
|
+
reader sees clear top/bottom breathing room, and paragraphs are distinct
|
|
68
|
+
without feeling disconnected.
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
Page layout (good):
|
|
72
|
+
+----------------------------------+
|
|
73
|
+
| 1" margin |
|
|
74
|
+
| +------------------------+ |
|
|
75
|
+
| | Heading | |
|
|
76
|
+
| | | |
|
|
77
|
+
| | Body text here with | |
|
|
78
|
+
| | comfortable spacing | |
|
|
79
|
+
| | between lines. | |
|
|
80
|
+
| | | | <- visible gap between paragraphs
|
|
81
|
+
| | Another paragraph of | |
|
|
82
|
+
| | body text follows. | |
|
|
83
|
+
| | | |
|
|
84
|
+
| +------------------------+ |
|
|
85
|
+
| 1" margin |
|
|
86
|
+
+----------------------------------+
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Bad Example
|
|
90
|
+
|
|
91
|
+
```xml
|
|
92
|
+
<!-- Cramped margins: 0.5 inch = 720 twips -->
|
|
93
|
+
<w:pgMar w:top="720" w:right="720" w:bottom="720" w:left="720"
|
|
94
|
+
w:header="360" w:footer="360" w:gutter="0"/>
|
|
95
|
+
|
|
96
|
+
<!-- No paragraph spacing, single line spacing -->
|
|
97
|
+
<w:pPr>
|
|
98
|
+
<w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
|
|
99
|
+
</w:pPr>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
This fills ~85% of the page. Text runs edge-to-edge with no visual rest stops.
|
|
103
|
+
The reader sees a wall of text.
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Page layout (bad):
|
|
107
|
+
+----------------------------------+
|
|
108
|
+
| Heading |
|
|
109
|
+
| Body text crammed right up to |
|
|
110
|
+
| the margins with no spacing |
|
|
111
|
+
| between lines or paragraphs. |
|
|
112
|
+
| Another paragraph starts here |
|
|
113
|
+
| and the reader cannot tell where |
|
|
114
|
+
| one idea ends and another begins |
|
|
115
|
+
| because everything blurs into a |
|
|
116
|
+
| single dense block of text. |
|
|
117
|
+
+----------------------------------+
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Quick Test
|
|
121
|
+
|
|
122
|
+
1. Zoom out to 50% in your document viewer. If you cannot see clear "channels"
|
|
123
|
+
of white between text blocks, the spacing is too tight.
|
|
124
|
+
2. Print a test page. Hold it at arm's length. The text area should look like
|
|
125
|
+
a rectangle floating in white, not filling the page.
|
|
126
|
+
3. Check: is the line spacing value at least 264 (`w:line` for 1.1x) for body
|
|
127
|
+
text? If it is 240 (single), it is too tight for anything over 10pt.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 2. Contrast & Scale
|
|
132
|
+
|
|
133
|
+
### Why It Works
|
|
134
|
+
|
|
135
|
+
The brain processes visual hierarchy through relative difference, not absolute
|
|
136
|
+
size. A 20pt heading above 11pt body text creates a clear "this is important"
|
|
137
|
+
signal. But if every heading is 20pt and every sub-heading is 19pt, the brain
|
|
138
|
+
cannot distinguish them -- they merge into the same level.
|
|
139
|
+
|
|
140
|
+
The key insight is **modular scale**: font sizes that grow by a consistent
|
|
141
|
+
ratio. This mirrors natural proportions and feels harmonious for the same
|
|
142
|
+
reason musical intervals do.
|
|
143
|
+
|
|
144
|
+
Common scales and their character:
|
|
145
|
+
|
|
146
|
+
| Ratio | Name | Character | Example progression (from 11pt) |
|
|
147
|
+
|-------|----------------|---------------------------------|---------------------------------|
|
|
148
|
+
| 1.200 | Minor third | Subtle, refined | 11 → 13.2 → 15.8 → 19.0 |
|
|
149
|
+
| 1.250 | Major third | Balanced, professional | 11 → 13.75 → 17.2 → 21.5 |
|
|
150
|
+
| 1.333 | Perfect fourth | Strong, authoritative | 11 → 14.7 → 19.5 → 26.0 |
|
|
151
|
+
| 1.414 | Augmented 4th | Dramatic, presentation-style | 11 → 15.6 → 22.0 → 31.1 |
|
|
152
|
+
|
|
153
|
+
For most business documents, 1.25 (major third) works best:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
Body = 11pt (w:sz="22")
|
|
157
|
+
H3 = 13pt (w:sz="26") -- 11 * 1.25 ≈ 13.75, round to 13
|
|
158
|
+
H2 = 16pt (w:sz="32") -- 13 * 1.25 ≈ 16.25, round to 16
|
|
159
|
+
H1 = 20pt (w:sz="40") -- 16 * 1.25 = 20
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Beyond size, **weight contrast** creates hierarchy without consuming vertical
|
|
163
|
+
space. Regular (400) vs Bold (700) is visible at any size. Semi-bold (600) vs
|
|
164
|
+
Regular is subtle and best avoided unless you also vary size or color.
|
|
165
|
+
|
|
166
|
+
**Color contrast** adds a third dimension. Dark blue headings (#1F3864) against
|
|
167
|
+
softer dark gray body text (#333333) signals "heading" without needing a huge
|
|
168
|
+
size jump. Pure black (#000000) body text is harsher than necessary on white
|
|
169
|
+
backgrounds -- #333333 or #2D2D2D reduces glare without losing legibility.
|
|
170
|
+
|
|
171
|
+
### Good Example
|
|
172
|
+
|
|
173
|
+
```xml
|
|
174
|
+
<!-- H1: 20pt, bold, dark navy -->
|
|
175
|
+
<w:rPr>
|
|
176
|
+
<w:b/>
|
|
177
|
+
<w:sz w:val="40"/>
|
|
178
|
+
<w:color w:val="1F3864"/>
|
|
179
|
+
</w:rPr>
|
|
180
|
+
|
|
181
|
+
<!-- H2: 16pt, bold, dark navy -->
|
|
182
|
+
<w:rPr>
|
|
183
|
+
<w:b/>
|
|
184
|
+
<w:sz w:val="32"/>
|
|
185
|
+
<w:color w:val="1F3864"/>
|
|
186
|
+
</w:rPr>
|
|
187
|
+
|
|
188
|
+
<!-- H3: 13pt, bold, dark navy -->
|
|
189
|
+
<w:rPr>
|
|
190
|
+
<w:b/>
|
|
191
|
+
<w:sz w:val="26"/>
|
|
192
|
+
<w:color w:val="1F3864"/>
|
|
193
|
+
</w:rPr>
|
|
194
|
+
|
|
195
|
+
<!-- Body: 11pt, regular, dark gray -->
|
|
196
|
+
<w:rPr>
|
|
197
|
+
<w:sz w:val="22"/>
|
|
198
|
+
<w:color w:val="333333"/>
|
|
199
|
+
</w:rPr>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
Visual hierarchy (good):
|
|
204
|
+
|
|
205
|
+
[████████████████████] <- H1: 20pt bold navy (clearly dominant)
|
|
206
|
+
(generous space)
|
|
207
|
+
[██████████████] <- H2: 16pt bold navy (distinct step down)
|
|
208
|
+
(moderate space)
|
|
209
|
+
[████████████] <- H3: 13pt bold navy (smaller but still bold)
|
|
210
|
+
[░░░░░░░░░░░░░░░░░░░░░░] <- Body: 11pt regular gray
|
|
211
|
+
[░░░░░░░░░░░░░░░░░░░░░░]
|
|
212
|
+
[░░░░░░░░░░░░░░░░░░░░░░]
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Each level is visually distinct from its neighbors. You can identify the
|
|
216
|
+
hierarchy even in peripheral vision.
|
|
217
|
+
|
|
218
|
+
### Bad Example
|
|
219
|
+
|
|
220
|
+
```xml
|
|
221
|
+
<!-- H1: 14pt bold black -->
|
|
222
|
+
<w:rPr>
|
|
223
|
+
<w:b/>
|
|
224
|
+
<w:sz w:val="28"/>
|
|
225
|
+
<w:color w:val="000000"/>
|
|
226
|
+
</w:rPr>
|
|
227
|
+
|
|
228
|
+
<!-- H2: 13pt bold black -->
|
|
229
|
+
<w:rPr>
|
|
230
|
+
<w:b/>
|
|
231
|
+
<w:sz w:val="26"/>
|
|
232
|
+
<w:color w:val="000000"/>
|
|
233
|
+
</w:rPr>
|
|
234
|
+
|
|
235
|
+
<!-- H3: 12pt bold black -->
|
|
236
|
+
<w:rPr>
|
|
237
|
+
<w:b/>
|
|
238
|
+
<w:sz w:val="24"/>
|
|
239
|
+
<w:color w:val="000000"/>
|
|
240
|
+
</w:rPr>
|
|
241
|
+
|
|
242
|
+
<!-- Body: 12pt regular black -->
|
|
243
|
+
<w:rPr>
|
|
244
|
+
<w:sz w:val="24"/>
|
|
245
|
+
<w:color w:val="000000"/>
|
|
246
|
+
</w:rPr>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Problems:
|
|
250
|
+
- H3 (12pt bold) and body (12pt regular) differ only by weight -- too subtle.
|
|
251
|
+
- H1 (14pt) to H2 (13pt) is a 1pt step -- invisible at reading distance.
|
|
252
|
+
- Everything is pure black so color provides no differentiating signal.
|
|
253
|
+
- The ratio between levels is ~1.07, far too flat.
|
|
254
|
+
|
|
255
|
+
### Quick Test
|
|
256
|
+
|
|
257
|
+
1. **The squint test**: blur your eyes or step back from the screen. Can you
|
|
258
|
+
count the number of heading levels? If two levels merge, their contrast
|
|
259
|
+
is insufficient.
|
|
260
|
+
2. **Ratio check**: divide each heading size by the next smaller size. If any
|
|
261
|
+
ratio is below 1.15, the levels will look too similar.
|
|
262
|
+
3. **Color check**: do headings look distinct from body text when you glance
|
|
263
|
+
at the page? If everything is the same color, you are relying solely on
|
|
264
|
+
size/weight, which limits your hierarchy to ~3 effective levels.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 3. Proximity & Grouping
|
|
269
|
+
|
|
270
|
+
### Why It Works
|
|
271
|
+
|
|
272
|
+
The Gestalt principle of proximity: items that are close together are perceived
|
|
273
|
+
as belonging to the same group. In document typography, this means a heading
|
|
274
|
+
must be **closer to the content it introduces** than to the content above it.
|
|
275
|
+
|
|
276
|
+
If a heading sits equidistant between two paragraphs, it looks orphaned -- the
|
|
277
|
+
reader's eye does not know if it belongs to the text above or below. The fix
|
|
278
|
+
is asymmetric spacing: **large space before the heading, small space after**.
|
|
279
|
+
|
|
280
|
+
The recommended ratio is 2:1 or 3:1 (space-before : space-after).
|
|
281
|
+
|
|
282
|
+
This same principle applies to:
|
|
283
|
+
- **List items**: spacing between items should be less than spacing between
|
|
284
|
+
paragraphs. Items in a list are a group and should visually cluster.
|
|
285
|
+
- **Captions**: a figure caption should be close to its figure, not floating
|
|
286
|
+
in the middle between the figure and the next paragraph.
|
|
287
|
+
- **Table titles**: the title sits close above the table, with more space
|
|
288
|
+
separating the title from preceding text.
|
|
289
|
+
|
|
290
|
+
### Good Example
|
|
291
|
+
|
|
292
|
+
```xml
|
|
293
|
+
<!-- H2: 18pt before, 6pt after (3:1 ratio) -->
|
|
294
|
+
<w:pPr>
|
|
295
|
+
<w:pStyle w:val="Heading2"/>
|
|
296
|
+
<w:spacing w:before="360" w:after="120"/>
|
|
297
|
+
</w:pPr>
|
|
298
|
+
|
|
299
|
+
<!-- Body paragraph: 0pt before, 8pt after -->
|
|
300
|
+
<w:pPr>
|
|
301
|
+
<w:spacing w:before="0" w:after="160"/>
|
|
302
|
+
</w:pPr>
|
|
303
|
+
|
|
304
|
+
<!-- List item: 0pt before, 2pt after (tight grouping) -->
|
|
305
|
+
<w:pPr>
|
|
306
|
+
<w:pStyle w:val="ListParagraph"/>
|
|
307
|
+
<w:spacing w:before="0" w:after="40"/>
|
|
308
|
+
</w:pPr>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
Proximity (good):
|
|
313
|
+
|
|
314
|
+
...end of previous section text.
|
|
315
|
+
<- 18pt gap (w:before="360")
|
|
316
|
+
## Section Heading
|
|
317
|
+
<- 6pt gap (w:after="120")
|
|
318
|
+
First paragraph of new section
|
|
319
|
+
continues here with content.
|
|
320
|
+
<- 8pt gap (w:after="160")
|
|
321
|
+
Second paragraph follows.
|
|
322
|
+
|
|
323
|
+
The heading clearly "belongs to" the text below it.
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
List grouping (good):
|
|
328
|
+
|
|
329
|
+
Consider these factors:
|
|
330
|
+
- First item <- 2pt gap between items
|
|
331
|
+
- Second item <- items cluster as a group
|
|
332
|
+
- Third item
|
|
333
|
+
<- 8pt gap after list
|
|
334
|
+
The next paragraph starts here.
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Bad Example
|
|
338
|
+
|
|
339
|
+
```xml
|
|
340
|
+
<!-- H2: 12pt before, 12pt after (1:1 ratio -- orphaned heading) -->
|
|
341
|
+
<w:pPr>
|
|
342
|
+
<w:pStyle w:val="Heading2"/>
|
|
343
|
+
<w:spacing w:before="240" w:after="240"/>
|
|
344
|
+
</w:pPr>
|
|
345
|
+
|
|
346
|
+
<!-- List item: same spacing as body (10pt after) -->
|
|
347
|
+
<w:pPr>
|
|
348
|
+
<w:pStyle w:val="ListParagraph"/>
|
|
349
|
+
<w:spacing w:before="0" w:after="200"/>
|
|
350
|
+
</w:pPr>
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
```
|
|
354
|
+
Proximity (bad):
|
|
355
|
+
|
|
356
|
+
...end of previous section text.
|
|
357
|
+
<- 12pt gap
|
|
358
|
+
## Section Heading
|
|
359
|
+
<- 12pt gap (same!)
|
|
360
|
+
First paragraph of new section.
|
|
361
|
+
|
|
362
|
+
The heading floats between sections. It is unclear what it belongs to.
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
```
|
|
366
|
+
List grouping (bad):
|
|
367
|
+
|
|
368
|
+
Consider these factors:
|
|
369
|
+
<- 10pt gap
|
|
370
|
+
- First item
|
|
371
|
+
<- 10pt gap (same as paragraphs)
|
|
372
|
+
- Second item
|
|
373
|
+
<- 10pt gap
|
|
374
|
+
- Third item
|
|
375
|
+
<- 10pt gap
|
|
376
|
+
Next paragraph.
|
|
377
|
+
|
|
378
|
+
The list does not feel like a group. Each item looks like a
|
|
379
|
+
separate paragraph that happens to have a bullet.
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Quick Test
|
|
383
|
+
|
|
384
|
+
1. **Cover test**: cover the heading text. Looking only at the whitespace,
|
|
385
|
+
can you tell which block of text the heading belongs to? If the gaps above
|
|
386
|
+
and below are equal, the answer is "no."
|
|
387
|
+
2. **Number check**: `w:before` on headings should be at least 2x `w:after`.
|
|
388
|
+
Common good values: before=360 / after=120, or before=240 / after=80.
|
|
389
|
+
3. **List check**: `w:after` on list items should be less than half of
|
|
390
|
+
`w:after` on body paragraphs. If body uses 160, list items should use
|
|
391
|
+
40-60.
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## 4. Alignment & Grid
|
|
396
|
+
|
|
397
|
+
### Why It Works
|
|
398
|
+
|
|
399
|
+
Alignment creates invisible lines that the eye follows down the page. When
|
|
400
|
+
elements share the same left edge, the reader perceives order and intention.
|
|
401
|
+
When elements are slightly misaligned (off by a few twips), the page looks
|
|
402
|
+
sloppy even if the reader cannot consciously identify why.
|
|
403
|
+
|
|
404
|
+
**Left-align vs Justify:**
|
|
405
|
+
|
|
406
|
+
- **Left-aligned** (ragged right) is best for English and other Latin-script
|
|
407
|
+
languages. The uneven right edge actually helps reading because each line
|
|
408
|
+
has a unique silhouette, making it easier for the eye to find the next line.
|
|
409
|
+
Justified text forces uneven word spacing that creates distracting "rivers"
|
|
410
|
+
of white running vertically through paragraphs.
|
|
411
|
+
|
|
412
|
+
- **Justified** is best for CJK text. Chinese, Japanese, and Korean characters
|
|
413
|
+
are monospaced by design -- each occupies the same cell in an invisible grid.
|
|
414
|
+
Justification preserves this grid perfectly. Ragged right in CJK text breaks
|
|
415
|
+
the grid and looks untidy.
|
|
416
|
+
|
|
417
|
+
**Indentation rule:** Use first-line indent OR paragraph spacing to separate
|
|
418
|
+
paragraphs -- never both. They serve the same purpose (marking paragraph
|
|
419
|
+
boundaries). Using both wastes space and creates visual stutter.
|
|
420
|
+
|
|
421
|
+
- Western convention: paragraph spacing (no indent) is more modern.
|
|
422
|
+
- CJK convention: first-line indent of 2 characters is standard.
|
|
423
|
+
- Academic convention: first-line indent of 0.5 inch is traditional.
|
|
424
|
+
|
|
425
|
+
### Good Example
|
|
426
|
+
|
|
427
|
+
```xml
|
|
428
|
+
<!-- English body: left-aligned, paragraph spacing, no indent -->
|
|
429
|
+
<w:pPr>
|
|
430
|
+
<w:jc w:val="left"/>
|
|
431
|
+
<w:spacing w:after="160" w:line="276" w:lineRule="auto"/>
|
|
432
|
+
<!-- No w:ind firstLine -->
|
|
433
|
+
</w:pPr>
|
|
434
|
+
|
|
435
|
+
<!-- CJK body: justified, first-line indent 2 chars, no paragraph spacing -->
|
|
436
|
+
<w:pPr>
|
|
437
|
+
<w:jc w:val="both"/>
|
|
438
|
+
<w:spacing w:after="0" w:line="360" w:lineRule="auto"/>
|
|
439
|
+
<w:ind w:firstLineChars="200"/>
|
|
440
|
+
</w:pPr>
|
|
441
|
+
|
|
442
|
+
<!-- Tab stops creating aligned columns -->
|
|
443
|
+
<w:pPr>
|
|
444
|
+
<w:tabs>
|
|
445
|
+
<w:tab w:val="left" w:pos="2880"/> <!-- 2 inches -->
|
|
446
|
+
<w:tab w:val="right" w:pos="9360"/> <!-- 6.5 inches (right margin) -->
|
|
447
|
+
</w:tabs>
|
|
448
|
+
</w:pPr>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
```
|
|
452
|
+
English paragraph separation (good -- spacing, no indent):
|
|
453
|
+
|
|
454
|
+
This is the first paragraph with some text
|
|
455
|
+
that wraps to a second line naturally.
|
|
456
|
+
|
|
457
|
+
This is the second paragraph. The gap above
|
|
458
|
+
clearly marks the boundary.
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
CJK paragraph separation (good -- indent, no spacing):
|
|
462
|
+
|
|
463
|
+
第一段正文内容从这里开始,使用两个字符
|
|
464
|
+
的首行缩进来标记段落边界。
|
|
465
|
+
第二段紧跟其后,没有段间距,但首行缩进
|
|
466
|
+
清晰地标识了新段落的开始。
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### Bad Example
|
|
470
|
+
|
|
471
|
+
```xml
|
|
472
|
+
<!-- English body: justified (creates word-spacing rivers) -->
|
|
473
|
+
<w:pPr>
|
|
474
|
+
<w:jc w:val="both"/>
|
|
475
|
+
<w:spacing w:after="160" w:line="276" w:lineRule="auto"/>
|
|
476
|
+
<w:ind w:firstLine="720"/> <!-- BOTH indent AND spacing: redundant -->
|
|
477
|
+
</w:pPr>
|
|
478
|
+
|
|
479
|
+
<!-- CJK body: left-aligned (breaks character grid) -->
|
|
480
|
+
<w:pPr>
|
|
481
|
+
<w:jc w:val="left"/>
|
|
482
|
+
<w:spacing w:after="200" w:line="276" w:lineRule="auto"/>
|
|
483
|
+
<!-- No indent, using spacing instead -- unidiomatic for CJK -->
|
|
484
|
+
</w:pPr>
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Problems:
|
|
488
|
+
- Justified English text with narrow columns creates uneven word gaps.
|
|
489
|
+
- Using both first-line indent AND paragraph spacing is redundant.
|
|
490
|
+
- Left-aligned CJK breaks the character grid that CJK readers expect.
|
|
491
|
+
- CJK with spacing-based separation looks like translated western layout.
|
|
492
|
+
|
|
493
|
+
### Quick Test
|
|
494
|
+
|
|
495
|
+
1. **River test**: in justified English text, squint and look for vertical
|
|
496
|
+
white streaks running through the paragraph. If you see them, switch to
|
|
497
|
+
left-align or increase the column width.
|
|
498
|
+
2. **Double signal check**: does the document use BOTH first-line indent AND
|
|
499
|
+
paragraph spacing? If yes, remove one. Choose indent for CJK/academic,
|
|
500
|
+
spacing for modern western.
|
|
501
|
+
3. **Tab alignment**: if you use tabs for columns, do all tab stops across
|
|
502
|
+
the document use the same positions? Inconsistent tab stops create jagged
|
|
503
|
+
invisible grid lines.
|
|
504
|
+
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
## 5. Repetition & Consistency
|
|
508
|
+
|
|
509
|
+
### Why It Works
|
|
510
|
+
|
|
511
|
+
Consistency is a trust signal. When a reader sees that every H2 looks the same,
|
|
512
|
+
every table follows the same pattern, and every page number sits in the same
|
|
513
|
+
spot, they unconsciously trust that the document was crafted with care. A single
|
|
514
|
+
inconsistency -- one H2 that is 15pt instead of 14pt, one table with different
|
|
515
|
+
borders -- breaks that trust and makes the reader question the content.
|
|
516
|
+
|
|
517
|
+
Consistency also reduces cognitive load. Once the reader learns "bold dark blue
|
|
518
|
+
= section heading," they stop spending mental effort on identifying structure
|
|
519
|
+
and focus entirely on content. Every inconsistency forces them to re-evaluate:
|
|
520
|
+
"Is this a different kind of heading, or did someone just forget to apply the
|
|
521
|
+
style?"
|
|
522
|
+
|
|
523
|
+
The implementation rule is simple: **use named styles, not direct formatting.**
|
|
524
|
+
If you define Heading2 as a style and apply it everywhere, consistency is
|
|
525
|
+
automatic. If you manually set font size, bold, and color on each heading
|
|
526
|
+
individually, inconsistency is inevitable.
|
|
527
|
+
|
|
528
|
+
### Good Example
|
|
529
|
+
|
|
530
|
+
```xml
|
|
531
|
+
<!-- Define styles once in styles.xml -->
|
|
532
|
+
<w:style w:type="paragraph" w:styleId="Heading2">
|
|
533
|
+
<w:name w:val="heading 2"/>
|
|
534
|
+
<w:basedOn w:val="Normal"/>
|
|
535
|
+
<w:next w:val="Normal"/>
|
|
536
|
+
<w:pPr>
|
|
537
|
+
<w:keepNext/>
|
|
538
|
+
<w:keepLines/>
|
|
539
|
+
<w:spacing w:before="360" w:after="120"/>
|
|
540
|
+
<w:outlineLvl w:val="1"/>
|
|
541
|
+
</w:pPr>
|
|
542
|
+
<w:rPr>
|
|
543
|
+
<w:rFonts w:asciiTheme="majorHAnsi" w:hAnsiTheme="majorHAnsi"/>
|
|
544
|
+
<w:b/>
|
|
545
|
+
<w:sz w:val="32"/>
|
|
546
|
+
<w:color w:val="1F3864"/>
|
|
547
|
+
</w:rPr>
|
|
548
|
+
</w:style>
|
|
549
|
+
|
|
550
|
+
<!-- Apply consistently: every H2 references the style -->
|
|
551
|
+
<w:p>
|
|
552
|
+
<w:pPr>
|
|
553
|
+
<w:pStyle w:val="Heading2"/>
|
|
554
|
+
<!-- No direct formatting overrides -->
|
|
555
|
+
</w:pPr>
|
|
556
|
+
<w:r><w:t>Market Analysis</w:t></w:r>
|
|
557
|
+
</w:p>
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
When using a table style, define it once and reference it for every table:
|
|
561
|
+
|
|
562
|
+
```xml
|
|
563
|
+
<!-- All tables reference the same style -->
|
|
564
|
+
<w:tblPr>
|
|
565
|
+
<w:tblStyle w:val="GridTable4Accent1"/>
|
|
566
|
+
<w:tblW w:w="0" w:type="auto"/>
|
|
567
|
+
</w:tblPr>
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### Bad Example
|
|
571
|
+
|
|
572
|
+
```xml
|
|
573
|
+
<!-- First H2: manually formatted -->
|
|
574
|
+
<w:p>
|
|
575
|
+
<w:pPr>
|
|
576
|
+
<w:spacing w:before="360" w:after="120"/>
|
|
577
|
+
</w:pPr>
|
|
578
|
+
<w:r>
|
|
579
|
+
<w:rPr>
|
|
580
|
+
<w:b/>
|
|
581
|
+
<w:sz w:val="32"/>
|
|
582
|
+
<w:color w:val="1F3864"/>
|
|
583
|
+
</w:rPr>
|
|
584
|
+
<w:t>Market Analysis</w:t>
|
|
585
|
+
</w:r>
|
|
586
|
+
</w:p>
|
|
587
|
+
|
|
588
|
+
<!-- Second H2: slightly different (16pt instead of 16pt? No, 15pt!) -->
|
|
589
|
+
<w:p>
|
|
590
|
+
<w:pPr>
|
|
591
|
+
<w:spacing w:before="240" w:after="160"/> <!-- different spacing! -->
|
|
592
|
+
</w:pPr>
|
|
593
|
+
<w:r>
|
|
594
|
+
<w:rPr>
|
|
595
|
+
<w:b/>
|
|
596
|
+
<w:sz w:val="30"/> <!-- 15pt instead of 16pt! -->
|
|
597
|
+
<w:color w:val="2E74B5"/> <!-- different shade of blue! -->
|
|
598
|
+
</w:rPr>
|
|
599
|
+
<w:t>Financial Overview</w:t>
|
|
600
|
+
</w:r>
|
|
601
|
+
</w:p>
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
Problems:
|
|
605
|
+
- No style references -- everything is direct formatting.
|
|
606
|
+
- Second H2 has different size (30 vs 32), color, and spacing.
|
|
607
|
+
- If there are 20 headings, each could drift slightly differently.
|
|
608
|
+
- Changing the design later means editing every heading individually.
|
|
609
|
+
|
|
610
|
+
### Quick Test
|
|
611
|
+
|
|
612
|
+
1. **Style audit**: does every paragraph reference a `w:pStyle`? If you find
|
|
613
|
+
paragraphs with only direct formatting and no style, that is a consistency
|
|
614
|
+
risk.
|
|
615
|
+
2. **Search for variance**: search the XML for all `w:sz` values used with
|
|
616
|
+
`w:b` (bold). If you find three different sizes for what should be the same
|
|
617
|
+
heading level, there is an inconsistency.
|
|
618
|
+
3. **Table check**: do all tables in the document reference the same
|
|
619
|
+
`w:tblStyle`? If some tables have manual border definitions while others
|
|
620
|
+
use a style, the document will look patchy.
|
|
621
|
+
4. **Page numbers**: check that header/footer content is defined in the
|
|
622
|
+
default section properties and inherited by all sections, not redefined
|
|
623
|
+
inconsistently in each section.
|
|
624
|
+
|
|
625
|
+
---
|
|
626
|
+
|
|
627
|
+
## 6. Visual Hierarchy & Flow
|
|
628
|
+
|
|
629
|
+
### Why It Works
|
|
630
|
+
|
|
631
|
+
A well-designed document guides the reader's eye in a predictable path:
|
|
632
|
+
title at the top, subtitle below it, section headings as signposts, body text
|
|
633
|
+
as the main content, footnotes and captions as supporting details. This flow
|
|
634
|
+
mirrors reading priority -- the most important information is the most visually
|
|
635
|
+
prominent.
|
|
636
|
+
|
|
637
|
+
Each level in the hierarchy must be **distinguishable from its adjacent
|
|
638
|
+
levels**. It is not enough for H1 to differ from body text; H1 must also
|
|
639
|
+
clearly differ from H2, and H2 from H3. If any two adjacent levels are too
|
|
640
|
+
similar, the hierarchy collapses at that point.
|
|
641
|
+
|
|
642
|
+
Effective hierarchy uses **multiple simultaneous signals**:
|
|
643
|
+
|
|
644
|
+
| Level | Size | Weight | Color | Spacing above |
|
|
645
|
+
|----------|-------|---------|---------|---------------|
|
|
646
|
+
| Title | 26pt | Bold | #1F3864 | 0 (top) |
|
|
647
|
+
| Subtitle | 15pt | Regular | #4472C4 | 4pt |
|
|
648
|
+
| H1 | 20pt | Bold | #1F3864 | 24pt |
|
|
649
|
+
| H2 | 16pt | Bold | #1F3864 | 18pt |
|
|
650
|
+
| H3 | 13pt | Bold | #1F3864 | 12pt |
|
|
651
|
+
| Body | 11pt | Regular | #333333 | 0pt |
|
|
652
|
+
| Caption | 9pt | Italic | #666666 | 4pt |
|
|
653
|
+
| Footnote | 9pt | Regular | #666666 | 0pt |
|
|
654
|
+
|
|
655
|
+
Notice how each level differs from its neighbors on at least two dimensions
|
|
656
|
+
(size + weight, or size + color, or weight + style). Single-dimension
|
|
657
|
+
differences are fragile and can be missed.
|
|
658
|
+
|
|
659
|
+
**Section breaks** create rhythm in long documents. A page break before each
|
|
660
|
+
major section (H1) gives the reader a mental reset. Within sections, consistent
|
|
661
|
+
heading + body patterns create a predictable cadence that makes long documents
|
|
662
|
+
less intimidating.
|
|
663
|
+
|
|
664
|
+
### Good Example
|
|
665
|
+
|
|
666
|
+
```xml
|
|
667
|
+
<!-- Title: large, bold, navy, centered -->
|
|
668
|
+
<w:style w:type="paragraph" w:styleId="Title">
|
|
669
|
+
<w:pPr>
|
|
670
|
+
<w:jc w:val="center"/>
|
|
671
|
+
<w:spacing w:after="80"/>
|
|
672
|
+
</w:pPr>
|
|
673
|
+
<w:rPr>
|
|
674
|
+
<w:b/>
|
|
675
|
+
<w:sz w:val="52"/>
|
|
676
|
+
<w:color w:val="1F3864"/>
|
|
677
|
+
</w:rPr>
|
|
678
|
+
</w:style>
|
|
679
|
+
|
|
680
|
+
<!-- Subtitle: medium, regular weight, lighter blue, centered -->
|
|
681
|
+
<w:style w:type="paragraph" w:styleId="Subtitle">
|
|
682
|
+
<w:pPr>
|
|
683
|
+
<w:jc w:val="center"/>
|
|
684
|
+
<w:spacing w:after="320"/>
|
|
685
|
+
</w:pPr>
|
|
686
|
+
<w:rPr>
|
|
687
|
+
<w:sz w:val="30"/>
|
|
688
|
+
<w:color w:val="4472C4"/>
|
|
689
|
+
</w:rPr>
|
|
690
|
+
</w:style>
|
|
691
|
+
|
|
692
|
+
<!-- H1: page break before, large bold navy -->
|
|
693
|
+
<w:style w:type="paragraph" w:styleId="Heading1">
|
|
694
|
+
<w:pPr>
|
|
695
|
+
<w:pageBreakBefore/>
|
|
696
|
+
<w:keepNext/>
|
|
697
|
+
<w:keepLines/>
|
|
698
|
+
<w:spacing w:before="480" w:after="160"/>
|
|
699
|
+
<w:outlineLvl w:val="0"/>
|
|
700
|
+
</w:pPr>
|
|
701
|
+
<w:rPr>
|
|
702
|
+
<w:b/>
|
|
703
|
+
<w:sz w:val="40"/>
|
|
704
|
+
<w:color w:val="1F3864"/>
|
|
705
|
+
</w:rPr>
|
|
706
|
+
</w:style>
|
|
707
|
+
|
|
708
|
+
<!-- Caption: small, italic, gray -->
|
|
709
|
+
<w:style w:type="paragraph" w:styleId="Caption">
|
|
710
|
+
<w:pPr>
|
|
711
|
+
<w:spacing w:before="80" w:after="200"/>
|
|
712
|
+
</w:pPr>
|
|
713
|
+
<w:rPr>
|
|
714
|
+
<w:i/>
|
|
715
|
+
<w:sz w:val="18"/>
|
|
716
|
+
<w:color w:val="666666"/>
|
|
717
|
+
</w:rPr>
|
|
718
|
+
</w:style>
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
```
|
|
722
|
+
Visual flow (good):
|
|
723
|
+
|
|
724
|
+
+----------------------------------+
|
|
725
|
+
| |
|
|
726
|
+
| ANNUAL REPORT 2025 | <- Title: 26pt bold navy centered
|
|
727
|
+
| Acme Corporation | <- Subtitle: 15pt regular blue
|
|
728
|
+
| |
|
|
729
|
+
| |
|
|
730
|
+
+----------------------------------+
|
|
731
|
+
|
|
732
|
+
+----------------------------------+
|
|
733
|
+
| |
|
|
734
|
+
| 1. Executive Summary | <- H1: 20pt bold navy (page break)
|
|
735
|
+
| |
|
|
736
|
+
| Body text introducing the | <- Body: 11pt regular gray
|
|
737
|
+
| main findings of the year. |
|
|
738
|
+
| |
|
|
739
|
+
| 1.1 Revenue Highlights | <- H2: 16pt bold navy
|
|
740
|
+
| |
|
|
741
|
+
| Revenue grew by 23% year | <- Body
|
|
742
|
+
| over year, driven by... |
|
|
743
|
+
| |
|
|
744
|
+
| Figure 1: Revenue Growth | <- Caption: 9pt italic gray
|
|
745
|
+
| |
|
|
746
|
+
+----------------------------------+
|
|
747
|
+
|
|
748
|
+
Each level is immediately identifiable. The eye flows naturally
|
|
749
|
+
from title -> heading -> body -> caption.
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
### Bad Example
|
|
753
|
+
|
|
754
|
+
```xml
|
|
755
|
+
<!-- All headings same color as body, minimal size difference -->
|
|
756
|
+
<w:style w:type="paragraph" w:styleId="Heading1">
|
|
757
|
+
<w:rPr>
|
|
758
|
+
<w:b/>
|
|
759
|
+
<w:sz w:val="28"/> <!-- 14pt -- only 3pt above body -->
|
|
760
|
+
<w:color w:val="000000"/> <!-- same color as body -->
|
|
761
|
+
</w:rPr>
|
|
762
|
+
</w:style>
|
|
763
|
+
|
|
764
|
+
<!-- Caption same size as body, not italic -->
|
|
765
|
+
<w:style w:type="paragraph" w:styleId="Caption">
|
|
766
|
+
<w:rPr>
|
|
767
|
+
<w:sz w:val="22"/> <!-- same 11pt as body! -->
|
|
768
|
+
<w:color w:val="000000"/> <!-- same color as body -->
|
|
769
|
+
</w:rPr>
|
|
770
|
+
</w:style>
|
|
771
|
+
|
|
772
|
+
<!-- No page breaks between major sections -->
|
|
773
|
+
<!-- H1 has no pageBreakBefore, keepNext, or keepLines -->
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
Problems:
|
|
777
|
+
- H1 at 14pt is too close to body at 11pt (ratio 1.27 -- acceptable in
|
|
778
|
+
isolation but with black color matching body, the hierarchy is weak).
|
|
779
|
+
- Caption is indistinguishable from body text.
|
|
780
|
+
- No page breaks means major sections bleed into each other with no
|
|
781
|
+
visual rhythm.
|
|
782
|
+
- Everything is black, so color provides zero hierarchy signal.
|
|
783
|
+
|
|
784
|
+
### Quick Test
|
|
785
|
+
|
|
786
|
+
1. **The squint test**: blur your eyes while looking at a full page. You
|
|
787
|
+
should see 3-4 distinct "weight levels" of gray. If the page looks like
|
|
788
|
+
one uniform shade, the hierarchy is too flat.
|
|
789
|
+
2. **The scan test**: flip through pages quickly. Can you identify section
|
|
790
|
+
boundaries in under one second per page? If yes, the visual hierarchy is
|
|
791
|
+
working. If pages blur together, you need stronger differentiation at H1.
|
|
792
|
+
3. **Adjacent level test**: for each heading level, check that it differs
|
|
793
|
+
from the next level on at least 2 of: size, weight, color, style (italic).
|
|
794
|
+
Single-dimension differences get lost.
|
|
795
|
+
4. **Rhythm test**: in a document over 10 pages, do major sections (H1) start
|
|
796
|
+
on new pages? If not, long documents will feel like an undifferentiated
|
|
797
|
+
stream. Add `w:pageBreakBefore` to Heading1.
|
|
798
|
+
|
|
799
|
+
---
|
|
800
|
+
|
|
801
|
+
## Summary: Decision Checklist
|
|
802
|
+
|
|
803
|
+
When you are unsure about a typographic choice, run through these checks:
|
|
804
|
+
|
|
805
|
+
| Principle | Question | If No... |
|
|
806
|
+
|-----------|----------|----------|
|
|
807
|
+
| White Space | Does the page have at least 30% white space? | Increase margins or spacing |
|
|
808
|
+
| Contrast | Can I count heading levels by squinting? | Increase size ratios (target 1.25x) |
|
|
809
|
+
| Proximity | Does each heading clearly belong to text below it? | Make space-before > space-after (2:1) |
|
|
810
|
+
| Alignment | Is English left-aligned and CJK justified? | Switch alignment mode |
|
|
811
|
+
| Repetition | Do all same-level elements use the same style? | Replace direct formatting with styles |
|
|
812
|
+
| Hierarchy | Can I see the document structure at arm's length? | Add more differentiation signals |
|
|
813
|
+
|
|
814
|
+
**When two principles conflict, prioritize in this order:**
|
|
815
|
+
|
|
816
|
+
1. **Readability** (white space, line spacing) -- always wins
|
|
817
|
+
2. **Hierarchy** (contrast, scale) -- readers must find what they need
|
|
818
|
+
3. **Consistency** (repetition) -- builds trust
|
|
819
|
+
4. **Aesthetics** (alignment, grouping) -- the finishing touch
|