efficient-easel 0.99.2 → 0.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +233 -17
  2. package/dist/autosave/index.d.ts +11 -5
  3. package/dist/blocks/index.d.ts +1 -1
  4. package/dist/canvas/index.d.ts +2 -2
  5. package/dist/canvas/index.js +1 -1
  6. package/dist/chrome/chrome.css +96 -29
  7. package/dist/chrome/index.d.ts +67 -18
  8. package/dist/chrome/index.js +25 -21
  9. package/dist/{chunk-JYPOOHII.js → chunk-2FZJWH24.js} +3 -3
  10. package/dist/chunk-3EDSDPIP.js +1 -0
  11. package/dist/chunk-546BBOPE.js +1 -0
  12. package/dist/chunk-67GNT6PF.js +1 -0
  13. package/dist/chunk-EOJNJCMJ.js +16 -0
  14. package/dist/chunk-EWVJSRRY.js +6 -0
  15. package/dist/chunk-FPOKPNO4.js +1 -0
  16. package/dist/chunk-H24N5TMZ.js +11 -0
  17. package/dist/chunk-IG3U5NWJ.js +1 -0
  18. package/dist/chunk-JUQ6YJCG.js +1 -0
  19. package/dist/chunk-KTVH2ZRL.js +15 -0
  20. package/dist/{chunk-PI26YXYD.js → chunk-L5KW4HG5.js} +16 -8
  21. package/dist/chunk-M6F6LS3H.js +1 -0
  22. package/dist/chunk-P6O363EE.js +6 -0
  23. package/dist/chunk-PAELDYYS.js +1 -0
  24. package/dist/chunk-QTLAVDJE.js +1 -0
  25. package/dist/chunk-UH7IGZKF.js +1 -0
  26. package/dist/chunk-WZ7TGAAT.js +3 -0
  27. package/dist/chunk-ZFDCDJNZ.js +16 -0
  28. package/dist/chunk-ZJEBF4NB.js +1 -0
  29. package/dist/chunk-ZNS7727Y.js +12 -0
  30. package/dist/copy/copy.css +442 -5
  31. package/dist/copy/index.d.ts +302 -5
  32. package/dist/copy/index.js +32 -10
  33. package/dist/drag/drag.css +10 -1
  34. package/dist/drag/index.d.ts +99 -8
  35. package/dist/drag/index.js +18 -17
  36. package/dist/easel/easel.css +15 -0
  37. package/dist/easel/index.d.ts +104 -33
  38. package/dist/easel/index.js +9 -1
  39. package/dist/edit-lock/index.d.ts +1 -3
  40. package/dist/edit-lock/index.js +1 -1
  41. package/dist/fields/fields.css +270 -38
  42. package/dist/fields/index.d.ts +209 -26
  43. package/dist/fields/index.js +22 -53
  44. package/dist/gold/index.js +1 -1
  45. package/dist/icons/index.d.ts +13 -1
  46. package/dist/icons/index.js +1 -1
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.js +1 -1
  49. package/dist/markup/index.d.ts +111 -10
  50. package/dist/markup/index.js +1 -1
  51. package/dist/menu/index.d.ts +58 -5
  52. package/dist/menu/index.js +1 -15
  53. package/dist/menu/menu.css +17 -6
  54. package/dist/node-ops/index.d.ts +1 -1
  55. package/dist/node-ops/index.js +1 -1
  56. package/dist/panel/index.d.ts +83 -4
  57. package/dist/panel/index.js +18 -16
  58. package/dist/panel/panel.css +135 -62
  59. package/dist/pick/index.d.ts +78 -2
  60. package/dist/pick/index.js +7 -14
  61. package/dist/pick/pick.css +197 -10
  62. package/dist/rail/index.d.ts +3 -7
  63. package/dist/rail/index.js +1 -1
  64. package/dist/strings/catalogue.d.ts +13 -35
  65. package/dist/strings/catalogue.js +1 -1
  66. package/dist/strings/index.d.ts +12 -18
  67. package/dist/strings/index.js +2 -2
  68. package/dist/style-clipboard/index.d.ts +1 -1
  69. package/dist/style-clipboard/index.js +1 -1
  70. package/dist/text-styles/index.d.ts +328 -0
  71. package/dist/text-styles/index.js +38 -0
  72. package/dist/text-styles/text-styles.css +309 -0
  73. package/dist/tree/index.d.ts +43 -2
  74. package/dist/tree/index.js +1 -1
  75. package/dist/tree/tree.css +71 -0
  76. package/dist/{types-p9j2Fac7.d.ts → types-DGcCsxs8.d.ts} +72 -7
  77. package/dist/{types-Bs_gVkVI.d.ts → types-DWS-s9z-.d.ts} +1 -9
  78. package/dist/{types-DO-b0LNj.d.ts → types-Djdq6Xkd.d.ts} +9 -8
  79. package/dist/{types-BOSGNvil.d.ts → types-E3HrTPg2.d.ts} +7 -13
  80. package/dist/{types-C7HFvdtk.d.ts → types-VqL6t5HH.d.ts} +82 -5
  81. package/dist/{watch-B5RTR-WX.d.ts → watch-BTYOJpQU.d.ts} +18 -1
  82. package/dist/{words-DagJdwIA.d.ts → words-AHHfiaRY.d.ts} +31 -2
  83. package/dist/words-BGrHZAJJ.d.ts +46 -0
  84. package/dist/{words-c-3h9xQQ.d.ts → words-BMzV04b1.d.ts} +1 -1
  85. package/dist/words-CRYvAiHX.d.ts +105 -0
  86. package/dist/words-D8kf071T.d.ts +93 -0
  87. package/dist/{words-N4ebT88_.d.ts → words-DgHcY5qB.d.ts} +9 -3
  88. package/dist/{words-C74EUpFr.d.ts → words-XH0TvZPg.d.ts} +60 -4
  89. package/package.json +8 -8
  90. package/dist/chunk-66CKSTXP.js +0 -14
  91. package/dist/chunk-672FAEKU.js +0 -1
  92. package/dist/chunk-67VZRQLG.js +0 -13
  93. package/dist/chunk-6PS6STGA.js +0 -1
  94. package/dist/chunk-7A7O2JWQ.js +0 -1
  95. package/dist/chunk-7JTL3P6P.js +0 -1
  96. package/dist/chunk-F2PIG3AA.js +0 -10
  97. package/dist/chunk-H4B72XCJ.js +0 -1
  98. package/dist/chunk-KDIVA6WD.js +0 -1
  99. package/dist/chunk-MCLBHENY.js +0 -1
  100. package/dist/chunk-QB3BZIRA.js +0 -5
  101. package/dist/chunk-SJQG5ENJ.js +0 -1
  102. package/dist/chunk-SUO5627P.js +0 -1
  103. package/dist/chunk-XUE5O62R.js +0 -3
  104. package/dist/chunk-ZT7M24XD.js +0 -1
  105. package/dist/editor/index.d.ts +0 -10
  106. package/dist/editor/index.js +0 -1
  107. package/dist/words-CD3WADyb.d.ts +0 -51
  108. /package/dist/{chunk-2PHD4L6A.js → chunk-OWBO4WKA.js} +0 -0
