efficient-web-builder 21.0.0 → 22.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 (91) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/dist/components/AnimatedStat.js +1 -1
  3. package/dist/components/Banner.js +1 -1
  4. package/dist/components/Cards.js +1 -1
  5. package/dist/components/CategoryBar.js +1 -1
  6. package/dist/components/ChartSection.js +1 -1
  7. package/dist/components/Countdown.js +1 -1
  8. package/dist/components/DealerFinder.d.ts +12 -0
  9. package/dist/components/DealerFinder.js +1 -0
  10. package/dist/components/DocMasthead.js +1 -1
  11. package/dist/components/DocMetaCards.js +1 -1
  12. package/dist/components/DocTabs.js +1 -1
  13. package/dist/components/FeaturedCover.js +1 -1
  14. package/dist/components/Footprint.d.ts +8 -1
  15. package/dist/components/Footprint.js +5 -5
  16. package/dist/components/HeroPoster.d.ts +2 -1
  17. package/dist/components/HeroPoster.js +1 -1
  18. package/dist/components/HeroSingle.d.ts +3 -1
  19. package/dist/components/HeroSingle.js +4 -4
  20. package/dist/components/HeroSlide.d.ts +2 -1
  21. package/dist/components/HeroSlide.js +1 -1
  22. package/dist/components/ImageBlock.d.ts +2 -1
  23. package/dist/components/ImageBlock.js +1 -1
  24. package/dist/components/KeyFeatures.js +1 -1
  25. package/dist/components/LocationGroupHeader.js +1 -1
  26. package/dist/components/Logos.js +1 -1
  27. package/dist/components/LongRead.js +1 -1
  28. package/dist/components/Manifesto.js +1 -1
  29. package/dist/components/Masthead.js +1 -1
  30. package/dist/components/MediaUploadField.d.ts +3 -1
  31. package/dist/components/MediaUploadField.js +1 -1
  32. package/dist/components/MockupSection.js +1 -1
  33. package/dist/components/OrderSummary.js +1 -1
  34. package/dist/components/PagesPanel.js +1 -1
  35. package/dist/components/ParagraphsA.js +1 -1
  36. package/dist/components/PostCard.js +1 -1
  37. package/dist/components/ProcessSteps.js +1 -1
  38. package/dist/components/Prose.js +1 -1
  39. package/dist/components/SectionEyebrow.js +1 -1
  40. package/dist/components/SectionHeader.js +1 -1
  41. package/dist/components/Series.js +1 -1
  42. package/dist/components/SiteTextStylesField.js +1 -1
  43. package/dist/components/Split.js +1 -1
  44. package/dist/components/Stats.js +1 -1
  45. package/dist/components/StatsParagraph.js +1 -1
  46. package/dist/components/Testimonials.js +1 -1
  47. package/dist/components/Text.js +1 -1
  48. package/dist/components/ThemeField.js +1 -1
  49. package/dist/components/Timeline.js +1 -1
  50. package/dist/components/TimelineTrack.js +1 -1
  51. package/dist/components/WebsiteScreenParts.js +1 -1
  52. package/dist/components/storefront-editor.css +96 -271
  53. package/dist/components/useLocationsTree.js +1 -1
  54. package/dist/lib/content/phone-focus.d.ts +7 -0
  55. package/dist/lib/content/phone-focus.js +1 -0
  56. package/dist/lib/dealer-source.d.ts +34 -0
  57. package/dist/lib/dealer-source.js +1 -0
  58. package/dist/lib/editor-words-catalogue.d.ts +9 -5
  59. package/dist/lib/editor-words-catalogue.js +4 -4
  60. package/dist/lib/puck/MarkupToolbar.d.ts +1 -1
  61. package/dist/lib/puck/MarkupToolbar.js +1 -1
  62. package/dist/lib/puck/blocks/general/Footprint/fields.js +1 -1
  63. package/dist/lib/puck/blocks/general/Footprint/render.js +2 -2
  64. package/dist/lib/puck/blocks/general/HeroSingle/fields.js +1 -1
  65. package/dist/lib/puck/blocks/general/HeroSingle/render.js +1 -1
  66. package/dist/lib/puck/blocks/general/HeroSlide/fields.js +1 -1
  67. package/dist/lib/puck/blocks/general/HeroSlide/render.js +1 -1
  68. package/dist/lib/puck/blocks/general/ImageBlock/fields.js +1 -1
  69. package/dist/lib/puck/blocks/general/ImageBlock/render.js +1 -1
  70. package/dist/lib/puck/controls.d.ts +5 -2
  71. package/dist/lib/puck/controls.js +1 -1
  72. package/dist/lib/puck/field-groups.js +1 -1
  73. package/dist/lib/sections/collection-card-text-regions.d.ts +9 -1
  74. package/dist/lib/sections/collection-card-text-regions.js +1 -1
  75. package/dist/lib/sections/text-regions.d.ts +1 -0
  76. package/dist/lib/sections/text-regions.js +1 -1
  77. package/dist/lib/site-text-styles.d.ts +1 -0
  78. package/dist/lib/site-text-styles.js +2 -2
  79. package/dist/lib/source-rules/heading-ceiling-sweep.js +3 -3
  80. package/dist/lib/source-rules/part-style-naming.js +2 -2
  81. package/dist/lib/source-rules/rule.d.ts +1 -0
  82. package/dist/lib/source-rules/rule.js +3 -1
  83. package/dist/lib/source-rules/size-token-paints.js +4 -4
  84. package/dist/lib/source-rules/style-face-matches-size.js +3 -3
  85. package/package.json +7 -5
  86. package/dist/components/ImageFocusRow.d.ts +0 -7
  87. package/dist/components/ImageFocusRow.js +0 -1
  88. package/dist/components/TemplateGlyph.d.ts +0 -6
  89. package/dist/components/TemplateGlyph.js +0 -1
  90. package/dist/components/TextStyleRow.d.ts +0 -13
  91. package/dist/components/TextStyleRow.js +0 -1
@@ -89,7 +89,7 @@
89
89
  .sf-panel-heading {
90
90
  display: flex;
91
91
  align-items: baseline;
92
- gap: 6px;
92
+ gap: var(--space-8);
93
93
  min-width: 0;
94
94
  }
