efficient-easel 0.106.0 → 1.0.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 (168) hide show
  1. package/README.md +70 -29
  2. package/dist/{LinkPicker-W2Rtxetz.d.ts → LinkPicker-hPEr1MJx.d.ts} +6 -4
  3. package/dist/autosave/index.d.ts +5 -5
  4. package/dist/chrome/chrome.css +50 -273
  5. package/dist/chrome/index.d.ts +61 -56
  6. package/dist/chrome/index.js +1 -1
  7. package/dist/chunk-4GNPKHV4.js +64 -0
  8. package/dist/chunk-5545A3PC.js +4 -0
  9. package/dist/chunk-7SQF6LZL.js +1 -0
  10. package/dist/chunk-BXMXTO36.js +1 -0
  11. package/dist/{chunk-JWMNPRTT.js → chunk-CKEPQNSQ.js} +1 -1
  12. package/dist/{chunk-LY4K2ECT.js → chunk-DJMMTWFP.js} +1 -1
  13. package/dist/chunk-EA2HTX37.js +5 -0
  14. package/dist/{chunk-VINYARYJ.js → chunk-FEK3S6HN.js} +1 -1
  15. package/dist/chunk-FPAVNX3Y.js +6 -0
  16. package/dist/chunk-HMJS344F.js +1 -0
  17. package/dist/chunk-JLTZQ4US.js +1 -0
  18. package/dist/chunk-JMGPPXNQ.js +24 -0
  19. package/dist/chunk-K56YDHYQ.js +1 -0
  20. package/dist/chunk-LOMEH6DG.js +1 -0
  21. package/dist/{chunk-FS5BLARH.js → chunk-MAEXP3KE.js} +1 -1
  22. package/dist/chunk-MJM6SFD3.js +3 -0
  23. package/dist/chunk-NLRW4BGG.js +8 -0
  24. package/dist/chunk-OJAJVH7S.js +5 -0
  25. package/dist/chunk-ONRYLR2D.js +2 -0
  26. package/dist/{chunk-WTMHT7BI.js → chunk-ORR3Q4WV.js} +1 -1
  27. package/dist/chunk-OTEXGJDU.js +5 -0
  28. package/dist/chunk-P2VEMZH5.js +1 -0
  29. package/dist/{chunk-MHKBLPQ2.js → chunk-PT6V53OO.js} +1 -1
  30. package/dist/{chunk-6WH7FA2M.js → chunk-PYCLHOSA.js} +2 -2
  31. package/dist/chunk-Q27BB5ZC.js +14 -0
  32. package/dist/chunk-QLD57GBB.js +6 -0
  33. package/dist/{chunk-PBSEUZD6.js → chunk-QMNML7XH.js} +1 -1
  34. package/dist/chunk-QR4DLZ3P.js +5 -0
  35. package/dist/chunk-TJ7YIRWQ.js +21 -0
  36. package/dist/{chunk-3P6AMTOS.js → chunk-VPFNZ7TB.js} +1 -1
  37. package/dist/chunk-W3XX2CNW.js +16 -0
  38. package/dist/chunk-X6DQWK2C.js +1 -0
  39. package/dist/chunk-XWR5YVA7.js +9 -0
  40. package/dist/chunk-YABL4EWX.js +7 -0
  41. package/dist/chunk-ZNNATBDC.js +1 -0
  42. package/dist/chunk-ZP4G3X44.js +4 -0
  43. package/dist/copy/copy.css +66 -177
  44. package/dist/copy/index.d.ts +0 -2
  45. package/dist/copy/index.js +31 -32
  46. package/dist/drag/drag.css +31 -11
  47. package/dist/drag/index.js +1 -1
  48. package/dist/easel/index.js +1 -1
  49. package/dist/fields/fields.css +35 -304
  50. package/dist/fields/index.d.ts +87 -95
  51. package/dist/fields/index.js +1 -1
  52. package/dist/gold/gold.css +3 -3
  53. package/dist/gold/index.d.ts +6 -5
  54. package/dist/gold/index.js +1 -1
  55. package/dist/index.d.ts +3 -3
  56. package/dist/index.js +1 -1
  57. package/dist/menu/index.d.ts +49 -93
  58. package/dist/menu/index.js +1 -1
  59. package/dist/menu/menu.css +37 -246
  60. package/dist/node-ops/index.d.ts +1 -1
  61. package/dist/panel/index.d.ts +46 -72
  62. package/dist/panel/index.js +17 -18
  63. package/dist/panel/panel.css +143 -372
  64. package/dist/pick/index.d.ts +52 -33
  65. package/dist/pick/index.js +7 -7
  66. package/dist/pick/pick.css +19 -150
  67. package/dist/rail/index.d.ts +48 -90
  68. package/dist/rail/index.js +1 -1
  69. package/dist/rail/rail.css +21 -108
  70. package/dist/screen/components/AddBlockRow.d.ts +8 -2
  71. package/dist/screen/components/AddBlockRow.js +1 -1
  72. package/dist/screen/components/AddChildRow.d.ts +4 -3
  73. package/dist/screen/components/AddChildRow.js +1 -1
  74. package/dist/screen/components/AddSidePanel.js +1 -1
  75. package/dist/screen/components/MediaSidePanel.d.ts +1 -1
  76. package/dist/screen/components/MediaSidePanel.js +1 -1
  77. package/dist/screen/components/NodeContextMenu.d.ts +12 -8
  78. package/dist/screen/components/NodeContextMenu.js +1 -1
  79. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  80. package/dist/screen/components/ScreenChrome.js +1 -1
  81. package/dist/screen/components/ScreenDocumentContext.d.ts +1 -1
  82. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  83. package/dist/screen/components/ScreenMount.d.ts +7 -7
  84. package/dist/screen/components/ScreenMount.js +1 -1
  85. package/dist/screen/components/ScreenStoreProvider.d.ts +7 -7
  86. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  87. package/dist/screen/components/SectionScreenShell.js +16 -16
  88. package/dist/screen/components/SidePanelHead.d.ts +4 -2
  89. package/dist/screen/components/SidePanelHead.js +1 -1
  90. package/dist/screen/components/UiIcon.d.ts +10 -26
  91. package/dist/screen/components/UiIcon.js +2 -1
  92. package/dist/screen/components/panel-widths.js +1 -1
  93. package/dist/screen/components/usePartBridge.d.ts +7 -7
  94. package/dist/screen/components/usePartBridge.js +1 -1
  95. package/dist/screen/index.d.ts +7 -7
  96. package/dist/screen/index.js +1 -1
  97. package/dist/screen/lib/admin-bridge.d.ts +1 -1
  98. package/dist/screen/lib/admin-bridge.js +1 -1
  99. package/dist/screen/lib/chrome-theme.d.ts +20 -12
  100. package/dist/screen/lib/chrome-theme.js +1 -1
  101. package/dist/screen/lib/document-addressing.d.ts +1 -1
  102. package/dist/screen/lib/host-chrome.d.ts +1 -1
  103. package/dist/screen/lib/host.d.ts +1 -1
  104. package/dist/screen/lib/key-scope.js +1 -1
  105. package/dist/screen/lib/links/link-filters.d.ts +1 -1
  106. package/dist/screen/lib/media-panel.d.ts +1 -1
  107. package/dist/screen/lib/media-picker.d.ts +1 -1
  108. package/dist/screen/lib/page-lock.d.ts +1 -1
  109. package/dist/screen/lib/puck/style-clipboard.d.ts +7 -7
  110. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  111. package/dist/screen/lib/screen-parts.d.ts +9 -8
  112. package/dist/screen/lib/screen-parts.js +1 -1
  113. package/dist/screen/lib/section-templates.d.ts +1 -1
  114. package/dist/screen/lib/session-context.d.ts +1 -1
  115. package/dist/screen/lib/session.d.ts +1 -1
  116. package/dist/screen/screen.css +33 -206
  117. package/dist/shell/index.d.ts +134 -118
  118. package/dist/shell/index.js +1 -1
  119. package/dist/shell/shell.css +130 -88
  120. package/dist/strings/catalogue.d.ts +5 -5
  121. package/dist/strings/catalogue.js +1 -1
  122. package/dist/strings/index.d.ts +5 -5
  123. package/dist/strings/index.js +1 -1
  124. package/dist/style-clipboard/index.d.ts +1 -1
  125. package/dist/text-styles/index.d.ts +12 -3
  126. package/dist/text-styles/index.js +33 -38
  127. package/dist/text-styles/text-styles.css +39 -71
  128. package/dist/tree/index.d.ts +49 -44
  129. package/dist/tree/index.js +1 -1
  130. package/dist/tree/tree.css +31 -653
  131. package/dist/{types-DJDBtdB2.d.ts → types-BqGnUVX5.d.ts} +32 -32
  132. package/dist/types-BsyPh6EW.d.ts +99 -0
  133. package/dist/{types-DWS-s9z-.d.ts → types-CsgMwHHa.d.ts} +14 -11
  134. package/dist/{types-CqY85foL.d.ts → types-Dt1CFR1S.d.ts} +4 -2
  135. package/dist/{wordFit-D4S36PvB.d.ts → wordFit-7XpmhcaW.d.ts} +3 -5
  136. package/dist/words-Cl9xMUYY.d.ts +41 -0
  137. package/dist/{words-D_Lnw1Gr.d.ts → words-CvFnwGSr.d.ts} +1 -1
  138. package/package.json +5 -1
  139. package/dist/chunk-2UX75JDP.js +0 -1
  140. package/dist/chunk-37OCQYNX.js +0 -65
  141. package/dist/chunk-3EDSDPIP.js +0 -1
  142. package/dist/chunk-3QVB4AG2.js +0 -3
  143. package/dist/chunk-3WSPDAK2.js +0 -1
  144. package/dist/chunk-5MZ3RNQQ.js +0 -13
  145. package/dist/chunk-5ZBBXZPV.js +0 -6
  146. package/dist/chunk-BZ5ASXOL.js +0 -1
  147. package/dist/chunk-C6BJB5AC.js +0 -2
  148. package/dist/chunk-DX4XELD6.js +0 -18
  149. package/dist/chunk-EOJNJCMJ.js +0 -16
  150. package/dist/chunk-EWVJSRRY.js +0 -6
  151. package/dist/chunk-H24N5TMZ.js +0 -11
  152. package/dist/chunk-I6T4TZ5Q.js +0 -8
  153. package/dist/chunk-KTVH2ZRL.js +0 -15
  154. package/dist/chunk-M7N2V4TG.js +0 -2
  155. package/dist/chunk-MS4QRBJ6.js +0 -5
  156. package/dist/chunk-ND55LTCA.js +0 -5
  157. package/dist/chunk-OWBO4WKA.js +0 -0
  158. package/dist/chunk-P6O363EE.js +0 -6
  159. package/dist/chunk-RW4XBUUW.js +0 -1
  160. package/dist/chunk-UEVTQBM7.js +0 -10
  161. package/dist/chunk-VCQVNPTG.js +0 -22
  162. package/dist/chunk-WZ7TGAAT.js +0 -3
  163. package/dist/chunk-YC4TB3CJ.js +0 -25
  164. package/dist/chunk-Z6SOLDWV.js +0 -1
  165. package/dist/chunk-ZFDCDJNZ.js +0 -16
  166. package/dist/chunk-ZNS7727Y.js +0 -12
  167. package/dist/types-Djdq6Xkd.d.ts +0 -138
  168. package/dist/words-DgHcY5qB.d.ts +0 -33
