efficient-web-builder 6.0.0 → 7.1.1

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 (118) hide show
  1. package/CHANGELOG.md +238 -0
  2. package/README.md +42 -0
  3. package/dist/components/ApplyCornersToSiblings.js +1 -1
  4. package/dist/components/Banner.js +1 -1
  5. package/dist/components/BlockGapField.js +1 -1
  6. package/dist/components/BlogPostSource.js +1 -1
  7. package/dist/components/Breadcrumb.js +1 -1
  8. package/dist/components/CardShadowField.js +1 -1
  9. package/dist/components/CategoryBar.js +1 -1
  10. package/dist/components/ChatSettingsPanel.js +1 -1
  11. package/dist/components/ClearColoursDialog.js +1 -1
  12. package/dist/components/CornersField.js +1 -1
  13. package/dist/components/DocBody.js +5 -5
  14. package/dist/components/DuplicateToPageMenu.js +1 -1
  15. package/dist/components/FAQ.js +1 -1
  16. package/dist/components/Flex.js +1 -1
  17. package/dist/components/Footprint.js +3 -3
  18. package/dist/components/HeroImageField.js +1 -1
  19. package/dist/components/HeroSection.js +2 -2
  20. package/dist/components/HeroSingle.js +1 -1
  21. package/dist/components/HeroSlide.js +1 -1
  22. package/dist/components/HoverEffectField.js +1 -1
  23. package/dist/components/ImageFocusRow.js +1 -1
  24. package/dist/components/IntegrationsSection.js +1 -1
  25. package/dist/components/IntroBleed.js +1 -1
  26. package/dist/components/KeyFeatures.js +1 -1
  27. package/dist/components/LocationsGroupedField.js +1 -1
  28. package/dist/components/MediaUploadField.js +1 -1
  29. package/dist/components/MultiSelectField.js +1 -1
  30. package/dist/components/PagesPanel.js +1 -1
  31. package/dist/components/PartInkControl.js +1 -1
  32. package/dist/components/PartResetDot.js +1 -1
  33. package/dist/components/PartSettingsPanel.js +1 -1
  34. package/dist/components/PartTextBox.js +1 -1
  35. package/dist/components/PhotographyField.js +1 -1
  36. package/dist/components/ProcessSteps.js +1 -1
  37. package/dist/components/SearchSelectField.d.ts +1 -1
  38. package/dist/components/SearchSelectField.js +1 -1
  39. package/dist/components/SectionEditor.js +1 -1
  40. package/dist/components/SectionTextEntries.js +1 -1
  41. package/dist/components/SectionThemePicker.js +1 -1
  42. package/dist/components/Series.js +1 -1
  43. package/dist/components/ShadowColourField.js +1 -1
  44. package/dist/components/SideSpaceField.js +1 -1
  45. package/dist/components/SiteFields.js +1 -1
  46. package/dist/components/SiteWidthField.js +1 -1
  47. package/dist/components/SlotChildRows.js +1 -1
  48. package/dist/components/SocialLinksPanel.js +1 -1
  49. package/dist/components/SourceStatus.js +1 -1
  50. package/dist/components/SpecStrip.js +1 -1
  51. package/dist/components/Split.js +1 -1
  52. package/dist/components/StandaloneSectionEditor.js +1 -1
  53. package/dist/components/StatsParagraph.js +1 -1
  54. package/dist/components/StorefrontLinkField.js +1 -1
  55. package/dist/components/StylesPanel.js +1 -1
  56. package/dist/components/SwitchToBoxFooter.js +1 -1
  57. package/dist/components/Testimonials.js +1 -1
  58. package/dist/components/TextStyleRow.js +1 -1
  59. package/dist/components/TextStylesField.js +1 -1
  60. package/dist/components/ThemeCard.js +1 -1
  61. package/dist/components/ThemeColourField.js +1 -1
  62. package/dist/components/ThemeField.js +1 -1
  63. package/dist/components/TickerSection.js +1 -1
  64. package/dist/components/TickerSettingsPanel.js +1 -1
  65. package/dist/components/TitleWithButtons.js +1 -1
  66. package/dist/components/WebsiteScreenParts.js +1 -1
  67. package/dist/components/WebsiteSettingsPanel.js +1 -1
  68. package/dist/components/WidthFollowField.js +1 -1
  69. package/dist/components/preview-devices.js +1 -1
  70. package/dist/components/storefront-editor.css +93 -123
  71. package/dist/components/useLocationsTree.js +1 -1
  72. package/dist/lib/content/ink.d.ts +36 -0
  73. package/dist/lib/content/ink.js +1 -0
  74. package/dist/lib/content/section-surface.js +1 -1
  75. package/dist/lib/editor-words-catalogue.d.ts +1178 -0
  76. package/dist/lib/editor-words-catalogue.js +11 -0
  77. package/dist/lib/editor-words.d.ts +15 -0
  78. package/dist/lib/editor-words.js +1 -0
  79. package/dist/lib/links/link-picker-setup.js +1 -1
  80. package/dist/lib/page-rows.d.ts +8 -0
  81. package/dist/lib/page-rows.js +1 -0
  82. package/dist/lib/puck/ColourControl.js +1 -1
  83. package/dist/lib/puck/MarkupToolbar.js +1 -1
  84. package/dist/lib/puck/apply-card-corners.js +1 -1
  85. package/dist/lib/puck/blocks/general/Breadcrumb/render.js +1 -1
  86. package/dist/lib/puck/blocks/general/Cards/render.js +1 -1
  87. package/dist/lib/puck/blocks/general/CategoryBar/render.js +1 -1
  88. package/dist/lib/puck/blocks/general/Chart/render.js +2 -2
  89. package/dist/lib/puck/blocks/general/DocBody/render.js +1 -1
  90. package/dist/lib/puck/blocks/general/DocMasthead/render.js +1 -1
  91. package/dist/lib/puck/blocks/general/DocTabs/render.js +1 -1
  92. package/dist/lib/puck/blocks/general/FAQ/render.js +1 -1
  93. package/dist/lib/puck/blocks/general/Footprint/render.js +2 -2
  94. package/dist/lib/puck/blocks/general/KeyFeatures/render.js +1 -1
  95. package/dist/lib/puck/blocks/general/Logos/render.js +1 -1
  96. package/dist/lib/puck/blocks/general/Masthead/render.js +1 -1
  97. package/dist/lib/puck/blocks/general/OrderSummary/render.js +1 -1
  98. package/dist/lib/puck/blocks/general/PaymentBadges/render.js +1 -1
  99. package/dist/lib/puck/blocks/general/ProcessSteps/render.js +1 -1
  100. package/dist/lib/puck/blocks/general/Series/render.js +1 -1
  101. package/dist/lib/puck/blocks/general/StatsParagraph/render.js +1 -1
  102. package/dist/lib/puck/blocks/general/Testimonials/render.js +1 -1
  103. package/dist/lib/puck/blocks/general/Timeline/render.js +2 -2
  104. package/dist/lib/puck/blocks/general/TimelineTrack/render.js +1 -1
  105. package/dist/lib/puck/blocks/scaffold.js +1 -1
  106. package/dist/lib/puck/controls.js +1 -1
  107. package/dist/lib/puck/footer-block-row-name.js +1 -1
  108. package/dist/lib/puck/page-root-fields.js +1 -1
  109. package/dist/lib/puck/theme-swatches.js +1 -1
  110. package/dist/lib/source-rules/editor-words.d.ts +26 -0
  111. package/dist/lib/source-rules/editor-words.js +3 -0
  112. package/dist/lib/source-rules/mirrored-rows-agree.js +1 -1
  113. package/dist/lib/source-rules/part-style-naming.js +1 -1
  114. package/dist/lib/source-rules/support/label-extraction.js +2 -2
  115. package/dist/lib/theme-save-message.js +1 -1
  116. package/package.json +6 -5
  117. package/dist/components/HeadingAudit.d.ts +0 -1
  118. package/dist/components/HeadingAudit.js +0 -1
