efficient-easel 0.97.0 → 0.98.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 (50) hide show
  1. package/README.md +2 -2
  2. package/dist/autosave/index.d.ts +4 -4
  3. package/dist/{buckets-1vRlQceY.d.ts → buckets-CuLM47h9.d.ts} +1 -1
  4. package/dist/chrome/chrome.css +25 -16
  5. package/dist/chrome/index.d.ts +6 -6
  6. package/dist/chrome/index.js +6 -6
  7. package/dist/chunk-2UX75JDP.js +1 -0
  8. package/dist/{chunk-STFMZJKU.js → chunk-66CKSTXP.js} +6 -6
  9. package/dist/{chunk-YIMRTIBN.js → chunk-IBOFSS56.js} +1 -1
  10. package/dist/chunk-PI26YXYD.js +462 -0
  11. package/dist/copy/copy.css +5 -5
  12. package/dist/copy/index.d.ts +5 -5
  13. package/dist/copy/index.js +10 -10
  14. package/dist/drag/drag.css +15 -15
  15. package/dist/drag/index.js +5 -5
  16. package/dist/edit-lock/index.d.ts +1 -1
  17. package/dist/editor/index.d.ts +2 -2
  18. package/dist/fields/fields.css +126 -12
  19. package/dist/fields/index.d.ts +59 -11
  20. package/dist/fields/index.js +40 -33
  21. package/dist/gold/index.d.ts +1 -1
  22. package/dist/icons/index.d.ts +26 -5
  23. package/dist/icons/index.js +1 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/menu/menu.css +4 -4
  27. package/dist/node-ops/index.js +1 -1
  28. package/dist/panel/index.d.ts +10 -10
  29. package/dist/panel/panel.css +34 -25
  30. package/dist/pick/pick.css +8 -8
  31. package/dist/rail/index.d.ts +2 -2
  32. package/dist/rail/index.js +1 -1
  33. package/dist/rail/rail.css +1 -1
  34. package/dist/render/index.d.ts +1 -1
  35. package/dist/shell/index.d.ts +24 -4
  36. package/dist/shell/index.js +1 -1
  37. package/dist/shell/shell.css +12 -2
  38. package/dist/strings/catalogue.d.ts +4 -4
  39. package/dist/strings/index.d.ts +4 -4
  40. package/dist/style-clipboard/index.js +1 -1
  41. package/dist/tree/index.d.ts +1 -1
  42. package/dist/tree/index.js +1 -1
  43. package/dist/tree/tree.css +11 -11
  44. package/dist/{types-CEqUFH2j.d.ts → types-C7HFvdtk.d.ts} +26 -4
  45. package/dist/{types-CuNiSnX6.d.ts → types-CnRzp9oc.d.ts} +1 -1
  46. package/dist/{words-CsRWXkY4.d.ts → words-Cqmyey0s.d.ts} +2 -2
  47. package/dist/{words-DfxEp_RH.d.ts → words-bOMsUJk9.d.ts} +1 -1
  48. package/package.json +1 -1
  49. package/dist/chunk-FI23ALVJ.js +0 -1
  50. package/dist/chunk-YNZZYHA4.js +0 -450
@@ -7,13 +7,15 @@
7
7
  * dark mode.
8
8
  *
9
9
  * Two details are deliberate and were decided by measurement, not taste:
10
- * · rows sit 38px apart while a label sits 11px from its own control, so a
10
+ * · rows sit 32px apart while a label sits 12px from its own control, so a
11
11
  * setting reads as ONE thing with air around it. That inside gap is the
12
12
  * ONLY thing saying which label owns which control, and the two are a
13
13
  * RATIO rather than a pair of numbers: measured at 28 and 7 (card 8802.d,
14
- * approved from mockups/8802e-settings-spacing-mockup.html) and re-scaled
15
- * together to 38 and 11 (card 66301), which keeps the gap between settings
16
- * 3.5x the gap inside one;
14
+ * approved from mockups/8802e-settings-spacing-mockup.html), re-scaled
15
+ * together to 38 and 11 (card 66301, 3.5x), and moved onto the ONE
16
+ * spacing scale as 32 and 12 (owner ruling 2026-10-02). The rule that
17
+ * survives every re-scale: the gap between settings stays at least TWICE
18
+ * the gap inside one. On the scale it is 8:3, about 2.7x;
17
19
  * · the label is small and grey, the value is larger and dark. Before that
18
20
  * contrast existed, a merchant could not tell a name from a number.
19
21
  */
@@ -85,7 +87,7 @@
85
87
  the storefront's Layers tree needs in order to "follow the shell's spacing"
86
88
  is the RHYTHM — 38 between two settings against 11 inside one. Under the floor
87
89
  those were bare literals, so the only way to follow them was to COPY them
88
- into `efficient-shop/components/storefront-editor.css`: a second source of
90
+ into `efficient-storefront/components/storefront-editor.css`: a second source of
89
91
  truth for numbers this sheet was already the source of.
90
92
 
91
93
  THE VALUES DID NOT CHANGE WHEN THEY WERE NAMED. Every one was the number
@@ -121,25 +123,32 @@
121
123
  shell.css 67/67 custom, panel.css 11/11, menu.css 7/7 — zero paint in all
122
124
  three. ⚠️ Nothing enforces it. If you are adding a declaration here, you are
123
125
  the check. */
