@open-press/cli 0.3.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 (178) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/cli.js +365 -0
  4. package/package.json +57 -0
  5. package/template/core/.turbo/turbo-test.log +341 -0
  6. package/template/core/CHANGELOG.md +11 -0
  7. package/template/core/README.md +36 -0
  8. package/template/core/engine/chrome-pdf.d.mts +34 -0
  9. package/template/core/engine/chrome-pdf.mjs +344 -0
  10. package/template/core/engine/cli.mjs +93 -0
  11. package/template/core/engine/commands/_shared.mjs +170 -0
  12. package/template/core/engine/commands/deploy.mjs +31 -0
  13. package/template/core/engine/commands/dev.mjs +26 -0
  14. package/template/core/engine/commands/export.mjs +8 -0
  15. package/template/core/engine/commands/init.mjs +24 -0
  16. package/template/core/engine/commands/inspect.mjs +35 -0
  17. package/template/core/engine/commands/migrate-to-react.mjs +27 -0
  18. package/template/core/engine/commands/pdf.mjs +26 -0
  19. package/template/core/engine/commands/preview.mjs +26 -0
  20. package/template/core/engine/commands/render.mjs +17 -0
  21. package/template/core/engine/commands/replace.mjs +41 -0
  22. package/template/core/engine/commands/search.mjs +33 -0
  23. package/template/core/engine/commands/typecheck.mjs +5 -0
  24. package/template/core/engine/commands/validate.mjs +17 -0
  25. package/template/core/engine/config.d.mts +40 -0
  26. package/template/core/engine/config.mjs +160 -0
  27. package/template/core/engine/deploy-sync.mjs +15 -0
  28. package/template/core/engine/document-export.mjs +15 -0
  29. package/template/core/engine/file-utils.mjs +106 -0
  30. package/template/core/engine/fonts.mjs +62 -0
  31. package/template/core/engine/init.mjs +90 -0
  32. package/template/core/engine/inspection.mjs +348 -0
  33. package/template/core/engine/issue-report.mjs +44 -0
  34. package/template/core/engine/katex-assets.mjs +45 -0
  35. package/template/core/engine/page-block.mjs +30 -0
  36. package/template/core/engine/page-renderer.mjs +217 -0
  37. package/template/core/engine/pdf-media.mjs +45 -0
  38. package/template/core/engine/public-assets.mjs +19 -0
  39. package/template/core/engine/react/chapter-css.mjs +53 -0
  40. package/template/core/engine/react/comment-endpoint.d.mts +11 -0
  41. package/template/core/engine/react/comment-endpoint.mjs +128 -0
  42. package/template/core/engine/react/comment-marker.mjs +306 -0
  43. package/template/core/engine/react/document-entry.mjs +253 -0
  44. package/template/core/engine/react/document-export.mjs +392 -0
  45. package/template/core/engine/react/mdx-compile.mjs +295 -0
  46. package/template/core/engine/react/measurement-css.mjs +44 -0
  47. package/template/core/engine/react/migrate-to-react.mjs +355 -0
  48. package/template/core/engine/react/pagination-constants.mjs +3 -0
  49. package/template/core/engine/react/pagination.mjs +121 -0
  50. package/template/core/engine/react/project-asset-endpoint.d.mts +10 -0
  51. package/template/core/engine/react/project-asset-endpoint.mjs +379 -0
  52. package/template/core/engine/react/workspace-discovery.mjs +156 -0
  53. package/template/core/engine/source-text-tools.mjs +280 -0
  54. package/template/core/engine/source-workspace.mjs +76 -0
  55. package/template/core/engine/static-server.mjs +493 -0
  56. package/template/core/engine/validation.mjs +172 -0
  57. package/template/core/index.html +13 -0
  58. package/template/core/openpress.config.mjs +12 -0
  59. package/template/core/package.json +86 -0
  60. package/template/core/src/main.tsx +16 -0
  61. package/template/core/src/openpress/App.tsx +127 -0
  62. package/template/core/src/openpress/composerMentions.ts +188 -0
  63. package/template/core/src/openpress/core/basePages.tsx +87 -0
  64. package/template/core/src/openpress/core/index.tsx +20 -0
  65. package/template/core/src/openpress/core/types.ts +71 -0
  66. package/template/core/src/openpress/frameScheduler.ts +32 -0
  67. package/template/core/src/openpress/indexes.ts +329 -0
  68. package/template/core/src/openpress/inspector.ts +282 -0
  69. package/template/core/src/openpress/pageRoute.ts +21 -0
  70. package/template/core/src/openpress/pagination.ts +845 -0
  71. package/template/core/src/openpress/projectIdentity.ts +15 -0
  72. package/template/core/src/openpress/projectSources.ts +24 -0
  73. package/template/core/src/openpress/projectWorkspace.tsx +919 -0
  74. package/template/core/src/openpress/publicPage.tsx +469 -0
  75. package/template/core/src/openpress/reactDocumentMetadata.ts +41 -0
  76. package/template/core/src/openpress/readerPageRegistry.ts +41 -0
  77. package/template/core/src/openpress/readerRuntime.ts +230 -0
  78. package/template/core/src/openpress/readerScroll.ts +92 -0
  79. package/template/core/src/openpress/readerState.ts +15 -0
  80. package/template/core/src/openpress/renderer.tsx +91 -0
  81. package/template/core/src/openpress/runtimeMode.ts +22 -0
  82. package/template/core/src/openpress/types.ts +112 -0
  83. package/template/core/src/openpress/workbench.tsx +1299 -0
  84. package/template/core/src/openpress/workbenchPanels.tsx +122 -0
  85. package/template/core/src/openpress/workbenchTypes.ts +4 -0
  86. package/template/core/src/styles/openpress/app-shell.css +251 -0
  87. package/template/core/src/styles/openpress/media-workspace.css +230 -0
  88. package/template/core/src/styles/openpress/print-route.css +186 -0
  89. package/template/core/src/styles/openpress/project-workspace.css +1318 -0
  90. package/template/core/src/styles/openpress/public-viewer.css +983 -0
  91. package/template/core/src/styles/openpress/reader-runtime.css +792 -0
  92. package/template/core/src/styles/openpress/responsive.css +384 -0
  93. package/template/core/src/styles/openpress/workbench-panels.css +558 -0
  94. package/template/core/src/styles/openpress/workbench.css +720 -0
  95. package/template/core/src/styles/openpress.css +14 -0
  96. package/template/core/src/vite-env.d.ts +9 -0
  97. package/template/core/tsconfig.json +37 -0
  98. package/template/core/vite.config.ts +512 -0
  99. package/template/skills/chinese-ai-writing-polish/SKILL.md +195 -0
  100. package/template/skills/claude-document/SKILL.md +66 -0
  101. package/template/skills/claude-document/starter/document/chapters/01-document-shape/chapter.tsx +30 -0
  102. package/template/skills/claude-document/starter/document/chapters/01-document-shape/content/01-document-shape.mdx +51 -0
  103. package/template/skills/claude-document/starter/document/chapters/02-review-loop/chapter.tsx +30 -0
  104. package/template/skills/claude-document/starter/document/chapters/02-review-loop/content/01-review-loop.mdx +31 -0
  105. package/template/skills/claude-document/starter/document/components/ChapterOpenerVisual.tsx +96 -0
  106. package/template/skills/claude-document/starter/document/components/Page.tsx +27 -0
  107. package/template/skills/claude-document/starter/document/design.md +142 -0
  108. package/template/skills/claude-document/starter/document/index.tsx +89 -0
  109. package/template/skills/claude-document/starter/document/media/README.md +13 -0
  110. package/template/skills/claude-document/starter/document/openpress.config.mjs +26 -0
  111. package/template/skills/claude-document/starter/document/theme/README.md +15 -0
  112. package/template/skills/claude-document/starter/document/theme/base/page-contract.css +525 -0
  113. package/template/skills/claude-document/starter/document/theme/base/print.css +93 -0
  114. package/template/skills/claude-document/starter/document/theme/base/typography.css +612 -0
  115. package/template/skills/claude-document/starter/document/theme/fonts.css +4 -0
  116. package/template/skills/claude-document/starter/document/theme/page-surfaces/back-cover.css +72 -0
  117. package/template/skills/claude-document/starter/document/theme/page-surfaces/chapter-opener.css +236 -0
  118. package/template/skills/claude-document/starter/document/theme/page-surfaces/cover.css +309 -0
  119. package/template/skills/claude-document/starter/document/theme/page-surfaces/toc.css +213 -0
  120. package/template/skills/claude-document/starter/document/theme/patterns/_chart-frame.css +53 -0
  121. package/template/skills/claude-document/starter/document/theme/patterns/figure-grid.css +68 -0
  122. package/template/skills/claude-document/starter/document/theme/patterns/table-utilities.css +66 -0
  123. package/template/skills/claude-document/starter/document/theme/shell/reader-controls.css +789 -0
  124. package/template/skills/claude-document/starter/document/theme/tokens.css +89 -0
  125. package/template/skills/claude-document/starter/openpress.config.mjs +5 -0
  126. package/template/skills/editorial-monograph/SKILL.md +73 -0
  127. package/template/skills/editorial-monograph/starter/document/chapters/01-product-and-use-cases/content/01-product-and-use-cases.mdx +31 -0
  128. package/template/skills/editorial-monograph/starter/document/chapters/02-workflow/content/01-workflow.mdx +89 -0
  129. package/template/skills/editorial-monograph/starter/document/chapters/03-agent-skills-contributors/content/01-agent-skills-contributors.mdx +52 -0
  130. package/template/skills/editorial-monograph/starter/document/chapters/04-validation-deploy/content/01-validation-deploy.mdx +39 -0
  131. package/template/skills/editorial-monograph/starter/document/components/ChapterOpenerVisual/index.tsx +76 -0
  132. package/template/skills/editorial-monograph/starter/document/components/Page.tsx +27 -0
  133. package/template/skills/editorial-monograph/starter/document/components/TokenSwatchGrid/index.tsx +46 -0
  134. package/template/skills/editorial-monograph/starter/document/components/TokenSwatchGrid/style.css +63 -0
  135. package/template/skills/editorial-monograph/starter/document/components/TypeSpecimen/index.tsx +38 -0
  136. package/template/skills/editorial-monograph/starter/document/components/TypeSpecimen/style.css +111 -0
  137. package/template/skills/editorial-monograph/starter/document/design.md +279 -0
  138. package/template/skills/editorial-monograph/starter/document/index.tsx +73 -0
  139. package/template/skills/editorial-monograph/starter/document/media/README.md +13 -0
  140. package/template/skills/editorial-monograph/starter/document/openpress.config.mjs +26 -0
  141. package/template/skills/editorial-monograph/starter/document/theme/README.md +11 -0
  142. package/template/skills/editorial-monograph/starter/document/theme/base/page-contract.css +505 -0
  143. package/template/skills/editorial-monograph/starter/document/theme/base/print.css +93 -0
  144. package/template/skills/editorial-monograph/starter/document/theme/base/typography.css +336 -0
  145. package/template/skills/editorial-monograph/starter/document/theme/fonts.css +3 -0
  146. package/template/skills/editorial-monograph/starter/document/theme/page-surfaces/back-cover.css +43 -0
  147. package/template/skills/editorial-monograph/starter/document/theme/page-surfaces/chapter-opener.css +205 -0
  148. package/template/skills/editorial-monograph/starter/document/theme/page-surfaces/cover.css +147 -0
  149. package/template/skills/editorial-monograph/starter/document/theme/page-surfaces/toc.css +139 -0
  150. package/template/skills/editorial-monograph/starter/document/theme/patterns/_chart-frame.css +49 -0
  151. package/template/skills/editorial-monograph/starter/document/theme/patterns/figure-grid.css +68 -0
  152. package/template/skills/editorial-monograph/starter/document/theme/patterns/table-utilities.css +66 -0
  153. package/template/skills/editorial-monograph/starter/document/theme/shell/reader-controls.css +761 -0
  154. package/template/skills/editorial-monograph/starter/document/theme/tokens.css +80 -0
  155. package/template/skills/editorial-monograph/starter/openpress.config.mjs +5 -0
  156. package/template/skills/openpress/SKILL.md +114 -0
  157. package/template/skills/openpress/references/cli-commands.md +31 -0
  158. package/template/skills/openpress/references/local-review.md +43 -0
  159. package/template/skills/openpress-deploy/SKILL.md +69 -0
  160. package/template/skills/openpress-deploy/references/cloudflare-pages.md +51 -0
  161. package/template/skills/openpress-design/SKILL.md +51 -0
  162. package/template/skills/openpress-design/references/pdf-safe-css.md +29 -0
  163. package/template/skills/openpress-design/references/responsive-fixed-layout.md +48 -0
  164. package/template/skills/openpress-design/references/theme-and-components.md +77 -0
  165. package/template/skills/openpress-diagram-drawing/SKILL.md +44 -0
  166. package/template/skills/openpress-diagram-drawing/references/diagram-patterns.md +93 -0
  167. package/template/skills/openpress-document-hierarchy/SKILL.md +81 -0
  168. package/template/skills/openpress-document-hierarchy/agents/openai.yaml +4 -0
  169. package/template/skills/openpress-document-hierarchy/references/data-structures-outline.md +115 -0
  170. package/template/skills/openpress-init/SKILL.md +84 -0
  171. package/template/skills/openpress-style-pack-contributor/SKILL.md +62 -0
  172. package/template/skills/openpress-style-pack-contributor/references/starter-contract.md +49 -0
  173. package/template/skills/openpress-update/SKILL.md +88 -0
  174. package/template/skills/openpress-writing/SKILL.md +68 -0
  175. package/template/skills/openpress-writing/references/source-and-writing-rules.md +120 -0
  176. package/template/skills/teaching-notes-writing/SKILL.md +54 -0
  177. package/template/skills/teaching-notes-writing/references/programming.md +65 -0
  178. package/template/skills/teaching-notes-writing/references/teaching-patterns.md +60 -0