@@ -101,7 +101,7 @@
101
101
  margin: 0;
102
102
  min-width: 0;
103
103
  overflow: hidden;
104
- font-size: 11px;
104
+ font-size: var(--text-2xs);
105
105
  font-weight: 500;
106
106
  color: var(--sf-muted);
107
107
  white-space: nowrap;
@@ -138,7 +138,7 @@
138
138
  display: flex;
139
139
  align-items: center;
140
140
  justify-content: center;
141
- font-size: 14px;
141
+ font-size: var(--text-sm);
142
142
  }
143
143
  .sf-x:hover {
144
144
  background: var(--sf-hover);
@@ -222,7 +222,7 @@
222
222
  round said it plainly — 「右边那一行不能先删」 — get the order backwards and a
223
223
  merchant loses a route.
224
224
  `.sf-plus` is untouched; both of its rules are scoped to other buttons
225
- (`.sf-add-card .sf-plus`) and `PagesPanel` / `AddChildRow` still render it. */
225
+ (`.sf-add-card .sf-plus`) and `AddChildRow` still renders it. */
226
226
 
227
227
  /* ── "Add section" seam between two tree rows ──────────────────────────────
228
228
  A slim hover target sitting in the gap between rows; on hover (or keyboard
@@ -268,7 +268,7 @@
268
268
  display: flex;
269
269
  align-items: center;
270
270
  justify-content: center;
271
- font-size: 14px;
271
+ font-size: var(--text-sm);
272
272
  line-height: 1;
273
273
  box-shadow: 0 0 0 2px var(--sf-panel);
274
274
  opacity: 0;
@@ -356,7 +356,7 @@
356
356
  padding: 0;
357
357
  border: 0;
358
358
  background: none;
359
- font: 600 12.5px/1.3 var(--sf-font);
359
+ font: 600 var(--text-xs)/1.3 var(--sf-font);
360
360
  color: var(--sf-text);
361
361
  text-align: left;
362
362
  cursor: pointer;
@@ -366,7 +366,7 @@
366
366
  }
367
367
  .sf-addside-sitewide-desc {
368
368
  font-weight: 400;
369
- font-size: 11.5px;
369
+ font-size: var(--text-xs);
370
370
  color: var(--sf-muted);
371
371
  }
372
372
 
@@ -385,7 +385,7 @@
385
385
  }
386
386
  .sf-box-footer-switch-text {
387
387
  margin: 0;
388
- font-size: 12px;
388
+ font-size: var(--text-xs);
389
389
  line-height: 1.45;
390
390
  color: var(--sf-muted);
391
391
  }
@@ -502,12 +502,12 @@
502
502
  color: var(--sf-on-accent);
503
503
  border-radius: var(--radius-lg);
504
504
  padding: 8px 14px;
505
- font-size: 12.5px;
505
+ font-size: var(--text-xs);
506
506
  font-weight: 600;
507
507
  box-shadow: 0 4px 12px var(--sf-accent-shadow);
508
508
  }
509
509
  .sf-addcard-plus {
510
- font-size: 15px;
510
+ font-size: var(--text-base);
511
511
  line-height: 1;
512
512
  margin-top: -1px;
513
513
  }
@@ -518,12 +518,12 @@
518
518
  padding: 0 2px 2px;
519
519
  }
520
520
  .sf-addcard-name {
521
- font-size: 12.5px;
521
+ font-size: var(--text-xs);
522
522
  font-weight: 600;
523
523
  color: var(--sf-text);
524
524
  }
525
525
  .sf-addcard-desc {
526
- font-size: 10.5px;
526
+ font-size: var(--text-2xs);
527
527
  line-height: 1.35;
528
528
  color: var(--sf-muted);
529
529
  }
@@ -548,13 +548,10 @@
548
548
  height: 30px;
549
549
  }
550
550
  .sf-addempty-title {
551
- font-size: 14px;
551
+ font-size: var(--text-sm);
552
552
  font-weight: 600;
553
553
  color: var(--sf-text);
554
554
  }
555
- .sf-addempty-sub {
556
- font-size: 12.5px;
557
- }
558
555
 
559
556
  /* ── Center: device-framed preview (wraps Puck.Preview) ──────────────── */
560
557
  .sf-frame--tablet,
@@ -925,7 +922,7 @@
925
922
  came to hang 6px OUTSIDE the panel at every width under 280 (measured: gap
926
923
  -6.0px at 260 and at 220, against 0.0 at the default 320). One name, read
927
924
  by the padding, by the narrow override, and by anything that undoes it. */
928
- --sf-insp-pad-x: 14px;
925
+ --sf-insp-pad-x: var(--space-16);
929
926
  padding: 4px var(--sf-insp-pad-x) 18px;
930
927
 
931
928
  /* THE DROPDOWN ARROW, WRITTEN ONCE — card 66399.c.
@@ -946,7 +943,12 @@
946
943
  --sf-select-arrow: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100' fill='%23c3c3c3'><polygon points='0,0 100,0 50,50'/></svg>");
947
944
  }
948
945
 
949
- /* …AND THE 14 IS A DIFFERENT COST AT EACH END OF A PANEL THE MERCHANT DRAGS
946
+ /* 2026-10-13: THE WIDE PADDING IS 16, AND THE LINE 284. 14 was off the
947
+ spacing scale (Lewis 2026-10-12: 2 / 4 / 8 / 12 / 16 …) and a value off it
948
+ goes UP. The content width card 66212 protects stays 241px; at 16 each side
949
+ that needs a 285px panel, so the query below reads `< 284px`. The note that
950
+ follows is card 66212's own, written at 14.
951
+ …AND THE 14 IS A DIFFERENT COST AT EACH END OF A PANEL THE MERCHANT DRAGS
950
952
  (card 66212). One number, held at every width from 220 to 560:
951
953
 
952
954
  320px default 308 client (1px seam + 11px scrollbar) − 28 = 280 content
@@ -986,11 +988,11 @@
986
988
  and 10 has nothing to spare, and type is paid vertically as well — card 66206
987
989
  has just set the row rhythm to 16px, which shrinking type would hand straight
988
990
  back. The padding was the horizontal cost, so the padding is what moved. */
989
- @container (width < 280px) {
991
+ @container (width < 284px) {
990
992
  .sf-insp-body {
991
993
  /* The TOKEN, not `padding-inline` — so everything that reads the padding
992
994
  narrows with it, instead of only the padding itself. */
993
- --sf-insp-pad-x: 8px;
995
+ --sf-insp-pad-x: var(--space-8);
994
996
  }
995
997
  }
996
998
 
@@ -1004,7 +1006,7 @@
1004
1006
  background: var(--sf-field-bg);
1005
1007
  border-radius: var(--sf-field-radius);
1006
1008
  padding: 8px 11px;
1007
- font-size: 13px;
1009
+ font-size: var(--text-sm);
1008
1010
  color: var(--sf-field-text);
1009
1011
  font-family: var(--sf-font);
1010
1012
  }
@@ -1105,7 +1107,7 @@
1105
1107
  background-position: calc(100% - 12px) calc(50% + 3px);
1106
1108
  border-radius: var(--sf-field-radius);
1107
1109
  padding: 8px 11px;
1108
- font-size: 13px;
1110
+ font-size: var(--text-sm);
1109
1111
  color: var(--sf-field-text);
1110
1112
  cursor: pointer;
1111
1113
  }
