efficient-easel 0.100.0 → 0.101.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 (53) hide show
  1. package/dist/chrome/index.js +24 -16
  2. package/dist/{chunk-QKVR3K73.js → chunk-2FZJWH24.js} +1 -1
  3. package/dist/chunk-546BBOPE.js +1 -0
  4. package/dist/{chunk-LGKQXSKO.js → chunk-EOJNJCMJ.js} +8 -8
  5. package/dist/{chunk-A5UK76FC.js → chunk-EWVJSRRY.js} +6 -6
  6. package/dist/chunk-FPOKPNO4.js +1 -0
  7. package/dist/chunk-H24N5TMZ.js +11 -0
  8. package/dist/chunk-IG3U5NWJ.js +1 -0
  9. package/dist/chunk-KTVH2ZRL.js +15 -0
  10. package/dist/{chunk-6EIVTKZZ.js → chunk-L5KW4HG5.js} +21 -20
  11. package/dist/{chunk-TRVZ7C23.js → chunk-QTLAVDJE.js} +1 -1
  12. package/dist/chunk-UH7IGZKF.js +1 -0
  13. package/dist/{chunk-V7GIIXFB.js → chunk-ZFDCDJNZ.js} +1 -1
  14. package/dist/{chunk-DICUMYMG.js → chunk-ZNS7727Y.js} +1 -1
  15. package/dist/copy/copy.css +83 -29
  16. package/dist/copy/index.d.ts +41 -7
  17. package/dist/copy/index.js +32 -31
  18. package/dist/drag/index.js +4 -4
  19. package/dist/fields/fields.css +185 -30
  20. package/dist/fields/index.d.ts +165 -20
  21. package/dist/fields/index.js +22 -37
  22. package/dist/gold/index.js +1 -1
  23. package/dist/icons/index.d.ts +4 -1
  24. package/dist/icons/index.js +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/markup/index.d.ts +18 -1
  27. package/dist/markup/index.js +1 -1
  28. package/dist/menu/index.js +1 -15
  29. package/dist/node-ops/index.js +1 -1
  30. package/dist/panel/index.d.ts +49 -38
  31. package/dist/panel/index.js +18 -18
  32. package/dist/panel/panel.css +99 -81
  33. package/dist/pick/index.d.ts +40 -2
  34. package/dist/pick/index.js +1 -1
  35. package/dist/pick/pick.css +183 -10
  36. package/dist/rail/index.js +1 -1
  37. package/dist/strings/catalogue.d.ts +3 -3
  38. package/dist/strings/catalogue.js +1 -1
  39. package/dist/strings/index.d.ts +3 -3
  40. package/dist/strings/index.js +1 -1
  41. package/dist/style-clipboard/index.js +1 -1
  42. package/dist/text-styles/index.js +13 -13
  43. package/dist/tree/index.js +1 -1
  44. package/dist/{words-CJjUKcV5.d.ts → words-BGrHZAJJ.d.ts} +13 -4
  45. package/dist/{words-CzoyDNHm.d.ts → words-D8kf071T.d.ts} +40 -2
  46. package/dist/{words-DBq7vfHy.d.ts → words-XH0TvZPg.d.ts} +8 -5
  47. package/package.json +1 -1
  48. package/dist/chunk-AZT7V4UM.js +0 -10
  49. package/dist/chunk-HDVD27VB.js +0 -1
  50. package/dist/chunk-JQM3V7XQ.js +0 -1
  51. package/dist/chunk-LA54QLP5.js +0 -1
  52. package/dist/chunk-MH5GUZFQ.js +0 -9
  53. package/dist/chunk-SAJUCHOX.js +0 -1