126
+ /* ON THE ONE SCALE (owner ruling 2026-10-02). Lewis ruled six spacing steps
127
+ for every panel — 2 / 4 / 8 / 12 / 16 / 32, declared once in `shell.css` as
128
+ `--es-space-*` — and no seventh. So every number below now READS a step
129
+ instead of holding its own: the floor and "a heading to its first row" are
130
+ 12 (his "between rows under one heading"), every gap between two settings,
131
+ one-line rows included, is 32, and the gap inside a setting is 12. The notes
132
+ above say how the old numbers were reached; these are the numbers now. */
124
133
  .es-editor {
125
134
  /* THE FLOOR (card 66206) — no row-to-row gap on this panel resolves below it. */
126
- --es-row-gap: 20px;
135
+ --es-row-gap: var(--es-space-12);
127
136
 
128
137
  /* THE RHYTHMS. All five are declared in THIS rule and not a second
129
138
  `.es-editor` block: the panel has ONE root, and a second block would put
130
139
  half the panel's spacing somewhere a reader — and the spec, which reads the
131
140
  root by selector — would not look. */
132
141
  /* between one group heading and whatever is above it */
133
- --es-rhythm-group: 48px;
142
+ --es-rhythm-group: var(--es-space-32);
134
143
  /* between a group heading and the first setting under it — closer, because
135
144
  that setting belongs to that heading */
136
- --es-rhythm-group-first: 24px;
145
+ --es-rhythm-group-first: var(--es-space-12);
137
146
  /* BETWEEN two settings */
138
- --es-rhythm-between: 38px;
147
+ --es-rhythm-between: var(--es-space-32);
139
148
  /* between two one-line rows, which are one line tall and need less air */
140
- --es-rhythm-between-tight: 26px;
149
+ --es-rhythm-between-tight: var(--es-space-32);
141
150
  /* WITHIN one setting: its label to its own control */
142
- --es-rhythm-within: 11px;
151
+ --es-rhythm-within: var(--es-space-12);
143
152
 
144
153
  /* ── THE CHIP'S OWN METRICS (card 66248) ───────────────────────────────────
145
154
 
@@ -160,9 +169,9 @@
160
169
  cannot be named here is the width of a WORD — see `.es-segs` below. */
161
170
  --es-chip-pad-x: 8px;
162
171
  --es-chip-icon: 16px;
163
- --es-chip-icon-gap: 6px;
164
- --es-track-pad: 3px;
165
- --es-track-gap: 3px;
172
+ --es-chip-icon-gap: 4px;
173
+ --es-track-pad: 2px;
174
+ --es-track-gap: 2px;
166
175
  }
167
176
 
168
177
  /* ── the tab strip: a segmented control ────────────────────────────────────── */
@@ -292,7 +301,7 @@
292
301
  border: 0;
293
302
  background: transparent;
294
303
  border-radius: 6px;
295
- padding: 6px var(--es-chip-pad-x);
304
+ padding: 4px var(--es-chip-pad-x);
296
305
  font: inherit;
297
306
  font-size: 12px;
298
307
  font-weight: 600;
