@taskforcehq/taskforce 0.3.303 → 0.3.304
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/Taskforce.module.css +102 -5
- package/dist/TaskforceCore.js +514 -212
- package/dist/TaskforceCore.test.js +1172 -133
- package/dist/annotatedAttachments/service.d.ts +1 -1
- package/dist/annotatedAttachments/types.d.ts +1 -1
- package/dist/components/features/AgentsModule.js +1 -1
- package/dist/components/features/AgentsModule.test.js +1 -1
- package/dist/components/features/TaskSettings.js +58 -38
- package/dist/components/features/TaskSettings.test.js +139 -40
- package/dist/components/task/TaskActionHeader.d.ts +2 -1
- package/dist/components/task/TaskActionHeader.js +3 -3
- package/dist/components/task/TaskActionHeader.test.js +8 -0
- package/dist/components/task/TaskCard.js +16 -1
- package/dist/components/task/TaskCard.test.js +31 -0
- package/dist/components/task/TaskForm.d.ts +2 -1
- package/dist/components/task/TaskForm.js +22 -4
- package/dist/components/task/TaskForm.test.js +46 -0
- package/dist/components/task/TaskKanban.d.ts +1 -1
- package/dist/components/task/TaskKanban.js +31 -160
- package/dist/components/task/TaskStatusActions.d.ts +6 -1
- package/dist/components/task/TaskStatusActions.js +8 -3
- package/dist/components/task/TaskStatusActions.test.js +9 -0
- package/dist/components/task/taskKanbanDropRules.d.ts +58 -0
- package/dist/components/task/taskKanbanDropRules.js +187 -0
- package/dist/components/task/taskKanbanDropRules.test.d.ts +1 -0
- package/dist/components/task/taskKanbanDropRules.test.js +114 -0
- package/dist/components/ui/Modal.d.ts +1 -1
- package/dist/components/ui/Modal.js +1 -0
- package/dist/components/views/AppShellHeader.js +5 -1
- package/dist/components/views/AppShellHeader.test.js +4 -0
- package/dist/components/views/PlanComparisonPage.d.ts +3 -2
- package/dist/components/views/PlanComparisonPage.js +4 -2
- package/dist/components/views/PlanComparisonPage.test.js +4 -0
- package/dist/components/views/PlansPage.d.ts +5 -1
- package/dist/components/views/PlansPage.js +39 -12
- package/dist/components/views/PlansPage.test.js +59 -2
- package/dist/components/views/StandaloneLayout.js +113 -38
- package/dist/components/views/WidgetView.js +11 -2
- package/dist/components/views/standalone/modals/SyncStatusModal.js +1 -1
- package/dist/core/DeletedTaskLifecycleService.d.ts +2 -1
- package/dist/core/PlanEntitlementService.d.ts +3 -1
- package/dist/core/PlanEntitlementService.js +61 -11
- package/dist/core/SignupMonetizationSettings.test.js +37 -2
- package/dist/core/TaskActivityService.d.ts +4 -1
- package/dist/core/TaskActivityService.js +45 -0
- package/dist/core/TaskAuditTimeline.test.js +52 -1
- package/dist/core/Taskforce.d.ts +15 -11
- package/dist/core/Taskforce.js +43 -2
- package/dist/core/WorkspacePlanMode.test.js +65 -0
- package/dist/documentReviews/service.d.ts +1 -1
- package/dist/documentReviews/types.d.ts +1 -1
- package/dist/hooks/auth/useTaskforceAuthBootstrap.d.ts +48 -0
- package/dist/hooks/auth/useTaskforceAuthBootstrap.js +219 -0
- package/dist/hooks/sync/auth.d.ts +37 -0
- package/dist/hooks/sync/auth.js +61 -0
- package/dist/hooks/sync/bootstrap.d.ts +34 -0
- package/dist/hooks/sync/bootstrap.js +52 -0
- package/dist/hooks/sync/orchestratorShared.d.ts +36 -0
- package/dist/hooks/sync/orchestratorShared.js +209 -0
- package/dist/hooks/sync/orchestratorShared.test.d.ts +1 -0
- package/dist/hooks/sync/orchestratorShared.test.js +49 -0
- package/dist/hooks/sync/realtime.d.ts +25 -0
- package/dist/hooks/sync/realtime.js +60 -0
- package/dist/hooks/sync/recovery.d.ts +69 -0
- package/dist/hooks/sync/recovery.js +118 -0
- package/dist/hooks/sync/transfers.d.ts +122 -0
- package/dist/hooks/sync/transfers.js +431 -0
- package/dist/hooks/sync/useDataVersionRefresh.d.ts +16 -0
- package/dist/hooks/sync/useDataVersionRefresh.js +73 -0
- package/dist/hooks/ui/useResourceExport.d.ts +3 -1
- package/dist/hooks/ui/useResourceExport.js +5 -2
- package/dist/hooks/ui/useWorkflowTemplates.js +11 -6
- package/dist/hooks/useRealtimeSync.js +2 -1
- package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +8 -0
- package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +1 -0
- package/dist/hooks/useSyncOrchestrator.context-assets.test.js +228 -0
- package/dist/hooks/useSyncOrchestrator.d.ts +5 -4
- package/dist/hooks/useSyncOrchestrator.js +314 -873
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +568 -3
- package/dist/hooks/useTaskMutations.js +45 -6
- package/dist/hooks/useTaskMutations.test.js +147 -0
- package/dist/hooks/useTaskforce.d.ts +8 -2
- package/dist/hooks/useTaskforce.js +285 -812
- package/dist/hooks/useWorkspaceSyncController.d.ts +1 -0
- package/dist/hooks/useWorkspaceSyncController.js +22 -10
- package/dist/hooks/workspace/useTaskforceApiRouting.test.js +17 -0
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +166 -0
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +434 -0
- package/dist/hooks/workspace/workspaceLocalState.d.ts +19 -0
- package/dist/hooks/workspace/workspaceLocalState.js +100 -0
- package/dist/hooks/workspace/workspaceLocalState.test.d.ts +1 -0
- package/dist/hooks/workspace/workspaceLocalState.test.js +59 -0
- package/dist/localization/locales/en-US.js +2 -2
- package/dist/mcp/canonicalAssetHelpers.d.ts +70 -0
- package/dist/mcp/canonicalAssetHelpers.js +259 -0
- package/dist/mcp/clientIntegrations.d.ts +12 -1
- package/dist/mcp/clientIntegrations.js +161 -6
- package/dist/mcp/clientIntegrations.test.js +76 -4
- package/dist/mcp/documentHelpers.d.ts +100 -0
- package/dist/mcp/documentHelpers.js +161 -0
- package/dist/mcp/runtime.js +174 -476
- package/dist/mcp/runtime.test.js +81 -8
- package/dist/mcp/taskAttachmentHelpers.d.ts +41 -0
- package/dist/mcp/taskAttachmentHelpers.js +60 -0
- package/dist/mcp/taskAttachmentTypes.d.ts +37 -0
- package/dist/mcp/taskAttachmentTypes.js +1 -0
- package/dist/plugins/vite.js +1 -1
- package/dist/runtime/appGateDefinitions.d.ts +1 -1
- package/dist/runtime/appGateDefinitions.js +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +46 -3
- package/dist/server/index.test.js +12 -1
- package/dist/server/routes/admin.js +13 -19
- package/dist/server/routes/auth.js +37 -2
- package/dist/server/routes/billing.js +18 -67
- package/dist/server/routes/billing.test.js +43 -0
- package/dist/server/routes/shared.d.ts +30 -0
- package/dist/server/routes/shared.js +26 -0
- package/dist/server/routes/sync.integration.test.js +20 -0
- package/dist/server/routes/sync.js +110 -237
- package/dist/server/routes/tasks.js +49 -7
- package/dist/server/routes.js +8 -19
- package/dist/server/routes.test.js +243 -5
- package/dist/shared/taskActor.d.ts +10 -0
- package/dist/shared/taskActor.js +1 -0
- package/dist/sync/collaborationSyncPayload.js +4 -0
- package/dist/sync/collaborationSyncPayload.test.js +8 -0
- package/dist/sync/collaborationSyncState.d.ts +3 -1
- package/dist/sync/collaborationSyncState.js +19 -0
- package/dist/sync/contentSyncState.js +12 -10
- package/dist/sync/syncApplyHandlers.d.ts +87 -1
- package/dist/sync/syncApplyHandlers.js +370 -8
- package/dist/sync/syncApplyHandlers.test.d.ts +1 -0
- package/dist/sync/syncApplyHandlers.test.js +377 -0
- package/dist/sync/syncService.d.ts +8 -1
- package/dist/sync/syncService.js +36 -2
- package/dist/sync/syncService.test.js +48 -0
- package/dist/sync/workspacePullFeed.d.ts +1 -0
- package/dist/sync/workspacePullFeed.js +66 -59
- package/dist/sync/workspacePullFeed.test.js +72 -4
- package/dist/sync/workspaceSyncModel.d.ts +22 -1
- package/dist/sync/workspaceSyncModel.js +65 -0
- package/dist/sync/workspaceSyncModel.test.js +119 -0
- package/dist/types.d.ts +2 -10
- package/dist/ui/assets/AgentsModule-BLWVbuKP.js +1 -0
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-C_TmXZwA.js → AnnotatedAttachmentWorkspace-BlS-cqnl.js} +1 -1
- package/dist/ui/assets/{DocumentWorkspace-C3GyzrWm.js → DocumentWorkspace-BH_6DF6x.js} +1 -1
- package/dist/ui/assets/{InitiativesModule-4-Rh2K2n.js → InitiativesModule-BjR6iBf9.js} +1 -1
- package/dist/ui/assets/{PlansPage-BlVC_lRq.css → PlansPage-C2dd2n1X.css} +1 -1
- package/dist/ui/assets/PlansPage-CSDQ4sLa.js +1 -0
- package/dist/ui/assets/TaskSettings-CEDy34Jo.js +9 -0
- package/dist/ui/assets/{WorkflowsModule-CGk9s3NJ.js → WorkflowsModule-DnFqdUME.js} +1 -1
- package/dist/ui/assets/index-DXUdtH1B.js +6 -0
- package/dist/ui/assets/index-Ii0B0rTO.css +1 -0
- package/dist/ui/assets/{vendor-icons-pWocEipT.js → vendor-icons-I7ZwG1z_.js} +1 -1
- package/dist/ui/index.html +4 -4
- package/dist/utils/taskActivity.js +4 -0
- package/dist/utils/taskActivity.test.js +25 -1
- package/package.json +3 -1
- package/scripts/playwright-auth.sh +4 -0
- package/dist/ui/assets/AgentsModule-CpsTmrIW.js +0 -1
- package/dist/ui/assets/PlansPage-BP7AYOqr.js +0 -1
- package/dist/ui/assets/TaskSettings-BOC5F6Ag.js +0 -8
- package/dist/ui/assets/index-CLIMgR6g.js +0 -6
- package/dist/ui/assets/index-DneETxcu.css +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{j as t,r as a,R as qt}from"./vendor-react-CKJs5o3c.js";import{R as xs,f as Ce,e as Ct,g as vs,t as Bn,M as Jt}from"./index-CLIMgR6g.js";import{q as _s,m as js,c as Zt,T as Tn,s as ks,a2 as ws,h as An,aj as Cs,R as Is,ak as Ss,al as Ns,am as $s,an as tn,C as nn,ao as Rs,ap as Dn,aq as zn,ar as Un,as as Gn,g as Ps,f as Bs,b as sn}from"./vendor-icons-pWocEipT.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function Ts({copied:o,disabled:l=!1,label:m,onClick:g,title:w="Copy image reference",ariaLabel:y,className:M=""}){return t.jsx(xs,{copied:o,disabled:l,label:"",onClick:g,title:w,ariaLabel:y,className:M,children:m})}const As="_shell_sf7jc_1",Es="_panel_sf7jc_16",Ms="_sessionPanel_sf7jc_22",Ls="_detailPanel_sf7jc_23",Fs="_sessionContextBar_sf7jc_29",Hs="_sessionContextLeft_sf7jc_40",Os="_sessionContextRight_sf7jc_41",Ds="_sessionContextLabel_sf7jc_56",zs="_sessionContextSpacer_sf7jc_62",Us="_canvasPanel_sf7jc_67",Gs="_canvasWorkspace_sf7jc_74",Ys="_canvasMain_sf7jc_81",Ks="_panelHeader_sf7jc_88",Ws="_panelHeaderText_sf7jc_97",Xs="_panelTitle_sf7jc_101",Vs="_canvasHeading_sf7jc_105",qs="_sessionActions_sf7jc_109",Js="_sessionList_sf7jc_117",Zs="_annotationList_sf7jc_118",Qs="_markerHelpModalBody_sf7jc_133",ea="_openImageModalBody_sf7jc_139",ta="_openImageField_sf7jc_145",na="_openImageActions_sf7jc_149",sa="_markerHelpItem_sf7jc_155",aa="_markerHelpHeader_sf7jc_163",oa="_markerHelpExample_sf7jc_175",ra="_sessionCard_sf7jc_179",ia="_annotationCard_sf7jc_180",la="_sessionEmptyState_sf7jc_197",ca="_sessionCardButton_sf7jc_204",da="_annotationCardButton_sf7jc_214",ua="_sessionCardBody_sf7jc_224",fa="_sessionCardActive_sf7jc_230",ma="_annotationCardActive_sf7jc_231",pa="_annotationMeta_sf7jc_241",ha="_annotationInstructionPreview_sf7jc_248",ba="_annotationPreviewFooter_sf7jc_256",ga="_annotationInstructionEditor_sf7jc_263",ya="_annotationTypeField_sf7jc_269",xa="_annotationInstructionButton_sf7jc_275",va="_annotationInstructionField_sf7jc_284",_a="_sessionMeta_sf7jc_288",ja="_sessionTitle_sf7jc_295",ka="_annotationTitle_sf7jc_296",wa="_sessionTimestamp_sf7jc_302",Ca="_annotationKind_sf7jc_303",Ia="_annotationInstructionTypeIcon_sf7jc_307",Sa="_sessionInstructionPreview_sf7jc_313",Na="_sessionInstructionEditor_sf7jc_321",$a="_sessionCardFooter_sf7jc_327",Ra="_toolRail_sf7jc_334",Pa="_canvasToolRail_sf7jc_343",Ba="_toolbarCluster_sf7jc_364",Ta="_toolbarViewportCluster_sf7jc_371",Aa="_toolbarSeparator_sf7jc_375",Ea="_toolBtn_sf7jc_381",Ma="_toolRailButton_sf7jc_385",La="_toolbarButton_sf7jc_395",Fa="_toolBtnActive_sf7jc_400",Ha="_toolbarActions_sf7jc_407",Oa="_toolbarSelectionActions_sf7jc_416",Da="_toolbarColorPicker_sf7jc_424",za="_colorPickerButton_sf7jc_428",Ua="_colorPickerSwatch_sf7jc_433",Ga="_colorPickerPopover_sf7jc_441",Ya="_colorOption_sf7jc_456",Ka="_colorOptionActive_sf7jc_466",Wa="_toolbarUtilities_sf7jc_473",Xa="_toolbarGeometryFields_sf7jc_481",Va="_toolbarGeometryField_sf7jc_481",qa="_toolbarGeometryLabel_sf7jc_494",Ja="_toolbarGeometryInput_sf7jc_500",Za="_iconButton_sf7jc_505",Qa="_ghostBtn_sf7jc_510",eo="_payloadBtn_sf7jc_511",to="_backToTaskBtn_sf7jc_512",no="_canvasScroller_sf7jc_532",so="_canvasFrame_sf7jc_548",ao="_canvasMedia_sf7jc_555",oo="_canvasStatusOverlay_sf7jc_563",ro="_canvasStatusCard_sf7jc_575",io="_canvasImage_sf7jc_588",lo="_overlay_sf7jc_595",co="_overlaySelect_sf7jc_601",uo="_overlayPan_sf7jc_605",fo="_overlaySvg_sf7jc_609",mo="_overlayHitLayer_sf7jc_618",po="_arrowHitArea_sf7jc_627",ho="_canvasHandleHit_sf7jc_634",bo="_canvasResizeHandleHit_sf7jc_641",go="_canvasHandleVisible_sf7jc_645",yo="_pin_sf7jc_662",xo="_note_sf7jc_663",vo="_annotationNumberBadge_sf7jc_680",_o="_box_sf7jc_705",jo="_boxNumberBadge_sf7jc_714",ko="_arrowNumberBadge_sf7jc_720",wo="_boxSurface_sf7jc_724",Co="_selected_sf7jc_737",Io="_textInput_sf7jc_754",So="_textArea_sf7jc_755",No="_select_sf7jc_737",$o="_sessionTitleInput_sf7jc_762",Ro="_sessionInstructionField_sf7jc_767",Po="_detailEmpty_sf7jc_776",Bo="_emptyState_sf7jc_777",To="_payloadModalBody_sf7jc_789",Ao="_payloadModalToolbar_sf7jc_796",Eo="_payloadViewToggle_sf7jc_803",Mo="_payloadModalActions_sf7jc_804",Lo="_payloadModalPreview_sf7jc_811",Fo="_statusBar_sf7jc_826",Ho="_annotationSummary_sf7jc_838",s={shell:As,panel:Es,sessionPanel:Ms,detailPanel:Ls,sessionContextBar:Fs,sessionContextLeft:Hs,sessionContextRight:Os,sessionContextLabel:Ds,sessionContextSpacer:zs,canvasPanel:Us,canvasWorkspace:Gs,canvasMain:Ys,panelHeader:Ks,panelHeaderText:Ws,panelTitle:Xs,canvasHeading:Vs,sessionActions:qs,sessionList:Js,annotationList:Zs,markerHelpModalBody:Qs,openImageModalBody:ea,openImageField:ta,openImageActions:na,markerHelpItem:sa,markerHelpHeader:aa,markerHelpExample:oa,sessionCard:ra,annotationCard:ia,sessionEmptyState:la,sessionCardButton:ca,annotationCardButton:da,sessionCardBody:ua,sessionCardActive:fa,annotationCardActive:ma,annotationMeta:pa,annotationInstructionPreview:ha,annotationPreviewFooter:ba,annotationInstructionEditor:ga,annotationTypeField:ya,annotationInstructionButton:xa,annotationInstructionField:va,sessionMeta:_a,sessionTitle:ja,annotationTitle:ka,sessionTimestamp:wa,annotationKind:Ca,annotationInstructionTypeIcon:Ia,sessionInstructionPreview:Sa,sessionInstructionEditor:Na,sessionCardFooter:$a,toolRail:Ra,canvasToolRail:Pa,toolbarCluster:Ba,toolbarViewportCluster:Ta,toolbarSeparator:Aa,toolBtn:Ea,toolRailButton:Ma,toolbarButton:La,toolBtnActive:Fa,toolbarActions:Ha,toolbarSelectionActions:Oa,toolbarColorPicker:Da,colorPickerButton:za,colorPickerSwatch:Ua,colorPickerPopover:Ga,colorOption:Ya,colorOptionActive:Ka,toolbarUtilities:Wa,toolbarGeometryFields:Xa,toolbarGeometryField:Va,toolbarGeometryLabel:qa,toolbarGeometryInput:Ja,iconButton:Za,ghostBtn:Qa,payloadBtn:eo,backToTaskBtn:to,canvasScroller:no,canvasFrame:so,canvasMedia:ao,canvasStatusOverlay:oo,canvasStatusCard:ro,canvasImage:io,overlay:lo,overlaySelect:co,overlayPan:uo,overlaySvg:fo,overlayHitLayer:mo,arrowHitArea:po,canvasHandleHit:ho,canvasResizeHandleHit:bo,canvasHandleVisible:go,pin:yo,note:xo,annotationNumberBadge:vo,box:_o,boxNumberBadge:jo,arrowNumberBadge:ko,boxSurface:wo,selected:Co,textInput:Io,textArea:So,select:No,sessionTitleInput:$o,sessionInstructionField:Ro,detailEmpty:Po,emptyState:Bo,payloadModalBody:To,payloadModalToolbar:Ao,payloadViewToggle:Eo,payloadModalActions:Mo,payloadModalPreview:Lo,statusBar:Fo,annotationSummary:Ho},En=[{value:"review",label:"Review"},{value:"change",label:"Change"},{value:"question",label:"Question"}],Mn=[{value:"select",label:"Select",icon:Rs},{value:"pin",label:"Pin",icon:Dn},{value:"box",label:"Box",icon:zn},{value:"arrow",label:"Arrow",icon:Un},{value:"text-note",label:"Note",icon:Gn}],Oo={pin:Dn,box:zn,arrow:Un,"text-note":Gn},Do={pin:"Pin",box:"Box",arrow:"Arrow","text-note":"Note"},zo={review:tn,change:sn,question:nn,issue:nn,idea:tn},It={select:{short:"Select and edit existing markers.",detail:"Use Select to click, drag, reorder, resize, and update markers that are already on the image.",example:"Example: move an existing marker after the screenshot changes."},pin:{short:"Mark a precise spot.",detail:"Use Pin when feedback points to one exact location instead of a broader area.",example:'Example: "This icon is misaligned by 2px."'},box:{short:"Mark an area or component.",detail:"Use Box when the feedback applies to a whole region, card, panel, or bounded UI block.",example:'Example: "This whole card needs tighter padding and a stronger border."'},arrow:{short:"Show direction or relationship.",detail:"Use Arrow when you need to show movement, attachment, flow, or source-to-target intent.",example:'Example: "This tooltip should anchor to this button, not the panel."'},"text-note":{short:"Add a comment-style point marker.",detail:"Use Note when you want a point marker that reads more like a comment or open question.",example:'Example: "Ask design whether this badge should stay."'}},it={question:"#0f766e",change:"#2563eb",issue:"#dc2626",idea:"#d97706",review:"#7c3aed"},Uo=["#7c3aed","#2563eb","#0f766e","#dc2626","#d97706","#111827"],re="review";function ze(o){const l=String(o.displayName||"").trim();return l?`${l} review`:"Annotated session"}function Yn(){return`annotation-${Math.random().toString(36).slice(2,10)}`}function _(o){return!Number.isFinite(o)||o<=0?0:o>=1?1:o}function Se(o){return _(Math.max(.02,o))}function rt(o){return o?[String(o.taskId||"").trim(),String(o.assetId||"").trim(),String(o.path||"").trim()].join("::"):""}function Go(o){if(!(o instanceof HTMLElement))return!1;const l=o.tagName.toLowerCase();return o.isContentEditable?!0:l==="input"||l==="textarea"||l==="select"}function Ie(o){return o.map((l,m)=>({...l,order:m}))}function Qt(o){if(!o)return"Unsaved";const l=new Date(o);return Number.isNaN(l.getTime())?"Unsaved":l.toLocaleString()}function St(o){const l=String(o.createdByActor?.label||"").trim();return l||null}function Yo(o){const l=String(o||"").trim().replace(/\s+/g," ");return l?l.length>110?`${l.slice(0,107)}...`:l:""}function Ln(o,l,m,g=it[re]){const w={id:Yn(),order:0,instruction:"",markerType:re,color:g};if(o==="pin")return{...w,kind:o,x:l.x,y:l.y};if(o==="text-note")return{...w,kind:o,x:l.x,y:l.y};if(o==="box"){const M=m||l;return{...w,kind:o,x:_(Math.min(l.x,M.x)),y:_(Math.min(l.y,M.y)),width:Se(Math.abs(M.x-l.x)),height:Se(Math.abs(M.y-l.y))}}const y=m||l;return{...w,kind:"arrow",x:l.x,y:l.y,x2:y.x,y2:y.y}}function en(o){return o.color?o.color:it[o.markerType||re]}function Ko(o,l){const m=Math.max(l.width,1),g=Math.max(l.height,1),w=o.x*m,y=o.y*g,M=o.x2*m,ne=o.y2*g,Ue=M-w,Ge=ne-y,me=Math.hypot(Ue,Ge)||1,ie=Ue/me,Ye=Ge/me,Ne=Math.max(10,Math.min(16,me-2)),T=Ne*.62,Ke=M-ie*Ne,pe=ne-Ye*Ne,he=-Ye,se=ie;return{shaftX1:w,shaftY1:y,shaftX2:Ke,shaftY2:pe,headPoints:[`${M},${ne}`,`${Ke+he*T},${pe+se*T}`,`${Ke-he*T},${pe-se*T}`].join(" ")}}function Wo(o,l){return{...o,markerType:l,color:o.color||it[l]}}function Xo(o,l){return{...o,id:Yn(),order:l}}function Vo(o,l){const m=String(o||"").trim()||(l?ze(l):"Annotated session");return/\bcopy$/i.test(m)?`${m} 2`:`${m} copy`}function qo(o,l,m){if(l===m||l<0||m<0||l>=o.length||m>=o.length)return o;const g=[...o],[w]=g.splice(l,1);return w?(g.splice(m,0,w),Ie(g)):o}function te(o){return String(Math.round(_(o)*1e3)/10)}function Jo(o){const l=Number.parseFloat(o);return Number.isFinite(l)?_(l/100):null}function Zo(o,l,m){return o.kind==="pin"||o.kind==="text-note"?l==="x"||l==="y"?{...o,[l]:_(m)}:o:o.kind==="box"?l==="x"||l==="y"?{...o,[l]:_(m)}:l==="width"||l==="height"?{...o,[l]:Se(m)}:o:l==="x"||l==="y"||l==="x2"||l==="y2"?{...o,[l]:_(m)}:o}function Qo(o){return o.kind==="pin"||o.kind==="text-note"?[{key:"x",label:"X",value:te(o.x)},{key:"y",label:"Y",value:te(o.y)}]:o.kind==="box"?[{key:"x",label:"X",value:te(o.x)},{key:"y",label:"Y",value:te(o.y)},{key:"width",label:"Width",value:te(o.width)},{key:"height",label:"Height",value:te(o.height)}]:[{key:"x",label:"Start X",value:te(o.x)},{key:"y",label:"Start Y",value:te(o.y)},{key:"x2",label:"End X",value:te(o.x2)},{key:"y2",label:"End Y",value:te(o.y2)}]}function er(o){if(!o)return null;const l=Math.round(o.x*100),m=Math.round(o.y*100),g=Math.round(o.width*100),w=Math.round(o.height*100);return`crop ${l}%, ${m}% size ${g}% x ${w}%`}function tr(o){return Number.isFinite(o)?Math.min(4,Math.max(.25,Number(o.toFixed(2)))):1}function Fn(o){const l=[`Annotated attachment: ${o.title||o.image.displayName}`,`Image: ${o.image.displayName}`,`Image Reference: ${o.image.referenceLabel||o.image.assetId}`,`Task ID: ${o.taskId}`,o.globalInstruction?`Global instruction: ${o.globalInstruction}`:"Global instruction: None provided.","Markers:"];return o.annotations.length===0?(l.push("0. No markers."),l.join(`
|
|
1
|
+
import{j as t,r as a,R as qt}from"./vendor-react-CKJs5o3c.js";import{R as xs,f as Ce,e as Ct,g as vs,t as Bn,M as Jt}from"./index-DXUdtH1B.js";import{q as _s,m as js,c as Zt,T as Tn,s as ks,a3 as ws,h as An,ak as Cs,R as Is,al as Ss,am as Ns,an as $s,ao as tn,C as nn,ap as Rs,aq as Dn,ar as zn,as as Un,at as Gn,g as Ps,f as Bs,b as sn}from"./vendor-icons-I7ZwG1z_.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function Ts({copied:o,disabled:l=!1,label:m,onClick:g,title:w="Copy image reference",ariaLabel:y,className:M=""}){return t.jsx(xs,{copied:o,disabled:l,label:"",onClick:g,title:w,ariaLabel:y,className:M,children:m})}const As="_shell_sf7jc_1",Es="_panel_sf7jc_16",Ms="_sessionPanel_sf7jc_22",Ls="_detailPanel_sf7jc_23",Fs="_sessionContextBar_sf7jc_29",Hs="_sessionContextLeft_sf7jc_40",Os="_sessionContextRight_sf7jc_41",Ds="_sessionContextLabel_sf7jc_56",zs="_sessionContextSpacer_sf7jc_62",Us="_canvasPanel_sf7jc_67",Gs="_canvasWorkspace_sf7jc_74",Ys="_canvasMain_sf7jc_81",Ks="_panelHeader_sf7jc_88",Ws="_panelHeaderText_sf7jc_97",Xs="_panelTitle_sf7jc_101",Vs="_canvasHeading_sf7jc_105",qs="_sessionActions_sf7jc_109",Js="_sessionList_sf7jc_117",Zs="_annotationList_sf7jc_118",Qs="_markerHelpModalBody_sf7jc_133",ea="_openImageModalBody_sf7jc_139",ta="_openImageField_sf7jc_145",na="_openImageActions_sf7jc_149",sa="_markerHelpItem_sf7jc_155",aa="_markerHelpHeader_sf7jc_163",oa="_markerHelpExample_sf7jc_175",ra="_sessionCard_sf7jc_179",ia="_annotationCard_sf7jc_180",la="_sessionEmptyState_sf7jc_197",ca="_sessionCardButton_sf7jc_204",da="_annotationCardButton_sf7jc_214",ua="_sessionCardBody_sf7jc_224",fa="_sessionCardActive_sf7jc_230",ma="_annotationCardActive_sf7jc_231",pa="_annotationMeta_sf7jc_241",ha="_annotationInstructionPreview_sf7jc_248",ba="_annotationPreviewFooter_sf7jc_256",ga="_annotationInstructionEditor_sf7jc_263",ya="_annotationTypeField_sf7jc_269",xa="_annotationInstructionButton_sf7jc_275",va="_annotationInstructionField_sf7jc_284",_a="_sessionMeta_sf7jc_288",ja="_sessionTitle_sf7jc_295",ka="_annotationTitle_sf7jc_296",wa="_sessionTimestamp_sf7jc_302",Ca="_annotationKind_sf7jc_303",Ia="_annotationInstructionTypeIcon_sf7jc_307",Sa="_sessionInstructionPreview_sf7jc_313",Na="_sessionInstructionEditor_sf7jc_321",$a="_sessionCardFooter_sf7jc_327",Ra="_toolRail_sf7jc_334",Pa="_canvasToolRail_sf7jc_343",Ba="_toolbarCluster_sf7jc_364",Ta="_toolbarViewportCluster_sf7jc_371",Aa="_toolbarSeparator_sf7jc_375",Ea="_toolBtn_sf7jc_381",Ma="_toolRailButton_sf7jc_385",La="_toolbarButton_sf7jc_395",Fa="_toolBtnActive_sf7jc_400",Ha="_toolbarActions_sf7jc_407",Oa="_toolbarSelectionActions_sf7jc_416",Da="_toolbarColorPicker_sf7jc_424",za="_colorPickerButton_sf7jc_428",Ua="_colorPickerSwatch_sf7jc_433",Ga="_colorPickerPopover_sf7jc_441",Ya="_colorOption_sf7jc_456",Ka="_colorOptionActive_sf7jc_466",Wa="_toolbarUtilities_sf7jc_473",Xa="_toolbarGeometryFields_sf7jc_481",Va="_toolbarGeometryField_sf7jc_481",qa="_toolbarGeometryLabel_sf7jc_494",Ja="_toolbarGeometryInput_sf7jc_500",Za="_iconButton_sf7jc_505",Qa="_ghostBtn_sf7jc_510",eo="_payloadBtn_sf7jc_511",to="_backToTaskBtn_sf7jc_512",no="_canvasScroller_sf7jc_532",so="_canvasFrame_sf7jc_548",ao="_canvasMedia_sf7jc_555",oo="_canvasStatusOverlay_sf7jc_563",ro="_canvasStatusCard_sf7jc_575",io="_canvasImage_sf7jc_588",lo="_overlay_sf7jc_595",co="_overlaySelect_sf7jc_601",uo="_overlayPan_sf7jc_605",fo="_overlaySvg_sf7jc_609",mo="_overlayHitLayer_sf7jc_618",po="_arrowHitArea_sf7jc_627",ho="_canvasHandleHit_sf7jc_634",bo="_canvasResizeHandleHit_sf7jc_641",go="_canvasHandleVisible_sf7jc_645",yo="_pin_sf7jc_662",xo="_note_sf7jc_663",vo="_annotationNumberBadge_sf7jc_680",_o="_box_sf7jc_705",jo="_boxNumberBadge_sf7jc_714",ko="_arrowNumberBadge_sf7jc_720",wo="_boxSurface_sf7jc_724",Co="_selected_sf7jc_737",Io="_textInput_sf7jc_754",So="_textArea_sf7jc_755",No="_select_sf7jc_737",$o="_sessionTitleInput_sf7jc_762",Ro="_sessionInstructionField_sf7jc_767",Po="_detailEmpty_sf7jc_776",Bo="_emptyState_sf7jc_777",To="_payloadModalBody_sf7jc_789",Ao="_payloadModalToolbar_sf7jc_796",Eo="_payloadViewToggle_sf7jc_803",Mo="_payloadModalActions_sf7jc_804",Lo="_payloadModalPreview_sf7jc_811",Fo="_statusBar_sf7jc_826",Ho="_annotationSummary_sf7jc_838",s={shell:As,panel:Es,sessionPanel:Ms,detailPanel:Ls,sessionContextBar:Fs,sessionContextLeft:Hs,sessionContextRight:Os,sessionContextLabel:Ds,sessionContextSpacer:zs,canvasPanel:Us,canvasWorkspace:Gs,canvasMain:Ys,panelHeader:Ks,panelHeaderText:Ws,panelTitle:Xs,canvasHeading:Vs,sessionActions:qs,sessionList:Js,annotationList:Zs,markerHelpModalBody:Qs,openImageModalBody:ea,openImageField:ta,openImageActions:na,markerHelpItem:sa,markerHelpHeader:aa,markerHelpExample:oa,sessionCard:ra,annotationCard:ia,sessionEmptyState:la,sessionCardButton:ca,annotationCardButton:da,sessionCardBody:ua,sessionCardActive:fa,annotationCardActive:ma,annotationMeta:pa,annotationInstructionPreview:ha,annotationPreviewFooter:ba,annotationInstructionEditor:ga,annotationTypeField:ya,annotationInstructionButton:xa,annotationInstructionField:va,sessionMeta:_a,sessionTitle:ja,annotationTitle:ka,sessionTimestamp:wa,annotationKind:Ca,annotationInstructionTypeIcon:Ia,sessionInstructionPreview:Sa,sessionInstructionEditor:Na,sessionCardFooter:$a,toolRail:Ra,canvasToolRail:Pa,toolbarCluster:Ba,toolbarViewportCluster:Ta,toolbarSeparator:Aa,toolBtn:Ea,toolRailButton:Ma,toolbarButton:La,toolBtnActive:Fa,toolbarActions:Ha,toolbarSelectionActions:Oa,toolbarColorPicker:Da,colorPickerButton:za,colorPickerSwatch:Ua,colorPickerPopover:Ga,colorOption:Ya,colorOptionActive:Ka,toolbarUtilities:Wa,toolbarGeometryFields:Xa,toolbarGeometryField:Va,toolbarGeometryLabel:qa,toolbarGeometryInput:Ja,iconButton:Za,ghostBtn:Qa,payloadBtn:eo,backToTaskBtn:to,canvasScroller:no,canvasFrame:so,canvasMedia:ao,canvasStatusOverlay:oo,canvasStatusCard:ro,canvasImage:io,overlay:lo,overlaySelect:co,overlayPan:uo,overlaySvg:fo,overlayHitLayer:mo,arrowHitArea:po,canvasHandleHit:ho,canvasResizeHandleHit:bo,canvasHandleVisible:go,pin:yo,note:xo,annotationNumberBadge:vo,box:_o,boxNumberBadge:jo,arrowNumberBadge:ko,boxSurface:wo,selected:Co,textInput:Io,textArea:So,select:No,sessionTitleInput:$o,sessionInstructionField:Ro,detailEmpty:Po,emptyState:Bo,payloadModalBody:To,payloadModalToolbar:Ao,payloadViewToggle:Eo,payloadModalActions:Mo,payloadModalPreview:Lo,statusBar:Fo,annotationSummary:Ho},En=[{value:"review",label:"Review"},{value:"change",label:"Change"},{value:"question",label:"Question"}],Mn=[{value:"select",label:"Select",icon:Rs},{value:"pin",label:"Pin",icon:Dn},{value:"box",label:"Box",icon:zn},{value:"arrow",label:"Arrow",icon:Un},{value:"text-note",label:"Note",icon:Gn}],Oo={pin:Dn,box:zn,arrow:Un,"text-note":Gn},Do={pin:"Pin",box:"Box",arrow:"Arrow","text-note":"Note"},zo={review:tn,change:sn,question:nn,issue:nn,idea:tn},It={select:{short:"Select and edit existing markers.",detail:"Use Select to click, drag, reorder, resize, and update markers that are already on the image.",example:"Example: move an existing marker after the screenshot changes."},pin:{short:"Mark a precise spot.",detail:"Use Pin when feedback points to one exact location instead of a broader area.",example:'Example: "This icon is misaligned by 2px."'},box:{short:"Mark an area or component.",detail:"Use Box when the feedback applies to a whole region, card, panel, or bounded UI block.",example:'Example: "This whole card needs tighter padding and a stronger border."'},arrow:{short:"Show direction or relationship.",detail:"Use Arrow when you need to show movement, attachment, flow, or source-to-target intent.",example:'Example: "This tooltip should anchor to this button, not the panel."'},"text-note":{short:"Add a comment-style point marker.",detail:"Use Note when you want a point marker that reads more like a comment or open question.",example:'Example: "Ask design whether this badge should stay."'}},it={question:"#0f766e",change:"#2563eb",issue:"#dc2626",idea:"#d97706",review:"#7c3aed"},Uo=["#7c3aed","#2563eb","#0f766e","#dc2626","#d97706","#111827"],re="review";function ze(o){const l=String(o.displayName||"").trim();return l?`${l} review`:"Annotated session"}function Yn(){return`annotation-${Math.random().toString(36).slice(2,10)}`}function _(o){return!Number.isFinite(o)||o<=0?0:o>=1?1:o}function Se(o){return _(Math.max(.02,o))}function rt(o){return o?[String(o.taskId||"").trim(),String(o.assetId||"").trim(),String(o.path||"").trim()].join("::"):""}function Go(o){if(!(o instanceof HTMLElement))return!1;const l=o.tagName.toLowerCase();return o.isContentEditable?!0:l==="input"||l==="textarea"||l==="select"}function Ie(o){return o.map((l,m)=>({...l,order:m}))}function Qt(o){if(!o)return"Unsaved";const l=new Date(o);return Number.isNaN(l.getTime())?"Unsaved":l.toLocaleString()}function St(o){const l=String(o.createdByActor?.label||"").trim();return l||null}function Yo(o){const l=String(o||"").trim().replace(/\s+/g," ");return l?l.length>110?`${l.slice(0,107)}...`:l:""}function Ln(o,l,m,g=it[re]){const w={id:Yn(),order:0,instruction:"",markerType:re,color:g};if(o==="pin")return{...w,kind:o,x:l.x,y:l.y};if(o==="text-note")return{...w,kind:o,x:l.x,y:l.y};if(o==="box"){const M=m||l;return{...w,kind:o,x:_(Math.min(l.x,M.x)),y:_(Math.min(l.y,M.y)),width:Se(Math.abs(M.x-l.x)),height:Se(Math.abs(M.y-l.y))}}const y=m||l;return{...w,kind:"arrow",x:l.x,y:l.y,x2:y.x,y2:y.y}}function en(o){return o.color?o.color:it[o.markerType||re]}function Ko(o,l){const m=Math.max(l.width,1),g=Math.max(l.height,1),w=o.x*m,y=o.y*g,M=o.x2*m,ne=o.y2*g,Ue=M-w,Ge=ne-y,me=Math.hypot(Ue,Ge)||1,ie=Ue/me,Ye=Ge/me,Ne=Math.max(10,Math.min(16,me-2)),T=Ne*.62,Ke=M-ie*Ne,pe=ne-Ye*Ne,he=-Ye,se=ie;return{shaftX1:w,shaftY1:y,shaftX2:Ke,shaftY2:pe,headPoints:[`${M},${ne}`,`${Ke+he*T},${pe+se*T}`,`${Ke-he*T},${pe-se*T}`].join(" ")}}function Wo(o,l){return{...o,markerType:l,color:o.color||it[l]}}function Xo(o,l){return{...o,id:Yn(),order:l}}function Vo(o,l){const m=String(o||"").trim()||(l?ze(l):"Annotated session");return/\bcopy$/i.test(m)?`${m} 2`:`${m} copy`}function qo(o,l,m){if(l===m||l<0||m<0||l>=o.length||m>=o.length)return o;const g=[...o],[w]=g.splice(l,1);return w?(g.splice(m,0,w),Ie(g)):o}function te(o){return String(Math.round(_(o)*1e3)/10)}function Jo(o){const l=Number.parseFloat(o);return Number.isFinite(l)?_(l/100):null}function Zo(o,l,m){return o.kind==="pin"||o.kind==="text-note"?l==="x"||l==="y"?{...o,[l]:_(m)}:o:o.kind==="box"?l==="x"||l==="y"?{...o,[l]:_(m)}:l==="width"||l==="height"?{...o,[l]:Se(m)}:o:l==="x"||l==="y"||l==="x2"||l==="y2"?{...o,[l]:_(m)}:o}function Qo(o){return o.kind==="pin"||o.kind==="text-note"?[{key:"x",label:"X",value:te(o.x)},{key:"y",label:"Y",value:te(o.y)}]:o.kind==="box"?[{key:"x",label:"X",value:te(o.x)},{key:"y",label:"Y",value:te(o.y)},{key:"width",label:"Width",value:te(o.width)},{key:"height",label:"Height",value:te(o.height)}]:[{key:"x",label:"Start X",value:te(o.x)},{key:"y",label:"Start Y",value:te(o.y)},{key:"x2",label:"End X",value:te(o.x2)},{key:"y2",label:"End Y",value:te(o.y2)}]}function er(o){if(!o)return null;const l=Math.round(o.x*100),m=Math.round(o.y*100),g=Math.round(o.width*100),w=Math.round(o.height*100);return`crop ${l}%, ${m}% size ${g}% x ${w}%`}function tr(o){return Number.isFinite(o)?Math.min(4,Math.max(.25,Number(o.toFixed(2)))):1}function Fn(o){const l=[`Annotated attachment: ${o.title||o.image.displayName}`,`Image: ${o.image.displayName}`,`Image Reference: ${o.image.referenceLabel||o.image.assetId}`,`Task ID: ${o.taskId}`,o.globalInstruction?`Global instruction: ${o.globalInstruction}`:"Global instruction: None provided.","Markers:"];return o.annotations.length===0?(l.push("0. No markers."),l.join(`
|
|
2
2
|
`)):(o.annotations.forEach((m,g)=>{const w=m.markerType||re,y=er(m.cropHint);l.push(`${g+1}. ${m.kind} (${w})`),l.push(`Instruction: ${m.instruction||"No marker instruction."}`),y&&l.push(`Region: ${y}`)}),l.join(`
|
|
3
3
|
`))}function Nt(o){return{title:o.title,globalInstruction:o.globalInstruction,annotations:Ie(o.annotations)}}function Hn(o){return JSON.stringify(Nt(o))}function On(o){const l=JSON.parse(o);return Nt({title:String(l?.title||""),globalInstruction:String(l?.globalInstruction||""),annotations:Array.isArray(l?.annotations)?l.annotations:[]})}function nr(o,l){return Nt({title:o?.title||l,globalInstruction:o?.globalInstruction||"",annotations:o?.annotations||[]})}function dr({runtimeMode:o="local",apiBaseUrl:l="",cloudAuthBaseUrl:m="",workspaceId:g="default",sessionLoadReady:w=!0,requestedTarget:y=null,requestedSessionId:M=null,requestedOpenVersion:ne=0,resolveTaskReferenceLabel:Ue,resolveImageReferenceLabel:Ge,onRequestedTargetHandled:me,onOpenTarget:ie,onContextChange:Ye,onBackToTask:Ne}){const T=o==="cloud"&&(m||l)||"",[Ke,pe]=a.useState(y),[he,se]=a.useState([]),[x,$e]=a.useState(null),[$t,We]=a.useState(!1),[Re,Xe]=a.useState(""),[Pe,Ve]=a.useState(""),[N,ae]=a.useState([]),[C,L]=a.useState(null),[lt,an]=a.useState(it[re]),[ct,dt]=a.useState(!1),[$,Be]=a.useState("select"),[Kn,be]=a.useState(!1),[ut,on]=a.useState(!1),[W,X]=a.useState(!1),[rn,h]=a.useState(null),[U,R]=a.useState("saved"),[sr,D]=a.useState(null),[ft,ln]=a.useState(!1),[oe,Rt]=a.useState(null),[le,Pt]=a.useState(!1),[Wn,Bt]=a.useState(!1),[Tt,cn]=a.useState("json"),[mt,At]=a.useState(!1),[pt,Et]=a.useState(!1),[Xn,dn]=a.useState(!1),[Vn,ht]=a.useState(!1),[Mt,bt]=a.useState(""),[qe,un]=a.useState(!1),[ce,Je]=a.useState(!1),[Lt,Ze]=a.useState(!1),[P,Ft]=a.useState(1),[G,Qe]=a.useState(!1),[gt,fn]=a.useState(!1),[yt,et]=a.useState({width:0,height:0}),mn=a.useRef(null),Te=a.useRef(null),Ht=a.useRef(null),pn=a.useRef(null),ge=a.useRef(M),ye=a.useRef(""),xt=a.useRef(0),Ot=a.useRef(""),xe=a.useRef(0),vt=a.useRef(null),hn=a.useRef(0),de=a.useRef(!1),tt=a.useRef(null),Dt=a.useRef(null),ve=a.useRef(null),F=a.useRef(""),A=a.useRef(""),_t=a.useRef(null),V=a.useRef(null),Ae=a.useRef(!1),jt=a.useRef(null),nt=a.useRef(null),st=a.useRef(null),_e=a.useRef(null),Ee=a.useRef(null),Me=a.useRef(null),Le=a.useRef(null),ue=a.useRef(null),q=a.useRef(null),bn=a.useRef(null),gn=a.useRef(null),B=a.useMemo(()=>he.find(e=>e.id===x)||null,[x,he]),J=a.useMemo(()=>`workspaceId=${encodeURIComponent(String(g||"default").trim()||"default")}`,[g]),E=a.useMemo(()=>({"x-taskforce-workspace-id":String(g||"default").trim()||"default"}),[g]),z=a.useMemo(()=>N.find(e=>e.id===C)||null,[N,C]),Z=a.useMemo(()=>rt(y),[y]),je=typeof ie=="function",d=je?y:Ke,kt=a.useMemo(()=>{const e=String(d?.taskId||"").trim();if(!e)return"";const n=Ue?.(e).trim()||"";if(n)return n;const r=String(d?.taskReferenceLabel||"").trim();return r&&r!==e?r:n||e},[d?.taskId,d?.taskReferenceLabel,Ue]),at=a.useMemo(()=>{const e=String(d?.assetId||"").trim();if(!e)return"";const n=Ge?.(e).trim()||"";return n||String(d?.imageReferenceLabel||"").trim()},[d?.assetId,d?.imageReferenceLabel,Ge]),zt=a.useMemo(()=>N.findIndex(e=>e.id===C),[N,C]),Ut=z?.color||lt,yn=a.useMemo(()=>Nt({title:Re,globalInstruction:Pe,annotations:N}),[N,Pe,Re]),Fe=a.useMemo(()=>Hn(yn),[yn]),xn=Fe!==A.current,b=a.useMemo(()=>({width:Math.max(yt.width*P,0),height:Math.max(yt.height*P,0)}),[yt.height,yt.width,P]),He=a.useMemo(()=>({visibleRadius:7,hitRadius:11}),[]),Gt=a.useMemo(()=>`0 0 ${Math.max(b.width,1)} ${Math.max(b.height,1)}`,[b.height,b.width]),ke=a.useMemo(()=>{const e=Te.current;return e?P>1||b.width>e.clientWidth+1||b.height>e.clientHeight+1:P>1},[b.height,b.width,P]),Yt=`${Math.round(P*100)}%`,Kt=a.useMemo(()=>{const e=new Map;return N.forEach((n,r)=>{e.set(n.id,r+1)}),e},[N]);a.useEffect(()=>{ge.current=M},[M]),a.useEffect(()=>{const e=pn.current;if(!e||!C)return;e.focus();const n=e.value.length;e.setSelectionRange(n,n)},[C]),a.useEffect(()=>{ve.current=x},[x]),a.useEffect(()=>{We(!1)},[x]),a.useEffect(()=>{if(!z){dt(!1);return}an(z.color||it[z.markerType||re])},[z]);const wt=a.useCallback(async e=>{const n=typeof performance<"u"?performance.now():Date.now(),r=await Ce(`/api/taskforce/annotated-attachments/sessions?${J}`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify({taskId:e.taskId,baseImageAssetId:e.assetId,title:ze(e),globalInstruction:"",annotations:[]})},T),i=await r.json().catch(()=>({}));if(!r.ok)throw new Error(String(i?.error||"Failed to create session."));const c=i?.session;if(!c?.id)throw new Error("Failed to create session.");return Ct("annotated_session_create_completed",{assetId:e.assetId,taskId:e.taskId||null,sessionId:c.id,durationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-n),debugTimings:i?.debugTimings||null,serverTiming:typeof r.headers?.get=="function"&&r.headers.get("server-timing")||null}),c},[E,T,J]),vn=a.useCallback(e=>new Promise((n,r)=>{const i=new FileReader;i.onload=()=>n(typeof i.result=="string"?i.result:""),i.onerror=()=>r(i.error||new Error("Failed to read clipboard image.")),i.readAsDataURL(e)}),[]),I=a.useCallback(()=>{tt.current!==null&&(window.clearTimeout(tt.current),tt.current=null),st.current!==null&&(window.clearTimeout(st.current),st.current=null)},[]),Oe=a.useCallback(e=>{Xe(e.title),Ve(e.globalInstruction),ae(e.annotations),L(n=>n&&e.annotations.some(r=>r.id===n)?n:e.annotations[0]?.id||null)},[]),fe=a.useCallback((e,n)=>{const r=ze(n||d||{assetId:e.baseImageAssetId,displayName:"Annotated session"}),i=nr(e,r),c=Hn(i);de.current=!0,I(),Oe(i),A.current=c,F.current=c,_t.current=null,Ae.current=!1,jt.current=null,nt.current=null,D(null),R("saved"),X(!1)},[d,Oe,I]),Wt=a.useCallback(e=>{de.current=!0,I(),se([]),$e(null),be(!1),We(!1),Xe(ze(e)),Ve(""),ae([]),L(null),A.current="",F.current="",_t.current=null,Ae.current=!1,jt.current=null,nt.current=null,Rt(null),Bt(!1),D(null),R("saved"),X(!1)},[I]),we=a.useCallback(async(e,n,r)=>{const i=ve.current;if(!i)return!0;if(e===A.current)return V.current||(D(null),R("saved")),!0;if(V.current){if(Ae.current=!0,!r?.waitForInFlight||!await V.current)return!1;const f=F.current;return f===A.current?!0:we(f,n,r)}I();const c=On(e);jt.current=i,_t.current=e,X(!0),h(null),D(null),R("saving");const p=(async()=>{try{const u=await Ce(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(i)}?${J}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify(c)},T),f=await u.json().catch(()=>({}));if(!u.ok)throw new Error(String(f?.error||"Failed to save session."));const v=f?.session;if(!v?.id)throw new Error("Failed to save session.");se(Vt=>{const Rn=Vt.findIndex(ys=>ys.id===v.id);if(Rn===-1)return[v,...Vt];const Pn=[...Vt];return Pn[Rn]=v,Pn}),A.current=e,nt.current=null,D(null);const k=ve.current===v.id,S=F.current,K=S!==e,ot=Ae.current||K;return Ae.current=!1,k&&!ot?(de.current=!0,Oe(c),R("saved")):!ot&&S===A.current?R("saved"):R("pending"),!0}catch(u){const f=u instanceof Error?u.message:"Failed to save session.";return h(f),D(f),R("error"),nt.current!==e&&ve.current===i&&F.current===e&&(nt.current=e,st.current=window.setTimeout(()=>{st.current=null,!(ve.current!==i||F.current!==e)&&we(e,n,{waitForInFlight:!0})},1500)),!1}finally{_t.current=null,V.current=null,jt.current=null,X(!1)}})();V.current=p;const j=await p;if(j){const u=F.current;if(u!==A.current)return we(u,n,r)}return j},[Oe,I,E,T,J]),_n=a.useCallback(e=>{if(ve.current){if(F.current===A.current){D(null),V.current||R("saved");return}U!=="saving"&&R("pending"),I(),tt.current=window.setTimeout(()=>{tt.current=null,we(F.current,"structure")},e)}},[I,we,U]),Y=a.useCallback(e=>{Dt.current=e},[]),H=a.useCallback(async e=>{I();const n=F.current;return!ve.current||n===A.current?(D(null),V.current||R("saved"),!0):we(n,e,{waitForInFlight:!0})},[I,we]),qn=a.useCallback(()=>{const e=A.current;e&&(I(),de.current=!0,Oe(On(e)),D(null),R("saved"),h(null))},[Oe,I]),Q=a.useCallback(async(e,n)=>{const r=typeof performance<"u"?performance.now():Date.now(),i=JSON.stringify({targetKey:rt(e),requestedSessionId:n?.requestedSessionId??null,autoCreateIfEmpty:n?.autoCreateIfEmpty===!0});if(vt.current===i)return;const c=xe.current+1;xe.current=c,vt.current=i,on(!0),h(null);try{const p=new URLSearchParams;g&&p.set("workspaceId",g),e.taskId&&p.set("taskId",e.taskId),p.set("imageAssetId",e.assetId);const j=await Ce(`/api/taskforce/annotated-attachments/sessions?${p.toString()}`,{credentials:"include",headers:E,cache:"no-store"},T),u=await j.json().catch(()=>({}));if(!j.ok)throw new Error(String(u?.error||"Failed to load annotated attachment sessions."));const f=Array.isArray(u?.sessions)?u.sessions:[];if(Ct("annotated_sessions_loaded",{assetId:e.assetId,taskId:e.taskId||null,requestedSessionId:n?.requestedSessionId??null,autoCreateIfEmpty:n?.autoCreateIfEmpty===!0,sessionCount:f.length,durationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-r),serverTiming:typeof j.headers?.get=="function"&&j.headers.get("server-timing")||null}),f.length===0&&n?.autoCreateIfEmpty&&String(e.assetId||"").trim()){const S=n?.requestedSessionId??ge.current;if(ge.current=null,S&&h("The previously selected annotation session could not be restored."),xe.current!==c)return;const K=await wt(e);if(Ct("annotated_sessions_auto_created_after_empty_load",{assetId:e.assetId,taskId:e.taskId||null,sessionId:K.id,totalDurationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-r)}),xe.current!==c)return;se([K]),$e(K.id),be(!1),fe(K,e);return}if(xe.current!==c)return;se(f),be(f.length===0);const v=n?.requestedSessionId??ge.current;ge.current=null;const k=f.find(S=>S.id===v)||f[0]||null;v&&!k&&h("The previously selected annotation session could not be restored."),$e(k?.id||null),k?fe(k,e):(de.current=!0,I(),Xe(ze(e)),Ve(""),ae([]),L(null),A.current="",F.current="",D(null),R("saved"))}catch(p){if(xe.current!==c)return;h(p instanceof Error?p.message:"Failed to load sessions.")}finally{vt.current===i&&(vt.current=null),xe.current===c&&on(!1)}},[I,wt,E,T,fe,g]),Jn=a.useCallback(async()=>{if(typeof navigator>"u"||!navigator.clipboard||typeof navigator.clipboard.read!="function"){h("Clipboard image paste is not supported in this environment.");return}fn(!0),h(null),hn.current=Date.now()+2e3;try{const n=(await navigator.clipboard.read()).find(v=>v.types.some(k=>k.startsWith("image/"))),r=n?.types.find(v=>v.startsWith("image/"))||"";if(!n||!r)throw new Error("No image found on the clipboard.");const i=await n.getType(r),c=await vn(i);if(!c)throw new Error("Failed to read clipboard image.");const p=r==="image/jpeg"?"jpg":r==="image/webp"?"webp":r==="image/gif"?"gif":"png",j=await fetch("/api/taskforce/context-upload",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify({file:c,originalName:`pasted-image.${p}`,workspaceId:String(g||"default").trim()||"default"})}),u=await j.json().catch(()=>({}));if(!j.ok||!u?.success||typeof u?.assetId!="string"||typeof u?.path!="string")throw new Error(String(u?.error||"Failed to paste image into Image Notes."));const f={assetId:u.assetId,imageReferenceLabel:typeof u?.referenceLabel=="string"?u.referenceLabel:void 0,path:u.path,displayName:typeof u?.displayName=="string"&&u.displayName.trim().length>0?u.displayName.trim():"Pasted image"};ge.current=null,je?(ye.current="",ie?.(f,{sessionId:null})):(pe(f),ye.current=rt(f),Q(f,{autoCreateIfEmpty:!0}))}catch(e){h(e instanceof Error?e.message:"Failed to paste image.")}finally{fn(!1)}},[je,Q,ie,vn,E,g]),Zn=a.useCallback(async()=>{const e=Mt.trim();if(!e){h("Enter an image reference to open.");return}un(!0),h(null);try{const n=new URLSearchParams({workspaceId:String(g||"default").trim()||"default"}),r=await Ce(`/api/taskforce/annotated-attachments/images/${encodeURIComponent(e)}?${n.toString()}`,{method:"GET",credentials:"include",headers:E}),i=await r.json().catch(()=>({}));if(!r.ok||!i?.target||typeof i.target.assetId!="string"||typeof i.target.path!="string")throw new Error(String(i?.error||"Failed to open image reference."));const c={assetId:i.target.assetId,path:i.target.path,displayName:typeof i.target.displayName=="string"&&i.target.displayName.trim().length>0?i.target.displayName.trim():"Image attachment",taskId:typeof i.target.taskId=="string"&&i.target.taskId.trim().length>0?i.target.taskId.trim():void 0,taskReferenceLabel:typeof i.target.taskReferenceLabel=="string"&&i.target.taskReferenceLabel.trim().length>0?i.target.taskReferenceLabel.trim():void 0,imageReferenceLabel:typeof i.target.imageReferenceLabel=="string"&&i.target.imageReferenceLabel.trim().length>0?i.target.imageReferenceLabel.trim():void 0};ge.current=null,ht(!1),bt(""),je?(ye.current="",ie?.(c,{sessionId:null})):(pe(c),ye.current=rt(c),Q(c,{autoCreateIfEmpty:!0}))}catch(n){h(n instanceof Error?n.message:"Failed to open image reference.")}finally{un(!1)}},[je,Q,ie,Mt,E,g]),jn=a.useCallback(e=>{se(n=>{const r=n.findIndex(c=>c.id===e.id);if(r===-1)return[e,...n];const i=[...n];return i[r]=e,i}),$e(e.id),fe(e,d)},[d,fe]),kn=a.useCallback(e=>{se(n=>{const r=n.filter(c=>c.id!==e),i=r[0]||null;return $e(i?.id||null),i?fe(i,d):(de.current=!0,I(),Xe(ze(d||{displayName:"Annotated session"})),Ve(""),ae([]),L(null),A.current="",F.current="",D(null),R("saved")),r})},[d,I,fe]);a.useEffect(()=>{if(!y)return;if(je||pe(n=>n&&rt(n)===Z&&n.taskReferenceLabel===y.taskReferenceLabel&&n.imageReferenceLabel===y.imageReferenceLabel&&n.displayName===y.displayName?n:y),!w){Z&&(Z!==ye.current||ne!==xt.current)&&Z!==Ot.current&&(Wt(y),Ot.current=Z,xt.current=ne,Ct("annotated_sessions_load_deferred",{assetId:y.assetId,taskId:y.taskId||null,requestedTargetKey:Z})),me?.();return}Z&&(Z!==ye.current||ne!==xt.current)&&(Wt(y),ye.current=Z,xt.current=ne,Ot.current="",Q(y,{autoCreateIfEmpty:!0})),me?.()},[je,Q,me,ne,y,Z,Wt,M,w]),a.useEffect(()=>{d&&Ye?.({target:d,sessionId:x})},[d,Ye,x]),a.useEffect(()=>{if(!d||typeof document>"u"||!w)return;const e=()=>{Date.now()<hn.current||F.current!==A.current||W||ut||Q(d,{requestedSessionId:x})},n=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",n),()=>{document.removeEventListener("visibilitychange",n)}},[d,Q,ut,W,x,w]),a.useEffect(()=>{if(!d?.path){Je(!1),Ze(!1),et({width:0,height:0});return}Je(!0),Ze(!1),et({width:0,height:0}),Ft(1),Qe(!1)},[d?.path]),a.useEffect(()=>{if(!ce)return;const e=Ht.current;!e||!e.complete||e.naturalWidth<=0||e.naturalHeight<=0||(et({width:e.naturalWidth,height:e.naturalHeight}),Je(!1),Ze(!1))},[d?.path,ce]),a.useEffect(()=>{ke||Qe(!1)},[ke]),a.useEffect(()=>{Rt(null)},[x]),a.useEffect(()=>{if(F.current=Fe,de.current){de.current=!1;return}if(!x){I(),D(null),R("saved");return}if(Fe===A.current){I(),V.current||(D(null),R("saved"));return}const e=Dt.current;if(Dt.current=null,U==="error"&&e===null)return;const n=e??600;if(V.current){Ae.current=!0,R("pending");return}_n(n)},[I,Fe,U,_n,x]),a.useEffect(()=>{x&&(V.current||Fe===A.current&&U!=="error"&&U!=="saved"&&(D(null),R("saved")))},[Fe,U,x]),a.useEffect(()=>{if(typeof window>"u")return;const e=n=>{F.current!==A.current&&(n.preventDefault(),n.returnValue="")};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[]),a.useEffect(()=>{if(typeof document>"u")return;const e=()=>{document.visibilityState==="hidden"&&H("visibility-hidden")};return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)},[H]),a.useEffect(()=>{if(!ct||typeof document>"u")return;const e=n=>{const r=n.target;r instanceof Node&&(bn.current?.contains(r)||dt(!1))};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[ct]),a.useEffect(()=>{if(!$t||typeof document>"u")return;const e=n=>{const r=n.target;r instanceof Node&&(gn.current?.contains(r)||We(!1))};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[$t]),a.useEffect(()=>()=>{I()},[I]),a.useEffect(()=>{if(!le)return;const e=window.setTimeout(()=>Pt(!1),2e3);return()=>window.clearTimeout(e)},[le]),a.useEffect(()=>{if(!mt)return;const e=window.setTimeout(()=>At(!1),2e3);return()=>window.clearTimeout(e)},[mt]),a.useEffect(()=>{if(!pt)return;const e=window.setTimeout(()=>Et(!1),2e3);return()=>window.clearTimeout(e)},[pt]);const ee=a.useCallback((e,n,r=300)=>{ae(i=>Ie(i.map(c=>c.id===e?n(c):c))),Y(r)},[Y]),Qn=a.useCallback(e=>{z&&(ee(z.id,n=>({...n,color:e})),an(e),dt(!1))},[z,ee]),wn=a.useCallback(async()=>{if(!(!d||!await H("session-switch"))){X(!0),h(null);try{const n=await wt(d);be(!1),await Q(d,{requestedSessionId:n.id,autoCreateIfEmpty:!1}),Be("select")}catch(n){h(n instanceof Error?n.message:"Failed to create session."),be(!0)}finally{X(!1)}}},[d,wt,H,Q]),es=a.useCallback(e=>{if(e!=="select"&&!B){Qe(!1),h("No session exists for this image yet."),be(!0);return}h(null),be(!1),Qe(!1),Be(e)},[B]),ts=a.useCallback(async()=>{if(!(!d||!B||!await H("duplicate"))){X(!0),h(null);try{const n=Ie(N.map((p,j)=>Xo(p,j))),r=await Ce(`/api/taskforce/annotated-attachments/sessions?${J}`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify({taskId:d.taskId,baseImageAssetId:d.assetId,title:Vo(Re||B.title,d),globalInstruction:Pe,annotations:n})},T),i=await r.json().catch(()=>({}));if(!r.ok)throw new Error(String(i?.error||"Failed to duplicate session."));const c=i?.session;if(!c?.id)throw new Error("Failed to duplicate session.");jn(c),Be("select")}catch(n){h(n instanceof Error?n.message:"Failed to duplicate session.")}finally{X(!1)}}},[d,N,Pe,Re,jn,H,E,T,B,J]),ns=a.useCallback(async()=>H("manual"),[H]),Cn=a.useCallback(async()=>{if(x){ln(!0),h(null);try{const e=await Ce(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(x)}/payload?${J}`,{credentials:"include",headers:E},T),n=await e.json().catch(()=>({}));if(!e.ok)throw new Error(String(n?.error||"Failed to load payload preview."));Rt(n?.payload||null)}catch(e){h(e instanceof Error?e.message:"Failed to load payload preview.")}finally{ln(!1)}}},[E,T,x,J]),ss=a.useCallback(()=>{x&&H("payload-preview").then(e=>{e&&(Bt(!0),Cn())})},[H,Cn,x]),In=a.useCallback(async e=>{if(!oe||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){h("Clipboard copy is not available in this browser.");return}try{const n=e==="json"?JSON.stringify(oe,null,2):Fn(oe);await navigator.clipboard.writeText(n),Pt(e)}catch(n){h(n instanceof Error?n.message:"Failed to copy payload content."),Pt(!1)}},[oe]),as=a.useCallback(async()=>{if(!kt||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){h("Clipboard copy is not available in this browser.");return}try{await navigator.clipboard.writeText(kt),At(!0)}catch(e){h(e instanceof Error?e.message:"Failed to copy task id."),At(!1)}},[kt]),os=a.useCallback(async()=>{if(!at||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){h("Clipboard copy is not available in this browser.");return}try{await navigator.clipboard.writeText(at),Et(!0)}catch(e){h(e instanceof Error?e.message:"Failed to copy image reference."),Et(!1)}},[at]),rs=a.useCallback(async()=>{if(!x||!await H("delete-session"))return;const n=(B?.title||"Untitled session").trim()||"Untitled session";if(window.confirm(`Delete the annotated attachment session "${n}"?`)){X(!0),h(null);try{const r=await Ce(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(x)}?${J}`,{method:"DELETE",credentials:"include",headers:E},T),i=await r.json().catch(()=>({}));if(!r.ok)throw new Error(String(i?.error||"Failed to delete session."));kn(x),Be("select")}catch(r){h(r instanceof Error?r.message:"Failed to delete session.")}finally{X(!1)}}},[H,kn,E,T,B,x,J]),Xt=a.useCallback(()=>{C&&(ae(e=>Ie(e.filter(n=>n.id!==C))),L(null),Y(300))},[Y,C]),De=a.useCallback(e=>{const n=tr(e),r=Te.current;if(!r||n===P){Ft(n);return}const i=(r.scrollLeft+r.clientWidth/2)*(n/P)-r.clientWidth/2,c=(r.scrollTop+r.clientHeight/2)*(n/P)-r.clientHeight/2;Ft(n),window.requestAnimationFrame(()=>{r.scrollLeft=Math.max(0,i),r.scrollTop=Math.max(0,c)})},[P]),is=a.useCallback(()=>{De(P+.25)},[De,P]),ls=a.useCallback(()=>{De(P-.25)},[De,P]),cs=a.useCallback(()=>{De(1);const e=Te.current;e&&window.requestAnimationFrame(()=>{e.scrollLeft=0,e.scrollTop=0})},[De]),Sn=a.useCallback(e=>{C&&ae(n=>{const r=n.findIndex(c=>c.id===C);if(r===-1)return n;const i=e==="up"?r-1:r+1;return i<0||i>=n.length?n:(Y(300),qo(n,r,i))})},[Y,C]);a.useEffect(()=>{if(!C)return;const e=n=>{n.key==="Delete"&&(Go(n.target)||(n.preventDefault(),Xt()))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[Xt,C]);const O=a.useCallback(e=>{const n=mn.current?.getBoundingClientRect();return!n||n.width<=0||n.height<=0?null:{x:_((e.clientX-n.left)/n.width),y:_((e.clientY-n.top)/n.height)}},[]),ds=a.useCallback(e=>{if(G&&ke){const i=Te.current;if(!i)return;q.current={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,scrollLeft:i.scrollLeft,scrollTop:i.scrollTop},e.currentTarget.setPointerCapture(e.pointerId),e.preventDefault();return}if(!x)return;if($==="select"){L(null);return}const n=O(e);if(!n)return;if($==="pin"||$==="text-note"){const i=Ln($,n,n,lt);ae(c=>Ie([...c,i])),L(i.id),Y(300),Be("select");return}_e.current=n;const r=Ln($,n,n,lt);ue.current={annotationId:r.id,kind:$},e.currentTarget.setPointerCapture?.(e.pointerId),ae(i=>Ie([...i,r])),L(r.id),Y(300)},[ke,lt,Y,G,O,x,$]),us=a.useCallback(e=>{if(q.current?.pointerId===e.pointerId){e.currentTarget.releasePointerCapture?.(e.pointerId);return}if(!_e.current||!ue.current||$!=="box"&&$!=="arrow")return;const n=O(e);_e.current=null,ue.current=null,e.currentTarget.releasePointerCapture?.(e.pointerId),n&&Be("select")},[O,$]),Nn=a.useCallback((e,n)=>{if($!=="select"||G)return;const r=O(e);r&&(Ee.current={annotationId:n.id,originPointer:r,originAnnotation:n},L(n.id),e.stopPropagation())},[G,O,$]),fs=a.useCallback(e=>{if(q.current?.pointerId===e.pointerId){const u=Te.current;if(!u)return;const f=e.clientX-q.current.startX,v=e.clientY-q.current.startY;u.scrollLeft=q.current.scrollLeft-f,u.scrollTop=q.current.scrollTop-v;return}if(ue.current&&_e.current){const u=O(e);if(!u)return;const{annotationId:f,kind:v}=ue.current,k=_e.current;ee(f,S=>v==="box"&&S.kind==="box"?{...S,x:_(Math.min(k.x,u.x)),y:_(Math.min(k.y,u.y)),width:Se(Math.abs(u.x-k.x)),height:Se(Math.abs(u.y-k.y))}:v==="arrow"&&S.kind==="arrow"?{...S,x:k.x,y:k.y,x2:u.x,y2:u.y}:S);return}if(Me.current){const u=O(e);if(!u)return;const{annotationId:f,originPointer:v,originAnnotation:k}=Me.current,S=u.x-v.x,K=u.y-v.y;ee(f,()=>({...k,width:Se(k.width+S),height:Se(k.height+K)}));return}if(Le.current){const u=O(e);if(!u)return;const{annotationId:f,endpoint:v,originPointer:k,originAnnotation:S}=Le.current,K=u.x-k.x,ot=u.y-k.y;ee(f,()=>v==="tail"?{...S,x:_(S.x+K),y:_(S.y+ot)}:{...S,x2:_(S.x2+K),y2:_(S.y2+ot)});return}if(!Ee.current)return;const n=O(e);if(!n)return;const{annotationId:r,originPointer:i,originAnnotation:c}=Ee.current,p=n.x-i.x,j=n.y-i.y;ee(r,()=>c.kind==="pin"||c.kind==="text-note"?{...c,x:_(c.x+p),y:_(c.y+j)}:c.kind==="box"?{...c,x:_(c.x+p),y:_(c.y+j)}:{...c,x:_(c.x+p),y:_(c.y+j),x2:_(c.x2+p),y2:_(c.y2+j)})},[O,ee]),ms=a.useCallback(()=>{_e.current=null,Ee.current=null,Me.current=null,Le.current=null,ue.current=null,q.current=null},[]),ps=a.useCallback(()=>{_e.current=null,Ee.current=null,Me.current=null,Le.current=null,ue.current=null,q.current=null},[]),hs=a.useCallback(()=>{Ee.current=null,Me.current=null,Le.current=null,ue.current=null,q.current=null},[]),bs=a.useCallback((e,n)=>{if($!=="select"||G)return;const r=O(e);r&&(Me.current={annotationId:n.id,originPointer:r,originAnnotation:n},L(n.id),e.stopPropagation())},[G,O,$]),$n=a.useCallback((e,n,r)=>{if($!=="select"||G)return;const i=O(e);i&&(Le.current={annotationId:n.id,originPointer:i,originAnnotation:n,endpoint:r},L(n.id),e.stopPropagation())},[G,O,$]),gs=B?.updatedAt?Qt(B.updatedAt):"Not saved yet";return t.jsxs("div",{className:s.shell,children:[t.jsxs("section",{className:`tf-surface-panel ${s.panel} ${s.sessionPanel}`,children:[t.jsx("div",{className:s.sessionContextBar,children:d?.taskId?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:s.sessionContextLeft,children:Ne?t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.backToTaskBtn}`,onClick:()=>{H("back-to-task").then(e=>{e&&d.taskId&&Ne(d.taskId)})},"aria-label":"Back to task",title:"Back to task",children:t.jsx(_s,{size:16})}):t.jsx("div",{className:s.sessionContextSpacer,"aria-hidden":"true"})}),t.jsx("div",{className:s.sessionContextRight,children:t.jsx(vs,{copied:mt,onClick:()=>{as()},title:"Copy task id",ariaLabel:mt?"Copied task id":"Copy task id",label:kt})})]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:s.sessionContextLeft,children:t.jsx("span",{className:`tf-label-micro ${s.sessionContextLabel}`,children:"Unattached Image"})}),t.jsx("div",{className:s.sessionContextRight,children:t.jsx("div",{className:s.sessionContextSpacer,"aria-hidden":"true"})})]})}),t.jsxs("div",{className:s.panelHeader,children:[t.jsxs("div",{className:s.panelHeaderText,children:[t.jsx("div",{className:`tf-heading-card ${s.panelTitle}`,children:"Sessions"}),d?null:t.jsx("div",{className:"tf-text-secondary",children:"Open an image attachment to begin"})]}),t.jsx("div",{className:s.sessionActions,children:t.jsx("button",{type:"button",className:`tf-control-icon ${s.iconButton}`,onClick:()=>{wn()},disabled:!d||W,"aria-label":"Create session",title:"Create session",children:t.jsx(js,{size:16})})})]}),d?ut?t.jsx("div",{className:s.emptyState,children:t.jsx("p",{className:"tf-empty-copy",children:"Loading sessions…"})}):t.jsx("div",{className:`tf-scrollbar ${s.sessionList}`,children:he.length===0?t.jsxs("div",{className:s.sessionEmptyState,children:[t.jsx("div",{className:`tf-heading-card ${s.sessionTitle}`,children:"No sessions yet"}),t.jsx("div",{className:`tf-text-secondary ${s.annotationSummary}`,children:"Create the first annotation session for this image."})]}):he.map(e=>{const n=x===e.id,r=n&&$t,i=Yo(n?Pe:e.globalInstruction),c=(n?Re:e.title)||"Untitled session";return t.jsxs("div",{className:`tf-surface-elevated ${s.sessionCard} ${n?s.sessionCardActive:""}`,ref:n?gn:void 0,onBlur:r?p=>{const j=p.relatedTarget;j instanceof Node&&p.currentTarget.contains(j)||We(!1)}:void 0,children:[r?t.jsxs("div",{className:s.sessionCardBody,children:[t.jsxs("div",{className:s.sessionMeta,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-session-title",children:"Session title"}),t.jsx("input",{id:"annotated-session-title",className:`tf-field-shell ${s.textInput} ${s.sessionTitleInput}`,value:Re,onChange:p=>{Xe(p.target.value),Y(600)},placeholder:"Session title"}),t.jsx("span",{className:`tf-text-meta ${s.sessionTimestamp}`,children:Qt(e.updatedAt)})]}),St(e)?t.jsxs("div",{className:`tf-text-secondary ${s.sessionCreator}`,children:["Created by ",St(e)]}):null,t.jsxs("div",{className:s.sessionInstructionEditor,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-session-instruction",children:"Session instruction"}),t.jsx("textarea",{id:"annotated-session-instruction",className:`tf-field-shell ${s.textArea} ${s.sessionInstructionField}`,value:Pe,onChange:p=>{Ve(p.target.value),Y(600)},placeholder:"Add overall instructions, context, or framing for this session."})]}),t.jsxs("div",{className:`tf-text-secondary ${s.annotationSummary}`,children:[e.annotations.length," annotation",e.annotations.length===1?"":"s"]})]}):t.jsxs("button",{type:"button",className:s.sessionCardButton,onClick:()=>{if(n){We(!0);return}H("session-switch").then(p=>{p&&($e(e.id),fe(e,d))})},"aria-pressed":n,children:[t.jsxs("div",{className:s.sessionMeta,children:[t.jsx("span",{className:`tf-heading-card ${s.sessionTitle}`,children:c}),t.jsx("span",{className:`tf-text-meta ${s.sessionTimestamp}`,children:Qt(e.updatedAt)})]}),St(e)?t.jsxs("div",{className:`tf-text-secondary ${s.sessionCreator}`,children:["Created by ",St(e)]}):null,i?t.jsx("div",{className:`tf-text-secondary ${s.sessionInstructionPreview}`,children:i}):null,t.jsxs("div",{className:`tf-text-secondary ${s.annotationSummary}`,children:[e.annotations.length," annotation",e.annotations.length===1?"":"s"]})]}),n?t.jsx("div",{className:s.sessionCardFooter,children:t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:()=>{ts()},disabled:W,"aria-label":"Duplicate session",title:`Duplicate session "${c}"`,children:t.jsx(Zt,{size:16})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:()=>{rs()},disabled:W,"aria-label":"Delete session",title:`Delete session "${c}"`,children:t.jsx(Tn,{size:16})})]})}):null]},e.id)})}):t.jsxs("div",{className:s.emptyState,children:[t.jsx("strong",{className:"tf-empty-title",children:"No image selected"}),t.jsx("p",{className:"tf-empty-copy",children:"Open an image attachment from a task to start an annotated session."})]})]}),t.jsxs("section",{className:`tf-surface-panel ${s.panel} ${s.canvasPanel}`,children:[t.jsxs("div",{className:s.panelHeader,children:[t.jsxs("div",{className:s.canvasHeading,children:[t.jsx("div",{className:"tf-heading-card",children:d?.displayName||"Annotated attachment"}),t.jsx("div",{className:"tf-text-secondary",children:B?`${N.length} markers · ${gs}`:"Pick or create a session"})]}),at?t.jsx(Ts,{copied:pt,onClick:()=>{os()},title:"Copy image reference",ariaLabel:pt?"Copied image reference":"Copy image reference",label:at}):null]}),t.jsxs("div",{className:s.toolRail,children:[t.jsxs("div",{className:`${s.toolbarCluster} ${s.toolbarViewportCluster}`,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{ns()},disabled:!B||W||!xn&&U!=="error","aria-label":W?"Saving session":"Save session",title:W?"Saving session":"Save session",children:t.jsx(ks,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>ht(!0),disabled:qe,"aria-label":"Open image",title:"Open image",children:t.jsx(ws,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{Jn()},disabled:gt,"aria-label":gt?"Pasting image":"Paste image",title:gt?"Pasting image":"Paste image",children:gt?t.jsx(An,{size:18,className:Bn.spin}):t.jsx(Cs,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{B&&qn()},disabled:!B||!xn,"aria-label":"Reset unsaved changes",title:"Reset unsaved changes",children:t.jsx(Is,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:ls,disabled:!d||ce||P<=.25,"aria-label":"Zoom out",children:t.jsx(Ss,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:cs,disabled:!d||ce||P===1,"aria-label":`Reset zoom to 100 percent (currently ${Yt})`,title:`Reset zoom to 100% (currently ${Yt})`,children:t.jsx("span",{children:Yt})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:is,disabled:!d||ce||P>=4,"aria-label":"Zoom in",children:t.jsx(Ns,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.toolBtn} ${s.toolbarButton} ${G?s.toolBtnActive:""}`,onClick:()=>Qe(e=>!e),disabled:!d||ce||!ke,"aria-label":"Pan canvas",title:"Pan canvas",children:t.jsx($s,{size:18})})]}),t.jsx("span",{className:s.toolbarSeparator,"aria-hidden":"true"}),t.jsxs("div",{className:s.toolbarActions,children:[t.jsx("div",{className:s.toolbarSelectionActions,children:z?t.jsxs(t.Fragment,{children:[t.jsxs("div",{ref:bn,className:s.toolbarColorPicker,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton} ${s.colorPickerButton}`,onClick:()=>dt(e=>!e),"aria-label":"Marker color","aria-expanded":ct,title:"Marker color",children:t.jsx("span",{className:s.colorPickerSwatch,style:{backgroundColor:Ut},"aria-hidden":"true"})}),ct?t.jsx("div",{className:s.colorPickerPopover,role:"menu","aria-label":"Marker color options",children:Uo.map(e=>t.jsx("button",{type:"button",className:`${s.colorOption} ${Ut===e?s.colorOptionActive:""}`,style:{backgroundColor:e},onClick:()=>Qn(e),"aria-label":`Use marker color ${e}`,"aria-pressed":Ut===e},e))}):null]}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:Xt,"aria-label":"Delete marker",title:"Delete selected marker",children:t.jsx(Tn,{size:18})}),t.jsx("div",{className:s.toolbarGeometryFields,"aria-label":"Marker geometry percent controls",children:Qo(z).map(e=>t.jsxs("label",{className:s.toolbarGeometryField,children:[t.jsx("span",{className:`tf-text-meta ${s.toolbarGeometryLabel}`,children:e.label}),t.jsx("input",{className:`tf-field-shell ${s.toolbarGeometryInput}`,type:"number",min:0,max:100,step:.1,value:e.value,onChange:n=>{const r=Jo(n.target.value);r!==null&&ee(z.id,i=>Zo(i,e.key,r))},"aria-label":`${e.label} percent`})]},e.key))})]}):null}),t.jsxs("div",{className:s.toolbarUtilities,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.payloadBtn} ${s.toolbarButton}`,onClick:ss,disabled:!B||ft,"aria-label":ft?"Loading payload preview":"Preview payload",title:ft?"Loading payload preview":"Preview payload",children:t.jsx(tn,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>dn(!0),"aria-label":"How to use marker tools",title:"How to use marker tools",children:t.jsx(nn,{size:18})})]})]})]}),t.jsxs("div",{className:s.canvasWorkspace,children:[t.jsx("div",{className:s.canvasToolRail,"aria-label":"Annotation tools",children:Mn.map(e=>{const n=e.icon;return t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${$===e.value?s.toolBtnActive:""}`,onClick:()=>es(e.value),disabled:!d,title:e.label,"aria-label":`${e.label} tool. ${It[e.value].short}`,children:t.jsx(n,{size:18})},e.value)})}),t.jsx("div",{className:s.canvasMain,children:t.jsx("div",{ref:Te,className:`tf-scrollbar ${s.canvasScroller}`,children:d?t.jsxs(t.Fragment,{children:[ce&&!Lt?t.jsx("div",{className:s.canvasStatusOverlay,"aria-live":"polite",children:t.jsxs("div",{className:s.canvasStatusCard,children:[t.jsx(An,{size:20,className:Bn.spinner}),t.jsx("span",{children:"Loading image…"})]})}):null,Lt?t.jsx("div",{className:s.canvasStatusOverlay,"aria-live":"polite",children:t.jsx("div",{className:s.canvasStatusCard,children:t.jsx("span",{children:"Image failed to load."})})}):null,t.jsx("div",{className:s.canvasFrame,children:t.jsxs("div",{className:s.canvasMedia,style:{width:b.width?`${b.width}px`:void 0,height:b.height?`${b.height}px`:void 0},children:[t.jsx("img",{ref:Ht,src:d.path,alt:d.displayName,className:s.canvasImage,onLoad:()=>{const e=Ht.current;et({width:e?.naturalWidth||0,height:e?.naturalHeight||0}),Je(!1),Ze(!1)},onError:()=>{et({width:0,height:0}),Je(!1),Ze(!0)}}),!ce&&!Lt&&B?t.jsxs("div",{ref:mn,className:`${s.overlay} ${$==="select"?s.overlaySelect:""} ${G&&ke?s.overlayPan:""}`,onPointerDown:ds,onPointerMove:fs,onPointerUp:e=>{us(e),hs()},"data-testid":"annotated-attachment-overlay",onPointerLeave:ms,onPointerCancel:ps,children:[t.jsx("svg",{className:s.overlaySvg,viewBox:Gt,preserveAspectRatio:"none","aria-hidden":"true",children:N.filter(e=>e.kind==="arrow").map(e=>{const n=Ko(e,b),r=en(e),i=C===e.id;return t.jsxs(qt.Fragment,{children:[i?t.jsxs(t.Fragment,{children:[t.jsx("line",{x1:n.shaftX1,y1:n.shaftY1,x2:n.shaftX2,y2:n.shaftY2,stroke:"color-mix(in srgb, var(--surface-elevated) 92%, transparent)",strokeWidth:14,strokeLinecap:"round"}),t.jsx("polygon",{points:n.headPoints,fill:r,stroke:"color-mix(in srgb, var(--surface-elevated) 92%, transparent)",strokeWidth:4,strokeLinejoin:"round"})]}):null,t.jsx("line",{x1:n.shaftX1,y1:n.shaftY1,x2:n.shaftX2,y2:n.shaftY2,stroke:r,strokeWidth:i?10:6,strokeLinecap:"round"}),t.jsx("polygon",{points:n.headPoints,fill:r})]},e.id)})}),t.jsx("svg",{className:s.overlayHitLayer,viewBox:Gt,preserveAspectRatio:"none",children:N.filter(e=>e.kind==="arrow").map(e=>t.jsxs(qt.Fragment,{children:[t.jsx("line",{x1:e.x*b.width,y1:e.y*b.height,x2:e.x2*b.width,y2:e.y2*b.height,className:s.arrowHitArea,"data-testid":`annotated-arrow-hit-${e.id}`,"aria-label":`Arrow marker ${Kt.get(e.id)||0}`,onPointerDown:n=>Nn(n,e),onClick:n=>{n.stopPropagation(),L(e.id)}}),C===e.id?t.jsxs(t.Fragment,{children:[t.jsx("circle",{cx:e.x*b.width,cy:e.y*b.height,r:He.hitRadius,className:s.canvasHandleHit,role:"button",tabIndex:0,"aria-label":"Move arrow tail",onPointerDown:n=>$n(n,e,"tail")}),t.jsx("circle",{cx:e.x*b.width,cy:e.y*b.height,r:He.visibleRadius,className:s.canvasHandleVisible,"aria-hidden":"true"}),t.jsx("circle",{cx:e.x2*b.width,cy:e.y2*b.height,r:He.hitRadius,className:s.canvasHandleHit,role:"button",tabIndex:0,"aria-label":"Move arrow tip",onPointerDown:n=>$n(n,e,"tip")}),t.jsx("circle",{cx:e.x2*b.width,cy:e.y2*b.height,r:He.visibleRadius,className:s.canvasHandleVisible,"aria-hidden":"true"})]}):null]},`hit-${e.id}`))}),N.filter(e=>e.kind==="arrow").map(e=>t.jsx("div",{className:`${s.annotationNumberBadge} ${s.arrowNumberBadge}`,style:{left:`${(e.x+e.x2)/2*100}%`,top:`${(e.y+e.y2)/2*100}%`,backgroundColor:en(e)},"aria-hidden":"true",children:Kt.get(e.id)||0},`arrow-number-${e.id}`)),N.filter(e=>e.kind!=="arrow").map(e=>{const n=en(e),r=Kt.get(e.id)||0,i={onPointerDown:c=>Nn(c,e),onClick:c=>{c.stopPropagation(),L(e.id)}};return e.kind==="pin"?t.jsx("button",{type:"button",...i,className:`${s.pin} ${C===e.id?s.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,backgroundColor:n},children:r},e.id):e.kind==="text-note"?t.jsx("button",{type:"button",...i,className:`${s.note} ${C===e.id?s.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,backgroundColor:n},children:r},e.id):t.jsxs("div",{className:`${s.box} ${C===e.id?s.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,width:`${e.width*100}%`,height:`${e.height*100}%`,borderColor:n},children:[t.jsx("span",{className:`${s.annotationNumberBadge} ${s.boxNumberBadge}`,style:{backgroundColor:n},"aria-hidden":"true",children:r}),t.jsx("button",{type:"button",...i,className:s.boxSurface,"aria-label":`Box marker ${r}`})]},e.id)}),t.jsx("svg",{className:s.overlaySvg,viewBox:Gt,preserveAspectRatio:"none",children:N.filter(e=>e.kind==="box"&&C===e.id).map(e=>t.jsxs(qt.Fragment,{children:[t.jsx("circle",{cx:(e.x+e.width)*b.width,cy:(e.y+e.height)*b.height,r:He.hitRadius,className:`${s.canvasHandleHit} ${s.canvasResizeHandleHit}`,role:"button",tabIndex:0,"aria-label":"Resize box marker",onPointerDown:n=>bs(n,e)}),t.jsx("circle",{cx:(e.x+e.width)*b.width,cy:(e.y+e.height)*b.height,r:He.visibleRadius,className:s.canvasHandleVisible,"aria-hidden":"true"})]},`box-handle-${e.id}`))})]}):null]})})]}):t.jsx("div",{className:s.emptyState,children:t.jsx("p",{className:"tf-empty-copy",children:"Select an image attachment to annotate."})})})})]}),t.jsxs("div",{className:s.statusBar,children:[t.jsx("span",{children:U==="error"?"Save failed. Retry now.":U==="saving"||U==="pending"?"Saving…":"Saved"}),rn?t.jsx("span",{children:rn}):t.jsx("span",{children:B?G&&ke?"Drag on the image to pan.":$==="select"?"Select a marker to edit it.":`Click on the image to place a ${$}.`:"Create a session to begin placing markers on this image."}),d&&!B&&Kn?t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{wn()},disabled:W||ut,children:W?"Creating…":"Create one now"}):null]})]}),t.jsx("section",{className:`tf-surface-panel ${s.panel} ${s.detailPanel}`,children:B?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:s.panelHeader,children:[t.jsxs("div",{className:s.panelHeaderText,children:[t.jsx("div",{className:`tf-heading-card ${s.panelTitle}`,children:"Markers"}),t.jsxs("div",{className:"tf-text-secondary",children:[N.length," in this session"]})]}),t.jsxs("div",{className:s.sessionActions,children:[t.jsx("button",{type:"button",className:`tf-control-icon ${s.iconButton}`,onClick:()=>Sn("up"),disabled:!z||zt<=0,"aria-label":"Move marker up",children:t.jsx(Ps,{size:16})}),t.jsx("button",{type:"button",className:`tf-control-icon ${s.iconButton}`,onClick:()=>Sn("down"),disabled:!z||zt===-1||zt>=N.length-1,"aria-label":"Move marker down",children:t.jsx(Bs,{size:16})})]})]}),t.jsx("div",{className:`tf-scrollbar ${s.annotationList}`,children:N.length===0?t.jsx("div",{className:s.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Add a marker on the image to begin."})}):N.map((e,n)=>{const r=Oo[e.kind],i=Do[e.kind],c=`${i} ${n+1}`,p=zo[e.markerType||re],j=En.find(f=>f.value===(e.markerType||re))?.label||"Review",u=C===e.id;return t.jsxs("div",{className:`tf-surface-elevated ${s.annotationCard} ${u?s.annotationCardActive:""}`,children:[t.jsx("button",{type:"button",className:s.annotationCardButton,onClick:()=>L(e.id),"aria-label":i,children:t.jsxs("div",{className:s.annotationMeta,children:[t.jsx("span",{className:`tf-heading-card ${s.annotationTitle}`,children:c}),t.jsx("span",{className:`tf-text-meta ${s.annotationKind}`,"aria-hidden":"true",children:t.jsx(r,{size:16})})]})}),u?t.jsxs("div",{className:s.annotationInstructionEditor,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-marker-instruction",children:"Marker instruction"}),t.jsx("textarea",{id:"annotated-marker-instruction",ref:u?pn:null,className:`tf-field-shell ${s.textArea} ${s.annotationInstructionField}`,value:e.instruction,onChange:f=>{ee(e.id,v=>({...v,instruction:f.target.value}),600)},onBlur:()=>{H("text")},placeholder:"What should the AI focus on for this marker?"}),t.jsxs("div",{className:s.annotationTypeField,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-marker-type",children:"Instruction type"}),t.jsx("select",{id:"annotated-marker-type",className:`tf-field-shell ${s.select}`,value:e.markerType||re,onChange:f=>{ee(e.id,v=>Wo(v,f.target.value))},children:En.map(f=>t.jsx("option",{value:f.value,children:f.label},f.value))})]})]}):t.jsx("button",{type:"button",className:s.annotationInstructionButton,onClick:()=>L(e.id),"aria-label":`Edit ${i} instruction`,children:t.jsxs("div",{className:s.annotationInstructionEditor,children:[t.jsx("div",{className:`tf-text-secondary ${s.annotationInstructionPreview}`,children:e.instruction.trim()||"No marker instruction yet."}),t.jsx("div",{className:s.annotationPreviewFooter,children:t.jsx("span",{className:`tf-text-meta ${s.annotationInstructionTypeIcon}`,"aria-label":`Instruction type: ${j}`,title:j,children:t.jsx(p,{size:16})})})]})})]},e.id)})})]}):t.jsxs("div",{className:s.emptyState,children:[t.jsx("strong",{className:"tf-empty-title",children:"No active session"}),t.jsx("p",{className:"tf-empty-copy",children:"Create or select a session to edit annotations."})]})}),t.jsx(Jt,{isOpen:Vn,onClose:()=>{qe||(ht(!1),bt(""))},title:"Open Image",size:"sm",children:t.jsxs("form",{className:s.openImageModalBody,onSubmit:e=>{e.preventDefault(),Zn()},children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-open-image-reference",children:"Image reference number"}),t.jsx("input",{id:"annotated-open-image-reference",className:`tf-field-shell ${s.textInput} ${s.openImageField}`,value:Mt,onChange:e=>bt(e.target.value),placeholder:"I-24",autoFocus:!0}),t.jsxs("div",{className:s.openImageActions,children:[t.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",onClick:()=>{ht(!1),bt("")},disabled:qe,children:"Cancel"}),t.jsx("button",{type:"submit",className:"tf-button-primary tf-button-compact",disabled:qe,children:qe?"Opening…":"Open"})]})]})}),t.jsx(Jt,{isOpen:Xn,onClose:()=>dn(!1),title:"How To Use Markers",size:"md",children:t.jsx("div",{className:s.markerHelpModalBody,children:Mn.filter(e=>e.value!=="select").map(e=>t.jsxs("div",{className:`tf-surface-inset ${s.markerHelpItem}`,children:[t.jsxs("div",{className:s.markerHelpHeader,children:[t.jsx("strong",{className:"tf-heading-card",children:e.label}),t.jsx("span",{className:"tf-text-meta",children:It[e.value].short})]}),t.jsx("p",{className:"tf-text-secondary",children:It[e.value].detail}),t.jsx("p",{className:`tf-text-body ${s.markerHelpExample}`,children:It[e.value].example})]},e.value))})}),t.jsx(Jt,{isOpen:Wn,onClose:()=>Bt(!1),title:"AI Payload",size:"lg",children:t.jsxs("div",{className:s.payloadModalBody,children:[t.jsxs("div",{className:s.payloadModalToolbar,children:[t.jsxs("div",{className:s.payloadViewToggle,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.toolBtn} ${Tt==="json"?s.toolBtnActive:""}`,onClick:()=>cn("json"),children:"JSON"}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.toolBtn} ${Tt==="brief"?s.toolBtnActive:""}`,onClick:()=>cn("brief"),children:"AI Brief"})]}),t.jsxs("div",{className:s.payloadModalActions,children:[t.jsxs("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn}`,onClick:()=>{In("json")},disabled:!oe,"aria-label":le==="json"?"Copied JSON":"Copy JSON",title:le==="json"?"Copied JSON":"Copy JSON",children:[le==="json"?t.jsx(sn,{size:16}):t.jsx(Zt,{size:16}),t.jsx("span",{children:"JSON"})]}),t.jsxs("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn}`,onClick:()=>{In("brief")},disabled:!oe,"aria-label":le==="brief"?"Copied AI Brief":"Copy AI Brief",title:le==="brief"?"Copied AI Brief":"Copy AI Brief",children:[le==="brief"?t.jsx(sn,{size:16}):t.jsx(Zt,{size:16}),t.jsx("span",{children:"AI Brief"})]})]})]}),ft?t.jsx("div",{className:s.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Loading payload…"})}):oe?t.jsx("pre",{className:`tf-surface-inset tf-scrollbar ${s.payloadModalPreview}`,children:Tt==="json"?JSON.stringify(oe,null,2):Fn(oe)}):t.jsx("div",{className:s.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Load a payload preview to inspect the current session contract."})})]})})]})}export{dr as AnnotatedAttachmentWorkspaceShell};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as e,r as i,s as Ft,R as Fe}from"./vendor-react-CKJs5o3c.js";import{t as M,h as fe,f as B,i as rt,j as ot,k as Ot,m as Ht,R as Gt,n as I,o as ct,q as Wt,s as Kt}from"./index-CLIMgR6g.js";import{r as Ut,t as Jt,u as Vt,l as Yt,at as Xt,au as Oe,n as qt,Z as He,X as wt,av as lt,e as gt,aw as yt,ax as Qt,ay as Zt,a as en,i as tn,az as nn,aA as sn,aB as an,aC as _e,aD as rn,s as on,aE as cn,D as ln,aF as dn,T as un,as as dt,R as mn,aG as fn,B as hn,U as pn,S as vn}from"./vendor-icons-pWocEipT.js";import{s as wn,M as ke,r as Se}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const gn="_index_18mna_1",yn="_header_18mna_8",xn="_title_18mna_17",bn="_refreshBtn_18mna_26",_n="_search_18mna_48",kn="_searchIcon_18mna_54",Sn="_searchInput_18mna_63",jn="_list_18mna_80",Cn="_state_18mna_89",Nn="_stateError_18mna_97",Tn="_item_18mna_104",En="_itemActive_18mna_124",Rn="_itemIcon_18mna_132",An="_itemBody_18mna_142",$n="_itemTitle_18mna_150",Ln="_itemTask_18mna_162",In="_itemBadge_18mna_172",Bn="_itemMeta_18mna_185",Dn="_itemMetaDetails_18mna_195",Pn="_itemMetaReference_18mna_202",R={index:gn,header:yn,title:xn,refreshBtn:bn,search:_n,searchIcon:kn,searchInput:Sn,list:jn,state:Cn,stateError:Nn,item:Tn,itemActive:En,itemIcon:Rn,itemBody:An,itemTitle:$n,itemTask:Ln,itemBadge:In,itemMeta:Bn,itemMetaDetails:Dn,itemMetaReference:Pn};function Mn({docType:t}){switch(t){case"implementation-plan":return e.jsx(qt,{size:13});case"review":return e.jsx(Oe,{size:13});case"walkthrough":return e.jsx(Xt,{size:13});default:return e.jsx(Yt,{size:13})}}function zn(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function Fn(t){if(!t)return"";const l=new Date(t),r=new Date().getTime()-l.getTime(),u=Math.floor(r/(1e3*60*60*24));return u===0?"Today":u===1?"Yesterday":u<7?`${u}d ago`:u<30?`${Math.floor(u/7)}w ago`:l.toLocaleDateString()}function On(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function Hn({documents:t,selectedDocId:l,loading:c,error:r,searchQuery:u,taskById:m,onSearchChange:v,onSelect:S,onRefresh:g,hasActiveFilters:w}){return e.jsxs("div",{className:R.index,children:[e.jsxs("div",{className:R.header,children:[e.jsxs("span",{className:R.title,children:[e.jsx(Ut,{size:14}),"Documents"]}),e.jsx("button",{className:R.refreshBtn,onClick:g,title:"Refresh document list",disabled:c,children:e.jsx(Jt,{size:13,className:c?M.docSpinning:void 0})})]}),e.jsxs("div",{className:R.search,children:[e.jsx(Vt,{size:12,className:R.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:u,onChange:p=>v(p.target.value),className:R.searchInput})]}),e.jsxs("div",{className:`${R.list} tf-scrollbar`,children:[c&&e.jsx("div",{className:R.state,children:"Loading documents…"}),!c&&r&&e.jsx("div",{className:R.stateError,children:r}),!c&&!r&&t.length===0&&e.jsx("div",{className:R.state,children:w?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!c&&t.map(p=>{const _=p.taskId?m.get(p.taskId):null,b=p.id===l,L=fe(p),z=Ce(p),D=typeof p.attachmentCount=="number"&&Number.isFinite(p.attachmentCount)?p.attachmentCount:p.taskId?1:0,N=D>1?`${D} tasks linked`:D===1?_?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${R.item} ${b?R.itemActive:""}`,onClick:()=>S(p),onKeyDown:J=>On(J,()=>S(p)),children:[e.jsx("div",{className:R.itemIcon,children:e.jsx(Mn,{docType:p.docType})}),e.jsxs("div",{className:R.itemBody,children:[e.jsx("span",{className:R.itemTitle,title:L,children:L}),z==="unattached"&&e.jsx("span",{className:R.itemBadge,children:"Unattached"}),N&&e.jsx("span",{className:R.itemTask,title:N,children:N}),e.jsxs("span",{className:R.itemMeta,children:[e.jsxs("span",{className:R.itemMetaDetails,children:[zn(p.sizeBytes),p.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",Fn(p.updatedAt)]})]}),p.referenceLabel&&e.jsx("span",{className:R.itemMetaReference,children:p.referenceLabel})]})]})]},p.id)})]})]})}function je(t){return function(l){return wn(l,t)}}const Gn="_viewer_biumc_1",Wn="_viewerMonochrome_biumc_10",Kn="_metaDocumentName_biumc_10",Un="_viewerEditMode_biumc_14",Jn="_meta_biumc_10",Vn="_metaLeft_biumc_30",Yn="_metaRenameRow_biumc_49",Xn="_typeBadge_biumc_56",qn="_typeBadgeImplementationPlan_biumc_71",Qn="_typeBadgeReview_biumc_77",Zn="_typeBadgeWalkthrough_biumc_83",es="_metaTaskName_biumc_89",ts="_statusBadge_biumc_98",ns="_metaDate_biumc_113",ss="_metaSize_biumc_114",as="_actions_biumc_122",is="_actionBtn_biumc_129",rs="_dangerBtn_biumc_156",os="_generateBtn_biumc_167",cs="_editBtn_biumc_178",ls="_saveBtn_biumc_189",ds="_layoutToggle_biumc_205",us="_layoutBtn_biumc_213",ms="_layoutBtnActive_biumc_229",fs="_saveStatus_biumc_234",hs="_saveStatusSaved_biumc_241",ps="_saveStatusError_biumc_245",vs="_unsaved_biumc_250",ws="_viewerContent_biumc_256",gs="_viewerBody_biumc_265",ys="_viewerMain_biumc_273",xs="_reviewRail_biumc_277",bs="_printHint_biumc_283",_s="_reviewSection_biumc_290",ks="_reviewHeader_biumc_299",Ss="_reviewTitle_biumc_307",js="_reviewSubtitle_biumc_316",Cs="_reviewControls_biumc_323",Ns="_reviewSelect_biumc_330",Ts="_reviewSessionMeta_biumc_334",Es="_reviewStatusResolved_biumc_342",Rs="_reviewSessionLabel_biumc_348",As="_reviewTitleEditRow_biumc_353",$s="_reviewSessionTimestamp_biumc_360",Ls="_reviewAnchorLabel_biumc_364",Is="_reviewComposer_biumc_370",Bs="_reviewAnchorChip_biumc_377",Ds="_reviewAnchorSnippet_biumc_390",Ps="_reviewAnchorClear_biumc_395",Ms="_reviewCommentActions_biumc_408",zs="_reviewCommentAction_biumc_408",Fs="_reviewCommentEditor_biumc_429",Os="_viewerState_biumc_435",Hs="_viewerStateError_biumc_442",Gs="_editorArea_biumc_449",Ws="_editorPane_biumc_456",Ks="_editorLayoutSplit_biumc_464",Us="_previewPane_biumc_465",Js="_editorLayoutEditor_biumc_469",Vs="_editorLayoutPreview_biumc_470",Ys="_editorPaneLabel_biumc_474",Xs="_editorTextarea_biumc_486",qs="_markdownSurface_biumc_528",a={viewer:Gn,viewerMonochrome:Wn,metaDocumentName:Kn,viewerEditMode:Un,meta:Jn,metaLeft:Vn,metaRenameRow:Yn,typeBadge:Xn,typeBadgeImplementationPlan:qn,typeBadgeReview:Qn,typeBadgeWalkthrough:Zn,metaTaskName:es,statusBadge:ts,metaDate:ns,metaSize:ss,actions:as,actionBtn:is,dangerBtn:rs,generateBtn:os,editBtn:cs,saveBtn:ls,layoutToggle:ds,layoutBtn:us,layoutBtnActive:ms,saveStatus:fs,saveStatusSaved:hs,saveStatusError:ps,unsaved:vs,viewerContent:ws,viewerBody:gs,viewerMain:ys,reviewRail:xs,printHint:bs,reviewSection:_s,reviewHeader:ks,reviewTitle:Ss,reviewSubtitle:js,reviewControls:Cs,reviewSelect:Ns,reviewSessionMeta:Ts,reviewStatusResolved:Es,reviewSessionLabel:Rs,reviewTitleEditRow:As,reviewSessionTimestamp:$s,reviewAnchorLabel:Ls,reviewComposer:Is,reviewAnchorChip:Bs,reviewAnchorSnippet:Ds,reviewAnchorClear:Ps,reviewCommentActions:Ms,reviewCommentAction:zs,reviewCommentEditor:Fs,viewerState:Os,viewerStateError:Hs,editorArea:Gs,editorPane:Ws,editorLayoutSplit:Ks,previewPane:Us,editorLayoutEditor:Js,editorLayoutPreview:Vs,editorPaneLabel:Ys,editorTextarea:Xs,markdownSurface:qs},Qs="_overlay_1unik_1",Zs="_modal_1unik_12",ea="_header_1unik_16",ta="_title_1unik_20",na="_docName_1unik_24",sa="_body_1unik_34",aa="_state_1unik_41",ia="_stateError_1unik_52",ra="_stateDone_1unik_63",oa="_toolbar_1unik_84",ca="_toolbarCount_1unik_95",la="_toolbarActions_1unik_100",da="_tree_1unik_105",ua="_taskRow_1unik_113",ma="_taskRowDimmed_1unik_126",fa="_taskCheck_1unik_130",ha="_taskExpandBtn_1unik_139",pa="_taskExpandSpacer_1unik_155",va="_taskTitle_1unik_160",wa="_taskBadge_1unik_169",ga="_footer_1unik_179",C={overlay:Qs,modal:Zs,header:ea,title:ta,docName:na,body:sa,state:aa,stateError:ia,stateDone:ra,toolbar:oa,toolbarCount:ca,toolbarActions:la,tree:da,taskRow:ua,taskRowDimmed:ma,taskCheck:fa,taskExpandBtn:ha,taskExpandSpacer:pa,taskTitle:va,taskBadge:wa,footer:ga},ya={1:"Low",2:"Medium",3:"High"};function me(t,l){return t.map(c=>({...c,selected:l,children:me(c.children,l)}))}function xt(t,l,c){return t.map(r=>r.idempotencyKey===l?{...r,selected:c,children:me(r.children,c)}:{...r,children:xt(r.children,l,c)})}function Ge(t){let l=0;for(const c of t)c.selected&&l++,l+=Ge(c.children);return l}function bt({node:t,depth:l,onToggle:c}){const[r,u]=i.useState(!0),m=t.children.length>0,v=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${C.taskRow} ${t.selected?"":C.taskRowDimmed}`,style:{paddingLeft:`${12+v}px`},children:[e.jsx("button",{className:C.taskCheck,onClick:()=>c(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(Qt,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(Zt,{size:14,style:{color:"var(--text-muted)"}})}),m?e.jsx("button",{className:C.taskExpandBtn,onClick:()=>u(S=>!S),children:r?e.jsx(en,{size:12}):e.jsx(tn,{size:12})}):e.jsx("span",{className:C.taskExpandSpacer}),e.jsx("span",{className:C.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:C.taskBadge,style:{color:rt(t.type),borderColor:rt(t.type)},children:t.type}),e.jsx("span",{className:C.taskBadge,style:{color:ot(t.priority),borderColor:ot(t.priority)},children:ya[t.priority]})]}),m&&r&&e.jsx("div",{children:t.children.map(S=>e.jsx(bt,{node:S,depth:l+1,onToggle:c},S.idempotencyKey))})]})}function xa({content:t,docTitle:l,apiBaseUrl:c="",onClose:r,onGenerated:u}){const[m,v]=i.useState("preview"),[S,g]=i.useState(null),[w,p]=i.useState([]),[_,b]=i.useState(!0),[L,z]=i.useState(0),[D,N]=i.useState(null);i.useEffect(()=>{let y=!1;return b(!0),g(null),B("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},c).then(j=>j.json()).then(j=>{if(!y){if(j.error)throw new Error(j.error);p(j.tasks||[]),v("preview")}}).catch(j=>{y||(g(j?.message||"Failed to parse plan"),v("error"))}).finally(()=>{y||b(!1)}),()=>{y=!0}},[t,c]);const J=i.useCallback((y,j)=>{p(q=>xt(q,y,j))},[]),F=()=>p(y=>me(y,!0)),G=()=>p(y=>me(y,!1)),O=Ge(w),Y=async()=>{v("generating"),N(null);try{const y=await B("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:w})},c),j=await y.json().catch(()=>({}));if(!y.ok)throw new Error(j.error||`Generation failed (${y.status})`);z(j.created??0),v("done"),u(j.created??0)}catch(y){N(y?.message||"Generation failed"),v("error")}};return e.jsx("div",{className:C.overlay,onClick:y=>{y.target===y.currentTarget&&r()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${C.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${C.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${C.title}`,children:[e.jsx(He,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:C.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:r,title:"Close",children:e.jsx(wt,{size:16})})]}),e.jsxs("div",{className:C.body,children:[_&&e.jsxs("div",{className:C.state,children:[e.jsx(lt,{size:20,className:M.docSpinning}),"Parsing plan…"]}),!_&&m==="error"&&e.jsxs("div",{className:C.stateError,children:[e.jsx(gt,{size:16}),S||D||"An error occurred"]}),!_&&m==="done"&&e.jsxs("div",{className:C.stateDone,children:[e.jsx(yt,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[L," task",L!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!_&&(m==="preview"||m==="confirm"||m==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:C.toolbar,children:[e.jsxs("span",{className:C.toolbarCount,children:[O," of ",Ge(me(w,!0))," tasks selected"]}),e.jsxs("div",{className:C.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:F,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:G,children:"Deselect all"})]})]}),w.length===0?e.jsx("div",{className:C.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${C.tree} tf-scrollbar`,children:w.map(y=>e.jsx(bt,{node:y,depth:0,onToggle:J},y.idempotencyKey))})]})]}),!_&&m!=="done"&&m!=="error"&&e.jsxs("div",{className:C.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:r,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Y,disabled:O===0||m==="generating",children:m==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:13,className:M.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(He,{size:13})," Generate ",O," task",O!==1?"s":""]})})]}),!_&&m==="done"&&e.jsx("div",{className:C.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:r,children:"Done"})})]})})}const ba={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},_a={"implementation-plan":a.typeBadgeImplementationPlan,review:a.typeBadgeReview,walkthrough:a.typeBadgeWalkthrough,planning:void 0,other:void 0},ka={editor:a.editorLayoutEditor,split:a.editorLayoutSplit,preview:a.editorLayoutPreview},Sa=1500,ja=`
|
|
1
|
+
import{j as e,r as i,s as Ft,R as Fe}from"./vendor-react-CKJs5o3c.js";import{t as M,h as fe,f as B,i as rt,j as ot,k as Ot,m as Ht,R as Gt,n as I,o as ct,q as Wt,s as Kt}from"./index-DXUdtH1B.js";import{r as Ut,t as Jt,u as Vt,l as Yt,au as Xt,av as Oe,n as qt,Z as He,X as wt,aw as lt,e as gt,ax as yt,ay as Qt,az as Zt,a as en,i as tn,aA as nn,aB as sn,aC as an,aD as _e,aE as rn,s as on,aF as cn,D as ln,aG as dn,T as un,at as dt,R as mn,aH as fn,B as hn,U as pn,S as vn}from"./vendor-icons-I7ZwG1z_.js";import{s as wn,M as ke,r as Se}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const gn="_index_18mna_1",yn="_header_18mna_8",xn="_title_18mna_17",bn="_refreshBtn_18mna_26",_n="_search_18mna_48",kn="_searchIcon_18mna_54",Sn="_searchInput_18mna_63",jn="_list_18mna_80",Cn="_state_18mna_89",Nn="_stateError_18mna_97",Tn="_item_18mna_104",En="_itemActive_18mna_124",Rn="_itemIcon_18mna_132",An="_itemBody_18mna_142",$n="_itemTitle_18mna_150",Ln="_itemTask_18mna_162",In="_itemBadge_18mna_172",Bn="_itemMeta_18mna_185",Dn="_itemMetaDetails_18mna_195",Pn="_itemMetaReference_18mna_202",R={index:gn,header:yn,title:xn,refreshBtn:bn,search:_n,searchIcon:kn,searchInput:Sn,list:jn,state:Cn,stateError:Nn,item:Tn,itemActive:En,itemIcon:Rn,itemBody:An,itemTitle:$n,itemTask:Ln,itemBadge:In,itemMeta:Bn,itemMetaDetails:Dn,itemMetaReference:Pn};function Mn({docType:t}){switch(t){case"implementation-plan":return e.jsx(qt,{size:13});case"review":return e.jsx(Oe,{size:13});case"walkthrough":return e.jsx(Xt,{size:13});default:return e.jsx(Yt,{size:13})}}function zn(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function Fn(t){if(!t)return"";const l=new Date(t),r=new Date().getTime()-l.getTime(),u=Math.floor(r/(1e3*60*60*24));return u===0?"Today":u===1?"Yesterday":u<7?`${u}d ago`:u<30?`${Math.floor(u/7)}w ago`:l.toLocaleDateString()}function On(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function Hn({documents:t,selectedDocId:l,loading:c,error:r,searchQuery:u,taskById:m,onSearchChange:v,onSelect:S,onRefresh:g,hasActiveFilters:w}){return e.jsxs("div",{className:R.index,children:[e.jsxs("div",{className:R.header,children:[e.jsxs("span",{className:R.title,children:[e.jsx(Ut,{size:14}),"Documents"]}),e.jsx("button",{className:R.refreshBtn,onClick:g,title:"Refresh document list",disabled:c,children:e.jsx(Jt,{size:13,className:c?M.docSpinning:void 0})})]}),e.jsxs("div",{className:R.search,children:[e.jsx(Vt,{size:12,className:R.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:u,onChange:p=>v(p.target.value),className:R.searchInput})]}),e.jsxs("div",{className:`${R.list} tf-scrollbar`,children:[c&&e.jsx("div",{className:R.state,children:"Loading documents…"}),!c&&r&&e.jsx("div",{className:R.stateError,children:r}),!c&&!r&&t.length===0&&e.jsx("div",{className:R.state,children:w?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!c&&t.map(p=>{const _=p.taskId?m.get(p.taskId):null,b=p.id===l,L=fe(p),z=Ce(p),D=typeof p.attachmentCount=="number"&&Number.isFinite(p.attachmentCount)?p.attachmentCount:p.taskId?1:0,N=D>1?`${D} tasks linked`:D===1?_?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${R.item} ${b?R.itemActive:""}`,onClick:()=>S(p),onKeyDown:J=>On(J,()=>S(p)),children:[e.jsx("div",{className:R.itemIcon,children:e.jsx(Mn,{docType:p.docType})}),e.jsxs("div",{className:R.itemBody,children:[e.jsx("span",{className:R.itemTitle,title:L,children:L}),z==="unattached"&&e.jsx("span",{className:R.itemBadge,children:"Unattached"}),N&&e.jsx("span",{className:R.itemTask,title:N,children:N}),e.jsxs("span",{className:R.itemMeta,children:[e.jsxs("span",{className:R.itemMetaDetails,children:[zn(p.sizeBytes),p.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",Fn(p.updatedAt)]})]}),p.referenceLabel&&e.jsx("span",{className:R.itemMetaReference,children:p.referenceLabel})]})]})]},p.id)})]})]})}function je(t){return function(l){return wn(l,t)}}const Gn="_viewer_biumc_1",Wn="_viewerMonochrome_biumc_10",Kn="_metaDocumentName_biumc_10",Un="_viewerEditMode_biumc_14",Jn="_meta_biumc_10",Vn="_metaLeft_biumc_30",Yn="_metaRenameRow_biumc_49",Xn="_typeBadge_biumc_56",qn="_typeBadgeImplementationPlan_biumc_71",Qn="_typeBadgeReview_biumc_77",Zn="_typeBadgeWalkthrough_biumc_83",es="_metaTaskName_biumc_89",ts="_statusBadge_biumc_98",ns="_metaDate_biumc_113",ss="_metaSize_biumc_114",as="_actions_biumc_122",is="_actionBtn_biumc_129",rs="_dangerBtn_biumc_156",os="_generateBtn_biumc_167",cs="_editBtn_biumc_178",ls="_saveBtn_biumc_189",ds="_layoutToggle_biumc_205",us="_layoutBtn_biumc_213",ms="_layoutBtnActive_biumc_229",fs="_saveStatus_biumc_234",hs="_saveStatusSaved_biumc_241",ps="_saveStatusError_biumc_245",vs="_unsaved_biumc_250",ws="_viewerContent_biumc_256",gs="_viewerBody_biumc_265",ys="_viewerMain_biumc_273",xs="_reviewRail_biumc_277",bs="_printHint_biumc_283",_s="_reviewSection_biumc_290",ks="_reviewHeader_biumc_299",Ss="_reviewTitle_biumc_307",js="_reviewSubtitle_biumc_316",Cs="_reviewControls_biumc_323",Ns="_reviewSelect_biumc_330",Ts="_reviewSessionMeta_biumc_334",Es="_reviewStatusResolved_biumc_342",Rs="_reviewSessionLabel_biumc_348",As="_reviewTitleEditRow_biumc_353",$s="_reviewSessionTimestamp_biumc_360",Ls="_reviewAnchorLabel_biumc_364",Is="_reviewComposer_biumc_370",Bs="_reviewAnchorChip_biumc_377",Ds="_reviewAnchorSnippet_biumc_390",Ps="_reviewAnchorClear_biumc_395",Ms="_reviewCommentActions_biumc_408",zs="_reviewCommentAction_biumc_408",Fs="_reviewCommentEditor_biumc_429",Os="_viewerState_biumc_435",Hs="_viewerStateError_biumc_442",Gs="_editorArea_biumc_449",Ws="_editorPane_biumc_456",Ks="_editorLayoutSplit_biumc_464",Us="_previewPane_biumc_465",Js="_editorLayoutEditor_biumc_469",Vs="_editorLayoutPreview_biumc_470",Ys="_editorPaneLabel_biumc_474",Xs="_editorTextarea_biumc_486",qs="_markdownSurface_biumc_528",a={viewer:Gn,viewerMonochrome:Wn,metaDocumentName:Kn,viewerEditMode:Un,meta:Jn,metaLeft:Vn,metaRenameRow:Yn,typeBadge:Xn,typeBadgeImplementationPlan:qn,typeBadgeReview:Qn,typeBadgeWalkthrough:Zn,metaTaskName:es,statusBadge:ts,metaDate:ns,metaSize:ss,actions:as,actionBtn:is,dangerBtn:rs,generateBtn:os,editBtn:cs,saveBtn:ls,layoutToggle:ds,layoutBtn:us,layoutBtnActive:ms,saveStatus:fs,saveStatusSaved:hs,saveStatusError:ps,unsaved:vs,viewerContent:ws,viewerBody:gs,viewerMain:ys,reviewRail:xs,printHint:bs,reviewSection:_s,reviewHeader:ks,reviewTitle:Ss,reviewSubtitle:js,reviewControls:Cs,reviewSelect:Ns,reviewSessionMeta:Ts,reviewStatusResolved:Es,reviewSessionLabel:Rs,reviewTitleEditRow:As,reviewSessionTimestamp:$s,reviewAnchorLabel:Ls,reviewComposer:Is,reviewAnchorChip:Bs,reviewAnchorSnippet:Ds,reviewAnchorClear:Ps,reviewCommentActions:Ms,reviewCommentAction:zs,reviewCommentEditor:Fs,viewerState:Os,viewerStateError:Hs,editorArea:Gs,editorPane:Ws,editorLayoutSplit:Ks,previewPane:Us,editorLayoutEditor:Js,editorLayoutPreview:Vs,editorPaneLabel:Ys,editorTextarea:Xs,markdownSurface:qs},Qs="_overlay_1unik_1",Zs="_modal_1unik_12",ea="_header_1unik_16",ta="_title_1unik_20",na="_docName_1unik_24",sa="_body_1unik_34",aa="_state_1unik_41",ia="_stateError_1unik_52",ra="_stateDone_1unik_63",oa="_toolbar_1unik_84",ca="_toolbarCount_1unik_95",la="_toolbarActions_1unik_100",da="_tree_1unik_105",ua="_taskRow_1unik_113",ma="_taskRowDimmed_1unik_126",fa="_taskCheck_1unik_130",ha="_taskExpandBtn_1unik_139",pa="_taskExpandSpacer_1unik_155",va="_taskTitle_1unik_160",wa="_taskBadge_1unik_169",ga="_footer_1unik_179",C={overlay:Qs,modal:Zs,header:ea,title:ta,docName:na,body:sa,state:aa,stateError:ia,stateDone:ra,toolbar:oa,toolbarCount:ca,toolbarActions:la,tree:da,taskRow:ua,taskRowDimmed:ma,taskCheck:fa,taskExpandBtn:ha,taskExpandSpacer:pa,taskTitle:va,taskBadge:wa,footer:ga},ya={1:"Low",2:"Medium",3:"High"};function me(t,l){return t.map(c=>({...c,selected:l,children:me(c.children,l)}))}function xt(t,l,c){return t.map(r=>r.idempotencyKey===l?{...r,selected:c,children:me(r.children,c)}:{...r,children:xt(r.children,l,c)})}function Ge(t){let l=0;for(const c of t)c.selected&&l++,l+=Ge(c.children);return l}function bt({node:t,depth:l,onToggle:c}){const[r,u]=i.useState(!0),m=t.children.length>0,v=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${C.taskRow} ${t.selected?"":C.taskRowDimmed}`,style:{paddingLeft:`${12+v}px`},children:[e.jsx("button",{className:C.taskCheck,onClick:()=>c(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(Qt,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(Zt,{size:14,style:{color:"var(--text-muted)"}})}),m?e.jsx("button",{className:C.taskExpandBtn,onClick:()=>u(S=>!S),children:r?e.jsx(en,{size:12}):e.jsx(tn,{size:12})}):e.jsx("span",{className:C.taskExpandSpacer}),e.jsx("span",{className:C.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:C.taskBadge,style:{color:rt(t.type),borderColor:rt(t.type)},children:t.type}),e.jsx("span",{className:C.taskBadge,style:{color:ot(t.priority),borderColor:ot(t.priority)},children:ya[t.priority]})]}),m&&r&&e.jsx("div",{children:t.children.map(S=>e.jsx(bt,{node:S,depth:l+1,onToggle:c},S.idempotencyKey))})]})}function xa({content:t,docTitle:l,apiBaseUrl:c="",onClose:r,onGenerated:u}){const[m,v]=i.useState("preview"),[S,g]=i.useState(null),[w,p]=i.useState([]),[_,b]=i.useState(!0),[L,z]=i.useState(0),[D,N]=i.useState(null);i.useEffect(()=>{let y=!1;return b(!0),g(null),B("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},c).then(j=>j.json()).then(j=>{if(!y){if(j.error)throw new Error(j.error);p(j.tasks||[]),v("preview")}}).catch(j=>{y||(g(j?.message||"Failed to parse plan"),v("error"))}).finally(()=>{y||b(!1)}),()=>{y=!0}},[t,c]);const J=i.useCallback((y,j)=>{p(q=>xt(q,y,j))},[]),F=()=>p(y=>me(y,!0)),G=()=>p(y=>me(y,!1)),O=Ge(w),Y=async()=>{v("generating"),N(null);try{const y=await B("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:w})},c),j=await y.json().catch(()=>({}));if(!y.ok)throw new Error(j.error||`Generation failed (${y.status})`);z(j.created??0),v("done"),u(j.created??0)}catch(y){N(y?.message||"Generation failed"),v("error")}};return e.jsx("div",{className:C.overlay,onClick:y=>{y.target===y.currentTarget&&r()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${C.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${C.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${C.title}`,children:[e.jsx(He,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:C.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:r,title:"Close",children:e.jsx(wt,{size:16})})]}),e.jsxs("div",{className:C.body,children:[_&&e.jsxs("div",{className:C.state,children:[e.jsx(lt,{size:20,className:M.docSpinning}),"Parsing plan…"]}),!_&&m==="error"&&e.jsxs("div",{className:C.stateError,children:[e.jsx(gt,{size:16}),S||D||"An error occurred"]}),!_&&m==="done"&&e.jsxs("div",{className:C.stateDone,children:[e.jsx(yt,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[L," task",L!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!_&&(m==="preview"||m==="confirm"||m==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:C.toolbar,children:[e.jsxs("span",{className:C.toolbarCount,children:[O," of ",Ge(me(w,!0))," tasks selected"]}),e.jsxs("div",{className:C.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:F,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:G,children:"Deselect all"})]})]}),w.length===0?e.jsx("div",{className:C.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${C.tree} tf-scrollbar`,children:w.map(y=>e.jsx(bt,{node:y,depth:0,onToggle:J},y.idempotencyKey))})]})]}),!_&&m!=="done"&&m!=="error"&&e.jsxs("div",{className:C.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:r,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Y,disabled:O===0||m==="generating",children:m==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:13,className:M.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(He,{size:13})," Generate ",O," task",O!==1?"s":""]})})]}),!_&&m==="done"&&e.jsx("div",{className:C.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:r,children:"Done"})})]})})}const ba={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},_a={"implementation-plan":a.typeBadgeImplementationPlan,review:a.typeBadgeReview,walkthrough:a.typeBadgeWalkthrough,planning:void 0,other:void 0},ka={editor:a.editorLayoutEditor,split:a.editorLayoutSplit,preview:a.editorLayoutPreview},Sa=1500,ja=`
|
|
2
2
|
@page {
|
|
3
3
|
margin: 0.94in 1.02in 1in;
|
|
4
4
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-
|
|
1
|
+
import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-DXUdtH1B.js";import{h as g,Z as v,b as j,k as f}from"./vendor-icons-I7ZwG1z_.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function T({initiativeTemplates:n,onRefreshInitiativeTemplates:u,onCreateInitiativeFromTemplate:l}){const[a,o]=i.useState(""),[c,x]=i.useState(""),[d,m]=i.useState(!1),[r,p]=i.useState(null);return i.useEffect(()=>{if(!a&&n.length>0){const t=n[0];o(t.id)}},[n,a]),s.jsx("div",{className:`${e.standalonePage} ${e.standaloneContent}`,style:{overflow:"auto"},children:s.jsx("div",{className:e.settingsContent,style:{maxWidth:900,margin:"0 auto",width:"100%"},children:s.jsxs("div",{className:e.settingGroup,children:[s.jsxs("div",{className:e.settingTitleRow,children:[s.jsx("h2",{className:e.settingTitle,children:"Initiatives"}),s.jsx("button",{className:e.copyBtn,onClick:()=>{u?.()},children:"Refresh"})]}),s.jsx("p",{className:`${e.settingsHint} ${e.marginBottom12}`,children:"Create initiative-ready planning structures from reusable templates."}),s.jsxs("div",{className:e.exportItem,children:[s.jsx("label",{className:e.label,children:"Template"}),s.jsx("select",{className:e.input,value:a,onChange:t=>{const h=t.target.value;o(h)},children:n.map(t=>s.jsx("option",{value:t.id,children:t.name},t.id))})]}),s.jsxs("div",{className:`${e.exportItem} ${e.marginTop12}`,children:[s.jsx("label",{className:e.label,children:"Initiative Title"}),s.jsx("input",{className:e.input,placeholder:"e.g. Taskforce Private Beta Launch",value:c,onChange:t=>x(t.target.value)})]}),s.jsxs("button",{className:`${e.secondaryHeaderBtn} ${e.marginTop12}`,disabled:d||!a||!c.trim()||!l,onClick:async()=>{if(!l)return;m(!0);const t=await l({templateId:a,title:c.trim()});m(!1),p({type:t.success?"success":"error",message:t.success?"Initiative created from template.":t.error||"Failed to create initiative."})},children:[d?s.jsx(g,{size:14,className:e.spinner}):s.jsx(v,{size:14}),"Create Initiative"]}),r&&s.jsxs("div",{className:`${r.type==="success"?e.successMessage:e.errorMessage} ${e.marginTop12}`,children:[r.type==="success"?s.jsx(j,{size:14}):s.jsx(f,{size:14}),r.message]})]})})})}export{T as InitiativesModule};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
._plansWrapper_b8yvs_1{--plans-accent: var(--brand-primary, #6366f1);--plans-accent-strong: var(--brand-primary-strong, #7c3aed);--plans-accent-soft: var(--brand-primary-soft, rgba(99, 102, 241, .1));--plans-accent-border: var(--brand-primary-border, rgba(99, 102, 241, .24));--plans-surface: color-mix(in srgb, var(--surface-panel) 84%, var(--surface-page));--plans-surface-elevated: color-mix(in srgb, var(--surface-elevated) 88%, var(--surface-panel));--plans-surface-strong: color-mix(in srgb, var(--surface-page) 70%, var(--surface-panel));--plans-shadow: 0 22px 44px rgba(0, 0, 0, .18);overflow-y:auto;display:flex;flex-direction:column;align-items:stretch;align-self:stretch;width:100%;flex:1;min-height:100%;min-width:0;padding:64px 24px;box-sizing:border-box;background:radial-gradient(900px 520px at 18% -4%,color-mix(in srgb,var(--plans-accent) 18%,transparent),transparent 62%),radial-gradient(780px 480px at 88% 2%,color-mix(in srgb,var(--brand-cloud-accent, #dd6b20) 12%,transparent),transparent 60%),linear-gradient(180deg,color-mix(in srgb,var(--surface-page) 94%,var(--surface-panel)),var(--surface-page));scrollbar-gutter:stable}._contentFrame_b8yvs_28{width:min(1100px,100%);max-width:1100px;margin:0 auto;display:flex;flex-direction:column}._shellOwnsScroll_b8yvs_36{overflow:visible;min-height:100%;scrollbar-gutter:auto}._withChrome_b8yvs_42{padding-top:52px}._siteVariant_b8yvs_46{background:radial-gradient(1200px 700px at 20% -10%,rgba(56,189,248,.25),transparent 60%),radial-gradient(900px 600px at 90% 0%,rgba(45,212,191,.18),transparent 65%),linear-gradient(150deg,#0b1022,#111936);padding:56px 24px 80px}._siteVariant_b8yvs_46 ._title_b8yvs_54{background:none;-webkit-text-fill-color:var(--text-primary);color:var(--text-primary);font-size:clamp(34px,6vw,58px);letter-spacing:-.03em;margin-bottom:0}._siteVariant_b8yvs_46 ._subtitle_b8yvs_63{color:#a6b3d9}._siteVariant_b8yvs_46 ._header_b8yvs_67{width:100%;max-width:1040px;border:1px solid rgba(203,213,255,.2);border-radius:20px;padding:42px 28px;background:#090e208c;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);text-align:left;margin-bottom:20px}._siteVariant_b8yvs_46 ._planCard_b8yvs_79{background:#090e20b3;border-color:#cbd5ff33;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border-radius:16px;padding:22px 20px}._siteVariant_b8yvs_46 ._planCard_b8yvs_79:hover{transform:translateY(-3px);box-shadow:none}._siteVariant_b8yvs_46 ._grid_b8yvs_92{max-width:1040px;gap:12px;grid-template-columns:repeat(3,minmax(0,1fr))}._siteVariant_b8yvs_46 ._planName_b8yvs_98{font-size:22px}._siteVariant_b8yvs_46 ._featureText_b8yvs_102{color:#a6b3d9}._siteVariant_b8yvs_46 ._currentBadge_b8yvs_106{font-size:11px}._siteVariant_b8yvs_46 ._navAction_b8yvs_110,._siteVariant_b8yvs_46 ._backBtn_b8yvs_111{border:1px solid rgba(203,213,255,.2);background:#141d3c99;color:#f6f8ff}._siteVariant_b8yvs_46 ._backBtn_b8yvs_111:hover,._siteVariant_b8yvs_46 ._navAction_b8yvs_110:hover{background:#141d3cd9}._siteVariant_b8yvs_46 ._priceRows_b8yvs_122{border-top-color:#cbd5ff33}._header_b8yvs_67{width:100%;text-align:left;margin-bottom:32px;padding:32px;border-radius:28px;border:1px solid var(--border-default);background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 92%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);box-shadow:var(--plans-shadow)}._headerBar_b8yvs_139{width:100%;display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px}._headerActions_b8yvs_148{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}._title_b8yvs_54{font-size:clamp(38px,5vw,54px);font-weight:800;margin-bottom:16px;background:linear-gradient(135deg,var(--text-primary),color-mix(in srgb,var(--plans-accent) 72%,var(--text-primary)));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:-.04em;line-height:.98}._subtitle_b8yvs_63{max-width:720px;font-size:18px;color:var(--text-secondary);line-height:1.7}._debugMeta_b8yvs_175{margin-top:16px;font-size:13px;color:var(--text-secondary);opacity:.8}._grid_b8yvs_92{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:20px;width:100%}._planCard_b8yvs_79{background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 90%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);border:1px solid var(--border-default);border-radius:22px;padding:28px;display:flex;flex-direction:column;position:relative;overflow:hidden;box-shadow:0 12px 28px #0000001f;transition:transform .24s ease,box-shadow .24s ease,border-color .24s ease,background .24s ease}._clickablePlanCard_b8yvs_204{cursor:pointer}._clickablePlanCard_b8yvs_204:focus-visible{outline:2px solid var(--plans-accent);outline-offset:4px}._planCard_b8yvs_79:hover{transform:translateY(-4px);border-color:var(--plans-accent-border);box-shadow:0 20px 36px #0000002e}._activePlanCard_b8yvs_219{border:1px solid color-mix(in srgb,var(--plans-accent) 38%,var(--border-default));background:linear-gradient(180deg,color-mix(in srgb,var(--plans-accent) 10%,var(--plans-surface-elevated)),color-mix(in srgb,var(--plans-accent) 4%,var(--plans-surface))),var(--plans-surface);box-shadow:0 18px 34px #0000002e,inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 16%,transparent)}._currentBadge_b8yvs_106{position:absolute;top:20px;right:20px;background:color-mix(in srgb,var(--plans-accent) 16%,var(--surface-page));color:var(--plans-accent-strong);font-size:12px;font-weight:700;padding:6px 12px;border-radius:999px;border:1px solid color-mix(in srgb,var(--plans-accent) 26%,transparent);text-transform:uppercase;letter-spacing:.08em}._planName_b8yvs_98{font-size:28px;font-weight:700;color:var(--text-primary);margin-bottom:14px}._priceDisplay_b8yvs_251{margin-bottom:32px;display:flex;align-items:baseline;gap:8px}._priceAmount_b8yvs_258{font-size:56px;font-weight:800;color:var(--text-primary);letter-spacing:-2px;line-height:1}._priceInterval_b8yvs_266{font-size:16px;color:var(--text-secondary);font-weight:500}._callToAction_b8yvs_272{width:100%;padding:14px 18px;border-radius:12px;font-size:15px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:all .2s ease;margin-bottom:0}._primaryCta_b8yvs_284{background:var(--button-primary-bg);border-color:var(--button-primary-border);color:var(--button-primary-text, white)}._primaryCta_b8yvs_284:hover{transform:translateY(-1px);box-shadow:0 10px 22px var(--brand-primary-glow)}._secondaryCta_b8yvs_295{background:var(--button-secondary-bg);color:var(--button-secondary-text);border-color:var(--button-secondary-border)}._secondaryCta_b8yvs_295:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._currentCta_b8yvs_307{background:color-mix(in srgb,var(--plans-accent) 9%,var(--plans-surface-strong));color:var(--text-primary);border-color:color-mix(in srgb,var(--plans-accent) 24%,var(--border-default));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 10%,transparent);cursor:pointer}._currentCta_b8yvs_307:hover{background:color-mix(in srgb,var(--plans-accent) 14%,var(--plans-surface-strong));border-color:color-mix(in srgb,var(--plans-accent) 32%,var(--border-default));transform:translateY(-1px)}._featuresList_b8yvs_321{flex:1;display:flex;flex-direction:column;gap:20px;margin-bottom:28px}._priceRows_b8yvs_122{display:flex;flex-direction:column;gap:10px;margin-top:auto;margin-bottom:16px;border-top:1px solid var(--border-default);padding-top:16px}._priceRow_b8yvs_122{display:flex;align-items:baseline;justify-content:space-between;gap:10px}._priceRowAmount_b8yvs_346{font-size:22px;font-weight:700;color:var(--text-primary)}._priceRowInterval_b8yvs_352{color:var(--text-secondary);font-weight:600}._ctaRow_b8yvs_357{display:grid;grid-template-columns:1fr 1fr;gap:10px}._featureItem_b8yvs_363{display:flex;align-items:flex-start;gap:16px}._featureIcon_b8yvs_369{color:var(--plans-accent);flex-shrink:0;width:20px;height:20px;margin-top:2px}._featureText_b8yvs_102{font-size:16px;line-height:1.5;color:var(--text-primary)}._emptyState_b8yvs_383{text-align:center;padding:64px;background:var(--bg-secondary);border-radius:24px;border:1px dashed var(--border-color, var(--border-primary, rgba(255, 255, 255, .14)));width:100%}._marketingEmptyState_b8yvs_392{max-width:920px;border-style:solid;border-radius:28px;padding:72px 48px;background:radial-gradient(560px 260px at 15% 10%,rgba(34,197,94,.15),transparent 60%),radial-gradient(620px 320px at 85% 0%,rgba(251,191,36,.16),transparent 62%),linear-gradient(145deg,#0f172af5,#111827eb);box-shadow:0 28px 90px #00000047}._marketingEmptyState_b8yvs_392 h2{margin:18px 0 14px;font-size:clamp(32px,4vw,52px);line-height:1.02;letter-spacing:-.04em;color:#f8fafc}._marketingEmptyState_b8yvs_392 p{margin:0 auto;max-width:680px;font-size:18px;line-height:1.7;color:#cbd5e1}._emptyBadge_b8yvs_420{display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;border-radius:999px;background:#f8fafc14;border:1px solid rgba(248,250,252,.18);color:#f8fafc;font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}._emptyHighlights_b8yvs_435{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px}._emptyHighlights_b8yvs_435 span{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:999px;background:#94a3b81f;border:1px solid rgba(148,163,184,.18);color:#e2e8f0;font-size:13px;font-weight:700;letter-spacing:.02em}._loader_b8yvs_457{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:50vh;gap:24px;color:var(--text-secondary)}._spinner_b8yvs_467{animation:_spin_b8yvs_467 1s linear infinite;color:var(--accent-primary, #6366f1)}@keyframes _spin_b8yvs_467{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._backBtn_b8yvs_111{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;cursor:pointer;padding:10px 16px;border-radius:12px;transition:all .2s ease}._backBtn_b8yvs_111:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._navAction_b8yvs_110{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);padding:10px 20px;border-radius:12px;font-weight:600;cursor:pointer;transition:all .2s ease}._navAction_b8yvs_110:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._statusBanner_b8yvs_520{margin-top:24px;padding:12px 24px;border-radius:12px;font-weight:500;font-size:14px}._successBanner_b8yvs_528{background:color-mix(in srgb,var(--status-success) 12%,var(--plans-surface-elevated));color:var(--status-success);border:1px solid color-mix(in srgb,var(--status-success) 24%,transparent)}._errorBanner_b8yvs_534{background:color-mix(in srgb,var(--status-error) 12%,var(--plans-surface-elevated));color:var(--status-error);border:1px solid color-mix(in srgb,var(--status-error) 24%,transparent)}@media(max-width:768px){._plansWrapper_b8yvs_1{padding:28px 14px}._withChrome_b8yvs_42{padding-top:36px}._header_b8yvs_67{margin-bottom:24px;padding:22px 18px}._headerBar_b8yvs_139{gap:10px;flex-wrap:wrap;margin-bottom:18px}._title_b8yvs_54{font-size:34px;margin-bottom:12px}._grid_b8yvs_92{grid-template-columns:1fr;gap:18px}._siteVariant_b8yvs_46 ._grid_b8yvs_92{grid-template-columns:1fr}._siteVariant_b8yvs_46 ._header_b8yvs_67{padding:26px 18px}._planCard_b8yvs_79{padding:22px}._marketingEmptyState_b8yvs_392{padding:56px 24px}._marketingEmptyState_b8yvs_392 h2{font-size:34px}._marketingEmptyState_b8yvs_392 p{font-size:16px}._headerActions_b8yvs_148{width:100%;justify-content:flex-start}}
|
|
1
|
+
._plansWrapper_1i5vs_1{--plans-accent: var(--brand-primary, #6366f1);--plans-accent-strong: var(--brand-primary-strong, #7c3aed);--plans-accent-soft: var(--brand-primary-soft, rgba(99, 102, 241, .1));--plans-accent-border: var(--brand-primary-border, rgba(99, 102, 241, .24));--plans-surface: color-mix(in srgb, var(--surface-panel) 84%, var(--surface-page));--plans-surface-elevated: color-mix(in srgb, var(--surface-elevated) 88%, var(--surface-panel));--plans-surface-strong: color-mix(in srgb, var(--surface-page) 70%, var(--surface-panel));--plans-shadow: 0 22px 44px rgba(0, 0, 0, .18);overflow-y:auto;display:flex;flex-direction:column;align-items:stretch;align-self:stretch;width:100%;flex:1;min-height:100%;min-width:0;padding:64px 24px;box-sizing:border-box;background:radial-gradient(900px 520px at 18% -4%,color-mix(in srgb,var(--plans-accent) 18%,transparent),transparent 62%),radial-gradient(780px 480px at 88% 2%,color-mix(in srgb,var(--brand-cloud-accent, #dd6b20) 12%,transparent),transparent 60%),linear-gradient(180deg,color-mix(in srgb,var(--surface-page) 94%,var(--surface-panel)),var(--surface-page));scrollbar-gutter:stable}._contentFrame_1i5vs_28{width:min(1100px,100%);max-width:1100px;margin:0 auto;display:flex;flex-direction:column}._shellOwnsScroll_1i5vs_36{overflow:visible;min-height:100%;scrollbar-gutter:auto}._withChrome_1i5vs_42{padding-top:52px}._siteVariant_1i5vs_46{background:radial-gradient(1200px 700px at 20% -10%,rgba(56,189,248,.25),transparent 60%),radial-gradient(900px 600px at 90% 0%,rgba(45,212,191,.18),transparent 65%),linear-gradient(150deg,#0b1022,#111936);padding:56px 24px 80px}._siteVariant_1i5vs_46 ._title_1i5vs_54{background:none;-webkit-text-fill-color:var(--text-primary);color:var(--text-primary);font-size:clamp(34px,6vw,58px);letter-spacing:-.03em;margin-bottom:0}._siteVariant_1i5vs_46 ._subtitle_1i5vs_63{color:#a6b3d9}._siteVariant_1i5vs_46 ._header_1i5vs_67{width:100%;max-width:1040px;border:1px solid rgba(203,213,255,.2);border-radius:20px;padding:42px 28px;background:#090e208c;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);text-align:left;margin-bottom:20px}._siteVariant_1i5vs_46 ._planCard_1i5vs_79{background:#090e20b3;border-color:#cbd5ff33;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border-radius:16px;padding:22px 20px}._siteVariant_1i5vs_46 ._planCard_1i5vs_79:hover{transform:translateY(-3px);box-shadow:none}._siteVariant_1i5vs_46 ._grid_1i5vs_92{max-width:1040px;gap:12px;grid-template-columns:repeat(3,minmax(0,1fr))}._siteVariant_1i5vs_46 ._planName_1i5vs_98{font-size:22px}._siteVariant_1i5vs_46 ._featureText_1i5vs_102{color:#a6b3d9}._siteVariant_1i5vs_46 ._currentBadge_1i5vs_106{font-size:11px}._siteVariant_1i5vs_46 ._navAction_1i5vs_110,._siteVariant_1i5vs_46 ._backBtn_1i5vs_111{border:1px solid rgba(203,213,255,.2);background:#141d3c99;color:#f6f8ff}._siteVariant_1i5vs_46 ._backBtn_1i5vs_111:hover,._siteVariant_1i5vs_46 ._navAction_1i5vs_110:hover{background:#141d3cd9}._siteVariant_1i5vs_46 ._priceRows_1i5vs_122{border-top-color:#cbd5ff33}._header_1i5vs_67{width:100%;text-align:left;margin-bottom:32px;padding:32px;border-radius:28px;border:1px solid var(--border-default);background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 92%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);box-shadow:var(--plans-shadow)}._headerBar_1i5vs_139{width:100%;display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px}._headerActions_1i5vs_148{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}._title_1i5vs_54{font-size:clamp(38px,5vw,54px);font-weight:800;margin-bottom:16px;background:linear-gradient(135deg,var(--text-primary),color-mix(in srgb,var(--plans-accent) 72%,var(--text-primary)));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:-.04em;line-height:.98}._subtitle_1i5vs_63{max-width:720px;font-size:18px;color:var(--text-secondary);line-height:1.7}._debugMeta_1i5vs_175{margin-top:16px;font-size:13px;color:var(--text-secondary);opacity:.8}._grid_1i5vs_92{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:20px;width:100%}._planCard_1i5vs_79{background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 90%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);border:1px solid var(--border-default);border-radius:22px;padding:28px;display:flex;flex-direction:column;position:relative;overflow:hidden;box-shadow:0 12px 28px #0000001f;transition:transform .24s ease,box-shadow .24s ease,border-color .24s ease,background .24s ease}._clickablePlanCard_1i5vs_204{cursor:pointer}._clickablePlanCard_1i5vs_204:focus-visible{outline:2px solid var(--plans-accent);outline-offset:4px}._planCard_1i5vs_79:hover{transform:translateY(-4px);border-color:var(--plans-accent-border);box-shadow:0 20px 36px #0000002e}._activePlanCard_1i5vs_219{border:1px solid color-mix(in srgb,var(--plans-accent) 38%,var(--border-default));background:linear-gradient(180deg,color-mix(in srgb,var(--plans-accent) 10%,var(--plans-surface-elevated)),color-mix(in srgb,var(--plans-accent) 4%,var(--plans-surface))),var(--plans-surface);box-shadow:0 18px 34px #0000002e,inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 16%,transparent)}._currentBadge_1i5vs_106{position:absolute;top:20px;right:20px;background:color-mix(in srgb,var(--plans-accent) 16%,var(--surface-page));color:var(--plans-accent-strong);font-size:12px;font-weight:700;padding:6px 12px;border-radius:999px;border:1px solid color-mix(in srgb,var(--plans-accent) 26%,transparent);text-transform:uppercase;letter-spacing:.08em}._planName_1i5vs_98{font-size:28px;font-weight:700;color:var(--text-primary);margin-bottom:14px}._priceDisplay_1i5vs_251{margin-bottom:32px;display:flex;align-items:baseline;gap:8px}._priceAmount_1i5vs_258{font-size:56px;font-weight:800;color:var(--text-primary);letter-spacing:-2px;line-height:1}._priceInterval_1i5vs_266{font-size:16px;color:var(--text-secondary);font-weight:500}._callToAction_1i5vs_272{width:100%;padding:14px 18px;border-radius:12px;font-size:15px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:all .2s ease;margin-bottom:0}._primaryCta_1i5vs_284{background:var(--button-primary-bg);border-color:var(--button-primary-border);color:var(--button-primary-text, white)}._primaryCta_1i5vs_284:hover{transform:translateY(-1px);box-shadow:0 10px 22px var(--brand-primary-glow)}._secondaryCta_1i5vs_295{background:var(--button-secondary-bg);color:var(--button-secondary-text);border-color:var(--button-secondary-border)}._secondaryCta_1i5vs_295:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._currentCta_1i5vs_307{background:color-mix(in srgb,var(--plans-accent) 9%,var(--plans-surface-strong));color:var(--text-primary);border-color:color-mix(in srgb,var(--plans-accent) 24%,var(--border-default));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 10%,transparent);cursor:pointer}._currentCta_1i5vs_307:hover{background:color-mix(in srgb,var(--plans-accent) 14%,var(--plans-surface-strong));border-color:color-mix(in srgb,var(--plans-accent) 32%,var(--border-default));transform:translateY(-1px)}._featuresList_1i5vs_321{flex:1;display:flex;flex-direction:column;gap:20px;margin-bottom:28px}._priceRows_1i5vs_122{display:flex;flex-direction:column;gap:10px;margin-top:auto;margin-bottom:16px;border-top:1px solid var(--border-default);padding-top:16px}._priceRow_1i5vs_122{display:flex;align-items:baseline;justify-content:space-between;gap:10px}._priceRowAmount_1i5vs_346{font-size:22px;font-weight:700;color:var(--text-primary)}._priceRowInterval_1i5vs_352{color:var(--text-secondary);font-weight:600}._ctaRow_1i5vs_357{display:grid;grid-template-columns:1fr 1fr;gap:10px}._featureItem_1i5vs_363{display:flex;align-items:flex-start;gap:16px}._featureIcon_1i5vs_369{color:var(--plans-accent);flex-shrink:0;width:20px;height:20px;margin-top:2px}._featureText_1i5vs_102{font-size:16px;line-height:1.5;color:var(--text-primary)}._emptyState_1i5vs_383{text-align:center;padding:64px;background:var(--bg-secondary);border-radius:24px;border:1px dashed var(--border-color, var(--border-primary, rgba(255, 255, 255, .14)));width:100%}._marketingEmptyState_1i5vs_392{max-width:920px;border-style:solid;border-radius:28px;padding:72px 48px;background:radial-gradient(560px 260px at 15% 10%,rgba(34,197,94,.15),transparent 60%),radial-gradient(620px 320px at 85% 0%,rgba(251,191,36,.16),transparent 62%),linear-gradient(145deg,#0f172af5,#111827eb);box-shadow:0 28px 90px #00000047}._marketingEmptyState_1i5vs_392 h2{margin:18px 0 14px;font-size:clamp(32px,4vw,52px);line-height:1.02;letter-spacing:-.04em;color:#f8fafc}._marketingEmptyState_1i5vs_392 p{margin:0 auto;max-width:680px;font-size:18px;line-height:1.7;color:#cbd5e1}._emptyBadge_1i5vs_420{display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;border-radius:999px;background:#f8fafc14;border:1px solid rgba(248,250,252,.18);color:#f8fafc;font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}._emptyHighlights_1i5vs_435{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px}._emptyHighlights_1i5vs_435 span{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:999px;background:#94a3b81f;border:1px solid rgba(148,163,184,.18);color:#e2e8f0;font-size:13px;font-weight:700;letter-spacing:.02em}._loader_1i5vs_457{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:50vh;gap:24px;color:var(--text-secondary)}._spinner_1i5vs_467{animation:_spin_1i5vs_467 1s linear infinite;color:var(--accent-primary, #6366f1)}@keyframes _spin_1i5vs_467{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._backBtn_1i5vs_111{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;cursor:pointer;padding:10px 16px;border-radius:12px;transition:all .2s ease}._backBtn_1i5vs_111:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._navAction_1i5vs_110{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);padding:10px 20px;border-radius:12px;font-weight:600;cursor:pointer;transition:all .2s ease}._navAction_1i5vs_110:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._statusBanner_1i5vs_520{margin-top:24px;padding:12px 24px;border-radius:12px;font-weight:500;font-size:14px}._successBanner_1i5vs_528{background:color-mix(in srgb,var(--status-success) 12%,var(--plans-surface-elevated));color:var(--status-success);border:1px solid color-mix(in srgb,var(--status-success) 24%,transparent)}._infoBanner_1i5vs_534{background:color-mix(in srgb,var(--button-primary-bg) 10%,var(--plans-surface-elevated));color:var(--text-secondary);border:1px solid color-mix(in srgb,var(--button-primary-bg) 18%,transparent)}._errorBanner_1i5vs_540{background:color-mix(in srgb,var(--status-error) 12%,var(--plans-surface-elevated));color:var(--status-error);border:1px solid color-mix(in srgb,var(--status-error) 24%,transparent)}@media(max-width:768px){._plansWrapper_1i5vs_1{padding:28px 14px}._withChrome_1i5vs_42{padding-top:36px}._header_1i5vs_67{margin-bottom:24px;padding:22px 18px}._headerBar_1i5vs_139{gap:10px;flex-wrap:wrap;margin-bottom:18px}._title_1i5vs_54{font-size:34px;margin-bottom:12px}._grid_1i5vs_92{grid-template-columns:1fr;gap:18px}._siteVariant_1i5vs_46 ._grid_1i5vs_92{grid-template-columns:1fr}._siteVariant_1i5vs_46 ._header_1i5vs_67{padding:26px 18px}._planCard_1i5vs_79{padding:22px}._marketingEmptyState_1i5vs_392{padding:56px 24px}._marketingEmptyState_1i5vs_392 h2{font-size:34px}._marketingEmptyState_1i5vs_392 p{font-size:16px}._headerActions_1i5vs_148{width:100%;justify-content:flex-start}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as i,j as t}from"./vendor-react-CKJs5o3c.js";import{t as ke,y as Ee,z as te,B as ne,C as we,E as xe}from"./index-DXUdtH1B.js";import{aK as Ie,h as Ne,U as Pe}from"./vendor-icons-I7ZwG1z_.js";import{u as je,a as Re}from"./vendor-router-BbWMxlnO.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";const Te="_plansWrapper_1i5vs_1",Be="_contentFrame_1i5vs_28",Ue="_shellOwnsScroll_1i5vs_36",$e="_withChrome_1i5vs_42",Oe="_siteVariant_1i5vs_46",Ae="_title_1i5vs_54",Me="_subtitle_1i5vs_63",Le="_header_1i5vs_67",Fe="_planCard_1i5vs_79",De="_grid_1i5vs_92",Ke="_planName_1i5vs_98",Ve="_featureText_1i5vs_102",He="_currentBadge_1i5vs_106",Ye="_navAction_1i5vs_110",Ge="_backBtn_1i5vs_111",qe="_priceRows_1i5vs_122",ze="_headerBar_1i5vs_139",We="_headerActions_1i5vs_148",Xe="_debugMeta_1i5vs_175",Qe="_clickablePlanCard_1i5vs_204",Je="_activePlanCard_1i5vs_219",Ze="_callToAction_1i5vs_272",et="_primaryCta_1i5vs_284",tt="_secondaryCta_1i5vs_295",nt="_currentCta_1i5vs_307",rt="_featuresList_1i5vs_321",st="_priceRow_1i5vs_122",at="_priceRowAmount_1i5vs_346",it="_priceRowInterval_1i5vs_352",ot="_ctaRow_1i5vs_357",ct="_featureItem_1i5vs_363",lt="_featureIcon_1i5vs_369",ut="_emptyState_1i5vs_383",dt="_marketingEmptyState_1i5vs_392",mt="_emptyBadge_1i5vs_420",pt="_emptyHighlights_1i5vs_435",gt="_loader_1i5vs_457",ft="_spinner_1i5vs_467",ht="_statusBanner_1i5vs_520",St="_successBanner_1i5vs_528",yt="_infoBanner_1i5vs_534",_t="_errorBanner_1i5vs_540",n={plansWrapper:Te,contentFrame:Be,shellOwnsScroll:Ue,withChrome:$e,siteVariant:Oe,title:Ae,subtitle:Me,header:Le,planCard:Fe,grid:De,planName:Ke,featureText:Ve,currentBadge:He,navAction:Ye,backBtn:Ge,priceRows:qe,headerBar:ze,headerActions:We,debugMeta:Xe,clickablePlanCard:Qe,activePlanCard:Je,callToAction:Ze,primaryCta:et,secondaryCta:tt,currentCta:nt,featuresList:rt,priceRow:st,priceRowAmount:at,priceRowInterval:it,ctaRow:ot,featureItem:ct,featureIcon:lt,emptyState:ut,marketingEmptyState:dt,emptyBadge:mt,emptyHighlights:pt,loader:gt,spinner:ft,statusBanner:ht,successBanner:St,infoBanner:yt,errorBanner:_t};function Ct(){const r=globalThis.__DEBUG_MODE__;return typeof r=="boolean"?r:!1}function vt(r){const o=String(r?.environment||"").trim(),f=String(r?.runtimeMode||"").trim();return!o&&!f?null:o&&f?`${o} (${f})`:o||f||null}function bt(r,o){if(r==null||!o)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:o.toUpperCase(),minimumFractionDigits:0}).format(r/100)}catch{return`${o.toUpperCase()} ${r/100}`}}function kt(){return"$0.00"}function he(r){return r?r.pricingType==="free"?!0:r.unitAmount!=null&&r.currency!=null:!1}function Se(r){return r?r.pricingType==="free"?kt():bt(r.unitAmount,r.currency):"Unavailable"}function ye(r){const o=[r.pricing.month,r.pricing.year].filter(Boolean);if(o.some(h=>h.pricingType==="free"))return 0;const f=o.map(h=>h.pricingType==="stripe"&&typeof h.unitAmount=="number"?h.unitAmount:null).filter(h=>h!=null);return f.length>0?Math.min(...f):Number.POSITIVE_INFINITY}function Et(r){const o=String(r||"").trim().toLowerCase();return o==="active"||o==="trialing"||o==="grace"}function wt({heading:r,subtitle:o,variant:f="app",chrome:h,footer:$,isAuthenticated:O,authSessionResolved:le=!0,currentPlanId:W,currentPlanVersionId:F,currentEntitlementState:X,canManageCurrentPlan:v=!0,pricingEndpoint:re,statusBanner:A,onBack:k,backLabel:Q,backDisabled:_=!1,topActions:S,shellOwnsScroll:p=!1,showPageBackButton:J=!0,fallbackPricingSource:D=null,onSelectPlan:x}){const[se,u]=i.useState([]),[K,N]=i.useState(null),[T,B]=i.useState(!0),[M,ae]=i.useState(null),[V,ie]=i.useState(0);i.useEffect(()=>{let a=!0;return(async()=>{const b=String(re||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";a&&(B(!0),ae(null));try{const C=await fetch(b,{method:"GET",credentials:"include"}),c=await C.json().catch(()=>({}));if(C.ok){a&&(u(Array.isArray(c?.plans)?c.plans:[]),N(c?.pricingSource&&typeof c.pricingSource=="object"?c.pricingSource:null));return}throw new Error(String(c?.error||`Failed to load pricing (${C.status})`))}catch(C){if(a){const c=C instanceof Error?C.message:"Failed to load pricing";ae(c||"Failed to load pricing"),N(null)}}finally{a&&B(!1)}})(),()=>{a=!1}},[re,V]);const H=i.useMemo(()=>[...se].sort((a,l)=>{const b=ye(a),C=ye(l);if(b!==C)return b-C;const c=a.defaultVersion?.versionNumber||0,m=l.defaultVersion?.versionNumber||0;return c!==m?c-m:String(a.displayName||a.planId).localeCompare(String(l.displayName||l.planId))}),[se]),E=i.useMemo(()=>vt(K||D),[D,K]),Y=`${n.plansWrapper} ${p?n.shellOwnsScroll:"tf-scrollbar"} ${f==="site"?n.siteVariant:""} ${h?n.withChrome:""}`.trim(),Z=a=>p?t.jsxs(t.Fragment,{children:[h,a,$]}):t.jsxs("div",{className:ke.standaloneWrapper,"data-theme":"dark",children:[h,a,$]});return Z(T||!le?t.jsx(t.Fragment,{children:t.jsx("div",{className:Y,children:t.jsx("div",{className:n.contentFrame,children:t.jsxs("div",{className:n.loader,children:[t.jsx(Ne,{size:48,className:n.spinner}),t.jsx("p",{children:"Loading plans..."})]})})})}):M?t.jsx(t.Fragment,{children:t.jsx("div",{className:Y,children:t.jsx("div",{className:n.contentFrame,children:t.jsxs("div",{className:n.emptyState,children:[t.jsx("h2",{children:"Connecting to plan pricing..."}),t.jsx("p",{children:M}),t.jsx("button",{className:n.backBtn,onClick:()=>ie(a=>a+1),children:"Retry"})]})})})}):t.jsx(t.Fragment,{children:t.jsx("div",{className:Y,children:t.jsxs("div",{className:n.contentFrame,children:[t.jsxs("div",{className:n.header,children:[!h&&(J||S)&&t.jsxs("div",{className:n.headerBar,children:[t.jsx("div",{children:J?t.jsx("button",{className:n.backBtn,onClick:k,disabled:_,children:Q}):null}),t.jsx("div",{className:n.headerActions,children:S})]}),t.jsx("h1",{className:n.title,children:r}),o&&t.jsx("p",{className:n.subtitle,children:o}),Ct()&&E?t.jsxs("p",{className:n.debugMeta,children:["Pricing source: ",E]}):null,A&&t.jsx("div",{className:`${n.statusBanner} ${A.type==="success"?n.successBanner:A.type==="info"?n.infoBanner:n.errorBanner}`,children:A.message})]}),H.length===0?t.jsxs("div",{className:`${n.emptyState} ${n.marketingEmptyState}`,children:[t.jsx("span",{className:n.emptyBadge,children:"Coming Soon"}),t.jsx("h2",{children:"Paid plans are getting their final polish."}),t.jsx("p",{children:"Taskforce pricing is on the way with flexible options for solo operators, teams, and larger rollouts. Check back soon for launch tiers, feature bundles, and early access details."}),t.jsxs("div",{className:n.emptyHighlights,"aria-label":"Upcoming pricing highlights",children:[t.jsx("span",{children:"Launch-ready tiers"}),t.jsx("span",{children:"Team billing controls"}),t.jsx("span",{children:"Feature-based packaging"})]})]}):t.jsx("div",{className:n.grid,children:H.map(a=>{const l=a.pricing.month,b=a.pricing.year,C=he(l),c=he(b),m=String(a.defaultVersion?.planVersionId||"").trim(),I=!!(m&&F&&F===m&&Et(X))||!F&&!!(W&&W===a.planId),w=C?"month":c?"year":null,y=w==="year"?b:l,P=!!m&&(I?v:!!w),ee=()=>{if(m){if(I){if(!v)return;x({planId:a.planId,planVersionId:m,interval:w||"month",pricingType:y?.pricingType||"stripe",isCurrentPlan:!0});return}w&&x({planId:a.planId,planVersionId:m,interval:w,pricingType:y?.pricingType||"stripe",isCurrentPlan:!1})}};return t.jsxs("div",{className:`${n.planCard} ${I?n.activePlanCard:""} ${P?n.clickablePlanCard:""}`,"data-testid":`plan-card-${a.planId}`,role:P?"button":void 0,tabIndex:P?0:void 0,onClick:P?ee:void 0,onKeyDown:P?g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),ee())}:void 0,children:[I&&t.jsx("span",{className:n.currentBadge,children:"Current Plan"}),t.jsx("h3",{className:n.planName,children:a.displayName}),t.jsx("div",{className:n.featuresList,children:Array.isArray(a.features)&&a.features.length>0?a.features.map((g,oe)=>t.jsxs("div",{className:n.featureItem,children:[t.jsx(Ie,{className:n.featureIcon}),t.jsx("span",{className:n.featureText,children:String(g.featureKey||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,G=>G.toUpperCase())})]},`${g.featureKey}-${oe}`)):t.jsx("span",{className:n.featureText,children:"No additional features included"})}),t.jsxs("div",{className:n.priceRows,children:[t.jsxs("div",{className:n.priceRow,children:[t.jsx("span",{className:n.priceRowAmount,children:Se(l)}),t.jsx("span",{className:n.priceRowInterval,children:"/ month"})]}),t.jsxs("div",{className:n.priceRow,children:[t.jsx("span",{className:n.priceRowAmount,children:Se(b)}),t.jsx("span",{className:n.priceRowInterval,children:"/ year"})]})]}),I?t.jsx("button",{className:`${n.callToAction} ${n.currentCta}`,"data-testid":`plan-manage-${a.planId}`,onClick:g=>{g.stopPropagation(),v&&x({planId:a.planId,planVersionId:m,interval:w||"month",pricingType:y?.pricingType||"stripe",isCurrentPlan:!0})},disabled:!m||!v,children:O&&v?"Manage Plan":"Current Plan"}):t.jsxs("div",{className:n.ctaRow,children:[t.jsx("button",{className:`${n.callToAction} ${n.secondaryCta}`,"data-testid":`plan-select-${a.planId}-month`,onClick:g=>{g.stopPropagation(),x({planId:a.planId,planVersionId:m,interval:"month",pricingType:l?.pricingType||"stripe",isCurrentPlan:!1})},disabled:!m||!C,children:l?.pricingType==="free"?O?"Select Free":"Get Started Free":O?"Choose Monthly":"Get Started Monthly"}),t.jsx("button",{className:`${n.callToAction} ${n.primaryCta}`,"data-testid":`plan-select-${a.planId}-year`,onClick:g=>{g.stopPropagation(),x({planId:a.planId,planVersionId:m,interval:"year",pricingType:b?.pricingType||"stripe",isCurrentPlan:!1})},disabled:!m||!c,children:b?.pricingType==="free"?O?"Select Free":"Get Started Free":O?"Choose Yearly":"Get Started Yearly"})]})]},a.planId)})})]})})}))}const xt=1600,ce=new Set(["active","trialing","grace"]),R={planSelectionRequired:"Choose a plan to continue.",checkoutPending:"Complete checkout to continue.",misconfigured:"Onboarding policy is misconfigured. Contact support or a system administrator.",missingEntitlement:"No entitlement is linked to this account."},z={CHECKOUT_SESSION_EXPIRED:"Your previous checkout expired. Choose a plan to continue.",CHECKOUT_SESSION_SUPERSEDED:"A newer checkout replaced your previous checkout. Choose a plan to continue."};function It(r){return r==="year"?"year":"month"}function _e(r){const o=String(r||"").trim();return o?o.replace(/\/+$/,""):""}function de(r={}){const o=new URLSearchParams;o.set("screen","plans");for(const[f,h]of Object.entries(r)){const $=String(h||"").trim();$&&o.set(f,$)}return`/?${o.toString()}`}function Ut({isAuthenticated:r,authUserId:o,runtimeMode:f,authSessionResolved:h,currentTheme:$="dark",projectName:O,currentWorkspaceId:le,apiBaseUrl:W,connectedEnvironmentSource:F,resolveCloudAuthUrl:X,embedded:v=!1,shellOwnsScroll:re=!1,onAccountProfileSummaryChange:A,onContinueToTaskforce:k,continueBusy:Q=!1}){const _=je(),S=Re(),[p,J]=i.useState(null),[D,x]=i.useState(!1),[se,u]=i.useState(null),K=i.useRef(!1),N=i.useRef(null),T=i.useMemo(()=>new URLSearchParams(S.search),[S.search]),B=String(T.get("checkout")||"").trim().toLowerCase(),M=String(T.get("gate")||"").trim().toLowerCase(),ae=String(T.get("planId")||"").trim(),V=String(T.get("planVersionId")||"").trim(),ie=It(T.get("interval")),H=String(T.get("session_id")||"").trim(),E=i.useMemo(()=>_e(W),[W]),Y=i.useMemo(()=>_e(F),[F]),Z=i.useMemo(()=>({environment:Ee(Y||E),runtimeMode:f==="cloud"?"cloud":"local"}),[E,Y,f]),a=i.useCallback(e=>{const s=String(e||"").trim();return E?`${E}${s.startsWith("/")?s:`/${s}`}`:s},[E]),l=i.useCallback(e=>X?X(e):a(e),[a,X]),b=i.useCallback(()=>{const e=new URLSearchParams(S.search);e.delete("screen"),e.delete("gate"),e.delete("checkout"),e.delete("planId"),e.delete("planVersionId"),e.delete("interval");const s=e.toString();_(`/${s?`?${s}`:""}${S.hash||""}`)},[S.hash,S.search,_]),C=i.useMemo(()=>[E?`${E}/api/taskforce/public/pricing`:"","/api/taskforce/public/pricing"].map(s=>String(s||"").trim()).filter((s,d,j)=>s&&j.indexOf(s)===d),[E]),c=i.useMemo(()=>{const e=String(p?.entitlementState||"").trim().toLowerCase();return ce.has(e)},[p?.entitlementState]),m=i.useMemo(()=>{if(c)return null;const e=String(p?.billingConflictCode||"").trim().toUpperCase();if(e==="CHECKOUT_SESSION_EXPIRED")return z.CHECKOUT_SESSION_EXPIRED;if(e==="CHECKOUT_SESSION_SUPERSEDED")return z.CHECKOUT_SESSION_SUPERSEDED;const s=String(p?.message||"").trim();if(s)return s;const d=String(p?.gate||M||"").trim().toLowerCase();return d==="plan_selection_required"?R.planSelectionRequired:d==="checkout_pending"?R.checkoutPending:d==="misconfigured"?R.misconfigured:d==="missing_entitlement"?R.missingEntitlement:null},[p?.billingConflictCode,p?.gate,p?.message,M,c]),I=i.useCallback(()=>{const e=new URLSearchParams(S.search);e.delete("checkout"),e.delete("session_id"),e.delete("gate"),e.delete("planId"),e.delete("planVersionId"),e.delete("interval");const s=e.toString();_(`${S.pathname}${s?`?${s}`:""}${S.hash||""}`,{replace:!0})},[S.hash,S.pathname,S.search,_]),w=i.useCallback(()=>{N.current!=null&&window.clearTimeout(N.current),N.current=window.setTimeout(()=>{I(),N.current=null},xt)},[I]),y=i.useCallback(async e=>{const s=l(te);if(!r)return J(null),ne(s,{identityKey:o}),null;try{const d=await we(s,{identityKey:o,force:e?.force===!0});return J(d),A?.(d),d}catch{return null}},[o,l,r,A]),P=i.useCallback((e,s)=>{const d=String(e?.billingConflictCode||"").trim().toUpperCase();if(d==="CHECKOUT_SESSION_EXPIRED")return z.CHECKOUT_SESSION_EXPIRED;if(d==="CHECKOUT_SESSION_SUPERSEDED")return z.CHECKOUT_SESSION_SUPERSEDED;const j=String(e?.message||"").trim();return j||String(s||"Unable to confirm checkout completion.").trim()||"Unable to confirm checkout completion."},[]),ee=i.useCallback(e=>{const s=String(e||"").trim();return s===R.planSelectionRequired||s===R.checkoutPending?"info":"error"},[]),g=i.useCallback(async(e,s)=>{if(!e){u({type:"error",message:"Selected plan is missing a default plan version."});return}const d=c;x(!0),u(null);try{const j=await fetch(l("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:e,interval:s})}),U=await j.json().catch(()=>({}));if(!j.ok){u({type:"error",message:String(U?.error||"Unable to start checkout for selected plan.")});return}const ue=String(U?.checkoutState||"").trim().toLowerCase();if(ue==="free"){u({type:"success",message:"Plan selected. Your access is ready."}),ne(l(te),{identityKey:o});const L=await y({force:!0}),q=String(L?.entitlementState||"").trim().toLowerCase();!d&&ce.has(q)&&await k?.();return}if(ue==="updated"){u({type:"success",message:String(U?.message||"Your subscription was updated successfully.")}),ne(l(te),{identityKey:o});const L=await y({force:!0}),q=String(L?.entitlementState||"").trim().toLowerCase();!d&&ce.has(q)&&await k?.();return}if(ue==="already_current_plan"){u({type:"success",message:String(U?.message||"You are already on this plan.")}),ne(l(te),{identityKey:o}),await y();return}const ge=String(U?.returnBaseUrl||"").trim();if(f==="local"&&ge)try{const L=window.location.origin,q=new URL(ge,L).origin;if(q!==L){u({type:"error",message:`Checkout return is misconfigured for this runtime. Expected ${L} but got ${q}.`});return}}catch{u({type:"error",message:"Checkout return URL is invalid for this runtime."});return}const fe=String(U?.url||"").trim();if(!fe){u({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(fe)}catch{u({type:"error",message:"Unable to start checkout for selected plan."})}finally{x(!1)}},[o,l,c,y,k,f]),oe=i.useCallback(async e=>{if(!e)return{confirmed:!1,errorMessage:"Checkout session is missing."};try{const s=await fetch(l("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:e})}),d=await s.json().catch(()=>({}));if(!s.ok)return{confirmed:!1,errorMessage:String(d?.error||"Unable to confirm checkout completion.")};ne(l(te),{identityKey:o});const j=await y({force:!0}),U=String(j?.entitlementState||"").trim().toLowerCase();return ce.has(U)&&await k?.(),{confirmed:!0}}catch{return{confirmed:!1,errorMessage:"Unable to confirm checkout completion."}}},[o,l,y,k]),G=i.useCallback(async()=>{if(!r){_(`/login?mode=login&next=${encodeURIComponent(de())}`);return}x(!0),u(null);try{const e=await fetch(l("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),s=await e.json().catch(()=>({}));if(!e.ok){u({type:"error",message:String(s?.error||"Failed to open billing portal.")});return}const d=String(s?.url||"").trim();if(!d){u({type:"error",message:"Portal session did not return a redirect URL."});return}window.location.assign(d)}catch{u({type:"error",message:"Failed to open billing portal."})}finally{x(!1)}},[l,r,_]);i.useEffect(()=>{y()},[y]),i.useEffect(()=>{c&&M==="missing_entitlement"&&I()},[I,M,c]),i.useEffect(()=>()=>{N.current!=null&&window.clearTimeout(N.current)},[]),i.useEffect(()=>{if(B==="success"){K.current=!0,u({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),(async()=>{const e=H?await oe(H):{confirmed:!1,errorMessage:"Checkout session is missing."};if(!e.confirmed){const s=await y({force:!0});u({type:"error",message:P(s,e.errorMessage)}),w();return}u({type:"success",message:"Checkout completed successfully."}),w()})();return}if(B==="cancel"){(async()=>{const e=await y({force:!0});u({type:"error",message:P(e,"Checkout was canceled. No charge was made.")}),w()})();return}if((B==="start"||B==="free")&&r&&V&&!K.current){K.current=!0,g(V,ie);return}if(m){u({type:ee(m),message:m});return}u(e=>!e||e.type!=="error"?e:e.message===R.planSelectionRequired||e.message===R.misconfigured||e.message===R.missingEntitlement||e.message===z.CHECKOUT_SESSION_EXPIRED||e.message===z.CHECKOUT_SESSION_SUPERSEDED?null:e)},[B,oe,m,r,y,ie,V,H,ee,P,w,g]);const Ce=i.useCallback(async e=>{if(!r){const s=e.pricingType==="free"?"free":"start",d=de({checkout:s,planId:e.planId,planVersionId:e.planVersionId,interval:e.interval});_(`/login?mode=register&planId=${encodeURIComponent(e.planId)}&planVersionId=${encodeURIComponent(e.planVersionId)}&interval=${encodeURIComponent(e.interval)}&next=${encodeURIComponent(d)}`);return}if(e.isCurrentPlan){if(!p?.stripeCustomerId){u({type:"success",message:"Your current plan does not use Stripe billing."});return}await G();return}if(e.pricingType==="free"){await g(e.planVersionId,e.interval);return}await g(e.planVersionId,e.interval)},[r,_,G,g]),me=i.useCallback(()=>{if(c&&k){k();return}if(v){b();return}if(window.history.length>1){_(-1);return}_("/")},[b,v,c,_,k]),ve=c&&k?t.jsx("button",{className:n.navAction,onClick:()=>{k()},disabled:Q||D,children:"Take Me to Taskforce"}):null,pe=v?t.jsxs(t.Fragment,{children:[ve,r&&p?.stripeCustomerId&&t.jsx("button",{className:n.navAction,onClick:()=>{G()},disabled:D,children:"Manage billing"})]}):t.jsxs(t.Fragment,{children:[t.jsx("button",{className:n.navAction,onClick:me,disabled:Q||r&&!c,children:c?"Take Me to Taskforce":"Back"}),r&&p?.stripeCustomerId&&t.jsx("button",{className:n.navAction,onClick:()=>{G()},disabled:D,children:"Manage billing"}),!r&&t.jsxs("button",{className:n.navAction,onClick:()=>_(`/login?mode=login&next=${encodeURIComponent(de())}`),children:[t.jsx(Pe,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),be=v?null:t.jsx(xe,{projectName:O,currentWorkspaceId:le,runtimeMode:f==="cloud"?"cloud":"local",theme:$,actions:pe});return t.jsx(wt,{chrome:be,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",isAuthenticated:r,authSessionResolved:h,currentPlanId:String(p?.planId||ae||"").trim()||null,currentPlanVersionId:String(p?.planVersionId||V||"").trim()||null,currentEntitlementState:String(p?.entitlementState||"").trim()||null,canManageCurrentPlan:!!p?.stripeCustomerId,pricingEndpoint:C[0],statusBanner:se,onBack:me,backLabel:c?"Take Me to Taskforce":v?"Back to Board":"Back to App",backDisabled:Q||r&&!c,topActions:v?pe:null,shellOwnsScroll:re,showPageBackButton:!v,fallbackPricingSource:Z,onSelectPlan:Ce})}export{Ut as PlansPage};
|