domma-cms 1.8.33 → 1.8.34

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 (87) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/package.json +1 -1
  3. package/plugins/docs/CLAUDE.md +318 -0
  4. package/plugins/docs/admin/css/docs.css +783 -0
  5. package/plugins/docs/admin/lib/api.js +340 -0
  6. package/plugins/docs/admin/lib/convert.js +482 -0
  7. package/plugins/docs/admin/lib/drafts.js +115 -0
  8. package/plugins/docs/admin/lib/editor.js +851 -0
  9. package/plugins/docs/admin/lib/find-replace.js +426 -0
  10. package/plugins/docs/admin/lib/folders.js +203 -0
  11. package/plugins/docs/admin/lib/panel-guard.js +73 -0
  12. package/plugins/docs/admin/lib/pdf-view.js +126 -0
  13. package/plugins/docs/admin/lib/send.js +156 -0
  14. package/plugins/docs/admin/lib/settings.js +142 -0
  15. package/plugins/docs/admin/lib/share.js +323 -0
  16. package/plugins/docs/admin/lib/shortcuts.js +44 -0
  17. package/plugins/docs/admin/lib/templates.js +194 -0
  18. package/plugins/docs/admin/lib/versions.js +192 -0
  19. package/plugins/docs/admin/templates/docs.html +92 -0
  20. package/plugins/docs/admin/templates/editor.html +86 -0
  21. package/plugins/docs/admin/views/docs.js +777 -0
  22. package/plugins/docs/admin/views/editor.js +978 -0
  23. package/plugins/docs/config.js +24 -0
  24. package/plugins/docs/docs/guide.md +270 -0
  25. package/plugins/docs/lib/extensions.js +213 -0
  26. package/plugins/docs/lib/importer.js +72 -0
  27. package/plugins/docs/lib/pdf-worker.js +48 -0
  28. package/plugins/docs/lib/pdf.js +222 -0
  29. package/plugins/docs/lib/store.js +748 -0
  30. package/plugins/docs/plugin.js +1108 -0
  31. package/plugins/docs/plugin.json +89 -0
  32. package/plugins/docs/plugin.public.js +114 -0
  33. package/plugins/docs/templates/public-doc.html +36 -0
  34. package/plugins/docs/tests/_env.js +10 -0
  35. package/plugins/docs/tests/_pdf.js +73 -0
  36. package/plugins/docs/tests/convert.test.js +95 -0
  37. package/plugins/docs/tests/drafts.test.js +82 -0
  38. package/plugins/docs/tests/pdf.test.js +86 -0
  39. package/plugins/docs/tests/plugin.test.js +816 -0
  40. package/plugins/docs/tests/shortcuts.test.js +30 -0
  41. package/plugins/free-tier.lock.json +105 -1
  42. package/plugins/garage/CLAUDE.md +51 -0
  43. package/plugins/garage/admin/css/garage.css +73 -0
  44. package/plugins/garage/admin/lib/garage.js +236 -0
  45. package/plugins/garage/admin/templates/garage.html +86 -0
  46. package/plugins/garage/admin/views/garage.js +581 -0
  47. package/plugins/garage/collections/garage-vehicles/schema.json +101 -0
  48. package/plugins/garage/config.js +18 -0
  49. package/plugins/garage/docs/guide.md +118 -0
  50. package/plugins/garage/plugin.js +471 -0
  51. package/plugins/garage/plugin.json +68 -0
  52. package/plugins/garage/tests/access.test.js +134 -0
  53. package/plugins/garage/tests/garage.test.js +106 -0
  54. package/plugins/messages/CLAUDE.md +230 -0
  55. package/plugins/messages/admin/css/messages.css +117 -0
  56. package/plugins/messages/admin/lib/messages.js +452 -0
  57. package/plugins/messages/admin/templates/messages.html +76 -0
  58. package/plugins/messages/admin/views/messages.js +1219 -0
  59. package/plugins/messages/collections/user-message-threads/schema.json +22 -0
  60. package/plugins/messages/collections/user-messages/schema.json +23 -0
  61. package/plugins/messages/config.js +14 -0
  62. package/plugins/messages/docs/guide.md +176 -0
  63. package/plugins/messages/lib/call.js +138 -0
  64. package/plugins/messages/plugin.js +994 -0
  65. package/plugins/messages/plugin.json +59 -0
  66. package/plugins/messages/plugin.public.js +52 -0
  67. package/plugins/messages/templates/call.html +6 -0
  68. package/plugins/messages/tests/after-send.test.js +22 -0
  69. package/plugins/messages/tests/api.test.js +187 -0
  70. package/plugins/messages/tests/call.test.js +497 -0
  71. package/plugins/messages/tests/drafts.test.js +25 -0
  72. package/plugins/messages/tests/messages.test.js +167 -0
  73. package/plugins/theme-roller/CLAUDE.md +65 -0
  74. package/plugins/theme-roller/admin/css/theme-roller.css +43 -0
  75. package/plugins/theme-roller/admin/lib/prompt.js +22 -0
  76. package/plugins/theme-roller/admin/lib/themes.js +196 -0
  77. package/plugins/theme-roller/admin/lib/view.js +88 -0
  78. package/plugins/theme-roller/admin/templates/theme-roller.html +73 -0
  79. package/plugins/theme-roller/admin/views/theme-roller-view.js +639 -0
  80. package/plugins/theme-roller/config.js +1 -0
  81. package/plugins/theme-roller/docs/guide.md +104 -0
  82. package/plugins/theme-roller/plugin.js +263 -0
  83. package/plugins/theme-roller/plugin.json +42 -0
  84. package/plugins/theme-roller/tests/api.test.js +161 -0
  85. package/plugins/theme-roller/tests/prompt-values.test.js +22 -0
  86. package/plugins/theme-roller/tests/themes.test.js +77 -0
  87. package/plugins/theme-roller/tests/view.test.js +55 -0