@@ -1177,7 +1179,7 @@
1177
1179
  background: var(--sf-field-bg);
1178
1180
  border-radius: var(--sf-field-radius);
1179
1181
  padding: 8px 11px;
1180
- font-size: 13px;
1182
+ font-size: var(--text-sm);
1181
1183
  font-family: var(--sf-font);
1182
1184
  color: var(--sf-field-text);
1183
1185
  text-align: left;
@@ -1189,7 +1191,7 @@
1189
1191
  box-shadow: 0 0 0 3px var(--sf-accent-ring);
1190
1192
  }
1191
1193
  .sf-multi-caret {
1192
- font-size: 10px;
1194
+ font-size: var(--text-2xs);
1193
1195
  color: var(--sf-text-secondary);
1194
1196
  flex: none;
1195
1197
  }
@@ -1277,7 +1279,7 @@
1277
1279
  .sf-secttheme-oncard {
1278
1280
  margin: 0;
1279
1281
  padding: 5px 4px 7px;
1280
- font-size: 11px;
1282
+ font-size: var(--text-2xs);
1281
1283
  line-height: 1.4;
1282
1284
  color: var(--sf-text-secondary);
1283
1285
  }
@@ -1391,7 +1393,7 @@
1391
1393
  border: 0;
1392
1394
  background: transparent;
