@open-press/core 0.7.1 → 0.8.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 (115) hide show
  1. package/engine/commands/dev.mjs +2 -2
  2. package/engine/output/chrome-pdf.mjs +18 -3
  3. package/engine/output/static-server.mjs +39 -0
  4. package/engine/react/comment-endpoint.mjs +13 -39
  5. package/engine/react/comment-marker.mjs +30 -6
  6. package/engine/react/document-entry.mjs +11 -0
  7. package/engine/react/document-export.mjs +30 -5
  8. package/engine/react/http-json.mjs +24 -0
  9. package/engine/react/mdx-compile.mjs +96 -3
  10. package/engine/react/measurement-css.mjs +93 -1
  11. package/engine/react/object-entities.mjs +119 -0
  12. package/engine/react/pipeline/allocate.mjs +10 -7
  13. package/engine/react/pipeline/frame-measurement.mjs +2 -0
  14. package/engine/react/project-asset-endpoint.mjs +6 -24
  15. package/engine/react/source-edit-endpoint.d.mts +10 -0
  16. package/engine/react/source-edit-endpoint.mjs +75 -0
  17. package/engine/react/sources/mdx-resolver.mjs +12 -14
  18. package/engine/react/style-discovery.mjs +1 -4
  19. package/engine/runtime/file-walk.mjs +22 -0
  20. package/engine/runtime/inspection.mjs +1 -20
  21. package/engine/runtime/path-utils.mjs +20 -0
  22. package/engine/runtime/source-text-tools.d.mts +102 -0
  23. package/engine/runtime/source-text-tools.mjs +551 -16
  24. package/engine/runtime/source-workspace.mjs +4 -31
  25. package/package.json +1 -1
  26. package/src/openpress/{App.tsx → app/OpenPressApp.tsx} +25 -12
  27. package/src/openpress/{renderer.tsx → app/OpenPressRuntime.tsx} +10 -7
  28. package/src/openpress/app/index.ts +2 -0
  29. package/src/openpress/core/Frame.tsx +9 -11
  30. package/src/openpress/core/FrameContext.tsx +8 -3
  31. package/src/openpress/core/MdxArea.tsx +11 -12
  32. package/src/openpress/core/cn.ts +4 -0
  33. package/src/openpress/core/index.tsx +2 -1
  34. package/src/openpress/core/primitives.tsx +29 -8
  35. package/src/openpress/core/types.ts +8 -0
  36. package/src/openpress/{anchorMap.ts → document-model/anchorMapModel.ts} +1 -1
  37. package/src/openpress/{indexes.ts → document-model/documentIndexes.ts} +1 -1
  38. package/src/openpress/{types.ts → document-model/documentTypes.ts} +42 -0
  39. package/src/openpress/document-model/index.ts +6 -0
  40. package/src/openpress/document-model/objectEntityModel.ts +51 -0
  41. package/src/openpress/{projectIdentity.ts → document-model/projectIdentityModel.ts} +1 -1
  42. package/src/openpress/{reactDocumentMetadata.ts → document-model/reactDocumentMetadataModel.ts} +1 -1
  43. package/src/openpress/manuscript/index.tsx +49 -7
  44. package/src/openpress/{publicPage.tsx → reader/PublicReaderPage.tsx} +31 -51
  45. package/src/openpress/{workbenchPanels.tsx → reader/ReaderNavigationPanel.tsx} +6 -5
  46. package/src/openpress/reader/index.ts +10 -0
  47. package/src/openpress/reader/pageViewportScaleModel.ts +73 -0
  48. package/src/openpress/reader/readerTypes.ts +4 -0
  49. package/src/openpress/reader/usePageViewportScale.ts +119 -0
  50. package/src/openpress/reader/usePanelState.ts +56 -0
  51. package/src/openpress/reader/useReaderHashSync.ts +61 -0
  52. package/src/openpress/reader/useReaderKeyboardNav.ts +48 -0
  53. package/src/openpress/reader/useReaderRuntime.ts +146 -0
  54. package/src/openpress/reader/useReaderScrollAnchor.ts +64 -0
  55. package/src/openpress/shared/Panel.tsx +77 -0
  56. package/src/openpress/shared/index.ts +4 -0
  57. package/src/openpress/shared/numberUtils.ts +3 -0
  58. package/src/openpress/{runtimeMode.ts → shared/runtimeMode.ts} +0 -11
  59. package/src/openpress/workbench/Workbench.tsx +407 -0
  60. package/src/openpress/workbench/actions/DeploymentControl.tsx +157 -0
  61. package/src/openpress/workbench/actions/PageZoomControl.tsx +182 -0
  62. package/src/openpress/workbench/actions/SearchControl.tsx +345 -0
  63. package/src/openpress/workbench/actions/deploymentStatusModel.ts +112 -0
  64. package/src/openpress/workbench/actions/index.ts +5 -0
  65. package/src/openpress/workbench/actions/useDeploymentWorkbench.ts +136 -0
  66. package/src/openpress/workbench/dialog/WorkbenchDialog.tsx +72 -0
  67. package/src/openpress/workbench/dialog/index.ts +1 -0
  68. package/src/openpress/workbench/document/components/DocumentPanel.tsx +127 -0
  69. package/src/openpress/workbench/document/components/InlineSourceEditorLayer.tsx +207 -0
  70. package/src/openpress/workbench/document/components/ReaderStage.tsx +9 -0
  71. package/src/openpress/workbench/document/hooks/useDocumentWorkbenchModel.ts +34 -0
  72. package/src/openpress/workbench/document/hooks/useInlineDocumentEditor.ts +525 -0
  73. package/src/openpress/workbench/document/index.ts +10 -0
  74. package/src/openpress/workbench/index.ts +2 -0
  75. package/src/openpress/workbench/inspector/InlineInspectorLayer.tsx +459 -0
  76. package/src/openpress/workbench/inspector/index.ts +5 -0
  77. package/src/openpress/workbench/inspector/inlineCommentModel.ts +125 -0
  78. package/src/openpress/workbench/inspector/inspectorGeometryModel.ts +160 -0
  79. package/src/openpress/workbench/inspector/inspectorModel.ts +408 -0
  80. package/src/openpress/workbench/inspector/useInspectorComments.ts +248 -0
  81. package/src/openpress/workbench/mentions/MentionSuggestionList.tsx +41 -0
  82. package/src/openpress/workbench/mentions/index.ts +2 -0
  83. package/src/openpress/{composerMentions.ts → workbench/mentions/useComposerMentions.ts} +1 -4
  84. package/src/openpress/workbench/panels/Panel.tsx +1 -0
  85. package/src/openpress/workbench/panels/PendingCommentsPanel.tsx +76 -0
  86. package/src/openpress/workbench/panels/WorkbenchControlPanel.tsx +29 -0
  87. package/src/openpress/workbench/panels/index.ts +3 -0
  88. package/src/openpress/workbench/project/ProjectEntryPanel.tsx +523 -0
  89. package/src/openpress/workbench/project/ProjectPreviewDialog.tsx +35 -0
  90. package/src/openpress/workbench/project/index.ts +2 -0
  91. package/src/openpress/workbench/project/projectPreviewTypes.ts +11 -0
  92. package/src/openpress/workbench/shell/WorkbenchShell.tsx +167 -0
  93. package/src/openpress/workbench/shell/index.ts +1 -0
  94. package/src/openpress/workbench/workbenchFormatters.ts +120 -0
  95. package/src/openpress/workbench/workbenchTypes.ts +35 -0
  96. package/src/styles/openpress/print-route.css +0 -2
  97. package/src/styles/openpress/{project-workspace.css → project-preview-panel.css} +13 -407
  98. package/src/styles/openpress/public-viewer.css +25 -320
  99. package/src/styles/openpress/reader-runtime.css +243 -55
  100. package/src/styles/openpress/responsive.css +145 -270
  101. package/src/styles/openpress/workbench-panels.css +214 -178
  102. package/src/styles/openpress/workbench.css +986 -451
  103. package/src/styles/openpress.css +1 -1
  104. package/vite.config.ts +50 -0
  105. package/src/openpress/inspector.ts +0 -282
  106. package/src/openpress/projectWorkspace.tsx +0 -919
  107. package/src/openpress/readerRuntime.ts +0 -230
  108. package/src/openpress/workbench.tsx +0 -1265
  109. package/src/openpress/workbenchTypes.ts +0 -4
  110. /package/src/openpress/{readerPageRegistry.ts → reader/readerPageRegistry.ts} +0 -0
  111. /package/src/openpress/{pageRoute.ts → reader/readerPageRoute.ts} +0 -0
  112. /package/src/openpress/{readerScroll.ts → reader/readerScroll.ts} +0 -0
  113. /package/src/openpress/{readerState.ts → reader/readerStateModel.ts} +0 -0
  114. /package/src/openpress/{frameScheduler.ts → shared/frameScheduler.ts} +0 -0
  115. /package/src/openpress/{projectSources.ts → workbench/project/projectSourceModel.ts} +0 -0
