book-kit 0.0.0-stage → 0.6.0

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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +72 -0
  3. package/README.md +251 -2
  4. package/bin/book-kit.js +115 -0
  5. package/commands/_emoji_io.py +32 -0
  6. package/commands/audit-chapter-lengths.js +244 -0
  7. package/commands/check-epub-size.js +68 -0
  8. package/commands/check-pdf-page-count.js +162 -0
  9. package/commands/composite-kindle-emoji.py +85 -0
  10. package/commands/composite-print-emoji.py +98 -0
  11. package/commands/conventions.js +76 -0
  12. package/commands/convert-pdfx.sh +194 -0
  13. package/commands/download-icc-profile.sh +105 -0
  14. package/commands/fonts.py +212 -0
  15. package/commands/generate-reference-docx.py +344 -0
  16. package/commands/kindle-fonts.js +173 -0
  17. package/commands/links-to-footnotes.js +366 -0
  18. package/commands/markdownlint.js +25 -0
  19. package/commands/minify-css.js +43 -0
  20. package/commands/optimize-images.js +73 -0
  21. package/commands/parity.sh +150 -0
  22. package/commands/postprocess-epub.js +541 -0
  23. package/commands/prep-print-src.js +77 -0
  24. package/commands/prose.js +38 -0
  25. package/commands/release-files.js +89 -0
  26. package/commands/reorder-print-frontmatter.js +79 -0
  27. package/commands/strip-page-rules.js +1168 -0
  28. package/commands/strip-property-rules.js +93 -0
  29. package/commands/update-key-takeaways.js +314 -0
  30. package/commands/validate.js +283 -0
  31. package/configs/markdownlint-cli2.jsonc +98 -0
  32. package/configs/textlintrc.json +22 -0
  33. package/css/theme/01-tokens.css +83 -0
  34. package/css/theme/02-fonts.css +79 -0
  35. package/css/theme/03-prose.css +53 -0
  36. package/css/theme/04-base.css +226 -0
  37. package/css/theme/05-components.css +546 -0
  38. package/css/theme/06-utilities.css +40 -0
  39. package/css/theme/07-ereader.css +245 -0
  40. package/css/theme/08-epub.css +865 -0
  41. package/css/theme/09-back-matter.css +47 -0
  42. package/css/theme/10-dark.css +302 -0
  43. package/css/theme/11-print.css +1229 -0
  44. package/css/theme.css +38 -0
  45. package/defaults/book.config.yml +318 -0
  46. package/defaults/pandoc-base.yml +19 -0
  47. package/defaults/pandoc-docx.yml +6 -0
  48. package/defaults/pandoc-epub-fonts.yml +6 -0
  49. package/defaults/pandoc-epub.yml +15 -0
  50. package/defaults/pandoc-kindle.yml +6 -0
  51. package/emoji/1f382.png +0 -0
  52. package/emoji/1f389.png +0 -0
  53. package/emoji/1f440.png +0 -0
  54. package/emoji/1f44d.png +0 -0
  55. package/emoji/1f44f.png +0 -0
  56. package/emoji/1f454.png +0 -0
  57. package/emoji/1f4a1.png +0 -0
  58. package/emoji/1f4bb.png +0 -0
  59. package/emoji/1f602.png +0 -0
  60. package/emoji/1f603.png +0 -0
  61. package/emoji/1f604.png +0 -0
  62. package/emoji/1f60a.png +0 -0
  63. package/emoji/1f60f.png +0 -0
  64. package/emoji/1f64c.png +0 -0
  65. package/emoji/1f64f.png +0 -0
  66. package/emoji/1f914.png +0 -0
  67. package/emoji/1f923.png +0 -0
  68. package/emoji/2714.png +0 -0
  69. package/emoji/274c.png +0 -0
  70. package/filters/add-div-titles.lua +196 -0
  71. package/filters/arc-notice.lua +36 -0
  72. package/filters/body-emoji-images.lua +48 -0
  73. package/filters/callout-classes.lua +40 -0
  74. package/filters/lib/book_kit.lua +110 -0
  75. package/filters/revision.lua +17 -0
  76. package/filters/strip-comments.lua +40 -0
  77. package/filters/strip-emoji-kindle.lua +134 -0
  78. package/fonts/LICENSE-source-code-pro.md +93 -0
  79. package/fonts/LICENSE-source-sans.md +93 -0
  80. package/fonts/LICENSE-source-serif.md +93 -0
  81. package/fonts/recipe.json +41 -0
  82. package/just/book-kit.just +229 -0
  83. package/lib/acronyms.js +47 -0
  84. package/lib/callouts.js +17 -0
  85. package/lib/config.js +211 -0
  86. package/lib/is-main.js +21 -0
  87. package/lib/lint.js +148 -0
  88. package/lib/pandoc.js +148 -0
  89. package/lib/paragraphs.js +173 -0
  90. package/lib/revision.js +35 -0
  91. package/lib/structure.js +39 -0
  92. package/lib/textlint-github-formatter.js +58 -0
  93. package/lib/validate.js +202 -0
  94. package/package.json +98 -4
  95. package/presets/business-nonfiction/CONVENTIONS.md +35 -0
  96. package/presets/business-nonfiction/preset.yml +128 -0
  97. package/profiles/pdfx-def.ps +42 -0
  98. package/requirements.txt +14 -0
  99. package/rules/no-ai-like-patterns.js +209 -0
  100. package/rules/no-assumptive.js +76 -0
  101. package/rules/no-bare-acronyms.js +129 -0
  102. package/rules/no-cliches.js +544 -0
  103. package/rules/no-cultural-idioms.js +422 -0
  104. package/rules/no-vague-intensifiers.js +94 -0
  105. package/templates/template-epub.html +79 -0
  106. package/templates/template.html +73 -0
  107. package/toolchain.json +42 -0
  108. package/validators/acronym-expansion.js +94 -0
  109. package/validators/bold-keywords.js +56 -0
  110. package/validators/callout-balance.js +74 -0
  111. package/validators/callout-divs.js +66 -0
  112. package/validators/callout-labels.js +102 -0
  113. package/validators/chapter-lengths.js +14 -0
  114. package/validators/chapter.js +57 -0
  115. package/validators/cross-references.js +45 -0
  116. package/validators/doubled-words.js +76 -0
  117. package/validators/duplicate-headings.js +52 -0
  118. package/validators/em-dashes.js +73 -0
  119. package/validators/escaped-smallcaps.js +46 -0
  120. package/validators/footnotes.js +78 -0
  121. package/validators/heading-hierarchy.js +58 -0
  122. package/validators/hypothetical-hooks.js +103 -0
  123. package/validators/index-integrity.js +28 -0
  124. package/validators/index.js +73 -0
  125. package/validators/list-punctuation.js +123 -0
  126. package/validators/min-opener-length.js +87 -0
  127. package/validators/no-bare-url-link-text.js +38 -0
  128. package/validators/no-todo-markers.js +49 -0
  129. package/validators/no-transition-todos.js +34 -0
  130. package/validators/number-range-dashes.js +72 -0
  131. package/validators/paragraph-length.js +62 -0
  132. package/validators/quote-punctuation.js +85 -0
  133. package/validators/section-intro-final-lead.js +90 -0
  134. package/validators/section-intro-has-lead.js +41 -0
  135. package/validators/section-intro-no-tldr.js +37 -0
  136. package/validators/section-intros.js +33 -0
  137. package/validators/sentence-starters.js +132 -0
  138. package/validators/smallcaps.js +67 -0
  139. package/validators/tldr-length.js +58 -0
