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.
Files changed (108) hide show
  1. package/README.md +233 -17
  2. package/dist/autosave/index.d.ts +11 -5
  3. package/dist/blocks/index.d.ts +1 -1
  4. package/dist/canvas/index.d.ts +2 -2
  5. package/dist/canvas/index.js +1 -1
  6. package/dist/chrome/chrome.css +96 -29
  7. package/dist/chrome/index.d.ts +67 -18
  8. package/dist/chrome/index.js +25 -21
  9. package/dist/{chunk-JYPOOHII.js → chunk-2FZJWH24.js} +3 -3
  10. package/dist/chunk-3EDSDPIP.js +1 -0
  11. package/dist/chunk-546BBOPE.js +1 -0
  12. package/dist/chunk-67GNT6PF.js +1 -0
  13. package/dist/chunk-EOJNJCMJ.js +16 -0
  14. package/dist/chunk-EWVJSRRY.js +6 -0
  15. package/dist/chunk-FPOKPNO4.js +1 -0
  16. package/dist/chunk-H24N5TMZ.js +11 -0
  17. package/dist/chunk-IG3U5NWJ.js +1 -0
  18. package/dist/chunk-JUQ6YJCG.js +1 -0
  19. package/dist/chunk-KTVH2ZRL.js +15 -0
  20. package/dist/{chunk-PI26YXYD.js → chunk-L5KW4HG5.js} +16 -8
  21. package/dist/chunk-M6F6LS3H.js +1 -0
  22. package/dist/chunk-P6O363EE.js +6 -0
  23. package/dist/chunk-PAELDYYS.js +1 -0
  24. package/dist/chunk-QTLAVDJE.js +1 -0
  25. package/dist/chunk-UH7IGZKF.js +1 -0
  26. package/dist/chunk-WZ7TGAAT.js +3 -0
  27. package/dist/chunk-ZFDCDJNZ.js +16 -0
  28. package/dist/chunk-ZJEBF4NB.js +1 -0
  29. package/dist/chunk-ZNS7727Y.js +12 -0
  30. package/dist/copy/copy.css +442 -5
  31. package/dist/copy/index.d.ts +302 -5
  32. package/dist/copy/index.js +32 -10
  33. package/dist/drag/drag.css +10 -1
  34. package/dist/drag/index.d.ts +99 -8
  35. package/dist/drag/index.js +18 -17
  36. package/dist/easel/easel.css +15 -0
  37. package/dist/easel/index.d.ts +104 -33
  38. package/dist/easel/index.js +9 -1
  39. package/dist/edit-lock/index.d.ts +1 -3
  40. package/dist/edit-lock/index.js +1 -1
  41. package/dist/fields/fields.css +270 -38
  42. package/dist/fields/index.d.ts +209 -26
  43. package/dist/fields/index.js +22 -53
  44. package/dist/gold/index.js +1 -1
  45. package/dist/icons/index.d.ts +13 -1
  46. package/dist/icons/index.js +1 -1
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.js +1 -1
  49. package/dist/markup/index.d.ts +111 -10
  50. package/dist/markup/index.js +1 -1
  51. package/dist/menu/index.d.ts +58 -5
  52. package/dist/menu/index.js +1 -15
  53. package/dist/menu/menu.css +17 -6
  54. package/dist/node-ops/index.d.ts +1 -1
  55. package/dist/node-ops/index.js +1 -1
  56. package/dist/panel/index.d.ts +83 -4
  57. package/dist/panel/index.js +18 -16
  58. package/dist/panel/panel.css +135 -62
  59. package/dist/pick/index.d.ts +78 -2
  60. package/dist/pick/index.js +7 -14
  61. package/dist/pick/pick.css +197 -10
  62. package/dist/rail/index.d.ts +3 -7
  63. package/dist/rail/index.js +1 -1
  64. package/dist/strings/catalogue.d.ts +13 -35
  65. package/dist/strings/catalogue.js +1 -1
  66. package/dist/strings/index.d.ts +12 -18
  67. package/dist/strings/index.js +2 -2
  68. package/dist/style-clipboard/index.d.ts +1 -1
  69. package/dist/style-clipboard/index.js +1 -1
  70. package/dist/text-styles/index.d.ts +328 -0
  71. package/dist/text-styles/index.js +38 -0
  72. package/dist/text-styles/text-styles.css +309 -0
  73. package/dist/tree/index.d.ts +43 -2
  74. package/dist/tree/index.js +1 -1
  75. package/dist/tree/tree.css +71 -0
  76. package/dist/{types-p9j2Fac7.d.ts → types-DGcCsxs8.d.ts} +72 -7
  77. package/dist/{types-Bs_gVkVI.d.ts → types-DWS-s9z-.d.ts} +1 -9
  78. package/dist/{types-DO-b0LNj.d.ts → types-Djdq6Xkd.d.ts} +9 -8
  79. package/dist/{types-BOSGNvil.d.ts → types-E3HrTPg2.d.ts} +7 -13
  80. package/dist/{types-C7HFvdtk.d.ts → types-VqL6t5HH.d.ts} +82 -5
  81. package/dist/{watch-B5RTR-WX.d.ts → watch-BTYOJpQU.d.ts} +18 -1
  82. package/dist/{words-DagJdwIA.d.ts → words-AHHfiaRY.d.ts} +31 -2
  83. package/dist/words-BGrHZAJJ.d.ts +46 -0
  84. package/dist/{words-c-3h9xQQ.d.ts → words-BMzV04b1.d.ts} +1 -1
  85. package/dist/words-CRYvAiHX.d.ts +105 -0
  86. package/dist/words-D8kf071T.d.ts +93 -0
  87. package/dist/{words-N4ebT88_.d.ts → words-DgHcY5qB.d.ts} +9 -3
  88. package/dist/{words-C74EUpFr.d.ts → words-XH0TvZPg.d.ts} +60 -4
  89. package/package.json +8 -8
  90. package/dist/chunk-66CKSTXP.js +0 -14
  91. package/dist/chunk-672FAEKU.js +0 -1
  92. package/dist/chunk-67VZRQLG.js +0 -13
  93. package/dist/chunk-6PS6STGA.js +0 -1
  94. package/dist/chunk-7A7O2JWQ.js +0 -1
  95. package/dist/chunk-7JTL3P6P.js +0 -1
  96. package/dist/chunk-F2PIG3AA.js +0 -10
  97. package/dist/chunk-H4B72XCJ.js +0 -1
  98. package/dist/chunk-KDIVA6WD.js +0 -1
  99. package/dist/chunk-MCLBHENY.js +0 -1
  100. package/dist/chunk-QB3BZIRA.js +0 -5
  101. package/dist/chunk-SJQG5ENJ.js +0 -1
  102. package/dist/chunk-SUO5627P.js +0 -1
  103. package/dist/chunk-XUE5O62R.js +0 -3
  104. package/dist/chunk-ZT7M24XD.js +0 -1
  105. package/dist/editor/index.d.ts +0 -10
  106. package/dist/editor/index.js +0 -1
  107. package/dist/words-CD3WADyb.d.ts +0 -51
  108. /package/dist/{chunk-2PHD4L6A.js → chunk-OWBO4WKA.js} +0 -0
@@ -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
- --es-copy-radius: 4px;
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: 12px;
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-field-ring);
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
- justify-content: flex-end;
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
+ }