@uibot/creation-kit 0.2.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.js +1 -1
- package/dist/index-rep1qesa.js +17 -0
- package/dist/index-wsse4x6x.js +2 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -17
- package/dist/run-controller.d.ts +68 -0
- package/dist/run-status.d.ts +9 -0
- package/dist/testing.js +1 -17
- package/dist/use-creation-run.d.ts +27 -0
- package/package.json +4 -4
package/dist/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{e,g,C}from"./index-wsse4x6x.js";export{e as CreationApiError,C as createCreationClient,g as creationProjectPath};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{e}from"./index-wsse4x6x.js";var t=1;var Me=/^[a-z][a-z0-9-]{0,39}$/;function He(g,ce,ae,C){if(ce.has(ae))throw Error(`Duplicate creation ${g} "${ae}" (plugin ${C})`);ce.add(ae)}function m(g){let ce=new Set,ae=new Map,C=new Map,se=new Set,we=[],pe=new Map;for(let le of g){if(le.kitApi!==t)throw Error(`Creation plugin "${le.id}" targets kit API ${String(le.kitApi)}, expected ${t}`);He("plugin",ce,le.id,le.id);for(let de of le.kinds??[]){if(!Me.test(de.kind))throw Error(`Invalid creation kind "${de.kind}" (plugin ${le.id})`);if(ae.has(de.kind))throw Error(`Duplicate creation kind "${de.kind}" (plugin ${le.id})`);ae.set(de.kind,de)}for(let de of le.editors??[]){let Ce=`${de.id}:${de.format}`;if(C.has(Ce))throw Error(`Duplicate creation editor "${Ce}" (plugin ${le.id})`);C.set(Ce,de)}for(let de of le.views??[])He("view",se,de.id,le.id),we.push(de);for(let de of le.projectAssets??[]){if(pe.has(de.slot))throw Error(`Duplicate creation asset slot "${de.slot}" (plugin ${le.id})`);pe.set(de.slot,de)}}let fe=[...ae.values()].sort((le,de)=>(le.order??100)-(de.order??100)||le.kind.localeCompare(de.kind));return{plugins:g,taskKind:(le)=>le?ae.get(le):void 0,taskKinds:()=>[...fe],kindOptions(le,de,Ce){let ke=le.map((be)=>({value:be.artifactKind,label:Ce?.(be)??be.title,disabled:!be.enabled})),ye=new Set(ke.map((be)=>be.value));for(let be of fe){if(ye.has(be.kind)){console.error(`Creation workbench kind "${be.kind}" shadows a server domain and is hidden`);continue}ke.push({value:be.kind,label:be.label[de]})}return ke},label:(le,de,Ce)=>ae.get(le)?.label[de]??Ce??le,editor:(le,de)=>le?C.get(`${le}:${de}`):void 0,views:(le)=>we.filter((de)=>de.match(le)),projectAssets:()=>[...pe.values()],projectAsset:(le)=>pe.get(le),parseRouteSearch(le){let de=typeof le.kind==="string"&&Me.test(le.kind)?le.kind:void 0,Ce={};for(let ke of fe){if(!ke.parseSearch)continue;Object.assign(Ce,ke.parseSearch(le))}return{...de?{kind:de}:{},extra:Ce}}}}import{createContext as nt,useContext as rt}from"react";import{jsx as it}from"react/jsx-runtime";var Je=nt(null);function b(g){return it(Je.Provider,{value:g.transport,children:g.children})}function y(){let g=rt(Je);if(!g)throw Error("useCreationTransport requires a CreationTransportProvider");return g}import{clsx as at}from"clsx";import{twMerge as st}from"tailwind-merge";function x(...g){return st(at(g))}function P(g){if(!(g instanceof Error))return;let{status:ce}=g;return typeof ce==="number"?ce:void 0}import{createContext as ct,useContext as lt}from"react";import{jsx as dt}from"react/jsx-runtime";var We=ct("en");function n(g){return dt(We.Provider,{value:g.locale,children:g.children})}function v(){return lt(We)}import{createContext as pt,useContext as ut}from"react";import{jsx as Ye}from"react/jsx-runtime";var Ge=pt(null);function r(g){return Ye(Ge.Provider,{value:g.primitives,children:g.children})}function gt(){let g=ut(Ge);if(!g)throw Error("Creation UI primitives require a CreationUiProvider");return g}function ge(g,ce){let ae=(C)=>{let se=g(gt());return Ye(se,{...C})};return ae.displayName=ce,ae}var k=ge((g)=>g.Button,"Button"),h=ge((g)=>g.Badge,"Badge"),T=ge((g)=>g.Label,"Label"),w=ge((g)=>g.Input,"Input"),S=ge((g)=>g.Textarea,"Textarea"),R=ge((g)=>g.Checkbox,"Checkbox"),I=ge((g)=>g.Collapsible,"Collapsible"),j=ge((g)=>g.CollapsibleTrigger,"CollapsibleTrigger"),D=ge((g)=>g.CollapsibleContent,"CollapsibleContent"),A=ge((g)=>g.ScrollArea,"ScrollArea"),E=ge((g)=>g.ScrollBar,"ScrollBar"),L=ge((g)=>g.Select,"Select"),N=ge((g)=>g.SelectTrigger,"SelectTrigger"),U=ge((g)=>g.SelectValue,"SelectValue"),O=ge((g)=>g.SelectContent,"SelectContent"),q=ge((g)=>g.SelectItem,"SelectItem"),F=ge((g)=>g.Tabs,"Tabs"),K=ge((g)=>g.TabsList,"TabsList"),B=ge((g)=>g.TabsTrigger,"TabsTrigger"),V=ge((g)=>g.TabsContent,"TabsContent"),z=ge((g)=>g.Tooltip,"Tooltip"),M=ge((g)=>g.TooltipProvider,"TooltipProvider"),_=ge((g)=>g.TooltipTrigger,"TooltipTrigger"),H=ge((g)=>g.TooltipContent,"TooltipContent"),J=ge((g)=>g.Popover,"Popover"),G=ge((g)=>g.PopoverTrigger,"PopoverTrigger"),W=ge((g)=>g.PopoverContent,"PopoverContent"),Y=ge((g)=>g.Dialog,"Dialog"),X=ge((g)=>g.DialogTrigger,"DialogTrigger"),Z=ge((g)=>g.DialogContent,"DialogContent"),Q=ge((g)=>g.DialogHeader,"DialogHeader"),ee=ge((g)=>g.DialogFooter,"DialogFooter"),te=ge((g)=>g.DialogTitle,"DialogTitle"),oe=ge((g)=>g.DialogDescription,"DialogDescription"),ne=ge((g)=>g.Prompt,"Prompt");var ze=/<(\/?)section\b[^>]*>/gi;function De(g,ce){let ae=new RegExp(`\\b${ce}(?:\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+)))?`,"i").exec(g);if(!ae)return;return ae[1]??ae[2]??ae[3]??""}function ft(g){if(De(g,"data-slide")!==void 0)return!0;return/\bslide\b/i.test(De(g,"class")??"")}function Oe(g,ce){return g.exec(ce)?.[1]??""}function mt(g){return g.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'")}function Xe(g){return mt(g.replace(/<[^>]+>/g," ")).replace(/\s+/g," ").trim()}function Ze(g){let ce=[];ze.lastIndex=0;let ae=0,C=-1;for(let se=ze.exec(g);se;se=ze.exec(g)){if(se[1]==="/"){if(ae===0)continue;if(ae-=1,ae===0&&C>=0)ce.push(g.slice(C,se.index+se[0].length)),C=-1;continue}if(ae===0){if(!ft(se[0]))continue;C=se.index}ae+=1}return ce}function c(g){return Boolean(g)&&Ze(g).length>0}var Ct=/<aside\b([^>]*)>([\s\S]*?)<\/aside>/i;function bt(g){let ce="";return{slide:g.replace(Ct,(C,se,we)=>{if(!(De(`<aside ${se}>`,"data-notes")!==void 0||/\bnotes\b/i.test(De(`<aside ${se}>`,"class")??"")))return C;return ce=Xe(we),""}),notes:ce}}function l(g){let ce=Ze(g);if(ce.length===0)return{isDeck:!1,slides:[],head:"",bodyClass:"",bodyStyle:"",title:"deck"};let ae=Oe(/<head\b[^>]*>([\s\S]*?)<\/head>/i,g),C=`<body ${Oe(/<body\b([^>]*)>/i,g)}>`,se=De(C,"class")??"",we=De(C,"style")??"",pe=Xe(Oe(/<title\b[^>]*>([\s\S]*?)<\/title>/i,ae))||"deck",fe=new Set;return{isDeck:!0,slides:ce.map((de,Ce)=>{let ke=Oe(/(<section\b[^>]*>)/i,de),ye=De(ke,"data-slide")||De(ke,"data-slide-id")||String(Ce+1),be=fe.has(ye)?`${ye}-${Ce+1}`:ye;fe.add(be);let he=Oe(/background(?:-color)?\s*:\s*([^;"']+)/i,De(ke,"style")??"").trim()||void 0,{slide:Te,notes:me}=bt(de);return{html:`<!DOCTYPE html><html><head>${ae}
|
|
2
|
+
<style>
|
|
3
|
+
html, body { margin:0; padding:0; }
|
|
4
|
+
body { display:flex; align-items:center; justify-content:center; min-height:100vh; }
|
|
5
|
+
.slide, [data-slide] { transform-origin: center center !important; }
|
|
6
|
+
</style></head><body class="${se}" style="${we}">${Te}</body></html>`,notes:me,id:be,...he?{bg:he}:{}}}),head:ae,bodyClass:se,bodyStyle:we,title:pe}}function f(g){return`<!DOCTYPE html><html><head>
|
|
7
|
+
<style>
|
|
8
|
+
@page { size: 1280px 720px; margin: 0; }
|
|
9
|
+
html, body { margin:0; padding:0; }
|
|
10
|
+
.page { width: 1280px; height: 720px; overflow: hidden; page-break-after: always; }
|
|
11
|
+
.page:last-child { page-break-after: auto; }
|
|
12
|
+
.page iframe.slide { display:block; width:100%; height:100%; border:0; }
|
|
13
|
+
</style></head><body>
|
|
14
|
+
${Array.from({length:g},(ae,C)=>`<div class="page"><iframe class="slide" data-slide-index="${C}" sandbox="allow-scripts"></iframe></div>`).join(`
|
|
15
|
+
`)}
|
|
16
|
+
<script>window.onload=()=>setTimeout(()=>window.print(),300)</script>
|
|
17
|
+
</body></html>`}function d(g,ce=(ae,C)=>window.open(ae,C)){let ae=ce("","_blank");if(!ae)return!1;ae.opener=null,ae.document.write(f(g.slides.length)),ae.document.close();let C=ae.document.querySelectorAll("iframe.slide");return g.slides.forEach((se,we)=>{let pe=C[we];if(pe)pe.srcdoc=se.html}),!0}import{ChevronLeft as yt,ChevronRight as xt,FileDown as kt,Maximize2 as vt,StickyNote as Tt}from"lucide-react";import{useEffect as Qe,useMemo as ht,useRef as Pt,useState as Be}from"react";import{jsx as Se,jsxs as Ee}from"react/jsx-runtime";var wt={empty:"No slides found (each slide must be a <section data-slide>).",prev:"Previous slide",next:"Next slide",notes:"Notes",notesTitle:"Speaker notes (N)",notesHeading:"Speaker notes",present:"Present",presentTitle:"Full screen (F)",pdfTitle:"Print to PDF",blocked:"The popup was blocked. Allow popups for this site and try again.",page:"Slide"},St={empty:"未检测到幻灯片(每页需为 <section data-slide>)。",prev:"上一页",next:"下一页",notes:"备注",notesTitle:"演讲者备注(N)",notesHeading:"演讲者备注",present:"放映",presentTitle:"全屏放映(F)",pdfTitle:"打印为 PDF",blocked:"弹窗被拦截,请允许本站弹出窗口后重试。",page:"第"},Rt={en:wt,zh:St},Ve="inline-flex items-center gap-1 rounded-md border px-2 py-1 text-xs";function i({content:g,locale:ce,active:ae}){let C=Rt[ce],se=ht(()=>l(g),[g]),[we,pe]=Be(0),[fe,le]=Be(!1),[de,Ce]=Be(""),ke=Pt(null),ye=se.slides.length,be=Math.min(we,Math.max(0,ye-1)),he=se.slides[be];if(Qe(()=>pe(0),[g]),Qe(()=>{if(!ae||ye===0)return;let Te=(me)=>{let Ae=me.target;if(Ae&&(Ae.tagName==="INPUT"||Ae.tagName==="TEXTAREA"||Ae.isContentEditable))return;if(me.key==="ArrowRight"||me.key==="PageDown"||me.key===" ")me.preventDefault(),pe((ve)=>Math.min(ve+1,ye-1));else if(me.key==="ArrowLeft"||me.key==="PageUp")me.preventDefault(),pe((ve)=>Math.max(ve-1,0));else if(me.key==="Home")pe(0);else if(me.key==="End")pe(ye-1);else if(me.key.toLowerCase()==="n")le((ve)=>!ve);else if(me.key.toLowerCase()==="f")if(document.fullscreenElement)document.exitFullscreen();else ke.current?.requestFullscreen?.()};return window.addEventListener("keydown",Te),()=>window.removeEventListener("keydown",Te)},[ae,ye]),!he)return Se("div",{className:"flex h-full items-center justify-center p-6 text-sm text-muted-foreground",children:C.empty});return Ee("div",{ref:ke,className:"flex h-full min-h-72 flex-col bg-muted/30",children:[Ee("div",{className:"relative min-h-0 flex-1",children:[Se("iframe",{title:`slide-${he.id}`,srcDoc:he.html,sandbox:"allow-scripts",className:"h-full w-full border-0 bg-white"},he.id),Se("button",{type:"button",onClick:()=>pe((Te)=>Math.max(Te-1,0)),disabled:be===0,className:"absolute left-2 top-1/2 -translate-y-1/2 rounded-full border bg-background/80 p-1.5 shadow backdrop-blur disabled:opacity-30","aria-label":C.prev,children:Se(yt,{className:"size-4"})}),Se("button",{type:"button",onClick:()=>pe((Te)=>Math.min(Te+1,ye-1)),disabled:be===ye-1,className:"absolute right-2 top-1/2 -translate-y-1/2 rounded-full border bg-background/80 p-1.5 shadow backdrop-blur disabled:opacity-30","aria-label":C.next,children:Se(xt,{className:"size-4"})}),Ee("div",{className:"absolute bottom-2 left-1/2 -translate-x-1/2 rounded-full bg-foreground/80 px-2.5 py-0.5 text-xs tabular-nums text-background",children:[be+1," / ",ye]}),fe&&he.notes&&Ee("div",{className:"absolute inset-x-3 bottom-10 max-h-[40%] overflow-y-auto rounded-md border bg-background/95 p-3 text-sm shadow-lg",children:[Se("div",{className:"mb-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground",children:C.notesHeading}),he.notes]})]}),de&&Se("p",{role:"status",className:"border-t bg-background px-3 py-1 text-xs text-destructive",children:de}),Ee("div",{className:"flex items-center gap-2 border-t bg-background px-3 py-2",children:[Se("div",{className:"flex min-w-0 flex-1 gap-1.5 overflow-x-auto",children:se.slides.map((Te,me)=>Se("button",{type:"button",onClick:()=>pe(me),"aria-label":`${C.page} ${me+1}`,"aria-current":me===be?"true":void 0,...Te.bg?{style:{background:Te.bg}}:{},className:`flex size-7 shrink-0 items-center justify-center rounded border text-[11px] tabular-nums ${me===be?"border-primary ring-2 ring-primary/30":"text-muted-foreground hover:border-foreground/30"}`,children:me+1},Te.id))}),Ee("button",{type:"button",onClick:()=>le((Te)=>!Te),className:`${Ve} ${fe?"border-primary bg-primary/10 text-primary":"text-muted-foreground hover:bg-accent"}`,title:C.notesTitle,children:[Se(Tt,{className:"size-3.5"}),C.notes]}),Ee("button",{type:"button",onClick:()=>{if(!document.fullscreenElement)ke.current?.requestFullscreen?.()},className:`${Ve} text-muted-foreground hover:bg-accent`,title:C.presentTitle,children:[Se(vt,{className:"size-3.5"}),C.present]}),Ee("button",{type:"button",onClick:()=>Ce(d(se)?"":C.blocked),className:`${Ve} text-muted-foreground hover:bg-accent`,title:C.pdfTitle,children:[Se(kt,{className:"size-3.5"}),"PDF"]})]})]})}var re={id:"presentation-deck",version:"1.0.0",kitApi:t,views:[{id:"slides",label:{zh:"幻灯片",en:"Slides"},match:(g)=>g.artifactKind==="presentation"&&g.format==="html"&&c(g.content),View:i}]};var It=["queued","running","interrupted","completed","failed","cancelled","conflict"];function a(g){if(!g||typeof g!=="object"||Array.isArray(g))return"unknown";if(typeof g.status!=="string"||!It.includes(g.status))return"unknown";if(g.error?.code==="inference-outcome-unknown")return"unknown";let ce=g.modelRequests;if(ce!==void 0){if(!Array.isArray(ce))return"unknown";for(let ae of ce){if(!ae||typeof ae!=="object"||Array.isArray(ae))return"unknown";let C=ae;if(typeof C.requestId!=="string"||!C.requestId||C.purpose!=="generation"&&C.purpose!=="requirement-review"||typeof C.dispatchedAt!=="string"||!C.dispatchedAt||C.dispatched!==void 0&&typeof C.dispatched!=="boolean"||typeof C.outcome!=="string"||!["pending","completed","failed","unknown"].includes(C.outcome))return"unknown";if(C.outcome==="unknown")return"unknown";if(C.outcome==="pending"&&!["queued","running","interrupted"].includes(g.status))return"unknown"}}return g.status}function o(g=[]){if(!Array.isArray(g))return[g];return g.filter((ce)=>["queued","running","interrupted","unknown"].includes(a(ce)))}var Dt={zh:{noRecord:"尚未读到原请求记录;不会重新发送。",unknown:"原请求结果未知;不会重新发送。",settled:"原请求结果已确认。",running:"原请求仍在进行中。",storageFailed:"未发送生成请求:无法保存原请求核对记录。",rejected:"生成请求未被接受;请检查当前版本和生成能力后重新发起。",noLocks:"未发送生成请求:当前浏览器无法锁定项目生成操作。",lockFailed:"未能取得项目生成锁;请稍后核对原请求状态。",readFailed:"状态读取失败;保留原请求并稍后只读核对。",unreadable:"无法读取原请求核对记录;生成已禁用。"},en:{noRecord:"The original request is not recorded yet; it will not be sent again.",unknown:"The original request's outcome is unknown; it will not be sent again.",settled:"The original request's outcome is confirmed.",running:"The original request is still in progress.",storageFailed:"Not sent: the request record could not be saved.",rejected:"The request was not accepted; check the current version and generation, then try again.",noLocks:"Not sent: this browser cannot lock project generation.",lockFailed:"Could not take the project generation lock; check the original request later.",readFailed:"Reading the status failed; the original request is kept for a later check.",unreadable:"The request record cannot be read; generation is disabled."}},u=Object.freeze({pending:!0,sending:!1,checking:!1,writingBlocked:!0,canReconcile:!1,message:""});function At(g){return g instanceof e&&(g.status===422&&["invalid-input","invalid-format","unknown-domain"].includes(g.code)||g.status===409&&["revision-conflict","format-conflict","domain-disabled","brand-conflict"].includes(g.code)||g.status===503&&g.code==="model-unavailable")}function Le(g,ce,ae){if(!g)return{ok:!1,pending:null};try{let C=g.getItem(ce);if(C===null)return{ok:!0,pending:null};let se=JSON.parse(C);if(!se||se.version!==1||se.projectId!==ae||typeof se.requestId!=="string"||!se.requestId||typeof se.kind!=="string"||!se.kind||!["new","rewrite"].includes(se.mode))return{ok:!1,pending:null};if(se.mode==="rewrite"&&(typeof se.artifactId!=="string"||!se.artifactId||typeof se.expectedRevisionId!=="string"||!se.expectedRevisionId))return{ok:!1,pending:null};if(se.reference&&(typeof se.reference.artifactId!=="string"||!se.reference.artifactId||typeof se.reference.revisionId!=="string"||!se.reference.revisionId))return{ok:!1,pending:null};return{ok:!0,pending:se}}catch{return{ok:!1,pending:null}}}function p(g){let ce=Dt[g.locale??"en"],ae=g.storageKey,C=g.project.id,se=g.authority??(()=>""),we=g.newRequestId??(()=>crypto.randomUUID()),pe=g.project,fe=Le(g.storage,ae,C),le=!1,de=!1,Ce="",ke=!0,ye=!1,be=!1,he=0,Te=new Set,me=Ae();function Ae(){let ue=o(pe.runs);return{pending:!fe.ok||!!fe.pending||ue.length>0||le,sending:le,checking:de,writingBlocked:le||!!fe.pending||ue.length>0,canReconcile:fe.ok&&(!!fe.pending||ue.some((xe)=>!!xe?.requestId)),message:!fe.ok?ce.unreadable:Ce}}function ve(){let ue=Ae();if(JSON.stringify(ue)===JSON.stringify(me))return;let xe=ue.writingBlocked!==me.writingBlocked;if(me=ue,xe)g.onWritingBlocked?.(ue.writingBlocked);for(let Pe of Te)Pe()}function $e(ue){if(JSON.stringify(ue)===JSON.stringify(fe))return;fe=ue,ve()}function Ne(ue,xe){return ke&&ue===he&&se()===xe}function et(ue){let xe=Le(g.storage,ae,C);if(xe.ok&&xe.pending?.requestId===ue){try{g.storage?.removeItem(ae)}catch{}$e(Le(g.storage,ae,C)),g.broadcast?.()}}function Ke(ue,xe,Pe,Ue){if(!Ne(Ue,Pe))return;let Ie=ue.runs?.find((Fe)=>Fe?.requestId===xe);if(!Ie){Ce=ce.noRecord,ve();return}let je=a(Ie),Re=["completed","failed","cancelled","conflict"].includes(je);if(Re){try{g.storage?.removeItem(ae)}catch{}$e(Le(g.storage,ae,C)),g.broadcast?.()}Ce=je==="unknown"?ce.unknown:Re?ce.settled:ce.running,pe=ue,ve(),g.onProject?.(ue,je==="completed"?Ie.artifactId:void 0)}async function tt(ue){if(me.pending||ye)return;let xe=Le(g.storage,ae,C);if(!xe.ok||xe.pending||o(pe.runs).length){$e(xe);return}let Pe=we(),Ue={version:1,projectId:C,requestId:Pe,kind:ue.kind,mode:ue.artifactId?"rewrite":"new",...ue.artifactId?{artifactId:ue.artifactId,expectedRevisionId:ue.expectedRevisionId}:{},...ue.reference?{reference:ue.reference}:{}};try{let Re=JSON.stringify(Ue);if(g.storage?.setItem(ae,Re),!g.storage||g.storage.getItem(ae)!==Re)throw Error("storage-readback")}catch{fe=Le(g.storage,ae,C),Ce=ce.storageFailed,ve();return}ye=!0,le=!0,fe={ok:!0,pending:Ue},ve(),g.broadcast?.();let Ie=he,je=se();try{let Re=await g.client.startRun(C,{...ue,requestId:Pe});Ke(Re,Pe,je,Ie)}catch(Re){if(!Ne(Ie,je))return;let Fe=At(Re);if(Re instanceof e&&Re.status===404&&Re.code==="not-found")try{let qe=await g.client.getProject(C);if(!Ne(Ie,je))return;if(qe.id===C){if(qe.runs?.some((ot)=>ot?.requestId===Pe)){Ke(qe,Pe,je,Ie);return}pe=qe,g.onProject?.(qe),Fe=!0}}catch{}if(Fe)et(Pe),Ce=ce.rejected;else Ce=ce.unknown;ve()}finally{if(ye=!1,ke&&Ie===he)le=!1,ve()}}return{getState:()=>me,subscribe(ue){return Te.add(ue),()=>Te.delete(ue)},setProject(ue){if(ue.id!==C)return;pe=ue,ve()},refresh(){$e(Le(g.storage,ae,C))},async start(ue){if(me.pending||ye||be)return;if(!g.locks){Ce=ce.noLocks,ve();return}let xe=he,Pe=se();be=!0;try{await g.locks.request(ae,async()=>{if(!Ne(xe,Pe))return;await tt(ue)})}catch{if(Ne(xe,Pe))Ce=ce.lockFailed,ve()}finally{be=!1}},async reconcile(){if(ye||de||!fe.ok)return;let ue=fe.pending?.requestId??o(pe.runs).find((Ue)=>!!Ue?.requestId)?.requestId;if(!ue)return;let xe=he,Pe=se();ye=!0,de=!0,ve();try{Ke(await g.client.getProject(C),ue,Pe,xe)}catch{if(Ne(xe,Pe))Ce=ce.readFailed,ve()}finally{if(ye=!1,ke&&xe===he)de=!1,ve()}},activate(){ke=!0},deactivate(){ke=!1,he+=1,le=!1,de=!1,ve()}}}import{useEffect as _e,useLayoutEffect as jt,useMemo as Et,useRef as Lt,useSyncExternalStore as Nt}from"react";var s="uibot:creation-run-changed",Ut=typeof window>"u"?_e:jt;function qt(){try{return typeof window>"u"?void 0:window.localStorage}catch{return}}function Ot(){let g=typeof navigator>"u"?void 0:navigator.locks;return g?.request?g:void 0}function ie(g){let ce=Lt(g);ce.current=g;let{storageKey:ae}=g,C=g.project.id,se=Et(()=>p({client:{startRun:(pe,fe)=>ce.current.client.startRun(pe,fe),getProject:(pe,fe)=>ce.current.client.getProject(pe,fe)},project:g.project,storageKey:ae,storage:g.storage??qt(),locks:g.locks??Ot(),authority:()=>ce.current.authority?.()??"",broadcast:()=>{if(typeof window<"u")window.dispatchEvent(new Event(s))},...g.locale?{locale:g.locale}:{},onProject:(pe,fe)=>ce.current.onProject(pe,fe),onWritingBlocked:(pe)=>ce.current.onPending?.(pe)}),[ae,C]);_e(()=>{if(se.activate(),typeof window>"u")return()=>se.deactivate();let pe=()=>se.refresh();return window.addEventListener(s,pe),window.addEventListener("storage",pe),pe(),()=>{window.removeEventListener(s,pe),window.removeEventListener("storage",pe),se.deactivate()}},[se]),Ut(()=>{se.setProject(g.project)},[se,g.project]);let we=Nt(se.subscribe,se.getState,()=>u);return _e(()=>{ce.current.onPending?.(se.getState().writingBlocked)},[se]),{...we,start:se.start,reconcile:se.reconcile}}export{t,m,b,y,x,P,n,v,r,k,h,T,w,S,R,I,j,D,A,E,L,N,U,O,q,F,K,B,V,z,M,_,H,J,G,W,Y,X,Z,Q,ee,te,oe,ne,c,l,f,d,i,re,a,o,u,p,s,ie};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
class e extends Error{code;status;constructor(i,u,p){super(u);this.code=i;this.status=p;this.name="CreationApiError"}}function g(i){return`/projects/${encodeURIComponent(i)}`}function C(i){let u=i.base.replace(/\/$/,""),p=i.fetch??((t,n)=>globalThis.fetch(t,n));async function r(t,n={}){let d=n.method??(n.body===void 0?"GET":"POST"),s=await p(`${u}${t}`,{method:d,headers:{accept:"application/json",...n.body===void 0?{}:{"content-type":"application/json"}},...n.body===void 0?{}:{body:JSON.stringify(n.body)},...n.signal?{signal:n.signal}:{}}),l=await s.text(),a=null;if(l)try{a=JSON.parse(l)}catch{a=null}if(!s.ok){let c=a?.error;throw new e(typeof c?.code==="string"?c.code:"request-failed",typeof c?.message==="string"?c.message:`Request failed (${s.status})`,s.status)}if(a===null)throw new e("invalid-response","Empty or non-JSON response",s.status);return a}let o=g;return{request:r,getConfiguration:(t)=>r(i.configurationPath??"",{method:"GET",...t?{signal:t}:{}}),listProjects:(t)=>r("/projects",{method:"GET",...t?{signal:t}:{}}),createProject:(t)=>r("/projects",{body:t}),getProject:(t,n)=>r(o(t),{method:"GET",...n?{signal:n}:{}}),addSource:(t,n)=>r(`${o(t)}/sources`,{body:n}),appendArtifact:(t,n)=>r(`${o(t)}/artifacts`,{body:n}),saveRevision:(t,n,d)=>r(`${o(t)}/artifacts/${encodeURIComponent(n)}/revisions`,{body:d}),startRun:(t,n)=>r(`${o(t)}/runs`,{body:n}),cancelRun:(t,n)=>r(`${o(t)}/runs/${encodeURIComponent(n)}/cancel`,{body:{}}),resumeRun:(t,n)=>r(`${o(t)}/runs/${encodeURIComponent(n)}/resume`,{body:{}})}}
|
|
2
|
+
export{e,g,C};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,17 +1 @@
|
|
|
1
|
-
|
|
2
|
-
<style>
|
|
3
|
-
html, body { margin:0; padding:0; }
|
|
4
|
-
body { display:flex; align-items:center; justify-content:center; min-height:100vh; }
|
|
5
|
-
.slide, [data-slide] { transform-origin: center center !important; }
|
|
6
|
-
</style></head><body class="${l}" style="${a}">${m}</body></html>`,notes:u,id:d,...x?{bg:x}:{}}}),head:r,bodyClass:l,bodyStyle:a,title:n}}function re(e){return`<!DOCTYPE html><html><head>
|
|
7
|
-
<style>
|
|
8
|
-
@page { size: 1280px 720px; margin: 0; }
|
|
9
|
-
html, body { margin:0; padding:0; }
|
|
10
|
-
.page { width: 1280px; height: 720px; overflow: hidden; page-break-after: always; }
|
|
11
|
-
.page:last-child { page-break-after: auto; }
|
|
12
|
-
.page iframe.slide { display:block; width:100%; height:100%; border:0; }
|
|
13
|
-
</style></head><body>
|
|
14
|
-
${Array.from({length:e},(r,t)=>`<div class="page"><iframe class="slide" data-slide-index="${t}" sandbox="allow-scripts"></iframe></div>`).join(`
|
|
15
|
-
`)}
|
|
16
|
-
<script>window.onload=()=>setTimeout(()=>window.print(),300)</script>
|
|
17
|
-
</body></html>`}function F(e,c=(r,t)=>window.open(r,t)){let r=c("","_blank");if(!r)return!1;r.opener=null,r.document.write(re(e.slides.length)),r.document.close();let t=r.document.querySelectorAll("iframe.slide");return e.slides.forEach((l,a)=>{let n=t[a];if(n)n.srcdoc=l.html}),!0}import{ChevronLeft as ie,ChevronRight as ae,FileDown as se,Maximize2 as le,StickyNote as ce}from"lucide-react";import{useEffect as B,useMemo as pe,useRef as de,useState as S}from"react";import{jsx as b,jsxs as y}from"react/jsx-runtime";var ue={empty:"No slides found (each slide must be a <section data-slide>).",prev:"Previous slide",next:"Next slide",notes:"Notes",notesTitle:"Speaker notes (N)",notesHeading:"Speaker notes",present:"Present",presentTitle:"Full screen (F)",pdfTitle:"Print to PDF",blocked:"The popup was blocked. Allow popups for this site and try again.",page:"Slide"},ge={empty:"未检测到幻灯片(每页需为 <section data-slide>)。",prev:"上一页",next:"下一页",notes:"备注",notesTitle:"演讲者备注(N)",notesHeading:"演讲者备注",present:"放映",presentTitle:"全屏放映(F)",pdfTitle:"打印为 PDF",blocked:"弹窗被拦截,请允许本站弹出窗口后重试。",page:"第"},Ce={en:ue,zh:ge},D="inline-flex items-center gap-1 rounded-md border px-2 py-1 text-xs";function A({content:e,locale:c,active:r}){let t=Ce[c],l=pe(()=>z(e),[e]),[a,n]=S(0),[f,o]=S(!1),[i,p]=S(""),g=de(null),C=l.slides.length,d=Math.min(a,Math.max(0,C-1)),x=l.slides[d];if(B(()=>n(0),[e]),B(()=>{if(!r||C===0)return;let m=(u)=>{let P=u.target;if(P&&(P.tagName==="INPUT"||P.tagName==="TEXTAREA"||P.isContentEditable))return;if(u.key==="ArrowRight"||u.key==="PageDown"||u.key===" ")u.preventDefault(),n((h)=>Math.min(h+1,C-1));else if(u.key==="ArrowLeft"||u.key==="PageUp")u.preventDefault(),n((h)=>Math.max(h-1,0));else if(u.key==="Home")n(0);else if(u.key==="End")n(C-1);else if(u.key.toLowerCase()==="n")o((h)=>!h);else if(u.key.toLowerCase()==="f")if(document.fullscreenElement)document.exitFullscreen();else g.current?.requestFullscreen?.()};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[r,C]),!x)return b("div",{className:"flex h-full items-center justify-center p-6 text-sm text-muted-foreground",children:t.empty});return y("div",{ref:g,className:"flex h-full min-h-72 flex-col bg-muted/30",children:[y("div",{className:"relative min-h-0 flex-1",children:[b("iframe",{title:`slide-${x.id}`,srcDoc:x.html,sandbox:"allow-scripts",className:"h-full w-full border-0 bg-white"},x.id),b("button",{type:"button",onClick:()=>n((m)=>Math.max(m-1,0)),disabled:d===0,className:"absolute left-2 top-1/2 -translate-y-1/2 rounded-full border bg-background/80 p-1.5 shadow backdrop-blur disabled:opacity-30","aria-label":t.prev,children:b(ie,{className:"size-4"})}),b("button",{type:"button",onClick:()=>n((m)=>Math.min(m+1,C-1)),disabled:d===C-1,className:"absolute right-2 top-1/2 -translate-y-1/2 rounded-full border bg-background/80 p-1.5 shadow backdrop-blur disabled:opacity-30","aria-label":t.next,children:b(ae,{className:"size-4"})}),y("div",{className:"absolute bottom-2 left-1/2 -translate-x-1/2 rounded-full bg-foreground/80 px-2.5 py-0.5 text-xs tabular-nums text-background",children:[d+1," / ",C]}),f&&x.notes&&y("div",{className:"absolute inset-x-3 bottom-10 max-h-[40%] overflow-y-auto rounded-md border bg-background/95 p-3 text-sm shadow-lg",children:[b("div",{className:"mb-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground",children:t.notesHeading}),x.notes]})]}),i&&b("p",{role:"status",className:"border-t bg-background px-3 py-1 text-xs text-destructive",children:i}),y("div",{className:"flex items-center gap-2 border-t bg-background px-3 py-2",children:[b("div",{className:"flex min-w-0 flex-1 gap-1.5 overflow-x-auto",children:l.slides.map((m,u)=>b("button",{type:"button",onClick:()=>n(u),"aria-label":`${t.page} ${u+1}`,"aria-current":u===d?"true":void 0,...m.bg?{style:{background:m.bg}}:{},className:`flex size-7 shrink-0 items-center justify-center rounded border text-[11px] tabular-nums ${u===d?"border-primary ring-2 ring-primary/30":"text-muted-foreground hover:border-foreground/30"}`,children:u+1},m.id))}),y("button",{type:"button",onClick:()=>o((m)=>!m),className:`${D} ${f?"border-primary bg-primary/10 text-primary":"text-muted-foreground hover:bg-accent"}`,title:t.notesTitle,children:[b(ce,{className:"size-3.5"}),t.notes]}),y("button",{type:"button",onClick:()=>{if(!document.fullscreenElement)g.current?.requestFullscreen?.()},className:`${D} text-muted-foreground hover:bg-accent`,title:t.presentTitle,children:[b(le,{className:"size-3.5"}),t.present]}),y("button",{type:"button",onClick:()=>p(F(l)?"":t.blocked),className:`${D} text-muted-foreground hover:bg-accent`,title:t.pdfTitle,children:[b(se,{className:"size-3.5"}),"PDF"]})]})]})}var It={id:"presentation-deck",version:"1.0.0",kitApi:v,views:[{id:"slides",label:{zh:"幻灯片",en:"Slides"},match:(e)=>e.artifactKind==="presentation"&&e.format==="html"&&V(e.content),View:A}]};class j extends Error{code;status;constructor(e,c,r){super(c);this.code=e;this.status=r;this.name="CreationApiError"}}function me(e){return`/projects/${encodeURIComponent(e)}`}function Ut(e){let c=e.base.replace(/\/$/,""),r=e.fetch??((a,n)=>globalThis.fetch(a,n));async function t(a,n={}){let f=n.method??(n.body===void 0?"GET":"POST"),o=await r(`${c}${a}`,{method:f,headers:{accept:"application/json",...n.body===void 0?{}:{"content-type":"application/json"}},...n.body===void 0?{}:{body:JSON.stringify(n.body)},...n.signal?{signal:n.signal}:{}}),i=await o.text(),p=null;if(i)try{p=JSON.parse(i)}catch{p=null}if(!o.ok){let g=p?.error;throw new j(typeof g?.code==="string"?g.code:"request-failed",typeof g?.message==="string"?g.message:`Request failed (${o.status})`,o.status)}if(p===null)throw new j("invalid-response","Empty or non-JSON response",o.status);return p}let l=me;return{request:t,getConfiguration:(a)=>t(e.configurationPath??"",{method:"GET",...a?{signal:a}:{}}),listProjects:(a)=>t("/projects",{method:"GET",...a?{signal:a}:{}}),createProject:(a)=>t("/projects",{body:a}),getProject:(a,n)=>t(l(a),{method:"GET",...n?{signal:n}:{}}),addSource:(a,n)=>t(`${l(a)}/sources`,{body:n}),appendArtifact:(a,n)=>t(`${l(a)}/artifacts`,{body:n}),saveRevision:(a,n,f)=>t(`${l(a)}/artifacts/${encodeURIComponent(n)}/revisions`,{body:f}),startRun:(a,n)=>t(`${l(a)}/runs`,{body:n}),cancelRun:(a,n)=>t(`${l(a)}/runs/${encodeURIComponent(n)}/cancel`,{body:{}}),resumeRun:(a,n)=>t(`${l(a)}/runs/${encodeURIComponent(n)}/resume`,{body:{}})}}export{Ve as Badge,Ke as Button,v as CREATION_KIT_API,Me as Checkbox,He as Collapsible,_e as CollapsibleContent,qe as CollapsibleTrigger,j as CreationApiError,Ue as CreationLocaleProvider,Pe as CreationTransportProvider,Oe as CreationUiProvider,A as DeckViewer,dt as Dialog,gt as DialogContent,bt as DialogDescription,mt as DialogFooter,Ct as DialogHeader,ft as DialogTitle,ut as DialogTrigger,Fe as Input,ze as Label,lt as Popover,pt as PopoverContent,ct as PopoverTrigger,xt as Prompt,Ge as ScrollArea,Je as ScrollBar,We as Select,Ze as SelectContent,Qe as SelectItem,Ye as SelectTrigger,Xe as SelectValue,et as Tabs,nt as TabsContent,tt as TabsList,ot as TabsTrigger,Be as Textarea,rt as Tooltip,st as TooltipContent,it as TooltipProvider,at as TooltipTrigger,re as buildPrintShellHtml,De as cn,Ut as createCreationClient,xe as createCreationKindRegistry,je as creationErrorStatus,me as creationProjectPath,V as isDeck,z as parseDeck,It as presentationDeckPlugin,F as printDeckToPdf,Ne as useCreationLocale,he as useCreationTransport};
|
|
1
|
+
import{t,m,b,y,x,P,n,v,r,k,h,T,w,S,R,I,j,D,A,E,L,N,U,O,q,F,K,B,V,z,M,_,H,J,G,W,Y,X,Z,Q,ee,te,oe,ne,c,l,f,d,i,re,a,o,u,p,s,ie}from"./index-rep1qesa.js";import{e,g,C}from"./index-wsse4x6x.js";export{h as Badge,k as Button,t as CREATION_KIT_API,s as CREATION_RUN_CHANGED_EVENT,u as CREATION_RUN_SERVER_STATE,R as Checkbox,I as Collapsible,D as CollapsibleContent,j as CollapsibleTrigger,e as CreationApiError,n as CreationLocaleProvider,b as CreationTransportProvider,r as CreationUiProvider,i as DeckViewer,Y as Dialog,Z as DialogContent,oe as DialogDescription,ee as DialogFooter,Q as DialogHeader,te as DialogTitle,X as DialogTrigger,w as Input,T as Label,J as Popover,W as PopoverContent,G as PopoverTrigger,ne as Prompt,A as ScrollArea,E as ScrollBar,L as Select,O as SelectContent,q as SelectItem,N as SelectTrigger,U as SelectValue,F as Tabs,V as TabsContent,K as TabsList,B as TabsTrigger,S as Textarea,z as Tooltip,H as TooltipContent,M as TooltipProvider,_ as TooltipTrigger,f as buildPrintShellHtml,x as cn,C as createCreationClient,m as createCreationKindRegistry,p as createCreationRunController,P as creationErrorStatus,g as creationProjectPath,a as creationRunStatus,c as isDeck,l as parseDeck,re as presentationDeckPlugin,d as printDeckToPdf,o as unresolvedCreationRuns,v as useCreationLocale,ie as useCreationRun,y as useCreationTransport};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { CreationProject, CreationRunInput } from "@uibot/contracts";
|
|
2
|
+
import { type CreationClient } from "./client.js";
|
|
3
|
+
import type { CreationLocale } from "./contract.js";
|
|
4
|
+
/**
|
|
5
|
+
* At-most-once creation run dispatch shared by every host (ported from InfoOS, ADR 0012 R4).
|
|
6
|
+
*
|
|
7
|
+
* Before a run is sent, a reservation (request id + intent) is written to host storage and read
|
|
8
|
+
* back; the POST only happens under a cross-context lock, so two tabs or entry points cannot send
|
|
9
|
+
* twice. A response that does not prove the run was rejected before acceptance keeps the
|
|
10
|
+
* reservation: the run's outcome is then only ever reconciled with a read, never re-sent.
|
|
11
|
+
*/
|
|
12
|
+
export interface CreationRunStorage {
|
|
13
|
+
getItem(key: string): string | null;
|
|
14
|
+
setItem(key: string, value: string): void;
|
|
15
|
+
removeItem(key: string): void;
|
|
16
|
+
}
|
|
17
|
+
export interface CreationRunLocks {
|
|
18
|
+
request(name: string, callback: () => Promise<void>): Promise<unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface CreationRunControllerOptions {
|
|
21
|
+
client: Pick<CreationClient, "getProject" | "startRun">;
|
|
22
|
+
project: CreationProject;
|
|
23
|
+
/** Host-scoped key (identity + project); one reservation per key. */
|
|
24
|
+
storageKey: string;
|
|
25
|
+
/** Host storage shared across tabs (usually `localStorage`); missing storage disables sending. */
|
|
26
|
+
storage: CreationRunStorage | undefined;
|
|
27
|
+
/** Cross-context lock (usually `navigator.locks`); missing locks disable sending. */
|
|
28
|
+
locks: CreationRunLocks | undefined;
|
|
29
|
+
/** Changes when the signed-in actor or tenant changes; stale responses are then ignored. */
|
|
30
|
+
authority?: () => string;
|
|
31
|
+
newRequestId?: () => string;
|
|
32
|
+
/** Tells other contexts that the reservation changed (e.g. a window event). */
|
|
33
|
+
broadcast?: () => void;
|
|
34
|
+
locale?: CreationLocale;
|
|
35
|
+
onProject?: (project: CreationProject, artifactId?: string) => void;
|
|
36
|
+
/** Called synchronously whenever `writingBlocked` changes (e.g. to lock manual saves). */
|
|
37
|
+
onWritingBlocked?: (blocked: boolean) => void;
|
|
38
|
+
}
|
|
39
|
+
export interface CreationRunState {
|
|
40
|
+
/** Generation is blocked: reservation pending, unreadable, run unresolved, or sending. */
|
|
41
|
+
pending: boolean;
|
|
42
|
+
sending: boolean;
|
|
43
|
+
checking: boolean;
|
|
44
|
+
/** Writing (manual edits included) must wait: sending, reserved or unresolved run. */
|
|
45
|
+
writingBlocked: boolean;
|
|
46
|
+
canReconcile: boolean;
|
|
47
|
+
message: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* State for server rendering and hydration: storage is unknown there, so generation is shown as
|
|
51
|
+
* blocked until the client reads the reservation after mount.
|
|
52
|
+
*/
|
|
53
|
+
export declare const CREATION_RUN_SERVER_STATE: CreationRunState;
|
|
54
|
+
export interface CreationRunController {
|
|
55
|
+
getState(): CreationRunState;
|
|
56
|
+
subscribe(listener: () => void): () => void;
|
|
57
|
+
/** Feed the latest project (runs) from the host. */
|
|
58
|
+
setProject(project: CreationProject): void;
|
|
59
|
+
/** Re-read the shared reservation (after a storage event from another context). */
|
|
60
|
+
refresh(): void;
|
|
61
|
+
start(input: Omit<CreationRunInput, "requestId">): Promise<void>;
|
|
62
|
+
reconcile(): Promise<void>;
|
|
63
|
+
/** Resume after {@link deactivate} (a remount of the same view). */
|
|
64
|
+
activate(): void;
|
|
65
|
+
/** Ignore every response from operations started before this point (unmount, key switch). */
|
|
66
|
+
deactivate(): void;
|
|
67
|
+
}
|
|
68
|
+
export declare function createCreationRunController(options: CreationRunControllerOptions): CreationRunController;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CreationRun } from "@uibot/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Effective status of a creation run. A terminal run does not prove that its provider requests
|
|
4
|
+
* have settled: an unknown or malformed model request outcome, or a request still pending on a
|
|
5
|
+
* terminal run, makes the whole run `unknown` (fail closed — never re-send it).
|
|
6
|
+
*/
|
|
7
|
+
export declare function creationRunStatus(run: CreationRun): CreationRun["status"] | "unknown";
|
|
8
|
+
/** Runs that may still produce a result: active, interrupted or of unknown outcome. */
|
|
9
|
+
export declare function unresolvedCreationRuns(runs?: CreationRun[]): CreationRun[];
|
package/dist/testing.js
CHANGED
|
@@ -1,17 +1 @@
|
|
|
1
|
-
import{
|
|
2
|
-
<style>
|
|
3
|
-
html, body { margin:0; padding:0; }
|
|
4
|
-
body { display:flex; align-items:center; justify-content:center; min-height:100vh; }
|
|
5
|
-
.slide, [data-slide] { transform-origin: center center !important; }
|
|
6
|
-
</style></head><body class="${l}" style="${a}">${f}</body></html>`,notes:u,id:d,...x?{bg:x}:{}}}),head:n,bodyClass:l,bodyStyle:a,title:r}}function se(e){return`<!DOCTYPE html><html><head>
|
|
7
|
-
<style>
|
|
8
|
-
@page { size: 1280px 720px; margin: 0; }
|
|
9
|
-
html, body { margin:0; padding:0; }
|
|
10
|
-
.page { width: 1280px; height: 720px; overflow: hidden; page-break-after: always; }
|
|
11
|
-
.page:last-child { page-break-after: auto; }
|
|
12
|
-
.page iframe.slide { display:block; width:100%; height:100%; border:0; }
|
|
13
|
-
</style></head><body>
|
|
14
|
-
${Array.from({length:e},(n,t)=>`<div class="page"><iframe class="slide" data-slide-index="${t}" sandbox="allow-scripts"></iframe></div>`).join(`
|
|
15
|
-
`)}
|
|
16
|
-
<script>window.onload=()=>setTimeout(()=>window.print(),300)</script>
|
|
17
|
-
</body></html>`}function M(e,c=(n,t)=>window.open(n,t)){let n=c("","_blank");if(!n)return!1;n.opener=null,n.document.write(se(e.slides.length)),n.document.close();let t=n.document.querySelectorAll("iframe.slide");return e.slides.forEach((l,a)=>{let r=t[a];if(r)r.srcdoc=l.html}),!0}import{ChevronLeft as le,ChevronRight as ce,FileDown as pe,Maximize2 as de,StickyNote as ue}from"lucide-react";import{useEffect as H,useMemo as ge,useRef as Ce,useState as S}from"react";import{jsx as b,jsxs as y}from"react/jsx-runtime";var me={empty:"No slides found (each slide must be a <section data-slide>).",prev:"Previous slide",next:"Next slide",notes:"Notes",notesTitle:"Speaker notes (N)",notesHeading:"Speaker notes",present:"Present",presentTitle:"Full screen (F)",pdfTitle:"Print to PDF",blocked:"The popup was blocked. Allow popups for this site and try again.",page:"Slide"},fe={empty:"未检测到幻灯片(每页需为 <section data-slide>)。",prev:"上一页",next:"下一页",notes:"备注",notesTitle:"演讲者备注(N)",notesHeading:"演讲者备注",present:"放映",presentTitle:"全屏放映(F)",pdfTitle:"打印为 PDF",blocked:"弹窗被拦截,请允许本站弹出窗口后重试。",page:"第"},be={en:me,zh:fe},D="inline-flex items-center gap-1 rounded-md border px-2 py-1 text-xs";function A({content:e,locale:c,active:n}){let t=be[c],l=ge(()=>B(e),[e]),[a,r]=S(0),[C,o]=S(!1),[i,p]=S(""),g=Ce(null),m=l.slides.length,d=Math.min(a,Math.max(0,m-1)),x=l.slides[d];if(H(()=>r(0),[e]),H(()=>{if(!n||m===0)return;let f=(u)=>{let T=u.target;if(T&&(T.tagName==="INPUT"||T.tagName==="TEXTAREA"||T.isContentEditable))return;if(u.key==="ArrowRight"||u.key==="PageDown"||u.key===" ")u.preventDefault(),r((v)=>Math.min(v+1,m-1));else if(u.key==="ArrowLeft"||u.key==="PageUp")u.preventDefault(),r((v)=>Math.max(v-1,0));else if(u.key==="Home")r(0);else if(u.key==="End")r(m-1);else if(u.key.toLowerCase()==="n")o((v)=>!v);else if(u.key.toLowerCase()==="f")if(document.fullscreenElement)document.exitFullscreen();else g.current?.requestFullscreen?.()};return window.addEventListener("keydown",f),()=>window.removeEventListener("keydown",f)},[n,m]),!x)return b("div",{className:"flex h-full items-center justify-center p-6 text-sm text-muted-foreground",children:t.empty});return y("div",{ref:g,className:"flex h-full min-h-72 flex-col bg-muted/30",children:[y("div",{className:"relative min-h-0 flex-1",children:[b("iframe",{title:`slide-${x.id}`,srcDoc:x.html,sandbox:"allow-scripts",className:"h-full w-full border-0 bg-white"},x.id),b("button",{type:"button",onClick:()=>r((f)=>Math.max(f-1,0)),disabled:d===0,className:"absolute left-2 top-1/2 -translate-y-1/2 rounded-full border bg-background/80 p-1.5 shadow backdrop-blur disabled:opacity-30","aria-label":t.prev,children:b(le,{className:"size-4"})}),b("button",{type:"button",onClick:()=>r((f)=>Math.min(f+1,m-1)),disabled:d===m-1,className:"absolute right-2 top-1/2 -translate-y-1/2 rounded-full border bg-background/80 p-1.5 shadow backdrop-blur disabled:opacity-30","aria-label":t.next,children:b(ce,{className:"size-4"})}),y("div",{className:"absolute bottom-2 left-1/2 -translate-x-1/2 rounded-full bg-foreground/80 px-2.5 py-0.5 text-xs tabular-nums text-background",children:[d+1," / ",m]}),C&&x.notes&&y("div",{className:"absolute inset-x-3 bottom-10 max-h-[40%] overflow-y-auto rounded-md border bg-background/95 p-3 text-sm shadow-lg",children:[b("div",{className:"mb-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground",children:t.notesHeading}),x.notes]})]}),i&&b("p",{role:"status",className:"border-t bg-background px-3 py-1 text-xs text-destructive",children:i}),y("div",{className:"flex items-center gap-2 border-t bg-background px-3 py-2",children:[b("div",{className:"flex min-w-0 flex-1 gap-1.5 overflow-x-auto",children:l.slides.map((f,u)=>b("button",{type:"button",onClick:()=>r(u),"aria-label":`${t.page} ${u+1}`,"aria-current":u===d?"true":void 0,...f.bg?{style:{background:f.bg}}:{},className:`flex size-7 shrink-0 items-center justify-center rounded border text-[11px] tabular-nums ${u===d?"border-primary ring-2 ring-primary/30":"text-muted-foreground hover:border-foreground/30"}`,children:u+1},f.id))}),y("button",{type:"button",onClick:()=>o((f)=>!f),className:`${D} ${C?"border-primary bg-primary/10 text-primary":"text-muted-foreground hover:bg-accent"}`,title:t.notesTitle,children:[b(ue,{className:"size-3.5"}),t.notes]}),y("button",{type:"button",onClick:()=>{if(!document.fullscreenElement)g.current?.requestFullscreen?.()},className:`${D} text-muted-foreground hover:bg-accent`,title:t.presentTitle,children:[b(de,{className:"size-3.5"}),t.present]}),y("button",{type:"button",onClick:()=>p(M(l)?"":t.blocked),className:`${D} text-muted-foreground hover:bg-accent`,title:t.pdfTitle,children:[b(pe,{className:"size-3.5"}),"PDF"]})]})]})}var Et={id:"presentation-deck",version:"1.0.0",kitApi:h,views:[{id:"slides",label:{zh:"幻灯片",en:"Slides"},match:(e)=>e.artifactKind==="presentation"&&e.format==="html"&&F(e.content),View:A}]};class R extends Error{code;status;constructor(e,c,n){super(c);this.code=e;this.status=n;this.name="CreationApiError"}}function xe(e){return`/projects/${encodeURIComponent(e)}`}function Ot(e){let c=e.base.replace(/\/$/,""),n=e.fetch??((a,r)=>globalThis.fetch(a,r));async function t(a,r={}){let C=r.method??(r.body===void 0?"GET":"POST"),o=await n(`${c}${a}`,{method:C,headers:{accept:"application/json",...r.body===void 0?{}:{"content-type":"application/json"}},...r.body===void 0?{}:{body:JSON.stringify(r.body)},...r.signal?{signal:r.signal}:{}}),i=await o.text(),p=null;if(i)try{p=JSON.parse(i)}catch{p=null}if(!o.ok){let g=p?.error;throw new R(typeof g?.code==="string"?g.code:"request-failed",typeof g?.message==="string"?g.message:`Request failed (${o.status})`,o.status)}if(p===null)throw new R("invalid-response","Empty or non-JSON response",o.status);return p}let l=xe;return{request:t,getConfiguration:(a)=>t(e.configurationPath??"",{method:"GET",...a?{signal:a}:{}}),listProjects:(a)=>t("/projects",{method:"GET",...a?{signal:a}:{}}),createProject:(a)=>t("/projects",{body:a}),getProject:(a,r)=>t(l(a),{method:"GET",...r?{signal:r}:{}}),addSource:(a,r)=>t(`${l(a)}/sources`,{body:r}),appendArtifact:(a,r)=>t(`${l(a)}/artifacts`,{body:r}),saveRevision:(a,r,C)=>t(`${l(a)}/artifacts/${encodeURIComponent(r)}/revisions`,{body:C}),startRun:(a,r)=>t(`${l(a)}/runs`,{body:r}),cancelRun:(a,r)=>t(`${l(a)}/runs/${encodeURIComponent(r)}/cancel`,{body:{}}),resumeRun:(a,r)=>t(`${l(a)}/runs/${encodeURIComponent(r)}/resume`,{body:{}})}}import{jsx as q}from"react/jsx-runtime";var ye={Button:"button",Input:"input",Label:"label",Textarea:"textarea",DialogTitle:"h2",DialogDescription:"p"},Te=new Set(["asChild","viewportProps","showCloseButton","sideOffset","align","side"]);function ve(){let e=new Map;return new Proxy({},{get(c,n){let t=e.get(n);if(!t){let l=ye[n]??"div";t=(a)=>{let r={};for(let[C,o]of Object.entries(a))if(!Te.has(C))r[C]=o;return Pe(l,r)},t.displayName=n,e.set(n,t)}return t}})}function Qt(e){return q(O,{primitives:ve(),children:q(L,{locale:e.locale??"en",children:e.children})})}export{Qt as PlainKitProviders,ve as createPlainUi};
|
|
1
|
+
import{n,r}from"./index-rep1qesa.js";import"./index-wsse4x6x.js";import{createElement as d}from"react";import{jsx as s}from"react/jsx-runtime";var g={Button:"button",Input:"input",Label:"label",Textarea:"textarea",DialogTitle:"h2",DialogDescription:"p"},u=new Set(["asChild","viewportProps","showCloseButton","sideOffset","align","side"]);function C(){let e=new Map;return new Proxy({},{get(v,i){let t=e.get(i);if(!t){let c=g[i]??"div";t=(l)=>{let o={};for(let[a,p]of Object.entries(l))if(!u.has(a))o[a]=p;return d(c,o)},t.displayName=i,e.set(i,t)}return t}})}function m(e){return s(r,{primitives:C(),children:s(n,{locale:e.locale??"en",children:e.children})})}export{m as PlainKitProviders,C as createPlainUi};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CreationProject, CreationRunInput } from "@uibot/contracts";
|
|
2
|
+
import type { CreationClient } from "./client.js";
|
|
3
|
+
import type { CreationLocale } from "./contract.js";
|
|
4
|
+
import { type CreationRunLocks, type CreationRunState, type CreationRunStorage } from "./run-controller.js";
|
|
5
|
+
/** Same-document notification that the shared reservation changed. */
|
|
6
|
+
export declare const CREATION_RUN_CHANGED_EVENT = "uibot:creation-run-changed";
|
|
7
|
+
export interface UseCreationRunOptions {
|
|
8
|
+
client: Pick<CreationClient, "getProject" | "startRun">;
|
|
9
|
+
project: CreationProject;
|
|
10
|
+
/** Host-scoped key: include the signed-in identity and the project id. */
|
|
11
|
+
storageKey: string;
|
|
12
|
+
onProject: (project: CreationProject, artifactId?: string) => void;
|
|
13
|
+
/** Receives `writingBlocked` whenever it changes. */
|
|
14
|
+
onPending?: (blocked: boolean) => void;
|
|
15
|
+
authority?: () => string;
|
|
16
|
+
locale?: CreationLocale;
|
|
17
|
+
/** Defaults to `window.localStorage`. */
|
|
18
|
+
storage?: CreationRunStorage;
|
|
19
|
+
/** Defaults to `navigator.locks`. */
|
|
20
|
+
locks?: CreationRunLocks;
|
|
21
|
+
}
|
|
22
|
+
export interface UseCreationRunResult extends CreationRunState {
|
|
23
|
+
start(input: Omit<CreationRunInput, "requestId">): Promise<void>;
|
|
24
|
+
reconcile(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** React binding for {@link createCreationRunController}; one controller per key and project. */
|
|
27
|
+
export declare function useCreationRun(options: UseCreationRunOptions): UseCreationRunResult;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uibot/creation-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
"react-dom": "^19"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@uibot/contracts": "^0.
|
|
43
|
-
"@uibot/ai-chat": "^0.
|
|
42
|
+
"@uibot/contracts": "^0.5.0",
|
|
43
|
+
"@uibot/ai-chat": "^0.5.0",
|
|
44
44
|
"lucide-react": "^1.56.0",
|
|
45
45
|
"clsx": "^2.1.1",
|
|
46
46
|
"tailwind-merge": "^3.7.0"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
|
-
"build": "rm -rf dist && bun build --minify ./src/index.ts ./src/testing.tsx ./src/client.ts --outdir ./dist --format esm --target browser --packages external && bun x tsc -p tsconfig.json",
|
|
49
|
+
"build": "rm -rf dist && bun build --minify ./src/index.ts ./src/testing.tsx ./src/client.ts --outdir ./dist --format esm --target browser --splitting --packages external && bun x tsc -p tsconfig.json",
|
|
50
50
|
"typecheck": "bun x tsc -p tsconfig.json --noEmit",
|
|
51
51
|
"test": "bun test"
|
|
52
52
|
}
|