1393
1395
  border-radius: max(calc(var(--sf-field-radius) - 2px), 2px);
1394
- font-size: 13px;
1396
+ font-size: var(--text-sm);
1395
1397
  font-family: var(--sf-font);
1396
1398
  color: var(--sf-field-text);
1397
1399
  text-align: left;
@@ -1433,7 +1435,7 @@
1433
1435
  padding: 6px 9px;
1434
1436
  background: var(--sf-field-bg);
1435
1437
  border-bottom: 1px solid var(--sf-input-border);
1436
- font-size: 12px;
1438
+ font-size: var(--text-xs);
1437
1439
  font-weight: 600;
1438
1440
  color: var(--sf-field-text);
1439
1441
  }
@@ -1443,7 +1445,7 @@
1443
1445
  border: 0;
1444
1446
  background: transparent;
1445
1447
  color: var(--sf-text-secondary);
1446
- font-size: 11px;
1448
+ font-size: var(--text-2xs);
1447
1449
  font-family: var(--sf-font);
1448
1450
  cursor: pointer;
1449
1451
  }
@@ -1468,7 +1470,7 @@
1468
1470
  padding: 7px 9px;
1469
1471
  border-top: 1px solid var(--sf-input-border);
1470
1472
  background: var(--sf-accent-ring);
1471
- font-size: 11px;
1473
+ font-size: var(--text-2xs);
1472
1474
  line-height: 1.4;
1473
1475
  color: var(--sf-text-secondary);
1474
1476
  }
@@ -1541,7 +1543,7 @@
1541
1543
  border: none;
1542
1544
  background: transparent;
1543
1545
  font-family: var(--sf-font);
1544
- font-size: 13px;
1546
+ font-size: var(--text-sm);
1545
1547
  color: var(--sf-text);
1546
1548
  outline: none;
1547
1549
  }
@@ -1584,23 +1586,26 @@
1584
1586
  .sf-pgroup-label {
1585
1587
  flex: 1;
1586
1588
  text-align: left;
1587
- font-size: 11px;
1589
+ font-size: var(--text-2xs);
1588
1590
  font-weight: 700;
1589
1591
  letter-spacing: 0.4px;
1590
1592
  text-transform: uppercase;
1591
1593
  }
1592
1594
  .sf-pgroup-count {
1593
1595
  flex: none;
1594
- font-size: 11px;
1596
+ font-size: var(--text-2xs);
1595
1597
  font-weight: 600;
1596
1598
  color: var(--sf-muted);
1597
1599
  background: var(--sf-track-bg);
1598
1600
  border-radius: 999px;
1599
1601
  padding: 1px 7px;
1600
1602
  }
1603
+ /* 4 between rows, the shell Tree's own row gap, so a hovered row next to the
1604
+ selected one is two rounded shapes, never one block (Lewis, 2026-10-14). */
1601
1605
  .sf-pgroup-body {
1602
1606
  display: flex;
1603
1607
  flex-direction: column;
1608
+ gap: var(--space-4);
1604
1609
  }
1605
1610
  /* Page rows reuse .sf-row; anchors (Cart/Checkout) reset link chrome. */
1606
1611
  .sf-prow {
@@ -1609,7 +1614,7 @@
1609
1614
  }
