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.
- package/README.md +13 -5
- package/dist/autosave/index.d.ts +4 -4
- package/dist/{buckets-1vRlQceY.d.ts → buckets-CuLM47h9.d.ts} +1 -1
- package/dist/chrome/chrome.css +25 -16
- package/dist/chrome/index.d.ts +6 -6
- package/dist/chrome/index.js +6 -6
- package/dist/chunk-2UX75JDP.js +1 -0
- package/dist/{chunk-STFMZJKU.js → chunk-66CKSTXP.js} +6 -6
- package/dist/{chunk-YIMRTIBN.js → chunk-IBOFSS56.js} +1 -1
- package/dist/{chunk-OGZFDJ6G.js → chunk-JE63JHKO.js} +1 -1
- package/dist/{chunk-CERTFXCV.js → chunk-JYPOOHII.js} +3 -3
- package/dist/chunk-PI26YXYD.js +462 -0
- package/dist/chunk-SJQG5ENJ.js +1 -0
- package/dist/{chunk-2LUSK32B.js → chunk-ZT7M24XD.js} +1 -1
- package/dist/copy/copy.css +5 -5
- package/dist/copy/index.d.ts +5 -5
- package/dist/copy/index.js +10 -10
- package/dist/drag/drag.css +15 -15
- package/dist/drag/index.js +5 -5
- package/dist/edit-lock/index.d.ts +1 -1
- package/dist/editor/index.d.ts +2 -2
- package/dist/fields/fields.css +126 -12
- package/dist/fields/index.d.ts +59 -11
- package/dist/fields/index.js +40 -33
- package/dist/gold/index.d.ts +1 -1
- package/dist/gold/index.js +1 -1
- package/dist/icons/index.d.ts +26 -5
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/markup/index.d.ts +97 -21
- package/dist/markup/index.js +1 -1
- package/dist/menu/menu.css +4 -4
- package/dist/node-ops/index.js +1 -1
- package/dist/panel/index.d.ts +10 -10
- package/dist/panel/panel.css +34 -25
- package/dist/pick/pick.css +8 -8
- package/dist/rail/index.d.ts +2 -2
- package/dist/rail/index.js +1 -1
- package/dist/rail/rail.css +1 -1
- package/dist/render/index.d.ts +1 -1
- package/dist/shell/index.d.ts +24 -4
- package/dist/shell/index.js +1 -1
- package/dist/shell/shell.css +12 -2
- package/dist/strings/catalogue.d.ts +4 -4
- package/dist/strings/catalogue.js +1 -1
- package/dist/strings/index.d.ts +4 -4
- package/dist/strings/index.js +1 -1
- package/dist/style-clipboard/index.js +1 -1
- package/dist/tree/index.d.ts +1 -1
- package/dist/tree/index.js +1 -1
- package/dist/tree/tree.css +11 -11
- package/dist/{types-CEqUFH2j.d.ts → types-C7HFvdtk.d.ts} +26 -4
- package/dist/{types-CuNiSnX6.d.ts → types-CnRzp9oc.d.ts} +1 -1
- package/dist/{words-CsRWXkY4.d.ts → words-Cqmyey0s.d.ts} +2 -2
- package/dist/{words-DfxEp_RH.d.ts → words-bOMsUJk9.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-6OPSJGAI.js +0 -1
- package/dist/chunk-FI23ALVJ.js +0 -1
- package/dist/chunk-YNZZYHA4.js +0 -450
package/dist/markup/index.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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;
|
|
91
|
-
* writes no mark at all — it takes them off ({@link clearMarks})
|
|
92
|
-
|
|
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
|
|
326
|
-
* tree writes back the same bytes it was read
|
|
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
|
-
* `
|
|
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
|
-
* -
|
|
367
|
-
*
|
|
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),
|
|
393
|
-
*
|
|
394
|
-
*
|
|
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,
|
|
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 `- `
|
|
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
|
|
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,
|
|
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 };
|
package/dist/markup/index.js
CHANGED
|
@@ -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-
|
|
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";
|
package/dist/menu/menu.css
CHANGED
|
@@ -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-
|
|
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:
|
|
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:
|
|
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:
|
|
239
|
+
padding: 8px 8px 4px;
|
|
240
240
|
color: var(--es-muted);
|
|
241
241
|
font-size: 10px;
|
|
242
242
|
font-weight: 500;
|
package/dist/node-ops/index.js
CHANGED
|
@@ -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-
|
|
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};
|
package/dist/panel/index.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
package/dist/panel/panel.css
CHANGED
|
@@ -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
|
|
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)
|
|
15
|
-
* together to 38 and 11 (card 66301),
|
|
16
|
-
*
|
|
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-
|
|
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:
|
|
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:
|
|
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:
|
|
145
|
+
--es-rhythm-group-first: var(--es-space-12);
|
|
137
146
|
/* BETWEEN two settings */
|
|
138
|
-
--es-rhythm-between:
|
|
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:
|
|
149
|
+
--es-rhythm-between-tight: var(--es-space-32);
|
|
141
150
|
/* WITHIN one setting: its label to its own control */
|
|
142
|
-
--es-rhythm-within:
|
|
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:
|
|
164
|
-
--es-track-pad:
|
|
165
|
-
--es-track-gap:
|
|
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:
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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:
|
|
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:
|
|
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)
|
|
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-
|
|
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:
|
|
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:
|
|
1443
|
+
margin: 8px 0 0;
|
|
1435
1444
|
font-size: 11px;
|
|
1436
1445
|
line-height: 1.4;
|
|
1437
1446
|
color: var(--es-muted);
|
package/dist/pick/pick.css
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
--es-pick-readout-w: 80px;
|
|
11
11
|
display: flex;
|
|
12
12
|
flex-direction: column;
|
|
13
|
-
gap:
|
|
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
|
|
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
|
|
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:
|
|
82
|
-
padding:
|
|
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:
|
|
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:
|
|
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:
|
|
211
|
+
padding: 4px 12px;
|
|
212
212
|
border: 1px solid var(--es-input-border);
|
|
213
213
|
border-radius: 6px;
|
|
214
214
|
background: var(--es-panel);
|
package/dist/rail/index.d.ts
CHANGED
|
@@ -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-
|
|
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:
|
|
94
|
+
readonly wordGap: 8;
|
|
95
95
|
readonly wordFontSize: 12;
|
|
96
96
|
readonly wordFontWeight: 500;
|
|
97
97
|
/** Hover/active colour transition. */
|
package/dist/rail/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../chunk-OWBO4WKA.js";export{EditorRail,EditorRailButton,railCssVars,railTokens}from"../chunk-
|
|
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";
|
package/dist/rail/rail.css
CHANGED