@open-press/core 0.7.0 → 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 (116) hide show
  1. package/engine/commands/dev.mjs +2 -2
  2. package/engine/commands/upgrade.mjs +47 -5
  3. package/engine/output/chrome-pdf.mjs +18 -3
  4. package/engine/output/static-server.mjs +39 -0
  5. package/engine/react/comment-endpoint.mjs +13 -39
  6. package/engine/react/comment-marker.mjs +30 -6
  7. package/engine/react/document-entry.mjs +11 -0
  8. package/engine/react/document-export.mjs +45 -5
  9. package/engine/react/http-json.mjs +24 -0
  10. package/engine/react/mdx-compile.mjs +187 -3
  11. package/engine/react/measurement-css.mjs +93 -1
  12. package/engine/react/object-entities.mjs +119 -0
  13. package/engine/react/pipeline/allocate.mjs +10 -7
  14. package/engine/react/pipeline/frame-measurement.mjs +40 -9
  15. package/engine/react/project-asset-endpoint.mjs +6 -24
  16. package/engine/react/source-edit-endpoint.d.mts +10 -0
  17. package/engine/react/source-edit-endpoint.mjs +75 -0
  18. package/engine/react/sources/mdx-resolver.mjs +12 -14
  19. package/engine/react/style-discovery.mjs +1 -4
  20. package/engine/runtime/file-walk.mjs +22 -0
  21. package/engine/runtime/inspection.mjs +1 -20
  22. package/engine/runtime/path-utils.mjs +20 -0
  23. package/engine/runtime/source-text-tools.d.mts +102 -0
  24. package/engine/runtime/source-text-tools.mjs +551 -16
  25. package/engine/runtime/source-workspace.mjs +4 -31
  26. package/package.json +1 -1
  27. package/src/openpress/{App.tsx → app/OpenPressApp.tsx} +25 -12
  28. package/src/openpress/{renderer.tsx → app/OpenPressRuntime.tsx} +10 -7
  29. package/src/openpress/app/index.ts +2 -0
  30. package/src/openpress/core/Frame.tsx +9 -11
  31. package/src/openpress/core/FrameContext.tsx +8 -3
  32. package/src/openpress/core/MdxArea.tsx +11 -12
  33. package/src/openpress/core/cn.ts +4 -0
  34. package/src/openpress/core/index.tsx +2 -1
  35. package/src/openpress/core/primitives.tsx +29 -8
  36. package/src/openpress/core/types.ts +8 -0
  37. package/src/openpress/{anchorMap.ts → document-model/anchorMapModel.ts} +1 -1
  38. package/src/openpress/{indexes.ts → document-model/documentIndexes.ts} +1 -1
  39. package/src/openpress/{types.ts → document-model/documentTypes.ts} +42 -0
  40. package/src/openpress/document-model/index.ts +6 -0
  41. package/src/openpress/document-model/objectEntityModel.ts +51 -0
  42. package/src/openpress/{projectIdentity.ts → document-model/projectIdentityModel.ts} +1 -1
  43. package/src/openpress/{reactDocumentMetadata.ts → document-model/reactDocumentMetadataModel.ts} +1 -1
  44. package/src/openpress/manuscript/index.tsx +49 -7
  45. package/src/openpress/{publicPage.tsx → reader/PublicReaderPage.tsx} +31 -51
  46. package/src/openpress/{workbenchPanels.tsx → reader/ReaderNavigationPanel.tsx} +6 -5
  47. package/src/openpress/reader/index.ts +10 -0
  48. package/src/openpress/reader/pageViewportScaleModel.ts +73 -0
  49. package/src/openpress/reader/readerTypes.ts +4 -0
  50. package/src/openpress/reader/usePageViewportScale.ts +119 -0
  51. package/src/openpress/reader/usePanelState.ts +56 -0
  52. package/src/openpress/reader/useReaderHashSync.ts +61 -0
  53. package/src/openpress/reader/useReaderKeyboardNav.ts +48 -0
  54. package/src/openpress/reader/useReaderRuntime.ts +146 -0
  55. package/src/openpress/reader/useReaderScrollAnchor.ts +64 -0
  56. package/src/openpress/shared/Panel.tsx +77 -0
  57. package/src/openpress/shared/index.ts +4 -0
  58. package/src/openpress/shared/numberUtils.ts +3 -0
  59. package/src/openpress/{runtimeMode.ts → shared/runtimeMode.ts} +0 -11
  60. package/src/openpress/workbench/Workbench.tsx +407 -0
  61. package/src/openpress/workbench/actions/DeploymentControl.tsx +157 -0
  62. package/src/openpress/workbench/actions/PageZoomControl.tsx +182 -0
  63. package/src/openpress/workbench/actions/SearchControl.tsx +345 -0
  64. package/src/openpress/workbench/actions/deploymentStatusModel.ts +112 -0
  65. package/src/openpress/workbench/actions/index.ts +5 -0
  66. package/src/openpress/workbench/actions/useDeploymentWorkbench.ts +136 -0
  67. package/src/openpress/workbench/dialog/WorkbenchDialog.tsx +72 -0
  68. package/src/openpress/workbench/dialog/index.ts +1 -0
  69. package/src/openpress/workbench/document/components/DocumentPanel.tsx +127 -0
  70. package/src/openpress/workbench/document/components/InlineSourceEditorLayer.tsx +207 -0
  71. package/src/openpress/workbench/document/components/ReaderStage.tsx +9 -0
  72. package/src/openpress/workbench/document/hooks/useDocumentWorkbenchModel.ts +34 -0
  73. package/src/openpress/workbench/document/hooks/useInlineDocumentEditor.ts +525 -0
  74. package/src/openpress/workbench/document/index.ts +10 -0
  75. package/src/openpress/workbench/index.ts +2 -0
  76. package/src/openpress/workbench/inspector/InlineInspectorLayer.tsx +459 -0
  77. package/src/openpress/workbench/inspector/index.ts +5 -0
  78. package/src/openpress/workbench/inspector/inlineCommentModel.ts +125 -0
  79. package/src/openpress/workbench/inspector/inspectorGeometryModel.ts +160 -0
  80. package/src/openpress/workbench/inspector/inspectorModel.ts +408 -0
  81. package/src/openpress/workbench/inspector/useInspectorComments.ts +248 -0
  82. package/src/openpress/workbench/mentions/MentionSuggestionList.tsx +41 -0
  83. package/src/openpress/workbench/mentions/index.ts +2 -0
  84. package/src/openpress/{composerMentions.ts → workbench/mentions/useComposerMentions.ts} +1 -4
  85. package/src/openpress/workbench/panels/Panel.tsx +1 -0
  86. package/src/openpress/workbench/panels/PendingCommentsPanel.tsx +76 -0
  87. package/src/openpress/workbench/panels/WorkbenchControlPanel.tsx +29 -0
  88. package/src/openpress/workbench/panels/index.ts +3 -0
  89. package/src/openpress/workbench/project/ProjectEntryPanel.tsx +523 -0
  90. package/src/openpress/workbench/project/ProjectPreviewDialog.tsx +35 -0
  91. package/src/openpress/workbench/project/index.ts +2 -0
  92. package/src/openpress/workbench/project/projectPreviewTypes.ts +11 -0
  93. package/src/openpress/workbench/shell/WorkbenchShell.tsx +167 -0
  94. package/src/openpress/workbench/shell/index.ts +1 -0
  95. package/src/openpress/workbench/workbenchFormatters.ts +120 -0
  96. package/src/openpress/workbench/workbenchTypes.ts +35 -0
  97. package/src/styles/openpress/print-route.css +0 -2
  98. package/src/styles/openpress/{project-workspace.css → project-preview-panel.css} +13 -407
  99. package/src/styles/openpress/public-viewer.css +25 -320
  100. package/src/styles/openpress/reader-runtime.css +243 -55
  101. package/src/styles/openpress/responsive.css +145 -270
  102. package/src/styles/openpress/workbench-panels.css +214 -178
  103. package/src/styles/openpress/workbench.css +986 -451
  104. package/src/styles/openpress.css +1 -1
  105. package/vite.config.ts +50 -0
  106. package/src/openpress/inspector.ts +0 -282
  107. package/src/openpress/projectWorkspace.tsx +0 -919
  108. package/src/openpress/readerRuntime.ts +0 -230
  109. package/src/openpress/workbench.tsx +0 -1265
  110. package/src/openpress/workbenchTypes.ts +0 -4
  111. /package/src/openpress/{readerPageRegistry.ts → reader/readerPageRegistry.ts} +0 -0
  112. /package/src/openpress/{pageRoute.ts → reader/readerPageRoute.ts} +0 -0
  113. /package/src/openpress/{readerScroll.ts → reader/readerScroll.ts} +0 -0
  114. /package/src/openpress/{readerState.ts → reader/readerStateModel.ts} +0 -0
  115. /package/src/openpress/{frameScheduler.ts → shared/frameScheduler.ts} +0 -0
  116. /package/src/openpress/{projectSources.ts → workbench/project/projectSourceModel.ts} +0 -0