@@ -7,12 +7,14 @@
7
7
  /* The hex box and the word that stands in for it ("Auto", "Not set") are
8
8
  ONE width. A row is right-aligned as a unit, so a word narrower than a hex
9
9
  pushes its swatch out of line down a column of colour rows. */
10
- --es-pick-readout-w: 80px;
10
+ --es-pick-readout-w: 68px;
11
11
  display: flex;
12
12
  flex-direction: column;
13
13
  gap: 12px;
14
14
  }
15
15
  .es-pick-colour-row {
16
+ /* The tag is placed against the row. */
17
+ position: relative;
16
18
  display: flex;
17
19
  align-items: center;
18
20
  gap: 8px;
@@ -46,16 +48,27 @@
46
48
  .es-pick-swatch:disabled {
47
49
  cursor: default;
48
50
  }
51
+ /* THE HEX'S SLOT (Lewis 2026-10-07, option E): 68px, and down to 36px when
52
+ the line is short of room — after the label has given way to its 56px. The
53
+ hex or the word that stands in for it fills it. */
54
+ .es-pick-hexwrap {
55
+ position: relative;
56
+ display: flex;
57
+ align-items: center;
58
+ flex: 0 1 var(--es-pick-readout-w);
59
+ max-width: var(--es-pick-readout-w);
60
+ min-width: 36px;
61
+ }
49
62
  .es-pick-hex {
50
63
  box-sizing: border-box;
51
- width: var(--es-pick-readout-w);
64
+ width: 100%;
52
65
  min-width: 0;
53
66
  padding: 4px 8px;
54
67
  border: 1px solid transparent;
55
68
  border-radius: 6px;
56
69
  background: transparent;
57
70
  color: var(--es-text);
58
- font: 500 12px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace;
71
+ font: 500 11px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace;
59
72
  letter-spacing: 0.02em;
60
73
  }
61
74
  .es-pick-hex:hover {
@@ -66,13 +79,171 @@
66
79
  border-color: var(--es-accent);
67
80
  background: var(--es-panel);
68
81
  }
82
+ /* The hex a row FOLLOWS, in the row's box: grey at rest, so it does not read
83
+ as a value of its own; normal ink while it is edited (GG for Lewis,
84
+ 2026-10-07: pressed to copy it, or to paste over it). */
85
+ .es-pick-hex.is-inherited {
86
+ color: var(--es-muted);
87
+ }
88
+ .es-pick-hex.is-inherited:focus {
89
+ color: var(--es-text);
90
+ }
91
+ /* The inherited hex, while nothing is stored: grey, so it does not read as a
92
+ value. */
93
+ .es-pick-hex::placeholder {
94
+ color: var(--es-muted);
95
+ opacity: 1;
96
+ }
69
97
  .es-pick-caption {
70
98
  box-sizing: border-box;
71
- width: var(--es-pick-readout-w);
99
+ width: 100%;
100
+ min-width: 0;
101
+ overflow: hidden;
72
102
  padding: 0 8px;
103
+ white-space: nowrap;
73
104
  font-size: 12px;
74
105
  color: var(--es-muted);
75
106
  }
107
+ /* Cut text fades at its end, never cut hard. `data-clipped` is MEASURED
108
+ (ColourPicker): text that fits is never faded. */
109
+ .es-pick-hex[data-clipped],
110
+ .es-pick-caption[data-clipped] {
111
+ -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 16px), transparent);
112
+ mask-image: linear-gradient(to right, #000 calc(100% - 16px), transparent);
113
+ }
114
+ /* EDITED IN PLACE: a press widens the hex to seven characters (`#RRGGBB`
115
+ with its letter-spacing, the 8px insets and the 1px border), from its own
116
+ left edge, so the text does not jump and the swatch and the label do not
117
+ move; never past the row's end (`--es-pick-edit-room`, measured). */
118
+ .es-pick-colour-row .es-pick-hex:focus {
119
+ position: absolute;
120
+ z-index: 2;
121
+ left: 0;
122
+ top: 50%;
123
+ transform: translateY(-50%);
124
+ width: calc(7ch + 0.14em + 18px);
125
+ max-width: var(--es-pick-edit-room, none);
126
+ -webkit-mask-image: none;
127
+ mask-image: none;
128
+ box-shadow: 0 0 0 2px var(--es-accent-tint);
129
+ }
130
+ /* 4px from the hex to the part after it (the reset): the row's 8px, less 4. */
131
+ .es-pick-colour-row > .es-pick-hexwrap + * {
132
+ margin-left: -4px;
133
+ }
134
+ /* The part after the hex steps aside ONLY when the edit box reaches it. */
135
+ .es-pick-colour-row[data-editing='over'] > .es-pick-hexwrap ~ * {
136
+ visibility: hidden;
137
+ }
138
+ /* The tag over a cut label or hex: the whole text, small and dark, above it. */
139
+ .es-pick-tag {
140
+ position: absolute;
141
+ z-index: 3;
142
+ transform: translateY(calc(-100% - 6px));
143
+ padding: 4px 8px;
144
+ border-radius: 6px;
145
+ background: #111827;
146
+ color: #fff;
147
+ font-size: 12px;
148
+ font-weight: 500;
149
+ line-height: 1.3;
150
+ white-space: nowrap;
151
+ pointer-events: none;
152
+ box-shadow: 0 4px 12px rgb(0 0 0 / 0.2);
153
+ }
154
+ /* `.es-pick-swatch.is-inherited` (no rule of its own): the swatch is painted
155
+ with the colour the setting follows, like any colour. The class is there
156
+ for a host that wants to mark it. */
157
+
158
+ /* ── A line that holds the picker ───────────────────────────────────────── */
159
+ /* BOTH EDITORS HOLD THE PICKER IN A LINE: `SettingsField`'s `action` slot
160
+ (`.es-field-head`, this package's own class), or a colour SUB-row inside one
161
+ setting (the email's Logo "Color 1" / "Color 2", a button's Fill / Border /
162
+ Text), which is not a SettingsField and takes `.es-pick-line`: the host's
163
+ label first, then the picker.
164
+
165
+ The picker's own box steps aside (`display: contents`), so its two halves
166
+ become items of that line: the swatch and hex at the line's end
167
+ (`margin-left: auto`), and the window wrapping onto a line of its own at the
168
+ FULL width. Left in the picker's box, the window opens in the few pixels the
169
+ action slot has.
170
+
171
+ Moved here from the storefront's stylesheet (2026-10-06), so the email does
172
+ not copy it: one rule for both editors. The shop's `.sf-field--row` can move
173
+ onto `.es-pick-line` later. */
174
+ .es-pick-line {
175
+ display: flex;
176
+ flex-wrap: wrap;
177
+ align-items: center;
178
+ gap: 8px;
179
+ }
180
+ /* The sub-row's label. A host may use its own instead. */
181
+ .es-pick-line-label {
182
+ min-width: 0;
183
+ font-size: 12px;
184
+ color: var(--es-text-secondary);
185
+ }
186
+ .es-field-head:has(> .es-pick-colour),
187
+ .es-pick-line:has(> .es-pick-colour) {
188
+ flex-wrap: wrap;
189
+ }
190
+ .es-field-head > .es-pick-colour,
191
+ .es-pick-line > .es-pick-colour {
192
+ display: contents;
193
+ }
194
+ /* ONE LINE (Lewis 2026-10-07, option E). The row steps aside too, so the
195
+ label, the swatch, the hex's slot and the part after it are items of ONE
196
+ line, sized by rule and never by how wide their text is:
197
+ - the hex's slot is laid out at its 36px (so the line never wraps) and
198
+ grows FIRST, to its 68px;
199
+ - the label takes what is left, never under 56px, so it gives way first;
200
+ - the swatch is pushed to the end with what follows it, so a column of
201
+ rows lines up. The tag is placed against the line. */
202
+ .es-field-head:has(> .es-pick-colour),
203
+ .es-pick-line:has(> .es-pick-colour) {
204
+ position: relative;
205
+ }
206
+ .es-field-head > .es-pick-colour > .es-pick-colour-row,
207
+ .es-pick-line > .es-pick-colour > .es-pick-colour-row {
208
+ display: contents;
209
+ }
210
+ .es-field-head > .es-pick-colour > .es-pick-colour-row > .es-pick-swatch,
211
+ .es-pick-line > .es-pick-colour > .es-pick-colour-row > .es-pick-swatch {
212
+ margin-left: auto;
213
+ }
214
+ .es-field-head > .es-pick-colour > .es-pick-colour-row > .es-pick-hexwrap,
215
+ .es-pick-line > .es-pick-colour > .es-pick-colour-row > .es-pick-hexwrap {
216
+ flex: 1000 1 0;
217
+ }
218
+ /* The label: whatever is left, never under 56px, fading at its end when cut. */
219
+ .es-field-head:has(> .es-pick-colour) > .es-field-name,
220
+ .es-pick-line:has(> .es-pick-colour) > .es-pick-line-label {
221
+ flex: 1 1 0;
222
+ min-width: 56px;
223
+ overflow: hidden;
224
+ white-space: nowrap;
225
+ }
226
+ .es-field-head:has(> .es-pick-colour) .es-field-label {
227
+ min-width: 0;
228
+ overflow: hidden;
229
+ white-space: nowrap;
230
+ }
231
+ .es-field-head:has(> .es-pick-colour) .es-field-label[data-clipped],
232
+ .es-pick-line > .es-pick-line-label[data-clipped] {
233
+ -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
234
+ mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
235
+ }
236
+ .es-field-head > .es-pick-colour > .es-pick-window,
237
+ .es-pick-line > .es-pick-colour > .es-pick-window {
238
+ flex: 1 0 100%;
239
+ min-width: 0;
240
+ /* ⚠️ What a host puts AFTER the picker on the same line (the panel's
241
+ Default / Reset part, `SettingsDefaultReset`) comes after the window in
242
+ DOM order once the picker's box is `contents`, and the window's 100%
243
+ basis would push it onto a line of its own UNDER the open window. Ordered
244
+ last, the window keeps that control beside the swatch. */
245
+ order: 1;
246
+ }
76
247
 