@@ -0,0 +1,236 @@
1
+ /* page-surfaces / chapter-opener
2
+ * H2-only chapter divider for book-like working documents.
3
+ */
4
+
5
+ .reader-page--chapter-opener {
6
+ position: relative;
7
+ overflow: hidden;
8
+ background-color: var(--openpress-color-document);
9
+ background-image:
10
+ var(--openpress-paper-texture),
11
+ linear-gradient(90deg, rgba(168, 148, 112, 0.07), transparent 44%);
12
+ background-size: var(--openpress-paper-texture-size), auto;
13
+ background-position: var(--openpress-paper-texture-position), 0 0;
14
+ }
15
+
16
+ .reader-page--chapter-opener:has(.chapter-opener-illustration) {
17
+ --chapter-opener-bg: #6f9f8a;
18
+ --chapter-opener-ink: #101211;
19
+ --chapter-opener-title: #1f2d3d;
20
+ --chapter-opener-paper: var(--openpress-color-paper);
21
+ background-color: var(--chapter-opener-bg);
22
+ background-image: none;
23
+ }
24
+
25
+ .reader-page--chapter-opener:has(.chapter-opener-tone--sage) {
26
+ --chapter-opener-bg: #6f9f8a;
27
+ --chapter-opener-title: #1f2d3d;
28
+ --chapter-opener-paper: #fbfaf6;
29
+ }
30
+
31
+ .reader-page--chapter-opener:has(.chapter-opener-tone--lavender) {
32
+ --chapter-opener-bg: #8680bf;
33
+ --chapter-opener-title: #101211;
34
+ --chapter-opener-paper: #fbfaf6;
35
+ }
36
+
37
+ .reader-page--chapter-opener:has(.chapter-opener-tone--mint) {
38
+ --chapter-opener-bg: #bfd4cd;
39
+ --chapter-opener-title: #101211;
40
+ --chapter-opener-paper: #fbfaf6;
41
+ }
42
+
43
+ .reader-page--chapter-opener:has(.chapter-opener-tone--amber) {
44
+ --chapter-opener-bg: #d7b56d;
45
+ --chapter-opener-title: #101211;
46
+ --chapter-opener-paper: #fffaf0;
47
+ }
48
+
49
+ .reader-page--chapter-opener::before {
50
+ content: "";
51
+ position: absolute;
52
+ inset: 0 auto 0 0;
53
+ width: 6mm;
54
+ border-right: 1px solid var(--openpress-color-line);
55
+ background: rgba(243, 234, 219, 0.52);
56
+ }
57
+
58
+ .reader-page--chapter-opener:has(.chapter-opener-illustration)::before {
59
+ content: none;
60
+ }
61
+
62
+ .reader-page--chapter-opener .page-frame {
63
+ background: transparent;
64
+ }
65
+
66
+ .reader-page--chapter-opener .page-body {
67
+ position: relative;
68
+ display: flex;
69
+ flex-direction: column;
70
+ justify-content: center;
71
+ gap: clamp(20px, 3.4cqw, 40px);
72
+ width: min(138mm, 84%);
73
+ max-width: none;
74
+ min-height: 0;
75
+ margin-inline: auto;
76
+ padding-bottom: 4mm;
77
+ z-index: 1;
78
+ }
79
+
80
+ .reader-page--chapter-opener:has(.chapter-opener-illustration) .page-body {
81
+ justify-content: flex-end;
82
+ align-items: flex-start;
83
+ width: min(168mm, 86%);
84
+ padding-bottom: 28mm;
85
+ gap: clamp(10px, 1.8cqw, 20px);
86
+ z-index: 2;
87
+ }
88
+
89
+ .reader-page--chapter-opener .page-body::before {
90
+ content: none;
91
+ }
92
+
93
+ .reader-page--chapter-opener:has(.chapter-opener-illustration) .chapter-opener-body {
94
+ display: contents;
95
+ }
96
+
97
+ .chapter-opener-illustration {
98
+ position: absolute;
99
+ top: 26mm;
100
+ right: 18mm;
101
+ width: min(98mm, 48%);
102
+ margin: 0;
103
+ color: var(--chapter-opener-ink, #101211);
104
+ z-index: 1;
105
+ }
106
+
107
+ .chapter-opener-illustration svg {
108
+ display: block;
109
+ width: 100%;
110
+ height: auto;
111
+ overflow: visible;
112
+ }
113
+
114
+ .chapter-opener-illustration__paper {
115
+ fill: var(--chapter-opener-paper, var(--openpress-color-paper));
116
+ }
117
+
118
+ .chapter-opener-illustration__stroke,
119
+ .chapter-opener-illustration__arrow,
120
+ .chapter-opener-illustration__thin {
121
+ fill: none;
122
+ stroke: currentColor;
123
+ stroke-linecap: round;
124
+ stroke-linejoin: round;
125
+ }
126
+
127
+ .chapter-opener-illustration__stroke,
128
+ .chapter-opener-illustration__arrow {
129
+ stroke-width: 14;
130
+ }
131
+
132
+ .chapter-opener-illustration__thin {
133
+ stroke-width: 8;
134
+ }
135
+
136
+ .chapter-opener-illustration__node,
137
+ .chapter-opener-illustration__dot {
138
+ fill: currentColor;
139
+ }
140
+
141
+ .chapter-opener-kicker {
142
+ display: none;
143
+ }
144
+
145
+ .reader-page--chapter-opener:has(.chapter-opener-illustration) .chapter-opener-kicker {
146
+ display: inline-flex;
147
+ align-items: center;
148
+ width: fit-content;
149
+ min-height: 8mm;
150
+ margin: 0 0 clamp(4px, 1cqw, 10px);
151
+ padding: 0 7mm;
152
+ border: 1px solid currentColor;
153
+ border-radius: 999px;
154
+ color: var(--chapter-opener-ink, #101211);
155
+ font-family: var(--openpress-font-body);
156
+ font-size: clamp(
157
+ calc(10pt - var(--openpress-type-step-down)),
158
+ calc(1.8cqw - var(--openpress-type-step-down)),
159
+ calc(14pt - var(--openpress-type-step-down))
160
+ );
161
+ font-weight: 700;
162
+ line-height: 1;
163
+ letter-spacing: 0;
164
+ }
165
+
166
+ .chapter-opener-title {
167
+ max-width: 100%;
168
+ margin: 0;
169
+ color: var(--openpress-color-ink);
170
+ font-family: var(--openpress-font-body);
171
+ font-size: clamp(
172
+ calc(38px - var(--openpress-type-step-down)),
173
+ calc(8.7cqw - var(--openpress-type-step-down)),
174
+ calc(68px - var(--openpress-type-step-down))
175
+ );
176
+ font-weight: 300;
177
+ line-height: 1;
178
+ letter-spacing: 0;
179
+ }
180
+
181
+ .reader-page--chapter-opener:has(.chapter-opener-illustration) .chapter-opener-title {
182
+ max-width: 118mm;
183
+ color: var(--chapter-opener-title, var(--openpress-color-ink));
184
+ font-family: var(--openpress-font-serif);
185
+ font-size: clamp(
186
+ calc(52px - var(--openpress-type-step-down)),
187
+ calc(12.4cqw - var(--openpress-type-step-down)),
188
+ calc(112px - var(--openpress-type-step-down))
189
+ );
190
+ line-height: 0.92;
191
+ letter-spacing: 0;
192
+ }
193
+
194
+ .chapter-opener-title::before {
195
+ content: none;
196
+ }
197
+
198
+ .chapter-opener-subtitle {
199
+ max-width: 112mm;
200
+ margin: 0;
201
+ color: var(--openpress-color-ink);
202
+ font-family: var(--openpress-font-body);
203
+ font-size: clamp(
204
+ calc(18pt - var(--openpress-type-step-down)),
205
+ calc(3.8cqw - var(--openpress-type-step-down)),
206
+ calc(28pt - var(--openpress-type-step-down))
207
+ );
208
+ line-height: 1.32;
209
+ font-weight: 400;
210
+ letter-spacing: 0;
211
+ }
212
+
213
+ .reader-page--chapter-opener:has(.chapter-opener-illustration) .chapter-opener-subtitle {
214
+ max-width: 100mm;
215
+ color: var(--chapter-opener-title, var(--openpress-color-ink));
216
+ }
217
+
218
+ .chapter-opener-summary {
219
+ max-width: 108mm;
220
+ margin: 0;
221
+ color: var(--openpress-color-body);
222
+ font-size: clamp(
223
+ calc(9.8pt - var(--openpress-type-step-down)),
224
+ calc(1.7cqw - var(--openpress-type-step-down)),
225
+ calc(11.2pt - var(--openpress-type-step-down))
226
+ );
227
+ line-height: 1.7;
228
+ }
229
+
230
+ .chapter-opener-body > :first-child {
231
+ margin-top: 0;
232
+ }
233
+
234
+ .chapter-opener-body > :last-child {
235
+ margin-bottom: 0;
236
+ }
@@ -0,0 +1,309 @@
1
+ /* page-surfaces / cover
2
+ * Cover and back-cover share most of their layout chrome (meta header, byline
3
+ * footer, central main column). Shared selectors live here so cover is the
4
+ * primary reference; back-cover.css only refines the parts that differ.
5
+ */
6
+
7
+ .reader-page--cover,
8
+ .reader-page--back-cover {
9
+ position: relative;
10
+ overflow: hidden;
11
+ --chapter-opener-bg: #a95f32;
12
+ --chapter-opener-ink: #101820;
13
+ --chapter-opener-title: #f7f9fb;
14
+ --chapter-opener-paper: #f7f9fb;
15
+ --cover-muted: rgba(247, 249, 251, 0.68);
16
+ --cover-rule: rgba(247, 249, 251, 0.34);
17
+ background-color: var(--chapter-opener-bg);
18
+ background-image: none;
19
+ padding: 22mm 22mm 18mm 27mm;
20
+ flex-direction: column;
21
+ justify-content: space-between;
22
+ gap: 10mm;
23
+ }
24
+
25
+ .reader-page--cover::before,
26
+ .reader-page--back-cover::before {
27
+ content: none;
28
+ }
29
+
30
+ .reader-page--cover::after,
31
+ .reader-page--back-cover::after {
32
+ content: none;
33
+ }
34
+
35
+ .reader-app.is-ready .reader-page.reader-page--cover,
36
+ .reader-app.is-ready .reader-page.reader-page--back-cover,
37
+ .reader-page.reader-page--cover.is-active,
38
+ .reader-page.reader-page--back-cover.is-active {
39
+ display: flex;
40
+ }
41
+
42
+ .cover-meta,
43
+ .back-cover-meta {
44
+ position: absolute;
45
+ top: 22mm;
46
+ right: 22mm;
47
+ z-index: 2;
48
+ display: flex;
49
+ justify-content: space-between;
50
+ align-items: flex-start;
51
+ gap: var(--openpress-space-3);
52
+ padding-bottom: 0;
53
+ border-bottom: 0;
54
+ font-family: var(--openpress-font-body);
55
+ font-size: clamp(
56
+ calc(8pt - var(--openpress-type-step-down)),
57
+ calc(1.25cqw - var(--openpress-type-step-down)),
58
+ calc(9.5pt - var(--openpress-type-step-down))
59
+ );
60
+ color: var(--chapter-opener-title);
61
+ letter-spacing: 0.08em;
62
+ flex-shrink: 0;
63
+ }
64
+
65
+ .mihua-logo,
66
+ .openpress-logo {
67
+ display: block;
68
+ width: clamp(112px, 18cqw, 154px);
69
+ height: auto;
70
+ flex-shrink: 0;
71
+ object-fit: contain;
72
+ }
73
+
74
+ .cover-meta-title {
75
+ margin-left: auto;
76
+ max-width: none;
77
+ padding: 0;
78
+ border: 0;
79
+ background: transparent;
80
+ text-align: right;
81
+ white-space: nowrap;
82
+ }
83
+
84
+ .cover-main,
85
+ .back-cover-main {
86
+ position: absolute;
87
+ left: 27mm;
88
+ right: 22mm;
89
+ bottom: 36mm;
90
+ z-index: 2;
91
+ display: flex;
92
+ flex-direction: column;
93
+ flex: none;
94
+ min-height: 0;
95
+ justify-content: flex-end;
96
+ align-items: flex-start;
97
+ max-width: 124mm;
98
+ padding-bottom: 0;
99
+ }
100
+
101
+ .cover-title,
102
+ .back-cover-title {
103
+ margin: 0;
104
+ max-width: 118mm;
105
+ font-family: var(--openpress-font-serif);
106
+ font-size: clamp(
107
+ calc(56px - var(--openpress-type-step-down)),
108
+ calc(12.2cqw - var(--openpress-type-step-down)),
109
+ calc(112px - var(--openpress-type-step-down))
110
+ );
111
+ font-weight: 700;
112
+ line-height: 0.92;
113
+ letter-spacing: 0;
114
+ color: var(--chapter-opener-title);
115
+ }
116
+
117
+ .cover-tagline {
118
+ margin: 6mm 0 0;
119
+ font-family: var(--openpress-font-body);
120
+ font-size: clamp(
121
+ calc(13pt - var(--openpress-type-step-down)),
122
+ calc(2.25cqw - var(--openpress-type-step-down)),
123
+ calc(17pt - var(--openpress-type-step-down))
124
+ );
125
+ font-weight: 400;
126
+ letter-spacing: 0;
127
+ text-transform: none;
128
+ color: var(--chapter-opener-title);
129
+ }
130
+
131
+ .cover-rule,
132
+ .back-cover-rule {
133
+ height: 1px;
134
+ width: 38mm;
135
+ background: var(--openpress-color-line-strong);
136
+ margin: 7mm 0 8mm;
137
+ }
138
+
139
+ .cover-subtitle {
140
+ margin: 5mm 0 0;
141
+ font-family: var(--openpress-font-body);
142
+ font-size: clamp(
143
+ calc(10.5pt - var(--openpress-type-step-down)),
144
+ calc(1.95cqw - var(--openpress-type-step-down)),
145
+ calc(13pt - var(--openpress-type-step-down))
146
+ );
147
+ font-weight: 400;
148
+ letter-spacing: 0;
149
+ line-height: 1.6;
150
+ color: var(--chapter-opener-title);
151
+ max-width: 112mm;
152
+ }
153
+
154
+ .cover-summary {
155
+ margin: var(--openpress-space-2) 0 0;
156
+ font-family: var(--openpress-font-body);
157
+ font-size: clamp(
158
+ calc(9pt - var(--openpress-type-step-down)),
159
+ calc(1.65cqw - var(--openpress-type-step-down)),
160
+ calc(10.5pt - var(--openpress-type-step-down))
161
+ );
162
+ line-height: 1.8;
163
+ color: var(--openpress-color-body);
164
+ max-width: 122mm;
165
+ }
166
+
167
+ .cover-scope {
168
+ display: flex;
169
+ flex-wrap: wrap;
170
+ gap: 0 4.5mm;
171
+ width: 100%;
172
+ max-width: 124mm;
173
+ margin-top: 8mm;
174
+ padding-top: 4mm;
175
+ border-top: 1px solid var(--cover-rule);
176
+ }
177
+
178
+ .cover-scope span {
179
+ min-width: 0;
180
+ padding: 0;
181
+ border-left: 0;
182
+ font-family: var(--openpress-font-mono);
183
+ font-size: calc(8pt - var(--openpress-type-step-down));
184
+ line-height: 1.3;
185
+ letter-spacing: 0.05em;
186
+ color: var(--chapter-opener-title);
187
+ white-space: nowrap;
188
+ }
189
+
190
+ .cover-scope span + span::before {
191
+ content: "/";
192
+ margin-right: 4.5mm;
193
+ color: rgba(247, 249, 251, 0.36);
194
+ }
195
+
196
+ .cover-author {
197
+ display: inline-grid;
198
+ grid-template-columns: auto auto;
199
+ column-gap: 4mm;
200
+ align-items: baseline;
201
+ margin: 8mm 0 0;
202
+ padding-top: 4mm;
203
+ border-top: 1px solid var(--cover-rule);
204
+ color: var(--chapter-opener-title);
205
+ font-family: var(--openpress-font-body);
206
+ font-size: clamp(
207
+ calc(10.8pt - var(--openpress-type-step-down)),
208
+ calc(1.78cqw - var(--openpress-type-step-down)),
209
+ calc(13pt - var(--openpress-type-step-down))
210
+ );
211
+ line-height: 1.3;
212
+ }
213
+
214
+ .cover-author span {
215
+ color: var(--cover-muted);
216
+ font-family: var(--openpress-font-mono);
217
+ font-size: 0.78em;
218
+ font-weight: 400;
219
+ letter-spacing: 0.12em;
220
+ text-transform: uppercase;
221
+ }
222
+
223
+ .cover-author strong {
224
+ color: var(--chapter-opener-title);
225
+ font-weight: 500;
226
+ letter-spacing: 0.05em;
227
+ }
228
+
229
+ .reader-page--cover .chapter-opener-illustration,
230
+ .reader-page--back-cover .chapter-opener-illustration {
231
+ position: absolute;
232
+ top: 26mm;
233
+ right: 18mm;
234
+ width: min(96mm, 46%);
235
+ margin: 0;
236
+ color: var(--chapter-opener-ink);
237
+ filter: none;
238
+ z-index: 1;
239
+ }
240
+
241
+ .cover-visual,
242
+ .back-cover-visual {
243
+ margin: var(--openpress-space-3) 0 0;
244
+ flex-shrink: 0;
245
+ }
246
+
247
+ .cover-visual img,
248
+ .back-cover-visual img {
249
+ display: block;
250
+ width: 100%;
251
+ height: auto;
252
+ max-height: 22cqh;
253
+ object-fit: cover;
254
+ border: 0;
255
+ padding: 0;
256
+ background: transparent;
257
+ }
258
+
259
+ .cover-byline,
260
+ .back-cover-byline {
261
+ position: absolute;
262
+ left: 27mm;
263
+ right: 22mm;
264
+ bottom: 22mm;
265
+ z-index: 2;
266
+ display: flex;
267
+ justify-content: space-between;
268
+ align-items: baseline;
269
+ padding-top: 0;
270
+ border-top: 0;
271
+ font-family: var(--openpress-font-body);
272
+ font-size: clamp(
273
+ calc(8pt - var(--openpress-type-step-down)),
274
+ calc(1.25cqw - var(--openpress-type-step-down)),
275
+ calc(9.5pt - var(--openpress-type-step-down))
276
+ );
277
+ color: var(--cover-muted);
278
+ letter-spacing: 0.08em;
279
+ flex-shrink: 0;
280
+ }
281
+
282
+ .cover-byline span:first-child,
283
+ .back-cover-byline span:first-child {
284
+ font-family: var(--openpress-font-body);
285
+ font-weight: 400;
286
+ letter-spacing: 0;
287
+ color: var(--chapter-opener-title);
288
+ }
289
+
290
+ .lecture-mark {
291
+ display: inline-grid;
292
+ place-items: center;
293
+ width: auto;
294
+ min-width: 21mm;
295
+ height: 8mm;
296
+ margin: 0 0 7mm;
297
+ padding: 0 3.5mm;
298
+ border: 1px solid currentColor;
299
+ background: transparent;
300
+ font-family: var(--openpress-font-body);
301
+ font-size: clamp(
302
+ calc(9pt - var(--openpress-type-step-down)),
303
+ calc(1.8cqw - var(--openpress-type-step-down)),
304
+ calc(12pt - var(--openpress-type-step-down))
305
+ );
306
+ font-weight: 700;
307
+ letter-spacing: 0;
308
+ color: var(--chapter-opener-title);
309
+ }