efficient-easel 2.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +20 -5
  2. package/dist/blocks/index.d.ts +2 -2
  3. package/dist/chrome/index.d.ts +2 -2
  4. package/dist/chrome/index.js +1 -1
  5. package/dist/{chunk-ZNNATBDC.js → chunk-2T3ED73A.js} +1 -1
  6. package/dist/chunk-2WVZ3CK3.js +5 -0
  7. package/dist/{chunk-2JIWFFXA.js → chunk-42TMLDSQ.js} +1 -1
  8. package/dist/chunk-4WEGYBTV.js +7 -0
  9. package/dist/chunk-55IKQFBW.js +5 -0
  10. package/dist/chunk-5SOSVTVI.js +5 -0
  11. package/dist/{chunk-7SQF6LZL.js → chunk-66LWADFP.js} +1 -1
  12. package/dist/{chunk-AAT3O7PK.js → chunk-6QSPOILR.js} +1 -1
  13. package/dist/chunk-7VP5RXNO.js +64 -0
  14. package/dist/{chunk-ZV6OYSZ7.js → chunk-AVYFZZAP.js} +1 -1
  15. package/dist/chunk-BF3PIXZD.js +1 -0
  16. package/dist/chunk-CRPJGCSO.js +20 -0
  17. package/dist/chunk-FFYXVAAL.js +1 -0
  18. package/dist/{chunk-UAVNI3BU.js → chunk-FRGCTHDB.js} +1 -1
  19. package/dist/{chunk-OXYGFK2B.js → chunk-GTDLBUOC.js} +6 -6
  20. package/dist/chunk-IMRJHRQ2.js +1 -0
  21. package/dist/{chunk-PT6V53OO.js → chunk-J2JBETVO.js} +1 -1
  22. package/dist/chunk-JZDEIRH4.js +1 -0
  23. package/dist/{chunk-35Q5HMJZ.js → chunk-KNUFI3WV.js} +1 -1
  24. package/dist/chunk-LMHGVI5R.js +4 -0
  25. package/dist/{chunk-VB5LRSGJ.js → chunk-OFNXIZEP.js} +1 -1
  26. package/dist/{chunk-FOBGSFFS.js → chunk-OZ72A6MY.js} +7 -7
  27. package/dist/chunk-PDZXAFNX.js +9 -0
  28. package/dist/{chunk-ONRYLR2D.js → chunk-PRSTFWUY.js} +2 -2
  29. package/dist/chunk-QASZFO4S.js +1 -0
  30. package/dist/chunk-U2DVXW2H.js +2 -0
  31. package/dist/chunk-Y2G7CU6A.js +1 -0
  32. package/dist/{chunk-6OY2THZH.js → chunk-ZN752E2O.js} +1 -1
  33. package/dist/copy/copy.css +79 -82
  34. package/dist/copy/index.d.ts +9 -7
  35. package/dist/copy/index.js +21 -31
  36. package/dist/easel/index.d.ts +5 -5
  37. package/dist/easel/index.js +1 -1
  38. package/dist/fields/fields.css +0 -28
  39. package/dist/fields/index.d.ts +2 -2
  40. package/dist/fields/index.js +1 -1
  41. package/dist/node-ops/index.d.ts +2 -2
  42. package/dist/node-ops/index.js +1 -1
  43. package/dist/panel/index.d.ts +4 -222
  44. package/dist/panel/index.js +12 -15
  45. package/dist/panel/panel.css +0 -165
  46. package/dist/{plan-DChbUXdS.d.ts → plan-BdQ9mLIf.d.ts} +20 -1
  47. package/dist/screen/components/AddBlockRow.js +1 -1
  48. package/dist/screen/components/AddSidePanel.js +1 -1
  49. package/dist/screen/components/MediaSidePanel.d.ts +3 -3
  50. package/dist/screen/components/MediaSidePanel.js +1 -1
  51. package/dist/screen/components/NodeContextMenu.d.ts +19 -17
  52. package/dist/screen/components/NodeContextMenu.js +1 -1
  53. package/dist/screen/components/PageEditGuardNotices.js +1 -1
  54. package/dist/screen/components/ScreenChrome.js +1 -1
  55. package/dist/screen/components/ScreenDocumentContext.d.ts +3 -3
  56. package/dist/screen/components/ScreenDocumentContext.js +1 -1
  57. package/dist/screen/components/ScreenMount.d.ts +3 -3
  58. package/dist/screen/components/ScreenMount.js +1 -1
  59. package/dist/screen/components/ScreenStoreProvider.d.ts +3 -3
  60. package/dist/screen/components/ScreenStoreProvider.js +1 -1
  61. package/dist/screen/components/SectionScreenShell.js +16 -16
  62. package/dist/screen/components/SidePanelHead.js +1 -1
  63. package/dist/screen/components/UiIcon.js +1 -1
  64. package/dist/screen/components/panel-widths.js +1 -1
  65. package/dist/screen/components/usePartBridge.d.ts +3 -3
  66. package/dist/screen/components/usePartBridge.js +1 -1
  67. package/dist/screen/index.d.ts +3 -3
  68. package/dist/screen/index.js +1 -1
  69. package/dist/screen/lib/admin-bridge.d.ts +3 -3
  70. package/dist/screen/lib/document-addressing.d.ts +3 -3
  71. package/dist/screen/lib/document-hooks.d.ts +2 -2
  72. package/dist/screen/lib/host-chrome.d.ts +1 -1
  73. package/dist/screen/lib/host.d.ts +3 -3
  74. package/dist/screen/lib/key-scope.js +1 -1
  75. package/dist/screen/lib/links/link-filters.d.ts +1 -2
  76. package/dist/screen/lib/media-panel.d.ts +3 -3
  77. package/dist/screen/lib/media-picker.d.ts +3 -3
  78. package/dist/screen/lib/page-lock.d.ts +3 -3
  79. package/dist/screen/lib/puck/device-fields.js +1 -1
  80. package/dist/screen/lib/puck/palette-sections.d.ts +2 -2
  81. package/dist/screen/lib/puck/section-doc.d.ts +2 -2
  82. package/dist/screen/lib/puck/style-clipboard.d.ts +10 -6
  83. package/dist/screen/lib/puck/style-clipboard.js +1 -1
  84. package/dist/screen/lib/puck/use-section-ops.d.ts +2 -2
  85. package/dist/screen/lib/puck/use-section-ops.js +1 -1
  86. package/dist/screen/lib/screen-parts.d.ts +5 -5
  87. package/dist/screen/lib/screen-parts.js +1 -1
  88. package/dist/screen/lib/section-templates.d.ts +3 -3
  89. package/dist/screen/lib/session-context.d.ts +3 -3
  90. package/dist/screen/lib/session.d.ts +3 -3
  91. package/dist/screen/words.d.ts +123 -1
  92. package/dist/screen/words.js +1 -1
  93. package/dist/strings/catalogue.d.ts +3 -3
  94. package/dist/strings/catalogue.js +1 -1
  95. package/dist/strings/index.d.ts +3 -3
  96. package/dist/strings/index.js +1 -1
  97. package/dist/text-styles/index.js +11 -11
  98. package/dist/{types-E3HrTPg2.d.ts → types-CGFykP7c.d.ts} +1 -1
  99. package/dist/{useNodeOps-BF0fQsif.d.ts → useNodeOps-B3e4b8a2.d.ts} +1 -1
  100. package/dist/{words-AHHfiaRY.d.ts → words-C1U_dLBh.d.ts} +7 -0
  101. package/dist/{words-XH0TvZPg.d.ts → words-lpvYzf5U.d.ts} +4 -19
  102. package/dist/{words-D8kf071T.d.ts → words-vhnV8sM7.d.ts} +4 -26
  103. package/package.json +3 -3
  104. package/dist/LinkPicker-hPEr1MJx.d.ts +0 -113
  105. package/dist/chunk-4TMMEBAG.js +0 -4
  106. package/dist/chunk-5TRBCPRB.js +0 -5
  107. package/dist/chunk-BSSKAEFF.js +0 -5
  108. package/dist/chunk-D2BCHTQR.js +0 -1
  109. package/dist/chunk-E2O2MRZR.js +0 -1
  110. package/dist/chunk-FPOKPNO4.js +0 -1
  111. package/dist/chunk-HGTPLCTQ.js +0 -1
  112. package/dist/chunk-PWZOS45R.js +0 -2
  113. package/dist/chunk-PYCLHOSA.js +0 -9
  114. package/dist/chunk-RC6DD4XP.js +0 -7
  115. package/dist/chunk-TSQUEJZB.js +0 -5
  116. package/dist/chunk-UEM66O42.js +0 -64
  117. package/dist/chunk-UH7IGZKF.js +0 -1
  118. package/dist/chunk-VETFIYQR.js +0 -23
  119. package/dist/chunk-ZJEBF4NB.js +0 -1