@@ -5,10 +5,6 @@
5
5
  color: var(--openpress-text);
6
6
  }
7
7
 
8
- .openpress-workbench[data-panel-open="false"] {
9
- grid-template-columns: 0 minmax(0, 1fr);
10
- }
11
-
12
8
  .openpress-public-shell {
13
9
  position: fixed;
14
10
  inset: 0;
@@ -19,671 +15,1217 @@
19
15
  overscroll-behavior: none;
20
16
  }
21
17
 
22
- .openpress-panel-toggle {
23
- position: fixed;
24
- top: max(14px, env(safe-area-inset-top));
25
- left: max(14px, env(safe-area-inset-left));
26
- z-index: 35;
27
- display: inline-flex;
18
+ .openpress-workbench__stage {
19
+ grid-area: main;
20
+ min-width: 0;
21
+ container-type: inline-size;
22
+ padding: 0;
23
+ overflow: hidden;
24
+ background: #141414;
25
+ scrollbar-width: none;
26
+ }
27
+
28
+ .openpress-workbench__stage::-webkit-scrollbar {
29
+ width: 0;
30
+ height: 0;
31
+ display: none;
32
+ }
33
+
34
+ .openpress-public-viewer.openpress-workbench-shell.openpress-reader-app,
35
+ .openpress-public-viewer.openpress-workbench-shell.openpress-reader-app.is-closed-left,
36
+ .openpress-public-viewer.openpress-workbench-shell.openpress-reader-app.is-closed-right,
37
+ .openpress-public-viewer.openpress-workbench-shell.openpress-reader-app.is-closed-left.is-closed-right {
38
+ --openpress-workbench-toolbar-height: 44px;
39
+ --openpress-workbench-left-width: clamp(260px, 18vw, 330px);
40
+ --openpress-workbench-right-width: clamp(304px, 22vw, 390px);
41
+ display: grid;
42
+ grid-template-rows: var(--openpress-workbench-toolbar-height) minmax(0, 1fr);
43
+ grid-template-columns: var(--openpress-workbench-left-width) minmax(0, 1fr) var(--openpress-workbench-right-width);
44
+ grid-template-areas:
45
+ "toolbar toolbar toolbar"
46
+ "left main right";
47
+ }
48
+
49
+ .openpress-public-viewer.openpress-workbench-shell.openpress-reader-app.is-closed-right {
50
+ grid-template-columns: var(--openpress-workbench-left-width) minmax(0, 1fr) 0;
51
+ }
52
+
53
+ .openpress-public-viewer.openpress-workbench-shell.openpress-reader-app.is-closed-left {
54
+ grid-template-columns: 0 minmax(0, 1fr) var(--openpress-workbench-right-width);
55
+ }
56
+
57
+ .openpress-public-viewer.openpress-workbench-shell.openpress-reader-app.is-closed-left.is-closed-right {
58
+ grid-template-columns: 0 minmax(0, 1fr) 0;
59
+ }
60
+
61
+ .openpress-workbench-toolbar {
62
+ z-index: 30;
63
+ display: flex;
64
+ min-width: 0;
65
+ height: var(--openpress-workbench-toolbar-height, 44px);
66
+ min-height: 0;
67
+ grid-area: toolbar;
68
+ align-items: center;
69
+ justify-content: space-between;
70
+ gap: 12px;
71
+ border-bottom: 1px solid rgb(255 255 255 / 9%);
72
+ padding: 0 12px;
73
+ background: rgb(18 18 18 / 96%);
74
+ backdrop-filter: blur(18px);
75
+ }
76
+
77
+ .openpress-workbench-toolbar__content {
78
+ display: flex;
79
+ flex: 1 1 auto;
80
+ min-width: 0;
81
+ align-items: center;
82
+ justify-content: space-between;
83
+ gap: 12px;
84
+ }
85
+
86
+ .openpress-workbench-toolbar__group {
87
+ display: flex;
88
+ min-width: 0;
28
89
  align-items: center;
29
90
  gap: 8px;
30
- border: 1px solid rgb(255 255 255 / 14%);
31
- border-radius: 999px;
32
- padding: 9px 12px;
33
- background: rgb(20 20 20 / 86%);
91
+ }
92
+
93
+ .openpress-workbench-toolbar__group--right {
94
+ justify-content: flex-end;
95
+ }
96
+
97
+ .openpress-workbench-toolbar__group--page {
98
+ flex: 1 1 auto;
99
+ justify-content: center;
100
+ }
101
+
102
+ .openpress-workbench-toolbar-panel-toggle {
103
+ display: inline-flex;
104
+ width: 30px;
105
+ height: 30px;
106
+ flex: 0 0 auto;
107
+ align-items: center;
108
+ justify-content: center;
109
+ border: 1px solid transparent;
110
+ border-radius: 4px;
111
+ padding: 0;
112
+ background: transparent;
113
+ color: #8e949b;
114
+ cursor: pointer;
115
+ transition:
116
+ color 160ms ease,
117
+ transform 160ms ease;
118
+ }
119
+
120
+ .openpress-workbench-toolbar-panel-toggle:hover {
34
121
  color: #f2f2f0;
122
+ }
123
+
124
+ .openpress-workbench-toolbar-panel-toggle:active {
125
+ transform: translateY(1px);
126
+ }
127
+
128
+ .openpress-workbench-toolbar-panel-toggle svg {
129
+ width: 14px;
130
+ height: 14px;
131
+ }
132
+
133
+ .openpress-workbench-page-geometry,
134
+ .openpress-workbench-zoom-control {
135
+ display: inline-flex;
136
+ overflow: hidden;
137
+ height: 30px;
138
+ max-width: min(34vw, 280px);
139
+ align-items: center;
140
+ justify-content: center;
141
+ gap: 7px;
142
+ border: 1px solid transparent;
143
+ border-radius: 4px;
144
+ padding: 0 8px;
145
+ background: transparent;
146
+ color: #aeb3b8;
35
147
  font: inherit;
36
- font-size: 13px;
37
148
  line-height: 1;
149
+ white-space: nowrap;
38
150
  cursor: pointer;
39
- backdrop-filter: blur(14px);
40
- box-shadow: 0 10px 26px rgb(0 0 0 / 28%);
151
+ transition:
152
+ border-color 160ms ease,
153
+ background 160ms ease,
154
+ color 160ms ease,
155
+ transform 160ms ease;
41
156
  }
42
157
 
43
- .openpress-panel-toggle:hover {
44
- border-color: rgb(255 255 255 / 24%);
45
- background: rgb(28 28 28 / 92%);
158
+ .openpress-workbench-page-geometry:hover,
159
+ .openpress-workbench-zoom-control:hover {
160
+ color: #f2f2f0;
46
161
  }
47
162
 
48
- .openpress-panel-toggle span[aria-hidden="true"] {
49
- width: 14px;
50
- color: var(--openpress-accent);
51
- font-size: 16px;
52
- line-height: 0.8;
53
- text-align: center;
163
+ .openpress-workbench-page-geometry:active,
164
+ .openpress-workbench-zoom-control:active {
165
+ transform: translateY(1px);
54
166
  }
55
167
 
56
- .openpress-panel-scrim {
57
- display: none;
168
+ .openpress-workbench-page-geometry svg,
169
+ .openpress-workbench-zoom-control svg {
170
+ width: 13px;
171
+ height: 13px;
172
+ flex: 0 0 auto;
173
+ color: currentColor;
58
174
  }
59
175
 
60
- .openpress-workbench__sidebar {
61
- position: sticky;
62
- top: 0;
63
- z-index: 25;
64
- height: 100vh;
65
- border-right: 1px solid rgb(255 255 255 / 10%);
66
- padding: 72px 18px 24px;
67
- overflow: auto;
68
- background: #171717;
69
- color: #d8dadd;
70
- scrollbar-color: var(--openpress-scrollbar-thumb) var(--openpress-scrollbar-track-sidebar);
71
- scrollbar-gutter: stable;
72
- scrollbar-width: thin;
73
- transition: opacity 160ms ease, transform 160ms ease;
176
+ .openpress-workbench-page-geometry__label,
177
+ .openpress-workbench-page-geometry__dimensions {
178
+ overflow: hidden;
179
+ min-width: 0;
180
+ text-overflow: ellipsis;
181
+ white-space: nowrap;
74
182
  }
75
183
 
76
- .openpress-workbench[data-panel-open="false"] .openpress-workbench__sidebar {
77
- transform: translateX(-100%);
78
- opacity: 0;
79
- pointer-events: none;
184
+ .openpress-workbench-page-geometry__label {
185
+ color: #d8dadd;
186
+ font-size: 11px;
187
+ font-weight: 560;
80
188
  }
81
189
 
82
- .openpress-workbench__sidebar::-webkit-scrollbar {
83
- width: 8px;
190
+ .openpress-workbench-page-geometry__dimensions {
191
+ color: #7f858c;
192
+ font-family: var(--openpress-font-mono);
193
+ font-size: 10px;
194
+ font-weight: 500;
84
195
  }
85
196
 
86
- .openpress-workbench__sidebar::-webkit-scrollbar-track {
87
- background: var(--openpress-scrollbar-track-sidebar);
197
+ .openpress-workbench-zoom-control {
198
+ max-width: min(20vw, 92px);
199
+ color: #9fa5ab;
200
+ font-family: var(--openpress-font-mono);
201
+ font-size: 10px;
202
+ font-weight: 650;
88
203
  }
89
204
 
90
- .openpress-workbench__sidebar::-webkit-scrollbar-thumb {
91
- border-color: var(--openpress-scrollbar-track-sidebar);
205
+ .openpress-workbench-zoom-control-wrap {
206
+ position: relative;
207
+ display: inline-flex;
92
208
  }
93
209
 
94
- .openpress-workbench__brand {
95
- display: flex;
96
- align-items: baseline;
97
- justify-content: space-between;
98
- gap: 12px;
99
- margin-bottom: 28px;
210
+ .openpress-workbench-zoom-control__chevron {
211
+ width: 12px !important;
212
+ height: 12px !important;
213
+ opacity: 0.7;
100
214
  }
101
215
 
102
- .openpress-workbench__brand span {
103
- color: var(--openpress-accent);
104
- font-size: 13px;
216
+ .openpress-workbench-zoom-control[aria-expanded="true"],
217
+ .openpress-workbench-zoom-control[data-openpress-toolbar-active="true"] {
218
+ border-color: rgb(242 242 240 / 16%);
219
+ background: rgb(242 242 240 / 7%);
220
+ color: #f2f2f0;
105
221
  }
106
222
 
107
- .openpress-workbench__brand strong {
108
- font-size: 20px;
109
- font-weight: 500;
223
+ .openpress-workbench-zoom-menu {
224
+ position: absolute;
225
+ top: calc(100% + 8px);
226
+ left: 50%;
227
+ z-index: 80;
228
+ display: grid;
229
+ width: 188px;
230
+ gap: 6px;
231
+ border: 1px solid rgb(255 255 255 / 16%);
232
+ border-radius: 10px;
233
+ padding: 8px;
234
+ background: rgb(46 47 46 / 96%);
235
+ box-shadow: 0 18px 42px rgb(0 0 0 / 34%);
236
+ color: rgb(245 245 242 / 88%);
237
+ transform: translateX(-50%);
238
+ backdrop-filter: blur(18px);
110
239
  }
111
240
 
112
- .openpress-workbench__meta {
113
- border-top: 1px solid rgb(255 255 255 / 10%);
114
- border-bottom: 1px solid rgb(255 255 255 / 10%);
115
- padding: 16px 0;
241
+ .openpress-workbench-zoom-menu__section {
242
+ display: grid;
243
+ gap: 2px;
116
244
  }
117
245
 
118
- .openpress-workbench__meta p {
119
- margin: 0;
120
- color: #f4f4f2;
121
- font-size: 15px;
122
- line-height: 1.5;
246
+ .openpress-workbench-zoom-menu__divider {
247
+ height: 1px;
248
+ margin: 4px 6px;
249
+ background: rgb(255 255 255 / 14%);
123
250
  }
124
251
 
125
- .openpress-workbench__meta small {
126
- display: block;
127
- margin-top: 8px;
128
- color: #8e949b;
252
+ .openpress-workbench-zoom-menu__item {
253
+ display: grid;
254
+ grid-template-columns: 18px 18px minmax(0, 1fr);
255
+ min-height: 30px;
256
+ align-items: center;
257
+ gap: 9px;
258
+ border: 0;
259
+ border-radius: 6px;
260
+ padding: 0 8px;
261
+ background: transparent;
262
+ color: inherit;
263
+ font: inherit;
129
264
  font-size: 12px;
265
+ font-weight: 650;
266
+ line-height: 1;
267
+ text-align: left;
268
+ cursor: pointer;
130
269
  }
131
270
 
132
- .openpress-source-list {
133
- display: flex;
134
- flex-direction: column;
135
- gap: 8px;
136
- margin-top: 18px;
271
+ .openpress-workbench-zoom-menu__item:hover,
272
+ .openpress-workbench-zoom-menu__item:focus-visible {
273
+ background: rgb(255 255 255 / 9%);
274
+ outline: 0;
137
275
  }
138
276
 
139
- .openpress-source-list__item {
277
+ .openpress-workbench-zoom-menu__item[aria-checked="true"] {
278
+ color: #ffffff;
279
+ }
280
+
281
+ .openpress-workbench-zoom-menu__item svg {
282
+ width: 15px;
283
+ height: 15px;
284
+ }
285
+
286
+ .openpress-workbench-zoom-menu__check {
140
287
  display: grid;
141
- grid-template-columns: 32px minmax(0, 1fr);
142
- gap: 8px;
288
+ width: 18px;
289
+ height: 18px;
290
+ place-items: center;
291
+ }
292
+
293
+ .openpress-workbench-zoom-menu__spacer {
294
+ width: 18px;
295
+ height: 1px;
296
+ }
297
+
298
+ .openpress-workbench-toolbar-action {
299
+ position: relative;
300
+ display: inline-flex;
301
+ overflow: hidden;
302
+ height: 30px;
303
+ width: 30px;
304
+ min-width: 30px;
305
+ max-width: 30px;
306
+ align-items: center;
307
+ justify-content: center;
308
+ gap: 0;
143
309
  border: 1px solid transparent;
144
- padding: 10px 8px;
145
- color: inherit;
310
+ border-radius: 4px;
311
+ padding: 0;
312
+ background: transparent;
313
+ color: #aeb3b8;
314
+ font: inherit;
315
+ font-size: 11px;
316
+ font-weight: 500;
317
+ line-height: 1;
146
318
  text-decoration: none;
319
+ white-space: nowrap;
320
+ cursor: pointer;
321
+ transition:
322
+ border-color 160ms ease,
323
+ background 160ms ease,
324
+ color 160ms ease,
325
+ transform 160ms ease;
147
326
  }
148
327
 
149
- .openpress-source-list__item:hover {
150
- border-color: rgb(255 255 255 / 12%);
151
- background: rgb(255 255 255 / 4%);
328
+ .openpress-workbench-toolbar-action:hover:not(:disabled) {
329
+ color: #f2f2f0;
152
330
  }
153
331
 
154
- .openpress-source-list__item span {
155
- color: #777d84;
156
- font-size: 12px;
157
- line-height: 1.5;
332
+ .openpress-workbench-toolbar-action:active:not(:disabled) {
333
+ transform: translateY(1px);
334
+ }
335
+
336
+ .openpress-workbench-toolbar-action:disabled {
337
+ cursor: progress;
338
+ color: #a7adb2;
339
+ opacity: 0.62;
340
+ }
341
+
342
+ .openpress-workbench-toolbar-action[data-openpress-toolbar-expanded="true"] {
343
+ width: auto;
344
+ min-width: 30px;
345
+ max-width: min(34vw, 300px);
346
+ gap: 7px;
347
+ padding: 0 10px;
348
+ }
349
+
350
+ .openpress-workbench-toolbar-action[data-openpress-toolbar-active="true"] {
351
+ border-color: rgb(240 182 76 / 34%);
352
+ background: rgb(240 182 76 / 8%);
353
+ color: rgb(240 182 76 / 92%);
354
+ }
355
+
356
+ .openpress-workbench-toolbar-action[data-openpress-deploy-status="online"] {
357
+ color: rgb(110 231 160 / 88%);
358
+ }
359
+
360
+ .openpress-workbench-toolbar-action[data-openpress-deploy-status="dirty"],
361
+ .openpress-workbench-toolbar-action[data-openpress-deploy-status="deploying"] {
362
+ color: rgb(240 182 76 / 92%);
363
+ }
364
+
365
+ .openpress-workbench-toolbar-action[data-openpress-deploy-status="failed"] {
366
+ color: rgb(248 113 113 / 90%);
367
+ }
368
+
369
+ .openpress-workbench-toolbar-action[data-deploy-status="deploying"]::after {
370
+ position: absolute;
371
+ inset: 3px;
372
+ border: 1px solid rgb(240 182 76 / 36%);
373
+ border-top-color: rgb(240 182 76 / 96%);
374
+ border-radius: 999px;
375
+ animation: openpress-toolbar-deploy-spin 0.9s linear infinite;
376
+ content: "";
377
+ }
378
+
379
+ .openpress-workbench-toolbar-action[data-deploy-status="deploying"] svg {
380
+ animation: openpress-toolbar-deploy-pulse 0.9s ease-in-out infinite alternate;
381
+ }
382
+
383
+ .openpress-workbench-toolbar-action svg {
384
+ width: 13px;
385
+ height: 13px;
386
+ flex: 0 0 auto;
387
+ color: currentColor;
158
388
  }
159
389
 
160
- .openpress-source-list__item strong {
390
+ .openpress-workbench-toolbar-action__label,
391
+ .openpress-workbench-toolbar-action .openpress-dev-pdf-status,
392
+ .openpress-workbench-toolbar-action .openpress-dev-deploy-status,
393
+ .openpress-workbench-toolbar-action .openpress-dev-edit-status,
394
+ .openpress-workbench-toolbar-action .openpress-dev-inspector-status {
395
+ display: none;
161
396
  overflow: hidden;
162
- color: #d8dadd;
163
- font-size: 13px;
164
- font-weight: 400;
165
- line-height: 1.45;
397
+ min-width: 0;
166
398
  text-overflow: ellipsis;
167
399
  white-space: nowrap;
168
400
  }
169
401
 
170
- .openpress-source-list__item small {
171
- grid-column: 2;
402
+ .openpress-workbench-toolbar-action[data-openpress-toolbar-expanded="true"] .openpress-workbench-toolbar-action__label,
403
+ .openpress-workbench-toolbar-action[data-openpress-toolbar-expanded="true"] .openpress-dev-pdf-status,
404
+ .openpress-workbench-toolbar-action[data-openpress-toolbar-expanded="true"] .openpress-dev-deploy-status,
405
+ .openpress-workbench-toolbar-action[data-openpress-toolbar-expanded="true"] .openpress-dev-edit-status,
406
+ .openpress-workbench-toolbar-action[data-openpress-toolbar-expanded="true"] .openpress-dev-inspector-status {
407
+ display: inline-flex;
408
+ }
409
+
410
+ .openpress-workbench-toolbar-action .openpress-dev-pdf-status,
411
+ .openpress-workbench-toolbar-action .openpress-dev-deploy-status,
412
+ .openpress-workbench-toolbar-action .openpress-dev-edit-status,
413
+ .openpress-workbench-toolbar-action .openpress-dev-inspector-status {
414
+ max-width: 150px;
415
+ font-size: 10px;
416
+ }
417
+
418
+ .openpress-dev-edit-status {
419
+ align-items: center;
420
+ gap: 5px;
421
+ }
422
+
423
+ .openpress-dev-edit-status--toolbar {
424
+ display: inline-flex;
425
+ max-width: 132px;
426
+ min-height: 24px;
427
+ align-items: center;
428
+ gap: 6px;
172
429
  overflow: hidden;
173
- color: #7f858c;
174
- font-size: 11px;
430
+ border: 1px solid rgb(240 182 76 / 18%);
431
+ border-radius: 4px;
432
+ padding: 0 8px;
433
+ background: rgb(240 182 76 / 7%);
434
+ color: rgb(240 182 76 / 88%);
435
+ font-size: 10px;
436
+ line-height: 1;
175
437
  text-overflow: ellipsis;
176
438
  white-space: nowrap;
177
439
  }
178
440
 
179
- .openpress-workbench__stage {
180
- grid-area: main;
441
+ .openpress-dev-edit-status[data-openpress-edit-status="failed"] {
442
+ color: rgb(248 113 113 / 92%);
443
+ }
444
+
445
+ .openpress-dev-edit-status__spinner {
446
+ width: 9px;
447
+ height: 9px;
448
+ flex: 0 0 auto;
449
+ border: 1px solid rgb(240 182 76 / 32%);
450
+ border-top-color: rgb(240 182 76 / 96%);
451
+ border-radius: 999px;
452
+ animation: openpress-toolbar-deploy-spin 0.8s linear infinite;
453
+ }
454
+
455
+ .openpress-workbench-toolbar > .openpress-dev-inspector-status {
456
+ max-width: 180px;
457
+ flex: 0 1 auto;
458
+ color: rgb(198 204 210 / 70%);
459
+ font-size: 10px;
460
+ }
461
+
462
+ .openpress-dev-deploy-status--toolbar {
463
+ max-width: 86px;
464
+ overflow: hidden;
465
+ color: rgb(240 182 76 / 86%);
466
+ text-overflow: ellipsis;
467
+ }
468
+
469
+ .openpress-inline-source-editor-layer {
470
+ position: fixed;
471
+ inset: 0;
472
+ z-index: 980;
473
+ pointer-events: none;
474
+ }
475
+
476
+ .openpress-inline-source-editor {
477
+ position: fixed;
478
+ display: grid;
479
+ gap: 10px;
480
+ max-width: calc(100vw - 28px);
481
+ border: 1px solid rgb(255 255 255 / 12%);
482
+ border-radius: 6px;
483
+ padding: 12px;
484
+ background: #151716;
485
+ color: rgb(242 242 238 / 94%);
486
+ box-shadow: 0 18px 46px rgb(0 0 0 / 34%);
487
+ pointer-events: auto;
488
+ }
489
+
490
+ .openpress-inline-source-editor__header,
491
+ .openpress-inline-source-editor__footer {
492
+ display: flex;
493
+ align-items: center;
494
+ justify-content: space-between;
495
+ gap: 10px;
181
496
  min-width: 0;
182
- container-type: inline-size;
183
- padding: 0;
497
+ }
498
+
499
+ .openpress-inline-source-editor__header > div {
500
+ display: grid;
501
+ gap: 4px;
502
+ min-width: 0;
503
+ }
504
+
505
+ .openpress-inline-source-editor__header strong {
184
506
  overflow: hidden;
185
- background: #141414;
186
- scrollbar-width: none;
507
+ font-size: 12px;
508
+ font-weight: 650;
509
+ line-height: 1.1;
510
+ text-overflow: ellipsis;
511
+ white-space: nowrap;
187
512
  }
188
513
 
189
- .openpress-workbench__stage::-webkit-scrollbar {
190
- width: 0;
191
- height: 0;
192
- display: none;
514
+ .openpress-inline-source-editor__eyebrow {
515
+ color: rgb(174 179 184 / 58%);
516
+ font-family: var(--openpress-font-mono);
517
+ font-size: 9px;
518
+ font-weight: 700;
519
+ letter-spacing: 0.08em;
520
+ }
521
+
522
+ .openpress-inline-source-editor__header button,
523
+ .openpress-inline-source-editor__footer button {
524
+ min-height: 28px;
525
+ border: 1px solid rgb(255 255 255 / 12%);
526
+ border-radius: 4px;
527
+ background: transparent;
528
+ color: rgb(242 242 238 / 82%);
529
+ font: inherit;
530
+ font-size: 11px;
531
+ cursor: pointer;
532
+ }
533
+
534
+ .openpress-inline-source-editor__header button {
535
+ width: 28px;
536
+ padding: 0;
537
+ font-size: 15px;
538
+ }
539
+
540
+ .openpress-inline-source-editor__footer button {
541
+ padding: 0 10px;
542
+ }
543
+
544
+ .openpress-inline-source-editor__footer button:last-child {
545
+ border-color: rgb(240 182 76 / 28%);
546
+ background: rgb(240 182 76 / 9%);
547
+ color: rgb(240 182 76 / 92%);
548
+ }
549
+
550
+ .openpress-inline-source-editor__footer button:disabled {
551
+ cursor: progress;
552
+ opacity: 0.54;
193
553
  }
194
554
 
195
- .openpress-reader-app,
196
- .openpress-reader-app.is-closed-left,
197
- .openpress-reader-app.is-closed-right,
198
- .openpress-reader-app.is-closed-left.is-closed-right {
555
+ .openpress-inline-source-editor textarea {
199
556
  width: 100%;
200
- height: 100vh;
201
- min-height: 100vh;
202
- grid-template-rows: 58px minmax(0, 1fr);
203
- grid-template-columns: 56px clamp(240px, 20vw, 320px) minmax(0, 1fr) clamp(300px, 22vw, 360px);
204
- grid-template-areas:
205
- "nav nav nav nav"
206
- "rail left main right";
557
+ min-height: 126px;
558
+ resize: vertical;
559
+ border: 1px solid rgb(255 255 255 / 12%);
560
+ border-radius: 4px;
561
+ padding: 10px;
562
+ background: rgb(0 0 0 / 24%);
563
+ color: rgb(242 242 238 / 92%);
564
+ font-family: var(--openpress-font-mono);
565
+ font-size: 11px;
566
+ line-height: 1.55;
567
+ outline: none;
568
+ }
569
+
570
+ .openpress-inline-source-editor textarea:focus {
571
+ border-color: rgb(240 182 76 / 42%);
572
+ box-shadow: 0 0 0 1px rgb(240 182 76 / 16%);
573
+ }
574
+
575
+ .openpress-inline-source-editor__footer > span {
576
+ min-width: 0;
207
577
  overflow: hidden;
208
- background: #141414;
578
+ color: rgb(174 179 184 / 70%);
579
+ font-size: 10px;
580
+ text-overflow: ellipsis;
581
+ white-space: nowrap;
209
582
  }
210
583
 
211
- .openpress-reader-app.is-closed-left {
212
- grid-template-columns: 56px 0 minmax(0, 1fr) clamp(300px, 22vw, 360px);
584
+ .openpress-inline-source-editor__footer > span[data-openpress-source-editor-status="saving"] {
585
+ color: rgb(240 182 76 / 88%);
213
586
  }
214
587
 
215
- .openpress-reader-app.is-closed-right {
216
- grid-template-columns: 56px clamp(240px, 20vw, 320px) minmax(0, 1fr) 0;
588
+ .openpress-inline-source-editor__footer > span[data-openpress-source-editor-status="failed"] {
589
+ color: rgb(248 113 113 / 90%);
590
+ }
591
+
592
+ .openpress-inline-source-editor__footer > div {
593
+ display: inline-flex;
594
+ gap: 6px;
595
+ flex: 0 0 auto;
596
+ }
597
+
598
+ .openpress-workbench-dialog-backdrop {
599
+ position: fixed;
600
+ inset: 0;
601
+ z-index: 1000;
602
+ display: grid;
603
+ place-items: start center;
604
+ overflow: auto;
605
+ padding: calc(var(--openpress-workbench-toolbar-height, 44px) + 28px) 28px 28px;
606
+ background: rgb(0 0 0 / 54%);
217
607
  }
218
608
 
219
- .openpress-reader-app.is-closed-left.is-closed-right {
220
- grid-template-columns: 56px 0 minmax(0, 1fr) 0;
609
+ .openpress-workbench-dialog {
610
+ position: relative;
611
+ display: grid;
612
+ grid-template-rows: auto minmax(0, 1fr) auto;
613
+ width: min(560px, calc(100vw - 56px));
614
+ max-height: calc(100vh - var(--openpress-workbench-toolbar-height, 44px) - 56px);
615
+ overflow: hidden;
616
+ border: 1px solid rgb(255 255 255 / 12%);
617
+ border-radius: 6px;
618
+ background: #151716;
619
+ color: rgb(242 242 238 / 94%);
620
+ box-shadow: 0 24px 68px rgb(0 0 0 / 42%);
221
621
  }
222
622
 
223
- .openpress-reader-app[data-active-workspace="document"],
224
- .openpress-reader-app.is-closed-left[data-active-workspace="document"] {
225
- grid-template-columns: 56px 0 minmax(0, 1fr) clamp(300px, 22vw, 360px);
623
+ /* The project preview surface needs more room for media thumbnails and
624
+ rendered component previews than the deploy/search default. */
625
+ .openpress-workbench-dialog.openpress-project-preview-dialog {
626
+ width: min(860px, calc(100vw - 56px));
226
627
  }
227
628
 
228
- .openpress-reader-app.is-closed-right[data-active-workspace="document"],
229
- .openpress-reader-app.is-closed-left.is-closed-right[data-active-workspace="document"] {
230
- grid-template-columns: 56px 0 minmax(0, 1fr) 0;
629
+ /* The project preview footer holds stacked action forms + a comment
630
+ composer instead of a row of buttons. Override the default
631
+ flex-row footer layout for this dialog only. */
632
+ .openpress-workbench-dialog.openpress-project-preview-dialog .openpress-workbench-dialog__footer {
633
+ display: grid;
634
+ gap: 12px;
635
+ justify-content: stretch;
636
+ align-items: stretch;
231
637
  }
232
638
 
233
- .openpress-workspace-navbar {
234
- z-index: 30;
235
- min-width: 0;
236
- grid-template-columns: minmax(0, 1fr) auto;
237
- border-bottom: 1px solid rgb(255 255 255 / 9%);
238
- background: rgb(20 20 20 / 92%);
239
- backdrop-filter: blur(18px);
639
+ .openpress-workbench-dialog::before {
640
+ position: absolute;
641
+ top: 0;
642
+ right: 0;
643
+ left: 0;
644
+ height: 2px;
645
+ background: rgb(240 182 76 / 82%);
646
+ content: "";
240
647
  }
241
648
 
242
- .openpress-workspace-navbar__left,
243
- .openpress-workspace-navbar__right {
649
+ .openpress-workbench-dialog__header,
650
+ .openpress-workbench-dialog__footer {
244
651
  display: flex;
245
652
  align-items: center;
246
- gap: 8px;
653
+ justify-content: space-between;
654
+ gap: 12px;
655
+ }
656
+
657
+ .openpress-workbench-dialog__header {
658
+ align-items: flex-start;
659
+ padding: 18px 48px 14px 24px;
660
+ }
661
+
662
+ .openpress-workbench-dialog__footer {
663
+ padding: 14px 24px 18px;
664
+ }
665
+
666
+ .openpress-workbench-dialog__heading {
667
+ display: grid;
247
668
  min-width: 0;
669
+ gap: 5px;
248
670
  }
249
671
 
250
- .openpress-workspace-navbar__left {
251
- justify-self: start;
672
+ .openpress-workbench-dialog__eyebrow {
673
+ display: block;
674
+ color: rgb(160 166 173 / 62%);
675
+ font-family: var(--openpress-font-mono);
676
+ font-size: 10px;
677
+ font-weight: 650;
678
+ line-height: 1;
679
+ letter-spacing: 0;
680
+ text-transform: uppercase;
252
681
  }
253
682
 
254
- .openpress-workspace-navbar__right {
255
- justify-self: end;
683
+ .openpress-workbench-dialog__title-row {
684
+ display: grid;
685
+ min-width: 0;
686
+ grid-template-columns: auto minmax(0, 1fr);
687
+ align-items: center;
688
+ column-gap: 8px;
689
+ min-height: 20px;
690
+ }
691
+
692
+ .openpress-workbench-dialog h2 {
693
+ margin: 0;
694
+ color: rgb(242 242 240 / 94%);
695
+ font-size: 15px;
696
+ font-weight: 650;
697
+ line-height: 20px;
256
698
  }
257
699
 
258
- .openpress-workspace-brand {
700
+ .openpress-workbench-dialog h2::before,
701
+ .openpress-workbench-dialog h3::before {
702
+ display: none;
703
+ content: none;
704
+ }
705
+
706
+ .openpress-workbench-dialog__title-meta {
259
707
  display: flex;
260
- align-items: baseline;
708
+ min-width: 0;
709
+ min-height: 20px;
710
+ align-items: center;
711
+ }
712
+
713
+ .openpress-workbench-dialog__close {
714
+ position: absolute;
715
+ top: 9px;
716
+ right: 9px;
717
+ display: inline-flex;
718
+ width: 30px;
719
+ height: 30px;
720
+ align-items: center;
721
+ justify-content: center;
722
+ border: 1px solid transparent;
723
+ border-radius: 4px;
724
+ padding: 0;
725
+ background: transparent;
726
+ color: #aeb3b8;
727
+ cursor: pointer;
728
+ }
729
+
730
+ .openpress-workbench-dialog__close:hover {
731
+ color: #f2f2f0;
732
+ }
733
+
734
+ .openpress-workbench-dialog__close svg {
735
+ width: 14px;
736
+ height: 14px;
737
+ }
738
+
739
+ .openpress-deploy-dialog {
740
+ width: min(420px, calc(100vw - 56px));
261
741
  gap: 12px;
742
+ padding: 16px;
743
+ }
744
+
745
+ .openpress-deploy-dialog__source {
746
+ display: inline-flex;
747
+ min-height: 19px;
748
+ align-items: center;
749
+ max-width: 100%;
750
+ overflow: hidden;
751
+ border: 1px solid rgb(110 231 160 / 18%);
752
+ border-radius: 999px;
753
+ padding: 0 7px;
754
+ background: rgb(110 231 160 / 7%);
755
+ color: rgb(144 238 177 / 88%);
756
+ font-size: 10px;
757
+ font-weight: 620;
758
+ line-height: 1;
759
+ text-overflow: ellipsis;
760
+ white-space: nowrap;
761
+ }
762
+
763
+ .openpress-deploy-dialog dl {
764
+ display: grid;
765
+ gap: 8px;
766
+ margin: 0;
767
+ border-top: 1px solid rgb(255 255 255 / 8%);
768
+ border-bottom: 1px solid rgb(255 255 255 / 8%);
769
+ padding: 12px 0;
770
+ }
771
+
772
+ .openpress-deploy-dialog dl div {
773
+ display: grid;
774
+ min-width: 0;
775
+ grid-template-columns: 78px minmax(0, 1fr);
776
+ gap: 12px;
777
+ align-items: center;
778
+ }
779
+
780
+ .openpress-deploy-dialog dt,
781
+ .openpress-deploy-dialog dd {
782
+ margin: 0;
262
783
  min-width: 0;
784
+ font-size: 11px;
785
+ line-height: 1.35;
263
786
  }
264
787
 
265
- .openpress-workspace-brand__logo {
266
- flex: 0 0 auto;
267
- color: var(--openpress-accent);
268
- font-size: 13px;
269
- font-weight: 500;
788
+ .openpress-deploy-dialog dt {
789
+ color: rgb(150 156 163 / 68%);
270
790
  }
271
791
 
272
- .openpress-workspace-brand strong {
792
+ .openpress-deploy-dialog dd {
273
793
  overflow: hidden;
274
- max-width: min(42vw, 520px);
275
- color: #f2f2f0;
276
- font-size: 14px;
277
- font-weight: 500;
278
- line-height: 1.3;
794
+ color: rgb(226 229 230 / 86%);
795
+ text-align: left;
279
796
  text-overflow: ellipsis;
280
797
  white-space: nowrap;
281
798
  }
282
799
 
283
- .openpress-icon-button,
284
- .openpress-navbar-button {
285
- border: 1px solid rgb(255 255 255 / 12%);
286
- background: rgb(255 255 255 / 3%);
287
- color: #e7e7e4;
288
- font: inherit;
289
- cursor: pointer;
290
- transition:
291
- border-color 160ms ease,
292
- background 160ms ease,
293
- color 160ms ease,
294
- transform 160ms ease;
295
- }
296
-
297
- .openpress-icon-button {
298
- display: inline-flex;
299
- width: 32px;
300
- height: 32px;
301
- align-items: center;
302
- justify-content: center;
303
- padding: 0;
304
- color: #b7babd;
305
- }
306
-
307
- .openpress-icon-button:hover,
308
- .openpress-navbar-button:hover {
309
- border-color: rgb(255 255 255 / 22%);
310
- background: rgb(255 255 255 / 8%);
311
- color: #fff;
312
- }
313
-
314
- .openpress-icon-button:active,
315
- .openpress-navbar-button:active {
316
- transform: translateY(1px);
800
+ .openpress-deploy-dialog dd a {
801
+ color: rgb(214 218 222 / 92%);
802
+ text-decoration: none;
317
803
  }
318
804
 
319
- .openpress-icon-button svg {
320
- width: 15px;
321
- height: 15px;
322
- color: var(--openpress-accent);
805
+ .openpress-deploy-dialog dd a:hover {
806
+ color: rgb(240 182 76 / 94%);
807
+ text-decoration: underline;
808
+ text-underline-offset: 3px;
323
809
  }
324
810
 
325
- .openpress-navbar-button {
811
+ .openpress-deploy-dialog__status {
326
812
  display: inline-flex;
327
- height: 32px;
328
- min-width: 74px;
329
813
  align-items: center;
330
- justify-content: center;
814
+ justify-content: flex-start;
331
815
  gap: 6px;
332
- padding: 0 13px;
333
- font-size: 11px;
334
- font-weight: 500;
335
- line-height: 1;
336
- white-space: nowrap;
816
+ color: rgb(198 204 210 / 78%);
337
817
  }
338
818
 
339
- .openpress-navbar-button svg {
340
- width: 13px;
341
- height: 13px;
342
- color: currentColor;
819
+ .openpress-deploy-dialog__status::before {
820
+ width: 6px;
821
+ height: 6px;
822
+ flex: 0 0 auto;
823
+ border-radius: 999px;
824
+ background: currentColor;
825
+ content: "";
343
826
  }
344
827
 
345
- .openpress-navbar-button--ghost {
346
- color: #f0f1ee;
347
- border-color: rgb(240 182 76 / 32%);
348
- background: rgb(240 182 76 / 8%);
828
+ .openpress-deploy-dialog__status[data-openpress-deploy-status="online"] {
829
+ color: rgb(110 231 160 / 90%);
349
830
  }
350
831
 
351
- .openpress-navbar-button--ghost:hover {
352
- border-color: rgb(240 182 76 / 52%);
353
- background: rgb(240 182 76 / 13%);
832
+ .openpress-deploy-dialog__status[data-openpress-deploy-status="dirty"],
833
+ .openpress-deploy-dialog__status[data-openpress-deploy-status="deploying"] {
834
+ color: rgb(240 182 76 / 92%);
354
835
  }
355
836
 
356
- .openpress-navbar-button:disabled {
357
- cursor: progress;
358
- color: #a7adb2;
359
- border-color: rgb(240 182 76 / 24%);
360
- background: rgb(240 182 76 / 6%);
837
+ .openpress-deploy-dialog__status[data-openpress-deploy-status="failed"] {
838
+ color: rgb(248 113 113 / 90%);
361
839
  }
362
840
 
363
- .openpress-publication-control {
364
- position: relative;
365
- display: inline-flex;
366
- align-items: center;
841
+ .openpress-deploy-dialog__message {
842
+ margin: 0;
843
+ border-left: 2px solid rgb(248 113 113 / 76%);
844
+ padding: 6px 0 6px 10px;
845
+ color: rgb(248 113 113 / 88%);
846
+ font-size: 12px;
847
+ line-height: 1.45;
367
848
  }
368
849
 
369
- .openpress-publication-trigger {
850
+ .openpress-deploy-dialog .openpress-workbench-dialog__footer button {
370
851
  display: inline-flex;
371
- height: 32px;
852
+ height: 30px;
372
853
  align-items: center;
373
854
  justify-content: center;
374
855
  gap: 7px;
375
856
  border: 1px solid rgb(255 255 255 / 12%);
857
+ border-radius: 4px;
376
858
  padding: 0 10px;
377
- background: rgb(255 255 255 / 3%);
378
- color: #e7e7e4;
859
+ background: transparent;
860
+ color: rgb(226 229 230 / 86%);
379
861
  font: inherit;
380
862
  font-size: 11px;
381
- font-weight: 500;
382
- line-height: 1;
383
- white-space: nowrap;
863
+ font-weight: 560;
384
864
  cursor: pointer;
385
- transition:
386
- border-color 160ms ease,
387
- background 160ms ease,
388
- color 160ms ease;
389
865
  }
390
866
 
391
- .openpress-publication-trigger:hover,
392
- .openpress-publication-trigger[aria-expanded="true"] {
393
- border-color: rgb(255 255 255 / 22%);
394
- background: rgb(255 255 255 / 8%);
395
- color: #fff;
867
+ .openpress-deploy-dialog .openpress-workbench-dialog__footer button:hover:not(:disabled) {
868
+ border-color: rgb(240 182 76 / 34%);
869
+ color: rgb(240 182 76 / 92%);
870
+ }
871
+
872
+ .openpress-deploy-dialog .openpress-workbench-dialog__footer button:disabled {
873
+ cursor: not-allowed;
874
+ opacity: 0.46;
396
875
  }
397
876
 
398
- .openpress-publication-trigger svg {
877
+ .openpress-deploy-dialog .openpress-workbench-dialog__footer svg {
399
878
  width: 13px;
400
879
  height: 13px;
401
- color: #8f969d;
402
880
  }
403
881
 
404
- .openpress-publication-dot {
405
- width: 7px;
406
- height: 7px;
407
- flex: 0 0 auto;
408
- border-radius: 999px;
409
- background: #697078;
410
- box-shadow: 0 0 0 1px rgb(255 255 255 / 12%);
882
+ .openpress-search-dialog-backdrop {
883
+ z-index: 1001;
884
+ padding: calc(var(--openpress-workbench-toolbar-height, 44px) + 24px) 24px 24px;
885
+ background: rgb(0 0 0 / 46%);
411
886
  }
412
887
 
413
- .openpress-publication-control[data-publication-online="true"] .openpress-publication-dot {
414
- background: #6ee7a0;
415
- box-shadow: 0 0 0 1px rgb(110 231 160 / 30%), 0 0 14px rgb(110 231 160 / 24%);
888
+ .openpress-search-dialog {
889
+ width: min(640px, calc(100vw - 48px));
890
+ max-height: min(72vh, 760px);
891
+ grid-template-rows: auto auto minmax(0, 1fr);
892
+ box-shadow: 0 24px 72px rgb(0 0 0 / 44%);
416
893
  }
417
894
 
418
- .openpress-publication-menu {
419
- position: absolute;
420
- top: calc(100% + 8px);
421
- right: 0;
422
- z-index: 55;
895
+ .openpress-search-dialog__header {
896
+ gap: 16px;
897
+ padding: 16px 48px 10px 16px;
898
+ }
899
+
900
+ .openpress-search-dialog__form {
423
901
  display: grid;
424
- width: min(320px, calc(100vw - 32px));
425
902
  gap: 10px;
426
- border: 1px solid rgb(255 255 255 / 12%);
427
- padding: 12px;
428
- background: rgb(22 22 22 / 98%);
429
- box-shadow: 0 18px 48px rgb(0 0 0 / 42%);
903
+ border-top: 1px solid rgb(255 255 255 / 8%);
904
+ border-bottom: 1px solid rgb(255 255 255 / 8%);
905
+ padding: 12px 16px;
430
906
  }
431
907
 
432
- .openpress-publication-menu__row {
433
- display: flex;
434
- align-items: baseline;
435
- justify-content: space-between;
436
- gap: 16px;
437
- color: #8f969d;
438
- font-size: 11px;
439
- line-height: 1.4;
908
+ .openpress-search-dialog__input-row {
909
+ display: grid;
910
+ grid-template-columns: 16px minmax(0, 1fr) auto;
911
+ gap: 8px;
912
+ align-items: center;
913
+ min-height: 34px;
914
+ border: 1px solid rgb(255 255 255 / 12%);
915
+ border-radius: 5px;
916
+ padding: 0 7px 0 10px;
917
+ background: rgb(255 255 255 / 4%);
440
918
  }
441
919
 
442
- .openpress-publication-menu__row strong {
443
- color: #f2f2f0;
444
- font-size: 12px;
445
- font-weight: 500;
446
- text-align: right;
920
+ .openpress-search-dialog__input-row > svg {
921
+ width: 13px;
922
+ height: 13px;
923
+ color: rgb(160 166 173 / 70%);
447
924
  }
448
925
 
449
- .openpress-publication-menu__note {
450
- margin: 0;
451
- border-top: 1px solid rgb(255 255 255 / 8%);
452
- padding-top: 10px;
453
- color: #aeb3b8;
926
+ .openpress-search-dialog__input-row input {
927
+ min-width: 0;
928
+ border: 0;
929
+ padding: 0;
930
+ background: transparent;
931
+ color: rgb(242 242 238 / 94%);
932
+ font: inherit;
454
933
  font-size: 12px;
455
- line-height: 1.5;
934
+ outline: 0;
456
935
  }
457
936
 
458
- .openpress-publication-menu__actions {
459
- display: grid;
460
- gap: 6px;
937
+ .openpress-search-dialog__input-row input::placeholder {
938
+ color: rgb(160 166 173 / 54%);
461
939
  }
462
940
 
463
- .openpress-publication-menu__actions button {
941
+ .openpress-search-dialog__input-row button,
942
+ .openpress-search-dialog__scope button {
464
943
  display: inline-flex;
465
- height: 32px;
944
+ height: 26px;
466
945
  align-items: center;
467
- justify-content: flex-start;
468
- gap: 8px;
469
- border: 1px solid rgb(255 255 255 / 10%);
470
- padding: 0 10px;
471
- background: rgb(255 255 255 / 4%);
472
- color: #f0f1ee;
946
+ justify-content: center;
947
+ gap: 6px;
948
+ border: 1px solid transparent;
949
+ border-radius: 4px;
950
+ padding: 0 9px;
951
+ background: transparent;
952
+ color: rgb(214 218 222 / 82%);
473
953
  font: inherit;
474
- font-size: 12px;
475
- line-height: 1;
954
+ font-size: 11px;
955
+ font-weight: 560;
476
956
  cursor: pointer;
477
- transition:
478
- border-color 160ms ease,
479
- background 160ms ease,
480
- color 160ms ease;
481
957
  }
482
958
 
483
- .openpress-publication-menu__actions button:hover:not(:disabled) {
484
- border-color: rgb(240 182 76 / 36%);
485
- background: rgb(240 182 76 / 10%);
486
- color: #fff;
959
+ .openpress-search-dialog__input-row button:hover:not(:disabled),
960
+ .openpress-search-dialog__scope button:hover {
961
+ color: rgb(240 182 76 / 92%);
487
962
  }
488
963
 
489
- .openpress-publication-menu__actions button:disabled {
490
- cursor: not-allowed;
491
- opacity: 0.45;
964
+ .openpress-search-dialog__input-row button:disabled {
965
+ cursor: progress;
966
+ opacity: 0.62;
492
967
  }
493
968
 
494
- .openpress-publication-menu__actions svg {
495
- width: 13px;
496
- height: 13px;
497
- flex: 0 0 auto;
498
- color: var(--openpress-accent);
969
+ .openpress-search-dialog__input-row button svg {
970
+ width: 12px;
971
+ height: 12px;
972
+ }
973
+
974
+ .openpress-search-dialog__input-row button:disabled svg,
975
+ .openpress-search-dialog__empty svg {
976
+ animation: openpress-search-spin 0.9s linear infinite;
499
977
  }
500
978
 
501
- .openpress-page-count {
979
+ .openpress-search-dialog__scope {
502
980
  display: inline-flex;
981
+ width: fit-content;
503
982
  align-items: center;
504
- gap: 5px;
505
- color: #9da3aa;
506
- font-size: 12px;
507
- font-variant-numeric: tabular-nums;
508
- letter-spacing: 0.04em;
509
- min-width: 74px;
510
- justify-content: center;
983
+ gap: 2px;
984
+ border: 1px solid rgb(255 255 255 / 10%);
985
+ border-radius: 5px;
986
+ padding: 2px;
987
+ background: rgb(255 255 255 / 3%);
511
988
  }
512
989
 
513
- .openpress-page-count__label {
514
- color: #6f7680;
515
- font-size: 10px;
516
- letter-spacing: 0.08em;
517
- text-transform: uppercase;
990
+ .openpress-search-dialog__scope button[data-openpress-search-scope-active="true"] {
991
+ border-color: rgb(240 182 76 / 26%);
992
+ background: rgb(240 182 76 / 9%);
993
+ color: rgb(240 182 76 / 92%);
994
+ }
995
+
996
+ .openpress-search-dialog__empty,
997
+ .openpress-search-dialog__error {
998
+ display: flex;
999
+ align-items: center;
1000
+ gap: 8px;
1001
+ margin: 0;
1002
+ padding: 18px 16px;
1003
+ color: rgb(160 166 173 / 72%);
1004
+ font-size: 12px;
1005
+ line-height: 1.5;
518
1006
  }
519
1007
 
520
- .openpress-page-count .sep {
521
- opacity: 0.45;
1008
+ .openpress-search-dialog__empty svg {
1009
+ width: 13px;
1010
+ height: 13px;
522
1011
  }
523
1012
 
524
- .openpress-workspace-progress {
525
- position: absolute;
526
- right: 24px;
527
- bottom: 0;
528
- left: 24px;
529
- width: auto;
530
- height: 2px;
531
- overflow: visible;
532
- background: rgb(255 255 255 / 10%);
533
- cursor: pointer;
1013
+ .openpress-search-dialog__error {
1014
+ color: rgb(248 113 113 / 88%);
534
1015
  }
535
1016
 
536
- .openpress-workspace-progress__bar {
537
- position: static;
538
- display: block;
539
- width: var(--progress, 0%);
540
- height: 2px;
541
- background: rgb(255 255 255 / 62%);
542
- transition: width 260ms cubic-bezier(0.22, 0.61, 0.36, 1);
1017
+ .openpress-search-dialog__results {
1018
+ min-height: 0;
1019
+ overflow: auto;
1020
+ padding: 12px 16px 16px;
543
1021
  }
544
1022
 
545
- .openpress-editor-rail {
546
- grid-area: rail;
547
- display: flex;
548
- flex-direction: column;
549
- align-items: stretch;
550
- gap: 8px;
551
- border-right: 1px solid rgb(255 255 255 / 9%);
552
- padding: 12px 8px;
553
- background: #101010;
554
- color: #dfe1dd;
1023
+ .openpress-search-dialog__summary {
1024
+ margin: 0 0 10px;
1025
+ color: rgb(160 166 173 / 70%);
1026
+ font-size: 11px;
1027
+ line-height: 1.35;
555
1028
  }
556
1029
 
557
- .openpress-editor-rail__button {
1030
+ .openpress-search-dialog__file {
558
1031
  display: grid;
559
- justify-items: center;
560
- gap: 5px;
561
- min-width: 0;
562
- border: 1px solid transparent;
563
- padding: 9px 4px;
564
- background: transparent;
565
- color: #858b92;
566
- font: inherit;
567
- font-size: 10px;
568
- line-height: 1.1;
569
- cursor: pointer;
570
- transition:
571
- border-color 160ms ease,
572
- background 160ms ease,
573
- color 160ms ease;
1032
+ gap: 7px;
1033
+ margin: 0 0 12px;
1034
+ padding-bottom: 12px;
1035
+ border-bottom: 1px solid rgb(255 255 255 / 8%);
574
1036
  }
575
1037
 
576
- .openpress-editor-rail__button:hover,
577
- .openpress-editor-rail__button.is-active {
578
- border-color: rgb(223 75 33 / 42%);
579
- background: rgb(223 75 33 / 10%);
580
- color: #f2f2f0;
1038
+ .openpress-search-dialog__file:last-child {
1039
+ margin-bottom: 0;
1040
+ padding-bottom: 0;
1041
+ border-bottom: 0;
1042
+ }
1043
+
1044
+ .openpress-search-dialog__file h3 {
1045
+ display: grid;
1046
+ min-width: 0;
1047
+ grid-template-columns: 14px minmax(0, 1fr) auto;
1048
+ gap: 7px;
1049
+ align-items: center;
1050
+ margin: 0;
1051
+ color: rgb(226 229 230 / 90%);
1052
+ font-size: 12px;
1053
+ font-weight: 650;
1054
+ line-height: 1.25;
581
1055
  }
582
1056
 
583
- .openpress-editor-rail__button svg {
584
- width: 17px;
585
- height: 17px;
586
- color: var(--openpress-accent);
1057
+ .openpress-search-dialog__file h3 svg {
1058
+ width: 12px;
1059
+ height: 12px;
1060
+ color: rgb(240 182 76 / 82%);
587
1061
  }
588
1062
 
589
- .openpress-editor-rail__button span {
1063
+ .openpress-search-dialog__file h3 span {
590
1064
  overflow: hidden;
591
- max-width: 100%;
1065
+ min-width: 0;
592
1066
  text-overflow: ellipsis;
593
1067
  white-space: nowrap;
594
1068
  }
595
1069
 
596
- .openpress-editor-navigator {
597
- grid-area: left;
1070
+ .openpress-search-dialog__file h3 small {
1071
+ display: inline-flex;
1072
+ min-width: 20px;
1073
+ height: 18px;
1074
+ align-items: center;
1075
+ justify-content: center;
1076
+ border: 1px solid rgb(255 255 255 / 10%);
1077
+ border-radius: 999px;
1078
+ color: rgb(160 166 173 / 78%);
1079
+ font-size: 10px;
1080
+ font-weight: 650;
1081
+ }
1082
+
1083
+ .openpress-search-dialog__file ol {
1084
+ display: grid;
1085
+ gap: 5px;
1086
+ margin: 0;
1087
+ padding: 0;
1088
+ list-style: none;
1089
+ }
1090
+
1091
+ .openpress-search-dialog__file li {
1092
+ display: block;
598
1093
  min-width: 0;
599
- min-height: 0;
600
- overflow: hidden;
601
- background: #171717;
602
1094
  }
603
1095
 
604
- .openpress-reader-app[data-active-workspace="document"] .openpress-editor-navigator {
605
- display: none;
1096
+ .openpress-search-dialog__result {
1097
+ display: grid;
1098
+ width: 100%;
1099
+ min-width: 0;
1100
+ grid-template-columns: 44px minmax(0, 1fr) auto;
1101
+ gap: 10px;
1102
+ align-items: baseline;
1103
+ border-radius: 4px;
1104
+ border: 1px solid transparent;
1105
+ padding: 6px 7px;
1106
+ background: rgb(255 255 255 / 3%);
1107
+ color: inherit;
1108
+ font: inherit;
1109
+ text-align: left;
1110
+ cursor: pointer;
606
1111
  }
607
1112
 
608
- .openpress-reader-app.is-closed-left .openpress-editor-navigator {
609
- pointer-events: none;
1113
+ .openpress-search-dialog__result:hover:not(:disabled) {
1114
+ border-color: rgb(240 182 76 / 18%);
1115
+ background: rgb(240 182 76 / 7%);
610
1116
  }
611
1117
 
612
- .openpress-reader-app.is-closed-left .openpress-editor-navigator > * {
613
- opacity: 0;
1118
+ .openpress-search-dialog__result:disabled {
1119
+ cursor: default;
1120
+ opacity: 0.68;
614
1121
  }
615
1122
 
616
- .openpress-editor-canvas {
617
- grid-area: main;
1123
+ .openpress-search-dialog__line {
1124
+ color: rgb(160 166 173 / 74%);
1125
+ font-family: var(--openpress-font-mono);
1126
+ font-size: 10px;
1127
+ line-height: 1.35;
618
1128
  }
619
1129
 
620
- .openpress-editor-inspector {
621
- grid-area: right;
1130
+ .openpress-search-dialog__preview {
1131
+ overflow: hidden;
1132
+ min-width: 0;
1133
+ color: rgb(226 229 230 / 84%);
1134
+ font-family: var(--openpress-font-mono);
1135
+ font-size: 11px;
1136
+ line-height: 1.45;
1137
+ text-overflow: ellipsis;
1138
+ white-space: nowrap;
622
1139
  }
623
1140
 
624
- .openpress-editor-inspector-section {
625
- border-bottom: 1px solid rgb(255 255 255 / 8%);
626
- padding: 18px 0;
1141
+ .openpress-search-dialog__page {
1142
+ color: rgb(240 182 76 / 82%);
1143
+ font-family: var(--openpress-font-mono);
1144
+ font-size: 10px;
1145
+ font-weight: 650;
1146
+ line-height: 1.35;
627
1147
  }
628
1148
 
629
- .openpress-editor-inspector-card {
630
- display: grid;
631
- gap: 7px;
632
- padding: 0 18px 0 30px;
1149
+ .openpress-search-dialog__result:disabled .openpress-search-dialog__page {
1150
+ color: rgb(160 166 173 / 58%);
633
1151
  }
634
1152
 
635
- .openpress-editor-inspector-card span {
636
- color: #777d84;
637
- font-size: 11px;
638
- text-transform: uppercase;
1153
+ @keyframes openpress-toolbar-deploy-spin {
1154
+ to {
1155
+ transform: rotate(360deg);
1156
+ }
639
1157
  }
640
1158
 
641
- .openpress-editor-inspector-card strong {
642
- color: #f2f2f0;
643
- font-size: 26px;
644
- font-weight: 400;
645
- line-height: 1;
1159
+ @keyframes openpress-search-spin {
1160
+ to {
1161
+ transform: rotate(360deg);
1162
+ }
1163
+ }
1164
+
1165
+ @keyframes openpress-toolbar-deploy-pulse {
1166
+ from {
1167
+ opacity: 0.58;
1168
+ }
1169
+ to {
1170
+ opacity: 1;
1171
+ }
646
1172
  }
647
1173
 
648
- .openpress-editor-inspector-card p {
1174
+ .openpress-workbench-left-panel,
1175
+ .openpress-workbench-right-panel {
1176
+ min-width: 0;
1177
+ min-height: 0;
1178
+ height: auto;
1179
+ max-height: none;
649
1180
  margin: 0;
650
- color: #9ba1a8;
651
- font-size: 12px;
652
- line-height: 1.45;
1181
+ align-self: stretch;
1182
+ background: #171717;
653
1183
  }
654
1184
 
655
- .openpress-editor-stack {
1185
+ .openpress-public-viewer.openpress-workbench-shell .openpress-workbench-left-panel {
1186
+ grid-area: left;
656
1187
  display: grid;
657
- gap: 8px;
658
- padding: 0 18px 0 30px;
1188
+ grid-template-rows: auto minmax(0, 1fr) auto;
1189
+ height: auto;
1190
+ max-height: none;
1191
+ align-self: stretch;
1192
+ border-right: 1px solid rgb(255 255 255 / 8%);
659
1193
  }
660
1194
 
661
- .openpress-editor-inspector-row {
1195
+ .openpress-public-viewer.openpress-workbench-shell .openpress-workbench-right-panel {
1196
+ position: relative;
1197
+ grid-area: right;
662
1198
  display: grid;
663
- gap: 3px;
664
- min-width: 0;
665
- border: 1px solid rgb(255 255 255 / 8%);
666
- padding: 9px;
667
- background: rgb(255 255 255 / 3%);
1199
+ grid-template-rows: minmax(0, 1fr);
1200
+ height: auto;
1201
+ max-height: none;
1202
+ align-self: stretch;
1203
+ border-left: 1px solid rgb(255 255 255 / 8%);
1204
+ overflow: hidden;
668
1205
  }
669
1206
 
670
- .openpress-editor-inspector-row strong,
671
- .openpress-editor-inspector-row small {
672
- overflow: hidden;
673
- min-width: 0;
674
- text-overflow: ellipsis;
675
- white-space: nowrap;
1207
+ .openpress-workbench-right-panel .openpress-public-drawer-close {
1208
+ position: absolute;
1209
+ top: 12px;
1210
+ right: 12px;
1211
+ z-index: 3;
1212
+ display: none;
676
1213
  }
677
1214
 
678
- .openpress-editor-inspector-row strong {
679
- color: #dfe1dd;
680
- font-size: 12px;
681
- font-weight: 500;
1215
+ .openpress-reader-app.is-closed-right .openpress-workbench-right-panel {
1216
+ pointer-events: none;
682
1217
  }
683
1218
 
684
- .openpress-editor-inspector-row small {
685
- color: #757b82;
686
- font-size: 11px;
1219
+ .openpress-reader-app.is-closed-right .openpress-workbench-right-panel > * {
1220
+ opacity: 0;
1221
+ }
1222
+
1223
+ .openpress-reader-app.is-closed-left .openpress-workbench-left-panel {
1224
+ pointer-events: none;
1225
+ }
1226
+
1227
+ .openpress-reader-app.is-closed-left .openpress-workbench-left-panel > * {
1228
+ opacity: 0;
687
1229
  }
688
1230
 
689
1231
  .openpress-reader-app .reader-stage {
@@ -698,19 +1240,12 @@
698
1240
  scroll-behavior: smooth;
699
1241
  }
700
1242
 
701
- /* Mandatory snap only in paged mode reading mode needs free scroll within
702
- long flowed sections, not page-by-page snap-back. */
1243
+ /* Page Scale Model keeps document pages fixed-size, so page-by-page snap is the default. */
703
1244
  .openpress-reader-app[data-openpress-view-mode="paged"] .reader-stage,
704
1245
  .openpress-reader-app:not([data-openpress-view-mode]) .reader-stage {
705
1246
  scroll-snap-type: y mandatory;
706
1247
  }
707
1248
 
708
- .openpress-workbench__stage[data-workspace-view="project"] .reader-stage {
709
- display: block;
710
- align-items: initial;
711
- justify-content: initial;
712
- }
713
-
714
1249
  .openpress-reader-app .reader-stage::-webkit-scrollbar,
715
1250
  .openpress-workspace-panel::-webkit-scrollbar,
716
1251
  .openpress-reader-app .reader-bookmarks::-webkit-scrollbar {