@nowline/preview-shell 0.4.2 → 0.5.1
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.
- package/dist/markup.d.ts +34 -7
- package/dist/markup.d.ts.map +1 -1
- package/dist/markup.js +72 -42
- package/dist/markup.js.map +1 -1
- package/dist/mount.d.ts +59 -15
- package/dist/mount.d.ts.map +1 -1
- package/dist/mount.js +599 -109
- package/dist/mount.js.map +1 -1
- package/dist/styles.d.ts +9 -8
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +282 -61
- package/dist/styles.js.map +1 -1
- package/package.json +2 -2
- package/src/markup.ts +109 -49
- package/src/mount.ts +741 -116
- package/src/styles.ts +282 -61
package/dist/styles.js
CHANGED
|
@@ -3,14 +3,20 @@
|
|
|
3
3
|
// without forking the package. Sensible defaults baked in so the
|
|
4
4
|
// viewport works out of the box on a blank page.
|
|
5
5
|
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// —
|
|
9
|
-
//
|
|
6
|
+
// Chrome (toolbar, menus, minimap) uses `--nl-chrome-*` tokens driven
|
|
7
|
+
// exclusively by the `data-nl-mode="light|dark"` attribute on the root
|
|
8
|
+
// element — these intentionally do NOT inherit VS Code workbench colors
|
|
9
|
+
// so the toolbar stays readable regardless of the active editor theme.
|
|
10
|
+
//
|
|
11
|
+
// VS Code consumers paste `VSCODE_THEME_BRIDGE_CSS` into their webview
|
|
12
|
+
// to map viewport/canvas `--nl-preview-*` tokens to `--vscode-*`
|
|
13
|
+
// variables. This bridge no longer touches chrome tokens.
|
|
10
14
|
/**
|
|
11
|
-
* Bridge CSS for VS Code webview consumers. Maps
|
|
12
|
-
*
|
|
13
|
-
*
|
|
15
|
+
* Bridge CSS for VS Code webview consumers. Maps viewport and
|
|
16
|
+
* diagnostic `--nl-preview-*` tokens to `--vscode-*` variables.
|
|
17
|
+
* Does NOT map chrome (toolbar/menu) tokens — those are driven by
|
|
18
|
+
* `data-nl-mode` so the toolbar palette is independent of the
|
|
19
|
+
* workbench color theme.
|
|
14
20
|
*
|
|
15
21
|
* Inject as a `<style>` block after the preview-shell stylesheet.
|
|
16
22
|
*/
|
|
@@ -22,9 +28,6 @@ export const VSCODE_THEME_BRIDGE_CSS = `
|
|
|
22
28
|
--nl-preview-font-size: var(--vscode-font-size, 13px);
|
|
23
29
|
--nl-preview-widget-bg: var(--vscode-editorWidget-background, rgba(40,40,40,0.9));
|
|
24
30
|
--nl-preview-widget-border: var(--vscode-editorWidget-border, rgba(255,255,255,0.1));
|
|
25
|
-
--nl-preview-toolbar-hover: var(--vscode-toolbar-hoverBackground, rgba(255,255,255,0.08));
|
|
26
|
-
--nl-preview-toolbar-active: var(--vscode-toolbar-activeBackground, rgba(255,255,255,0.12));
|
|
27
|
-
--nl-preview-list-hover: var(--vscode-list-hoverBackground, rgba(255,255,255,0.04));
|
|
28
31
|
--nl-preview-description: var(--vscode-descriptionForeground, #999);
|
|
29
32
|
--nl-preview-error: var(--vscode-editorError-foreground, #f48771);
|
|
30
33
|
--nl-preview-warning: var(--vscode-editorWarning-foreground, #cca700);
|
|
@@ -36,9 +39,8 @@ export const VSCODE_THEME_BRIDGE_CSS = `
|
|
|
36
39
|
`;
|
|
37
40
|
/**
|
|
38
41
|
* Default stylesheet for the viewport. Provides reasonable defaults
|
|
39
|
-
* for every `--nl-preview-*` token
|
|
40
|
-
*
|
|
41
|
-
* higher-specificity selector.
|
|
42
|
+
* for every `--nl-preview-*` token and both dark/light `--nl-chrome-*`
|
|
43
|
+
* palettes so the viewport works on a blank page without any bridge CSS.
|
|
42
44
|
*/
|
|
43
45
|
export const PREVIEW_SHELL_CSS = `
|
|
44
46
|
:root {
|
|
@@ -49,9 +51,6 @@ export const PREVIEW_SHELL_CSS = `
|
|
|
49
51
|
--nl-preview-font-size: 13px;
|
|
50
52
|
--nl-preview-widget-bg: rgba(40,40,40,0.9);
|
|
51
53
|
--nl-preview-widget-border: rgba(255,255,255,0.1);
|
|
52
|
-
--nl-preview-toolbar-hover: rgba(255,255,255,0.08);
|
|
53
|
-
--nl-preview-toolbar-active: rgba(255,255,255,0.12);
|
|
54
|
-
--nl-preview-list-hover: rgba(255,255,255,0.04);
|
|
55
54
|
--nl-preview-description: #999;
|
|
56
55
|
--nl-preview-error: #f48771;
|
|
57
56
|
--nl-preview-warning: #cca700;
|
|
@@ -68,66 +67,233 @@ export const PREVIEW_SHELL_CSS = `
|
|
|
68
67
|
font-family: var(--nl-preview-font-family);
|
|
69
68
|
font-size: var(--nl-preview-font-size);
|
|
70
69
|
overflow: hidden;
|
|
70
|
+
/* Shared positioning gutter for all floating elements */
|
|
71
|
+
--nl-preview-gutter: 8px;
|
|
72
|
+
/* Chrome palette — dark default */
|
|
73
|
+
--nl-chrome-bg: rgba(30, 30, 30, 0.93);
|
|
74
|
+
--nl-chrome-border: rgba(255, 255, 255, 0.11);
|
|
75
|
+
--nl-chrome-fg: #d4d4d4;
|
|
76
|
+
--nl-chrome-hover: rgba(255, 255, 255, 0.08);
|
|
77
|
+
--nl-chrome-active: rgba(255, 255, 255, 0.13);
|
|
78
|
+
--nl-chrome-muted: #888;
|
|
79
|
+
--nl-chrome-chip-bg: rgba(255, 255, 255, 0.07);
|
|
80
|
+
--nl-chrome-shadow: rgba(0, 0, 0, 0.32);
|
|
81
|
+
}
|
|
82
|
+
/* Chrome palette — light mode override (driven by data-nl-mode, never by workbench) */
|
|
83
|
+
.nl-preview-root[data-nl-mode="light"] {
|
|
84
|
+
--nl-chrome-bg: rgba(248, 248, 248, 0.96);
|
|
85
|
+
--nl-chrome-border: rgba(0, 0, 0, 0.13);
|
|
86
|
+
--nl-chrome-fg: #3c3c3c;
|
|
87
|
+
--nl-chrome-hover: rgba(0, 0, 0, 0.06);
|
|
88
|
+
--nl-chrome-active: rgba(0, 0, 0, 0.10);
|
|
89
|
+
--nl-chrome-muted: #717171;
|
|
90
|
+
--nl-chrome-chip-bg: rgba(0, 0, 0, 0.06);
|
|
91
|
+
--nl-chrome-shadow: rgba(0, 0, 0, 0.14);
|
|
71
92
|
}
|
|
72
93
|
.nl-preview-root .viewport {
|
|
73
94
|
position: absolute; inset: 0;
|
|
74
95
|
overflow: auto;
|
|
96
|
+
display: flex;
|
|
75
97
|
}
|
|
76
98
|
.nl-preview-root .canvas {
|
|
99
|
+
/* flex-shrink:0 + margin:auto: centers the diagram when it fits,
|
|
100
|
+
allows overflow scroll when it's larger than the viewport */
|
|
101
|
+
flex-shrink: 0;
|
|
102
|
+
margin: auto;
|
|
77
103
|
transform-origin: 0 0;
|
|
78
104
|
will-change: transform;
|
|
79
105
|
}
|
|
80
106
|
.nl-preview-root .canvas svg { display: block; max-width: none; height: auto; }
|
|
81
107
|
.nl-preview-root .canvas.dimmed { opacity: 0.25; pointer-events: none; }
|
|
82
108
|
|
|
83
|
-
/* === Toolbar (
|
|
109
|
+
/* === Toolbar (floating, repositionable) === */
|
|
84
110
|
.nl-preview-root .chrome {
|
|
85
|
-
position: absolute;
|
|
111
|
+
position: absolute;
|
|
112
|
+
top: var(--nl-preview-gutter);
|
|
113
|
+
right: var(--nl-preview-gutter);
|
|
86
114
|
display: flex; gap: 4px;
|
|
115
|
+
/* Keep the toolbar at its natural width so a narrowing viewport
|
|
116
|
+
shifts it left (handled in JS) instead of squishing the row. */
|
|
117
|
+
width: max-content;
|
|
87
118
|
transition: opacity 200ms ease;
|
|
88
119
|
z-index: 10;
|
|
89
120
|
}
|
|
90
|
-
.nl-preview-root .chrome.faded { opacity: 0.
|
|
91
|
-
.nl-preview-root .chrome:hover { opacity: 1; }
|
|
121
|
+
.nl-preview-root .chrome.faded { opacity: 0.2; pointer-events: none; }
|
|
122
|
+
.nl-preview-root .chrome:hover { opacity: 1; pointer-events: auto; }
|
|
92
123
|
.nl-preview-root .toolbar {
|
|
93
124
|
display: flex; align-items: center; gap: 2px;
|
|
125
|
+
flex-wrap: nowrap;
|
|
126
|
+
white-space: nowrap;
|
|
94
127
|
padding: 2px;
|
|
95
|
-
background: var(--nl-
|
|
96
|
-
border: 1px solid var(--nl-
|
|
128
|
+
background: var(--nl-chrome-bg);
|
|
129
|
+
border: 1px solid var(--nl-chrome-border);
|
|
97
130
|
border-radius: 6px;
|
|
98
|
-
box-shadow: 0 2px 8px
|
|
131
|
+
box-shadow: 0 2px 8px var(--nl-chrome-shadow);
|
|
132
|
+
color: var(--nl-chrome-fg);
|
|
133
|
+
user-select: none;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Collapsed puck: hide everything but the drag grip + restore arrow,
|
|
137
|
+
and dim it so it stays out of the way until hovered. */
|
|
138
|
+
.nl-preview-root .restore-btn { display: none; }
|
|
139
|
+
.nl-preview-root .chrome.collapsed .toolbar > :not(.toolbar-handle):not(.restore-btn) {
|
|
140
|
+
display: none;
|
|
99
141
|
}
|
|
142
|
+
.nl-preview-root .chrome.collapsed .restore-btn { display: inline-flex; }
|
|
143
|
+
.nl-preview-root .chrome.collapsed .toolbar { opacity: 0.55; }
|
|
144
|
+
.nl-preview-root .chrome.collapsed:hover .toolbar { opacity: 1; }
|
|
100
145
|
.nl-preview-root .toolbar .sep {
|
|
101
|
-
width: 1px; height:
|
|
102
|
-
background: var(--nl-
|
|
103
|
-
margin: 0
|
|
146
|
+
width: 1px; height: 18px;
|
|
147
|
+
background: var(--nl-chrome-border);
|
|
148
|
+
margin: 0 3px;
|
|
149
|
+
flex-shrink: 0;
|
|
104
150
|
}
|
|
151
|
+
.nl-preview-root .toolbar-handle {
|
|
152
|
+
display: flex; align-items: center; justify-content: center;
|
|
153
|
+
padding: 4px 5px;
|
|
154
|
+
cursor: grab;
|
|
155
|
+
color: var(--nl-chrome-muted);
|
|
156
|
+
font-size: 13px;
|
|
157
|
+
line-height: 1;
|
|
158
|
+
opacity: 0.7;
|
|
159
|
+
flex-shrink: 0;
|
|
160
|
+
touch-action: none;
|
|
161
|
+
}
|
|
162
|
+
.nl-preview-root .toolbar-handle:hover { opacity: 1; }
|
|
163
|
+
.nl-preview-root .chrome.dragging .toolbar-handle { cursor: grabbing; }
|
|
105
164
|
.nl-preview-root .btn {
|
|
106
165
|
appearance: none;
|
|
107
166
|
background: transparent;
|
|
108
167
|
color: inherit;
|
|
109
168
|
border: 0;
|
|
110
|
-
padding:
|
|
169
|
+
padding: 3px 7px;
|
|
111
170
|
border-radius: 4px;
|
|
112
171
|
font-family: inherit;
|
|
113
172
|
font-size: inherit;
|
|
114
173
|
cursor: pointer;
|
|
115
174
|
line-height: 1;
|
|
116
|
-
min-width:
|
|
175
|
+
min-width: 20px;
|
|
176
|
+
flex-shrink: 0;
|
|
177
|
+
/* Suppress the sticky focus ring left behind after a mouse click;
|
|
178
|
+
keyboard focus is restored via :focus-visible below. */
|
|
179
|
+
outline: none;
|
|
180
|
+
}
|
|
181
|
+
.nl-preview-root .btn:hover { background: var(--nl-chrome-hover); }
|
|
182
|
+
.nl-preview-root .btn:active { background: var(--nl-chrome-active); }
|
|
183
|
+
.nl-preview-root .btn:focus-visible {
|
|
184
|
+
outline: 1px solid var(--nl-preview-focus);
|
|
185
|
+
outline-offset: -1px;
|
|
186
|
+
}
|
|
187
|
+
.nl-preview-root .btn.zoom-label {
|
|
188
|
+
min-width: 44px;
|
|
189
|
+
font-variant-numeric: tabular-nums;
|
|
117
190
|
}
|
|
118
|
-
.nl-preview-root .btn
|
|
119
|
-
.nl-preview-root .btn:active { background: var(--nl-preview-toolbar-active); }
|
|
120
|
-
.nl-preview-root .btn.zoom-label { min-width: 48px; font-variant-numeric: tabular-nums; }
|
|
121
|
-
.nl-preview-root .btn.glyph { font-size: 16px; line-height: 1; padding: 4px 6px; }
|
|
191
|
+
.nl-preview-root .btn.glyph { font-size: 15px; line-height: 1; padding: 3px 5px; }
|
|
122
192
|
.nl-preview-root .dropdown { position: relative; }
|
|
193
|
+
|
|
194
|
+
/* === More-menu panel === */
|
|
195
|
+
.nl-preview-root .more-menu {
|
|
196
|
+
position: absolute; top: calc(100% + 4px); right: 0;
|
|
197
|
+
padding: 5px;
|
|
198
|
+
min-width: 210px;
|
|
199
|
+
background: var(--nl-chrome-bg);
|
|
200
|
+
border: 1px solid var(--nl-chrome-border);
|
|
201
|
+
border-radius: 6px;
|
|
202
|
+
box-shadow: 0 4px 14px var(--nl-chrome-shadow);
|
|
203
|
+
z-index: 20;
|
|
204
|
+
color: var(--nl-chrome-fg);
|
|
205
|
+
}
|
|
206
|
+
/* Opens right-aligned by default; flipped to left-aligned in JS when the
|
|
207
|
+
toolbar sits near the left edge and the menu would clip the gutter. */
|
|
208
|
+
.nl-preview-root .more-menu.flip { right: auto; left: 0; }
|
|
209
|
+
.nl-preview-root .more-row {
|
|
210
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
211
|
+
padding: 2px 4px;
|
|
212
|
+
gap: 8px;
|
|
213
|
+
}
|
|
214
|
+
.nl-preview-root .more-row.action-row {
|
|
215
|
+
gap: 6px;
|
|
216
|
+
justify-content: stretch;
|
|
217
|
+
padding-top: 6px;
|
|
218
|
+
padding-bottom: 2px;
|
|
219
|
+
}
|
|
220
|
+
/* Copy / Export each take half the row and center their label+icon. */
|
|
221
|
+
.nl-preview-root .action-row .btn {
|
|
222
|
+
flex: 1 1 0;
|
|
223
|
+
display: inline-flex;
|
|
224
|
+
align-items: center;
|
|
225
|
+
justify-content: center;
|
|
226
|
+
gap: 5px;
|
|
227
|
+
}
|
|
228
|
+
.nl-preview-root .action-ico { display: inline-flex; line-height: 0; }
|
|
229
|
+
.nl-preview-root .action-ico svg { display: block; }
|
|
230
|
+
.nl-preview-root .more-label {
|
|
231
|
+
font-size: 0.88em;
|
|
232
|
+
color: var(--nl-chrome-muted);
|
|
233
|
+
white-space: nowrap;
|
|
234
|
+
flex-shrink: 0;
|
|
235
|
+
}
|
|
236
|
+
.nl-preview-root .more-divider {
|
|
237
|
+
height: 1px;
|
|
238
|
+
margin: 4px 0;
|
|
239
|
+
background: var(--nl-chrome-border);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* === Sub-menus inside more-menu === */
|
|
243
|
+
.nl-preview-root .more-sub-toggle {
|
|
244
|
+
font-size: 0.88em;
|
|
245
|
+
padding: 3px 6px;
|
|
246
|
+
}
|
|
247
|
+
.nl-preview-root .more-sub-menu {
|
|
248
|
+
position: absolute; top: calc(100% + 2px); left: 0;
|
|
249
|
+
list-style: none; padding: 4px;
|
|
250
|
+
/* Size to the widest option (plus the checkmark gutter) rather than
|
|
251
|
+
a fixed min-width, so there's no dead whitespace to the right. */
|
|
252
|
+
width: max-content; min-width: 0; max-width: 280px;
|
|
253
|
+
background: var(--nl-chrome-bg);
|
|
254
|
+
border: 1px solid var(--nl-chrome-border);
|
|
255
|
+
border-radius: 6px;
|
|
256
|
+
box-shadow: 0 4px 12px var(--nl-chrome-shadow);
|
|
257
|
+
z-index: 25;
|
|
258
|
+
color: var(--nl-chrome-fg);
|
|
259
|
+
}
|
|
260
|
+
/* Flyout flipped to open toward the left (set in JS when the default
|
|
261
|
+
right-ward opening would overflow the viewport gutter). */
|
|
262
|
+
.nl-preview-root .more-sub-menu.flip { left: auto; right: 0; }
|
|
263
|
+
.nl-preview-root .more-sub-menu li { padding: 0; }
|
|
264
|
+
.nl-preview-root .more-sub-menu .btn {
|
|
265
|
+
display: block; width: 100%; text-align: left;
|
|
266
|
+
/* Generous left gutter keeps the checkmark off the label text. */
|
|
267
|
+
padding: 5px 12px 5px 26px;
|
|
268
|
+
position: relative;
|
|
269
|
+
font-size: 0.88em;
|
|
270
|
+
}
|
|
271
|
+
.nl-preview-root .more-sub-menu .btn[data-active="true"]::before {
|
|
272
|
+
content: '\\2713';
|
|
273
|
+
position: absolute;
|
|
274
|
+
left: 9px;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/* === Code-style chip for real theme/format tokens === */
|
|
278
|
+
.nl-preview-root .code-chip {
|
|
279
|
+
font-family: var(--nl-preview-mono);
|
|
280
|
+
font-size: 0.9em;
|
|
281
|
+
background: var(--nl-chrome-chip-bg);
|
|
282
|
+
border-radius: 3px;
|
|
283
|
+
padding: 1px 4px;
|
|
284
|
+
font-style: normal;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* === Diagnostic overlay menu (for old .menu usage in diagnostics) === */
|
|
123
288
|
.nl-preview-root .menu {
|
|
124
289
|
position: absolute; top: 100%; right: 0; margin-top: 4px;
|
|
125
290
|
list-style: none; padding: 4px; min-width: 140px;
|
|
126
|
-
background: var(--nl-
|
|
127
|
-
border: 1px solid var(--nl-
|
|
291
|
+
background: var(--nl-chrome-bg);
|
|
292
|
+
border: 1px solid var(--nl-chrome-border);
|
|
128
293
|
border-radius: 6px;
|
|
129
|
-
box-shadow: 0 4px 12px
|
|
294
|
+
box-shadow: 0 4px 12px var(--nl-chrome-shadow);
|
|
130
295
|
z-index: 20;
|
|
296
|
+
color: var(--nl-chrome-fg);
|
|
131
297
|
}
|
|
132
298
|
.nl-preview-root .menu li { padding: 0; }
|
|
133
299
|
.nl-preview-root .menu .btn {
|
|
@@ -139,35 +305,30 @@ export const PREVIEW_SHELL_CSS = `
|
|
|
139
305
|
font-size: 0.85em;
|
|
140
306
|
text-transform: uppercase;
|
|
141
307
|
letter-spacing: 0.05em;
|
|
142
|
-
color: var(--nl-
|
|
308
|
+
color: var(--nl-chrome-muted);
|
|
143
309
|
}
|
|
144
310
|
.nl-preview-root .menu li.menu-divider {
|
|
145
311
|
height: 1px;
|
|
146
312
|
margin: 4px 6px;
|
|
147
|
-
background: var(--nl-
|
|
148
|
-
}
|
|
149
|
-
.nl-preview-root .menu .btn.view-opt {
|
|
150
|
-
padding-left: 22px;
|
|
151
|
-
position: relative;
|
|
152
|
-
}
|
|
153
|
-
.nl-preview-root .menu .btn.view-opt[data-active="true"]::before {
|
|
154
|
-
content: '\\2713';
|
|
155
|
-
position: absolute;
|
|
156
|
-
left: 8px;
|
|
313
|
+
background: var(--nl-chrome-border);
|
|
157
314
|
}
|
|
158
315
|
|
|
159
|
-
/* === Minimap === */
|
|
316
|
+
/* === Minimap (subordinate floating widget) === */
|
|
160
317
|
.nl-preview-root .minimap {
|
|
161
|
-
position: absolute;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
318
|
+
position: absolute;
|
|
319
|
+
bottom: var(--nl-preview-gutter);
|
|
320
|
+
right: var(--nl-preview-gutter);
|
|
321
|
+
width: 120px; max-height: 90px;
|
|
322
|
+
background: var(--nl-chrome-bg);
|
|
323
|
+
border: 1px solid var(--nl-chrome-border);
|
|
324
|
+
border-radius: 5px;
|
|
166
325
|
overflow: hidden;
|
|
167
|
-
box-shadow: 0 2px
|
|
326
|
+
box-shadow: 0 2px 6px var(--nl-chrome-shadow);
|
|
168
327
|
z-index: 8;
|
|
328
|
+
transition: opacity 200ms ease;
|
|
169
329
|
}
|
|
170
330
|
.nl-preview-root .minimap.hidden { display: none; }
|
|
331
|
+
.nl-preview-root .minimap.faded { opacity: 0.2; pointer-events: none; }
|
|
171
332
|
.nl-preview-root .minimap-canvas {
|
|
172
333
|
display: block;
|
|
173
334
|
cursor: pointer;
|
|
@@ -186,13 +347,73 @@ export const PREVIEW_SHELL_CSS = `
|
|
|
186
347
|
pointer-events: none;
|
|
187
348
|
box-sizing: border-box;
|
|
188
349
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
350
|
+
|
|
351
|
+
/* === Calendar picker === */
|
|
352
|
+
.nl-preview-root .now-picker {
|
|
353
|
+
position: absolute; top: calc(100% + 2px); left: 0;
|
|
354
|
+
padding: 8px;
|
|
355
|
+
min-width: 200px;
|
|
356
|
+
background: var(--nl-chrome-bg);
|
|
357
|
+
border: 1px solid var(--nl-chrome-border);
|
|
358
|
+
border-radius: 6px;
|
|
359
|
+
box-shadow: 0 4px 14px var(--nl-chrome-shadow);
|
|
360
|
+
z-index: 26;
|
|
361
|
+
color: var(--nl-chrome-fg);
|
|
362
|
+
}
|
|
363
|
+
/* Calendar flips to open toward the left when opening rightward would
|
|
364
|
+
push it past the viewport's right gutter (see placeFlyout). */
|
|
365
|
+
.nl-preview-root .now-picker.flip { left: auto; right: 0; }
|
|
366
|
+
.nl-preview-root .cal-nav {
|
|
367
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
368
|
+
margin-bottom: 6px;
|
|
369
|
+
}
|
|
370
|
+
.nl-preview-root .cal-heading {
|
|
371
|
+
font-size: 0.85em;
|
|
372
|
+
font-weight: 600;
|
|
373
|
+
}
|
|
374
|
+
.nl-preview-root .cal-nav-btn {
|
|
375
|
+
padding: 2px 6px;
|
|
376
|
+
min-width: unset;
|
|
377
|
+
font-size: 14px;
|
|
378
|
+
}
|
|
379
|
+
.nl-preview-root .cal-grid {
|
|
380
|
+
display: grid; grid-template-columns: repeat(7, 1fr);
|
|
381
|
+
gap: 1px;
|
|
382
|
+
margin-bottom: 6px;
|
|
383
|
+
}
|
|
384
|
+
.nl-preview-root .cal-dow {
|
|
385
|
+
text-align: center;
|
|
386
|
+
font-size: 0.75em;
|
|
387
|
+
color: var(--nl-chrome-muted);
|
|
388
|
+
padding: 2px 0;
|
|
389
|
+
}
|
|
390
|
+
.nl-preview-root .cal-empty {
|
|
391
|
+
/* placeholder for days before the 1st of the month */
|
|
392
|
+
}
|
|
393
|
+
.nl-preview-root .cal-day {
|
|
394
|
+
padding: 3px 2px;
|
|
395
|
+
min-width: unset;
|
|
396
|
+
font-size: 0.8em;
|
|
397
|
+
text-align: center;
|
|
398
|
+
border-radius: 3px;
|
|
399
|
+
}
|
|
400
|
+
.nl-preview-root .cal-day.is-today { font-weight: 700; }
|
|
401
|
+
.nl-preview-root .cal-day.is-selected {
|
|
402
|
+
background: var(--nl-chrome-hover);
|
|
403
|
+
outline: 1px solid var(--nl-chrome-border);
|
|
404
|
+
}
|
|
405
|
+
.nl-preview-root .cal-footer {
|
|
406
|
+
display: flex; gap: 4px;
|
|
407
|
+
border-top: 1px solid var(--nl-chrome-border);
|
|
408
|
+
padding-top: 6px;
|
|
409
|
+
margin-top: 2px;
|
|
410
|
+
}
|
|
411
|
+
.nl-preview-root .cal-footer-btn {
|
|
412
|
+
flex: 1;
|
|
413
|
+
text-align: center;
|
|
414
|
+
font-size: 0.82em;
|
|
415
|
+
padding: 4px 6px;
|
|
416
|
+
min-width: unset;
|
|
196
417
|
}
|
|
197
418
|
|
|
198
419
|
/* === Diagnostics overlay === */
|
|
@@ -241,7 +462,7 @@ export const PREVIEW_SHELL_CSS = `
|
|
|
241
462
|
border-bottom: 1px solid var(--nl-preview-widget-border);
|
|
242
463
|
}
|
|
243
464
|
.nl-preview-root .diag-table tr:hover {
|
|
244
|
-
background:
|
|
465
|
+
background: rgba(255,255,255,0.04);
|
|
245
466
|
}
|
|
246
467
|
.nl-preview-root .diag-table td {
|
|
247
468
|
padding: 6px 8px;
|
package/dist/styles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,qEAAqE;AACrE,iEAAiE;AACjE,iDAAiD;AACjD,EAAE;AACF,uEAAuE;AACvE,
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,qEAAqE;AACrE,iEAAiE;AACjE,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,wEAAwE;AACxE,uEAAuE;AACvE,EAAE;AACF,uEAAuE;AACvE,iEAAiE;AACjE,0DAA0D;AAE1D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;CAgBtC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmdhC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nowline/preview-shell",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Framework-agnostic preview viewport for Nowline SVGs: zoom, pan, fit, minimap, diagnostic table. Consumed by the VS Code extension's webview and any browser-side Nowline preview surface.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"engines": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"minimap"
|
|
41
41
|
],
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@nowline/browser": "0.
|
|
43
|
+
"@nowline/browser": "0.5.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^25.9.1",
|