@open-press/core 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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/engine/chrome-pdf.d.mts +34 -0
  4. package/engine/chrome-pdf.mjs +344 -0
  5. package/engine/cli.mjs +93 -0
  6. package/engine/commands/_shared.mjs +170 -0
  7. package/engine/commands/deploy.mjs +31 -0
  8. package/engine/commands/dev.mjs +26 -0
  9. package/engine/commands/export.mjs +8 -0
  10. package/engine/commands/init.mjs +24 -0
  11. package/engine/commands/inspect.mjs +35 -0
  12. package/engine/commands/migrate-to-react.mjs +27 -0
  13. package/engine/commands/pdf.mjs +26 -0
  14. package/engine/commands/preview.mjs +26 -0
  15. package/engine/commands/render.mjs +17 -0
  16. package/engine/commands/replace.mjs +41 -0
  17. package/engine/commands/search.mjs +33 -0
  18. package/engine/commands/typecheck.mjs +5 -0
  19. package/engine/commands/validate.mjs +17 -0
  20. package/engine/config.d.mts +40 -0
  21. package/engine/config.mjs +160 -0
  22. package/engine/deploy-sync.mjs +15 -0
  23. package/engine/document-export.mjs +15 -0
  24. package/engine/file-utils.mjs +106 -0
  25. package/engine/fonts.mjs +62 -0
  26. package/engine/init.mjs +90 -0
  27. package/engine/inspection.mjs +348 -0
  28. package/engine/issue-report.mjs +44 -0
  29. package/engine/katex-assets.mjs +45 -0
  30. package/engine/page-block.mjs +30 -0
  31. package/engine/page-renderer.mjs +217 -0
  32. package/engine/pdf-media.mjs +45 -0
  33. package/engine/public-assets.mjs +19 -0
  34. package/engine/react/chapter-css.mjs +53 -0
  35. package/engine/react/comment-endpoint.d.mts +11 -0
  36. package/engine/react/comment-endpoint.mjs +128 -0
  37. package/engine/react/comment-marker.mjs +306 -0
  38. package/engine/react/document-entry.mjs +253 -0
  39. package/engine/react/document-export.mjs +392 -0
  40. package/engine/react/mdx-compile.mjs +295 -0
  41. package/engine/react/measurement-css.mjs +44 -0
  42. package/engine/react/migrate-to-react.mjs +355 -0
  43. package/engine/react/pagination-constants.mjs +3 -0
  44. package/engine/react/pagination.mjs +121 -0
  45. package/engine/react/project-asset-endpoint.d.mts +10 -0
  46. package/engine/react/project-asset-endpoint.mjs +379 -0
  47. package/engine/react/workspace-discovery.mjs +156 -0
  48. package/engine/source-text-tools.mjs +280 -0
  49. package/engine/source-workspace.mjs +76 -0
  50. package/engine/static-server.mjs +493 -0
  51. package/engine/validation.mjs +172 -0
  52. package/index.html +13 -0
  53. package/package.json +86 -0
  54. package/src/openpress/App.tsx +127 -0
  55. package/src/openpress/composerMentions.ts +188 -0
  56. package/src/openpress/core/basePages.tsx +87 -0
  57. package/src/openpress/core/index.tsx +20 -0
  58. package/src/openpress/core/types.ts +71 -0
  59. package/src/openpress/frameScheduler.ts +32 -0
  60. package/src/openpress/indexes.ts +329 -0
  61. package/src/openpress/inspector.ts +282 -0
  62. package/src/openpress/pageRoute.ts +21 -0
  63. package/src/openpress/pagination.ts +845 -0
  64. package/src/openpress/projectIdentity.ts +15 -0
  65. package/src/openpress/projectSources.ts +24 -0
  66. package/src/openpress/projectWorkspace.tsx +919 -0
  67. package/src/openpress/publicPage.tsx +469 -0
  68. package/src/openpress/reactDocumentMetadata.ts +41 -0
  69. package/src/openpress/readerPageRegistry.ts +41 -0
  70. package/src/openpress/readerRuntime.ts +230 -0
  71. package/src/openpress/readerScroll.ts +92 -0
  72. package/src/openpress/readerState.ts +15 -0
  73. package/src/openpress/renderer.tsx +91 -0
  74. package/src/openpress/runtimeMode.ts +22 -0
  75. package/src/openpress/types.ts +112 -0
  76. package/src/openpress/workbench.tsx +1299 -0
  77. package/src/openpress/workbenchPanels.tsx +122 -0
  78. package/src/openpress/workbenchTypes.ts +4 -0
  79. package/src/styles/openpress/app-shell.css +251 -0
  80. package/src/styles/openpress/media-workspace.css +230 -0
  81. package/src/styles/openpress/print-route.css +186 -0
  82. package/src/styles/openpress/project-workspace.css +1318 -0
  83. package/src/styles/openpress/public-viewer.css +983 -0
  84. package/src/styles/openpress/reader-runtime.css +792 -0
  85. package/src/styles/openpress/responsive.css +384 -0
  86. package/src/styles/openpress/workbench-panels.css +558 -0
  87. package/src/styles/openpress/workbench.css +720 -0
  88. package/src/styles/openpress.css +14 -0
  89. package/tsconfig.json +37 -0
  90. package/vite.config.ts +512 -0
