efficient-easel 0.97.0 → 0.99.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 (60) hide show
  1. package/README.md +13 -5
  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-OGZFDJ6G.js → chunk-JE63JHKO.js} +1 -1
  11. package/dist/{chunk-CERTFXCV.js → chunk-JYPOOHII.js} +3 -3
  12. package/dist/chunk-PI26YXYD.js +462 -0
  13. package/dist/chunk-SJQG5ENJ.js +1 -0
  14. package/dist/{chunk-2LUSK32B.js → chunk-ZT7M24XD.js} +1 -1
  15. package/dist/copy/copy.css +5 -5
  16. package/dist/copy/index.d.ts +5 -5
  17. package/dist/copy/index.js +10 -10
  18. package/dist/drag/drag.css +15 -15
  19. package/dist/drag/index.js +5 -5
  20. package/dist/edit-lock/index.d.ts +1 -1
  21. package/dist/editor/index.d.ts +2 -2
  22. package/dist/fields/fields.css +126 -12
  23. package/dist/fields/index.d.ts +59 -11
  24. package/dist/fields/index.js +40 -33
  25. package/dist/gold/index.d.ts +1 -1
  26. package/dist/gold/index.js +1 -1
  27. package/dist/icons/index.d.ts +26 -5
  28. package/dist/icons/index.js +1 -1
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/markup/index.d.ts +97 -21
  32. package/dist/markup/index.js +1 -1
  33. package/dist/menu/menu.css +4 -4
  34. package/dist/node-ops/index.js +1 -1
  35. package/dist/panel/index.d.ts +10 -10
  36. package/dist/panel/panel.css +34 -25
  37. package/dist/pick/pick.css +8 -8
  38. package/dist/rail/index.d.ts +2 -2
  39. package/dist/rail/index.js +1 -1
  40. package/dist/rail/rail.css +1 -1
  41. package/dist/render/index.d.ts +1 -1
  42. package/dist/shell/index.d.ts +24 -4
  43. package/dist/shell/index.js +1 -1
  44. package/dist/shell/shell.css +12 -2
  45. package/dist/strings/catalogue.d.ts +4 -4
  46. package/dist/strings/catalogue.js +1 -1
  47. package/dist/strings/index.d.ts +4 -4
  48. package/dist/strings/index.js +1 -1
  49. package/dist/style-clipboard/index.js +1 -1
  50. package/dist/tree/index.d.ts +1 -1
  51. package/dist/tree/index.js +1 -1
  52. package/dist/tree/tree.css +11 -11
  53. package/dist/{types-CEqUFH2j.d.ts → types-C7HFvdtk.d.ts} +26 -4
  54. package/dist/{types-CuNiSnX6.d.ts → types-CnRzp9oc.d.ts} +1 -1
  55. package/dist/{words-CsRWXkY4.d.ts → words-Cqmyey0s.d.ts} +2 -2
  56. package/dist/{words-DfxEp_RH.d.ts → words-bOMsUJk9.d.ts} +1 -1
  57. package/package.json +1 -1
  58. package/dist/chunk-6OPSJGAI.js +0 -1
  59. package/dist/chunk-FI23ALVJ.js +0 -1
  60. package/dist/chunk-YNZZYHA4.js +0 -450
@@ -43,7 +43,36 @@
43
43
  *
44
44
  * [words](href) a link — safe addresses only ({@link isSafeLinkHref})
45
45
  * - words a bullet line, one level