@@ -2,6 +2,7 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { W as WordFit } from '../wordFit-7XpmhcaW.js';
4
4
  import { P as PanelWords } from '../words-BGrHZAJJ.js';
5
+ export { CornerOption as SettingsCornerPoint, CornersInput as SettingsCorners, CornersInputProps as SettingsCornersProps, AlignmentGrid as SettingsPlacement, AlignmentPoint as SettingsPlacementPoint, AlignmentGridProps as SettingsPlacementProps } from 'efficient-shell/ui';
5
6
  export { a as SETTINGS_BUCKETS, S as SettingsBucket } from '../buckets-CuLM47h9.js';
6
7
 
7
8
  /**
@@ -505,104 +506,6 @@ interface SettingsDrillProps {
505
506
  id?: string;
506
507
  className?: string;
507
508
  }
508
- /** One of the nine positions {@link SettingsPlacementProps} offers. */
509
- interface SettingsPlacementPoint {
510
- /** What the host stores when this cell is pressed. Also the React key, so
511
- * the nine must be distinct. */
512
- value: string;
513
- /** The cell's accessible name — "Top left", "Centre". Read aloud on its own,
514
- * so it names the POSITION and never the value behind it. */
515
- label: string;
516
- /**
517
- * This position cannot be chosen. The caller's arithmetic decides it (a
518
- * position that already holds all it can draw), never this component.
519
- * Disabled rather than absent: nine squares that became eight would read as
520
- * a control that had broken.
521
- */
522
- disabled?: boolean;
523
- /** Why, on hover. Falls back to {@link label}, so a plain cell still has a
524
- * tooltip and a closed one explains itself. */
525
- title?: string;
526
- /**
527
- * Drawn IN PLACE OF the cell's dot, not beside it.
528
- *
529
- * The grid's default mark is a dot, because nine positions are answered by
530
- * "which square", and a dot is the smallest thing that can say "this one".
531
- * One control asks a different question with the same nine squares: the
532
- * Scrolling Bar's `Scroll direction`, where four live cells mean a direction
533
- * of TRAVEL and a dot cannot say which way. Those cells take an arrow.
534
- *
535
- * ⚠️ IT REPLACES THE DOT. A cell drawing both would put an arrow beside a dot
536
- * inside a 26.67px square, and the dot would read as a second control. Leave
537
- * it off and the cell renders exactly what it has always rendered — which is
538
- * what keeps the five existing call sites byte-identical.
539
- *
540
- * Silent: the slot is `aria-hidden`, because the button around it already
541
- * names the position and two voices in one cell is worse than one.
542
- */
543
- icon?: ReactNode;
544
- }
545
- /** One of the four corners {@link SettingsCornersProps} offers. */
546
- interface SettingsCornerPoint {
547
- /** What the host stores when this corner is on. Also the React key and half
548
- * of the cell's class name, so the four must be distinct and CSS-safe. */
549
- value: string;
550
- /** The cell's accessible name — "Top left". Read aloud on its own, so it
551
- * names the CORNER and never the value behind it. */
552
- label: string;
553
- /**
554
- * This corner cannot be chosen. The caller's arithmetic decides it (a box
555
- * whose neighbour already rounds that edge), never this component. Disabled
556
- * rather than absent: four cells that became three would read as a control
557
- * that had broken.
558
- */
559
- disabled?: boolean;
560
- /** Why, on hover. Falls back to {@link label}, so a plain cell still has a
561
- * tooltip and a closed one explains itself. */
562
- title?: string;
563
- }
564
- interface SettingsCornersProps {
565
- /** The group's accessible name. NOT drawn — the visible label belongs to the
566
- * `SettingsField` row around it, the same split `SettingsSwitch` makes. */
567
- label: string;
568
- /**
569
- * The corners that are ON, already resolved by the host: this component has
570
- * no opinion about what an absent or empty value means. An empty array is a
571
- * real answer (every corner square), so a host that reads absence as "all
572
- * four" resolves that before handing this in.
573
- */
574
- value: readonly string[];
575
- /**
576
- * The four cells. No default: a component that invented four corner values
577
- * would be answering a question only the host can answer, and the order it
578
- * stores them in is the host's too.
579
- */
580
- corners: readonly SettingsCornerPoint[];
581
- /** The new set, in the order the cells were pressed. The host normalises. */
582
- onChange: (next: string[]) => void;
583
- /** A DOM id for the group, so a host can point a label at it. */
584
- id?: string;
585
- className?: string;
586
- }
587
- interface SettingsPlacementProps {
588
- /** The radiogroup's accessible name. NOT drawn — the visible label belongs to
589
- * the `SettingsField` row around it, the same split `SettingsSwitch` makes. */
590
- label: string;
591
- /** The chosen position, already resolved by the host: this component has no
592
- * opinion about what an absent value means. */
593
- value: string;
594
- /**
595
- * The nine cells, in reading order — top-left first, bottom-right last. No
596
- * default: a component that invented nine positions would be answering a
597
- * question only the host can answer, and the two callers ask different ones
598
- * (a picture's focal point, a block's anchor).
599
- */
600
- points: readonly SettingsPlacementPoint[];
601
- onChange: (next: string) => void;
602
- /** A DOM id for the radiogroup, so a host can point a label at it. */
603
- id?: string;
604
- className?: string;
605
- }
606
509
  /**
607
510
  * A FULL-WIDTH ACTION BUTTON that sits under a group's rows and COMMITS.
608
511
  *
@@ -618,8 +521,8 @@ interface SettingsPlacementProps {
618
521
  interface SettingsActionBaseProps {
619
522
  /**
620
523
  * What the button says — "Apply to all cards". The package supplies NO
621
- * default, the way `SettingsCorners` invents no corner names: the words belong
622
- * to the section that knows what it is about to rewrite.
524
+ * default, the way the shell's `CornersInput` invents no corner names: the
525
+ * words belong to the section that knows what it is about to rewrite.
623
526
  */