@@ -1,37 +1,22 @@
1
- import{FieldSelect as e}from"../chunk-LGKQXSKO.js";export{FieldSelect,FieldSlider,optionFor}from"../chunk-LGKQXSKO.js";import{LayersTree as n,TreeSeam as l,TreeRow as t,TreeRowAction as r}from"../chunk-V7GIIXFB.js";import{SettingsField as i,SETTINGS_BUCKETS as a,SettingsTabs as o,SettingsGroup as s}from"../chunk-DICUMYMG.js";import{DEFAULT_TREE_WORDS as c}from"../chunk-3EDSDPIP.js";import{DEFAULT_PANEL_WORDS as d}from"../chunk-TRVZ7C23.js";export{useResolvedFields}from"../chunk-YRLPFZW3.js";import{InspectorUpLevel as u}from"../chunk-MH5GUZFQ.js";import"../chunk-ZJEBF4NB.js";import{FieldNumber as m}from"../chunk-A5UK76FC.js";export{FieldNumber,clampNumber,parseTyped,useNumberEntry}from"../chunk-A5UK76FC.js";import{SettingsSegmented as h}from"../chunk-P6O363EE.js";import{DEFAULT_FIELDS_WORDS as p}from"../chunk-LA54QLP5.js";import{useWords as b}from"../chunk-MFIRYGHW.js";import"../chunk-BZ5ASXOL.js";import{useTreeDrag as f,gapToMoveIndex as g}from"../chunk-67GNT6PF.js";import"../chunk-6EIVTKZZ.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";import{useId as v,useState as y}from"react";import{jsx as k,jsxs as x,Fragment as N}from"react/jsx-runtime";function O({id:e,value:n,onChange:l,placeholder:t,multiline:r=!1,rows:i=3,readOnly:a=!1,ariaLabel:o,ariaLabelledBy:s}){const c=n??"";return r?/* @__PURE__ */k("textarea",{id:e,className:"es-fin es-fin--area",value:c,rows:i,placeholder:t,readOnly:a,"aria-label":o,"aria-labelledby":s,onChange:e=>l(e.target.value)}):/* @__PURE__ */k("input",{id:e,type:"text",className:"es-fin",value:c,placeholder:t,readOnly:a,"aria-label":o,"aria-labelledby":s,onChange:e=>l(e.target.value)})}function C(e,n,l){const t=e.slice();return t.splice(Math.max(0,Math.min(n,t.length)),0,l),t}function j(e,n,l){const t=e.slice(),[r]=t.splice(n,1);return t.splice(Math.max(0,Math.min(l,t.length)),0,r),t}function w(e,n){return e.filter((e,l)=>l!==n)}function I(e){return null===e||"object"!=typeof e?e:JSON.parse(JSON.stringify(e))}function F(){/* @__PURE__ */
2
- return x("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:[
3
- /* @__PURE__ */k("circle",{cx:"9",cy:"6",r:"1.6"}),
4
- /* @__PURE__ */k("circle",{cx:"15",cy:"6",r:"1.6"}),
5
- /* @__PURE__ */k("circle",{cx:"9",cy:"12",r:"1.6"}),
6
- /* @__PURE__ */k("circle",{cx:"15",cy:"12",r:"1.6"}),
7
- /* @__PURE__ */k("circle",{cx:"9",cy:"18",r:"1.6"}),
8
- /* @__PURE__ */k("circle",{cx:"15",cy:"18",r:"1.6"})]})}var $={parentId:"list",slot:"items"};function S({label:e,icon:i,noun:a,items:o,onChange:s,newItem:d,summary:m,itemName:h,thumb:v,min:y=0,max:O,readOnly:S=!1,open:L,onOpen:M,renderItem:P}){const B=b("fields",p).list,K=b("tree",c),A=a??B.item,G=!S&&("number"!=typeof O||o.length<O),Z=!S&&o.length>y,E=(e,n)=>h?h(e,n):B.itemName({noun:A,n:n+1}),T=f({keyOf:e=>String(e),canDrop:(e,n)=>n.parentId===$.parentId&&n.slot===$.slot,onDrop:(e,n)=>{const l=g({...$,index:e},n);l!==e&&s(j(o,e,l))},onStep:(e,n)=>s(j(o,e,e+n)),canStep:(e,n)=>e+n>=0&&e+n<o.length,readOnly:S}),V=e=>{G&&s(C(o,e,d()))},X=e=>{G&&s(C(o,e+1,I(o[e])))},D=e=>{Z&&(s(w(o,e)),null!==L&&M(null))};if(null!==L&&L>=0&&L<o.length){const n=o[L];/* @__PURE__ */
9
- return x("div",{className:"es-list is-open",children:[
10
- /* @__PURE__ */k(u,{inline:!0,name:e,onSelect:()=>M(null)}),
11
- /* @__PURE__ */x("div",{className:"es-list-title",children:[
12
- /* @__PURE__ */k("span",{className:"es-list-name",children:E(n,L)}),
13
- /* @__PURE__ */k("span",{className:"es-list-count",children:B.position({n:L+1,total:o.length})})]}),
14
- /* @__PURE__ */k("div",{className:"es-list-item",children:P(n,L,e=>{const n=o.slice();n[L]=e,s(n)})}),S?null:/* @__PURE__ */x("div",{className:"es-list-item-actions",children:[
15
- /* @__PURE__ */k("button",{type:"button",className:"es-fbtn",disabled:!G,onClick:()=>X(L),children:B.duplicate}),
16
- /* @__PURE__ */k("button",{type:"button",className:"es-fbtn es-fbtn--danger",disabled:!Z,onClick:()=>D(L),children:B.deleteItem({noun:A})})]})]})}/* @__PURE__ */
17
- return x("div",{className:"es-list",children:[
18
- /* @__PURE__ */x("div",{className:"es-list-head",children:[
19
- /* @__PURE__ */x("span",{className:"es-list-label",children:[i?/* @__PURE__ */k("span",{className:"es-field-icon","aria-hidden":"true",children:i}):null,e]}),
20
- /* @__PURE__ */k("span",{className:"es-list-count",children:o.length})]}),o.length?/* @__PURE__ */x(n,{className:"es-list-tree",rootProps:T.rootProps(),children:[o.map((e,n)=>{const i={...$,index:n},a=T.row({item:n,place:i});/* @__PURE__ */
21
- return x("div",{className:"es-list-entry",children:[n>0?/* @__PURE__ */k(l,{...T.seam({place:i}),onAdd:G?()=>V(n):void 0,label:B.addHere({noun:A})}):null,
22
- /* @__PURE__ */k(t,{icon:v?v(e,n):/* @__PURE__ */k(F,{}),name:E(e,n),preview:m?m(e,n):void 0,draggable:a.draggable,dragging:a.dragging,drop:a.drop,rowProps:a.rowProps,words:K,onSelect:()=>M(n),actions:S?void 0:/* @__PURE__ */x(N,{children:[
23
- /* @__PURE__ */k(r,{kind:"plain",label:B.duplicateItem({noun:A}),disabled:!G,onClick:()=>X(n),children:/* @__PURE__ */x("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[
24
- /* @__PURE__ */k("rect",{x:"9",y:"9",width:"11",height:"11",rx:"2"}),
25
- /* @__PURE__ */k("path",{d:"M5 15V6a2 2 0 0 1 2-2h9"})]})}),
26
- /* @__PURE__ */k(r,{kind:"delete",label:B.deleteItem({noun:A}),disabled:!Z,onClick:()=>D(n),children:/* @__PURE__ */k("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":"true",children:/* @__PURE__ */k("path",{d:"M4 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3"})})})]})})]},n)}),
27
- /* @__PURE__ */k(l,{...T.seam({place:{...$,index:o.length}})})]}):null,S?null:/* @__PURE__ */k("button",{type:"button",className:"es-list-add",disabled:!G,onClick:()=>V(o.length),children:B.add({noun:A})})]})}var L=(e,n)=>"string"==typeof e.label&&e.label?e.label:n;function M({field:e,name:n,id:l,value:t,onChange:r,readOnly:i,context:a,renderers:o}){const[c,d]=y(!0),u=t&&"object"==typeof t?t:{};/* @__PURE__ */
28
- return k(s,{id:`${l}-group`,title:L(e,n),open:c,onToggle:d,children:Object.entries(e.objectFields).map(([e,t])=>/* @__PURE__ */k(B,{field:t,name:`${n}.${e}`,id:`${l}-${e}`,value:u[e],onChange:n=>r({...u,[e]:n}),readOnly:i,context:a,renderers:o},e))})}function P({field:e,name:n,id:l,value:t,onChange:r,readOnly:i,context:a,renderers:o,openItem:s,onOpenItem:c}){const[d,u]=y(null),m=c?s??null:d,h=c??u,p=Array.isArray(t)?t:[],b=e.getItemSummary;/* @__PURE__ */
29
- return k(S,{label:L(e,n),icon:e.icon,noun:"string"==typeof e.noun?e.noun:void 0,items:p,onChange:r,newItem:()=>I({...e.defaultItemProps??{}}),summary:b?(e,n)=>b(e,n):void 0,min:e.min,max:e.max,readOnly:i,open:m,onOpen:h,renderItem:(t,r,s)=>Object.entries(e.arrayFields).map(([e,c])=>/* @__PURE__ */k(B,{field:c,name:`${n}[${r}].${e}`,id:`${l}-${r}-${e}`,value:t?.[e],onChange:n=>s({...t,[e]:n}),readOnly:i,context:a,renderers:o},e))})}function B(n){const{field:l,name:t,id:r,value:a,onChange:o,readOnly:s,context:c,renderers:d}=n;if(!l||l.marker||!1===l.visible)return null;const u=d?.[l.type];if(u)return u({field:l,name:t,id:r,value:a,onChange:o,readOnly:s});switch(l.type){case"custom":{const e={...c,field:l,name:t,id:r,value:a,onChange:o,readOnly:s};return l.render(e)}case"text":case"textarea":/* @__PURE__ */
30
- return k(i,{label:L(l,t),htmlFor:r,icon:l.icon,hint:l.hint,children:/* @__PURE__ */k(O,{id:r,value:"string"==typeof a?a:null==a?"":String(a),onChange:o,placeholder:l.placeholder,multiline:"textarea"===l.type,readOnly:s})});case"number":/* @__PURE__ */
31
- return k(i,{label:L(l,t),htmlFor:r,icon:l.icon,hint:l.hint,children:/* @__PURE__ */k(m,{id:r,value:"number"==typeof a?a:void 0,onChange:o,min:l.min,max:l.max,step:l.step,placeholder:l.placeholder,readOnly:s})});case"select":{const n=`${r}-label`;/* @__PURE__ */
32
- return k(i,{label:L(l,t),labelId:n,htmlFor:r,icon:l.icon,hint:l.hint,children:/* @__PURE__ */k(e,{id:r,value:a,options:l.options,onChange:o,readOnly:s,ariaLabelledBy:n})})}case"radio":/* @__PURE__ */
33
- return k(i,{label:L(l,t),icon:l.icon,hint:l.hint,children:/* @__PURE__ */k(h,{ariaLabel:L(l,t),value:a,options:l.options.map(e=>({id:e.value,label:e.label,icon:e.icon,disabled:e.disabled||s})),onChange:e=>{s||o(e)}})});case"object":/* @__PURE__ */
34
- return k(M,{...n,field:l});case"array":/* @__PURE__ */
35
- return k(P,{...n,field:l});case"slot":return null}}var K=e=>a.includes(e);function A(e){let n=a[0];const l=[],t=/* @__PURE__ */new Set;for(const[r,i]of Object.entries(e))i&&(K(i.bucket)&&(n=i.bucket),i.marker||!1===i.visible||(l.push({name:r,field:i,bucket:n}),"slot"!==i.type&&t.add(n)));return{rows:l,buckets:a.filter(e=>t.has(e))}}function G(e){return new Map(A(e).rows.map(e=>[e.name,e.bucket]))}function Z({fields:e,values:n,onChange:l,readOnly:t=!1,context:r,tab:i,onTab:a,tabs:s=!0,tabIcons:c,renderers:u,idPrefix:m,ariaLabel:h,children:p}){const f=b("panel",d),g=v(),N=m??`es-insp${g.replace(/:/g,"")}`,O=A(e),[C,j]=y(void 0),w=i??C,I=w&&O.buckets.includes(w)?w:O.buckets[0],[F,$]=y(null),S=F&&F.panel===N&&O.rows.some(e=>e.name===F.name)?F:null,L=s&&O.buckets.length>1&&!S,M=`${N}-rows`,P=e=>`${N}-tab-${e.toLowerCase()}`;/* @__PURE__ */
36
- return x("div",{className:"es-insp",children:[L?/* @__PURE__ */k("div",{className:"es-insp-tabs",children:/* @__PURE__ */k(o,{ariaLabel:h??f.settings,activeId:I,onSelect:e=>{const n=e;void 0===i&&j(n),a?.(n)},items:O.buckets.map(e=>({id:e,label:f.buckets[e],icon:c?.[e],htmlId:P(e),panelId:M}))})}):null,
37
- /* @__PURE__ */x("div",{className:"es-insp-rows",id:M,role:L?"tabpanel":void 0,"aria-labelledby":L&&I?P(I):void 0,children:[O.rows.map(({name:e,field:i,bucket:a})=>/* @__PURE__ */k("div",{className:"es-insp-row","data-field":e,"data-bucket":a,hidden:!!(S?S.name!==e:L&&a!==I)||void 0,children:/* @__PURE__ */k(B,{field:i,name:e,id:`${N}-${e}`,value:n[e],onChange:n=>l(e,n),readOnly:t,context:r,renderers:u,openItem:S&&S.name===e?S.index:null,onOpenItem:n=>$(null===n?null:{panel:N,name:e,index:n})})},e)),S?null:p]})]})}export{O as FieldText,Z as Inspector,B as InspectorField,S as ListField,G as bucketsOf,I as copyItem,C as insertAt,L as labelOf,j as moveTo,A as planFields,w as removeAt};
1
+ import{FieldSelect as e}from"../chunk-EOJNJCMJ.js";export{FieldSelect,FieldSlider,optionFor}from"../chunk-EOJNJCMJ.js";import{TreeSeam as n}from"../chunk-ZFDCDJNZ.js";import{SettingsField as l,SETTINGS_BUCKETS as t,SettingsTabs as a,SettingsGroup as r}from"../chunk-ZNS7727Y.js";import{DEFAULT_TREE_WORDS as i}from"../chunk-3EDSDPIP.js";import{DEFAULT_PANEL_WORDS as o}from"../chunk-QTLAVDJE.js";export{useResolvedFields}from"../chunk-YRLPFZW3.js";import{EaselContextMenu as s}from"../chunk-KTVH2ZRL.js";import{FieldNumber as c}from"../chunk-EWVJSRRY.js";export{FieldNumber,clampNumber,parseTyped,useNumberEntry}from"../chunk-EWVJSRRY.js";import{SettingsSegmented as u}from"../chunk-P6O363EE.js";import{DEFAULT_FIELDS_WORDS as d}from"../chunk-FPOKPNO4.js";import{useWords as m}from"../chunk-MFIRYGHW.js";import"../chunk-BZ5ASXOL.js";import{useTreeDrag as p,gapToMoveIndex as h}from"../chunk-67GNT6PF.js";import{ChevronIcon as b,LockIcon as f,MoveUpIcon as v,MoveDownIcon as g,DuplicateIcon as y,TrashIcon as x}from"../chunk-L5KW4HG5.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";import{useRef as k,useState as N,useLayoutEffect as O,useId as w}from"react";import{jsx as C,jsxs as j}from"react/jsx-runtime";function S({id:e,value:n,onChange:l,placeholder:t,multiline:a=!1,rows:r=3,readOnly:i=!1,ariaLabel:o,ariaLabelledBy:s}){const c=n??"";return a?/* @__PURE__ */C("textarea",{id:e,className:"es-fin es-fin--area",value:c,rows:r,placeholder:t,readOnly:i,"aria-label":o,"aria-labelledby":s,onChange:e=>l(e.target.value)}):/* @__PURE__ */C("input",{id:e,type:"text",className:"es-fin",value:c,placeholder:t,readOnly:i,"aria-label":o,"aria-labelledby":s,onChange:e=>l(e.target.value)})}function I(e,n,l){const t=e.slice();return t.splice(Math.max(0,Math.min(n,t.length)),0,l),t}function D(e,n,l){const t=e.slice(),[a]=t.splice(n,1);return t.splice(Math.max(0,Math.min(l,t.length)),0,a),t}function F(e,n){return e.filter((e,l)=>l!==n)}function $(e){return null===e||"object"!=typeof e?e:JSON.parse(JSON.stringify(e))}var L='input, textarea, select, button, [contenteditable]:not([contenteditable="false"]), [tabindex]',E={parentId:"list",slot:"items"};function P({label:e,icon:l,noun:t,items:a,onChange:r,newItem:o,summary:c,itemName:u,thumb:w,min:S=0,max:P,readOnly:R=!1,open:A,onOpen:M,renderItem:J,renderRow:T,canRemove:K,lockedReason:B,fixed:z=!1,removeOnRow:H=!0,canDuplicate:V,above:W,head:Y=!0}){const Z=m("fields",d).list,X=m("tree",i),q=t??Z.item,G=!R&&!z&&("number"!=typeof P||a.length<P),Q=a.length<=S,U=e=>!!K&&!K(a[e],e),_=e=>!R&&!z&&H&&!Q&&!U(e),ee=e=>G&&(!V||V(a[e],e)),ne=(e,n)=>u?u(e,n):Z.itemName({noun:q,n:n+1}),le=k([]),te=k(null),[ae,re]=N(null),ie=k(null),[oe,se]=N(null),[ce,ue]=N("");O(()=>{for(const e of le.current){if(!e)continue;null!==e.querySelector(L)||R?e.removeAttribute("tabindex"):e.tabIndex=0}}),O(()=>{const e=te.current;if(!e)return;te.current=null;const n=le.current[e.index]?.querySelectorAll(L)[e.nth]??le.current[e.index];if(n?.focus(),n&&null!==e.start&&"setSelectionRange"in n)try{n.setSelectionRange(e.start,e.end)}catch{}});const de=(e,n)=>{if(n<0||n>=a.length||n===e)return;const l=le.current[e],t=l?.ownerDocument.activeElement;if(l&&t&&l.contains(t)){const e=[...l.querySelectorAll(L)].indexOf(t),a=t;te.current={index:n,nth:e,start:"number"==typeof a.selectionStart?a.selectionStart:null,end:"number"==typeof a.selectionEnd?a.selectionEnd:null}}r(D(a,e,n));const i=function(e,n,l){return null===e?null:e===n?l:n<e&&l>=e?e-1:n>e&&l<=e?e+1:e}(A,e,n);i!==A&&M(i),ue(Z.moved({n:n+1,total:a.length}))},me=e=>{G&&(r(I(a,e,o())),T?(te.current={index:e,nth:0,start:null,end:null},null!==A&&A>=e&&M(A+1)):M(e))},pe=e=>{_(e)&&(r(F(a,e)),A===e?M(null):null!==A&&A>e&&M(A-1))},he=p({keyOf:e=>String(e),canDrop:(e,n)=>n.parentId===E.parentId&&n.slot===E.slot,onDrop:(e,n)=>{const l=h({...E,index:e},n);l!==e&&de(e,l)},onStep:(e,n)=>de(e,e+n),canStep:(e,n)=>e+n>=0&&e+n<a.length,readOnly:R}),be=e=>{const n=[];return e>0&&n.push({label:Z.moveUp,icon:/* @__PURE__ */C(v,{size:14}),shortcut:"⌥↑",onClick:()=>de(e,e-1)}),e<a.length-1&&n.push({label:Z.moveDown,icon:/* @__PURE__ */C(g,{size:14}),shortcut:"⌥↓",onClick:()=>de(e,e+1)}),ee(e)&&n.push({label:Z.duplicate,icon:/* @__PURE__ */C(y,{size:14}),onClick:()=>(e=>{ee(e)&&(r(I(a,e+1,$(a[e]))),null!==A&&A>e&&M(A+1))})(e)}),_(e)&&n.push({label:Z.delete,icon:/* @__PURE__ */C(x,{size:14}),danger:!0,onClick:()=>pe(e)}),n},fe=(e,n,l)=>{R||0===be(e).length||se({index:e,x:n,y:l})},ve=e=>n=>{const l=a.slice();l[e]=n,r(l)};/* @__PURE__ */
2
+ return j("div",{className:"es-list",children:[Y?/* @__PURE__ */j("div",{className:"es-list-head",children:[
3
+ /* @__PURE__ */j("span",{className:"es-list-label",children:[l?/* @__PURE__ */C("span",{className:"es-field-icon","aria-hidden":"true",children:l}):null,e]}),
4
+ /* @__PURE__ */C("span",{className:"es-list-count",children:a.length})]}):null,W?/* @__PURE__ */C("div",{className:"es-list-above",children:W}):null,a.length?/* @__PURE__ */j("div",{className:"es-list-rows",...he.rootProps(),children:[a.map((e,l)=>{const t=he.row({item:l,place:{...E,index:l}}),a=t.draggable&&ae!==l,r=!T&&A===l,i=!R&&!z&&H&&U(l),o=["es-list-row",T?"is-inline":"is-item",r?"is-open":"",a?"is-draggable":"",t.dragging?"is-dragging":"",t.drop?`is-drop-${t.drop}`:""].filter(Boolean).join(" ");/* @__PURE__ */
5
+ return j("div",{className:"es-list-entry",children:[l>0?/* @__PURE__ */C(n,{...he.seam({place:{...E,index:l}}),onAdd:G?()=>me(l):void 0,label:Z.addHere({noun:q})}):null,
6
+ /* @__PURE__ */j("div",{...t.rowProps,ref:e=>{le.current[l]=e},className:o,draggable:a||void 0,"aria-keyshortcuts":t.draggable?"Alt+ArrowUp Alt+ArrowDown":void 0,onPointerDown:e=>{const n=e.target.closest?.('input, textarea, select, [contenteditable]:not([contenteditable="false"])'),a=!!n&&n===n.ownerDocument.activeElement;e.currentTarget.draggable=t.draggable&&!a,ie.current=n&&!a?n:null,re(a?l:null)},onDragStart:e=>{const n=ie.current;ie.current=null,n&&n.ownerDocument.activeElement===n&&n.blur(),t.rowProps.onDragStart?.(e)},onContextMenu:e=>{R||(e.preventDefault(),e.stopPropagation(),fe(l,e.clientX,e.clientY))},onKeyDown:e=>{if("ContextMenu"===e.key||e.shiftKey&&"F10"===e.key){e.preventDefault();const n=e.currentTarget.ownerDocument,t=e=>e.preventDefault();n.addEventListener("contextmenu",t,{capture:!0,once:!0}),n.defaultView?.setTimeout(()=>n.removeEventListener("contextmenu",t,{capture:!0}),500);const a=e.currentTarget.getBoundingClientRect();return void fe(l,a.left+24,a.bottom)}t.rowProps.onKeyDown?.(e)},children:[a?/* @__PURE__ */C("span",{className:"es-list-hint","aria-hidden":"true",children:X.dragHint}):null,T?/* @__PURE__ */C("div",{className:"es-list-row-main",children:T(e,l,ve(l))}):/* @__PURE__ */j("button",{type:"button",className:"es-list-open","aria-expanded":r,onClick:()=>M(r?null:l),children:[w?/* @__PURE__ */C("span",{className:"es-list-thumb","aria-hidden":"true",children:w(e,l)}):null,
7
+ /* @__PURE__ */C("span",{className:"es-list-row-name",children:ne(e,l)}),/* @__PURE__ */C("span",c?{className:"es-list-row-summary",children:c(e,l)}:{className:"es-list-row-summary"}),
8
+ /* @__PURE__ */C(b,{size:14,className:"es-list-chev","aria-hidden":"true"})]}),R||z||!H?null:i?/* @__PURE__ */C("span",{className:"es-list-lock",role:"img","aria-label":B?B(e,l):Z.locked,title:B?B(e,l):Z.locked,children:/* @__PURE__ */C(f,{size:13})}):/* @__PURE__ */C("button",{type:"button",className:"es-list-x","aria-label":Z.deleteItem({noun:q}),title:Z.deleteItem({noun:q}),disabled:!_(l),onClick:()=>pe(l),children:"×"})]}),r?/* @__PURE__ */C("div",{className:"es-list-item",children:J(e,l,ve(l))}):null]},l)}),
9
+ /* @__PURE__ */C(n,{...he.seam({place:{...E,index:a.length}})})]}):null,R||z?null:/* @__PURE__ */C("button",{type:"button",className:"es-list-add",disabled:!G,onClick:()=>me(a.length),children:Z.add({noun:q})}),
10
+ /* @__PURE__ */C("span",{className:"es-list-said","aria-live":"polite",children:ce}),oe&&oe.index<a.length?/* @__PURE__ */C(s,{x:oe.x,y:oe.y,items:be(oe.index),onClose:()=>se(null)}):null]})}var R=(e,n)=>"string"==typeof e.label&&e.label?e.label:n;function A({field:e,name:n,id:l,value:t,onChange:a,readOnly:i,context:o,renderers:s}){const[c,u]=N(!0),d=t&&"object"==typeof t?t:{};/* @__PURE__ */
11
+ return C(r,{id:`${l}-group`,title:R(e,n),open:c,onToggle:u,children:Object.entries(e.objectFields).map(([e,t])=>/* @__PURE__ */C(J,{field:t,name:`${n}.${e}`,id:`${l}-${e}`,value:d[e],onChange:n=>a({...d,[e]:n}),readOnly:i,context:o,renderers:s},e))})}function M({field:e,name:n,id:l,value:t,onChange:a,readOnly:r,context:i,renderers:o,openItem:s,onOpenItem:c}){const[u,d]=N(null),m=c?s??null:u,p=c??d,h=Array.isArray(t)?t:[],b=e.getItemSummary;/* @__PURE__ */
12
+ return C(P,{label:R(e,n),icon:e.icon,noun:"string"==typeof e.noun?e.noun:void 0,items:h,onChange:a,newItem:()=>$({...e.defaultItemProps??{}}),summary:b?(e,n)=>b(e,n):void 0,min:e.min,max:e.max,readOnly:r,open:m,onOpen:p,renderItem:(t,a,s)=>Object.entries(e.arrayFields).map(([e,c])=>/* @__PURE__ */C(J,{field:c,name:`${n}[${a}].${e}`,id:`${l}-${a}-${e}`,value:t?.[e],onChange:n=>s({...t,[e]:n}),readOnly:r,context:i,renderers:o},e))})}function J(n){const{field:t,name:a,id:r,value:i,onChange:o,readOnly:s,context:d,renderers:m}=n;if(!t||t.marker||!1===t.visible)return null;const p=m?.[t.type];if(p)return p({field:t,name:a,id:r,value:i,onChange:o,readOnly:s});switch(t.type){case"custom":{const e={...d,field:t,name:a,id:r,value:i,onChange:o,readOnly:s};return t.render(e)}case"text":case"textarea":/* @__PURE__ */
13
+ return C(l,{label:R(t,a),htmlFor:r,icon:t.icon,hint:t.hint,children:/* @__PURE__ */C(S,{id:r,value:"string"==typeof i?i:null==i?"":String(i),onChange:o,placeholder:t.placeholder,multiline:"textarea"===t.type,readOnly:s})});case"number":/* @__PURE__ */
14
+ return C(l,{label:R(t,a),htmlFor:r,icon:t.icon,hint:t.hint,children:/* @__PURE__ */C(c,{id:r,value:"number"==typeof i?i:void 0,onChange:o,min:t.min,max:t.max,step:t.step,placeholder:t.placeholder,readOnly:s})});case"select":{const n=`${r}-label`;/* @__PURE__ */
15
+ return C(l,{label:R(t,a),labelId:n,htmlFor:r,icon:t.icon,hint:t.hint,children:/* @__PURE__ */C(e,{id:r,value:i,options:t.options,onChange:o,readOnly:s,ariaLabelledBy:n})})}case"radio":/* @__PURE__ */
16
+ return C(l,{label:R(t,a),icon:t.icon,hint:t.hint,children:/* @__PURE__ */C(u,{ariaLabel:R(t,a),value:i,options:t.options.map(e=>({id:e.value,label:e.label,icon:e.icon,disabled:e.disabled||s})),onChange:e=>{s||o(e)}})});case"object":/* @__PURE__ */
17
+ return C(A,{...n,field:t});case"array":/* @__PURE__ */
18
+ return C(M,{...n,field:t});case"slot":return null}}var T=e=>t.includes(e);function K(e){let n=t[0];const l=[],a=/* @__PURE__ */new Set;for(const[t,r]of Object.entries(e))r&&(T(r.bucket)&&(n=r.bucket),r.marker||!1===r.visible||(l.push({name:t,field:r,bucket:n}),"slot"!==r.type&&a.add(n)));return{rows:l,buckets:t.filter(e=>a.has(e))}}function B(e){return new Map(K(e).rows.map(e=>[e.name,e.bucket]))}function z({fields:e,values:n,onChange:l,readOnly:t=!1,context:r,tab:i,onTab:s,tabs:c=!0,tabIcons:u,renderers:d,idPrefix:p,ariaLabel:h,children:b}){const f=m("panel",o),v=w(),g=p??`es-insp${v.replace(/:/g,"")}`,y=K(e),[x,k]=N(void 0),O=i??x,S=O&&y.buckets.includes(O)?O:y.buckets[0],[I,D]=N(null),F=I&&I.panel===g&&y.rows.some(e=>e.name===I.name)?I:null,$=c&&y.buckets.length>1,L=`${g}-rows`,E=e=>`${g}-tab-${e.toLowerCase()}`;/* @__PURE__ */
19
+ return j("div",{className:"es-insp",children:[$?/* @__PURE__ */C("div",{className:"es-insp-tabs",children:/* @__PURE__ */C(a,{ariaLabel:h??f.settings,activeId:S,onSelect:e=>{const n=e;void 0===i&&k(n),s?.(n)},items:y.buckets.map(e=>({id:e,label:f.buckets[e],icon:u?.[e],htmlId:E(e),panelId:L}))})}):null,
20
+ /* @__PURE__ */j("div",{className:"es-insp-rows",id:L,role:$?"tabpanel":void 0,"aria-labelledby":$&&S?E(S):void 0,children:[y.rows.map(({name:e,field:a,bucket:i})=>/* @__PURE__ */C("div",{className:"es-insp-row","data-field":e,"data-bucket":i,hidden:!(!$||i===S)||void 0,children:/* @__PURE__ */C(J,{field:a,name:e,id:`${g}-${e}`,value:n[e],onChange:n=>l(e,n),readOnly:t,context:r,renderers:d,openItem:F&&F.name===e?F.index:null,onOpenItem:n=>D(null===n?null:{panel:g,name:e,index:n})})},e)),b]})]})}function H(e){return"select"===e.type?e.options:"groups"===e.type?e.groups.flatMap(e=>e.options):[]}function V({value:n,onChange:l,kinds:t,rules:a,filtersFor:r,label:i,readOnly:o}){const s=m("fields",d).link??d.link,[c,u]=N(null),[p,h]=N(null),b=c??a.kindOf(n),f=t.filter(e=>!e.hideWhenEmpty||H(e.target).length>0||e.value===b),v=f.find(e=>"text"===e.target.type),g=f.find(e=>e.value===b)??v??f[0];if(!g)return null;const y="text"!==g.target.type,x=y?a.targetOf(n):n,k=H(g.target),O=k.find(e=>e.value===x),w=e=>({value:e,label:s.unavailable({value:e})}),S="select"===g.target.type&&x&&r?r(x):null,I=S?a.readFilter(n):null,D=I?S?.find(e=>e.param===I.param):void 0,F=p&&p.against===n?p.text:n,$=!y&&""!==F.trim()&&!a.isSafe(F),L=e=>{if(!e)return l("");const n=k.find(n=>n.value===e);l(e,n?.label)},E=(e,n)=>n&&!e.some(e=>e.value===n)?[w(n),...e]:[...e];let P;if("text"===g.target.type)P=/* @__PURE__ */C("input",{type:"text",className:"es-fin","aria-label":s.address,"aria-invalid":$||void 0,placeholder:s.addressPlaceholder,value:F,readOnly:o,onChange:e=>(e=>{const t=e.trim();t?a.isSafe(e)?(h({text:e,against:t}),l(t)):h({text:e,against:n}):(h({text:e,against:""}),l(""))})(e.target.value)});else{const n="groups"===g.target.type?g.target.groups.flatMap(e=>e.options.map(n=>({value:n.value,label:n.label,group:e.label}))):g.target.options.map(e=>({value:e.value,label:e.label}));P=/* @__PURE__ */C(e,{ariaLabel:g.label,value:x,options:[{value:"",label:g.target.placeholder},...E(n,x)],searchable:n.length>10,readOnly:o,onChange:L})}/* @__PURE__ */
21
+ return j("div",{className:"es-flink",role:i?"group":void 0,"aria-label":i,children:[
22
+ /* @__PURE__ */C(e,{ariaLabel:s.linkType,value:g.value,options:f.map(e=>({value:e.value,label:e.label})),readOnly:o,onChange:e=>{u(e),h(null);const n=f.find(n=>n.value===e);if(!n||"text"===n.target.type)return;const t=H(n.target)[0];t?l(t.value,t.label):l("")}}),P,S&&/* @__PURE__ */C(e,{ariaLabel:s.filter,value:I?.param??"",options:[{value:"",label:s.noFilter},...I&&!D?[w(I.param)]:[],...S.map(e=>({value:e.param,label:e.label}))],readOnly:o,onChange:e=>{if(!e)return l(x,O?.label);const n=S?.find(n=>n.param===e),t=n?.values[0];t&&l(a.withFilter(x,{param:e,value:t.value}),t.label)}}),S&&I&&/* @__PURE__ */C(e,{ariaLabel:s.value,value:I.value,options:E((D?.values??[]).map(e=>({value:e.value,label:e.label})),I.value),searchable:(D?.values.length??0)>10,readOnly:o,onChange:e=>{if(!I)return;const n=D?.values.find(n=>n.value===e);l(a.withFilter(x,{param:I.param,value:e}),n?.label)}}),$&&/* @__PURE__ */C("p",{className:"es-flink-error",role:"alert",children:s.unsafe}),g.hint&&/* @__PURE__ */C("p",{className:"es-flink-hint",children:g.hint}),S&&/* @__PURE__ */C("p",{className:"es-flink-hint",children:s.filterHint})]})}export{S as FieldText,z as Inspector,J as InspectorField,V as LinkPicker,P as ListField,B as bucketsOf,$ as copyItem,I as insertAt,R as labelOf,D as moveTo,K as planFields,F as removeAt};
@@ -1 +1 @@
1
- export{GoldLayer,GoldTextInput,goldSegments}from"../chunk-QKVR3K73.js";import"../chunk-HDVD27VB.js";var e={accent:"var(--gold, #c9a461)",quiet:"var(--es-muted, #6b7280)",caret:"var(--es-text, #111827)",placeholder:"var(--es-field-placeholder, #9ca3af)",delimiterOpacity:"0.35",delimiterRestingOpacity:"0.25",boldShadow:"0 0 0.4px currentColor",italicDecoration:"underline dotted",strikeDecoration:"line-through",pad:"0"},t={accent:"--es-gold-accent",quiet:"--es-gold-quiet",caret:"--es-gold-caret",placeholder:"--es-gold-placeholder",delimiterOpacity:"--es-gold-delim-opacity",delimiterRestingOpacity:"--es-gold-delim-resting-opacity",boldShadow:"--es-gold-bold-shadow",italicDecoration:"--es-gold-italic-decoration",strikeDecoration:"--es-gold-strike-decoration",pad:"--es-gold-pad"};export{t as goldCssVars,e as goldTokens};
1
+ export{GoldLayer,GoldTextInput,goldSegments}from"../chunk-2FZJWH24.js";import"../chunk-546BBOPE.js";var e={accent:"var(--gold, #c9a461)",quiet:"var(--es-muted, #6b7280)",caret:"var(--es-text, #111827)",placeholder:"var(--es-field-placeholder, #9ca3af)",delimiterOpacity:"0.35",delimiterRestingOpacity:"0.25",boldShadow:"0 0 0.4px currentColor",italicDecoration:"underline dotted",strikeDecoration:"line-through",pad:"0"},t={accent:"--es-gold-accent",quiet:"--es-gold-quiet",caret:"--es-gold-caret",placeholder:"--es-gold-placeholder",delimiterOpacity:"--es-gold-delim-opacity",delimiterRestingOpacity:"--es-gold-delim-resting-opacity",boldShadow:"--es-gold-bold-shadow",italicDecoration:"--es-gold-italic-decoration",strikeDecoration:"--es-gold-strike-decoration",pad:"--es-gold-pad"};export{t as goldCssVars,e as goldTokens};
@@ -170,6 +170,7 @@ declare const iconMeanings: {
170
170
  readonly "align-justify": "JUSTIFY — text whose rows run edge to edge. Worn by the Justify button on the final text box's second toolbar row, beside Left, Center and Right, and by the Justify chip of the alignment strip. Three full-width rows on the same three heights the other alignment glyphs use. Decided 2026-10-06 (the design was made final that day).";
171
171
  readonly "panel-left": "the LEFT SIDE PANEL itself — worn by the Hide panel button at the end of a left panel's head (`MediaPanelHead`, both editors' SidePanelHeads) and by the Show panel button in the strip a hidden left panel leaves. One control, so one drawing: hiding and showing the panel wear the same glyph. A frame with its left column ruled off. ⛔ NOT an ✕: an ✕ closes a dialog, and a panel head has none (owner, 2026-10-04).";
172
172
  readonly "panel-right": "the RIGHT SIDE PANEL itself — the twin of `panel-left` for the settings panel: its head's Hide panel button and the strip a hidden right panel leaves. A frame with its right column ruled off.";
173
+ readonly braces: "INSERT A MERGE TAG — a word that fills in for each reader ({{first_name}}, a coupon code). Worn by the Insert button the campaign designer puts in the 9th cell of the final text box's first toolbar row (`CopyBox` `lastTool`), which opens its list of tags. Two curly braces, the shape a merge tag is written in. Decided 2026-10-07. ⛔ NOT `code` or a pair of angle brackets: nothing here is code, and the braces are the tag's own spelling.";
173
174
  };
