@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,384 @@
1
+ @media (max-width: 1184px) {
2
+ .openpress-shell {
3
+ padding: 18px;
4
+ }
5
+ }
6
+
7
+ @media screen and (max-width: 899px) {
8
+ .openpress-workbench,
9
+ .openpress-workbench[data-panel-open="false"] {
10
+ display: block;
11
+ min-height: 100vh;
12
+ }
13
+
14
+ .openpress-reader-app,
15
+ .openpress-reader-app.is-closed-left,
16
+ .openpress-reader-app.is-closed-right,
17
+ .openpress-reader-app.is-closed-left.is-closed-right {
18
+ grid-template-rows: 58px minmax(0, 1fr);
19
+ grid-template-columns: minmax(0, 1fr);
20
+ grid-template-areas:
21
+ "nav"
22
+ "main";
23
+ }
24
+
25
+ .openpress-workspace-navbar {
26
+ grid-template-columns: minmax(0, 1fr) auto;
27
+ gap: 8px;
28
+ padding: 0 12px;
29
+ }
30
+
31
+ .openpress-workspace-brand strong {
32
+ max-width: 42vw;
33
+ font-size: 13px;
34
+ }
35
+
36
+ .openpress-workspace-progress {
37
+ position: absolute;
38
+ right: 14px;
39
+ bottom: 0;
40
+ left: 14px;
41
+ width: auto;
42
+ }
43
+
44
+ .openpress-page-count {
45
+ display: none;
46
+ }
47
+
48
+ .openpress-navbar-button {
49
+ height: 32px;
50
+ padding: 0 10px;
51
+ }
52
+
53
+ .openpress-reader-app .reader-thumb-strip {
54
+ position: static;
55
+ display: flex !important;
56
+ width: 100%;
57
+ height: 100%;
58
+ }
59
+
60
+ .openpress-editor-rail {
61
+ position: fixed;
62
+ right: 0;
63
+ bottom: 0;
64
+ left: 0;
65
+ z-index: 34;
66
+ flex-direction: row;
67
+ justify-content: center;
68
+ border-top: 1px solid rgb(255 255 255 / 9%);
69
+ border-right: 0;
70
+ padding: 6px max(8px, env(safe-area-inset-left)) calc(6px + env(safe-area-inset-bottom));
71
+ }
72
+
73
+ .openpress-editor-rail__button {
74
+ min-width: 66px;
75
+ padding: 7px 9px;
76
+ }
77
+
78
+ .openpress-editor-navigator {
79
+ position: fixed;
80
+ top: 58px;
81
+ bottom: calc(52px + env(safe-area-inset-bottom));
82
+ left: 0;
83
+ z-index: 25;
84
+ width: min(78vw, 320px);
85
+ transform: translateX(0);
86
+ transition: transform 220ms cubic-bezier(0.22, 0.61, 0.36, 1);
87
+ box-shadow: 16px 0 34px rgb(0 0 0 / 36%);
88
+ }
89
+
90
+ .openpress-reader-app.is-closed-left .openpress-editor-navigator {
91
+ transform: translateX(-100%);
92
+ pointer-events: none;
93
+ box-shadow: none;
94
+ }
95
+
96
+ .openpress-reader-app.is-closed-left .openpress-editor-navigator > * {
97
+ opacity: 1;
98
+ }
99
+
100
+ .openpress-reader-app .reader-side-nav {
101
+ position: fixed;
102
+ top: 58px;
103
+ right: 0;
104
+ z-index: 25;
105
+ display: grid !important;
106
+ min-width: 0;
107
+ width: min(82vw, 340px);
108
+ height: calc(100dvh - 110px - env(safe-area-inset-bottom));
109
+ transform: translateX(0);
110
+ transition: transform 220ms cubic-bezier(0.22, 0.61, 0.36, 1);
111
+ box-shadow: -16px 0 34px rgb(0 0 0 / 36%);
112
+ }
113
+
114
+ .openpress-reader-app.is-closed-right .reader-side-nav {
115
+ display: grid !important;
116
+ transform: translateX(100%);
117
+ pointer-events: none;
118
+ box-shadow: none;
119
+ }
120
+
121
+ .openpress-reader-app.is-floating-backdrop::before {
122
+ top: 0;
123
+ }
124
+
125
+ .openpress-reader-app .reader-stage {
126
+ height: 100%;
127
+ min-height: 0;
128
+ }
129
+
130
+ .openpress-reader-app .reader-pages {
131
+ gap: 18px;
132
+ padding: 16px 14px calc(96px + env(safe-area-inset-bottom));
133
+ }
134
+
135
+ .openpress-reader-app .reader-page {
136
+ scroll-margin-top: 16px;
137
+ }
138
+
139
+ .openpress-public-viewer .reader-pages {
140
+ padding: 16px 10px calc(80px + env(safe-area-inset-bottom));
141
+ }
142
+
143
+ .openpress-public-viewer .openpress-html-page,
144
+ .openpress-html-page {
145
+ width: 100%;
146
+ margin-bottom: 8px;
147
+ scroll-margin-top: 68px;
148
+ container-type: inline-size;
149
+ }
150
+
151
+ .openpress-public-viewer .openpress-html-page__html .reader-page,
152
+ .openpress-public-viewer .openpress-html-page__html .reader-page--cover,
153
+ .openpress-public-viewer .openpress-html-page__html .reader-page--back-cover,
154
+ .openpress-html-page__html .reader-page,
155
+ .openpress-html-page__html .reader-page--cover,
156
+ .openpress-html-page__html .reader-page--back-cover {
157
+ width: 100%;
158
+ height: auto;
159
+ min-height: calc(100cqw * var(--openpress-page-height-ratio, 1.4142857143));
160
+ aspect-ratio: var(--openpress-page-aspect-ratio, 210 / 297);
161
+ max-height: none;
162
+ overflow: visible;
163
+ margin: 0 auto;
164
+ box-shadow: 0 10px 30px rgb(0 0 0 / 26%);
165
+ }
166
+
167
+ .openpress-public-viewer .openpress-html-page__html .reader-page .page-frame {
168
+ height: auto;
169
+ min-height: inherit;
170
+ grid-template-rows: auto minmax(max-content, 1fr) auto;
171
+ }
172
+
173
+ .openpress-public-viewer .openpress-html-page__html .reader-page.no-footer .page-frame {
174
+ grid-template-rows: auto minmax(max-content, 1fr);
175
+ }
176
+
177
+ .openpress-public-viewer .openpress-html-page__html .reader-page .page-body {
178
+ overflow: visible;
179
+ }
180
+
181
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .openpress-html-page__html .reader-page {
182
+ height: calc(100cqw * var(--openpress-page-height-ratio, 1.4142857143));
183
+ min-height: calc(100cqw * var(--openpress-page-height-ratio, 1.4142857143));
184
+ aspect-ratio: var(--openpress-page-aspect-ratio, 210 / 297);
185
+ max-height: none;
186
+ overflow: hidden;
187
+ }
188
+
189
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .openpress-html-page__html .reader-page .page-frame {
190
+ height: 100%;
191
+ min-height: 0;
192
+ grid-template-rows: var(--page-header-height) minmax(0, 1fr) var(--page-footer-height);
193
+ }
194
+
195
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .openpress-html-page__html .reader-page.no-footer .page-frame {
196
+ grid-template-rows: var(--page-header-height) minmax(0, 1fr);
197
+ }
198
+
199
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .reader-page--content figure,
200
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .reader-page--content table {
201
+ max-width: 100%;
202
+ overflow-x: auto;
203
+ overflow-y: hidden;
204
+ -webkit-overflow-scrolling: touch;
205
+ overscroll-behavior-x: contain;
206
+ }
207
+ }
208
+
209
+ @media (max-width: 1184px) {
210
+ .openpress-public-viewer.reader-app,
211
+ .openpress-public-viewer.openpress-reader-app,
212
+ .openpress-public-viewer.openpress-reader-app.is-closed-right {
213
+ grid-template-rows: minmax(0, 1fr);
214
+ grid-template-columns: minmax(0, 1fr);
215
+ grid-template-areas: "main";
216
+ }
217
+
218
+ .openpress-public-viewer.openpress-reader-app .openpress-public-navigation {
219
+ position: fixed;
220
+ top: 0;
221
+ right: auto;
222
+ bottom: 0;
223
+ left: 0;
224
+ z-index: 40;
225
+ display: grid !important;
226
+ width: min(88vw, var(--openpress-public-nav-max-width));
227
+ min-width: 0;
228
+ max-width: var(--openpress-public-nav-max-width);
229
+ height: 100dvh;
230
+ margin: 0;
231
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
232
+ overflow-x: hidden;
233
+ background: #181818;
234
+ box-shadow: 16px 0 44px rgb(0 0 0 / 42%);
235
+ transform: translateX(0);
236
+ transition: transform 260ms cubic-bezier(0.22, 0.61, 0.36, 1);
237
+ }
238
+
239
+ .openpress-dev-public-navigation {
240
+ grid-template-rows: auto auto minmax(0, 1fr) auto auto;
241
+ }
242
+
243
+ .openpress-public-viewer[data-active-workspace="project"] .openpress-dev-public-navigation {
244
+ grid-template-rows: auto auto minmax(0, 1fr) auto;
245
+ }
246
+
247
+ .openpress-public-viewer.openpress-reader-app .openpress-public-identity {
248
+ min-width: 0;
249
+ padding-right: 54px;
250
+ }
251
+
252
+ .openpress-public-viewer.openpress-reader-app .openpress-public-identity strong,
253
+ .openpress-public-viewer.openpress-reader-app .openpress-public-title-main,
254
+ .openpress-public-viewer.openpress-reader-app .openpress-public-title-sub {
255
+ min-width: 0;
256
+ max-width: 100%;
257
+ white-space: normal;
258
+ overflow-wrap: anywhere;
259
+ word-break: normal;
260
+ }
261
+
262
+ .openpress-public-viewer.openpress-reader-app .reader-bookmarks {
263
+ overflow-x: hidden;
264
+ }
265
+
266
+ .openpress-public-viewer.openpress-reader-app.is-closed-right .openpress-public-navigation {
267
+ transform: translateX(-110%);
268
+ pointer-events: none;
269
+ box-shadow: none;
270
+ }
271
+
272
+ .openpress-public-viewer.openpress-reader-app[data-openpress-pagination="pending"] .openpress-public-navigation {
273
+ transform: translateX(-110%);
274
+ pointer-events: none;
275
+ box-shadow: none;
276
+ }
277
+
278
+ .openpress-public-viewer.openpress-reader-app .openpress-public-scrim {
279
+ position: fixed;
280
+ inset: 0;
281
+ z-index: 35;
282
+ background: rgb(0 0 0 / 42%);
283
+ backdrop-filter: blur(1px);
284
+ }
285
+
286
+ .openpress-public-viewer.openpress-reader-app.is-closed-right .openpress-public-fab {
287
+ position: fixed;
288
+ left: 20px;
289
+ bottom: calc(24px + env(safe-area-inset-bottom));
290
+ z-index: 30;
291
+ display: flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ width: 44px;
295
+ height: 44px;
296
+ border: 1px solid rgb(255 255 255 / 14%);
297
+ border-radius: 50%;
298
+ background: rgb(28 28 28 / 96%);
299
+ color: #f2f2f0;
300
+ box-shadow: 0 4px 20px rgb(0 0 0 / 50%);
301
+ backdrop-filter: blur(10px);
302
+ }
303
+
304
+ .openpress-public-viewer.openpress-reader-app:not(.is-closed-right) .openpress-public-fab {
305
+ display: none;
306
+ }
307
+
308
+ .openpress-public-viewer.openpress-reader-app:not(.is-closed-right) .openpress-public-scrim {
309
+ display: block;
310
+ }
311
+
312
+ .openpress-public-viewer.openpress-reader-app[data-openpress-pagination="pending"] .openpress-public-scrim {
313
+ display: none;
314
+ }
315
+
316
+ .openpress-public-viewer.openpress-reader-app[data-openpress-pagination="pending"] .openpress-public-fab {
317
+ display: flex;
318
+ }
319
+
320
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .reader-pages {
321
+ --openpress-public-page-width: min(
322
+ var(--openpress-page-width),
323
+ 860px,
324
+ calc(100cqw - 48px)
325
+ );
326
+ }
327
+
328
+ .openpress-public-viewer .openpress-html-page {
329
+ width: min(100%, var(--openpress-public-page-width));
330
+ container-type: inline-size;
331
+ }
332
+
333
+ .openpress-public-viewer .openpress-html-page__html .reader-page,
334
+ .openpress-public-viewer .openpress-html-page__html .reader-page--cover,
335
+ .openpress-public-viewer .openpress-html-page__html .reader-page--back-cover {
336
+ width: 100%;
337
+ height: auto;
338
+ min-height: min(calc(100cqw * var(--openpress-page-height-ratio, 1.4142857143)), calc(100dvh - 48px));
339
+ aspect-ratio: var(--openpress-page-aspect-ratio, 210 / 297);
340
+ max-height: none;
341
+ overflow: visible;
342
+ }
343
+
344
+ .openpress-public-viewer .openpress-html-page__html .reader-page .page-frame {
345
+ height: auto;
346
+ min-height: inherit;
347
+ grid-template-rows: auto minmax(max-content, 1fr) auto;
348
+ }
349
+
350
+ .openpress-public-viewer .openpress-html-page__html .reader-page.no-footer .page-frame {
351
+ grid-template-rows: auto minmax(max-content, 1fr);
352
+ }
353
+
354
+ .openpress-public-viewer .openpress-html-page__html .reader-page .page-body {
355
+ overflow: visible;
356
+ }
357
+
358
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .openpress-html-page__html .reader-page {
359
+ height: calc(100cqw * var(--openpress-page-height-ratio, 1.4142857143));
360
+ min-height: calc(100cqw * var(--openpress-page-height-ratio, 1.4142857143));
361
+ aspect-ratio: var(--openpress-page-aspect-ratio, 210 / 297);
362
+ max-height: none;
363
+ overflow: hidden;
364
+ }
365
+
366
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .openpress-html-page__html .reader-page .page-frame {
367
+ height: 100%;
368
+ min-height: 0;
369
+ grid-template-rows: var(--page-header-height) minmax(0, 1fr) var(--page-footer-height);
370
+ }
371
+
372
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .openpress-html-page__html .reader-page.no-footer .page-frame {
373
+ grid-template-rows: var(--page-header-height) minmax(0, 1fr);
374
+ }
375
+
376
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .reader-page--content figure,
377
+ .openpress-public-viewer[data-openpress-view-mode="paged"] .reader-page--content table {
378
+ max-width: 100%;
379
+ overflow-x: auto;
380
+ overflow-y: hidden;
381
+ -webkit-overflow-scrolling: touch;
382
+ overscroll-behavior-x: contain;
383
+ }
384
+ }