77
248
  /* ── The window under the row ───────────────────────────────────────────── */
78
249
  .es-pick-window {
@@ -84,10 +255,13 @@
84
255
  border-radius: 10px;
85
256
  background: var(--es-panel);
86
257
  }
258
+ /* ONE theme row, for the colour picker and the text box's colour window
259
+ (Lewis 2026-10-07). The swatches are one group: the scale's step for the
260
+ cells of one group. */
87
261
  .es-pick-theme {
88
262
  display: flex;
89
263
  flex-wrap: wrap;
90
- gap: 8px;
264
+ gap: 4px;
91
265
  }
92
266
  .es-pick-theme-swatch {
93
267
  width: 22px;
@@ -98,11 +272,11 @@
98
272
  box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.1);
99
273
  cursor: pointer;
100
274
  }
275
+ /* The chosen one: the ring INSIDE the swatch (Lewis 2026-10-07, option A) —
276
+ 2px of accent, then 2px of panel before the colour. Outside, it touched the
277
+ next swatch. Focus is the outline, outside it, so both show at once. */
101
278
  .es-pick-theme-swatch[aria-pressed='true'] {
102
- box-shadow:
103
- inset 0 0 0 1px rgb(0 0 0 / 0.1),
104
- 0 0 0 2px var(--es-panel),
105
- 0 0 0 4px var(--es-accent);
279
+ box-shadow: inset 0 0 0 2px var(--es-accent), inset 0 0 0 4px var(--es-panel);
106
280
  }
