@manifest-editor/manifest-preset 2.2.0 → 2.2.1-next.0.eefc2e3

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/dist/index.cjs CHANGED
@@ -52,5 +52,5 @@ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{val
52
52
  padding-inline-start: var(--manifest-editor-layout-left-sidebar-small, 0px);
53
53
  padding-inline-end: var(--manifest-editor-layout-right-sidebar-small, 0px);
54
54
  `;function xt(e){let t=(0,o.getValue)(e);if(!t)return`Untitled range`;let n=t.match(/(.+)(\d+)/);if(!n)return`Untitled range`;let r=n?.[2]?parseInt(n[2],10):1;return`${n?n[1]:``}${r+1}`}function St(){let e=(0,i.useInStack)(`Range`),[{size:t},n]=(0,l.useGridOptions)(`default-grid-size`,{defaultGridSize:`grid-sm`,onDark:!0}),r=(0,d.useVault)(),s=(0,d.useManifest)(),c=(0,u.useMemo)(()=>(0,o.createRangeHelper)(r),[r]),p=(0,a.useInlineCreator)(),[g,_]=(0,u.useState)(!1),[v,y]=(0,u.useState)(null),b=(0,u.useCallback)((e,t)=>{I.current&&(R.current=I.current.scrollTop),y({range:e,canvas:t})},[]),x=(0,u.useCallback)(()=>{y(null),requestAnimationFrame(()=>{I.current&&(I.current.scrollTop=R.current)})},[]),{isSplitting:S,setIsSplitting:C,splitEffect:w}=Ve();(0,u.useEffect)(w,[e]);let T=(0,d.useVaultSelector)((t,n)=>{let r=(0,m.toRef)(e?.resource);if(r)return c.rangeToTableOfContentsTree(n.get(r),{showNoNav:!0});if(!s.structures)return null;let i=n.get(s.structures||[]);return c.rangesToTableOfContentsTree(i,void 0,{showNoNav:!0})||null},[s,e]);(0,u.useEffect)(()=>{if(!T){y(null);return}y(e=>{if(e===null)return null;let t=(T.items||[]).find(e=>e.type===`Canvas`);return t?e?.range.id===T.id?e:{range:T,canvas:t}:null})},[T?.id]);let E=(0,a.useGenericEditor)(T?.id?{id:T?.id,type:`Range`}:void 0,{allowNull:!0}),D=(0,u.useCallback)((e,t,n)=>{E.structural.ranges.mergeRanges(e,t,n)},[E]),O=(0,u.useCallback)(async e=>{e!==-1&&E.structural.items.deleteAtIndex(e)},[E]),k=(0,u.useCallback)(async(e,t)=>{T&&await E.structural.ranges.splitRange(T,e,t,t=>p.create(`@manifest-editor/range-with-items`,{type:`Range`,label:{en:[xt(e.label)]},items:[]},{parent:{property:`items`,resource:{id:T.id,type:`Range`},atIndex:t}}))},[T,E,p]),{edit:A}=(0,a.useLayoutActions)(),{back:j}=(0,a.useEditingStack)(),[M,N]=(0,u.useState)(!1),[P,F]=(0,u.useState)(!1),I=(0,u.useRef)(null),L=(0,u.useRef)(null),R=(0,u.useRef)(0),[z,ee]=(0,u.useState)(!1),B=(T?.items??[]).filter(e=>e.type===`Range`),V=B.length;(0,u.useEffect)(()=>{if(typeof window>`u`||V===0){N(!1);return}let e=document.getElementById(`range-workbench-scroll`),t=B[B.length-1]?.id,n=t?document.getElementById(`workbench-${t}`):null;if(!e||!n)return;let r=new IntersectionObserver(([e])=>N(e.isIntersecting),{root:e,threshold:0,rootMargin:`0px 0px -1px 0px`});r.observe(n);let i=n.getBoundingClientRect(),a=e.getBoundingClientRect(),o=i.top<a.bottom&&i.bottom>a.top;return N(!!o),()=>r.disconnect()},[V,B]),(0,u.useEffect)(()=>{let e=document.getElementById(`range-workbench-scroll`);if(!e)return;let t=()=>{let{scrollTop:t,clientHeight:n,scrollHeight:r}=e;F(t+n>=r-2)};t(),e.addEventListener(`scroll`,t);let n=new ResizeObserver(t);return n.observe(e),window.addEventListener(`resize`,t),()=>{e.removeEventListener(`scroll`,t),window.removeEventListener(`resize`,t),n.disconnect()}},[T?.id,V,S,t]),(0,u.useEffect)(()=>{let e=I.current,t=L.current;if(!e||!t)return;let n=new IntersectionObserver(([e])=>{e&&ee(e.isIntersecting)},{root:e,threshold:.01});return n.observe(t),()=>{n.disconnect()}},[V,S,v]);let H=(T?.items||[]).filter(e=>e.type===`Canvas`),te=(0,u.useCallback)(()=>{I.current?.scrollTo({top:0,behavior:`smooth`})},[]),ne=(0,u.useCallback)(()=>{let e=L.current,t=I.current;e&&t?e.scrollIntoView({behavior:`smooth`,block:`end`,inline:`end`}):t&&t.scrollTo({top:t.scrollHeight,behavior:`smooth`})},[]),U=(0,d.useVaultSelector)((e,t)=>{if(!s?.structures)return null;let n=t.get(s.structures||[]);return c.rangesToTableOfContentsTree(n,void 0,{showNoNav:!0})||null},[s]),re=(0,u.useMemo)(()=>{let e=new Map,t=n=>{if(n?.items)for(let r of n.items)r?.type===`Range`&&(e.set(r.id,n.id),t(r))};return U&&t(U),e},[U]),W=(0,m.toRef)(e?.resource)?.id??e?.resource?.id??null,ie=(0,u.useCallback)(()=>{if(!W){j();return}let e=re.get(W);e?A({id:e,type:`Range`}):j()},[W,re,A,j]),ae=(0,u.useMemo)(()=>!!(W&&re.has(W)),[W,re]),oe=(0,d.useVaultSelector)((e,t)=>{if(!v?.range?.id)return null;let n=t.get(v.range.id);return n?.label?(0,o.getValue)(n.label):(0,o.getValue)(v.range.label)},[v?.range?.id]);return T?(0,f.jsxs)(_t,{id:`range-workbench-scroll`,ref:I,children:[!v&&(0,f.jsxs)(vt,{className:`flex flex-row justify-between bg-me-primary-500 sticky top-0 h-16 z-30 border-me-400 border-b`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-4`,children:[ae?(0,f.jsx)(l.ActionButton,{"aria-label":`Go to parent range`,onPress:()=>ie(),children:(0,f.jsx)(Be,{"aria-hidden":`true`,className:`text-xl`})}):null,g&&!T.isVirtual?(0,f.jsx)(i.InlineLabelEditor,{className:``,resource:T,onSubmit:()=>_(!1)}):(0,f.jsx)(i.InlineLocaleStringEditor,{editor:E.descriptive.label,as:`h2`,placeholder:`Untitled range`,className:`text-xl text-white`,children:T.label},T.id),(0,f.jsxs)(h.MenuTrigger,{children:[(0,f.jsx)(l.ActionButton,{"aria-label":`Range actions`,children:(0,f.jsx)(l.MoreMenuIcon,{"aria-hidden":`true`,className:`text-xl`})}),(0,f.jsx)(h.Popover,{className:`bg-white shadow-md rounded-md p-1`,children:(0,f.jsx)(h.Menu,{children:(0,f.jsxs)(h.MenuItem,{className:`hover:bg-gray-100 px-2 py-1 text-sm m-0.5 flex gap-2 items-center`,onAction:()=>_(!0),children:[(0,f.jsx)(je,{}),`Edit range label`]})})})]}),!S&&(T?.items?.length??0)>0&&!T.isRangeLeaf&&(0,f.jsxs)(l.ActionButton,{onPress:()=>C(!0),children:[(0,f.jsx)(Pe,{className:`text-xl`}),` Split range`]}),(0,f.jsx)(Ke,{})]}),n]}),S&&!v?(0,f.jsxs)(yt,{className:`mb-4 flex gap-4 sticky top-16 rounded-none bg-me-primary-600 z-30`,children:[`Splitting range, click to confirm the the new range item`,(0,f.jsx)(l.ActionButton,{onPress:()=>C(!1),children:`Exit splitting mode`})]}):null,v&&(0,f.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,f.jsxs)(vt,{className:`flex bg-me-primary-500 sticky top-0 h-16 z-20 border-b-white border-b items-center gap-4`,children:[(0,f.jsx)(l.ActionButton,{"aria-label":`Back to range`,onPress:x,children:(0,f.jsx)(Fe,{"aria-hidden":`true`,className:`text-xl`})}),g&&!T.isVirtual?(0,f.jsx)(i.InlineLabelEditor,{className:`text-base font-normal mt-1`,resource:v.range,onSubmit:()=>_(!1)}):(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(d.LocaleString,{className:`text-xl text-left truncate overflow-ellipsis min-w-0 text-white`,children:oe}),(0,f.jsxs)(h.MenuTrigger,{children:[(0,f.jsx)(l.ActionButton,{"aria-label":`Range actions`,children:(0,f.jsx)(l.MoreMenuIcon,{"aria-hidden":`true`,className:`text-xl`})}),(0,f.jsx)(h.Popover,{className:`bg-white shadow-md rounded-md p-1`,children:(0,f.jsx)(h.Menu,{children:(0,f.jsxs)(h.MenuItem,{className:`hover:bg-gray-100 px-2 py-1 text-sm m-0.5 flex gap-2 items-center`,onAction:()=>_(!0),children:[(0,f.jsx)(je,{}),`Edit range label`]})})})]})]})]}),(0,f.jsx)($e,{range:v.range,canvas:v.canvas,onBack:()=>y(null),setCanvas:e=>y(t=>t&&{...t,canvas:e})})]}),!v&&(T.items||[]).map((e,t)=>{if(e.type===`Canvas`)return null;let n=t-1,r=t+1,i=r!==T.items?.length&&T.items?.[r]?.items?.length===0?(0,o.getValue)(T.items?.[r]?.label):xt(e.label);return(0,f.jsx)(ft,{idx:t,isSplitting:S,onSplit:k,range:e,onMergeUp:t===0?void 0:(t,r)=>D(e,T.items?.[n],r),onMergeDown:T.items?.[r]?(t,n)=>D(e,T.items?.[r],n):void 0,nextRangeLabel:i,onDelete:()=>O(t),mergeUpLabel:n===-1?``:T.items?.[n]?.label,mergeDownLabel:r===T.items?.length?``:T.items?.[r]?.label,onPreviewCanvas:b,onClosePreview:()=>y(null)},e.id)}),!v&&H.length?(0,f.jsx)(d.RangeContext,{range:T.id,children:(0,f.jsx)(Ue,{})}):null,H.length===0&&B.length===0&&(0,f.jsx)(bt,{children:(0,f.jsx)(We,{extraClasses:`my-4`})}),!v&&B.length>0?(0,f.jsx)(`div`,{className:`sticky bottom-5 float-right right-5`,children:z?(0,f.jsxs)(l.ActionButton,{primary:!0,onPress:te,children:[`Scroll to top `,(0,f.jsx)(Be,{})]}):(0,f.jsxs)(l.ActionButton,{primary:!0,onPress:ne,children:[`Scroll to bottom `,(0,f.jsx)(ze,{})]})}):null,(0,f.jsx)(`div`,{id:`workbench-bottom`,ref:L})]}):null}const Ct={id:`manifest-context-menus`,label:`Context menus`,render:()=>(0,f.jsx)(wt,{})};function wt(){return(0,f.jsx)(Tt,{})}function Tt(){let e=(0,i.useInStack)(`Canvas`),t=e?.resource.source,n=(0,a.useEditingResource)()?.resource?.source?.id,r=(0,d.useCanvas)(t||void 0),{edit:o}=(0,a.useLayoutActions)(),s=r?.items?.[0]?.id,[c,l]=(0,a.useCreator)({id:s,type:`AnnotationPage`},`items`,`Annotation`,t,{isPainting:!0});return(0,a.useCustomContextMenu)({sectionTitle:`Canvas`,resource:{type:`Canvas`},items:[{id:`edit-canvas`,label:`Edit metadata`,enabled:!0,onAction:()=>o({id:e?.resource?.source?.id,type:`Canvas`},void 0,{forceOpen:!0})},{id:`add-media`,label:`Add media...`,enabled:!0,onAction:({resource:e})=>{n!==e.id&&o(e),l.create()}},{id:`add-browser`,label:`Add from IIIF Browser`,enabled:!0,onAction:({resource:e})=>{n!==e.id&&o(e),l.creator(`@manifest-editor/iiif-browser-creator`)}}]},[t,n,c]),null}function Et({title:e,...t}){return(0,f.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,height:`1em`,width:`1em`,...t,children:[(0,f.jsx)(`path`,{fill:`none`,d:`M0 0h24v24H0z`}),(0,f.jsx)(`path`,{d:`M20 9H4v2h16V9zM4 15h16v-2H4v2z`}),e?(0,f.jsx)(`title`,{children:e}):null]})}function Dt(){let e=(0,d.useVault)(),t=(0,d.useManifest)(),n=(0,a.useManifestEditor)(),r=(0,i.useInStack)(`Range`),s=(0,u.useMemo)(()=>(0,o.createRangeHelper)(e),[e]),{edit:c}=(0,a.useLayoutActions)(),{back:p}=(0,a.useEditingStack)(),{isEditing:g,showCanvases:v,toggleShowCanvases:y}=ct(),b=(0,d.useVaultSelector)((e,n)=>{if(r)return s.rangeToTableOfContentsTree(n.get(r.resource),{showNoNav:!0});let i=n.get(t.structures||[]);return s.rangesToTableOfContentsTree(i,void 0,{showNoNav:!0})||{}},[e,t,r]),x=(0,u.useMemo)(()=>(b.items||[]).filter(e=>e.type===`Range`),[b]),S=at(b);async function C(e){return Promise.all(e.map(async e=>e.kind===`text`?JSON.parse(await e.getText(`text/plain`)):null))}let{dragAndDropHooks:w}=(0,h.useDragAndDrop)({isDisabled:!g,getItems:(e,t)=>[...e].map(e=>{let t=S.find(t=>t.item.id===e);return t?{"text/plain":JSON.stringify({item:t.item.id,parent:t.parent?{id:t.parent.id}:void 0})}:{"text/plain":e.toString()}}),renderDragPreview(e){return(0,f.jsx)(`div`,{className:`opacity-50 bg-gray-200 rounded p-1`,children:(0,f.jsxs)(`span`,{className:``,children:[e.length,` items`]})})},onDrop:async t=>{let n=await C(t.items),r=null;if(r=t.target.type===`root`?b.id:t.target.key,!r){console.log(`[error] No valid target found`);return}let i=S.find(e=>t.target.key===e.item.id);if(t.target.type===`item`&&t.target.dropPosition===`on`&&i?.item.type===`Canvas`)return;let a=r.toString();if(t.dropOperation===`move`&&t.target.type===`item`&&(t.target.dropPosition===`before`||t.target.dropPosition===`after`?a=i?.parent?.id:t.target.dropPosition===`on`&&(a=r.toString())),!a){console.log(`[error] No valid target parent found`);return}if(!e.get({id:a,type:`Range`})){console.log(`[error] No valid target range found in Vault`);return}let o=new _.EditorInstance({reference:{id:a,type:`Range`},vault:e}),s=n[0],c=S.find(e=>s.item===e.item.id);if(!c){console.log(`[error] No valid item found for item to move`);return}if(!c.parent){console.log(`[error] No valid parent found for item to move`);return}let l=e.get({id:c.parent.id,type:`Range`}),u=new _.EditorInstance({reference:{id:c.parent.id,type:`Range`},vault:e});if(t.target.type===`root`||t.target.type===`item`&&t.target.dropPosition===`on`){let e=l.items.find(e=>(0,m.toRef)(e,`Canvas`)?.id===c.item.id);if(!e){console.log(`[error] No valid reference found for item to move`);return}let t=l.items.indexOf(e);if(t===-1){console.log(`[error] No valid index found for item to move`);return}o.structural.items.add(e),u.structural.items.deleteAtIndex(t);return}if(c.parent.id===a){let e=l.items.findIndex(e=>(0,m.toRef)(e,`Canvas`)?.id===c.item.id),t=l.items.findIndex(e=>(0,m.toRef)(e,`Canvas`)?.id===r);if(e===t){console.log(`[error] No valid index found for item to move`);return}if(e===-1||t===-1){console.log(`[error] Invalid index found for item to move`);return}u.structural.items.reorder(e,t);return}let d=l.items.findIndex(e=>(0,m.toRef)(e,`Canvas`)?.id===c.item.id);if(d===-1){console.log(`[error] Invalid index found for item to move`);return}let f=l.items[d];if(!f){console.log(`[error] Invalid reference found for item to move`);return}let p=e.get({id:a,type:`Range`});if(!p){console.log(`[error] Invalid target parent found`);return}let h=p.items.findIndex(e=>(0,m.toRef)(e)?.id===r);if(h===-1){console.log(`[error] Invalid target item found`);return}let g=!1;if(t.target.dropPosition===`after`&&(g=o.structural.items.addAfter(h,f)),t.target.dropPosition===`before`&&(g=o.structural.items.addBefore(h,f)),g){let e=l.items.indexOf(f);e!==-1&&u.structural.items.deleteAtIndex(e)}}}),T=(0,u.useCallback)(t=>{if(b.isVirtual){let e=n.structural.structures.getWithoutTracking().findIndex(e=>e.id===t.id);e!==-1&&n.structural.structures.deleteAtIndex(e);return}let r=new _.EditorInstance({reference:{id:b.id,type:`Range`},vault:e}),i=r.structural.items.getWithoutTracking().findIndex(e=>e.id===t.id);i!==-1&&r.structural.items.deleteAtIndex(i)},[b.id,b.isVirtual,n,e]),E=(0,f.jsx)(`div`,{className:`flex items-center gap-4 mb-4`,children:r?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(l.ActionButton,{"aria-label":`Back to parent range`,onPress:()=>p(),children:(0,f.jsx)(l.BackIcon,{"aria-hidden":`true`,className:`text-xl`})}),(0,f.jsx)(d.LocaleString,{as:`h3`,children:b.label})]}):null});return b.isRangeLeaf?(0,f.jsxs)(f.Fragment,{children:[E,(0,f.jsx)(l.EmptyState,{children:`This Range only contains canvases.`})]}):x.length===0?(0,f.jsxs)(f.Fragment,{children:[E,(0,f.jsx)(l.EmptyState,{children:`No ranges found`})]}):(0,f.jsxs)(f.Fragment,{children:[E,(0,f.jsx)(h.GridList,{className:`w-full flex flex-col gap-2`,items:x,dragAndDropHooks:w,dependencies:[g],children:e=>(0,f.jsx)(h.GridListItem,{id:e.id,onAction:()=>{g||c(e)},className:`border border-gray-300 hover:border-me-500 shadow-sm rounded bg-white relative p-4`,children:(0,f.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(d.LocaleString,{className:`text-lg mb-4`,children:e.label}),(0,f.jsxs)(`div`,{className:`text-sm text-me-primary-600`,children:[e.items?.length,` `,e.isRangeLeaf?`Canvases`:`Ranges`]})]}),g?(0,f.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,f.jsxs)(h.MenuTrigger,{children:[(0,f.jsx)(l.ActionButton,{"aria-label":`Actions for ${(0,o.getValue)(e.label)||`untitled range`}`,children:(0,f.jsx)(l.MoreMenuIcon,{"aria-hidden":`true`,className:`text-lg`})}),(0,f.jsx)(h.Popover,{className:`bg-white shadow-md rounded-md p-1`,children:(0,f.jsx)(h.Menu,{children:(0,f.jsxs)(h.MenuItem,{onAction:()=>window.confirm(`Are you sure you want to delete this range?`)&&T(e),className:`hover:bg-gray-100 px-2 py-1 text-sm m-0.5 flex text-red-500 gap-2 items-center`,children:[(0,f.jsx)(l.DeleteForeverIcon,{}),` Delete range item`]})})})]}),(0,f.jsx)(h.Button,{"aria-label":`Reorder ${(0,o.getValue)(e.label)||`untitled range`}`,slot:`drag`,children:(0,f.jsx)(Et,{"aria-hidden":`true`,className:`text-xl`})})]}):null]})})})]})}function Ot(){let{setIsSplitting:e}=Ve();return(0,f.jsxs)(l.SidebarContent,{children:[(0,f.jsx)(l.ActionButton,{onPress:()=>e(!1),children:`Exit splitting mode`}),(0,f.jsxs)(`div`,{className:`flex flex-col justify-center items-center px-4 gap-4`,children:[(0,f.jsx)(Pe,{className:`w-32 h-32 text-gray-300`}),(0,f.jsx)(`div`,{className:`text-center text-black/80`,children:`Hover over the Canvases to select where you want to add a new range item. Click to select that Canvas. Note the first canvas can’t be split.`}),(0,f.jsxs)(`div`,{style:{background:`#EFF6FF`,padding:`1em`,border:`1px solid #1E40AF`,borderRadius:`4px`},children:[(0,f.jsx)(l.InfoIcon,{fontSize:`18px`,height:30,fill:`#31539F`,style:{float:`right`}}),`Creating your first range adds one range called “Range 1” that contains every canvas. You can rename it, split it, or move canvases into sub-ranges.`]})]})]})}function kt(){let{ref:e,structural:t}=(0,a.useManifestEditor)(),n=(0,a.useInlineCreator)(),r=async()=>{if(!e)return;let r=await n.create(`@manifest-editor/range-top-level`,{label:{en:[`Range 1`]},type:`Range`,items:t.items.getWithoutTracking().map(e=>e)},{rootId:e().id});n.create(`@manifest-editor/range-top-level`,{type:`Range`,label:{en:[`Table of contents`]},items:[r]},{parent:{property:`structures`,resource:e()}})};return(0,f.jsxs)(l.Sidebar,{children:[(0,f.jsx)(l.SidebarHeader,{title:`Ranges`,actions:[{icon:(0,f.jsx)(l.AddIcon,{className:`text-2xl`}),title:`Add range`,disabled:!0,onClick:()=>void 0}]}),(0,f.jsx)(l.SidebarContent,{children:(0,f.jsxs)(`div`,{className:`flex flex-col items-center justify-center p-4`,children:[(0,f.jsx)(`div`,{className:`p-4 opacity-50 text-center`,children:`This manifest does not yet have a range(s). If you want to offer navigation, such as a table of contents, you can create a range.`}),(0,f.jsxs)(l.ActionButton,{large:!0,primary:!0,onPress:()=>r(),children:[(0,f.jsx)(l.AddIcon,{className:`text-xl`}),` Create new range`]})]})})]})}function At({range:e,setSelectedTopLevelRange:t}){let n=(0,a.useManifestEditor)(),r=(0,d.useVault)(),i=(0,a.useInlineCreator)(),o=(0,u.useCallback)(async()=>{new _.EditorInstance({reference:{id:e.id,type:`Range`},vault:r});let t=e.items||[],a=await i.create(`@manifest-editor/range-top-level`,{type:`Range`,label:{en:[`Range 1`]},items:[]},{parent:{property:`structures`,resource:{id:n.technical.id.getWithoutTracking(),type:`Manifest`},atIndex:0}});r.dispatch((0,s.moveEntities)({subjects:{type:`slice`,startIndex:1,length:t.length},from:{id:n.technical.id.getWithoutTracking(),type:`Manifest`,key:`structures`},to:{id:a.id,type:`Range`,key:`items`}}))},[]),c=(0,u.useCallback)(()=>{n.structural.ranges.empty()},[]);return(0,f.jsxs)(`div`,{children:[(0,f.jsx)(l.InfoMessage,{className:`mb-2 leading-tight text-sm`,children:`This manifests contains multiple top-level ranges. You can either merge them together into a single range or select a range to edit.`}),(0,f.jsx)(`h3`,{className:`mb-2 text-black/40`,children:`Choose an option`}),(0,f.jsxs)(`ul`,{className:`mb-4`,children:[(0,f.jsx)(`li`,{className:`px-2 py-1`,children:(0,f.jsxs)(l.ActionButton,{onClick:o,children:[(0,f.jsx)(Ye,{}),`Combine into single range`]})}),(0,f.jsx)(`li`,{className:`px-2 py-1`,children:(0,f.jsxs)(l.ActionButton,{onClick:c,children:[(0,f.jsx)(l.DeleteForeverIcon,{}),`Delete ranges and start again`]})})]}),(0,f.jsx)(`h3`,{className:`mb-2 text-black/40`,children:`Choose a range to edit`}),(0,f.jsx)(`ul`,{children:(e.items||[]).map(e=>(0,f.jsx)(`li`,{className:`mb-1 bg-gray-100 hover:bg-gray-200 rounded px-2 py-1`,children:(0,f.jsx)(`button`,{onClick:()=>t({id:e.id,type:`Range`}),children:(0,f.jsx)(d.LocaleString,{children:e.label})})},e.id))})]})}const jt={id:`@manifest-editor/ranges-listing`,label:`Ranges`,icon:(0,f.jsx)(Ne,{}),focusedMode:{onSelect:({actions:e})=>{e.centerPanel.open({id:`range-workbench`})}},render:()=>(0,f.jsx)(Mt,{})};function Mt(){let t=(0,d.useVault)(),n=(0,d.useManifest)(),{edit:r}=(0,a.useLayoutActions)(),i=(0,u.useMemo)(()=>(0,o.createRangeHelper)(t),[t]),[s,c]=(0,l.useLocalStorage)(`isCardView`,!1),[p,m]=(0,u.useState)(null),h=(0,u.useMemo)(()=>i.rangesToTableOfContentsTree(p?[t.get(p)]:t.get(n.structures||[]),void 0,{showNoNav:!0}),[p,n?.structures]),{isSplitting:g,splitEffect:_,setIsSplitting:v}=Ve(),{showCanvases:y,toggleShowCanvases:b,isEditing:x,toggleIsEditing:S}=ct();(0,u.useEffect)(()=>_(),[_]);let C=(0,u.useMemo)(()=>n?.structures?.[0]?i.isContiguous((n.structures||[])[0],n.items,{detail:!0}):null,[n,i]);return h?(0,f.jsxs)(l.Sidebar,{children:[(0,f.jsx)(l.SidebarHeader,{title:h.label||`Untitled range`,actions:[{id:`card-view`,title:s?`Tree view`:`Card view`,icon:s?(0,f.jsx)(e.s,{className:`text-xl`}):(0,f.jsx)(Le,{className:`text-xl`}),onClick:()=>{c(!s)}},{id:`edit-ranges`,title:`Edit range`,icon:(0,f.jsx)(l.ListEditIcon,{className:`text-xl`}),toggled:x,onClick:S,disabled:h?.isVirtual},{id:`split-range`,title:`Split range`,icon:(0,f.jsx)(Pe,{className:`text-xl`}),onClick:()=>v(!g),toggled:g,disabled:h?.isVirtual||(h?.items?.length??0)<=1}]}),(0,f.jsxs)(l.SidebarContent,{className:`p-2`,id:`range-listing-sidebar`,children:[p?(0,f.jsxs)(l.ActionButton,{className:`mb-4`,onClick:()=>m(null),children:[(0,f.jsx)(Fe,{}),` Back to Range List`]}):null,h.isVirtual?(0,f.jsx)(At,{range:h,setSelectedTopLevelRange:e=>{r(e),m(e)}}):(0,f.jsxs)(f.Fragment,{children:[C?null:(0,f.jsx)(l.WarningMessage,{className:`mb-2`,children:`Warning: Non-contiguous range`}),g?(0,f.jsx)(Ot,{}):s?(0,f.jsx)(Dt,{}):(0,f.jsx)(lt,{selectedTopLevelRange:p,hideCanvases:!y})]})]})]}):(0,f.jsx)(kt,{})}const Nt={id:`@manifest-editor/tags`,label:`Tags`,icon:(0,f.jsx)(Vt,{}),supports:({vault:e,rootResource:t})=>Pt(e,t),render:()=>(0,f.jsx)(Ft,{})};function Pt(e,t){if(!e||t?.type!==`Manifest`||!t.id)return!1;let n=(e.get(t,{skipSelfReturn:!1})?.items||[]).map(e=>e?.id).filter(e=>!!e).map(e=>({id:e,type:`Canvas`}));return(0,a.getResourceTagGroups)(e,n).length>0}function Ft(){let e=(0,d.useVault)(),{structural:t}=(0,a.useManifestEditor)(),n=t.items.get()||[],r=(0,u.useMemo)(()=>n.map(e=>e?.id).filter(e=>!!e).map(e=>({id:e,type:`Canvas`})),[n]),i=(0,u.useMemo)(()=>r.map(e=>e.id).join(`|`),[r]),o=(0,d.useVaultSelector)(()=>(0,a.getResourceTagGroups)(e,r),[i]),s=(0,u.useMemo)(()=>o.flatMap(e=>e.rows),[o]),c=(0,u.useMemo)(()=>s.map(e=>e.key).join(`|`),[s]),[p,m]=(0,u.useState)(()=>new Set),h=(0,u.useMemo)(()=>(0,a.createManifestEditorTagsApi)(e),[e]),g=(0,u.useMemo)(()=>s.filter(e=>p.has(e.key)),[s,p]),_=(0,u.useMemo)(()=>o.reduce((e,t)=>e+t.tagCount,0),[o]),v=(0,u.useMemo)(()=>new Set(o.flatMap(e=>e.canvasIds)).size,[o]);(0,u.useEffect)(()=>{let e=new Set(s.map(e=>e.key));m(t=>{let n=new Set(Array.from(t).filter(t=>e.has(t)));return n.size===t.size?t:n})},[c,s]);function y(e,t){if(!e.length)return;let n=e.reduce((e,t)=>e+t.canvasCount,0),r=new Set(e.flatMap(e=>e.canvasIds)).size;if(window.confirm(`Delete ${K(n,`tag application`)} from ${K(r,`canvas`)}?\n\n${t}`)){for(let t of e)for(let e of t.canvasIds)h.removeTag({id:e,type:`Canvas`},t.type,t.id);m(t=>{let n=new Set(t);for(let t of e)n.delete(t.key);return n})}}function b(e){y(e.rows,`Type: ${e.type}`)}function x(){y(g,`${K(g.length,`tag`)} selected.`)}function S(){if(_&&window.confirm(`Delete all ${K(_,`tag application`)} from ${K(v,`canvas`)}?`)){for(let e of r)h.setTags(e,[]);m(new Set)}}return(0,f.jsxs)(l.Sidebar,{children:[(0,f.jsx)(l.SidebarHeader,{title:`Tags`,actions:[{icon:(0,f.jsx)(Ht,{className:`text-xl`}),title:`Delete all tags`,disabled:_===0,onClick:S}]}),(0,f.jsxs)(l.SidebarContent,{className:`p-3`,children:[(0,f.jsx)(It,{totalTagApplications:_,taggedCanvasCount:v,totalCanvasCount:r.length}),r.length?o.length?(0,f.jsx)(`div`,{className:`grid gap-3 pb-4`,children:o.map(e=>(0,f.jsx)(Rt,{group:e,selectedRows:p,onToggleRow:(e,t)=>{m(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r})},onRemoveGroup:()=>b(e)},e.key))}):(0,f.jsx)(Lt,{title:`No canvas tags`,message:`Canvas tags added by editor tools and background actions will appear here.`}):(0,f.jsx)(Lt,{title:`No canvases`,message:`Canvas tags will appear here after canvases are added.`})]}),(0,f.jsx)(`div`,{className:`border-t border-me-gray-200 bg-white p-3`,children:(0,f.jsxs)(l.ActionButton,{primary:!0,center:!0,className:`w-full justify-center`,isDisabled:!g.length,onPress:x,children:[(0,f.jsx)(Ht,{className:`text-xl`}),`Delete selected (`,g.length,`)`]})})]})}function It({totalTagApplications:e,taggedCanvasCount:t,totalCanvasCount:n}){return(0,f.jsxs)(`div`,{className:`mb-3 grid grid-cols-2 gap-2 text-xs`,children:[(0,f.jsxs)(`div`,{className:`rounded border border-me-gray-200 bg-me-gray-50 p-2`,children:[(0,f.jsx)(`div`,{className:`font-medium text-me-gray-600`,children:`Tag applications`}),(0,f.jsx)(`div`,{className:`text-lg font-semibold text-me-gray-900`,children:e})]}),(0,f.jsxs)(`div`,{className:`rounded border border-me-gray-200 bg-me-gray-50 p-2`,children:[(0,f.jsx)(`div`,{className:`font-medium text-me-gray-600`,children:`Tagged canvases`}),(0,f.jsxs)(`div`,{className:`text-lg font-semibold text-me-gray-900`,children:[t,`/`,n]})]})]})}function Lt({title:e,message:t}){return(0,f.jsxs)(`div`,{className:`flex flex-col items-center justify-center gap-3 py-10 text-center`,children:[(0,f.jsx)(Vt,{className:`h-16 w-16 text-me-gray-300`}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`h2`,{className:`text-sm font-semibold text-me-gray-900`,children:e}),(0,f.jsx)(`p`,{className:`mt-1 text-sm text-me-gray-500`,children:t})]})]})}function Rt({group:e,selectedRows:t,onToggleRow:n,onRemoveGroup:r}){return(0,f.jsxs)(`section`,{className:`overflow-hidden rounded border border-me-gray-200 bg-white`,children:[(0,f.jsxs)(`div`,{className:`flex items-start justify-between gap-2 border-b border-me-gray-200 bg-me-gray-50 px-3 py-2`,children:[(0,f.jsxs)(`div`,{className:`min-w-0`,children:[(0,f.jsx)(`h2`,{className:`truncate text-sm font-semibold text-me-gray-900`,children:e.type}),(0,f.jsxs)(`p`,{className:`text-xs text-me-gray-600`,children:[K(e.tagCount,`tag application`),` on `,K(e.canvasCount,`canvas`)]})]}),(0,f.jsx)(`button`,{type:`button`,className:`flex h-7 w-7 flex-shrink-0 items-center justify-center rounded text-me-gray-500 hover:bg-red-100 hover:text-red-700`,"aria-label":`Delete ${e.type} tags`,title:`Delete ${e.type} tags`,onClick:r,children:(0,f.jsx)(Ht,{className:`text-lg`})})]}),(0,f.jsx)(`div`,{className:`divide-y divide-me-gray-100`,children:e.rows.map(e=>(0,f.jsx)(zt,{row:e,selected:t.has(e.key),onToggle:t=>n(e.key,t)},e.key))})]})}function zt({row:e,selected:t,onToggle:n}){let r=Bt(e);return(0,f.jsxs)(`label`,{className:`flex min-w-0 cursor-pointer items-center gap-2 px-3 py-2 hover:bg-me-gray-50`,children:[(0,f.jsx)(`input`,{type:`checkbox`,className:`h-4 w-4 flex-shrink-0`,checked:t,onChange:e=>n(e.currentTarget.checked)}),(0,f.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,f.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,f.jsx)(a.ManifestEditorTagBadge,{tag:r,style:{fontSize:11,lineHeight:`14px`}}),(0,f.jsx)(`span`,{className:`min-w-0 truncate text-sm font-medium text-me-gray-900`,children:r.label})]}),(0,f.jsx)(`div`,{className:`mt-1 truncate text-xs text-me-gray-500`,children:e.id})]}),(0,f.jsx)(`div`,{className:`flex-shrink-0 rounded bg-me-gray-100 px-2 py-1 text-xs font-medium text-me-gray-700`,children:e.canvasCount})]})}function Bt(e){let t=e.tag;return{type:e.type,id:e.id,label:t.label||e.id||e.type,backgroundColor:t.backgroundColor||`#e5e7eb`,textColor:t.textColor||`#111827`,icon:t.icon}}function K(e,t){return`${e} ${t}${e===1?``:`s`}`}function Vt(e){return(0,f.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`1em`,height:`1em`,viewBox:`0 0 24 24`,...e,children:(0,f.jsx)(`path`,{fill:`currentColor`,d:`M20.59 13.41 12.58 5.4A2 2 0 0 0 11.17 4H5a1 1 0 0 0-1 1v6.17a2 2 0 0 0 .59 1.41l8.01 8.01a2 2 0 0 0 2.82 0l5.17-5.17a2 2 0 0 0 0-2.82ZM7.5 8.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z`})})}function Ht(e){return(0,f.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`1em`,height:`1em`,viewBox:`0 0 24 24`,"aria-hidden":`true`,...e,children:[(0,f.jsx)(`path`,{fill:`none`,d:`M0 0h24v24H0z`}),(0,f.jsx)(`path`,{fill:`currentColor`,d:`M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12Zm2-10h8v10H8V9Zm7.5-5-1-1h-5l-1 1H5v2h14V4h-3.5Z`})]})}const Ut=/(?:^|[&#])t=(?:npt:)?([0-9]+(?:\.[0-9]+)?)?(?:,([0-9]+(?:\.[0-9]+)?))?/;function q(e){return Number.isFinite(e)?Math.max(0,Math.round(e*1e3)/1e3):0}function Wt(e,t){return`t=${Gt(e)},${Gt(t)}`}function Gt(e){return q(e).toFixed(3).replace(/\.?0+$/,``)}function Kt(e,t,n){return{type:`SpecificResource`,source:{id:e,type:`Canvas`},selector:{type:`FragmentSelector`,value:Wt(t,n)}}}function qt(e){if(!e||typeof e!=`object`||!(0,m.isSpecificResource)(e))return null;let t=e.source,n=typeof t==`string`?t:t?.id,r=typeof t==`string`?`Canvas`:t?.type;if(!n||r!==`Canvas`)return null;let i=an(e.selector),a=on(n),o=i.map(on).find(Boolean)||a;return o?{canvasId:n.split(`#`)[0]||n,start:o.start,end:o.end}:null}function Jt(e,t){let n=[];return(t?.structures||[]).forEach((r,i)=>{rn(e,r,{id:t.id,type:`Manifest`},`structures`,i,n)}),Yt(n)}function Yt(e){return[...e].sort((e,t)=>e.canvasId.localeCompare(t.canvasId)||e.start-t.start||e.end-t.end)}function Xt(e,t){return e.filter(e=>e.canvasId===t).sort((e,t)=>e.start-t.start||e.end-t.end)}function Zt(e,t){let n=[],r=[...e].sort((e,t)=>e.start-t.start),i=0;for(let e of r)e.start>i&&n.push({start:i,end:e.start,duration:e.start-i}),i=Math.max(i,e.end);return t>i&&n.push({start:i,end:t,duration:t-i}),n}function Qt(e,t,n={}){let r=[],i=[...e].sort((e,t)=>e.start-t.start||e.end-t.end);for(let e of i)e.end<=e.start&&r.push({code:`invalid-time`,rangeId:e.id,message:`End time must be after start time.`}),(e.start<0||e.end>t)&&r.push({code:`out-of-bounds`,rangeId:e.id,message:`Range must stay within the canvas duration.`}),n.requireTitle&&!e.title.trim()&&r.push({code:`blank-title`,rangeId:e.id,message:`Title is required.`});for(let e=1;e<i.length;e++){let t=i[e-1],n=i[e];n.start<t.end&&r.push({code:`overlap`,rangeId:n.id,message:`Ranges cannot overlap.`})}return{valid:r.length===0,issues:r}}function $t(e,t,n,r){let i=[...t].filter(e=>e.id!==r).sort((e,t)=>e.start-t.start),a=[...i].reverse().find(t=>t.end<=e.start||t.start<e.start),o=i.find(t=>t.start>=e.end||t.end>e.start),s=a?a.end:0,c=o?o.start:n,l=Math.min(Math.max(q(e.start),s),c);return{start:l,end:Math.max(l,Math.min(Math.max(q(e.end),s),c))}}function en(e){let t=Math.round(q(e)*1e3),n=Math.floor(t/36e5),r=Math.floor(t%36e5/6e4),i=Math.floor(t%6e4/1e3),a=t%1e3;return`${n>0?`${n.toString().padStart(2,`0`)}:`:``}${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}.${a.toString().padStart(3,`0`)}`}function J(e){let t=Math.floor(q(e)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return`${n>0?`${n.toString().padStart(2,`0`)}:`:``}${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}`}function tn(e){let t=e.trim();if(!t)return null;if(/^\d+(?:\.\d+)?$/.test(t))return Number.parseFloat(t);let n=t.split(`:`);if(n.length<2||n.length>3)return null;let r=n.map(e=>Number.parseFloat(e));return r.some(e=>Number.isNaN(e))?null:r.length===2?r[0]*60+r[1]:r[0]*3600+r[1]*60+r[2]}function nn(e){return`${e}/range/${Math.random().toString(36).slice(2,10)}`}function rn(e,t,n,r,i,a){let s=e.get(t,{skipSelfReturn:!1});s?.items&&s.items.forEach((t,c)=>{if(t?.type===`Range`){rn(e,t,{id:s.id,type:`Range`},`items`,c,a);return}let l=qt(t);l&&a.push({id:s.id,type:`Range`,canvasId:l.canvasId,title:(0,o.getValue)(s.label)||`Untitled range`,label:s.label,start:l.start,end:l.end,duration:l.end-l.start,behavior:s.behavior,range:s,rangeRef:{id:s.id,type:`Range`},parentRef:n,parentKey:r,parentIndex:i,item:t,itemIndex:c})})}function an(e){return e?(Array.isArray(e)?e:[e]).map(e=>typeof e==`string`?e:e?.type===`FragmentSelector`&&typeof e.value==`string`||typeof e?.value==`string`?e.value:``).filter(Boolean):[]}function on(e){let t=Ut.exec(e);if(!t)return null;let n=t[1]?Number.parseFloat(t[1]):0,r=t[2]?Number.parseFloat(t[2]):NaN;return!Number.isFinite(n)||!Number.isFinite(r)?null:{start:q(n),end:q(r)}}function sn(e,t,n){let r=nn(t.id),i={id:r,type:`Range`,label:n.label,behavior:n.behavior?.length?n.behavior:void 0,items:[Kt(n.canvasId,n.start,n.end)]},a={id:r,type:`Range`};return e.dispatch((0,s.batchActions)({actions:[(0,s.importEntities)({entities:{Range:{[r]:i}}}),(0,s.addMappings)({mapping:{[r]:`Range`}}),s.entityActions.addReference({id:t.id,type:`Manifest`,key:`structures`,reference:a,index:n.atIndex})]})),a}function Y(e,t,n){let r=n.start??t.start,i=n.end??t.end,a=Kt(t.canvasId,r,i);e.batch(()=>{n.label&&e.modifyEntityField(t.rangeRef,`label`,n.label),n.behavior&&e.modifyEntityField(t.rangeRef,`behavior`,n.behavior.length?n.behavior:void 0),e.dispatch(s.entityActions.updateReference({id:t.rangeRef.id,type:`Range`,key:`items`,index:t.itemIndex,reference:a}))})}function cn(e,t){e.dispatch(s.entityActions.removeReference({id:t.parentRef.id,type:t.parentRef.type,key:t.parentKey,index:t.parentIndex,reference:t.rangeRef}))}const ln=(0,g.create)(e=>({canvasId:null,selectedRangeId:null,draft:null,markStart:null,setCanvasId:t=>e({canvasId:t,selectedRangeId:null,draft:null,markStart:null}),setSelectedRangeId:t=>e({selectedRangeId:t}),setDraft:t=>e({draft:t}),setMarkStart:t=>e({markStart:t})}));function un(e,t){return(t?.items||[]).map(t=>{let n=e.get(t,{skipSelfReturn:!1});return n?dn(e,n):null}).filter(e=>!!e)}function dn(e,t){let n=fn(e,t),r=Number(t?.duration||n?.duration||0);return!n||!r?null:{id:t.id,label:t.label,title:(0,o.getValue)(t.label)||`Untitled canvas`,duration:r,media:{id:n.id,type:n.type,format:n.format,width:n.width,height:n.height},captions:pn(e,t)}}function fn(e,t){for(let n of mn(e,t))if((Array.isArray(n?.motivation)?n.motivation:[n?.motivation]).includes(`painting`))for(let t of gn(n.body)){let n=hn(e,t);if(n?.type===`Sound`||n?.type===`Video`)return n}return null}function pn(e,t){let n=[];for(let r of mn(e,t))if((Array.isArray(r?.motivation)?r.motivation:[r?.motivation]).some(e=>e===`supplementing`||e===`captioning`||e===`transcribing`))for(let t of gn(r.body)){let r=hn(e,t);if(!r?.id)continue;let i=r.format||r.type;(i===`text/vtt`||i===`text/plain`||String(r.id).endsWith(`.vtt`))&&n.push({id:r.id,label:r.label,language:r.language,format:i})}return n}function mn(e,t){let n=[];for(let r of t?.items||[]){let t=e.get(r,{skipSelfReturn:!1});for(let r of t?.items||[]){let t=e.get(r,{skipSelfReturn:!1});t&&n.push(t)}}return n}function hn(e,t){let n=(0,m.isSpecificResource)(t)?t.source:t;return n?e.get(n,{skipSelfReturn:!1})||n:null}function gn(e){return e?Array.isArray(e)?e:[e]:[]}const _n=`@manifest-editor/av-temporal-range`;async function vn(e,t){let n=t.generateId(`range`,t.getParent());return t.embed({id:n,type:`Range`,label:e.label,behavior:e.behavior?.length?e.behavior:void 0,items:[Kt(e.canvasId,e.start,e.end)]})}function yn(e){let t=e.options.initialData||{},n=t.canvas,r=t.canvasId||n?.id,i=t.segments||[],a=(0,u.useRef)(null),[o,s]=(0,u.useState)(t.title||`Untitled range`),[c,d]=(0,u.useState)(en(t.start||0)),[p,m]=(0,u.useState)(en(t.end||Math.min(n?.duration||0,30))),[h,g]=(0,u.useState)(!1),_=(0,u.useMemo)(()=>{let e=tn(c),t=tn(p),a=[];if(e===null||t===null)a.push(`Enter readable start and end times.`);else if(n){let r=Qt([...i,{id:`__draft__`,title:o,start:e,end:t}],n.duration,{requireTitle:!0});r.valid||a.push(r.issues[0]?.message||`Range is invalid.`)}else t<=e&&a.push(`End time must be after start time.`);return r||a.push(`Canvas is missing.`),{startTime:e,endTime:t,errors:a}},[c,p,o,n,r,i]),v=t=>{t.preventDefault(),!(_.startTime===null||_.endTime===null||_.errors.length||!r)&&e.runCreate({type:`Range`,label:{en:[o.trim()]},canvasId:r,start:_.startTime,end:_.endTime,behavior:h?[`no-nav`]:[]})},y=()=>{!a.current||_.startTime===null||_.endTime===null||(a.current.currentTime=_.startTime,a.current.play())},b=e=>{_.startTime===null||_.endTime===null||_.endTime<=_.startTime||(e.currentTime<_.startTime||e.currentTime>=_.endTime)&&(e.currentTime=_.startTime)},x=e=>{_.endTime!==null&&e.currentTarget.currentTime>=_.endTime&&(e.currentTarget.pause(),e.currentTarget.currentTime=_.endTime)};return(0,u.useEffect)(()=>{!a.current||_.startTime===null||_.endTime===null||_.endTime<=_.startTime||(a.current.currentTime=_.startTime)},[_.startTime,_.endTime]),(0,f.jsxs)(l.Form.Form,{className:`flex flex-col gap-4`,onSubmit:v,children:[(0,f.jsxs)(`div`,{className:`flex items-start gap-3`,children:[n?.media.type===`Video`?(0,f.jsx)(l.VideoIcon,{className:`text-2xl`}):(0,f.jsx)(l.AudioIcon,{className:`text-2xl`}),(0,f.jsxs)(`div`,{className:`min-w-0`,children:[(0,f.jsx)(`h3`,{className:`font-semibold text-lg`,children:`Create A/V range`}),(0,f.jsx)(`p`,{className:`text-sm text-me-gray-700 truncate`,children:n?.title||t.canvasId})]})]}),n?(0,f.jsx)(`div`,{className:`rounded border border-me-gray-300 bg-me-gray-50 p-2`,children:n.media.type===`Video`?(0,f.jsx)(`video`,{ref:a,src:n.media.id,controls:!0,className:`max-h-64 w-full bg-black object-contain`,onPlay:e=>b(e.currentTarget),onSeeking:e=>b(e.currentTarget),onTimeUpdate:x}):(0,f.jsx)(`audio`,{ref:a,src:n.media.id,controls:!0,className:`w-full`,onPlay:e=>b(e.currentTarget),onSeeking:e=>b(e.currentTarget),onTimeUpdate:x})}):null,(0,f.jsxs)(l.Form.InputContainer,{children:[(0,f.jsx)(l.Form.Label,{htmlFor:`av-create-title`,children:`Title`}),(0,f.jsx)(l.Form.Input,{id:`av-create-title`,value:o,onChange:e=>s(e.currentTarget.value)})]}),(0,f.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,f.jsxs)(l.Form.InputContainer,{children:[(0,f.jsx)(l.Form.Label,{htmlFor:`av-create-start`,children:`Start`}),(0,f.jsx)(l.Form.Input,{id:`av-create-start`,value:c,onChange:e=>d(e.currentTarget.value)})]}),(0,f.jsxs)(l.Form.InputContainer,{children:[(0,f.jsx)(l.Form.Label,{htmlFor:`av-create-end`,children:`End`}),(0,f.jsx)(l.Form.Input,{id:`av-create-end`,value:p,onChange:e=>m(e.currentTarget.value)})]})]}),(0,f.jsxs)(`div`,{className:`flex items-center gap-3 text-sm`,children:[(0,f.jsxs)(`span`,{children:[`Duration:`,` `,_.startTime!==null&&_.endTime!==null?en(Math.max(0,_.endTime-_.startTime)):`Invalid`]}),(0,f.jsx)(l.ActionButton,{type:`button`,onPress:y,children:`Preview selection`})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,f.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>g(e.currentTarget.checked)}),`Hidden from navigation`]}),_.errors[0]?(0,f.jsx)(l.WarningMessage,{children:_.errors[0]}):null,(0,f.jsx)(l.ActionButton,{primary:!0,type:`submit`,isDisabled:!!_.errors.length,children:`Create range`})]})}const bn=(0,x.defineCreator)({id:_n,create:vn,label:`A/V temporal range`,summary:`Create a temporal range on an audio or video canvas`,icon:(0,f.jsx)(l.AudioIcon,{}),resourceType:`Range`,resourceFields:[`id`,`label`,`type`,`items`,`behavior`],supports:{initialData:!0,parentTypes:[`Manifest`],parentFields:[`structures`]},staticFields:{type:`Range`},render(e){return(0,f.jsx)(yn,{...e})}}),xn={id:`@manifest-editor/av-ranges-listing`,label:`A/V Ranges`,icon:(0,f.jsx)(l.AudioIcon,{}),options:{minWidth:300,maxWidth:360},render:()=>(0,f.jsx)(Sn,{})};function Sn(){(0,d.useVault)();let e=(0,d.useManifest)(),{create:t}=(0,a.useLayoutActions)(),{canvasId:n,selectedRangeId:r,draft:i,setCanvasId:o,setSelectedRangeId:s,setDraft:c}=ln(),[p,m]=(0,u.useState)(``),h=(0,u.useRef)(null),{canvases:g,segments:_}=(0,d.useVaultSelector)((t,n)=>({canvases:un(n,e),segments:Jt(n,e)}),[e]),v=(0,u.useMemo)(()=>g.length?g.find(e=>e.id===n)||g[0]:null,[g,n]);(0,u.useEffect)(()=>{!n&&v&&o(v.id)},[v?.id,n,o]);let y=(0,u.useMemo)(()=>v?Xt(_,v.id):[],[_,v?.id]),b=y.find(e=>e.id===r)||null,x=y.filter(e=>e.title.toLocaleLowerCase().includes(p.toLocaleLowerCase()));(0,u.useEffect)(()=>{b&&h.current&&h.current.scrollIntoView({behavior:`smooth`,block:`nearest`})},[b?.id]);let S=(n,r=`Untitled range`)=>{if(!e||!v)return;let i=$t(n,y,v.duration);i.end<=i.start||(t({type:`Range`,parent:{id:e.id,type:`Manifest`},property:`structures`,initialCreator:_n,initialData:{canvas:v,canvasId:v.id,segments:y,title:r,start:i.start,end:i.end}}),c(null))},C=v?Zt(y,v.duration):[];return(0,f.jsxs)(l.Sidebar,{children:[(0,f.jsx)(l.SidebarHeader,{title:`A/V Ranges`,actions:v?[{icon:(0,f.jsx)(l.AddIcon,{color:`currentColor`,height:16}),title:`New range`,onClick:()=>{if(!v)return;let e=C.find(e=>e.duration>.25)||{start:0,end:Math.min(30,v.duration)};c({start:e.start,end:e.end})}}]:[]}),(0,f.jsxs)(l.SidebarContent,{className:`p-3 flex flex-col gap-3`,children:[g.length?null:(0,f.jsx)(l.WarningMessage,{children:`No audio or video canvases are available for temporal range editing.`}),v?(0,f.jsxs)(f.Fragment,{children:[g.length>1?(0,f.jsxs)(l.Form.InputContainer,{children:[(0,f.jsx)(l.Form.Label,{htmlFor:`av-canvas-select`,children:`Canvas`}),(0,f.jsx)(`select`,{id:`av-canvas-select`,className:`p-2 bg-me-gray-100 border-b border-b-me-gray-500 text-sm`,value:v.id,onChange:e=>o(e.currentTarget.value),children:g.map(e=>(0,f.jsx)(`option`,{value:e.id,children:e.title},e.id))})]}):null,i?(0,f.jsxs)(`div`,{className:`rounded-lg border border-me-primary-300 bg-me-primary-50 p-3 flex flex-col gap-2`,children:[(0,f.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,f.jsx)(`div`,{className:`text-sm font-semibold text-me-primary-900`,children:`Draft range`}),(0,f.jsx)(`button`,{type:`button`,className:`text-me-gray-500 hover:text-me-gray-700 p-0.5 rounded hover:bg-white/50`,"aria-label":`Discard draft`,onClick:()=>c(null),children:(0,f.jsx)(l.CloseIcon,{width:14,height:14})})]}),(0,f.jsxs)(`div`,{className:`text-sm tabular-nums text-me-primary-700`,children:[J(i.start),` → `,J(i.end),(0,f.jsxs)(`span`,{className:`text-me-primary-500 ml-2`,children:[`(`,J(i.end-i.start),`)`]})]}),(0,f.jsx)(l.ActionButton,{primary:!0,center:!0,onPress:()=>S(i),children:`Create range from selection`})]}):null,b?(0,f.jsx)(`div`,{ref:h,children:(0,f.jsx)(Cn,{segment:b,canvasDuration:v.duration,segments:y},b.id)}):null,!b&&!i&&y.length===0?(0,f.jsx)(l.InfoMessage,{children:`Create the first range by dragging on the timeline, using Mark in/out, or pressing New range.`}):null,y.length>0?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,f.jsx)(l.Form.InputContainer,{className:`flex-1 min-w-0`,children:(0,f.jsx)(l.Form.Input,{id:`av-range-search`,value:p,placeholder:`Search ranges…`,onChange:e=>m(e.currentTarget.value),"aria-label":`Search ranges`})}),(0,f.jsxs)(`span`,{className:`text-xs text-me-gray-500 tabular-nums flex-shrink-0`,children:[x.length,`/`,y.length]})]}),(0,f.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:x.map((e,t)=>(0,f.jsx)(`button`,{type:`button`,className:[`text-left rounded-md border px-3 py-2 transition-colors`,r===e.id?`border-me-primary-400 bg-me-primary-50`:`border-me-gray-200 bg-white hover:bg-me-gray-50`].join(` `),onClick:()=>s(e.id),children:(0,f.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,f.jsx)(`span`,{className:`text-[10px] font-mono text-me-gray-400 w-4 text-right shrink-0 mt-0.5 leading-tight`,children:t+1}),(0,f.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,f.jsx)(`div`,{className:[`text-sm font-medium truncate leading-tight`,r===e.id?`text-me-primary-900`:`text-me-gray-900`].join(` `),children:e.title}),(0,f.jsxs)(`div`,{className:`text-xs text-me-gray-500 tabular-nums mt-0.5`,children:[J(e.start),` – `,J(e.end),` `,(0,f.jsxs)(`span`,{className:`text-me-gray-400`,children:[`· `,J(e.duration)]})]})]}),r===e.id?(0,f.jsx)(`span`,{className:`w-1 h-4 rounded-full bg-me-primary-500 shrink-0 mt-0.5`}):null]})},e.id))})]}):null]}):null]})]})}function Cn({segment:e,canvasDuration:t,segments:n}){let r=(0,d.useVault)(),{setSelectedRangeId:i}=ln(),[a,o]=(0,u.useState)(e.title),[s,c]=(0,u.useState)(en(e.start)),[p,m]=(0,u.useState)(en(e.end)),[h,g]=(0,u.useState)(!1),[_,v]=(0,u.useState)(e.behavior?.includes(`no-nav`)||!1),y=tn(s),b=tn(p),x=y===null||b===null?{valid:!1,issues:[{message:`Enter readable start and end times.`}]}:Qt([...n.filter(t=>t.id!==e.id),{id:e.id,title:a,start:y,end:b}],t,{requireTitle:!0}),S=n.findIndex(t=>t.id===e.id),C=S>0?n[S-1]:null,w=S>=0?n[S+1]:null;return(0,f.jsxs)(`div`,{className:`rounded-lg border border-me-gray-200 bg-white overflow-hidden`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 bg-me-gray-50 border-b border-me-gray-200`,children:[(0,f.jsx)(`div`,{className:`text-xs font-semibold text-me-gray-600 uppercase tracking-wide flex-1`,children:`Edit range`}),(0,f.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 text-xs text-me-gray-500 hover:text-me-gray-700 px-1.5 py-0.5 rounded hover:bg-me-gray-200 transition-colors`,onClick:()=>i(null),children:[(0,f.jsx)(l.CloseIcon,{width:12,height:12}),`Deselect`]})]}),(0,f.jsxs)(`div`,{className:`p-3 flex flex-col gap-3`,children:[(0,f.jsxs)(l.Form.InputContainer,{children:[(0,f.jsx)(l.Form.Label,{htmlFor:`av-range-title`,children:`Title`}),(0,f.jsx)(l.Form.Input,{id:`av-range-title`,value:a,onChange:e=>o(e.currentTarget.value)})]}),(0,f.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,f.jsxs)(l.Form.InputContainer,{children:[(0,f.jsx)(l.Form.Label,{htmlFor:`av-range-start`,children:`Start`}),(0,f.jsx)(l.Form.Input,{id:`av-range-start`,value:s,onChange:e=>c(e.currentTarget.value)})]}),(0,f.jsxs)(l.Form.InputContainer,{children:[(0,f.jsx)(l.Form.Label,{htmlFor:`av-range-end`,children:`End`}),(0,f.jsx)(l.Form.Input,{id:`av-range-end`,value:p,onChange:e=>m(e.currentTarget.value)})]})]}),(0,f.jsxs)(`div`,{className:`text-xs text-me-gray-500 tabular-nums`,children:[`Duration:`,` `,(0,f.jsx)(`span`,{className:`font-medium text-me-gray-700`,children:y!==null&&b!==null?J(Math.max(0,b-y)):`—`})]}),x.valid?null:(0,f.jsx)(l.WarningMessage,{children:x.issues[0]?.message||`Range is invalid.`}),(0,f.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,f.jsx)(l.ActionButton,{primary:!0,isDisabled:!x.valid,onPress:()=>{if(y===null||b===null||!x.valid)return;let i=$t({start:y,end:b},n,t,e.id);Y(r,e,{label:{en:[a.trim()]},start:i.start,end:i.end,behavior:_?[`no-nav`]:[]})},children:`Save`}),(0,f.jsx)(l.ActionButton,{className:`text-red-700 hover:bg-red-50`,onPress:()=>{cn(r,e),i(null)},children:`Delete`})]}),C||w?(0,f.jsxs)(`div`,{className:`flex flex-wrap gap-2 border-t border-me-gray-100 pt-2.5`,children:[C?(0,f.jsx)(l.ActionButton,{onPress:()=>{Y(r,C,{end:e.end}),cn(r,e),i(C.id)},children:`← Merge with previous`}):null,w?(0,f.jsx)(l.ActionButton,{onPress:()=>{Y(r,e,{end:w.end}),cn(r,w),i(e.id)},children:`Merge with next →`}):null]}):null,(0,f.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1.5 text-left text-xs font-medium text-me-gray-500 hover:text-me-gray-700 py-0.5 transition-colors`,onClick:()=>g(e=>!e),children:[(0,f.jsx)(wn,{open:h}),`Advanced options`]}),h?(0,f.jsxs)(`label`,{className:`flex items-center gap-2 text-sm text-me-gray-700 pl-5`,children:[(0,f.jsx)(`input`,{type:`checkbox`,checked:_,onChange:e=>v(e.currentTarget.checked)}),`Hidden from navigation`]}):null]})]})}function wn({open:e}){return(0,f.jsx)(`svg`,{"aria-hidden":`true`,viewBox:`0 0 16 16`,className:`h-3.5 w-3.5 shrink-0 transition-transform`,style:{transform:e?`rotate(90deg)`:`rotate(0deg)`},fill:`currentColor`,children:(0,f.jsx)(`path`,{d:`M5.5 3.5 10 8l-4.5 4.5`,stroke:`currentColor`,strokeWidth:`1.5`,fill:`none`,strokeLinecap:`round`,strokeLinejoin:`round`})})}const Tn={id:`av-ranges-workbench`,label:`A/V Range Workbench`,icon:``,render:()=>(0,f.jsx)(An,{})},En=.75;function Dn(e,t,n){let r=[0,n,...t.flatMap(e=>[e.start,e.end])],i=r.reduce((t,n)=>Math.abs(n-e)<Math.abs(t-e)?n:t,r[0]||0);return Math.abs(i-e)<=En?i:e}function On(e,t,n){return{start:Dn(e.start,t,n),end:Dn(e.end,t,n)}}function kn(e,t,n,r){let i=t.end-t.start,a=[0,Math.max(0,r-i),...n.filter(e=>e.id!==t.id).flatMap(e=>[e.end,e.start-i])].filter(e=>e>=0&&e<=r-i),o=a.reduce((t,n)=>Math.abs(n-e)<Math.abs(t-e)?n:t,a[0]||0);return Math.abs(o-e)<=En?o:e}function An(){let e=(0,d.useVault)(),t=(0,d.useManifest)(),{create:n}=(0,a.useLayoutActions)(),r=(0,u.useRef)(null),i=(0,u.useRef)(null),{canvasId:o,selectedRangeId:s,draft:c,markStart:p,setCanvasId:m,setSelectedRangeId:h,setDraft:g,setMarkStart:_}=ln(),[v,y]=(0,u.useState)(0),[b,x]=(0,u.useState)(!1),[S,C]=(0,u.useState)(1),[w,T]=(0,u.useState)(1),[E,D]=(0,u.useState)(!1),[O,k]=(0,u.useState)(1),[A,j]=(0,u.useState)(!1),{canvases:M,segments:N}=(0,d.useVaultSelector)((e,n)=>({canvases:un(n,t),segments:Jt(n,t)}),[t]),P=(0,u.useMemo)(()=>M.length?M.find(e=>e.id===o)||M[0]:null,[M,o]);(0,u.useEffect)(()=>{!o&&P&&m(P.id)},[P?.id,o,m]);let F=(0,u.useMemo)(()=>P?Xt(N,P.id):[],[N,P?.id]),I=F.find(e=>e.id===s)||null,L=P?Zt(F,P.duration):[];(0,u.useEffect)(()=>{let e=r.current;!e||!I||(e.currentTime=I.start,y(I.start))},[I?.id]),(0,u.useEffect)(()=>{let e=r.current;e&&(e.playbackRate=S)},[S]),(0,u.useEffect)(()=>{let e=r.current;e&&(e.volume=w)},[w]);let R=(0,u.useCallback)(e=>{let t=r.current,n=Math.max(0,Math.min(e,P?.duration||0));t&&(t.currentTime=n),y(n)},[P?.duration]),z=(0,u.useCallback)(()=>{let e=r.current;e&&(e.paused?e.play():e.pause())},[]),ee=(0,u.useCallback)(()=>{I&&(R(I.start),r.current?.play())},[I,R]),B=(0,u.useCallback)(()=>{if(!t||!P||!c)return;let e=$t(c,F,P.duration);e.end<=e.start||(n({type:`Range`,parent:{id:t.id,type:`Manifest`},property:`structures`,initialCreator:_n,initialData:{canvas:P,canvasId:P.id,segments:F,title:`Untitled range`,start:e.start,end:e.end}}),g(null))},[t,P,c,F,n,g]),V=(0,u.useCallback)(()=>{if(!t||!P||!I)return;let n=v;if(n<=I.start||n>=I.end)return;Y(e,I,{end:n});let r=sn(e,t,{canvasId:P.id,start:n,end:I.end,label:{en:[`${I.title} 2`]},atIndex:I.parentKey===`structures`?I.parentIndex+1:void 0});h(r.id)},[t,P,I,v,e,h]),H=(0,u.useCallback)(()=>{I&&(cn(e,I),h(null))},[I,e,h]),te=(0,u.useCallback)((t,n)=>{if(!P)return null;let r=F.find(e=>e.id===t);if(!r)return null;let i=$t(n,F,P.duration,r.id);return i.end<=i.start?null:(Y(e,r,i),i)},[P,F,e]),ne=(0,u.useCallback)((t,n)=>{if(!P)return;let r=F.slice().sort((e,t)=>e.start-t.start),i=r.findIndex(e=>e.id===t),a=r[i];if(!a)return;let o=a.end-a.start,s=i>0?r[i-1]:null,c=i>=0&&i<r.length-1?r[i+1]:null,l=s?s.end:0,u=(c?c.start:P.duration)-o,d=Math.max(l,Math.min(n,u));Y(e,a,{start:d,end:d+o})},[P,F,e]);if((0,u.useEffect)(()=>{let t=t=>{if(!(t.target instanceof HTMLInputElement||t.target instanceof HTMLTextAreaElement||t.target instanceof HTMLSelectElement)&&P){if(t.key===` `)t.preventDefault(),z();else if(t.key===`ArrowLeft`||t.key.toLowerCase()===`j`)R(v-5);else if(t.key===`ArrowRight`||t.key.toLowerCase()===`l`)R(v+5);else if(t.key.toLowerCase()===`i`)_(v);else if(t.key.toLowerCase()===`o`&&p!==null)g(On({start:Math.min(p,v),end:Math.max(p,v)},F,P.duration)),_(null);else if(t.key===`Enter`&&c)B();else if(t.key===`Escape`)g(null),_(null);else if(t.key.toLowerCase()===`s`)V();else if(t.key===`Delete`||t.key===`Backspace`)H();else if(t.key===`ArrowUp`||t.key===`ArrowDown`){t.preventDefault();let e=F.findIndex(e=>e.id===s),n=t.key===`ArrowUp`?Math.max(0,e-1):Math.min(F.length-1,e+1),r=F[e===-1?0:n];r&&h(r.id)}else if((t.key===`[`||t.key===`]`)&&I){let n=t.shiftKey?1:.1,r=$t(t.key===`[`?{start:I.start+(t.altKey?n:-n),end:I.end}:{start:I.start,end:I.end+(t.altKey?-n:n)},F,P.duration,I.id);Y(e,I,r)}}};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[P,v,p,c,I,s,F,z,R,B,V,H,g,_,h,e]),!M.length)return(0,f.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,children:(0,f.jsx)(l.WarningMessage,{children:`No audio or video canvases are available for temporal range editing.`})});if(!P)return null;let U=P.media.type===`Video`;return(0,f.jsxs)(`div`,{className:`h-full min-h-0 flex flex-col overflow-hidden bg-me-gray-50`,children:[(0,f.jsxs)(`div`,{className:`bg-white border-b border-me-gray-200 px-4 py-2.5 flex items-center gap-3 flex-shrink-0`,children:[(0,f.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,f.jsx)(`h2`,{className:`font-semibold truncate leading-tight`,children:P.title}),(0,f.jsxs)(`div`,{className:`text-xs text-me-gray-500 mt-0.5`,children:[U?`Video`:`Audio`,` ·`,` `,(0,f.jsx)(`span`,{className:`tabular-nums`,children:J(P.duration)})]})]}),p===null?null:(0,f.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-full bg-amber-50 border border-amber-200 px-3 py-1 text-xs text-amber-700 font-medium flex-shrink-0`,children:[(0,f.jsx)(Ln,{}),(0,f.jsxs)(`span`,{children:[`Mark in: `,J(p),` · press `,(0,f.jsx)(`kbd`,{className:`font-mono`,children:`O`}),` to mark end`]})]})]}),(0,f.jsxs)(`div`,{className:`flex-shrink-0 bg-white border-b border-me-gray-200`,children:[U?(0,f.jsx)(`div`,{className:`bg-black`,children:(0,f.jsx)(`video`,{ref:r,className:`block w-full max-h-[38vh] object-contain`,src:P.media.id,preload:`metadata`,playsInline:!0,onTimeUpdate:e=>{let t=e.currentTarget.currentTime;y(t),E&&I&&t>=I.end&&R(I.start)},onPlay:()=>x(!0),onPause:()=>x(!1),onEnded:()=>x(!1),children:P.captions.map(e=>(0,f.jsx)(`track`,{src:e.id,kind:`subtitles`,srcLang:e.language||`en`,label:e.language||`Captions`},e.id))})}):(0,f.jsx)(`audio`,{ref:r,src:P.media.id,preload:`metadata`,className:`hidden`,onTimeUpdate:e=>{let t=e.currentTarget.currentTime;y(t),E&&I&&t>=I.end&&R(I.start)},onPlay:()=>x(!0),onPause:()=>x(!1),onEnded:()=>x(!1),children:P.captions.map(e=>(0,f.jsx)(`track`,{src:e.id,kind:`subtitles`,srcLang:e.language||`en`,label:e.language||`Captions`},e.id))}),(0,f.jsx)(jn,{isVideo:U,isPlaying:b,currentTime:v,duration:P.duration,speed:S,volume:w,loopSelection:E,hasSelection:!!I,onTogglePlay:z,onSeek:R,onSpeed:C,onVolume:T,onPlaySelection:ee,onLoopSelection:D,onMarkStart:()=>_(v),onMarkEnd:()=>{p!==null&&(g(On({start:Math.min(p,v),end:Math.max(p,v)},F,P.duration)),_(null))},canMarkEnd:p!==null})]}),(0,f.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto p-4 flex flex-col gap-3`,children:[(0,f.jsx)(Un,{canvas:P,segments:F,gaps:L,currentTime:v,selectedRangeId:s,draft:c,scale:O,dragRef:i,onSeek:R,onSelectRange:h,onDraft:g,onCreateDraft:B,onResizeRange:te,onMoveRange:ne,onScale:k}),(0,f.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[(0,f.jsxs)(l.ActionButton,{isDisabled:!I,onPress:ee,children:[(0,f.jsx)(Hn,{}),`Play selection`]}),(0,f.jsxs)(l.ActionButton,{isDisabled:!I,onPress:V,children:[(0,f.jsx)(zn,{}),`Split at playhead`]}),(0,f.jsxs)(l.ActionButton,{isDisabled:!I,onPress:H,children:[(0,f.jsx)(Bn,{}),`Delete range`]}),P.captions.length?(0,f.jsxs)(l.ActionButton,{onPress:()=>j(e=>!e),children:[(0,f.jsx)(Vn,{}),A?`Hide captions`:`Show captions`]}):null]}),A&&P.captions[0]?(0,f.jsx)(Yn,{captionUrl:P.captions[0].id,currentTime:v,onSeek:R,onDraft:g}):null]})]})}function jn(e){return(0,f.jsxs)(`div`,{className:[`flex flex-col gap-2 px-3 py-2.5`,e.isVideo?`border-t border-me-gray-200 bg-me-gray-50`:``].join(` `),children:[(0,f.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,f.jsxs)(l.ActionButton,{primary:!0,large:!0,className:`min-w-[92px]`,onPress:e.onTogglePlay,children:[e.isPlaying?(0,f.jsx)(Nn,{}):(0,f.jsx)(Mn,{}),e.isPlaying?`Pause`:`Play`]}),(0,f.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,f.jsxs)(l.ActionButton,{onPress:()=>e.onSeek(e.currentTime-5),children:[(0,f.jsx)(Pn,{}),(0,f.jsx)(`span`,{children:`-5s`})]}),(0,f.jsxs)(l.ActionButton,{onPress:()=>e.onSeek(e.currentTime+5),children:[(0,f.jsx)(Fn,{}),(0,f.jsx)(`span`,{children:`+5s`})]})]}),(0,f.jsxs)(`div`,{className:`rounded bg-me-gray-100 border border-me-gray-200 px-2.5 py-1 text-sm tabular-nums text-me-gray-700`,children:[J(e.currentTime),` / `,J(e.duration)]})]}),(0,f.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,f.jsxs)(`label`,{className:`text-sm flex items-center gap-1.5 text-me-gray-600`,children:[(0,f.jsx)(`span`,{className:`text-xs`,children:`Speed`}),(0,f.jsx)(`select`,{value:e.speed,onChange:t=>e.onSpeed(Number(t.currentTarget.value)),className:`bg-white border border-me-gray-300 rounded px-1 py-0.5 text-xs`,children:[.5,.75,1,1.25,1.5,2].map(e=>(0,f.jsxs)(`option`,{value:e,children:[e,`x`]},e))})]}),(0,f.jsxs)(`label`,{className:`text-sm flex items-center gap-1.5 text-me-gray-600`,children:[(0,f.jsx)(In,{}),(0,f.jsx)(`input`,{"aria-label":`Volume`,type:`range`,min:0,max:1,step:.05,value:e.volume,onChange:t=>e.onVolume(Number(t.currentTarget.value)),className:`w-20`})]}),(0,f.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,f.jsxs)(l.ActionButton,{onPress:e.onMarkStart,children:[(0,f.jsx)(Ln,{}),`Mark in`]}),(0,f.jsxs)(l.ActionButton,{isDisabled:!e.canMarkEnd,onPress:e.onMarkEnd,children:[(0,f.jsx)(Rn,{}),`Mark out`]})]}),(0,f.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,f.jsxs)(l.ActionButton,{isDisabled:!e.hasSelection,onPress:e.onPlaySelection,children:[(0,f.jsx)(Hn,{}),`Play selection`]}),(0,f.jsxs)(`label`,{className:`text-xs flex items-center gap-1.5 px-2 py-1 text-me-gray-600`,children:[(0,f.jsx)(`input`,{type:`checkbox`,checked:e.loopSelection,disabled:!e.hasSelection,onChange:t=>e.onLoopSelection(t.currentTarget.checked)}),`Loop`]})]})]})]})}function X({children:e}){return(0,f.jsx)(`svg`,{"aria-hidden":`true`,viewBox:`0 0 20 20`,className:`h-4 w-4 shrink-0`,fill:`currentColor`,children:e})}function Mn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M6 4.5v11l9-5.5-9-5.5Z`})})}function Nn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M5 4h3v12H5V4Zm7 0h3v12h-3V4Z`})})}function Pn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M5 4h2v12H5V4Zm10.5 1v10L8 10l7.5-5Z`})})}function Fn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M13 4h2v12h-2V4ZM4.5 5 12 10l-7.5 5V5Z`})})}function In(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M3 7.5h3L10 4v12l-4-3.5H3v-5Zm10.2-.7 1.2-1.2A6 6 0 0 1 16 10a6 6 0 0 1-1.6 4.4l-1.2-1.2A4.2 4.2 0 0 0 14.3 10c0-1.2-.4-2.3-1.1-3.2Z`})})}function Ln(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M5 4h2v12H5V4Zm5 3h6v2h-6V7Zm0 4h4v2h-4v-2Z`})})}function Rn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M13 4h2v12h-2V4ZM4 7h6v2H4V7Zm2 4h4v2H6v-2Z`})})}function zn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M10 4h2v5.5l3-3 1.4 1.4L12 12.3l4.4 4.4-1.4 1.4-3-3V20h-2v-5.7l-3 3-1.4-1.4L9.9 12 6.5 8.7l1.4-1.4 2.1 2.1V4Z`})})}function Bn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M6 15h3L4.5 19 0 15h3V5h3v10Zm4-9h7v2h-7V6Zm0 4h5v2h-5v-2Zm0 4h3v2h-3v-2Z`})})}function Vn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M2 4a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2Zm2 5h2v1H4V9Zm0 2h6v1H4v-1Zm7 0h5v1h-5v-1Zm1-2h4v1h-4V9ZM4 7h12v1H4V7Z`})})}function Hn(){return(0,f.jsx)(X,{children:(0,f.jsx)(`path`,{d:`M4 5h2v10H4V5Zm10 0h2v10h-2V5ZM8 6.5l5 3.5-5 3.5v-7Z`})})}function Un({canvas:e,segments:t,gaps:n,currentTime:r,selectedRangeId:i,draft:a,scale:o,dragRef:s,onSeek:c,onSelectRange:d,onDraft:p,onCreateDraft:m,onResizeRange:h,onMoveRange:g,onScale:_}){let v=(0,u.useRef)(null),y=(0,u.useRef)(null),b=(0,u.useRef)(null),x=(0,u.useRef)(null),S=(0,u.useRef)(!1),[C,w]=(0,u.useState)(null),[T,E]=(0,u.useState)(null),[D,O]=(0,u.useState)(null),{major:k,minor:A}=(0,u.useMemo)(()=>Wn(e.duration,o),[e.duration,o]),j=t=>`${Math.max(0,Math.min(100,t/e.duration*100))}%`,M=t=>{let n=t.currentTarget.getBoundingClientRect();return Math.max(0,Math.min(e.duration,(t.clientX-n.left)/n.width*e.duration))},N=t=>{let n=y.current?.getBoundingClientRect();return n?Math.max(0,Math.min(e.duration,(t-n.left)/n.width*e.duration)):0};return(0,f.jsxs)(`div`,{className:`rounded-lg border border-me-gray-200 bg-white p-4 flex flex-col gap-3`,children:[(0,f.jsx)(`div`,{className:`flex items-center justify-end gap-3`,children:(0,f.jsxs)(`label`,{className:`flex items-center gap-2 text-xs text-me-gray-500`,children:[`Zoom`,(0,f.jsx)(`input`,{"aria-label":`Timeline zoom`,type:`range`,min:1,max:8,step:1,value:o,onChange:e=>_(Number(e.currentTarget.value))}),(0,f.jsxs)(`span`,{className:`w-6 tabular-nums`,children:[o,`x`]})]})}),(0,f.jsx)(`div`,{className:`overflow-x-auto pb-2`,children:(0,f.jsxs)(`div`,{className:`min-w-full`,style:{width:`${Math.max(1,o)*100}%`},children:[(0,f.jsx)(Gn,{duration:e.duration,major:k,toPercent:j}),(0,f.jsx)(`div`,{className:`text-[10px] font-medium text-me-gray-400 uppercase tracking-wider mb-1`,children:`Overview`}),(0,f.jsxs)(`div`,{ref:v,className:`relative h-8 rounded bg-me-gray-100 border border-me-gray-300 overflow-hidden`,style:{height:32,minHeight:32},onPointerDown:n=>c(Dn(M(n),t,e.duration)),onPointerMove:e=>w(M(e)),onPointerLeave:()=>w(null),children:[(0,f.jsx)(Kn,{major:k,minor:A,toPercent:j}),t.map(e=>(0,f.jsx)(`div`,{className:`absolute top-1 bottom-1 rounded-sm bg-me-primary-300`,style:{left:j(e.start),width:j(e.end-e.start)}},e.id)),C===null?null:(0,f.jsx)(qn,{time:C,duration:e.duration}),(0,f.jsx)(Jn,{currentTime:r,duration:e.duration})]}),(0,f.jsx)(`div`,{className:`mt-3 text-[10px] font-medium text-me-gray-400 uppercase tracking-wider mb-1`,children:`Ranges`}),(0,f.jsxs)(`div`,{ref:y,className:`relative h-28 rounded bg-me-gray-50 border border-me-gray-300 select-none overflow-hidden`,style:{height:112,minHeight:112},onPointerDown:n=>{let r=Dn(M(n),t,e.duration);s.current={start:r,end:r},n.currentTarget.setPointerCapture(n.pointerId),p({start:r,end:r})},onPointerMove:n=>{w(M(n));let r=b.current;if(r){let i=Dn(M(n),t.filter(e=>e.id!==r.segment.id),e.duration),a=h(r.segment.id,r.edge===`start`?{start:i,end:r.segment.end}:{start:r.segment.start,end:i});a&&c(r.edge===`start`?a.start:a.end);return}let i=x.current;if(i){let r=kn(N(n.clientX)-i.offset,i.segment,t,e.duration);i.moved=!0,g(i.segment.id,r);return}if(!s.current)return;let a=Dn(M(n),t,e.duration);s.current.end=a,p(On({start:Math.min(s.current.start,a),end:Math.max(s.current.start,a)},t,e.duration))},onPointerLeave:()=>{!b.current&&!x.current&&!s.current&&w(null)},onPointerUp:e=>{if(b.current){let t=b.current.pointerId;b.current=null,E(null),e.currentTarget.hasPointerCapture(t)&&e.currentTarget.releasePointerCapture(t);return}if(x.current){let t=x.current.pointerId;S.current=x.current.moved,x.current=null,O(null),e.currentTarget.hasPointerCapture(t)&&e.currentTarget.releasePointerCapture(t);return}let t=s.current;if(s.current=null,!t)return;let r=Math.min(t.start,t.end);if(Math.max(t.start,t.end)-r<.15){let e=n.find(e=>r>=e.start&&r<=e.end);p(e?{start:e.start,end:e.end}:null)}e.currentTarget.hasPointerCapture(e.pointerId)&&e.currentTarget.releasePointerCapture(e.pointerId)},children:[(0,f.jsx)(Kn,{major:k,minor:A,toPercent:j}),n.map(e=>(0,f.jsx)(`button`,{type:`button`,className:`absolute top-0 h-full bg-white/50 hover:bg-me-primary-50 border-x border-dashed border-me-gray-300`,style:{left:j(e.start),width:j(e.end-e.start)},onPointerDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),p({start:e.start,end:e.end})},"aria-label":`Create range from gap ${J(e.start)} to ${J(e.end)}`},`${e.start}-${e.end}`)),t.map(e=>(0,f.jsxs)(`button`,{type:`button`,className:[`absolute top-5 bottom-5 rounded-sm px-2 text-left overflow-hidden border shadow-sm group`,i===e.id||T===e.id||D===e.id?`bg-me-primary-500 text-white border-me-primary-700`:`bg-me-primary-200 border-me-primary-400 text-me-gray-900`].join(` `),style:{left:j(e.start),width:j(e.end-e.start),minWidth:54,cursor:i===e.id?`move`:`pointer`},onPointerDown:t=>{if(t.stopPropagation(),d(e.id),i!==e.id)return;let n=N(t.clientX)-e.start;x.current={pointerId:t.pointerId,segment:e,offset:n,moved:!1},O(e.id),y.current?.setPointerCapture(t.pointerId)},onClick:t=>{if(t.stopPropagation(),S.current){S.current=!1;return}d(e.id),c(e.start)},title:`${e.title}: ${J(e.start)} to ${J(e.end)}`,children:[(0,f.jsx)(`span`,{className:`absolute left-0 top-0 bottom-0 w-2 cursor-ew-resize bg-black/10 hover:bg-black/25`,"aria-hidden":`true`,style:{cursor:`ew-resize`},onPointerDown:t=>{t.stopPropagation(),d(e.id),b.current={edge:`start`,pointerId:t.pointerId,segment:e},E(e.id),y.current?.setPointerCapture(t.pointerId)}}),(0,f.jsx)(`span`,{className:`absolute right-0 top-0 bottom-0 w-2 cursor-ew-resize bg-black/10 hover:bg-black/25`,"aria-hidden":`true`,style:{cursor:`ew-resize`},onPointerDown:t=>{t.stopPropagation(),d(e.id),b.current={edge:`end`,pointerId:t.pointerId,segment:e},E(e.id),y.current?.setPointerCapture(t.pointerId)}}),(0,f.jsx)(`span`,{className:`block truncate text-xs font-semibold leading-4`,children:e.title}),(0,f.jsxs)(`span`,{className:`block truncate text-[10px] leading-4 opacity-80 tabular-nums`,children:[J(e.start),` - `,J(e.end)]})]},e.id)),a?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(`div`,{className:`absolute top-3 bottom-3 border-2 border-me-primary-700 bg-me-primary-200/70 pointer-events-none rounded-sm`,style:{left:j(a.start),width:j(a.end-a.start),minWidth:4}}),(0,f.jsxs)(`div`,{className:`absolute top-1 z-20 rounded bg-white border border-me-primary-500 shadow-md p-1 flex gap-1 items-center`,style:{left:j((a.start+a.end)/2),transform:`translateX(-50%)`},onPointerDown:e=>e.stopPropagation(),children:[(0,f.jsxs)(`span`,{className:`text-xs tabular-nums whitespace-nowrap`,children:[J(a.start),` - `,J(a.end)]}),(0,f.jsx)(l.ActionButton,{primary:!0,onPress:m,children:`Create`})]})]}):null,(0,f.jsx)(Jn,{currentTime:r,duration:e.duration})]})]})})]})}function Wn(e,t=1){let n=[.25,.5,1,2,5,10,15,30,60,120,300,600,900,1800,3600],r=Math.round(14*t),i=Math.round(60*t),a=e/r,o=n.find(e=>e>=a)??n[n.length-1],s=o;for(let t of n){if(t>=o)break;let n=o/t;if(Math.abs(Math.round(n)-n)<.001&&e/t<=i){s=t;break}}let c=[],l=[],u=Math.round(o/s),d=s*.01;for(let t=0;t*s<=e+d;t++){let n=Math.round(Math.min(t*s,e)*1e3)/1e3;if(l.length>0&&n===l[l.length-1]||(l.push(n),t%u===0&&c.push(n),n>=e))break}return(l[l.length-1]??-1)<e&&(l.push(e),c.push(e)),c.length>=2&&c[c.length-1]===e&&e-(c[c.length-2]??0)<o*.55&&c.pop(),{major:c,minor:l}}function Gn({duration:e,major:t,toPercent:n}){return(0,f.jsx)(`div`,{className:`relative h-5 text-[11px] text-me-gray-700 select-none`,children:t.map(t=>{let r=t===0?`translateX(0)`:t===e?`translateX(-100%)`:`translateX(-50%)`;return(0,f.jsx)(`span`,{className:`absolute top-0 tabular-nums`,style:{left:n(t),transform:r},children:J(t)},t)})})}function Kn({major:e,minor:t,toPercent:n}){let r=new Set(e);return(0,f.jsx)(f.Fragment,{children:t.map(e=>r.has(e)?(0,f.jsx)(`div`,{className:`absolute top-0 bottom-0 border-l border-me-gray-300/80`,style:{left:n(e)}},e):(0,f.jsx)(`div`,{className:`absolute top-1/4 bottom-0 border-l border-me-gray-200/70`,style:{left:n(e)}},e))})}function qn({time:e,duration:t}){let n=`${Math.max(0,Math.min(100,e/t*100))}%`;return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(`div`,{className:`absolute top-0 bottom-0 w-px pointer-events-none z-20`,style:{left:n,backgroundColor:`#111827`}}),(0,f.jsx)(`div`,{className:`absolute top-0 z-30 -translate-x-1/2 rounded px-1.5 py-0.5 text-[11px] tabular-nums pointer-events-none shadow`,style:{left:n,backgroundColor:`#111827`,color:`#ffffff`},children:J(e)})]})}function Jn({currentTime:e,duration:t}){return(0,f.jsx)(`div`,{className:`absolute top-0 bottom-0 w-0.5 bg-red-600 pointer-events-none`,style:{left:`${Math.max(0,Math.min(100,e/t*100))}%`}})}function Yn({captionUrl:e,currentTime:t,onSeek:n,onDraft:r}){let[i,a]=(0,u.useState)([]),o=(0,u.useRef)(null);return(0,u.useEffect)(()=>{let t=!1;return fetch(e).then(e=>e.text()).then(e=>{t||a(Xn(e))}).catch(()=>{t||a([])}),()=>{t=!0}},[e]),i.length?(0,f.jsx)(`div`,{className:`rounded border border-me-gray-300 bg-white p-3 max-h-72 overflow-y-auto`,children:i.map((e,i)=>{let a=t>=e.start&&t<=e.end;return(0,f.jsxs)(`button`,{type:`button`,className:[`block w-full text-left rounded p-2 text-sm`,a?`bg-me-primary-100`:`hover:bg-me-gray-100`].join(` `),onClick:()=>n(e.start),onPointerDown:()=>{o.current=e.start},onPointerUp:()=>{o.current!==null&&o.current!==e.start&&r({start:Math.min(o.current,e.start),end:Math.max(o.current,e.end)}),o.current=null},children:[(0,f.jsx)(`span`,{className:`text-xs text-me-gray-600 mr-2`,children:J(e.start)}),e.text]},`${e.start}-${i}`)})}):(0,f.jsx)(l.InfoMessage,{children:`Transcript could not be loaded.`})}function Xn(e){let t=e.replace(/\r/g,``).split(/\n\n+/),n=[];for(let e of t){let t=e.split(`
55
- `).filter(Boolean),r=t.findIndex(e=>e.includes(`-->`));if(r===-1)continue;let[i,a]=t[r].split(`-->`).map(e=>e.trim().split(/\s+/)[0]),o=Zn(i||``),s=Zn(a||``);o!==null&&s!==null&&n.push({start:o,end:s,text:t.slice(r+1).join(` `)})}return n}function Zn(e){let t=e.split(`:`);if(t.length===2){let e=Number.parseFloat(t[0]),n=Number.parseFloat(t[1]);return Number.isFinite(e)&&Number.isFinite(n)?e*60+n:null}if(t.length===3){let e=Number.parseFloat(t[0]),n=Number.parseFloat(t[1]),r=Number.parseFloat(t[2]);return Number.isFinite(e)&&Number.isFinite(n)&&Number.isFinite(r)?e*3600+n*60+r:null}return null}var Qn=e.m({background:()=>ir,centerPanels:()=>nr,creators:()=>rr,default:()=>$n,leftPanels:()=>tr}),$n={id:`@manifest-editor/av-ranges`,label:`A/V Ranges`,description:`Create and edit temporal ranges for audio and video canvases.`,author:`Digirati`,official:!0,defaultEnabled:!1,tags:[`audio`,`video`,`ranges`,`chaptering`],supports:{projectTypes:[`Manifest`]}};function er(e){if(!e.rootResource||e.rootResource.type!==`Manifest`||!e.vault)return!1;let t=e.vault.get(e.rootResource,{skipSelfReturn:!1});return un(e.vault,t).length>0}const tr=[{...xn,supports:er}],nr=[{...Tn,supports:er}],rr=[bn],ir=[{id:`av-ranges-plugin-sync`,label:`A/V ranges plugin sync`,render:()=>(0,f.jsx)(ar,{})}];function ar(){let{leftPanel:e,rightPanel:t}=(0,a.useLayoutState)(),{open:n,rightPanel:r}=(0,a.useLayoutActions)(),[i,o]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{if(e.current===xn.id){n({id:Tn.id}),t.open&&(r.close(),o(!0));return}!t.open&&i&&(r.open(),o(!1))},[e.current,t.open,i,n,r]),null}const or={id:`manifest-query-string`,label:`Query string`,render:()=>(0,f.jsx)(ur,{})};function sr(e,t){let n=new URLSearchParams(window.location.search),r=new URLSearchParams(n);t?r.set(e,t):r.delete(e),window.history.replaceState(null,``,`?${r.toString()}`)}function cr(e){sr(`canvas`,e)}function lr(e){sr(`leftPanel`,e)}function ur(){let t=(0,d.useManifest)(),n=(0,i.useInStack)(`Canvas`),{leftPanel:r,rightPanel:o}=(0,a.useLayoutState)(),{edit:s,leftPanel:c,rightPanel:l}=(0,a.useLayoutActions)(),{centerPanels:f,leftPanels:p}=(0,a.useAvailableLayouts)(),{canvasActions:m,open:h}=e.d(),{editorFeatureFlags:{rememberCanvasId:g=!0,rememberLeftPanelId:_=!1}={}}=(0,a.useConfig)(),v=(0,u.useRef)(null),y=(0,u.useRef)(null),b=r.open,[x,S]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{b&&S(!1)},[b]),(0,u.useEffect)(()=>{let t=new URLSearchParams(window.location.search),n=t.get(`canvas`);v.current=n,n&&(h({id:e.u.id}),h({id:`current-canvas`}),m.edit({id:n,type:`Canvas`}));let r=t.get(`leftPanel`);y.current=r,r&&p.some(e=>e.id===r)&&c.open({id:r})},[]),(0,u.useEffect)(()=>{_&&lr(r.current)},[r.current]),(0,u.useEffect)(()=>{let e=n?.resource?.source?.id;e&&(v.current=e),g&&cr(e)},[n?.resource?.source?.id]),(0,u.useEffect)(()=>{if(r.current===e.r.id&&(cr(null),t&&s(t,void 0,{forceOpen:!0,selectedTab:`@manifest-editor/descriptive-properties`}),f.some(t=>t.id===e.p.id)&&h({id:e.p.id})),r.current===jt.id&&h({id:gt.id}),r.current===e.u.id){let e=v.current||t?.items?.[0]?.id;e&&(h({id:`current-canvas`}),m.edit({id:e,type:`Canvas`}))}if(r.current===jt.id){let e=t?.structures?.[0]?.id;e&&t?.structures?.length===1&&s({id:e,type:`Range`})}r.current===jt.id&&o.open&&(l.close(),S(!0));let n=r.current!==jt.id;!o.open&&n&&x&&(l.open(),S(!1))},[r.current]),null}const Z=[{key:`glm-ocr`,label:`GLM OCR (1B)`},{key:`qwen-ocr`,label:`Qwen 3.6 (9B)`},{key:`gemma-ocr-large`,label:`Gemma 4 (31B)`},{key:`qwen-ocr-large`,label:`Qwen 3.6 (35B)`}];function dr(e){return Array.isArray(e)?e.filter(e=>typeof e?.key==`string`&&!!e.key.trim()&&typeof e?.label==`string`&&!!e.label.trim()).map(e=>({key:e.key.trim(),label:e.label.trim()})):[]}function fr(e){let t=dr(e),n=new Set(Z.map(e=>e.key));return[...Z,...t.filter(e=>!n.has(e.key)&&(n.add(e.key),!0))]}var pr=e.m({REMOTE_INFERENCE_ACTION_ID:()=>gr,REMOTE_INFERENCE_IMAGE_SIZES:()=>wr,STRUCTURED_OUTPUT_ACTION_ID:()=>_r,backgroundActions:()=>Oi,default:()=>hr,settings:()=>Dr});const mr=`@manifest-editor/remote-inference`;var hr={id:mr,label:`Remote Inference`,description:`Run remote OCR/HTR inference jobs against a configurable server`,author:`Digirati`,official:!0,defaultEnabled:!1,tags:[`ocr`],supports:{projectTypes:[`Manifest`]}};const gr=`@manifest-editor/remote-inference/action`,_r=`@manifest-editor/remote-inference/structured-output`,vr=`/remote-inference/`,yr=`@manifest-editor/remote-inference/serverUrl`,br=`@manifest-editor/remote-inference/apiKey`,xr=`@manifest-editor/remote-inference/model`,Sr=`@manifest-editor/remote-inference/structuredFields`,Q=`http://localhost:8000`,Cr=`qwen-structure`,wr=[768,1024,1536,2048],Tr=`glm-ocr`;function Er({value:e,onChange:t}){let n=dr(e.models),[r,i]=(0,u.useState)(``),[a,o]=(0,u.useState)(``),s=new Set([...Z,...n].map(e=>e.key)),c=!!r.trim()&&!!a.trim()&&!s.has(r.trim());return(0,f.jsxs)(`div`,{className:`grid gap-3`,children:[(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] gap-2 text-xs font-medium text-zinc-500`,children:[(0,f.jsx)(`span`,{children:`Key`}),(0,f.jsx)(`span`,{children:`Label`}),(0,f.jsx)(`span`,{className:`sr-only`,children:`Actions`})]}),[...Z,...n].map((r,i)=>{let a=i<Z.length;return(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] items-center gap-2`,children:[(0,f.jsx)(`input`,{"aria-label":`${r.label} key`,className:`min-w-0 rounded border border-zinc-200 bg-zinc-50 p-2 text-sm`,value:r.key,readOnly:!0}),(0,f.jsx)(`input`,{"aria-label":`${r.key} label`,className:`min-w-0 rounded border border-zinc-200 bg-zinc-50 p-2 text-sm`,value:r.label,readOnly:!0}),a?(0,f.jsx)(`span`,{className:`w-16 text-center text-xs text-zinc-400`,children:`Built in`}):(0,f.jsx)(`button`,{type:`button`,className:`w-16 text-xs text-red-600 hover:text-red-700`,onClick:()=>t({...e,models:n.filter(e=>e.key!==r.key)}),children:`Remove`})]},`${a?`built-in`:`custom`}-${r.key}`)}),(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] items-center gap-2 border-t border-zinc-100 pt-3`,children:[(0,f.jsx)(`input`,{"aria-label":`Custom model key`,className:`min-w-0 rounded border border-zinc-300 p-2 text-sm`,value:r,placeholder:`model-key`,onChange:e=>i(e.target.value)}),(0,f.jsx)(`input`,{"aria-label":`Custom model label`,className:`min-w-0 rounded border border-zinc-300 p-2 text-sm`,value:a,placeholder:`Model label`,onChange:e=>o(e.target.value)}),(0,f.jsx)(`button`,{type:`button`,className:`w-16 rounded bg-zinc-100 px-2 py-2 text-xs text-zinc-700 disabled:opacity-40`,disabled:!c,onClick:()=>{t({...e,models:[...n,{key:r.trim(),label:a.trim()}]}),i(``),o(``)},children:`Add`})]}),r.trim()&&s.has(r.trim())?(0,f.jsx)(`span`,{className:`text-xs text-red-600`,children:`Model keys must be unique.`}):null]})}const Dr={defaults:{models:[]},render:e=>(0,f.jsx)(Er,{...e})};function Or(e){return`${e.type}:${e.id}`}function kr(e){let t=e.indexOf(`:`);return t===-1?null:{type:e.slice(0,t),id:e.slice(t+1)}}function Ar(e,t){let n=new Map;n.set(Or(a.FLAG_TAG),{...a.FLAG_TAG,key:Or(a.FLAG_TAG),canvasCount:0,annotatedCanvasCount:0});for(let r of t){if(!r?.id)continue;let t=Hr(e,r);for(let i of e.tags.getTags({id:r.id,type:`Canvas`})){let e=Or(i),r=n.get(e);r?(r.canvasCount+=1,t&&(r.annotatedCanvasCount+=1)):n.set(e,{...i,key:e,canvasCount:1,annotatedCanvasCount:+!!t})}}return Array.from(n.values()).sort((e,t)=>e.type===a.FLAG_TAG.type&&e.id===a.FLAG_TAG.id?-1:t.type===a.FLAG_TAG.type&&t.id===a.FLAG_TAG.id?1:e.label.localeCompare(t.label)||e.type.localeCompare(t.type)||e.id.localeCompare(t.id))}function jr(e){let t={...e};return t.annotations=[],t}function Mr(e=Z){return{serverUrl:typeof localStorage<`u`?localStorage.getItem(yr)??Q:Q,apiKey:typeof localStorage<`u`&&localStorage.getItem(br)||``,model:(typeof localStorage<`u`?Vr(localStorage.getItem(xr),e):null)||Tr,scope:`all`,skipAnnotatedCanvases:!0,resolution:1024}}function Nr(){return typeof localStorage<`u`?localStorage.getItem(yr)??Q:Q}function Pr(){return typeof localStorage<`u`&&localStorage.getItem(br)||``}function $(e=``,t=``){return{id:`${Date.now()}-${Math.random().toString(36).slice(2)}`,label:e,description:t}}function Fr(){if(typeof localStorage>`u`)return[$()];try{let e=localStorage.getItem(Sr),t=e?JSON.parse(e):null;if(!Array.isArray(t))return[$()];let n=t.map(e=>$(typeof e?.label==`string`?e.label:``,typeof e?.description==`string`?e.description:``)).filter(e=>e.label.trim()||e.description.trim());return n.length?n:[$()]}catch{return[$()]}}function Ir(){return{serverUrl:Nr(),apiKey:Pr(),scope:`all`,fields:Fr()}}function Lr(e){return e.map(e=>({label:e.label.trim(),description:e.description.trim()})).filter(e=>e.label&&e.description)}function Rr(e){return Object.fromEntries(Lr(e).map(e=>[e.label,e.description]))}function zr(e){let t=e?.fields;return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}function Br(e){return(e?.annotations||[]).filter(e=>typeof e?.id==`string`&&e.id.includes(`/annotations/qwen-structure/`))}function Vr(e,t=Z){return t.some(t=>t.key===e)&&e||null}function Hr(e,t){let n=t?.annotations&&e.vault.get(t.annotations)||[];for(let e of n)if(e?.items?.length)return!0;return!1}function Ur(e){return e.endsWith(`/`)?e.slice(0,-1):e}function Wr(e){return!!e&&e.includes(vr)}function Gr(e,t){return t?.startsWith(`${Ur(e)}${vr}`)?/\/remote-inference\/\d+\/annotation$/.test(t):!1}function Kr(e,t){let n=t?.annotations?.[0];return n?e.vault.get(n):null}function qr(e,t,n,r,i){let a=i?`/${i}`:``;return`${Ur(e)}${vr}${t}${a}/${n+1}/${r+1}/annotation`}function Jr(e,t,n,r,i,a){return`${qr(e,t,n,r,a)}/body/${i+1}`}function Yr(e,t){return t?.annotations&&e.vault.get(t.annotations)||[]}function Xr(e,t,n,r,i,a){let o=Array.isArray(e?.body)?e.body:e?.body?[e.body]:[];return!o.length&&typeof e?.bodyValue==`string`&&o.push({type:`TextualBody`,value:e.bodyValue,format:`text/plain`}),o.map((e,o)=>{let s=e?.id&&typeof e.id==`string`?e.id:Jr(t,n,r,i,o,a);return{id:s,entity:{...e,id:s,type:e?.type||`TextualBody`,format:e?.format||`text/plain`,value:e?.value||``},reference:{id:s,type:`ContentResource`}}})}function Zr(e,t,n,r,i={}){let a=e.vault.get({id:t,type:`Canvas`});if(!a?.id)return 0;let o=0,c=Yr(e,a),l=Kr(e,a),u=l?.id||`${Ur(t)}/annotations`,d=(l?.items||[]).filter(e=>Wr(e?.id)||Gr(t,e?.id)),f=[],p=i.mode||`replace`;if(l||(f.push((0,s.importEntities)({entities:{AnnotationPage:{[u]:{id:u,type:`AnnotationPage`,label:{en:[`Inline annotations`]},items:[]}}}})),f.push((0,s.addReference)({id:a.id,type:`Canvas`,key:`annotations`,reference:{id:u,type:`AnnotationPage`}}))),p===`replace`){for(let e of d)f.push((0,s.removeReference)({id:u,type:`AnnotationPage`,key:`items`,reference:{id:e.id,type:`Annotation`}}));for(let e of c){if(e?.id===u)continue;let t=(e?.items||[]).filter(e=>Wr(e?.id));for(let n of t)f.push((0,s.removeReference)({id:e.id,type:`AnnotationPage`,key:`items`,reference:{id:n.id,type:`Annotation`}}))}}let m={},h={},g=[];for(let e=0;e<r.length;e++){let a=r[e];if(a?.items?.length)for(let r=0;r<a.items.length;r++){let s=a.items[r];if(!s)continue;let c=qr(t,n,e,r,i.runId),l=Xr(s,t,n,e,r,i.runId);for(let e of l)h[e.id]=e.entity;m[c]={id:c,type:`Annotation`,motivation:s.motivation||`supplementing`,body:l.map(e=>e.reference),target:s.target||t},g.push(c),o+=1}}if(o){f.push((0,s.importEntities)({entities:{Annotation:m,ContentResource:h}}));for(let e of g)f.push((0,s.addReference)({id:u,type:`AnnotationPage`,key:`items`,reference:{id:e,type:`Annotation`}}))}return f.length&&e.vault.dispatch((0,s.batchActions)({actions:f})),o}const Qr=`@manifest-editor/remote-inference:config`;function $r(e){return new Promise(t=>{if(e.signal?.aborted){t(!1);return}let n=!1,r=r=>{n||(n=!0,e.signal?.removeEventListener(`abort`,i),t(r))},i=()=>r(!1);e.signal?.addEventListener(`abort`,i,{once:!0}),window.dispatchEvent(new CustomEvent(Qr,{detail:{...e,resolve:r}}))})}function ei({actionId:e,models:t}){let[n,r]=(0,u.useState)(null),[i,a]=(0,u.useState)(()=>Mr(t));(0,u.useEffect)(()=>{let n=n=>{let i=n.detail;i?.actionId===e&&(r(i),a(ti(i.defaults,i.tags,t)))};return window.addEventListener(Qr,n),()=>window.removeEventListener(Qr,n)},[e,t]),(0,u.useEffect)(()=>{if(!n?.signal)return;if(n.signal.aborted){r(null);return}let e=()=>r(null);return n.signal.addEventListener(`abort`,e,{once:!0}),()=>n.signal?.removeEventListener(`abort`,e)},[n]);let o=(0,u.useMemo)(()=>n?.tags.find(e=>e.key===i.tagKey),[n?.tags,i.tagKey]),s=i.scope===`selected`?+!!n?.selectedCanvas:i.scope===`tag`?o?.canvasCount||0:n?.totalCanvases||0,c=i.scope===`selected`?+!!n?.selectedCanvas?.annotated:i.scope===`tag`?o?.annotatedCanvasCount||0:n?.annotatedCanvases||0,d=i.skipAnnotatedCanvases===!1?0:c,p=Math.max(0,s-d),m=i.serverUrl.trim(),h=p>0&&!!m&&!!i.model;if(!n)return null;let g=e=>{if(e&&typeof e!=`boolean`)try{localStorage.setItem(yr,e.serverUrl.trim()),localStorage.setItem(br,e.apiKey?.trim()||``),localStorage.setItem(xr,e.model)}catch{}n.resolve(e),r(null)},_=n.tags,v=!_.length,y=!n.selectedCanvas;return(0,f.jsx)(l.Modal,{title:`Run Remote Inference`,onClose:()=>g(!1),className:`max-w-2xl`,actions:(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-700`,onClick:()=>g(!1),children:`Cancel`}),(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-me-primary-500 bg-me-primary-500 px-3 py-2 text-sm text-white disabled:cursor-not-allowed disabled:opacity-50`,disabled:!h,onClick:()=>g({...i,serverUrl:m,apiKey:i.apiKey?.trim()||``}),children:`Run`})]}),children:(0,f.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:[(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Server URL`}),(0,f.jsx)(`input`,{type:`text`,className:`rounded border border-zinc-300 p-2 text-sm`,value:i.serverUrl,placeholder:Q,onChange:e=>a(t=>({...t,serverUrl:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`POST requests will be sent to `,(0,f.jsxs)(`code`,{children:[i.serverUrl,`/enrich-canvas`]})]})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`API key`}),(0,f.jsx)(`input`,{type:`password`,className:`rounded border border-zinc-300 p-2 text-sm`,value:i.apiKey||``,autoComplete:`off`,placeholder:`Optional`,onChange:e=>a(t=>({...t,apiKey:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`When provided, requests include `,(0,f.jsx)(`code`,{children:`X-API-KEY`}),`.`]})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Model`}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2`,value:i.model,onChange:e=>a(n=>({...n,model:Vr(e.target.value,t)||Tr})),children:t.map(e=>(0,f.jsx)(`option`,{value:e.key,children:e.label},e.key))})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Image size`}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2`,value:i.resolution,onChange:e=>a(t=>({...t,resolution:Number(e.target.value)})),children:wr.map(e=>(0,f.jsxs)(`option`,{value:e,children:[e,`px long edge`]},e))})]}),(0,f.jsxs)(`fieldset`,{className:`grid gap-2`,children:[(0,f.jsx)(`legend`,{className:`font-medium text-zinc-900`,children:`Canvases`}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:i.scope===`all`,onChange:()=>a(e=>({...e,scope:`all`}))}),(0,f.jsxs)(`span`,{children:[`All canvases (`,n.totalCanvases,`)`]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:i.scope===`selected`,disabled:y,onChange:()=>a(e=>({...e,scope:`selected`}))}),(0,f.jsxs)(`span`,{children:[`Selected canvas`,n.selectedCanvas?.label?` (${n.selectedCanvas.label})`:``]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:i.scope===`tag`,disabled:v,onChange:()=>a(e=>({...e,scope:`tag`,tagKey:e.tagKey||_[0]?.key}))}),(0,f.jsx)(`span`,{children:`Only canvases with tag`})]}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2 disabled:bg-zinc-100`,disabled:i.scope!==`tag`||v,value:i.tagKey||``,onChange:e=>a(t=>({...t,tagKey:e.target.value})),children:_.map(e=>(0,f.jsxs)(`option`,{value:e.key,children:[e.label,` (`,e.canvasCount,`)`]},e.key))})]}),(0,f.jsxs)(`label`,{className:`flex items-start gap-2 rounded border border-zinc-200 bg-white p-3`,children:[(0,f.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:i.skipAnnotatedCanvases!==!1,onChange:e=>a(t=>({...t,skipAnnotatedCanvases:e.target.checked}))}),(0,f.jsxs)(`span`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Skip canvases with existing annotations`}),(0,f.jsx)(`span`,{className:`text-xs text-zinc-500`,children:`Do not run inference on canvases where a canvas annotation page already contains an annotation.`})]})]}),(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-white p-3 text-zinc-600`,children:[p,` canvas`,p===1?``:`es`,` will run remote inference.`,d?(0,f.jsxs)(f.Fragment,{children:[` `,d,` canvas`,d===1?``:`es`,` will be skipped because they already have annotations.`]}):null]})]})})}function ti(e,t,n=Z){let r=t[0]?Or(t[0]):void 0,i=e.tagKey?t.some(t=>t.key===e.tagKey):!1;return{...e,serverUrl:e.serverUrl||Q,apiKey:e.apiKey||``,model:Vr(e.model,n)||Tr,scope:e.scope===`tag`&&t.length?`tag`:e.scope===`selected`?`selected`:`all`,tagKey:i?e.tagKey:r,skipAnnotatedCanvases:e.skipAnnotatedCanvases!==!1}}const ni=`@manifest-editor/remote-inference:structured-config`;function ri(e){return new Promise(t=>{if(e.signal?.aborted){t(!1);return}let n=!1,r=r=>{n||(n=!0,e.signal?.removeEventListener(`abort`,i),t(r))},i=()=>r(!1);e.signal?.addEventListener(`abort`,i,{once:!0}),window.dispatchEvent(new CustomEvent(ni,{detail:{...e,resolve:r}}))})}function ii({actionId:e}){let[t,n]=(0,u.useState)(null),[r,i]=(0,u.useState)(Ir());(0,u.useEffect)(()=>{let t=t=>{let r=t.detail;r?.actionId===e&&(n(r),i(ai(r.defaults,r.tags)))};return window.addEventListener(ni,t),()=>window.removeEventListener(ni,t)},[e]),(0,u.useEffect)(()=>{if(!t?.signal)return;if(t.signal.aborted){n(null);return}let e=()=>n(null);return t.signal.addEventListener(`abort`,e,{once:!0}),()=>t.signal?.removeEventListener(`abort`,e)},[t]);let a=(0,u.useMemo)(()=>t?.tags.find(e=>e.key===r.tagKey),[t?.tags,r.tagKey]),o=r.scope===`selected`?+!!t?.selectedCanvas:r.scope===`tag`?a?.canvasCount||0:t?.totalCanvases||0,s=r.serverUrl.trim(),c=Lr(r.fields),d=o>0&&!!s&&c.length>0;if(!t)return null;let p=t.tags,m=!p.length,h=!t.selectedCanvas,g=(e,t,n)=>{i(r=>({...r,fields:r.fields.map(r=>r.id===e?{...r,[t]:n}:r)}))},_=e=>{if(e&&typeof e!=`boolean`){let t=Lr(e.fields);try{localStorage.setItem(yr,e.serverUrl.trim()),localStorage.setItem(br,e.apiKey?.trim()||``),localStorage.setItem(Sr,JSON.stringify(t))}catch{}}t.resolve(e),n(null)};return(0,f.jsx)(l.Modal,{title:`Run Structured Output`,onClose:()=>_(!1),className:`max-w-2xl`,actions:(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-700`,onClick:()=>_(!1),children:`Cancel`}),(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-me-primary-500 bg-me-primary-500 px-3 py-2 text-sm text-white disabled:cursor-not-allowed disabled:opacity-50`,disabled:!d,onClick:()=>_({...r,serverUrl:s,apiKey:r.apiKey?.trim()||``,fields:r.fields.map(e=>({...e,label:e.label.trim(),description:e.description.trim()}))}),children:`Run`})]}),children:(0,f.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:[(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Server URL`}),(0,f.jsx)(`input`,{type:`text`,className:`rounded border border-zinc-300 p-2 text-sm`,value:r.serverUrl,placeholder:Q,onChange:e=>i(t=>({...t,serverUrl:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`POST requests will be sent to `,(0,f.jsxs)(`code`,{children:[r.serverUrl,`/enrich-canvas`]})]})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`API key`}),(0,f.jsx)(`input`,{type:`password`,className:`rounded border border-zinc-300 p-2 text-sm`,value:r.apiKey||``,autoComplete:`off`,placeholder:`Optional`,onChange:e=>i(t=>({...t,apiKey:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`When provided, requests include `,(0,f.jsx)(`code`,{children:`X-API-KEY`}),`.`]})]}),(0,f.jsxs)(`fieldset`,{className:`grid gap-2`,children:[(0,f.jsx)(`legend`,{className:`font-medium text-zinc-900`,children:`Canvases`}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:r.scope===`all`,onChange:()=>i(e=>({...e,scope:`all`}))}),(0,f.jsxs)(`span`,{children:[`All canvases (`,t.totalCanvases,`)`]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:r.scope===`selected`,disabled:h,onChange:()=>i(e=>({...e,scope:`selected`}))}),(0,f.jsxs)(`span`,{children:[`Selected canvas`,t.selectedCanvas?.label?` (${t.selectedCanvas.label})`:``]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:r.scope===`tag`,disabled:m,onChange:()=>i(e=>({...e,scope:`tag`,tagKey:e.tagKey||p[0]?.key}))}),(0,f.jsx)(`span`,{children:`Only canvases with tag`})]}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2 disabled:bg-zinc-100`,disabled:r.scope!==`tag`||m,value:r.tagKey||``,onChange:e=>i(t=>({...t,tagKey:e.target.value})),children:p.map(e=>(0,f.jsxs)(`option`,{value:e.key,children:[e.label,` (`,e.canvasCount,`)`]},e.key))})]}),(0,f.jsxs)(`fieldset`,{className:`grid gap-2`,children:[(0,f.jsx)(`legend`,{className:`font-medium text-zinc-900`,children:`Structured fields`}),r.fields.map((e,t)=>(0,f.jsxs)(`div`,{className:`grid gap-2 rounded border border-zinc-200 bg-white p-3`,children:[(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,f.jsxs)(`span`,{className:`text-xs font-medium uppercase tracking-wide text-zinc-500`,children:[`Field `,t+1]}),(0,f.jsx)(`button`,{type:`button`,className:`text-xs text-zinc-500 disabled:opacity-50`,disabled:r.fields.length===1,onClick:()=>i(t=>({...t,fields:t.fields.filter(t=>t.id!==e.id)})),children:`Remove`})]}),(0,f.jsx)(`input`,{type:`text`,className:`rounded border border-zinc-300 p-2 text-sm`,value:e.label,placeholder:`Label, e.g. Title`,onChange:t=>g(e.id,`label`,t.target.value)}),(0,f.jsx)(`textarea`,{className:`min-h-20 rounded border border-zinc-300 p-2 text-sm`,value:e.description,placeholder:`Description or extraction instructions`,onChange:t=>g(e.id,`description`,t.target.value)})]},e.id)),(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-700`,onClick:()=>i(e=>({...e,fields:[...e.fields,$()]})),children:`Add field`})]}),(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-white p-3 text-zinc-600`,children:[o,` canvas`,o===1?``:`es`,` will run structured output. Existing annotations will be kept.`]})]})})}function ai(e,t){let n=t[0]?Or(t[0]):void 0,r=e.tagKey?t.some(t=>t.key===e.tagKey):!1;return{...e,serverUrl:e.serverUrl||Q,apiKey:e.apiKey||``,scope:e.scope===`tag`&&t.length?`tag`:e.scope===`selected`?`selected`:`all`,tagKey:r?e.tagKey:n,fields:e.fields?.length?e.fields:[$()]}}const oi=`@manifest-editor/remote-inference:results`;function si(e,t){window.dispatchEvent(new CustomEvent(oi,{detail:{actionId:e,result:t}}))}function ci({actionId:e}){let[t,n]=(0,u.useState)(null);return(0,u.useEffect)(()=>{let t=t=>{let r=t.detail;r?.actionId===e&&r.result&&n(r.result)};return window.addEventListener(oi,t),()=>window.removeEventListener(oi,t)},[e]),t?(0,f.jsx)(l.Modal,{title:`Remote inference results`,onClose:()=>n(null),className:`max-w-3xl`,children:(0,f.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:[(0,f.jsxs)(`div`,{className:`grid grid-cols-4 gap-2`,children:[(0,f.jsx)(li,{label:`Selected`,value:t.selected}),(0,f.jsx)(li,{label:`Processed`,value:t.processed}),(0,f.jsx)(li,{label:`Annotations`,value:t.annotations}),(0,f.jsx)(li,{label:`Skipped`,value:t.skipped})]}),t.canvases.length?(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200`,children:[(0,f.jsx)(`div`,{className:`border-b border-zinc-200 bg-zinc-50 px-3 py-2 font-medium`,children:`Processed canvases`}),(0,f.jsx)(`div`,{className:`max-h-72 overflow-auto`,children:t.canvases.map(e=>(0,f.jsxs)(`div`,{className:`grid gap-2 border-b border-zinc-100 px-3 py-2 last:border-0`,children:[(0,f.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,f.jsx)(`div`,{className:`truncate font-medium text-zinc-900`,children:e.canvasId}),(0,f.jsx)(`div`,{className:`shrink-0 text-xs text-zinc-500`,children:e.model})]}),e.message?(0,f.jsx)(`div`,{className:`text-zinc-500`,children:e.message}):null,e.sourceImage?(0,f.jsx)(`div`,{className:`truncate text-xs text-zinc-500`,children:e.sourceImage}):null,e.palette?.length?(0,f.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.palette.map(e=>(0,f.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded border border-zinc-200 bg-white px-2 py-1 text-xs text-zinc-700`,children:[(0,f.jsx)(`span`,{className:`h-4 w-4 rounded border border-zinc-200`,style:{backgroundColor:e}}),e]},e))}):null,e.fields&&Object.keys(e.fields).length?(0,f.jsx)(`div`,{className:`grid gap-1 rounded border border-zinc-200 bg-white p-2`,children:Object.entries(e.fields).map(([e,t])=>(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,10rem)_minmax(0,1fr)] gap-2 text-xs`,children:[(0,f.jsx)(`span`,{className:`truncate font-medium text-zinc-700`,children:e}),(0,f.jsx)(`span`,{className:`text-zinc-600`,children:t})]},e))}):null]},`${e.model}:${e.canvasId}`))})]}):null,t.skippedCanvases.length?(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200`,children:[(0,f.jsx)(`div`,{className:`border-b border-zinc-200 bg-zinc-50 px-3 py-2 font-medium`,children:`Skipped canvases`}),(0,f.jsx)(`div`,{className:`max-h-64 overflow-auto`,children:t.skippedCanvases.map(e=>(0,f.jsxs)(`div`,{className:`grid gap-1 border-b border-zinc-100 px-3 py-2 last:border-0`,children:[(0,f.jsx)(`div`,{className:`truncate font-medium text-zinc-900`,children:e.canvasId}),(0,f.jsx)(`div`,{className:`text-zinc-500`,children:e.reason})]},e.canvasId))})]}):null]})}):null}function li({label:e,value:t}){return(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 p-3`,children:[(0,f.jsx)(`div`,{className:`text-xl font-semibold text-zinc-900`,children:t}),(0,f.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-zinc-500`,children:e})]})}function ui(e){let t=e.vault.get(e.target);return t?.items?(e.vault.get(t.items)||[]).filter(Boolean):[]}function di(e,t,n){if(n.scope===`selected`){let n=e.currentCanvas?.id;return n?t.filter(e=>e?.id===n):[]}if(n.scope!==`tag`||!n.tagKey)return t;let r=kr(n.tagKey);return r?t.filter(t=>e.tags.hasTag({id:t.id,type:`Canvas`},r.type,r.id)):[]}function fi(e,t){let n=e.currentCanvas?.id;if(!n)return;let r=t.find(e=>e?.id===n);if(r)return{id:n,label:pi(r),annotated:Hr(e,r)}}function pi(e){let t=e?.label;if(!t)return e?.id||``;if(typeof t==`string`)return t;let n=Object.keys(t)[0];return(n?t[n]?.[0]:void 0)||e?.id||``}function mi(e,t,n,r){let i=(r?r.vault.get(r.target):null)?.id||``;return{version:1,data:{options:n,total:e},tasks:t.map((e,t)=>{let a=e?.id||`canvas-${t+1}`,o=pi(e)||a,s=n.skipAnnotatedCanvases!==!1&&r&&Hr(r,e)?{canvasId:a,reason:`Canvas already has annotations`}:null;return{id:`canvas:${a}`,label:o,target:{id:a,type:`Canvas`,label:o,scope:`canvas`},input:{canvasId:a,manifestId:i},status:s?`skipped`:`queued`,statusText:s?`Skipped: canvas already has annotations`:void 0,result:s?{type:`skipped`,skip:s}:void 0,completedAt:s?Date.now():void 0}})}}function hi(e,t,n,r){let i=(r?r.vault.get(r.target):null)?.id||``;return{version:1,data:{options:n,total:e},tasks:t.map((e,t)=>{let n=e?.id||`canvas-${t+1}`,r=pi(e)||n;return{id:`canvas:${n}`,label:r,target:{id:n,type:`Canvas`,label:r,scope:`canvas`},input:{canvasId:n,manifestId:i},status:`queued`}})}}function gi(e){return e.data?.options||null}function _i(e){return e.data?.options||null}function vi(e){let t=e.data;return typeof t?.total==`number`?t.total:e.tasks.length}function yi(e,t){return{total:e,selected:t,processed:0,annotations:0,skipped:0,canvases:[],skippedCanvases:[]}}function bi(e,t){let n=yi(e,t.length);for(let e of t){let t=e.result;if(t?.type===`processed`){n.canvases.push(t.canvas);continue}if(t?.type===`skipped`){n.skippedCanvases.push(t.skip);continue}e.status===`error`&&e.error&&n.skippedCanvases.push({canvasId:e.target?.id||e.id,reason:e.error.message})}return n.processed=n.canvases.length,n.annotations=n.canvases.reduce((e,t)=>e+t.annotations,0),n.skipped=n.skippedCanvases.length,n}function xi(e){return e instanceof Error?e.message:`Canvas inference failed`}function Si(e){return`${Ur(e)}/enrich-canvas`}function Ci(e){return typeof e?.error==`string`&&e.error.trim()?e.error:null}function wi(e,t){let n=t?.[e];return typeof n==`string`?n:void 0}function Ti(e){let t={"Content-Type":`application/json`,Accept:`application/json`},n=e.apiKey?.trim();return n&&(t[`X-API-KEY`]=n),t}function Ei(e){if(e.aborted)throw Error(`Remote inference cancelled.`)}function Di({actionId:e}){let t=(0,a.usePluginSettings)(mr),n=(0,u.useMemo)(()=>fr(t.models),[t.models]);return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(ei,{actionId:e,models:n}),(0,f.jsx)(ci,{actionId:e})]})}const Oi=[{id:gr,label:`Run remote inference`,summary:`Run remote inference on canvas images via a configurable server`,section:`OCR`,order:21,resourceTypes:[`Manifest`],resumable:!0,render:e=>(0,f.jsx)(Di,{actionId:e.definition.id}),onResults:e=>si(e.definition.id,e.instance?.result),supports:e=>!!e.vault.get(e.target)?.items?.length,prepare:async e=>{let t=ui(e),n=e.prepareData,r=Mr(fr(e.plugins.getSettings(mr).models)),i=n?.scope===`selected`?{...r,scope:`selected`}:r,a=await $r({actionId:e.definition.id,instanceKey:e.instanceKey,totalCanvases:t.length,annotatedCanvases:t.filter(t=>Hr(e,t)).length,selectedCanvas:fi(e,t),tags:Ar(e,t),defaults:i,signal:e.signal});if(a===!1)return!1;let o=di(e,t,a);return mi(t.length,o,a,e)},run:async e=>{let t=e.plan||mi(0,[],Mr()),n=gi(t)||Mr(),r=e.tasks.getAll(),i=e.tasks.getPending(),a=vi(t),o=Si(n.serverUrl.trim()||Q),s=n.model.trim()||Tr;if(e.setActionLabel(`Running remote inference`),!r.length)return e.setActionStatus(`running`,`No canvases selected`),yi(a,0);i.length&&(e.canvasProgress.setStatuses(i.map(e=>e.target).filter(e=>!!e&&e.type===`Canvas`),`queued`),await e.tasks.runEach(async(t,{index:r,total:i})=>{Ei(e.signal);let a=t.input,c=t.target?.id||a.canvasId||t.id,l=a.manifestId||``;e.appendActionLog(`Inference ${r+1}/${i}`,`info`,{canvasId:c,current:r+1,total:i});try{let t=performance.now();e.setActionStatus(`running`,`Sending canvas ${r+1}/${i} to server`);let a=e.vault.toPresentation3({id:c,type:`Canvas`}),u=n.resolution||1024,d={canvas:jr(a),config:{type:s,resolution:u}};a||(d={manifest_url:l,canvas_id:c,config:{type:s,resolution:u}});let f=await fetch(o,{method:`POST`,headers:Ti(n),body:JSON.stringify(d),signal:e.signal});if(!f.ok){let t=await f.text().catch(()=>f.statusText),n={canvasId:c,reason:`Server responded with ${f.status}: ${t}`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}let p=await f.json(),m=Ci(p?.results);if(m){let t={canvasId:c,reason:m};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let h=performance.now()-t;if(s===`palette`){let t=Array.isArray(p?.results?.palette)?p.results.palette:[];return e.appendActionLog(`Read palette`,`info`,{canvasId:c,colours:t.length}),{taskStatus:`complete`,result:{type:`processed`,canvas:{canvasId:c,model:s,annotations:0,durationMs:h,palette:t,sourceImage:p?.results?.source_image,message:t.length?`Found ${t.length} colours`:`No palette colours returned`}}}}let g=p?.canvas?.annotations||[];if(!g.length){let t={canvasId:c,reason:`Server returned no annotation pages for this model.`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let _=Zr(e,c,s,g);return e.appendActionLog(`Wrote annotations`,`info`,{canvasId:c,annotations:_}),{taskStatus:`complete`,result:{type:`processed`,canvas:{canvasId:c,model:s,annotations:_,durationMs:h,sourceImage:p?.results?.source_image,message:wi(s,p?.results)}}}}catch(t){if(e.signal.aborted)throw t;let n={canvasId:c,reason:xi(t)};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}},{progressLabel:(e,t,n)=>`Inference ${t+1}/${n}`}));let c=bi(a,e.tasks.getAll());return e.setActionStatus(`running`,`Processed ${c.processed} canvases and created ${c.annotations} annotations`),e.setActionProgress({current:c.selected,total:c.selected,label:`Inference complete`}),c}},{id:_r,label:`Run structured output`,summary:`Extract configured structured fields from canvas images`,section:`OCR`,order:22,resourceTypes:[`Manifest`],resumable:!0,render:e=>(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(ii,{actionId:e.definition.id}),(0,f.jsx)(ci,{actionId:e.definition.id})]}),onResults:e=>si(e.definition.id,e.instance?.result),supports:e=>!!e.vault.get(e.target)?.items?.length,prepare:async e=>{let t=ui(e),n=e.prepareData,r=Ir(),i=n?.scope===`selected`?{...r,scope:`selected`}:r,a=await ri({actionId:e.definition.id,instanceKey:e.instanceKey,totalCanvases:t.length,selectedCanvas:fi(e,t),tags:Ar(e,t),defaults:i,signal:e.signal});if(a===!1)return!1;let o=di(e,t,a);return hi(t.length,o,a,e)},run:async e=>{let t=e.plan||hi(0,[],Ir()),n=_i(t)||Ir(),r=e.tasks.getAll(),i=e.tasks.getPending(),a=vi(t),o=Si(n.serverUrl.trim()||Q),s=Rr(n.fields);if(e.setActionLabel(`Running structured output`),!r.length)return e.setActionStatus(`running`,`No canvases selected`),yi(a,0);if(!Object.keys(s).length)return e.setActionStatus(`error`,`No structured fields configured`),yi(a,r.length);i.length&&(e.canvasProgress.setStatuses(i.map(e=>e.target).filter(e=>!!e&&e.type===`Canvas`),`queued`),await e.tasks.runEach(async(t,{index:r,total:i})=>{Ei(e.signal);let a=t.input,c=t.target?.id||a.canvasId||t.id,l=a.manifestId||``;e.appendActionLog(`Structured output ${r+1}/${i}`,`info`,{canvasId:c,current:r+1,total:i});try{let t=performance.now();e.setActionStatus(`running`,`Sending canvas ${r+1}/${i} to server`);let a=await fetch(o,{method:`POST`,headers:Ti(n),body:JSON.stringify({manifest_url:l,canvas_id:c,config:{type:Cr,fields:s}}),signal:e.signal});if(!a.ok){let t=await a.text().catch(()=>a.statusText),n={canvasId:c,reason:`Server responded with ${a.status}: ${t}`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}let u=await a.json(),d=Ci(u?.results);if(d){let t={canvasId:c,reason:d};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let f=u?.canvas,p=Br(f);if(!p.length){let t={canvasId:c,reason:`Server returned no structured annotation pages.`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let m=performance.now()-t,h=`${Date.now()}-${r+1}`,g=Zr(e,c,Cr,p,{mode:`append`,runId:h}),_=zr(u?.results);return e.appendActionLog(`Wrote structured annotations`,`info`,{canvasId:c,annotations:g}),{taskStatus:`complete`,result:{type:`processed`,canvas:{canvasId:c,model:Cr,annotations:g,durationMs:m,fields:_,sourceImage:u?.results?.source_image,message:wi(Cr,u?.results)}}}}catch(t){if(e.signal.aborted)throw t;let n={canvasId:c,reason:xi(t)};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}},{progressLabel:(e,t,n)=>`Structured output ${t+1}/${n}`}));let c=bi(a,e.tasks.getAll());return e.setActionStatus(`running`,`Processed ${c.processed} canvases and created ${c.annotations} annotations`),e.setActionProgress({current:c.selected,total:c.selected,label:`Structured output complete`}),c}}];var ki={id:`manifest-editor`,title:`Manifest Editor`,project:!0,projectType:`Manifest`};const Ai=[e.p,{id:`current-canvas`,label:`Current canvas`,icon:(0,f.jsx)(Me,{}),render:(e,{actions:t})=>(0,f.jsx)(i.CanvasPanelEditor,{})},gt],ji=[e.r,e.u,Nt,jt],Mi=[Ct,or],Ni=[T()],Pi=[a.baseEditor],Fi=[a.baseCreator],Ii=i.allEditors,Li=r.allCreators,Ri=[`Manifest`,`Canvas`,`ContentResource`,`Agent`,`AnnotationPage`,`Annotation`,`Range`],zi=[t,Qn,n,pr];Object.defineProperty(exports,"annotationsPlugin",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"avRangesPlugin",{enumerable:!0,get:function(){return Qn}}),exports.background=Mi,exports.backgroundActions=Ni,Object.defineProperty(exports,"canvasLabelGeneratorPlugin",{enumerable:!0,get:function(){return n}}),exports.centerPanels=Ai,exports.creators=Li,exports.default=ki,exports.editors=Ii,exports.leftPanels=ji,exports.modals=Fi,exports.plugins=zi,exports.resources=Ri,exports.rightPanels=Pi;
55
+ `).filter(Boolean),r=t.findIndex(e=>e.includes(`-->`));if(r===-1)continue;let[i,a]=t[r].split(`-->`).map(e=>e.trim().split(/\s+/)[0]),o=Zn(i||``),s=Zn(a||``);o!==null&&s!==null&&n.push({start:o,end:s,text:t.slice(r+1).join(` `)})}return n}function Zn(e){let t=e.split(`:`);if(t.length===2){let e=Number.parseFloat(t[0]),n=Number.parseFloat(t[1]);return Number.isFinite(e)&&Number.isFinite(n)?e*60+n:null}if(t.length===3){let e=Number.parseFloat(t[0]),n=Number.parseFloat(t[1]),r=Number.parseFloat(t[2]);return Number.isFinite(e)&&Number.isFinite(n)&&Number.isFinite(r)?e*3600+n*60+r:null}return null}var Qn=e.m({background:()=>ir,centerPanels:()=>nr,creators:()=>rr,default:()=>$n,leftPanels:()=>tr}),$n={id:`@manifest-editor/av-ranges`,label:`A/V Ranges`,description:`Create and edit temporal ranges for audio and video canvases.`,author:`Digirati`,official:!0,defaultEnabled:!1,tags:[`audio`,`video`,`ranges`,`chaptering`],supports:{projectTypes:[`Manifest`]}};function er(e){if(!e.rootResource||e.rootResource.type!==`Manifest`||!e.vault)return!1;let t=e.vault.get(e.rootResource,{skipSelfReturn:!1});return un(e.vault,t).length>0}const tr=[{...xn,supports:er}],nr=[{...Tn,supports:er}],rr=[bn],ir=[{id:`av-ranges-plugin-sync`,label:`A/V ranges plugin sync`,render:()=>(0,f.jsx)(ar,{})}];function ar(){let{leftPanel:e,rightPanel:t}=(0,a.useLayoutState)(),{open:n,rightPanel:r}=(0,a.useLayoutActions)(),[i,o]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{if(e.current===xn.id){n({id:Tn.id}),t.open&&(r.close(),o(!0));return}!t.open&&i&&(r.open(),o(!1))},[e.current,t.open,i,n,r]),null}function or(e,t){return t?t.getSearchParam(e):new URLSearchParams(window.location.search).get(e)}function sr(e,t,n){if(n){n.replaceSearchParam(e,t||null);return}let r=new URL(window.location.href);t?r.searchParams.set(e,t):r.searchParams.delete(e),window.history.replaceState(window.history.state,``,r.href)}const cr={id:`manifest-query-string`,label:`Query string`,render:()=>(0,f.jsx)(lr,{})};function lr(){let t=(0,d.useManifest)(),n=(0,i.useInStack)(`Canvas`),{leftPanel:r,rightPanel:o}=(0,a.useLayoutState)(),{edit:s,leftPanel:c,rightPanel:l}=(0,a.useLayoutActions)(),{centerPanels:f,leftPanels:p}=(0,a.useAvailableLayouts)(),{canvasActions:m,open:h}=e.d(),{urlState:g,editorFeatureFlags:{rememberCanvasId:_=!0,rememberLeftPanelId:v=!1}={}}=(0,a.useConfig)(),y=(0,u.useRef)(null),b=(0,u.useRef)(null),x=r.open,[S,C]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{x&&C(!1)},[x]),(0,u.useEffect)(()=>{let t=or(`canvas`,g);y.current=t,t&&(h({id:e.u.id}),h({id:`current-canvas`}),m.edit({id:t,type:`Canvas`}));let n=or(`leftPanel`,g);b.current=n,n&&p.some(e=>e.id===n)&&c.open({id:n})},[]),(0,u.useEffect)(()=>{v&&sr(`leftPanel`,r.current,g)},[r.current]),(0,u.useEffect)(()=>{let e=n?.resource?.source?.id;e&&(y.current=e),_&&sr(`canvas`,e,g)},[n?.resource?.source?.id]),(0,u.useEffect)(()=>{if(r.current===e.r.id&&(_&&sr(`canvas`,null,g),t&&s(t,void 0,{forceOpen:!0,selectedTab:`@manifest-editor/descriptive-properties`}),f.some(t=>t.id===e.p.id)&&h({id:e.p.id})),r.current===jt.id&&h({id:gt.id}),r.current===e.u.id){let e=y.current||t?.items?.[0]?.id;e&&(h({id:`current-canvas`}),m.edit({id:e,type:`Canvas`}))}if(r.current===jt.id){let e=t?.structures?.[0]?.id;e&&t?.structures?.length===1&&s({id:e,type:`Range`})}r.current===jt.id&&o.open&&(l.close(),C(!0));let n=r.current!==jt.id;!o.open&&n&&S&&(l.open(),C(!1))},[r.current]),null}const Z=[{key:`glm-ocr`,label:`GLM OCR (1B)`},{key:`qwen-ocr`,label:`Qwen 3.6 (9B)`},{key:`gemma-ocr-large`,label:`Gemma 4 (31B)`},{key:`qwen-ocr-large`,label:`Qwen 3.6 (35B)`}];function ur(e){return Array.isArray(e)?e.filter(e=>typeof e?.key==`string`&&!!e.key.trim()&&typeof e?.label==`string`&&!!e.label.trim()).map(e=>({key:e.key.trim(),label:e.label.trim()})):[]}function dr(e){let t=ur(e),n=new Set(Z.map(e=>e.key));return[...Z,...t.filter(e=>!n.has(e.key)&&(n.add(e.key),!0))]}var fr=e.m({REMOTE_INFERENCE_ACTION_ID:()=>hr,REMOTE_INFERENCE_IMAGE_SIZES:()=>Cr,STRUCTURED_OUTPUT_ACTION_ID:()=>gr,backgroundActions:()=>Di,default:()=>mr,settings:()=>Er});const pr=`@manifest-editor/remote-inference`;var mr={id:pr,label:`Remote Inference`,description:`Run remote OCR/HTR inference jobs against a configurable server`,author:`Digirati`,official:!0,defaultEnabled:!1,tags:[`ocr`],supports:{projectTypes:[`Manifest`]}};const hr=`@manifest-editor/remote-inference/action`,gr=`@manifest-editor/remote-inference/structured-output`,_r=`/remote-inference/`,vr=`@manifest-editor/remote-inference/serverUrl`,yr=`@manifest-editor/remote-inference/apiKey`,br=`@manifest-editor/remote-inference/model`,xr=`@manifest-editor/remote-inference/structuredFields`,Q=`http://localhost:8000`,Sr=`qwen-structure`,Cr=[768,1024,1536,2048],wr=`glm-ocr`;function Tr({value:e,onChange:t}){let n=ur(e.models),[r,i]=(0,u.useState)(``),[a,o]=(0,u.useState)(``),s=new Set([...Z,...n].map(e=>e.key)),c=!!r.trim()&&!!a.trim()&&!s.has(r.trim());return(0,f.jsxs)(`div`,{className:`grid gap-3`,children:[(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] gap-2 text-xs font-medium text-zinc-500`,children:[(0,f.jsx)(`span`,{children:`Key`}),(0,f.jsx)(`span`,{children:`Label`}),(0,f.jsx)(`span`,{className:`sr-only`,children:`Actions`})]}),[...Z,...n].map((r,i)=>{let a=i<Z.length;return(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] items-center gap-2`,children:[(0,f.jsx)(`input`,{"aria-label":`${r.label} key`,className:`min-w-0 rounded border border-zinc-200 bg-zinc-50 p-2 text-sm`,value:r.key,readOnly:!0}),(0,f.jsx)(`input`,{"aria-label":`${r.key} label`,className:`min-w-0 rounded border border-zinc-200 bg-zinc-50 p-2 text-sm`,value:r.label,readOnly:!0}),a?(0,f.jsx)(`span`,{className:`w-16 text-center text-xs text-zinc-400`,children:`Built in`}):(0,f.jsx)(`button`,{type:`button`,className:`w-16 text-xs text-red-600 hover:text-red-700`,onClick:()=>t({...e,models:n.filter(e=>e.key!==r.key)}),children:`Remove`})]},`${a?`built-in`:`custom`}-${r.key}`)}),(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] items-center gap-2 border-t border-zinc-100 pt-3`,children:[(0,f.jsx)(`input`,{"aria-label":`Custom model key`,className:`min-w-0 rounded border border-zinc-300 p-2 text-sm`,value:r,placeholder:`model-key`,onChange:e=>i(e.target.value)}),(0,f.jsx)(`input`,{"aria-label":`Custom model label`,className:`min-w-0 rounded border border-zinc-300 p-2 text-sm`,value:a,placeholder:`Model label`,onChange:e=>o(e.target.value)}),(0,f.jsx)(`button`,{type:`button`,className:`w-16 rounded bg-zinc-100 px-2 py-2 text-xs text-zinc-700 disabled:opacity-40`,disabled:!c,onClick:()=>{t({...e,models:[...n,{key:r.trim(),label:a.trim()}]}),i(``),o(``)},children:`Add`})]}),r.trim()&&s.has(r.trim())?(0,f.jsx)(`span`,{className:`text-xs text-red-600`,children:`Model keys must be unique.`}):null]})}const Er={defaults:{models:[]},render:e=>(0,f.jsx)(Tr,{...e})};function Dr(e){return`${e.type}:${e.id}`}function Or(e){let t=e.indexOf(`:`);return t===-1?null:{type:e.slice(0,t),id:e.slice(t+1)}}function kr(e,t){let n=new Map;n.set(Dr(a.FLAG_TAG),{...a.FLAG_TAG,key:Dr(a.FLAG_TAG),canvasCount:0,annotatedCanvasCount:0});for(let r of t){if(!r?.id)continue;let t=Vr(e,r);for(let i of e.tags.getTags({id:r.id,type:`Canvas`})){let e=Dr(i),r=n.get(e);r?(r.canvasCount+=1,t&&(r.annotatedCanvasCount+=1)):n.set(e,{...i,key:e,canvasCount:1,annotatedCanvasCount:+!!t})}}return Array.from(n.values()).sort((e,t)=>e.type===a.FLAG_TAG.type&&e.id===a.FLAG_TAG.id?-1:t.type===a.FLAG_TAG.type&&t.id===a.FLAG_TAG.id?1:e.label.localeCompare(t.label)||e.type.localeCompare(t.type)||e.id.localeCompare(t.id))}function Ar(e){let t={...e};return t.annotations=[],t}function jr(e=Z){return{serverUrl:typeof localStorage<`u`?localStorage.getItem(vr)??Q:Q,apiKey:typeof localStorage<`u`&&localStorage.getItem(yr)||``,model:(typeof localStorage<`u`?Br(localStorage.getItem(br),e):null)||wr,scope:`all`,skipAnnotatedCanvases:!0,resolution:1024}}function Mr(){return typeof localStorage<`u`?localStorage.getItem(vr)??Q:Q}function Nr(){return typeof localStorage<`u`&&localStorage.getItem(yr)||``}function $(e=``,t=``){return{id:`${Date.now()}-${Math.random().toString(36).slice(2)}`,label:e,description:t}}function Pr(){if(typeof localStorage>`u`)return[$()];try{let e=localStorage.getItem(xr),t=e?JSON.parse(e):null;if(!Array.isArray(t))return[$()];let n=t.map(e=>$(typeof e?.label==`string`?e.label:``,typeof e?.description==`string`?e.description:``)).filter(e=>e.label.trim()||e.description.trim());return n.length?n:[$()]}catch{return[$()]}}function Fr(){return{serverUrl:Mr(),apiKey:Nr(),scope:`all`,fields:Pr()}}function Ir(e){return e.map(e=>({label:e.label.trim(),description:e.description.trim()})).filter(e=>e.label&&e.description)}function Lr(e){return Object.fromEntries(Ir(e).map(e=>[e.label,e.description]))}function Rr(e){let t=e?.fields;return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}function zr(e){return(e?.annotations||[]).filter(e=>typeof e?.id==`string`&&e.id.includes(`/annotations/qwen-structure/`))}function Br(e,t=Z){return t.some(t=>t.key===e)&&e||null}function Vr(e,t){let n=t?.annotations&&e.vault.get(t.annotations)||[];for(let e of n)if(e?.items?.length)return!0;return!1}function Hr(e){return e.endsWith(`/`)?e.slice(0,-1):e}function Ur(e){return!!e&&e.includes(_r)}function Wr(e,t){return t?.startsWith(`${Hr(e)}${_r}`)?/\/remote-inference\/\d+\/annotation$/.test(t):!1}function Gr(e,t){let n=t?.annotations?.[0];return n?e.vault.get(n):null}function Kr(e,t,n,r,i){let a=i?`/${i}`:``;return`${Hr(e)}${_r}${t}${a}/${n+1}/${r+1}/annotation`}function qr(e,t,n,r,i,a){return`${Kr(e,t,n,r,a)}/body/${i+1}`}function Jr(e,t){return t?.annotations&&e.vault.get(t.annotations)||[]}function Yr(e,t,n,r,i,a){let o=Array.isArray(e?.body)?e.body:e?.body?[e.body]:[];return!o.length&&typeof e?.bodyValue==`string`&&o.push({type:`TextualBody`,value:e.bodyValue,format:`text/plain`}),o.map((e,o)=>{let s=e?.id&&typeof e.id==`string`?e.id:qr(t,n,r,i,o,a);return{id:s,entity:{...e,id:s,type:e?.type||`TextualBody`,format:e?.format||`text/plain`,value:e?.value||``},reference:{id:s,type:`ContentResource`}}})}function Xr(e,t,n,r,i={}){let a=e.vault.get({id:t,type:`Canvas`});if(!a?.id)return 0;let o=0,c=Jr(e,a),l=Gr(e,a),u=l?.id||`${Hr(t)}/annotations`,d=(l?.items||[]).filter(e=>Ur(e?.id)||Wr(t,e?.id)),f=[],p=i.mode||`replace`;if(l||(f.push((0,s.importEntities)({entities:{AnnotationPage:{[u]:{id:u,type:`AnnotationPage`,label:{en:[`Inline annotations`]},items:[]}}}})),f.push((0,s.addReference)({id:a.id,type:`Canvas`,key:`annotations`,reference:{id:u,type:`AnnotationPage`}}))),p===`replace`){for(let e of d)f.push((0,s.removeReference)({id:u,type:`AnnotationPage`,key:`items`,reference:{id:e.id,type:`Annotation`}}));for(let e of c){if(e?.id===u)continue;let t=(e?.items||[]).filter(e=>Ur(e?.id));for(let n of t)f.push((0,s.removeReference)({id:e.id,type:`AnnotationPage`,key:`items`,reference:{id:n.id,type:`Annotation`}}))}}let m={},h={},g=[];for(let e=0;e<r.length;e++){let a=r[e];if(a?.items?.length)for(let r=0;r<a.items.length;r++){let s=a.items[r];if(!s)continue;let c=Kr(t,n,e,r,i.runId),l=Yr(s,t,n,e,r,i.runId);for(let e of l)h[e.id]=e.entity;m[c]={id:c,type:`Annotation`,motivation:s.motivation||`supplementing`,body:l.map(e=>e.reference),target:s.target||t},g.push(c),o+=1}}if(o){f.push((0,s.importEntities)({entities:{Annotation:m,ContentResource:h}}));for(let e of g)f.push((0,s.addReference)({id:u,type:`AnnotationPage`,key:`items`,reference:{id:e,type:`Annotation`}}))}return f.length&&e.vault.dispatch((0,s.batchActions)({actions:f})),o}const Zr=`@manifest-editor/remote-inference:config`;function Qr(e){return new Promise(t=>{if(e.signal?.aborted){t(!1);return}let n=!1,r=r=>{n||(n=!0,e.signal?.removeEventListener(`abort`,i),t(r))},i=()=>r(!1);e.signal?.addEventListener(`abort`,i,{once:!0}),window.dispatchEvent(new CustomEvent(Zr,{detail:{...e,resolve:r}}))})}function $r({actionId:e,models:t}){let[n,r]=(0,u.useState)(null),[i,a]=(0,u.useState)(()=>jr(t));(0,u.useEffect)(()=>{let n=n=>{let i=n.detail;i?.actionId===e&&(r(i),a(ei(i.defaults,i.tags,t)))};return window.addEventListener(Zr,n),()=>window.removeEventListener(Zr,n)},[e,t]),(0,u.useEffect)(()=>{if(!n?.signal)return;if(n.signal.aborted){r(null);return}let e=()=>r(null);return n.signal.addEventListener(`abort`,e,{once:!0}),()=>n.signal?.removeEventListener(`abort`,e)},[n]);let o=(0,u.useMemo)(()=>n?.tags.find(e=>e.key===i.tagKey),[n?.tags,i.tagKey]),s=i.scope===`selected`?+!!n?.selectedCanvas:i.scope===`tag`?o?.canvasCount||0:n?.totalCanvases||0,c=i.scope===`selected`?+!!n?.selectedCanvas?.annotated:i.scope===`tag`?o?.annotatedCanvasCount||0:n?.annotatedCanvases||0,d=i.skipAnnotatedCanvases===!1?0:c,p=Math.max(0,s-d),m=i.serverUrl.trim(),h=p>0&&!!m&&!!i.model;if(!n)return null;let g=e=>{if(e&&typeof e!=`boolean`)try{localStorage.setItem(vr,e.serverUrl.trim()),localStorage.setItem(yr,e.apiKey?.trim()||``),localStorage.setItem(br,e.model)}catch{}n.resolve(e),r(null)},_=n.tags,v=!_.length,y=!n.selectedCanvas;return(0,f.jsx)(l.Modal,{title:`Run Remote Inference`,onClose:()=>g(!1),className:`max-w-2xl`,actions:(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-700`,onClick:()=>g(!1),children:`Cancel`}),(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-me-primary-500 bg-me-primary-500 px-3 py-2 text-sm text-white disabled:cursor-not-allowed disabled:opacity-50`,disabled:!h,onClick:()=>g({...i,serverUrl:m,apiKey:i.apiKey?.trim()||``}),children:`Run`})]}),children:(0,f.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:[(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Server URL`}),(0,f.jsx)(`input`,{type:`text`,className:`rounded border border-zinc-300 p-2 text-sm`,value:i.serverUrl,placeholder:Q,onChange:e=>a(t=>({...t,serverUrl:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`POST requests will be sent to `,(0,f.jsxs)(`code`,{children:[i.serverUrl,`/enrich-canvas`]})]})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`API key`}),(0,f.jsx)(`input`,{type:`password`,className:`rounded border border-zinc-300 p-2 text-sm`,value:i.apiKey||``,autoComplete:`off`,placeholder:`Optional`,onChange:e=>a(t=>({...t,apiKey:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`When provided, requests include `,(0,f.jsx)(`code`,{children:`X-API-KEY`}),`.`]})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Model`}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2`,value:i.model,onChange:e=>a(n=>({...n,model:Br(e.target.value,t)||wr})),children:t.map(e=>(0,f.jsx)(`option`,{value:e.key,children:e.label},e.key))})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Image size`}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2`,value:i.resolution,onChange:e=>a(t=>({...t,resolution:Number(e.target.value)})),children:Cr.map(e=>(0,f.jsxs)(`option`,{value:e,children:[e,`px long edge`]},e))})]}),(0,f.jsxs)(`fieldset`,{className:`grid gap-2`,children:[(0,f.jsx)(`legend`,{className:`font-medium text-zinc-900`,children:`Canvases`}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:i.scope===`all`,onChange:()=>a(e=>({...e,scope:`all`}))}),(0,f.jsxs)(`span`,{children:[`All canvases (`,n.totalCanvases,`)`]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:i.scope===`selected`,disabled:y,onChange:()=>a(e=>({...e,scope:`selected`}))}),(0,f.jsxs)(`span`,{children:[`Selected canvas`,n.selectedCanvas?.label?` (${n.selectedCanvas.label})`:``]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:i.scope===`tag`,disabled:v,onChange:()=>a(e=>({...e,scope:`tag`,tagKey:e.tagKey||_[0]?.key}))}),(0,f.jsx)(`span`,{children:`Only canvases with tag`})]}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2 disabled:bg-zinc-100`,disabled:i.scope!==`tag`||v,value:i.tagKey||``,onChange:e=>a(t=>({...t,tagKey:e.target.value})),children:_.map(e=>(0,f.jsxs)(`option`,{value:e.key,children:[e.label,` (`,e.canvasCount,`)`]},e.key))})]}),(0,f.jsxs)(`label`,{className:`flex items-start gap-2 rounded border border-zinc-200 bg-white p-3`,children:[(0,f.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:i.skipAnnotatedCanvases!==!1,onChange:e=>a(t=>({...t,skipAnnotatedCanvases:e.target.checked}))}),(0,f.jsxs)(`span`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Skip canvases with existing annotations`}),(0,f.jsx)(`span`,{className:`text-xs text-zinc-500`,children:`Do not run inference on canvases where a canvas annotation page already contains an annotation.`})]})]}),(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-white p-3 text-zinc-600`,children:[p,` canvas`,p===1?``:`es`,` will run remote inference.`,d?(0,f.jsxs)(f.Fragment,{children:[` `,d,` canvas`,d===1?``:`es`,` will be skipped because they already have annotations.`]}):null]})]})})}function ei(e,t,n=Z){let r=t[0]?Dr(t[0]):void 0,i=e.tagKey?t.some(t=>t.key===e.tagKey):!1;return{...e,serverUrl:e.serverUrl||Q,apiKey:e.apiKey||``,model:Br(e.model,n)||wr,scope:e.scope===`tag`&&t.length?`tag`:e.scope===`selected`?`selected`:`all`,tagKey:i?e.tagKey:r,skipAnnotatedCanvases:e.skipAnnotatedCanvases!==!1}}const ti=`@manifest-editor/remote-inference:structured-config`;function ni(e){return new Promise(t=>{if(e.signal?.aborted){t(!1);return}let n=!1,r=r=>{n||(n=!0,e.signal?.removeEventListener(`abort`,i),t(r))},i=()=>r(!1);e.signal?.addEventListener(`abort`,i,{once:!0}),window.dispatchEvent(new CustomEvent(ti,{detail:{...e,resolve:r}}))})}function ri({actionId:e}){let[t,n]=(0,u.useState)(null),[r,i]=(0,u.useState)(Fr());(0,u.useEffect)(()=>{let t=t=>{let r=t.detail;r?.actionId===e&&(n(r),i(ii(r.defaults,r.tags)))};return window.addEventListener(ti,t),()=>window.removeEventListener(ti,t)},[e]),(0,u.useEffect)(()=>{if(!t?.signal)return;if(t.signal.aborted){n(null);return}let e=()=>n(null);return t.signal.addEventListener(`abort`,e,{once:!0}),()=>t.signal?.removeEventListener(`abort`,e)},[t]);let a=(0,u.useMemo)(()=>t?.tags.find(e=>e.key===r.tagKey),[t?.tags,r.tagKey]),o=r.scope===`selected`?+!!t?.selectedCanvas:r.scope===`tag`?a?.canvasCount||0:t?.totalCanvases||0,s=r.serverUrl.trim(),c=Ir(r.fields),d=o>0&&!!s&&c.length>0;if(!t)return null;let p=t.tags,m=!p.length,h=!t.selectedCanvas,g=(e,t,n)=>{i(r=>({...r,fields:r.fields.map(r=>r.id===e?{...r,[t]:n}:r)}))},_=e=>{if(e&&typeof e!=`boolean`){let t=Ir(e.fields);try{localStorage.setItem(vr,e.serverUrl.trim()),localStorage.setItem(yr,e.apiKey?.trim()||``),localStorage.setItem(xr,JSON.stringify(t))}catch{}}t.resolve(e),n(null)};return(0,f.jsx)(l.Modal,{title:`Run Structured Output`,onClose:()=>_(!1),className:`max-w-2xl`,actions:(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-700`,onClick:()=>_(!1),children:`Cancel`}),(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-me-primary-500 bg-me-primary-500 px-3 py-2 text-sm text-white disabled:cursor-not-allowed disabled:opacity-50`,disabled:!d,onClick:()=>_({...r,serverUrl:s,apiKey:r.apiKey?.trim()||``,fields:r.fields.map(e=>({...e,label:e.label.trim(),description:e.description.trim()}))}),children:`Run`})]}),children:(0,f.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:[(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`Server URL`}),(0,f.jsx)(`input`,{type:`text`,className:`rounded border border-zinc-300 p-2 text-sm`,value:r.serverUrl,placeholder:Q,onChange:e=>i(t=>({...t,serverUrl:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`POST requests will be sent to `,(0,f.jsxs)(`code`,{children:[r.serverUrl,`/enrich-canvas`]})]})]}),(0,f.jsxs)(`label`,{className:`grid gap-1`,children:[(0,f.jsx)(`span`,{className:`font-medium text-zinc-900`,children:`API key`}),(0,f.jsx)(`input`,{type:`password`,className:`rounded border border-zinc-300 p-2 text-sm`,value:r.apiKey||``,autoComplete:`off`,placeholder:`Optional`,onChange:e=>i(t=>({...t,apiKey:e.target.value}))}),(0,f.jsxs)(`span`,{className:`text-xs text-zinc-500`,children:[`When provided, requests include `,(0,f.jsx)(`code`,{children:`X-API-KEY`}),`.`]})]}),(0,f.jsxs)(`fieldset`,{className:`grid gap-2`,children:[(0,f.jsx)(`legend`,{className:`font-medium text-zinc-900`,children:`Canvases`}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:r.scope===`all`,onChange:()=>i(e=>({...e,scope:`all`}))}),(0,f.jsxs)(`span`,{children:[`All canvases (`,t.totalCanvases,`)`]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:r.scope===`selected`,disabled:h,onChange:()=>i(e=>({...e,scope:`selected`}))}),(0,f.jsxs)(`span`,{children:[`Selected canvas`,t.selectedCanvas?.label?` (${t.selectedCanvas.label})`:``]})]}),(0,f.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`input`,{type:`radio`,checked:r.scope===`tag`,disabled:m,onChange:()=>i(e=>({...e,scope:`tag`,tagKey:e.tagKey||p[0]?.key}))}),(0,f.jsx)(`span`,{children:`Only canvases with tag`})]}),(0,f.jsx)(`select`,{className:`rounded border border-zinc-300 bg-white p-2 disabled:bg-zinc-100`,disabled:r.scope!==`tag`||m,value:r.tagKey||``,onChange:e=>i(t=>({...t,tagKey:e.target.value})),children:p.map(e=>(0,f.jsxs)(`option`,{value:e.key,children:[e.label,` (`,e.canvasCount,`)`]},e.key))})]}),(0,f.jsxs)(`fieldset`,{className:`grid gap-2`,children:[(0,f.jsx)(`legend`,{className:`font-medium text-zinc-900`,children:`Structured fields`}),r.fields.map((e,t)=>(0,f.jsxs)(`div`,{className:`grid gap-2 rounded border border-zinc-200 bg-white p-3`,children:[(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,f.jsxs)(`span`,{className:`text-xs font-medium uppercase tracking-wide text-zinc-500`,children:[`Field `,t+1]}),(0,f.jsx)(`button`,{type:`button`,className:`text-xs text-zinc-500 disabled:opacity-50`,disabled:r.fields.length===1,onClick:()=>i(t=>({...t,fields:t.fields.filter(t=>t.id!==e.id)})),children:`Remove`})]}),(0,f.jsx)(`input`,{type:`text`,className:`rounded border border-zinc-300 p-2 text-sm`,value:e.label,placeholder:`Label, e.g. Title`,onChange:t=>g(e.id,`label`,t.target.value)}),(0,f.jsx)(`textarea`,{className:`min-h-20 rounded border border-zinc-300 p-2 text-sm`,value:e.description,placeholder:`Description or extraction instructions`,onChange:t=>g(e.id,`description`,t.target.value)})]},e.id)),(0,f.jsx)(`button`,{type:`button`,className:`rounded border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-700`,onClick:()=>i(e=>({...e,fields:[...e.fields,$()]})),children:`Add field`})]}),(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-white p-3 text-zinc-600`,children:[o,` canvas`,o===1?``:`es`,` will run structured output. Existing annotations will be kept.`]})]})})}function ii(e,t){let n=t[0]?Dr(t[0]):void 0,r=e.tagKey?t.some(t=>t.key===e.tagKey):!1;return{...e,serverUrl:e.serverUrl||Q,apiKey:e.apiKey||``,scope:e.scope===`tag`&&t.length?`tag`:e.scope===`selected`?`selected`:`all`,tagKey:r?e.tagKey:n,fields:e.fields?.length?e.fields:[$()]}}const ai=`@manifest-editor/remote-inference:results`;function oi(e,t){window.dispatchEvent(new CustomEvent(ai,{detail:{actionId:e,result:t}}))}function si({actionId:e}){let[t,n]=(0,u.useState)(null);return(0,u.useEffect)(()=>{let t=t=>{let r=t.detail;r?.actionId===e&&r.result&&n(r.result)};return window.addEventListener(ai,t),()=>window.removeEventListener(ai,t)},[e]),t?(0,f.jsx)(l.Modal,{title:`Remote inference results`,onClose:()=>n(null),className:`max-w-3xl`,children:(0,f.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:[(0,f.jsxs)(`div`,{className:`grid grid-cols-4 gap-2`,children:[(0,f.jsx)(ci,{label:`Selected`,value:t.selected}),(0,f.jsx)(ci,{label:`Processed`,value:t.processed}),(0,f.jsx)(ci,{label:`Annotations`,value:t.annotations}),(0,f.jsx)(ci,{label:`Skipped`,value:t.skipped})]}),t.canvases.length?(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200`,children:[(0,f.jsx)(`div`,{className:`border-b border-zinc-200 bg-zinc-50 px-3 py-2 font-medium`,children:`Processed canvases`}),(0,f.jsx)(`div`,{className:`max-h-72 overflow-auto`,children:t.canvases.map(e=>(0,f.jsxs)(`div`,{className:`grid gap-2 border-b border-zinc-100 px-3 py-2 last:border-0`,children:[(0,f.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,f.jsx)(`div`,{className:`truncate font-medium text-zinc-900`,children:e.canvasId}),(0,f.jsx)(`div`,{className:`shrink-0 text-xs text-zinc-500`,children:e.model})]}),e.message?(0,f.jsx)(`div`,{className:`text-zinc-500`,children:e.message}):null,e.sourceImage?(0,f.jsx)(`div`,{className:`truncate text-xs text-zinc-500`,children:e.sourceImage}):null,e.palette?.length?(0,f.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.palette.map(e=>(0,f.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded border border-zinc-200 bg-white px-2 py-1 text-xs text-zinc-700`,children:[(0,f.jsx)(`span`,{className:`h-4 w-4 rounded border border-zinc-200`,style:{backgroundColor:e}}),e]},e))}):null,e.fields&&Object.keys(e.fields).length?(0,f.jsx)(`div`,{className:`grid gap-1 rounded border border-zinc-200 bg-white p-2`,children:Object.entries(e.fields).map(([e,t])=>(0,f.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,10rem)_minmax(0,1fr)] gap-2 text-xs`,children:[(0,f.jsx)(`span`,{className:`truncate font-medium text-zinc-700`,children:e}),(0,f.jsx)(`span`,{className:`text-zinc-600`,children:t})]},e))}):null]},`${e.model}:${e.canvasId}`))})]}):null,t.skippedCanvases.length?(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200`,children:[(0,f.jsx)(`div`,{className:`border-b border-zinc-200 bg-zinc-50 px-3 py-2 font-medium`,children:`Skipped canvases`}),(0,f.jsx)(`div`,{className:`max-h-64 overflow-auto`,children:t.skippedCanvases.map(e=>(0,f.jsxs)(`div`,{className:`grid gap-1 border-b border-zinc-100 px-3 py-2 last:border-0`,children:[(0,f.jsx)(`div`,{className:`truncate font-medium text-zinc-900`,children:e.canvasId}),(0,f.jsx)(`div`,{className:`text-zinc-500`,children:e.reason})]},e.canvasId))})]}):null]})}):null}function ci({label:e,value:t}){return(0,f.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 p-3`,children:[(0,f.jsx)(`div`,{className:`text-xl font-semibold text-zinc-900`,children:t}),(0,f.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-zinc-500`,children:e})]})}function li(e){let t=e.vault.get(e.target);return t?.items?(e.vault.get(t.items)||[]).filter(Boolean):[]}function ui(e,t,n){if(n.scope===`selected`){let n=e.currentCanvas?.id;return n?t.filter(e=>e?.id===n):[]}if(n.scope!==`tag`||!n.tagKey)return t;let r=Or(n.tagKey);return r?t.filter(t=>e.tags.hasTag({id:t.id,type:`Canvas`},r.type,r.id)):[]}function di(e,t){let n=e.currentCanvas?.id;if(!n)return;let r=t.find(e=>e?.id===n);if(r)return{id:n,label:fi(r),annotated:Vr(e,r)}}function fi(e){let t=e?.label;if(!t)return e?.id||``;if(typeof t==`string`)return t;let n=Object.keys(t)[0];return(n?t[n]?.[0]:void 0)||e?.id||``}function pi(e,t,n,r){let i=(r?r.vault.get(r.target):null)?.id||``;return{version:1,data:{options:n,total:e},tasks:t.map((e,t)=>{let a=e?.id||`canvas-${t+1}`,o=fi(e)||a,s=n.skipAnnotatedCanvases!==!1&&r&&Vr(r,e)?{canvasId:a,reason:`Canvas already has annotations`}:null;return{id:`canvas:${a}`,label:o,target:{id:a,type:`Canvas`,label:o,scope:`canvas`},input:{canvasId:a,manifestId:i},status:s?`skipped`:`queued`,statusText:s?`Skipped: canvas already has annotations`:void 0,result:s?{type:`skipped`,skip:s}:void 0,completedAt:s?Date.now():void 0}})}}function mi(e,t,n,r){let i=(r?r.vault.get(r.target):null)?.id||``;return{version:1,data:{options:n,total:e},tasks:t.map((e,t)=>{let n=e?.id||`canvas-${t+1}`,r=fi(e)||n;return{id:`canvas:${n}`,label:r,target:{id:n,type:`Canvas`,label:r,scope:`canvas`},input:{canvasId:n,manifestId:i},status:`queued`}})}}function hi(e){return e.data?.options||null}function gi(e){return e.data?.options||null}function _i(e){let t=e.data;return typeof t?.total==`number`?t.total:e.tasks.length}function vi(e,t){return{total:e,selected:t,processed:0,annotations:0,skipped:0,canvases:[],skippedCanvases:[]}}function yi(e,t){let n=vi(e,t.length);for(let e of t){let t=e.result;if(t?.type===`processed`){n.canvases.push(t.canvas);continue}if(t?.type===`skipped`){n.skippedCanvases.push(t.skip);continue}e.status===`error`&&e.error&&n.skippedCanvases.push({canvasId:e.target?.id||e.id,reason:e.error.message})}return n.processed=n.canvases.length,n.annotations=n.canvases.reduce((e,t)=>e+t.annotations,0),n.skipped=n.skippedCanvases.length,n}function bi(e){return e instanceof Error?e.message:`Canvas inference failed`}function xi(e){return`${Hr(e)}/enrich-canvas`}function Si(e){return typeof e?.error==`string`&&e.error.trim()?e.error:null}function Ci(e,t){let n=t?.[e];return typeof n==`string`?n:void 0}function wi(e){let t={"Content-Type":`application/json`,Accept:`application/json`},n=e.apiKey?.trim();return n&&(t[`X-API-KEY`]=n),t}function Ti(e){if(e.aborted)throw Error(`Remote inference cancelled.`)}function Ei({actionId:e}){let t=(0,a.usePluginSettings)(pr),n=(0,u.useMemo)(()=>dr(t.models),[t.models]);return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)($r,{actionId:e,models:n}),(0,f.jsx)(si,{actionId:e})]})}const Di=[{id:hr,label:`Run remote inference`,summary:`Run remote inference on canvas images via a configurable server`,section:`OCR`,order:21,resourceTypes:[`Manifest`],resumable:!0,render:e=>(0,f.jsx)(Ei,{actionId:e.definition.id}),onResults:e=>oi(e.definition.id,e.instance?.result),supports:e=>!!e.vault.get(e.target)?.items?.length,prepare:async e=>{let t=li(e),n=e.prepareData,r=jr(dr(e.plugins.getSettings(pr).models)),i=n?.scope===`selected`?{...r,scope:`selected`}:r,a=await Qr({actionId:e.definition.id,instanceKey:e.instanceKey,totalCanvases:t.length,annotatedCanvases:t.filter(t=>Vr(e,t)).length,selectedCanvas:di(e,t),tags:kr(e,t),defaults:i,signal:e.signal});if(a===!1)return!1;let o=ui(e,t,a);return pi(t.length,o,a,e)},run:async e=>{let t=e.plan||pi(0,[],jr()),n=hi(t)||jr(),r=e.tasks.getAll(),i=e.tasks.getPending(),a=_i(t),o=xi(n.serverUrl.trim()||Q),s=n.model.trim()||wr;if(e.setActionLabel(`Running remote inference`),!r.length)return e.setActionStatus(`running`,`No canvases selected`),vi(a,0);i.length&&(e.canvasProgress.setStatuses(i.map(e=>e.target).filter(e=>!!e&&e.type===`Canvas`),`queued`),await e.tasks.runEach(async(t,{index:r,total:i})=>{Ti(e.signal);let a=t.input,c=t.target?.id||a.canvasId||t.id,l=a.manifestId||``;e.appendActionLog(`Inference ${r+1}/${i}`,`info`,{canvasId:c,current:r+1,total:i});try{let t=performance.now();e.setActionStatus(`running`,`Sending canvas ${r+1}/${i} to server`);let a=e.vault.toPresentation3({id:c,type:`Canvas`}),u=n.resolution||1024,d={canvas:Ar(a),config:{type:s,resolution:u}};a||(d={manifest_url:l,canvas_id:c,config:{type:s,resolution:u}});let f=await fetch(o,{method:`POST`,headers:wi(n),body:JSON.stringify(d),signal:e.signal});if(!f.ok){let t=await f.text().catch(()=>f.statusText),n={canvasId:c,reason:`Server responded with ${f.status}: ${t}`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}let p=await f.json(),m=Si(p?.results);if(m){let t={canvasId:c,reason:m};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let h=performance.now()-t;if(s===`palette`){let t=Array.isArray(p?.results?.palette)?p.results.palette:[];return e.appendActionLog(`Read palette`,`info`,{canvasId:c,colours:t.length}),{taskStatus:`complete`,result:{type:`processed`,canvas:{canvasId:c,model:s,annotations:0,durationMs:h,palette:t,sourceImage:p?.results?.source_image,message:t.length?`Found ${t.length} colours`:`No palette colours returned`}}}}let g=p?.canvas?.annotations||[];if(!g.length){let t={canvasId:c,reason:`Server returned no annotation pages for this model.`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let _=Xr(e,c,s,g);return e.appendActionLog(`Wrote annotations`,`info`,{canvasId:c,annotations:_}),{taskStatus:`complete`,result:{type:`processed`,canvas:{canvasId:c,model:s,annotations:_,durationMs:h,sourceImage:p?.results?.source_image,message:Ci(s,p?.results)}}}}catch(t){if(e.signal.aborted)throw t;let n={canvasId:c,reason:bi(t)};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}},{progressLabel:(e,t,n)=>`Inference ${t+1}/${n}`}));let c=yi(a,e.tasks.getAll());return e.setActionStatus(`running`,`Processed ${c.processed} canvases and created ${c.annotations} annotations`),e.setActionProgress({current:c.selected,total:c.selected,label:`Inference complete`}),c}},{id:gr,label:`Run structured output`,summary:`Extract configured structured fields from canvas images`,section:`OCR`,order:22,resourceTypes:[`Manifest`],resumable:!0,render:e=>(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(ri,{actionId:e.definition.id}),(0,f.jsx)(si,{actionId:e.definition.id})]}),onResults:e=>oi(e.definition.id,e.instance?.result),supports:e=>!!e.vault.get(e.target)?.items?.length,prepare:async e=>{let t=li(e),n=e.prepareData,r=Fr(),i=n?.scope===`selected`?{...r,scope:`selected`}:r,a=await ni({actionId:e.definition.id,instanceKey:e.instanceKey,totalCanvases:t.length,selectedCanvas:di(e,t),tags:kr(e,t),defaults:i,signal:e.signal});if(a===!1)return!1;let o=ui(e,t,a);return mi(t.length,o,a,e)},run:async e=>{let t=e.plan||mi(0,[],Fr()),n=gi(t)||Fr(),r=e.tasks.getAll(),i=e.tasks.getPending(),a=_i(t),o=xi(n.serverUrl.trim()||Q),s=Lr(n.fields);if(e.setActionLabel(`Running structured output`),!r.length)return e.setActionStatus(`running`,`No canvases selected`),vi(a,0);if(!Object.keys(s).length)return e.setActionStatus(`error`,`No structured fields configured`),vi(a,r.length);i.length&&(e.canvasProgress.setStatuses(i.map(e=>e.target).filter(e=>!!e&&e.type===`Canvas`),`queued`),await e.tasks.runEach(async(t,{index:r,total:i})=>{Ti(e.signal);let a=t.input,c=t.target?.id||a.canvasId||t.id,l=a.manifestId||``;e.appendActionLog(`Structured output ${r+1}/${i}`,`info`,{canvasId:c,current:r+1,total:i});try{let t=performance.now();e.setActionStatus(`running`,`Sending canvas ${r+1}/${i} to server`);let a=await fetch(o,{method:`POST`,headers:wi(n),body:JSON.stringify({manifest_url:l,canvas_id:c,config:{type:Sr,fields:s}}),signal:e.signal});if(!a.ok){let t=await a.text().catch(()=>a.statusText),n={canvasId:c,reason:`Server responded with ${a.status}: ${t}`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}let u=await a.json(),d=Si(u?.results);if(d){let t={canvasId:c,reason:d};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let f=u?.canvas,p=zr(f);if(!p.length){let t={canvasId:c,reason:`Server returned no structured annotation pages.`};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let m=performance.now()-t,h=`${Date.now()}-${r+1}`,g=Xr(e,c,Sr,p,{mode:`append`,runId:h}),_=Rr(u?.results);return e.appendActionLog(`Wrote structured annotations`,`info`,{canvasId:c,annotations:g}),{taskStatus:`complete`,result:{type:`processed`,canvas:{canvasId:c,model:Sr,annotations:g,durationMs:m,fields:_,sourceImage:u?.results?.source_image,message:Ci(Sr,u?.results)}}}}catch(t){if(e.signal.aborted)throw t;let n={canvasId:c,reason:bi(t)};return e.appendActionLog(`Skipped canvas`,`warn`,{canvasId:c,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}},{progressLabel:(e,t,n)=>`Structured output ${t+1}/${n}`}));let c=yi(a,e.tasks.getAll());return e.setActionStatus(`running`,`Processed ${c.processed} canvases and created ${c.annotations} annotations`),e.setActionProgress({current:c.selected,total:c.selected,label:`Structured output complete`}),c}}];var Oi={id:`manifest-editor`,title:`Manifest Editor`,project:!0,projectType:`Manifest`};const ki=[e.p,{id:`current-canvas`,label:`Current canvas`,icon:(0,f.jsx)(Me,{}),render:(e,{actions:t})=>(0,f.jsx)(i.CanvasPanelEditor,{})},gt],Ai=[e.r,e.u,Nt,jt],ji=[Ct,cr],Mi=[T()],Ni=[a.baseEditor],Pi=[a.baseCreator],Fi=i.allEditors,Ii=r.allCreators,Li=[`Manifest`,`Canvas`,`ContentResource`,`Agent`,`AnnotationPage`,`Annotation`,`Range`],Ri=[t,Qn,n,fr];Object.defineProperty(exports,"annotationsPlugin",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"avRangesPlugin",{enumerable:!0,get:function(){return Qn}}),exports.background=ji,exports.backgroundActions=Mi,Object.defineProperty(exports,"canvasLabelGeneratorPlugin",{enumerable:!0,get:function(){return n}}),exports.centerPanels=ki,exports.creators=Ii,exports.default=Oi,exports.editors=Fi,exports.leftPanels=Ai,exports.modals=Pi,exports.plugins=Ri,exports.resources=Li,exports.rightPanels=Ni;
56
56
  //# sourceMappingURL=index.cjs.map