174
175
  type IconName = keyof typeof iconMeanings;
175
176
  /** Delete · keep · efficient-shop · components/UiIcon.tsx:99 */
@@ -500,5 +501,7 @@ declare function AlignJustifyIcon({ size, ...rest }: IconProps): react.JSX.Eleme
500
501
  declare function PanelLeftIcon({ size, ...rest }: IconProps): react.JSX.Element;
501
502
  /** the RIGHT SIDE PANEL itself — the twin of `panel-left` for the settings panel: its head's Hide panel button and the strip a hidden right panel leaves. A frame with its right column ruled off. · new · efficient-easel · card [MERGE] One Media Panel Head For Both Editors, 2026-10-06 — the drawing both editors already carried twice: efficient-storefront components/PanelToggleIcon.tsx and efficient-admin-portal src/components/email/CampaignTopBar.tsx `PanelToggleGlyph`. */
502
503
  declare function PanelRightIcon({ size, ...rest }: IconProps): react.JSX.Element;
504
+ /** INSERT A MERGE TAG — a word that fills in for each reader ({{first_name}}, a coupon code). Worn by the Insert button the campaign designer puts in the 9th cell of the final text box's first toolbar row (`CopyBox` `lastTool`), which opens its list of tags. Two curly braces, the shape a merge tag is written in. Decided 2026-10-07. ⛔ NOT `code` or a pair of angle brackets: nothing here is code, and the braces are the tag's own spelling. · new · efficient-easel · card [CHANGE] Undo Button Becomes Clear Style, 2026-10-07 — Lewis's ruling on mockup v2 https://claude.ai/artifact/GiyeV3xazepzArKGVkFM8T, which draws Insert with this path; asked for by GG for the admin card [CHANGE] Email Insert Moves Into The Toolbar (icons come from easel). */
505
+ declare function BracesIcon({ size, ...rest }: IconProps): react.JSX.Element;
503
506
 
