@shwfed/config 2.9.10 → 2.9.11

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 (80) hide show
  1. package/dist/mcp.mjs +2 -2
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{FieldGroup.vue_vue_type_script_setup_true_lang-B_lv0Qb4.js → FieldGroup.vue_vue_type_script_setup_true_lang-CN4xD2hQ.js} +1 -1
  4. package/dist/preview/assets/{badge-DkCzSREV.js → badge-CzfW1Ked.js} +1 -1
  5. package/dist/preview/assets/config-BdX3zl4t.js +1 -0
  6. package/dist/preview/assets/{config-y0whCdxg.js → config-Bzwfqv6w.js} +1 -1
  7. package/dist/preview/assets/{config-CfTdhIiz.js → config-C2y2XI2Q.js} +1 -1
  8. package/dist/preview/assets/{config-CLszlI7X.js → config-CCXJvpik.js} +1 -1
  9. package/dist/preview/assets/{config-BQZZzdBi.js → config-CDYZN7EX.js} +1 -1
  10. package/dist/preview/assets/{config-BzUZdTRZ.js → config-CPuERNUd.js} +1 -1
  11. package/dist/preview/assets/{config-CJYUWHSt.js → config-D37gWDMV.js} +1 -1
  12. package/dist/preview/assets/{config-DG9kUyIX.js → config-DbNukLyq.js} +1 -1
  13. package/dist/preview/assets/{config-IAY_3DyY.js → config-Op5IHwI_.js} +1 -1
  14. package/dist/preview/assets/{config-DnxWfe-p.js → config-e5aOGFb2.js} +1 -1
  15. package/dist/preview/assets/{config-BO6oZNCA.js → config-jJQ2fulH.js} +1 -1
  16. package/dist/preview/assets/{config-DcOjw4Ib.js → config-jzfHh7bp.js} +1 -1
  17. package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js → definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js} +1 -1
  18. package/dist/preview/assets/index-0vF7XQ-J.js +1 -0
  19. package/dist/preview/assets/{index-BxEz7F0S.js → index-CAIvIAWJ.js} +1 -1
  20. package/dist/preview/assets/{index-CEpio2Ai.js → index-Cyjm-GKs.js} +138 -138
  21. package/dist/preview/assets/{index-DEk1Sey_.css → index-D0eGXK5P.css} +1 -1
  22. package/dist/preview/assets/{item-BgY4KzDy.js → item-CUoRMMz1.js} +1 -1
  23. package/dist/preview/assets/{runtime-C9L73GlB.js → runtime-BALr-Cq0.js} +1 -1
  24. package/dist/preview/assets/{runtime-ObPbN32X.js → runtime-BvcTYin8.js} +1 -1
  25. package/dist/preview/assets/{runtime-DNCNcjrA.js → runtime-CHQwYQ80.js} +1 -1
  26. package/dist/preview/assets/{runtime-DIHeE12q.js → runtime-CU5fYNMI.js} +1 -1
  27. package/dist/preview/assets/{runtime-B1vIYtF_.js → runtime-CWt21RRo.js} +1 -1
  28. package/dist/preview/assets/{runtime-B0yAZrhv.js → runtime-C_epees8.js} +1 -1
  29. package/dist/preview/assets/{runtime-BweDVL2G.js → runtime-D3TnRYXn.js} +1 -1
  30. package/dist/preview/assets/{runtime-74HxxB_6.js → runtime-DWKqftSK.js} +1 -1
  31. package/dist/preview/assets/{runtime-BrfrrA2a.js → runtime-V_usL1Fa.js} +1 -1
  32. package/dist/preview/assets/runtime-wAz72cCJ.js +1 -0
  33. package/dist/preview/assets/{schema-meta-dmADcmVf.js → schema-meta-DwWuSVqk.js} +1 -1
  34. package/dist/preview/index.html +2 -2
  35. package/dist/runtime/components/actions/buttons/2026-05-11/com.shwfed.actions.button.modal.layout/config.vue +6 -1
  36. package/dist/runtime/components/actions/config.d.vue.ts +1 -0
  37. package/dist/runtime/components/actions/config.vue +6 -2
  38. package/dist/runtime/components/actions/config.vue.d.ts +1 -0
  39. package/dist/runtime/components/block-layout-editor/index.vue +15 -2
  40. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.tabs/config.vue +5 -2
  41. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/config.vue +4 -1
  42. package/dist/runtime/components/config/config.d.vue.ts +1 -1
  43. package/dist/runtime/components/config/config.vue +2 -33
  44. package/dist/runtime/components/config/config.vue.d.ts +1 -1
  45. package/dist/runtime/components/config/use-editor.d.ts +19 -0
  46. package/dist/runtime/components/config/use-editor.js +36 -0
  47. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/schema.d.ts +1 -0
  48. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/schema.js +1 -1
  49. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/config.d.vue.ts +2 -0
  50. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/config.vue +3 -2
  51. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/config.vue.d.ts +2 -0
  52. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/runtime.vue +1 -1
  53. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/schema.d.ts +3 -0
  54. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.actions/schema.js +1 -1
  55. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.number/config.d.vue.ts +6 -6
  56. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.number/config.vue.d.ts +6 -6
  57. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.numberrange/config.d.vue.ts +6 -6
  58. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.numberrange/config.vue.d.ts +6 -6
  59. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.actions/config.vue +1 -0
  60. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +2 -2
  61. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +2 -2
  62. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.d.vue.ts +2 -2
  63. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.vue.d.ts +2 -2
  64. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +2 -2
  65. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +2 -2
  66. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.d.vue.ts +2 -2
  67. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.vue.d.ts +2 -2
  68. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.d.vue.ts +2 -2
  69. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.vue.d.ts +2 -2
  70. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.d.vue.ts +2 -2
  71. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.vue.d.ts +2 -2
  72. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.d.vue.ts +2 -2
  73. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.vue.d.ts +2 -2
  74. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.d.vue.ts +2 -2
  75. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.vue.d.ts +2 -2
  76. package/dist/runtime/components/table/config.vue +1 -1
  77. package/package.json +1 -1
  78. package/dist/preview/assets/config-9Ny1em1E.js +0 -1
  79. package/dist/preview/assets/index-eXjRNljQ.js +0 -1
  80. package/dist/preview/assets/runtime--G6ZYJWm.js +0 -1
