efficient-easel 0.99.2 → 0.101.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/README.md +233 -17
- package/dist/autosave/index.d.ts +11 -5
- package/dist/blocks/index.d.ts +1 -1
- package/dist/canvas/index.d.ts +2 -2
- package/dist/canvas/index.js +1 -1
- package/dist/chrome/chrome.css +96 -29
- package/dist/chrome/index.d.ts +67 -18
- package/dist/chrome/index.js +25 -21
- package/dist/{chunk-JYPOOHII.js → chunk-2FZJWH24.js} +3 -3
- package/dist/chunk-3EDSDPIP.js +1 -0
- package/dist/chunk-546BBOPE.js +1 -0
- package/dist/chunk-67GNT6PF.js +1 -0
- package/dist/chunk-EOJNJCMJ.js +16 -0
- package/dist/chunk-EWVJSRRY.js +6 -0
- package/dist/chunk-FPOKPNO4.js +1 -0
- package/dist/chunk-H24N5TMZ.js +11 -0
- package/dist/chunk-IG3U5NWJ.js +1 -0
- package/dist/chunk-JUQ6YJCG.js +1 -0
- package/dist/chunk-KTVH2ZRL.js +15 -0
- package/dist/{chunk-PI26YXYD.js → chunk-L5KW4HG5.js} +16 -8
- package/dist/chunk-M6F6LS3H.js +1 -0
- package/dist/chunk-P6O363EE.js +6 -0
- package/dist/chunk-PAELDYYS.js +1 -0
- package/dist/chunk-QTLAVDJE.js +1 -0
- package/dist/chunk-UH7IGZKF.js +1 -0
- package/dist/chunk-WZ7TGAAT.js +3 -0
- package/dist/chunk-ZFDCDJNZ.js +16 -0
- package/dist/chunk-ZJEBF4NB.js +1 -0
- package/dist/chunk-ZNS7727Y.js +12 -0
- package/dist/copy/copy.css +442 -5
- package/dist/copy/index.d.ts +302 -5
- package/dist/copy/index.js +32 -10
- package/dist/drag/drag.css +10 -1
- package/dist/drag/index.d.ts +99 -8
- package/dist/drag/index.js +18 -17
- package/dist/easel/easel.css +15 -0
- package/dist/easel/index.d.ts +104 -33
- package/dist/easel/index.js +9 -1
- package/dist/edit-lock/index.d.ts +1 -3
- package/dist/edit-lock/index.js +1 -1
- package/dist/fields/fields.css +270 -38
- package/dist/fields/index.d.ts +209 -26
- package/dist/fields/index.js +22 -53
- package/dist/gold/index.js +1 -1
- package/dist/icons/index.d.ts +13 -1
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/markup/index.d.ts +111 -10
- package/dist/markup/index.js +1 -1
- package/dist/menu/index.d.ts +58 -5
- package/dist/menu/index.js +1 -15
- package/dist/menu/menu.css +17 -6
- package/dist/node-ops/index.d.ts +1 -1
- package/dist/node-ops/index.js +1 -1
- package/dist/panel/index.d.ts +83 -4
- package/dist/panel/index.js +18 -16
- package/dist/panel/panel.css +135 -62
- package/dist/pick/index.d.ts +78 -2
- package/dist/pick/index.js +7 -14
- package/dist/pick/pick.css +197 -10
- package/dist/rail/index.d.ts +3 -7
- package/dist/rail/index.js +1 -1
- package/dist/strings/catalogue.d.ts +13 -35
- package/dist/strings/catalogue.js +1 -1
- package/dist/strings/index.d.ts +12 -18
- package/dist/strings/index.js +2 -2
- package/dist/style-clipboard/index.d.ts +1 -1
- package/dist/style-clipboard/index.js +1 -1
- package/dist/text-styles/index.d.ts +328 -0
- package/dist/text-styles/index.js +38 -0
- package/dist/text-styles/text-styles.css +309 -0
- package/dist/tree/index.d.ts +43 -2
- package/dist/tree/index.js +1 -1
- package/dist/tree/tree.css +71 -0
- package/dist/{types-p9j2Fac7.d.ts → types-DGcCsxs8.d.ts} +72 -7
- package/dist/{types-Bs_gVkVI.d.ts → types-DWS-s9z-.d.ts} +1 -9
- package/dist/{types-DO-b0LNj.d.ts → types-Djdq6Xkd.d.ts} +9 -8
- package/dist/{types-BOSGNvil.d.ts → types-E3HrTPg2.d.ts} +7 -13
- package/dist/{types-C7HFvdtk.d.ts → types-VqL6t5HH.d.ts} +82 -5
- package/dist/{watch-B5RTR-WX.d.ts → watch-BTYOJpQU.d.ts} +18 -1
- package/dist/{words-DagJdwIA.d.ts → words-AHHfiaRY.d.ts} +31 -2
- package/dist/words-BGrHZAJJ.d.ts +46 -0
- package/dist/{words-c-3h9xQQ.d.ts → words-BMzV04b1.d.ts} +1 -1
- package/dist/words-CRYvAiHX.d.ts +105 -0
- package/dist/words-D8kf071T.d.ts +93 -0
- package/dist/{words-N4ebT88_.d.ts → words-DgHcY5qB.d.ts} +9 -3
- package/dist/{words-C74EUpFr.d.ts → words-XH0TvZPg.d.ts} +60 -4
- package/package.json +8 -8
- package/dist/chunk-66CKSTXP.js +0 -14
- package/dist/chunk-672FAEKU.js +0 -1
- package/dist/chunk-67VZRQLG.js +0 -13
- package/dist/chunk-6PS6STGA.js +0 -1
- package/dist/chunk-7A7O2JWQ.js +0 -1
- package/dist/chunk-7JTL3P6P.js +0 -1
- package/dist/chunk-F2PIG3AA.js +0 -10
- package/dist/chunk-H4B72XCJ.js +0 -1
- package/dist/chunk-KDIVA6WD.js +0 -1
- package/dist/chunk-MCLBHENY.js +0 -1
- package/dist/chunk-QB3BZIRA.js +0 -5
- package/dist/chunk-SJQG5ENJ.js +0 -1
- package/dist/chunk-SUO5627P.js +0 -1
- package/dist/chunk-XUE5O62R.js +0 -3
- package/dist/chunk-ZT7M24XD.js +0 -1
- package/dist/editor/index.d.ts +0 -10
- package/dist/editor/index.js +0 -1
- package/dist/words-CD3WADyb.d.ts +0 -51
- /package/dist/{chunk-2PHD4L6A.js → chunk-OWBO4WKA.js} +0 -0
package/dist/copy/copy.css
CHANGED
|
@@ -28,7 +28,14 @@
|
|
|
28
28
|
* `.es-copy-box` below for the caret bug that rule exists to stop. */
|
|
29
29
|
--es-copy-field-pad: 4px 8px;
|
|
30
30
|
--es-copy-field-ring: var(--es-accent, #2563eb);
|
|
31
|
-
|
|
31
|
+
/* react-os-shell's inputClasses (design v5, 0.95.0): text-sm, a blue-400
|
|
32
|
+
border and a 2px blue-400/30 ring while focused. One set of numbers for
|
|
33
|
+
BOTH views, so flipping "Show marks" moves no word. */
|
|
34
|
+
--es-copy-field-font: 14px;
|
|
35
|
+
--es-copy-field-line: 1.5;
|
|
36
|
+
--es-copy-focus-border: #60a5fa;
|
|
37
|
+
--es-copy-focus-ring: 0 0 0 2px rgba(96, 165, 250, 0.3);
|
|
38
|
+
--es-copy-radius: 6px;
|
|
32
39
|
|
|
33
40
|
display: block;
|
|
34
41
|
/* A container, so a host can query the box's own width. Never on
|
|
@@ -184,15 +191,16 @@
|
|
|
184
191
|
}
|
|
185
192
|
|
|
186
193
|
.es-copy-box {
|
|
187
|
-
|
|
188
194
|
border: 1px solid var(--es-copy-field-border);
|
|
189
195
|
border-radius: var(--es-copy-radius);
|
|
190
196
|
background: var(--es-copy-field-bg);
|
|
191
|
-
font-size:
|
|
197
|
+
font-size: var(--es-copy-field-font);
|
|
198
|
+
line-height: var(--es-copy-field-line);
|
|
192
199
|
}
|
|
193
200
|
|
|
194
201
|
.es-copy-box:focus-within {
|
|
195
|
-
border-color: var(--es-copy-
|
|
202
|
+
border-color: var(--es-copy-focus-border);
|
|
203
|
+
box-shadow: var(--es-copy-focus-ring);
|
|
196
204
|
}
|
|
197
205
|
|
|
198
206
|
.es-copy-box.es-gold-is-off {
|
|
@@ -254,10 +262,25 @@
|
|
|
254
262
|
|
|
255
263
|
.es-copy-link-actions {
|
|
256
264
|
display: flex;
|
|
257
|
-
|
|
265
|
+
align-items: center;
|
|
266
|
+
justify-content: space-between;
|
|
258
267
|
gap: 8px;
|
|
259
268
|
}
|
|
260
269
|
|
|
270
|
+
/* Cancel and Apply sit together at the end; Remove, when there is a link to
|
|
271
|
+
take off, at the start (the design's footer). */
|
|
272
|
+
.es-copy-link-end {
|
|
273
|
+
display: flex;
|
|
274
|
+
gap: var(--es-space-4, 4px);
|
|
275
|
+
margin-left: auto;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.es-copy-link-btn.is-danger {
|
|
279
|
+
border-color: transparent;
|
|
280
|
+
background: transparent;
|
|
281
|
+
color: var(--es-danger, #dc2626);
|
|
282
|
+
}
|
|
283
|
+
|
|
261
284
|
.es-copy-link-btn {
|
|
262
285
|
height: 28px;
|
|
263
286
|
padding: 0 12px;
|
|
@@ -280,3 +303,417 @@
|
|
|
280
303
|
opacity: 0.5;
|
|
281
304
|
cursor: default;
|
|
282
305
|
}
|
|
306
|
+
|
|
307
|
+
/* — the rich view (0.95.0, rulings B + C) — */
|
|
308
|
+
|
|
309
|
+
/*
|
|
310
|
+
* The box that shows the EFFECT (./RichBox). Same frame and same type as the
|
|
311
|
+
* marks view above, so the "Show marks" switch flips the marks in and out and
|
|
312
|
+
* moves nothing else.
|
|
313
|
+
*
|
|
314
|
+
* Unlike the gold layer, weight and slant are SAFE here: there is no second
|
|
315
|
+
* surface for a wider glyph to drift from — the caret is the browser's own,
|
|
316
|
+
* in the same text it draws.
|
|
317
|
+
*
|
|
318
|
+
* The colours are the gold layer's (`--es-gold-accent`, `--es-gold-quiet`), so
|
|
319
|
+
* Emphasis and Quiet look the same in both views and a host aliases them once.
|
|
320
|
+
*/
|
|
321
|
+
.es-rich-wrap {
|
|
322
|
+
position: relative;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.es-rich {
|
|
326
|
+
box-sizing: border-box;
|
|
327
|
+
min-height: calc(var(--es-copy-field-font) * var(--es-copy-field-line) + 14px);
|
|
328
|
+
padding: var(--es-copy-field-pad);
|
|
329
|
+
border: 1px solid var(--es-copy-field-border);
|
|
330
|
+
border-radius: var(--es-copy-radius);
|
|
331
|
+
background: var(--es-copy-field-bg);
|
|
332
|
+
color: var(--es-text, #111827);
|
|
333
|
+
font: inherit;
|
|
334
|
+
font-size: var(--es-copy-field-font);
|
|
335
|
+
line-height: var(--es-copy-field-line);
|
|
336
|
+
white-space: pre-wrap;
|
|
337
|
+
overflow-wrap: anywhere;
|
|
338
|
+
outline: none;
|
|
339
|
+
cursor: text;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* Many lines: room for three, like the textarea it replaces (design: the
|
|
343
|
+
empty box is 4.625rem). */
|
|
344
|
+
.es-rich.is-multiline {
|
|
345
|
+
min-height: 4.625rem;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* One line: it scrolls sideways rather than wrapping, as an <input> does. */
|
|
349
|
+
.es-rich.is-single {
|
|
350
|
+
white-space: pre;
|
|
351
|
+
overflow-x: auto;
|
|
352
|
+
overflow-y: hidden;
|
|
353
|
+
scrollbar-width: none;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.es-rich:focus {
|
|
357
|
+
border-color: var(--es-copy-focus-border);
|
|
358
|
+
box-shadow: var(--es-copy-focus-ring);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.es-rich.is-off {
|
|
362
|
+
background: var(--es-field-bg-off, #f9fafb);
|
|
363
|
+
opacity: 0.6;
|
|
364
|
+
cursor: not-allowed;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.es-rich-line {
|
|
368
|
+
min-height: calc(var(--es-copy-field-font) * var(--es-copy-field-line));
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.es-rich-line.is-bullet {
|
|
372
|
+
display: list-item;
|
|
373
|
+
list-style: disc outside;
|
|
374
|
+
margin-left: 1.25em;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.es-rich-line.is-bullet::marker {
|
|
378
|
+
color: var(--es-text-muted, #9ca3af);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/* A numbered line (E1's `12. words`) draws the number AS SAVED — `01` stays
|
|
382
|
+
`01` — in the margin, where the caret never goes. Not `list-item`: a list
|
|
383
|
+
counter would renumber, and the saved digits are the truth. */
|
|
384
|
+
.es-rich-line.is-numbered {
|
|
385
|
+
position: relative;
|
|
386
|
+
/* Room for up to three digits and the dot ("100.") left of the words. */
|
|
387
|
+
margin-left: 2em;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
.es-rich-line.is-numbered::before {
|
|
391
|
+
content: attr(data-number) '.';
|
|
392
|
+
position: absolute;
|
|
393
|
+
right: 100%;
|
|
394
|
+
padding-right: 0.35em;
|
|
395
|
+
white-space: nowrap;
|
|
396
|
+
color: var(--es-text-muted, #9ca3af);
|
|
397
|
+
font-variant-numeric: tabular-nums;
|
|
398
|
+
pointer-events: none;
|
|
399
|
+
user-select: none;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/* E1's spans. Underline, sup and sub are the browser's own <u>, <sup>, <sub>.
|
|
403
|
+
A theme colour reads `--es-color-<name>`, which the HOST sets from its
|
|
404
|
+
theme (RichBox draws the var); the words keep the text colour until it does. */
|
|
405
|
+
.es-rich u {
|
|
406
|
+
text-underline-offset: 2px;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.es-rich sup,
|
|
410
|
+
.es-rich sub {
|
|
411
|
+
font-size: 0.75em;
|
|
412
|
+
line-height: 0;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.es-rich strong {
|
|
416
|
+
font-weight: 600;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.es-rich .es-rich-emphasis {
|
|
420
|
+
color: var(--es-gold-accent, var(--gold, #c9a461));
|
|
421
|
+
font-weight: 600;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.es-rich .es-rich-quiet {
|
|
425
|
+
color: var(--es-gold-quiet, #6b7280);
|
|
426
|
+
font-size: 0.86em;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
.es-rich .es-rich-link {
|
|
430
|
+
color: var(--es-accent, #2563eb);
|
|
431
|
+
text-decoration: underline;
|
|
432
|
+
text-underline-offset: 3px;
|
|
433
|
+
cursor: text;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.es-rich-placeholder {
|
|
437
|
+
position: absolute;
|
|
438
|
+
inset: 0;
|
|
439
|
+
padding: var(--es-copy-field-pad);
|
|
440
|
+
border: 1px solid transparent;
|
|
441
|
+
color: var(--es-gold-placeholder, #9ca3af);
|
|
442
|
+
font-size: var(--es-copy-field-font);
|
|
443
|
+
line-height: var(--es-copy-field-line);
|
|
444
|
+
pointer-events: none;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/* The "Show marks" switch, under the box (design v5: react-os-shell's Switch
|
|
448
|
+
with its label to the right). The switch is the panel's own (`.es-switch`). */
|
|
449
|
+
.es-copy-marks {
|
|
450
|
+
display: flex;
|
|
451
|
+
flex-wrap: wrap;
|
|
452
|
+
align-items: center;
|
|
453
|
+
gap: var(--es-space-4, 4px) var(--es-space-8, 8px);
|
|
454
|
+
margin-top: var(--es-space-12, 12px);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/* Words never break inside: in a narrow box (a 220px panel) Clear style
|
|
458
|
+
moves to a line of its own, still at the right end. */
|
|
459
|
+
.es-copy-marks-label {
|
|
460
|
+
font-size: 13px;
|
|
461
|
+
white-space: nowrap;
|
|
462
|
+
color: var(--es-text-secondary, #374151);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/*
|
|
466
|
+
* CLEAR STYLE (owner ruling 2026-10-07, mockup
|
|
467
|
+
* https://claude.ai/artifact/GiyeV3xazepzArKGVkFM8T): a quiet text button at
|
|
468
|
+
* the right end of the line under the box — beside Show marks, or alone under
|
|
469
|
+
* a one-line box (GG, 2026-10-07) — with the clear-marks glyph. Grey and
|
|
470
|
+
* not pressable until words are selected in the box.
|
|
471
|
+
*/
|
|
472
|
+
.es-copy-clear {
|
|
473
|
+
margin-left: auto;
|
|
474
|
+
display: inline-flex;
|
|
475
|
+
align-items: center;
|
|
476
|
+
gap: var(--es-space-4, 4px);
|
|
477
|
+
padding: var(--es-space-4, 4px) var(--es-space-8, 8px);
|
|
478
|
+
border: 0;
|
|
479
|
+
border-radius: 6px;
|
|
480
|
+
background: transparent;
|
|
481
|
+
font: inherit;
|
|
482
|
+
font-size: 13px;
|
|
483
|
+
white-space: nowrap;
|
|
484
|
+
color: var(--es-text-secondary, #374151);
|
|
485
|
+
cursor: pointer;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
.es-copy-clear svg {
|
|
489
|
+
flex: none;
|
|
490
|
+
width: 16px;
|
|
491
|
+
height: 16px;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
.es-copy-clear:hover:not(:disabled) {
|
|
495
|
+
background: var(--es-hover, #f3f4f6);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
.es-copy-clear:focus-visible {
|
|
499
|
+
outline: none;
|
|
500
|
+
box-shadow: var(--es-copy-focus-ring);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
.es-copy-clear:disabled {
|
|
504
|
+
color: var(--es-disabled, #9ca3af);
|
|
505
|
+
cursor: default;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/* — the final toolbar (E5b, design final 2026-10-06) — */
|
|
509
|
+
|
|
510
|
+
/*
|
|
511
|
+
* TWO ROWS ON ONE 9-COLUMN GRID, flush to the box at both ends: every button
|
|
512
|
+
* sits under the one above it. The size is react-os-shell's IconButton md
|
|
513
|
+
* (`--es-copy-mark-size`, 32px), the size the design draws in a 320px panel.
|
|
514
|
+
* A cell the host does not offer is drawn EMPTY, so the columns still line up.
|
|
515
|
+
*/
|
|
516
|
+
.es-tb-wrap {
|
|
517
|
+
/*
|
|
518
|
+
* The button size: react-os-shell's IconButton md (32px) — but never more
|
|
519
|
+
* than a ninth of the row, so the row is FLUSH to the box at both ends. A
|
|
520
|
+
* 320px panel's box is 286px (its 1px border takes two), and nine 32px
|
|
521
|
+
* buttons would overrun it by 2px; here they are 31.8px. On the WRAPPER, so
|
|
522
|
+
* the two windows, which sit beside the toolbar, read it too.
|
|
523
|
+
*/
|
|
524
|
+
--es-tb-size: min(var(--es-copy-mark-size), calc(100cqw / 9));
|
|
525
|
+
/* The gaps across row 1, for the windows' points (below). */
|
|
526
|
+
--es-tb-steps: 8;
|
|
527
|
+
position: relative;
|
|
528
|
+
margin-bottom: var(--es-copy-gap);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.es-tb {
|
|
532
|
+
display: flex;
|
|
533
|
+
flex-direction: column;
|
|
534
|
+
gap: var(--es-space-4, 4px);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
.es-tb-row {
|
|
538
|
+
display: grid;
|
|
539
|
+
grid-template-columns: repeat(9, var(--es-tb-size));
|
|
540
|
+
justify-content: space-between;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/* Row 1 with no host control in its 9th cell (owner ruling 2026-10-07):
|
|
544
|
+
eight buttons spread over the same width, not eight and a hole. The
|
|
545
|
+
wrapper carries it too, so the windows' points follow the buttons. */
|
|
546
|
+
.es-tb-row.is-eight {
|
|
547
|
+
grid-template-columns: repeat(8, var(--es-tb-size));
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.es-tb-wrap.is-eight {
|
|
551
|
+
--es-tb-steps: 7;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/* The alignment and case groups are radiogroups for a screen reader and
|
|
555
|
+
nothing for the grid: their buttons are cells of the row. */
|
|
556
|
+
.es-tb-group {
|
|
557
|
+
display: contents;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
.es-tb-btn {
|
|
561
|
+
box-sizing: border-box;
|
|
562
|
+
width: var(--es-tb-size);
|
|
563
|
+
height: var(--es-tb-size);
|
|
564
|
+
display: inline-flex;
|
|
565
|
+
align-items: center;
|
|
566
|
+
justify-content: center;
|
|
567
|
+
padding: 0;
|
|
568
|
+
border: 0;
|
|
569
|
+
border-radius: 6px;
|
|
570
|
+
background: transparent;
|
|
571
|
+
color: var(--es-text-secondary, #374151);
|
|
572
|
+
cursor: pointer;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
.es-tb-btn svg {
|
|
576
|
+
width: 16px;
|
|
577
|
+
height: 16px;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
.es-tb-btn:hover:not(:disabled) {
|
|
581
|
+
background: var(--es-hover, #f3f4f6);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
.es-tb-btn:focus-visible {
|
|
585
|
+
outline: none;
|
|
586
|
+
box-shadow: var(--es-copy-focus-ring);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/* Lit: the selection wears the mark (a press takes it off), the window is
|
|
590
|
+
open, or the field holds that value — react-os-shell's selected tone. */
|
|
591
|
+
.es-tb-btn.is-on,
|
|
592
|
+
.es-tb-btn.is-on:hover:not(:disabled) {
|
|
593
|
+
background: var(--es-accent-tint, #eff6ff);
|
|
594
|
+
color: var(--es-accent-text, #1d4ed8);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
.es-tb-btn:disabled {
|
|
598
|
+
opacity: 0.6;
|
|
599
|
+
cursor: not-allowed;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/* The bar under the A is the colour the selected words wear. */
|
|
603
|
+
.es-tb-color svg rect {
|
|
604
|
+
fill: var(--es-tb-run, currentColor);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/*
|
|
608
|
+
* A NARROW BOX keeps both rows and shrinks the buttons a little — never wraps.
|
|
609
|
+
* The design: under a 300px panel, the shell's next size down (24px), and no
|
|
610
|
+
* wider than a ninth of the row. A 300px panel less its two 16px gutters is a
|
|
611
|
+
* 268px box: `.es-copy` is the container that measures it.
|
|
612
|
+
*/
|
|
613
|
+
@container (width < 268px) {
|
|
614
|
+
.es-tb-wrap {
|
|
615
|
+
--es-tb-size: min(24px, calc(100cqw / 9));
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
.es-tb-btn {
|
|
619
|
+
border-radius: 5px;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.es-tb-btn svg {
|
|
623
|
+
width: 14px;
|
|
624
|
+
height: 14px;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/*
|
|
629
|
+
* THE TWO WINDOWS (colour, link) float, pushing nothing down. They open just
|
|
630
|
+
* BELOW the words they act on, left-aligned to them, or ABOVE them with no
|
|
631
|
+
* room below (Lewis 2026-10-07: under the toolbar, the window covered the
|
|
632
|
+
* words being coloured). `CopyBox` measures that and writes `top`, `left`,
|
|
633
|
+
* `--es-pop-point` and `data-side` on the window (./place). The `top` here is
|
|
634
|
+
* only the unmeasured fallback: under the first row, as first drawn.
|
|
635
|
+
* DatePicker's popover: 288px, 12px corners, a 12px inset, react-os-shell's
|
|
636
|
+
* shadow; never wider than the box.
|
|
637
|
+
*/
|
|
638
|
+
.es-copy-pop {
|
|
639
|
+
position: absolute;
|
|
640
|
+
z-index: 5;
|
|
641
|
+
left: 0;
|
|
642
|
+
top: calc(var(--es-tb-size) + 6px);
|
|
643
|
+
box-sizing: border-box;
|
|
644
|
+
width: 288px;
|
|
645
|
+
max-width: 100%;
|
|
646
|
+
margin-top: 0;
|
|
647
|
+
display: flex;
|
|
648
|
+
flex-direction: column;
|
|
649
|
+
gap: var(--es-space-8, 8px);
|
|
650
|
+
padding: 12px;
|
|
651
|
+
border: 1px solid var(--es-border, #e5e7eb);
|
|
652
|
+
border-radius: 12px;
|
|
653
|
+
background: var(--es-raised, #fff);
|
|
654
|
+
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
/* The point, aimed at its button: column k of row 1 across the box (100cqw),
|
|
658
|
+
whose cells are `--es-tb-steps` + 1 (nine, or eight with no host control). */
|
|
659
|
+
.es-copy-pop::before {
|
|
660
|
+
content: '';
|
|
661
|
+
position: absolute;
|
|
662
|
+
top: -6px;
|
|
663
|
+
width: 10px;
|
|
664
|
+
height: 10px;
|
|
665
|
+
background: inherit;
|
|
666
|
+
border-left: 1px solid var(--es-border, #e5e7eb);
|
|
667
|
+
border-top: 1px solid var(--es-border, #e5e7eb);
|
|
668
|
+
transform: rotate(45deg);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/* Aimed at the words (measured), or — unmeasured — at its button, as above. */
|
|
672
|
+
.es-copy-colors::before {
|
|
673
|
+
left: var(--es-pop-point, calc(4 * (100cqw - var(--es-tb-size)) / var(--es-tb-steps) + var(--es-tb-size) / 2 - 6px));
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
.es-copy-link.es-copy-pop::before {
|
|
677
|
+
left: var(--es-pop-point, calc(5 * (100cqw - var(--es-tb-size)) / var(--es-tb-steps) + var(--es-tb-size) / 2 - 6px));
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/* Opened above the words: the point is on the bottom edge, aimed down. */
|
|
681
|
+
.es-copy-pop[data-side='above']::before {
|
|
682
|
+
top: auto;
|
|
683
|
+
bottom: -6px;
|
|
684
|
+
transform: rotate(225deg);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
.es-copy-pop-label,
|
|
688
|
+
.es-copy-pop .es-copy-link-label {
|
|
689
|
+
font-size: 12px;
|
|
690
|
+
font-weight: 500;
|
|
691
|
+
color: var(--es-text-secondary, #4b5563);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
/* The theme colours are pick's ONE theme row (`.es-pick-theme`, pick.css). */
|
|
695
|
+
|
|
696
|
+
/* Any color (E1 widened 2026-10-06) is pick's own ColourWindow (pick.css):
|
|
697
|
+
inside this window it is not a second box — no border, no inset. */
|
|
698
|
+
.es-copy-colors .es-pick-window {
|
|
699
|
+
padding: 0;
|
|
700
|
+
border: 0;
|
|
701
|
+
border-radius: 0;
|
|
702
|
+
background: transparent;
|
|
703
|
+
gap: var(--es-space-8, 8px);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
.es-copy-pop-foot {
|
|
707
|
+
display: flex;
|
|
708
|
+
justify-content: space-between;
|
|
709
|
+
align-items: center;
|
|
710
|
+
gap: var(--es-space-4, 4px);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/* — the number cells (E5b): a 2-column grid between the toolbar and the box — */
|
|
714
|
+
.es-copy-cells {
|
|
715
|
+
display: grid;
|
|
716
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
717
|
+
gap: var(--es-space-4, 4px);
|
|
718
|
+
margin-bottom: var(--es-copy-gap);
|
|
719
|
+
}
|