@@ -0,0 +1,983 @@
1
+ .openpress-public-viewer.reader-app,
2
+ .openpress-public-viewer.openpress-reader-app {
3
+ width: 100%;
4
+ height: 100dvh;
5
+ min-height: 100dvh;
6
+ --openpress-public-nav-min-width: 340px;
7
+ --openpress-public-nav-max-width: 420px;
8
+ --openpress-public-page-width: min(var(--openpress-page-width), 860px);
9
+ --openpress-public-nav-width: clamp(var(--openpress-public-nav-min-width), calc(100vw - var(--openpress-public-page-width) - 48px), var(--openpress-public-nav-max-width));
10
+ --openpress-public-nav-max-height: 960px;
11
+ display: grid;
12
+ grid-template-rows: minmax(0, 1fr);
13
+ grid-template-columns: var(--openpress-public-nav-width) minmax(0, 1fr);
14
+ grid-template-areas: "left main";
15
+ overflow: hidden;
16
+ background: #141414;
17
+ }
18
+
19
+ .openpress-dev-public-viewer {
20
+ position: relative;
21
+ }
22
+
23
+ .openpress-public-viewer .openpress-public-viewer__stage {
24
+ min-width: 0;
25
+ min-height: 0;
26
+ container-type: inline-size;
27
+ overflow: hidden;
28
+ overscroll-behavior: none;
29
+ touch-action: pan-y pinch-zoom;
30
+ background: #141414;
31
+ }
32
+
33
+ .openpress-public-viewer .openpress-dev-main-content {
34
+ grid-area: main;
35
+ }
36
+
37
+ .openpress-public-viewer .reader-stage {
38
+ overflow-x: hidden;
39
+ overflow-y: auto;
40
+ overscroll-behavior-x: none;
41
+ overscroll-behavior-y: contain;
42
+ -webkit-overflow-scrolling: touch;
43
+ touch-action: pan-y pinch-zoom;
44
+ }
45
+
46
+ .openpress-public-viewer .reader-pages {
47
+ padding: 30px 24px 56px;
48
+ }
49
+
50
+ .openpress-public-viewer .openpress-html-page {
51
+ width: fit-content;
52
+ max-width: 100%;
53
+ margin: 0 auto 12px;
54
+ }
55
+
56
+ .openpress-public-viewer .openpress-html-page__html .reader-page {
57
+ width: var(--openpress-public-page-width);
58
+ height: calc(var(--openpress-public-page-width) * var(--openpress-page-height-ratio, 1.4142857143));
59
+ aspect-ratio: var(--openpress-page-aspect-ratio, 210 / 297);
60
+ }
61
+
62
+ .openpress-public-viewer .reader-side-nav {
63
+ position: relative;
64
+ z-index: 2;
65
+ grid-area: left;
66
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
67
+ }
68
+
69
+ /* FAB / scrim / drawer-close: hidden on desktop, shown via media query */
70
+ .openpress-public-fab,
71
+ .openpress-public-scrim,
72
+ .openpress-public-drawer-close {
73
+ display: none;
74
+ }
75
+
76
+
77
+ .openpress-public-viewer .openpress-public-navigation {
78
+ align-self: center;
79
+ min-width: 0;
80
+ height: min(100vh, var(--openpress-public-nav-max-height));
81
+ max-height: 100vh;
82
+ margin-top: 0;
83
+ border-right: 0;
84
+ border-left: 0;
85
+ overflow: hidden;
86
+ background: #141414;
87
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
88
+ }
89
+
90
+ .openpress-public-viewer .openpress-dev-public-navigation {
91
+ grid-template-rows: auto auto minmax(0, 1fr) auto auto;
92
+ }
93
+
94
+ .openpress-public-viewer[data-active-workspace="project"] .openpress-dev-public-navigation {
95
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
96
+ }
97
+
98
+ .openpress-public-identity {
99
+ display: grid;
100
+ gap: 8px;
101
+ padding: 22px 22px 16px;
102
+ }
103
+
104
+ .openpress-public-identity > span {
105
+ color: rgb(160 166 173 / 42%);
106
+ font-size: 9px;
107
+ font-weight: 500;
108
+ line-height: 1;
109
+ letter-spacing: 0.1em;
110
+ text-transform: uppercase;
111
+ }
112
+
113
+ .openpress-public-identity strong {
114
+ display: grid;
115
+ gap: 4px;
116
+ overflow: visible;
117
+ max-width: none;
118
+ color: rgb(242 242 240 / 92%);
119
+ text-wrap: balance;
120
+ word-break: keep-all;
121
+ }
122
+
123
+ .openpress-public-title-main {
124
+ color: rgb(242 242 240 / 94%);
125
+ font-family: var(--openpress-font-serif);
126
+ font-size: 28px;
127
+ font-weight: 500;
128
+ line-height: 1.05;
129
+ }
130
+
131
+ .openpress-public-title-sub {
132
+ max-width: 15em;
133
+ color: rgb(214 218 222 / 78%);
134
+ font-size: 13px;
135
+ font-weight: 500;
136
+ line-height: 1.42;
137
+ }
138
+
139
+ .openpress-public-actions {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: 16px;
143
+ flex-wrap: wrap;
144
+ padding: 0 22px 18px;
145
+ }
146
+
147
+ .openpress-public-action-section {
148
+ display: grid;
149
+ gap: 8px;
150
+ padding: 0 22px 16px;
151
+ }
152
+
153
+ .openpress-public-action-heading {
154
+ color: rgb(160 166 173 / 46%);
155
+ font-size: 9px;
156
+ font-weight: 600;
157
+ line-height: 1;
158
+ letter-spacing: 0.12em;
159
+ text-transform: uppercase;
160
+ }
161
+
162
+ .openpress-public-action-list {
163
+ display: grid;
164
+ border-top: 1px solid rgb(255 255 255 / 8%);
165
+ }
166
+
167
+ .openpress-public-action-entry {
168
+ display: grid;
169
+ grid-template-columns: 15px minmax(0, 1fr) auto;
170
+ align-items: center;
171
+ width: 100%;
172
+ min-width: 0;
173
+ min-height: 34px;
174
+ gap: 8px;
175
+ border: 0 !important;
176
+ border-bottom: 1px solid rgb(255 255 255 / 7%) !important;
177
+ padding: 8px 0 !important;
178
+ background: transparent !important;
179
+ box-shadow: none !important;
180
+ color: rgb(198 204 210 / 76%);
181
+ font: inherit;
182
+ font-size: 11px;
183
+ font-weight: 500;
184
+ line-height: 1.25;
185
+ letter-spacing: 0.04em;
186
+ text-align: left;
187
+ text-decoration: none;
188
+ cursor: pointer;
189
+ }
190
+
191
+ .openpress-public-action-entry:hover:not(:disabled) {
192
+ color: rgb(242 242 240 / 92%);
193
+ }
194
+
195
+ .openpress-public-action-entry:disabled {
196
+ cursor: progress;
197
+ opacity: 0.62;
198
+ }
199
+
200
+ .openpress-public-action-entry svg {
201
+ width: 13px;
202
+ height: 13px;
203
+ color: currentColor;
204
+ opacity: 0.78;
205
+ }
206
+
207
+ .openpress-public-action-entry__label {
208
+ overflow: hidden;
209
+ min-width: 0;
210
+ text-overflow: ellipsis;
211
+ white-space: nowrap;
212
+ }
213
+
214
+ .openpress-public-action-entry .openpress-dev-pdf-status {
215
+ justify-self: end;
216
+ overflow: hidden;
217
+ min-width: 0;
218
+ max-width: 100%;
219
+ text-overflow: ellipsis;
220
+ white-space: nowrap;
221
+ }
222
+
223
+ .openpress-public-action-entry .openpress-dev-deploy-status {
224
+ justify-self: end;
225
+ }
226
+
227
+ .openpress-public-action-entry[data-openpress-deploy-status="dirty"] {
228
+ color: rgb(240 182 76 / 92%);
229
+ }
230
+
231
+ .openpress-public-export-button {
232
+ display: inline-flex;
233
+ align-items: center;
234
+ width: auto;
235
+ height: auto;
236
+ min-width: 0;
237
+ justify-content: flex-start;
238
+ gap: 6px;
239
+ border: 0 !important;
240
+ padding: 0 !important;
241
+ background: transparent !important;
242
+ box-shadow: none;
243
+ color: rgb(198 204 210 / 68%);
244
+ font-size: 11px;
245
+ font-weight: 500;
246
+ line-height: 1.3;
247
+ letter-spacing: 0.08em;
248
+ opacity: 0.88;
249
+ text-decoration: none;
250
+ cursor: pointer;
251
+ }
252
+
253
+ .openpress-public-export-button:hover:not(:disabled) {
254
+ color: rgb(242 242 240 / 88%);
255
+ opacity: 1;
256
+ }
257
+
258
+ .openpress-public-export-button:disabled {
259
+ cursor: default;
260
+ opacity: 0.5;
261
+ }
262
+
263
+ .openpress-public-export-button svg {
264
+ width: 12px;
265
+ height: 12px;
266
+ color: currentColor;
267
+ opacity: 0.8;
268
+ }
269
+
270
+ .openpress-public-export-button:focus-visible {
271
+ outline: 1px solid rgb(242 242 240 / 28%);
272
+ outline-offset: 4px;
273
+ }
274
+
275
+ .openpress-view-mode-section {
276
+ padding-bottom: 18px;
277
+ }
278
+
279
+ .openpress-view-mode-toggle {
280
+ display: grid;
281
+ grid-template-columns: repeat(2, minmax(0, 1fr));
282
+ gap: 6px;
283
+ }
284
+
285
+ .openpress-view-mode-toggle button {
286
+ display: inline-flex;
287
+ align-items: center;
288
+ justify-content: center;
289
+ gap: 6px;
290
+ min-width: 0;
291
+ min-height: 34px;
292
+ border: 1px solid rgb(255 255 255 / 11%);
293
+ border-radius: 0;
294
+ padding: 0 10px;
295
+ background: rgb(255 255 255 / 3%);
296
+ color: rgb(198 204 210 / 72%);
297
+ font: inherit;
298
+ font-size: 11px;
299
+ font-weight: 600;
300
+ line-height: 1;
301
+ letter-spacing: 0.04em;
302
+ cursor: pointer;
303
+ }
304
+
305
+ .openpress-view-mode-toggle button:hover:not(:disabled),
306
+ .openpress-view-mode-toggle button.is-active {
307
+ border-color: rgb(242 242 240 / 38%);
308
+ background: rgb(242 242 240 / 10%);
309
+ color: rgb(242 242 240 / 95%);
310
+ }
311
+
312
+ .openpress-view-mode-toggle button:disabled {
313
+ cursor: not-allowed;
314
+ opacity: 0.42;
315
+ }
316
+
317
+ .openpress-view-mode-toggle svg {
318
+ width: 13px;
319
+ height: 13px;
320
+ flex: 0 0 auto;
321
+ }
322
+
323
+ .openpress-public-viewer[data-openpress-view-mode="reading"] {
324
+ --openpress-reading-width: min(100%, 880px);
325
+ --openpress-reading-measure: min(100%, 760px);
326
+ }
327
+
328
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .openpress-public-viewer__stage,
329
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-stage {
330
+ background: var(--openpress-color-document);
331
+ }
332
+
333
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-pages {
334
+ align-items: stretch;
335
+ width: 100%;
336
+ max-width: none;
337
+ gap: 0;
338
+ padding: 0;
339
+ background: var(--openpress-color-document);
340
+ }
341
+
342
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .openpress-html-page {
343
+ width: 100%;
344
+ max-width: none;
345
+ margin: 0;
346
+ scroll-margin-top: 0;
347
+ }
348
+
349
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .openpress-html-page__html {
350
+ width: 100%;
351
+ }
352
+
353
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .openpress-html-page__html .reader-page,
354
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .openpress-html-page__html .reader-page--cover,
355
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .openpress-html-page__html .reader-page--back-cover {
356
+ width: 100%;
357
+ height: auto;
358
+ min-height: 0;
359
+ max-height: none;
360
+ margin: 0;
361
+ overflow: visible;
362
+ box-shadow: none;
363
+ }
364
+
365
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content {
366
+ background: transparent;
367
+ background-image: none;
368
+ }
369
+
370
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--toc {
371
+ min-height: min(100svh, 980px);
372
+ color: var(--toc-ink, #f7f9fb);
373
+ background-color: #1f2d3d;
374
+ background-image: none;
375
+ }
376
+
377
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content .page-frame,
378
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--toc .page-frame {
379
+ display: block;
380
+ width: var(--openpress-reading-width);
381
+ height: auto;
382
+ min-height: 0;
383
+ margin: 0 auto;
384
+ padding: clamp(34px, 6vw, 72px) clamp(22px, 5vw, 48px);
385
+ }
386
+
387
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content .page-header,
388
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content .page-footer,
389
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--toc .page-header,
390
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--toc .page-footer {
391
+ display: none;
392
+ }
393
+
394
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content .page-body,
395
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--toc .page-body {
396
+ width: var(--openpress-reading-measure);
397
+ min-height: 0;
398
+ margin: 0 auto;
399
+ overflow: visible;
400
+ }
401
+
402
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--cover,
403
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--back-cover,
404
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--chapter-opener {
405
+ width: 100%;
406
+ min-height: min(100svh, 980px);
407
+ max-height: none;
408
+ }
409
+
410
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--cover,
411
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--back-cover {
412
+ padding: clamp(42px, 9vw, 96px) clamp(28px, 7vw, 86px);
413
+ }
414
+
415
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .cover-main,
416
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .back-cover-main {
417
+ position: relative;
418
+ right: auto;
419
+ bottom: auto;
420
+ left: auto;
421
+ width: min(100%, 640px);
422
+ max-width: none;
423
+ margin-top: auto;
424
+ }
425
+
426
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .cover-meta,
427
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .back-cover-meta,
428
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .cover-byline,
429
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .back-cover-byline {
430
+ position: relative;
431
+ inset: auto;
432
+ right: auto;
433
+ left: auto;
434
+ }
435
+
436
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .cover-byline,
437
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .back-cover-byline {
438
+ margin-top: clamp(42px, 8vw, 82px);
439
+ }
440
+
441
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--cover .chapter-opener-illustration,
442
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--back-cover .chapter-opener-illustration {
443
+ position: relative;
444
+ top: auto;
445
+ right: auto;
446
+ width: min(100%, 420px);
447
+ margin: clamp(42px, 9vw, 110px) auto clamp(26px, 6vw, 56px);
448
+ }
449
+
450
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--chapter-opener {
451
+ display: grid;
452
+ align-content: center;
453
+ padding: clamp(42px, 9vw, 96px) clamp(28px, 7vw, 86px);
454
+ }
455
+
456
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content h2 {
457
+ margin-top: 0;
458
+ font-size: clamp(2.05rem, 5vw, 3.8rem);
459
+ }
460
+
461
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content h3 {
462
+ margin-top: clamp(28px, 5vw, 48px);
463
+ font-size: clamp(1.28rem, 3.2vw, 1.78rem);
464
+ }
465
+
466
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content h4 {
467
+ margin-top: clamp(22px, 4vw, 34px);
468
+ font-size: clamp(1.05rem, 2.5vw, 1.25rem);
469
+ }
470
+
471
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content p,
472
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content li {
473
+ font-size: clamp(1rem, 2.55vw, 1.12rem);
474
+ line-height: 1.9;
475
+ }
476
+
477
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content pre {
478
+ max-width: 100%;
479
+ overflow-x: auto;
480
+ overflow-y: hidden;
481
+ -webkit-overflow-scrolling: touch;
482
+ white-space: pre;
483
+ }
484
+
485
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content pre code {
486
+ min-width: max-content;
487
+ white-space: pre;
488
+ font-size: clamp(0.86rem, 2.45vw, 1rem);
489
+ }
490
+
491
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content table {
492
+ display: table;
493
+ width: 100%;
494
+ max-width: 100%;
495
+ overflow: visible;
496
+ -webkit-overflow-scrolling: touch;
497
+ white-space: normal;
498
+ }
499
+
500
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure {
501
+ width: min(100%, 960px);
502
+ max-width: none;
503
+ margin-right: auto;
504
+ margin-left: auto;
505
+ overflow-x: auto;
506
+ -webkit-overflow-scrolling: touch;
507
+ }
508
+
509
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure img,
510
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure svg {
511
+ max-width: 100%;
512
+ height: auto;
513
+ }
514
+
515
+ @media (max-width: 899px) {
516
+ .openpress-public-viewer[data-openpress-view-mode="reading"] {
517
+ --openpress-reading-edge: 18px;
518
+ --openpress-reading-full-bleed: calc(100dvw - (var(--openpress-reading-edge) * 2));
519
+ }
520
+
521
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content .page-frame,
522
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--toc .page-frame {
523
+ width: 100%;
524
+ padding-inline: var(--openpress-reading-edge);
525
+ }
526
+
527
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content .page-body,
528
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--toc .page-body {
529
+ width: 100%;
530
+ }
531
+
532
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content table,
533
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure {
534
+ width: var(--openpress-reading-full-bleed);
535
+ max-width: var(--openpress-reading-full-bleed);
536
+ margin-inline: calc((100% - var(--openpress-reading-full-bleed)) / 2);
537
+ border-color: var(--openpress-color-line);
538
+ background: var(--openpress-color-block);
539
+ box-sizing: border-box;
540
+ }
541
+
542
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content table {
543
+ display: block;
544
+ padding-bottom: 8px;
545
+ border: 1px solid var(--openpress-color-line-strong);
546
+ border-collapse: separate;
547
+ border-spacing: 0;
548
+ overflow-x: auto;
549
+ -webkit-overflow-scrolling: touch;
550
+ white-space: nowrap;
551
+ box-shadow: inset -18px 0 18px -22px rgb(31 45 61 / 40%);
552
+ }
553
+
554
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content table caption {
555
+ position: sticky;
556
+ left: 0;
557
+ display: block;
558
+ width: max-content;
559
+ min-width: 100%;
560
+ padding: 7px 0 0;
561
+ background: var(--openpress-color-block);
562
+ }
563
+
564
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content table th,
565
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content table td {
566
+ min-width: 116px;
567
+ padding: 9px 10px;
568
+ white-space: nowrap;
569
+ }
570
+
571
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure {
572
+ padding: 0;
573
+ overflow-x: auto;
574
+ overflow-y: hidden;
575
+ box-shadow: inset -18px 0 18px -22px rgb(31 45 61 / 42%);
576
+ }
577
+
578
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure.openpress-component-frame {
579
+ overflow: visible;
580
+ background: transparent;
581
+ box-shadow: none;
582
+ }
583
+
584
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure.chart-frame {
585
+ padding: 12px;
586
+ }
587
+
588
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .reader-page--content figure figcaption {
589
+ position: sticky;
590
+ left: 0;
591
+ width: max-content;
592
+ min-width: 100%;
593
+ margin-top: 10px;
594
+ padding-top: 2px;
595
+ background: var(--openpress-color-block);
596
+ }
597
+
598
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .linked-list-diagram__panel,
599
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .linked-stack-push__canvas {
600
+ overflow: visible;
601
+ }
602
+
603
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .linked-list-diagram__svg,
604
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .linked-stack-push__svg,
605
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .chart-frame svg {
606
+ width: 100%;
607
+ min-width: 0;
608
+ max-width: 100%;
609
+ }
610
+
611
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .list-operation-demo__canvas {
612
+ overflow-x: auto;
613
+ }
614
+
615
+ .openpress-public-viewer[data-openpress-view-mode="reading"] .list-operation-demo__chain {
616
+ min-width: max-content;
617
+ }
618
+ }
619
+
620
+ .openpress-dev-pdf-status {
621
+ display: inline-flex;
622
+ align-items: center;
623
+ gap: 6px;
624
+ max-width: 100%;
625
+ color: rgb(198 204 210 / 70%);
626
+ font-size: 10px;
627
+ font-weight: 500;
628
+ line-height: 1.4;
629
+ }
630
+
631
+ .openpress-dev-pdf-status__spinner {
632
+ width: 10px;
633
+ height: 10px;
634
+ flex: 0 0 auto;
635
+ border: 1px solid rgb(240 182 76 / 28%);
636
+ border-top-color: rgb(240 182 76 / 90%);
637
+ border-radius: 50%;
638
+ animation: openpress-pdf-status-spin 0.8s linear infinite;
639
+ }
640
+
641
+ .openpress-dev-pdf-status[data-openpress-pdf-status="opening"] {
642
+ color: rgb(110 231 160 / 82%);
643
+ }
644
+
645
+ .openpress-dev-pdf-status[data-openpress-pdf-status="opening"] .openpress-dev-pdf-status__spinner {
646
+ border-color: rgb(110 231 160 / 30%);
647
+ border-top-color: rgb(110 231 160 / 92%);
648
+ }
649
+
650
+ .openpress-dev-pdf-status[data-openpress-pdf-status="failed"] {
651
+ color: rgb(248 113 113 / 86%);
652
+ }
653
+
654
+ .openpress-dev-pdf-status[data-openpress-pdf-status="failed"] .openpress-dev-pdf-status__spinner {
655
+ border-color: rgb(248 113 113 / 30%);
656
+ border-top-color: rgb(248 113 113 / 92%);
657
+ animation: none;
658
+ }
659
+
660
+ @keyframes openpress-pdf-status-spin {
661
+ to {
662
+ transform: rotate(360deg);
663
+ }
664
+ }
665
+
666
+ .openpress-dev-public-tools {
667
+ display: grid;
668
+ gap: 10px;
669
+ padding: 0 22px 18px;
670
+ }
671
+
672
+ .openpress-dev-workspace-switcher {
673
+ display: grid;
674
+ grid-template-columns: repeat(3, minmax(0, 1fr));
675
+ gap: 18px;
676
+ border-bottom: 1px solid rgb(255 255 255 / 8%);
677
+ }
678
+
679
+ .openpress-dev-project-tabs {
680
+ display: grid;
681
+ width: fit-content;
682
+ grid-template-columns: repeat(2, max-content);
683
+ gap: 18px;
684
+ border-bottom: 1px solid rgb(255 255 255 / 8%);
685
+ }
686
+
687
+ .openpress-dev-workspace-switcher button,
688
+ .openpress-dev-project-tabs button,
689
+ .openpress-dev-deploy-button {
690
+ position: relative;
691
+ min-width: 0;
692
+ border: 0;
693
+ background: transparent;
694
+ color: rgb(180 186 193 / 72%);
695
+ font: inherit;
696
+ cursor: pointer;
697
+ }
698
+
699
+ .openpress-dev-workspace-switcher button,
700
+ .openpress-dev-project-tabs button {
701
+ display: inline-flex;
702
+ align-items: center;
703
+ justify-content: flex-start;
704
+ gap: 6px;
705
+ padding: 0 0 10px;
706
+ font-size: 12px;
707
+ font-weight: 500;
708
+ line-height: 1.2;
709
+ letter-spacing: 0;
710
+ text-align: left;
711
+ }
712
+
713
+ .openpress-dev-workspace-switcher button:hover,
714
+ .openpress-dev-workspace-switcher button.is-active,
715
+ .openpress-dev-project-tabs button:hover,
716
+ .openpress-dev-project-tabs button[aria-pressed="true"],
717
+ .openpress-dev-deploy-button:hover:not(:disabled) {
718
+ color: rgb(242 242 240 / 94%);
719
+ background: transparent;
720
+ }
721
+
722
+ .openpress-dev-workspace-switcher button::after,
723
+ .openpress-dev-project-tabs button::after {
724
+ position: absolute;
725
+ right: 0;
726
+ bottom: -1px;
727
+ left: 0;
728
+ height: 1px;
729
+ background: transparent;
730
+ content: "";
731
+ }
732
+
733
+ .openpress-dev-workspace-switcher button.is-active::after,
734
+ .openpress-dev-project-tabs button[aria-pressed="true"]::after {
735
+ background: rgb(242 242 240 / 78%);
736
+ }
737
+
738
+ .openpress-dev-workspace-switcher svg,
739
+ .openpress-dev-project-tabs svg {
740
+ width: 13px;
741
+ height: 13px;
742
+ flex: 0 0 auto;
743
+ color: currentColor;
744
+ opacity: 0.78;
745
+ }
746
+
747
+ .openpress-dev-workspace-switcher span,
748
+ .openpress-dev-project-tabs span {
749
+ overflow: hidden;
750
+ max-width: 100%;
751
+ text-overflow: ellipsis;
752
+ white-space: nowrap;
753
+ }
754
+
755
+ .openpress-dev-deploy-button {
756
+ display: inline-flex;
757
+ width: fit-content;
758
+ align-items: center;
759
+ gap: 6px;
760
+ padding: 0;
761
+ color: rgb(240 182 76 / 80%);
762
+ font-size: 11px;
763
+ font-weight: 500;
764
+ line-height: 1.3;
765
+ letter-spacing: 0.08em;
766
+ }
767
+
768
+ .openpress-dev-deploy-button svg {
769
+ width: 13px;
770
+ height: 13px;
771
+ }
772
+
773
+ .openpress-dev-deploy-button:disabled {
774
+ cursor: progress;
775
+ opacity: 0.58;
776
+ }
777
+
778
+ .openpress-dev-deploy-status {
779
+ display: inline-flex;
780
+ align-items: center;
781
+ gap: 6px;
782
+ color: rgb(150 156 163 / 68%);
783
+ font-size: 10px;
784
+ font-weight: 500;
785
+ line-height: 1.3;
786
+ letter-spacing: 0.08em;
787
+ white-space: nowrap;
788
+ }
789
+
790
+ .openpress-dev-deploy-status__dot {
791
+ width: 7px;
792
+ height: 7px;
793
+ flex: 0 0 auto;
794
+ border-radius: 999px;
795
+ background: rgb(150 156 163 / 62%);
796
+ box-shadow: 0 0 0 1px rgb(255 255 255 / 12%);
797
+ }
798
+
799
+ .openpress-dev-deploy-status[data-openpress-deploy-status="online"] {
800
+ color: rgb(110 231 160 / 86%);
801
+ }
802
+
803
+ .openpress-dev-deploy-status[data-openpress-deploy-status="online"] .openpress-dev-deploy-status__dot {
804
+ background: #6ee7a0;
805
+ box-shadow: 0 0 0 1px rgb(110 231 160 / 28%), 0 0 14px rgb(110 231 160 / 18%);
806
+ }
807
+
808
+ .openpress-dev-deploy-status[data-openpress-deploy-status="deploying"] {
809
+ color: rgb(240 182 76 / 88%);
810
+ }
811
+
812
+ .openpress-dev-deploy-status[data-openpress-deploy-status="deploying"] .openpress-dev-deploy-status__dot {
813
+ background: #f0b64c;
814
+ box-shadow: 0 0 0 1px rgb(240 182 76 / 24%), 0 0 14px rgb(240 182 76 / 16%);
815
+ }
816
+
817
+ .openpress-dev-deploy-status[data-openpress-deploy-status="dirty"] {
818
+ color: rgb(240 182 76 / 90%);
819
+ }
820
+
821
+ .openpress-dev-deploy-status[data-openpress-deploy-status="dirty"] .openpress-dev-deploy-status__dot {
822
+ background: #f0b64c;
823
+ box-shadow: 0 0 0 1px rgb(240 182 76 / 24%), 0 0 14px rgb(240 182 76 / 16%);
824
+ }
825
+
826
+ .openpress-dev-deploy-status[data-openpress-deploy-status="failed"] {
827
+ color: rgb(248 113 113 / 88%);
828
+ }
829
+
830
+ .openpress-dev-deploy-status[data-openpress-deploy-status="failed"] .openpress-dev-deploy-status__dot {
831
+ background: #f87171;
832
+ box-shadow: 0 0 0 1px rgb(248 113 113 / 24%), 0 0 14px rgb(248 113 113 / 16%);
833
+ }
834
+
835
+ .openpress-dev-panel-section {
836
+ padding: 0 22px 22px;
837
+ color: rgb(170 176 183 / 72%);
838
+ font-size: 12px;
839
+ line-height: 1.5;
840
+ }
841
+
842
+ .openpress-dev-panel-section p {
843
+ margin: 0;
844
+ }
845
+
846
+ .openpress-public-viewer .openpress-panel-section--current {
847
+ border-bottom: 0;
848
+ padding: 14px 0 20px;
849
+ }
850
+
851
+ .openpress-public-viewer .openpress-current-page-card {
852
+ gap: 6px;
853
+ padding: 0 22px;
854
+ }
855
+
856
+ .openpress-public-viewer .openpress-current-page-card__number {
857
+ color: rgb(242 242 240 / 84%);
858
+ font-size: 18px;
859
+ letter-spacing: 0.05em;
860
+ }
861
+
862
+ .openpress-public-viewer .openpress-current-page-card__prefix {
863
+ color: rgb(160 166 173 / 58%);
864
+ font-size: 10px;
865
+ }
866
+
867
+ .openpress-public-viewer .openpress-current-page-card__number .sep,
868
+ .openpress-public-viewer .openpress-current-page-card__number [data-openpress-total-pages] {
869
+ font-size: 12px;
870
+ }
871
+
872
+ .openpress-public-viewer .openpress-current-page-card__title {
873
+ color: rgb(155 161 168 / 74%);
874
+ font-size: 11px;
875
+ }
876
+
877
+ .openpress-public-viewer .openpress-current-page-card__progress {
878
+ background: rgb(255 255 255 / 7%);
879
+ }
880
+
881
+ .openpress-public-viewer .openpress-current-page-card__progress span {
882
+ background: rgb(242 242 240 / 46%);
883
+ }
884
+
885
+ .openpress-public-viewer .openpress-panel-section--bookmarks {
886
+ display: grid;
887
+ grid-template-rows: minmax(0, 1fr);
888
+ min-height: 0;
889
+ padding-top: 0;
890
+ overflow: hidden;
891
+ }
892
+
893
+ .openpress-public-viewer .openpress-panel-heading {
894
+ padding: 0 22px 10px;
895
+ color: rgb(160 166 173 / 52%);
896
+ font-size: 9px;
897
+ }
898
+
899
+ .openpress-public-viewer .reader-side-nav .reader-bookmarks {
900
+ min-height: 0;
901
+ overflow: auto;
902
+ padding: 0 22px 22px;
903
+ }
904
+
905
+ .openpress-public-viewer .reader-bookmarks-rail {
906
+ display: none;
907
+ }
908
+
909
+ .openpress-public-viewer .bookmark-item {
910
+ column-gap: 8px;
911
+ color: rgb(150 156 163 / 72%);
912
+ }
913
+
914
+ .openpress-public-viewer .bookmark-item:hover,
915
+ .openpress-public-viewer .bookmark-item.is-active {
916
+ color: rgb(242 242 240 / 92%);
917
+ }
918
+
919
+ .openpress-public-viewer .bookmark-h2 {
920
+ grid-template-columns: 24px minmax(0, 1fr);
921
+ padding: 8px 0 7px;
922
+ }
923
+
924
+ .openpress-public-viewer .bookmark-title {
925
+ display: block;
926
+ overflow: visible;
927
+ font-family: var(--openpress-font-serif);
928
+ white-space: normal;
929
+ -webkit-line-clamp: unset;
930
+ }
931
+
932
+ .openpress-public-viewer .bookmark-h3 {
933
+ grid-template-columns: 24px minmax(0, 1fr);
934
+ column-gap: 8px;
935
+ padding: 4px 0 4px 32px;
936
+ font-size: 14px;
937
+ }
938
+
939
+ .openpress-public-viewer.openpress-reader-app .bookmark-item {
940
+ column-gap: 8px;
941
+ }
942
+
943
+ .openpress-public-viewer.openpress-reader-app .bookmark-h2 {
944
+ grid-template-columns: 24px minmax(0, 1fr);
945
+ padding: 8px 0 7px;
946
+ font-family: var(--openpress-font-serif);
947
+ font-size: 14px;
948
+ line-height: 1.42;
949
+ }
950
+
951
+ .openpress-public-viewer.openpress-reader-app .bookmark-h3 {
952
+ grid-template-columns: 24px minmax(0, 1fr);
953
+ column-gap: 8px;
954
+ padding: 4px 0 4px 32px;
955
+ font-family: var(--openpress-font-serif);
956
+ font-size: 14px;
957
+ line-height: 1.42;
958
+ }
959
+
960
+ .openpress-public-viewer.openpress-reader-app .bookmark-h4 {
961
+ grid-template-columns: 36px minmax(0, 1fr);
962
+ column-gap: 8px;
963
+ padding: 3px 0 3px 52px;
964
+ font-family: var(--openpress-font-serif);
965
+ font-size: 13px;
966
+ line-height: 1.38;
967
+ }
968
+
969
+ .openpress-public-viewer.openpress-reader-app .bookmark-title {
970
+ display: block;
971
+ overflow: visible;
972
+ font-family: var(--openpress-font-serif);
973
+ letter-spacing: 0;
974
+ -webkit-line-clamp: unset;
975
+ }
976
+
977
+ .openpress-public-viewer.openpress-reader-app .bookmark-h3 .bookmark-index {
978
+ font-size: 12px;
979
+ }
980
+
981
+ .openpress-public-viewer.openpress-reader-app .bookmark-h4 .bookmark-index {
982
+ font-size: 11px;
983
+ }