1610
1615
  .sf-page-draft {
1611
1616
  flex: none;
1612
- font-size: 10px;
1617
+ font-size: var(--text-2xs);
1613
1618
  font-weight: 600;
1614
1619
  color: var(--sf-muted);
1615
1620
  text-transform: uppercase;
@@ -1621,7 +1626,7 @@
1621
1626
  .sf-badge-dynamic,
1622
1627
  .sf-badge-lightbox {
1623
1628
  flex: none;
1624
- font-size: 9px;
1629
+ font-size: var(--text-3xs);
1625
1630
  font-weight: 700;
1626
1631
  letter-spacing: 0.3px;
1627
1632
  text-transform: uppercase;
@@ -1670,7 +1675,7 @@
1670
1675
  /* "Preview" pill on Cart / Checkout — signals "opens the live page, view-only". */
1671
1676
  .sf-badge-preview {
1672
1677
  flex: none;
1673
- font-size: 9px;
1678
+ font-size: var(--text-3xs);
1674
1679
  font-weight: 700;
1675
1680
  letter-spacing: 0.3px;
1676
1681
  text-transform: uppercase;
@@ -1679,26 +1684,6 @@
1679
1684
  color: var(--sf-warning);
1680
1685
  background: var(--sf-preview-tint);
1681
1686
  }
1682
- .sf-pages-new {
1683
- flex: none;
1684
- margin: 6px 10px 10px;
1685
- display: flex;
1686
- align-items: center;
1687
- justify-content: center;
1688
- gap: 6px;
1689
- padding: 9px;
1690
- border: 1px dashed var(--sf-line);
1691
- border-radius: var(--sf-row-radius);
1692
- background: transparent;
1693
- color: var(--sf-accent-text);
1694
- font-family: var(--sf-font);
1695
- font-size: 13px;
1696
- font-weight: 600;
1697
- cursor: pointer;
1698
- }
1699
- .sf-pages-new:hover {
1700
- background: var(--sf-hover);
1701
- }
1702
1687
 
1703
1688
  /* ── Layers rows (redesign 2b) ──────────────────────────────────────────
1704
1689
  The Layers tree's rows are editor-shell's `TreeRow` (efficient-easel/tree.css):
@@ -1744,14 +1729,6 @@
1744
1729
  gap: 2px;
1745
1730
  }
1746
1731
 
1747
- /* The relocated heading-outline tool sits muted at the bottom of the tree. */
1748
- .sf-tree-tool {
1749
- margin-top: 14px;
1750
- /* The left inset is the tree's 11px column, not `.sf-tree`'s padding — that
1751
- is 0 on this side now so the bars can bleed. */
1752
- padding: 10px 0 0 11px;
1753
- }
1754
-
1755
1732
  /* `.sf-field-section` AND `.sf-field-group` WERE HERE, and they are gone on
1756
1733
  purpose (card 66300). They were the panel's two heading tiers — a 12px label
1757
1734
  over a 1.5px rule, and a 10.5px label over a 1px one — and the rules are what
@@ -2011,7 +1988,7 @@
2011
1988
  }
2012
1989
  .sf-field-label {
2013
1990
  display: block;
2014
- font-size: 12px;
1991
+ font-size: var(--text-xs);
2015
1992
  font-weight: 500;
2016
1993
  color: var(--sf-text-secondary);
2017
1994
  /* WITHIN one setting: its label to its own control. This gap is the only
@@ -2146,7 +2123,7 @@
2146
2123
  background: var(--sf-chip-bg);
2147
2124
  border-radius: var(--sf-field-radius);
2148
2125
  padding: 8px 11px;
2149
- font-size: 13px;
2126
+ font-size: var(--text-sm);
2150
2127
  color: var(--sf-text-secondary);
2151
2128
  font-family: var(--sf-font);
2152
2129
  cursor: default;
@@ -2270,7 +2247,7 @@
2270
2247
  /* The style's NAME — Highlight / Bold / Quiet. Padded so two of them do not
2271
2248
  read as one word, and never wrapped mid-name. */
2272
2249
  padding: 0 6px;
2273
- font-size: 11px;
2250
+ font-size: var(--text-2xs);
2274
2251
  line-height: 1;
2275
2252
  white-space: nowrap;
2276
2253
  }
@@ -2419,7 +2396,7 @@
2419
2396
  box-shadow: 0 0 0 2px var(--sf-panel), 0 0 0 4px var(--sf-accent);
2420
2397
  }
2421
2398
  .sf-swatch-hex {
2422
- font-size: 11px;
2399
+ font-size: var(--text-2xs);
2423
2400
  color: var(--sf-muted);
2424
2401
  font-variant-numeric: tabular-nums;
2425
2402
  margin-left: 2px;
@@ -2454,7 +2431,7 @@
2454
2431
  width: 4.75rem;
2455
2432
  }
2456
2433
  .sf-colour-caption {
2457
- font-size: 12px;
2434
+ font-size: var(--text-xs);
2458
2435
  color: var(--sf-muted);
2459
2436
  white-space: nowrap;
2460
2437
  }
@@ -2517,7 +2494,7 @@
2517
2494
  border-radius: var(--sf-field-radius);
2518
2495
  background: var(--sf-field-bg);
2519
2496
  color: var(--sf-field-text);
2520
- font-size: 13px;
2497
+ font-size: var(--text-sm);
2521
2498
  text-align: left;
2522
2499
  cursor: pointer;
2523
2500
  }
@@ -2537,7 +2514,7 @@
2537
2514
  so it reads quieter than everything else on the row. */
2538
2515
  .sf-chooser-meta {
2539
2516
  flex: none;
2540
- font-size: 10px;
2517
+ font-size: var(--text-2xs);
2541
2518
  text-transform: uppercase;
2542
2519
  letter-spacing: 0.05em;
2543
2520
  color: var(--sf-disabled);
@@ -2573,7 +2550,7 @@
2573
2550
  border: 0;
2574
2551
  background: none;
2575
2552
  text-align: left;
2576
- font-size: 13px;
2553
+ font-size: var(--text-sm);
2577
2554
  color: var(--sf-text-secondary);
2578
2555
  cursor: pointer;
2579
2556
  }
@@ -2619,7 +2596,7 @@
2619
2596
  border-radius: var(--sf-field-radius);
2620
2597
  background: var(--sf-field-bg);
2621
2598
  color: var(--sf-text-secondary);
2622
- font-size: 12px;
2599
+ font-size: var(--text-xs);
2623
2600
  cursor: pointer;
2624
2601
  }
2625
2602
  .sf-rung:hover:not(.is-active) {
@@ -2689,12 +2666,12 @@
2689
2666
  /* The small and large A flanking a size slider. */
2690
2667
  .sf-scale-a {
2691
2668
  flex: none;
2692
- font-size: 11px;
2669
+ font-size: var(--text-2xs);
2693
2670
  line-height: 1;
2694
2671
  color: var(--sf-disabled);
2695
2672
  }
2696
2673
  .sf-scale-a--lg {
2697
- font-size: 15px;
2674
+ font-size: var(--text-base);
2698
2675
  color: var(--sf-muted);
2699
2676
  }
2700
2677
  /* The "Auto" button that clears an optional number back to the built-in. */
@@ -2703,7 +2680,7 @@
2703
2680
  border: 1px solid var(--sf-input-border);
2704
2681
  border-radius: var(--sf-field-radius);
2705
2682
  background: var(--sf-field-bg);
2706
- font-size: 11px;
2683
+ font-size: var(--text-2xs);
2707
2684
  color: var(--sf-text-secondary);
2708
2685
  cursor: pointer;
2709
2686
  }