504
- export { AccentIcon, AccountIcon, AddIcon, AlignCenterIcon, AlignJustifyIcon, 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, PanelLeftIcon, PanelRightIcon, 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 };
507
+ export { AccentIcon, AccountIcon, AddIcon, AlignCenterIcon, AlignJustifyIcon, 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, BracesIcon, 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, PanelLeftIcon, PanelRightIcon, 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 };
@@ -1 +1 @@
1
- export{AccentIcon,AccountIcon,AddIcon,AlignCenterIcon,AlignJustifyIcon,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,PanelLeftIcon,PanelRightIcon,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-6EIVTKZZ.js";
1
+ export{AccentIcon,AccountIcon,AddIcon,AlignCenterIcon,AlignJustifyIcon,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,BracesIcon,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,PanelLeftIcon,PanelRightIcon,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-L5KW4HG5.js";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"./chunk-OWBO4WKA.js";export{SPACING_SCALE,shellCssVars,shellTokens}from"./chunk-2UX75JDP.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-6EIVTKZZ.js";
1
+ import"./chunk-OWBO4WKA.js";export{SPACING_SCALE,shellCssVars,shellTokens}from"./chunk-2UX75JDP.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";
@@ -543,6 +543,23 @@ declare function sameMarks(a: readonly MarkedLine[], b: readonly MarkedLine[]):
543
543
  * literal underscore. And if even that would not read back, nothing changes.
544
544
  */
545
545
  declare function clearMarks(text: string, start: number, end: number, rules?: readonly InlineRule[]): WrapResult;
546
+ /**
547
+ * The final toolbar's Clear style (owner ruling, 2026-10-07): take EVERY mark
548
+ * off the WORDS in `text[start:end]` but a link, keeping the words selected —
549
+ * the bar's (bold, italic, underline, strikethrough, colour, superscript,
550
+ * subscript) and the retired ones it no longer offers (Emphasis, Quiet, the
551
+ * legacy accent), so the words come back plain (GG, 2026-10-07). A link is
552
+ * content, not style; a line's bullet or number is a line, not a mark.
553
+ *
554
+ * A run the selection only partly covers is split, so the rest of it keeps
555
+ * its mark; a split the grammar cannot hold (the middle of `_word_`) takes the
556
+ * run off whole; and if even that would not read back, nothing changes.
557
+ *
558
+ * With nothing selected nothing changes: the button is disabled then, so a
559
+ * press can never wipe a whole paragraph. Unlike {@link clearMarks} (the 0.94
560
+ * bar's Clear marks), which with a caret takes off the runs it touches.
561
+ */
562
+ declare function clearStyle(text: string, start: number, end: number, rules?: readonly InlineRule[]): WrapResult;
546
563
  /**
547
564
  * Press `style` on the WORDS in `text[start:end]`, whichever runs they sit in —
548
565
  * what a view that hides the delimiters needs, where `applyMark` (which wraps
@@ -609,4 +626,4 @@ declare function setList(text: string, start: number, end: number, kind: 'bullet
609
626
  * kind of list line, else null — what the list buttons draw as pressed. */
610
627
  declare function listIn(text: string, start: number, end: number, rules?: readonly InlineRule[]): 'bullet' | 'number' | null;
611
628
 
612
- export { CAMPAIGN_MARKUP, COPY_FIELD_TOOLS, type InlineKind, type InlineRule, type InlineToken, type LinkSpan, MARKUP_TOOLS, MARK_NAMES, MARK_PLACEHOLDERS, type MarkPlaceholders, type MarkSpan, type MarkStyle, type MarkedChar, type MarkedLine, type MarkupLine, type MarkupLink, type MarkupNode, type MarkupRun, type MarkupText, type MarkupTool, RETIRED_MARKS, STANDARD_MARKUP, STOREFRONT_MARKUP, type SpanKind, type WrapResult, applyColor, applyMark, clearMarks, colorIn, colorOver, findLink, isColorName, isColorValue, isSafeLinkHref, linkOver, listIn, markedAt, markedLines, marksIn, markupTools, parseMarkup, removeLink, sameMarks, serializeMarkup, setList, spanFor, stripInline, toggleMark, tokenizeInline, unlinkAt, writeLink, writeMarkedLines };
629
+ export { CAMPAIGN_MARKUP, COPY_FIELD_TOOLS, type InlineKind, type InlineRule, type InlineToken, type LinkSpan, MARKUP_TOOLS, MARK_NAMES, MARK_PLACEHOLDERS, type MarkPlaceholders, type MarkSpan, type MarkStyle, type MarkedChar, type MarkedLine, type MarkupLine, type MarkupLink, type MarkupNode, type MarkupRun, type MarkupText, type MarkupTool, RETIRED_MARKS, STANDARD_MARKUP, STOREFRONT_MARKUP, type SpanKind, type WrapResult, applyColor, applyMark, clearMarks, clearStyle, colorIn, colorOver, findLink, isColorName, isColorValue, isSafeLinkHref, linkOver, listIn, markedAt, markedLines, marksIn, markupTools, parseMarkup, removeLink, sameMarks, serializeMarkup, setList, spanFor, stripInline, toggleMark, tokenizeInline, unlinkAt, writeLink, writeMarkedLines };
@@ -1 +1 @@
1
- export{CAMPAIGN_MARKUP,COPY_FIELD_TOOLS,MARKUP_TOOLS,MARK_NAMES,MARK_PLACEHOLDERS,RETIRED_MARKS,STANDARD_MARKUP,STOREFRONT_MARKUP,applyColor,applyMark,clearMarks,colorIn,colorOver,findLink,isColorName,isColorValue,isSafeLinkHref,linkOver,listIn,markedAt,markedLines,marksIn,markupTools,parseMarkup,removeLink,sameMarks,serializeMarkup,setList,spanFor,stripInline,toggleMark,tokenizeInline,unlinkAt,writeLink,writeMarkedLines}from"../chunk-HDVD27VB.js";
1
+ export{CAMPAIGN_MARKUP,COPY_FIELD_TOOLS,MARKUP_TOOLS,MARK_NAMES,MARK_PLACEHOLDERS,RETIRED_MARKS,STANDARD_MARKUP,STOREFRONT_MARKUP,applyColor,applyMark,clearMarks,clearStyle,colorIn,colorOver,findLink,isColorName,isColorValue,isSafeLinkHref,linkOver,listIn,markedAt,markedLines,marksIn,markupTools,parseMarkup,removeLink,sameMarks,serializeMarkup,setList,spanFor,stripInline,toggleMark,tokenizeInline,unlinkAt,writeLink,writeMarkedLines}from"../chunk-546BBOPE.js";
@@ -1,15 +1 @@
1
- import{useRef as e,useState as n,useLayoutEffect as t,useEffect as r}from"react";import{createPortal as l}from"react-dom";import{jsxs as i,Fragment as o,jsx as a}from"react/jsx-runtime";var c={menu:"es-editor es-menu",menuSub:"es-editor es-menu",item:"es-menu-item",itemDanger:"es-menu-item is-danger",divider:"es-menu-divider",header:"es-menu-header",icon:"es-menu-icon",shortcut:"es-menu-shortcut",label:"es-menu-label",labelSub:"es-menu-label es-menu-label-sub",chevron:"es-menu-chevron",tick:"es-menu-tick"};function s({x:s,y:u,items:d,onClose:m,maxHeight:h,skin:b,portalTo:p}){const f=e(null),y=e(null),[g,v]=n(null),[w,x]=n({x:s,y:u}),[k,N]=n({x:s,y:u});if(k.x===s&&k.y===u||(N({x:s,y:u}),x({x:s,y:u})),t(()=>{const e=f.current;if(!e)return;const{width:n,height:t}=e.getBoundingClientRect(),r=window.innerWidth,l=window.innerHeight;let i=u;u+t>l-8&&(i=u-t>=8?u-t:Math.max(8,l-t-8));let o=s;s+n>r-8&&(o=s-n>=8?s-n:Math.max(8,r-n-8)),o===w.x&&i===w.y||x({x:o,y:i})},[s,u,d,w.x,w.y]),r(()=>{const e=document.activeElement;return f.current?.querySelector('[role="menuitem"]')?.focus(),()=>e?.focus?.()},[]),r(()=>{const e=e=>{const n=e.target;y.current?.contains(n)||f.current&&!f.current.contains(n)&&m()},n=e=>{"Escape"===e.key&&m()},t=setTimeout(()=>{window.addEventListener("mousedown",e),window.addEventListener("contextmenu",e),window.addEventListener("keydown",n)},0);return()=>{clearTimeout(t),window.removeEventListener("mousedown",e),window.removeEventListener("contextmenu",e),window.removeEventListener("keydown",n)}},[m]),0===d.length)return null;const C=b??c,E=e=>e.danger?C.itemDanger:C.item,S=({on:e})=>/* @__PURE__ */a("span",{className:C.tick,"aria-hidden":"true",children:e?"✓":""}),L=({of:e})=>null==e.icon?null:/* @__PURE__ */a("span",{className:C.icon,"aria-hidden":"true",children:e.icon}),T=({of:e})=>null==e.shortcut?null:/* @__PURE__ */a("span",{className:C.shortcut,"aria-hidden":"true",children:e.shortcut}),B=e=>null!=e.icon||null!=e.shortcut,M=(e,n,t)=>{if(!e.children?.length)return void v(null);const r=t.getBoundingClientRect(),l=f.current,i=l?parseFloat(getComputedStyle(l).minWidth):NaN,o=Number.isFinite(i)&&i>0?i:l?.getBoundingClientRect().width??0,a=r.right+o>window.innerWidth-8?r.left-o:r.right;v({i:n,x:Math.max(8,a),y:r.top})},D=g?d[g.i]:null,F=e=>({...C.surface,...e});return l(
2
- /* @__PURE__ */i(o,{children:[
3
- /* @__PURE__ */a("div",{ref:f,"data-es-menu":"",role:"menu","aria-label":d.find(e=>e.header)?.label,className:C.menu,style:F({left:w.x,top:w.y,maxHeight:h||void 0}),children:d.map((e,n)=>"—"===e.label?
4
- /* @__PURE__ */a("div",{role:"separator",className:C.divider},n):e.header?/* @__PURE__ */a("div",{className:C.header,children:e.label},n):e.children?.length?/* @__PURE__ */i("button",{type:"button",role:"menuitem","aria-haspopup":"menu","aria-expanded":g?.i===n,onMouseEnter:t=>M(e,n,t.currentTarget),onFocus:t=>M(e,n,t.currentTarget),onClick:t=>M(e,n,t.currentTarget),className:E(e),style:C.itemStyle,children:[
5
- /* @__PURE__ */a(L,{of:e}),
6
- /* @__PURE__ */a("span",{className:C.label,children:e.label}),
7
- /* @__PURE__ */a(T,{of:e}),
8
- /* @__PURE__ */a("span",{"aria-hidden":"true",className:C.chevron,children:"›"})]},n):/* @__PURE__ */a("button",{type:"button",role:"menuitem",onMouseEnter:()=>v(null),onClick:()=>{e.onClick(),m()},className:E(e),style:C.itemStyle,children:B(e)?/* @__PURE__ */i(o,{children:[
9
- /* @__PURE__ */a(L,{of:e}),
10
- /* @__PURE__ */a("span",{className:C.label,children:e.label}),
11
- /* @__PURE__ */a(T,{of:e})]}):e.label},n))}),D?.children?.length&&g?/* @__PURE__ */a("div",{ref:y,"data-es-menu":"",role:"menu","aria-label":D.label,className:C.menuSub??C.menu,style:F({left:g.x,top:g.y}),children:D.children.map((e,n)=>/* @__PURE__ */i("button",{type:"button",role:"menuitemradio","aria-checked":Boolean(e.checked),onClick:()=>{e.onClick(),m()},className:E(e),style:C.itemStyle,children:[
12
- /* @__PURE__ */a(S,{on:Boolean(e.checked)}),
13
- /* @__PURE__ */a(L,{of:e}),
14
- /* @__PURE__ */a("span",{className:C.labelSub??C.label,children:e.label}),
15
- /* @__PURE__ */a(T,{of:e})]},n))}):null]}),p??document.body)}var u=/\b(transform|translate|rotate|scale|perspective|filter|backdrop-filter|contain)\b/;function d(e){const n=n=>e.getPropertyValue(n).trim(),t=(e,t)=>{const r=n(e);return""!==r&&!t.includes(r)};return!!t("transform",["none"])||(!!(t("translate",["none"])||t("rotate",["none"])||t("scale",["none"]))||(!!t("perspective",["none"])||(!!t("filter",["none"])||(!(!t("backdrop-filter",["none"])&&!t("-webkit-backdrop-filter",["none"]))||(!!/\b(layout|paint|strict|content)\b/.test(n("contain"))||(!!t("container-type",["normal"])||(!!t("content-visibility",["visible"])||u.test(n("will-change")))))))))}function m(e){const n=e?.ownerDocument,t=n?.defaultView;if(!(e&&n&&t&&e.isConnected))return null;for(let r=e;r&&r!==n.body&&r!==n.documentElement;r=r.parentElement)if(d(t.getComputedStyle(r)))return null;return e}export{c as ES_MENU_SKIN,s as EaselContextMenu,m as menuPortalTarget};
1
+ export{ES_MENU_SKIN,EaselContextMenu}from"../chunk-KTVH2ZRL.js";var e=/\b(transform|translate|rotate|scale|perspective|filter|backdrop-filter|contain)\b/;function t(t){const n=e=>t.getPropertyValue(e).trim(),r=(e,t)=>{const r=n(e);return""!==r&&!t.includes(r)};return!!r("transform",["none"])||(!!(r("translate",["none"])||r("rotate",["none"])||r("scale",["none"]))||(!!r("perspective",["none"])||(!!r("filter",["none"])||(!(!r("backdrop-filter",["none"])&&!r("-webkit-backdrop-filter",["none"]))||(!!/\b(layout|paint|strict|content)\b/.test(n("contain"))||(!!r("container-type",["normal"])||(!!r("content-visibility",["visible"])||e.test(n("will-change")))))))))}function n(e){const n=e?.ownerDocument,r=n?.defaultView;if(!(e&&n&&r&&e.isConnected))return null;for(let o=e;o&&o!==n.body&&o!==n.documentElement;o=o.parentElement)if(t(r.getComputedStyle(o)))return null;return e}export{n as menuPortalTarget};
@@ -1 +1 @@
1
- import{DEFAULT_NODE_MENU_WORDS as e}from"../chunk-WK3AFPXY.js";export{canStep,fromItemSelector,parentStep,planDuplicate,planMove,planPaste,planRemove,planSetProps,planStep,toItemSelector,useNodeOps}from"../chunk-D2BCHTQR.js";import{TrashIcon as n,EyeIcon as t,EyeOffIcon as o,RenameIcon as p,PasteIcon as l,CopyIcon as c,MoveDownIcon as s,MoveUpIcon as a,DuplicateIcon as i,AddIcon as r,LayersIcon as u}from"../chunk-6EIVTKZZ.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";import{jsx as h}from"react/jsx-runtime";function d(){let e=null;const n=/* @__PURE__ */new Set;return{get:()=>e,set(t){e=t;for(const e of[...n])e()},subscribe:e=>(n.add(e),()=>n.delete(e))}}var m={layer:{icon:/* @__PURE__ */h(u,{})},addInside:{icon:/* @__PURE__ */h(r,{})},duplicate:{icon:/* @__PURE__ */h(i,{})},moveUp:{icon:/* @__PURE__ */h(a,{})},moveDown:{icon:/* @__PURE__ */h(s,{})},copy:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘C"},cut:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘X"},paste:{icon:/* @__PURE__ */h(l,{}),shortcut:"⌘V"},rename:{icon:/* @__PURE__ */h(p,{})},hide:{icon:/* @__PURE__ */h(o,{})},show:{icon:/* @__PURE__ */h(t,{})},upLevel:{},delete:{icon:/* @__PURE__ */h(n,{}),danger:!0}};function v(n){const{actions:t,rows:o={},extras:p={},words:l=e}=n,c=e=>({...m[e],label:l[e],...o[e]}),s=(e,n,t)=>{const o=c(e),p={label:t??o.label??e,onClick:n};return o.icon&&(p.icon=o.icon),o.shortcut&&(p.shortcut=o.shortcut),o.danger&&(p.danger=!0),p},a=()=>{const e=c("layer"),t={label:e.label??l.layer,onClick:()=>{},children:n.layer.items};return e.icon&&(t.icon=e.icon),t},i=[],r=[],u=[],h=[],d=!!n.layer&&n.layer.items.length>1;if(d&&"pick"===(n.layer.group??"pick")&&i.push(a()),t.addInside&&r.push(s("addInside",t.addInside)),t.duplicate&&r.push(s("duplicate",t.duplicate)),t.moveUp&&r.push(s("moveUp",t.moveUp)),t.moveDown&&r.push(s("moveDown",t.moveDown)),t.copy&&r.push(s("copy",t.copy)),t.cut&&r.push(s("cut",t.cut)),t.paste){const e=c("paste").label??l.paste;r.push(s("paste",t.paste.run,l.pasteNamed({paste:e,label:t.paste.label})))}t.rename&&u.push(s("rename",t.rename)),t.hide&&u.push(t.hide.hidden?s("show",t.hide.run):s("hide",t.hide.run)),d&&"change"===n.layer.group&&u.push(a()),t.upLevel&&u.push(s("upLevel",t.upLevel)),t.delete&&h.push(s("delete",t.delete)),i.push(...p.pick??[]),r.push(...p.make??[]),u.push(...p.change??[]),h.push(...p.remove??[]);const v=[i,r,n.style??[],u,h].filter(e=>e.length>0),g=i.length+r.length+u.length+h.length===0,k=[{label:n.title,header:!0,onClick:()=>{}}];return g&&n.pinnedLine&&k.push({label:n.pinnedLine,header:!0,onClick:()=>{}}),v.forEach((e,t)=>{(t>0||g&&n.pinnedLine)&&k.push({label:"—",onClick:()=>{}}),k.push(...e)}),k}export{d as createNodeClipboard,v as nodeMenuItems};
1
+ import{DEFAULT_NODE_MENU_WORDS as e}from"../chunk-WK3AFPXY.js";export{canStep,fromItemSelector,parentStep,planDuplicate,planMove,planPaste,planRemove,planSetProps,planStep,toItemSelector,useNodeOps}from"../chunk-D2BCHTQR.js";import{TrashIcon as n,EyeIcon as t,EyeOffIcon as o,RenameIcon as p,PasteIcon as l,CopyIcon as c,MoveDownIcon as s,MoveUpIcon as a,DuplicateIcon as i,AddIcon as r,LayersIcon as u}from"../chunk-L5KW4HG5.js";import"../chunk-KRXQM65X.js";import"../chunk-NKB3KVAB.js";import{jsx as h}from"react/jsx-runtime";function d(){let e=null;const n=/* @__PURE__ */new Set;return{get:()=>e,set(t){e=t;for(const e of[...n])e()},subscribe:e=>(n.add(e),()=>n.delete(e))}}var m={layer:{icon:/* @__PURE__ */h(u,{})},addInside:{icon:/* @__PURE__ */h(r,{})},duplicate:{icon:/* @__PURE__ */h(i,{})},moveUp:{icon:/* @__PURE__ */h(a,{})},moveDown:{icon:/* @__PURE__ */h(s,{})},copy:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘C"},cut:{icon:/* @__PURE__ */h(c,{}),shortcut:"⌘X"},paste:{icon:/* @__PURE__ */h(l,{}),shortcut:"⌘V"},rename:{icon:/* @__PURE__ */h(p,{})},hide:{icon:/* @__PURE__ */h(o,{})},show:{icon:/* @__PURE__ */h(t,{})},upLevel:{},delete:{icon:/* @__PURE__ */h(n,{}),danger:!0}};function v(n){const{actions:t,rows:o={},extras:p={},words:l=e}=n,c=e=>({...m[e],label:l[e],...o[e]}),s=(e,n,t)=>{const o=c(e),p={label:t??o.label??e,onClick:n};return o.icon&&(p.icon=o.icon),o.shortcut&&(p.shortcut=o.shortcut),o.danger&&(p.danger=!0),p},a=()=>{const e=c("layer"),t={label:e.label??l.layer,onClick:()=>{},children:n.layer.items};return e.icon&&(t.icon=e.icon),t},i=[],r=[],u=[],h=[],d=!!n.layer&&n.layer.items.length>1;if(d&&"pick"===(n.layer.group??"pick")&&i.push(a()),t.addInside&&r.push(s("addInside",t.addInside)),t.duplicate&&r.push(s("duplicate",t.duplicate)),t.moveUp&&r.push(s("moveUp",t.moveUp)),t.moveDown&&r.push(s("moveDown",t.moveDown)),t.copy&&r.push(s("copy",t.copy)),t.cut&&r.push(s("cut",t.cut)),t.paste){const e=c("paste").label??l.paste;r.push(s("paste",t.paste.run,l.pasteNamed({paste:e,label:t.paste.label})))}t.rename&&u.push(s("rename",t.rename)),t.hide&&u.push(t.hide.hidden?s("show",t.hide.run):s("hide",t.hide.run)),d&&"change"===n.layer.group&&u.push(a()),t.upLevel&&u.push(s("upLevel",t.upLevel)),t.delete&&h.push(s("delete",t.delete)),i.push(...p.pick??[]),r.push(...p.make??[]),u.push(...p.change??[]),h.push(...p.remove??[]);const v=[i,r,n.style??[],u,h].filter(e=>e.length>0),g=i.length+r.length+u.length+h.length===0,k=[{label:n.title,header:!0,onClick:()=>{}}];return g&&n.pinnedLine&&k.push({label:n.pinnedLine,header:!0,onClick:()=>{}}),v.forEach((e,t)=>{(t>0||g&&n.pinnedLine)&&k.push({label:"—",onClick:()=>{}}),k.push(...e)}),k}export{d as createNodeClipboard,v as nodeMenuItems};
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { W as WordFit } from '../wordFit-D4S36PvB.js';
4
- import { P as PanelWords } from '../words-CJjUKcV5.js';
4
+ import { P as PanelWords } from '../words-BGrHZAJJ.js';
5
5
  export { a as SETTINGS_BUCKETS, S as SettingsBucket } from '../buckets-CuLM47h9.js';
6
6
 
7
7
  /**
@@ -387,38 +387,42 @@ interface SettingsFieldProps {
387
387
  className?: string;
388
388
  }
389
389
  /**
390
- * `SettingsDefaultReset` — the end of a label line that says whether the value
391
- * follows its default (owner 2026-10-06: "Default", and a "Reset" button).
390
+ * `SettingsDefaultReset` — the end of a label line: a ↺ button while the value
391
+ * is changed, an empty 22px slot while it follows its default (owner
392
+ * 2026-10-06; option E, final 2026-10-07).
392
393
  */
393
394
  interface SettingsDefaultResetProps {
394
- /** The field's visible label. The Reset button is named after it. */
395
+ /** The field's visible label. The ↺ button is named after it ("Reset Gap"). */
395
396
  label: string;
396
397
  /** Is the value changed from its default? The host's to say. */
397
398
  changed: boolean;
398
399
  /** Clear the value back to its default. The part writes nothing itself. */
399
400
  onReset: () => void;
400
401
  /**
401
- * What the default IS, in the merchant's words — "Site block gap — 24px".
402
- * Shown as the tooltip: on Default as it is, on Reset as "Back to default: …".
403
- * Read it live; a baked value goes stale the moment the default changes.
402
+ * What the default IS, in the host's words — "24px from Site styles". The ↺
403
+ * says it: in its tooltip ("Reset Gap (back to 24px from Site styles)") and
404
+ * as its accessible description, while its NAME stays "Reset Gap" (GG
405
+ * 2026-10-07, E2). Read it live; a baked value goes stale. Nothing shows it
406
+ * while the setting is unchanged: the slot is empty then.
404
407
  */
405
408
  detail?: string;
406
- /** Read-only (a sent campaign): Reset is drawn, and cannot be pressed. */
409
+ /** Read-only (a sent campaign): ↺ is drawn, and cannot be pressed. */
407
410
  disabled?: boolean;
408
411
  /**
409
- * Rare: make "Default" a press of its own, for a row a merchant cannot step
410
- * out of by hand. The website's type sizes are the case (GG 2026-10-06, Q3):
411
- * their default can be a responsive `clamp()` no slider position stores, so
412
- * one press keeps the section's own built-in size. `title` says what the
413
- * press does; it is the tooltip and the accessible name, after "Default".
414
- * Left out, Default presses nothing — the usual case.
412
+ * Rare: something to press while the setting is UNCHANGED, for a row a
413
+ * merchant cannot leave by hand. The website's type sizes are the case (GG
414
+ * 2026-10-06, Q3): their default can be a responsive `clamp()` no slider
415
+ * position stores, so one press keeps the section's own built-in size.
416
+ * `icon` is drawn in the 22px slot; `title` is its name and its tooltip.
417
+ * Left out, an unchanged row draws nothing — the usual case.
415
418
  */
416
419
  defaultAction?: {
417
420
  onPress: () => void;
418
421
  title: string;
422
+ icon: ReactNode;
419
423
  };
420
424
  /** The host's words, from `useWords('panel', …)`. English when left out. */
421
- words?: Partial<Pick<PanelWords, 'followsDefault' | 'reset' | 'resetName' | 'backToDefault'>>;
425
+ words?: Partial<Pick<PanelWords, 'followsDefault' | 'reset' | 'resetName' | 'backToDefault' | 'resetTitle'>>;
422
426
  className?: string;
423
427
  }
424
428
  /**
@@ -939,29 +943,36 @@ declare function SettingsField({ label, labelId, icon, value, hint, changed, htm
939
943
  declare function SettingsSwitch({ checked, onChange, disabled, id, ariaLabel, ariaLabelledBy, className, }: SettingsSwitchProps): react.JSX.Element;
940
944
 
941
945
  /**
942
- * The end of a setting's label line: **Default** while the value follows its
943
- * default, a **Reset** button once it does not. ONE part, both editors.
944
- *
945
- * Owner, 2026-10-06. Before this the two editors said the same thing five ways:
946
- * the website's "Inherits · Site" chip and "Overridden ↺" pill, its blue reset
947
- * dot, and the email's "Default" mark, "Reset" link and "Reset to default"
948
- * text. He picked the word **Default** for the resting state and the **Reset
949
- * button** for the way back, in the same place on the row. It rides
950
- * `SettingsField`'s `action` slot; `SettingsField` leaves its name alone (only a
951
- * switch is named after the field).
952
- *
953
- * ONE ELEMENT, BOTH STATES. It is the same <button> whether it says Default or
954
- * Reset, and that is for the keyboard: a press turns Reset into Default, and if
955
- * Default were a <span> React would swap the node and focus would fall to the
956
- * page, so the next Tab would start from the top. Resting, the button is
957
- * `aria-disabled` and out of the tab order (`tabIndex={-1}`) — there is nothing
958
- * to do there — but it keeps focus when a press has just put it there.
959
- * `aria-disabled` and not `disabled`, because a `disabled` button drops focus
960
- * too. `disabled` is kept for read-only, where a real disabled button is right.
961
- *
962
- * `defaultAction` is the one exception to "Default presses nothing": a row a
963
- * merchant cannot leave by hand gets a press on the word itself, named after
964
- * what it does (the website's type sizes, whose default can be a `clamp()`).
946
+ * The end of a setting's label line: a ↺ button once the setting is changed,
947
+ * NOTHING while it is not. ONE part, both editors.
948
+ *
949
+ * Owner, 2026-10-06: the two editors said "follows its default / put it back"
950
+ * five ways (the website's "Inherits · Site" chip and blue reset dot, the
951
+ * email's "Default" mark, "Reset" link and "Reset to default" text), and it
952
+ * became one part. Option E, final 2026-10-07 (mockup
953
+ * https://claude.ai/artifact/KATfHhLK7wogfTD84Manox), gave it its look:
954
+ *
955
+ * changed the set's `revert` icon (↺, "Revert to inherited") in a 22px
956
+ * button, accent; its name "Reset <setting>", its tooltip that
957
+ * plus what it goes back to when the host says ("(back to 24px
958
+ * from Site styles)", also its description);
959
+ * unchanged nothing at all: the row's grey value already says it is the
960
+ * default. The 22px slot stays, empty and out of the tab order,
961
+ * so every row's end lines up.
962
+ *
963
+ * It rides `SettingsField`'s `action` slot; `SettingsField` leaves its name
964
+ * alone (only a switch is named after the field).
965
+ *
966
+ * FOCUS AFTER A PRESS. Reset turns the button into the empty slot, which cannot
967
+ * hold focus, so a keyboard user would fall back to the top of the page. The
968
+ * press hands focus to the row's own control (its slider, box or swatch) first.
969
+ * That is read off the event's own element, never a global, so the module stays
970
+ * a leaf.
971
+ *
972
+ * `defaultAction` is the one row with something to press while unchanged: the
973
+ * website's type sizes, whose default can be a responsive `clamp()` no slider
974
+ * stores, keep ONE press to the section's own built-in size (a feature is
975
+ * never cut to fit a look). It draws the host's icon in the same 22px slot.
965
976
  *
966
977
  * CONTROLLED and hook-free like the rest of the panel: `changed` is the host's,
967
978
  * and a press only asks the host to clear. The words are handed in (`words`),
@@ -1,18 +1,18 @@
1
- export{SETTINGS_BUCKETS,SettingsField,SettingsGroup,SettingsTabs}from"../chunk-DICUMYMG.js";import{DEFAULT_PANEL_WORDS as e}from"../chunk-TRVZ7C23.js";export{SettingsSegmented,SettingsSwitch}from"../chunk-P6O363EE.js";import"../chunk-BZ5ASXOL.js";import{jsx as a,jsxs as l}from"react/jsx-runtime";function s({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 i({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 n({label:l,changed:s,onReset:i,detail:n,disabled:t,defaultAction:r,words:c,className:o}){const d={...e,...c},u=["es-default-reset"];if(s&&u.push("is-changed"),o&&u.push(o),!s&&r){u.push("is-pressable");const e=`${d.followsDefault}. ${r.title}`;/* @__PURE__ */
4
- return a("button",{type:"button",className:u.join(" "),"aria-label":e,title:n?`${n}. ${r.title}`:r.title,disabled:t,onClick:r.onPress,children:d.followsDefault})}/* @__PURE__ */
5
- return a("button",s?{type:"button",className:u.join(" "),"aria-label":d.resetName({label:l}),title:n?d.backToDefault({detail:n}):void 0,disabled:t,onClick:i,children:d.reset}:{type:"button",className:u.join(" "),"aria-disabled":"true",tabIndex:-1,title:n||void 0,children:d.followsDefault})}function t({name:e,preview:s,offPage:i,status:n,onOpen:t,id:r,className:c}){const o=null!=s;/* @__PURE__ */
6
- return l("button",{type:"button",id:r,className:c?`es-drill ${c}`:"es-drill",onClick:t,children:[
7
- /* @__PURE__ */l("span",{className:"es-drill-text",children:[
8
- /* @__PURE__ */a("span",{className:"es-drill-name",children:e}),o?/* @__PURE__ */a("span",{className:i?"es-drill-preview is-offpage":"es-drill-preview",children:s}):null]}),n?/* @__PURE__ */a("span",{className:"es-drill-status",children:n}):null,
9
- /* @__PURE__ */a("span",{className:"es-drill-chev","aria-hidden":"true"})]})}function r({label:e,value:l,points:s,onChange:i,id:n,className:t}){/* @__PURE__ */
10
- return a("div",{id:n,className:"es-placement"+(t?` ${t}`:""),role:"radiogroup","aria-label":e,children:s.map(e=>{const s=l===e.value,n=!0===e.disabled;/* @__PURE__ */
11
- return a("button",{type:"button",role:"radio","aria-checked":s,"aria-label":e.label,"aria-disabled":n||void 0,disabled:n,title:e.title??e.label,className:`es-placement-cell${s?" is-active":""}${n?" is-off":""}`,onClick:()=>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)})})}function c({label:e,value:s,corners:i,onChange:n,id:t,className:r}){/* @__PURE__ */
12
- return l("div",{id:t,className:"es-corners"+(r?` ${r}`:""),role:"group","aria-label":e,children:[
13
- /* @__PURE__ */a("span",{className:"es-corners-frame","aria-hidden":"true"}),i.map(e=>{const l=s.includes(e.value),i=!0===e.disabled;/* @__PURE__ */
14
- return a("button",{type:"button","aria-pressed":l,"aria-label":e.label,"aria-disabled":i||void 0,disabled:i,title:e.title??e.label,className:`es-corners-cell es-corners-${e.value}${l?" is-on":""}${i?" is-off":""}`,onClick:()=>n(l?s.filter(a=>a!==e.value):[...s,e.value]),children:/* @__PURE__ */a("span",{className:"es-corners-mark","aria-hidden":"true"})},e.value)})]})}function o({label:e,onPress:s,disabled:i,note:n,done:t,doneLabel:r,icon:c,id:o,className:d}){const u=void 0===r?e:r,p=t?u:e,m=null!=n,b=m&&o?`${o}-note`:void 0;/* @__PURE__ */
15
- return l("div",{className:d?`es-action-wrap ${d}`:"es-action-wrap",children:[
16
- /* @__PURE__ */l("button",{type:"button",id:o,className:t?"es-action is-done":"es-action",disabled:i,"aria-describedby":b,onClick:s,children:[c?/* @__PURE__ */a("span",{className:"es-action-icon","aria-hidden":"true",children:c}):null,
17
- /* @__PURE__ */a("span",{className:"es-action-label",children:p})]}),m?/* @__PURE__ */a("p",{id:b,className:"es-action-note",children:n}):null,
18
- /* @__PURE__ */a("span",{className:"es-action-live",role:"status","aria-live":"polite",children:t?u:null})]})}export{o as SettingsAction,c as SettingsCorners,n as SettingsDefaultReset,t as SettingsDrill,s as SettingsGroupHead,i as SettingsGroupSub,r as SettingsPlacement};
1
+ export{SETTINGS_BUCKETS,SettingsField,SettingsGroup,SettingsTabs}from"../chunk-ZNS7727Y.js";import{DEFAULT_PANEL_WORDS as e}from"../chunk-QTLAVDJE.js";export{SettingsSegmented,SettingsSwitch}from"../chunk-P6O363EE.js";import"../chunk-BZ5ASXOL.js";import{RevertIcon as a}from"../chunk-L5KW4HG5.js";import{jsx as l,jsxs as s}from"react/jsx-runtime";function n({title:e,level:a=3,id:s,className:n}){/* @__PURE__ */
2
+ return l(`h${a}`,{id:s,className:n?`es-group-head ${n}`:"es-group-head",children:e})}function i({title:e,level:a=4,id:s,className:n}){/* @__PURE__ */
3
+ return l(`h${a}`,{id:s,className:n?`es-group-sub ${n}`:"es-group-sub",children:e})}function t({label:s,changed:n,onReset:i,detail:t,disabled:d,defaultAction:u,words:p,className:m}){const b={...e,...p},h=["es-default-reset"];if(n&&h.push("is-changed"),m&&h.push(m),!n&&u)return h.push("is-pressable"),/* @__PURE__ */l("button",{type:"button",className:h.join(" "),"aria-label":u.title,title:u.title,disabled:d,onClick:u.onPress,children:u.icon});if(!n)/* @__PURE__ */
4
+ return l("span",{className:h.join(" "),"aria-hidden":"true"});const N=b.resetName({label:s});/* @__PURE__ */
5
+ return l("button",{type:"button",className:h.join(" "),"aria-label":N,"aria-description":t||void 0,title:t?b.resetTitle({label:s,detail:t}):N,disabled:d,onClick:e=>{i(),function(e){const a=e.currentTarget,l=a.closest(".es-field");let s=l?.querySelector(o(".es-field-ctl"))??l?.querySelector(o(".es-field-head"))??null,n=l?null:a.parentElement;for(let e=0;!s&&n&&e<c;e+=1,n=n.parentElement)s=[...n.querySelectorAll(r)].find(e=>e!==a)??null;s?.focus()}(e)},children:/* @__PURE__ */l(a,{size:15})})}var r=['input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","button:not([disabled]):not(.es-default-reset)",'[tabindex]:not([tabindex="-1"])'].join(", "),o=e=>r.split(", ").map(a=>`${e} ${a}`).join(", "),c=4;function d({name:e,preview:a,offPage:n,status:i,onOpen:t,id:r,className:o}){const c=null!=a;/* @__PURE__ */
6
+ return s("button",{type:"button",id:r,className:o?`es-drill ${o}`:"es-drill",onClick:t,children:[
7
+ /* @__PURE__ */s("span",{className:"es-drill-text",children:[
8
+ /* @__PURE__ */l("span",{className:"es-drill-name",children:e}),c?/* @__PURE__ */l("span",{className:n?"es-drill-preview is-offpage":"es-drill-preview",children:a}):null]}),i?/* @__PURE__ */l("span",{className:"es-drill-status",children:i}):null,
9
+ /* @__PURE__ */l("span",{className:"es-drill-chev","aria-hidden":"true"})]})}function u({label:e,value:a,points:s,onChange:n,id:i,className:t}){/* @__PURE__ */
10
+ return l("div",{id:i,className:"es-placement"+(t?` ${t}`:""),role:"radiogroup","aria-label":e,children:s.map(e=>{const s=a===e.value,i=!0===e.disabled;/* @__PURE__ */
11
+ return l("button",{type:"button",role:"radio","aria-checked":s,"aria-label":e.label,"aria-disabled":i||void 0,disabled:i,title:e.title??e.label,className:`es-placement-cell${s?" is-active":""}${i?" is-off":""}`,onClick:()=>n(e.value),children:e.icon?/* @__PURE__ */l("span",{className:"es-placement-icon","aria-hidden":"true",children:e.icon}):/* @__PURE__ */l("span",{className:"es-placement-dot"})},e.value)})})}function p({label:e,value:a,corners:n,onChange:i,id:t,className:r}){/* @__PURE__ */
12
+ return s("div",{id:t,className:"es-corners"+(r?` ${r}`:""),role:"group","aria-label":e,children:[
13
+ /* @__PURE__ */l("span",{className:"es-corners-frame","aria-hidden":"true"}),n.map(e=>{const s=a.includes(e.value),n=!0===e.disabled;/* @__PURE__ */
14
+ return l("button",{type:"button","aria-pressed":s,"aria-label":e.label,"aria-disabled":n||void 0,disabled:n,title:e.title??e.label,className:`es-corners-cell es-corners-${e.value}${s?" is-on":""}${n?" is-off":""}`,onClick:()=>i(s?a.filter(a=>a!==e.value):[...a,e.value]),children:/* @__PURE__ */l("span",{className:"es-corners-mark","aria-hidden":"true"})},e.value)})]})}function m({label:e,onPress:a,disabled:n,note:i,done:t,doneLabel:r,icon:o,id:c,className:d}){const u=void 0===r?e:r,p=t?u:e,m=null!=i,b=m&&c?`${c}-note`:void 0;/* @__PURE__ */
15
+ return s("div",{className:d?`es-action-wrap ${d}`:"es-action-wrap",children:[
16
+ /* @__PURE__ */s("button",{type:"button",id:c,className:t?"es-action is-done":"es-action",disabled:n,"aria-describedby":b,onClick:a,children:[o?/* @__PURE__ */l("span",{className:"es-action-icon","aria-hidden":"true",children:o}):null,
17
+ /* @__PURE__ */l("span",{className:"es-action-label",children:p})]}),m?/* @__PURE__ */l("p",{id:b,className:"es-action-note",children:i}):null,
18
+ /* @__PURE__ */l("span",{className:"es-action-live",role:"status","aria-live":"polite",children:t?u:null})]})}export{m as SettingsAction,p as SettingsCorners,t as SettingsDefaultReset,d as SettingsDrill,n as SettingsGroupHead,i as SettingsGroupSub,u as SettingsPlacement};