efficient-easel 0.96.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.
- package/README.md +98 -3
- package/dist/autosave/index.d.ts +4 -4
- package/dist/blocks/index.d.ts +15 -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-6JDII7N3.js → chunk-6PS6STGA.js} +1 -1
- package/dist/{chunk-EFTTSIMK.js → chunk-D2BCHTQR.js} +1 -1
- package/dist/{chunk-YIMRTIBN.js → chunk-IBOFSS56.js} +1 -1
- package/dist/chunk-KRXQM65X.js +1 -0
- package/dist/chunk-PI26YXYD.js +462 -0
- package/dist/{chunk-FJE4IDBQ.js → chunk-YRLPFZW3.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/data/index.d.ts +171 -4
- package/dist/data/index.js +1 -1
- package/dist/drag/drag.css +15 -15
- package/dist/drag/index.d.ts +1 -1
- package/dist/drag/index.js +15 -15
- package/dist/edit-lock/index.d.ts +1 -1
- package/dist/editor/index.d.ts +9 -9
- package/dist/editor/index.js +6 -6
- package/dist/fields/fields.css +126 -12
- package/dist/fields/index.d.ts +61 -13
- package/dist/fields/index.js +41 -34
- package/dist/gold/index.d.ts +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/menu/menu.css +4 -4
- package/dist/node-ops/index.d.ts +3 -3
- 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/{plan-DtNw2VuI.d.ts → plan-DChbUXdS.d.ts} +1 -1
- 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 +2 -2
- package/dist/{resolve-DpH8YQOA.d.ts → resolve-D68pb3Bx.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/index.d.ts +4 -4
- 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-DziKCwsN.d.ts → types-41704JE4.d.ts} +8 -1
- 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/{types-_Vayx8ov.d.ts → types-Dy6oR6Z2.d.ts} +2 -2
- package/dist/{useNodeOps-6IAej9jy.d.ts → useNodeOps-BF0fQsif.d.ts} +2 -2
- 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-FI23ALVJ.js +0 -1
- package/dist/chunk-LPRQDDQO.js +0 -1
- package/dist/chunk-YNZZYHA4.js +0 -450
package/dist/icons/index.d.ts
CHANGED
|
@@ -53,7 +53,7 @@ declare const iconMeanings: {
|
|
|
53
53
|
readonly anchor: "anchor";
|
|
54
54
|
readonly hash: "a NUMBER or its unit — worn by the `Measure length in` row (px / %) of the campaign editor's Divider, which picks what the length beside it is counted in.";
|
|
55
55
|
readonly columns: "columns";
|
|
56
|
-
readonly list: "a list of entries a merchant orders — worn by the `Phone order` row of the campaign editor's Section settings and by the `Links` row of its Social block.";
|
|
56
|
+
readonly list: "a list of entries a merchant orders — worn by the `Phone order` row of the campaign editor's Section settings and by the `Links` row of its Social block. …AND THE `Bulleted list` toolbar button of the campaign editor's Text block, and the `Bulleted list` item of its No list / Bulleted list / Numbered list menu (final design, 2026-10-06): lines set as a list. `numbered-list` is its pair, with figures in place of the dots.";
|
|
57
57
|
readonly "text-lines": "text lines";
|
|
58
58
|
readonly "text-size": "text size";
|
|
59
59
|
readonly "text-small": "SMALL TYPE — an eyebrow, a caption, a label run. Worn by the `Eyebrow` row of the campaign editor's Text block and by the `Tagline` row of its Logo. The set's `text-size` is the SIZE control; this is the small-type kind itself.";
|
|
@@ -121,7 +121,7 @@ declare const iconMeanings: {
|
|
|
121
121
|
readonly "column-gap": "the air between columns SIDE BY SIDE — the `Gap between columns` row of the campaign editor's Section settings. Decided 2026-09-17. The GAP is the subject: two short upright bars with an arrowed space between them, drawn like `width`'s arrows. NOT `gap`, which is the air between STACKED things (the `Space between items` row wears that), and NOT `block-column`, whose two boxes the first draft read as at 16px (GG, 2026-09-17).";
|
|
122
122
|
readonly "v-align": "where content sits UP AND DOWN inside its box — the `Content position` row (top / middle / bottom) of the campaign editor's Column settings. Decided 2026-09-17. A block between a top and a bottom rule. NOT `padding-top`, which has one rule and says how much room is above.";
|
|
123
123
|
readonly height: "how TALL a thing is — the `Min height` row of the campaign editor's Column settings. Decided 2026-09-17. `width` stood upright, so the pair reads as one family. NOT `width`, which is side to side.";
|
|
124
|
-
readonly underline: "whether links are UNDERLINED — the `Underline links` row of the campaign editor's Email styles. Decided 2026-09-17. A U over a rule, the mark every word processor uses. NOT `type`, which is the text marker, the T.";
|
|
124
|
+
readonly underline: "whether links are UNDERLINED — the `Underline links` row of the campaign editor's Email styles. Decided 2026-09-17. A U over a rule, the mark every word processor uses. NOT `type`, which is the text marker, the T. …AND THE `Underline` toolbar button of the campaign editor's Text block (final design, 2026-10-06): the mark that underlines the selected words. One idea, words with a rule under them, so the button wears this drawing rather than a second copy of it.";
|
|
125
125
|
readonly "line-style": "WHICH DASH a rule is drawn with — the `Line style` row (Solid / Dashed / Dotted) of the campaign editor's Divider, and of every Border row. Decided 2026-09-17. Three rules stacked: solid, dashed, dotted, so the row's own choices are the drawing. NOT `block-divider`, the Divider BLOCK kind, which is one plain line and never wears a settings row.";
|
|
126
126
|
readonly "full-width": "how far a picture REACHES — the `Width` row (Default / Full width) of the campaign editor's Image block. Decided 2026-09-17. A band running edge to edge between two end walls. NOT `width`, a plain measure with two arrowheads, which says how wide rather than how far it reaches.";
|
|
127
127
|
readonly "copy-style": "take a component's LOOK so it can be put on another one — the `Copy style` row (⌥⌘C) of the right-click menu in both editors, the campaign editor's block menu and the website editor's node menu. Decided 2026-09-19 (card [ADD] Copy Style And Paste Style; GG: one meaning per glyph, so it is not `copy`). The brush is the style; the back sheet is `copy`'s own, so the pair reads as \"copy, but the look\". NOT `copy`, which takes the whole block, and NOT `styles`, which opens the site's Styles panel.";
|
|
@@ -160,6 +160,13 @@ declare const iconMeanings: {
|
|
|
160
160
|
readonly emphasis: "the EMPHASIS mark — the toolbar button that writes `==words==` over the selection in the copy box's formatting bar: the phrase painted in the brand accent colour. A diamond, the ◆ the bar has shown for this mark since the campaign designer first drew it. Decided 2026-10-02.";
|
|
161
161
|
readonly quiet: "the QUIET mark — the toolbar button that writes `^^words^^` over the selection in the copy box's formatting bar: smaller, softer words, like the fine print under a price. A small one-storey a. It is drawn SMALL on purpose, under the set's 14–17.5 box: smaller is what the mark does, and the design (v5) draws this button's a smaller than the B beside it. Decided 2026-10-02.";
|
|
162
162
|
readonly "clear-marks": "CLEAR MARKS — the toolbar button that takes every mark off the selection in the copy box's formatting bar (⌘⇧X), keeping the words and any link. A T with a small × at its foot: the text, with its marks crossed out. Decided 2026-10-02.";
|
|
163
|
+
readonly superscript: "the SUPERSCRIPT mark — raised small text (®, ™, a footnote¹). Worn by the `Superscript` toolbar button of the campaign editor's Text block and the `Superscript` item of its Normal / Superscript / Subscript menu. A capital A with a small 2 at its top right (Lewis, 2026-10-06: the design's x, then a T, then, after seeing the T: use A for all). Decided 2026-10-06.";
|
|
164
|
+
readonly subscript: "the SUBSCRIPT mark — lowered small text (H₂O). Worn by the `Subscript` toolbar button of the campaign editor's Text block and the `Subscript` item of its Normal / Superscript / Subscript menu. The same capital A as `superscript`, with the small 2 at its foot (Lewis, 2026-10-06: after seeing the T: use A for all). Decided 2026-10-06.";
|
|
165
|
+
readonly "numbered-list": "a NUMBERED LIST — the lines the caret is on, written as 1. 2. 3. Worn by the `Numbered list` toolbar button of the campaign editor's Text block and the `Numbered list` item of its No list / Bulleted list / Numbered list menu. Three rules with 1, 2, 3 down the left. Decided 2026-10-06.";
|
|
166
|
+
readonly "paragraph-spacing": "PARAGRAPH SPACING — the room between one paragraph and the next, in px. Worn by the fourth value of the campaign editor's Text block number row (`Paragraph spacing`, beside Font size, Line spacing and Letter spacing). Two short paragraphs with a small upright mark in the room between them. Decided 2026-10-06.";
|
|
167
|
+
readonly "case-normal": "letter case LEFT AS TYPED — `Aa`, the `Normal` option of the Letter case buttons (Normal / Uppercase / Lowercase) on the campaign editor's Text block, and of the storefront part panel's Case strip. The plan calls it sentence case; it changes nothing the merchant typed. A capital A beside a one-storey a. Decided 2026-10-06.";
|
|
168
|
+
readonly "case-upper": "letter case ALL CAPITALS — `AA`, the `Uppercase` option of the Letter case buttons on the campaign editor's Text block, and of the storefront part panel's Case strip. Two capital A's. Decided 2026-10-06.";
|
|
169
|
+
readonly "case-lower": "letter case ALL SMALL LETTERS — `aa`, the `Lowercase` option of the Letter case buttons on the campaign editor's Text block, and of the storefront part panel's Case strip. Two one-storey a's. Decided 2026-10-06.";
|
|
163
170
|
};
|
|
164
171
|
type IconName = keyof typeof iconMeanings;
|
|
165
172
|
/** Delete · keep · efficient-shop · components/UiIcon.tsx:99 */
|
|
@@ -256,7 +263,7 @@ declare function AnchorIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
|
256
263
|
declare function HashIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
257
264
|
/** columns · new · drawn for the settings-panel design, 2026-08-20 */
|
|
258
265
|
declare function ColumnsIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
259
|
-
/** a list of entries a merchant orders — worn by the `Phone order` row of the campaign editor's Section settings and by the `Links` row of its Social block. · new · drawn for the settings-panel design, 2026-08-20 Meaning written 2026-09-17 (0.46.0): the entry named its own shape until then, which is what lets a second meaning attach to a drawing. */
|
|
266
|
+
/** a list of entries a merchant orders — worn by the `Phone order` row of the campaign editor's Section settings and by the `Links` row of its Social block. …AND THE `Bulleted list` toolbar button of the campaign editor's Text block, and the `Bulleted list` item of its No list / Bulleted list / Numbered list menu (final design, 2026-10-06): lines set as a list. `numbered-list` is its pair, with figures in place of the dots. · new · drawn for the settings-panel design, 2026-08-20 Meaning written 2026-09-17 (0.46.0): the entry named its own shape until then, which is what lets a second meaning attach to a drawing. */
|
|
260
267
|
declare function ListIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
261
268
|
/** text lines · new · drawn for the settings-panel design, 2026-08-20 */
|
|
262
269
|
declare function TextLinesIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
@@ -392,7 +399,7 @@ declare function ColumnGapIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
|
392
399
|
declare function VAlignIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
393
400
|
/** how TALL a thing is — the `Min height` row of the campaign editor's Column settings. Decided 2026-09-17. `width` stood upright, so the pair reads as one family. NOT `width`, which is side to side. · new · drawn for the campaign editor redesign approved 2026-09-17 (admin PR 8: the Section, Column and Email styles rows move onto SettingsField, and every row carries a glyph). Checked at 16px beside the glyphs it must not be read as. */
|
|
394
401
|
declare function HeightIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
395
|
-
/** whether links are UNDERLINED — the `Underline links` row of the campaign editor's Email styles. Decided 2026-09-17. A U over a rule, the mark every word processor uses. NOT `type`, which is the text marker, the T. · new · drawn for the campaign editor redesign approved 2026-09-17 (admin PR 8: the Section, Column and Email styles rows move onto SettingsField, and every row carries a glyph). Checked at 16px beside the glyphs it must not be read as. */
|
|
402
|
+
/** whether links are UNDERLINED — the `Underline links` row of the campaign editor's Email styles. Decided 2026-09-17. A U over a rule, the mark every word processor uses. NOT `type`, which is the text marker, the T. …AND THE `Underline` toolbar button of the campaign editor's Text block (final design, 2026-10-06): the mark that underlines the selected words. One idea, words with a rule under them, so the button wears this drawing rather than a second copy of it. · new · drawn for the campaign editor redesign approved 2026-09-17 (admin PR 8: the Section, Column and Email styles rows move onto SettingsField, and every row carries a glyph). Checked at 16px beside the glyphs it must not be read as. */
|
|
396
403
|
declare function UnderlineIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
397
404
|
/** WHICH DASH a rule is drawn with — the `Line style` row (Solid / Dashed / Dotted) of the campaign editor's Divider, and of every Border row. Decided 2026-09-17. Three rules stacked: solid, dashed, dotted, so the row's own choices are the drawing. NOT `block-divider`, the Divider BLOCK kind, which is one plain line and never wears a settings row. · new · drawn for the campaign editor redesign approved 2026-09-17 (admin PR 9: the content and media blocks' rows move onto SettingsField). Checked at 16px beside the glyphs it must not be read as. */
|
|
398
405
|
declare function LineStyleIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
@@ -470,5 +477,19 @@ declare function EmphasisIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
|
470
477
|
declare function QuietIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
471
478
|
/** CLEAR MARKS — the toolbar button that takes every mark off the selection in the copy box's formatting bar (⌘⇧X), keeping the words and any link. A T with a small × at its foot: the text, with its marks crossed out. Decided 2026-10-02. · new · efficient-editor · [FINISH] Markdown Text Box To The Approved Design, 2026-10-02. Lewis approved the box's toolbar on 2026-10-02 (design v5, https://claude.ai/artifact/SZDRnLuGot2tmnduhKgfVs): ONE glyph button per mark, B (**) · I (_) · S (~~) · ◆ (==) · a (^^) · link · clear, and no words on the buttons — the names live only in the tooltip and the aria-label. ⛔ NOT `close`, the bare ×, which closes a window. ⛔ NOT `type`, the bare T that marks a text setting. ⛔ NOT `revert`, the hooked arrow that puts a setting back to what it inherits — clear takes marks off words, it does not reset a setting. ⛔ NOT `trash`, which deletes. */
|
|
472
479
|
declare function ClearMarksIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
480
|
+
/** the SUPERSCRIPT mark — raised small text (®, ™, a footnote¹). Worn by the `Superscript` toolbar button of the campaign editor's Text block and the `Superscript` item of its Normal / Superscript / Subscript menu. A capital A with a small 2 at its top right (Lewis, 2026-10-06: the design's x, then a T, then, after seeing the T: use A for all). Decided 2026-10-06. · picked · efficient-easel · [ADD] Text Box Icons For The Final Design, 2026-10-06 (step E2 of the campaign-editor plan Lewis approved that day). Final design: https://claude.ai/artifact/Mpzgvi2sZmTCmciZW36w5H. The Text block's toolbar is two rows of 32px glyph buttons with the names only in the tooltip and the aria-label; the number row is Font size · Line spacing · Letter spacing · Paragraph spacing. Checked at 16px beside every neighbour named here before it was committed. ⛔ NOT `subscript`, the same A with the 2 at its FOOT: the pair differs only in where the 2 sits, and that is the meaning. ⛔ NOT `case-normal` (A beside a small a) or `case-upper` (two A's): here the small thing beside the A is a figure, raised. ⛔ NOT `clear-marks`, a T with a small × at its foot. The 2 is the design's path; the drawing sits 1 right and 0.7 down of the design so it is centred. The letter went x → T → A on Lewis's word, 2026-10-06: the Ts did not look right beside Aa / AA / aa. */
|
|
481
|
+
declare function SuperscriptIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
482
|
+
/** the SUBSCRIPT mark — lowered small text (H₂O). Worn by the `Subscript` toolbar button of the campaign editor's Text block and the `Subscript` item of its Normal / Superscript / Subscript menu. The same capital A as `superscript`, with the small 2 at its foot (Lewis, 2026-10-06: after seeing the T: use A for all). Decided 2026-10-06. · picked · efficient-easel · [ADD] Text Box Icons For The Final Design, 2026-10-06 (step E2 of the campaign-editor plan Lewis approved that day). Final design: https://claude.ai/artifact/Mpzgvi2sZmTCmciZW36w5H. The Text block's toolbar is two rows of 32px glyph buttons with the names only in the tooltip and the aria-label; the number row is Font size · Line spacing · Letter spacing · Paragraph spacing. Checked at 16px beside every neighbour named here before it was committed. ⛔ NOT `superscript`, the same A with the 2 at its TOP. ⛔ NOT `case-normal` (A beside a small a) or `case-upper` (two A's): here the small thing at the A's foot is a figure. ⛔ NOT `clear-marks`, a T with a small × at its foot. The 2 is the design's path; the drawing sits 1 right and 1 up of the design so it is centred. The letter went x → T → A on Lewis's word, 2026-10-06. */
|
|
483
|
+
declare function SubscriptIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
484
|
+
/** a NUMBERED LIST — the lines the caret is on, written as 1. 2. 3. Worn by the `Numbered list` toolbar button of the campaign editor's Text block and the `Numbered list` item of its No list / Bulleted list / Numbered list menu. Three rules with 1, 2, 3 down the left. Decided 2026-10-06. · picked · efficient-easel · [ADD] Text Box Icons For The Final Design, 2026-10-06 (step E2 of the campaign-editor plan Lewis approved that day). Final design: https://claude.ai/artifact/Mpzgvi2sZmTCmciZW36w5H. The Text block's toolbar is two rows of 32px glyph buttons with the names only in the tooltip and the aria-label; the number row is Font size · Line spacing · Letter spacing · Paragraph spacing. Checked at 16px beside every neighbour named here before it was committed. ⛔ NOT `list`, the same three rules with DOTS, which is the bulleted list (and the orderable-entries rows): dots against figures is the whole difference, and at 16px the figures still read as figures. ⛔ NOT `text-lines`, plain rules with nothing at the edge. ⛔ NOT `hash`, a number as a VALUE. Paths from the design; the 3 lifted 0.1 so the drawing is centred. */
|
|
485
|
+
declare function NumberedListIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
486
|
+
/** PARAGRAPH SPACING — the room between one paragraph and the next, in px. Worn by the fourth value of the campaign editor's Text block number row (`Paragraph spacing`, beside Font size, Line spacing and Letter spacing). Two short paragraphs with a small upright mark in the room between them. Decided 2026-10-06. · picked · efficient-easel · [ADD] Text Box Icons For The Final Design, 2026-10-06 (step E2 of the campaign-editor plan Lewis approved that day). Final design: https://claude.ai/artifact/Mpzgvi2sZmTCmciZW36w5H. The Text block's toolbar is two rows of 32px glyph buttons with the names only in the tooltip and the aria-label; the number row is Font size · Line spacing · Letter spacing · Paragraph spacing. Checked at 16px beside every neighbour named here before it was committed. ⛔ NOT `text-lines`, three rules evenly spaced, which is LINE spacing inside a paragraph: here the rules come in two pairs and the gap between the pairs is the subject. ⛔ NOT `gap`, two stacked cards, the room between BLOCKS. ⛔ NOT `padding-y`, the room inside a box. ⛔ NOT `align-left`, ragged rules. Paths from the design, unchanged. */
|
|
487
|
+
declare function ParagraphSpacingIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
488
|
+
/** letter case LEFT AS TYPED — `Aa`, the `Normal` option of the Letter case buttons (Normal / Uppercase / Lowercase) on the campaign editor's Text block, and of the storefront part panel's Case strip. The plan calls it sentence case; it changes nothing the merchant typed. A capital A beside a one-storey a. Decided 2026-10-06. · picked · efficient-easel · [ADD] Text Box Icons For The Final Design, 2026-10-06 (step E2 of the campaign-editor plan Lewis approved that day). Final design: https://claude.ai/artifact/Mpzgvi2sZmTCmciZW36w5H. The Text block's toolbar is two rows of 32px glyph buttons with the names only in the tooltip and the aria-label; the number row is Font size · Line spacing · Letter spacing · Paragraph spacing. Checked at 16px beside every neighbour named here before it was committed. MOVED FROM THE STOREFRONT: efficient-storefront `components/PartGlyphs.tsx` `CaseGlyph` drew Aa / AA / aa as live text at weight 600; the plan makes the set the one source, so these are strokes now, and the storefront should import them instead. ⛔ NOT `case`, a T beside an a, which is the Letter case ROW (the question); this is one ANSWER. ⛔ NOT `quiet`, the small a alone. ⛔ NOT `type`, the T. */
|
|
489
|
+
declare function CaseNormalIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
490
|
+
/** letter case ALL CAPITALS — `AA`, the `Uppercase` option of the Letter case buttons on the campaign editor's Text block, and of the storefront part panel's Case strip. Two capital A's. Decided 2026-10-06. · picked · efficient-easel · [ADD] Text Box Icons For The Final Design, 2026-10-06 (step E2 of the campaign-editor plan Lewis approved that day). Final design: https://claude.ai/artifact/Mpzgvi2sZmTCmciZW36w5H. The Text block's toolbar is two rows of 32px glyph buttons with the names only in the tooltip and the aria-label; the number row is Font size · Line spacing · Letter spacing · Paragraph spacing. Checked at 16px beside every neighbour named here before it was committed. MOVED FROM THE STOREFRONT: efficient-storefront `components/PartGlyphs.tsx` `CaseGlyph` (`AA`, live text); the set is the one source now. ⛔ NOT `case-normal`, which is A beside a SMALL a. ⛔ NOT `case`, the row's T + a. ⛔ NOT `bold`: this is which letters, not how heavy. The two A's are drawn narrow with a 3.5-unit channel between their feet, so they stay two letters at 16px. */
|
|
491
|
+
declare function CaseUpperIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
492
|
+
/** letter case ALL SMALL LETTERS — `aa`, the `Lowercase` option of the Letter case buttons on the campaign editor's Text block, and of the storefront part panel's Case strip. Two one-storey a's. Decided 2026-10-06. · picked · efficient-easel · [ADD] Text Box Icons For The Final Design, 2026-10-06 (step E2 of the campaign-editor plan Lewis approved that day). Final design: https://claude.ai/artifact/Mpzgvi2sZmTCmciZW36w5H. The Text block's toolbar is two rows of 32px glyph buttons with the names only in the tooltip and the aria-label; the number row is Font size · Line spacing · Letter spacing · Paragraph spacing. Checked at 16px beside every neighbour named here before it was committed. MOVED FROM THE STOREFRONT: efficient-storefront `components/PartGlyphs.tsx` `CaseGlyph` (`aa`, live text); the set is the one source now. ⛔ NOT `case-normal`, a capital A beside the a. ⛔ NOT `quiet`, ONE small a drawn under the set's box, which is the quiet mark on a phrase. ⛔ NOT `case`, the row's T + a. A 3-unit channel between the first stem and the second bowl keeps them two letters at 16px. */
|
|
493
|
+
declare function CaseLowerIcon({ size, ...rest }: IconProps): react.JSX.Element;
|
|
473
494
|
|
|
474
|
-
export { AccentIcon, AccountIcon, AddIcon, AlignCenterIcon, AlignLeftIcon, AlignRightIcon, AlignSeparateIcon, AnchorIcon, AnimationIcon, BackgroundIcon, BellIcon, BlackAndWhiteIcon, BlockBadgeIcon, BlockBannerIcon, BlockBoxIcon, BlockButtonIcon, BlockColumnIcon, BlockCouponIcon, BlockDividerIcon, BlockFooterIcon, BlockHeadingIcon, BlockIncludedListIcon, BlockLayeredImagesIcon, BlockProductIcon, BlockSectionIcon, BlockSocialIcon, BlockSpacerIcon, BlockTextIcon, BlockVideoIcon, BlogPostIcon, BoldIcon, BreadcrumbIcon, ButtonArrowIcon, ButtonIcon, CarIcon, CartIcon, CaseIcon, CategoryIcon, ChatIcon, CheckIcon, ChevronIcon, ClearMarksIcon, ClockIcon, CloseIcon, ColumnGapIcon, ColumnWidthsIcon, ColumnsIcon, ContrastIcon, CopyIcon, CopyStyleIcon, CopyToPageIcon, CornerIcon, DesktopIcon, DiagramIcon, DirectionDownIcon, DirectionIcon, DirectionLeftIcon, DirectionRightIcon, DirectionUpIcon, DollarIcon, DragIcon, DropIcon, DuplicateIcon, EmphasisIcon, ExternalIcon, EyeIcon, EyeOffIcon, FinishIcon, FullWidthIcon, GapIcon, GlobeIcon, GridIcon, GroundIcon, HashIcon, HeadquartersIcon, HeightIcon, HoverIcon, type IconName, type IconProps, ImageIcon, ItalicIcon, LayersIcon, LayoutIcon, LetterSpacingIcon, LineBetweenIcon, LineStyleIcon, LinkIcon, ListIcon, LocationIcon, LockIcon, LogoIcon, MediaIcon, MenuIcon, MetaIcon, MoveDownIcon, MoveUpIcon, NoteIcon, NudgeIcon, OpacityIcon, OwnTextIcon, PaddingBottomIcon, PaddingLeftIcon, PaddingRightIcon, PaddingTopIcon, PaddingXIcon, PaddingYIcon, PageIcon, PasteIcon, PasteStyleIcon, PhoneIcon, PlacementIcon, PlayIcon, PlusMinusIcon, ProductFieldIcon, ProductSizeIcon, QuietIcon, RadiusIcon, RedoIcon, RenameIcon, RevertIcon, RotateIcon, ScrollPointIcon, SearchIcon, SendIcon, SettingsIcon, ShadowIcon, SitemapIcon, SortIcon, SpecTableIcon, SquareIcon, StateIcon, StickyIcon, StrikeIcon, StylesIcon, TabletIcon, TabsIcon, TagIcon, TemplateIcon, TextColorIcon, TextLinesIcon, TextSizeIcon, TextSmallIcon, ThemeIcon, TitleIcon, TrashIcon, TriggerIcon, TypeIcon, UnderlineIcon, UndoIcon, VAlignIcon, WarningIcon, WeightIcon, WheelIcon, WidthIcon, WordsFromIcon, WrapIcon, iconMeanings };
|
|
495
|
+
export { AccentIcon, AccountIcon, AddIcon, AlignCenterIcon, AlignLeftIcon, AlignRightIcon, AlignSeparateIcon, AnchorIcon, AnimationIcon, BackgroundIcon, BellIcon, BlackAndWhiteIcon, BlockBadgeIcon, BlockBannerIcon, BlockBoxIcon, BlockButtonIcon, BlockColumnIcon, BlockCouponIcon, BlockDividerIcon, BlockFooterIcon, BlockHeadingIcon, BlockIncludedListIcon, BlockLayeredImagesIcon, BlockProductIcon, BlockSectionIcon, BlockSocialIcon, BlockSpacerIcon, BlockTextIcon, BlockVideoIcon, BlogPostIcon, BoldIcon, BreadcrumbIcon, ButtonArrowIcon, ButtonIcon, CarIcon, CartIcon, CaseIcon, CaseLowerIcon, CaseNormalIcon, CaseUpperIcon, CategoryIcon, ChatIcon, CheckIcon, ChevronIcon, ClearMarksIcon, ClockIcon, CloseIcon, ColumnGapIcon, ColumnWidthsIcon, ColumnsIcon, ContrastIcon, CopyIcon, CopyStyleIcon, CopyToPageIcon, CornerIcon, DesktopIcon, DiagramIcon, DirectionDownIcon, DirectionIcon, DirectionLeftIcon, DirectionRightIcon, DirectionUpIcon, DollarIcon, DragIcon, DropIcon, DuplicateIcon, EmphasisIcon, ExternalIcon, EyeIcon, EyeOffIcon, FinishIcon, FullWidthIcon, GapIcon, GlobeIcon, GridIcon, GroundIcon, HashIcon, HeadquartersIcon, HeightIcon, HoverIcon, type IconName, type IconProps, ImageIcon, ItalicIcon, LayersIcon, LayoutIcon, LetterSpacingIcon, LineBetweenIcon, LineStyleIcon, LinkIcon, ListIcon, LocationIcon, LockIcon, LogoIcon, MediaIcon, MenuIcon, MetaIcon, MoveDownIcon, MoveUpIcon, NoteIcon, NudgeIcon, NumberedListIcon, OpacityIcon, OwnTextIcon, PaddingBottomIcon, PaddingLeftIcon, PaddingRightIcon, PaddingTopIcon, PaddingXIcon, PaddingYIcon, PageIcon, ParagraphSpacingIcon, PasteIcon, PasteStyleIcon, PhoneIcon, PlacementIcon, PlayIcon, PlusMinusIcon, ProductFieldIcon, ProductSizeIcon, QuietIcon, RadiusIcon, RedoIcon, RenameIcon, RevertIcon, RotateIcon, ScrollPointIcon, SearchIcon, SendIcon, SettingsIcon, ShadowIcon, SitemapIcon, SortIcon, SpecTableIcon, SquareIcon, StateIcon, StickyIcon, StrikeIcon, StylesIcon, SubscriptIcon, SuperscriptIcon, TabletIcon, TabsIcon, TagIcon, TemplateIcon, TextColorIcon, TextLinesIcon, TextSizeIcon, TextSmallIcon, ThemeIcon, TitleIcon, TrashIcon, TriggerIcon, TypeIcon, UnderlineIcon, UndoIcon, VAlignIcon, WarningIcon, WeightIcon, WheelIcon, WidthIcon, WordsFromIcon, WrapIcon, iconMeanings };
|
package/dist/icons/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{AccentIcon,AccountIcon,AddIcon,AlignCenterIcon,AlignLeftIcon,AlignRightIcon,AlignSeparateIcon,AnchorIcon,AnimationIcon,BackgroundIcon,BellIcon,BlackAndWhiteIcon,BlockBadgeIcon,BlockBannerIcon,BlockBoxIcon,BlockButtonIcon,BlockColumnIcon,BlockCouponIcon,BlockDividerIcon,BlockFooterIcon,BlockHeadingIcon,BlockIncludedListIcon,BlockLayeredImagesIcon,BlockProductIcon,BlockSectionIcon,BlockSocialIcon,BlockSpacerIcon,BlockTextIcon,BlockVideoIcon,BlogPostIcon,BoldIcon,BreadcrumbIcon,ButtonArrowIcon,ButtonIcon,CarIcon,CartIcon,CaseIcon,CategoryIcon,ChatIcon,CheckIcon,ChevronIcon,ClearMarksIcon,ClockIcon,CloseIcon,ColumnGapIcon,ColumnWidthsIcon,ColumnsIcon,ContrastIcon,CopyIcon,CopyStyleIcon,CopyToPageIcon,CornerIcon,DesktopIcon,DiagramIcon,DirectionDownIcon,DirectionIcon,DirectionLeftIcon,DirectionRightIcon,DirectionUpIcon,DollarIcon,DragIcon,DropIcon,DuplicateIcon,EmphasisIcon,ExternalIcon,EyeIcon,EyeOffIcon,FinishIcon,FullWidthIcon,GapIcon,GlobeIcon,GridIcon,GroundIcon,HashIcon,HeadquartersIcon,HeightIcon,HoverIcon,ImageIcon,ItalicIcon,LayersIcon,LayoutIcon,LetterSpacingIcon,LineBetweenIcon,LineStyleIcon,LinkIcon,ListIcon,LocationIcon,LockIcon,LogoIcon,MediaIcon,MenuIcon,MetaIcon,MoveDownIcon,MoveUpIcon,NoteIcon,NudgeIcon,OpacityIcon,OwnTextIcon,PaddingBottomIcon,PaddingLeftIcon,PaddingRightIcon,PaddingTopIcon,PaddingXIcon,PaddingYIcon,PageIcon,PasteIcon,PasteStyleIcon,PhoneIcon,PlacementIcon,PlayIcon,PlusMinusIcon,ProductFieldIcon,ProductSizeIcon,QuietIcon,RadiusIcon,RedoIcon,RenameIcon,RevertIcon,RotateIcon,ScrollPointIcon,SearchIcon,SendIcon,SettingsIcon,ShadowIcon,SitemapIcon,SortIcon,SpecTableIcon,SquareIcon,StateIcon,StickyIcon,StrikeIcon,StylesIcon,TabletIcon,TabsIcon,TagIcon,TemplateIcon,TextColorIcon,TextLinesIcon,TextSizeIcon,TextSmallIcon,ThemeIcon,TitleIcon,TrashIcon,TriggerIcon,TypeIcon,UnderlineIcon,UndoIcon,VAlignIcon,WarningIcon,WeightIcon,WheelIcon,WidthIcon,WordsFromIcon,WrapIcon,iconMeanings}from"../chunk-
|
|
1
|
+
export{AccentIcon,AccountIcon,AddIcon,AlignCenterIcon,AlignLeftIcon,AlignRightIcon,AlignSeparateIcon,AnchorIcon,AnimationIcon,BackgroundIcon,BellIcon,BlackAndWhiteIcon,BlockBadgeIcon,BlockBannerIcon,BlockBoxIcon,BlockButtonIcon,BlockColumnIcon,BlockCouponIcon,BlockDividerIcon,BlockFooterIcon,BlockHeadingIcon,BlockIncludedListIcon,BlockLayeredImagesIcon,BlockProductIcon,BlockSectionIcon,BlockSocialIcon,BlockSpacerIcon,BlockTextIcon,BlockVideoIcon,BlogPostIcon,BoldIcon,BreadcrumbIcon,ButtonArrowIcon,ButtonIcon,CarIcon,CartIcon,CaseIcon,CaseLowerIcon,CaseNormalIcon,CaseUpperIcon,CategoryIcon,ChatIcon,CheckIcon,ChevronIcon,ClearMarksIcon,ClockIcon,CloseIcon,ColumnGapIcon,ColumnWidthsIcon,ColumnsIcon,ContrastIcon,CopyIcon,CopyStyleIcon,CopyToPageIcon,CornerIcon,DesktopIcon,DiagramIcon,DirectionDownIcon,DirectionIcon,DirectionLeftIcon,DirectionRightIcon,DirectionUpIcon,DollarIcon,DragIcon,DropIcon,DuplicateIcon,EmphasisIcon,ExternalIcon,EyeIcon,EyeOffIcon,FinishIcon,FullWidthIcon,GapIcon,GlobeIcon,GridIcon,GroundIcon,HashIcon,HeadquartersIcon,HeightIcon,HoverIcon,ImageIcon,ItalicIcon,LayersIcon,LayoutIcon,LetterSpacingIcon,LineBetweenIcon,LineStyleIcon,LinkIcon,ListIcon,LocationIcon,LockIcon,LogoIcon,MediaIcon,MenuIcon,MetaIcon,MoveDownIcon,MoveUpIcon,NoteIcon,NudgeIcon,NumberedListIcon,OpacityIcon,OwnTextIcon,PaddingBottomIcon,PaddingLeftIcon,PaddingRightIcon,PaddingTopIcon,PaddingXIcon,PaddingYIcon,PageIcon,ParagraphSpacingIcon,PasteIcon,PasteStyleIcon,PhoneIcon,PlacementIcon,PlayIcon,PlusMinusIcon,ProductFieldIcon,ProductSizeIcon,QuietIcon,RadiusIcon,RedoIcon,RenameIcon,RevertIcon,RotateIcon,ScrollPointIcon,SearchIcon,SendIcon,SettingsIcon,ShadowIcon,SitemapIcon,SortIcon,SpecTableIcon,SquareIcon,StateIcon,StickyIcon,StrikeIcon,StylesIcon,SubscriptIcon,SuperscriptIcon,TabletIcon,TabsIcon,TagIcon,TemplateIcon,TextColorIcon,TextLinesIcon,TextSizeIcon,TextSmallIcon,ThemeIcon,TitleIcon,TrashIcon,TriggerIcon,TypeIcon,UnderlineIcon,UndoIcon,VAlignIcon,WarningIcon,WeightIcon,WheelIcon,WidthIcon,WordsFromIcon,WrapIcon,iconMeanings}from"../chunk-PI26YXYD.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ export { EditorRail, EditorRailButton, RailTokens, railCssVars, railTokens } fro
|
|
|
2
2
|
export { AddIcon, LayersIcon, MediaIcon, PageIcon as PagesIcon, IconProps as RailIconProps, SitemapIcon, StylesIcon } from './icons/index.js';
|
|
3
3
|
export { W as WordFit } from './wordFit-9B9nqyf3.js';
|
|
4
4
|
export { E as EditorRailButtonProps, a as EditorRailItem, b as EditorRailOrientation, c as EditorRailProps } from './types-DNrn_w4V.js';
|
|
5
|
-
export { ShellTokens, shellCssVars, shellTokens } from './shell/index.js';
|
|
5
|
+
export { SPACING_SCALE, ShellTokens, shellCssVars, shellTokens } from './shell/index.js';
|
|
6
6
|
import 'react';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./chunk-OWBO4WKA.js";export{shellCssVars,shellTokens}from"./chunk-
|
|
1
|
+
import"./chunk-OWBO4WKA.js";export{SPACING_SCALE,shellCssVars,shellTokens}from"./chunk-2UX75JDP.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/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.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { A as AfterRemove, I as ItemSelector, N as NodeSelection, P as Planned, S as StepBounds, c as canStep, f as fromItemSelector, p as parentStep, a as planDuplicate, b as planMove, d as planPaste, e as planRemove, g as planSetProps, h as planStep, t as toItemSelector } from '../plan-
|
|
2
|
-
export { C as ClipboardEntry, N as NodeClipboard, a as NodeOps, b as NodeOpsHost, c as createNodeClipboard, u as useNodeOps } from '../useNodeOps-
|
|
1
|
+
export { A as AfterRemove, I as ItemSelector, N as NodeSelection, P as Planned, S as StepBounds, c as canStep, f as fromItemSelector, p as parentStep, a as planDuplicate, b as planMove, d as planPaste, e as planRemove, g as planSetProps, h as planStep, t as toItemSelector } from '../plan-DChbUXdS.js';
|
|
2
|
+
export { C as ClipboardEntry, N as NodeClipboard, a as NodeOps, b as NodeOpsHost, c as createNodeClipboard, u as useNodeOps } from '../useNodeOps-BF0fQsif.js';
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
import { E as EditorContextMenuItem } from '../types-pGBXevBU.js';
|
|
5
5
|
import { N as NodeMenuWords } from '../words-DOhF-4D4.js';
|
|
6
|
-
import '../types-
|
|
6
|
+
import '../types-41704JE4.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* nodeMenuItems — the right-click rows for a block, ONE list for both editors.
|
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-
|
|
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
package/dist/render/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { CSSProperties, ReactNode, ReactElement } from 'react';
|
|
2
|
-
import { B as BlockShape, D as Data } from '../types-
|
|
2
|
+
import { B as BlockShape, D as Data } from '../types-41704JE4.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* efficient-easel/render — draw a saved document, the published way.
|
|
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-
|
|
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.
|