@@ -2793,7 +2770,7 @@
2793
2770
  between tabs does not have to learn how to read a second kind of row. */
2794
2771
  .sf-style-name {
2795
2772
  flex: none;
2796
- font-size: 11px;
2773
+ font-size: var(--text-2xs);
2797
2774
  font-weight: 600;
2798
2775
  color: var(--sf-muted);
2799
2776
  }
@@ -2871,7 +2848,7 @@
2871
2848
  border-radius: var(--sf-field-radius);
2872
2849
  background: var(--sf-field-bg);
2873
2850
  color: var(--sf-text);
2874
- font-size: 12px;
2851
+ font-size: var(--text-xs);
2875
2852
  cursor: pointer;
2876
2853
  }
2877
2854
  /* A rung showing a LETTERFORM rather than a word -- the B and the I. It is the
@@ -2879,7 +2856,7 @@
2879
2856
  glyph and it keeps its accessible name in `aria-label`. */
2880
2857
  .sf-rung--glyph {
2881
2858
  flex: 0 0 34px;
2882
- font-size: 13px;
2859
+ font-size: var(--text-sm);
2883
2860
  line-height: 18px;
2884
2861
  text-align: center;
2885
2862
  }
@@ -2989,7 +2966,7 @@
2989
2966
  line-height: 1;
2990
2967
  }
2991
2968
  .sf-theme-headline {
2992
- font-size: 14px;
2969
+ font-size: var(--text-sm);
2993
2970
  font-weight: 750;
2994
2971
  letter-spacing: -0.01em;
2995
2972
  line-height: 1.1;
@@ -3044,7 +3021,7 @@
3044
3021
  }
3045
3022
  .sf-theme-card.is-selected .sf-theme-foot { color: var(--sf-accent-text); }
3046
3023
  .sf-theme-name {
3047
- font-size: 11px;
3024
+ font-size: var(--text-2xs);
3048
3025
  font-weight: 700;
3049
3026
  min-width: 0;
3050
3027
  overflow: hidden;
@@ -3058,7 +3035,7 @@
3058
3035
  .sf-theme-warn {
3059
3036
  flex: none;
3060
3037
  margin-left: auto;
3061
- font-size: 10px;
3038
+ font-size: var(--text-2xs);
3062
3039
  font-weight: 700;
3063
3040
  color: var(--status-warning-soft-ink);
3064
3041
  white-space: nowrap;
@@ -3094,7 +3071,7 @@
3094
3071
  border: 0;
3095
3072
  background: none;
3096
3073
  font: inherit;
3097
- font-size: 12px;
3074
+ font-size: var(--text-xs);
3098
3075
  font-weight: 600;
3099
3076
  color: var(--sf-accent-text);
3100
3077
  padding: 4px 0;
@@ -3144,14 +3121,14 @@
3144
3121
  INSIDE one setting, and reading as a quieter copy of the row above them is
3145
3122
  what said they were the same thing. */
3146
3123
  .sf-colour-mode {
3147
- font-size: 12px;
3124
+ font-size: var(--text-xs);
3148
3125
  font-weight: 500;
3149
3126
  color: var(--sf-text-secondary);
3150
3127
  }
3151
3128
  .sf-colour-mode small {
3152
3129
  display: block;
3153
3130
  margin-top: 1px;
3154
- font-size: 11px;
3131
+ font-size: var(--text-2xs);
3155
3132
  font-weight: 400;
3156
3133
  color: var(--sf-muted);
3157
3134
  }
@@ -3162,20 +3139,12 @@
3162
3139
  border: 1px solid var(--sf-divider);
3163
3140
  border-radius: var(--sf-row-radius);
3164
3141
  }
3165
- .sf-readability-head {
3166
- margin-bottom: 7px;
3167
- font-size: 10px;
3168
- font-weight: 700;
3169
- letter-spacing: 0.06em;
3170
- text-transform: uppercase;
3171
- color: var(--sf-muted);
3172
- }
3173
3142
  .sf-readability-row {
3174
3143
  display: flex;
3175
3144
  align-items: center;
3176
3145
  gap: 9px;
3177
3146
  padding: 4px 0;
3178
- font-size: 12px;
3147
+ font-size: var(--text-xs);
3179
3148
  }
3180
3149
  .sf-readability-who {
3181
3150
  flex: 1;
@@ -3213,7 +3182,7 @@
3213
3182
 
3214
3183
  .sf-readability-advice {
3215
3184
  margin-top: 7px;
3216
- font-size: 11px;
3185
+ font-size: var(--text-2xs);
3217
3186
  line-height: 1.6;
3218
3187
  color: var(--sf-muted);
3219
3188
  }
@@ -3233,7 +3202,7 @@
3233
3202
  border-radius: var(--sf-field-radius);
3234
3203
  background: var(--sf-field-bg);
3235
3204
  color: var(--sf-btn-text);
3236
- font-size: 11px;
3205
+ font-size: var(--text-2xs);
3237
3206
  font-variant-numeric: tabular-nums;
3238
3207
  cursor: pointer;
3239
3208
  }
@@ -3348,12 +3317,12 @@
3348
3317
  min-width: 0;
3349
3318
  }
3350
3319
  .sf-preview-pin-label {
3351
- font-size: 13px;
3320
+ font-size: var(--text-sm);
3352
3321
  font-weight: 500;
3353
3322
  color: var(--sf-text);
3354
3323
  }
3355
3324
  .sf-preview-pin-hint {
3356
- font-size: 11px;
3325
+ font-size: var(--text-2xs);
3357
3326
  color: var(--sf-muted);
3358
3327
  }