107
281
  /* The square: the hue at full strength, washed to white left-to-right and to
108
282
  black top-to-bottom — which is what saturation and brightness ARE. */
@@ -138,7 +312,20 @@
138
312
  .es-pick-hue-thumb {
139
313
  top: 50%;
140
314
  }
141
-
315
+ /* The hex row with its swatch (ColourWindow `swatch`, the text box's colour
316
+ window): the colour, then the hex. */
317
+ .es-pick-hex-row {
318
+ display: flex;
319
+ align-items: center;
320
+ gap: 8px;
321
+ }
322
+ .es-pick-hex-swatch {
323
+ width: 26px;
324
+ height: 26px;
325
+ flex: none;
326
+ border-radius: 6px;
327
+ box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.1);
328
+ }
142
329
  /* ── The image box ──────────────────────────────────────────────────────── */
143
330
  .es-pick-image {
144
331
  display: flex;
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
- import { c as EaselRailProps, E as EaselRailButtonProps } from '../types-Bs_gVkVI.js';
3
- export { a as EaselRailItem, b as EaselRailOrientation, d as EditorRailButtonProps, e as EditorRailItem, f as EditorRailOrientation, g as EditorRailProps } from '../types-Bs_gVkVI.js';
2
+ import { c as EaselRailProps, E as EaselRailButtonProps } from '../types-DWS-s9z-.js';
3
+ export { a as EaselRailItem, b as EaselRailOrientation } from '../types-DWS-s9z-.js';
4
4
  export { AddIcon, LayersIcon, MediaIcon, PageIcon as PagesIcon, IconProps as RailIconProps, SitemapIcon, StylesIcon } from '../icons/index.js';
5
5
  export { W as WordFit } from '../wordFit-D4S36PvB.js';
6
6
 
@@ -44,8 +44,6 @@ export { W as WordFit } from '../wordFit-D4S36PvB.js';
44
44
  * passes `ariaLabel`; `TopBarRail` does it from the provider.
45
45
  */
46
46
  declare function EaselRail({ items, ariaLabel, className, orientation, wordFit, }: EaselRailProps): react.JSX.Element;
47
- /** @deprecated The name before the Easel rename: `EaselRail`. */
48
- declare const EditorRail: typeof EaselRail;
49
47
 
50
48
  /**
51
49
  * A single rail button: an icon in a 34×34 square that hovers, highlights when
@@ -56,8 +54,6 @@ declare const EditorRail: typeof EaselRail;
56
54
  * whose item omits `active`) stays a plain button rather than a stuck toggle.
57
55
  */
58
56
  declare function EaselRailButton({ label, worded, icon, active, disabled, onSelect, className, }: EaselRailButtonProps): react.JSX.Element;
59
- /** @deprecated The name before the Easel rename: `EaselRailButton`. */
60
- declare const EditorRailButton: typeof EaselRailButton;
61
57
 
62
58
  /**
63
59
  * Rail design tokens — the ONE source both apps' rails converge on.
@@ -146,4 +142,4 @@ declare const railCssVars: {
146
142
  readonly accentTint: "--es-rail-accent-tint";
147
143
  };
148
144
 
149
- export { EaselRail, EaselRailButton, EaselRailButtonProps, EaselRailProps, EditorRail, EditorRailButton, type RailTokens, railCssVars, railTokens };
145
+ export { EaselRail, EaselRailButton, EaselRailButtonProps, EaselRailProps, type RailTokens, railCssVars, railTokens };
@@ -1 +1 @@
1
- import"../chunk-2PHD4L6A.js";export{EaselRail,EaselRailButton,EditorRail,EditorRailButton,railCssVars,railTokens}from"../chunk-XUE5O62R.js";import"../chunk-2OAZYSWJ.js";import"../chunk-BZ5ASXOL.js";export{AddIcon,LayersIcon,MediaIcon,PageIcon as PagesIcon,SitemapIcon,StylesIcon}from"../chunk-PI26YXYD.js";
1
+ import"../chunk-OWBO4WKA.js";export{EaselRail,EaselRailButton,railCssVars,railTokens}from"../chunk-WZ7TGAAT.js";import"../chunk-2OAZYSWJ.js";import"../chunk-BZ5ASXOL.js";export{AddIcon,LayersIcon,MediaIcon,PageIcon as PagesIcon,SitemapIcon,StylesIcon}from"../chunk-L5KW4HG5.js";
@@ -1,19 +1,21 @@
1
- import { S as SaveWords } from '../words-c-3h9xQQ.js';
2
- import { N as NoticeWords, C as ChromeWords } from '../words-DagJdwIA.js';
3
- import { C as CopyWords } from '../words-C74EUpFr.js';
1
+ import { S as SaveWords } from '../words-BMzV04b1.js';
2
+ import { N as NoticeWords, C as ChromeWords } from '../words-AHHfiaRY.js';
3
+ import { C as CopyWords } from '../words-XH0TvZPg.js';
4
4
  import { D as DragWords } from '../words-BDignMl_.js';
5
5
  import { LockWords } from '../edit-lock/index.js';
6
- import { F as FieldsWords } from '../words-CD3WADyb.js';
6
+ import { F as FieldsWords } from '../words-D8kf071T.js';
7
7
  import { N as NodeMenuWords } from '../words-DMG4dYq2.js';
8
- import { S as SettingsBucket } from '../buckets-CuLM47h9.js';
8
+ import { P as PanelWords } from '../words-BGrHZAJJ.js';
9
9
  import { P as PickWords } from '../words-is_Vy6hn.js';
10
10
  import { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
11
- import { T as TreeWords } from '../words-N4ebT88_.js';
12
- import '../types-p9j2Fac7.js';
13
- import '../types-Bs_gVkVI.js';
11
+ import { T as TextStylesWords } from '../words-CRYvAiHX.js';
12
+ import { T as TreeWords } from '../words-DgHcY5qB.js';
13
+ import '../types-DGcCsxs8.js';
14
+ import '../types-DWS-s9z-.js';
14
15
  import '../wordFit-D4S36PvB.js';
15
16
  import 'react';
16
17
  import '../markup/index.js';
18
+ import '../buckets-CuLM47h9.js';
17
19
 
18
20
  /**
19
21
  * The easel canvas's own words (`efficient-easel/strings`, 0.95.0). There is
@@ -26,26 +28,6 @@ type CanvasWords = {
26
28
  frame: string;
27
29
  };
28
30
 
29
- /**
30
- * The settings panel's own words (`efficient-easel/strings`, 0.95.0): what
31
- * the tab strip is called, and what each tab SAYS.
32
- *
33
- * A bucket's key (`'Content'`, `'Style'`, …) is an identifier — fields name
34
- * their tab with it and `SETTINGS_BUCKETS` orders them — so it never changes
35
- * with the language. `buckets` is the word drawn for each key.
36
- *
37
- * The panel is hook-free, so nothing here is read from the strings provider:
38
- * `SettingsTabs` takes its name as `ariaLabel` and each tab's word as the
39
- * item's `label`, and `Inspector` (which has hooks) passes both.
40
- */
41
-
42
- type PanelWords = {
43
- /** The tab strip's accessible name. */
44
- settings: string;
45
- /** The word each tab shows, by its key. */
46
- buckets: Record<SettingsBucket, string>;
47
- };
48
-
49
31
  /**
50
32
  * The rail's own words. There is one: what the toolbar is called when the host
51
33
  * does not name it (`ariaLabel`). Every other word on the rail is an item's
@@ -120,6 +102,8 @@ interface EaselStrings {
120
102
  copy: CopyWords;
121
103
  /** `efficient-easel/easel` — the canvas frame's name. */
122
104
  canvas: CanvasWords;
105
+ /** `efficient-easel/text-styles` — the Email styles / Site styles list (E6). */
106
+ textStyles: TextStylesWords;
123
107
  }
