@devframes/hub-ui 0.9.15 → 0.9.17

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@devframes/hub-ui",
3
3
  "type": "module",
4
- "version": "0.9.15",
4
+ "version": "0.9.17",
5
5
  "description": "Reference UI for the devframe hub, providing the floating dock and standalone viewer.",
6
6
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
7
7
  "license": "MIT",
@@ -29,9 +29,9 @@
29
29
  "dist"
30
30
  ],
31
31
  "peerDependencies": {
32
- "@devframes/hub": "0.9.15",
33
- "@devframes/json-render": "0.9.15",
34
- "devframe": "0.9.15"
32
+ "@devframes/hub": "0.9.17",
33
+ "@devframes/json-render": "0.9.17",
34
+ "devframe": "0.9.17"
35
35
  },
36
36
  "peerDependenciesMeta": {
37
37
  "@devframes/json-render": {
@@ -40,9 +40,9 @@
40
40
  },
41
41
  "devDependencies": {
42
42
  "@antfu/design": "^0.4.0",
43
- "@devframes/hub": "0.9.15",
44
- "@devframes/json-render": "0.9.15",
45
- "@devframes/plugin-git": "0.9.15",
43
+ "@devframes/hub": "0.9.17",
44
+ "@devframes/json-render": "0.9.17",
45
+ "@devframes/plugin-git": "0.9.17",
46
46
  "@iconify-json/ph": "^1.2.2",
47
47
  "@storybook/addon-docs": "^10.6.0",
48
48
  "@storybook/vue3-vite": "^10.6.0",
@@ -50,7 +50,7 @@
50
50
  "@unocss/reset": "^66.10.0",
51
51
  "@vitejs/plugin-vue": "^6.0.8",
52
52
  "@vueuse/core": "^14.4.0",
53
- "devframe": "0.9.15",
53
+ "devframe": "0.9.17",
54
54
  "dompurify": "^3.4.15",
55
55
  "fuse.js": "^7.5.0",
56
56
  "iframe-pane": "^1.1.0",
@@ -1 +0,0 @@
1
- import{$ as e,B as t,D as n,H as r,I as i,J as a,K as o,N as s,O as c,W as l,X as u,Y as d,a as f,et as p,i as m,it as h,k as g,n as ee,o as te,tt as _,y as v}from"./popup-DA7RJqFP.js";import{Ct as y,Dt as b,Et as x,M as S,St as C,Tt as ne,a as re,bt as ie,ct as w,dt as T,i as E,l as ae,n as oe,nt as D,o as se,pt as ce,r as O,rt as k,t as le,ut as A,wt as j,yt as ue}from"./index-qBrvmyIw.js";var M=new WeakMap;async function de(t,n,r,i){if(M.has(n))return M.get(n);let a=await n.sharedState.get(`devframe:commands`,{initialValue:[]}),o=E(a),s=A(new Map),l=E(r),u=S(()=>l.value.commandShortcuts??{}),d=T(!1),f=T(null),p=te(),m=()=>i?i():{clientType:t,dockOpen:!1,paletteOpen:d.value,dockSelectedId:``,popupOpen:p.value},h=S(()=>[...o.value,...Array.from(s.values())]),ee=S(()=>{let e=m();return c(h.value,e).filter(e=>e.showInPalette!==!1)});function _(e){let t=Array.isArray(e)?e:[e];for(let e of t)s.set(e.id,e);return()=>{for(let e of t)s.delete(e.id)}}function v(e){f.value=e??null,d.value=!0}async function y(t,...r){let i=g(h.value,t);if(!i)throw Error(`Command "${t}" not found`);if(i.when){let n=m();if(!e(i.when,n))throw Error(`Command "${t}" is not available in the current context`)}if(i.source===`server`)return n.call(`hub:commands:execute`,t,...r);if(i.action)return i.action(...r);throw Error(`Command "${t}" has no action`)}function b(e){let t=u.value[e];return t===void 0?g(h.value,e)?.keybindings??[]:t}typeof window<`u`&&fe(m,h,b,y);let x=A({commands:h,paletteCommands:ee,register:_,execute:y,getKeybindings:b,settings:w(r),paletteOpen:d,paletteScopeId:f,openPalette:v});return M.set(n,x),x}function fe(t,r,i,a){let o=o=>{let c=s(o);if(!c||c===`Mod`||c===`Shift`||c===`Alt`)return;let l=t(),u=n(r,i);for(let{id:t,keybinding:n}of u){if(n.key!==c)continue;let i=g(r.value,t);if(!(i?.when&&!e(i.when,l))){o.preventDefault(),o.stopPropagation(),a(t).catch(console.error);return}}};window.addEventListener(`keydown`,o,{capture:!0}),D(f(),(e,t)=>{t&&t.removeEventListener(`keydown`,o,{capture:!0}),e&&e.addEventListener(`keydown`,o,{capture:!0})})}function pe(e){let t=[],n;async function r(){if(e.isTrusted===!0)return n===void 0&&(n=new Promise(async e=>{for(;t.length>0;)await t.shift()();e()})),n}async function i(n){return e.isTrusted===!0&&t.length!==0&&await r(),e.isTrusted===!0&&t.length===0?await n():new Promise(e=>{t.push(async()=>{e(await n())})})}e.events.on(`rpc:is-trusted:updated`,e=>{e&&t.length>0&&r()});let a={add(t){return i(async()=>{let n=await e.call(`hub:messages:add`,t);return{get entry(){return n},get id(){return n.id},async update(t){let r=await e.call(`hub:messages:update`,n.id,t);return r&&(n=r),r??void 0},async dismiss(){await e.call(`hub:messages:remove`,n.id)}}})},remove(t){return i(()=>e.call(`hub:messages:remove`,t))},clear(){return i(()=>e.call(`hub:messages:clear`))},info:(e,t)=>a.add({...t,message:e,level:`info`}),warn:(e,t)=>a.add({...t,message:e,level:`warn`}),error:(e,t)=>a.add({...t,message:e,level:`error`}),success:(e,t)=>a.add({...t,message:e,level:`success`}),debug:(e,t)=>a.add({...t,message:e,level:`debug`})};return a}function N(e){switch(e.type){case`action`:return e.action;case`custom-render`:return e.renderer;case`iframe`:return e.clientScript;default:return}}async function P(e,t){let n=N(e);if(!n?.importFrom)throw Error(`[@devframes/hub-ui] Dock entry "${e.id}" carries no client script to run`);let r=_(n.importFrom,{template:t.rpc.connectionMeta?.configs?.dock?.clientModuleResolution,metaBaseUrl:t.rpc.connection?.metaBaseUrl});try{let e=(await C(()=>import(r),[],import.meta.url))[n.importName??`default`];if(typeof e!=`function`)throw Error(`[@devframes/hub-ui] "${r}" exports no callable "${n.importName??`default`}"`);await e(t)}catch(e){throw console.error(`[@devframes/hub-ui] Error executing client script from ${r}${p(n.importFrom,r)}`,e),e}}var F=new Map;function me(e,t){if(e.type!==`action`&&F.has(e.id))return F.get(e.id);let n=P(e,t);return e.type!==`action`&&F.set(e.id,n),n}var I=new WeakMap;async function L(e,n,s,c,f=T(!0)){if(I.has(n))return I.get(n);let{entries:p,initialSyncComplete:g}=await re(n),_={},C=await n.sharedState.get(x,{initialValue:_}),M=E(C),fe=se(C,_),N=A(new Map),P=S(()=>{let e=p.value,t;if(N.size===0)t=e;else{let n=new Set,r=[];for(let t of e)n.add(t.id),r.push(N.get(t.id)??t);for(let[e,t]of N)n.has(e)||r.push(t);t=r}return t.some(e=>e.id===d.id)?t:[...t,d]});c||=T(oe());let F={...c.value},L=T(F.open&&F.selectedDockId!=null),R=S({get:()=>c.value.selectedDockId,set:e=>{c.value.selectedDockId=e}}),he=S({get:()=>c.value.selectedDockRoute,set:e=>{c.value.selectedDockRoute=e}}),z=S(()=>L.value?null:P.value.find(e=>e.id===R.value)??a.find(e=>e.id===R.value)??null),B=A(new Map);k(()=>{for(let e of P.value){if(B.has(e.id)){B.get(e.id).entryMeta=e;continue}B.set(e.id,O(e,z))}});let V=(e,t=!1)=>{if(N.has(e.id)&&!t)throw Error(`[@devframes/hub-ui] a client dock "${e.id}" is already registered; pass force to overwrite`);return N.set(e.id,e),B.has(e.id)||B.set(e.id,O(e,z)),{update:t=>{if(t.id!=null&&t.id!==e.id)throw Error(`[@devframes/hub-ui] a client dock id is immutable ("${e.id}")`);let n=N.get(e.id);n&&N.set(e.id,{...n,...t})},dispose:()=>{N.delete(e.id)&&(B.delete(e.id),R.value===e.id&&(R.value=null))}}},ge=e=>{if(!N.has(e.id))throw Error(`[@devframes/hub-ui] no client dock "${e.id}" to update; register it first`);N.set(e.id,e)};s||=T(le());let H=y(),U,_e,W=w(await(async()=>(_e||=n.sharedState.get(`devframe:user-settings`,{initialValue:ne()}),_e))()),ve=E(W),G,ye=te(),K=()=>({clientType:e,dockOpen:c.value.open,paletteOpen:G?.paletteOpen??!1,dockSelectedId:R.value??``,popupOpen:ye.value}),be=new Map,xe=e=>{if(e.type===`group`)return o(P.value,e,c.value.groupLastChildIds?.[e.id],K())?.id??t(P.value,e.id)[0]?.id??!1;if(e.type===`iframe`&&e.subTabs){let t=e.frameId??e.id,n=be.get(t);if(n&&n!==e.id&&P.value.some(e=>e.id===n))return n}return null},Se=async e=>{if(!(e.type===`action`||e.type===`custom-render`||e.type===`iframe`&&e.clientScript))return;let t=pe(n);await me(e,A({...ce(U),current:B.get(e.id),messages:t}))},Ce=e=>{e.type===`iframe`&&e.frameId&&!e.subTabs&&be.set(e.frameId,e.id),e.type!==`action`&&e.groupId&&((c.value.groupLastChildIds??={})[e.groupId]=e.id),e.type!==`iframe`&&(c.value.selectedDockRoute=null)},q=async(t=null)=>{if(t==null)return L.value=!1,R.value=null,c.value.open=!1,c.value.selectedDockRoute=null,!0;if(t===`~client-auth-notice`)return L.value=!1,R.value=t,c.value.open=!0,!0;let n=P.value.find(e=>e.id===t);if(!n)return!1;let r=xe(n);return r===!1?!1:r===null?n.type===`action`&&await m(e,n.id)!=null?!1:(L.value=!1,R.value=n.id,c.value.open=!0,await Se(n),Ce(n),!0):q(r)},J=async e=>R.value===e?q(null):q(e),Y=new Map,X=new Map,we=(e,t)=>{let n=e.frameId??e.id,r=t=>{let r=Y.get(n);if(r){if(r.iframe===t)return;r.dispose(),Y.delete(n)}let i=ue({frameId:n,anchor:e,iframe:t,window:t.ownerDocument?.defaultView??globalThis,docks:{register:V,switchEntry:q,getStateById:e=>B.get(e)}});Y.set(n,{iframe:t,dispose:i.dispose})};t.domElements.iframe&&r(t.domElements.iframe),t.events.on(`dom:iframe:mounted`,r)};D(P,e=>{let t=new Set;for(let n of e){if(n.type!==`iframe`||!n.subTabs||(t.add(n.id),X.has(n.id)))continue;let e=B.get(n.id);e&&(X.set(n.id,n.frameId??n.id),we(n,e))}for(let[e,n]of[...X])t.has(e)||(X.delete(e),Y.get(n)?.dispose(),Y.delete(n))},{immediate:!0}),n.client.register({name:b.broadcast.docksActivate,type:`action`,handler:e=>{e?.dockId&&q(e.dockId)}});let Z=n.connectionMeta.configs?.ui?.dockPreferences?.categoryOrder,Te=S(()=>i(P.value,ve.value,{whenContext:K(),collapseGroups:!0,categoryOrderOverride:Z}));G=await de(e,n,W,K),G.register([{id:`devframes:toggle-palette`,source:`client`,title:`Toggle Command Palette`,icon:`ph:magnifying-glass-duotone`,showInPalette:!1,keybindings:[{key:`Mod+K`}],action:()=>{G.paletteOpen=!G.paletteOpen}},{id:`devframes:close-panel`,source:`client`,title:`Close Panel`,icon:`ph:x-circle-duotone`,when:`dockOpen && !paletteOpen`,keybindings:[{key:`Escape`}],action:()=>{c.value.open=!1,R.value=null}},{id:`devframes:open-settings`,source:`client`,title:`Open Settings`,icon:`ph:gear-duotone`,action:()=>{q(`~settings`)}},{id:`devframes:hide`,source:`client`,title:`Hide ${ae().value.productName}`,icon:`ph:eye-slash-duotone`,when:`clientType == embedded`,action:()=>{window.dispatchEvent(new CustomEvent(u))}},{id:`devframes:dock-mode`,source:`client`,title:`Dock Mode`,icon:`ph:layout-duotone`,when:e===`embedded`?`clientType == embedded && !popupOpen`:void 0,children:[{id:`devframes:dock-mode:float`,source:`client`,title:`Float Mode`,icon:`ph:cards-three-duotone`,when:`!popupOpen`,action:()=>{s.value.mode=`float`}},{id:`devframes:dock-mode:edge`,source:`client`,title:`Edge Mode`,icon:`ph:square-half-bottom-duotone`,when:`!popupOpen`,action:()=>{s.value.mode=`edge`}}]}]);let Ee;k(()=>{Ee?.();let e=e=>({id:v(e.id),source:`client`,title:e.title,icon:l(e.icon),action:()=>{J(e.id)}}),n=(e,t)=>{if(t){J(t);return}if(G.paletteOpen&&G.paletteScopeId===e){G.paletteOpen=!1;return}G.openPalette(e)},i=r(P.value),a=P.value.filter(e=>e.type!==`~builtin`).filter(e=>!(e.groupId&&i.has(e.groupId))).flatMap(r=>{if(r.type!==`group`)return[e(r)];let i=t(P.value,r.id,ve.value,{whenContext:K()}),a=o(P.value,r,c.value.groupLastChildIds?.[r.id],K())?.id;if(i.length===0&&!a)return[];let s=v(r.id);return[{...e(r),action:()=>n(s,a??(i.length===1?i[0].id:void 0)),children:i.map(e)}]});a.length>0&&(Ee=G.register({id:`devframes:docks`,source:`client`,title:`Docks`,icon:`ph:layout-duotone`,children:a}))});let Q=F.selectedDockId==null?null:F.selectedDockRoute;U=A({panel:{get state(){let e;e=f.value?c.value.open?`open`:`closed`:`hidden`;let t={state:e};return R.value!==null&&(t.selectedDockId=R.value),t},events:w(H),store:s,session:c,isDragging:!1,isResizing:!1,isVertical:S(()=>s.value.position===`left`||s.value.position===`right`),consumeBootRoute:e=>{if(Q!=null&&e===F.selectedDockId){let e=Q;return Q=null,e}return null}},docks:{selectedId:R,selectedRoute:he,selected:z,entries:P,entryToStateMap:w(B),groupedEntries:Te,categoryOrder:Z?{...j,...Z}:j,settings:W,getStateById:e=>B.get(e),switchEntry:q,toggleEntry:J,register:V,update:ge},commands:G,when:{get context(){return K()}},connection:{get status(){return n.status},get error(){return n.connectionError},events:n.events},renderers:w(ie({context:()=>U,manifest:()=>M.value})),rpc:w(n),clientType:e}),ee(e,async e=>{let t=P.value.find(t=>t.id===e);return!t||t.type!==`action`?!1:q(t.id)});let De=async()=>{n.isTrusted||await new Promise(e=>{let t=n.events.on(h.client.isTrustedUpdated,n=>{n&&(t(),e())})})},Oe=async()=>{let e=F.selectedDockId;if(!(!F.open||e==null)&&(await Promise.all([De(),g,fe]),L.value)){if(R.value!==e){L.value=!1;return}L.value=!1,await q(e)}},$=U.panel.state;return D([f,()=>c.value.open,R],()=>{let e=U.panel.state;(e.state!==$.state||e.selectedDockId!==$.selectedDockId)&&($=e,H.emit(b.client.docksPanelStateChanged,e))},{flush:`post`}),Oe(),I.set(n,U),U}export{L as createDocksContext};