@hy-bricks/editor 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @hy-bricks/editor
|
|
2
2
|
|
|
3
|
+
## [0.6.0] - 2026-06-15
|
|
4
|
+
|
|
5
|
+
随 @hy-bricks fixed 组(公开面收口 minor)同步升 0.6.0。
|
|
6
|
+
|
|
7
|
+
### 🐛 Fixes
|
|
8
|
+
|
|
9
|
+
- `MonacoEditor` 根容器尺寸不再依赖 Tailwind 工具类(hyperdeck 宿主实踩):宿主不引 `@hy-bricks/editor/style.css`(其 preflight 会污染宿主视觉)时,`w-full h-full` 失效导致容器高度塌为 0,Monaco `automaticLayout` 量出 ~5px → 整片"空白编辑器"且无报错。根容器加内联 `style="width:100%;height:100%"`,不引样式也有正确尺寸。引了 Tailwind/style.css 的宿主零影响。复审同口径扫尾:`HyperCardEditor` / `EditorGroup` / `Splitter` 三个公开导出组件的根容器同样补内联尺寸(spec 锁全部四个)。
|
|
10
|
+
|
|
3
11
|
## [0.5.0] - 2026-06-03
|
|
4
12
|
|
|
5
13
|
随 @hy-bricks fixed 组(canvas `free-split` 发版)同步升 0.5.0;`@hy-bricks/editor` **无功能改动**(其 `SplitNode` 是编辑器面板分屏,与 canvas free-split 无关)。
|
|
@@ -133,4 +141,4 @@ grep -rn "instance:ready\|onInstanceLifecycle\|getInstanceReady" src/
|
|
|
133
141
|
- 用了就简化:`handle.on("instance:ready", id => { const c = handle.getCachedBySourceId(src); if (c?.status === "success") handle.getInstanceRuntime(id)?.setDataInput?.(key, c.value) })`
|
|
134
142
|
- workaround(`replayFromCache` / `mountConcurrency:50` / 首屏 reload)**可保留**,SDK 不强制删
|
|
135
143
|
|
|
136
|
-
详见 `docs/v1/frontend-sdk/20260523-1648-claude-渲染核心-挂载就绪信号-实施稿-rev1.md`。
|
|
144
|
+
详见 `docs/archive/development-history/v1/frontend-sdk/20260523-1648-claude-渲染核心-挂载就绪信号-实施稿-rev1.md`。
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=require("lucide-vue-next"),o=require("@hy-bricks/core"),n=require("monaco-editor"),r=require("monaco-editor/esm/vs/editor/editor.worker?worker"),a=require("monaco-editor/esm/vs/language/json/json.worker?worker"),i=require("monaco-editor/esm/vs/language/css/css.worker?worker"),s=require("monaco-editor/esm/vs/language/html/html.worker?worker"),l=require("monaco-editor/esm/vs/language/typescript/ts.worker?worker"),c=require("reka-ui"),u=require("clsx"),d=require("tailwind-merge"),p=require("class-variance-authority"),f=function(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const o in e)if("default"!==o){const n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:()=>e[o]})}return t.default=e,Object.freeze(t)}(n),v="\n// HyperCard 运行时全局类型 — 由 @hy-bricks/editor 注入到 Monaco\n\ndeclare const __HYPERCARD__: HyperCardInstance | undefined\n\ninterface HyperCardInstance {\n /** 宿主通过 createHyperCard({ libs: { ... } }) 注入的库 / 函数 / 常量 */\n libs: HyperCardLibs\n /** 跨实例运行时 SDK */\n runtime: HyperCardRuntime\n /** 资源 / 短链辅助 */\n assets: HyperCardAssets\n /** SDK 实例版本 */\n version: string\n}\n\n/**\n * 默认 libs 是开放命名空间。宿主补具体类型(axios / EP 等)时,在自己的 d.ts\n * extraLib 里 `interface HyperCardLibs { http: ...; ui: ... }` 声明合并。\n */\ninterface HyperCardLibs {\n [key: string]: any\n}\n\ninterface HyperCardRuntime {\n /** 调另一个组件实例的非钩子方法,同步;实例不存在返 undefined */\n call<T = unknown>(id: string, method: string, ...args: unknown[]): T | undefined\n /** 监听另一个实例的事件,返回 unsubscribe 函数;实例不存在返 undefined */\n on(id: string, event: string, handler: (payload: unknown) => void): (() => void) | undefined\n /** 在另一个实例上发事件 */\n emit(id: string, event: string, payload?: unknown): void\n /** 列出当前页面所有实例,可按 componentId 过滤 */\n listInstances(filter?: { componentId?: string }): HyperCardInstanceHandle[]\n /** 拿到指定 instanceId 的 handle */\n getInstance(id: string): HyperCardInstanceHandle | null\n}\n\ninterface HyperCardInstanceHandle {\n readonly instanceId: string\n readonly componentId: string\n call<T = unknown>(method: string, ...args: unknown[]): T | undefined\n on(event: string, handler: (payload: unknown) => void): () => void\n emit(event: string, payload?: unknown): void\n}\n\ninterface HyperCardAssets {\n /** 拼短链:'/a/<id>' */\n pickerUrl(id: string): string\n}\n",h="file:///hypercard-globals.d.ts";let m=!1;function y(){var e,t;if(m)return;m=!0,n.typescript.javascriptDefaults.addExtraLib(v,h),n.typescript.typescriptDefaults.addExtraLib(v,h),"undefined"!=typeof globalThis&&globalThis.__HYPERCARD_DEBUG__&&console.info("[hypercard][monaco-types] HyperCard globals 注入完成,extra libs =",Object.keys((null==(t=(e=n.typescript.javascriptDefaults).getExtraLibs)?void 0:t.call(e))??{}));const o={target:n.typescript.ScriptTarget.Latest,allowNonTsExtensions:!0,moduleResolution:n.typescript.ModuleResolutionKind.NodeJs,module:n.typescript.ModuleKind.ESNext,noEmit:!0,esModuleInterop:!0,allowJs:!0,checkJs:!1};n.typescript.javascriptDefaults.setCompilerOptions(o),n.typescript.typescriptDefaults.setCompilerOptions(o)}const b=new Map;function g(){const e=[{filePath:h,content:v},...Array.from(b.entries()).map(([e,{content:t}])=>({filePath:e,content:t}))];n.typescript.javascriptDefaults.setExtraLibs(e),n.typescript.typescriptDefaults.setExtraLibs(e)}function x(e){const t=b.get(e.filePath);if(t)return t.count++,void(t.content!==e.content&&console.warn(`[hypercard] extraLib "${e.filePath}" 多次注册但 content 不一致;保留先注册的版本。如需独立内容,请用不同 filePath。`));b.set(e.filePath,{content:e.content,count:1}),g()}function w(e){const t=b.get(e);t&&(t.count--,t.count<=0&&(b.delete(e),g()))}function k(e,t){return Boolean(null==e?void 0:e.showHistory)&&!0===(null==t?void 0:t.hasHistory)}function C(e,t){return Boolean(null==e?void 0:e.showDiff)&&!0===(null==t?void 0:t.hasHistory)&&Boolean(null==t?void 0:t.currentVersionLabel)}function E(e){return!1!==(null==e?void 0:e.enablePublish)}function S(e,t=new Date){if(!e)return null;const o=Date.parse(e);if(Number.isNaN(o))return null;const n=t.getTime()-o;return n<6e4?"刚刚":n<36e5?`${Math.floor(n/6e4)} 分钟前`:n<864e5?`${Math.floor(n/36e5)} 小时前`:n<2592e6?`${Math.floor(n/864e5)} 天前`:new Date(o).toLocaleDateString()}const V=["html","javascript","css"];function B(){let e=null,t=[];function o(){if(e)return e;e={html:f.editor.createModel("","html"),javascript:f.editor.createModel("","javascript"),css:f.editor.createModel("","css")};for(const o of V)e[o].onDidChangeContent(()=>{for(const e of t)e(o)});return e}return{useModels:o,getSource:e=>o()[e].getValue(),setSource(e,t){const n=o()[e];n.getValue()!==t&&n.setValue(t)},snapshotSources(){const e=o();return{html:e.html.getValue(),javascript:e.javascript.getValue(),css:e.css.getValue()}},onSourceChange:e=>(o(),t.push(e),()=>{t=t.filter(t=>t!==e)}),dispose(){if(e){for(const t of V)e[t].dispose();e=null,t=[]}}}}const N=Symbol("hc-editor-scope");function z(){const t=e.inject(N);if(!t)throw new Error("[hypercard] useEditorScope 必须在 <HyperCardEditor> 内使用。组件作者:不要直接挂 MonacoEditor / EditorGroup 等内部组件。");return t}const T={html:"index.html",javascript:"component.js",css:"styles.css"},D=e.defineComponent({__name:"MonacoEditor",props:{sourceKey:{},readOnly:{type:Boolean,default:!1},theme:{default:"vs"},fontSize:{default:13},minimap:{type:Boolean,default:!1}},emits:["save","pushVersion"],setup(t,{emit:o}){globalThis.__HC_MONACO_BOOTSTRAPPED__||(self.MonacoEnvironment={getWorker:(e,t)=>"json"===t?new a:"css"===t||"scss"===t||"less"===t?new i:"html"===t||"handlebars"===t||"razor"===t?new s:"typescript"===t||"javascript"===t?new l:new r},globalThis.__HC_MONACO_BOOTSTRAPPED__=!0),y();const n=t,c=o,u=e.ref(null),d=e.shallowRef(null),p=z();return e.onMounted(()=>{if(!u.value)return;const e=p.useModels(),t=f.editor.create(u.value,{model:e[n.sourceKey],readOnly:n.readOnly,theme:n.theme,fontSize:n.fontSize,fontFamily:"JetBrains Mono, SF Mono, Menlo, Consolas, Liberation Mono, monospace",lineNumbers:"on",minimap:{enabled:n.minimap},automaticLayout:!0,tabSize:2,insertSpaces:!0,scrollBeyondLastLine:!1,smoothScrolling:!0,renderWhitespace:"selection",wordWrap:"on",padding:{top:8,bottom:8}});d.value=t,t.addCommand(f.KeyMod.CtrlCmd|f.KeyCode.KeyS,()=>c("save")),t.addCommand(f.KeyMod.CtrlCmd|f.KeyMod.Shift|f.KeyCode.KeyS,()=>c("pushVersion"))}),e.onBeforeUnmount(()=>{var e;null==(e=d.value)||e.dispose(),d.value=null}),e.watch(()=>n.sourceKey,e=>{const t=d.value;if(!t)return;const o=p.useModels();t.setModel(o[e])}),e.watch(()=>n.readOnly,e=>{var t;return null==(t=d.value)?void 0:t.updateOptions({readOnly:e})}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"containerRef",ref:u,class:"w-full h-full"},null,512))}}),_={class:"hc-editor-tabs h-8 border-b border-zinc-200 flex items-end text-xs shrink-0 overflow-x-auto overflow-y-hidden"},M=["onClick","onDragstart","onDragover","onDrop"],L={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},P={class:"font-mono text-[11px] leading-none truncate"},j={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},I={key:1,class:"absolute inset-0 grid place-items-center text-xs text-zinc-400"},O=e.defineComponent({__name:"EditorGroup",props:{group:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","save","pushVersion"],setup(t,{emit:o}){const n=t,r=o,a=e.ref(null),i=e.ref(null),s=e.ref(null);function l(e){var t;return Array.from((null==(t=e.dataTransfer)?void 0:t.types)??[]).includes("application/x-hc-tab")}function c(e){e.dataTransfer&&(e.dataTransfer.dropEffect=e.altKey||e.metaKey?"copy":"move")}function u(){a.value=null,i.value=null,s.value=null}function d(e){var t;const o=null==(t=e.dataTransfer)?void 0:t.getData("application/x-hc-tab");if(!o)return null;try{const e=JSON.parse(o);return"string"==typeof e.sourceGroupId&&"string"==typeof e.sourceTab?e:null}catch{return null}}function p(e){if(!l(e))return;e.preventDefault(),e.stopPropagation(),c(e);const t=e.currentTarget;a.value=function(e,t){const o=t.getBoundingClientRect(),n=(e.clientX-o.left)/o.width,r=(e.clientY-o.top)/o.height;return r<.22?"top":r>.78?"bottom":n<.5?"left":"right"}(e,t),i.value=null}function f(e){const t=e.currentTarget,o=e.relatedTarget;o&&t.contains(o)||u()}function v(e){if(!l(e))return;e.preventDefault(),e.stopPropagation();const t=d(e),o=a.value;u(),t&&o&&"center"!==o&&r("tab-drop",{sourceGroupId:t.sourceGroupId,sourceTab:t.sourceTab,targetGroupId:n.group.id,edge:o,insertIndex:null,copy:e.altKey||e.metaKey})}function h(e,t){l(e)&&(e.preventDefault(),c(e),a.value="center",i.value=t,e.stopPropagation())}function m(e,t){if(!l(e))return;e.preventDefault(),e.stopPropagation();const o=d(e);u(),o&&r("tab-drop",{sourceGroupId:o.sourceGroupId,sourceTab:o.sourceTab,targetGroupId:n.group.id,edge:"center",insertIndex:t,copy:e.altKey||e.metaKey})}const y=e.computed(()=>{switch(a.value){case"left":return"hc-editor-drop-overlay--left";case"right":return"hc-editor-drop-overlay--right";case"top":return"hc-editor-drop-overlay--top";case"bottom":return"hc-editor-drop-overlay--bottom";default:return""}});return(o,l)=>(e.openBlock(),e.createElementBlock("div",{class:"hc-editor-group relative w-full h-full flex flex-col bg-white border border-zinc-200 overflow-hidden",onDragleave:f,onDragendCapture:u},[e.createElementVNode("div",_,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.group.tabs,(o,l)=>(e.openBlock(),e.createElementBlock("div",{key:o+"-"+l,draggable:!0,class:e.normalizeClass(["hc-editor-tab h-7 min-w-0 px-3 flex items-center gap-1.5 border-r border-zinc-200 transition-colors cursor-pointer select-none relative",[t.group.activeTab===o?"hc-editor-tab--active bg-white text-zinc-950 border-t-2 border-t-zinc-900 border-b border-b-white":"text-zinc-500 hover:text-zinc-900 hover:bg-zinc-50",s.value===o?"hc-editor-tab--dragging opacity-45":""]]),onClick:e=>r("activate",o),onDragstart:e=>function(e,t){e.dataTransfer&&(s.value=t,e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("application/x-hc-tab",JSON.stringify({sourceGroupId:n.group.id,sourceTab:t})),e.dataTransfer.setData("text/plain",T[t]))}(e,o),onDragover:e=>h(e,l),onDrop:e=>m(e,l)},["center"===a.value&&i.value===l?(e.openBlock(),e.createElementBlock("span",L)):e.createCommentVNode("",!0),e.createElementVNode("span",P,e.toDisplayString(e.unref(T)[o]),1)],42,M))),128)),e.createElementVNode("div",{class:"hc-editor-tab-tail flex-1 relative min-w-6",onDragover:l[0]||(l[0]=e=>h(e,t.group.tabs.length)),onDrop:l[1]||(l[1]=e=>m(e,t.group.tabs.length))},["center"===a.value&&i.value===t.group.tabs.length?(e.openBlock(),e.createElementBlock("span",j)):e.createCommentVNode("",!0)],32)]),e.createElementVNode("div",{class:"flex-1 min-h-0 relative",onDragoverCapture:p,onDropCapture:v},[t.group.tabs.length>0?(e.openBlock(),e.createBlock(D,{key:0,"source-key":t.group.activeTab,onSave:l[2]||(l[2]=e=>r("save")),onPushVersion:l[3]||(l[3]=e=>r("pushVersion"))},null,8,["source-key"])):(e.openBlock(),e.createElementBlock("div",I," 把 tab 拖到这里打开 ")),a.value?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["hc-editor-drop-overlay pointer-events-none absolute z-50 bg-blue-500/15 border-2 border-blue-500 ring-2 ring-blue-500/20 transition-all",y.value])},null,2)):e.createCommentVNode("",!0)],32)],32))}}),K=["aria-orientation"],H=e.defineComponent({__name:"Splitter",props:{direction:{default:"horizontal"},ratio:{},handleSize:{default:6}},emits:["update:ratio"],setup(t,{emit:o}){const n=t,r=o,a=e.ref(null),i=e.ref(!1);let s="",l="";const c=e.computed(()=>"horizontal"===n.direction),u=e.computed(()=>(c.value,{flexBasis:`calc(${100*n.ratio}% - ${n.handleSize/2}px)`})),d=e.computed(()=>(c.value,{flexBasis:`calc(${100*(1-n.ratio)}% - ${n.handleSize/2}px)`})),p=e.computed(()=>c.value?{flexBasis:`${n.handleSize}px`,width:`${n.handleSize}px`}:{flexBasis:`${n.handleSize}px`,height:`${n.handleSize}px`});function f(e){if(!a.value)return;const t=a.value.getBoundingClientRect(),o=c.value?(e.clientX-t.left)/t.width:(e.clientY-t.top)/t.height;r("update:ratio",Math.max(.08,Math.min(.92,o)))}function v(e){e.preventDefault(),e.stopPropagation(),i.value=!0,f(e);const t=e.currentTarget;try{t.setPointerCapture(e.pointerId)}catch{}s=document.body.style.cursor,l=document.body.style.userSelect,document.body.style.cursor=c.value?"col-resize":"row-resize",document.body.style.userSelect="none",window.addEventListener("pointermove",h),window.addEventListener("pointerup",b,{once:!0}),window.addEventListener("pointercancel",b,{once:!0})}function h(e){i.value&&(e.preventDefault(),f(e))}function m(){i.value&&(i.value=!1,document.body.style.cursor=s,document.body.style.userSelect=l,window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",b),window.removeEventListener("pointercancel",b))}function y(e){const t=e.currentTarget;try{t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId)}catch{}m()}function b(){m()}return e.onBeforeUnmount(()=>{m()}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"containerRef",ref:a,class:e.normalizeClass(["hc-editor-splitter relative w-full h-full min-w-0 min-h-0",c.value?"hc-editor-splitter--horizontal flex flex-row":"hc-editor-splitter--vertical flex flex-col"])},[e.createElementVNode("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:e.normalizeStyle(u.value)},[e.renderSlot(t.$slots,"a")],4),e.createElementVNode("div",{class:e.normalizeClass(["hc-editor-splitter-handle shrink-0 select-none",[c.value?"hc-editor-splitter-handle--horizontal":"hc-editor-splitter-handle--vertical",i.value?"hc-editor-splitter-handle--dragging":""]]),style:e.normalizeStyle(p.value),role:"separator","aria-orientation":c.value?"vertical":"horizontal",onPointerdown:v,onPointerup:y},null,46,K),e.createElementVNode("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:e.normalizeStyle(d.value)},[e.renderSlot(t.$slots,"b")],4)],2))}}),R=e.defineComponent({__name:"EditorLayout",props:{node:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","set-ratio","save","pushVersion"],setup(t,{emit:o}){const n=o;return(o,r)=>{const a=e.resolveComponent("EditorLayout",!0);return"group"===t.node.type?(e.openBlock(),e.createBlock(O,{key:0,group:t.node,"is-only":t.isOnly??!1,onActivate:r[0]||(r[0]=e=>n("activate",t.node.id,e)),onTabDrop:r[1]||(r[1]=e=>n("tab-drop",e)),onSave:r[2]||(r[2]=e=>n("save")),onPushVersion:r[3]||(r[3]=e=>n("pushVersion"))},null,8,["group","is-only"])):(e.openBlock(),e.createBlock(H,{key:1,direction:t.node.direction,ratio:t.node.ratio,"onUpdate:ratio":r[14]||(r[14]=e=>n("set-ratio",t.node.id,e))},{a:e.withCtx(()=>[e.createVNode(a,{node:t.node.a,onActivate:r[4]||(r[4]=(e,t)=>n("activate",e,t)),onTabDrop:r[5]||(r[5]=e=>n("tab-drop",e)),onSetRatio:r[6]||(r[6]=(e,t)=>n("set-ratio",e,t)),onSave:r[7]||(r[7]=e=>n("save")),onPushVersion:r[8]||(r[8]=e=>n("pushVersion"))},null,8,["node"])]),b:e.withCtx(()=>[e.createVNode(a,{node:t.node.b,onActivate:r[9]||(r[9]=(e,t)=>n("activate",e,t)),onTabDrop:r[10]||(r[10]=e=>n("tab-drop",e)),onSetRatio:r[11]||(r[11]=(e,t)=>n("set-ratio",e,t)),onSave:r[12]||(r[12]=e=>n("save")),onPushVersion:r[13]||(r[13]=e=>n("pushVersion"))},null,8,["node"])]),_:1},8,["direction","ratio"]))}}});let $=0;function A(e){return`${e}_${++$}_${Date.now().toString(36)}`}function G(e,t){return{type:"group",id:A("g"),tabs:[...e],activeTab:t??e[0]}}function q(e){return JSON.parse(JSON.stringify(e))}function J(e,t){return"group"===e.type?e.id===t?e:null:J(e.a,t)??J(e.b,t)}function U(e,t){return"group"===e.type?null:e.id===t?e:U(e.a,t)??U(e.b,t)}function Y(e,t,o){if("group"===e.type)return e.id===t?o:e;if(e.id===t)return o;const n=Y(e.a,t,o),r=Y(e.b,t,o);return n||r?n?r?{...e,a:n,b:r}:n:r:null}function W(e,t,o){const n=q(e),r=J(n,t);return r&&r.tabs.includes(o)&&(r.activeTab=o),n}function F(e,t,o){const n=q(e),r=J(n,t);if(!r)return n;const a=r.tabs.indexOf(o);return-1===a?n:(r.tabs.splice(a,1),0===r.tabs.length?"group"===n.type&&n.id===t?n:Y(n,t,null)??n:(r.activeTab===o&&(r.activeTab=r.tabs[Math.min(a,r.tabs.length-1)]),n))}function X(e,t,o,n,r,a=!1){let i=q(e);const s=J(i,n);if(!s)return i;if(t===n&&!a){const e=s.tabs.indexOf(o);if(-1===e)return i;s.tabs.splice(e,1);const t=null==r?s.tabs.length:Math.min(r,s.tabs.length);return s.tabs.splice(t,0,o),s.activeTab=o,i}if(!s.tabs.includes(o)){const e=null==r?s.tabs.length:Math.min(r,s.tabs.length);s.tabs.splice(e,0,o)}return s.activeTab=o,a||(i=F(i,t,o)),i}function Q(e,t,o,n,r,a=!1){let i=q(e);const s=J(i,n);if(!s)return i;if(t===n&&1===s.tabs.length&&s.tabs[0]===o&&!a)return i;const l=G([o],o),c="left"===r||"right"===r?"horizontal":"vertical",u={type:"split",id:A("s"),direction:c,ratio:.5,a:"right"===r||"bottom"===r?q(s):l,b:"right"===r||"bottom"===r?l:q(s)},d=Y(i,s.id,u);return d?(i=d,a||(i=F(i,t,o)),i):i}function Z(e,t,o){const n=q(e),r=U(n,t);return r&&(r.ratio=Math.max(.05,Math.min(.95,o))),n}function ee(){return G(["html","javascript","css"],"javascript")}function te(e){return"hc:draft:"+e}function oe(e){if(!e)return null;const t=localStorage.getItem(te(e));if(!t)return null;try{const e=JSON.parse(t);if("string"==typeof e.html&&"string"==typeof e.javascript&&"string"==typeof e.css&&"number"==typeof e.savedAt)return e}catch{}return null}function ne(e,t){if(!e)return null;const o={html:t.html,javascript:t.javascript,css:t.css,savedAt:Date.now()};try{return localStorage.setItem(te(e),JSON.stringify(o)),o}catch(e){return console.warn("[hc-draft] saveDraft failed:",e),null}}function re(e){e&&localStorage.removeItem(te(e))}function ae(e){const t=new BroadcastChannel(`hc-preview-${e}`);return{channel:t,send(e){t.postMessage(e)},close(){t.close()}}}function ie(...e){return d.twMerge(u.clsx(e))}const se=p.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-7 rounded-md px-2 text-xs has-[>svg]:px-1.5",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8"}},defaultVariants:{variant:"default",size:"default"}}),le=e.defineComponent({__name:"Button",props:{variant:{},size:{},class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{default:"button"}},setup(t){const o=t;return(n,r)=>(e.openBlock(),e.createBlock(e.unref(c.Primitive),{"data-slot":"button",as:t.as,"as-child":t.asChild,class:e.normalizeClass(e.unref(ie)(e.unref(se)({variant:t.variant,size:t.size}),o.class))},{default:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),ce={class:"h-full w-full flex flex-col bg-zinc-50 text-zinc-900"},ue={class:"h-11 border-b border-zinc-200 bg-white flex items-center px-4 gap-3 shrink-0"},de={key:1,class:"h-4 w-px bg-zinc-200"},pe={class:"flex items-baseline gap-2 min-w-0"},fe={key:0,class:"text-sm font-medium truncate"},ve={key:1,class:"text-[11px] text-zinc-400 tabular-nums"},he=["title"],me={key:3,class:"text-[11px] text-amber-600"},ye={key:2,class:"hc-editor-draft-pill"},be={class:"hc-editor-draft-pill-text"},ge={class:"ml-auto flex items-center gap-1.5"},xe={class:"flex items-center gap-1.5 text-[11px] text-zinc-500 select-none cursor-pointer"},we={class:"flex-1 min-h-0 p-2 bg-zinc-50"},ke={class:"w-full h-full"},Ce={class:"hc-editor-preview-pane w-full h-full bg-white border border-zinc-200 flex flex-col overflow-hidden"},Ee={class:"hc-editor-preview-header"},Se={class:"hc-editor-preview-tab"},Ve={class:"hc-editor-preview-actions"},Be={class:"flex-1 min-h-0 overflow-auto bg-white"},Ne={class:"hc-editor-preview-body min-h-full px-5 py-4"},ze={key:1,class:"w-full h-full"},Te=e.defineComponent({__name:"HyperCardEditor",props:{modelValue:{},draftKey:{},componentId:{},showBackButton:{type:Boolean,default:!1},title:{},statusLabel:{},versionStatus:{},features:{},autoPreview:{type:Boolean,default:!0},previewRatio:{default:.62},extraLibs:{}},emits:["update:modelValue","dirty","save-draft","push-version","open-preview-window","open-settings","open-history","open-diff","go-back","error"],setup(n,{expose:r,emit:a}){var i;const s=n,l=a,c=B();e.provide(N,c);const u=e.ref(!1),d=e.ref(ee()),p=e.ref(s.previewRatio),f=e.ref(!1),v=e.ref(s.autoPreview),h=e.ref(""),m=e.ref(""),y=e.ref(""),b=e.ref(null),g=(null==(i=e.getCurrentInstance())?void 0:i.uid)??Math.floor(1e9*Math.random()),V=e.computed(()=>s.componentId??s.draftKey??`__hc_editor_${g}__`),z=e.computed(()=>`editor-preview-${V.value}`),T=e.computed(()=>{var e;return(null==(e=s.versionStatus)?void 0:e.currentVersionLabel)??s.statusLabel??""}),D=e.computed(()=>{var e;return S(null==(e=s.versionStatus)?void 0:e.lastPublishedAt)}),_=e.computed(()=>k(s.features,s.versionStatus)),M=e.computed(()=>C(s.features,s.versionStatus)),L=e.computed(()=>E(s.features));let P=!1,j=null,I=null;function O(){const e=c.snapshotSources();l("update:modelValue",{html:e.html,js:e.javascript,css:e.css})}function K(e,t,o){P=!0;try{c.setSource("html",e),c.setSource("javascript",t),c.setSource("css",o)}finally{P=!1}}e.watch(()=>s.modelValue,e=>{if(!e)return;const t=c.snapshotSources();t.html===(e.html??"")&&t.javascript===(e.js??"")&&t.css===(e.css??"")||(K(e.html??"",e.js??"",e.css??""),A(),U(),u.value=!1,l("dirty",!1))},{immediate:!0});let $=null;function A(){const e=c.snapshotSources();h.value=e.html,m.value=e.javascript,y.value=e.css}function G(){$&&clearTimeout($),A()}function q(){s.draftKey&&!j&&(j=ae(s.draftKey),j.channel.addEventListener("message",e=>{const t=e.data;"hello"===t.type?(f.value=!0,J()):"goodbye"===t.type?f.value=!1:"request-sources"===t.type&&J()}))}function J(){if(!j)return;const e=c.snapshotSources();j.send({type:"sources",html:e.html,javascript:e.javascript,css:e.css})}function U(){j&&(I&&clearTimeout(I),I=setTimeout(J,200))}function Y(){s.draftKey?(ne(s.draftKey,c.snapshotSources())&&(u.value=!1,l("dirty",!1),b.value=null),l("save-draft")):l("save-draft")}function F(){const e=b.value;e&&(K(e.html,e.javascript,e.css),A(),O(),U(),b.value=null,u.value=!0,l("dirty",!0))}function te(){s.draftKey&&(re(s.draftKey),b.value=null)}function ie(e,t){d.value=W(d.value,e,t)}function se(e){"center"===e.edge?d.value=X(d.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.insertIndex,e.copy):d.value=Q(d.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.edge,e.copy)}function Te(e,t){d.value=Z(d.value,e,t)}function De(e){u.value&&(e.preventDefault(),e.returnValue="")}let _e=null;const Me=[];function Le(){q(),l("open-preview-window")}function Pe(e){const t=Date.now()-e;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)} 分钟前`:t<864e5?`${Math.floor(t/36e5)} 小时前`:new Date(e).toLocaleString()}return e.onMounted(()=>{if(s.extraLibs)for(const e of s.extraLibs)x(e),Me.push(e.filePath);_e=c.onSourceChange(()=>{P||(u.value=!0,l("dirty",!0),O(),U(),v.value&&($&&clearTimeout($),$=setTimeout(A,600)))}),s.draftKey&&(b.value=oe(s.draftKey),q()),window.addEventListener("beforeunload",De)}),e.onBeforeUnmount(()=>{null==_e||_e(),_e=null,I&&clearTimeout(I),$&&clearTimeout($),null==j||j.close(),j=null,window.removeEventListener("beforeunload",De);for(const e of Me)w(e);Me.length=0,c.dispose()}),r({isDirty:u,confirmLeave:function(){return!u.value||window.confirm("当前修改未保存,确定离开?未保存内容将丢失。")},applyDraft:function(e){K(e.html,e.javascript,e.css),A(),O(),U(),u.value=!0,l("dirty",!0)},manualPreview:G,applyPreview:A}),(r,a)=>{var i;return e.openBlock(),e.createElementBlock("div",ce,[e.createElementVNode("header",ue,[n.showBackButton?(e.openBlock(),e.createBlock(e.unref(le),{key:0,variant:"ghost",size:"sm",onClick:a[0]||(a[0]=e=>l("go-back"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.ArrowLeft),{size:14}),a[9]||(a[9]=e.createTextVNode(" 返回 ",-1))]),_:1})):e.createCommentVNode("",!0),n.showBackButton?(e.openBlock(),e.createElementBlock("span",de)):e.createCommentVNode("",!0),e.createElementVNode("div",pe,[n.title?(e.openBlock(),e.createElementBlock("h1",fe,e.toDisplayString(n.title),1)):e.createCommentVNode("",!0),T.value?(e.openBlock(),e.createElementBlock("span",ve,e.toDisplayString(T.value),1)):e.createCommentVNode("",!0),D.value?(e.openBlock(),e.createElementBlock("span",{key:2,class:"text-[11px] text-zinc-400",title:null==(i=n.versionStatus)?void 0:i.lastPublishedAt}," · 上次发布 "+e.toDisplayString(D.value),9,he)):e.createCommentVNode("",!0),u.value?(e.openBlock(),e.createElementBlock("span",me,"●未保存")):e.createCommentVNode("",!0)]),b.value?(e.openBlock(),e.createElementBlock("div",ye,[a[10]||(a[10]=e.createElementVNode("span",{class:"hc-editor-draft-pill-dot"},null,-1)),e.createElementVNode("span",be," 本地草稿 · "+e.toDisplayString(Pe(b.value.savedAt))+"保存 ",1),e.createElementVNode("button",{type:"button",class:"hc-editor-draft-pill-action hc-editor-draft-pill-action--primary",onClick:F}," 恢复 "),e.createElementVNode("button",{type:"button",class:"hc-editor-draft-pill-action",onClick:te}," 丢弃 ")])):e.createCommentVNode("",!0),e.createElementVNode("div",ge,[e.createElementVNode("label",xe,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":a[1]||(a[1]=e=>v.value=e),type:"checkbox",class:"h-3 w-3 rounded border-zinc-300 text-zinc-900 focus:ring-0"},null,512),[[e.vModelCheckbox,v.value]]),a[11]||(a[11]=e.createTextVNode(" 自动预览 ",-1))]),M.value?(e.openBlock(),e.createBlock(e.unref(le),{key:0,variant:"ghost",size:"xs",title:"查看当前改动",onClick:a[2]||(a[2]=e=>l("open-diff"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.GitCompare),{size:13}),a[12]||(a[12]=e.createTextVNode(" 看改动 ",-1))]),_:1})):e.createCommentVNode("",!0),_.value?(e.openBlock(),e.createBlock(e.unref(le),{key:1,variant:"ghost",size:"xs",title:"历史版本",onClick:a[3]||(a[3]=e=>l("open-history"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.History),{size:13}),a[13]||(a[13]=e.createTextVNode(" 历史版本 ",-1))]),_:1})):e.createCommentVNode("",!0),e.createVNode(e.unref(le),{variant:"ghost",size:"icon-sm",title:"组件设置",onClick:a[4]||(a[4]=e=>l("open-settings"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.Settings),{size:14})]),_:1}),e.createVNode(e.unref(le),{variant:"outline",size:"xs",onClick:Y},{default:e.withCtx(()=>[...a[14]||(a[14]=[e.createTextVNode(" 保存草稿 ",-1)])]),_:1}),L.value?(e.openBlock(),e.createBlock(e.unref(le),{key:2,variant:"default",size:"xs",onClick:a[5]||(a[5]=e=>l("push-version"))},{default:e.withCtx(()=>[...a[15]||(a[15]=[e.createTextVNode(" 推版本 ",-1)])]),_:1})):e.createCommentVNode("",!0)])]),e.createElementVNode("div",we,[f.value?(e.openBlock(),e.createElementBlock("div",ze,[e.createVNode(R,{node:d.value,"is-only":"group"===d.value.type,onActivate:ie,onTabDrop:se,onSetRatio:Te,onSave:Y,onPushVersion:a[8]||(a[8]=e=>l("push-version"))},null,8,["node","is-only"]),a[18]||(a[18]=e.createElementVNode("div",{class:"fixed bottom-3 right-3 bg-zinc-900 text-white text-[11px] px-3 py-1.5 rounded-md shadow-md flex items-center gap-2"},[e.createElementVNode("span",{class:"h-1.5 w-1.5 rounded-full bg-emerald-400"}),e.createTextVNode(" 预览已脱出 · 关闭独立窗口可恢复 ")],-1))])):(e.openBlock(),e.createBlock(H,{key:0,direction:"horizontal",ratio:p.value,"onUpdate:ratio":a[7]||(a[7]=e=>p.value=e)},{a:e.withCtx(()=>[e.createElementVNode("div",ke,[e.createVNode(R,{node:d.value,"is-only":"group"===d.value.type,onActivate:ie,onTabDrop:se,onSetRatio:Te,onSave:Y,onPushVersion:a[6]||(a[6]=e=>l("push-version"))},null,8,["node","is-only"])])]),b:e.withCtx(()=>[e.createElementVNode("div",Ce,[e.createElementVNode("div",Ee,[e.createElementVNode("div",Se,[a[16]||(a[16]=e.createElementVNode("span",{class:"hc-editor-preview-title"},"预览",-1)),e.createElementVNode("button",{type:"button",class:"hc-editor-icon-button hc-editor-preview-icon-button",title:"独立窗口预览",onClick:Le},[e.createVNode(e.unref(t.ExternalLink),{size:13})])]),e.createElementVNode("div",Ve,[v.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"hc-editor-preview-refresh",onClick:G},[e.createVNode(e.unref(t.RefreshCw),{size:12}),a[17]||(a[17]=e.createTextVNode(" 重新渲染 ",-1))]))])]),e.createElementVNode("div",Be,[e.createElementVNode("div",Ne,[e.createVNode(e.unref(o.RuntimeBox),{"instance-id":z.value,"component-id":`user-${V.value}`,"html-source":h.value,"js-source":m.value,"css-source":y.value},null,8,["instance-id","component-id","html-source","js-source","css-source"])])])])]),_:1},8,["ratio"]))])])}}});exports.Button=le,exports.EDITOR_SCOPE_KEY=N,exports.EditorGroup=O,exports.EditorLayout=R,exports.HyperCardEditor=Te,exports.MonacoEditor=D,exports.SOURCE_KEY_LABEL=T,exports.Splitter=H,exports.VERSION="0.0.0-stage3",exports.activateTab=W,exports.addMonacoExtraLib=function(e){x(e)},exports.buttonVariants=se,exports.clearDraft=re,exports.closeTab=F,exports.createEditorScope=B,exports.createPreviewBus=ae,exports.defaultLayout=ee,exports.formatLastPublished=S,exports.formatRelative=function(e){const t=Date.now()-e,o=Math.floor(t/6e4);if(o<1)return"刚刚";if(o<60)return`${o} 分钟前`;const n=Math.floor(o/60);return n<24?`${n} 小时前`:`${Math.floor(n/24)} 天前`},exports.loadDraft=oe,exports.moveTab=X,exports.releaseMonacoExtraLib=w,exports.removeMonacoExtraLib=function(e){w(e)},exports.retainMonacoExtraLib=x,exports.saveDraft=ne,exports.setSplitRatio=Z,exports.setupHyperCardMonacoTypes=y,exports.shouldShowDiffEntry=C,exports.shouldShowHistoryEntry=k,exports.shouldShowPublishEntry=E,exports.splitWithTab=Q,exports.useEditorScope=z;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=require("lucide-vue-next"),o=require("@hy-bricks/core"),n=require("monaco-editor"),r=require("monaco-editor/esm/vs/editor/editor.worker?worker"),a=require("monaco-editor/esm/vs/language/json/json.worker?worker"),i=require("monaco-editor/esm/vs/language/css/css.worker?worker"),s=require("monaco-editor/esm/vs/language/html/html.worker?worker"),l=require("monaco-editor/esm/vs/language/typescript/ts.worker?worker"),c=require("reka-ui"),u=require("clsx"),d=require("tailwind-merge"),p=require("class-variance-authority"),f=function(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const o in e)if("default"!==o){const n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:()=>e[o]})}return t.default=e,Object.freeze(t)}(n),v="\n// HyperCard 运行时全局类型 — 由 @hy-bricks/editor 注入到 Monaco\n\ndeclare const __HYPERCARD__: HyperCardInstance | undefined\n\ninterface HyperCardInstance {\n /** 宿主通过 createHyperCard({ libs: { ... } }) 注入的库 / 函数 / 常量 */\n libs: HyperCardLibs\n /** 跨实例运行时 SDK */\n runtime: HyperCardRuntime\n /** 资源 / 短链辅助 */\n assets: HyperCardAssets\n /** SDK 实例版本 */\n version: string\n}\n\n/**\n * 默认 libs 是开放命名空间。宿主补具体类型(axios / EP 等)时,在自己的 d.ts\n * extraLib 里 `interface HyperCardLibs { http: ...; ui: ... }` 声明合并。\n */\ninterface HyperCardLibs {\n [key: string]: any\n}\n\ninterface HyperCardRuntime {\n /** 调另一个组件实例的非钩子方法,同步;实例不存在返 undefined */\n call<T = unknown>(id: string, method: string, ...args: unknown[]): T | undefined\n /** 监听另一个实例的事件,返回 unsubscribe 函数;实例不存在返 undefined */\n on(id: string, event: string, handler: (payload: unknown) => void): (() => void) | undefined\n /** 在另一个实例上发事件 */\n emit(id: string, event: string, payload?: unknown): void\n /** 列出当前页面所有实例,可按 componentId 过滤 */\n listInstances(filter?: { componentId?: string }): HyperCardInstanceHandle[]\n /** 拿到指定 instanceId 的 handle */\n getInstance(id: string): HyperCardInstanceHandle | null\n}\n\ninterface HyperCardInstanceHandle {\n readonly instanceId: string\n readonly componentId: string\n call<T = unknown>(method: string, ...args: unknown[]): T | undefined\n on(event: string, handler: (payload: unknown) => void): () => void\n emit(event: string, payload?: unknown): void\n}\n\ninterface HyperCardAssets {\n /** 拼短链:'/a/<id>' */\n pickerUrl(id: string): string\n}\n",h="file:///hypercard-globals.d.ts";let m=!1;function y(){var e,t;if(m)return;m=!0,n.typescript.javascriptDefaults.addExtraLib(v,h),n.typescript.typescriptDefaults.addExtraLib(v,h),"undefined"!=typeof globalThis&&globalThis.__HYPERCARD_DEBUG__&&console.info("[hypercard][monaco-types] HyperCard globals 注入完成,extra libs =",Object.keys((null==(t=(e=n.typescript.javascriptDefaults).getExtraLibs)?void 0:t.call(e))??{}));const o={target:n.typescript.ScriptTarget.Latest,allowNonTsExtensions:!0,moduleResolution:n.typescript.ModuleResolutionKind.NodeJs,module:n.typescript.ModuleKind.ESNext,noEmit:!0,esModuleInterop:!0,allowJs:!0,checkJs:!1};n.typescript.javascriptDefaults.setCompilerOptions(o),n.typescript.typescriptDefaults.setCompilerOptions(o)}const g=new Map;function b(){const e=[{filePath:h,content:v},...Array.from(g.entries()).map(([e,{content:t}])=>({filePath:e,content:t}))];n.typescript.javascriptDefaults.setExtraLibs(e),n.typescript.typescriptDefaults.setExtraLibs(e)}function x(e){const t=g.get(e.filePath);if(t)return t.count++,void(t.content!==e.content&&console.warn(`[hypercard] extraLib "${e.filePath}" 多次注册但 content 不一致;保留先注册的版本。如需独立内容,请用不同 filePath。`));g.set(e.filePath,{content:e.content,count:1}),b()}function w(e){const t=g.get(e);t&&(t.count--,t.count<=0&&(g.delete(e),b()))}function k(e,t){return Boolean(null==e?void 0:e.showHistory)&&!0===(null==t?void 0:t.hasHistory)}function C(e,t){return Boolean(null==e?void 0:e.showDiff)&&!0===(null==t?void 0:t.hasHistory)&&Boolean(null==t?void 0:t.currentVersionLabel)}function E(e){return!1!==(null==e?void 0:e.enablePublish)}function S(e,t=new Date){if(!e)return null;const o=Date.parse(e);if(Number.isNaN(o))return null;const n=t.getTime()-o;return n<6e4?"刚刚":n<36e5?`${Math.floor(n/6e4)} 分钟前`:n<864e5?`${Math.floor(n/36e5)} 小时前`:n<2592e6?`${Math.floor(n/864e5)} 天前`:new Date(o).toLocaleDateString()}const V=["html","javascript","css"];function B(){let e=null,t=[];function o(){if(e)return e;e={html:f.editor.createModel("","html"),javascript:f.editor.createModel("","javascript"),css:f.editor.createModel("","css")};for(const o of V)e[o].onDidChangeContent(()=>{for(const e of t)e(o)});return e}return{useModels:o,getSource:e=>o()[e].getValue(),setSource(e,t){const n=o()[e];n.getValue()!==t&&n.setValue(t)},snapshotSources(){const e=o();return{html:e.html.getValue(),javascript:e.javascript.getValue(),css:e.css.getValue()}},onSourceChange:e=>(o(),t.push(e),()=>{t=t.filter(t=>t!==e)}),dispose(){if(e){for(const t of V)e[t].dispose();e=null,t=[]}}}}const N=Symbol("hc-editor-scope");function z(){const t=e.inject(N);if(!t)throw new Error("[hypercard] useEditorScope 必须在 <HyperCardEditor> 内使用。组件作者:不要直接挂 MonacoEditor / EditorGroup 等内部组件。");return t}const T={html:"index.html",javascript:"component.js",css:"styles.css"},D=e.defineComponent({__name:"MonacoEditor",props:{sourceKey:{},readOnly:{type:Boolean,default:!1},theme:{default:"vs"},fontSize:{default:13},minimap:{type:Boolean,default:!1}},emits:["save","pushVersion"],setup(t,{emit:o}){globalThis.__HC_MONACO_BOOTSTRAPPED__||(self.MonacoEnvironment={getWorker:(e,t)=>"json"===t?new a:"css"===t||"scss"===t||"less"===t?new i:"html"===t||"handlebars"===t||"razor"===t?new s:"typescript"===t||"javascript"===t?new l:new r},globalThis.__HC_MONACO_BOOTSTRAPPED__=!0),y();const n=t,c=o,u=e.ref(null),d=e.shallowRef(null),p=z();return e.onMounted(()=>{if(!u.value)return;const e=p.useModels(),t=f.editor.create(u.value,{model:e[n.sourceKey],readOnly:n.readOnly,theme:n.theme,fontSize:n.fontSize,fontFamily:"JetBrains Mono, SF Mono, Menlo, Consolas, Liberation Mono, monospace",lineNumbers:"on",minimap:{enabled:n.minimap},automaticLayout:!0,tabSize:2,insertSpaces:!0,scrollBeyondLastLine:!1,smoothScrolling:!0,renderWhitespace:"selection",wordWrap:"on",padding:{top:8,bottom:8}});d.value=t,t.addCommand(f.KeyMod.CtrlCmd|f.KeyCode.KeyS,()=>c("save")),t.addCommand(f.KeyMod.CtrlCmd|f.KeyMod.Shift|f.KeyCode.KeyS,()=>c("pushVersion"))}),e.onBeforeUnmount(()=>{var e;null==(e=d.value)||e.dispose(),d.value=null}),e.watch(()=>n.sourceKey,e=>{const t=d.value;if(!t)return;const o=p.useModels();t.setModel(o[e])}),e.watch(()=>n.readOnly,e=>{var t;return null==(t=d.value)?void 0:t.updateOptions({readOnly:e})}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"containerRef",ref:u,class:"w-full h-full",style:{width:"100%",height:"100%"}},null,512))}}),_={class:"hc-editor-tabs h-8 border-b border-zinc-200 flex items-end text-xs shrink-0 overflow-x-auto overflow-y-hidden"},M=["onClick","onDragstart","onDragover","onDrop"],L={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},P={class:"font-mono text-[11px] leading-none truncate"},j={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},I={key:1,class:"absolute inset-0 grid place-items-center text-xs text-zinc-400"},O=e.defineComponent({__name:"EditorGroup",props:{group:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","save","pushVersion"],setup(t,{emit:o}){const n=t,r=o,a=e.ref(null),i=e.ref(null),s=e.ref(null);function l(e){var t;return Array.from((null==(t=e.dataTransfer)?void 0:t.types)??[]).includes("application/x-hc-tab")}function c(e){e.dataTransfer&&(e.dataTransfer.dropEffect=e.altKey||e.metaKey?"copy":"move")}function u(){a.value=null,i.value=null,s.value=null}function d(e){var t;const o=null==(t=e.dataTransfer)?void 0:t.getData("application/x-hc-tab");if(!o)return null;try{const e=JSON.parse(o);return"string"==typeof e.sourceGroupId&&"string"==typeof e.sourceTab?e:null}catch{return null}}function p(e){if(!l(e))return;e.preventDefault(),e.stopPropagation(),c(e);const t=e.currentTarget;a.value=function(e,t){const o=t.getBoundingClientRect(),n=(e.clientX-o.left)/o.width,r=(e.clientY-o.top)/o.height;return r<.22?"top":r>.78?"bottom":n<.5?"left":"right"}(e,t),i.value=null}function f(e){const t=e.currentTarget,o=e.relatedTarget;o&&t.contains(o)||u()}function v(e){if(!l(e))return;e.preventDefault(),e.stopPropagation();const t=d(e),o=a.value;u(),t&&o&&"center"!==o&&r("tab-drop",{sourceGroupId:t.sourceGroupId,sourceTab:t.sourceTab,targetGroupId:n.group.id,edge:o,insertIndex:null,copy:e.altKey||e.metaKey})}function h(e,t){l(e)&&(e.preventDefault(),c(e),a.value="center",i.value=t,e.stopPropagation())}function m(e,t){if(!l(e))return;e.preventDefault(),e.stopPropagation();const o=d(e);u(),o&&r("tab-drop",{sourceGroupId:o.sourceGroupId,sourceTab:o.sourceTab,targetGroupId:n.group.id,edge:"center",insertIndex:t,copy:e.altKey||e.metaKey})}const y=e.computed(()=>{switch(a.value){case"left":return"hc-editor-drop-overlay--left";case"right":return"hc-editor-drop-overlay--right";case"top":return"hc-editor-drop-overlay--top";case"bottom":return"hc-editor-drop-overlay--bottom";default:return""}});return(o,l)=>(e.openBlock(),e.createElementBlock("div",{class:"hc-editor-group relative w-full h-full flex flex-col bg-white border border-zinc-200 overflow-hidden",style:{width:"100%",height:"100%"},onDragleave:f,onDragendCapture:u},[e.createElementVNode("div",_,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.group.tabs,(o,l)=>(e.openBlock(),e.createElementBlock("div",{key:o+"-"+l,draggable:!0,class:e.normalizeClass(["hc-editor-tab h-7 min-w-0 px-3 flex items-center gap-1.5 border-r border-zinc-200 transition-colors cursor-pointer select-none relative",[t.group.activeTab===o?"hc-editor-tab--active bg-white text-zinc-950 border-t-2 border-t-zinc-900 border-b border-b-white":"text-zinc-500 hover:text-zinc-900 hover:bg-zinc-50",s.value===o?"hc-editor-tab--dragging opacity-45":""]]),onClick:e=>r("activate",o),onDragstart:e=>function(e,t){e.dataTransfer&&(s.value=t,e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("application/x-hc-tab",JSON.stringify({sourceGroupId:n.group.id,sourceTab:t})),e.dataTransfer.setData("text/plain",T[t]))}(e,o),onDragover:e=>h(e,l),onDrop:e=>m(e,l)},["center"===a.value&&i.value===l?(e.openBlock(),e.createElementBlock("span",L)):e.createCommentVNode("",!0),e.createElementVNode("span",P,e.toDisplayString(e.unref(T)[o]),1)],42,M))),128)),e.createElementVNode("div",{class:"hc-editor-tab-tail flex-1 relative min-w-6",onDragover:l[0]||(l[0]=e=>h(e,t.group.tabs.length)),onDrop:l[1]||(l[1]=e=>m(e,t.group.tabs.length))},["center"===a.value&&i.value===t.group.tabs.length?(e.openBlock(),e.createElementBlock("span",j)):e.createCommentVNode("",!0)],32)]),e.createElementVNode("div",{class:"flex-1 min-h-0 relative",onDragoverCapture:p,onDropCapture:v},[t.group.tabs.length>0?(e.openBlock(),e.createBlock(D,{key:0,"source-key":t.group.activeTab,onSave:l[2]||(l[2]=e=>r("save")),onPushVersion:l[3]||(l[3]=e=>r("pushVersion"))},null,8,["source-key"])):(e.openBlock(),e.createElementBlock("div",I," 把 tab 拖到这里打开 ")),a.value?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["hc-editor-drop-overlay pointer-events-none absolute z-50 bg-blue-500/15 border-2 border-blue-500 ring-2 ring-blue-500/20 transition-all",y.value])},null,2)):e.createCommentVNode("",!0)],32)],32))}}),K=["aria-orientation"],H=e.defineComponent({__name:"Splitter",props:{direction:{default:"horizontal"},ratio:{},handleSize:{default:6}},emits:["update:ratio"],setup(t,{emit:o}){const n=t,r=o,a=e.ref(null),i=e.ref(!1);let s="",l="";const c=e.computed(()=>"horizontal"===n.direction),u=e.computed(()=>(c.value,{flexBasis:`calc(${100*n.ratio}% - ${n.handleSize/2}px)`})),d=e.computed(()=>(c.value,{flexBasis:`calc(${100*(1-n.ratio)}% - ${n.handleSize/2}px)`})),p=e.computed(()=>c.value?{flexBasis:`${n.handleSize}px`,width:`${n.handleSize}px`}:{flexBasis:`${n.handleSize}px`,height:`${n.handleSize}px`});function f(e){if(!a.value)return;const t=a.value.getBoundingClientRect(),o=c.value?(e.clientX-t.left)/t.width:(e.clientY-t.top)/t.height;r("update:ratio",Math.max(.08,Math.min(.92,o)))}function v(e){e.preventDefault(),e.stopPropagation(),i.value=!0,f(e);const t=e.currentTarget;try{t.setPointerCapture(e.pointerId)}catch{}s=document.body.style.cursor,l=document.body.style.userSelect,document.body.style.cursor=c.value?"col-resize":"row-resize",document.body.style.userSelect="none",window.addEventListener("pointermove",h),window.addEventListener("pointerup",g,{once:!0}),window.addEventListener("pointercancel",g,{once:!0})}function h(e){i.value&&(e.preventDefault(),f(e))}function m(){i.value&&(i.value=!1,document.body.style.cursor=s,document.body.style.userSelect=l,window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",g),window.removeEventListener("pointercancel",g))}function y(e){const t=e.currentTarget;try{t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId)}catch{}m()}function g(){m()}return e.onBeforeUnmount(()=>{m()}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"containerRef",ref:a,class:e.normalizeClass(["hc-editor-splitter relative w-full h-full min-w-0 min-h-0",c.value?"hc-editor-splitter--horizontal flex flex-row":"hc-editor-splitter--vertical flex flex-col"]),style:{width:"100%",height:"100%"}},[e.createElementVNode("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:e.normalizeStyle(u.value)},[e.renderSlot(t.$slots,"a")],4),e.createElementVNode("div",{class:e.normalizeClass(["hc-editor-splitter-handle shrink-0 select-none",[c.value?"hc-editor-splitter-handle--horizontal":"hc-editor-splitter-handle--vertical",i.value?"hc-editor-splitter-handle--dragging":""]]),style:e.normalizeStyle(p.value),role:"separator","aria-orientation":c.value?"vertical":"horizontal",onPointerdown:v,onPointerup:y},null,46,K),e.createElementVNode("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:e.normalizeStyle(d.value)},[e.renderSlot(t.$slots,"b")],4)],2))}}),R=e.defineComponent({__name:"EditorLayout",props:{node:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","set-ratio","save","pushVersion"],setup(t,{emit:o}){const n=o;return(o,r)=>{const a=e.resolveComponent("EditorLayout",!0);return"group"===t.node.type?(e.openBlock(),e.createBlock(O,{key:0,group:t.node,"is-only":t.isOnly??!1,onActivate:r[0]||(r[0]=e=>n("activate",t.node.id,e)),onTabDrop:r[1]||(r[1]=e=>n("tab-drop",e)),onSave:r[2]||(r[2]=e=>n("save")),onPushVersion:r[3]||(r[3]=e=>n("pushVersion"))},null,8,["group","is-only"])):(e.openBlock(),e.createBlock(H,{key:1,direction:t.node.direction,ratio:t.node.ratio,"onUpdate:ratio":r[14]||(r[14]=e=>n("set-ratio",t.node.id,e))},{a:e.withCtx(()=>[e.createVNode(a,{node:t.node.a,onActivate:r[4]||(r[4]=(e,t)=>n("activate",e,t)),onTabDrop:r[5]||(r[5]=e=>n("tab-drop",e)),onSetRatio:r[6]||(r[6]=(e,t)=>n("set-ratio",e,t)),onSave:r[7]||(r[7]=e=>n("save")),onPushVersion:r[8]||(r[8]=e=>n("pushVersion"))},null,8,["node"])]),b:e.withCtx(()=>[e.createVNode(a,{node:t.node.b,onActivate:r[9]||(r[9]=(e,t)=>n("activate",e,t)),onTabDrop:r[10]||(r[10]=e=>n("tab-drop",e)),onSetRatio:r[11]||(r[11]=(e,t)=>n("set-ratio",e,t)),onSave:r[12]||(r[12]=e=>n("save")),onPushVersion:r[13]||(r[13]=e=>n("pushVersion"))},null,8,["node"])]),_:1},8,["direction","ratio"]))}}});let $=0;function A(e){return`${e}_${++$}_${Date.now().toString(36)}`}function G(e,t){return{type:"group",id:A("g"),tabs:[...e],activeTab:t??e[0]}}function q(e){return JSON.parse(JSON.stringify(e))}function J(e,t){return"group"===e.type?e.id===t?e:null:J(e.a,t)??J(e.b,t)}function U(e,t){return"group"===e.type?null:e.id===t?e:U(e.a,t)??U(e.b,t)}function Y(e,t,o){if("group"===e.type)return e.id===t?o:e;if(e.id===t)return o;const n=Y(e.a,t,o),r=Y(e.b,t,o);return n||r?n?r?{...e,a:n,b:r}:n:r:null}function W(e,t,o){const n=q(e),r=J(n,t);return r&&r.tabs.includes(o)&&(r.activeTab=o),n}function F(e,t,o){const n=q(e),r=J(n,t);if(!r)return n;const a=r.tabs.indexOf(o);return-1===a?n:(r.tabs.splice(a,1),0===r.tabs.length?"group"===n.type&&n.id===t?n:Y(n,t,null)??n:(r.activeTab===o&&(r.activeTab=r.tabs[Math.min(a,r.tabs.length-1)]),n))}function X(e,t,o,n,r,a=!1){let i=q(e);const s=J(i,n);if(!s)return i;if(t===n&&!a){const e=s.tabs.indexOf(o);if(-1===e)return i;s.tabs.splice(e,1);const t=null==r?s.tabs.length:Math.min(r,s.tabs.length);return s.tabs.splice(t,0,o),s.activeTab=o,i}if(!s.tabs.includes(o)){const e=null==r?s.tabs.length:Math.min(r,s.tabs.length);s.tabs.splice(e,0,o)}return s.activeTab=o,a||(i=F(i,t,o)),i}function Q(e,t,o,n,r,a=!1){let i=q(e);const s=J(i,n);if(!s)return i;if(t===n&&1===s.tabs.length&&s.tabs[0]===o&&!a)return i;const l=G([o],o),c="left"===r||"right"===r?"horizontal":"vertical",u={type:"split",id:A("s"),direction:c,ratio:.5,a:"right"===r||"bottom"===r?q(s):l,b:"right"===r||"bottom"===r?l:q(s)},d=Y(i,s.id,u);return d?(i=d,a||(i=F(i,t,o)),i):i}function Z(e,t,o){const n=q(e),r=U(n,t);return r&&(r.ratio=Math.max(.05,Math.min(.95,o))),n}function ee(){return G(["html","javascript","css"],"javascript")}function te(e){return"hc:draft:"+e}function oe(e){if(!e)return null;const t=localStorage.getItem(te(e));if(!t)return null;try{const e=JSON.parse(t);if("string"==typeof e.html&&"string"==typeof e.javascript&&"string"==typeof e.css&&"number"==typeof e.savedAt)return e}catch{}return null}function ne(e,t){if(!e)return null;const o={html:t.html,javascript:t.javascript,css:t.css,savedAt:Date.now()};try{return localStorage.setItem(te(e),JSON.stringify(o)),o}catch(e){return console.warn("[hc-draft] saveDraft failed:",e),null}}function re(e){e&&localStorage.removeItem(te(e))}function ae(e){const t=new BroadcastChannel(`hc-preview-${e}`);return{channel:t,send(e){t.postMessage(e)},close(){t.close()}}}function ie(...e){return d.twMerge(u.clsx(e))}const se=p.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-7 rounded-md px-2 text-xs has-[>svg]:px-1.5",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8"}},defaultVariants:{variant:"default",size:"default"}}),le=e.defineComponent({__name:"Button",props:{variant:{},size:{},class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{default:"button"}},setup(t){const o=t;return(n,r)=>(e.openBlock(),e.createBlock(e.unref(c.Primitive),{"data-slot":"button",as:t.as,"as-child":t.asChild,class:e.normalizeClass(e.unref(ie)(e.unref(se)({variant:t.variant,size:t.size}),o.class))},{default:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),ce={class:"h-full w-full flex flex-col bg-zinc-50 text-zinc-900",style:{width:"100%",height:"100%"}},ue={class:"h-11 border-b border-zinc-200 bg-white flex items-center px-4 gap-3 shrink-0"},de={key:1,class:"h-4 w-px bg-zinc-200"},pe={class:"flex items-baseline gap-2 min-w-0"},fe={key:0,class:"text-sm font-medium truncate"},ve={key:1,class:"text-[11px] text-zinc-400 tabular-nums"},he=["title"],me={key:3,class:"text-[11px] text-amber-600"},ye={key:2,class:"hc-editor-draft-pill"},ge={class:"hc-editor-draft-pill-text"},be={class:"ml-auto flex items-center gap-1.5"},xe={class:"flex items-center gap-1.5 text-[11px] text-zinc-500 select-none cursor-pointer"},we={class:"flex-1 min-h-0 p-2 bg-zinc-50"},ke={class:"w-full h-full"},Ce={class:"hc-editor-preview-pane w-full h-full bg-white border border-zinc-200 flex flex-col overflow-hidden"},Ee={class:"hc-editor-preview-header"},Se={class:"hc-editor-preview-tab"},Ve={class:"hc-editor-preview-actions"},Be={class:"flex-1 min-h-0 overflow-auto bg-white"},Ne={class:"hc-editor-preview-body min-h-full px-5 py-4"},ze={key:1,class:"w-full h-full"},Te=e.defineComponent({__name:"HyperCardEditor",props:{modelValue:{},draftKey:{},componentId:{},showBackButton:{type:Boolean,default:!1},title:{},statusLabel:{},versionStatus:{},features:{},autoPreview:{type:Boolean,default:!0},previewRatio:{default:.62},extraLibs:{}},emits:["update:modelValue","dirty","save-draft","push-version","open-preview-window","open-settings","open-history","open-diff","go-back","error"],setup(n,{expose:r,emit:a}){var i;const s=n,l=a,c=B();e.provide(N,c);const u=e.ref(!1),d=e.ref(ee()),p=e.ref(s.previewRatio),f=e.ref(!1),v=e.ref(s.autoPreview),h=e.ref(""),m=e.ref(""),y=e.ref(""),g=e.ref(null),b=(null==(i=e.getCurrentInstance())?void 0:i.uid)??Math.floor(1e9*Math.random()),V=e.computed(()=>s.componentId??s.draftKey??`__hc_editor_${b}__`),z=e.computed(()=>`editor-preview-${V.value}`),T=e.computed(()=>{var e;return(null==(e=s.versionStatus)?void 0:e.currentVersionLabel)??s.statusLabel??""}),D=e.computed(()=>{var e;return S(null==(e=s.versionStatus)?void 0:e.lastPublishedAt)}),_=e.computed(()=>k(s.features,s.versionStatus)),M=e.computed(()=>C(s.features,s.versionStatus)),L=e.computed(()=>E(s.features));let P=!1,j=null,I=null;function O(){const e=c.snapshotSources();l("update:modelValue",{html:e.html,js:e.javascript,css:e.css})}function K(e,t,o){P=!0;try{c.setSource("html",e),c.setSource("javascript",t),c.setSource("css",o)}finally{P=!1}}e.watch(()=>s.modelValue,e=>{if(!e)return;const t=c.snapshotSources();t.html===(e.html??"")&&t.javascript===(e.js??"")&&t.css===(e.css??"")||(K(e.html??"",e.js??"",e.css??""),A(),U(),u.value=!1,l("dirty",!1))},{immediate:!0});let $=null;function A(){const e=c.snapshotSources();h.value=e.html,m.value=e.javascript,y.value=e.css}function G(){$&&clearTimeout($),A()}function q(){s.draftKey&&!j&&(j=ae(s.draftKey),j.channel.addEventListener("message",e=>{const t=e.data;"hello"===t.type?(f.value=!0,J()):"goodbye"===t.type?f.value=!1:"request-sources"===t.type&&J()}))}function J(){if(!j)return;const e=c.snapshotSources();j.send({type:"sources",html:e.html,javascript:e.javascript,css:e.css})}function U(){j&&(I&&clearTimeout(I),I=setTimeout(J,200))}function Y(){s.draftKey?(ne(s.draftKey,c.snapshotSources())&&(u.value=!1,l("dirty",!1),g.value=null),l("save-draft")):l("save-draft")}function F(){const e=g.value;e&&(K(e.html,e.javascript,e.css),A(),O(),U(),g.value=null,u.value=!0,l("dirty",!0))}function te(){s.draftKey&&(re(s.draftKey),g.value=null)}function ie(e,t){d.value=W(d.value,e,t)}function se(e){"center"===e.edge?d.value=X(d.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.insertIndex,e.copy):d.value=Q(d.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.edge,e.copy)}function Te(e,t){d.value=Z(d.value,e,t)}function De(e){u.value&&(e.preventDefault(),e.returnValue="")}let _e=null;const Me=[];function Le(){q(),l("open-preview-window")}function Pe(e){const t=Date.now()-e;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)} 分钟前`:t<864e5?`${Math.floor(t/36e5)} 小时前`:new Date(e).toLocaleString()}return e.onMounted(()=>{if(s.extraLibs)for(const e of s.extraLibs)x(e),Me.push(e.filePath);_e=c.onSourceChange(()=>{P||(u.value=!0,l("dirty",!0),O(),U(),v.value&&($&&clearTimeout($),$=setTimeout(A,600)))}),s.draftKey&&(g.value=oe(s.draftKey),q()),window.addEventListener("beforeunload",De)}),e.onBeforeUnmount(()=>{null==_e||_e(),_e=null,I&&clearTimeout(I),$&&clearTimeout($),null==j||j.close(),j=null,window.removeEventListener("beforeunload",De);for(const e of Me)w(e);Me.length=0,c.dispose()}),r({isDirty:u,confirmLeave:function(){return!u.value||window.confirm("当前修改未保存,确定离开?未保存内容将丢失。")},applyDraft:function(e){K(e.html,e.javascript,e.css),A(),O(),U(),u.value=!0,l("dirty",!0)},manualPreview:G,applyPreview:A}),(r,a)=>{var i;return e.openBlock(),e.createElementBlock("div",ce,[e.createElementVNode("header",ue,[n.showBackButton?(e.openBlock(),e.createBlock(e.unref(le),{key:0,variant:"ghost",size:"sm",onClick:a[0]||(a[0]=e=>l("go-back"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.ArrowLeft),{size:14}),a[9]||(a[9]=e.createTextVNode(" 返回 ",-1))]),_:1})):e.createCommentVNode("",!0),n.showBackButton?(e.openBlock(),e.createElementBlock("span",de)):e.createCommentVNode("",!0),e.createElementVNode("div",pe,[n.title?(e.openBlock(),e.createElementBlock("h1",fe,e.toDisplayString(n.title),1)):e.createCommentVNode("",!0),T.value?(e.openBlock(),e.createElementBlock("span",ve,e.toDisplayString(T.value),1)):e.createCommentVNode("",!0),D.value?(e.openBlock(),e.createElementBlock("span",{key:2,class:"text-[11px] text-zinc-400",title:null==(i=n.versionStatus)?void 0:i.lastPublishedAt}," · 上次发布 "+e.toDisplayString(D.value),9,he)):e.createCommentVNode("",!0),u.value?(e.openBlock(),e.createElementBlock("span",me,"●未保存")):e.createCommentVNode("",!0)]),g.value?(e.openBlock(),e.createElementBlock("div",ye,[a[10]||(a[10]=e.createElementVNode("span",{class:"hc-editor-draft-pill-dot"},null,-1)),e.createElementVNode("span",ge," 本地草稿 · "+e.toDisplayString(Pe(g.value.savedAt))+"保存 ",1),e.createElementVNode("button",{type:"button",class:"hc-editor-draft-pill-action hc-editor-draft-pill-action--primary",onClick:F}," 恢复 "),e.createElementVNode("button",{type:"button",class:"hc-editor-draft-pill-action",onClick:te}," 丢弃 ")])):e.createCommentVNode("",!0),e.createElementVNode("div",be,[e.createElementVNode("label",xe,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":a[1]||(a[1]=e=>v.value=e),type:"checkbox",class:"h-3 w-3 rounded border-zinc-300 text-zinc-900 focus:ring-0"},null,512),[[e.vModelCheckbox,v.value]]),a[11]||(a[11]=e.createTextVNode(" 自动预览 ",-1))]),M.value?(e.openBlock(),e.createBlock(e.unref(le),{key:0,variant:"ghost",size:"xs",title:"查看当前改动",onClick:a[2]||(a[2]=e=>l("open-diff"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.GitCompare),{size:13}),a[12]||(a[12]=e.createTextVNode(" 看改动 ",-1))]),_:1})):e.createCommentVNode("",!0),_.value?(e.openBlock(),e.createBlock(e.unref(le),{key:1,variant:"ghost",size:"xs",title:"历史版本",onClick:a[3]||(a[3]=e=>l("open-history"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.History),{size:13}),a[13]||(a[13]=e.createTextVNode(" 历史版本 ",-1))]),_:1})):e.createCommentVNode("",!0),e.createVNode(e.unref(le),{variant:"ghost",size:"icon-sm",title:"组件设置",onClick:a[4]||(a[4]=e=>l("open-settings"))},{default:e.withCtx(()=>[e.createVNode(e.unref(t.Settings),{size:14})]),_:1}),e.createVNode(e.unref(le),{variant:"outline",size:"xs",onClick:Y},{default:e.withCtx(()=>[...a[14]||(a[14]=[e.createTextVNode(" 保存草稿 ",-1)])]),_:1}),L.value?(e.openBlock(),e.createBlock(e.unref(le),{key:2,variant:"default",size:"xs",onClick:a[5]||(a[5]=e=>l("push-version"))},{default:e.withCtx(()=>[...a[15]||(a[15]=[e.createTextVNode(" 推版本 ",-1)])]),_:1})):e.createCommentVNode("",!0)])]),e.createElementVNode("div",we,[f.value?(e.openBlock(),e.createElementBlock("div",ze,[e.createVNode(R,{node:d.value,"is-only":"group"===d.value.type,onActivate:ie,onTabDrop:se,onSetRatio:Te,onSave:Y,onPushVersion:a[8]||(a[8]=e=>l("push-version"))},null,8,["node","is-only"]),a[18]||(a[18]=e.createElementVNode("div",{class:"fixed bottom-3 right-3 bg-zinc-900 text-white text-[11px] px-3 py-1.5 rounded-md shadow-md flex items-center gap-2"},[e.createElementVNode("span",{class:"h-1.5 w-1.5 rounded-full bg-emerald-400"}),e.createTextVNode(" 预览已脱出 · 关闭独立窗口可恢复 ")],-1))])):(e.openBlock(),e.createBlock(H,{key:0,direction:"horizontal",ratio:p.value,"onUpdate:ratio":a[7]||(a[7]=e=>p.value=e)},{a:e.withCtx(()=>[e.createElementVNode("div",ke,[e.createVNode(R,{node:d.value,"is-only":"group"===d.value.type,onActivate:ie,onTabDrop:se,onSetRatio:Te,onSave:Y,onPushVersion:a[6]||(a[6]=e=>l("push-version"))},null,8,["node","is-only"])])]),b:e.withCtx(()=>[e.createElementVNode("div",Ce,[e.createElementVNode("div",Ee,[e.createElementVNode("div",Se,[a[16]||(a[16]=e.createElementVNode("span",{class:"hc-editor-preview-title"},"预览",-1)),e.createElementVNode("button",{type:"button",class:"hc-editor-icon-button hc-editor-preview-icon-button",title:"独立窗口预览",onClick:Le},[e.createVNode(e.unref(t.ExternalLink),{size:13})])]),e.createElementVNode("div",Ve,[v.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"hc-editor-preview-refresh",onClick:G},[e.createVNode(e.unref(t.RefreshCw),{size:12}),a[17]||(a[17]=e.createTextVNode(" 重新渲染 ",-1))]))])]),e.createElementVNode("div",Be,[e.createElementVNode("div",Ne,[e.createVNode(e.unref(o.RuntimeBox),{"instance-id":z.value,"component-id":`user-${V.value}`,"html-source":h.value,"js-source":m.value,"css-source":y.value},null,8,["instance-id","component-id","html-source","js-source","css-source"])])])])]),_:1},8,["ratio"]))])])}}});exports.Button=le,exports.EDITOR_SCOPE_KEY=N,exports.EditorGroup=O,exports.EditorLayout=R,exports.HyperCardEditor=Te,exports.MonacoEditor=D,exports.SOURCE_KEY_LABEL=T,exports.Splitter=H,exports.VERSION="0.0.0-stage3",exports.activateTab=W,exports.addMonacoExtraLib=function(e){x(e)},exports.buttonVariants=se,exports.clearDraft=re,exports.closeTab=F,exports.createEditorScope=B,exports.createPreviewBus=ae,exports.defaultLayout=ee,exports.formatLastPublished=S,exports.formatRelative=function(e){const t=Date.now()-e,o=Math.floor(t/6e4);if(o<1)return"刚刚";if(o<60)return`${o} 分钟前`;const n=Math.floor(o/60);return n<24?`${n} 小时前`:`${Math.floor(n/24)} 天前`},exports.loadDraft=oe,exports.moveTab=X,exports.releaseMonacoExtraLib=w,exports.removeMonacoExtraLib=function(e){w(e)},exports.retainMonacoExtraLib=x,exports.saveDraft=ne,exports.setSplitRatio=Z,exports.setupHyperCardMonacoTypes=y,exports.shouldShowDiffEntry=C,exports.shouldShowHistoryEntry=k,exports.shouldShowPublishEntry=E,exports.splitWithTab=Q,exports.useEditorScope=z;
|
package/dist/index.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ direction: "horizontal" | "vertical";
|
|
|
21
21
|
handleSize: number;
|
|
22
22
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {
|
|
23
23
|
containerRef: HTMLDivElement;
|
|
24
|
-
},
|
|
24
|
+
}, any>;
|
|
25
25
|
|
|
26
26
|
declare const __VLS_component_2: DefineComponent<Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Props> & Readonly<{}>, {
|
|
27
27
|
as: AsTag | Component;
|
|
@@ -74,7 +74,7 @@ declare function __VLS_template(): {
|
|
|
74
74
|
refs: {
|
|
75
75
|
containerRef: HTMLDivElement;
|
|
76
76
|
};
|
|
77
|
-
rootEl:
|
|
77
|
+
rootEl: any;
|
|
78
78
|
};
|
|
79
79
|
|
|
80
80
|
declare function __VLS_template_2(): {
|
|
@@ -158,7 +158,7 @@ onSave?: (() => any) | undefined;
|
|
|
158
158
|
onPushVersion?: (() => any) | undefined;
|
|
159
159
|
onActivate?: ((tab: SourceKey) => any) | undefined;
|
|
160
160
|
"onTab-drop"?: ((payload: TabDropPayload) => any) | undefined;
|
|
161
|
-
}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {},
|
|
161
|
+
}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
|
|
162
162
|
|
|
163
163
|
export declare const EditorLayout: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
|
|
164
164
|
save: () => any;
|
|
@@ -215,7 +215,7 @@ applyPreview: typeof applyPreview;
|
|
|
215
215
|
showBackButton: boolean;
|
|
216
216
|
autoPreview: boolean;
|
|
217
217
|
previewRatio: number;
|
|
218
|
-
}, {}, {}, {}, string, ComponentProvideOptions, false, {},
|
|
218
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
|
|
219
219
|
|
|
220
220
|
export declare type LayoutNode = GroupNode | SplitNode;
|
|
221
221
|
|
|
@@ -242,7 +242,7 @@ fontSize: number;
|
|
|
242
242
|
minimap: boolean;
|
|
243
243
|
}, {}, {}, {}, string, ComponentProvideOptions, false, {
|
|
244
244
|
containerRef: HTMLDivElement;
|
|
245
|
-
},
|
|
245
|
+
}, any>;
|
|
246
246
|
|
|
247
247
|
export declare function moveTab(root: LayoutNode, sourceGroupId: string, tab: SourceKey, targetGroupId: string, insertIndex: number | null, copy?: boolean): LayoutNode;
|
|
248
248
|
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{inject as e,defineComponent as t,ref as n,shallowRef as o,onMounted as r,onBeforeUnmount as a,watch as i,openBlock as s,createElementBlock as l,computed as u,createElementVNode as c,Fragment as d,renderList as p,normalizeClass as v,createCommentVNode as f,toDisplayString as h,unref as m,createBlock as g,normalizeStyle as b,renderSlot as y,resolveComponent as w,withCtx as x,createVNode as k,provide as S,getCurrentInstance as z,createTextVNode as C,withDirectives as T,vModelCheckbox as D}from"vue";import{ArrowLeft as _,GitCompare as M,History as E,Settings as L,ExternalLink as P,RefreshCw as j}from"lucide-vue-next";import{RuntimeBox as I}from"@hy-bricks/core";import*as B from"monaco-editor";import{typescript as K}from"monaco-editor";import O from"monaco-editor/esm/vs/editor/editor.worker?worker";import V from"monaco-editor/esm/vs/language/json/json.worker?worker";import H from"monaco-editor/esm/vs/language/css/css.worker?worker";import $ from"monaco-editor/esm/vs/language/html/html.worker?worker";import A from"monaco-editor/esm/vs/language/typescript/ts.worker?worker";import{Primitive as R}from"reka-ui";import{clsx as G}from"clsx";import{twMerge as N}from"tailwind-merge";import{cva as J}from"class-variance-authority";const U="\n// HyperCard 运行时全局类型 — 由 @hy-bricks/editor 注入到 Monaco\n\ndeclare const __HYPERCARD__: HyperCardInstance | undefined\n\ninterface HyperCardInstance {\n /** 宿主通过 createHyperCard({ libs: { ... } }) 注入的库 / 函数 / 常量 */\n libs: HyperCardLibs\n /** 跨实例运行时 SDK */\n runtime: HyperCardRuntime\n /** 资源 / 短链辅助 */\n assets: HyperCardAssets\n /** SDK 实例版本 */\n version: string\n}\n\n/**\n * 默认 libs 是开放命名空间。宿主补具体类型(axios / EP 等)时,在自己的 d.ts\n * extraLib 里 `interface HyperCardLibs { http: ...; ui: ... }` 声明合并。\n */\ninterface HyperCardLibs {\n [key: string]: any\n}\n\ninterface HyperCardRuntime {\n /** 调另一个组件实例的非钩子方法,同步;实例不存在返 undefined */\n call<T = unknown>(id: string, method: string, ...args: unknown[]): T | undefined\n /** 监听另一个实例的事件,返回 unsubscribe 函数;实例不存在返 undefined */\n on(id: string, event: string, handler: (payload: unknown) => void): (() => void) | undefined\n /** 在另一个实例上发事件 */\n emit(id: string, event: string, payload?: unknown): void\n /** 列出当前页面所有实例,可按 componentId 过滤 */\n listInstances(filter?: { componentId?: string }): HyperCardInstanceHandle[]\n /** 拿到指定 instanceId 的 handle */\n getInstance(id: string): HyperCardInstanceHandle | null\n}\n\ninterface HyperCardInstanceHandle {\n readonly instanceId: string\n readonly componentId: string\n call<T = unknown>(method: string, ...args: unknown[]): T | undefined\n on(event: string, handler: (payload: unknown) => void): () => void\n emit(event: string, payload?: unknown): void\n}\n\ninterface HyperCardAssets {\n /** 拼短链:'/a/<id>' */\n pickerUrl(id: string): string\n}\n",Y="file:///hypercard-globals.d.ts";let W=!1;function F(){var e,t;if(W)return;W=!0,K.javascriptDefaults.addExtraLib(U,Y),K.typescriptDefaults.addExtraLib(U,Y),"undefined"!=typeof globalThis&&globalThis.__HYPERCARD_DEBUG__&&console.info("[hypercard][monaco-types] HyperCard globals 注入完成,extra libs =",Object.keys((null==(t=(e=K.javascriptDefaults).getExtraLibs)?void 0:t.call(e))??{}));const n={target:K.ScriptTarget.Latest,allowNonTsExtensions:!0,moduleResolution:K.ModuleResolutionKind.NodeJs,module:K.ModuleKind.ESNext,noEmit:!0,esModuleInterop:!0,allowJs:!0,checkJs:!1};K.javascriptDefaults.setCompilerOptions(n),K.typescriptDefaults.setCompilerOptions(n)}const X=new Map;function q(){const e=[{filePath:Y,content:U},...Array.from(X.entries()).map(([e,{content:t}])=>({filePath:e,content:t}))];K.javascriptDefaults.setExtraLibs(e),K.typescriptDefaults.setExtraLibs(e)}function Q(e){const t=X.get(e.filePath);if(t)return t.count++,void(t.content!==e.content&&console.warn(`[hypercard] extraLib "${e.filePath}" 多次注册但 content 不一致;保留先注册的版本。如需独立内容,请用不同 filePath。`));X.set(e.filePath,{content:e.content,count:1}),q()}function Z(e){const t=X.get(e);t&&(t.count--,t.count<=0&&(X.delete(e),q()))}function ee(e){Q(e)}function te(e){Z(e)}function ne(e,t){return Boolean(null==e?void 0:e.showHistory)&&!0===(null==t?void 0:t.hasHistory)}function oe(e,t){return Boolean(null==e?void 0:e.showDiff)&&!0===(null==t?void 0:t.hasHistory)&&Boolean(null==t?void 0:t.currentVersionLabel)}function re(e){return!1!==(null==e?void 0:e.enablePublish)}function ae(e,t=new Date){if(!e)return null;const n=Date.parse(e);if(Number.isNaN(n))return null;const o=t.getTime()-n;return o<6e4?"刚刚":o<36e5?`${Math.floor(o/6e4)} 分钟前`:o<864e5?`${Math.floor(o/36e5)} 小时前`:o<2592e6?`${Math.floor(o/864e5)} 天前`:new Date(n).toLocaleDateString()}const ie=["html","javascript","css"];function se(){let e=null,t=[];function n(){if(e)return e;e={html:B.editor.createModel("","html"),javascript:B.editor.createModel("","javascript"),css:B.editor.createModel("","css")};for(const n of ie)e[n].onDidChangeContent(()=>{for(const e of t)e(n)});return e}return{useModels:n,getSource:e=>n()[e].getValue(),setSource(e,t){const o=n()[e];o.getValue()!==t&&o.setValue(t)},snapshotSources(){const e=n();return{html:e.html.getValue(),javascript:e.javascript.getValue(),css:e.css.getValue()}},onSourceChange:e=>(n(),t.push(e),()=>{t=t.filter(t=>t!==e)}),dispose(){if(e){for(const t of ie)e[t].dispose();e=null,t=[]}}}}const le=Symbol("hc-editor-scope");function ue(){const t=e(le);if(!t)throw new Error("[hypercard] useEditorScope 必须在 <HyperCardEditor> 内使用。组件作者:不要直接挂 MonacoEditor / EditorGroup 等内部组件。");return t}const ce={html:"index.html",javascript:"component.js",css:"styles.css"},de=t({__name:"MonacoEditor",props:{sourceKey:{},readOnly:{type:Boolean,default:!1},theme:{default:"vs"},fontSize:{default:13},minimap:{type:Boolean,default:!1}},emits:["save","pushVersion"],setup(e,{emit:t}){globalThis.__HC_MONACO_BOOTSTRAPPED__||(self.MonacoEnvironment={getWorker:(e,t)=>"json"===t?new V:"css"===t||"scss"===t||"less"===t?new H:"html"===t||"handlebars"===t||"razor"===t?new $:"typescript"===t||"javascript"===t?new A:new O},globalThis.__HC_MONACO_BOOTSTRAPPED__=!0),F();const u=e,c=t,d=n(null),p=o(null),v=ue();return r(()=>{if(!d.value)return;const e=v.useModels(),t=B.editor.create(d.value,{model:e[u.sourceKey],readOnly:u.readOnly,theme:u.theme,fontSize:u.fontSize,fontFamily:"JetBrains Mono, SF Mono, Menlo, Consolas, Liberation Mono, monospace",lineNumbers:"on",minimap:{enabled:u.minimap},automaticLayout:!0,tabSize:2,insertSpaces:!0,scrollBeyondLastLine:!1,smoothScrolling:!0,renderWhitespace:"selection",wordWrap:"on",padding:{top:8,bottom:8}});p.value=t,t.addCommand(B.KeyMod.CtrlCmd|B.KeyCode.KeyS,()=>c("save")),t.addCommand(B.KeyMod.CtrlCmd|B.KeyMod.Shift|B.KeyCode.KeyS,()=>c("pushVersion"))}),a(()=>{var e;null==(e=p.value)||e.dispose(),p.value=null}),i(()=>u.sourceKey,e=>{const t=p.value;if(!t)return;const n=v.useModels();t.setModel(n[e])}),i(()=>u.readOnly,e=>{var t;return null==(t=p.value)?void 0:t.updateOptions({readOnly:e})}),(e,t)=>(s(),l("div",{ref_key:"containerRef",ref:d,class:"w-full h-full"},null,512))}}),pe={class:"hc-editor-tabs h-8 border-b border-zinc-200 flex items-end text-xs shrink-0 overflow-x-auto overflow-y-hidden"},ve=["onClick","onDragstart","onDragover","onDrop"],fe={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},he={class:"font-mono text-[11px] leading-none truncate"},me={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},ge={key:1,class:"absolute inset-0 grid place-items-center text-xs text-zinc-400"},be=t({__name:"EditorGroup",props:{group:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","save","pushVersion"],setup(e,{emit:t}){const o=e,r=t,a=n(null),i=n(null),b=n(null);function y(e){var t;return Array.from((null==(t=e.dataTransfer)?void 0:t.types)??[]).includes("application/x-hc-tab")}function w(e){e.dataTransfer&&(e.dataTransfer.dropEffect=e.altKey||e.metaKey?"copy":"move")}function x(){a.value=null,i.value=null,b.value=null}function k(e){var t;const n=null==(t=e.dataTransfer)?void 0:t.getData("application/x-hc-tab");if(!n)return null;try{const e=JSON.parse(n);return"string"==typeof e.sourceGroupId&&"string"==typeof e.sourceTab?e:null}catch{return null}}function S(e){if(!y(e))return;e.preventDefault(),e.stopPropagation(),w(e);const t=e.currentTarget;a.value=function(e,t){const n=t.getBoundingClientRect(),o=(e.clientX-n.left)/n.width,r=(e.clientY-n.top)/n.height;return r<.22?"top":r>.78?"bottom":o<.5?"left":"right"}(e,t),i.value=null}function z(e){const t=e.currentTarget,n=e.relatedTarget;n&&t.contains(n)||x()}function C(e){if(!y(e))return;e.preventDefault(),e.stopPropagation();const t=k(e),n=a.value;x(),t&&n&&"center"!==n&&r("tab-drop",{sourceGroupId:t.sourceGroupId,sourceTab:t.sourceTab,targetGroupId:o.group.id,edge:n,insertIndex:null,copy:e.altKey||e.metaKey})}function T(e,t){y(e)&&(e.preventDefault(),w(e),a.value="center",i.value=t,e.stopPropagation())}function D(e,t){if(!y(e))return;e.preventDefault(),e.stopPropagation();const n=k(e);x(),n&&r("tab-drop",{sourceGroupId:n.sourceGroupId,sourceTab:n.sourceTab,targetGroupId:o.group.id,edge:"center",insertIndex:t,copy:e.altKey||e.metaKey})}const _=u(()=>{switch(a.value){case"left":return"hc-editor-drop-overlay--left";case"right":return"hc-editor-drop-overlay--right";case"top":return"hc-editor-drop-overlay--top";case"bottom":return"hc-editor-drop-overlay--bottom";default:return""}});return(t,n)=>(s(),l("div",{class:"hc-editor-group relative w-full h-full flex flex-col bg-white border border-zinc-200 overflow-hidden",onDragleave:z,onDragendCapture:x},[c("div",pe,[(s(!0),l(d,null,p(e.group.tabs,(t,n)=>(s(),l("div",{key:t+"-"+n,draggable:!0,class:v(["hc-editor-tab h-7 min-w-0 px-3 flex items-center gap-1.5 border-r border-zinc-200 transition-colors cursor-pointer select-none relative",[e.group.activeTab===t?"hc-editor-tab--active bg-white text-zinc-950 border-t-2 border-t-zinc-900 border-b border-b-white":"text-zinc-500 hover:text-zinc-900 hover:bg-zinc-50",b.value===t?"hc-editor-tab--dragging opacity-45":""]]),onClick:e=>r("activate",t),onDragstart:e=>function(e,t){e.dataTransfer&&(b.value=t,e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("application/x-hc-tab",JSON.stringify({sourceGroupId:o.group.id,sourceTab:t})),e.dataTransfer.setData("text/plain",ce[t]))}(e,t),onDragover:e=>T(e,n),onDrop:e=>D(e,n)},["center"===a.value&&i.value===n?(s(),l("span",fe)):f("",!0),c("span",he,h(m(ce)[t]),1)],42,ve))),128)),c("div",{class:"hc-editor-tab-tail flex-1 relative min-w-6",onDragover:n[0]||(n[0]=t=>T(t,e.group.tabs.length)),onDrop:n[1]||(n[1]=t=>D(t,e.group.tabs.length))},["center"===a.value&&i.value===e.group.tabs.length?(s(),l("span",me)):f("",!0)],32)]),c("div",{class:"flex-1 min-h-0 relative",onDragoverCapture:S,onDropCapture:C},[e.group.tabs.length>0?(s(),g(de,{key:0,"source-key":e.group.activeTab,onSave:n[2]||(n[2]=e=>r("save")),onPushVersion:n[3]||(n[3]=e=>r("pushVersion"))},null,8,["source-key"])):(s(),l("div",ge," 把 tab 拖到这里打开 ")),a.value?(s(),l("div",{key:2,class:v(["hc-editor-drop-overlay pointer-events-none absolute z-50 bg-blue-500/15 border-2 border-blue-500 ring-2 ring-blue-500/20 transition-all",_.value])},null,2)):f("",!0)],32)],32))}}),ye=["aria-orientation"],we=t({__name:"Splitter",props:{direction:{default:"horizontal"},ratio:{},handleSize:{default:6}},emits:["update:ratio"],setup(e,{emit:t}){const o=e,r=t,i=n(null),d=n(!1);let p="",f="";const h=u(()=>"horizontal"===o.direction),m=u(()=>(h.value,{flexBasis:`calc(${100*o.ratio}% - ${o.handleSize/2}px)`})),g=u(()=>(h.value,{flexBasis:`calc(${100*(1-o.ratio)}% - ${o.handleSize/2}px)`})),w=u(()=>h.value?{flexBasis:`${o.handleSize}px`,width:`${o.handleSize}px`}:{flexBasis:`${o.handleSize}px`,height:`${o.handleSize}px`});function x(e){if(!i.value)return;const t=i.value.getBoundingClientRect(),n=h.value?(e.clientX-t.left)/t.width:(e.clientY-t.top)/t.height;r("update:ratio",Math.max(.08,Math.min(.92,n)))}function k(e){e.preventDefault(),e.stopPropagation(),d.value=!0,x(e);const t=e.currentTarget;try{t.setPointerCapture(e.pointerId)}catch{}p=document.body.style.cursor,f=document.body.style.userSelect,document.body.style.cursor=h.value?"col-resize":"row-resize",document.body.style.userSelect="none",window.addEventListener("pointermove",S),window.addEventListener("pointerup",T,{once:!0}),window.addEventListener("pointercancel",T,{once:!0})}function S(e){d.value&&(e.preventDefault(),x(e))}function z(){d.value&&(d.value=!1,document.body.style.cursor=p,document.body.style.userSelect=f,window.removeEventListener("pointermove",S),window.removeEventListener("pointerup",T),window.removeEventListener("pointercancel",T))}function C(e){const t=e.currentTarget;try{t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId)}catch{}z()}function T(){z()}return a(()=>{z()}),(e,t)=>(s(),l("div",{ref_key:"containerRef",ref:i,class:v(["hc-editor-splitter relative w-full h-full min-w-0 min-h-0",h.value?"hc-editor-splitter--horizontal flex flex-row":"hc-editor-splitter--vertical flex flex-col"])},[c("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:b(m.value)},[y(e.$slots,"a")],4),c("div",{class:v(["hc-editor-splitter-handle shrink-0 select-none",[h.value?"hc-editor-splitter-handle--horizontal":"hc-editor-splitter-handle--vertical",d.value?"hc-editor-splitter-handle--dragging":""]]),style:b(w.value),role:"separator","aria-orientation":h.value?"vertical":"horizontal",onPointerdown:k,onPointerup:C},null,46,ye),c("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:b(g.value)},[y(e.$slots,"b")],4)],2))}}),xe=t({__name:"EditorLayout",props:{node:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","set-ratio","save","pushVersion"],setup(e,{emit:t}){const n=t;return(t,o)=>{const r=w("EditorLayout",!0);return"group"===e.node.type?(s(),g(be,{key:0,group:e.node,"is-only":e.isOnly??!1,onActivate:o[0]||(o[0]=t=>n("activate",e.node.id,t)),onTabDrop:o[1]||(o[1]=e=>n("tab-drop",e)),onSave:o[2]||(o[2]=e=>n("save")),onPushVersion:o[3]||(o[3]=e=>n("pushVersion"))},null,8,["group","is-only"])):(s(),g(we,{key:1,direction:e.node.direction,ratio:e.node.ratio,"onUpdate:ratio":o[14]||(o[14]=t=>n("set-ratio",e.node.id,t))},{a:x(()=>[k(r,{node:e.node.a,onActivate:o[4]||(o[4]=(e,t)=>n("activate",e,t)),onTabDrop:o[5]||(o[5]=e=>n("tab-drop",e)),onSetRatio:o[6]||(o[6]=(e,t)=>n("set-ratio",e,t)),onSave:o[7]||(o[7]=e=>n("save")),onPushVersion:o[8]||(o[8]=e=>n("pushVersion"))},null,8,["node"])]),b:x(()=>[k(r,{node:e.node.b,onActivate:o[9]||(o[9]=(e,t)=>n("activate",e,t)),onTabDrop:o[10]||(o[10]=e=>n("tab-drop",e)),onSetRatio:o[11]||(o[11]=(e,t)=>n("set-ratio",e,t)),onSave:o[12]||(o[12]=e=>n("save")),onPushVersion:o[13]||(o[13]=e=>n("pushVersion"))},null,8,["node"])]),_:1},8,["direction","ratio"]))}}});let ke=0;function Se(e){return`${e}_${++ke}_${Date.now().toString(36)}`}function ze(e,t){return{type:"group",id:Se("g"),tabs:[...e],activeTab:t??e[0]}}function Ce(e){return JSON.parse(JSON.stringify(e))}function Te(e,t){return"group"===e.type?e.id===t?e:null:Te(e.a,t)??Te(e.b,t)}function De(e,t){return"group"===e.type?null:e.id===t?e:De(e.a,t)??De(e.b,t)}function _e(e,t,n){if("group"===e.type)return e.id===t?n:e;if(e.id===t)return n;const o=_e(e.a,t,n),r=_e(e.b,t,n);return o||r?o?r?{...e,a:o,b:r}:o:r:null}function Me(e,t,n){const o=Ce(e),r=Te(o,t);return r&&r.tabs.includes(n)&&(r.activeTab=n),o}function Ee(e,t,n){const o=Ce(e),r=Te(o,t);if(!r)return o;const a=r.tabs.indexOf(n);return-1===a?o:(r.tabs.splice(a,1),0===r.tabs.length?"group"===o.type&&o.id===t?o:_e(o,t,null)??o:(r.activeTab===n&&(r.activeTab=r.tabs[Math.min(a,r.tabs.length-1)]),o))}function Le(e,t,n,o,r,a=!1){let i=Ce(e);const s=Te(i,o);if(!s)return i;if(t===o&&!a){const e=s.tabs.indexOf(n);if(-1===e)return i;s.tabs.splice(e,1);const t=null==r?s.tabs.length:Math.min(r,s.tabs.length);return s.tabs.splice(t,0,n),s.activeTab=n,i}if(!s.tabs.includes(n)){const e=null==r?s.tabs.length:Math.min(r,s.tabs.length);s.tabs.splice(e,0,n)}return s.activeTab=n,a||(i=Ee(i,t,n)),i}function Pe(e,t,n,o,r,a=!1){let i=Ce(e);const s=Te(i,o);if(!s)return i;if(t===o&&1===s.tabs.length&&s.tabs[0]===n&&!a)return i;const l=ze([n],n),u="left"===r||"right"===r?"horizontal":"vertical",c={type:"split",id:Se("s"),direction:u,ratio:.5,a:"right"===r||"bottom"===r?Ce(s):l,b:"right"===r||"bottom"===r?l:Ce(s)},d=_e(i,s.id,c);return d?(i=d,a||(i=Ee(i,t,n)),i):i}function je(e,t,n){const o=Ce(e),r=De(o,t);return r&&(r.ratio=Math.max(.05,Math.min(.95,n))),o}function Ie(){return ze(["html","javascript","css"],"javascript")}function Be(e){return"hc:draft:"+e}function Ke(e){if(!e)return null;const t=localStorage.getItem(Be(e));if(!t)return null;try{const e=JSON.parse(t);if("string"==typeof e.html&&"string"==typeof e.javascript&&"string"==typeof e.css&&"number"==typeof e.savedAt)return e}catch{}return null}function Oe(e,t){if(!e)return null;const n={html:t.html,javascript:t.javascript,css:t.css,savedAt:Date.now()};try{return localStorage.setItem(Be(e),JSON.stringify(n)),n}catch(e){return console.warn("[hc-draft] saveDraft failed:",e),null}}function Ve(e){e&&localStorage.removeItem(Be(e))}function He(e){const t=Date.now()-e,n=Math.floor(t/6e4);if(n<1)return"刚刚";if(n<60)return`${n} 分钟前`;const o=Math.floor(n/60);return o<24?`${o} 小时前`:`${Math.floor(o/24)} 天前`}function $e(e){const t=new BroadcastChannel(`hc-preview-${e}`);return{channel:t,send(e){t.postMessage(e)},close(){t.close()}}}function Ae(...e){return N(G(e))}const Re=J("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-7 rounded-md px-2 text-xs has-[>svg]:px-1.5",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8"}},defaultVariants:{variant:"default",size:"default"}}),Ge=t({__name:"Button",props:{variant:{},size:{},class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e;return(n,o)=>(s(),g(m(R),{"data-slot":"button",as:e.as,"as-child":e.asChild,class:v(m(Ae)(m(Re)({variant:e.variant,size:e.size}),t.class))},{default:x(()=>[y(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),Ne={class:"h-full w-full flex flex-col bg-zinc-50 text-zinc-900"},Je={class:"h-11 border-b border-zinc-200 bg-white flex items-center px-4 gap-3 shrink-0"},Ue={key:1,class:"h-4 w-px bg-zinc-200"},Ye={class:"flex items-baseline gap-2 min-w-0"},We={key:0,class:"text-sm font-medium truncate"},Fe={key:1,class:"text-[11px] text-zinc-400 tabular-nums"},Xe=["title"],qe={key:3,class:"text-[11px] text-amber-600"},Qe={key:2,class:"hc-editor-draft-pill"},Ze={class:"hc-editor-draft-pill-text"},et={class:"ml-auto flex items-center gap-1.5"},tt={class:"flex items-center gap-1.5 text-[11px] text-zinc-500 select-none cursor-pointer"},nt={class:"flex-1 min-h-0 p-2 bg-zinc-50"},ot={class:"w-full h-full"},rt={class:"hc-editor-preview-pane w-full h-full bg-white border border-zinc-200 flex flex-col overflow-hidden"},at={class:"hc-editor-preview-header"},it={class:"hc-editor-preview-tab"},st={class:"hc-editor-preview-actions"},lt={class:"flex-1 min-h-0 overflow-auto bg-white"},ut={class:"hc-editor-preview-body min-h-full px-5 py-4"},ct={key:1,class:"w-full h-full"},dt=t({__name:"HyperCardEditor",props:{modelValue:{},draftKey:{},componentId:{},showBackButton:{type:Boolean,default:!1},title:{},statusLabel:{},versionStatus:{},features:{},autoPreview:{type:Boolean,default:!0},previewRatio:{default:.62},extraLibs:{}},emits:["update:modelValue","dirty","save-draft","push-version","open-preview-window","open-settings","open-history","open-diff","go-back","error"],setup(e,{expose:t,emit:o}){var d;const p=e,v=o,b=se();S(le,b);const y=n(!1),w=n(Ie()),B=n(p.previewRatio),K=n(!1),O=n(p.autoPreview),V=n(""),H=n(""),$=n(""),A=n(null),R=(null==(d=z())?void 0:d.uid)??Math.floor(1e9*Math.random()),G=u(()=>p.componentId??p.draftKey??`__hc_editor_${R}__`),N=u(()=>`editor-preview-${G.value}`),J=u(()=>{var e;return(null==(e=p.versionStatus)?void 0:e.currentVersionLabel)??p.statusLabel??""}),U=u(()=>{var e;return ae(null==(e=p.versionStatus)?void 0:e.lastPublishedAt)}),Y=u(()=>ne(p.features,p.versionStatus)),W=u(()=>oe(p.features,p.versionStatus)),F=u(()=>re(p.features));let X=!1,q=null,ee=null;function te(){const e=b.snapshotSources();v("update:modelValue",{html:e.html,js:e.javascript,css:e.css})}function ie(e,t,n){X=!0;try{b.setSource("html",e),b.setSource("javascript",t),b.setSource("css",n)}finally{X=!1}}i(()=>p.modelValue,e=>{if(!e)return;const t=b.snapshotSources();t.html===(e.html??"")&&t.javascript===(e.js??"")&&t.css===(e.css??"")||(ie(e.html??"",e.js??"",e.css??""),ce(),fe(),y.value=!1,v("dirty",!1))},{immediate:!0});let ue=null;function ce(){const e=b.snapshotSources();V.value=e.html,H.value=e.javascript,$.value=e.css}function de(){ue&&clearTimeout(ue),ce()}function pe(){p.draftKey&&!q&&(q=$e(p.draftKey),q.channel.addEventListener("message",e=>{const t=e.data;"hello"===t.type?(K.value=!0,ve()):"goodbye"===t.type?K.value=!1:"request-sources"===t.type&&ve()}))}function ve(){if(!q)return;const e=b.snapshotSources();q.send({type:"sources",html:e.html,javascript:e.javascript,css:e.css})}function fe(){q&&(ee&&clearTimeout(ee),ee=setTimeout(ve,200))}function he(){p.draftKey?(Oe(p.draftKey,b.snapshotSources())&&(y.value=!1,v("dirty",!1),A.value=null),v("save-draft")):v("save-draft")}function me(){const e=A.value;e&&(ie(e.html,e.javascript,e.css),ce(),te(),fe(),A.value=null,y.value=!0,v("dirty",!0))}function ge(){p.draftKey&&(Ve(p.draftKey),A.value=null)}function be(e,t){w.value=Me(w.value,e,t)}function ye(e){"center"===e.edge?w.value=Le(w.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.insertIndex,e.copy):w.value=Pe(w.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.edge,e.copy)}function ke(e,t){w.value=je(w.value,e,t)}function Se(e){y.value&&(e.preventDefault(),e.returnValue="")}let ze=null;const Ce=[];function Te(){pe(),v("open-preview-window")}function De(e){const t=Date.now()-e;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)} 分钟前`:t<864e5?`${Math.floor(t/36e5)} 小时前`:new Date(e).toLocaleString()}return r(()=>{if(p.extraLibs)for(const e of p.extraLibs)Q(e),Ce.push(e.filePath);ze=b.onSourceChange(()=>{X||(y.value=!0,v("dirty",!0),te(),fe(),O.value&&(ue&&clearTimeout(ue),ue=setTimeout(ce,600)))}),p.draftKey&&(A.value=Ke(p.draftKey),pe()),window.addEventListener("beforeunload",Se)}),a(()=>{null==ze||ze(),ze=null,ee&&clearTimeout(ee),ue&&clearTimeout(ue),null==q||q.close(),q=null,window.removeEventListener("beforeunload",Se);for(const e of Ce)Z(e);Ce.length=0,b.dispose()}),t({isDirty:y,confirmLeave:function(){return!y.value||window.confirm("当前修改未保存,确定离开?未保存内容将丢失。")},applyDraft:function(e){ie(e.html,e.javascript,e.css),ce(),te(),fe(),y.value=!0,v("dirty",!0)},manualPreview:de,applyPreview:ce}),(t,n)=>{var o;return s(),l("div",Ne,[c("header",Je,[e.showBackButton?(s(),g(m(Ge),{key:0,variant:"ghost",size:"sm",onClick:n[0]||(n[0]=e=>v("go-back"))},{default:x(()=>[k(m(_),{size:14}),n[9]||(n[9]=C(" 返回 ",-1))]),_:1})):f("",!0),e.showBackButton?(s(),l("span",Ue)):f("",!0),c("div",Ye,[e.title?(s(),l("h1",We,h(e.title),1)):f("",!0),J.value?(s(),l("span",Fe,h(J.value),1)):f("",!0),U.value?(s(),l("span",{key:2,class:"text-[11px] text-zinc-400",title:null==(o=e.versionStatus)?void 0:o.lastPublishedAt}," · 上次发布 "+h(U.value),9,Xe)):f("",!0),y.value?(s(),l("span",qe,"●未保存")):f("",!0)]),A.value?(s(),l("div",Qe,[n[10]||(n[10]=c("span",{class:"hc-editor-draft-pill-dot"},null,-1)),c("span",Ze," 本地草稿 · "+h(De(A.value.savedAt))+"保存 ",1),c("button",{type:"button",class:"hc-editor-draft-pill-action hc-editor-draft-pill-action--primary",onClick:me}," 恢复 "),c("button",{type:"button",class:"hc-editor-draft-pill-action",onClick:ge}," 丢弃 ")])):f("",!0),c("div",et,[c("label",tt,[T(c("input",{"onUpdate:modelValue":n[1]||(n[1]=e=>O.value=e),type:"checkbox",class:"h-3 w-3 rounded border-zinc-300 text-zinc-900 focus:ring-0"},null,512),[[D,O.value]]),n[11]||(n[11]=C(" 自动预览 ",-1))]),W.value?(s(),g(m(Ge),{key:0,variant:"ghost",size:"xs",title:"查看当前改动",onClick:n[2]||(n[2]=e=>v("open-diff"))},{default:x(()=>[k(m(M),{size:13}),n[12]||(n[12]=C(" 看改动 ",-1))]),_:1})):f("",!0),Y.value?(s(),g(m(Ge),{key:1,variant:"ghost",size:"xs",title:"历史版本",onClick:n[3]||(n[3]=e=>v("open-history"))},{default:x(()=>[k(m(E),{size:13}),n[13]||(n[13]=C(" 历史版本 ",-1))]),_:1})):f("",!0),k(m(Ge),{variant:"ghost",size:"icon-sm",title:"组件设置",onClick:n[4]||(n[4]=e=>v("open-settings"))},{default:x(()=>[k(m(L),{size:14})]),_:1}),k(m(Ge),{variant:"outline",size:"xs",onClick:he},{default:x(()=>[...n[14]||(n[14]=[C(" 保存草稿 ",-1)])]),_:1}),F.value?(s(),g(m(Ge),{key:2,variant:"default",size:"xs",onClick:n[5]||(n[5]=e=>v("push-version"))},{default:x(()=>[...n[15]||(n[15]=[C(" 推版本 ",-1)])]),_:1})):f("",!0)])]),c("div",nt,[K.value?(s(),l("div",ct,[k(xe,{node:w.value,"is-only":"group"===w.value.type,onActivate:be,onTabDrop:ye,onSetRatio:ke,onSave:he,onPushVersion:n[8]||(n[8]=e=>v("push-version"))},null,8,["node","is-only"]),n[18]||(n[18]=c("div",{class:"fixed bottom-3 right-3 bg-zinc-900 text-white text-[11px] px-3 py-1.5 rounded-md shadow-md flex items-center gap-2"},[c("span",{class:"h-1.5 w-1.5 rounded-full bg-emerald-400"}),C(" 预览已脱出 · 关闭独立窗口可恢复 ")],-1))])):(s(),g(we,{key:0,direction:"horizontal",ratio:B.value,"onUpdate:ratio":n[7]||(n[7]=e=>B.value=e)},{a:x(()=>[c("div",ot,[k(xe,{node:w.value,"is-only":"group"===w.value.type,onActivate:be,onTabDrop:ye,onSetRatio:ke,onSave:he,onPushVersion:n[6]||(n[6]=e=>v("push-version"))},null,8,["node","is-only"])])]),b:x(()=>[c("div",rt,[c("div",at,[c("div",it,[n[16]||(n[16]=c("span",{class:"hc-editor-preview-title"},"预览",-1)),c("button",{type:"button",class:"hc-editor-icon-button hc-editor-preview-icon-button",title:"独立窗口预览",onClick:Te},[k(m(P),{size:13})])]),c("div",st,[O.value?f("",!0):(s(),l("button",{key:0,type:"button",class:"hc-editor-preview-refresh",onClick:de},[k(m(j),{size:12}),n[17]||(n[17]=C(" 重新渲染 ",-1))]))])]),c("div",lt,[c("div",ut,[k(m(I),{"instance-id":N.value,"component-id":`user-${G.value}`,"html-source":V.value,"js-source":H.value,"css-source":$.value},null,8,["instance-id","component-id","html-source","js-source","css-source"])])])])]),_:1},8,["ratio"]))])])}}}),pt="0.0.0-stage3";export{Ge as Button,le as EDITOR_SCOPE_KEY,be as EditorGroup,xe as EditorLayout,dt as HyperCardEditor,de as MonacoEditor,ce as SOURCE_KEY_LABEL,we as Splitter,pt as VERSION,Me as activateTab,ee as addMonacoExtraLib,Re as buttonVariants,Ve as clearDraft,Ee as closeTab,se as createEditorScope,$e as createPreviewBus,Ie as defaultLayout,ae as formatLastPublished,He as formatRelative,Ke as loadDraft,Le as moveTab,Z as releaseMonacoExtraLib,te as removeMonacoExtraLib,Q as retainMonacoExtraLib,Oe as saveDraft,je as setSplitRatio,F as setupHyperCardMonacoTypes,oe as shouldShowDiffEntry,ne as shouldShowHistoryEntry,re as shouldShowPublishEntry,Pe as splitWithTab,ue as useEditorScope};
|
|
1
|
+
import{inject as e,defineComponent as t,ref as n,shallowRef as o,onMounted as r,onBeforeUnmount as a,watch as i,openBlock as s,createElementBlock as l,computed as u,createElementVNode as c,Fragment as d,renderList as p,normalizeClass as v,createCommentVNode as f,toDisplayString as h,unref as m,createBlock as g,normalizeStyle as b,renderSlot as y,resolveComponent as w,withCtx as x,createVNode as k,provide as S,getCurrentInstance as z,createTextVNode as C,withDirectives as T,vModelCheckbox as D}from"vue";import{ArrowLeft as _,GitCompare as M,History as E,Settings as L,ExternalLink as P,RefreshCw as j}from"lucide-vue-next";import{RuntimeBox as I}from"@hy-bricks/core";import*as B from"monaco-editor";import{typescript as K}from"monaco-editor";import O from"monaco-editor/esm/vs/editor/editor.worker?worker";import V from"monaco-editor/esm/vs/language/json/json.worker?worker";import H from"monaco-editor/esm/vs/language/css/css.worker?worker";import $ from"monaco-editor/esm/vs/language/html/html.worker?worker";import A from"monaco-editor/esm/vs/language/typescript/ts.worker?worker";import{Primitive as R}from"reka-ui";import{clsx as G}from"clsx";import{twMerge as N}from"tailwind-merge";import{cva as J}from"class-variance-authority";const U="\n// HyperCard 运行时全局类型 — 由 @hy-bricks/editor 注入到 Monaco\n\ndeclare const __HYPERCARD__: HyperCardInstance | undefined\n\ninterface HyperCardInstance {\n /** 宿主通过 createHyperCard({ libs: { ... } }) 注入的库 / 函数 / 常量 */\n libs: HyperCardLibs\n /** 跨实例运行时 SDK */\n runtime: HyperCardRuntime\n /** 资源 / 短链辅助 */\n assets: HyperCardAssets\n /** SDK 实例版本 */\n version: string\n}\n\n/**\n * 默认 libs 是开放命名空间。宿主补具体类型(axios / EP 等)时,在自己的 d.ts\n * extraLib 里 `interface HyperCardLibs { http: ...; ui: ... }` 声明合并。\n */\ninterface HyperCardLibs {\n [key: string]: any\n}\n\ninterface HyperCardRuntime {\n /** 调另一个组件实例的非钩子方法,同步;实例不存在返 undefined */\n call<T = unknown>(id: string, method: string, ...args: unknown[]): T | undefined\n /** 监听另一个实例的事件,返回 unsubscribe 函数;实例不存在返 undefined */\n on(id: string, event: string, handler: (payload: unknown) => void): (() => void) | undefined\n /** 在另一个实例上发事件 */\n emit(id: string, event: string, payload?: unknown): void\n /** 列出当前页面所有实例,可按 componentId 过滤 */\n listInstances(filter?: { componentId?: string }): HyperCardInstanceHandle[]\n /** 拿到指定 instanceId 的 handle */\n getInstance(id: string): HyperCardInstanceHandle | null\n}\n\ninterface HyperCardInstanceHandle {\n readonly instanceId: string\n readonly componentId: string\n call<T = unknown>(method: string, ...args: unknown[]): T | undefined\n on(event: string, handler: (payload: unknown) => void): () => void\n emit(event: string, payload?: unknown): void\n}\n\ninterface HyperCardAssets {\n /** 拼短链:'/a/<id>' */\n pickerUrl(id: string): string\n}\n",Y="file:///hypercard-globals.d.ts";let W=!1;function F(){var e,t;if(W)return;W=!0,K.javascriptDefaults.addExtraLib(U,Y),K.typescriptDefaults.addExtraLib(U,Y),"undefined"!=typeof globalThis&&globalThis.__HYPERCARD_DEBUG__&&console.info("[hypercard][monaco-types] HyperCard globals 注入完成,extra libs =",Object.keys((null==(t=(e=K.javascriptDefaults).getExtraLibs)?void 0:t.call(e))??{}));const n={target:K.ScriptTarget.Latest,allowNonTsExtensions:!0,moduleResolution:K.ModuleResolutionKind.NodeJs,module:K.ModuleKind.ESNext,noEmit:!0,esModuleInterop:!0,allowJs:!0,checkJs:!1};K.javascriptDefaults.setCompilerOptions(n),K.typescriptDefaults.setCompilerOptions(n)}const X=new Map;function q(){const e=[{filePath:Y,content:U},...Array.from(X.entries()).map(([e,{content:t}])=>({filePath:e,content:t}))];K.javascriptDefaults.setExtraLibs(e),K.typescriptDefaults.setExtraLibs(e)}function Q(e){const t=X.get(e.filePath);if(t)return t.count++,void(t.content!==e.content&&console.warn(`[hypercard] extraLib "${e.filePath}" 多次注册但 content 不一致;保留先注册的版本。如需独立内容,请用不同 filePath。`));X.set(e.filePath,{content:e.content,count:1}),q()}function Z(e){const t=X.get(e);t&&(t.count--,t.count<=0&&(X.delete(e),q()))}function ee(e){Q(e)}function te(e){Z(e)}function ne(e,t){return Boolean(null==e?void 0:e.showHistory)&&!0===(null==t?void 0:t.hasHistory)}function oe(e,t){return Boolean(null==e?void 0:e.showDiff)&&!0===(null==t?void 0:t.hasHistory)&&Boolean(null==t?void 0:t.currentVersionLabel)}function re(e){return!1!==(null==e?void 0:e.enablePublish)}function ae(e,t=new Date){if(!e)return null;const n=Date.parse(e);if(Number.isNaN(n))return null;const o=t.getTime()-n;return o<6e4?"刚刚":o<36e5?`${Math.floor(o/6e4)} 分钟前`:o<864e5?`${Math.floor(o/36e5)} 小时前`:o<2592e6?`${Math.floor(o/864e5)} 天前`:new Date(n).toLocaleDateString()}const ie=["html","javascript","css"];function se(){let e=null,t=[];function n(){if(e)return e;e={html:B.editor.createModel("","html"),javascript:B.editor.createModel("","javascript"),css:B.editor.createModel("","css")};for(const n of ie)e[n].onDidChangeContent(()=>{for(const e of t)e(n)});return e}return{useModels:n,getSource:e=>n()[e].getValue(),setSource(e,t){const o=n()[e];o.getValue()!==t&&o.setValue(t)},snapshotSources(){const e=n();return{html:e.html.getValue(),javascript:e.javascript.getValue(),css:e.css.getValue()}},onSourceChange:e=>(n(),t.push(e),()=>{t=t.filter(t=>t!==e)}),dispose(){if(e){for(const t of ie)e[t].dispose();e=null,t=[]}}}}const le=Symbol("hc-editor-scope");function ue(){const t=e(le);if(!t)throw new Error("[hypercard] useEditorScope 必须在 <HyperCardEditor> 内使用。组件作者:不要直接挂 MonacoEditor / EditorGroup 等内部组件。");return t}const ce={html:"index.html",javascript:"component.js",css:"styles.css"},de=t({__name:"MonacoEditor",props:{sourceKey:{},readOnly:{type:Boolean,default:!1},theme:{default:"vs"},fontSize:{default:13},minimap:{type:Boolean,default:!1}},emits:["save","pushVersion"],setup(e,{emit:t}){globalThis.__HC_MONACO_BOOTSTRAPPED__||(self.MonacoEnvironment={getWorker:(e,t)=>"json"===t?new V:"css"===t||"scss"===t||"less"===t?new H:"html"===t||"handlebars"===t||"razor"===t?new $:"typescript"===t||"javascript"===t?new A:new O},globalThis.__HC_MONACO_BOOTSTRAPPED__=!0),F();const u=e,c=t,d=n(null),p=o(null),v=ue();return r(()=>{if(!d.value)return;const e=v.useModels(),t=B.editor.create(d.value,{model:e[u.sourceKey],readOnly:u.readOnly,theme:u.theme,fontSize:u.fontSize,fontFamily:"JetBrains Mono, SF Mono, Menlo, Consolas, Liberation Mono, monospace",lineNumbers:"on",minimap:{enabled:u.minimap},automaticLayout:!0,tabSize:2,insertSpaces:!0,scrollBeyondLastLine:!1,smoothScrolling:!0,renderWhitespace:"selection",wordWrap:"on",padding:{top:8,bottom:8}});p.value=t,t.addCommand(B.KeyMod.CtrlCmd|B.KeyCode.KeyS,()=>c("save")),t.addCommand(B.KeyMod.CtrlCmd|B.KeyMod.Shift|B.KeyCode.KeyS,()=>c("pushVersion"))}),a(()=>{var e;null==(e=p.value)||e.dispose(),p.value=null}),i(()=>u.sourceKey,e=>{const t=p.value;if(!t)return;const n=v.useModels();t.setModel(n[e])}),i(()=>u.readOnly,e=>{var t;return null==(t=p.value)?void 0:t.updateOptions({readOnly:e})}),(e,t)=>(s(),l("div",{ref_key:"containerRef",ref:d,class:"w-full h-full",style:{width:"100%",height:"100%"}},null,512))}}),pe={class:"hc-editor-tabs h-8 border-b border-zinc-200 flex items-end text-xs shrink-0 overflow-x-auto overflow-y-hidden"},ve=["onClick","onDragstart","onDragover","onDrop"],fe={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},he={class:"font-mono text-[11px] leading-none truncate"},me={key:0,class:"hc-editor-insert-line absolute z-30 left-0 top-0 bottom-0 w-0.5 bg-blue-500"},ge={key:1,class:"absolute inset-0 grid place-items-center text-xs text-zinc-400"},be=t({__name:"EditorGroup",props:{group:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","save","pushVersion"],setup(e,{emit:t}){const o=e,r=t,a=n(null),i=n(null),b=n(null);function y(e){var t;return Array.from((null==(t=e.dataTransfer)?void 0:t.types)??[]).includes("application/x-hc-tab")}function w(e){e.dataTransfer&&(e.dataTransfer.dropEffect=e.altKey||e.metaKey?"copy":"move")}function x(){a.value=null,i.value=null,b.value=null}function k(e){var t;const n=null==(t=e.dataTransfer)?void 0:t.getData("application/x-hc-tab");if(!n)return null;try{const e=JSON.parse(n);return"string"==typeof e.sourceGroupId&&"string"==typeof e.sourceTab?e:null}catch{return null}}function S(e){if(!y(e))return;e.preventDefault(),e.stopPropagation(),w(e);const t=e.currentTarget;a.value=function(e,t){const n=t.getBoundingClientRect(),o=(e.clientX-n.left)/n.width,r=(e.clientY-n.top)/n.height;return r<.22?"top":r>.78?"bottom":o<.5?"left":"right"}(e,t),i.value=null}function z(e){const t=e.currentTarget,n=e.relatedTarget;n&&t.contains(n)||x()}function C(e){if(!y(e))return;e.preventDefault(),e.stopPropagation();const t=k(e),n=a.value;x(),t&&n&&"center"!==n&&r("tab-drop",{sourceGroupId:t.sourceGroupId,sourceTab:t.sourceTab,targetGroupId:o.group.id,edge:n,insertIndex:null,copy:e.altKey||e.metaKey})}function T(e,t){y(e)&&(e.preventDefault(),w(e),a.value="center",i.value=t,e.stopPropagation())}function D(e,t){if(!y(e))return;e.preventDefault(),e.stopPropagation();const n=k(e);x(),n&&r("tab-drop",{sourceGroupId:n.sourceGroupId,sourceTab:n.sourceTab,targetGroupId:o.group.id,edge:"center",insertIndex:t,copy:e.altKey||e.metaKey})}const _=u(()=>{switch(a.value){case"left":return"hc-editor-drop-overlay--left";case"right":return"hc-editor-drop-overlay--right";case"top":return"hc-editor-drop-overlay--top";case"bottom":return"hc-editor-drop-overlay--bottom";default:return""}});return(t,n)=>(s(),l("div",{class:"hc-editor-group relative w-full h-full flex flex-col bg-white border border-zinc-200 overflow-hidden",style:{width:"100%",height:"100%"},onDragleave:z,onDragendCapture:x},[c("div",pe,[(s(!0),l(d,null,p(e.group.tabs,(t,n)=>(s(),l("div",{key:t+"-"+n,draggable:!0,class:v(["hc-editor-tab h-7 min-w-0 px-3 flex items-center gap-1.5 border-r border-zinc-200 transition-colors cursor-pointer select-none relative",[e.group.activeTab===t?"hc-editor-tab--active bg-white text-zinc-950 border-t-2 border-t-zinc-900 border-b border-b-white":"text-zinc-500 hover:text-zinc-900 hover:bg-zinc-50",b.value===t?"hc-editor-tab--dragging opacity-45":""]]),onClick:e=>r("activate",t),onDragstart:e=>function(e,t){e.dataTransfer&&(b.value=t,e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("application/x-hc-tab",JSON.stringify({sourceGroupId:o.group.id,sourceTab:t})),e.dataTransfer.setData("text/plain",ce[t]))}(e,t),onDragover:e=>T(e,n),onDrop:e=>D(e,n)},["center"===a.value&&i.value===n?(s(),l("span",fe)):f("",!0),c("span",he,h(m(ce)[t]),1)],42,ve))),128)),c("div",{class:"hc-editor-tab-tail flex-1 relative min-w-6",onDragover:n[0]||(n[0]=t=>T(t,e.group.tabs.length)),onDrop:n[1]||(n[1]=t=>D(t,e.group.tabs.length))},["center"===a.value&&i.value===e.group.tabs.length?(s(),l("span",me)):f("",!0)],32)]),c("div",{class:"flex-1 min-h-0 relative",onDragoverCapture:S,onDropCapture:C},[e.group.tabs.length>0?(s(),g(de,{key:0,"source-key":e.group.activeTab,onSave:n[2]||(n[2]=e=>r("save")),onPushVersion:n[3]||(n[3]=e=>r("pushVersion"))},null,8,["source-key"])):(s(),l("div",ge," 把 tab 拖到这里打开 ")),a.value?(s(),l("div",{key:2,class:v(["hc-editor-drop-overlay pointer-events-none absolute z-50 bg-blue-500/15 border-2 border-blue-500 ring-2 ring-blue-500/20 transition-all",_.value])},null,2)):f("",!0)],32)],32))}}),ye=["aria-orientation"],we=t({__name:"Splitter",props:{direction:{default:"horizontal"},ratio:{},handleSize:{default:6}},emits:["update:ratio"],setup(e,{emit:t}){const o=e,r=t,i=n(null),d=n(!1);let p="",f="";const h=u(()=>"horizontal"===o.direction),m=u(()=>(h.value,{flexBasis:`calc(${100*o.ratio}% - ${o.handleSize/2}px)`})),g=u(()=>(h.value,{flexBasis:`calc(${100*(1-o.ratio)}% - ${o.handleSize/2}px)`})),w=u(()=>h.value?{flexBasis:`${o.handleSize}px`,width:`${o.handleSize}px`}:{flexBasis:`${o.handleSize}px`,height:`${o.handleSize}px`});function x(e){if(!i.value)return;const t=i.value.getBoundingClientRect(),n=h.value?(e.clientX-t.left)/t.width:(e.clientY-t.top)/t.height;r("update:ratio",Math.max(.08,Math.min(.92,n)))}function k(e){e.preventDefault(),e.stopPropagation(),d.value=!0,x(e);const t=e.currentTarget;try{t.setPointerCapture(e.pointerId)}catch{}p=document.body.style.cursor,f=document.body.style.userSelect,document.body.style.cursor=h.value?"col-resize":"row-resize",document.body.style.userSelect="none",window.addEventListener("pointermove",S),window.addEventListener("pointerup",T,{once:!0}),window.addEventListener("pointercancel",T,{once:!0})}function S(e){d.value&&(e.preventDefault(),x(e))}function z(){d.value&&(d.value=!1,document.body.style.cursor=p,document.body.style.userSelect=f,window.removeEventListener("pointermove",S),window.removeEventListener("pointerup",T),window.removeEventListener("pointercancel",T))}function C(e){const t=e.currentTarget;try{t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId)}catch{}z()}function T(){z()}return a(()=>{z()}),(e,t)=>(s(),l("div",{ref_key:"containerRef",ref:i,class:v(["hc-editor-splitter relative w-full h-full min-w-0 min-h-0",h.value?"hc-editor-splitter--horizontal flex flex-row":"hc-editor-splitter--vertical flex flex-col"]),style:{width:"100%",height:"100%"}},[c("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:b(m.value)},[y(e.$slots,"a")],4),c("div",{class:v(["hc-editor-splitter-handle shrink-0 select-none",[h.value?"hc-editor-splitter-handle--horizontal":"hc-editor-splitter-handle--vertical",d.value?"hc-editor-splitter-handle--dragging":""]]),style:b(w.value),role:"separator","aria-orientation":h.value?"vertical":"horizontal",onPointerdown:k,onPointerup:C},null,46,ye),c("div",{class:"hc-editor-splitter-pane min-w-0 min-h-0 overflow-hidden",style:b(g.value)},[y(e.$slots,"b")],4)],2))}}),xe=t({__name:"EditorLayout",props:{node:{},isOnly:{type:Boolean}},emits:["activate","tab-drop","set-ratio","save","pushVersion"],setup(e,{emit:t}){const n=t;return(t,o)=>{const r=w("EditorLayout",!0);return"group"===e.node.type?(s(),g(be,{key:0,group:e.node,"is-only":e.isOnly??!1,onActivate:o[0]||(o[0]=t=>n("activate",e.node.id,t)),onTabDrop:o[1]||(o[1]=e=>n("tab-drop",e)),onSave:o[2]||(o[2]=e=>n("save")),onPushVersion:o[3]||(o[3]=e=>n("pushVersion"))},null,8,["group","is-only"])):(s(),g(we,{key:1,direction:e.node.direction,ratio:e.node.ratio,"onUpdate:ratio":o[14]||(o[14]=t=>n("set-ratio",e.node.id,t))},{a:x(()=>[k(r,{node:e.node.a,onActivate:o[4]||(o[4]=(e,t)=>n("activate",e,t)),onTabDrop:o[5]||(o[5]=e=>n("tab-drop",e)),onSetRatio:o[6]||(o[6]=(e,t)=>n("set-ratio",e,t)),onSave:o[7]||(o[7]=e=>n("save")),onPushVersion:o[8]||(o[8]=e=>n("pushVersion"))},null,8,["node"])]),b:x(()=>[k(r,{node:e.node.b,onActivate:o[9]||(o[9]=(e,t)=>n("activate",e,t)),onTabDrop:o[10]||(o[10]=e=>n("tab-drop",e)),onSetRatio:o[11]||(o[11]=(e,t)=>n("set-ratio",e,t)),onSave:o[12]||(o[12]=e=>n("save")),onPushVersion:o[13]||(o[13]=e=>n("pushVersion"))},null,8,["node"])]),_:1},8,["direction","ratio"]))}}});let ke=0;function Se(e){return`${e}_${++ke}_${Date.now().toString(36)}`}function ze(e,t){return{type:"group",id:Se("g"),tabs:[...e],activeTab:t??e[0]}}function Ce(e){return JSON.parse(JSON.stringify(e))}function Te(e,t){return"group"===e.type?e.id===t?e:null:Te(e.a,t)??Te(e.b,t)}function De(e,t){return"group"===e.type?null:e.id===t?e:De(e.a,t)??De(e.b,t)}function _e(e,t,n){if("group"===e.type)return e.id===t?n:e;if(e.id===t)return n;const o=_e(e.a,t,n),r=_e(e.b,t,n);return o||r?o?r?{...e,a:o,b:r}:o:r:null}function Me(e,t,n){const o=Ce(e),r=Te(o,t);return r&&r.tabs.includes(n)&&(r.activeTab=n),o}function Ee(e,t,n){const o=Ce(e),r=Te(o,t);if(!r)return o;const a=r.tabs.indexOf(n);return-1===a?o:(r.tabs.splice(a,1),0===r.tabs.length?"group"===o.type&&o.id===t?o:_e(o,t,null)??o:(r.activeTab===n&&(r.activeTab=r.tabs[Math.min(a,r.tabs.length-1)]),o))}function Le(e,t,n,o,r,a=!1){let i=Ce(e);const s=Te(i,o);if(!s)return i;if(t===o&&!a){const e=s.tabs.indexOf(n);if(-1===e)return i;s.tabs.splice(e,1);const t=null==r?s.tabs.length:Math.min(r,s.tabs.length);return s.tabs.splice(t,0,n),s.activeTab=n,i}if(!s.tabs.includes(n)){const e=null==r?s.tabs.length:Math.min(r,s.tabs.length);s.tabs.splice(e,0,n)}return s.activeTab=n,a||(i=Ee(i,t,n)),i}function Pe(e,t,n,o,r,a=!1){let i=Ce(e);const s=Te(i,o);if(!s)return i;if(t===o&&1===s.tabs.length&&s.tabs[0]===n&&!a)return i;const l=ze([n],n),u="left"===r||"right"===r?"horizontal":"vertical",c={type:"split",id:Se("s"),direction:u,ratio:.5,a:"right"===r||"bottom"===r?Ce(s):l,b:"right"===r||"bottom"===r?l:Ce(s)},d=_e(i,s.id,c);return d?(i=d,a||(i=Ee(i,t,n)),i):i}function je(e,t,n){const o=Ce(e),r=De(o,t);return r&&(r.ratio=Math.max(.05,Math.min(.95,n))),o}function Ie(){return ze(["html","javascript","css"],"javascript")}function Be(e){return"hc:draft:"+e}function Ke(e){if(!e)return null;const t=localStorage.getItem(Be(e));if(!t)return null;try{const e=JSON.parse(t);if("string"==typeof e.html&&"string"==typeof e.javascript&&"string"==typeof e.css&&"number"==typeof e.savedAt)return e}catch{}return null}function Oe(e,t){if(!e)return null;const n={html:t.html,javascript:t.javascript,css:t.css,savedAt:Date.now()};try{return localStorage.setItem(Be(e),JSON.stringify(n)),n}catch(e){return console.warn("[hc-draft] saveDraft failed:",e),null}}function Ve(e){e&&localStorage.removeItem(Be(e))}function He(e){const t=Date.now()-e,n=Math.floor(t/6e4);if(n<1)return"刚刚";if(n<60)return`${n} 分钟前`;const o=Math.floor(n/60);return o<24?`${o} 小时前`:`${Math.floor(o/24)} 天前`}function $e(e){const t=new BroadcastChannel(`hc-preview-${e}`);return{channel:t,send(e){t.postMessage(e)},close(){t.close()}}}function Ae(...e){return N(G(e))}const Re=J("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-7 rounded-md px-2 text-xs has-[>svg]:px-1.5",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8"}},defaultVariants:{variant:"default",size:"default"}}),Ge=t({__name:"Button",props:{variant:{},size:{},class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e;return(n,o)=>(s(),g(m(R),{"data-slot":"button",as:e.as,"as-child":e.asChild,class:v(m(Ae)(m(Re)({variant:e.variant,size:e.size}),t.class))},{default:x(()=>[y(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),Ne={class:"h-full w-full flex flex-col bg-zinc-50 text-zinc-900",style:{width:"100%",height:"100%"}},Je={class:"h-11 border-b border-zinc-200 bg-white flex items-center px-4 gap-3 shrink-0"},Ue={key:1,class:"h-4 w-px bg-zinc-200"},Ye={class:"flex items-baseline gap-2 min-w-0"},We={key:0,class:"text-sm font-medium truncate"},Fe={key:1,class:"text-[11px] text-zinc-400 tabular-nums"},Xe=["title"],qe={key:3,class:"text-[11px] text-amber-600"},Qe={key:2,class:"hc-editor-draft-pill"},Ze={class:"hc-editor-draft-pill-text"},et={class:"ml-auto flex items-center gap-1.5"},tt={class:"flex items-center gap-1.5 text-[11px] text-zinc-500 select-none cursor-pointer"},nt={class:"flex-1 min-h-0 p-2 bg-zinc-50"},ot={class:"w-full h-full"},rt={class:"hc-editor-preview-pane w-full h-full bg-white border border-zinc-200 flex flex-col overflow-hidden"},at={class:"hc-editor-preview-header"},it={class:"hc-editor-preview-tab"},st={class:"hc-editor-preview-actions"},lt={class:"flex-1 min-h-0 overflow-auto bg-white"},ut={class:"hc-editor-preview-body min-h-full px-5 py-4"},ct={key:1,class:"w-full h-full"},dt=t({__name:"HyperCardEditor",props:{modelValue:{},draftKey:{},componentId:{},showBackButton:{type:Boolean,default:!1},title:{},statusLabel:{},versionStatus:{},features:{},autoPreview:{type:Boolean,default:!0},previewRatio:{default:.62},extraLibs:{}},emits:["update:modelValue","dirty","save-draft","push-version","open-preview-window","open-settings","open-history","open-diff","go-back","error"],setup(e,{expose:t,emit:o}){var d;const p=e,v=o,b=se();S(le,b);const y=n(!1),w=n(Ie()),B=n(p.previewRatio),K=n(!1),O=n(p.autoPreview),V=n(""),H=n(""),$=n(""),A=n(null),R=(null==(d=z())?void 0:d.uid)??Math.floor(1e9*Math.random()),G=u(()=>p.componentId??p.draftKey??`__hc_editor_${R}__`),N=u(()=>`editor-preview-${G.value}`),J=u(()=>{var e;return(null==(e=p.versionStatus)?void 0:e.currentVersionLabel)??p.statusLabel??""}),U=u(()=>{var e;return ae(null==(e=p.versionStatus)?void 0:e.lastPublishedAt)}),Y=u(()=>ne(p.features,p.versionStatus)),W=u(()=>oe(p.features,p.versionStatus)),F=u(()=>re(p.features));let X=!1,q=null,ee=null;function te(){const e=b.snapshotSources();v("update:modelValue",{html:e.html,js:e.javascript,css:e.css})}function ie(e,t,n){X=!0;try{b.setSource("html",e),b.setSource("javascript",t),b.setSource("css",n)}finally{X=!1}}i(()=>p.modelValue,e=>{if(!e)return;const t=b.snapshotSources();t.html===(e.html??"")&&t.javascript===(e.js??"")&&t.css===(e.css??"")||(ie(e.html??"",e.js??"",e.css??""),ce(),fe(),y.value=!1,v("dirty",!1))},{immediate:!0});let ue=null;function ce(){const e=b.snapshotSources();V.value=e.html,H.value=e.javascript,$.value=e.css}function de(){ue&&clearTimeout(ue),ce()}function pe(){p.draftKey&&!q&&(q=$e(p.draftKey),q.channel.addEventListener("message",e=>{const t=e.data;"hello"===t.type?(K.value=!0,ve()):"goodbye"===t.type?K.value=!1:"request-sources"===t.type&&ve()}))}function ve(){if(!q)return;const e=b.snapshotSources();q.send({type:"sources",html:e.html,javascript:e.javascript,css:e.css})}function fe(){q&&(ee&&clearTimeout(ee),ee=setTimeout(ve,200))}function he(){p.draftKey?(Oe(p.draftKey,b.snapshotSources())&&(y.value=!1,v("dirty",!1),A.value=null),v("save-draft")):v("save-draft")}function me(){const e=A.value;e&&(ie(e.html,e.javascript,e.css),ce(),te(),fe(),A.value=null,y.value=!0,v("dirty",!0))}function ge(){p.draftKey&&(Ve(p.draftKey),A.value=null)}function be(e,t){w.value=Me(w.value,e,t)}function ye(e){"center"===e.edge?w.value=Le(w.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.insertIndex,e.copy):w.value=Pe(w.value,e.sourceGroupId,e.sourceTab,e.targetGroupId,e.edge,e.copy)}function ke(e,t){w.value=je(w.value,e,t)}function Se(e){y.value&&(e.preventDefault(),e.returnValue="")}let ze=null;const Ce=[];function Te(){pe(),v("open-preview-window")}function De(e){const t=Date.now()-e;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)} 分钟前`:t<864e5?`${Math.floor(t/36e5)} 小时前`:new Date(e).toLocaleString()}return r(()=>{if(p.extraLibs)for(const e of p.extraLibs)Q(e),Ce.push(e.filePath);ze=b.onSourceChange(()=>{X||(y.value=!0,v("dirty",!0),te(),fe(),O.value&&(ue&&clearTimeout(ue),ue=setTimeout(ce,600)))}),p.draftKey&&(A.value=Ke(p.draftKey),pe()),window.addEventListener("beforeunload",Se)}),a(()=>{null==ze||ze(),ze=null,ee&&clearTimeout(ee),ue&&clearTimeout(ue),null==q||q.close(),q=null,window.removeEventListener("beforeunload",Se);for(const e of Ce)Z(e);Ce.length=0,b.dispose()}),t({isDirty:y,confirmLeave:function(){return!y.value||window.confirm("当前修改未保存,确定离开?未保存内容将丢失。")},applyDraft:function(e){ie(e.html,e.javascript,e.css),ce(),te(),fe(),y.value=!0,v("dirty",!0)},manualPreview:de,applyPreview:ce}),(t,n)=>{var o;return s(),l("div",Ne,[c("header",Je,[e.showBackButton?(s(),g(m(Ge),{key:0,variant:"ghost",size:"sm",onClick:n[0]||(n[0]=e=>v("go-back"))},{default:x(()=>[k(m(_),{size:14}),n[9]||(n[9]=C(" 返回 ",-1))]),_:1})):f("",!0),e.showBackButton?(s(),l("span",Ue)):f("",!0),c("div",Ye,[e.title?(s(),l("h1",We,h(e.title),1)):f("",!0),J.value?(s(),l("span",Fe,h(J.value),1)):f("",!0),U.value?(s(),l("span",{key:2,class:"text-[11px] text-zinc-400",title:null==(o=e.versionStatus)?void 0:o.lastPublishedAt}," · 上次发布 "+h(U.value),9,Xe)):f("",!0),y.value?(s(),l("span",qe,"●未保存")):f("",!0)]),A.value?(s(),l("div",Qe,[n[10]||(n[10]=c("span",{class:"hc-editor-draft-pill-dot"},null,-1)),c("span",Ze," 本地草稿 · "+h(De(A.value.savedAt))+"保存 ",1),c("button",{type:"button",class:"hc-editor-draft-pill-action hc-editor-draft-pill-action--primary",onClick:me}," 恢复 "),c("button",{type:"button",class:"hc-editor-draft-pill-action",onClick:ge}," 丢弃 ")])):f("",!0),c("div",et,[c("label",tt,[T(c("input",{"onUpdate:modelValue":n[1]||(n[1]=e=>O.value=e),type:"checkbox",class:"h-3 w-3 rounded border-zinc-300 text-zinc-900 focus:ring-0"},null,512),[[D,O.value]]),n[11]||(n[11]=C(" 自动预览 ",-1))]),W.value?(s(),g(m(Ge),{key:0,variant:"ghost",size:"xs",title:"查看当前改动",onClick:n[2]||(n[2]=e=>v("open-diff"))},{default:x(()=>[k(m(M),{size:13}),n[12]||(n[12]=C(" 看改动 ",-1))]),_:1})):f("",!0),Y.value?(s(),g(m(Ge),{key:1,variant:"ghost",size:"xs",title:"历史版本",onClick:n[3]||(n[3]=e=>v("open-history"))},{default:x(()=>[k(m(E),{size:13}),n[13]||(n[13]=C(" 历史版本 ",-1))]),_:1})):f("",!0),k(m(Ge),{variant:"ghost",size:"icon-sm",title:"组件设置",onClick:n[4]||(n[4]=e=>v("open-settings"))},{default:x(()=>[k(m(L),{size:14})]),_:1}),k(m(Ge),{variant:"outline",size:"xs",onClick:he},{default:x(()=>[...n[14]||(n[14]=[C(" 保存草稿 ",-1)])]),_:1}),F.value?(s(),g(m(Ge),{key:2,variant:"default",size:"xs",onClick:n[5]||(n[5]=e=>v("push-version"))},{default:x(()=>[...n[15]||(n[15]=[C(" 推版本 ",-1)])]),_:1})):f("",!0)])]),c("div",nt,[K.value?(s(),l("div",ct,[k(xe,{node:w.value,"is-only":"group"===w.value.type,onActivate:be,onTabDrop:ye,onSetRatio:ke,onSave:he,onPushVersion:n[8]||(n[8]=e=>v("push-version"))},null,8,["node","is-only"]),n[18]||(n[18]=c("div",{class:"fixed bottom-3 right-3 bg-zinc-900 text-white text-[11px] px-3 py-1.5 rounded-md shadow-md flex items-center gap-2"},[c("span",{class:"h-1.5 w-1.5 rounded-full bg-emerald-400"}),C(" 预览已脱出 · 关闭独立窗口可恢复 ")],-1))])):(s(),g(we,{key:0,direction:"horizontal",ratio:B.value,"onUpdate:ratio":n[7]||(n[7]=e=>B.value=e)},{a:x(()=>[c("div",ot,[k(xe,{node:w.value,"is-only":"group"===w.value.type,onActivate:be,onTabDrop:ye,onSetRatio:ke,onSave:he,onPushVersion:n[6]||(n[6]=e=>v("push-version"))},null,8,["node","is-only"])])]),b:x(()=>[c("div",rt,[c("div",at,[c("div",it,[n[16]||(n[16]=c("span",{class:"hc-editor-preview-title"},"预览",-1)),c("button",{type:"button",class:"hc-editor-icon-button hc-editor-preview-icon-button",title:"独立窗口预览",onClick:Te},[k(m(P),{size:13})])]),c("div",st,[O.value?f("",!0):(s(),l("button",{key:0,type:"button",class:"hc-editor-preview-refresh",onClick:de},[k(m(j),{size:12}),n[17]||(n[17]=C(" 重新渲染 ",-1))]))])]),c("div",lt,[c("div",ut,[k(m(I),{"instance-id":N.value,"component-id":`user-${G.value}`,"html-source":V.value,"js-source":H.value,"css-source":$.value},null,8,["instance-id","component-id","html-source","js-source","css-source"])])])])]),_:1},8,["ratio"]))])])}}}),pt="0.0.0-stage3";export{Ge as Button,le as EDITOR_SCOPE_KEY,be as EditorGroup,xe as EditorLayout,dt as HyperCardEditor,de as MonacoEditor,ce as SOURCE_KEY_LABEL,we as Splitter,pt as VERSION,Me as activateTab,ee as addMonacoExtraLib,Re as buttonVariants,Ve as clearDraft,Ee as closeTab,se as createEditorScope,$e as createPreviewBus,Ie as defaultLayout,ae as formatLastPublished,He as formatRelative,Ke as loadDraft,Le as moveTab,Z as releaseMonacoExtraLib,te as removeMonacoExtraLib,Q as retainMonacoExtraLib,Oe as saveDraft,je as setSplitRatio,F as setupHyperCardMonacoTypes,oe as shouldShowDiffEntry,ne as shouldShowHistoryEntry,re as shouldShowPublishEntry,Pe as splitWithTab,ue as useEditorScope};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hy-bricks/editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "HyperCard 嵌入式编辑器 — Monaco 三栏 + 拖 tab 分栏 + 实时预览 + shadcn-vue 风格 UI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"hypercard",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"tailwindcss": "^3.4.0 || ^4.0.0",
|
|
44
44
|
"tailwindcss-animate": "^1.0.7",
|
|
45
45
|
"vue": "^3.5.0",
|
|
46
|
-
"@hy-bricks/core": "^0.
|
|
46
|
+
"@hy-bricks/core": "^0.6.0"
|
|
47
47
|
},
|
|
48
48
|
"peerDependenciesMeta": {
|
|
49
49
|
"tailwindcss": {
|