@@ -0,0 +1,47 @@
1
+ /* ============================================
2
+ BACK MATTER STYLING
3
+ Acknowledgements, About the Author, Back Cover
4
+ ============================================ */
5
+
6
+ /* Acknowledgements — readable spacing */
7
+ #acknowledgements ul {
8
+ font-size: 0.95em;
9
+ line-height: 1.5;
10
+ }
11
+
12
+ #acknowledgements ul li {
13
+ margin-bottom: 0.4em;
14
+ }
15
+
16
+ /* About the Author — distinct opening */
17
+ #about-the-author {
18
+ page-break-before: always;
19
+ border-top: 2px solid #333;
20
+ padding-top: 1.5rem;
21
+ }
22
+
23
+ /* Back cover — distinct treatment */
24
+ .back-cover {
25
+ font-family: var(--font-heading);
26
+ font-size: 1.05em;
27
+ line-height: 1.55;
28
+ margin: 2em 0;
29
+ page-break-before: always;
30
+ }
31
+
32
+ /* Task lists — restore checkboxes stripped by Tailwind preflight */
33
+ .task-list {
34
+ list-style-type: none;
35
+ padding-left: 0;
36
+ }
37
+
38
+ .task-list li {
39
+ position: relative;
40
+ padding-left: 1.75em;
41
+ }
42
+
43
+ .task-list input[type="checkbox"] {
44
+ position: absolute;
45
+ left: 0;
46
+ top: 0.3em;
47
+ }
@@ -0,0 +1,302 @@
1
+ /* ============================================
2
+ DARK MODE - Apple Books, Kobo, Google Play
3
+ Kindle does NOT support prefers-color-scheme.
4
+ Colors adapted for dark backgrounds while
5
+ maintaining WCAG AA contrast (4.5:1 text, 3:1 borders).
6
+ Emoji images keep full opacity (small inline glyphs).
7
+ ============================================ */
8
+ @media (prefers-color-scheme: dark) {
9
+ body {
10
+ background-color: #121212;
11
+ }
12
+
13
+ /* Body text. Must target `.prose` (the <body> carries class="prose"), not
14
+ just `body`: the @media not screen block sets `.prose { color: #000 }` for
15
+ e-ink readability, which strip-page-rules.js unwraps to an unconditional
16
+ top-level rule. Its (0,1,0) specificity outranks a plain `body` (0,0,1)
17
+ rule, so a `body { color }` override here would lose and leave all prose
18
+ text black on the dark canvas. Matching `.prose` (equal specificity, later
19
+ source order) wins.
20
+
21
+ The `color` alone is NOT enough for the web output. Tailwind Typography
22
+ paints descendants (p, strong, em, li, code, smallcaps) via
23
+ `.prose :where(el) { color: var(--tw-prose-*) }` rules that set color
24
+ explicitly — beating the inherited `.prose` color — and those vars default
25
+ to --color-emphasis (#495057) / --color-muted (#6c757d), i.e. 2.29:1 and
26
+ 3.75:1 on #121212. So re-point every text-bearing prose var at the dark
27
+ palette here, or all body/bold/italic/list text is unreadable in dark mode.
28
+ (The EPUB build strips var() and these :where() color rules, so EPUB text
29
+ just inherits the light `.prose` color and is unaffected — this is purely
30
+ for the web/preview HTML, which keeps the full Tailwind prose CSS.) */
31
+ .prose {
32
+ color: #e0e0e0;
33
+ --tw-prose-body: #e0e0e0;
34
+ --tw-prose-headings: #f0f0f0;
35
+ --tw-prose-bold: #f0f0f0;
36
+ --tw-prose-lead: #aaa;
37
+ --tw-prose-counters: #bbb;
38
+ --tw-prose-quotes: #ccc;
39
+ --tw-prose-captions: #bbb;
40
+ --tw-prose-code: #d4d4d4;
41
+ }
42
+
43
+ h1,
44
+ h2,
45
+ h3,
46
+ h4,
47
+ h5,
48
+ h6 {
49
+ color: #f0f0f0;
50
+ }
51
+
52
+ a {
53
+ color: #6cb4ee;
54
+ text-decoration-color: #6cb4ee;
55
+ }
56
+
57
+ /* Code blocks */
58
+ pre {
59
+ background-color: #1e1e1e;
60
+ border-color: #3a3a3a;
61
+ color: #d4d4d4;
62
+ }
63
+
64
+ code {
65
+ background-color: #2a2a2a;
66
+ border-color: #444;
67
+ color: #d4d4d4;
68
+ }
69
+
70
+ pre code {
71
+ background-color: transparent;
72
+ border: none;
73
+ }
74
+
75
+ /* Blockquotes */
76
+ blockquote {
77
+ border-left-color: #555;
78
+ color: #ccc;
79
+ }
80
+
81
+ /* Light-mode readability rules (lines ~1268–1312) set color directly at
82
+ Tailwind-matching specificity — `.prose X:not(.not-prose)` — so they beat
83
+ both the element-level dark overrides above and the --tw-prose-* vars, and
84
+ their children (em/strong/smallcaps) inherit the dark #444/#555. Re-state
85
+ them here at equal specificity; later source order wins. Web output only —
86
+ the EPUB strips these selectors. */
87
+ .prose blockquote:not(.not-prose) {
88
+ color: #ccc;
89
+ }
90
+
91
+ .prose .lead:not(.not-prose) {
92
+ color: #bbb;
93
+ }
94
+
95
+ .prose figcaption:not(.not-prose) {
96
+ color: #bbb;
97
+ }
98
+
99
+ /* Callouts — lighten borders, darken backgrounds */
100
+ .callout-label {
101
+ color: #e0e0e0;
102
+ }
103
+
104
+ .tldr {
105
+ border-left-color: #5588cc;
106
+ background-color: #1a1f2e;
107
+ }
108
+
109
+ .pro-tip {
110
+ border-left-color: #c9a67a;
111
+ background-color: #2a2218;
112
+ }
113
+
114
+ .for-managers {
115
+ border-left-color: #7aa5d2;
116
+ background-color: #1a2233;
117
+ }
118
+
119
+ .for-ics {
120
+ border-left-color: #7aba7e;
121
+ background-color: #1a2a1c;
122
+ }
123
+
124
+ .common-objection {
125
+ border-left-color: #c080a0;
126
+ background-color: #2a1a22;
127
+ }
128
+
129
+ .takeaways {
130
+ border-left-color: #888;
131
+ background-color: #252525;
132
+ }
133
+
134
+ .note,
135
+ .callout {
136
+ border-left-color: #9aabc0;
137
+ background-color: #1c2128;
138
+ }
139
+
140
+ .tip {
141
+ border-left-color: #c9a67a;
142
+ background-color: #2a2218;
143
+ }
144
+
145
+ .warning {
146
+ border-left-color: #d9a04b;
147
+ background-color: #2b2214;
148
+ }
149
+
150
+ /* The "Key takeaways" H3 carries its own `.takeaways h3` color (0,1,1),
151
+ which outranks the dark `h1..h6` (0,0,1) override above — match its
152
+ specificity so the heading lightens on the dark callout background. */
153
+ .takeaways h3 {
154
+ color: #f0f0f0;
155
+ }
156
+
157
+ /* Tables */
158
+ table {
159
+ border-color: #555;
160
+ }
161
+
162
+ table th {
163
+ border-bottom-color: #888;
164
+ color: #f0f0f0;
165
+ }
166
+
167
+ table td {
168
+ border-bottom-color: #333;
169
+ color: #ddd;
170
+ }
171
+
172
+ table tbody tr:nth-child(even) {
173
+ background-color: #1e1e1e;
174
+ }
175
+
176
+ /* Title page. Use element+class selectors (p.subtitle, p.date, div.rights)
177
+ to match the (0,1,1) specificity of the light-mode title-block rules —
178
+ a bare `.subtitle` (0,1,0) override would lose to `p.subtitle`. */
179
+ h1.title {
180
+ border-top-color: #777;
181
+ color: #f0f0f0;
182
+ }
183
+
184
+ p.subtitle {
185
+ border-bottom-color: #777;
186
+ color: #bbb;
187
+ }
188
+
189
+ p.date,
190
+ div.rights {
191
+ color: #aaa;
192
+ }
193
+
194
+ /* Footnotes. `.footnote-ref` carries an explicit `color: #000` (0,1,0) for
195
+ e-ink — match that specificity so the superscript markers lighten on the
196
+ dark canvas instead of rendering black-on-dark. The Kindle build converts
197
+ external links to footnotes, so it has many such markers. */
198
+ .footnotes {
199
+ border-top-color: #444;
200
+ }
201
+
202
+ .footnote-ref {
203
+ color: #e0e0e0;
204
+ }
205
+
206
+ /* HR */
207
+ hr::after {
208
+ color: #777;
209
+ }
210
+
211
+ /* Images — reduce brightness to avoid blinding in dark mode */
212
+ img {
213
+ opacity: 0.85;
214
+ }
215
+
216
+ /* Emoji images keep full opacity — they're small inline glyphs,
217
+ not photos, and dimming makes them hard to read */
218
+ img.emoji {
219
+ opacity: 1;
220
+ }
221
+
222
+ /* Match callout emoji backgrounds to dark-mode callout colors */
223
+ .callout img.callout-emoji,
224
+ .note img.callout-emoji,
225
+ .tip img.callout-emoji,
226
+ .warning img.callout-emoji,
227
+ .pro-tip img.callout-emoji,
228
+ .callout img.emoji,
229
+ .note img.emoji,
230
+ .tip img.emoji,
231
+ .warning img.emoji,
232
+ .pro-tip img.emoji {
233
+ background-color: #2a2218 !important;
234
+ background: #2a2218 !important;
235
+ }
236
+
237
+ .for-managers img.callout-emoji,
238
+ .for-managers img.emoji {
239
+ background-color: #1a2233 !important;
240
+ background: #1a2233 !important;
241
+ }
242
+
243
+ .for-ics img.callout-emoji,
244
+ .for-ics img.emoji {
245
+ background-color: #1a2a1c !important;
246
+ background: #1a2a1c !important;
247
+ }
248
+
249
+ .common-objection img.callout-emoji,
250
+ .common-objection img.emoji {
251
+ background-color: #2a1a22 !important;
252
+ background: #2a1a22 !important;
253
+ }
254
+
255
+ img.emoji {
256
+ background-color: #1a1a1a !important;
257
+ background: #1a1a1a !important;
258
+ }
259
+
260
+ /* Chapter heading borders — hardcoded (not variable) because
261
+ @media (prefers-color-scheme: dark) applies in EPUB which strips var().
262
+ Matches code border-color #444 for visual consistency. */
263
+ .level1 > h1,
264
+ .level2 > h2 {
265
+ border-bottom-color: #444;
266
+ }
267
+
268
+ /* Muted text elements — light gray text becomes invisible on dark backgrounds.
269
+ These elements use gray text (color: #555–#767676) in light mode for
270
+ visual de-emphasis, but need lighter values for dark mode readability. */
271
+ .dedication,
272
+ .lead,
273
+ section.section-opener > p,
274
+ section.section-opener > ul,
275
+ section.section-opener > ol {
276
+ color: #aaa;
277
+ }
278
+
279
+ figcaption {
280
+ color: #bbb;
281
+ }
282
+
283
+ .publisher {
284
+ color: #999;
285
+ }
286
+
287
+ .revision {
288
+ color: #999;
289
+ }
290
+
291
+ .author {
292
+ color: #ddd;
293
+ }
294
+
295
+ #about-the-author {
296
+ border-top-color: #555;
297
+ }
298
+
299
+ .back-cover {
300
+ color: #ddd;
301
+ }
302
+ }