624
527
  label: ReactNode;
625
528
  /** Pressed. The write is the host's; this component performs none of it. */
@@ -964,127 +867,6 @@ declare function SettingsDefaultReset({ label, changed, onReset, detail, disable
964
867
  */
965
868
  declare function SettingsDrill({ name, preview, offPage, status, onOpen, id, className, }: SettingsDrillProps): react.JSX.Element;
966
869
 
967
- /**
968
- * A 3×3 grid of positions, one of them lit — "which of these nine?".
969
- *
970
- * ONE CONTROL, TWO QUESTIONS THAT ARE THE SAME QUESTION. A merchant asks it of
971
- * an image ("which part of this crop stays in view?") and of a block ("where on
972
- * the thing behind it does this sit?"). Both are one of nine positions, both
973
- * want the merchant to PRESS THE CORNER rather than read nine words out of a
974
- * dropdown, and drawing them as two controls would be two things to keep
975
- * looking alike for ever.
976
- *
977
- * ── WHY IT IS HERE NOW, AND WHY IT WAS NOT BEFORE ───────────────────────────
978
- *
979
- * It lived in `efficient-storefront` as `FocalPicker`, and its own comment recorded
980
- * the rule for moving it: card 66189 said *"the day a second section wants it,
981
- * that is the card that promotes it"*. Card 66214 was that second caller and
982
- * deliberately declined — the control was days old and had already changed
983
- * signature once, so freezing its shape in a released package would have been
984
- * early. That was right then.
985
- *
986
- * It is not right now: the shape has not moved since, and the sections that
987
- * hold boxes take it past six call sites. A local copy with that many callers
988
- * is the shape that becomes a second source, so it comes here — the rule its
989
- * own author wrote, applied on the day it fires.
990
- *
991
- * ── WHAT IT DOES NOT DO ─────────────────────────────────────────────────────
992
- *
993
- * It renders the CONTROL only. The row around it — the glyph, the label, the
994
- * caption — is `SettingsField`'s, exactly as `SettingsSwitch` splits. `label`
995
- * is the radiogroup's accessible name, never a visible one.
996
- *
997
- * ── A CELL MAY DRAW A GLYPH INSTEAD OF ITS DOT ──────────────────────────────
998
- *
999
- * Nine positions are answered by "which square", and a dot is the smallest mark
1000
- * that says "this one". ONE control asks a different question with the same
1001
- * nine squares: the Scrolling Bar's `Scroll direction`, where four live cells
1002
- * mean a direction of TRAVEL — and a dot cannot say which way. Those cells pass
1003
- * an `icon` on the point, and it is drawn in place of the dot.
1004
- *
1005
- * THE GLYPH COMES FROM THE ICON LIBRARY, never from in here. `efficient-easel/icons`
1006
- * holds `direction-left`, `direction-right`, `direction-up` and `direction-down`
1007
- * for exactly this control. A shape drawn inside this component would be the
1008
- * second source of truth the whole package exists to prevent — the same rule
1009
- * that stops a panel drawing its own glyph one level up.
1010
- *
1011
- * It also holds no opinion about what a position MEANS. The host hands nine
1012
- * values and gets one back; whether that value becomes a CSS `object-position`
1013
- * or a grid anchor is the host's business, and keeping it that way is what lets
1014
- * one control answer both questions.
1015
- *
1016
- * ── AN EDITOR'S COMPOSITE, OF THE SHELL'S PARTS (UI-24 §2) ─────────────────
1017
- *
1018
- * The shell has a `RadioGroup` of labelled rows and no grid of positions, so
1019
- * this picture of nine squares stays the editor's — but every cell is the
1020
- * shell's `IconButton` (a `role="radio"`), its name the shell's `Tooltip`,
1021
- * and the sheet draws only the picture: the track, the dot, the chosen cell.
1022
- *
1023
- * Controlled and hook-free, like every primitive here, so a Next server
1024
- * component can import this module.
1025
- */
1026
- declare function SettingsPlacement({ label, value, points, onChange, id, className, }: SettingsPlacementProps): react.JSX.Element;
1027
-
1028
- /**
1029
- * Four corners of a box, any number of them lit — "which of these corners?".
1030
- *
1031
- * ── WHY IT IS NOT {@link SettingsPlacement} WITH FOUR CELLS ──────────────────
1032
- *
1033
- * The nine-square asks WHICH ONE and gets one answer back; a radiogroup, and
1034
- * pressing a second cell releases the first. This asks WHICH ONES and gets a
1035
- * set: a merchant rounding a stack of boxes turns on the top two of the box at
1036
- * the top and the bottom two of the box at the bottom, so the run reads as one
1037
- * shape. Those are different questions with different keyboards — a radiogroup
1038
- * moves with the arrows and admits exactly one, a set is toggled with Space and
1039
- * admits any number — so they are two controls rather than one control with a
1040
- * `multiple` flag that changes what its own ARIA means.
1041
- *
1042
- * They still look like siblings, because a merchant meeting the second one
1043
- * should already know how to press it: the same track, the same chip, the same
1044
- * "the chosen thing is the darkest thing here" reading the placement grid and
1045
- * the segmented strip already share.
1046
- *
1047
- * ── THE CELL DRAWS THE ANSWER, NOT A DOT ────────────────────────────────────
1048
- *
1049
- * The placement grid's cell holds a dot, because a POSITION has no shape of its
1050
- * own to show. A corner does: each cell here holds a small square whose matching
1051
- * corner is rounded when the corner is on, and square when it is off. So the
1052
- * control is a picture of what the setting does rather than four labels a
1053
- * merchant has to hold in their head — and it stays readable for someone who
1054
- * cannot separate the accent from the ground, because the SHAPE carries the
1055
- * state as well as the fill.
1056
- *
1057
- * ── WHAT IT DOES NOT DO ─────────────────────────────────────────────────────
1058
- *
1059
- * It renders the CONTROL only. The row around it — the glyph, the label, the
1060
- * caption — is `SettingsField`'s, the same split `SettingsSwitch` and
1061
- * `SettingsPlacement` make. `label` is the group's accessible name, never a
1062
- * visible one.
1063
- *
1064
- * It also holds no opinion about what a corner MEANS. The host hands the four
1065
- * corners it wants offered and gets a set back; whether that set becomes a
1066
- * `border-radius` shorthand, four custom properties or a stored preset is the
1067
- * host's business, and keeping it that way is what lets one control serve a
1068
- * section box, a card and whatever asks next.
1069
- *
1070
- * ⚠️ IT HAS NO OPINION ABOUT "ALL FOUR" EITHER. An empty set is a real answer
1071
- * (every corner square) and so is a full one; a host that treats absence as
1072
- * "all four" resolves that BEFORE handing `value` in, exactly as the placement
1073
- * grid requires its value already resolved. A control that invented the default
1074
- * would be answering a question only the host can answer.
1075
- *
1076
- * ── AN EDITOR'S COMPOSITE, OF THE SHELL'S PARTS (UI-24 §2) ─────────────────
1077
- *
1078
- * The shell's `Segmented` answers ONE of a set, and it has no set of toggles,
1079
- * so the four corners stay the editor's picture — but every cell is the
1080
- * shell's `IconButton` (`aria-pressed`), its name the shell's `Tooltip`, and
1081
- * the sheet draws only the picture: the track, the frame and the marks.
1082
- *
1083
- * Controlled and hook-free, like every primitive here, so a Next server
1084
- * component can import this module.
1085
- */
1086
- declare function SettingsCorners({ label, value, corners, onChange, id, className, }: SettingsCornersProps): react.JSX.Element;
1087
-
1088
870
  /**
1089
871
  * A FULL-WIDTH BUTTON UNDER A GROUP'S ROWS THAT COMMITS A CHANGE.
1090
872
  *
@@ -1138,4 +920,4 @@ declare function SettingsCorners({ label, value, corners, onChange, id, classNam
1138
920
  */
1139
921
  declare function SettingsAction({ label, onPress, disabled, note, done, doneLabel, icon, id, className, }: SettingsActionProps): react.JSX.Element;
1140
922
 
1141
- export { SettingsAction, type SettingsActionBaseProps, type SettingsActionNote, type SettingsActionProps, type SettingsCornerPoint, SettingsCorners, type SettingsCornersProps, SettingsDefaultReset, type SettingsDefaultResetProps, SettingsDrill, type SettingsDrillProps, SettingsField, type SettingsFieldProps, SettingsGroup, SettingsGroupHead, type SettingsGroupHeadProps, type SettingsGroupProps, SettingsGroupSub, type SettingsGroupSubProps, SettingsPlacement, type SettingsPlacementPoint, type SettingsPlacementProps, SettingsSegmented, type SettingsSegmentedFit, type SettingsSegmentedOption, type SettingsSegmentedProps, SettingsSwitch, type SettingsSwitchBaseProps, type SettingsSwitchLabel, type SettingsSwitchProps, type SettingsTabItem, SettingsTabs, type SettingsTabsProps };
923
+ export { SettingsAction, type SettingsActionBaseProps, type SettingsActionNote, type SettingsActionProps, SettingsDefaultReset, type SettingsDefaultResetProps, SettingsDrill, type SettingsDrillProps, SettingsField, type SettingsFieldProps, SettingsGroup, SettingsGroupHead, type SettingsGroupHeadProps, type SettingsGroupProps, SettingsGroupSub, type SettingsGroupSubProps, SettingsSegmented, type SettingsSegmentedFit, type SettingsSegmentedOption, type SettingsSegmentedProps, SettingsSwitch, type SettingsSwitchBaseProps, type SettingsSwitchLabel, type SettingsSwitchProps, type SettingsTabItem, SettingsTabs, type SettingsTabsProps };
@@ -1,15 +1,12 @@
1
- export{SETTINGS_BUCKETS,SettingsField,SettingsGroup,SettingsTabs}from"../chunk-YNOZ5NXW.js";import{DEFAULT_PANEL_WORDS as e}from"../chunk-QTLAVDJE.js";export{SettingsSegmented,SettingsSwitch}from"../chunk-QLD57GBB.js";import{withTip as l}from"../chunk-P2VEMZH5.js";import{jsx as a,jsxs as s}from"react/jsx-runtime";import{RevertIcon as i}from"efficient-shell/icons/efficient";import{IconButton as n,Tooltip as t}from"efficient-shell/ui";function r({title:e,level:l=3,id:s,className:i}){/* @__PURE__ */
2
- return a(`h${l}`,{id:s,className:i?`es-group-head ${i}`:"es-group-head",children:e})}function c({title:e,level:l=4,id:s,className:i}){/* @__PURE__ */
3
- return a(`h${l}`,{id:s,className:i?`es-group-sub ${i}`:"es-group-sub",children:e})}function o({label:s,changed:n,onReset:t,detail:r,disabled:c,defaultAction:o,words:p,className:b}){const h={...e,...p},f=["es-default-reset"];if(n&&f.push("is-changed"),b&&f.push(b),!n&&o)return f.push("is-pressable"),l(o.title,/* @__PURE__ */a("button",{type:"button",className:f.join(" "),"aria-label":o.title,disabled:c,onClick:o.onPress,children:o.icon}));if(!n)/* @__PURE__ */
4
- return a("span",{className:f.join(" "),"aria-hidden":"true"});const N=h.resetName({label:s});return l(r?h.resetTitle({label:s,detail:r}):N,/* @__PURE__ */a("button",{type:"button",className:f.join(" "),"aria-label":N,"aria-description":r||void 0,disabled:c,onClick:e=>{t(),function(e){const l=e.currentTarget,a=l.closest(".es-field");let s=a?.querySelector(u(".es-field-ctl"))??a?.querySelector(u(".es-field-head"))??null,i=a?null:l.parentElement;for(let e=0;!s&&i&&e<m;e+=1,i=i.parentElement)s=[...i.querySelectorAll(d)].find(e=>e!==l)??null;s?.focus()}(e)},children:/* @__PURE__ */a(i,{size:15})}))}var d=['input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","button:not([disabled]):not(.es-default-reset)",'[tabindex]:not([tabindex="-1"])'].join(", "),u=e=>d.split(", ").map(l=>`${e} ${l}`).join(", "),m=4;function p({name:e,preview:l,offPage:i,status:n,onOpen:t,id:r,className:c}){const o=null!=l;/* @__PURE__ */
5
- return s("button",{type:"button",id:r,className:c?`es-drill ${c}`:"es-drill",onClick:t,children:[
6
- /* @__PURE__ */s("span",{className:"es-drill-text",children:[
7
- /* @__PURE__ */a("span",{className:"es-drill-name",children:e}),o?/* @__PURE__ */a("span",{className:i?"es-drill-preview is-offpage":"es-drill-preview",children:l}):null]}),n?/* @__PURE__ */a("span",{className:"es-drill-status",children:n}):null,
8
- /* @__PURE__ */a("span",{className:"es-drill-chev","aria-hidden":"true"})]})}function b({label:e,value:l,points:s,onChange:i,id:r,className:c}){/* @__PURE__ */
9
- return a("div",{id:r,className:"es-placement"+(c?` ${c}`:""),role:"radiogroup","aria-label":e,children:s.map(e=>{const s=l===e.value,r=!0===e.disabled,c=r&&e.title?e.title:void 0,o=/* @__PURE__ */a(n,{size:"sm",role:"radio","aria-checked":s,"aria-label":e.label,"aria-disabled":r||void 0,disabledReason:c,className:`es-placement-cell${s?" is-active":""}${r?" is-off":""}`,onClick:()=>{r||i(e.value)},children:e.icon?/* @__PURE__ */a("span",{className:"es-placement-icon","aria-hidden":"true",children:e.icon}):/* @__PURE__ */a("span",{className:"es-placement-dot"})},e.value);return c?o:/* @__PURE__ */a(t,{content:e.title??e.label,children:o},e.value)})})}function h({label:e,value:l,corners:i,onChange:r,id:c,className:o}){/* @__PURE__ */
10
- return s("div",{id:c,className:"es-corners"+(o?` ${o}`:""),role:"group","aria-label":e,children:[
11
- /* @__PURE__ */a("span",{className:"es-corners-frame","aria-hidden":"true"}),i.map(e=>{const s=l.includes(e.value),i=!0===e.disabled,c=i&&e.title?e.title:void 0,o=/* @__PURE__ */a(n,{size:"sm","aria-pressed":s,"aria-label":e.label,"aria-disabled":i||void 0,disabledReason:c,className:`es-corners-cell es-corners-${e.value}${s?" is-on":""}${i?" is-off":""}`,onClick:()=>{i||r(s?l.filter(l=>l!==e.value):[...l,e.value])},children:/* @__PURE__ */a("span",{className:"es-corners-mark","aria-hidden":"true"})},e.value);return c?o:/* @__PURE__ */a(t,{content:e.title??e.label,children:o},e.value)})]})}function f({label:e,onPress:l,disabled:i,note:n,done:t,doneLabel:r,icon:c,id:o,className:d}){const u=void 0===r?e:r,m=t?u:e,p=null!=n,b=p&&o?`${o}-note`:void 0;/* @__PURE__ */
12
- return s("div",{className:d?`es-action-wrap ${d}`:"es-action-wrap",children:[
13
- /* @__PURE__ */s("button",{type:"button",id:o,className:t?"es-action is-done":"es-action",disabled:i,"aria-describedby":b,onClick:l,children:[c?/* @__PURE__ */a("span",{className:"es-action-icon","aria-hidden":"true",children:c}):null,
14
- /* @__PURE__ */a("span",{className:"es-action-label",children:m})]}),p?/* @__PURE__ */a("p",{id:b,className:"es-action-note",children:n}):null,
15
- /* @__PURE__ */a("span",{className:"es-action-live",role:"status","aria-live":"polite",children:t?u:null})]})}export{f as SettingsAction,h as SettingsCorners,o as SettingsDefaultReset,p as SettingsDrill,r as SettingsGroupHead,c as SettingsGroupSub,b as SettingsPlacement};
1
+ export{SETTINGS_BUCKETS,SettingsField,SettingsGroup,SettingsTabs}from"../chunk-YNOZ5NXW.js";import{DEFAULT_PANEL_WORDS as e}from"../chunk-QTLAVDJE.js";export{SettingsSegmented,SettingsSwitch}from"../chunk-QLD57GBB.js";import{withTip as n}from"../chunk-P2VEMZH5.js";import{jsx as s,jsxs as t}from"react/jsx-runtime";import{RevertIcon as l}from"efficient-shell/icons/efficient";export{CornersInput as SettingsCorners,AlignmentGrid as SettingsPlacement}from"efficient-shell/ui";function i({title:e,level:n=3,id:t,className:l}){/* @__PURE__ */
2
+ return s(`h${n}`,{id:t,className:l?`es-group-head ${l}`:"es-group-head",children:e})}function a({title:e,level:n=4,id:t,className:l}){/* @__PURE__ */
3
+ return s(`h${n}`,{id:t,className:l?`es-group-sub ${l}`:"es-group-sub",children:e})}function r({label:t,changed:i,onReset:a,detail:r,disabled:u,defaultAction:p,words:m,className:h}){const b={...e,...m},f=["es-default-reset"];if(i&&f.push("is-changed"),h&&f.push(h),!i&&p)return f.push("is-pressable"),n(p.title,/* @__PURE__ */s("button",{type:"button",className:f.join(" "),"aria-label":p.title,disabled:u,onClick:p.onPress,children:p.icon}));if(!i)/* @__PURE__ */
4
+ return s("span",{className:f.join(" "),"aria-hidden":"true"});const N=b.resetName({label:t});return n(r?b.resetTitle({label:t,detail:r}):N,/* @__PURE__ */s("button",{type:"button",className:f.join(" "),"aria-label":N,"aria-description":r||void 0,disabled:u,onClick:e=>{a(),function(e){const n=e.currentTarget,s=n.closest(".es-field");let t=s?.querySelector(c(".es-field-ctl"))??s?.querySelector(c(".es-field-head"))??null,l=s?null:n.parentElement;for(let e=0;!t&&l&&e<d;e+=1,l=l.parentElement)t=[...l.querySelectorAll(o)].find(e=>e!==n)??null;t?.focus()}(e)},children:/* @__PURE__ */s(l,{size:15})}))}var o=['input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","button:not([disabled]):not(.es-default-reset)",'[tabindex]:not([tabindex="-1"])'].join(", "),c=e=>o.split(", ").map(n=>`${e} ${n}`).join(", "),d=4;function u({name:e,preview:n,offPage:l,status:i,onOpen:a,id:r,className:o}){const c=null!=n;/* @__PURE__ */
5
+ return t("button",{type:"button",id:r,className:o?`es-drill ${o}`:"es-drill",onClick:a,children:[
6
+ /* @__PURE__ */t("span",{className:"es-drill-text",children:[
7
+ /* @__PURE__ */s("span",{className:"es-drill-name",children:e}),c?/* @__PURE__ */s("span",{className:l?"es-drill-preview is-offpage":"es-drill-preview",children:n}):null]}),i?/* @__PURE__ */s("span",{className:"es-drill-status",children:i}):null,
8
+ /* @__PURE__ */s("span",{className:"es-drill-chev","aria-hidden":"true"})]})}function p({label:e,onPress:n,disabled:l,note:i,done:a,doneLabel:r,icon:o,id:c,className:d}){const u=void 0===r?e:r,p=a?u:e,m=null!=i,h=m&&c?`${c}-note`:void 0;/* @__PURE__ */
9
+ return t("div",{className:d?`es-action-wrap ${d}`:"es-action-wrap",children:[
10
+ /* @__PURE__ */t("button",{type:"button",id:c,className:a?"es-action is-done":"es-action",disabled:l,"aria-describedby":h,onClick:n,children:[o?/* @__PURE__ */s("span",{className:"es-action-icon","aria-hidden":"true",children:o}):null,
11
+ /* @__PURE__ */s("span",{className:"es-action-label",children:p})]}),m?/* @__PURE__ */s("p",{id:h,className:"es-action-note",children:i}):null,
12
+ /* @__PURE__ */s("span",{className:"es-action-live",role:"status","aria-live":"polite",children:a?u:null})]})}export{p as SettingsAction,r as SettingsDefaultReset,u as SettingsDrill,i as SettingsGroupHead,a as SettingsGroupSub};
@@ -1037,171 +1037,6 @@ button.es-group-head:hover { background: var(--es-chip-bg); }
1037
1037
  .es-drill { transition: none; }
1038
1038
  }
1039
1039
 
1040
- /* ── SettingsPlacement — the 3×3 position grid ─────────────────────────────
1041
- One control for two questions a merchant asks the same way: which part of a
1042
- cropped picture stays in view, and where on the thing behind it a block sits.
1043
- Both are one of nine positions, and both want the corner PRESSED.
1044
-
1045
- Promoted out of efficient-storefront (`.sf-focal`) the day its own rule fired —
1046
- card 66189 wrote "the day a second section wants it, that is the card that
1047
- promotes it"; 66214 declined it early and said why; the sections that hold
1048
- boxes take it past six callers. The values below are the shop's, token for
1049
- token, so every existing caller draws exactly what it drew: the only change
1050
- is that `--sf-*` aliases have become the `--es-*` names they always aliased. */
1051
- .es-placement {
1052
- display: grid;
1053
- grid-template-columns: repeat(3, 1fr);
1054
- grid-template-rows: repeat(3, 1fr);
1055
- gap: 4px;
1056
- width: 96px;
1057
- height: 96px;
1058
- padding: 4px;
1059
- background: var(--es-track-bg);
1060
- border: 1px solid var(--es-input-border);
1061
- border-radius: var(--radius-lg);
1062
- }
1063
- /* Each cell is the shell's IconButton in its Tooltip's wrapper: the wrapper is
1064
- the grid's item, and the button fills it. The button's own look (hover,
1065
- focus ring, disabled) is the shell's. */
1066
- .es-placement > span,
1067
- .es-corners > span {
1068
- display: flex;
1069
- }
1070
- .es-placement-cell,
1071
- .es-corners-cell {
1072
- width: 100%;
1073
- height: 100%;
1074
- }
1075
- .es-placement-dot {
1076
- width: 7px;
1077
- height: 7px;
1078
- border-radius: 50%;
1079
- background: var(--es-muted);
1080
- opacity: 0.5;
1081
- transition: transform 0.12s, background 0.12s, opacity 0.12s;
1082
- }
1083
- .es-placement-cell:hover .es-placement-dot { opacity: 0.85; }
1084
- /* ⚠️ THE CHOSEN CELL IS THE PANEL'S CHIP, NOT THE SHOP'S TINT — and that is a
1085
- VISIBLE change to the control the shop ships today. `.sf-focal` marked its
1086
- chosen square with `--sf-accent-tint` and a bigger accent dot; that is card
1087
- 8811's answer, which cards 66138 and 66302 replaced everywhere else in this
1088
- panel. The strip tells the chosen chip apart by being the DARKEST thing in
1089
- the row on a grey track, and a nine-square asks the identical question —
1090
- which one am I on — so it gets the identical answer. Two answers to one
1091
- question, one panel apart, is the thing this package exists to prevent, and
1092
- `panel-layout.test.ts` bans the tint token package-wide to keep it that way.
1093
- The dot inverts with the ground, or it disappears into it. */
1094
- .es-placement-cell.is-active {
1095
- background: var(--es-text);
1096
- box-shadow: var(--es-raised-shadow);
1097
- }
1098
- .es-placement-cell.is-active .es-placement-dot {
1099
- background: var(--es-on-accent);
1100
- opacity: 1;
1101
- transform: scale(1.5);
1102
- }
1103
- /* A position the caller has closed. It keeps its square — nine that became
1104
- eight would read as a broken control — and stops answering the pointer; the
1105
- reason is the cell's description and its Tooltip. The cell is the shell
1106
- IconButton's `aria-disabled` (efficient-shell 4.166.0), which fades the
1107
- whole cell to 0.6 and shows the not-allowed cursor; the dot under that fade
1108
- stays at the 0.22 it showed before the cell faded (0.22 / 0.6), and does not
1109
- brighten on hover. */
1110
- .es-placement-cell.is-off .es-placement-dot { opacity: calc(0.22 / 0.6); }
1111
- /* A cell that draws a GLYPH instead of its dot — the Scrolling Bar's
1112
- `Scroll direction`, where four live cells mean a direction of travel and a
1113
- dot cannot say which way. It follows the cell through every state the dot
1114
- does, or the chosen square goes dark and the arrow on it stays muted and
1115
- disappears into the ground it is drawn on.
1116
- 13px, sized against the CELL and not against the settings column: a cell is
1117
- 26.67px across (96px box, 3×3, gap 4, padding 4) and the dot it stands in for
1118
- is 7px, so 13px reads as a direction without crowding the 6px cell radius. */
1119
- .es-placement-icon {
1120
- display: flex;
1121
- align-items: center;
1122
- justify-content: center;
1123
- color: var(--es-muted);
1124
- opacity: 0.5;
1125
- transition: color 0.12s, opacity 0.12s;
1126
- }
1127
- .es-placement-icon svg { width: 13px; height: 13px; display: block; }
1128
- .es-placement-cell:hover .es-placement-icon { opacity: 0.85; }
1129
- /* ⚠️ IT DOES NOT GROW THE WAY THE DOT DOES. The dot scales to 1.5 on the chosen
1130
- cell because a dot has no other way to say "chosen"; an arrow says its whole
1131
- meaning by its shape, and growing it would crowd the square and make it read
1132
- heavier than its three siblings. Colour alone marks it, on the inverted
1133
- ground the cell already paints. */
1134
- .es-placement-cell.is-active .es-placement-icon {
1135
- color: var(--es-on-accent);
1136
- opacity: 1;
1137
- }
1138
- .es-placement-cell.is-off .es-placement-icon { opacity: calc(0.22 / 0.6); }
1139
- /* Keyboard focus is visible, like every other control in this panel. */
1140
- @media (prefers-reduced-motion: reduce) {
1141
- .es-placement-icon,
1142
- .es-placement-dot { transition: none; }
1143
- }
1144
-
1145
- /* ── SettingsCorners — four corners of a box, any number of them lit ─────────
1146
- The sibling of `.es-placement` above and deliberately built from its parts:
1147
- the same track, the same chip on the chosen cell, the same focus ring. A
1148
- merchant who has met the nine-square should not have to learn this one.
1149
-
1150
- TWO COLUMNS, NOT THREE. The grid is 2×2 and each cell sits in the corner it
1151
- stands for, so the control has the shape of the thing it edits. */
1152
- .es-corners {
1153
- position: relative;
1154
- display: grid;
1155
- grid-template-columns: repeat(2, 1fr);
1156
- grid-template-rows: repeat(2, 1fr);
1157
- gap: 4px;
1158
- width: 96px;
1159
- height: 96px;
1160
- padding: 4px;
1161
- background: var(--es-track-bg);
1162
- border-radius: var(--radius-lg);
1163
- }
1164
- /* The BOX the four corners belong to. Inset so the cells sit ON its corners
1165
- rather than beside it, dashed so it reads as the outline of the thing being
1166
- edited rather than as a fifth control. See the note in SettingsCorners.tsx:
1167
- without this the cells are four switches, not one box. */
1168
- .es-corners-frame {
1169
- position: absolute;
1170
- inset: 22px;
1171
- border: 1.5px dashed var(--es-muted);
1172
- opacity: 0.45;
1173
- pointer-events: none;
1174
- }
1175
- .es-corners-mark {
1176
- width: 18px;
1177
- height: 18px;
1178
- background: var(--es-muted);
1179
- opacity: 0.5;
1180
- transition: border-radius 0.12s, background 0.12s, opacity 0.12s;
1181
- }
1182
- .es-corners-cell:hover .es-corners-mark { opacity: 0.85; }
1183
- /* ⚠️ THE FOUR RULES ARE WRITTEN OUT, ONE PER CORNER, and must stay written out.
1184
- The corner a cell stands for is in its class name (`es-corners-tl`), and a
1185
- radius built by interpolating that name is a string no stylesheet contains —
1186
- the same trap the shop documents on its own card wells. Four rules is the
1187
- whole cost of never having that bug. */
1188
- .es-corners-cell.is-on .es-corners-mark {
1189
- background: var(--es-accent);
1190
- opacity: 1;
1191
- }
1192
- .es-corners-tl.is-on .es-corners-mark { border-radius: var(--radius-lg) 0 0 0; }
1193
- .es-corners-tr.is-on .es-corners-mark { border-radius: 0 var(--radius-lg) 0 0; }
1194
- .es-corners-br.is-on .es-corners-mark { border-radius: 0 0 var(--radius-lg) 0; }
1195
- .es-corners-bl.is-on .es-corners-mark { border-radius: 0 0 0 var(--radius-lg); }
1196
- /* A corner the caller has closed. It keeps its cell — four that became three
1197
- would read as a broken control — and stops answering the pointer; the reason
1198
- is on the button's `title`. */
1199
- .es-corners-cell.is-off .es-corners-mark { opacity: calc(0.22 / 0.6); }
1200
- /* Keyboard focus is visible, like every other control in this panel. */
1201
- @media (prefers-reduced-motion: reduce) {
1202
- .es-corners-mark { transition: none; }
1203
- }
1204
-
1205
1040
  /* ── THE ACTION BUTTON (`[ADD] A Panel Button That Does One Thing`) ─────────────────────────────────────────
1206
1041
  The full-width press under a group's rows that COMMITS — "Apply to all
1207
1042
  cards". Measured against `.es-drill`, the panel's other full-width row, and
@@ -75,6 +75,25 @@ declare function planSetProps(data: Data, config: DataConfig, id: string, patch:
75
75
  * - a top-level node, or nothing selected: `null` (there is nothing above).
76
76
  */
77
77
  declare function parentStep(data: Data, config: DataConfig, selection: NodeSelection, slotIsLevel?: (parent: Node, slot: string) => boolean): NodeSelection;
78
+ /**
79
+ * The nodes from the outermost (the top-level node) down to `id`, by id — the
80
+ * CHAIN a click on the canvas walks (`nextInChain`). Read off `find`'s path,
81
+ * the same lookup `parentStep` climbs, so "what holds what" is asked of the
82
+ * document once. Empty when `id` is not in it.
83
+ */
84
+ declare function nodeChain(data: Data, config: DataConfig, id: string): string[];
85
+ /**
86
+ * CLICK THROUGH LAYERS (owner 2026-10-12, Wix's rule): what a click on a chain
87
+ * picks, given what is selected now. `chain` is outer → inner.
88
+ *
89
+ * - the selection is in the chain and not its last rung → the next rung in;
90
+ * - the selection IS the last rung → it stays (a click never wraps back out);
91
+ * - anything else (nothing, or something outside the chain) → the first rung.
92
+ *
93
+ * Pure, and over plain ids, so a host that adds rungs of its own (the website's
94
+ * parts: a section's background image) walks them by the SAME rule.
95
+ */
96
+ declare function nextInChain(chain: readonly string[], selected: string | null): string | null;
78
97
  /** A node by its place: the zone key `"<parentId>:<slot>"` and its index. */
79
98
  interface ItemSelector {
80
99
  zone?: string;
@@ -85,4 +104,4 @@ declare function toItemSelector(data: Data, config: DataConfig, selection: NodeS
85
104
  /** Puck's `itemSelector` as a node selection; `null` when it points at nothing. */
86
105
  declare function fromItemSelector(data: Data, config: DataConfig, selector: ItemSelector | null | undefined): NodeSelection;
87
106
 
88
- export { type AfterRemove as A, type ItemSelector as I, type NodeSelection as N, type Planned as P, type StepBounds as S, planDuplicate as a, planMove as b, canStep as c, planPaste as d, planRemove as e, fromItemSelector as f, planSetProps as g, planStep as h, parentStep as p, toItemSelector as t };
107
+ export { type AfterRemove as A, type ItemSelector as I, type NodeSelection as N, type Planned as P, type StepBounds as S, nodeChain as a, planDuplicate as b, canStep as c, planMove as d, planPaste as e, fromItemSelector as f, planRemove as g, planSetProps as h, planStep as i, nextInChain as n, parentStep as p, toItemSelector as t };
@@ -1 +1 @@
1
- export{AddBlockRow as default}from"../../chunk-4TMMEBAG.js";import"../../chunk-HQ4VVRIC.js";import"../../chunk-5TRBCPRB.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PYCLHOSA.js";import"../../chunk-AELNNAFM.js";import"../../chunk-VETFIYQR.js";import"../../chunk-FOBGSFFS.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-7SQF6LZL.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{AddBlockRow as default}from"../../chunk-LMHGVI5R.js";import"../../chunk-HQ4VVRIC.js";import"../../chunk-55IKQFBW.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-BF3PIXZD.js";import"../../chunk-PDZXAFNX.js";import"../../chunk-AELNNAFM.js";import"../../chunk-CRPJGCSO.js";import"../../chunk-OZ72A6MY.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-QASZFO4S.js";import"../../chunk-66LWADFP.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FFYXVAAL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -1 +1 @@
1
- export{blockKey,AddSidePanel as default,sectionKey,templateKey}from"../../chunk-TSQUEJZB.js";import"../../chunk-5ZBY24K7.js";import"../../chunk-PA3PNTVV.js";import"../../chunk-BVN33R76.js";import"../../chunk-BSSKAEFF.js";import"../../chunk-KQMML6JM.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-O7Q4DDJT.js";import"../../chunk-RSCMJIWS.js";import"../../chunk-HQ4VVRIC.js";import"../../chunk-5TRBCPRB.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-E2O2MRZR.js";import"../../chunk-PYCLHOSA.js";import"../../chunk-AELNNAFM.js";import"../../chunk-VETFIYQR.js";import"../../chunk-FOBGSFFS.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-OXYGFK2B.js";import"../../chunk-ZJEBF4NB.js";import"../../chunk-THWO5YVZ.js";import"../../chunk-RE4LP46F.js";import"../../chunk-MJM6SFD3.js";import"../../chunk-2OAZYSWJ.js";import"../../chunk-7SQF6LZL.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-6HHHBBSY.js";import"../../chunk-O2NLQBFX.js";import"../../chunk-67GNT6PF.js";import"../../chunk-PAELDYYS.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{blockKey,AddSidePanel as default,sectionKey,templateKey}from"../../chunk-2WVZ3CK3.js";import"../../chunk-5ZBY24K7.js";import"../../chunk-PA3PNTVV.js";import"../../chunk-BVN33R76.js";import"../../chunk-5SOSVTVI.js";import"../../chunk-KQMML6JM.js";import"../../chunk-KCOBHPN6.js";import"../../chunk-O7Q4DDJT.js";import"../../chunk-RSCMJIWS.js";import"../../chunk-HQ4VVRIC.js";import"../../chunk-55IKQFBW.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-BF3PIXZD.js";import"../../chunk-PDZXAFNX.js";import"../../chunk-AELNNAFM.js";import"../../chunk-CRPJGCSO.js";import"../../chunk-OZ72A6MY.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-QASZFO4S.js";import"../../chunk-GTDLBUOC.js";import"../../chunk-Y2G7CU6A.js";import"../../chunk-THWO5YVZ.js";import"../../chunk-RE4LP46F.js";import"../../chunk-MJM6SFD3.js";import"../../chunk-2OAZYSWJ.js";import"../../chunk-66LWADFP.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FFYXVAAL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-6HHHBBSY.js";import"../../chunk-O2NLQBFX.js";import"../../chunk-67GNT6PF.js";import"../../chunk-PAELDYYS.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -2,18 +2,18 @@ import * as react from 'react';
2
2
  import { MediaPanelComponent, MediaPickRequest } from '../lib/media-panel.js';
3
3
  import '../../host-CiuzZJXj.js';
4
4
  import '../../blocks/index.js';
5
- import '../../types-E3HrTPg2.js';
5
+ import '../../types-CGFykP7c.js';
6
6
  import '../../data/index.js';
7
7
  import '../../types-41704JE4.js';
8
8
  import '../../resolve-D68pb3Bx.js';
9
- import '../../plan-DChbUXdS.js';
9
+ import '../../plan-BdQ9mLIf.js';
10
10
  import '../lib/document-contract.js';
11
11
  import '../lib/session.js';
12
12
  import '../lib/backend-error.js';
13
13
  import '../../edit-lock/index.js';
14
14
  import '../lib/host-chrome.js';
15
15
  import '../lib/links/link-filters.js';
16
- import '../../LinkPicker-hPEr1MJx.js';
16
+ import 'efficient-shell/ui';
17
17
  import '../lib/document-hooks.js';
18
18
  import '../lib/section-template-types.js';
19
19
  import '../lib/puck/content-tree.js';
@@ -1 +1 @@
1
- export{MediaSidePanel as default}from"../../chunk-6OY2THZH.js";import"../../chunk-5TRBCPRB.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PYCLHOSA.js";import"../../chunk-AELNNAFM.js";import"../../chunk-VETFIYQR.js";import"../../chunk-FOBGSFFS.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-D2BCHTQR.js";import"../../chunk-OXYGFK2B.js";import"../../chunk-ZJEBF4NB.js";import"../../chunk-THWO5YVZ.js";import"../../chunk-RE4LP46F.js";import"../../chunk-MJM6SFD3.js";import"../../chunk-2OAZYSWJ.js";import"../../chunk-7SQF6LZL.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FPOKPNO4.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
1
+ export{MediaSidePanel as default}from"../../chunk-ZN752E2O.js";import"../../chunk-55IKQFBW.js";import"../../chunk-PLVEGYK6.js";import"../../chunk-R6WTQWAC.js";import"../../chunk-U3JP4VGF.js";import"../../chunk-PDZXAFNX.js";import"../../chunk-AELNNAFM.js";import"../../chunk-CRPJGCSO.js";import"../../chunk-OZ72A6MY.js";import"../../chunk-UFY6RNMT.js";import"../../chunk-YNOZ5NXW.js";import"../../chunk-K56YDHYQ.js";import"../../chunk-QTLAVDJE.js";import"../../chunk-YRLPFZW3.js";import"../../chunk-EA2HTX37.js";import"../../chunk-QASZFO4S.js";import"../../chunk-GTDLBUOC.js";import"../../chunk-Y2G7CU6A.js";import"../../chunk-THWO5YVZ.js";import"../../chunk-RE4LP46F.js";import"../../chunk-MJM6SFD3.js";import"../../chunk-2OAZYSWJ.js";import"../../chunk-66LWADFP.js";import"../../chunk-QLD57GBB.js";import"../../chunk-FFYXVAAL.js";import"../../chunk-MFIRYGHW.js";import"../../chunk-67GNT6PF.js";import"../../chunk-ZNCEOSXO.js";import"../../chunk-P2VEMZH5.js";import"../../chunk-KRXQM65X.js";import"../../chunk-NKB3KVAB.js";
@@ -1,18 +1,20 @@
1
1
  import * as react from 'react';
2
2
  import { E as EaselContextMenuItem } from '../../types-BsyPh6EW.js';
3
3
  import { P as Place } from '../../types-41704JE4.js';
4
- import { N as NodeClipboard, C as ClipboardEntry, a as NodeOps } from '../../useNodeOps-BF0fQsif.js';
4
+ import { N as NodeClipboard, C as ClipboardEntry, a as NodeOps } from '../../useNodeOps-B3e4b8a2.js';
5
+ import { N as NodeMenuWords } from '../../words-DMG4dYq2.js';
5
6
  import { StyleSnapshot } from '../../style-clipboard/index.js';
7
+ import { S as StyleClipboardWords } from '../../words-CnnHb9jo.js';
8
+ import { ScreenMenuWords } from '../words.js';
6
9
  import { C as CanvasTarget } from '../../watch-BTYOJpQU.js';
7
10
  import { AddTarget } from '../lib/puck/add-target-types.js';
8
11
  import { ScreenMenuRows } from '../lib/screen-parts.js';
9
12
  import { EaselSession } from '../lib/session.js';
10
- import '../../plan-DChbUXdS.js';
11
- import '../../words-CnnHb9jo.js';
13
+ import '../../plan-BdQ9mLIf.js';
12
14
  import '../lib/puck/block-choice.js';
13
15
  import '../lib/puck/slot-section-spec.js';
14
16
  import '../../blocks/index.js';
15
- import '../../types-E3HrTPg2.js';
17
+ import '../../types-CGFykP7c.js';
16
18
  import '../../data/index.js';
17
19
  import '../../resolve-D68pb3Bx.js';
18
20
  import '../../types-Dt1CFR1S.js';
@@ -35,7 +37,7 @@ import '../../engine-DBxp_v6B.js';
35
37
  import '../lib/admin-bridge.js';
36
38
  import '../lib/host-chrome.js';
37
39
  import '../lib/links/link-filters.js';
38
- import '../../LinkPicker-hPEr1MJx.js';
40
+ import 'efficient-shell/ui';
39
41
  import '../lib/backend-error.js';
40
42
  import '../lib/document-hooks.js';
41
43
 
@@ -166,6 +168,18 @@ type NodeMenuHost = {
166
168
  * Absent: "Page settings", as the row always said.
167
169
  */
168
170
  pageSettingsLabel?: string;
171
+ /**
172
+ * THE MENU'S WORDS in the host's language (3.1.0): a node's rows
173
+ * (`EaselStrings.menu`), Copy style and Paste style (`styleClipboard`), and
174
+ * the screen's own rows and lines (`screen.menu`). The rows are built by
175
+ * plain functions, which read no provider, so the chrome hands them in.
176
+ * Left out, or any part of it: English.
177
+ */
178
+ words?: {
179
+ menu?: NodeMenuWords;
180
+ styleClipboard?: StyleClipboardWords;
181
+ screen?: ScreenMenuWords;
182
+ };
169
183
  /**
170
184
  * NOTHING MAY BE WRITTEN (0.106.0): the document is frozen, somebody else
171
185
  * holds it, or a save was refused (`ScreenDocumentValue.readOnly`). The rows
@@ -542,18 +556,6 @@ declare function nodeMenuItems(host: NodeMenuHost, target: {
542
556
  zone: string;
543
557
  index: number;
544
558
  }): EaselContextMenuItem[];
545
- /**
546
- * What a right-click on the PAGE offers — the tree's ground, the panel, the
547
- * canvas between two sections.
548
- *
549
- * This ground used to fall through to Chrome, which is half of what the owner
550
- * was pointing at: a right-click that sometimes gives you the editor and
551
- * sometimes gives you Reload teaches you not to right-click at all.
552
- *
553
- * Everything here already exists on a button or a key. That is on purpose — a
554
- * context menu is a second door to actions a merchant can already reach, never
555
- * the only door to one, or the feature is hidden inside a gesture.
556
- */
557
559
  declare function pageMenuItems(host: NodeMenuHost): EaselContextMenuItem[];
558
560
  /**
559
561
  * What a right-click INSIDE A TEXT BOX offers.