3359
3328
 
@@ -3369,7 +3338,7 @@
3369
3338
  .sf-colstep-value {
3370
3339
  min-width: 14px;
3371
3340
  text-align: center;
3372
- font-size: 13px;
3341
+ font-size: var(--text-sm);
3373
3342
  font-weight: 500;
3374
3343
  color: var(--sf-text);
3375
3344
  }
@@ -3433,7 +3402,7 @@
3433
3402
  background: transparent;
3434
3403
  border-radius: var(--radius-md);
3435
3404
  padding: 6px 8px;
3436
- font-size: 12px;
3405
+ font-size: var(--text-xs);
3437
3406
  font-weight: 500;
3438
3407
  color: var(--sf-icon);
3439
3408
  cursor: pointer;
@@ -3471,11 +3440,12 @@
3471
3440
  SCOPED TO THE NARROW PANEL, on the container card 66212 already put on
3472
3441
  `.sf-panel` — the same rule, one level down: that card paid the horizontal
3473
3442
  cost out of the body's padding, and this pays the rest out of the strip's.
3474
- Above 280px nothing changes, so all 23 `segmented()` call sites and the four
3443
+ Above 284px (280 until the body's padding went 14 → 16 on 2026-10-13: one
3444
+ edge, one number) nothing changes, so all 23 `segmented()` call sites and the four
3475
3445
  panels that draw their own label rows are byte-identical at every width where
3476
3446
  they already fit. A `.sf-seg2` that is not inside a `.sf-panel` matches no
3477
3447
  container and is untouched by construction. */