46
- * **a _b_ a** one run inside another, one level
46
+ * 1. words a numbered line, one level: 1-3 digits, ". ", words
47
+ * **a _b_ a** one run inside another, up to four levels
48
+ *
49
+ * [words]{underline} underline
50
+ * [words]{sup} superscript
51
+ * [words]{sub} subscript
52
+ * [words]{color=name} a theme colour, by NAME ({@link isColorName})
53
+ *
54
+ * THE SPANS AND THE NUMBERED LINE (plan step E1, approved by GG 2026-10-06)
55
+ * are the final text box's marks. One shape for all four, so one reading rule:
56
+ * `[`, words, `]`, then EXACTLY one of those blocks. Anything else after the
57
+ * `]` — `{foo}`, `{color=#ff0000}`, a merge tag's `{{` — is not a span, and the
58
+ * whole thing stays as typed. Two marks on the same words nest
59
+ * (`[[x]{sup}]{color=accent}`); one block never holds two.
60
+ *
61
+ * Why these cannot clash with an old mark: no old rule closes on `]{` (a link
62
+ * needs `](`), and the campaign's legacy `[phrase]` italic steps back from a
63
+ * span block, the way it steps back from a link (`notBeforeBlock`). No inline
64
+ * rule opens on a digit. Production held neither shape when they were chosen:
65
+ * 0 of 24,233 text values contained `]{`, and none had a line starting with a
66
+ * number and `.` or `)`.
67
+ *
68
+ * Not chosen: `^x^` / `~x~` (one character from Quiet `^^` and strike `~~`,
69
+ * and `~20 min` is ordinary copy), `__x__` (pinned as italic below, and
70
+ * CommonMark's bold) and `++x++` (the old Strong).
71
+ *
72
+ * Only the tree ({@link parseMarkup}) reads them. The flat
73
+ * {@link tokenizeInline} — the old renderers' reading — keeps them as text, as
74
+ * it keeps links: an email or a page drawn before its renderer learns them
75
+ * prints the delimiters. No toolbar button writes them yet.
47
76
  *
48
77
  * EVERY READING IS LINE BY LINE: a run never crosses a line break. The email
49
78
  * always read this way; the editor's painter and the storefront used to read
@@ -87,21 +116,32 @@
87
116
  */
88
117
  /** A style a toolbar button can apply. The first six are inline marks; then
89
118
  * the composer-only affordances (a link and the three line prefixes), which
90
- * only a renderer that draws block content can honour; and `clear`, which
91
- * writes no mark at all — it takes them off ({@link clearMarks}). */
92
- type MarkStyle = 'bold' | 'italic' | 'strike' | 'code' | 'highlight' | 'quiet' | 'link' | 'bullet' | 'number' | 'quote' | 'clear';
119
+ * only a renderer that draws block content can honour; `clear`, which
120
+ * writes no mark at all — it takes them off ({@link clearMarks}); and the
121
+ * three spans of the final text box (E1), which no button in
122
+ * {@link MARKUP_TOOLS} offers yet. A colour carries a name, so it is written
123
+ * by {@link applyColor}, not here. */
124
+ type MarkStyle = 'bold' | 'italic' | 'strike' | 'code' | 'highlight' | 'quiet' | 'link' | 'bullet' | 'number' | 'quote' | 'clear' | 'underline' | 'sup' | 'sub';
125
+ /** What a span means: `[words]{underline}`, `{sup}`, `{sub}` or
126
+ * `{color=name}`. Only the tree reads these; {@link InlineKind} is the flat
127
+ * reading's, which never makes one. */
128
+ type SpanKind = 'underline' | 'sup' | 'sub' | 'color';
93
129
  /** What a parsed run MEANS. `accent` is the storefront/campaign brand colour —
94
130
  * the legacy `*phrase*` — and `highlight` is its standard-markdown successor;
95
131
  * both resolve to the same paint, which is what makes converting stored copy
96
132
  * from one to the other invisible. */
97
133
  type InlineKind = 'text' | 'bold' | 'italic' | 'strike' | 'code' | 'highlight' | 'accent' | 'quiet';
134
+ /** A theme colour's name as a span saves it: lowercase letters, digits and
135
+ * `-`, starting with a letter (`accent`, `brand-2`). Never a hex: a colour is
136
+ * the theme's, so changing the theme recolours the words. */
137
+ declare function isColorName(name: string): boolean;
98
138
  /**
99
139
  * The words a press WRITES when nothing is selected — `**bold text**`, left
100
140
  * selected so the next keystroke replaces it. English unless the caller of
101
141
  * {@link applyMark} hands in its own (0.95.0: a host in another language).
102
142
  * They are words put in the box, not rules: nothing here changes what parses.
103
143
  */
104
- type MarkPlaceholders = Record<'bold' | 'italic' | 'strike' | 'code' | 'highlight' | 'quiet' | 'link', string>;
144
+ type MarkPlaceholders = Record<'bold' | 'italic' | 'strike' | 'code' | 'highlight' | 'quiet' | 'link', string> & Partial<Record<'underline' | 'sup' | 'sub' | 'color', string>>;
105
145
  declare const MARK_PLACEHOLDERS: MarkPlaceholders;
106
146
  interface WrapResult {
107
147
  text: string;
@@ -119,6 +159,17 @@ interface WrapResult {
119
159
  * and the campaign designer, where the asterisk means colour, not slant.
120
160
  */
121
161
  declare function applyMark(text: string, start: number, end: number, style: MarkStyle, rules?: readonly InlineRule[], placeholders?: MarkPlaceholders): WrapResult;
162
+ /**
163
+ * Colour `text[start:end]` with the theme colour `name`, writing
164
+ * `[words]{color=name}` and leaving the words selected. On words that are
165
+ * already exactly one colour span it changes the name; `null` takes the colour
166
+ * off. A name {@link isColorName} refuses changes nothing — a hex or a typo is
167
+ * never saved as a block the reader would print as text.
168
+ *
169
+ * Separate from {@link applyMark} because a colour carries a value, as a link
170
+ * does ({@link writeLink}).
171
+ */
172
+ declare function applyColor(text: string, start: number, end: number, name: string | null, placeholders?: MarkPlaceholders): WrapResult;
122
173
  /**
123
174
  * True when `text[start:end]` is ALREADY wrapped in `style`'s own fence — the
124
175
  * very test {@link applyMark} uses to decide that a press unwraps. So a button
@@ -226,6 +277,14 @@ interface InlineRule {
226
277
  * more rule field and no new branch in {@link tokenizeInline}.
227
278
  */
228
279
  readonly notBefore?: string;
280
+ /**
281
+ * True when the run may not close right before a span block (`{sup}`,
282
+ * `{color=accent}`, …). The campaign's legacy `[phrase]` needs it for the
283
+ * reason it needs `notBefore: '('`: without it `[x]{sup}` would read as an
284
+ * italic `x` followed by a printed `{sup}`. Only the four exact blocks count,
285
+ * so `[x]{{first_name}}` and `[x]{foo}` read as they always did.
286
+ */
287
+ readonly notBeforeBlock?: boolean;
229
288
  }
230
289
  /**
231
290
  * The standard-markdown marks, shared by every product.
@@ -322,12 +381,14 @@ interface MarkupText {
322
381
  text: string;
323
382
  }
324
383
  /** A delimited run. `open` and `close` are the delimiters that were actually
325
- * saved — `#` for a legacy campaign bold, `**` for the standard one — so the
326
- * tree writes back the same bytes it was read from. */
384
+ * saved — `#` for a legacy campaign bold, `**` for the standard one, `[` and
385
+ * `]{sup}` for a span — so the tree writes back the same bytes it was read
386
+ * from. `color` is the theme colour's name, on a `color` span only. */
327
387
  interface MarkupRun {
328
- kind: InlineRule['kind'];
388
+ kind: InlineRule['kind'] | SpanKind;
329
389
  open: string;
330
390
  close: string;
391
+ color?: string;
331
392
  children: MarkupNode[];
332
393
  }
333
394
  /** `[words](href)`. Only made when {@link isSafeLinkHref} passes. */
@@ -338,9 +399,12 @@ interface MarkupLink {
338
399
  }
339
400
  type MarkupNode = MarkupText | MarkupRun | MarkupLink;
340
401
  /** One line of the saved string. `bullet` means it was saved as `- words`;
341
- * `children` hold what follows the `- `. */
402
+ * `number` holds the digits of a line saved as `12. words`, as typed (`01`
403
+ * stays `01`), and is null on every other line. `children` hold what follows
404
+ * the prefix. A line built by hand may leave `number` out: it means null. */
342
405
  interface MarkupLine {
343
406
  bullet: boolean;
407
+ number?: string | null;
344
408
  children: MarkupNode[];
345
409
  }
346
410
  /**
@@ -361,10 +425,14 @@ declare function isSafeLinkHref(href: string): boolean;
361
425
  * - A run never crosses a line break.
362
426
  * - A line that starts with `- ` and has words after it is a bullet. One level
363
427
  * only: an indented ` - ` is plain text.
428
+ * - A line that starts with 1-3 digits, `. ` and words is numbered, the digits
429
+ * kept as typed. One level only, as bullets.
364
430
  * - `[words](href)` is a link when {@link isSafeLinkHref} passes; otherwise the
365
431
  * whole thing stays plain text.
366
- * - A run's words are read once more, so `**bold _with italic_**` is italic
367
- * inside bold. One level only: a third level stays as typed.
432
+ * - `[words]{underline}`, `{sup}`, `{sub}` and `{color=name}` are spans; any
433
+ * other block stays plain text.
434
+ * - A run's words are read again, so `**bold _with italic_**` is italic inside
435
+ * bold. Four levels: a fifth stays as typed.
368
436
  *
369
437
  * Nothing is lost: {@link serializeMarkup} writes back the exact bytes.
370
438
  */
@@ -378,22 +446,25 @@ declare function serializeMarkup(lines: readonly MarkupLine[]): string;
378
446
  *
379
447
  * `open` and `close` are the delimiters that were saved (`#` for a legacy
380
448
  * campaign bold), or, for a run made in the editor, the toolbar's own fence.
381
- * A link's `close` is `](href)`.
449
+ * A link's `close` is `](href)`, a span's `]{sup}` or `]{color=name}`.
382
450
  */
383
451
  interface MarkSpan {
384
452
  id: number;
385
- kind: InlineRule['kind'] | 'link';
453
+ kind: InlineRule['kind'] | SpanKind | 'link';
386
454
  open: string;
387
455
  close: string;
388
456
  href?: string;
457
+ color?: string;
389
458
  }
390
459
  /**
391
460
  * A NEW run, as the toolbar writes it: `**` for bold, `_` for italic, and so on
392
- * ({@link applyMark}'s own fences), or a link to `href`. Null for a style that
393
- * writes no run (a line prefix, clear). A paste filter or an editor making a
394
- * run asks here, so no delimiter is spelled outside this module (E8).
461
+ * ({@link applyMark}'s own fences), a link to `value`, or a colour span named
462
+ * `value` ({@link isColorName}). Null for a style that writes no run (a line
463
+ * prefix, clear) and for a link or colour with no usable value. A paste filter
464
+ * or an editor making a run asks here, so no delimiter is spelled outside this
465
+ * module (E8).
395
466
  */
396
- declare function spanFor(id: number, style: MarkStyle, href?: string): MarkSpan | null;
467
+ declare function spanFor(id: number, style: MarkStyle | 'color', value?: string): MarkSpan | null;
397
468
  /** One character of the words — never a delimiter — with the runs it sits in,
398
469
  * outside first, and its offset in the saved string. */
399
470
  interface MarkedChar {
@@ -401,9 +472,12 @@ interface MarkedChar {
401
472
  marks: readonly MarkSpan[];
402
473
  at: number;
403
474
  }
404
- /** One line: its bullet flag (the `- ` is not a character) and its words. */
475
+ /** One line: its bullet flag or its number (the `- ` and the `12. ` are not
476
+ * characters) and its words. `number` left out means null, as on
477
+ * {@link MarkupLine}. */
405
478
  interface MarkedLine {
406
479
  bullet: boolean;
480
+ number?: string | null;
407
481
  chars: MarkedChar[];
408
482
  }
409
483
  /**
@@ -433,12 +507,14 @@ declare function writeMarkedLines(lines: readonly MarkedLine[]): {
433
507
  at: number[][];
434
508
  };
435
509
  /** True when two readings hold the same words wearing the same marks — the
436
- * kinds and addresses, not which run or which delimiter. */
510
+ * kinds, addresses, colours and list numbers, not which run or which
511
+ * delimiter. */
437
512
  declare function sameMarks(a: readonly MarkedLine[], b: readonly MarkedLine[]): boolean;
438
513
  /**
439
514
  * Take every mark off `text[start:end]`, keeping the words and any link (a
440
515
  * link has its own Remove). A run the selection only partly covers is split,
441
- * so the rest of it keeps its mark. Bullets stay: they are lines, not marks.
516
+ * so the rest of it keeps its mark. Bullets and numbers stay: they are lines,
517
+ * not marks.
442
518
  *
443
519
  * With nothing selected, the runs the caret touches — the characters either
444
520
  * side of it — come off whole.
@@ -449,4 +525,4 @@ declare function sameMarks(a: readonly MarkedLine[], b: readonly MarkedLine[]):
449
525
  */
450
526
  declare function clearMarks(text: string, start: number, end: number, rules?: readonly InlineRule[]): WrapResult;
451
527
 
452
- export { CAMPAIGN_MARKUP, COPY_FIELD_TOOLS, type InlineKind, type InlineRule, type InlineToken, type LinkSpan, MARKUP_TOOLS, MARK_NAMES, MARK_PLACEHOLDERS, type MarkPlaceholders, type MarkSpan, type MarkStyle, type MarkedChar, type MarkedLine, type MarkupLine, type MarkupLink, type MarkupNode, type MarkupRun, type MarkupText, type MarkupTool, STANDARD_MARKUP, STOREFRONT_MARKUP, type WrapResult, applyMark, clearMarks, findLink, isSafeLinkHref, markedAt, markedLines, markupTools, parseMarkup, removeLink, sameMarks, serializeMarkup, spanFor, stripInline, tokenizeInline, writeLink, writeMarkedLines };
528
+ export { CAMPAIGN_MARKUP, COPY_FIELD_TOOLS, type InlineKind, type InlineRule, type InlineToken, type LinkSpan, MARKUP_TOOLS, MARK_NAMES, MARK_PLACEHOLDERS, type MarkPlaceholders, type MarkSpan, type MarkStyle, type MarkedChar, type MarkedLine, type MarkupLine, type MarkupLink, type MarkupNode, type MarkupRun, type MarkupText, type MarkupTool, STANDARD_MARKUP, STOREFRONT_MARKUP, type SpanKind, type WrapResult, applyColor, applyMark, clearMarks, findLink, isColorName, isSafeLinkHref, markedAt, markedLines, markupTools, parseMarkup, removeLink, sameMarks, serializeMarkup, spanFor, stripInline, tokenizeInline, writeLink, writeMarkedLines };
@@ -1 +1 @@
1
- export{CAMPAIGN_MARKUP,COPY_FIELD_TOOLS,MARKUP_TOOLS,MARK_NAMES,MARK_PLACEHOLDERS,STANDARD_MARKUP,STOREFRONT_MARKUP,applyMark,clearMarks,findLink,isSafeLinkHref,markedAt,markedLines,markupTools,parseMarkup,removeLink,sameMarks,serializeMarkup,spanFor,stripInline,tokenizeInline,writeLink,writeMarkedLines}from"../chunk-6OPSJGAI.js";
1
+ export{CAMPAIGN_MARKUP,COPY_FIELD_TOOLS,MARKUP_TOOLS,MARK_NAMES,MARK_PLACEHOLDERS,STANDARD_MARKUP,STOREFRONT_MARKUP,applyColor,applyMark,clearMarks,findLink,isColorName,isSafeLinkHref,markedAt,markedLines,markupTools,parseMarkup,removeLink,sameMarks,serializeMarkup,spanFor,stripInline,tokenizeInline,writeLink,writeMarkedLines}from"../chunk-SJQG5ENJ.js";
@@ -2,7 +2,7 @@
2
2
  * efficient-easel/menu.css — the right-click menu box (card 66400.d).
3
3
  *
4
4
  * THE VALUES ARE NOT OURS. They are the storefront editor's shipped
5
- * `.sf-blockmenu` / `.sf-blockmenu-item` — `efficient-shop/components/storefront-editor.css`,
5
+ * `.sf-blockmenu` / `.sf-blockmenu-item` — `efficient-storefront/components/storefront-editor.css`,
6
6
  * read at line 1165 — which is the look card 66400.d names for the menu Lewis
7
7
  * approved on 2026-08-31. Each `--sf-*` there is already an alias of the
8
8
  * matching `--es-*` here (card 66024), so the look is expressed with no new
@@ -135,7 +135,7 @@
135
135
  box-sizing: border-box;
136
136
  display: flex;
137
137
  flex-direction: column;
138
- gap: 1px;
138
+ gap: 2px;
139
139
  min-width: var(--es-menu-min-w);
140
140
  /* A box that could grow past the viewport would be unreachable on its far
141
141
  side whatever the edge-flip did. */
@@ -159,7 +159,7 @@
159
159
  align-items: center;
160
160
  gap: 8px;
161
161
  width: 100%;
162
- padding: 7px 9px;
162
+ padding: 8px;
163
163
  border: none;
164
164
  border-radius: 6px;
165
165
  background: transparent;
@@ -236,7 +236,7 @@
236
236
 
237
237
  /* ── a caption, and a separator ─────────────────────────────────────────── */
238
238
  .es-menu-header {
239
- padding: 6px 9px 4px;
239
+ padding: 8px 8px 4px;
240
240
  color: var(--es-muted);
241
241
  font-size: 10px;
242
242
  font-weight: 500;
@@ -1 +1 @@
1
- import{DEFAULT_NODE_MENU_WORDS as e}from"../chunk-WK3AFPXY.js";export{canStep,fromItemSelector,parentStep,planDuplicate,planMove,planPaste,planRemove,planSetProps,planStep,toItemSelector,useNodeOps}from"../chunk-D2BCHTQR.js";import{TrashIcon as n,EyeIcon as t,EyeOffIcon as o,RenameIcon as p,PasteIcon as l,CopyIcon as c,MoveDownIcon as s,MoveUpIcon as a,DuplicateIcon as i,AddIcon as r,LayersIcon as u}from"../chunk-YNZZYHA4.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";import{jsx as h}from"react/jsx-runtime";function d(){let e=null;const n=/* @__PURE__ */new Set;return{get:()=>e,set(t){e=t;for(const e of[...n])e()},subscribe:e=>(n.add(e),()=>n.delete(e))}}var m={layer:{icon:/* @__PURE__ */h(u,{})},addInside:{icon:/* @__PURE__ */h(r,{})},duplicate:{icon:/* @__PURE__ */h(i,{})},moveUp:{icon:/* @__PURE__ */h(a,{})},moveDown:{icon:/* @__PURE__ */h(s,{})},copy:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘C"},cut:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘X"},paste:{icon:/* @__PURE__ */h(l,{}),shortcut:"⌘V"},rename:{icon:/* @__PURE__ */h(p,{})},hide:{icon:/* @__PURE__ */h(o,{})},show:{icon:/* @__PURE__ */h(t,{})},upLevel:{},delete:{icon:/* @__PURE__ */h(n,{}),danger:!0}};function v(n){const{actions:t,rows:o={},extras:p={},words:l=e}=n,c=e=>({...m[e],label:l[e],...o[e]}),s=(e,n,t)=>{const o=c(e),p={label:t??o.label??e,onClick:n};return o.icon&&(p.icon=o.icon),o.shortcut&&(p.shortcut=o.shortcut),o.danger&&(p.danger=!0),p},a=()=>{const e=c("layer"),t={label:e.label??l.layer,onClick:()=>{},children:n.layer.items};return e.icon&&(t.icon=e.icon),t},i=[],r=[],u=[],h=[],d=!!n.layer&&n.layer.items.length>1;if(d&&"pick"===(n.layer.group??"pick")&&i.push(a()),t.addInside&&r.push(s("addInside",t.addInside)),t.duplicate&&r.push(s("duplicate",t.duplicate)),t.moveUp&&r.push(s("moveUp",t.moveUp)),t.moveDown&&r.push(s("moveDown",t.moveDown)),t.copy&&r.push(s("copy",t.copy)),t.cut&&r.push(s("cut",t.cut)),t.paste){const e=c("paste").label??l.paste;r.push(s("paste",t.paste.run,l.pasteNamed({paste:e,label:t.paste.label})))}t.rename&&u.push(s("rename",t.rename)),t.hide&&u.push(t.hide.hidden?s("show",t.hide.run):s("hide",t.hide.run)),d&&"change"===n.layer.group&&u.push(a()),t.upLevel&&u.push(s("upLevel",t.upLevel)),t.delete&&h.push(s("delete",t.delete)),i.push(...p.pick??[]),r.push(...p.make??[]),u.push(...p.change??[]),h.push(...p.remove??[]);const v=[i,r,n.style??[],u,h].filter(e=>e.length>0),g=i.length+r.length+u.length+h.length===0,k=[{label:n.title,header:!0,onClick:()=>{}}];return g&&n.pinnedLine&&k.push({label:n.pinnedLine,header:!0,onClick:()=>{}}),v.forEach((e,t)=>{(t>0||g&&n.pinnedLine)&&k.push({label:"—",onClick:()=>{}}),k.push(...e)}),k}export{d as createNodeClipboard,v as nodeMenuItems};
1
+ import{DEFAULT_NODE_MENU_WORDS as e}from"../chunk-WK3AFPXY.js";export{canStep,fromItemSelector,parentStep,planDuplicate,planMove,planPaste,planRemove,planSetProps,planStep,toItemSelector,useNodeOps}from"../chunk-D2BCHTQR.js";import{TrashIcon as n,EyeIcon as t,EyeOffIcon as o,RenameIcon as p,PasteIcon as l,CopyIcon as c,MoveDownIcon as s,MoveUpIcon as a,DuplicateIcon as i,AddIcon as r,LayersIcon as u}from"../chunk-PI26YXYD.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";import{jsx as h}from"react/jsx-runtime";function d(){let e=null;const n=/* @__PURE__ */new Set;return{get:()=>e,set(t){e=t;for(const e of[...n])e()},subscribe:e=>(n.add(e),()=>n.delete(e))}}var m={layer:{icon:/* @__PURE__ */h(u,{})},addInside:{icon:/* @__PURE__ */h(r,{})},duplicate:{icon:/* @__PURE__ */h(i,{})},moveUp:{icon:/* @__PURE__ */h(a,{})},moveDown:{icon:/* @__PURE__ */h(s,{})},copy:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘C"},cut:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘X"},paste:{icon:/* @__PURE__ */h(l,{}),shortcut:"⌘V"},rename:{icon:/* @__PURE__ */h(p,{})},hide:{icon:/* @__PURE__ */h(o,{})},show:{icon:/* @__PURE__ */h(t,{})},upLevel:{},delete:{icon:/* @__PURE__ */h(n,{}),danger:!0}};function v(n){const{actions:t,rows:o={},extras:p={},words:l=e}=n,c=e=>({...m[e],label:l[e],...o[e]}),s=(e,n,t)=>{const o=c(e),p={label:t??o.label??e,onClick:n};return o.icon&&(p.icon=o.icon),o.shortcut&&(p.shortcut=o.shortcut),o.danger&&(p.danger=!0),p},a=()=>{const e=c("layer"),t={label:e.label??l.layer,onClick:()=>{},children:n.layer.items};return e.icon&&(t.icon=e.icon),t},i=[],r=[],u=[],h=[],d=!!n.layer&&n.layer.items.length>1;if(d&&"pick"===(n.layer.group??"pick")&&i.push(a()),t.addInside&&r.push(s("addInside",t.addInside)),t.duplicate&&r.push(s("duplicate",t.duplicate)),t.moveUp&&r.push(s("moveUp",t.moveUp)),t.moveDown&&r.push(s("moveDown",t.moveDown)),t.copy&&r.push(s("copy",t.copy)),t.cut&&r.push(s("cut",t.cut)),t.paste){const e=c("paste").label??l.paste;r.push(s("paste",t.paste.run,l.pasteNamed({paste:e,label:t.paste.label})))}t.rename&&u.push(s("rename",t.rename)),t.hide&&u.push(t.hide.hidden?s("show",t.hide.run):s("hide",t.hide.run)),d&&"change"===n.layer.group&&u.push(a()),t.upLevel&&u.push(s("upLevel",t.upLevel)),t.delete&&h.push(s("delete",t.delete)),i.push(...p.pick??[]),r.push(...p.make??[]),u.push(...p.change??[]),h.push(...p.remove??[]);const v=[i,r,n.style??[],u,h].filter(e=>e.length>0),g=i.length+r.length+u.length+h.length===0,k=[{label:n.title,header:!0,onClick:()=>{}}];return g&&n.pinnedLine&&k.push({label:n.pinnedLine,header:!0,onClick:()=>{}}),v.forEach((e,t)=>{(t>0||g&&n.pinnedLine)&&k.push({label:"—",onClick:()=>{}}),k.push(...e)}),k}export{d as createNodeClipboard,v as nodeMenuItems};
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { W as WordFit } from '../wordFit-9B9nqyf3.js';
4
- export { a as SETTINGS_BUCKETS, S as SettingsBucket } from '../buckets-1vRlQceY.js';
4
+ export { a as SETTINGS_BUCKETS, S as SettingsBucket } from '../buckets-CuLM47h9.js';
5
5
 
6
6
  /**
7
7
  * The settings-panel primitives — the shared grammar BOTH editors' inspector
@@ -110,7 +110,7 @@ type SettingsSegmentedFit = WordFit;
110
110
  *
111
111
  * Written down so the next reader does not find this unused and tidy it away.
112
112
  * The rows above stopped needing it while this was being built: card 66246
113
- * (`efficient-shop` 151afa212, merged 2026-08-31) moved the part panel's three
113
+ * (`efficient-storefront` 151afa212, merged 2026-08-31) moved the part panel's three
114
114
  * tables onto `icon` + a real word — `{ id: "left", label: "Left", icon:
115
115
  * <AlignLeftIcon/> }` — on the owner's ruling that an option says its name AND
116
116
  * draws its glyph. Every `label` in the shop is now a string, and this arm has
@@ -119,7 +119,7 @@ type SettingsSegmentedFit = WordFit;
119
119
  * It stays because it is the shape THE PACKAGE NEXT DOOR ALREADY USES.
120
120
  * `efficient-shell` ships its own `Segmented`, and its `SegmentedOption` has
121
121
  * carried `label: ReactNode` all along. Identical at the two copies installed on
122
- * this desk — 4.63.0 under `editor-shell`, 4.67.0 under `efficient-shop`:
122
+ * this desk — 4.63.0 under `editor-shell`, 4.67.0 under `efficient-storefront`:
123
123
  *
124
124
  * interface SegmentedOption<T extends string = string> {
125
125
  * value: T; label: ReactNode; icon?: ReactNode; disabled?: boolean;
@@ -150,7 +150,7 @@ type SettingsSegmentedFit = WordFit;
150
150
  * it — which is the one thing card 66303 was not allowed to do.
151
151
  *
152
152
  * `V` UNCONSTRAINED and not `T extends string`, because the shop stores a
153
- * choice as a boolean: `reverse` at `efficient-shop/lib/puck/config.tsx:6747` is
153
+ * choice as a boolean: `reverse` at `efficient-storefront/lib/puck/config.tsx:6747` is
154
154
  * `false` = image left and `true` = image right on every published page across
155
155
  * every tenant. `T extends string` cannot hold it, and giving that row the house
156
156
  * strip by storing "left"/"right" would be a migration of live customer data
@@ -236,7 +236,7 @@ type SettingsSegmentedOption<V = string> = SettingsSegmentedOptionBase<V> & Sett
236
236
  * `SettingsTabs` is a TABLIST: its chips switch a panel, which is what
237
237
  * `role="tab"` promises. These chips switch nothing. They write a value and the
238
238
  * panel stays where it is, so they are pressed buttons in a group, and the
239
- * marker is `aria-pressed` — the same one `efficient-shop`'s own `Segmented`
239
+ * marker is `aria-pressed` — the same one `efficient-storefront`'s own `Segmented`
240
240
  * has carried since the 2026-08-06 audit.
241
241
  *
242
242
  * NOT `radiogroup` / `aria-checked`, and the reason is the keyboard rather than
@@ -616,7 +616,7 @@ interface SettingsActionBaseProps {
616
616
  * you must pass an `id`.
617
617
  *
618
618
  * ⚠️ THIS IS THE REASON THE CONTROL IS HERE RATHER THAN IN THE SHOP.
619
- * `efficient-shop`'s own `components/AddChildRow.tsx` explains its disabled
619
+ * `efficient-storefront`'s own `components/AddChildRow.tsx` explains its disabled
620
620
  * button with a `title`, and a `title` on a DISABLED button reaches no screen
621
621
  * reader and no keyboard — the tooltip needs a hover the control no longer
622
622
  * answers. That hole cannot be patched from the shop's side while the shop draws
@@ -740,7 +740,7 @@ declare function SettingsTabs({ items, activeId, onSelect, ariaLabel, className,
740
740
  *
741
741
  * ── WHAT CARD 66303 WIDENED, AND WHY IT HAD TO BE HERE ───────────────────────
742
742
  *
743
- * `efficient-shop` draws its own `Segmented` beside this one and could not stop:
743
+ * `efficient-storefront` draws its own `Segmented` beside this one and could not stop:
744
744
  * four things twelve live call sites need were missing here. Generic `V`
745
745
  * (weights are numbers, "image side" is a boolean on every published page), a
746
746
  * DRAWN label with its own `title`, and `disabled` — on one option or on the
@@ -811,7 +811,7 @@ declare function SettingsGroupHead({ title, level, id, className, }: SettingsGro
811
811
  * above them rather than parts of it.
812
812
  *
813
813
  * THE SHOP ALREADY DREW THIS LOOK, TWICE, WHICH IS WHY IT BELONGS HERE.
814
- * `efficient-shop` hand-rolled `.sf-field-group` in the settings panel and
814
+ * `efficient-storefront` hand-rolled `.sf-field-group` in the settings panel and
815
815
  * `.sf-group-label` in the Layers tree, and they are the same type to the
816
816
  * decimal — 10.5px / 600 / .07em / muted / uppercase. One look, hand-rolled in
817
817
  * two panels of one editor, is the definition of a thing the shell should own.
@@ -937,7 +937,7 @@ declare function SettingsDrill({ name, preview, offPage, status, onOpen, id, cla
937
937
  *
938
938
  * ── WHY IT IS HERE NOW, AND WHY IT WAS NOT BEFORE ───────────────────────────
939
939
  *
940
- * It lived in `efficient-shop` as `FocalPicker`, and its own comment recorded
940
+ * It lived in `efficient-storefront` as `FocalPicker`, and its own comment recorded
941
941
  * the rule for moving it: card 66189 said *"the day a second section wants it,
942
942
  * that is the card that promotes it"*. Card 66214 was that second caller and
943
943
  * deliberately declined — the control was days old and had already changed
@@ -1073,7 +1073,7 @@ declare function SettingsCorners({ label, value, corners, onChange, id, classNam
1073
1073
  *
1074
1074
  * ── AND THE NOTE IS WHY IT IS HERE RATHER THAN IN THE SHOP ──────────────────
1075
1075
  *
1076
- * `note` is wired to the button by `aria-describedby`. `efficient-shop`'s own
1076
+ * `note` is wired to the button by `aria-describedby`. `efficient-storefront`'s own
1077
1077
  * `components/AddChildRow.tsx` explains its disabled button with a `title`, and
1078
1078
  * a `title` on a disabled button reaches no screen reader and no keyboard — the
1079
1079
  * tooltip wants a hover the control has stopped answering. The shop cannot patch
@@ -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;