@@ -15,13 +15,19 @@
15
15
  * draws to a rule in them.
16
16
  * The `sf-` names are kept: the hosts' sheets and their guards address them.
17
17
  *
18
+ * The `--sf-*` aliases below stay (hosts read them), but they resolve through
19
+ * `--es-*` to efficient-shell's tokens since UI-24 (efficient-harness#117):
20
+ * a host that loads the shell's CSS first gets the shell's theme, dark
21
+ * included, in every `--sf-*` name too. `--sf-frame-bg` is the canvas's
22
+ * paper — output, not chrome — and stays the page's white.
23
+ *
18
24
  * Load it after the other easel sheets and before a host's own sheet, which is
19
25
  * where these rules sat in the builder's; that order is the one the cascade
20
26
  * was measured in.
21
27
  */
22
28
 
23
29
  .sf-editor {
24
- /* ── Accent (efficient-shell blue) ───────────────────────────────────── */
30
+ /* ── Accent (efficient-shell's) ──────────────────────────────────────── */
25
31
  --sf-accent: var(--es-accent);
26
32
  --sf-accent-tint: var(--es-accent-tint);
27
33
  --sf-accent-tint-strong: var(--es-accent-tint-strong);
@@ -30,7 +36,7 @@
30
36
  --sf-accent-shadow: var(--es-accent-shadow);
31
37
  --sf-on-accent: var(--es-on-accent);
32
38
 
33
- /* ── Surfaces (cool gray ramp) ──────────────────────────────────────── */
39
+ /* ── Surfaces (shell ramp) ──────────────────────────────────────────── */
34
40
  --sf-app-bg: var(--es-app-bg);
35
41
  --sf-preview-bg: var(--es-preview-bg);
36
42
  --sf-panel: var(--es-panel);
@@ -70,7 +76,7 @@
70
76
  --sf-scrollbar: var(--es-scrollbar);
71
77
  --sf-scrollbar-hover: var(--es-scrollbar-hover);
72
78
 
73
- /* ── Danger / warning / success (shell red / amber / green) ─────────── */
79
+ /* ── Danger / warning / success (shell status tiers) ───────────────── */
74
80
  --sf-danger: var(--es-danger);
75
81
  --sf-danger-strong: var(--es-danger-strong);
76
82
  --sf-danger-tint: var(--es-danger-tint);
@@ -222,7 +228,7 @@
222
228
 
223
229
  .sf-scroll::-webkit-scrollbar-thumb {
224
230
  background: var(--sf-scrollbar);
225
- border-radius: 8px;
231
+ border-radius: var(--radius-lg);
226
232
  border: 3px solid transparent;
227
233
  background-clip: content-box;
228
234
  }
@@ -277,9 +283,9 @@
277
283
  /* THE SIDE PANELS AND THEIR GRIPS ARE editor-shell's (efficient-easel/chrome.css):
278
284
  `.es-sidepanel` — flush, a hairline on the SEAM side only (card 66161: draw the
279
285
  seams, leave the outer edges alone), the size-container context every
280
- `@container` rule in this sheet asks (card 66212) — and `.es-resizer`, pinned
281
- over each seam from `--es-left-w` / `--es-right-w`, with the drag's
282
- `body.es-col-resizing`. Lifted from this sheet (redesign 2a). The panels keep
286
+ `@container` rule in this sheet asks (card 66212) — and `.es-resizer` (the
287
+ shell's `ResizeHandle` since 1.0.0), pinned over each seam from
288
+ `--es-left-w` / `--es-right-w`. Lifted from this sheet (redesign 2a). The panels keep
283
289
  `.sf-panel` / `.sf-panel--left|right` as well, which is what this sheet's own
284
290
  descendant rules (`.sf-panel--right .sf-insp-body`, …) hang on. */
285
291
  .sf-panel-head {
@@ -381,7 +387,7 @@
381
387
  .sf-chip {
382
388
  width: 18px;
383
389
  height: 18px;
384
- border-radius: 5px;
390
+ border-radius: var(--radius-md);
385
391
  display: flex;
386
392
  align-items: center;
387
393
  justify-content: center;
@@ -434,21 +440,28 @@
434
440
  padding: 6px 9px;
435
441
  border: none;
436
442
  background: transparent;
437
- border-radius: 8px;
443
+ border-radius: var(--radius-lg);
438
444
  cursor: pointer;
439
445
  color: var(--sf-accent);
440
446
  font-size: 12px;
441
447
  font-weight: 500;
442
448
  }
443
449
 
444
- .sf-add-card:hover {
450
+ .sf-add-card:hover:not([aria-disabled='true']) {
445
451
  background: var(--sf-accent-tint);
446
452
  }
447
453
 
454
+ /* Off with a reason (`aria-disabled`, so the keyboard reaches it and hears
455
+ why): the shell's own disabled fade, which only `:disabled` would draw. */
456
+ .sf-add-card[aria-disabled='true'] {
457
+ opacity: 0.6;
458
+ cursor: not-allowed;
459
+ }
460
+
448
461
  .sf-add-card .sf-plus {
449
462
  width: 18px;
450
463
  height: 18px;
451
- border-radius: 5px;
464
+ border-radius: var(--radius-md);
452
465
  display: flex;
453
466
  align-items: center;
454
467
  justify-content: center;
@@ -457,81 +470,10 @@
457
470
  background: var(--sf-accent-tint);
458
471
  }
459
472
 
460
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
461
- .sf-blockmenu {
462
- display: flex;
463
- flex-direction: column;
464
- gap: 1px;
465
- margin: 2px 0 4px;
466
- padding: 4px;
467
- border: 1px solid var(--sf-line);
468
- border-radius: 8px;
469
- background: var(--sf-panel);
470
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
471
- }
472
-
473
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
474
- .sf-blockmenu-item {
475
- display: flex;
476
- align-items: center;
477
- gap: 8px;
478
- width: 100%;
479
- padding: 7px 9px;
480
- border: none;
481
- background: transparent;
482
- border-radius: 6px;
483
- cursor: pointer;
484
- color: var(--sf-text, var(--sf-text));
485
- font-size: 12.5px;
486
- text-align: left;
487
- }
488
-
489
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
490
- .sf-blockmenu-item:hover {
491
- background: var(--sf-accent-tint);
492
- color: var(--sf-accent);
493
- }
494
-
495
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
496
- /* A group heading inside that menu — drawn only where a choice list carries
497
- groups (a Box's does; the Footer's and the Slide box's do not, and render
498
- exactly as before).
499
-
500
- ⚠️ THE SAME TYPE AS `.sf-addgroup-title` BELOW, and deliberately not a second
501
- look: that is the heading the Add-section panel puts over every one of its
502
- categories, and this menu is the OTHER door a merchant adds something
503
- through. One grammar for "these belong together" (rule zero). It is not the
504
- same CLASS because the two live in different boxes — a 4px-padded floating
505
- menu and a 20px panel column — so only the spacing differs, and it differs
506
- because the container does.
507
-
508
- `role="presentation"` on the row: it is a label, not a menuitem, and a
509
- keyboard user arrowing through the menu must not land on it. */
510
- .sf-menugroup-head {
511
- display: flex;
512
- align-items: baseline;
513
- gap: 8px;
514
- padding: 9px 9px 5px;
515
- }
516
-
517
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
518
- /* No top padding on the first heading — the menu's own 4px inset already sets
519
- it in, and a second inset would leave the first group sitting lower than the
520
- rows it names. */
521
- .sf-menugroup-head:first-child {
522
- padding-top: 4px;
523
- }
524
-
525
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
526
- .sf-menugroup-title {
527
- font-size: 11px;
528
- font-weight: 700;
529
- letter-spacing: 0.07em;
530
- text-transform: uppercase;
531
- color: var(--sf-muted);
532
- }
533
-
534
- /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
473
+ /* ── Footer "Add block" menu — the shell's DropdownMenu (easel issue 199, step 4) ────── */
474
+ /* The menu, its rows and its group headings are efficient-shell's; the row
475
+ that opens it is the add card (`.sf-add-card`, the trigger's own look). What
476
+ stays is a heading's count, quieter than its word. */
535
477
  .sf-menugroup-count {
536
478
  font-size: 11px;
537
479
  color: var(--sf-field-placeholder);
@@ -563,7 +505,7 @@
563
505
  the engine itself since efficient-easel 0.80.1: a scene drawn to fill it
564
506
  painted over the whole panel before. */
565
507
  .sf-addside .es-add-tile-cover {
566
- border: 1px solid #edeff4;
508
+ border: 1px solid var(--sf-line);
567
509
  }
568
510
 
569
511
  /* ── Footer "Add block" menu — heterogeneous block-type picker ──────────── */
@@ -584,42 +526,6 @@
584
526
  overflow: hidden;
585
527
  }
586
528
 
587
- /* Toast — transient confirmation (e.g. after adding a section) */
588
- .sf-toast {
589
- position: absolute;
590
- left: 50%;
591
- bottom: 34px;
592
- transform: translateX(-50%);
593
- z-index: 60;
594
- display: flex;
595
- align-items: center;
596
- gap: 10px;
597
- padding: 11px 17px;
598
- border-radius: 11px;
599
- background: var(--sf-toast-bg);
600
- color: #fff;
601
- font-size: 13px;
602
- box-shadow: 0 12px 30px rgba(15, 23, 42, 0.3);
603
- }
604
-
605
- .sf-toast-check {
606
- display: inline-flex;
607
- align-items: center;
608
- justify-content: center;
609
- width: 18px;
610
- height: 18px;
611
- border-radius: 50%;
612
- background: var(--sf-accent);
613
- color: #fff;
614
- font-size: 11px;
615
- flex: none;
616
- }
617
-
618
- /* Error variant — same dark pill, red mark instead of the green check. */
619
- .sf-toast--error .sf-toast-check {
620
- background: var(--sf-danger);
621
- }
622
-
623
529
  /* ── Center: device-framed preview (wraps Puck.Preview) ──────────────── */
624
530
  .sf-center {
625
531
  flex: 1;
@@ -826,7 +732,7 @@
826
732
  padding: 4px;
827
733
  border-radius: 999px;
828
734
  background: var(--sf-toast-bg);
829
- color: #fff;
735
+ color: var(--sf-on-accent);
830
736
  font-family: var(--sf-font);
831
737
  font-size: 12px;
832
738
  font-weight: 500;
@@ -865,7 +771,7 @@
865
771
  height: 18px;
866
772
  border-radius: 50%;
867
773
  background: var(--sf-accent);
868
- color: #fff;
774
+ color: var(--sf-on-accent);
869
775
  font-size: 13px;
870
776
  line-height: 1;
871
777
  flex: none;
@@ -921,64 +827,6 @@
921
827
  color: var(--sf-danger);
922
828
  }
923
829
 
924
- /* ── The icon rail: the shared editor-shell EaselRail (`.es-rail`) ───────────
925
- The rail markup + base styles live in the `efficient-easel` package (imported via
926
- `efficient-easel/rail.css`); the storefront no longer hand-rolls `.sf-rail`.
927
- editor-shell ships its own defaults, so we remap the themeable `--es-rail-*`
928
- custom properties onto the storefront's own `--sf-*` tokens, which is what
929
- keeps the shared rail reading as this editor's chrome rather than as the
930
- package's. (One mode only — the editor is deliberately light-only; see the
931
- note at the top of this file.)
932
- Scoped `.sf-editor .es-rail` (specificity 0,2,0) so it always beats rail.css's
933
- base `.es-rail` (0,1,0) whatever order the two stylesheets load in.
934
-
935
- THREE TOKENS ARE DELIBERATELY NOT REMAPPED HERE, and each absence is load-
936
- bearing since card 66198 laid the rail into the top bar as a row:
937
-
938
- --es-rail-w only the COLUMN reads it (`.es-rail { width:
939
- var(--es-rail-w) }`); the row is `width: auto` and sizes
940
- to its buttons, so a remap would be config nothing reads.
941
- --es-rail-bg the row variant re-points these to transparent / none / 0
942
- --es-rail-shadow ON PURPOSE: the bar already has its own surface, and a
943
- --es-rail-radius second white card floating inside it is the bug. This
944
- rule ties with `.es-rail.es-rail-row` on specificity
945
- (0,2,0 both), so setting them here would silently WIN
946
- and put that card back. The rail's surface is the bar's.
947
-
948
- Everything left below is colour the row variant does not touch. */
949
- .sf-editor .es-rail {
950
- --es-rail-fg: var(--sf-muted);
951
- --es-rail-hover-bg: var(--sf-hover);
952
- --es-rail-hover-fg: var(--sf-text);
953
- --es-rail-accent: var(--sf-accent);
954
- --es-rail-accent-tint: var(--sf-accent-tint);
955
- }
956
-
957
- /* ── The icon rail: the shared editor-shell EaselRail (`.es-rail`) ───────────
958
- The rail markup + base styles live in the `efficient-easel` package (imported via
959
- `efficient-easel/rail.css`); the storefront no longer hand-rolls `.sf-rail`.
960
- editor-shell ships its own defaults, so we remap the themeable `--es-rail-*`
961
- custom properties onto the storefront's own `--sf-*` tokens, which is what
962
- keeps the shared rail reading as this editor's chrome rather than as the
963
- package's. (One mode only — the editor is deliberately light-only; see the
964
- note at the top of this file.)
965
- Scoped `.sf-editor .es-rail` (specificity 0,2,0) so it always beats rail.css's
966
- base `.es-rail` (0,1,0) whatever order the two stylesheets load in.
967
-
968
- THREE TOKENS ARE DELIBERATELY NOT REMAPPED HERE, and each absence is load-
969
- bearing since card 66198 laid the rail into the top bar as a row:
970
-
971
- --es-rail-w only the COLUMN reads it (`.es-rail { width:
972
- var(--es-rail-w) }`); the row is `width: auto` and sizes
973
- to its buttons, so a remap would be config nothing reads.
974
- --es-rail-bg the row variant re-points these to transparent / none / 0
975
- --es-rail-shadow ON PURPOSE: the bar already has its own surface, and a
976
- --es-rail-radius second white card floating inside it is the bug. This
977
- rule ties with `.es-rail.es-rail-row` on specificity
978
- (0,2,0 both), so setting them here would silently WIN
979
- and put that card back. The rail's surface is the bar's.
980
-
981
- Everything left below is colour the row variant does not touch. */
982
830
  /* THE RAIL COLUMN (owner, 2026-09-04: "the top control panel and the panel
983
831
  below it" must read as one) — the cluster exactly the left panel's width,
984
832
  carrying its hairline up through the bar, the buttons spread across it (his
@@ -1050,7 +898,7 @@
1050
898
  .sf-device-scope {
1051
899
  margin: 8px 0 2px;
1052
900
  padding: 7px 10px;
1053
- border-radius: 7px;
901
+ border-radius: var(--radius-md);
1054
902
  background: var(--sf-chip-bg);
1055
903
  font-size: 11.5px;
1056
904
  line-height: 1.35;
@@ -1099,8 +947,7 @@
1099
947
  Every side panel's head is efficient-easel's `InspectorHead`; these two
1100
948
  are the pieces the website editor adds to it. The hairline parts a panel's
1101
949
  own tools from the hide button that ends every head, and a mode's way out
1102
- is a word ("Done", "Cancel") on the engine's ghost button, drawn to the
1103
- 28px of the head's icon buttons so the row keeps one height. */
950
+ is a word ("Done", "Cancel") on the shell's small Button. */
1104
951
  .sf-head-divider {
1105
952
  width: 1px;
1106
953
  height: 16px;
@@ -1109,26 +956,6 @@
1109
956
  flex: none;
1110
957
  }
1111
958
 
1112
- /* ── Side panel heads (components/SidePanelHead) ─────────────────────────
1113
- Every side panel's head is efficient-easel's `InspectorHead`; these two
1114
- are the pieces the website editor adds to it. The hairline parts a panel's
1115
- own tools from the hide button that ends every head, and a mode's way out
1116
- is a word ("Done", "Cancel") on the engine's ghost button, drawn to the
1117
- 28px of the head's icon buttons so the row keeps one height. */
1118
- .es-btn-ghost.sf-head-textbtn {
1119
- height: 28px;
1120
- padding: 0 10px;
1121
- font-size: 12.5px;
1122
- border-radius: 7px;
1123
- white-space: nowrap;
1124
- }
1125
-
1126
- /* ── Side panel heads (components/SidePanelHead) ─────────────────────────
1127
- Every side panel's head is efficient-easel's `InspectorHead`; these two
1128
- are the pieces the website editor adds to it. The hairline parts a panel's
1129
- own tools from the hide button that ends every head, and a mode's way out
1130
- is a word ("Done", "Cancel") on the engine's ghost button, drawn to the
1131
- 28px of the head's icon buttons so the row keeps one height. */
1132
959
  /* A hidden side panel's strip (components/SidePanelHead `PanelShowStrip`):
1133
960
  one Show panel button where the panel was. It IS a side panel — the
1134
961
  engine's `.es-sidepanel--left|right` gives it the panels' ground and the