3478
- @container (width < 280px) {
3448
+ @container (width < 284px) {
3479
3449
  .sf-seg2 button {
3480
3450
  padding-inline: 6px;
3481
3451
  }
@@ -3597,7 +3567,7 @@ input.sf-list-marking {
3597
3567
  }
3598
3568
  .sf-blogsource-status {
3599
3569
  margin: 0;
3600
- font-size: 12px;
3570
+ font-size: var(--text-xs);
3601
3571
  color: var(--sf-text-secondary);
3602
3572
  }
3603
3573
  .sf-blogsource-status[data-state="error"] {
@@ -3643,7 +3613,7 @@ input.sf-list-marking {
3643
3613
  }
3644
3614
  .sf-formsummary-caption {
3645
3615
  margin-bottom: 4px;
3646
- font-size: 11px;
3616
+ font-size: var(--text-2xs);
3647
3617
  font-weight: 600;
3648
3618
  letter-spacing: 0.02em;
3649
3619
  color: var(--sf-text-secondary);
@@ -3651,13 +3621,13 @@ input.sf-list-marking {
3651
3621
  .sf-formsummary-fields {
3652
3622
  margin: 0;
3653
3623
  padding-left: 18px;
3654
- font-size: 12px;
3624
+ font-size: var(--text-xs);
3655
3625
  line-height: 1.55;
3656
3626
  color: var(--sf-text-secondary);
3657
3627
  }
3658
3628
  .sf-formsummary-warn {
3659
3629
  margin: 0;
3660
- font-size: 11.5px;
3630
+ font-size: var(--text-xs);
3661
3631
  line-height: 1.45;
3662
3632
  color: var(--sf-danger);
3663
3633
  }
@@ -3675,7 +3645,7 @@ input.sf-list-marking {
3675
3645
  visible instead of nothing happening. */
3676
3646
  .sf-image-status {
3677
3647
  margin-top: 6px;
3678
- font-size: 11px;
3648
+ font-size: var(--text-2xs);
3679
3649
  color: var(--sf-muted);
3680
3650
  }
3681
3651
  .sf-image-status--error {
@@ -3701,7 +3671,7 @@ ul.sf-image-status {
3701
3671
  border: 1.5px dashed var(--sf-input-border);
3702
3672
  border-radius: var(--radius-lg);
3703
3673
  padding: 12px 14px;
3704
- font-size: 12px;
3674
+ font-size: var(--text-xs);
3705
3675
  line-height: 1.5;
3706
3676
  color: var(--sf-muted);
3707
3677
  background-image: repeating-linear-gradient(45deg, var(--sf-hatch) 0 1px, transparent 1px 12px);
@@ -3757,7 +3727,7 @@ ul.sf-image-status {
3757
3727
  same six classes wearing one name. */
3758
3728
  .sf-note {
3759
3729
  padding: 14px 16px;
3760
- font-size: 13px;
3730
+ font-size: var(--text-sm);
3761
3731
  line-height: 1.5;
3762
3732
  color: var(--sf-muted);
3763
3733
  }
@@ -3777,7 +3747,7 @@ ul.sf-image-status {
3777
3747
  sentence above it, so it reads as a footnote and not as an instruction. */
3778
3748
  .sf-note-detail {
3779
3749
  margin-top: 10px;
3780
- font-size: 11px;
3750
+ font-size: var(--text-2xs);
3781
3751
  color: var(--sf-muted);
3782
3752
  opacity: 0.75;
3783
3753
  word-break: break-all;
@@ -3845,7 +3815,7 @@ ul.sf-image-status {
3845
3815
  heading for the name below rather than as another name. */
3846
3816
  .sf-part-style-caption {
3847
3817
  margin-bottom: 2px;
3848
- font-size: 11px;
3818
+ font-size: var(--text-2xs);
3849
3819
  font-weight: 600;
3850
3820
  letter-spacing: 0.06em;
3851
3821
  text-transform: uppercase;
@@ -3853,13 +3823,13 @@ ul.sf-image-status {
3853
3823
  }
3854
3824
  .sf-part-style-count {
3855
3825
  margin-bottom: 3px;
3856
- font-size: 11px;
3826
+ font-size: var(--text-2xs);
3857
3827
  font-weight: 600;
3858
3828
  color: var(--sf-muted);
3859
3829
  }
3860
3830
  .sf-part-style-name {
3861
3831
  min-width: 0;
3862
- font-size: 20px;
3832
+ font-size: var(--text-xl);
3863
3833
  line-height: 1.15;
3864
3834
  letter-spacing: -0.01em;
3865
3835
  color: var(--sf-text-strong);
@@ -3908,7 +3878,7 @@ ul.sf-image-status {
3908
3878
  flex: none;
3909
3879
  text-align: center;
3910
3880
  color: var(--sf-muted);
3911
- font-size: 14px;
3881
+ font-size: var(--text-sm);
3912
3882
  line-height: 1;
3913
3883
  }
3914
3884
  .sf-part-style-trigger[aria-expanded="false"] .sf-part-style-sign::before {
@@ -3942,7 +3912,7 @@ ul.sf-image-status {
3942
3912
  background: none;
3943
3913
  text-align: left;
3944
3914
  /* E6 — a field label is never smaller than 12px, and an option is a label. */
3945
- font-size: 13px;
3915
+ font-size: var(--text-sm);
3946
3916
  color: var(--sf-field-text);
3947
3917
  border-radius: max(calc(var(--sf-field-radius) - 2px), 2px);
3948
3918
  cursor: pointer;
@@ -3986,13 +3956,13 @@ ul.sf-image-status {
3986
3956
  overflow: hidden;
3987
3957
  text-overflow: ellipsis;
3988
3958
  white-space: nowrap;
3989
- font-size: 11px;
3959
+ font-size: var(--text-2xs);
3990
3960
  font-weight: 400;
3991
3961
  color: var(--es-muted);
3992
3962
  }
3993
3963
  .sf-part-style-meta {
3994
3964
  margin-top: 1px;
3995
- font-size: 11px;
3965
+ font-size: var(--text-2xs);
3996
3966
  color: var(--sf-muted);
3997
3967
  font-variant-numeric: tabular-nums;
3998
3968
  }
@@ -4019,7 +3989,7 @@ ul.sf-image-status {
4019
3989
  it read at 13px and wrapped, taking "Edit style" over two lines with it. So
4020
3990
  it keeps its look exactly and takes an honest name. */
4021
3991
  .sf-part-style-state {
4022
- font-size: 11.5px;
3992
+ font-size: var(--text-xs);
4023
3993
  color: var(--sf-text-secondary);
4024
3994
  }
4025
3995
  /* The override count. A chip rather than plain text because it is a NUMBER a
@@ -4031,7 +4001,7 @@ ul.sf-image-status {
4031
4001
  padding: 2px 9px;
4032
4002
  background: var(--sf-accent-tint);
4033
4003
  color: var(--sf-accent-text);
4034
- font-size: 10.5px;
4004
+ font-size: var(--text-2xs);
4035
4005
  font-weight: 700;
4036
4006
  font-variant-numeric: tabular-nums;
4037
4007
  }
@@ -4043,7 +4013,7 @@ ul.sf-image-status {
4043
4013
  background: none;
4044
4014
  padding: 0;
4045
4015
  font: inherit;
4046
- font-size: 12px;
4016
+ font-size: var(--text-xs);
4047
4017
  font-weight: 500;
4048
4018
  color: var(--sf-accent-text);
4049
4019
  cursor: pointer;
@@ -4135,13 +4105,13 @@ ul.sf-image-status {
4135
4105
  gap: 8px;
4136
4106
  }
4137
4107
  .sf-part-ink-label {
4138
- font-size: 11px;
4108
+ font-size: var(--text-2xs);
4139
4109
  font-weight: 600;
4140
4110
  color: var(--sf-muted);
4141
4111
  }
4142
4112
  .sf-part-ink-read {
4143
4113
  margin-left: auto;
4144
- font-size: 12px;
4114
+ font-size: var(--text-xs);
4145
4115
  color: var(--sf-text-secondary);
4146
4116
  font-variant-numeric: tabular-nums;
4147
4117
  }
@@ -4225,7 +4195,7 @@ ul.sf-image-status {
4225
4195
  reads like the buckets above it. A real <h3>, so it joins the panel outline. */
4226
4196
  .sf-entries-head {
4227
4197
  margin: 14px 0 4px;
4228
- font-size: 11px;
4198
+ font-size: var(--text-2xs);
4229
4199
  font-weight: 600;
4230
4200
  letter-spacing: 0.06em;
4231
4201
  text-transform: uppercase;
@@ -4305,7 +4275,7 @@ ul.sf-image-status {
4305
4275
  background: var(--sf-field-bg);
4306
4276
  border-radius: 999px;
4307
4277
  padding: 4px 11px;
4308
- font-size: 11.5px;
4278
+ font-size: var(--text-xs);
4309
4279
  font-weight: 600;
4310
4280
  color: var(--sf-icon);
4311
4281
  cursor: pointer;
@@ -4428,7 +4398,7 @@ ul.sf-image-status {
4428
4398
 
4429
4399
  /* How many the filter left. Without it an empty-looking strip is a mystery. */
4430
4400
  .sf-gallery-count {
4431
- font-size: 10.5px;
4401
+ font-size: var(--text-2xs);
4432
4402
  color: var(--sf-disabled);
4433
4403
  margin-top: 7px;
4434
4404
  }