@@ -0,0 +1,783 @@
1
+ /*
2
+ * Docs plugin - admin styles.
3
+ *
4
+ * Every colour and radius is a theme token that the Domma themes define.
5
+ * An invented --dm-* resolves to nothing and the rule silently does not
6
+ * apply - a panel ends up unreadable on one theme and fine on another.
7
+ * Tints are color-mix() over real tokens; neutral greys fall back to the
8
+ * border token, never to an rgba that vanishes on dark themes.
9
+ */
10
+
11
+ /* The Docs screens use the whole width of the admin. */
12
+ .view-container:has(.docs-home),
13
+ .view-container:has(.docs-ed) { max-width: none; }
14
+
15
+ .docs-home [hidden], .docs-ed [hidden], .docs-share [hidden], .docs-settings [hidden], .docs-form [hidden] { display: none !important; }
16
+
17
+ /* ================================================================== Home */
18
+
19
+ .docs-home {
20
+ display: grid;
21
+ grid-template-columns: 232px minmax(0, 1fr);
22
+ gap: var(--dm-space-4);
23
+ min-height: calc(100vh - 170px);
24
+ }
25
+ .docs-home.is-rail-collapsed { grid-template-columns: 52px minmax(0, 1fr); }
26
+
27
+ /* ---- rail ---- */
28
+
29
+ .docs-rail {
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: var(--dm-space-3);
33
+ position: sticky;
34
+ top: var(--dm-space-3);
35
+ align-self: start;
36
+ max-height: calc(100vh - 140px);
37
+ overflow-y: auto;
38
+ min-width: 0;
39
+ }
40
+ .docs-rail__new {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ gap: var(--dm-space-2);
45
+ border-radius: var(--dm-radius-lg);
46
+ padding: var(--dm-space-2) var(--dm-space-4);
47
+ box-shadow: var(--dm-shadow-md);
48
+ }
49
+ .docs-rail__nav { display: flex; flex-direction: column; gap: 2px; }
50
+ .docs-rail__places { display: flex; flex-direction: column; gap: 2px; }
51
+
52
+ .docs-place,
53
+ .docs-folder {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: var(--dm-space-3);
57
+ width: 100%;
58
+ padding: 7px var(--dm-space-3);
59
+ border: 0;
60
+ border-radius: var(--dm-radius-full);
61
+ background: transparent;
62
+ color: var(--dm-text);
63
+ font: inherit;
64
+ font-size: var(--dm-text-sm);
65
+ text-align: left;
66
+ cursor: pointer;
67
+ min-width: 0;
68
+ }
69
+ .docs-place:hover,
70
+ .docs-folder:hover { background: var(--dm-hover-bg); }
71
+ .docs-place:focus-visible,
72
+ .docs-folder:focus-visible { outline: 2px solid var(--dm-primary); outline-offset: -2px; }
73
+ .docs-place.is-active,
74
+ .docs-folder.is-active {
75
+ background: color-mix(in srgb, var(--dm-primary) 16%, transparent);
76
+ color: var(--dm-text);
77
+ font-weight: var(--dm-font-semibold);
78
+ }
79
+ .docs-place svg { flex: none; color: var(--dm-text-muted); }
80
+ .docs-place.is-active svg { color: var(--dm-primary); }
81
+
82
+ .docs-rail__section {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: var(--dm-space-1);
86
+ margin: var(--dm-space-3) 0 var(--dm-space-1);
87
+ padding: 0 var(--dm-space-3);
88
+ font-size: var(--dm-text-xs);
89
+ font-weight: var(--dm-font-semibold);
90
+ text-transform: uppercase;
91
+ letter-spacing: .04em;
92
+ color: var(--dm-text-muted);
93
+ }
94
+ .docs-rail__add { margin-left: auto; }
95
+ .docs-rail__folders { display: flex; flex-direction: column; gap: 1px; }
96
+ .docs-folder { position: relative; padding-right: 30px; }
97
+ .docs-folder::before {
98
+ content: "";
99
+ flex: none;
100
+ width: 13px;
101
+ height: 10px;
102
+ border: 1.5px solid var(--dm-text-muted);
103
+ border-radius: 2px;
104
+ border-top-left-radius: 0;
105
+ box-shadow: inset 0 2px 0 -1px var(--dm-text-muted);
106
+ }
107
+ .docs-folder__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
108
+ .docs-folder .docs-kebab { position: absolute; right: 4px; top: 50%; transform: translateY(-50%); }
109
+
110
+ .is-rail-collapsed .docs-rail__label,
111
+ .is-rail-collapsed .docs-rail__section,
112
+ .is-rail-collapsed .docs-rail__folders { display: none; }
113
+ .is-rail-collapsed .docs-place { justify-content: center; padding: 8px; }
114
+ .is-rail-collapsed .docs-rail__new { padding: var(--dm-space-2); }
115
+
116
+ /* ---- main ---- */
117
+
118
+ .docs-main { min-width: 0; display: flex; flex-direction: column; gap: var(--dm-space-3); }
119
+ .docs-main__bar {
120
+ display: flex;
121
+ flex-wrap: wrap;
122
+ align-items: center;
123
+ gap: var(--dm-space-2);
124
+ }
125
+ .docs-main__title {
126
+ display: flex;
127
+ align-items: baseline;
128
+ gap: var(--dm-space-2);
129
+ margin: 0 auto 0 0;
130
+ font-size: 1.25rem;
131
+ font-weight: var(--dm-font-semibold);
132
+ min-width: 0;
133
+ }
134
+ .docs-main__title > span:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
135
+ .docs-main__count { font-size: var(--dm-text-sm); font-weight: normal; color: var(--dm-text-muted); }
136
+ .docs-main__search {
137
+ position: relative;
138
+ display: flex;
139
+ align-items: center;
140
+ gap: var(--dm-space-1);
141
+ flex: 0 1 320px;
142
+ min-width: 180px;
143
+ }
144
+ .docs-main__search > svg { position: absolute; left: 10px; color: var(--dm-text-muted); pointer-events: none; }
145
+ .docs-main__search input { padding-left: 30px; border-radius: var(--dm-radius-full); width: 100%; }
146
+ .docs-main__sort { width: auto; }
147
+ .docs-main__layout { display: inline-flex; border: 1px solid var(--dm-border); border-radius: var(--dm-radius-md); overflow: hidden; }
148
+ .docs-main__layout .btn { border-radius: 0; }
149
+ .docs-main__layout .btn.is-on,
150
+ .docs-ed__actions .btn.is-on,
151
+ .docs-ed__star.is-on { background: color-mix(in srgb, var(--dm-primary) 16%, transparent); color: var(--dm-primary); }
152
+
153
+ .docs-trash-note {
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: space-between;
157
+ gap: var(--dm-space-3);
158
+ padding: var(--dm-space-2) var(--dm-space-3);
159
+ border: 1px solid var(--dm-border);
160
+ border-radius: var(--dm-radius-md);
161
+ background: var(--dm-surface);
162
+ color: var(--dm-text-muted);
163
+ font-size: var(--dm-text-sm);
164
+ }
165
+
166
+ .docs-main__body { position: relative; flex: 1; min-height: 240px; border-radius: var(--dm-radius-lg); }
167
+ .docs-drop {
168
+ display: none;
169
+ position: absolute;
170
+ inset: 0;
171
+ z-index: 5;
172
+ flex-direction: column;
173
+ align-items: center;
174
+ justify-content: center;
175
+ gap: var(--dm-space-2);
176
+ border: 2px dashed var(--dm-primary);
177
+ border-radius: var(--dm-radius-lg);
178
+ background: color-mix(in srgb, var(--dm-primary) 8%, var(--dm-surface));
179
+ color: var(--dm-text);
180
+ font-weight: var(--dm-font-semibold);
181
+ pointer-events: none;
182
+ }
183
+ .docs-main__body.is-dragging .docs-drop { display: flex; }
184
+
185
+ .docs-empty {
186
+ display: flex;
187
+ flex-direction: column;
188
+ align-items: center;
189
+ gap: var(--dm-space-2);
190
+ padding: var(--dm-space-8) var(--dm-space-4);
191
+ color: var(--dm-text-muted);
192
+ text-align: center;
193
+ }
194
+ .docs-empty p { margin: 0; max-width: 420px; }
195
+
196
+ /* ---- cards ---- */
197
+
198
+ .docs-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: var(--dm-space-4); }
199
+ .docs-card {
200
+ position: relative;
201
+ display: flex;
202
+ flex-direction: column;
203
+ border: 1px solid var(--dm-border);
204
+ border-radius: var(--dm-radius-md);
205
+ background: var(--dm-surface);
206
+ cursor: pointer;
207
+ overflow: hidden;
208
+ transition: border-color .15s, box-shadow .15s;
209
+ min-width: 0;
210
+ }
211
+ .docs-card:hover { border-color: var(--dm-primary); box-shadow: var(--dm-shadow-md); }
212
+ .docs-card:focus-visible { outline: 2px solid var(--dm-primary); outline-offset: 2px; }
213
+ .docs-card__sheet {
214
+ height: 150px;
215
+ padding: var(--dm-space-3) var(--dm-space-4);
216
+ border-bottom: 1px solid var(--dm-border);
217
+ background: color-mix(in srgb, var(--dm-text) 4%, var(--dm-surface));
218
+ overflow: hidden;
219
+ }
220
+ .docs-card__excerpt {
221
+ height: 100%;
222
+ padding: var(--dm-space-2) var(--dm-space-3);
223
+ background: var(--dm-surface);
224
+ border-radius: 2px;
225
+ box-shadow: 0 1px 3px color-mix(in srgb, var(--dm-text) 18%, transparent);
226
+ font-size: 9px;
227
+ line-height: 1.45;
228
+ color: var(--dm-text-muted);
229
+ overflow: hidden;
230
+ overflow-wrap: anywhere;
231
+ white-space: pre-line;
232
+ }
233
+ .docs-card__info { padding: var(--dm-space-2) var(--dm-space-3) var(--dm-space-3); min-width: 0; }
234
+ .docs-card__title {
235
+ font-weight: var(--dm-font-semibold);
236
+ font-size: var(--dm-text-sm);
237
+ white-space: nowrap;
238
+ overflow: hidden;
239
+ text-overflow: ellipsis;
240
+ padding-right: 26px;
241
+ }
242
+ .docs-card__meta { font-size: var(--dm-text-xs); color: var(--dm-text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
243
+ .docs-card__chips { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
244
+ .docs-card .docs-chip--shared,
245
+ .docs-card .docs-chip--public,
246
+ .docs-card .docs-chip--pdf,
247
+ .docs-card .docs-chip--locked { display: none; }
248
+ .docs-card.is-pdf .docs-chip--pdf { display: inline-flex; }
249
+ .docs-card.has-shared .docs-chip--shared,
250
+ .docs-card.has-public .docs-chip--public,
251
+ .docs-card.has-locked .docs-chip--locked { display: inline-flex; }
252
+
253
+ .docs-card__star {
254
+ position: absolute;
255
+ top: 6px;
256
+ right: 6px;
257
+ display: inline-flex;
258
+ padding: 4px;
259
+ border: 0;
260
+ border-radius: var(--dm-radius-full);
261
+ background: var(--dm-surface);
262
+ color: var(--dm-text-muted);
263
+ cursor: pointer;
264
+ opacity: 0;
265
+ transition: opacity .15s;
266
+ }
267
+ .docs-card:hover .docs-card__star,
268
+ .docs-card:focus-within .docs-card__star,
269
+ .docs-card.is-starred .docs-card__star { opacity: 1; }
270
+ .docs-card.is-starred .docs-card__star { color: var(--dm-warning); }
271
+ .docs-card.is-starred .docs-card__star svg { fill: currentColor; }
272
+ .docs-card .docs-kebab { position: absolute; right: 4px; bottom: 10px; }
273
+ .docs-card.is-trashed { opacity: .8; }
274
+ .docs-card--template .docs-card__sheet { background: color-mix(in srgb, var(--dm-primary) 8%, var(--dm-surface)); }
275
+
276
+ /* list layout: the same cards, one per row */
277
+ .docs-main__body.is-list .docs-cards { grid-template-columns: 1fr; gap: 0; border: 1px solid var(--dm-border); border-radius: var(--dm-radius-md); overflow: hidden; }
278
+ .docs-main__body.is-list .docs-card { flex-direction: row; align-items: center; border: 0; border-bottom: 1px solid var(--dm-border); border-radius: 0; box-shadow: none; }
279
+ .docs-main__body.is-list .docs-card:last-child { border-bottom: 0; }
280
+ .docs-main__body.is-list .docs-card:hover { background: var(--dm-hover-bg); }
281
+ .docs-main__body.is-list .docs-card__sheet { display: none; }
282
+ .docs-main__body.is-list .docs-card__info {
283
+ flex: 1;
284
+ display: grid;
285
+ grid-template-columns: minmax(0, 2fr) minmax(0, 2fr) auto;
286
+ align-items: center;
287
+ gap: var(--dm-space-3);
288
+ padding: var(--dm-space-2) 76px var(--dm-space-2) var(--dm-space-3);
289
+ }
290
+ .docs-main__body.is-list .docs-card__chips { margin: 0; }
291
+ .docs-main__body.is-list .docs-card__star { top: 50%; right: 40px; transform: translateY(-50%); }
292
+ .docs-main__body.is-list .docs-card .docs-kebab { top: 50%; bottom: auto; transform: translateY(-50%); }
293
+
294
+ /* ---- shared bits ---- */
295
+
296
+ .docs-kebab {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ width: 26px;
301
+ height: 26px;
302
+ border: 0;
303
+ border-radius: var(--dm-radius-full);
304
+ background: transparent;
305
+ color: var(--dm-text-muted);
306
+ cursor: pointer;
307
+ }
308
+ .docs-kebab:hover, .docs-kebab:focus-visible { background: var(--dm-hover-bg); color: var(--dm-text); }
309
+
310
+ .docs-chip {
311
+ display: inline-flex;
312
+ align-items: center;
313
+ gap: 4px;
314
+ padding: 1px 8px;
315
+ border-radius: var(--dm-radius-full);
316
+ background: color-mix(in srgb, var(--dm-text) 8%, transparent);
317
+ color: var(--dm-text-secondary);
318
+ font-size: var(--dm-text-xs);
319
+ white-space: nowrap;
320
+ }
321
+ .docs-chip--public { background: color-mix(in srgb, var(--dm-info) 16%, transparent); }
322
+ .docs-chip--locked { background: color-mix(in srgb, var(--dm-warning) 20%, transparent); color: var(--dm-text); }
323
+ .docs-chip--danger { background: color-mix(in srgb, var(--dm-danger) 16%, transparent); color: var(--dm-text); }
324
+ .docs-chip--pdf { background: color-mix(in srgb, var(--dm-danger) 12%, transparent); color: var(--dm-text); }
325
+
326
+ .docs-avatar {
327
+ display: inline-flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ flex: none;
331
+ width: 28px;
332
+ height: 28px;
333
+ border-radius: var(--dm-radius-full);
334
+ background: color-mix(in srgb, var(--dm-primary) 22%, var(--dm-surface));
335
+ color: var(--dm-text);
336
+ font-size: var(--dm-text-xs);
337
+ font-weight: var(--dm-font-semibold);
338
+ }
339
+
340
+ .docs-check { display: flex; align-items: center; gap: var(--dm-space-2); font-size: var(--dm-text-sm); cursor: pointer; }
341
+
342
+ /* ================================================================ Editor */
343
+
344
+ .docs-ed {
345
+ display: flex;
346
+ flex-direction: column;
347
+ height: calc(100vh - 150px);
348
+ min-height: 480px;
349
+ border: 1px solid var(--dm-border);
350
+ border-radius: var(--dm-radius-md);
351
+ background: var(--dm-surface);
352
+ overflow: hidden;
353
+ }
354
+
355
+ .docs-ed__top {
356
+ display: flex;
357
+ flex-wrap: wrap;
358
+ align-items: center;
359
+ gap: var(--dm-space-2);
360
+ padding: var(--dm-space-2) var(--dm-space-3);
361
+ border-bottom: 1px solid var(--dm-border);
362
+ }
363
+ .docs-ed__titlebox { flex: 1 1 260px; min-width: 0; }
364
+ .docs-ed__title {
365
+ display: block;
366
+ width: 100%;
367
+ padding: 2px 6px;
368
+ border: 1px solid transparent;
369
+ border-radius: var(--dm-radius-sm);
370
+ background: transparent;
371
+ color: var(--dm-text);
372
+ font: inherit;
373
+ font-size: 1.15rem;
374
+ font-weight: var(--dm-font-semibold);
375
+ }
376
+ .docs-ed__title:hover { border-color: var(--dm-border); }
377
+ .docs-ed__title:focus { outline: none; border-color: var(--dm-primary); }
378
+ .docs-ed__title[readonly]:hover { border-color: transparent; }
379
+ .docs-ed__crumbs { display: flex; flex-wrap: wrap; gap: var(--dm-space-3); padding: 0 6px; font-size: var(--dm-text-xs); color: var(--dm-text-muted); }
380
+ .docs-ed__save.is-dirty { color: var(--dm-text-secondary); }
381
+ .docs-ed__save.is-failed { color: var(--dm-danger); font-weight: var(--dm-font-semibold); }
382
+ .docs-ed__star svg { transition: fill .15s; }
383
+ .docs-ed__star.is-on { color: var(--dm-warning); background: transparent; }
384
+ .docs-ed__star.is-on svg { fill: currentColor; }
385
+ .docs-ed__status-chips { display: flex; flex-wrap: wrap; align-items: center; gap: var(--dm-space-2); }
386
+ .docs-ed__actions { display: flex; align-items: center; gap: 2px; margin-left: auto; }
387
+ .docs-ed__share { margin-left: var(--dm-space-2); border-radius: var(--dm-radius-full); padding-inline: var(--dm-space-4); }
388
+
389
+ /* ---- toolbar ---- */
390
+
391
+ .docs-ed__toolbar { border-bottom: 1px solid var(--dm-border); background: var(--dm-surface); }
392
+ .docs-toolbar {
393
+ display: flex;
394
+ flex-wrap: wrap;
395
+ align-items: center;
396
+ gap: 2px var(--dm-space-2);
397
+ padding: 4px var(--dm-space-3);
398
+ }
399
+ .docs-toolbar__group { display: flex; align-items: center; gap: 1px; padding-right: var(--dm-space-2); border-right: 1px solid var(--dm-border); }
400
+ .docs-toolbar__group:last-child { border-right: 0; }
401
+ .docs-toolbar.is-disabled { opacity: .45; pointer-events: none; }
402
+ .docs-tool {
403
+ display: inline-flex;
404
+ align-items: center;
405
+ justify-content: center;
406
+ min-width: 30px;
407
+ height: 30px;
408
+ padding: 0 6px;
409
+ border: 0;
410
+ border-radius: var(--dm-radius-sm);
411
+ background: transparent;
412
+ color: var(--dm-text);
413
+ cursor: pointer;
414
+ }
415
+ .docs-tool:hover { background: var(--dm-hover-bg); }
416
+ .docs-tool:focus-visible { outline: 2px solid var(--dm-primary); outline-offset: -2px; }
417
+ .docs-tool.is-on { background: color-mix(in srgb, var(--dm-primary) 18%, transparent); color: var(--dm-primary); }
418
+ .docs-tool-select {
419
+ height: 30px;
420
+ padding: 0 var(--dm-space-2);
421
+ border: 1px solid var(--dm-border);
422
+ border-radius: var(--dm-radius-sm);
423
+ background: var(--dm-surface);
424
+ color: var(--dm-text);
425
+ font: inherit;
426
+ font-size: var(--dm-text-sm);
427
+ }
428
+
429
+ /* ---- body: outline, canvas, side panel ---- */
430
+
431
+ .docs-ed__body { flex: 1; display: flex; min-height: 0; }
432
+ .docs-outline {
433
+ flex: 0 0 220px;
434
+ padding: var(--dm-space-3);
435
+ border-right: 1px solid var(--dm-border);
436
+ overflow-y: auto;
437
+ }
438
+ .docs-outline__head {
439
+ display: flex;
440
+ align-items: center;
441
+ gap: var(--dm-space-1);
442
+ margin-bottom: var(--dm-space-2);
443
+ font-size: var(--dm-text-xs);
444
+ font-weight: var(--dm-font-semibold);
445
+ text-transform: uppercase;
446
+ letter-spacing: .04em;
447
+ color: var(--dm-text-muted);
448
+ }
449
+ .docs-outline__empty { margin: 0; font-size: var(--dm-text-sm); color: var(--dm-text-muted); }
450
+ .docs-outline__list { display: flex; flex-direction: column; }
451
+ .docs-outline__item {
452
+ display: block;
453
+ width: 100%;
454
+ padding: 4px var(--dm-space-2);
455
+ border: 0;
456
+ border-radius: var(--dm-radius-sm);
457
+ background: transparent;
458
+ color: var(--dm-text-secondary);
459
+ font: inherit;
460
+ font-size: var(--dm-text-sm);
461
+ text-align: left;
462
+ white-space: nowrap;
463
+ overflow: hidden;
464
+ text-overflow: ellipsis;
465
+ cursor: pointer;
466
+ }
467
+ .docs-outline__item:hover { background: var(--dm-hover-bg); color: var(--dm-text); }
468
+ .docs-outline__item--h1 { font-weight: var(--dm-font-semibold); color: var(--dm-text); }
469
+ .docs-outline__item--h2 { padding-left: calc(var(--dm-space-2) + 12px); }
470
+ .docs-outline__item--h3 { padding-left: calc(var(--dm-space-2) + 24px); }
471
+ .docs-outline__item--h4 { padding-left: calc(var(--dm-space-2) + 36px); }
472
+
473
+ .docs-ed__canvas {
474
+ position: relative;
475
+ flex: 1;
476
+ min-width: 0;
477
+ overflow-y: auto;
478
+ padding: var(--dm-space-6) var(--dm-space-4) var(--dm-space-8);
479
+ background: color-mix(in srgb, var(--dm-text) 5%, var(--dm-surface));
480
+ }
481
+ .docs-page {
482
+ max-width: 816px;
483
+ min-height: 1056px;
484
+ margin: 0 auto;
485
+ background: var(--dm-surface);
486
+ border: 1px solid var(--dm-border);
487
+ border-radius: 2px;
488
+ box-shadow: 0 1px 4px color-mix(in srgb, var(--dm-text) 14%, transparent);
489
+ }
490
+ .docs-ed__side {
491
+ flex: 0 0 320px;
492
+ display: flex;
493
+ flex-direction: column;
494
+ border-left: 1px solid var(--dm-border);
495
+ min-width: 0;
496
+ }
497
+ .docs-ed__side-head {
498
+ display: flex;
499
+ align-items: center;
500
+ justify-content: space-between;
501
+ padding: var(--dm-space-2) var(--dm-space-3);
502
+ border-bottom: 1px solid var(--dm-border);
503
+ font-weight: var(--dm-font-semibold);
504
+ font-size: var(--dm-text-sm);
505
+ }
506
+ .docs-ed__side-body { flex: 1; overflow-y: auto; padding: var(--dm-space-3); }
507
+
508
+ .docs-ed__foot {
509
+ display: flex;
510
+ justify-content: space-between;
511
+ gap: var(--dm-space-3);
512
+ padding: 4px var(--dm-space-3);
513
+ border-top: 1px solid var(--dm-border);
514
+ font-size: var(--dm-text-xs);
515
+ color: var(--dm-text-muted);
516
+ }
517
+
518
+ /* ---- the document itself ---- */
519
+
520
+ .docs-surface {
521
+ min-height: 1000px;
522
+ padding: 72px 88px;
523
+ color: var(--dm-text);
524
+ font-size: 15px;
525
+ line-height: 1.65;
526
+ outline: none;
527
+ overflow-wrap: anywhere;
528
+ }
529
+ .docs-surface.is-empty::before {
530
+ content: attr(data-placeholder);
531
+ position: absolute;
532
+ color: var(--dm-text-muted);
533
+ pointer-events: none;
534
+ }
535
+ .docs-surface > :first-child { margin-top: 0; }
536
+ .docs-surface h1 { font-size: 2em; line-height: 1.2; margin: 1.1em 0 .45em; }
537
+ .docs-surface h2 { font-size: 1.5em; line-height: 1.25; margin: 1.1em 0 .4em; }
538
+ .docs-surface h3 { font-size: 1.22em; margin: 1em 0 .35em; }
539
+ .docs-surface h4 { font-size: 1.05em; margin: 1em 0 .3em; }
540
+ .docs-surface p { margin: 0 0 .75em; }
541
+ .docs-surface a { color: var(--dm-primary); }
542
+ .docs-surface img { max-width: 100%; height: auto; border-radius: 2px; }
543
+ .docs-surface blockquote {
544
+ margin: 0 0 1em;
545
+ padding: .25em 1em;
546
+ border-left: 4px solid var(--dm-border);
547
+ color: var(--dm-text-secondary);
548
+ }
549
+ .docs-surface pre {
550
+ margin: 0 0 1em;
551
+ padding: var(--dm-space-3);
552
+ border: 1px solid var(--dm-code-border, var(--dm-border));
553
+ border-radius: var(--dm-radius-sm);
554
+ background: var(--dm-code-bg);
555
+ color: var(--dm-code-text, var(--dm-text));
556
+ font-family: var(--dm-font-mono);
557
+ font-size: .88em;
558
+ white-space: pre-wrap;
559
+ }
560
+ .docs-surface code { font-family: var(--dm-font-mono); font-size: .9em; padding: 1px 4px; border-radius: 3px; background: var(--dm-code-bg); }
561
+ .docs-surface pre code { padding: 0; background: none; }
562
+ .docs-surface hr { border: 0; border-top: 1px solid var(--dm-border); margin: 1.5em 0; }
563
+ .docs-surface table { border-collapse: collapse; width: 100%; margin: 0 0 1em; table-layout: fixed; }
564
+ .docs-surface td,
565
+ .docs-surface th { border: 1px solid var(--dm-border); padding: 6px 8px; vertical-align: top; text-align: left; }
566
+ .docs-surface th { background: color-mix(in srgb, var(--dm-text) 5%, transparent); font-weight: var(--dm-font-semibold); }
567
+ .docs-surface ul[data-type="checklist"] { list-style: none; padding-left: 0; }
568
+ .docs-surface ul[data-type="checklist"] > li { position: relative; padding-left: 28px; }
569
+ .docs-surface ul[data-type="checklist"] > li::before {
570
+ content: "";
571
+ position: absolute;
572
+ left: 2px;
573
+ top: .3em;
574
+ width: 15px;
575
+ height: 15px;
576
+ border: 1.5px solid var(--dm-text-muted);
577
+ border-radius: 3px;
578
+ background: var(--dm-surface);
579
+ cursor: pointer;
580
+ }
581
+ .docs-surface ul[data-type="checklist"] > li[data-checked="true"] { color: var(--dm-text-muted); text-decoration: line-through; }
582
+ .docs-surface ul[data-type="checklist"] > li[data-checked="true"]::before {
583
+ border-color: var(--dm-primary);
584
+ background: var(--dm-primary)
585
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 12px no-repeat;
586
+ }
587
+ .docs-ed.is-readonly .docs-surface { cursor: default; }
588
+
589
+ /* ---- focus mode: the admin's own chrome steps aside ---- */
590
+
591
+ body.docs-focus #admin-sidebar,
592
+ body.docs-focus #admin-topbar,
593
+ body.docs-focus .dm-plugin-banner { display: none !important; }
594
+ body.docs-focus .dashboard-main { margin: 0 !important; padding: 0 !important; }
595
+ body.docs-focus .docs-ed { position: fixed; inset: 0; z-index: 900; height: auto; border: 0; border-radius: 0; }
596
+
597
+ /* ================================================================ Panels */
598
+
599
+ .docs-share, .docs-settings, .docs-form { display: flex; flex-direction: column; gap: var(--dm-space-4); padding: var(--dm-space-4); }
600
+ .docs-share__group, .docs-settings__group { display: flex; flex-direction: column; gap: var(--dm-space-2); }
601
+ .docs-share__heading, .docs-settings__heading {
602
+ display: flex;
603
+ align-items: center;
604
+ gap: var(--dm-space-1);
605
+ margin: 0;
606
+ font-size: var(--dm-text-sm);
607
+ font-weight: var(--dm-font-semibold);
608
+ }
609
+ .docs-share__people { display: flex; flex-direction: column; gap: var(--dm-space-1); }
610
+ .docs-share__person { display: flex; align-items: center; gap: var(--dm-space-2); padding: 4px 0; }
611
+ .docs-share__name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--dm-text-sm); }
612
+ .docs-share__role { width: auto; }
613
+ .docs-share__remove { opacity: .6; }
614
+ .docs-share__remove:hover { opacity: 1; }
615
+ .docs-share__matches {
616
+ display: flex;
617
+ flex-direction: column;
618
+ border: 1px solid var(--dm-border);
619
+ border-radius: var(--dm-radius-md);
620
+ background: var(--dm-surface);
621
+ overflow: hidden;
622
+ }
623
+ .docs-share__pick {
624
+ display: flex;
625
+ align-items: center;
626
+ gap: var(--dm-space-2);
627
+ padding: 6px var(--dm-space-2);
628
+ border: 0;
629
+ background: transparent;
630
+ color: var(--dm-text);
631
+ font: inherit;
632
+ font-size: var(--dm-text-sm);
633
+ text-align: left;
634
+ cursor: pointer;
635
+ }
636
+ .docs-share__pick:hover, .docs-share__pick:focus-visible { background: var(--dm-hover-bg); }
637
+ .docs-share__notify { display: flex; flex-direction: column; gap: var(--dm-space-2); }
638
+ .docs-share__link { display: flex; gap: var(--dm-space-2); align-items: center; }
639
+ .docs-share__link input { flex: 1; min-width: 0; font-family: var(--dm-font-mono); font-size: var(--dm-text-xs); }
640
+ .docs-share__note, .docs-settings__note { margin: 0; font-size: var(--dm-text-sm); color: var(--dm-text-muted); }
641
+ .docs-share__actions, .docs-settings__actions, .docs-form__actions { display: flex; justify-content: flex-end; gap: var(--dm-space-2); }
642
+ .docs-share__ext:empty { display: none; }
643
+ .docs-settings__row { display: flex; justify-content: space-between; align-items: center; gap: var(--dm-space-2); font-size: var(--dm-text-sm); }
644
+ .docs-form__choice { display: flex; flex-direction: column; gap: var(--dm-space-2); margin: 0; padding: 0; border: 0; }
645
+
646
+ /* ---- find and replace ---- */
647
+
648
+ .docs-find {
649
+ position: sticky;
650
+ top: calc(-1 * var(--dm-space-6));
651
+ z-index: 3;
652
+ display: flex;
653
+ flex-wrap: wrap;
654
+ align-items: center;
655
+ gap: var(--dm-space-2);
656
+ max-width: 816px;
657
+ margin: calc(-1 * var(--dm-space-6)) auto var(--dm-space-3);
658
+ padding: var(--dm-space-2) var(--dm-space-3);
659
+ border: 1px solid var(--dm-border);
660
+ border-radius: 0 0 var(--dm-radius-md) var(--dm-radius-md);
661
+ background: var(--dm-surface-raised, var(--dm-surface));
662
+ box-shadow: var(--dm-shadow-md);
663
+ }
664
+ .docs-find input[type="text"] { width: 150px; }
665
+ .docs-find__case { display: inline-flex; align-items: center; gap: 4px; font-size: var(--dm-text-xs); color: var(--dm-text-secondary); white-space: nowrap; }
666
+ .docs-find__status { flex: 1; font-size: var(--dm-text-xs); color: var(--dm-text-muted); }
667
+
668
+ /* ---- version history ---- */
669
+
670
+ .docs-versions { display: grid; grid-template-columns: 260px minmax(0, 1fr); gap: var(--dm-space-3); min-height: 60vh; }
671
+ .docs-versions__empty, .docs-versions__note { grid-column: 1 / -1; margin: 0; color: var(--dm-text-muted); font-size: var(--dm-text-sm); }
672
+ .docs-versions__list { display: flex; flex-direction: column; gap: 2px; max-height: 70vh; overflow-y: auto; }
673
+ .docs-version {
674
+ display: flex;
675
+ flex-direction: column;
676
+ gap: 2px;
677
+ padding: var(--dm-space-2);
678
+ border: 1px solid transparent;
679
+ border-radius: var(--dm-radius-sm);
680
+ background: transparent;
681
+ color: var(--dm-text);
682
+ font: inherit;
683
+ text-align: left;
684
+ cursor: pointer;
685
+ }
686
+ .docs-version:hover { background: var(--dm-hover-bg); }
687
+ .docs-version.is-active { border-color: var(--dm-primary); background: color-mix(in srgb, var(--dm-primary) 10%, transparent); }
688
+ .docs-version strong { font-size: var(--dm-text-sm); }
689
+ .docs-version__when, .docs-version__preview { font-size: var(--dm-text-xs); color: var(--dm-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
690
+ .docs-versions__preview { display: flex; flex-direction: column; min-width: 0; border: 1px solid var(--dm-border); border-radius: var(--dm-radius-md); overflow: hidden; }
691
+ .docs-versions__hint { margin: var(--dm-space-4); color: var(--dm-text-muted); }
692
+ .docs-versions__bar { display: flex; align-items: center; justify-content: space-between; gap: var(--dm-space-2); padding: var(--dm-space-2) var(--dm-space-3); border-bottom: 1px solid var(--dm-border); font-size: var(--dm-text-sm); font-weight: var(--dm-font-semibold); }
693
+ .docs-versions__body.docs-surface { min-height: 0; max-height: 64vh; overflow-y: auto; padding: var(--dm-space-4) var(--dm-space-5); }
694
+
695
+ /* ---- template picker (still used by Save as template) ---- */
696
+
697
+ .docs-templates { display: flex; flex-direction: column; gap: var(--dm-space-2); }
698
+ .docs-template { display: grid; grid-template-columns: 1fr auto; gap: var(--dm-space-1) var(--dm-space-3); padding: var(--dm-space-2); border: 1px solid var(--dm-border); border-radius: var(--dm-radius-sm); }
699
+ .docs-template__preview { grid-column: 1; margin: 0; font-size: var(--dm-text-xs); color: var(--dm-text-muted); }
700
+ .docs-template__actions { grid-column: 2; grid-row: 1 / span 2; display: flex; gap: var(--dm-space-1); align-items: center; }
701
+
702
+ /* ============================================================ Small screens */
703
+
704
+ @media (max-width: 900px) {
705
+ .docs-outline { position: absolute; z-index: 4; top: 0; bottom: 0; left: 0; background: var(--dm-surface); box-shadow: var(--dm-shadow-md); }
706
+ .docs-ed__body { position: relative; }
707
+ .docs-ed__side { position: absolute; z-index: 4; top: 0; bottom: 0; right: 0; width: min(320px, 90%); background: var(--dm-surface); box-shadow: var(--dm-shadow-md); }
708
+ .docs-surface { padding: 40px 32px; }
709
+ }
710
+ @media (max-width: 720px) {
711
+ .docs-home, .docs-home.is-rail-collapsed { grid-template-columns: 1fr; }
712
+ .docs-rail { position: static; max-height: none; }
713
+ .is-rail-collapsed .docs-rail__nav { display: none; }
714
+ .docs-home:not(.is-rail-collapsed) .docs-main { display: none; }
715
+ .docs-main__search { flex: 1 1 100%; order: 5; }
716
+ .docs-cards { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--dm-space-2); }
717
+ .docs-main__body.is-list .docs-card__info { grid-template-columns: 1fr; gap: 2px; }
718
+ .docs-ed { height: calc(100vh - 110px); }
719
+ .docs-ed__canvas { padding: var(--dm-space-2) 0; }
720
+ .docs-page { border-left: 0; border-right: 0; min-height: 0; }
721
+ .docs-surface { padding: 24px 18px; min-height: 60vh; }
722
+ .docs-ed__actions .btn:not(.docs-ed__share):not(.docs-ed__more) { display: none; }
723
+ .docs-versions { grid-template-columns: 1fr; }
724
+ }
725
+
726
+ /* ================================================================== Print */
727
+
728
+ @media print {
729
+ #admin-sidebar, #admin-topbar, .dm-plugin-banner, .docs-ed__top, .docs-ed__toolbar, .docs-outline, .docs-ed__side, .docs-ed__foot { display: none !important; }
730
+ .docs-ed, .docs-ed__canvas, .docs-page { border: 0; box-shadow: none; background: none; height: auto; overflow: visible; }
731
+ .docs-surface { padding: 0; min-height: 0; }
732
+ }
733
+
734
+ /* ---- 2.10: rail counts, loading slots ---- */
735
+ .docs-place__count {
736
+ margin-left: auto;
737
+ font-size: var(--dm-text-xs);
738
+ color: var(--dm-text-muted);
739
+ font-variant-numeric: tabular-nums;
740
+ }
741
+ .docs-place.is-active .docs-place__count { color: var(--dm-text); }
742
+ .is-rail-collapsed .docs-place__count { display: none; }
743
+ /* Block elements: a skeleton in a flex row collapses to a sliver. */
744
+ .docs-loading { display: block; color: var(--dm-text-muted); }
745
+ .docs-loading[hidden] { display: none; }
746
+ .docs-ed__loading { display: block; max-width: 816px; margin: 0 auto; color: var(--dm-text-muted); }
747
+ .docs-ed__loading[hidden] { display: none; }
748
+ .docs-ed__loading:not([hidden]) + .docs-page { display: none; }
749
+
750
+ /* ---- PDF documents (2.13): the file in the browser's own viewer, no toolbar, no outline ---- */
751
+
752
+ .docs-ed.is-pdf .docs-ed__toolbar,
753
+ .docs-ed.is-pdf .docs-outline,
754
+ .docs-ed.is-pdf [data-on-click="toggleOutline"],
755
+ .docs-ed.is-pdf [data-on-click="find"] { display: none; }
756
+ .docs-ed.is-pdf .docs-ed__canvas { padding: var(--dm-space-4); }
757
+ .docs-page.docs-pdf {
758
+ display: flex;
759
+ flex-direction: column;
760
+ max-width: 1000px;
761
+ height: calc(100vh - 230px);
762
+ min-height: 480px;
763
+ overflow: hidden;
764
+ border-radius: var(--dm-radius-md);
765
+ }
766
+ .docs-pdf__frame { flex: 1; width: 100%; border: 0; background: #fff; }
767
+ .docs-pdf__state {
768
+ flex: 1;
769
+ display: flex;
770
+ flex-direction: column;
771
+ align-items: center;
772
+ justify-content: center;
773
+ gap: var(--dm-space-2);
774
+ padding: var(--dm-space-8);
775
+ color: var(--dm-text-muted);
776
+ text-align: center;
777
+ }
778
+ .docs-pdf__state p { margin: 0; }
779
+ .docs-pdf__hint { font-size: var(--dm-text-xs); }
780
+ .docs-focus .docs-page.docs-pdf { height: calc(100vh - 120px); }
781
+ .docs-versions__pdf { display: flex; flex-direction: column; gap: var(--dm-space-3); padding: var(--dm-space-4); color: var(--dm-text-secondary); }
782
+ .docs-versions__pdf .docs-versions__facts { font-weight: var(--dm-font-semibold); color: var(--dm-text); }
783
+ .docs-versions__pdf .docs-versions__extract { white-space: pre-line; font-size: var(--dm-text-sm); color: var(--dm-text-muted); max-height: 40vh; overflow: auto; }