@@ -1,4 +1,4 @@
1
- .openpress-project-workspace {
1
+ .openpress-project-preview-panel {
2
2
  width: 100%;
3
3
  min-width: 0;
4
4
  min-height: 100%;
@@ -8,7 +8,8 @@
8
8
  }
9
9
 
10
10
  .openpress-project-panel {
11
- display: block;
11
+ display: grid;
12
+ gap: 18px;
12
13
  min-height: 0;
13
14
  padding: 4px 18px 18px 22px;
14
15
  overflow: auto;
@@ -25,13 +26,8 @@
25
26
  display: grid;
26
27
  gap: 10px;
27
28
  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
29
  border-top: 0;
34
- padding-top: 0;
30
+ padding: 0;
35
31
  }
36
32
 
37
33
  .openpress-project-tool-header {
@@ -51,70 +47,6 @@
51
47
  text-transform: uppercase;
52
48
  }
53
49
 
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
50
  .openpress-project-asset-list,
119
51
  .openpress-project-component-mention-list {
120
52
  display: grid;
@@ -168,23 +100,13 @@
168
100
  min-width: 0;
169
101
  }
170
102
 
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
-
103
+ .openpress-project-asset-body strong,
182
104
  .openpress-project-component-mention-list strong {
183
105
  min-width: 0;
184
106
  overflow: hidden;
185
- color: rgb(214 218 220 / 86%);
186
- font-size: 13.5px;
187
- font-weight: 560;
107
+ color: rgb(214 218 220 / 84%);
108
+ font-size: 12.5px;
109
+ font-weight: 540;
188
110
  line-height: 1.25;
189
111
  text-overflow: ellipsis;
190
112
  white-space: nowrap;
@@ -203,120 +125,16 @@
203
125
  stroke-width: 1.7;
204
126
  }
205
127
 
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
- }
128
+ /* Backdrop / panel / header / close styles now come from the shared
129
+ .openpress-workbench-dialog* class family. Only project-preview-specific
130
+ pieces (rename/delete pill actions, body preview surface, footer forms +
131
+ comment composer) live in this file. */
314
132
 
315
133
  .openpress-project-preview-dialog__body {
316
134
  min-width: 0;
317
135
  min-height: 0;
318
136
  overflow: auto;
319
- padding: 18px;
137
+ padding: 12px 24px 24px;
320
138
  }
321
139
 
322
140
  .openpress-project-preview-dialog__body[data-preview-kind="media"] {
@@ -347,218 +165,6 @@
347
165
  min-width: min-content;
348
166
  }
349
167
 
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
168
 
563
169
  .openpress-project-markdown-header dt {
564
170
  color: rgb(175 181 188 / 64%);