95
95
  /* The site's name, read-only. Quiet and small — it is context, not a setting,
@@ -125,7 +125,7 @@
125
125
  }
126
126
  .sf-panel-site::before {
127
127
  content: "·";
128
- margin-right: 6px;
128
+ margin-right: var(--space-8);
129
129
  }
130
130
  .sf-x {
131
131
  width: 24px;
@@ -258,7 +258,7 @@
258
258
  what makes the ladder read as one list at three depths rather than three
259
259
  lists. */
260
260
  margin: var(--es-rhythm-between) 0 var(--es-rhythm-between) 16px;
261
- padding-left: 9px;
261
+ padding-left: var(--space-12);
262
262
  border-left: 1px solid var(--sf-line);
263
263
  display: flex;
264
264
  flex-direction: column;
@@ -278,9 +278,9 @@
278
278
  .sf-addside-sitewide {
279
279
  display: flex;
280
280
  align-items: center;
281
- gap: 10px;
281
+ gap: var(--space-12);
282
282
  margin-top: 16px;
283
- padding: 10px;
283
+ padding: var(--space-12);
284
284
  border: 1px solid var(--sf-divider);
285
285
  border-radius: var(--radius-xl);
286
286
  }
@@ -421,11 +421,11 @@
421
421
  .sf-addcard-addbtn {
422
422
  display: inline-flex;
423
423
  align-items: center;
424
- gap: 6px;
424
+ gap: var(--space-8);
425
425
  background: var(--sf-accent);
426
426
  color: var(--sf-on-accent);
427
427
  border-radius: var(--radius-lg);
428
- padding: 8px 14px;
428
+ padding: var(--space-8) var(--space-16);
429
429
  font-size: var(--text-xs);
430
430
  font-weight: 600;
431
431
  box-shadow: 0 4px 12px var(--sf-accent-shadow);
@@ -458,7 +458,7 @@
458
458
  flex-direction: column;
459
459
  align-items: center;
460
460
  justify-content: center;
461
- gap: 9px;
461
+ gap: var(--space-12);
462
462
  padding: 64px 20px;
463
463
  text-align: center;
464
464
  color: var(--sf-muted);
@@ -876,7 +876,7 @@
876
876
  measured and set (card 66212, 2026-10-13). The token stays, as a name for
877
877
  that inset, because rules below read it to reach the panel's edge. */
878
878
  --sf-insp-pad-x: var(--es-insp-pad-x, var(--space-16));
879
- padding-block: 4px 18px;
879
+ padding-block: var(--space-4) var(--space-20);
880
880
 
881
881
  /* THE DROPDOWN ARROW, WRITTEN ONCE — card 66399.c.
882
882
  Read by `.sf-insp-body select` at rest AND by the hover rule beside it. The
@@ -973,7 +973,7 @@
973
973
  border: 1px solid var(--sf-input-border);
974
974
  background: var(--sf-field-bg);
975
975
  border-radius: var(--sf-field-radius);
976
- padding: 8px 11px;
976
+ padding: var(--space-8) var(--space-12);
977
977
  font-size: var(--text-sm);
978
978
  color: var(--sf-field-text);
979
979
  font-family: var(--sf-font);
@@ -1074,7 +1074,7 @@
1074
1074
  background-repeat: no-repeat;
1075
1075
  background-position: calc(100% - 12px) calc(50% + 3px);
1076
1076
  border-radius: var(--sf-field-radius);
1077
- padding: 8px 11px;
1077
+ padding: var(--space-8) var(--space-12);
1078
1078
  font-size: var(--text-sm);
1079
1079
  color: var(--sf-field-text);
1080
1080
  cursor: pointer;
@@ -1146,7 +1146,7 @@
1146
1146
  border: 1px solid var(--sf-input-border);
1147
1147
  background: var(--sf-field-bg);
1148
1148
  border-radius: var(--sf-field-radius);
1149
- padding: 8px 11px;
1149
+ padding: var(--space-8) var(--space-12);
1150
1150
  font-size: var(--text-sm);
1151
1151
  font-family: var(--sf-font);
1152
1152
  color: var(--sf-field-text);
@@ -1164,7 +1164,7 @@
1164
1164
  flex: none;
1165
1165
  }
1166
1166
  .sf-multi-menu {
1167
- margin: 6px 0 0;
1167
+ margin: var(--space-8) 0 0;
1168
1168
  padding: 4px;
1169
1169
  border: 1px solid var(--sf-input-border);
1170
1170
  border-radius: var(--sf-field-radius);
@@ -1233,7 +1233,7 @@
1233
1233
  flex: none;
1234
1234
  border: 0;
1235
1235
  background: none;
1236
- padding: 3px 2px 3px 6px;
1236
+ padding: var(--space-4) var(--space-2) var(--space-4) var(--space-8);
1237
1237
  font: inherit;
1238
1238
  line-height: 1;
1239
1239
  color: var(--sf-text-secondary);
@@ -1246,7 +1246,7 @@
1246
1246
  choose. */
1247
1247
  .sf-secttheme-oncard {
1248
1248
  margin: 0;
1249
- padding: 5px 4px 7px;
1249
+ padding: var(--space-8) var(--space-4) var(--space-8);
1250
1250
  font-size: var(--text-2xs);
1251
1251
  line-height: 1.4;
1252
1252
  color: var(--sf-text-secondary);
@@ -1355,9 +1355,9 @@
1355
1355
  .sf-secttheme-item {
1356
1356
  display: flex;
1357
1357
  align-items: center;
1358
- gap: 9px;
1358
+ gap: var(--space-12);
1359
1359
  width: 100%;
1360
- padding: 6px 7px;
1360
+ padding: var(--space-8) var(--space-8);
1361
1361
  border: 0;
1362
1362
  background: transparent;
1363
1363
  border-radius: max(calc(var(--sf-field-radius) - 2px), 2px);
@@ -1387,12 +1387,12 @@
1387
1387
  }
1388
1388
  .sf-secttheme-sep {
1389
1389
  height: 1px;
1390
- margin: 3px 0;
1390
+ margin: var(--space-4) 0;
1391
1391
  background: var(--sf-input-border);
1392
1392
  }
1393
1393
  /* ── The edit sheet ─────────────────────────────────────────────────────── */
1394
1394
  .sf-secttheme-sheet {
1395
- margin-top: 6px;
1395
+ margin-top: var(--space-8);
1396
1396
  border: 1px solid var(--sf-input-border);
1397
1397
  border-radius: var(--sf-field-radius);
1398
1398
  overflow: hidden;
@@ -1400,7 +1400,7 @@
1400
1400
  .sf-secttheme-sheet-head {
1401
1401
  display: flex;
1402
1402
  align-items: center;
1403
- padding: 6px 9px;
1403
+ padding: var(--space-8) var(--space-12);
1404
1404
  background: var(--sf-field-bg);
1405
1405
  border-bottom: 1px solid var(--sf-input-border);
1406
1406
  font-size: var(--text-xs);
@@ -1435,7 +1435,7 @@
1435
1435
  it. Drawn in the panel's own warning ink rather than a new colour. */
1436
1436
  .sf-secttheme-warn {
1437
1437
  margin: 0;
1438
- padding: 7px 9px;
1438
+ padding: var(--space-8) var(--space-12);
1439
1439
  border-top: 1px solid var(--sf-input-border);
1440
1440
  background: var(--sf-accent-ring);
1441
1441
  font-size: var(--text-2xs);
@@ -1501,7 +1501,7 @@
1501
1501
  it takes the tree's inset. Placement only; the note style itself is .sf-note. */
1502
1502
  .sf-pages > .sf-note {
1503
1503
  margin: 0 var(--space-12);
1504
- padding: 10px 12px;
1504
+ padding: var(--space-12);
1505
1505
  }
1506
1506
  .sf-pages > .sf-note--error {
1507
1507
  margin-top: var(--space-4);
@@ -1526,7 +1526,7 @@
1526
1526
  font-weight: 700;
1527
1527
  letter-spacing: 0.3px;
1528
1528
  text-transform: uppercase;
1529
- padding: 2px 7px;
1529
+ padding: var(--space-2) var(--space-8);
1530
1530
  border-radius: 999px;
1531
1531
  }
1532
1532
  .sf-badge-dynamic {
@@ -1548,7 +1548,7 @@
1548
1548
  font-weight: 700;
1549
1549
  letter-spacing: 0.3px;
1550
1550
  text-transform: uppercase;
1551
- padding: 2px 7px;
1551
+ padding: var(--space-2) var(--space-8);
1552
1552
  border-radius: 999px;
1553
1553
  color: var(--sf-warning);
1554
1554
  background: var(--sf-preview-tint);
@@ -1785,8 +1785,8 @@
1785
1785
  .sf-theme-colours .es-group-sub,
1786
1786
  .sf-secttheme-rows .es-group-sub {
1787
1787
  border-top: 1px solid var(--sf-line);
1788
- margin-top: 30px;
1789
- padding-top: 30px;
1788
+ margin-top: var(--space-32);
1789
+ padding-top: var(--space-32);
1790
1790
  /* Cancel the panel body's side padding, then put it back inside, so the rule
1791
1791
  reaches the panel edge while the words stay on the rows' left edge.
1792
1792
  ⚠️ READ FROM THE TOKEN, never typed. A literal `14px` here hung the line
@@ -1956,7 +1956,7 @@
1956
1956
  border: 1px solid var(--sf-input-border);
1957
1957
  background: var(--sf-chip-bg);
1958
1958
  border-radius: var(--sf-field-radius);
1959
- padding: 8px 11px;
1959
+ padding: var(--space-8) var(--space-12);
1960
1960
  font-size: var(--text-sm);
1961
1961
  color: var(--sf-text-secondary);
1962
1962
  font-family: var(--sf-font);
@@ -2018,121 +2018,20 @@
2018
2018
  opacity: 0.5;
2019
2019
  }
2020
2020
 
2021
- /* Formatting bar above a copy field — bold · italic · strike · highlight.
2021
+ /* Formatting bar above a copy field — bold · italic · strike, and Clear.
2022
2022
  Select words in the field, press a button; the button writes the markup the
2023
- renderer understands, so a merchant never types a delimiter. Sits between the
2024
- label row and the input, at the icon-button metrics the eye already uses, so a
2025
- copy field gains a row of chrome rather than a new visual language.
2026
- The buttons take their ink from the same tokens as every other inspector icon,
2027
- so light and dark both follow the panel — no colour is named here. */
2028
- /* ⚠️ THE ROW ITSELF IS `efficient-easel/copy`'s `MarkBar` NOW (`.es-copy-bar`), and
2029
- these rules are what keep it looking like the shop's. The shell dresses its
2030
- bar from `--es-*` with its own metrics; the inspector's bar has to belong to
2031
- the inspector. Same rule, two skins — the split the two editors already make.
2032
-
2033
- `.sf-markup` — the container class this repo's own bar carried — is GONE from
2034
- these selectors, because nothing renders it any more (swept: no `"sf-markup"`
2035
- class in app / components / lib). `.sf-markup-btn` went too: the Clear
2036
- button is the shell's `IconButton` (harness UI-24), with the shell's own
2037
- metrics, hover and :disabled look. */
2038
- .sf-copybox > .es-copy-bar,
2039
- .es-list-above > .es-copy-bar {
2040
- display: flex;
2041
- align-items: center;
2042
- gap: 2px;
2043
- /* ZERO, and it is the shell's 4px being neutralised rather than a gap being
2044
- chosen. `copy.css` gives its bar a gap to the box below it, because in the
2045
- campaign designer the bar floats above a separately framed box. Here the
2046
- bar sits INSIDE the frame (card 8802.g) and the list column already spaces
2047
- its children — both places set 0, which is what the two rules further down
2048
- used to do one at a time. */
2049
- margin-bottom: 0;
2050
- }
2051
- /* ⚠️ THE BAR WRAPS, and it has to now that three of its buttons are WORDS.
2052
-
2053
- It was `nowrap` to reproduce the old `.sf-markup` exactly, which was right
2054
- while every button was a 24px glyph. Highlight / Bold / Quiet are names
2055
- (card: the three blank buttons), and three names do not share a line with
2056
- four glyphs and a Clear button in a narrow panel. Measured, `text` row:
2057
-
2058
- panel nowrap wrap
2059
- 320px Clear 6px inside 6px inside, one line
2060
- 220px Clear 12px OUTSIDE 6px inside, two lines
2061
- 181px Clear 51px OUTSIDE 6px inside, two lines
2062
-
2063
- So the wrap is not a preference: without it the fix for the blank buttons
2064
- would trade three unreadable buttons for an unreachable one. `copy.css`
2065
- already wraps; this rule now only exists to say why that is wanted here. */
2066
- .sf-copybox > .es-copy-bar,
2067
- .es-list-above > .es-copy-bar {
2068
- flex-wrap: wrap;
2069
- row-gap: 2px;
2070
- }
2071
- /* A button that draws a GLYPH is a square; a button that draws a WORD is as
2072
- wide as its word. `has-glyph` is the shell's own marker for the difference
2073
- (editor-shell 0.62.0), so the two cases are told apart by what they hold
2074
- rather than by a list of style names kept in step by hand. */
2075
- .sf-copybox .es-copy-mark.has-glyph,
2076
- .es-list-above .es-copy-mark.has-glyph {
2077
- width: 24px;
2078
- }
2079
- .sf-copybox .es-copy-mark:not(.has-glyph),
2080
- .es-list-above .es-copy-mark:not(.has-glyph) {
2081
- /* The style's NAME — Highlight / Bold / Quiet. Padded so two of them do not
2082
- read as one word, and never wrapped mid-name. */
2083
- padding: 0 6px;
2084
- font-size: var(--text-2xs);
2085
- line-height: 1;
2086
- white-space: nowrap;
2087
- }
2088
- /* A mark is the shell's IconButton since efficient-easel 1.0 (UI-24): its
2089
- ground, ink, hover, press, pressed (`aria-pressed`) and disabled looks are
2090
- the shell's. Only its height is this row's: the bar is 22px tall. */
2091
- .sf-copybox .es-copy-mark,
2092
- .es-list-above .es-copy-mark {
2093
- height: 22px;
2094
- }
2095
- /* The fifth button — clear formatting (card 8809) — pushed away from the four.
2096
- The four ADD a mark to a selection; this one TAKES every mark off the whole
2097
- field, so it does not stand shoulder to shoulder with them. This one rule is
2098
- the whole separation: `margin-left: auto` makes the bar's own `.es-divider-v`
2099
- eat the free space, which IS the flexible spacer, and carries the button after
2100
- it to the far end. No new class, no new line and no new colour — the divider
2101
- already draws itself in --sf-divider, and the button is the shell's
2102
- `IconButton`, with its metrics, its hover and its :disabled look.
2103
-
2104
- The height is the one adjustment: `.es-divider-v` is 22px for the 30px icon
2105
- buttons of the top toolbar, which in a 22px row would run edge to edge and
2106
- read as a wall rather than a seam. 14px matches the glyphs it separates. */
2107
- .sf-copybox > .es-copy-bar > .es-copy-bar-split,
2108
- .es-list-above > .es-copy-bar > .es-copy-bar-split {
2109
- margin-left: auto;
2110
- height: 14px;
2111
- }
2112
- /* ⚠️ AND THE AUTO MARGIN IS ON THE BUTTON TOO, not only on the divider.
2113
- `margin-left: auto` eats the free space of the line the item is ON. While
2114
- the bar was one line that was the same thing. Now that it wraps, the divider
2115
- can end line 1 while Clear starts line 2 — and Clear, with no auto margin of
2116
- its own, sat at the LEFT of that line. Measured at 181px: three rows, glyphs
2117
- / names / Clear, with Clear 135px from the right edge it is supposed to be
2118
- at. One declaration, and it is at the far end of whichever line it lands on. */
2119
- .sf-copybox > .es-copy-bar > .sf-markup-clear,
2120
- .es-list-above > .es-copy-bar > .sf-markup-clear {
2121
- margin-left: auto;
2122
- }
2123
- /* The shell's divider dressed as the shop's `.es-divider-v`: the same seam, so
2124
- the bar has ONE divider rather than the shell's plus a hand-rolled one.
2125
- NO COLOUR IS NAMED — copy.css already draws it in `--es-copy-rule`, which the
2126
- editor aliases onto its own border token, exactly as `.es-divider-v` drew
2127
- itself in `--es-divider`. A colour here would be a second answer. */
2128
- .sf-copybox > .es-copy-bar > .es-copy-bar-split,
2129
- .es-list-above > .es-copy-bar > .es-copy-bar-split {
2130
- align-self: center;
2131
- margin-right: 2px;
2132
- }
2023
+ renderer understands, so a merchant never types a delimiter.
2024
+ ⚠️ THE ROW IS THE SHELL'S `TextToolbar` (efficient-shell/ui, via
2025
+ `MarkupToolbar`; efficient-easel 11.5.0 retired `MarkBar`'s own bar). Its
2026
+ buttons, their size, ground, hover, pressed and :disabled looks, and where
2027
+ the Clear button sits (the toolbar's `last` cell) are the shell's (harness
2028
+ UI-24): no rule here dresses a button. What is the inspector's is only where
2029
+ the bar SITS: inside the copy box's frame, hidden at rest, dimmed with a
2030
+ hidden element. `MarkupToolbar` puts `sf-markup-bar` on the toolbar's
2031
+ wrapper, so these rules never name a shell class. */
2133
2032
  /* A hidden element's copy is still editable, so the bar dims with the input
2134
2033
  rather than disappearing — same cue, same reason as the input's 0.5. */
2135
- .es-field.is-hidden .es-copy-bar {
2034
+ .es-field.is-hidden .sf-markup-bar {
2136
2035
  opacity: 0.5;
2137
2036
  }
2138
2037
 
@@ -2164,9 +2063,9 @@
2164
2063
  hairline. --sf-hover is the panel's own faintest fill, the tint every other
2165
2064
  inspector control uses to say "chrome, not content", so no new colour and no
2166
2065
  literal is introduced here. */
2167
- .sf-copybox > .es-copy-bar {
2066
+ .sf-copybox > .sf-markup-bar {
2168
2067
  margin-bottom: 0;
2169
- padding: 3px 6px;
2068
+ padding: var(--space-4) var(--space-8);
2170
2069
  /* ⚠️ NOT a panel divider, and card 66334 deliberately left it. This hairline
2171
2070
  is INSIDE one control: it divides the formatting bar from the words, and it
2172
2071
  exists instead of giving the bar a second full frame -- which is the thing
@@ -2182,7 +2081,7 @@
2182
2081
  unmounted: the bar keeps its place in the markup, and a keyboard user who
2183
2082
  Shift+Tabs out of the words lands on its last button, which keeps the box
2184
2083
  focused and the bar shown. */
2185
- .sf-copybox:not(:focus-within) > .es-copy-bar {
2084
+ .sf-copybox:not(:focus-within) > .sf-markup-bar {
2186
2085
  display: none;
2187
2086
  }
2188
2087
  /* The input gives up its own frame to the wrapper. The `.sf-insp-body` +
@@ -2215,7 +2114,7 @@
2215
2114
  .sf-swatches {
2216
2115
  display: flex;
2217
2116
  align-items: center;
2218
- gap: 10px;
2117
+ gap: var(--space-12);
2219
2118
  }
2220
2119
  .sf-swatch {
2221
2120
  width: 26px;
@@ -2252,7 +2151,7 @@
2252
2151
  .sf-colour {
2253
2152
  display: inline-flex;
2254
2153
  align-items: center;
2255
- gap: 6px;
2154
+ gap: var(--space-8);
2256
2155
  min-width: 0;
2257
2156
  }
2258
2157
  .es-field-head > .sf-colour {
@@ -2315,7 +2214,7 @@
2315
2214
  width: 100%;
2316
2215
  align-items: center;
2317
2216
  gap: 8px;
2318
- padding: 6px 10px;
2217
+ padding: var(--space-8) var(--space-12);
2319
2218
  border: 1px solid var(--sf-input-border);
2320
2219
  border-radius: var(--sf-field-radius);
2321
2220
  background: var(--sf-field-bg);
@@ -2372,7 +2271,7 @@
2372
2271
  width: 100%;
2373
2272
  align-items: center;
2374
2273
  gap: 8px;
2375
- padding: 6px 10px;
2274
+ padding: var(--space-8) var(--space-12);
2376
2275
  border: 0;
2377
2276
  background: none;
2378
2277
  text-align: left;
@@ -2460,7 +2359,7 @@
2460
2359
  merchant's settings, so it must not read as loudly as the rows above it. */
2461
2360
  .sf-hints {
2462
2361
  display: flex;
2463
- margin-top: 28px;
2362
+ margin-top: var(--space-32);
2464
2363
  }
2465
2364
  /* A rung that is not part of a strip: it sizes to its own word rather than
2466
2365
  sharing a row, so the `flex: 1` every rung takes has to come back off. */
@@ -2468,7 +2367,7 @@
2468
2367
  display: inline-flex;
2469
2368
  flex: none;
2470
2369
  align-items: center;
2471
- gap: 5px;
2370
+ gap: var(--space-8);
2472
2371
  color: var(--sf-muted);
2473
2372
  }
2474
2373
  .sf-hints-toggle svg {
@@ -2503,7 +2402,7 @@
2503
2402
  }
2504
2403
  /* The "Auto" button that clears an optional number back to the built-in. */
2505
2404
  .sf-auto-reset {
2506
- padding: 2px 6px;
2405
+ padding: var(--space-2) var(--space-8);
2507
2406
  border: 1px solid var(--sf-input-border);
2508
2407
  border-radius: var(--sf-field-radius);
2509
2408
  background: var(--sf-field-bg);
@@ -2570,7 +2469,7 @@
2570
2469
  width: 100%;
2571
2470
  align-items: center;
2572
2471
  gap: 8px;
2573
- padding: 10px 0;
2472
+ padding: var(--space-12) 0;
2574
2473
  background: none;
2575
2474
  border: 0;
2576
2475
  text-align: left;
@@ -2670,7 +2569,7 @@
2670
2569
  /* The face picker -- a native select, so the platform draws the list, the
2671
2570
  keyboard works and a phone gets its own wheel. */
2672
2571
  .sf-select {
2673
- padding: 5px 8px;
2572
+ padding: var(--space-8) var(--space-8);
2674
2573
  border: 1px solid var(--sf-input-border);
2675
2574
  border-radius: var(--sf-field-radius);
2676
2575
  background: var(--sf-field-bg);
@@ -2783,7 +2682,7 @@
2783
2682
  display: flex;
2784
2683
  flex-direction: column;
2785
2684
  gap: 4px;
2786
- padding: 10px 12px;
2685
+ padding: var(--space-12) var(--space-12);
2787
2686
  }
2788
2687
  .sf-theme-eyebrow {
2789
2688
  font-size: 7.5px;
@@ -2811,14 +2710,14 @@
2811
2710
  .sf-theme-row {
2812
2711
  display: flex;
2813
2712
  align-items: center;
2814
- gap: 7px;
2713
+ gap: var(--space-8);
2815
2714
  margin-top: 1px;
2816
2715
  }
2817
2716
  .sf-theme-btn {
2818
2717
  font-size: 8.5px;
2819
2718
  font-weight: 700;
2820
2719
  letter-spacing: 0.02em;
2821
- padding: 5px 11px;
2720
+ padding: var(--space-8) var(--space-12);
2822
2721
  border-radius: var(--radius-sm);
2823
2722
  white-space: nowrap;
2824
2723
  flex: none;
@@ -2843,7 +2742,7 @@
2843
2742
  align-items: center;
2844
2743
  justify-content: space-between;
2845
2744
  gap: 8px;
2846
- padding: 5px 8px 6px 12px;
2745
+ padding: var(--space-8) var(--space-8) var(--space-8) var(--space-12);
2847
2746
  background: var(--sf-hover);
2848
2747
  }
2849
2748
  .sf-theme-card.is-selected .sf-theme-foot { color: var(--sf-accent-text); }
@@ -2893,7 +2792,7 @@
2893
2792
  .sf-theme-add {
2894
2793
  display: flex;
2895
2794
  align-items: center;
2896
- gap: 6px;
2795
+ gap: var(--space-8);
2897
2796
  margin-top: 8px;
2898
2797
  border: 0;
2899
2798
  background: none;
@@ -2919,12 +2818,12 @@
2919
2818
  around them is what says the three belong together: they are one decision. */
2920
2819
  .sf-colour-lede {
2921
2820
  margin-top: -3px;
2922
- margin-bottom: 10px;
2821
+ margin-bottom: var(--space-12);
2923
2822
  }
2924
2823
  .sf-colour-pair {
2925
2824
  border: 1px solid var(--sf-divider);
2926
2825
  border-radius: var(--sf-row-radius);
2927
- padding: 2px 11px 11px;
2826
+ padding: var(--space-2) var(--space-12) var(--space-12);
2928
2827
  background: var(--sf-app-bg);
2929
2828
  }
2930
2829
  /* The rows sit inside a card that already spaces them, so they set their own
@@ -2934,7 +2833,7 @@
2934
2833
  sub-row inside one setting's card has no business borrowing the class that
2935
2834
  sets the distance between two settings. Copied exactly — nothing moves. */
2936
2835
  .sf-colour-row {
2937
- margin-top: 9px;
2836
+ margin-top: var(--space-12);
2938
2837
  display: flex;
2939
2838
  align-items: center;
2940
2839
  justify-content: space-between;
@@ -2961,15 +2860,15 @@
2961
2860
  }
2962
2861
 
2963
2862
  .sf-readability {
2964
- margin-top: 10px;
2965
- padding: 11px 12px 12px;
2863
+ margin-top: var(--space-12);
2864
+ padding: var(--space-12) var(--space-12) var(--space-12);
2966
2865
  border: 1px solid var(--sf-divider);
2967
2866
  border-radius: var(--sf-row-radius);
2968
2867
  }
2969
2868
  .sf-readability-row {
2970
2869
  display: flex;
2971
2870
  align-items: center;
2972
- gap: 9px;
2871
+ gap: var(--space-12);
2973
2872
  padding: 4px 0;
2974
2873
  font-size: var(--text-xs);
2975
2874
  }
@@ -3008,7 +2907,7 @@
3008
2907
  .sf-readability-val.is-hard { color: var(--sf-danger); }
3009
2908
 
3010
2909
  .sf-readability-advice {
3011
- margin-top: 7px;
2910
+ margin-top: var(--space-8);
3012
2911
  font-size: var(--text-2xs);
3013
2912
  line-height: 1.6;
3014
2913
  color: var(--sf-muted);
@@ -3016,15 +2915,15 @@
3016
2915
  .sf-readability-suggestions {
3017
2916
  display: flex;
3018
2917
  flex-wrap: wrap;
3019
- gap: 6px;
2918
+ gap: var(--space-8);
3020
2919
  margin-top: 8px;
3021
2920
  }
3022
2921
  .sf-readability-suggestion {
3023
2922
  display: inline-flex;
3024
2923
  align-items: center;
3025
- gap: 5px;
2924
+ gap: var(--space-8);
3026
2925
  height: 26px;
3027
- padding: 0 9px;
2926
+ padding: 0 var(--space-12);
3028
2927
  border: 1px solid var(--sf-input-border);
3029
2928
  border-radius: var(--sf-field-radius);
3030
2929
  background: var(--sf-field-bg);
@@ -3135,13 +3034,13 @@
3135
3034
  justify-content: space-between;
3136
3035
  gap: 12px;
3137
3036
  flex: none;
3138
- padding: 9px 14px;
3037
+ padding: var(--space-12) var(--space-16);
3139
3038
  background: var(--sf-panel);
3140
3039
  }
3141
3040
  .sf-preview-pin-text {
3142
3041
  display: flex;
3143
3042
  flex-direction: column;
3144
- gap: 1px;
3043
+ gap: var(--space-2);
3145
3044
  min-width: 0;
3146
3045
  }
3147
3046
  .sf-preview-pin-label {
@@ -3161,7 +3060,7 @@
3161
3060
  .sf-colstep {
3162
3061
  display: flex;
3163
3062
  align-items: center;
3164
- gap: 6px;
3063
+ gap: var(--space-8);
3165
3064
  }
3166
3065
  .sf-colstep-value {
3167
3066
  min-width: 14px;
@@ -3219,18 +3118,18 @@
3219
3118
  /* Segmented */
3220
3119
  .sf-seg2 {
3221
3120
  display: flex;
3222
- gap: 3px;
3121
+ gap: var(--space-4);
3223
3122
  background: var(--sf-track-bg);
3224
3123
  border: 1px solid var(--sf-input-border);
3225
3124
  border-radius: var(--radius-lg);
3226
- padding: 3px;
3125
+ padding: var(--space-4);
3227
3126
  }
3228
3127
  .sf-seg2 button {
3229
3128
  flex: 1;
3230
3129
  border: none;
3231
3130
  background: transparent;
3232
3131
  border-radius: var(--radius-md);
3233
- padding: 6px 8px;
3132
+ padding: var(--space-8) var(--space-8);
3234
3133
  font-size: var(--text-xs);
3235
3134
  font-weight: 500;
3236
3135
  color: var(--sf-icon);
@@ -3276,7 +3175,7 @@
3276
3175
  container and is untouched by construction. */
3277
3176
  @container (width < 284px) {
3278
3177
  .sf-seg2 button {
3279
- padding-inline: 6px;
3178
+ padding-inline: var(--space-8);
3280
3179
  }
3281
3180
  }
3282
3181
 
@@ -3374,7 +3273,7 @@
3374
3273
  The row the bar is aimed at has to stay visible AFTER the caret leaves — the
3375
3274
  merchant clicks the bar, which takes the focus ring off the row — so the cue
3376
3275
  is painted rather than borrowed from :focus. Accent tokens only. */
3377
- .es-list-above > .es-copy-bar {
3276
+ .es-list-above > .sf-markup-bar {
3378
3277
  margin-bottom: 0;
3379
3278
  }
3380
3279
  input.sf-list-marking {
@@ -3387,7 +3286,7 @@ input.sf-list-marking {
3387
3286
  .sf-blogsource {
3388
3287
  display: flex;
3389
3288
  flex-direction: column;
3390
- gap: 9px;
3289
+ gap: var(--space-12);
3391
3290
  }
3392
3291
  /* The shell's Button in the column (SourceStatus): its own width, not the
3393
3292
  column's. Placement only; the look is the shell's (harness UI-24). */
@@ -3438,7 +3337,7 @@ input.sf-list-marking {
3438
3337
  .sf-formpicker {
3439
3338
  display: flex;
3440
3339
  flex-direction: column;
3441
- gap: 9px;
3340
+ gap: var(--space-12);
3442
3341
  }
3443
3342
  .sf-formsummary-caption {
3444
3343
  margin-bottom: 4px;
@@ -3449,7 +3348,7 @@ input.sf-list-marking {
3449
3348
  }
3450
3349
  .sf-formsummary-fields {
3451
3350
  margin: 0;
3452
- padding-left: 18px;
3351
+ padding-left: var(--space-20);
3453
3352
  font-size: var(--text-xs);
3454
3353
  line-height: 1.55;
3455
3354
  color: var(--sf-text-secondary);
@@ -3466,32 +3365,10 @@ input.sf-list-marking {
3466
3365
  gap: 8px;
3467
3366
  }
3468
3367
 
3469
- /* THE MEDIA ROW IS efficient-easel's `ImageBox` since blueprint step 4.8
3470
- (`es-pick-image-*`, efficient-easel/pick.css): the picture, its name under
3471
- it, Replace and Remove. What stays here is the shop's own around it — the
3472
- drop's live regions and the template's inert slot. */
3473
- /* Loading / error line under the slot, so a slow or failed picker round-trip is
3474
- visible instead of nothing happening. */
3475
- .sf-image-status {
3476
- margin-top: 6px;
3477
- font-size: var(--text-2xs);
3478
- color: var(--sf-muted);
3479
- }
3480
- .sf-image-status--error {
3481
- color: var(--sf-danger);
3482
- }
3483
- /* The shell's FileIntakeAlert renders a dropped file's rejection as a list whose
3484
- items carry the kit's own light-theme utilities (text-xs text-red-600). Inside
3485
- the editor they read the slot's status line instead, so a rejection flips with
3486
- the editor theme like the error line above it. */
3487
- ul.sf-image-status {
3488
- list-style: none;
3489
- padding: 0;
3490
- }
3491
- .sf-image-status--error li {
3492
- color: inherit;
3493
- font-size: inherit;
3494
- }
3368
+ /* THE MEDIA ROW IS efficient-easel's `ImageBox`, which since easel 12 IS the
3369
+ shell's MediaUploadField (efficient-shell #528): the picture with its Change
3370
+ image bar and bin, its own drop intake and its own announcements. What
3371
+ stays here is the shop's own: the template's inert slot. */
3495
3372
  /* Shown in place of the media slot above when the open document can't hold
3496
3373
  media (a template): the same dashed frame, plainly not a button. It is the
3497
3374
  SLOT in its inert state, not a note — it was only ever counted as one
@@ -3499,39 +3376,13 @@ ul.sf-image-status {
3499
3376
  .sf-image-slot-inert {
3500
3377
  border: 1.5px dashed var(--sf-input-border);
3501
3378
  border-radius: var(--radius-lg);
3502
- padding: 12px 14px;
3379
+ padding: var(--space-12) var(--space-16);
3503
3380
  font-size: var(--text-xs);
3504
3381
  line-height: 1.5;
3505
3382
  color: var(--sf-muted);
3506
3383
  background-image: repeating-linear-gradient(45deg, var(--sf-hatch) 0 1px, transparent 1px 12px);
3507
3384
  }
3508
3385
 
3509
- /* ── The image FOCUS point (card 66226) ──────────────────────────────────────
3510
- WHICH PART OF A BACKGROUND IMAGE SURVIVES ITS CROP, as any point on the
3511
- picture rather than as one of nine. The `Image focus` row opens (the shared
3512
- .sf-style-head grammar, see components/ImageFocusRow.tsx) onto
3513
- efficient-shell's `ImageFocusPoint`, which draws the whole photograph, the
3514
- dot and its crosshair with the kit's own classes (efficient-shell#375); no
3515
- rule here styles it.
3516
-
3517
- ⚠️ THE MEDIA ROW'S OWN FRAME IS NOT RESTYLED, EVER. `.es-pick-image-frame`
3518
- stays `cover` because that is what the PAGE will look like, and that
3519
- is its job. The focus part is a second frame, on screen only while a
3520
- merchant is actually setting the point, because a `cover` view cannot
3521
- express a point it has already cropped away.
3522
-
3523
- THE PHOTOGRAPH IS NEVER ON SCREEN TWICE. The 96px crop belongs to the
3524
- Background image field and the focus row belongs to `imageFocal` — two
3525
- sibling Puck fields, which cannot reach each other from React — so the crop
3526
- stands down for as long as the part is open (its root carries
3527
- `data-image-focus`), and comes back the moment it closes. The `:has()` on
3528
- Puck's own field wrapper is this stylesheet's established idiom for exactly
3529
- that problem (see the `[data-sf-bucket]` and `[data-sf-no-control]` rules
3530
- above). */
3531
- .es-insp-rows:has([data-image-focus]) .es-pick-image-frame {
3532
- display: none;
3533
- }
3534
-
3535
3386
  /* ── The note (card 66121) ───────────────────────────────────────────────────
3536
3387
  THE chrome's quiet sentence: what a panel says when it has something to tell
3537
3388
  the merchant and nothing to let them edit. A whole-panel stand-in for
@@ -3555,7 +3406,7 @@ ul.sf-image-status {
3555
3406
  `--wide` / `--tight` pair here, because a family of padding variants is the
3556
3407
  same six classes wearing one name. */
3557
3408
  .sf-note {
3558
- padding: 14px 16px;
3409
+ padding: var(--space-16) var(--space-16);
3559
3410
  font-size: var(--text-sm);
3560
3411
  line-height: 1.5;
3561
3412
  color: var(--sf-muted);
@@ -3575,7 +3426,7 @@ ul.sf-image-status {
3575
3426
  screenshot, and a screenshot carries no console. Quieter and smaller than the
3576
3427
  sentence above it, so it reads as a footnote and not as an instruction. */
3577
3428
  .sf-note-detail {
3578
- margin-top: 10px;
3429
+ margin-top: var(--space-12);
3579
3430
  font-size: var(--text-2xs);
3580
3431
  color: var(--sf-muted);
3581
3432
  opacity: 0.75;
@@ -3617,7 +3468,7 @@ ul.sf-image-status {
3617
3468
  the other six. The clip existed only to round the 3px accent edge below,
3618
3469
  which now rounds itself. */
3619
3470
  margin: 0 0 4px;
3620
- padding: 11px 13px;
3471
+ padding: var(--space-12) var(--space-16);
3621
3472
  border: 1px solid var(--sf-divider);
3622
3473
  border-radius: var(--radius-xl);
3623
3474
  background: var(--sf-track-bg);
@@ -3651,7 +3502,7 @@ ul.sf-image-status {
3651
3502
  color: var(--sf-muted);
3652
3503
  }
3653
3504
  .sf-part-style-count {
3654
- margin-bottom: 3px;
3505
+ margin-bottom: var(--space-4);
3655
3506
  font-size: var(--text-2xs);
3656
3507
  font-weight: 600;
3657
3508
  color: var(--sf-muted);
@@ -3736,7 +3587,7 @@ ul.sf-image-status {
3736
3587
  align-items: baseline;
3737
3588
  gap: 8px;
3738
3589
  width: 100%;
3739
- padding: 7px 9px;
3590
+ padding: var(--space-8) var(--space-12);
3740
3591
  border: 0;
3741
3592
  background: none;
3742
3593
  text-align: left;
@@ -3798,7 +3649,7 @@ ul.sf-image-status {
3798
3649
  .sf-part-style-top {
3799
3650
  display: flex;
3800
3651
  align-items: center;
3801
- gap: 9px;
3652
+ gap: var(--space-12);
3802
3653
  margin-top: 8px;
3803
3654
  }
3804
3655
  /* Pushes "Edit style" to the end whatever sits before it — a note, or the chip
@@ -3827,7 +3678,7 @@ ul.sf-image-status {
3827
3678
  display: inline-flex;
3828
3679
  align-items: center;
3829
3680
  border-radius: 999px;
3830
- padding: 2px 9px;
3681
+ padding: var(--space-2) var(--space-12);
3831
3682
  background: var(--sf-accent-tint);
3832
3683
  color: var(--sf-accent-text);
3833
3684
  font-size: var(--text-2xs);
@@ -3885,7 +3736,7 @@ ul.sf-image-status {
3885
3736
  reads as belonging to something above them. The BOX only — the colour, the
3886
3737
  size and the line-height stay the one note style's (card 66211). */
3887
3738
  .sf-slot-rows > .sf-note {
3888
- padding: 10px 11px 12px;
3739
+ padding: var(--space-12) var(--space-12) var(--space-12);
3889
3740
  }
3890
3741
 
3891
3742
  /* A value that reads "style" is not a measurement, so it is drawn as quietly as
@@ -3948,7 +3799,7 @@ ul.sf-image-status {
3948
3799
  display: flex;
3949
3800
  flex-wrap: wrap;
3950
3801
  align-items: center;
3951
- gap: 6px;
3802
+ gap: var(--space-8);
3952
3803
  }
3953
3804
 
3954
3805
  /* The override mark, half two — and it IS the reset button, which is why it is
@@ -4023,7 +3874,7 @@ ul.sf-image-status {
4023
3874
  /* The group's caption — the section panel's small-caps heading, so this group
4024
3875
  reads like the buckets above it. A real <h3>, so it joins the panel outline. */
4025
3876
  .sf-entries-head {
4026
- margin: 14px 0 4px;
3877
+ margin: var(--space-16) 0 var(--space-4);
4027
3878
  font-size: var(--text-2xs);
4028
3879
  font-weight: 600;
4029
3880
  letter-spacing: 0.06em;
@@ -4056,29 +3907,10 @@ ul.sf-image-status {
4056
3907
  repo's override of it — so matching it means drawing NOTHING, and the padding
4057
3908
  above is the whole of what this rule still owns. */
4058
3909
  .sf-slot-rows .sf-add-card {
4059
- padding: 8px 11px;
3910
+ padding: var(--space-8) var(--space-12);
4060
3911
  border-radius: 0;
4061
3912
  }
4062
3913
 
4063
- /* The drop zone round the media row's box. `SettingsField` puts its control in
4064
- `.es-field-ctl`, a flex ROW, where a plain block shrinks to its content: the
4065
- empty slot drew 190px wide in a 280px row. It takes the row instead. */
4066
- .sf-image-drop {
4067
- flex: 1;
4068
- min-width: 0;
4069
- }
4070
- /* Drag-over highlight for the media row (MediaUploadField's drop shortcut):
4071
- the empty slot takes the accent, a filled picture an accent ring. */
4072
- .sf-image-drop.is-dragover .es-pick-image-slot {
4073
- border-color: var(--sf-accent);
4074
- background-color: var(--sf-accent-tint);
4075
- }
4076
- .sf-image-drop.is-dragover .es-pick-image-frame {
4077
- outline: 2px solid var(--sf-accent);
4078
- outline-offset: -2px;
4079
- }
4080
-
4081
-
4082
3914
  /* ── THE PHOTO WALL'S LAYOUT PICKER ─────────────────────────────────────────
4083
3915
  The Customer Photo Grid's one layout control: a strip of pictures, filtered by
4084
3916
  how many photos sit in a row. The owner, 2026-09-07, on the numbers it
@@ -4096,14 +3928,14 @@ ul.sf-image-status {
4096
3928
  nothing is cut off and nothing scrolls sideways at either width. */
4097
3929
  .sf-gallery-filter {
4098
3930
  display: flex;
4099
- gap: 5px;
3931
+ gap: var(--space-8);
4100
3932
  flex-wrap: wrap;
4101
3933
  }
4102
3934
  .sf-gallery-filter button {
4103
3935
  border: 1px solid var(--sf-input-border);
4104
3936
  background: var(--sf-field-bg);
4105
3937
  border-radius: 999px;
4106
- padding: 4px 11px;
3938
+ padding: var(--space-4) var(--space-12);
4107
3939
  font-size: var(--text-xs);
4108
3940
  font-weight: 600;
4109
3941
  color: var(--sf-icon);
@@ -4124,7 +3956,7 @@ ul.sf-image-status {
4124
3956
  header's country picker became its third row). What stays here is where the
4125
3957
  strip sits in this panel: the line of space under the row's name. */
4126
3958
  .sf-gallery-layouts {
4127
- margin-top: 7px;
3959
+ margin-top: var(--space-8);
4128
3960
  }
4129
3961
  /* ⚠️ THE STRIP MUST BE TOLD TO FILL THE SHELL'S CONTROL SLOT, OR IT COLLAPSES.
4130
3962
  editor-shell card 66516, and the shop is now the second consumer to meet it.
@@ -4205,7 +4037,7 @@ ul.sf-image-status {
4205
4037
  .sf-gallery-count {
4206
4038
  font-size: var(--text-2xs);
4207
4039
  color: var(--sf-disabled);
4208
- margin-top: 7px;
4040
+ margin-top: var(--space-8);
4209
4041
  }
4210
4042
 
4211
4043
  /* ── Side panel heads (components/SidePanelHead) ─────────────────────────
@@ -4255,13 +4087,6 @@ ul.sf-image-status {
4255
4087
  min-width: 0;
4256
4088
  }
4257
4089
 
4258
- /* The focal-point picker's row is TextStyleRow's disclosure row, not a
4259
- SettingsField; this keeps the gap above it that its old bare `.sf-field`
4260
- wrapper gave, from the same rhythm token. */
4261
- .sf-focal-row {
4262
- margin-top: var(--es-rhythm-between);
4263
- }
4264
-
4265
4090
  /* The notice for a page whose header and footer could not load
4266
4091
  (components/PinnedChromeLoadNotice, 16.0.1), floating over the top of the
4267
4092
  canvas — the preview host is `position: relative` — so the frame keeps its