@@ -1 +1 @@
1
- import{d as O,v as M,x as k,y,o as q,c as E,z,b as A,A as x,B as i,C as J,D as L,E as s,F as T,G as V,H as D,I as G,J as H,K,L as g,M as P,N as b,O as U}from"./index-CEpio2Ai.js";import W from"./index-BxEz7F0S.js";const X=O({name:"ShwfedBlockAnimatedNumberItem",__name:"item",props:{item:{}},setup(h){const n=h,j=P(),a=x(void 0),m=x(0);function u(){return K(j)}function S(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()!==""){const t=Number(e);return Number.isFinite(t)?t:0}return 0}const d=i(()=>a.value===void 0?g():U(a.value));function v(e){if(!e)return"";try{const t=b(s(e,{...u(),json:d.value}));return t==null?"":String(t)}catch{return""}}const w=i(()=>v(n.item.prefix)),C=i(()=>v(n.item.suffix));function F(e){if(e)try{const t=b(s(e,{...u(),json:d.value}));return t==null?void 0:typeof t=="string"||typeof t=="object"?t:String(t)}catch{return}}const I=i(()=>F(n.item.style));async function r(){const e=n.item.dataSource,t=u(),_=J(function*(){let o=g();e.request&&(o=yield*L(yield*s(e.request,t)));const B=yield*s(e.value,{...t,json:o});return{json:T(o),value:B}});try{const o=await V(D(_,G));a.value=o.json,m.value=S(o.value)}catch(o){console.warn("[shwfed-animated-number] fetch failed",o)}}const l=i(()=>(n.item.pollingInterval??0)>0),N=i(()=>Math.max(1,n.item.pollingInterval??1)*1e3),c=H(),{pause:p,resume:f}=M(()=>{r()},N,{immediate:!1});return k(()=>{r(),l.value&&c.value&&f()}),y(c,e=>{l.value&&(e?(r(),f()):p())}),y(()=>[n.item.dataSource.request??"",n.item.dataSource.value,n.item.pollingInterval??0].join("|"),()=>{r(),l.value&&c.value?f():p()}),(e,t)=>(q(),E(A(W),{value:m.value,prefix:w.value,suffix:C.value,style:z(I.value)},null,8,["value","prefix","suffix","style"]))}});export{X as default};
1
+ import{d as O,v as M,x as k,y,o as q,c as E,z,b as A,A as x,B as i,C as J,D as L,E as s,F as T,G as V,H as D,I as G,J as H,K,L as g,M as P,N as b,O as U}from"./index-Cyjm-GKs.js";import W from"./index-CAIvIAWJ.js";const X=O({name:"ShwfedBlockAnimatedNumberItem",__name:"item",props:{item:{}},setup(h){const n=h,j=P(),a=x(void 0),m=x(0);function u(){return K(j)}function S(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()!==""){const t=Number(e);return Number.isFinite(t)?t:0}return 0}const d=i(()=>a.value===void 0?g():U(a.value));function v(e){if(!e)return"";try{const t=b(s(e,{...u(),json:d.value}));return t==null?"":String(t)}catch{return""}}const w=i(()=>v(n.item.prefix)),C=i(()=>v(n.item.suffix));function F(e){if(e)try{const t=b(s(e,{...u(),json:d.value}));return t==null?void 0:typeof t=="string"||typeof t=="object"?t:String(t)}catch{return}}const I=i(()=>F(n.item.style));async function r(){const e=n.item.dataSource,t=u(),_=J(function*(){let o=g();e.request&&(o=yield*L(yield*s(e.request,t)));const B=yield*s(e.value,{...t,json:o});return{json:T(o),value:B}});try{const o=await V(D(_,G));a.value=o.json,m.value=S(o.value)}catch(o){console.warn("[shwfed-animated-number] fetch failed",o)}}const l=i(()=>(n.item.pollingInterval??0)>0),N=i(()=>Math.max(1,n.item.pollingInterval??1)*1e3),c=H(),{pause:p,resume:f}=M(()=>{r()},N,{immediate:!1});return k(()=>{r(),l.value&&c.value&&f()}),y(c,e=>{l.value&&(e?(r(),f()):p())}),y(()=>[n.item.dataSource.request??"",n.item.dataSource.value,n.item.pollingInterval??0].join("|"),()=>{r(),l.value&&c.value?f():p()}),(e,t)=>(q(),E(A(W),{value:m.value,prefix:w.value,suffix:C.value,style:z(I.value)},null,8,["value","prefix","suffix","style"]))}});export{X as default};
@@ -1 +1 @@
1
- import{d as b,aQ as E,C as _,aX as r,aL as m,b0 as L,b1 as S,c as j,b as v,E as x,K as B,aP as C,M as k,o as R}from"./index-CEpio2Ai.js";import{_ as T}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";const q=b({name:"ShwfedHttpDownloadActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(d){const c=d,g=k(),t=(e,n)=>x(e,{...B(g),...n}),l=C(),p=new Set(["success","error","warning","info"]);function f(e){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=e.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(n)}const y=E(()=>_(function*(){const{template:e,messageExpression:n,resultExpression:o}=c.config,u=yield*t(e.request);if(!e.download){const s=yield*u.file();return yield*r(()=>f(s)),yield*m(l,c.config.onSuccess,t)}const a={json:yield*u.json()},i=o===void 0?"success":yield*L(t(o,a),s=>p.has(s)?s:"success");if(n!==void 0){const s=yield*t(n,a);yield*r(()=>S[i](s))}if(i==="success"||i==="info"){const h=yield*(yield*t(e.download,a)).file();yield*r(()=>f(h))}const w={success:c.config.onSuccess,warning:c.config.onWarning,error:c.config.onError,info:c.config.onInfo};return yield*m(l,w[i],t)}));return(e,n)=>(R(),j(T,{"action-id":d.buttonId,effect:v(y)},null,8,["action-id","effect"]))}});export{q as default};
1
+ import{d as b,aR as E,C as _,aY as r,aM as m,b1 as S,b2 as j,c as v,b as x,E as B,K as C,aQ as L,M as R,o as k}from"./index-Cyjm-GKs.js";import{_ as T}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";const q=b({name:"ShwfedHttpDownloadActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(d){const c=d,g=R(),t=(e,n)=>B(e,{...C(g),...n}),l=L(),p=new Set(["success","error","warning","info"]);function f(e){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=e.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(n)}const y=E(()=>_(function*(){const{template:e,messageExpression:n,resultExpression:o}=c.config,u=yield*t(e.request);if(!e.download){const s=yield*u.file();return yield*r(()=>f(s)),yield*m(l,c.config.onSuccess,t)}const a={json:yield*u.json()},i=o===void 0?"success":yield*S(t(o,a),s=>p.has(s)?s:"success");if(n!==void 0){const s=yield*t(n,a);yield*r(()=>j[i](s))}if(i==="success"||i==="info"){const h=yield*(yield*t(e.download,a)).file();yield*r(()=>f(h))}const w={success:c.config.onSuccess,warning:c.config.onWarning,error:c.config.onError,info:c.config.onInfo};return yield*m(l,w[i],t)}));return(e,n)=>(k(),v(T,{"action-id":d.buttonId,effect:x(y)},null,8,["action-id","effect"]))}});export{q as default};
@@ -1 +1 @@
1
- import{d as r,aQ as f,aR as u,aL as g,aO as p,c as d,b as m,E as l,K as x,aP as E,M as h,o as _}from"./index-CEpio2Ai.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";const B=r({name:"ShwfedHttpRequestActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(n){const e=n,i=h(),s=(t,c)=>l(t,{...x(i),...c}),o=E(),a=f(()=>u(g(o,e.config.before,s),()=>p(e.config.expression,s,{messageExpression:e.config.messageExpression,resultExpression:e.config.resultExpression,channel:o,triggers:{success:e.config.onSuccess,warning:e.config.onWarning,error:e.config.onError,info:e.config.onInfo}})));return(t,c)=>(_(),d(b,{"action-id":n.buttonId,effect:m(a)},null,8,["action-id","effect"]))}});export{B as default};
1
+ import{d as r,aR as f,aS as u,aM as g,aP as p,c as d,b as m,E as l,K as x,aQ as E,M as h,o as _}from"./index-Cyjm-GKs.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";const B=r({name:"ShwfedHttpRequestActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(n){const e=n,i=h(),s=(t,c)=>l(t,{...x(i),...c}),o=E(),a=f(()=>u(g(o,e.config.before,s),()=>p(e.config.expression,s,{messageExpression:e.config.messageExpression,resultExpression:e.config.resultExpression,channel:o,triggers:{success:e.config.onSuccess,warning:e.config.onWarning,error:e.config.onError,info:e.config.onInfo}})));return(t,c)=>(_(),d(b,{"action-id":n.buttonId,effect:m(a)},null,8,["action-id","effect"]))}});export{B as default};
@@ -1 +1 @@
1
- import{d as f,Y as u,aQ as p,aR as d,aL as l,b4 as m,a1 as g,c as x,b as h,E,K as _,aP as b,o as B,M as k}from"./index-CEpio2Ai.js";import{_ as C}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";const I=f({name:"ShwfedHttpRequestBatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(n){const e=n,{locale:a}=u(),c=k(),s=(t,o)=>E(t,{..._(c),...o}),i=b(),r=p(()=>d(l(i,e.config.before,s),()=>m(e.config.expression,s,{messageExpression:e.config.messageExpression,resultExpression:e.config.resultExpression,continueOnError:e.config.continueOnError,markdown:g(e.config.markdown,a.value)??""})));return(t,o)=>(B(),x(C,{"action-id":n.buttonId,effect:h(r)},null,8,["action-id","effect"]))}});export{I as default};
1
+ import{d as f,Y as u,aR as p,aS as d,aM as l,b5 as m,a1 as g,c as x,b as h,E,K as _,aQ as b,o as B,M as k}from"./index-Cyjm-GKs.js";import{_ as C}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";const I=f({name:"ShwfedHttpRequestBatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(n){const e=n,{locale:a}=u(),c=k(),s=(t,o)=>E(t,{..._(c),...o}),i=b(),r=p(()=>d(l(i,e.config.before,s),()=>m(e.config.expression,s,{messageExpression:e.config.messageExpression,resultExpression:e.config.resultExpression,continueOnError:e.config.continueOnError,markdown:g(e.config.markdown,a.value)??""})));return(t,o)=>(B(),x(C,{"action-id":n.buttonId,effect:h(r)},null,8,["action-id","effect"]))}});export{I as default};
@@ -1 +1 @@
1
- import{d as u,Y as i,c as l,b as p,B as m,o as d,h as f,a1 as _,aM as k,E as w,K as x,M as g}from"./index-CEpio2Ai.js";const B=u({name:"ShwfedMarkdownItemRuntime",__name:"runtime",props:{config:{}},setup(s){const o=s,{locale:t}=i(),a=g(),c=(e,n)=>w(e,{...x(a),...n}),r=m(()=>{const e=_(o.config.content,t.value)??"";return k(e,c)});return(e,n)=>(d(),l(p(f),{"data-slot":"buttons-markdown",source:r.value,class:"prose prose-sm prose-zinc px-1"},null,8,["source"]))}});export{B as default};
1
+ import{d as u,Y as i,c as l,b as p,B as m,o as d,h as f,a1 as _,aN as k,E as w,K as x,M as g}from"./index-Cyjm-GKs.js";const B=u({name:"ShwfedMarkdownItemRuntime",__name:"runtime",props:{config:{}},setup(s){const o=s,{locale:t}=i(),a=g(),c=(e,n)=>w(e,{...x(a),...n}),r=m(()=>{const e=_(o.config.content,t.value)??"";return k(e,c)});return(e,n)=>(d(),l(p(f),{"data-slot":"buttons-markdown",source:r.value,class:"prose prose-sm prose-zinc px-1"},null,8,["source"]))}});export{B as default};
@@ -1 +1 @@
1
- import{d as r,aQ as f,aL as d,c as u,b as m,aP as p,o as l,E as g,K as h,M as _}from"./index-CEpio2Ai.js";import{_ as C}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";const x=r({name:"ShwfedEventDispatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const c=e,s=_(),a=(n,t)=>g(n,{...h(s),...t}),o=p(),i=f(()=>d(o,c.config.triggers,a));return(n,t)=>(l(),u(C,{"action-id":e.buttonId,effect:m(i)},null,8,["action-id","effect"]))}});export{x as default};
1
+ import{d as r,aR as f,aM as d,c as u,b as m,aQ as p,o as l,E as g,K as h,M as _}from"./index-Cyjm-GKs.js";import{_ as C}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";const x=r({name:"ShwfedEventDispatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const c=e,s=_(),a=(n,t)=>g(n,{...h(s),...t}),o=p(),i=f(()=>d(o,c.config.triggers,a));return(n,t)=>(l(),u(C,{"action-id":e.buttonId,effect:m(i)},null,8,["action-id","effect"]))}});export{x as default};
@@ -1 +1 @@
1
- import{_ as o}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";import{d as n,c,b as a,o as f,aS as i}from"./index-CEpio2Ai.js";const _=n({name:"ShwfedPrototypeActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=i;return(r,s)=>(f(),c(o,{"action-id":t.buttonId,effect:a(e)},null,8,["action-id","effect"]))}});export{_ as default};
1
+ import{_ as o}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";import{d as n,c,b as a,o as f,aT as i}from"./index-Cyjm-GKs.js";const _=n({name:"ShwfedPrototypeActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=i;return(r,s)=>(f(),c(o,{"action-id":t.buttonId,effect:a(e)},null,8,["action-id","effect"]))}});export{_ as default};
@@ -1 +1 @@
1
- import{d as f,Y as g,C as l,aL as u,a1 as d,aM as p,aN as m,aO as x,c as E,b as _,E as h,K as C,aP as w,M as b,o as k}from"./index-CEpio2Ai.js";import{_ as I}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";const L=f({name:"ShwfedHttpRequestConfirmActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(c){const n=c,{locale:i}=g(),a=b(),s=(e,o)=>h(e,{...C(a),...o}),t=w(),r=l(function*(){yield*u(t,n.config.before,s);const e=d(n.config.markdown,i.value)??"",o=p(e,s);(yield*m({content:o,icon:n.config.icon,color:n.config.color}))||(yield*x(n.config.expression,s,{messageExpression:n.config.messageExpression,resultExpression:n.config.resultExpression,channel:t,triggers:{success:n.config.onSuccess,warning:n.config.onWarning,error:n.config.onError,info:n.config.onInfo}}))});return(e,o)=>(k(),E(I,{"action-id":c.buttonId,effect:_(r)},null,8,["action-id","effect"]))}});export{L as default};
1
+ import{d as f,Y as g,C as l,aM as u,a1 as d,aN as p,aO as m,aP as x,c as E,b as _,E as h,K as C,aQ as w,M as b,o as k}from"./index-Cyjm-GKs.js";import{_ as I}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";const M=f({name:"ShwfedHttpRequestConfirmActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(c){const n=c,{locale:i}=g(),a=b(),s=(e,o)=>h(e,{...C(a),...o}),t=w(),r=l(function*(){yield*u(t,n.config.before,s);const e=d(n.config.markdown,i.value)??"",o=p(e,s);(yield*m({content:o,icon:n.config.icon,color:n.config.color}))||(yield*x(n.config.expression,s,{messageExpression:n.config.messageExpression,resultExpression:n.config.resultExpression,channel:t,triggers:{success:n.config.onSuccess,warning:n.config.onWarning,error:n.config.onError,info:n.config.onInfo}}))});return(e,o)=>(k(),E(I,{"action-id":c.buttonId,effect:_(r)},null,8,["action-id","effect"]))}});export{M as default};
@@ -1 +1 @@
1
- import{d as l,b2 as g,aQ as A,aT as y,aL as b,c as _,b as h,E as S,K as j,aP as k,b3 as C,M as B,o as E}from"./index-CEpio2Ai.js";import{_ as O}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";const I=l({name:"ShwfedStateWriteActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(s){const a=s,f=B(),c=(e,t)=>S(e,{...j(f),...t}),n=g(),o=n.kind==="form"&&n.parent?n.parent:n,u=k(),m=C((e,t,r)=>{if(Array.isArray(e[t])&&Array.isArray(r))return e[t]=r,!0});function i(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function p(e,t){return i(e)&&i(t)?m({...t},e):t}const d=A(()=>y(c(a.config.expression),e=>{for(const t of Object.keys(e)){const r=p(o.getAt(t),e[t]);o.setAt(t,r)}return b(u,a.config.onSuccess,c)}));return(e,t)=>(E(),_(O,{"action-id":s.buttonId,effect:h(d)},null,8,["action-id","effect"]))}});export{I as default};
1
+ import{d as l,b3 as g,aR as A,aU as y,aM as b,c as _,b as h,E as S,K as j,aQ as k,b4 as C,M as B,o as E}from"./index-Cyjm-GKs.js";import{_ as M}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";const F=l({name:"ShwfedStateWriteActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(s){const a=s,f=B(),c=(e,t)=>S(e,{...j(f),...t}),n=g(),o=n.kind==="form"&&n.parent?n.parent:n,u=k(),m=C((e,t,r)=>{if(Array.isArray(e[t])&&Array.isArray(r))return e[t]=r,!0});function i(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function p(e,t){return i(e)&&i(t)?m({...t},e):t}const d=A(()=>y(c(a.config.expression),e=>{for(const t of Object.keys(e)){const r=p(o.getAt(t),e[t]);o.setAt(t,r)}return b(u,a.config.onSuccess,c)}));return(e,t)=>(E(),_(M,{"action-id":s.buttonId,effect:h(d)},null,8,["action-id","effect"]))}});export{F as default};
@@ -1 +1 @@
1
- import{d as f,aQ as u,aT as l,aU as d,c as m,b as w,E as p,K as _,M as g,o as h}from"./index-CEpio2Ai.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-D6Dl1HG7.js";function v(){return{resolve:e=>({href:new URL(e,window.location.href).href})}}function x(e,t){return window.location.assign(e),Promise.resolve()}const B=f({name:"ShwfedNavigationActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const t=e,i=v(),a=g(),r=(n,o)=>p(n,{..._(a),...o});function c(n){try{return new URL(n,window.location.href).origin!==window.location.origin}catch{return!1}}const s=u(()=>l(r(t.config.url),n=>d(async()=>{const o=c(n);if(t.config.mode==="_blank"){window.open(o?n:i.resolve(n).href,"_blank");return}await x(n)})));return(n,o)=>(h(),m(b,{"action-id":e.buttonId,effect:w(s)},null,8,["action-id","effect"]))}});export{B as default};
1
+ import{d as f,aR as u,aU as l,aV as d,c as m,b as w,E as p,K as _,M as g,o as h}from"./index-Cyjm-GKs.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";function v(){return{resolve:e=>({href:new URL(e,window.location.href).href})}}function x(e,t){return window.location.assign(e),Promise.resolve()}const B=f({name:"ShwfedNavigationActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const t=e,i=v(),a=g(),r=(n,o)=>p(n,{..._(a),...o});function c(n){try{return new URL(n,window.location.href).origin!==window.location.origin}catch{return!1}}const s=u(()=>l(r(t.config.url),n=>d(async()=>{const o=c(n);if(t.config.mode==="_blank"){window.open(o?n:i.resolve(n).href,"_blank");return}await x(n)})));return(n,o)=>(h(),m(b,{"action-id":e.buttonId,effect:w(s)},null,8,["action-id","effect"]))}});export{B as default};
@@ -0,0 +1 @@
1
+ import{d as s,Y as M,aW as b,C as p,a1 as c,aX as x,N,c as T,w as d,b as u,A as k,Q as L,aQ as S,aY as w,o as A,j as I,z as V,a as r,aZ as Y,a_ as $,aD as j,M as z,a$ as f,V as m,b0 as F}from"./index-Cyjm-GKs.js";import{_ as H}from"./definition.vue_vue_type_script_setup_true_lang-BgssDGxW.js";const R=s({name:"ShwfedModalLayoutActionRuntime",__name:"runtime",props:{buttonId:{},config:{},buttonTitle:{}},setup(n){const a=n,{locale:l}=M(),v=e=>{},h=z(),i=L(f,void 0),C=S(),o=k(null),g=b(a.buttonId,{close:()=>w(()=>{o.value?.()})},C),_=s({name:"ModalBoundaryBridge",setup(e,{slots:t}){return $(h),m(F,g),i&&m(f,i),()=>t.default?.()}}),E=(e,t)=>j()?.(e,t),y=p(function*(){const e=c(a.config.modalTitle,l.value)??c(a.buttonTitle,l.value)??"",{modal:t,close:B}=yield*x({title:e,width:a.config.modalWidth});o.value=()=>N(B()),yield*t,o.value=null});return(e,t)=>(A(),T(H,{"action-id":n.buttonId,effect:u(y)},{default:d(()=>[I("div",{style:V(n.config.modalMinHeight?`min-height: ${n.config.modalMinHeight}`:void 0)},[r(u(_),null,{default:d(()=>[r(Y,{"slot-value":n.config.slot,configure:v,"find-entry":E},null,8,["slot-value"])]),_:1})],4)]),_:1},8,["action-id","effect"]))}});export{R as default};
@@ -1 +1 @@
1
- import{p as o,q as l,r as p}from"./index-CEpio2Ai.js";function i(n){switch(n._tag){case"TypeLiteral":return n;case"Transformation":return i(n.to);case"Refinement":return i(n.from);case"Suspend":return i(n.f());default:return null}}function d(n,t){const e=i(n.ast);return e?e.propertySignatures.find(r=>r.name===t)??null:null}function y(n){const t=n.type;if(t._tag==="Union"&&n.isOptional){const e=t.types.find(r=>r._tag!=="UndefinedKeyword");if(e)return e}return t}function c(n,t,e){const r=d(n,t);if(!r)return;const u=e(r);if(o(u))return u.value;const f=y(r),s=e(f);if(o(s))return s.value;if(f!==r.type){const a=e(r.type);if(o(a))return a.value}}function m(n,t){return c(n,t,l)}function v(n,t){return c(n,t,p)}export{v as a,m as g};
1
+ import{p as o,q as l,r as p}from"./index-Cyjm-GKs.js";function i(n){switch(n._tag){case"TypeLiteral":return n;case"Transformation":return i(n.to);case"Refinement":return i(n.from);case"Suspend":return i(n.f());default:return null}}function d(n,t){const e=i(n.ast);return e?e.propertySignatures.find(r=>r.name===t)??null:null}function y(n){const t=n.type;if(t._tag==="Union"&&n.isOptional){const e=t.types.find(r=>r._tag!=="UndefinedKeyword");if(e)return e}return t}function c(n,t,e){const r=d(n,t);if(!r)return;const u=e(r);if(o(u))return u.value;const f=y(r),s=e(f);if(o(s))return s.value;if(f!==r.type){const a=e(r.type);if(o(a))return a.value}}function m(n,t){return c(n,t,l)}function v(n,t){return c(n,t,p)}export{v as a,m as g};
@@ -10,8 +10,8 @@
10
10
  `--primary`, the primary button variant renders as transparent. */
11
11
  body { --primary: #009689; }
12
12
  </style>
13
- <script type="module" crossorigin src="./assets/index-CEpio2Ai.js"></script>
14
- <link rel="stylesheet" crossorigin href="./assets/index-DEk1Sey_.css">
13
+ <script type="module" crossorigin src="./assets/index-Cyjm-GKs.js"></script>
14
+ <link rel="stylesheet" crossorigin href="./assets/index-D0eGXK5P.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="app"></div>
@@ -14,7 +14,7 @@ import { Markdown } from "../../../../ui/markdown";
14
14
  import { BREADCRUMB_EXTENSION_KEY } from "../../../../config/breadcrumb-extension";
15
15
  import { SIDEBAR_TAKEOVER_KEY } from "../../../../sidebar-takeover";
16
16
  import { lookupFindBlock } from "../../../../config/utils/block-ref-cache";
17
- import { useSlotEditor } from "../../../../config/use-editor";
17
+ import { useSlotEditor, useSlotClipboard } from "../../../../config/use-editor";
18
18
  import { getStructFieldDescription, getStructFieldTitle } from "../../../schema";
19
19
  import { schema } from "./schema";
20
20
  defineOptions({ name: "ShwfedModalLayoutActionConfig" });
@@ -35,6 +35,7 @@ const slot = computed({
35
35
  }
36
36
  });
37
37
  const editor = useSlotEditor(slot, { configure: configure.value });
38
+ const { copy: copyBlocks, paste: pasteBlocks } = useSlotClipboard(editor);
38
39
  function setModalTitle(next) {
39
40
  value.value = { ...value.value, modalTitle: next };
40
41
  }
@@ -311,6 +312,8 @@ onBeforeUnmount(() => {
311
312
  @drill-down="onDrillDown"
312
313
  @delete-item="deleteBlock"
313
314
  @delete-items="deleteBlocks"
315
+ @copy-items="copyBlocks"
316
+ @paste="pasteBlocks"
314
317
  />
315
318
  </div>
316
319
  </div>
@@ -352,6 +355,8 @@ onBeforeUnmount(() => {
352
355
  @drill-down="onDrillDown"
353
356
  @delete-item="deleteBlock"
354
357
  @delete-items="deleteBlocks"
358
+ @copy-items="copyBlocks"
359
+ @paste="pasteBlocks"
355
360
  />
356
361
  </div>
357
362
  </div>
@@ -2,6 +2,7 @@ import { type ActionsConfigValue, type RegistryItemValue, type RegistrySubItemVa
2
2
  import { Environment } from '../../vendor/cel-js/lib/index.js';
3
3
  type __VLS_Props = {
4
4
  configure?: (env: Environment) => void;
5
+ hideSize?: boolean;
5
6
  };
6
7
  type __VLS_ModelProps = {
7
8
  'modelValue': ActionsConfigValue;
@@ -49,7 +49,8 @@ import {
49
49
  } from "../../share/event-bus";
50
50
  defineOptions({ name: "ShwfedActionsConfig" });
51
51
  const props = defineProps({
52
- configure: { type: Function, required: false }
52
+ configure: { type: Function, required: false },
53
+ hideSize: { type: Boolean, required: false }
53
54
  });
54
55
  const config = defineModel("modelValue", { type: null, ...{ required: true } });
55
56
  const configure = props.configure ?? (() => {
@@ -1202,7 +1203,10 @@ const newGroupZoneId = (insertIndex) => `new-group-${insertIndex}`;
1202
1203
  <slot name="general-extra" />
1203
1204
 
1204
1205
  <div class="grid grid-cols-2 gap-4">
1205
- <Field orientation="vertical">
1206
+ <Field
1207
+ v-if="!hideSize"
1208
+ orientation="vertical"
1209
+ >
1206
1210
  <FieldLabel class="text-xs text-zinc-500">
1207
1211
  <template
1208
1212
  v-if="generalFieldDescription('size')"
@@ -2,6 +2,7 @@ import { type ActionsConfigValue, type RegistryItemValue, type RegistrySubItemVa
2
2
  import { Environment } from '../../vendor/cel-js/lib/index.js';
3
3
  type __VLS_Props = {
4
4
  configure?: (env: Environment) => void;
5
+ hideSize?: boolean;
5
6
  };
6
7
  type __VLS_ModelProps = {
7
8
  'modelValue': ActionsConfigValue;
@@ -413,6 +413,13 @@ function confirmDelete() {
413
413
  if (ids.length === 1) emit("delete-item", ids[0]);
414
414
  else emitDeleteMany(ids);
415
415
  }
416
+ const deleteConfirmRef = ref(null);
417
+ async function focusDeleteConfirm(event) {
418
+ event.preventDefault();
419
+ await nextTick();
420
+ await nextTick();
421
+ deleteConfirmRef.value?.$el?.focus({ preventScroll: true });
422
+ }
416
423
  function hideItems(itemIds) {
417
424
  const i = activeIndex.value;
418
425
  const ls = layouts.value[i];
@@ -1501,7 +1508,10 @@ function onCanvasKeydown(e) {
1501
1508
  deleteDialogOpen = open;
1502
1509
  }"
1503
1510
  >
1504
- <AlertDialogContent class="sm:px-12 sm:py-8 flex flex-col gap-12">
1511
+ <AlertDialogContent
1512
+ class="sm:px-12 sm:py-8 flex flex-col gap-12"
1513
+ @open-auto-focus="focusDeleteConfirm"
1514
+ >
1505
1515
  <AlertDialogHeader class="sr-only">
1506
1516
  <AlertDialogTitle>彻底删除{{ itemNoun }}</AlertDialogTitle>
1507
1517
  <AlertDialogDescription>Confirmation dialog</AlertDialogDescription>
@@ -1518,7 +1528,10 @@ function onCanvasKeydown(e) {
1518
1528
  <Icon icon="fluent:dismiss-20-regular" />
1519
1529
  取消
1520
1530
  </AlertDialogCancel>
1521
- <AlertDialogAction @click="confirmDelete">
1531
+ <AlertDialogAction
1532
+ ref="deleteConfirmRef"
1533
+ @click="confirmDelete"
1534
+ >
1522
1535
  <Icon icon="fluent:checkmark-20-regular" />
1523
1536
  确认
1524
1537
  </AlertDialogAction>
@@ -20,7 +20,7 @@ import {
20
20
  } from "../../../../../composables/useTreeDnd";
21
21
  import { BREADCRUMB_EXTENSION_KEY } from "../../../breadcrumb-extension";
22
22
  import { findBlock } from "../../../utils/resolve";
23
- import { useSlotEditor } from "../../../use-editor";
23
+ import { useSlotClipboard, useSlotEditor } from "../../../use-editor";
24
24
  import { TabPaneMeta, getStructFieldDescription, getStructFieldTitle } from "./schema";
25
25
  defineOptions({ name: "ShwfedBlockTabsConfig" });
26
26
  const block = defineModel({ type: null, ...{ required: true } });
@@ -84,7 +84,8 @@ function buildShell(id) {
84
84
  set value(next) {
85
85
  editor.selectedBlockIds.value = next;
86
86
  }
87
- }
87
+ },
88
+ clipboard: useSlotClipboard(editor)
88
89
  };
89
90
  }
90
91
  function ensureShell(id) {
@@ -554,6 +555,8 @@ function deleteBlocksFromActive(ids) {
554
555
  @drill-down="onDrillDown"
555
556
  @delete-item="deleteBlockFromActive"
556
557
  @delete-items="deleteBlocksFromActive"
558
+ @copy-items="activeShell.clipboard.copy"
559
+ @paste="activeShell.clipboard.paste"
557
560
  />
558
561
  </div>
559
562
  </template>
@@ -23,7 +23,7 @@ import { Separator } from "../../../../ui/separator";
23
23
  import { Switch } from "../../../../ui/switch";
24
24
  import { BREADCRUMB_EXTENSION_KEY } from "../../../breadcrumb-extension";
25
25
  import { findBlock } from "../../../utils/resolve";
26
- import { useSlotEditor } from "../../../use-editor";
26
+ import { useSlotEditor, useSlotClipboard } from "../../../use-editor";
27
27
  import {
28
28
  BADGE_VARIANTS,
29
29
  badgeSchema,
@@ -60,6 +60,7 @@ const slotAccessor = computed({
60
60
  }
61
61
  });
62
62
  const editor = useSlotEditor(slotAccessor, { configure: configure.value });
63
+ const { copy: copyBlocks, paste: pasteBlocks } = useSlotClipboard(editor);
63
64
  const viewMode = ref("general");
64
65
  function selectContent() {
65
66
  viewMode.value = "content";
@@ -539,6 +540,8 @@ if (breadcrumbExt) {
539
540
  @drill-down="onDrillDown"
540
541
  @delete-item="(id) => editor.removeBlock(id)"
541
542
  @delete-items="(ids) => editor.removeBlocks(ids)"
543
+ @copy-items="copyBlocks"
544
+ @paste="pasteBlocks"
542
545
  />
543
546
  </div>
544
547
  </template>
@@ -1,4 +1,4 @@
1
- import type { ConfigEditorState } from './use-editor.js';
1
+ import { type ConfigEditorState } from './use-editor.js';
2
2
  type __VLS_Props = {
3
3
  state: ConfigEditorState;
4
4
  };
@@ -1,8 +1,6 @@
1
1
  <script setup>
2
2
  import { computed, provide, ref, toRef, useTemplateRef } from "vue";
3
3
  import { Icon } from "@iconify/vue";
4
- import { toast } from "vue-sonner";
5
- import { readClip, reidFragment, writeClip } from "../../share/clipboard";
6
4
  import BlockLayoutEditor from "../block-layout-editor/index.vue";
7
5
  import LayoutsSidebar from "../block-layout-editor/sidebar.vue";
8
6
  import LayoutMetaStrip from "../block-layout-editor/meta-strip.vue";
@@ -16,6 +14,7 @@ import { Separator } from "../ui/separator";
16
14
  import { provideEventAncestor } from "../../share/event-bus";
17
15
  import { BREADCRUMB_EXTENSION_KEY } from "./breadcrumb-extension";
18
16
  import { PAGE_TARGET_ID, PageConfig, getStructFieldDescription, getStructFieldTitle, metadata as pageMetadata } from "./schema";
17
+ import { useSlotClipboard } from "./use-editor";
19
18
  defineOptions({ name: "ShwfedConfigConfig" });
20
19
  const props = defineProps({
21
20
  state: { type: Object, required: true }
@@ -100,37 +99,7 @@ function addBlock(entry, options) {
100
99
  function onDrillDown(id) {
101
100
  props.state.onDrillDown(id);
102
101
  }
103
- async function copyBlocks(ids) {
104
- const want = new Set(ids);
105
- const items = props.state.blocks.value.filter((b) => want.has(b.id));
106
- if (items.length === 0) return;
107
- const ls = layouts.value[activeLayoutIndex.value];
108
- const placements = {};
109
- if (ls) {
110
- for (const id of ids) {
111
- const p = ls.layout.placements[id];
112
- if (p) placements[id] = p;
113
- }
114
- }
115
- if (!await writeClip("block", items, placements)) {
116
- toast.error("\u590D\u5236\u5931\u8D25");
117
- return;
118
- }
119
- toast.success(`\u5DF2\u590D\u5236 ${items.length} \u4E2A\u5757`);
120
- }
121
- async function pasteBlocks(target) {
122
- const payload = await readClip();
123
- if (!payload || payload.surface !== "block") return;
124
- const { items, placements } = reidFragment(payload.items, payload.placements);
125
- const pasted = items;
126
- if (pasted.length === 0) return;
127
- if (placements && Object.keys(placements).length > 0) {
128
- props.state.addBlocksWithPlacements(pasted, placements, target);
129
- } else {
130
- props.state.addBlocks(pasted);
131
- }
132
- toast.success(`\u5DF2\u7C98\u8D34 ${pasted.length} \u4E2A\u5757`);
133
- }
102
+ const { copy: copyBlocks, paste: pasteBlocks } = useSlotClipboard(props.state);
134
103
  function updateActiveBlock(next) {
135
104
  props.state.updateActiveBlock(next);
136
105
  }
@@ -1,4 +1,4 @@
1
- import type { ConfigEditorState } from './use-editor.js';
1
+ import { type ConfigEditorState } from './use-editor.js';
2
2
  type __VLS_Props = {
3
3
  state: ConfigEditorState;
4
4
  };
@@ -59,6 +59,25 @@ export interface SlotEditor {
59
59
  configure: (env: Environment) => void;
60
60
  }
61
61
  export declare function useSlotEditor(slot: WritableComputedRef<SlotValue> | Ref<SlotValue>, options?: SlotEditorOptions): SlotEditor;
62
+ export interface SlotClipboardTarget {
63
+ blocks: ComputedRef<ReadonlyArray<BlockValue>>;
64
+ layouts: {
65
+ value: LayoutSetValue[];
66
+ };
67
+ activeLayoutIndex: Ref<number>;
68
+ addBlocks: (blocks: ReadonlyArray<BlockValue>) => void;
69
+ addBlocksWithPlacements: (blocks: ReadonlyArray<BlockValue>, placements: Readonly<Record<string, PlacementValue>>, target: {
70
+ x: number;
71
+ y: number;
72
+ } | null) => void;
73
+ }
74
+ export declare function useSlotClipboard(target: SlotClipboardTarget): {
75
+ copy: (ids: string[]) => Promise<void>;
76
+ paste: (anchor: {
77
+ x: number;
78
+ y: number;
79
+ } | null) => Promise<void>;
80
+ };
62
81
  export interface ConfigEditorState {
63
82
  draft: Ref<PageConfigValue>;
64
83
  stack: Ref<StackEntry[]>;
@@ -1,6 +1,8 @@
1
1
  import { Schema } from "effect";
2
2
  import { computed, ref, shallowRef, watch } from "vue";
3
+ import { toast } from "vue-sonner";
3
4
  import { findFreePlacement, normalizeLayoutSet, placeGroupAt } from "../../share/layout.js";
5
+ import { readClip, reidFragment, writeClip } from "../../share/clipboard.js";
4
6
  import { PageConfig } from "./schema.js";
5
7
  import { BLOCKS, findBlock } from "./utils/resolve.js";
6
8
  import { formatValidationError } from "./utils/validation-error.js";
@@ -180,6 +182,40 @@ export function useSlotEditor(slot, options = {}) {
180
182
  configure
181
183
  };
182
184
  }
185
+ export function useSlotClipboard(target) {
186
+ async function copy(ids) {
187
+ const want = new Set(ids);
188
+ const items = target.blocks.value.filter((b) => want.has(b.id));
189
+ if (items.length === 0) return;
190
+ const ls = target.layouts.value[target.activeLayoutIndex.value];
191
+ const placements = {};
192
+ if (ls) {
193
+ for (const id of ids) {
194
+ const p = ls.layout.placements[id];
195
+ if (p) placements[id] = p;
196
+ }
197
+ }
198
+ if (!await writeClip("block", items, placements)) {
199
+ toast.error("\u590D\u5236\u5931\u8D25");
200
+ return;
201
+ }
202
+ toast.success(`\u5DF2\u590D\u5236 ${items.length} \u4E2A\u5757`);
203
+ }
204
+ async function paste(anchor) {
205
+ const payload = await readClip();
206
+ if (!payload || payload.surface !== "block") return;
207
+ const { items, placements } = reidFragment(payload.items, payload.placements);
208
+ const pasted = items;
209
+ if (pasted.length === 0) return;
210
+ if (placements && Object.keys(placements).length > 0) {
211
+ target.addBlocksWithPlacements(pasted, placements, anchor);
212
+ } else {
213
+ target.addBlocks(pasted);
214
+ }
215
+ toast.success(`\u5DF2\u7C98\u8D34 ${pasted.length} \u4E2A\u5757`);
216
+ }
217
+ return { copy, paste };
218
+ }
183
219
  export function useConfigEditor(model, options = {}) {
184
220
  const configure = options.configure ?? (() => {
185
221
  });
@@ -14,6 +14,7 @@ export declare const metadata: {
14
14
  readonly initial: 2;
15
15
  readonly min: 2;
16
16
  readonly max: number;
17
+ readonly grow: true;
17
18
  };
18
19
  };
19
20
  export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
@@ -7,7 +7,7 @@ export const metadata = {
7
7
  name: "Markdown",
8
8
  icon: "fluent:markdown-20-regular",
9
9
  w: { initial: 8, min: 2, max: Infinity },
10
- h: { initial: 2, min: 2, max: Infinity }
10
+ h: { initial: 2, min: 2, max: Infinity, grow: true }
11
11
  };
12
12
  export function schema(configure) {
13
13
  return Schema.Struct({
@@ -4,6 +4,7 @@ type __VLS_ModelProps = {
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
6
  "update:modelValue": (value: {
7
+ readonly size: "default" | "sm" | "xs";
7
8
  readonly type: "com.shwfed.form.field.actions";
8
9
  readonly style?: string | undefined;
9
10
  readonly id: string;
@@ -88,6 +89,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
88
89
  }) => any;
89
90
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
90
91
  "onUpdate:modelValue"?: ((value: {
92
+ readonly size: "default" | "sm" | "xs";
91
93
  readonly type: "com.shwfed.form.field.actions";
92
94
  readonly style?: string | undefined;
93
95
  readonly id: string;
@@ -24,17 +24,18 @@ onBeforeUnmount(() => {
24
24
  const actionValue = computed({
25
25
  get: () => ({
26
26
  kind: "shwfed.component.action",
27
- size: "default",
27
+ size: value.value.size ?? "default",
28
28
  gap: value.value.gap ?? 4,
29
29
  style: value.value.style,
30
30
  groups: value.value.groups ?? [],
31
31
  items: value.value.items ?? []
32
32
  }),
33
33
  set: (next) => {
34
- const { gap, style, groups, items } = next;
34
+ const { size, gap, style, groups, items } = next;
35
35
  const { style: _drop, ...rest } = value.value;
36
36
  value.value = {
37
37
  ...rest,
38
+ size,
38
39
  gap,
39
40
  groups,
40
41
  items,
@@ -4,6 +4,7 @@ type __VLS_ModelProps = {
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
6
  "update:modelValue": (value: {
7
+ readonly size: "default" | "sm" | "xs";
7
8
  readonly type: "com.shwfed.form.field.actions";
8
9
  readonly style?: string | undefined;
9
10
  readonly id: string;
@@ -88,6 +89,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
88
89
  }) => any;
89
90
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
90
91
  "onUpdate:modelValue"?: ((value: {
92
+ readonly size: "default" | "sm" | "xs";
91
93
  readonly type: "com.shwfed.form.field.actions";
92
94
  readonly style?: string | undefined;
93
95
  readonly id: string;
@@ -8,7 +8,7 @@ const props = defineProps({
8
8
  });
9
9
  const actionsConfig = computed(() => ({
10
10
  kind: "shwfed.component.action",
11
- size: "default",
11
+ size: props.config.size ?? "default",
12
12
  gap: props.config.gap,
13
13
  style: props.config.style,
14
14
  groups: props.config.groups.map((group) => ({
@@ -141,6 +141,9 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
141
141
  }, never>>, {
142
142
  default: () => never[];
143
143
  }>;
144
+ size: Schema.optionalWith<Schema.Literal<["default", "sm", "xs"]>, {
145
+ default: () => "default";
146
+ }>;
144
147
  gap: Schema.optionalWith<Schema.filter<Schema.filter<typeof Schema.Number>>, {
145
148
  default: () => number;
146
149
  }>;
@@ -14,7 +14,7 @@ export const metadata = {
14
14
  };
15
15
  export function schema(configure) {
16
16
  const { fields: actionFields } = ActionSchemaFields(configure);
17
- const { size: _size, groups, items, ...rest } = actionFields;
17
+ const { groups, items, ...rest } = actionFields;
18
18
  return Schema.Struct({
19
19
  type: Schema.Literal(type),
20
20
  compatibilityDate: Schema.Literal(compatibilityDate),
@@ -42,9 +42,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
42
42
  readonly mode: "formula" | "prefill";
43
43
  readonly expression: string;
44
44
  } | undefined;
45
- readonly precision?: number | undefined;
46
- readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
47
- readonly valueAsString?: boolean | undefined;
48
45
  readonly validations?: readonly {
49
46
  readonly message: readonly [{
50
47
  readonly locale: "zh";
@@ -56,6 +53,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
56
53
  readonly warning?: boolean | undefined;
57
54
  readonly when: string;
58
55
  }[] | undefined;
56
+ readonly precision?: number | undefined;
57
+ readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
58
+ readonly valueAsString?: boolean | undefined;
59
59
  }) => any;
60
60
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
61
61
  "onUpdate:modelValue"?: ((value: {
@@ -97,9 +97,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
97
97
  readonly mode: "formula" | "prefill";
98
98
  readonly expression: string;
99
99
  } | undefined;
100
- readonly precision?: number | undefined;
101
- readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
102
- readonly valueAsString?: boolean | undefined;
103
100
  readonly validations?: readonly {
104
101
  readonly message: readonly [{
105
102
  readonly locale: "zh";
@@ -111,6 +108,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
111
108
  readonly warning?: boolean | undefined;
112
109
  readonly when: string;
113
110
  }[] | undefined;
111
+ readonly precision?: number | undefined;
112
+ readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
113
+ readonly valueAsString?: boolean | undefined;
114
114
  }) => any) | undefined;
115
115
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
116
116
  declare const _default: typeof __VLS_export;
@@ -42,9 +42,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
42
42
  readonly mode: "formula" | "prefill";
43
43
  readonly expression: string;
44
44
  } | undefined;
45
- readonly precision?: number | undefined;
46
- readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
47
- readonly valueAsString?: boolean | undefined;
48
45
  readonly validations?: readonly {
49
46
  readonly message: readonly [{
50
47
  readonly locale: "zh";
@@ -56,6 +53,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
56
53
  readonly warning?: boolean | undefined;
57
54
  readonly when: string;
58
55
  }[] | undefined;
56
+ readonly precision?: number | undefined;
57
+ readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
58
+ readonly valueAsString?: boolean | undefined;
59
59
  }) => any;
60
60
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
61
61
  "onUpdate:modelValue"?: ((value: {
@@ -97,9 +97,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
97
97
  readonly mode: "formula" | "prefill";
98
98
  readonly expression: string;
99
99
  } | undefined;
100
- readonly precision?: number | undefined;
101
- readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
102
- readonly valueAsString?: boolean | undefined;
103
100
  readonly validations?: readonly {
104
101
  readonly message: readonly [{
105
102
  readonly locale: "zh";
@@ -111,6 +108,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
111
108
  readonly warning?: boolean | undefined;
112
109
  readonly when: string;
113
110
  }[] | undefined;
111
+ readonly precision?: number | undefined;
112
+ readonly roundingMode?: "round" | "floor" | "ceil" | undefined;
113
+ readonly valueAsString?: boolean | undefined;
114
114
  }) => any) | undefined;
115
115
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
116
116
  declare const _default: typeof __VLS_export;