@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,1318 @@
1
+ .openpress-project-workspace {
2
+ width: 100%;
3
+ min-width: 0;
4
+ min-height: 100%;
5
+ overflow: hidden;
6
+ background: #111312;
7
+ color: #e8e8e4;
8
+ }
9
+
10
+ .openpress-project-panel {
11
+ display: block;
12
+ min-height: 0;
13
+ padding: 4px 18px 18px 22px;
14
+ overflow: auto;
15
+ scrollbar-width: none;
16
+ }
17
+
18
+ .openpress-project-panel::-webkit-scrollbar {
19
+ width: 0;
20
+ height: 0;
21
+ display: none;
22
+ }
23
+
24
+ .openpress-project-tool-block {
25
+ display: grid;
26
+ gap: 10px;
27
+ min-width: 0;
28
+ border-top: 1px solid rgb(255 255 255 / 8%);
29
+ padding: 14px 0;
30
+ }
31
+
32
+ .openpress-project-tool-block:first-child {
33
+ border-top: 0;
34
+ padding-top: 0;
35
+ }
36
+
37
+ .openpress-project-tool-header {
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: space-between;
41
+ min-width: 0;
42
+ }
43
+
44
+ .openpress-project-tool-header span {
45
+ color: rgb(190 196 202 / 58%);
46
+ font-family: var(--openpress-font-mono);
47
+ font-size: 10px;
48
+ font-weight: 650;
49
+ line-height: 1;
50
+ letter-spacing: 0.04em;
51
+ text-transform: uppercase;
52
+ }
53
+
54
+ .openpress-project-upload-zone {
55
+ display: grid;
56
+ grid-template-columns: 26px minmax(0, 1fr);
57
+ gap: 4px 10px;
58
+ align-items: center;
59
+ min-width: 0;
60
+ border: 1px dashed rgb(255 255 255 / 14%);
61
+ padding: 10px;
62
+ color: rgb(170 176 183 / 72%);
63
+ cursor: pointer;
64
+ transition:
65
+ border-color 160ms ease,
66
+ background 160ms ease,
67
+ color 160ms ease;
68
+ }
69
+
70
+ .openpress-project-upload-zone[data-drag-active="true"],
71
+ .openpress-project-upload-zone:hover {
72
+ border-color: rgb(223 106 47 / 62%);
73
+ background: rgb(223 106 47 / 8%);
74
+ color: rgb(244 241 235 / 92%);
75
+ }
76
+
77
+ .openpress-project-upload-zone input {
78
+ position: absolute;
79
+ width: 1px;
80
+ height: 1px;
81
+ opacity: 0;
82
+ pointer-events: none;
83
+ }
84
+
85
+ .openpress-project-upload-zone svg {
86
+ grid-row: span 2;
87
+ width: 16px;
88
+ height: 16px;
89
+ color: rgb(223 106 47 / 82%);
90
+ stroke-width: 1.8;
91
+ }
92
+
93
+ .openpress-project-upload-zone span {
94
+ min-width: 0;
95
+ color: rgb(238 238 234 / 88%);
96
+ font-size: 12px;
97
+ font-weight: 560;
98
+ line-height: 1.2;
99
+ }
100
+
101
+ .openpress-project-upload-zone small,
102
+ .openpress-project-tool-empty {
103
+ margin: 0;
104
+ color: rgb(150 156 163 / 58%);
105
+ font-size: 10px;
106
+ line-height: 1.35;
107
+ overflow-wrap: anywhere;
108
+ }
109
+
110
+ .openpress-project-upload-zone[data-upload-status="failed"] small {
111
+ color: #ff9c80;
112
+ }
113
+
114
+ .openpress-project-upload-zone[data-upload-status="done"] small {
115
+ color: #9de7b0;
116
+ }
117
+
118
+ .openpress-project-asset-list,
119
+ .openpress-project-component-mention-list {
120
+ display: grid;
121
+ gap: 8px;
122
+ min-width: 0;
123
+ }
124
+
125
+ .openpress-project-asset,
126
+ .openpress-project-component-mention-list button {
127
+ display: grid;
128
+ min-width: 0;
129
+ border: 0;
130
+ padding: 0;
131
+ background: transparent;
132
+ color: inherit;
133
+ cursor: pointer;
134
+ text-align: left;
135
+ }
136
+
137
+ .openpress-project-asset {
138
+ grid-template-columns: 42px minmax(0, 1fr);
139
+ gap: 10px;
140
+ align-items: center;
141
+ }
142
+
143
+ .openpress-project-asset:hover strong,
144
+ .openpress-project-component-mention-list button:hover strong {
145
+ color: rgb(246 246 242 / 96%);
146
+ }
147
+
148
+ .openpress-project-asset-thumb {
149
+ display: grid;
150
+ width: 42px;
151
+ height: 34px;
152
+ place-items: center;
153
+ overflow: hidden;
154
+ border: 1px solid rgb(255 255 255 / 9%);
155
+ background: rgb(255 255 255 / 3%);
156
+ }
157
+
158
+ .openpress-project-asset-thumb img {
159
+ display: block;
160
+ width: 100%;
161
+ height: 100%;
162
+ object-fit: cover;
163
+ }
164
+
165
+ .openpress-project-asset-body,
166
+ .openpress-project-component-mention-list button span {
167
+ display: grid;
168
+ min-width: 0;
169
+ }
170
+
171
+ .openpress-project-asset-body strong {
172
+ min-width: 0;
173
+ overflow: hidden;
174
+ color: rgb(214 218 220 / 82%);
175
+ font-size: 12px;
176
+ font-weight: 520;
177
+ line-height: 1.2;
178
+ text-overflow: ellipsis;
179
+ white-space: nowrap;
180
+ }
181
+
182
+ .openpress-project-component-mention-list strong {
183
+ min-width: 0;
184
+ overflow: hidden;
185
+ color: rgb(214 218 220 / 86%);
186
+ font-size: 13.5px;
187
+ font-weight: 560;
188
+ line-height: 1.25;
189
+ text-overflow: ellipsis;
190
+ white-space: nowrap;
191
+ }
192
+
193
+ .openpress-project-component-mention-list button {
194
+ grid-template-columns: 20px minmax(0, 1fr);
195
+ gap: 8px;
196
+ align-items: center;
197
+ }
198
+
199
+ .openpress-project-component-mention-list svg {
200
+ width: 14px;
201
+ height: 14px;
202
+ color: rgb(223 106 47 / 74%);
203
+ stroke-width: 1.7;
204
+ }
205
+
206
+ .openpress-project-style-strip {
207
+ display: flex;
208
+ gap: 8px;
209
+ min-width: 0;
210
+ }
211
+
212
+ .openpress-project-style-strip span {
213
+ width: 22px;
214
+ height: 22px;
215
+ border: 1px solid rgb(255 255 255 / 14%);
216
+ background: var(--openpress-project-swatch);
217
+ }
218
+
219
+ .openpress-project-preview-dialog {
220
+ position: fixed;
221
+ inset: 0;
222
+ z-index: 1000;
223
+ display: grid;
224
+ place-items: center;
225
+ padding: 28px;
226
+ background: rgb(0 0 0 / 58%);
227
+ }
228
+
229
+ .openpress-project-preview-dialog__panel {
230
+ display: grid;
231
+ grid-template-rows: auto minmax(0, 1fr) auto;
232
+ width: min(860px, calc(100vw - 56px));
233
+ max-height: min(760px, calc(100vh - 56px));
234
+ overflow: hidden;
235
+ border: 1px solid rgb(255 255 255 / 12%);
236
+ background: #151716;
237
+ box-shadow: 0 28px 70px rgb(0 0 0 / 42%);
238
+ color: rgb(242 242 238 / 94%);
239
+ }
240
+
241
+ .openpress-project-preview-dialog__panel header {
242
+ display: grid;
243
+ grid-template-columns: minmax(0, 1fr) auto 34px;
244
+ gap: 16px;
245
+ align-items: center;
246
+ border-bottom: 1px solid rgb(255 255 255 / 9%);
247
+ padding: 14px 16px;
248
+ }
249
+
250
+ .openpress-project-preview-dialog .openpress-project-preview-dialog__panel h2 {
251
+ min-width: 0;
252
+ margin: 0;
253
+ overflow: hidden;
254
+ color: rgb(242 242 238 / 94%);
255
+ font-family: var(--openpress-font-body);
256
+ font-size: 14px;
257
+ font-weight: 560;
258
+ line-height: 1.2;
259
+ text-overflow: ellipsis;
260
+ white-space: nowrap;
261
+ }
262
+
263
+ .openpress-project-preview-dialog__actions {
264
+ display: flex;
265
+ align-items: center;
266
+ gap: 8px;
267
+ }
268
+
269
+ .openpress-project-preview-dialog__actions button {
270
+ display: inline-flex;
271
+ align-items: center;
272
+ gap: 6px;
273
+ min-height: 30px;
274
+ border: 1px solid rgb(255 255 255 / 12%);
275
+ border-radius: 999px;
276
+ padding: 0 10px;
277
+ background: rgb(255 255 255 / 3%);
278
+ color: rgb(242 242 238 / 78%);
279
+ cursor: pointer;
280
+ font-size: 11px;
281
+ font-weight: 560;
282
+ line-height: 1;
283
+ }
284
+
285
+ .openpress-project-preview-dialog__actions button:hover {
286
+ border-color: rgb(223 106 47 / 58%);
287
+ color: rgb(255 255 255 / 92%);
288
+ }
289
+
290
+ .openpress-project-preview-dialog__actions svg {
291
+ width: 13px;
292
+ height: 13px;
293
+ stroke-width: 1.8;
294
+ }
295
+
296
+ .openpress-project-preview-dialog__close {
297
+ display: grid;
298
+ width: 30px;
299
+ height: 30px;
300
+ place-items: center;
301
+ border: 1px solid rgb(255 255 255 / 12%);
302
+ border-radius: 999px;
303
+ background: transparent;
304
+ color: rgb(242 242 238 / 82%);
305
+ cursor: pointer;
306
+ font-size: 20px;
307
+ line-height: 1;
308
+ }
309
+
310
+ .openpress-project-preview-dialog__close:hover {
311
+ border-color: rgb(255 255 255 / 24%);
312
+ color: white;
313
+ }
314
+
315
+ .openpress-project-preview-dialog__body {
316
+ min-width: 0;
317
+ min-height: 0;
318
+ overflow: auto;
319
+ padding: 18px;
320
+ }
321
+
322
+ .openpress-project-preview-dialog__body[data-preview-kind="media"] {
323
+ display: grid;
324
+ place-items: center;
325
+ background:
326
+ linear-gradient(45deg, rgb(255 255 255 / 3%) 25%, transparent 25%),
327
+ linear-gradient(-45deg, rgb(255 255 255 / 3%) 25%, transparent 25%),
328
+ linear-gradient(45deg, transparent 75%, rgb(255 255 255 / 3%) 75%),
329
+ linear-gradient(-45deg, transparent 75%, rgb(255 255 255 / 3%) 75%);
330
+ background-position: 0 0, 0 10px, 10px -10px, -10px 0;
331
+ background-size: 20px 20px;
332
+ }
333
+
334
+ .openpress-project-preview-dialog__body[data-preview-kind="media"] img {
335
+ display: block;
336
+ max-width: 100%;
337
+ max-height: calc(100vh - 160px);
338
+ object-fit: contain;
339
+ }
340
+
341
+ .openpress-project-preview-dialog__body[data-preview-kind="component"] {
342
+ background: #f7f9fb;
343
+ color: var(--openpress-color-ink, #1f2d3d);
344
+ }
345
+
346
+ .openpress-project-preview-dialog__body[data-preview-kind="component"] > div {
347
+ min-width: min-content;
348
+ }
349
+
350
+ .openpress-project-preview-dialog__footer {
351
+ display: grid;
352
+ gap: 12px;
353
+ border-top: 1px solid rgb(255 255 255 / 9%);
354
+ padding: 14px 16px 16px;
355
+ background: #151716;
356
+ }
357
+
358
+ .openpress-project-asset-action-form {
359
+ display: grid;
360
+ grid-template-columns: minmax(0, 1fr) auto;
361
+ gap: 10px;
362
+ align-items: end;
363
+ }
364
+
365
+ .openpress-project-asset-action-form label {
366
+ display: grid;
367
+ gap: 6px;
368
+ min-width: 0;
369
+ }
370
+
371
+ .openpress-project-asset-action-form label span,
372
+ .openpress-project-preview-comment__shortcuts,
373
+ .openpress-project-preview-comment__bottom {
374
+ color: rgb(170 176 183 / 70%);
375
+ font-size: 11px;
376
+ line-height: 1.2;
377
+ }
378
+
379
+ .openpress-project-asset-action-form input,
380
+ .openpress-project-preview-comment textarea,
381
+ .openpress-project-preview-comment select {
382
+ width: 100%;
383
+ min-width: 0;
384
+ border: 1px solid rgb(255 255 255 / 12%);
385
+ border-radius: 0;
386
+ background: rgb(255 255 255 / 5%);
387
+ color: rgb(244 244 240 / 92%);
388
+ font: inherit;
389
+ }
390
+
391
+ .openpress-project-asset-action-form input {
392
+ height: 34px;
393
+ padding: 0 10px;
394
+ font-size: 12px;
395
+ }
396
+
397
+ .openpress-project-asset-action-form > div,
398
+ .openpress-project-preview-comment__bottom {
399
+ display: flex;
400
+ align-items: center;
401
+ justify-content: flex-end;
402
+ gap: 8px;
403
+ }
404
+
405
+ .openpress-project-asset-action-form button,
406
+ .openpress-project-preview-comment button {
407
+ display: inline-flex;
408
+ align-items: center;
409
+ justify-content: center;
410
+ gap: 6px;
411
+ min-height: 32px;
412
+ border: 1px solid rgb(255 255 255 / 12%);
413
+ border-radius: 999px;
414
+ padding: 0 12px;
415
+ background: transparent;
416
+ color: rgb(242 242 238 / 82%);
417
+ cursor: pointer;
418
+ font-size: 11px;
419
+ font-weight: 560;
420
+ line-height: 1;
421
+ }
422
+
423
+ .openpress-project-asset-action-form button:hover:not(:disabled),
424
+ .openpress-project-preview-comment button:hover:not(:disabled) {
425
+ border-color: rgb(223 106 47 / 58%);
426
+ color: rgb(255 255 255 / 94%);
427
+ }
428
+
429
+ .openpress-project-asset-action-form button:disabled,
430
+ .openpress-project-preview-comment button:disabled {
431
+ cursor: default;
432
+ opacity: 0.48;
433
+ }
434
+
435
+ .openpress-project-asset-action-form svg {
436
+ width: 13px;
437
+ height: 13px;
438
+ }
439
+
440
+ .openpress-project-asset-action-form--delete {
441
+ grid-template-columns: minmax(0, 1fr) auto;
442
+ align-items: center;
443
+ }
444
+
445
+ .openpress-project-asset-action-form--delete p,
446
+ .openpress-project-asset-action-message {
447
+ margin: 0;
448
+ color: rgb(190 196 202 / 72%);
449
+ font-size: 11px;
450
+ line-height: 1.45;
451
+ }
452
+
453
+ .openpress-project-asset-action-message[data-status="done"] {
454
+ color: #9de7b0;
455
+ }
456
+
457
+ .openpress-project-asset-action-message[data-status="failed"] {
458
+ color: #ff9c80;
459
+ }
460
+
461
+ .openpress-project-preview-comment {
462
+ display: grid;
463
+ gap: 9px;
464
+ border-top: 1px solid rgb(255 255 255 / 7%);
465
+ padding-top: 12px;
466
+ }
467
+
468
+ .openpress-project-preview-comment__shortcuts {
469
+ display: flex;
470
+ flex-wrap: wrap;
471
+ gap: 8px;
472
+ }
473
+
474
+ .openpress-project-preview-comment__shortcuts button {
475
+ min-height: 28px;
476
+ padding: 0 10px;
477
+ }
478
+
479
+ .openpress-project-preview-comment__composer {
480
+ display: grid;
481
+ gap: 8px;
482
+ min-width: 0;
483
+ }
484
+
485
+ .openpress-project-preview-comment textarea {
486
+ min-height: 74px;
487
+ max-height: 160px;
488
+ resize: vertical;
489
+ padding: 10px;
490
+ font-size: 12px;
491
+ line-height: 1.45;
492
+ }
493
+
494
+ .openpress-project-preview-comment textarea::placeholder {
495
+ color: rgb(170 176 183 / 42%);
496
+ }
497
+
498
+ .openpress-project-preview-comment__suggestions {
499
+ display: grid;
500
+ gap: 4px;
501
+ overflow: hidden;
502
+ border: 1px solid rgb(223 106 47 / 32%);
503
+ border-radius: 12px;
504
+ padding: 6px;
505
+ background: rgb(36 36 34 / 96%);
506
+ }
507
+
508
+ .openpress-project-preview-comment__suggestions button {
509
+ display: flex;
510
+ align-items: baseline;
511
+ justify-content: space-between;
512
+ gap: 12px;
513
+ min-width: 0;
514
+ min-height: 0;
515
+ border: 0;
516
+ border-radius: 8px;
517
+ padding: 8px 10px;
518
+ background: transparent;
519
+ color: rgb(244 241 235 / 90%);
520
+ text-align: left;
521
+ }
522
+
523
+ .openpress-project-preview-comment__suggestions button:hover,
524
+ .openpress-project-preview-comment__suggestions button:focus-visible,
525
+ .openpress-project-preview-comment__suggestions button[data-highlighted="true"] {
526
+ background: rgb(223 106 47 / 18%);
527
+ outline: 0;
528
+ }
529
+
530
+ .openpress-project-preview-comment__suggestions span {
531
+ min-width: 0;
532
+ overflow: hidden;
533
+ font-size: 12px;
534
+ font-weight: 600;
535
+ line-height: 1.2;
536
+ text-overflow: ellipsis;
537
+ white-space: nowrap;
538
+ }
539
+
540
+ .openpress-project-preview-comment__suggestions small {
541
+ flex: 0 0 auto;
542
+ color: rgb(218 161 123 / 78%);
543
+ font-size: 10px;
544
+ line-height: 1.2;
545
+ }
546
+
547
+ .openpress-project-preview-comment select {
548
+ width: auto;
549
+ height: 30px;
550
+ padding: 0 28px 0 9px;
551
+ color: rgb(190 196 202 / 82%);
552
+ font-size: 11px;
553
+ }
554
+
555
+ .openpress-project-preview-comment__bottom span[data-status="done"] {
556
+ color: #9de7b0;
557
+ }
558
+
559
+ .openpress-project-preview-comment__bottom span[data-status="failed"] {
560
+ color: #ff9c80;
561
+ }
562
+
563
+ .openpress-project-markdown-header dt {
564
+ color: rgb(175 181 188 / 64%);
565
+ font-size: 10px;
566
+ font-weight: 650;
567
+ line-height: 1;
568
+ letter-spacing: 0;
569
+ text-transform: uppercase;
570
+ }
571
+
572
+ .openpress-project-entry-list {
573
+ position: relative;
574
+ min-height: 0;
575
+ padding: 4px 18px 18px 30px;
576
+ }
577
+
578
+ .openpress-project-bookmarks {
579
+ height: 100%;
580
+ overflow: auto;
581
+ scrollbar-width: none;
582
+ }
583
+
584
+ .openpress-project-bookmarks::-webkit-scrollbar {
585
+ width: 0;
586
+ height: 0;
587
+ display: none;
588
+ }
589
+
590
+ .openpress-project-entry {
591
+ width: 100%;
592
+ min-width: 0;
593
+ }
594
+
595
+ .openpress-project-entry.bookmark-h2 {
596
+ grid-template-columns: 34px minmax(0, 1fr);
597
+ align-items: center;
598
+ padding: 8px 0;
599
+ color: rgb(150 156 163 / 72%);
600
+ font-family: var(--openpress-font-serif);
601
+ font-size: 14px;
602
+ line-height: 1.42;
603
+ }
604
+
605
+ .openpress-project-entry:hover,
606
+ .openpress-project-entry.is-active {
607
+ color: rgb(242 242 240 / 94%);
608
+ }
609
+
610
+ .openpress-project-entry .bookmark-index {
611
+ display: inline-flex;
612
+ align-items: center;
613
+ justify-content: flex-start;
614
+ color: rgb(160 166 173 / 58%);
615
+ }
616
+
617
+ .openpress-project-entry.is-active .bookmark-index,
618
+ .openpress-project-entry--gallery.is-active .bookmark-index,
619
+ .openpress-project-entry--components.is-active .bookmark-index {
620
+ color: #d7a034;
621
+ }
622
+
623
+ .openpress-project-entry-icon svg {
624
+ width: 14px;
625
+ height: 14px;
626
+ stroke-width: 1.8;
627
+ }
628
+
629
+ .openpress-project-entry .bookmark-title {
630
+ min-width: 0;
631
+ overflow: visible;
632
+ color: inherit;
633
+ letter-spacing: 0;
634
+ white-space: normal;
635
+ overflow-wrap: anywhere;
636
+ -webkit-line-clamp: unset;
637
+ }
638
+
639
+ .openpress-project-visual-system,
640
+ .openpress-project-markdown-viewer,
641
+ .openpress-project-gallery-viewer,
642
+ .openpress-project-data-viewer,
643
+ .openpress-project-component-viewer {
644
+ min-width: 0;
645
+ height: 100%;
646
+ min-height: 100%;
647
+ display: grid;
648
+ grid-template-rows: auto minmax(0, 1fr);
649
+ gap: 18px;
650
+ overflow: hidden;
651
+ padding: 24px;
652
+ }
653
+
654
+ .openpress-project-section-header,
655
+ .openpress-project-markdown-header {
656
+ min-width: 0;
657
+ display: grid;
658
+ gap: 8px;
659
+ padding-bottom: 18px;
660
+ border-bottom: 1px solid rgb(255 255 255 / 10%);
661
+ }
662
+
663
+ .openpress-project-section-header {
664
+ grid-template-columns: minmax(0, 1fr) auto;
665
+ gap: 18px;
666
+ align-items: end;
667
+ }
668
+
669
+ .openpress-project-section-header--minimal {
670
+ grid-template-columns: minmax(0, 1fr);
671
+ gap: 0;
672
+ padding-bottom: 4px;
673
+ border-bottom: 0;
674
+ }
675
+
676
+ .openpress-project-section-header > div {
677
+ min-width: 0;
678
+ }
679
+
680
+ .openpress-project-section-header p {
681
+ margin: 0 0 6px;
682
+ color: #d7a034;
683
+ font-size: 10px;
684
+ font-weight: 650;
685
+ line-height: 1;
686
+ letter-spacing: 0.08em;
687
+ text-transform: uppercase;
688
+ }
689
+
690
+ .openpress-project-section-header span {
691
+ display: block;
692
+ margin-top: 7px;
693
+ color: rgb(184 190 196 / 72%);
694
+ font-size: 12px;
695
+ line-height: 1.45;
696
+ overflow-wrap: anywhere;
697
+ }
698
+
699
+ .openpress-project-section-header dl {
700
+ display: flex;
701
+ flex-wrap: wrap;
702
+ justify-content: flex-end;
703
+ gap: 10px;
704
+ margin: 0;
705
+ }
706
+
707
+ .openpress-project-section-header dl div {
708
+ display: inline-grid;
709
+ min-width: 74px;
710
+ gap: 5px;
711
+ border: 1px solid rgb(255 255 255 / 10%);
712
+ padding: 8px 10px;
713
+ background: rgb(255 255 255 / 3%);
714
+ }
715
+
716
+ .openpress-project-section-header dt {
717
+ color: rgb(175 181 188 / 64%);
718
+ font-size: 10px;
719
+ font-weight: 650;
720
+ line-height: 1;
721
+ letter-spacing: 0;
722
+ text-transform: uppercase;
723
+ }
724
+
725
+ .openpress-project-section-header dd {
726
+ margin: 0;
727
+ color: rgb(245 245 241 / 88%);
728
+ font-size: 13px;
729
+ font-variant-numeric: tabular-nums;
730
+ line-height: 1;
731
+ }
732
+
733
+ .openpress-project-section-header h2,
734
+ .openpress-project-markdown-header h2 {
735
+ margin: 0;
736
+ color: rgb(248 248 244 / 96%);
737
+ font-size: clamp(22px, 2.4vw, 34px);
738
+ font-weight: 560;
739
+ line-height: 1.05;
740
+ overflow-wrap: anywhere;
741
+ }
742
+
743
+ .openpress-project-section-header--minimal h2 {
744
+ font-family: var(--openpress-font-serif);
745
+ font-size: clamp(24px, 2vw, 30px);
746
+ font-weight: 420;
747
+ letter-spacing: 0;
748
+ }
749
+
750
+ .openpress-project-entry .bookmark-title {
751
+ display: grid;
752
+ gap: 2px;
753
+ line-height: 1.28;
754
+ }
755
+
756
+ .openpress-project-entry .bookmark-title > span,
757
+ .openpress-project-entry .bookmark-title > small {
758
+ display: block;
759
+ }
760
+
761
+ .openpress-project-entry .bookmark-title small {
762
+ color: rgb(150 156 163 / 58%);
763
+ font-family: var(--openpress-font-body);
764
+ font-size: 10px;
765
+ font-weight: 500;
766
+ line-height: 1.2;
767
+ }
768
+
769
+ .openpress-project-entry.is-active .bookmark-title small {
770
+ color: rgb(215 160 52 / 78%);
771
+ }
772
+
773
+ .openpress-project-visual-grid {
774
+ display: grid;
775
+ grid-template-columns: minmax(280px, 0.95fr) minmax(320px, 1.25fr);
776
+ align-content: start;
777
+ gap: 28px;
778
+ min-height: 0;
779
+ overflow: auto;
780
+ padding-right: 2px;
781
+ }
782
+
783
+ .openpress-project-visual-card {
784
+ min-width: 0;
785
+ border-top: 1px solid rgb(255 255 255 / 10%);
786
+ padding-top: 18px;
787
+ background: transparent;
788
+ }
789
+
790
+ .openpress-project-visual-card header {
791
+ display: grid;
792
+ gap: 5px;
793
+ margin-bottom: 14px;
794
+ }
795
+
796
+ .openpress-project-visual-card header span {
797
+ color: rgb(170 176 183 / 58%);
798
+ font-size: 10px;
799
+ font-weight: 650;
800
+ line-height: 1;
801
+ letter-spacing: 0.04em;
802
+ text-transform: uppercase;
803
+ }
804
+
805
+ .openpress-project-visual-card header strong {
806
+ color: rgb(242 242 240 / 92%);
807
+ font-family: var(--openpress-font-serif);
808
+ font-size: 18px;
809
+ font-weight: 520;
810
+ line-height: 1.2;
811
+ }
812
+
813
+ .openpress-project-visual-card--typography {
814
+ grid-row: span 2;
815
+ }
816
+
817
+ .openpress-project-type-specimen {
818
+ display: grid;
819
+ gap: 10px;
820
+ border: 1px solid rgb(29 40 50 / 10%);
821
+ padding: 22px 24px;
822
+ background: var(--openpress-color-document);
823
+ color: var(--openpress-color-body);
824
+ }
825
+
826
+ .openpress-project-type-specimen .openpress-project-type-kicker {
827
+ margin: 0;
828
+ color: var(--openpress-color-muted);
829
+ font-family: var(--openpress-font-mono);
830
+ font-size: 10px;
831
+ line-height: 1.2;
832
+ letter-spacing: 0.08em;
833
+ text-transform: uppercase;
834
+ }
835
+
836
+ .openpress-project-type-specimen h2,
837
+ .openpress-project-type-specimen h3,
838
+ .openpress-project-type-specimen h4,
839
+ .openpress-project-type-specimen p {
840
+ margin: 0;
841
+ }
842
+
843
+ .openpress-project-type-specimen h2 {
844
+ color: var(--openpress-color-ink);
845
+ font-family: var(--openpress-font-serif);
846
+ font-size: 38px;
847
+ font-weight: 420;
848
+ line-height: 0.98;
849
+ letter-spacing: 0;
850
+ }
851
+
852
+ .openpress-project-type-specimen h3 {
853
+ color: var(--openpress-color-ink);
854
+ font-family: var(--openpress-font-serif);
855
+ font-size: 20px;
856
+ font-weight: 420;
857
+ line-height: 1.25;
858
+ }
859
+
860
+ .openpress-project-type-specimen h4 {
861
+ color: var(--openpress-color-muted);
862
+ font-size: 13px;
863
+ font-weight: 560;
864
+ line-height: 1.35;
865
+ }
866
+
867
+ .openpress-project-type-specimen p:not(.openpress-project-type-kicker) {
868
+ color: var(--openpress-color-body);
869
+ font-size: 13px;
870
+ line-height: 1.8;
871
+ }
872
+
873
+ .openpress-project-type-specimen code {
874
+ width: fit-content;
875
+ border: 1px solid var(--openpress-color-line);
876
+ padding: 5px 7px;
877
+ background: var(--openpress-color-block);
878
+ color: var(--openpress-color-ink);
879
+ font-family: var(--openpress-font-mono);
880
+ font-size: 12px;
881
+ }
882
+
883
+ .openpress-project-swatch-grid {
884
+ display: grid;
885
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
886
+ gap: 14px 16px;
887
+ }
888
+
889
+ .openpress-project-swatch {
890
+ display: grid;
891
+ grid-template-columns: 42px minmax(0, 1fr);
892
+ grid-template-areas:
893
+ "chip label"
894
+ "chip token";
895
+ gap: 4px 10px;
896
+ align-items: center;
897
+ min-width: 0;
898
+ }
899
+
900
+ .openpress-project-swatch-chip {
901
+ grid-area: chip;
902
+ width: 38px;
903
+ height: 38px;
904
+ border: 1px solid rgb(255 255 255 / 18%);
905
+ background: var(--openpress-project-swatch);
906
+ }
907
+
908
+ .openpress-project-swatch strong {
909
+ grid-area: label;
910
+ color: rgb(242 242 240 / 92%);
911
+ font-size: 12px;
912
+ font-weight: 560;
913
+ line-height: 1.2;
914
+ }
915
+
916
+ .openpress-project-swatch code {
917
+ grid-area: token;
918
+ min-width: 0;
919
+ border: 0;
920
+ padding: 0;
921
+ background: transparent;
922
+ color: rgb(170 176 183 / 62%);
923
+ font-family: var(--openpress-font-mono);
924
+ font-size: 10px;
925
+ line-height: 1.25;
926
+ overflow-wrap: anywhere;
927
+ }
928
+
929
+ .openpress-project-surface-preview {
930
+ display: grid;
931
+ gap: 12px;
932
+ }
933
+
934
+ .openpress-project-surface-paper,
935
+ .openpress-project-surface-block {
936
+ display: grid;
937
+ gap: 5px;
938
+ min-height: 82px;
939
+ align-content: center;
940
+ border: 1px solid rgb(29 40 50 / 10%);
941
+ padding: 18px;
942
+ color: var(--openpress-color-body);
943
+ }
944
+
945
+ .openpress-project-surface-paper {
946
+ background-color: var(--openpress-color-document);
947
+ background-image: var(--openpress-paper-texture);
948
+ background-position: var(--openpress-paper-texture-position);
949
+ background-size: var(--openpress-paper-texture-size);
950
+ }
951
+
952
+ .openpress-project-surface-block {
953
+ background: var(--openpress-color-block);
954
+ }
955
+
956
+ .openpress-project-surface-paper span,
957
+ .openpress-project-surface-block span {
958
+ color: var(--openpress-color-ink);
959
+ font-size: 13px;
960
+ font-weight: 650;
961
+ line-height: 1.2;
962
+ }
963
+
964
+ .openpress-project-surface-paper p,
965
+ .openpress-project-surface-block p {
966
+ margin: 0;
967
+ color: var(--openpress-color-muted);
968
+ font-size: 12px;
969
+ line-height: 1.55;
970
+ }
971
+
972
+ .openpress-project-markdown-header p {
973
+ margin: 0;
974
+ color: rgb(184 190 196 / 72%);
975
+ font-size: 12px;
976
+ line-height: 1.45;
977
+ overflow-wrap: anywhere;
978
+ }
979
+
980
+ .openpress-project-markdown-header dl {
981
+ display: flex;
982
+ flex-wrap: wrap;
983
+ gap: 10px;
984
+ margin: 8px 0 0;
985
+ }
986
+
987
+ .openpress-project-markdown-header dl div {
988
+ display: inline-grid;
989
+ grid-template-columns: auto auto;
990
+ gap: 8px;
991
+ align-items: baseline;
992
+ border: 1px solid rgb(255 255 255 / 10%);
993
+ padding: 6px 9px;
994
+ }
995
+
996
+ .openpress-project-markdown-header dd {
997
+ margin: 0;
998
+ color: rgb(245 245 241 / 88%);
999
+ font-size: 12px;
1000
+ font-variant-numeric: tabular-nums;
1001
+ line-height: 1;
1002
+ }
1003
+
1004
+ .openpress-project-markdown-source {
1005
+ min-width: 0;
1006
+ min-height: 0;
1007
+ margin: 0;
1008
+ overflow: auto;
1009
+ border: 1px solid rgb(255 255 255 / 12%);
1010
+ padding: 22px;
1011
+ background: #f4f0e7;
1012
+ color: #1f2326;
1013
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1014
+ font-size: 12.5px;
1015
+ line-height: 1.68;
1016
+ white-space: pre-wrap;
1017
+ overflow-wrap: anywhere;
1018
+ }
1019
+
1020
+ .openpress-project-markdown-source code {
1021
+ font: inherit;
1022
+ }
1023
+
1024
+ .openpress-project-data-list {
1025
+ display: grid;
1026
+ align-content: start;
1027
+ gap: 16px;
1028
+ min-height: 0;
1029
+ overflow: auto;
1030
+ padding-right: 2px;
1031
+ }
1032
+
1033
+ .openpress-project-component-list-header {
1034
+ padding-bottom: 0;
1035
+ border-bottom: 0;
1036
+ }
1037
+
1038
+ .openpress-project-component-list {
1039
+ display: grid;
1040
+ grid-template-columns: minmax(0, 1fr);
1041
+ align-content: start;
1042
+ gap: 22px;
1043
+ min-height: 0;
1044
+ overflow: auto;
1045
+ padding-right: 2px;
1046
+ }
1047
+
1048
+ .openpress-project-component-preview-row {
1049
+ display: grid;
1050
+ gap: 10px;
1051
+ min-width: 0;
1052
+ margin: 0;
1053
+ }
1054
+
1055
+ .openpress-project-component-preview-row figcaption {
1056
+ display: flex;
1057
+ align-items: center;
1058
+ justify-content: space-between;
1059
+ gap: 12px;
1060
+ min-width: 0;
1061
+ color: rgb(242 242 240 / 90%);
1062
+ font-family: var(--openpress-font-mono);
1063
+ font-size: 11px;
1064
+ line-height: 1.2;
1065
+ }
1066
+
1067
+ .openpress-project-component-preview-row figcaption span {
1068
+ min-width: 0;
1069
+ overflow: hidden;
1070
+ text-overflow: ellipsis;
1071
+ white-space: nowrap;
1072
+ }
1073
+
1074
+ .openpress-project-component-preview-row figcaption small {
1075
+ flex-shrink: 0;
1076
+ color: rgb(170 176 183 / 62%);
1077
+ font: inherit;
1078
+ }
1079
+
1080
+ .openpress-project-component-preview {
1081
+ display: block;
1082
+ min-width: 0;
1083
+ min-height: 260px;
1084
+ max-height: 520px;
1085
+ overflow: auto;
1086
+ border: 1px solid rgb(255 255 255 / 12%);
1087
+ padding: 18px;
1088
+ background: #f7f9fb;
1089
+ color: var(--openpress-color-ink, #1f2d3d);
1090
+ }
1091
+
1092
+ .openpress-project-component-preview [data-openpress-component] {
1093
+ max-width: 100%;
1094
+ }
1095
+
1096
+ .openpress-project-data-card {
1097
+ display: grid;
1098
+ gap: 12px;
1099
+ min-width: 0;
1100
+ border: 1px solid rgb(255 255 255 / 10%);
1101
+ padding: 14px;
1102
+ background: rgb(255 255 255 / 3%);
1103
+ }
1104
+
1105
+ .openpress-project-data-card header {
1106
+ display: grid;
1107
+ grid-template-columns: 26px minmax(0, 1fr);
1108
+ gap: 10px;
1109
+ align-items: start;
1110
+ min-width: 0;
1111
+ }
1112
+
1113
+ .openpress-project-data-card header svg {
1114
+ width: 16px;
1115
+ height: 16px;
1116
+ margin-top: 2px;
1117
+ color: #d7a034;
1118
+ stroke-width: 1.8;
1119
+ }
1120
+
1121
+ .openpress-project-data-card h3 {
1122
+ margin: 0;
1123
+ color: rgb(242 242 240 / 92%);
1124
+ font-size: 13px;
1125
+ font-weight: 560;
1126
+ line-height: 1.3;
1127
+ overflow-wrap: anywhere;
1128
+ }
1129
+
1130
+ .openpress-project-data-card p {
1131
+ margin: 4px 0 0;
1132
+ color: rgb(184 190 196 / 72%);
1133
+ font-size: 12px;
1134
+ line-height: 1.35;
1135
+ overflow-wrap: anywhere;
1136
+ }
1137
+
1138
+ .openpress-project-data-preview {
1139
+ min-width: 0;
1140
+ border: 1px solid rgb(255 255 255 / 10%);
1141
+ padding: 14px;
1142
+ background: rgb(255 255 255 / 3%);
1143
+ }
1144
+
1145
+ .openpress-project-data-preview--empty {
1146
+ color: rgb(170 176 183 / 62%);
1147
+ font-size: 12px;
1148
+ }
1149
+
1150
+ .openpress-project-data-chart-preview {
1151
+ border: 0;
1152
+ padding: 0;
1153
+ background: transparent;
1154
+ }
1155
+
1156
+ .openpress-project-data-chart-preview .chart-frame {
1157
+ margin: 0;
1158
+ color: var(--openpress-color-ink);
1159
+ }
1160
+
1161
+ .openpress-project-data-chart-preview .cost-donut__layout {
1162
+ width: min(86%, 154mm);
1163
+ }
1164
+
1165
+ .openpress-project-data-chart-preview .revenue-line-chart__svg {
1166
+ max-height: none;
1167
+ }
1168
+
1169
+ .openpress-project-data-raw {
1170
+ min-width: 0;
1171
+ }
1172
+
1173
+ .openpress-project-data-raw summary {
1174
+ cursor: pointer;
1175
+ color: rgb(184 190 196 / 72%);
1176
+ font-size: 11px;
1177
+ line-height: 1.2;
1178
+ }
1179
+
1180
+ .openpress-project-data-raw pre {
1181
+ min-width: 0;
1182
+ max-height: 320px;
1183
+ margin: 10px 0 0;
1184
+ overflow: auto;
1185
+ border: 1px solid rgb(255 255 255 / 10%);
1186
+ padding: 12px;
1187
+ background: #f4f0e7;
1188
+ color: #1f2326;
1189
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1190
+ font-size: 11.5px;
1191
+ line-height: 1.55;
1192
+ white-space: pre-wrap;
1193
+ overflow-wrap: anywhere;
1194
+ }
1195
+
1196
+ .openpress-project-data-card code {
1197
+ font: inherit;
1198
+ }
1199
+
1200
+ .openpress-project-media-sections {
1201
+ display: grid;
1202
+ align-content: start;
1203
+ gap: 28px;
1204
+ min-height: 0;
1205
+ overflow: auto;
1206
+ padding-right: 2px;
1207
+ }
1208
+
1209
+ .openpress-project-media-section {
1210
+ display: grid;
1211
+ gap: 12px;
1212
+ min-width: 0;
1213
+ }
1214
+
1215
+ .openpress-project-media-section-header {
1216
+ display: flex;
1217
+ align-items: baseline;
1218
+ justify-content: space-between;
1219
+ min-width: 0;
1220
+ border-bottom: 1px solid rgb(255 255 255 / 10%);
1221
+ padding-bottom: 8px;
1222
+ }
1223
+
1224
+ .openpress-project-media-section-header h3 {
1225
+ margin: 0;
1226
+ color: rgb(238 238 234 / 90%);
1227
+ font-size: 13px;
1228
+ font-weight: 560;
1229
+ line-height: 1.2;
1230
+ letter-spacing: 0;
1231
+ }
1232
+
1233
+ .openpress-project-media-gallery {
1234
+ display: grid;
1235
+ grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
1236
+ gap: 16px;
1237
+ min-width: 0;
1238
+ }
1239
+
1240
+ .openpress-project-media-card {
1241
+ display: grid;
1242
+ gap: 10px;
1243
+ align-content: start;
1244
+ min-width: 0;
1245
+ margin: 0;
1246
+ }
1247
+
1248
+ .openpress-project-media-card img {
1249
+ width: 100%;
1250
+ aspect-ratio: 16 / 10;
1251
+ object-fit: cover;
1252
+ border: 1px solid rgb(255 255 255 / 10%);
1253
+ background: rgb(255 255 255 / 4%);
1254
+ }
1255
+
1256
+ .openpress-project-media-card[data-unused="true"] img {
1257
+ opacity: 0.42;
1258
+ filter: grayscale(0.7);
1259
+ }
1260
+
1261
+ .openpress-project-media-card figcaption {
1262
+ display: grid;
1263
+ min-width: 0;
1264
+ }
1265
+
1266
+ .openpress-project-media-card strong {
1267
+ min-width: 0;
1268
+ color: rgb(242 242 240 / 92%);
1269
+ font-size: 12px;
1270
+ font-weight: 520;
1271
+ line-height: 1.35;
1272
+ overflow-wrap: anywhere;
1273
+ }
1274
+
1275
+ .openpress-project-media-section-empty {
1276
+ margin: 0;
1277
+ color: rgb(170 176 183 / 62%);
1278
+ font-size: 12px;
1279
+ line-height: 1.45;
1280
+ }
1281
+
1282
+ .openpress-project-empty {
1283
+ width: min(980px, 100%);
1284
+ margin: 0 auto;
1285
+ padding: 28px 24px;
1286
+ color: rgb(170 176 183 / 70%);
1287
+ font-size: 13px;
1288
+ }
1289
+
1290
+ @media (max-width: 900px) {
1291
+ .openpress-project-section-header {
1292
+ grid-template-columns: 1fr;
1293
+ align-items: start;
1294
+ }
1295
+
1296
+ .openpress-project-section-header dl {
1297
+ justify-content: flex-start;
1298
+ }
1299
+
1300
+ .openpress-project-visual-system,
1301
+ .openpress-project-markdown-viewer,
1302
+ .openpress-project-gallery-viewer,
1303
+ .openpress-project-component-viewer {
1304
+ padding: 18px 14px calc(80px + env(safe-area-inset-bottom));
1305
+ }
1306
+
1307
+ .openpress-project-visual-grid {
1308
+ grid-template-columns: 1fr;
1309
+ }
1310
+
1311
+ .openpress-project-visual-card--typography {
1312
+ grid-row: auto;
1313
+ }
1314
+
1315
+ .openpress-project-component-list {
1316
+ grid-template-columns: 1fr;
1317
+ }
1318
+ }