124
108
  /** Today's English, word for word. */
125
109
  declare const DEFAULT_EASEL_STRINGS: EaselStrings;
@@ -137,11 +121,5 @@ type DeepPartial<T> = T extends (...args: never[]) => unknown ? T : T extends ob
137
121
  * rather than as nothing. Neither argument is changed.
138
122
  */
139
123
  declare function mergeEaselStrings(defaults: EaselStrings, partial?: DeepPartial<EaselStrings> | null): EaselStrings;
140
- /** @deprecated The name before the Easel rename: `EaselStrings`. */
141
- type EditorStrings = EaselStrings;
142
- /** @deprecated The name before the Easel rename: `DEFAULT_EASEL_STRINGS`. */
143
- declare const DEFAULT_EDITOR_STRINGS: EaselStrings;
144
- /** @deprecated The name before the Easel rename: `mergeEaselStrings`. */
145
- declare const mergeEditorStrings: typeof mergeEaselStrings;
146
124
 
147
- export { type CanvasWords, ChromeWords, CopyWords, DEFAULT_EASEL_STRINGS, DEFAULT_EDITOR_STRINGS, type DeepPartial, DragWords, type EaselStrings, type EditorStrings, FieldsWords, LockWords, NodeMenuWords, NoticeWords, type PanelWords, PickWords, type RailWords, SaveWords, StyleClipboardWords, TreeWords, mergeEaselStrings, mergeEditorStrings };
125
+ export { type CanvasWords, ChromeWords, CopyWords, DEFAULT_EASEL_STRINGS, type DeepPartial, DragWords, type EaselStrings, FieldsWords, LockWords, NodeMenuWords, NoticeWords, PanelWords, PickWords, type RailWords, SaveWords, StyleClipboardWords, TextStylesWords, TreeWords, mergeEaselStrings };
@@ -1 +1 @@
1
- export{DEFAULT_EASEL_STRINGS,DEFAULT_EDITOR_STRINGS,mergeEaselStrings,mergeEditorStrings}from"../chunk-7JTL3P6P.js";import"../chunk-6WY6ZXJG.js";import"../chunk-WK3AFPXY.js";import"../chunk-ZAOM6PFH.js";import"../chunk-AELNNAFM.js";import"../chunk-SUO5627P.js";import"../chunk-H4B72XCJ.js";import"../chunk-7A7O2JWQ.js";import"../chunk-H6DDIBQ4.js";import"../chunk-KDIVA6WD.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-ZT7M24XD.js";import"../chunk-SJQG5ENJ.js";import"../chunk-O2NLQBFX.js";
1
+ export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-IG3U5NWJ.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.js";import"../chunk-AELNNAFM.js";import"../chunk-3EDSDPIP.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-ZJEBF4NB.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-UH7IGZKF.js";import"../chunk-ZAOM6PFH.js";import"../chunk-FPOKPNO4.js";import"../chunk-546BBOPE.js";import"../chunk-O2NLQBFX.js";
@@ -1,21 +1,23 @@
1
1
  import { DeepPartial, EaselStrings } from './catalogue.js';