@@ -381,7 +390,7 @@
381
390
  .es-tab-badge {
382
391
  min-width: 16px;
383
392
  height: 16px;
384
- padding: 0 5px;
393
+ padding: 0 4px;
385
394
  border-radius: 999px;
386
395
  background: var(--es-accent);
387
396
  color: var(--es-on-accent);
@@ -738,7 +747,7 @@
738
747
  color: var(--es-text);
739
748
  background: var(--es-hover);
740
749
  border-radius: var(--es-row-radius);
741
- padding: 8px 11px;
750
+ padding: 8px 12px;
742
751
  /* A heading needs more air above it than the settings it heads have between
743
752
  them (38px), or it reads as one more row. Floored on `--es-row-gap` so it
744
753
  rises with the rest of the panel (card 66203). */
@@ -755,7 +764,7 @@
755
764
  "these lines, I still find them annoying to look at".
756
765
 
757
766
  THE TYPE IS NOT INVENTED HERE. It is `.sf-field-group` and `.sf-group-label`
758
- from `efficient-shop`, which are the same look to the decimal, hand-rolled in
767
+ from `efficient-storefront`, which are the same look to the decimal, hand-rolled in
759
768
  two panels of one editor. Owning it here is what stops a third copy.
760
769
 
761
770
  FLUSH, not inset. `.es-field` has no horizontal padding, so a heading that
@@ -794,7 +803,7 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
794
803
  .es-group-count {
795
804
  min-width: 16px;
796
805
  height: 16px;
797
- padding: 0 5px;
806
+ padding: 0 4px;
798
807
  border-radius: 999px;
799
808
  background: var(--es-accent);
800
809
  color: var(--es-on-accent);
@@ -903,7 +912,7 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
903
912
  }
904
913
 
905
914
  .es-field-hint {
906
- margin: 7px 0 0;
915
+ margin: 8px 0 0;
907
916
  padding-left: 24px;
908
917
  font-size: 11px;
909
918
  line-height: 1.45;
@@ -1022,7 +1031,7 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
1022
1031
  width: 100%;
1023
1032
  display: flex;
1024
1033
  align-items: center;
1025
- gap: 10px;
1034
+ gap: 12px;
1026
1035
  border: 0;
1027
1036
  text-align: left;
1028
1037
  font: inherit;
@@ -1062,7 +1071,7 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
1062
1071
  something each row owns on its own side. So the gap stays padding — it just reads the token now, which is the whole point: before
1063
1072
  this, raising the panel's rhythm moved every other row and left the drill
1064
1073
  list exactly where it was. */
1065
- padding: var(--es-row-gap) 11px;
1074
+ padding: var(--es-row-gap) 12px;
1066
1075
  cursor: pointer;
1067
1076
  transition: background 0.12s;
1068
1077
  }
@@ -1148,7 +1157,7 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
1148
1157
  cropped picture stays in view, and where on the thing behind it a block sits.
1149
1158
  Both are one of nine positions, and both want the corner PRESSED.
1150
1159
 
1151
- Promoted out of efficient-shop (`.sf-focal`) the day its own rule fired —
1160
+ Promoted out of efficient-storefront (`.sf-focal`) the day its own rule fired —
1152
1161
  card 66189 wrote "the day a second section wants it, that is the card that
1153
1162
  promotes it"; 66214 declined it early and said why; the sections that hold
1154
1163
  boxes take it past six callers. The values below are the shop's, token for
@@ -1366,7 +1375,7 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
1366
1375
  align-items: center;
1367
1376
  justify-content: center;
1368
1377
  gap: 8px;
1369
- padding: 10px 11px;
1378
+ padding: 12px;
1370
1379
  border: 1px solid var(--es-btn-border);
1371
1380
  border-radius: var(--es-row-radius);
1372
1381
  background: var(--es-field-bg);
@@ -1431,7 +1440,7 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
1431
1440
  the button, and wrapped — this is a clause, not a name, the same split
1432
1441
  `.es-field-hint` makes. */
1433
1442
  .es-action-note {
1434
- margin: 6px 0 0;
1443
+ margin: 8px 0 0;
1435
1444
  font-size: 11px;
1436
1445
  line-height: 1.4;
1437
1446
  color: var(--es-muted);
@@ -10,7 +10,7 @@
10
10
  --es-pick-readout-w: 80px;
11
11
  display: flex;
12
12
  flex-direction: column;
13
- gap: 10px;
13
+ gap: 12px;
14
14
  }
15
15
  .es-pick-colour-row {
16
16
  display: flex;
@@ -50,7 +50,7 @@
50
50
  box-sizing: border-box;
51
51
  width: var(--es-pick-readout-w);
52
52
  min-width: 0;
53
- padding: 4px 6px;
53
+ padding: 4px 8px;
54
54
  border: 1px solid transparent;
55
55
  border-radius: 6px;
56
56
  background: transparent;
@@ -69,7 +69,7 @@
69
69
  .es-pick-caption {
70
70
  box-sizing: border-box;
71
71
  width: var(--es-pick-readout-w);
72
- padding: 0 7px;
72
+ padding: 0 8px;
73
73
  font-size: 12px;
74
74
  color: var(--es-muted);
75
75
  }
@@ -78,8 +78,8 @@
78
78
  .es-pick-window {
79
79
  display: flex;
80
80
  flex-direction: column;
81
- gap: 10px;
82
- padding: 10px;
81
+ gap: 12px;
82
+ padding: 12px;
83
83
  border: 1px solid var(--es-divider);
84
84
  border-radius: 10px;
85
85
  background: var(--es-panel);
@@ -87,7 +87,7 @@
87
87
  .es-pick-theme {
88
88
  display: flex;
89
89
  flex-wrap: wrap;
90
- gap: 6px;
90
+ gap: 8px;
91
91
  }
92
92
  .es-pick-theme-swatch {
93
93
  width: 22px;
@@ -181,7 +181,7 @@
181
181
  margin: 0;
182
182
  display: flex;
183
183
  flex-direction: column;
184
- gap: 6px;
184
+ gap: 8px;
185
185
  }
186
186
  .es-pick-image-frame {
187
187
  height: 96px;
@@ -208,7 +208,7 @@
208
208
  gap: 8px;
209
209
  }
210
210
  .es-pick-image-btn {
211
- padding: 5px 10px;
211
+ padding: 4px 12px;
212
212
  border: 1px solid var(--es-input-border);
213
213
  border-radius: 6px;
214
214
  background: var(--es-panel);
@@ -59,7 +59,7 @@ declare function EditorRailButton({ label, worded, icon, active, disabled, onSel
59
59
  * Rail design tokens — the ONE source both apps' rails converge on.
60
60
  *
61
61
  * Every value below is taken verbatim from the storefront editor's rail
62
- * (`efficient-shop` → `storefront-editor.css`, the `.sf-rail` / `.sf-rail-btn`
62
+ * (`efficient-storefront` → `storefront-editor.css`, the `.sf-rail` / `.sf-rail-btn`
63
63
  * rules), which is the visual reference. The admin portal's hand-rolled rail had
64
64
  * drifted (button 36 vs 34, icon 20 vs 18, radius 8 vs 9, a Tailwind accent
65
65
  * instead of a CSS var); these tokens end that drift.
@@ -91,7 +91,7 @@ declare const railTokens: {
91
91
  /** A worded row button (`TopBarRail`): its side padding, the gap between the
92
92
  * icon and its word, and the word's type. */
93
93
  readonly wordPaddingX: 8;
94
- readonly wordGap: 6;
94
+ readonly wordGap: 8;
95
95
  readonly wordFontSize: 12;
96
96
  readonly wordFontWeight: 500;
97
97
  /** Hover/active colour transition. */
@@ -1 +1 @@
1
- import"../chunk-OWBO4WKA.js";export{EditorRail,EditorRailButton,railCssVars,railTokens}from"../chunk-YIMRTIBN.js";import"../chunk-2OAZYSWJ.js";import"../chunk-BZ5ASXOL.js";export{AddIcon,LayersIcon,MediaIcon,PageIcon as PagesIcon,SitemapIcon,StylesIcon}from"../chunk-YNZZYHA4.js";
1
+ import"../chunk-OWBO4WKA.js";export{EditorRail,EditorRailButton,railCssVars,railTokens}from"../chunk-IBOFSS56.js";import"../chunk-2OAZYSWJ.js";import"../chunk-BZ5ASXOL.js";export{AddIcon,LayersIcon,MediaIcon,PageIcon as PagesIcon,SitemapIcon,StylesIcon}from"../chunk-PI26YXYD.js";
@@ -21,7 +21,7 @@
21
21
  --es-rail-btn-radius: 9px;
22
22
  --es-rail-icon-size: 18px;
23
23
  --es-rail-word-pad-x: 8px;
24
- --es-rail-word-gap: 6px;
24
+ --es-rail-word-gap: 8px;
25
25
  --es-rail-word-size: 12px;
26
26
  --es-rail-word-weight: 500;
27
27
  --es-rail-bg: #ffffff;
@@ -6,7 +6,7 @@ import { B as BlockShape, D as Data } from '../types-41704JE4.js';
6
6
  *
7
7
  * Step 1.2 of the engine that replaces Puck (blueprint "Puck From The Ground
8
8
  * Up For Efficient Editor", 2026-09-29). The published storefront draws every
9
- * page through Puck's `<Render>` today (efficient-shop `lib/puck/render-client.tsx`
9
+ * page through Puck's `<Render>` today (efficient-storefront `lib/puck/render-client.tsx`
10
10
  * and `components/PublishedFooter.tsx`); this is the drop-in for it: the same
11
11
  * config, the same document, THE SAME HTML — `tests/render-puck-parity.test.tsx`
12
12
  * renders both and compares the markup byte for byte.
@@ -5,7 +5,7 @@
5
5
  * editor chrome theme: accent, surfaces, fields, text, lines, chips, named
6
6
  * chrome literals, danger/warning/success, radii, gap, shadows and font. Every
7
7
  * value bar one is taken verbatim from the storefront editor's `--sf-*` block
8
- * (`efficient-shop/components/storefront-editor.css`), the visual reference the
8
+ * (`efficient-storefront/components/storefront-editor.css`), the visual reference the
9
9
  * campaign designer (`--cd-*`) and the storefront's own TS mirror (`tk`) had
10
10
  * each re-copied. After card 66024 they all resolve to these values instead.
11
11
  * The one exception is `success`, which that block has no counterpart for; see
@@ -131,8 +131,22 @@ declare const shellTokens: {
131
131
  readonly rowRadius: 8;
132
132
  /** `--es-field-radius`. */
133
133
  readonly fieldRadius: 6;
134
- /** `--es-panel-gap` — inter-pane gutter + outer frame padding, ONE token. */
135
- readonly panelGap: 10;
134
+ /** `--es-panel-gap` — inter-pane gutter + outer frame padding, ONE token.
135
+ * 12 since the one spacing scale (was 10, which is not a step). */
136
+ readonly panelGap: 12;
137
+ /** `--es-space-2` — between the buttons of one group (B · I · U · S). */
138
+ readonly space2: 2;
139
+ /** `--es-space-4` — a sub-name to its control; between the cells of one group. */
140
+ readonly space4: 4;
141
+ /** `--es-space-8` — between the layers of ONE setting (bar → box → Show marks). */
142
+ readonly space8: 8;
143
+ /** `--es-space-12` — between rows under one heading; inside one setting;
144
+ * the panel's padding when it is narrower than 260px. */
145
+ readonly space12: 12;
146
+ /** `--es-space-16` — the panel's own padding. */
147
+ readonly space16: 16;
148
+ /** `--es-space-32` — between two settings. */
149
+ readonly space32: 32;
136
150
  /** `--es-panel-shadow`. */
137
151
  readonly panelShadow: "0 1px 2px rgba(0, 0, 0, 0.05), 0 10px 30px rgba(0, 0, 0, 0.06)";
138
152
  /** `--es-topbar-shadow`. */
@@ -148,6 +162,12 @@ declare const shellTokens: {
148
162
  readonly font: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif";
149
163
  };
150
164
  type ShellTokens = typeof shellTokens;
165
+ /**
166
+ * The one spacing scale, smallest first (owner ruling, 2026-10-02): the six
167
+ * `space*` tokens above as a list, for code that must snap a number to it.
168
+ * A seventh step is a new ruling, not a new entry.
169
+ */
170
+ declare const SPACING_SCALE: readonly [2, 4, 8, 12, 16, 32];
151
171
  /**
152
172
  * The CSS custom-property name behind each `shellTokens` key. `shell.css` sets
153
173
  * these on `.es-editor`; override any of them on (or above) the editor root to
@@ -156,4 +176,4 @@ type ShellTokens = typeof shellTokens;
156
176
  */
157
177
  declare const shellCssVars: Record<keyof ShellTokens, string>;
158
178
 
159
- export { type ShellTokens, shellCssVars, shellTokens };
179
+ export { SPACING_SCALE, type ShellTokens, shellCssVars, shellTokens };
@@ -1 +1 @@
1
- export{shellCssVars,shellTokens}from"../chunk-FI23ALVJ.js";
1
+ export{SPACING_SCALE,shellCssVars,shellTokens}from"../chunk-2UX75JDP.js";
@@ -34,7 +34,7 @@
34
34
  * Audited 2026-09-02 across every sheet here that opens an `.es-editor` block,
35
35
  * and the honest number is zero:
36
36
  *
37
- * shell.css 67 declarations, 67 custom, 0 paint
37
+ * shell.css 73 declarations, 73 custom, 0 paint (6 spacing steps added 2026-10-06)
38
38
  * panel.css 11 declarations, 11 custom, 0 paint
39
39
  * menu.css 7 declarations, 7 custom, 0 paint
40
40
  *
@@ -110,7 +110,17 @@
110
110
  --es-panel-radius: 12px;
111
111
  --es-row-radius: 8px;
112
112
  --es-field-radius: 6px;
113
- --es-panel-gap: 10px;
113
+ --es-panel-gap: 12px;
114
+
115
+ /* — spacing: ONE scale for every panel (owner ruling, 2026-10-02) —
116
+ Six steps and no seventh. Every margin, padding and gap in this package
117
+ is one of them; `tests/spacing-scale.test.ts` holds every sheet to it. */
118
+ --es-space-2: 2px;
119
+ --es-space-4: 4px;
120
+ --es-space-8: 8px;
121
+ --es-space-12: 12px;
122
+ --es-space-16: 16px;
123
+ --es-space-32: 32px;
114
124
 
115
125
  /* — shadows — */
116
126
  --es-panel-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), 0 10px 30px rgba(0, 0, 0, 0.06);
@@ -1,15 +1,15 @@
1
- import { S as SaveWords } from '../words-CsRWXkY4.js';
1
+ import { S as SaveWords } from '../words-Cqmyey0s.js';
2
2
  import { N as NoticeWords, C as ChromeWords } from '../words-DagJdwIA.js';
3
- import { C as CopyWords } from '../words-DfxEp_RH.js';
3
+ import { C as CopyWords } from '../words-bOMsUJk9.js';
4
4
  import { D as DragWords } from '../words-D9ChvbNC.js';
5
5
  import { LockWords } from '../edit-lock/index.js';
6
6
  import { F as FieldsWords } from '../words-CD3WADyb.js';
7
7
  import { N as NodeMenuWords } from '../words-DOhF-4D4.js';
8
- import { S as SettingsBucket } from '../buckets-1vRlQceY.js';
8
+ import { S as SettingsBucket } from '../buckets-CuLM47h9.js';
9
9
  import { P as PickWords } from '../words-B87GIFWH.js';
10
10
  import { S as StyleClipboardWords } from '../words-B2YLaKEr.js';
11
11
  import { T as TreeWords } from '../words-BK-npta-.js';
12
- import '../types-CuNiSnX6.js';
12
+ import '../types-CnRzp9oc.js';
13
13
  import '../types-DNrn_w4V.js';
14
14
  import '../wordFit-9B9nqyf3.js';
15
15
  import 'react';
@@ -3,18 +3,18 @@ export { CanvasWords, DEFAULT_EDITOR_STRINGS, PanelWords, RailWords, mergeEditor
3
3
  import * as react from 'react';
4
4
  import { ReactNode } from 'react';
5
5
  export { C as ChromeWords, N as NoticeWords } from '../words-DagJdwIA.js';
6
- export { C as CopyWords } from '../words-DfxEp_RH.js';
6
+ export { C as CopyWords } from '../words-bOMsUJk9.js';
7
7
  export { D as DragWords } from '../words-D9ChvbNC.js';
8
8
  export { F as FieldsWords } from '../words-CD3WADyb.js';
9
9
  export { LockWords } from '../edit-lock/index.js';
10
10
  export { N as NodeMenuWords } from '../words-DOhF-4D4.js';
11
11
  export { P as PickWords } from '../words-B87GIFWH.js';
12
- export { S as SaveWords } from '../words-CsRWXkY4.js';
12
+ export { S as SaveWords } from '../words-Cqmyey0s.js';
13
13
  export { S as StyleClipboardWords } from '../words-B2YLaKEr.js';
14
14
  export { T as TreeWords } from '../words-BK-npta-.js';
15
- import '../buckets-1vRlQceY.js';
15
+ import '../buckets-CuLM47h9.js';
16
16
  import '../markup/index.js';
17
- import '../types-CuNiSnX6.js';
17
+ import '../types-CnRzp9oc.js';
18
18
  import '../types-DNrn_w4V.js';
19
19
  import '../wordFit-9B9nqyf3.js';
20
20
 
@@ -1 +1 @@
1
- import{DEFAULT_STYLE_CLIPBOARD_WORDS as t}from"../chunk-6WY6ZXJG.js";import{CopyStyleIcon as e,PasteStyleIcon as n}from"../chunk-YNZZYHA4.js";import{jsx as o}from"react/jsx-runtime";var r="__styleKind";function u(t,e){return t[r]=e,t}function c(t,e){return`${t}:${e.map(t=>String(t)).sort().join("|")}`}function i(t){if(!t)return null;const e=t.indexOf(":");if(e<0)return null;const n=t.slice(0,e);return s.has(n)?{control:n,values:t.slice(e+1).split("|")}:null}var s=/* @__PURE__ */new Set(["choice","select","radio"]);function l(t){if(!t||"object"!=typeof t)return null;const e=t;return"string"==typeof e[r]?e[r]:"text"===e.type||"textarea"===e.type||"number"===e.type?e.type:"select"!==e.type&&"radio"!==e.type||!Array.isArray(e.options)?null:c(e.type,e.options.map(t=>t?.value))}function a(t){return null!=t&&""!==t}function p(t,e){let n=t;for(const t of e){if(!n||"object"!=typeof n)return;n=n[t]}return n}function f(t){return void 0===t?t:JSON.parse(JSON.stringify(t))}function d(t,e,n){const[o,...r]=e,u={...t};if(0===r.length)return void 0===n?delete u[o]:u[o]=n,u;const c=u[o],i=d(c&&"object"==typeof c?c:{},r,n);return 0===Object.keys(i).length?delete u[o]:u[o]=i,u}var y=t=>t.join("."),h="editor-shell:style-clipboard",g=null,m=!1,v=/* @__PURE__ */new Set;function S(){try{return"undefined"==typeof sessionStorage?null:sessionStorage}catch{return null}}function b(){if(!m){m=!0;try{const t=S()?.getItem(h);t&&(g=JSON.parse(t))}catch{g=null}}}function k(t){b(),g={scope:t.scope,sourceType:t.type,sourceLabel:t.label,rows:t.rows.map(e=>{const n=p(t.props,e.path);return{path:[...e.path],kind:e.kind,counted:!1!==e.counted,value:a(n)?f(n):void 0}})};try{S()?.setItem(h,JSON.stringify(g))}catch{}return v.forEach(t=>t()),g}function N(t){return b(),g&&g.scope===t?g:null}function j(t){return v.add(t),()=>{v.delete(t)}}function C(){g=null,m=!0;try{S()?.removeItem(h)}catch{}v.forEach(t=>t())}function w(t,e,n){if(t.kind===e.kind)return null!==e.kind||n;const o=i(t.kind),r=i(e.kind);return!(!o||!r||o.control!==r.control)&&(!a(t.value)||r.values.includes(String(t.value)))}function O(t,e){const n=t.sourceType===e.type,o=new Map(t.rows.map(t=>[y(t.path),t]));let r=e.props,u=0,c=!1;for(const t of e.rows){const e=o.get(y(t.path));if(!e)continue;if(!w(e,t,n))continue;const i=p(r,t.path),s=void 0===e.value?void 0:f(e.value);JSON.stringify(a(i)?i:void 0)!==JSON.stringify(s)&&(r=d(r,t.path,s),c=!0),!1!==t.counted&&(u+=1)}return{props:r,pasted:u,changed:c}}function E(e,n,o,r=t){return 0===e.pasted?r.nothing({source:n,target:o}):r.pasted({count:e.pasted,source:n})}var J="⌥⌘C",K="⌥⌘V";function T(r){const u=r.words??t,c=[];return r.canCopy&&c.push({label:u.copy,icon:/* @__PURE__ */o(e,{}),shortcut:"⌥⌘C",onClick:r.onCopy}),r.held&&c.push({label:u.paste({source:r.held.sourceLabel}),icon:/* @__PURE__ */o(n,{}),shortcut:"⌥⌘V",onClick:r.onPaste}),c}function x(t){if(!t.altKey||t.shiftKey||!t.metaKey&&!t.ctrlKey)return null;const e=t.target;return e&&(e.isContentEditable||"INPUT"===e.tagName||"TEXTAREA"===e.tagName||"SELECT"===e.tagName)?null:"KeyC"===t.code?"copy":"KeyV"===t.code?"paste":null}export{J as COPY_STYLE_SHORTCUT,K as PASTE_STYLE_SHORTCUT,r as STYLE_KIND,c as choiceKind,C as clearStyle,k as copyStyle,l as fieldKind,N as heldStyle,E as pasteMessage,O as planPaste,T as styleMenuItems,x as styleShortcut,j as subscribeStyle,u as withStyleKind};
1
+ import{DEFAULT_STYLE_CLIPBOARD_WORDS as t}from"../chunk-6WY6ZXJG.js";import{CopyStyleIcon as e,PasteStyleIcon as n}from"../chunk-PI26YXYD.js";import{jsx as o}from"react/jsx-runtime";var r="__styleKind";function u(t,e){return t[r]=e,t}function c(t,e){return`${t}:${e.map(t=>String(t)).sort().join("|")}`}function i(t){if(!t)return null;const e=t.indexOf(":");if(e<0)return null;const n=t.slice(0,e);return s.has(n)?{control:n,values:t.slice(e+1).split("|")}:null}var s=/* @__PURE__ */new Set(["choice","select","radio"]);function l(t){if(!t||"object"!=typeof t)return null;const e=t;return"string"==typeof e[r]?e[r]:"text"===e.type||"textarea"===e.type||"number"===e.type?e.type:"select"!==e.type&&"radio"!==e.type||!Array.isArray(e.options)?null:c(e.type,e.options.map(t=>t?.value))}function a(t){return null!=t&&""!==t}function p(t,e){let n=t;for(const t of e){if(!n||"object"!=typeof n)return;n=n[t]}return n}function f(t){return void 0===t?t:JSON.parse(JSON.stringify(t))}function d(t,e,n){const[o,...r]=e,u={...t};if(0===r.length)return void 0===n?delete u[o]:u[o]=n,u;const c=u[o],i=d(c&&"object"==typeof c?c:{},r,n);return 0===Object.keys(i).length?delete u[o]:u[o]=i,u}var y=t=>t.join("."),h="editor-shell:style-clipboard",g=null,m=!1,v=/* @__PURE__ */new Set;function S(){try{return"undefined"==typeof sessionStorage?null:sessionStorage}catch{return null}}function b(){if(!m){m=!0;try{const t=S()?.getItem(h);t&&(g=JSON.parse(t))}catch{g=null}}}function k(t){b(),g={scope:t.scope,sourceType:t.type,sourceLabel:t.label,rows:t.rows.map(e=>{const n=p(t.props,e.path);return{path:[...e.path],kind:e.kind,counted:!1!==e.counted,value:a(n)?f(n):void 0}})};try{S()?.setItem(h,JSON.stringify(g))}catch{}return v.forEach(t=>t()),g}function N(t){return b(),g&&g.scope===t?g:null}function j(t){return v.add(t),()=>{v.delete(t)}}function C(){g=null,m=!0;try{S()?.removeItem(h)}catch{}v.forEach(t=>t())}function w(t,e,n){if(t.kind===e.kind)return null!==e.kind||n;const o=i(t.kind),r=i(e.kind);return!(!o||!r||o.control!==r.control)&&(!a(t.value)||r.values.includes(String(t.value)))}function O(t,e){const n=t.sourceType===e.type,o=new Map(t.rows.map(t=>[y(t.path),t]));let r=e.props,u=0,c=!1;for(const t of e.rows){const e=o.get(y(t.path));if(!e)continue;if(!w(e,t,n))continue;const i=p(r,t.path),s=void 0===e.value?void 0:f(e.value);JSON.stringify(a(i)?i:void 0)!==JSON.stringify(s)&&(r=d(r,t.path,s),c=!0),!1!==t.counted&&(u+=1)}return{props:r,pasted:u,changed:c}}function E(e,n,o,r=t){return 0===e.pasted?r.nothing({source:n,target:o}):r.pasted({count:e.pasted,source:n})}var J="⌥⌘C",K="⌥⌘V";function T(r){const u=r.words??t,c=[];return r.canCopy&&c.push({label:u.copy,icon:/* @__PURE__ */o(e,{}),shortcut:"⌥⌘C",onClick:r.onCopy}),r.held&&c.push({label:u.paste({source:r.held.sourceLabel}),icon:/* @__PURE__ */o(n,{}),shortcut:"⌥⌘V",onClick:r.onPaste}),c}function x(t){if(!t.altKey||t.shiftKey||!t.metaKey&&!t.ctrlKey)return null;const e=t.target;return e&&(e.isContentEditable||"INPUT"===e.tagName||"TEXTAREA"===e.tagName||"SELECT"===e.tagName)?null:"KeyC"===t.code?"copy":"KeyV"===t.code?"paste":null}export{J as COPY_STYLE_SHORTCUT,K as PASTE_STYLE_SHORTCUT,r as STYLE_KIND,c as choiceKind,C as clearStyle,k as copyStyle,l as fieldKind,N as heldStyle,E as pasteMessage,O as planPaste,T as styleMenuItems,x as styleShortcut,j as subscribeStyle,u as withStyleKind};
@@ -143,7 +143,7 @@ declare const TREE_DRAG_HINT: string;
143
143
  /**
144
144
  * ONE row, at every depth (the owner's "One Ladder", 2026-09-04).
145
145
  *
146
- * Lifted from the website editor's `.sf-row` (efficient-shop). Left to right:
146
+ * Lifted from the website editor's `.sf-row` (efficient-storefront). Left to right:
147
147
  * the drag handle (out of flow, in the row's left padding), the caret — or a
148
148
  * spacer holding its column open, so every glyph below lines up whether its row
149
149
  * folds or not — the type glyph, then the name box. The actions are laid over
@@ -1 +1 @@
1
- export{LayersTree,Subtree,TREE_DRAG_HINT,TreeGroupLabel,TreeRow,TreeRowAction,TreeSeam}from"../chunk-STFMZJKU.js";import"../chunk-H4B72XCJ.js";import"../chunk-YNZZYHA4.js";
1
+ export{LayersTree,Subtree,TREE_DRAG_HINT,TreeGroupLabel,TreeRow,TreeRowAction,TreeSeam}from"../chunk-66CKSTXP.js";import"../chunk-H4B72XCJ.js";import"../chunk-PI26YXYD.js";
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * efficient-easel/tree.css — the Layers tree: one row shape at every depth.
3
3
  *
4
- * EVERY VALUE HERE WAS READ OFF `efficient-shop/components/storefront-editor.css`
4
+ * EVERY VALUE HERE WAS READ OFF `efficient-storefront/components/storefront-editor.css`
5
5
  * on origin/main (release 14.24.0, 2026-09-17), where the website editor drew
6
6
  * the tree as `.sf-tree` / `.sf-row` / `.sf-subtree` / `.sf-group-label` (the
7
7
  * owner's "One Ladder", 2026-09-04). Its `--sf-*` tokens alias the `--es-*`
@@ -17,13 +17,13 @@
17
17
  /* LEFT 8 — the inset a rounded row needs. RIGHT 11 — the room a real,
18
18
  space-taking 11px scrollbar takes, so nothing at a row's end sits under
19
19
  the thumb. Words inside start on one 11px column down the panel. */
20
- padding: 0 11px 10px 8px;
20
+ padding: 0 12px 12px 8px;
21
21
  /* THE TREE'S RHYTHM, under the shell's names, at the tree's own density: the
22
22
  owner picked 10 between groups and 6 between rows by eye (2026-08-31). They
23
23
  are declared HERE, not on the editor root, so the settings panel beside the
24
24
  tree keeps its own values for the same names. */
25
- --es-rhythm-group: 10px;
26
- --es-rhythm-between: 6px;
25
+ --es-rhythm-group: 12px;
26
+ --es-rhythm-between: 8px;
27
27
  }
28
28
  /* Every seam the tree stacks, spelled out: labels and subtrees interleave with
29
29
  rows, and a rule that knew only rows would leave those seams to chance. */
@@ -38,7 +38,7 @@
38
38
  letter-spacing: 0.07em;
39
39
  text-transform: uppercase;
40
40
  color: var(--es-muted);
41
- padding: var(--es-rhythm-group) 11px var(--es-rhythm-between);
41
+ padding: var(--es-rhythm-group) 12px var(--es-rhythm-between);
42
42
  }
43
43
 
44
44
  /* THE ONLY THING IN THE TREE THAT SAYS DEPTH: 16px of indent and a hairline
@@ -46,7 +46,7 @@
46
46
  rows outside, so the ladder reads as one list at several depths. */
47
47
  .es-subtree {
48
48
  margin: var(--es-rhythm-between) 0 var(--es-rhythm-between) 16px;
49
- padding-left: 9px;
49
+ padding-left: 8px;
50
50
  border-left: 1px solid var(--es-line);
51
51
  display: flex;
52
52
  flex-direction: column;
@@ -57,7 +57,7 @@
57
57
  display: flex;
58
58
  align-items: center;
59
59
  gap: 8px;
60
- padding: 7px 11px;
60
+ padding: 8px 12px;
61
61
  border-radius: var(--es-row-radius);
62
62
  cursor: pointer;
63
63
  transition: background 0.12s;
@@ -158,7 +158,7 @@
158
158
  STOCK NOW" — quieter than the name, and the first thing to be cut when the
159
159
  panel is narrow (it sits inside the name's own ellipsis). */
160
160
  .es-tree-preview {
161
- margin-left: 6px;
161
+ margin-left: 8px;
162
162
  font-weight: 400;
163
163
  color: var(--es-muted);
164
164
  }
@@ -337,7 +337,7 @@
337
337
  min-width: 0;
338
338
  display: flex;
339
339
  align-items: center;
340
- gap: 6px;
340
+ gap: 8px;
341
341
  cursor: pointer;
342
342
  border-radius: 4px;
343
343
  }
@@ -371,7 +371,7 @@
371
371
  color: var(--es-muted);
372
372
  background: var(--es-chip-bg);
373
373
  border-radius: 4px;
374
- padding: 1px 4px;
374
+ padding: 2px 4px;
375
375
  }
376
376
  .es-tree-trailing {
377
377
  flex: none;
@@ -490,7 +490,7 @@
490
490
  left: 24px;
491
491
  top: calc(100% + 4px);
492
492
  z-index: 5;
493
- padding: 3px 7px;
493
+ padding: 4px 8px;
494
494
  border-radius: 6px;
495
495
  background: var(--es-toast-bg);
496
496
  color: var(--es-on-accent);
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { S as SettingsBucket } from './buckets-1vRlQceY.js';
2
+ import { S as SettingsBucket } from './buckets-CuLM47h9.js';
3
3
 
4
4
  /** What every control shares: an id for its label, a name for screen readers, and a read-only switch. */
5
5
  interface ControlBase {
@@ -22,13 +22,35 @@ interface FieldNumberProps extends ControlBase {
22
22
  onChange: (value: number | undefined) => void;
23
23
  min?: number;
24
24
  max?: number;
25
+ /** What an arrow or ↑↓ moves by. Default 1. */
25
26
  step?: number;
26
- /** Shown after the box, e.g. `px`. */
27
+ /** What Shift + an arrow or ↑↓ moves by. Default ten steps. */
28
+ shiftStep?: number;
29
+ /**
30
+ * The style's number. While the value is `undefined` it shows in the box,
31
+ * grey, and a step starts from it; a typed value beats it until cleared.
32
+ */
33
+ styleValue?: number;
34
+ /** Drawn first in the cell, e.g. the font-size glyph. */
35
+ icon?: ReactNode;
36
+ /** Shown after the number, inside the cell, e.g. `px`. */
27
37
  unit?: string;
28
- /** − and + beside the box. */
38
+ /** Two small stacked arrows at the cell's end. */
29
39
  steppers?: boolean;
30
40
  placeholder?: string;
31
41
  }
42
+ /**
43
+ * A slider row (Site styles, Email styles): the name left and the typed value
44
+ * right on one line, the slider under them. `sliderMin` / `sliderMax` are the
45
+ * slider's travel only; a typed value may go past them, held only by `min` /
46
+ * `max`.
47
+ */
48
+ interface FieldSliderProps extends Omit<FieldNumberProps, 'icon' | 'steppers' | 'placeholder' | 'ariaLabel' | 'ariaLabelledBy'> {
49
+ /** The row's name; it labels both the value and the slider. */
50
+ label: string;
51
+ sliderMin: number;
52
+ sliderMax: number;
53
+ }
32
54
  interface FieldOption<V = unknown> {
33
55
  label: string;
34
56
  value: V;
@@ -126,4 +148,4 @@ type FieldRenderer = (props: {
126
148
  readOnly?: boolean;
127
149
  }) => ReactNode;
128
150
 
129
- export type { ArrayFieldDef as A, CustomFieldDef as C, FieldRenderer as F, InspectorFields as I, NumberFieldDef as N, ObjectFieldDef as O, RadioFieldDef as R, SelectFieldDef as S, TextFieldDef as T, InspectorFieldDef as a, FieldTextProps as b, FieldNumberProps as c, FieldSelectProps as d, FieldOption as e, CustomFieldRenderProps as f, SlotFieldDef as g, TextareaFieldDef as h };
151
+ export type { ArrayFieldDef as A, CustomFieldDef as C, FieldRenderer as F, InspectorFields as I, NumberFieldDef as N, ObjectFieldDef as O, RadioFieldDef as R, SelectFieldDef as S, TextFieldDef as T, InspectorFieldDef as a, FieldTextProps as b, FieldNumberProps as c, FieldSliderProps as d, FieldSelectProps as e, FieldOption as f, CustomFieldRenderProps as g, SlotFieldDef as h, TextareaFieldDef as i };
@@ -5,7 +5,7 @@ import { EditAccess, SaveConflict } from './edit-lock/index.js';
5
5
  /**
6
6
  * The side-panel widths every editor opens on and drags between (px).
7
7
  *
8
- * Lifted from `efficient-shop/components/panel-widths.ts`, where the website
8
+ * Lifted from `efficient-storefront/components/panel-widths.ts`, where the website
9
9
  * editor measured them:
10
10
  *
11
11
  * RIGHT is 320, not 308 (card 8810). At 308 the settings tab strip was left
@@ -1,4 +1,4 @@
1
- import { S as SaveTone } from './types-CuNiSnX6.js';
1
+ import { S as SaveTone } from './types-CnRzp9oc.js';
2
2
 
3
3
  /** Time and timers, passed in so a test can run minutes in a millisecond. */
4
4
  type AutosaveClock = {
@@ -76,7 +76,7 @@ declare function createAutosave<T>(options?: AutosaveOptions<T>): Autosave<T>;
76
76
  *
77
77
  * There were three: the campaign designer's `saveStatusLabel`
78
78
  * (efficient-admin-portal `src/components/email/autosaveStatus.ts`), the
79
- * website editor's `autosaveStatusLabel` (efficient-shop
79
+ * website editor's `autosaveStatusLabel` (efficient-storefront
80
80
  * `lib/editor/autosave-status.ts`, which said of the first "a MIRRORED copy …
81
81
  * whether that pair should collapse into `efficient-easel` is called out
82
82
  * rather than decided here") and the website chrome's own words for its
@@ -61,7 +61,7 @@ declare const COPY_ALIGN_GLYPHS: Record<CopyAlign, ReactNode>;
61
61
  * An over-estimate is safe (the words drop a little early); an under-estimate
62
62
  * draws a button past the strip's edge.
63
63
  *
64
- * THREE is measured, not guessed — `efficient-shop/components/PartSettingsPanel`
64
+ * THREE is measured, not guessed — `efficient-storefront/components/PartSettingsPanel`
65
65
  * had this exact pair as its own `ALIGN_FIT`, produced by
66
66
  * `tests/fixtures/segmented-fit.html`. It moves here so the one alignment strip
67
67
  * carries its own measurement, and that constant is deleted when the panel
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efficient-easel",
3
- "version": "0.97.0",
3
+ "version": "0.98.0",
4
4
  "description": "Efficient Easel: the EFFICIENT editors' shared engine and chrome: the saved document as pure functions, the published renderer, and the editor frame, panels, Layers tree, text grammar and type-in-place box. Published as editor-shell up to 0.66.0 and as efficient-editor up to 0.95.0.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Efficient Pty Ltd",
@@ -1 +0,0 @@
1
- var e={accent:"#2563eb",accentTint:"#eff6ff",accentTintStrong:"#dbeafe",accentLine:"#bfdbfe",accentText:"#1d4ed8",accentRing:"rgba(37, 99, 235, 0.25)",accentShadow:"rgba(37, 99, 235, 0.35)",onAccent:"#ffffff",appBg:"#f9fafb",previewBg:"#f3f4f6",panel:"#ffffff",raised:"#ffffff",topbarBg:"#ffffff",frameBg:"#ffffff",hover:"#f3f4f6",hatch:"rgba(0, 0, 0, 0.018)",addcardVeil:"rgba(248, 249, 250, 0.66)",fieldBg:"#ffffff",trackBg:"#f3f4f6",inputBorder:"#d1d5db",fieldText:"#1f2937",fieldPlaceholder:"#9ca3af",knob:"#ffffff",text:"#111827",textStrong:"#030712",textSecondary:"#374151",muted:"#6b7280",icon:"#6b7280",disabled:"#9ca3af",divider:"#e5e7eb",line:"#e5e7eb",btnBorder:"#d1d5db",btnText:"#374151",chipBg:"#f3f4f6",chipFg:"#6b7280",brandSquare:"#111827",deviceBorder:"#e5e7eb",toastBg:"#111827",toggleOff:"#d1d5db",scrollbar:"#d1d5db",scrollbarHover:"#9ca3af",danger:"#dc2626",dangerStrong:"#b91c1c",dangerTint:"#fef2f2",warning:"#b45309",previewTint:"#fef3c7",success:"#15803d",panelRadius:12,rowRadius:8,fieldRadius:6,panelGap:10,panelShadow:"0 1px 2px rgba(0, 0, 0, 0.05), 0 10px 30px rgba(0, 0, 0, 0.06)",topbarShadow:"0 1px 3px rgba(0, 0, 0, 0.06)",raisedShadow:"0 1px 2px rgba(16, 24, 40, 0.1)",font:'-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif'},a={accent:"--es-accent",accentTint:"--es-accent-tint",accentTintStrong:"--es-accent-tint-strong",accentLine:"--es-accent-line",accentText:"--es-accent-text",accentRing:"--es-accent-ring",accentShadow:"--es-accent-shadow",onAccent:"--es-on-accent",appBg:"--es-app-bg",previewBg:"--es-preview-bg",panel:"--es-panel",raised:"--es-raised",topbarBg:"--es-topbar-bg",frameBg:"--es-frame-bg",hover:"--es-hover",hatch:"--es-hatch",addcardVeil:"--es-addcard-veil",fieldBg:"--es-field-bg",trackBg:"--es-track-bg",inputBorder:"--es-input-border",fieldText:"--es-field-text",fieldPlaceholder:"--es-field-placeholder",knob:"--es-knob",text:"--es-text",textStrong:"--es-text-strong",textSecondary:"--es-text-secondary",muted:"--es-muted",icon:"--es-icon",disabled:"--es-disabled",divider:"--es-divider",line:"--es-line",btnBorder:"--es-btn-border",btnText:"--es-btn-text",chipBg:"--es-chip-bg",chipFg:"--es-chip-fg",brandSquare:"--es-brand-square",deviceBorder:"--es-device-border",toastBg:"--es-toast-bg",toggleOff:"--es-toggle-off",scrollbar:"--es-scrollbar",scrollbarHover:"--es-scrollbar-hover",danger:"--es-danger",dangerStrong:"--es-danger-strong",dangerTint:"--es-danger-tint",warning:"--es-warning",previewTint:"--es-preview-tint",success:"--es-success",panelRadius:"--es-panel-radius",rowRadius:"--es-row-radius",fieldRadius:"--es-field-radius",panelGap:"--es-panel-gap",panelShadow:"--es-panel-shadow",topbarShadow:"--es-topbar-shadow",raisedShadow:"--es-raised-shadow",font:"--es-font"};export{a as shellCssVars,e as shellTokens};