efficient-easel 0.0.0 → 0.97.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.
- package/LICENSE +10 -0
- package/README.md +818 -4
- package/dist/autosave/index.d.ts +101 -0
- package/dist/autosave/index.js +1 -0
- package/dist/blocks/index.d.ts +306 -0
- package/dist/blocks/index.js +0 -0
- package/dist/buckets-1vRlQceY.d.ts +13 -0
- package/dist/canvas/index.d.ts +194 -0
- package/dist/canvas/index.js +1 -0
- package/dist/chrome/chrome.css +570 -0
- package/dist/chrome/index.d.ts +219 -0
- package/dist/chrome/index.js +21 -0
- package/dist/chunk-2LUSK32B.js +1 -0
- package/dist/chunk-2OAZYSWJ.js +1 -0
- package/dist/chunk-67VZRQLG.js +13 -0
- package/dist/chunk-6OPSJGAI.js +1 -0
- package/dist/chunk-6PS6STGA.js +1 -0
- package/dist/chunk-6WY6ZXJG.js +1 -0
- package/dist/chunk-7A7O2JWQ.js +1 -0
- package/dist/chunk-BZ5ASXOL.js +1 -0
- package/dist/chunk-CERTFXCV.js +13 -0
- package/dist/chunk-D2BCHTQR.js +1 -0
- package/dist/chunk-FI23ALVJ.js +1 -0
- package/dist/chunk-GGTPNGFJ.js +1 -0
- package/dist/chunk-H4B72XCJ.js +1 -0
- package/dist/chunk-H6DDIBQ4.js +1 -0
- package/dist/chunk-KDIVA6WD.js +1 -0
- package/dist/chunk-KRXQM65X.js +1 -0
- package/dist/chunk-MCLBHENY.js +1 -0
- package/dist/chunk-MFIRYGHW.js +1 -0
- package/dist/chunk-NKB3KVAB.js +1 -0
- package/dist/chunk-O2NLQBFX.js +1 -0
- package/dist/chunk-OGZFDJ6G.js +1 -0
- package/dist/chunk-OWBO4WKA.js +0 -0
- package/dist/chunk-QB3BZIRA.js +5 -0
- package/dist/chunk-RE4LP46F.js +1 -0
- package/dist/chunk-STFMZJKU.js +14 -0
- package/dist/chunk-SUO5627P.js +1 -0
- package/dist/chunk-TDA4HH54.js +1 -0
- package/dist/chunk-WK3AFPXY.js +1 -0
- package/dist/chunk-YIMRTIBN.js +3 -0
- package/dist/chunk-YNZZYHA4.js +450 -0
- package/dist/chunk-YRLPFZW3.js +1 -0
- package/dist/chunk-ZAOM6PFH.js +1 -0
- package/dist/chunk-ZNCEOSXO.js +1 -0
- package/dist/copy/copy.css +282 -0
- package/dist/copy/index.d.ts +336 -0
- package/dist/copy/index.js +10 -0
- package/dist/data/index.d.ts +375 -0
- package/dist/data/index.js +1 -0
- package/dist/drag/drag.css +360 -0
- package/dist/drag/index.d.ts +379 -0
- package/dist/drag/index.js +18 -0
- package/dist/edit-lock/index.d.ts +354 -0
- package/dist/edit-lock/index.js +1 -0
- package/dist/editor/editor.css +58 -0
- package/dist/editor/index.d.ts +361 -0
- package/dist/editor/index.js +9 -0
- package/dist/fields/fields.css +207 -0
- package/dist/fields/index.d.ts +273 -0
- package/dist/fields/index.js +46 -0
- package/dist/gold/gold.css +196 -0
- package/dist/gold/index.d.ts +280 -0
- package/dist/gold/index.js +1 -0
- package/dist/icons/index.d.ts +474 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1 -0
- package/dist/markup/index.d.ts +452 -0
- package/dist/markup/index.js +1 -0
- package/dist/menu/index.d.ts +49 -0
- package/dist/menu/index.js +15 -0
- package/dist/menu/menu.css +254 -0
- package/dist/node-ops/index.d.ts +91 -0
- package/dist/node-ops/index.js +1 -0
- package/dist/panel/index.d.ts +1088 -0
- package/dist/panel/index.js +16 -0
- package/dist/panel/panel.css +1460 -0
- package/dist/pick/index.d.ts +153 -0
- package/dist/pick/index.js +14 -0
- package/dist/pick/pick.css +235 -0
- package/dist/plan-DChbUXdS.d.ts +88 -0
- package/dist/rail/index.d.ts +145 -0
- package/dist/rail/index.js +1 -0
- package/dist/rail/rail.css +175 -0
- package/dist/render/index.d.ts +117 -0
- package/dist/render/index.js +5 -0
- package/dist/resolve-D68pb3Bx.d.ts +57 -0
- package/dist/shell/index.d.ts +159 -0
- package/dist/shell/index.js +1 -0
- package/dist/shell/shell.css +122 -0
- package/dist/strings/catalogue.d.ts +141 -0
- package/dist/strings/catalogue.js +1 -0
- package/dist/strings/index.d.ts +56 -0
- package/dist/strings/index.js +2 -0
- package/dist/style-clipboard/index.d.ts +184 -0
- package/dist/style-clipboard/index.js +1 -0
- package/dist/tree/index.d.ts +173 -0
- package/dist/tree/index.js +1 -0
- package/dist/tree/tree.css +618 -0
- package/dist/types-41704JE4.d.ts +112 -0
- package/dist/types-CEqUFH2j.d.ts +129 -0
- package/dist/types-CuNiSnX6.d.ts +204 -0
- package/dist/types-DNrn_w4V.d.ts +88 -0
- package/dist/types-Dy6oR6Z2.d.ts +153 -0
- package/dist/types-pGBXevBU.d.ts +131 -0
- package/dist/useNodeOps-BF0fQsif.d.ts +68 -0
- package/dist/watch-DmasQA61.d.ts +60 -0
- package/dist/wordFit-9B9nqyf3.d.ts +35 -0
- package/dist/words-B2YLaKEr.d.ts +30 -0
- package/dist/words-B87GIFWH.d.ts +86 -0
- package/dist/words-BK-npta-.d.ts +27 -0
- package/dist/words-CD3WADyb.d.ts +51 -0
- package/dist/words-CsRWXkY4.d.ts +129 -0
- package/dist/words-D9ChvbNC.d.ts +52 -0
- package/dist/words-DOhF-4D4.d.ts +35 -0
- package/dist/words-DagJdwIA.d.ts +78 -0
- package/dist/words-DfxEp_RH.d.ts +142 -0
- package/package.json +202 -3
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* efficient-easel/chrome.css — the editor frame: top bar, device switch, save pill,
|
|
3
|
+
* flat side panels, resize grips, inspector head.
|
|
4
|
+
*
|
|
5
|
+
* EVERY VALUE HERE WAS READ OFF `efficient-shop/components/storefront-editor.css`
|
|
6
|
+
* on origin/main (release 14.24.0, 2026-09-17), where the website editor drew
|
|
7
|
+
* these parts as `.sf-*`. Each `--sf-*` token it spent is an alias of the
|
|
8
|
+
* `--es-*` token spent here (`--sf-muted: var(--es-muted)` and so on), so the
|
|
9
|
+
* colours are the same colours, not copies of them.
|
|
10
|
+
*
|
|
11
|
+
* Needs `efficient-easel/shell.css` for the `--es-*` tokens. Widths come in as
|
|
12
|
+
* `--es-left-w` / `--es-right-w` from `panelWidthVars()`, set on the editor ROOT.
|
|
13
|
+
*
|
|
14
|
+
* Light only (owner, 2026-08-06: no dark mode in the editor or the designer).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/* ── Top bar ─────────────────────────────────────────────────────────────── */
|
|
18
|
+
.es-topbar {
|
|
19
|
+
box-sizing: border-box;
|
|
20
|
+
height: var(--es-topbar-h, 52px);
|
|
21
|
+
flex: none;
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
justify-content: space-between;
|
|
25
|
+
/* NO LEFT PADDING. The leftmost thing in the bar is the editor's left COLUMN
|
|
26
|
+
(`.es-cluster--rail`), and a column starts where the panel under it starts.
|
|
27
|
+
A 12px inset put the rail 12px right of its panel — the owner's third report
|
|
28
|
+
on this one column, 2026-09-04. The right edge really is the bar's own. */
|
|
29
|
+
padding: 0 12px 0 0;
|
|
30
|
+
background: var(--es-topbar-bg);
|
|
31
|
+
box-shadow: var(--es-topbar-shadow);
|
|
32
|
+
position: relative;
|
|
33
|
+
z-index: 20;
|
|
34
|
+
}
|
|
35
|
+
.es-cluster {
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
gap: 6px;
|
|
39
|
+
}
|
|
40
|
+
.es-cluster--right {
|
|
41
|
+
gap: 8px;
|
|
42
|
+
justify-content: flex-end;
|
|
43
|
+
}
|
|
44
|
+
.es-cluster--rail {
|
|
45
|
+
/* `flex: none` IS THE WIDTH. The bar is a flex row, so `width` alone is only a
|
|
46
|
+
basis, and the default shrink hands it back the moment the three clusters
|
|
47
|
+
want more room than the window has — the column collapses to its buttons
|
|
48
|
+
with a correct `width` sitting right here (found twice on :5173, 2026-09-04). */
|
|
49
|
+
flex: none;
|
|
50
|
+
width: var(--es-left-w);
|
|
51
|
+
box-sizing: border-box;
|
|
52
|
+
height: 100%;
|
|
53
|
+
gap: 0;
|
|
54
|
+
border-right: 1px solid var(--es-line);
|
|
55
|
+
}
|
|
56
|
+
.es-cluster--rail .es-rail {
|
|
57
|
+
width: 100%;
|
|
58
|
+
box-sizing: border-box;
|
|
59
|
+
justify-content: space-between;
|
|
60
|
+
}
|
|
61
|
+
.es-cluster--rail .es-rail-btn {
|
|
62
|
+
position: relative;
|
|
63
|
+
}
|
|
64
|
+
/* The one thing in the bar that knows where the panel is: a small accent
|
|
65
|
+
triangle hanging under the active rail button, pointing at the panel it
|
|
66
|
+
opened. The bar is 52px and the button 34, which leaves 9px; the triangle
|
|
67
|
+
takes 5. A clip-path shape, not the border trick — a directional border reads
|
|
68
|
+
as a divider to the no-divider-lines guard. */
|
|
69
|
+
.es-cluster--rail .es-rail-btn.is-active::after {
|
|
70
|
+
content: "";
|
|
71
|
+
position: absolute;
|
|
72
|
+
left: 50%;
|
|
73
|
+
bottom: -9px;
|
|
74
|
+
transform: translateX(-50%);
|
|
75
|
+
width: 10px;
|
|
76
|
+
height: 5px;
|
|
77
|
+
background: var(--es-accent);
|
|
78
|
+
clip-path: polygon(0 0, 100% 0, 50% 100%);
|
|
79
|
+
}
|
|
80
|
+
.es-divider-v {
|
|
81
|
+
width: 1px;
|
|
82
|
+
height: 22px;
|
|
83
|
+
background: var(--es-divider);
|
|
84
|
+
margin: 0 4px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* ── Icon buttons ────────────────────────────────────────────────────────── */
|
|
88
|
+
.es-iconbtn {
|
|
89
|
+
width: 30px;
|
|
90
|
+
height: 30px;
|
|
91
|
+
border: none;
|
|
92
|
+
background: transparent;
|
|
93
|
+
border-radius: 7px;
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
color: var(--es-icon);
|
|
96
|
+
display: flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
justify-content: center;
|
|
99
|
+
padding: 0;
|
|
100
|
+
transition: background 0.12s, color 0.12s;
|
|
101
|
+
text-decoration: none;
|
|
102
|
+
}
|
|
103
|
+
.es-iconbtn:hover:not(:disabled) {
|
|
104
|
+
background: var(--es-hover);
|
|
105
|
+
}
|
|
106
|
+
.es-iconbtn:disabled {
|
|
107
|
+
color: var(--es-disabled);
|
|
108
|
+
cursor: default;
|
|
109
|
+
}
|
|
110
|
+
.es-iconbtn--active {
|
|
111
|
+
color: var(--es-text-strong);
|
|
112
|
+
}
|
|
113
|
+
.es-iconbtn--inactive {
|
|
114
|
+
color: var(--es-disabled);
|
|
115
|
+
}
|
|
116
|
+
.es-iconbtn svg {
|
|
117
|
+
width: 16px;
|
|
118
|
+
height: 16px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* ── Device switch ───────────────────────────────────────────────────────── */
|
|
122
|
+
.es-devseg {
|
|
123
|
+
display: flex;
|
|
124
|
+
align-items: center;
|
|
125
|
+
gap: 2px;
|
|
126
|
+
background: var(--es-track-bg);
|
|
127
|
+
border-radius: 9px;
|
|
128
|
+
padding: 3px;
|
|
129
|
+
}
|
|
130
|
+
.es-devseg button {
|
|
131
|
+
width: 30px;
|
|
132
|
+
height: 26px;
|
|
133
|
+
border: none;
|
|
134
|
+
background: transparent;
|
|
135
|
+
border-radius: 6px;
|
|
136
|
+
cursor: pointer;
|
|
137
|
+
color: var(--es-icon);
|
|
138
|
+
display: flex;
|
|
139
|
+
align-items: center;
|
|
140
|
+
justify-content: center;
|
|
141
|
+
padding: 0;
|
|
142
|
+
transition: background 0.12s, color 0.12s, box-shadow 0.12s;
|
|
143
|
+
}
|
|
144
|
+
.es-devseg button.is-active {
|
|
145
|
+
background: var(--es-raised);
|
|
146
|
+
color: var(--es-text-strong);
|
|
147
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.14);
|
|
148
|
+
}
|
|
149
|
+
.es-devseg button svg {
|
|
150
|
+
width: 15px;
|
|
151
|
+
height: 15px;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* ── Top-bar buttons ─────────────────────────────────────────────────────── */
|
|
155
|
+
.es-btn-ghost {
|
|
156
|
+
display: flex;
|
|
157
|
+
align-items: center;
|
|
158
|
+
gap: 6px;
|
|
159
|
+
padding: 7px 12px;
|
|
160
|
+
border: 1px solid var(--es-btn-border);
|
|
161
|
+
background: var(--es-panel);
|
|
162
|
+
border-radius: 8px;
|
|
163
|
+
cursor: pointer;
|
|
164
|
+
font: inherit;
|
|
165
|
+
font-size: 13px;
|
|
166
|
+
font-weight: 500;
|
|
167
|
+
color: var(--es-btn-text);
|
|
168
|
+
white-space: nowrap;
|
|
169
|
+
transition: background 0.12s;
|
|
170
|
+
text-decoration: none;
|
|
171
|
+
}
|
|
172
|
+
.es-btn-ghost:hover:not(:disabled) {
|
|
173
|
+
background: var(--es-hover);
|
|
174
|
+
}
|
|
175
|
+
.es-btn-ghost:disabled {
|
|
176
|
+
color: var(--es-disabled);
|
|
177
|
+
border-color: var(--es-btn-border);
|
|
178
|
+
background: var(--es-panel);
|
|
179
|
+
cursor: default;
|
|
180
|
+
}
|
|
181
|
+
.es-btn-ghost:focus-visible {
|
|
182
|
+
outline: 2px solid var(--es-accent);
|
|
183
|
+
outline-offset: 2px;
|
|
184
|
+
}
|
|
185
|
+
/* The ONE primary button in the bar (Publish on the website). */
|
|
186
|
+
.es-btn-primary {
|
|
187
|
+
padding: 7px 16px;
|
|
188
|
+
border: none;
|
|
189
|
+
background: var(--es-accent);
|
|
190
|
+
border-radius: 8px;
|
|
191
|
+
cursor: pointer;
|
|
192
|
+
font: inherit;
|
|
193
|
+
font-size: 13px;
|
|
194
|
+
font-weight: 600;
|
|
195
|
+
color: var(--es-on-accent);
|
|
196
|
+
white-space: nowrap;
|
|
197
|
+
box-shadow: 0 1px 2px var(--es-accent-shadow);
|
|
198
|
+
transition: filter 0.12s;
|
|
199
|
+
}
|
|
200
|
+
.es-btn-primary:hover {
|
|
201
|
+
filter: brightness(1.06);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* ── Save pill ───────────────────────────────────────────────────────────── */
|
|
205
|
+
.es-savestate {
|
|
206
|
+
display: inline-flex;
|
|
207
|
+
align-items: center;
|
|
208
|
+
gap: 6px;
|
|
209
|
+
padding: 5px 10px;
|
|
210
|
+
border-radius: 8px;
|
|
211
|
+
font-size: 12px;
|
|
212
|
+
font-weight: 500;
|
|
213
|
+
white-space: nowrap;
|
|
214
|
+
user-select: none;
|
|
215
|
+
color: var(--es-muted);
|
|
216
|
+
}
|
|
217
|
+
.es-savestate-dot {
|
|
218
|
+
width: 7px;
|
|
219
|
+
height: 7px;
|
|
220
|
+
border-radius: 50%;
|
|
221
|
+
background: currentColor;
|
|
222
|
+
flex: none;
|
|
223
|
+
}
|
|
224
|
+
/* Saved, so no words (card 66103). It keeps its box: the pill is also the
|
|
225
|
+
autosave switch, and a control that vanishes when idle cannot be clicked.
|
|
226
|
+
`min-width` holds the footprint so the bar does not reflow on every save. */
|
|
227
|
+
.es-savestate.is-quiet {
|
|
228
|
+
color: var(--es-muted);
|
|
229
|
+
min-width: 27px;
|
|
230
|
+
justify-content: center;
|
|
231
|
+
}
|
|
232
|
+
/* Rides ON is-quiet: a colour and nothing else. */
|
|
233
|
+
.es-savestate.is-saved {
|
|
234
|
+
color: var(--es-success);
|
|
235
|
+
}
|
|
236
|
+
.es-savestate.is-saving {
|
|
237
|
+
color: var(--es-warning);
|
|
238
|
+
}
|
|
239
|
+
.es-savestate.is-error {
|
|
240
|
+
color: var(--es-danger);
|
|
241
|
+
}
|
|
242
|
+
.es-savestate-toggle {
|
|
243
|
+
appearance: none;
|
|
244
|
+
-webkit-appearance: none;
|
|
245
|
+
border: 0;
|
|
246
|
+
background: none;
|
|
247
|
+
padding: 0;
|
|
248
|
+
margin: 0;
|
|
249
|
+
font: inherit;
|
|
250
|
+
cursor: pointer;
|
|
251
|
+
border-radius: 8px;
|
|
252
|
+
}
|
|
253
|
+
.es-savestate-toggle:focus-visible {
|
|
254
|
+
outline: none;
|
|
255
|
+
box-shadow: 0 0 0 2px var(--es-accent-shadow);
|
|
256
|
+
}
|
|
257
|
+
.es-savestate-toggle .es-savestate {
|
|
258
|
+
border: 1px solid transparent;
|
|
259
|
+
}
|
|
260
|
+
.es-savestate-toggle:hover .es-savestate {
|
|
261
|
+
background: var(--es-hover);
|
|
262
|
+
}
|
|
263
|
+
/* Paused: boxed, so it reads as a switch turned off, not a passive label. */
|
|
264
|
+
.es-savestate.is-off {
|
|
265
|
+
color: var(--es-muted);
|
|
266
|
+
background: var(--es-hover);
|
|
267
|
+
border-color: var(--es-btn-border);
|
|
268
|
+
}
|
|
269
|
+
/* Paused AND an edit is waiting: amber, so held work is never invisible. */
|
|
270
|
+
.es-savestate.is-off.is-unsaved {
|
|
271
|
+
color: var(--es-warning);
|
|
272
|
+
border-color: var(--es-warning);
|
|
273
|
+
}
|
|
274
|
+
/* The wait, drawn: a ring that empties ONCE (owner, 2026-09-09). Never a repeat
|
|
275
|
+
count above 1 — that is the blinking dot card 66103 removed. The duration is
|
|
276
|
+
handed in as `--es-savewait` from the editor's debounce; the fallback only
|
|
277
|
+
covers a caller that forgot to pass it. */
|
|
278
|
+
@property --es-wait {
|
|
279
|
+
syntax: '<angle>';
|
|
280
|
+
inherits: false;
|
|
281
|
+
initial-value: 360deg;
|
|
282
|
+
}
|
|
283
|
+
@keyframes es-savewait {
|
|
284
|
+
from { --es-wait: 360deg }
|
|
285
|
+
to { --es-wait: 0deg }
|
|
286
|
+
}
|
|
287
|
+
.es-savestate-ring {
|
|
288
|
+
width: 11px;
|
|
289
|
+
height: 11px;
|
|
290
|
+
flex: none;
|
|
291
|
+
border-radius: 50%;
|
|
292
|
+
background: conic-gradient(currentColor var(--es-wait), transparent 0);
|
|
293
|
+
-webkit-mask: radial-gradient(circle, transparent 3.1px, #000 3.4px);
|
|
294
|
+
mask: radial-gradient(circle, transparent 3.1px, #000 3.4px);
|
|
295
|
+
}
|
|
296
|
+
/* `forwards`: hold empty until the save lands, never snap back to full. */
|
|
297
|
+
.es-savestate-ring.is-counting {
|
|
298
|
+
animation: es-savewait var(--es-savewait, 10s) linear forwards;
|
|
299
|
+
}
|
|
300
|
+
@media (prefers-reduced-motion: reduce) {
|
|
301
|
+
.es-savestate-ring.is-counting { animation: none }
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/* ── Side panels: flat ───────────────────────────────────────────────────── */
|
|
305
|
+
/* Lines, not floating cards (owner, card 66161, for the website editor; carried
|
|
306
|
+
to the campaign editor by the 2026-09-17 redesign). Gaps, corners and shadows
|
|
307
|
+
hold nothing, and on a 1280px laptop they cost the canvas 50px. The border is
|
|
308
|
+
drawn inside the panel's own width, so a panel stays 288 / 320. */
|
|
309
|
+
.es-sidepanel {
|
|
310
|
+
box-sizing: border-box;
|
|
311
|
+
flex: none;
|
|
312
|
+
display: flex;
|
|
313
|
+
flex-direction: column;
|
|
314
|
+
min-height: 0;
|
|
315
|
+
background: var(--es-panel);
|
|
316
|
+
overflow: hidden;
|
|
317
|
+
position: relative;
|
|
318
|
+
/* A size container: a panel is DRAGGED between 220 and 560, so its contents
|
|
319
|
+
ask the panel's width, never the screen's. */
|
|
320
|
+
container-type: inline-size;
|
|
321
|
+
}
|
|
322
|
+
.es-sidepanel--left {
|
|
323
|
+
width: var(--es-left-w);
|
|
324
|
+
border-right: 1px solid var(--es-line);
|
|
325
|
+
}
|
|
326
|
+
.es-sidepanel--right {
|
|
327
|
+
width: var(--es-right-w);
|
|
328
|
+
border-left: 1px solid var(--es-line);
|
|
329
|
+
}
|
|
330
|
+
.es-panel-head {
|
|
331
|
+
display: flex;
|
|
332
|
+
align-items: center;
|
|
333
|
+
justify-content: space-between;
|
|
334
|
+
padding: 13px 14px 11px;
|
|
335
|
+
flex: none;
|
|
336
|
+
}
|
|
337
|
+
/* A panel's own name. States the margin an h2 would otherwise bring. */
|
|
338
|
+
.es-panel-title {
|
|
339
|
+
font-size: 13px;
|
|
340
|
+
font-weight: 600;
|
|
341
|
+
color: var(--es-text);
|
|
342
|
+
margin: 0;
|
|
343
|
+
}
|
|
344
|
+
.es-panel-head-actions {
|
|
345
|
+
display: flex;
|
|
346
|
+
align-items: center;
|
|
347
|
+
gap: 2px;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* ── Resize grips ────────────────────────────────────────────────────────── */
|
|
351
|
+
/* An absolute child of the panel row, pinned over the panel↔canvas seam from the
|
|
352
|
+
same width vars the panels read. The 9px hit area is invisible at rest; a 2px
|
|
353
|
+
bar on the seam tints to the accent on hover and focus. The host's panel row
|
|
354
|
+
must be `position: relative`. */
|
|
355
|
+
.es-resizer {
|
|
356
|
+
position: absolute;
|
|
357
|
+
top: 0;
|
|
358
|
+
bottom: 0;
|
|
359
|
+
width: 9px;
|
|
360
|
+
z-index: 5;
|
|
361
|
+
display: flex;
|
|
362
|
+
cursor: col-resize;
|
|
363
|
+
touch-action: none;
|
|
364
|
+
}
|
|
365
|
+
.es-resizer--left {
|
|
366
|
+
left: var(--es-left-w);
|
|
367
|
+
justify-content: flex-start;
|
|
368
|
+
}
|
|
369
|
+
.es-resizer--right {
|
|
370
|
+
right: var(--es-right-w);
|
|
371
|
+
justify-content: flex-end;
|
|
372
|
+
}
|
|
373
|
+
.es-resizer-bar {
|
|
374
|
+
width: 2px;
|
|
375
|
+
border-radius: 2px;
|
|
376
|
+
background: transparent;
|
|
377
|
+
transition: background 0.12s;
|
|
378
|
+
}
|
|
379
|
+
.es-resizer:hover .es-resizer-bar,
|
|
380
|
+
.es-resizer:focus-visible .es-resizer-bar {
|
|
381
|
+
background: var(--es-accent);
|
|
382
|
+
}
|
|
383
|
+
.es-resizer:focus {
|
|
384
|
+
outline: none;
|
|
385
|
+
}
|
|
386
|
+
body.es-col-resizing,
|
|
387
|
+
body.es-col-resizing * {
|
|
388
|
+
cursor: col-resize !important;
|
|
389
|
+
user-select: none !important;
|
|
390
|
+
}
|
|
391
|
+
body.es-col-resizing iframe {
|
|
392
|
+
pointer-events: none !important;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/* ── Inspector head ──────────────────────────────────────────────────────── */
|
|
396
|
+
/* ↰ Go up one level: a quiet full-width row above the inspector head
|
|
397
|
+
(campaign designer UpLevelControl, card 66042). The whole row is the button. */
|
|
398
|
+
.es-insp-up {
|
|
399
|
+
display: flex;
|
|
400
|
+
align-items: center;
|
|
401
|
+
flex: none;
|
|
402
|
+
padding: 6px 8px;
|
|
403
|
+
border-bottom: 1px solid var(--es-divider);
|
|
404
|
+
}
|
|
405
|
+
.es-insp-up-btn {
|
|
406
|
+
display: flex;
|
|
407
|
+
align-items: center;
|
|
408
|
+
gap: 6px;
|
|
409
|
+
flex: 1;
|
|
410
|
+
min-width: 0;
|
|
411
|
+
padding: 4px 6px;
|
|
412
|
+
border: 0;
|
|
413
|
+
border-radius: 6px;
|
|
414
|
+
background: transparent;
|
|
415
|
+
cursor: pointer;
|
|
416
|
+
font: inherit;
|
|
417
|
+
font-size: 12px;
|
|
418
|
+
color: var(--es-muted);
|
|
419
|
+
text-align: left;
|
|
420
|
+
transition: background 0.12s, color 0.12s;
|
|
421
|
+
}
|
|
422
|
+
.es-insp-up-btn:hover {
|
|
423
|
+
background: var(--es-hover);
|
|
424
|
+
color: var(--es-text);
|
|
425
|
+
}
|
|
426
|
+
.es-insp-up-btn:focus-visible {
|
|
427
|
+
outline: 2px solid var(--es-accent);
|
|
428
|
+
outline-offset: 1px;
|
|
429
|
+
}
|
|
430
|
+
.es-insp-up-icon {
|
|
431
|
+
display: inline-flex;
|
|
432
|
+
flex: none;
|
|
433
|
+
}
|
|
434
|
+
.es-insp-up-name {
|
|
435
|
+
overflow: hidden;
|
|
436
|
+
text-overflow: ellipsis;
|
|
437
|
+
white-space: nowrap;
|
|
438
|
+
}
|
|
439
|
+
.es-insp-head {
|
|
440
|
+
display: flex;
|
|
441
|
+
align-items: center;
|
|
442
|
+
gap: 10px;
|
|
443
|
+
padding: 12px 14px;
|
|
444
|
+
flex: none;
|
|
445
|
+
}
|
|
446
|
+
.es-insp-chip {
|
|
447
|
+
width: 26px;
|
|
448
|
+
height: 26px;
|
|
449
|
+
border-radius: 6px;
|
|
450
|
+
display: flex;
|
|
451
|
+
align-items: center;
|
|
452
|
+
justify-content: center;
|
|
453
|
+
font-size: 13px;
|
|
454
|
+
flex: none;
|
|
455
|
+
background: var(--es-chip-bg);
|
|
456
|
+
color: var(--es-icon);
|
|
457
|
+
}
|
|
458
|
+
.es-insp-chip svg {
|
|
459
|
+
width: 15px;
|
|
460
|
+
height: 15px;
|
|
461
|
+
}
|
|
462
|
+
.es-insp-titles {
|
|
463
|
+
flex: 1;
|
|
464
|
+
min-width: 0;
|
|
465
|
+
}
|
|
466
|
+
/* An h2 carries `0.83em 0` from the UA sheet; `margin: 0` keeps the head closed. */
|
|
467
|
+
.es-insp-name {
|
|
468
|
+
font-size: 13px;
|
|
469
|
+
font-weight: 600;
|
|
470
|
+
color: var(--es-text);
|
|
471
|
+
margin: 0;
|
|
472
|
+
white-space: nowrap;
|
|
473
|
+
overflow: hidden;
|
|
474
|
+
text-overflow: ellipsis;
|
|
475
|
+
}
|
|
476
|
+
.es-insp-kind {
|
|
477
|
+
font-size: 11px;
|
|
478
|
+
color: var(--es-muted);
|
|
479
|
+
}
|
|
480
|
+
.es-insp-actions {
|
|
481
|
+
display: flex;
|
|
482
|
+
align-items: center;
|
|
483
|
+
gap: 2px;
|
|
484
|
+
flex: none;
|
|
485
|
+
}
|
|
486
|
+
.es-insp-iconbtn {
|
|
487
|
+
width: 28px;
|
|
488
|
+
height: 28px;
|
|
489
|
+
border: none;
|
|
490
|
+
background: transparent;
|
|
491
|
+
border-radius: 7px;
|
|
492
|
+
cursor: pointer;
|
|
493
|
+
color: var(--es-icon);
|
|
494
|
+
display: flex;
|
|
495
|
+
align-items: center;
|
|
496
|
+
justify-content: center;
|
|
497
|
+
padding: 0;
|
|
498
|
+
transition: background 0.12s, color 0.12s;
|
|
499
|
+
}
|
|
500
|
+
.es-insp-iconbtn:hover {
|
|
501
|
+
background: var(--es-hover);
|
|
502
|
+
color: var(--es-text-strong);
|
|
503
|
+
}
|
|
504
|
+
.es-insp-iconbtn--danger:hover {
|
|
505
|
+
background: var(--es-danger-tint);
|
|
506
|
+
color: var(--es-danger);
|
|
507
|
+
}
|
|
508
|
+
.es-insp-iconbtn[aria-expanded="true"] {
|
|
509
|
+
background: var(--es-accent-tint);
|
|
510
|
+
color: var(--es-accent);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/* ── Edit notice — somebody else is in here, or a save was refused ───────── */
|
|
514
|
+
/* A bar under the top bar, never a dialog (blueprint 2.5): the operator has to
|
|
515
|
+
be able to read and copy from the screen it warns them about. No token of its
|
|
516
|
+
own — the amber is the shell's amber tint (`--es-preview-tint`) eased into the
|
|
517
|
+
panel white, edged with `--es-warning`, so a re-themed editor re-themes it. */
|
|
518
|
+
.es-notice {
|
|
519
|
+
box-sizing: border-box;
|
|
520
|
+
display: flex;
|
|
521
|
+
flex-wrap: wrap;
|
|
522
|
+
align-items: center;
|
|
523
|
+
gap: 8px 12px;
|
|
524
|
+
padding: 8px 16px;
|
|
525
|
+
font-family: var(--es-font);
|
|
526
|
+
font-size: 13px;
|
|
527
|
+
line-height: 1.45;
|
|
528
|
+
color: var(--es-text-secondary);
|
|
529
|
+
background: var(--es-app-bg);
|
|
530
|
+
border-bottom: 1px solid var(--es-divider);
|
|
531
|
+
}
|
|
532
|
+
.es-notice.is-warning {
|
|
533
|
+
color: var(--es-text);
|
|
534
|
+
background: color-mix(in srgb, var(--es-preview-tint) 70%, var(--es-panel));
|
|
535
|
+
border-bottom-color: color-mix(in srgb, var(--es-warning) 30%, var(--es-preview-tint));
|
|
536
|
+
}
|
|
537
|
+
.es-notice-text {
|
|
538
|
+
flex: 1 1 320px;
|
|
539
|
+
min-width: 0;
|
|
540
|
+
}
|
|
541
|
+
.es-notice-text strong {
|
|
542
|
+
font-weight: 600;
|
|
543
|
+
color: var(--es-text-strong);
|
|
544
|
+
}
|
|
545
|
+
.es-notice-actions {
|
|
546
|
+
display: flex;
|
|
547
|
+
flex-wrap: wrap;
|
|
548
|
+
gap: 6px;
|
|
549
|
+
}
|
|
550
|
+
.es-notice-btn {
|
|
551
|
+
appearance: none;
|
|
552
|
+
-webkit-appearance: none;
|
|
553
|
+
font: inherit;
|
|
554
|
+
font-size: 12px;
|
|
555
|
+
font-weight: 500;
|
|
556
|
+
padding: 4px 10px;
|
|
557
|
+
border: 1px solid var(--es-btn-border);
|
|
558
|
+
border-radius: var(--es-field-radius);
|
|
559
|
+
background: var(--es-raised);
|
|
560
|
+
color: var(--es-btn-text);
|
|
561
|
+
white-space: nowrap;
|
|
562
|
+
cursor: pointer;
|
|
563
|
+
}
|
|
564
|
+
.es-notice-btn:hover {
|
|
565
|
+
background: var(--es-hover);
|
|
566
|
+
}
|
|
567
|
+
.es-notice-btn:focus-visible {
|
|
568
|
+
outline: 2px solid var(--es-accent);
|
|
569
|
+
outline-offset: 1px;
|
|
570
|
+
}
|