2
- export { CanvasWords, DEFAULT_EASEL_STRINGS, DEFAULT_EDITOR_STRINGS, EditorStrings, PanelWords, RailWords, mergeEaselStrings, mergeEditorStrings } from './catalogue.js';
2
+ export { CanvasWords, DEFAULT_EASEL_STRINGS, RailWords, mergeEaselStrings } from './catalogue.js';
3
3
  import * as react from 'react';
4
4
  import { ReactNode } from 'react';
5
- export { C as ChromeWords, N as NoticeWords } from '../words-DagJdwIA.js';
6
- export { C as CopyWords } from '../words-C74EUpFr.js';
5
+ export { C as ChromeWords, N as NoticeWords } from '../words-AHHfiaRY.js';
6
+ export { C as CopyWords } from '../words-XH0TvZPg.js';
7
7
  export { D as DragWords } from '../words-BDignMl_.js';
8
- export { F as FieldsWords } from '../words-CD3WADyb.js';
8
+ export { F as FieldsWords } from '../words-D8kf071T.js';
9
9
  export { LockWords } from '../edit-lock/index.js';
10
10
  export { N as NodeMenuWords } from '../words-DMG4dYq2.js';
11
+ export { P as PanelWords } from '../words-BGrHZAJJ.js';
11
12
  export { P as PickWords } from '../words-is_Vy6hn.js';
