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.
- package/LICENSE +21 -0
- package/NOTICE.md +72 -0
- package/README.md +251 -2
- package/bin/book-kit.js +115 -0
- package/commands/_emoji_io.py +32 -0
- package/commands/audit-chapter-lengths.js +244 -0
- package/commands/check-epub-size.js +68 -0
- package/commands/check-pdf-page-count.js +162 -0
- package/commands/composite-kindle-emoji.py +85 -0
- package/commands/composite-print-emoji.py +98 -0
- package/commands/conventions.js +76 -0
- package/commands/convert-pdfx.sh +194 -0
- package/commands/download-icc-profile.sh +105 -0
- package/commands/fonts.py +212 -0
- package/commands/generate-reference-docx.py +344 -0
- package/commands/kindle-fonts.js +173 -0
- package/commands/links-to-footnotes.js +366 -0
- package/commands/markdownlint.js +25 -0
- package/commands/minify-css.js +43 -0
- package/commands/optimize-images.js +73 -0
- package/commands/parity.sh +150 -0
- package/commands/postprocess-epub.js +541 -0
- package/commands/prep-print-src.js +77 -0
- package/commands/prose.js +38 -0
- package/commands/release-files.js +89 -0
- package/commands/reorder-print-frontmatter.js +79 -0
- package/commands/strip-page-rules.js +1168 -0
- package/commands/strip-property-rules.js +93 -0
- package/commands/update-key-takeaways.js +314 -0
- package/commands/validate.js +283 -0
- package/configs/markdownlint-cli2.jsonc +98 -0
- package/configs/textlintrc.json +22 -0
- package/css/theme/01-tokens.css +83 -0
- package/css/theme/02-fonts.css +79 -0
- package/css/theme/03-prose.css +53 -0
- package/css/theme/04-base.css +226 -0
- package/css/theme/05-components.css +546 -0
- package/css/theme/06-utilities.css +40 -0
- package/css/theme/07-ereader.css +245 -0
- package/css/theme/08-epub.css +865 -0
- package/css/theme/09-back-matter.css +47 -0
- package/css/theme/10-dark.css +302 -0
- package/css/theme/11-print.css +1229 -0
- package/css/theme.css +38 -0
- package/defaults/book.config.yml +318 -0
- package/defaults/pandoc-base.yml +19 -0
- package/defaults/pandoc-docx.yml +6 -0
- package/defaults/pandoc-epub-fonts.yml +6 -0
- package/defaults/pandoc-epub.yml +15 -0
- package/defaults/pandoc-kindle.yml +6 -0
- package/emoji/1f382.png +0 -0
- package/emoji/1f389.png +0 -0
- package/emoji/1f440.png +0 -0
- package/emoji/1f44d.png +0 -0
- package/emoji/1f44f.png +0 -0
- package/emoji/1f454.png +0 -0
- package/emoji/1f4a1.png +0 -0
- package/emoji/1f4bb.png +0 -0
- package/emoji/1f602.png +0 -0
- package/emoji/1f603.png +0 -0
- package/emoji/1f604.png +0 -0
- package/emoji/1f60a.png +0 -0
- package/emoji/1f60f.png +0 -0
- package/emoji/1f64c.png +0 -0
- package/emoji/1f64f.png +0 -0
- package/emoji/1f914.png +0 -0
- package/emoji/1f923.png +0 -0
- package/emoji/2714.png +0 -0
- package/emoji/274c.png +0 -0
- package/filters/add-div-titles.lua +196 -0
- package/filters/arc-notice.lua +36 -0
- package/filters/body-emoji-images.lua +48 -0
- package/filters/callout-classes.lua +40 -0
- package/filters/lib/book_kit.lua +110 -0
- package/filters/revision.lua +17 -0
- package/filters/strip-comments.lua +40 -0
- package/filters/strip-emoji-kindle.lua +134 -0
- package/fonts/LICENSE-source-code-pro.md +93 -0
- package/fonts/LICENSE-source-sans.md +93 -0
- package/fonts/LICENSE-source-serif.md +93 -0
- package/fonts/recipe.json +41 -0
- package/just/book-kit.just +229 -0
- package/lib/acronyms.js +47 -0
- package/lib/callouts.js +17 -0
- package/lib/config.js +211 -0
- package/lib/is-main.js +21 -0
- package/lib/lint.js +148 -0
- package/lib/pandoc.js +148 -0
- package/lib/paragraphs.js +173 -0
- package/lib/revision.js +35 -0
- package/lib/structure.js +39 -0
- package/lib/textlint-github-formatter.js +58 -0
- package/lib/validate.js +202 -0
- package/package.json +98 -4
- package/presets/business-nonfiction/CONVENTIONS.md +35 -0
- package/presets/business-nonfiction/preset.yml +128 -0
- package/profiles/pdfx-def.ps +42 -0
- package/requirements.txt +14 -0
- package/rules/no-ai-like-patterns.js +209 -0
- package/rules/no-assumptive.js +76 -0
- package/rules/no-bare-acronyms.js +129 -0
- package/rules/no-cliches.js +544 -0
- package/rules/no-cultural-idioms.js +422 -0
- package/rules/no-vague-intensifiers.js +94 -0
- package/templates/template-epub.html +79 -0
- package/templates/template.html +73 -0
- package/toolchain.json +42 -0
- package/validators/acronym-expansion.js +94 -0
- package/validators/bold-keywords.js +56 -0
- package/validators/callout-balance.js +74 -0
- package/validators/callout-divs.js +66 -0
- package/validators/callout-labels.js +102 -0
- package/validators/chapter-lengths.js +14 -0
- package/validators/chapter.js +57 -0
- package/validators/cross-references.js +45 -0
- package/validators/doubled-words.js +76 -0
- package/validators/duplicate-headings.js +52 -0
- package/validators/em-dashes.js +73 -0
- package/validators/escaped-smallcaps.js +46 -0
- package/validators/footnotes.js +78 -0
- package/validators/heading-hierarchy.js +58 -0
- package/validators/hypothetical-hooks.js +103 -0
- package/validators/index-integrity.js +28 -0
- package/validators/index.js +73 -0
- package/validators/list-punctuation.js +123 -0
- package/validators/min-opener-length.js +87 -0
- package/validators/no-bare-url-link-text.js +38 -0
- package/validators/no-todo-markers.js +49 -0
- package/validators/no-transition-todos.js +34 -0
- package/validators/number-range-dashes.js +72 -0
- package/validators/paragraph-length.js +62 -0
- package/validators/quote-punctuation.js +85 -0
- package/validators/section-intro-final-lead.js +90 -0
- package/validators/section-intro-has-lead.js +41 -0
- package/validators/section-intro-no-tldr.js +37 -0
- package/validators/section-intros.js +33 -0
- package/validators/sentence-starters.js +132 -0
- package/validators/smallcaps.js +67 -0
- 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
|
+
}
|