12
- export { S as SaveWords } from '../words-c-3h9xQQ.js';
13
+ export { S as SaveWords } from '../words-BMzV04b1.js';
13
14
  export { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
14
- export { T as TreeWords } from '../words-N4ebT88_.js';
15
- import '../buckets-CuLM47h9.js';
15
+ export { T as TextStylesWords } from '../words-CRYvAiHX.js';
16
+ export { T as TreeWords } from '../words-DgHcY5qB.js';
16
17
  import '../markup/index.js';
17
- import '../types-p9j2Fac7.js';
18
- import '../types-Bs_gVkVI.js';
18
+ import '../buckets-CuLM47h9.js';
19
+ import '../types-DGcCsxs8.js';
20
+ import '../types-DWS-s9z-.js';
19
21
  import '../wordFit-D4S36PvB.js';
20
22
 
21
23
  interface EaselStringsProviderProps {
@@ -52,13 +54,5 @@ declare function EaselStringsProvider({ value, locale, children }: EaselStringsP
52
54
  declare function useEaselStrings(): EaselStrings;
53
55
  /** The nearest provider's locale, or `'en'`. */
54
56
  declare function useEaselLocale(): string;
55
- /** @deprecated The name before the Easel rename: `EaselStringsProviderProps`. */
56
- type EditorStringsProviderProps = EaselStringsProviderProps;
57
- /** @deprecated The name before the Easel rename: `EaselStringsProvider`. */
58
- declare const EditorStringsProvider: typeof EaselStringsProvider;
59
- /** @deprecated The name before the Easel rename: `useEaselStrings`. */
60
- declare const useEditorStrings: typeof useEaselStrings;
61
- /** @deprecated The name before the Easel rename: `useEaselLocale`. */
62
- declare const useEditorLocale: typeof useEaselLocale;
63
57
 
64
- export { DeepPartial, EaselStrings, EaselStringsProvider, type EaselStringsProviderProps, EditorStringsProvider, type EditorStringsProviderProps, useEaselLocale, useEaselStrings, useEditorLocale, useEditorStrings };
58
+ export { DeepPartial, EaselStrings, EaselStringsProvider, type EaselStringsProviderProps, useEaselLocale, useEaselStrings };
@@ -1,2 +1,2 @@
1
- import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-7JTL3P6P.js";export{DEFAULT_EASEL_STRINGS,DEFAULT_EDITOR_STRINGS,mergeEaselStrings,mergeEditorStrings}from"../chunk-7JTL3P6P.js";import"../chunk-6WY6ZXJG.js";import"../chunk-WK3AFPXY.js";import"../chunk-ZAOM6PFH.js";import"../chunk-AELNNAFM.js";import"../chunk-SUO5627P.js";import"../chunk-H4B72XCJ.js";import"../chunk-7A7O2JWQ.js";import"../chunk-H6DDIBQ4.js";import"../chunk-KDIVA6WD.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-ZT7M24XD.js";import"../chunk-SJQG5ENJ.js";import{stringsContext as t}from"../chunk-MFIRYGHW.js";import"../chunk-O2NLQBFX.js";import{useContext as o,useMemo as i}from"react";import{jsx as c}from"react/jsx-runtime";function s({value:s,locale:m,children:u}){const e=t(),p=o(e),h=p?.strings??r,j=m??p?.locale??"en",k=i(()=>({strings:n(h,s),locale:j}),[h,s,j]);/* @__PURE__ */
2
- return c(e.Provider,{value:k,children:u})}function m(){return o(t())?.strings??r}function u(){return o(t())?.locale??"en"}var e=s,p=m,h=u;export{s as EaselStringsProvider,e as EditorStringsProvider,u as useEaselLocale,m as useEaselStrings,h as useEditorLocale,p as useEditorStrings};
1
+ import{DEFAULT_EASEL_STRINGS as r,mergeEaselStrings as n}from"../chunk-IG3U5NWJ.js";export{DEFAULT_EASEL_STRINGS,mergeEaselStrings}from"../chunk-IG3U5NWJ.js";import"../chunk-M6F6LS3H.js";import"../chunk-6WY6ZXJG.js";import"../chunk-AELNNAFM.js";import"../chunk-3EDSDPIP.js";import"../chunk-QTLAVDJE.js";import"../chunk-WK3AFPXY.js";import"../chunk-H6DDIBQ4.js";import"../chunk-ZJEBF4NB.js";import"../chunk-RE4LP46F.js";import"../chunk-2OAZYSWJ.js";import"../chunk-UH7IGZKF.js";import"../chunk-ZAOM6PFH.js";import"../chunk-FPOKPNO4.js";import"../chunk-546BBOPE.js";import{stringsContext as o}from"../chunk-MFIRYGHW.js";import"../chunk-O2NLQBFX.js";import{useContext as t,useMemo as c}from"react";import{jsx as i}from"react/jsx-runtime";function s({value:s,locale:u,children:m}){const e=o(),p=t(e),h=p?.strings??r,j=u??p?.locale??"en",k=c(()=>({strings:n(h,s),locale:j}),[h,s,j]);/* @__PURE__ */
2
+ return i(e.Provider,{value:k,children:m})}function u(){return t(o())?.strings??r}function m(){return t(o())?.locale??"en"}export{s as EaselStringsProvider,m as useEaselLocale,u as useEaselStrings};
@@ -1,4 +1,4 @@
1
- import { E as EaselContextMenuItem } from '../types-DO-b0LNj.js';
1
+ import { E as EaselContextMenuItem } from '../types-Djdq6Xkd.js';
2
2
  import { S as StyleClipboardWords } from '../words-CnnHb9jo.js';
3
3
  import 'react';
4
4
 
@@ -1 +1 @@
1
- import{DEFAULT_STYLE_CLIPBOARD_WORDS as t}from"../chunk-6WY6ZXJG.js";import{CopyStyleIcon as e,PasteStyleIcon as n}from"../chunk-PI26YXYD.js";import{jsx as o}from"react/jsx-runtime";var r="__styleKind";function u(t,e){return t[r]=e,t}function c(t,e){return`${t}:${e.map(t=>String(t)).sort().join("|")}`}function i(t){if(!t)return null;const e=t.indexOf(":");if(e<0)return null;const n=t.slice(0,e);return s.has(n)?{control:n,values:t.slice(e+1).split("|")}:null}var s=/* @__PURE__ */new Set(["choice","select","radio"]);function l(t){if(!t||"object"!=typeof t)return null;const e=t;return"string"==typeof e[r]?e[r]:"text"===e.type||"textarea"===e.type||"number"===e.type?e.type:"select"!==e.type&&"radio"!==e.type||!Array.isArray(e.options)?null:c(e.type,e.options.map(t=>t?.value))}function a(t){return null!=t&&""!==t}function p(t,e){let n=t;for(const t of e){if(!n||"object"!=typeof n)return;n=n[t]}return n}function f(t){return void 0===t?t:JSON.parse(JSON.stringify(t))}function d(t,e,n){const[o,...r]=e,u={...t};if(0===r.length)return void 0===n?delete u[o]:u[o]=n,u;const c=u[o],i=d(c&&"object"==typeof c?c:{},r,n);return 0===Object.keys(i).length?delete u[o]:u[o]=i,u}var y=t=>t.join("."),h="editor-shell:style-clipboard",g=null,m=!1,v=/* @__PURE__ */new Set;function S(){try{return"undefined"==typeof sessionStorage?null:sessionStorage}catch{return null}}function b(){if(!m){m=!0;try{const t=S()?.getItem(h);t&&(g=JSON.parse(t))}catch{g=null}}}function k(t){b(),g={scope:t.scope,sourceType:t.type,sourceLabel:t.label,rows:t.rows.map(e=>{const n=p(t.props,e.path);return{path:[...e.path],kind:e.kind,counted:!1!==e.counted,value:a(n)?f(n):void 0}})};try{S()?.setItem(h,JSON.stringify(g))}catch{}return v.forEach(t=>t()),g}function N(t){return b(),g&&g.scope===t?g:null}function j(t){return v.add(t),()=>{v.delete(t)}}function C(){g=null,m=!0;try{S()?.removeItem(h)}catch{}v.forEach(t=>t())}function w(t,e,n){if(t.kind===e.kind)return null!==e.kind||n;const o=i(t.kind),r=i(e.kind);return!(!o||!r||o.control!==r.control)&&(!a(t.value)||r.values.includes(String(t.value)))}function O(t,e){const n=t.sourceType===e.type,o=new Map(t.rows.map(t=>[y(t.path),t]));let r=e.props,u=0,c=!1;for(const t of e.rows){const e=o.get(y(t.path));if(!e)continue;if(!w(e,t,n))continue;const i=p(r,t.path),s=void 0===e.value?void 0:f(e.value);JSON.stringify(a(i)?i:void 0)!==JSON.stringify(s)&&(r=d(r,t.path,s),c=!0),!1!==t.counted&&(u+=1)}return{props:r,pasted:u,changed:c}}function E(e,n,o,r=t){return 0===e.pasted?r.nothing({source:n,target:o}):r.pasted({count:e.pasted,source:n})}var J="⌥⌘C",K="⌥⌘V";function T(r){const u=r.words??t,c=[];return r.canCopy&&c.push({label:u.copy,icon:/* @__PURE__ */o(e,{}),shortcut:"⌥⌘C",onClick:r.onCopy}),r.held&&c.push({label:u.paste({source:r.held.sourceLabel}),icon:/* @__PURE__ */o(n,{}),shortcut:"⌥⌘V",onClick:r.onPaste}),c}function x(t){if(!t.altKey||t.shiftKey||!t.metaKey&&!t.ctrlKey)return null;const e=t.target;return e&&(e.isContentEditable||"INPUT"===e.tagName||"TEXTAREA"===e.tagName||"SELECT"===e.tagName)?null:"KeyC"===t.code?"copy":"KeyV"===t.code?"paste":null}export{J as COPY_STYLE_SHORTCUT,K as PASTE_STYLE_SHORTCUT,r as STYLE_KIND,c as choiceKind,C as clearStyle,k as copyStyle,l as fieldKind,N as heldStyle,E as pasteMessage,O as planPaste,T as styleMenuItems,x as styleShortcut,j as subscribeStyle,u as withStyleKind};
1
+ import{DEFAULT_STYLE_CLIPBOARD_WORDS as t}from"../chunk-6WY6ZXJG.js";import{CopyStyleIcon as e,PasteStyleIcon as n}from"../chunk-L5KW4HG5.js";import{jsx as o}from"react/jsx-runtime";var r="__styleKind";function u(t,e){return t[r]=e,t}function c(t,e){return`${t}:${e.map(t=>String(t)).sort().join("|")}`}function i(t){if(!t)return null;const e=t.indexOf(":");if(e<0)return null;const n=t.slice(0,e);return s.has(n)?{control:n,values:t.slice(e+1).split("|")}:null}var s=/* @__PURE__ */new Set(["choice","select","radio"]);function l(t){if(!t||"object"!=typeof t)return null;const e=t;return"string"==typeof e[r]?e[r]:"text"===e.type||"textarea"===e.type||"number"===e.type?e.type:"select"!==e.type&&"radio"!==e.type||!Array.isArray(e.options)?null:c(e.type,e.options.map(t=>t?.value))}function a(t){return null!=t&&""!==t}function p(t,e){let n=t;for(const t of e){if(!n||"object"!=typeof n)return;n=n[t]}return n}function f(t){return void 0===t?t:JSON.parse(JSON.stringify(t))}function d(t,e,n){const[o,...r]=e,u={...t};if(0===r.length)return void 0===n?delete u[o]:u[o]=n,u;const c=u[o],i=d(c&&"object"==typeof c?c:{},r,n);return 0===Object.keys(i).length?delete u[o]:u[o]=i,u}var y=t=>t.join("."),h="editor-shell:style-clipboard",g=null,m=!1,v=/* @__PURE__ */new Set;function S(){try{return"undefined"==typeof sessionStorage?null:sessionStorage}catch{return null}}function b(){if(!m){m=!0;try{const t=S()?.getItem(h);t&&(g=JSON.parse(t))}catch{g=null}}}function k(t){b(),g={scope:t.scope,sourceType:t.type,sourceLabel:t.label,rows:t.rows.map(e=>{const n=p(t.props,e.path);return{path:[...e.path],kind:e.kind,counted:!1!==e.counted,value:a(n)?f(n):void 0}})};try{S()?.setItem(h,JSON.stringify(g))}catch{}return v.forEach(t=>t()),g}function N(t){return b(),g&&g.scope===t?g:null}function j(t){return v.add(t),()=>{v.delete(t)}}function C(){g=null,m=!0;try{S()?.removeItem(h)}catch{}v.forEach(t=>t())}function w(t,e,n){if(t.kind===e.kind)return null!==e.kind||n;const o=i(t.kind),r=i(e.kind);return!(!o||!r||o.control!==r.control)&&(!a(t.value)||r.values.includes(String(t.value)))}function K(t,e){const n=t.sourceType===e.type,o=new Map(t.rows.map(t=>[y(t.path),t]));let r=e.props,u=0,c=!1;for(const t of e.rows){const e=o.get(y(t.path));if(!e)continue;if(!w(e,t,n))continue;const i=p(r,t.path),s=void 0===e.value?void 0:f(e.value);JSON.stringify(a(i)?i:void 0)!==JSON.stringify(s)&&(r=d(r,t.path,s),c=!0),!1!==t.counted&&(u+=1)}return{props:r,pasted:u,changed:c}}function O(e,n,o,r=t){return 0===e.pasted?r.nothing({source:n,target:o}):r.pasted({count:e.pasted,source:n})}var E="⌥⌘C",J="⌥⌘V";function T(r){const u=r.words??t,c=[];return r.canCopy&&c.push({label:u.copy,icon:/* @__PURE__ */o(e,{}),shortcut:"⌥⌘C",onClick:r.onCopy}),r.held&&c.push({label:u.paste({source:r.held.sourceLabel}),icon:/* @__PURE__ */o(n,{}),shortcut:"⌥⌘V",onClick:r.onPaste}),c}function x(t){if(!t.altKey||t.shiftKey||!t.metaKey&&!t.ctrlKey)return null;const e=t.target;return e&&(e.isContentEditable||"INPUT"===e.tagName||"TEXTAREA"===e.tagName||"SELECT"===e.tagName)?null:"KeyC"===t.code?"copy":"KeyV"===t.code?"paste":null}export{E as COPY_STYLE_SHORTCUT,J as PASTE_STYLE_SHORTCUT,r as STYLE_KIND,c as choiceKind,C as clearStyle,k as copyStyle,l as fieldKind,N as heldStyle,O as pasteMessage,K as planPaste,T as styleMenuItems,x as styleShortcut,j as subscribeStyle,u as withStyleKind};