@pstdio/workbench 0.44.0 → 0.45.0-nightly.20261020145025

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.
@@ -1,5 +1,5 @@
1
- import { g as e, t } from "./workbench-renderers-Bz_dLyHW.js";
2
- import { V as n, a as r, c as i, o as a, pt as o, s } from "./react-C-HbdPSw.js";
1
+ import { h as e, t } from "./workbench-renderers-B1Qp-9yW.js";
2
+ import { H as n, a as r, c as i, o as a, s as o, yt as s } from "./react-QSItpi3d.js";
3
3
  import { resourceKey as c } from "@pstdio/sdk/extensions";
4
4
  import { c as l } from "react/compiler-runtime";
5
5
  import { Box as u, Button as d, Center as f, Flex as p, Image as m, Spinner as h, Text as g } from "@chakra-ui/react";
@@ -424,7 +424,7 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
424
424
  if (!n?.position || c(n.resource) !== c(t)) return;
425
425
  let r = Object.values(e.pages).find((e) => e.ref.id === n.page.id && e.ref.extensionId === n.page.extensionId)?.document?.metadataKey;
426
426
  if (r && n.resource?.metadata?.[r] === t?.metadata?.[r]) return n.position;
427
- }, n[0] = t, n[1] = r), o(e.pages.store, r);
427
+ }, n[0] = t, n[1] = r), s(e.pages.store, r);
428
428
  }, me = (e) => {
429
429
  let t = l(3), { file: n } = e, r;
430
430
  return t[0] !== n.fileName || t[1] !== n.filePath ? (r = n.filePath ? /* @__PURE__ */ E(B, {
@@ -436,19 +436,19 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
436
436
  n,
437
437
  r
438
438
  ]), V = (e) => {
439
- let o = l(72), { workbench: m, contribution: _ } = e, v = e.placement?.resource, y = pe(m, v), b, x;
440
- o[0] !== v || o[1] !== m ? (b = j(v), x = fe(m, b), o[0] = v, o[1] = m, o[2] = b, o[3] = x) : (b = o[2], x = o[3]);
439
+ let s = l(72), { workbench: m, contribution: _ } = e, v = e.placement?.resource, y = pe(m, v), b, x;
440
+ s[0] !== v || s[1] !== m ? (b = j(v), x = fe(m, b), s[0] = v, s[1] = m, s[2] = b, s[3] = x) : (b = s[2], x = s[3]);
441
441
  let ee = x, O = n(m, e.placement), k = se({
442
442
  fileRendererId: _.id,
443
443
  resource: v,
444
444
  pageParams: O
445
445
  }), [A, M] = T(null), [ne, N] = T(null), P;
446
- o[4] === Symbol.for("react.memo_cache_sentinel") ? (P = {
446
+ s[4] === Symbol.for("react.memo_cache_sentinel") ? (P = {
447
447
  dirty: !1,
448
448
  saving: !1
449
- }, o[4] = P) : P = o[4];
449
+ }, s[4] = P) : P = s[4];
450
450
  let [F, I] = T(P), L = w(null), R = w(void 0), re = w(null), z = w(null), B, V;
451
- o[5] !== v || o[6] !== b || o[7] !== m ? (B = () => {
451
+ s[5] !== v || s[6] !== b || s[7] !== m ? (B = () => {
452
452
  let e = z.current, n = e && t(m).getTreeRenderer(e.treeId) ? t(m).getTreeState(e.treeId).selectedNodeId : void 0;
453
453
  te({
454
454
  previous: e,
@@ -464,14 +464,14 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
464
464
  v,
465
465
  b,
466
466
  m
467
- ], o[5] = v, o[6] = b, o[7] = m, o[8] = B, o[9] = V) : (B = o[8], V = o[9]), S(B, V);
467
+ ], s[5] = v, s[6] = b, s[7] = m, s[8] = B, s[9] = V) : (B = s[8], V = s[9]), S(B, V);
468
468
  let _e = w(_), H = w(v), ve = w(O), ye = w(e.placement), be;
469
- o[10] !== _ || o[11] !== O || o[12] !== e.placement || o[13] !== v ? (be = () => {
469
+ s[10] !== _ || s[11] !== O || s[12] !== e.placement || s[13] !== v ? (be = () => {
470
470
  _e.current = _, H.current = v, ve.current = O, ye.current = e.placement;
471
- }, o[10] = _, o[11] = O, o[12] = e.placement, o[13] = v, o[14] = be) : be = o[14], S(be);
471
+ }, s[10] = _, s[11] = O, s[12] = e.placement, s[13] = v, s[14] = be) : be = s[14], S(be);
472
472
  let U = _.id, W = !!_.save, G = he(e.placement, U, k), K = e.placement?.instanceId ?? U, xe;
473
- o[15] !== U || o[16] !== W || o[17] !== K || o[18] !== k || o[19] !== G || o[20] !== I || o[21] !== N || o[22] !== M || o[23] !== m ? (xe = () => {
474
- let e = !1, n = !1, o = H.current, l = _e.current, u = m.views.reads.bind(G), d = null;
473
+ s[15] !== U || s[16] !== W || s[17] !== K || s[18] !== k || s[19] !== G || s[20] !== I || s[21] !== N || s[22] !== M || s[23] !== m ? (xe = () => {
474
+ let e = !1, n = !1, s = H.current, l = _e.current, u = m.views.reads.bind(G), d = null;
475
475
  N(null);
476
476
  let f = a(k), p = f;
477
477
  M(f ? {
@@ -509,7 +509,7 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
509
509
  e || I(t);
510
510
  },
511
511
  save: async (e, t) => {
512
- let r = await s(l, o, e, t, p);
512
+ let r = await o(l, s, e, t, p);
513
513
  return p = r.content, p && !n && i(k, p), r.result;
514
514
  }
515
515
  }) : null, L.current = d, f && L.current?.setBaseline(f.content, f.revision), I({
@@ -529,33 +529,33 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
529
529
  return () => {
530
530
  e = !0, u.dispose(), R.current = void 0, _.dispose(), g.dispose(), d?.flush(), L.current === d && (L.current = null);
531
531
  };
532
- }, o[15] = U, o[16] = W, o[17] = K, o[18] = k, o[19] = G, o[20] = I, o[21] = N, o[22] = M, o[23] = m, o[24] = xe) : xe = o[24];
532
+ }, s[15] = U, s[16] = W, s[17] = K, s[18] = k, s[19] = G, s[20] = I, s[21] = N, s[22] = M, s[23] = m, s[24] = xe) : xe = s[24];
533
533
  let Se;
534
- o[25] !== U || o[26] !== W || o[27] !== K || o[28] !== k || o[29] !== G || o[30] !== m ? (Se = [
534
+ s[25] !== U || s[26] !== W || s[27] !== K || s[28] !== k || s[29] !== G || s[30] !== m ? (Se = [
535
535
  U,
536
536
  W,
537
537
  m,
538
538
  k,
539
539
  G,
540
540
  K
541
- ], o[25] = U, o[26] = W, o[27] = K, o[28] = k, o[29] = G, o[30] = m, o[31] = Se) : Se = o[31], S(xe, Se);
541
+ ], s[25] = U, s[26] = W, s[27] = K, s[28] = k, s[29] = G, s[30] = m, s[31] = Se) : Se = s[31], S(xe, Se);
542
542
  let Ce, we;
543
- o[32] === Symbol.for("react.memo_cache_sentinel") ? (Ce = () => {
543
+ s[32] === Symbol.for("react.memo_cache_sentinel") ? (Ce = () => {
544
544
  let e = () => L.current?.flush(), t = () => {
545
545
  document.visibilityState === "hidden" && e();
546
546
  };
547
547
  return window.addEventListener("beforeunload", e), document.addEventListener("visibilitychange", t), () => {
548
548
  window.removeEventListener("beforeunload", e), document.removeEventListener("visibilitychange", t);
549
549
  };
550
- }, we = [], o[32] = Ce, o[33] = we) : (Ce = o[32], we = o[33]), S(Ce, we);
550
+ }, we = [], s[32] = Ce, s[33] = we) : (Ce = s[32], we = s[33]), S(Ce, we);
551
551
  let Te;
552
- o[34] === Symbol.for("react.memo_cache_sentinel") ? (Te = (e) => {
552
+ s[34] === Symbol.for("react.memo_cache_sentinel") ? (Te = (e) => {
553
553
  L.current?.handleChange(e);
554
- }, o[34] = Te) : Te = o[34];
554
+ }, s[34] = Te) : Te = s[34];
555
555
  let Ee = Te, De;
556
- o[35] !== k || o[36] !== A ? (De = ce(A, k) ? A : null, o[35] = k, o[36] = A, o[37] = De) : De = o[37];
556
+ s[35] !== k || s[36] !== A ? (De = ce(A, k) ? A : null, s[35] = k, s[36] = A, s[37] = De) : De = s[37];
557
557
  let q = De, Oe = q ? `${q.loadKey}:${q.editorRevision}` : "", J, ke;
558
- o[38] !== Oe || o[39] !== b ? (J = () => {
558
+ s[38] !== Oe || s[39] !== b ? (J = () => {
559
559
  if (!Oe || b) return;
560
560
  let e = re.current;
561
561
  e && requestAnimationFrame(() => {
@@ -569,23 +569,23 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
569
569
  ].includes(e) && t.scrollHeight > t.clientHeight && (t.scrollTop = 0), t = t.parentElement;
570
570
  }
571
571
  });
572
- }, ke = [Oe, b], o[38] = Oe, o[39] = b, o[40] = J, o[41] = ke) : (J = o[40], ke = o[41]), C(J, ke);
572
+ }, ke = [Oe, b], s[38] = Oe, s[39] = b, s[40] = J, s[41] = ke) : (J = s[40], ke = s[41]), C(J, ke);
573
573
  let Y = ne?.loadKey === k ? ne.message : void 0;
574
574
  if (Y && !q) {
575
575
  let e;
576
- o[42] === Y ? e = o[43] : (e = /* @__PURE__ */ E(g, {
576
+ s[42] === Y ? e = s[43] : (e = /* @__PURE__ */ E(g, {
577
577
  color: "fg.muted",
578
578
  children: Y
579
- }), o[42] = Y, o[43] = e);
579
+ }), s[42] = Y, s[43] = e);
580
580
  let t;
581
- o[44] === Symbol.for("react.memo_cache_sentinel") ? (t = /* @__PURE__ */ E(d, {
581
+ s[44] === Symbol.for("react.memo_cache_sentinel") ? (t = /* @__PURE__ */ E(d, {
582
582
  size: "xs",
583
583
  variant: "subtle",
584
584
  onClick: () => R.current?.(),
585
585
  children: "Retry"
586
- }), o[44] = t) : t = o[44];
586
+ }), s[44] = t) : t = s[44];
587
587
  let n;
588
- return o[45] === e ? n = o[46] : (n = /* @__PURE__ */ D(f, {
588
+ return s[45] === e ? n = s[46] : (n = /* @__PURE__ */ D(f, {
589
589
  h: "full",
590
590
  minH: "0",
591
591
  bg: "bg",
@@ -593,48 +593,48 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
593
593
  flexDirection: "column",
594
594
  gap: "sm",
595
595
  children: [e, t]
596
- }), o[45] = e, o[46] = n), n;
596
+ }), s[45] = e, s[46] = n), n;
597
597
  }
598
598
  if (!q) {
599
599
  let e;
600
- return o[47] === Symbol.for("react.memo_cache_sentinel") ? (e = /* @__PURE__ */ E(f, {
600
+ return s[47] === Symbol.for("react.memo_cache_sentinel") ? (e = /* @__PURE__ */ E(f, {
601
601
  h: "full",
602
602
  minH: "0",
603
603
  bg: "bg",
604
604
  children: /* @__PURE__ */ E(h, { size: "sm" })
605
- }), o[47] = e) : e = o[47], e;
605
+ }), s[47] = e) : e = s[47], e;
606
606
  }
607
607
  let Ae = `${q.loadKey}:${q.editorRevision}`, X = null;
608
608
  if (F.removed) {
609
609
  let e;
610
- o[48] === Symbol.for("react.memo_cache_sentinel") ? (e = /* @__PURE__ */ E(oe, { message: "This resource was removed. Your draft is kept here. Copy it before closing this tab." }), o[48] = e) : e = o[48], X = e;
610
+ s[48] === Symbol.for("react.memo_cache_sentinel") ? (e = /* @__PURE__ */ E(oe, { message: "This resource was removed. Your draft is kept here. Copy it before closing this tab." }), s[48] = e) : e = s[48], X = e;
611
611
  } else if (Y) {
612
612
  let e;
613
- o[49] === Symbol.for("react.memo_cache_sentinel") ? (e = () => R.current?.(), o[49] = e) : e = o[49];
613
+ s[49] === Symbol.for("react.memo_cache_sentinel") ? (e = () => R.current?.(), s[49] = e) : e = s[49];
614
614
  let t;
615
- o[50] === Y ? t = o[51] : (t = /* @__PURE__ */ E(oe, {
615
+ s[50] === Y ? t = s[51] : (t = /* @__PURE__ */ E(oe, {
616
616
  message: Y,
617
617
  onRetry: e
618
- }), o[50] = Y, o[51] = t), X = t;
618
+ }), s[50] = Y, s[51] = t), X = t;
619
619
  } else if (F.saveError) {
620
620
  let e;
621
- o[52] === Symbol.for("react.memo_cache_sentinel") ? (e = () => L.current?.retry(), o[52] = e) : e = o[52];
621
+ s[52] === Symbol.for("react.memo_cache_sentinel") ? (e = () => L.current?.retry(), s[52] = e) : e = s[52];
622
622
  let t;
623
- o[53] === F.saveError ? t = o[54] : (t = /* @__PURE__ */ E(oe, {
623
+ s[53] === F.saveError ? t = s[54] : (t = /* @__PURE__ */ E(oe, {
624
624
  message: F.saveError,
625
625
  onRetry: e
626
- }), o[53] = F.saveError, o[54] = t), X = t;
626
+ }), s[53] = F.saveError, s[54] = t), X = t;
627
627
  }
628
628
  let Z;
629
- o[55] === q ? Z = o[56] : (Z = /* @__PURE__ */ E(me, { file: q }), o[55] = q, o[56] = Z);
629
+ s[55] === q ? Z = s[56] : (Z = /* @__PURE__ */ E(me, { file: q }), s[55] = q, s[56] = Z);
630
630
  let je = X, Me = !!_.save, Q;
631
- o[57] !== b || o[58] !== m ? (Q = b ? (e) => de({
631
+ s[57] !== b || s[58] !== m ? (Q = b ? (e) => de({
632
632
  workbench: m,
633
633
  navigation: b,
634
634
  sectionId: e
635
- }) : void 0, o[57] = b, o[58] = m, o[59] = Q) : Q = o[59];
635
+ }) : void 0, s[57] = b, s[58] = m, s[59] = Q) : Q = s[59];
636
636
  let $;
637
- o[60] !== _.title || o[61] !== q || o[62] !== Ae || o[63] !== ee || o[64] !== X || o[65] !== y || o[66] !== Me || o[67] !== Q ? ($ = /* @__PURE__ */ E(u, {
637
+ s[60] !== _.title || s[61] !== q || s[62] !== Ae || s[63] !== ee || s[64] !== X || s[65] !== y || s[66] !== Me || s[67] !== Q ? ($ = /* @__PURE__ */ E(u, {
638
638
  flex: "1",
639
639
  minH: "0",
640
640
  children: /* @__PURE__ */ E(ie, {
@@ -649,15 +649,15 @@ var k = "pstdio.fileSectionNavigation", A = (e) => {
649
649
  sectionNavigation: ee,
650
650
  title: _.title
651
651
  })
652
- }), o[60] = _.title, o[61] = q, o[62] = Ae, o[63] = ee, o[64] = X, o[65] = y, o[66] = Me, o[67] = Q, o[68] = $) : $ = o[68];
652
+ }), s[60] = _.title, s[61] = q, s[62] = Ae, s[63] = ee, s[64] = X, s[65] = y, s[66] = Me, s[67] = Q, s[68] = $) : $ = s[68];
653
653
  let Ne;
654
- return o[69] !== Z || o[70] !== $ ? (Ne = /* @__PURE__ */ D(p, {
654
+ return s[69] !== Z || s[70] !== $ ? (Ne = /* @__PURE__ */ D(p, {
655
655
  direction: "column",
656
656
  h: "full",
657
657
  minH: "0",
658
658
  bg: "bg",
659
659
  children: [Z, $]
660
- }), o[69] = Z, o[70] = $, o[71] = Ne) : Ne = o[71], Ne;
660
+ }), s[69] = Z, s[70] = $, s[71] = Ne) : Ne = s[71], Ne;
661
661
  };
662
662
  function ge(e) {
663
663
  return e.id;
@@ -665,4 +665,4 @@ function ge(e) {
665
665
  //#endregion
666
666
  export { V as WorkbenchFileRendererView };
667
667
 
668
- //# sourceMappingURL=file-renderer-view-C5dyoQQW.js.map
668
+ //# sourceMappingURL=file-renderer-view-c0hGcYy9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-renderer-view-C5dyoQQW.js","names":["ResourceRef","FILE_SECTION_NAVIGATION_METADATA_KEY","FileSectionAnchor","id","heading","occurrence","FileSectionNavigation","treeId","targetNodeId","anchors","isAnchor","value","anchor","Record","occurrenceIsValid","undefined","Number","isInteger","getFileSectionNavigation","resource","metadata","navigation","Array","isArray","every","resolveFileSectionTargetId","selectedNodeId","some","PreviousFileSectionNavigation","resourceKey","anchorIds","shouldClearFileSectionSelection","input","previous","current","currentResourceKey","includes","FileKind","IMAGE_EXTENSIONS","Set","PROSE_EXTENSIONS","CODE_LANGUAGE_BY_EXTENSION","Record","ts","tsx","js","jsx","mjs","cjs","json","jsonc","py","rb","rs","go","java","kt","c","h","cpp","cc","hpp","cs","php","swift","sh","bash","zsh","sql","css","scss","less","html","xml","yml","yaml","toml","ini","dockerfile","graphql","gql","md","markdown","txt","extensionOf","fileName","dot","lastIndexOf","length","slice","toLowerCase","isImage","mimeType","startsWith","has","pickFileKind","extension","codeLanguageFor","FileRendererContent","codeLanguageFor","pickFileKind","FileRendererPresentation","kind","isEditable","language","resolveFileRendererPresentation","content","contributionCanSave","emptyState","automaticKind","fileName","mimeType","editable","textRenderer","Box","Center","Flex","Image","Text","FileSourcePosition","AlertMessage","EmptyState","CodeEditor","MarkdownEditor","ReactNode","RefObject","FileRendererContent","resolveFileRendererPresentation","FileRendererContentViewProps","content","position","editorKey","errorNotice","contributionCanSave","onActiveSectionChange","sectionId","onChange","value","rendererRef","HTMLDivElement","sectionNavigation","anchors","Array","id","heading","occurrence","targetId","title","FileRendererContentView","props","$","_c","t0","presentation","t1","kind","positionNotice","t2","emptyState","t3","description","t4","t5","dataUrl","Symbol","for","fileName","isEditable","undefined","language","placeholder","t6","_c","FileRendererRefreshEnvelope","FileRendererRefreshOrigin","FileRendererSaveResult","FileEditControllerState","dirty","saving","saveError","removed","FileEditControllerInput","binding","Omit","resourceKey","debounceMs","load","event","save","value","origin","Promise","createOperationId","onStateChange","state","FileEditController","ReturnType","createFileEditController","input","baseline","baselineRevision","draft","activeSave","deferredRevision","genericRefreshDeferred","timer","setTimeout","operationSequence","seenRefreshRevisions","Set","completedOperationIds","describeError","error","Error","message","getState","const","notify","clearTimer","clearTimeout","nextOperationId","Date","now","hasPendingLocalState","Boolean","deferRefresh","revision","localeCompare","isSelfRefresh","operationId","rendererId","instanceId","has","takeDeferredRefresh","savedRevision","generic","undefined","runSave","resolve","then","result","add","size","delete","values","next","schedule","catch","getDraft","markRemoved","retain","getBaseline","setBaseline","acceptLoaded","shown","handleChange","handleRefreshEvent","retry","retryLoad","flush","Button","Flex","Text","FileRendererErrorNotice","props","$","_c","message","onRetry","t0","t1","t2","_c","PageParams","resourceKey","ResourceRef","FileRendererLoadKeyInput","fileRendererId","resource","pageParams","stableValue","value","Array","isArray","map","Object","fromEntries","entries","Record","sort","left","right","localeCompare","key","entry","createFileRendererLoadKey","input","resourceValue","id","type","metadata","JSON","stringify","isCurrentLoadedFile","loaded","loadKey","Text","Header","resolveFileIconElement","useFileIconThemePreference","FileRendererPathHeader","props","$","_c","fileName","filePath","activeFileIconTheme","t0","theme","t1","t2","t3","_c","Box","Button","Center","Flex","Spinner","Text","ResourceRef","resourceKey","ReactNode","useEffect","useLayoutEffect","useRef","useState","RegisteredFileRendererContribution","WorkbenchCore","WorkbenchPanelInstance","getWorkbenchRenderers","rendererReadKey","getFileSectionNavigation","resolveFileSectionTargetId","shouldClearFileSectionSelection","useWorkbenchStore","usePageParams","FileRendererContentView","createFileEditController","FileEditController","FileEditControllerState","FileRendererErrorNotice","createFileRendererLoadKey","isCurrentLoadedFile","acceptFileRendererLoad","LoadedFile","readCachedFileContent","saveLoadedFile","storeCachedFileContent","FileRendererPathHeader","WorkbenchFileRendererViewProps","workbench","contribution","placement","SAVE_DEBOUNCE_MS","describeError","error","Error","message","syncActiveFileSection","input","navigation","ReturnType","sectionId","getTreeRenderer","treeId","anchors","some","anchor","id","setSelectedNode","selectedNodeId","getTreeState","undefined","getEditorSectionNavigation","targetId","useFilePosition","resource","$","_c","t0","state","location","position","page_0","Object","values","pages","find","page","ref","extensionId","key","document","metadataKey","metadata","store","FileRendererHeader","props","file","fileName","filePath","fileRendererOwnerKey","contributionId","loadKey","JSON","stringify","WorkbenchFileRendererView","sectionNavigation","editorSectionNavigation","pageParams","fileRendererId","loaded","setLoaded","setError","t1","Symbol","for","dirty","saving","editState","setEditState","controllerRef","retryReadRef","rendererRef","previousSectionNavigationRef","t2","t3","previous","current","currentResourceKey","anchorIds","map","_temp","contributionRef","resourceRef","pageParamsRef","placementRef","t4","hasSave","Boolean","save","ownerKey","instanceId","t5","cancelled","removed","boundResource","boundContribution","read","views","reads","bind","controller","cached","baseline","editorRevision","load","t6","reason","request","queryKey","signal","onValue","next","updateLoaded","onError","loadError","binding","rendererId","debounceMs","onStateChange","value","origin","saved","content","result","setBaseline","revision","removalSubscription","resources","onWillRemove","resource_0","retain","markRemoved","identity","placementIdentity","refreshSubscription","onDidRefreshFileRenderer","event","controller_0","handleRefreshEvent","dispose","flush","t7","t8","onVisibility","visibilityState","window","addEventListener","removeEventListener","t9","value_0","handleChange","t10","currentLoaded","scrollResetKey","t11","t12","node","requestAnimationFrame","parentElement","overflowY","getComputedStyle","includes","scrollHeight","clientHeight","scrollTop","loadError_0","t13","t14","t15","editorKey","errorNotice","saveError","retry","t16","t17","title","t18","_c","rendererReadKey","usePageParams","acceptFileRendererLoad","storeCachedFileContent","readCachedFileContent","useWorkbenchStore","FILE_SECTION_NAVIGATION_METADATA_KEY","isAnchor","value","anchor","occurrenceIsValid","getFileSectionNavigation","resource","navigation","resolveFileSectionTargetId","selectedNodeId","shouldClearFileSectionSelection","input","previous","current","currentResourceKey","IMAGE_EXTENSIONS","PROSE_EXTENSIONS","CODE_LANGUAGE_BY_EXTENSION","extensionOf","fileName","dot","isImage","mimeType","pickFileKind","extension","codeLanguageFor","resolveFileRendererPresentation","content","automaticKind","isEditable","contributionCanSave","FileRendererContentView","$","c","props","t0","presentation","t1","position","AlertMessage","positionNotice","t2","t3","t4","EmptyState","t5","errorNotice","Flex","Center","Text","title","Image","rendererRef","onChange","editorKey","Box","CodeEditor","onActiveSectionChange","sectionNavigation","MarkdownEditor","t6","createFileEditController","baseline","removed","baselineRevision","draft","activeSave","saveError","deferredRevision","genericRefreshDeferred","timer","operationSequence","seenRefreshRevisions","completedOperationIds","describeError","error","getState","notify","clearTimer","nextOperationId","hasPendingLocalState","deferRefresh","event","isSelfRefresh","operationId","takeDeferredRefresh","revision","generic","savedRevision","runSave","origin","result","schedule","retain","shown","FileRendererErrorNotice","message","onRetry","Button","stableValue","left","right","key","entry","createFileRendererLoadKey","resourceValue","resourceKey","fileRendererId","isCurrentLoadedFile","loaded","loadKey","FileRendererPathHeader","useFileIconThemePreference","activeFileIconTheme","resolveFileIconElement","filePath","Header","SAVE_DEBOUNCE_MS","syncActiveFileSection","getWorkbenchRenderers","workbench","sectionId","getEditorSectionNavigation","useFilePosition","location","state","page","FileRendererHeader","file","fileRendererOwnerKey","placement","contributionId","WorkbenchFileRendererView","editorSectionNavigation","pageParams","contribution","setLoaded","useState","setError","editState","setEditState","controllerRef","useRef","retryReadRef","previousSectionNavigationRef","_temp","useEffect","contributionRef","resourceRef","pageParamsRef","placementRef","hasSave","ownerKey","instanceId","cancelled","boundResource","boundContribution","read","controller","cached","load","reason","signal","updateLoaded","next","loadError","saved","saveLoadedFile","removalSubscription","resource_0","identity","refreshSubscription","controller_0","t7","t8","flush","onVisibility","t9","value_0","handleChange","t10","currentLoaded","scrollResetKey","t11","t12","node","overflowY","useLayoutEffect","loadError_0","t13","t14","t15","Spinner","t16","t17","t18"],"sources":["../src/core/registries/renderers/file-section-navigation.ts","../src/react/renderers/file/file-kind.ts","../src/react/renderers/file/file-renderer-presentation.ts","../src/react/renderers/file/file-renderer-content.tsx","../src/react/renderers/file/file-renderer-edit-state.ts","../src/react/renderers/file/file-renderer-error-notice.tsx","../src/react/renderers/file/file-renderer-load-key.ts","../src/react/renderers/file/file-renderer-path-header.tsx","../src/react/renderers/file/file-renderer-view.tsx"],"sourcesContent":["import type { ResourceRef } from \"../resources/resource-registry\";\n\nexport const FILE_SECTION_NAVIGATION_METADATA_KEY = \"pstdio.fileSectionNavigation\";\n\nexport interface FileSectionAnchor {\n id: string;\n heading: string;\n occurrence?: number;\n}\n\nexport interface FileSectionNavigation {\n treeId: string;\n targetNodeId: string;\n anchors: FileSectionAnchor[];\n}\n\nconst isAnchor = (value: unknown): value is FileSectionAnchor => {\n if (!value || typeof value !== \"object\") return false;\n const anchor = value as Record<string, unknown>;\n const occurrenceIsValid =\n anchor.occurrence === undefined ||\n (typeof anchor.occurrence === \"number\" && Number.isInteger(anchor.occurrence) && anchor.occurrence >= 0);\n return typeof anchor.id === \"string\" && typeof anchor.heading === \"string\" && occurrenceIsValid;\n};\n\nexport const getFileSectionNavigation = (resource: ResourceRef | undefined): FileSectionNavigation | undefined => {\n const value = resource?.metadata?.[FILE_SECTION_NAVIGATION_METADATA_KEY];\n if (!value || typeof value !== \"object\") return undefined;\n const navigation = value as Record<string, unknown>;\n if (typeof navigation.treeId !== \"string\" || typeof navigation.targetNodeId !== \"string\") return undefined;\n if (!Array.isArray(navigation.anchors) || !navigation.anchors.every(isAnchor)) return undefined;\n\n return {\n treeId: navigation.treeId,\n targetNodeId: navigation.targetNodeId,\n anchors: navigation.anchors,\n };\n};\n\nexport const resolveFileSectionTargetId = (navigation: FileSectionNavigation, selectedNodeId: string | undefined) => {\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) return selectedNodeId;\n return navigation.targetNodeId;\n};\n\nexport interface PreviousFileSectionNavigation {\n resourceKey?: string;\n treeId: string;\n anchorIds: string[];\n}\n\nexport const shouldClearFileSectionSelection = (input: {\n previous: PreviousFileSectionNavigation | null;\n current: FileSectionNavigation | undefined;\n currentResourceKey?: string;\n selectedNodeId?: string;\n}) => {\n const { previous, current, currentResourceKey, selectedNodeId } = input;\n if (!previous || !selectedNodeId || !previous.anchorIds.includes(selectedNodeId)) return false;\n if (current?.targetNodeId === selectedNodeId) return false;\n\n return !current || previous.treeId !== current.treeId || previous.resourceKey !== currentResourceKey;\n};\n","// Generic file-type dispatch for the file renderer. Markdown is the default so\n// `.md` / `.txt` / extension-less files open in the prose editor; recognised code\n// extensions open in Monaco; images render read-only. This is deliberately\n// domain-agnostic — it knows about file types, not about tickets.\n\nexport type FileKind = \"markdown\" | \"code\" | \"image\";\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"bmp\", \"ico\"]);\nconst PROSE_EXTENSIONS = new Set([\"md\", \"markdown\", \"txt\"]);\n\n// Extension → Monaco language id. Markdown/plain text intentionally absent so\n// they fall through to the prose editor.\nconst CODE_LANGUAGE_BY_EXTENSION: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n kt: \"kotlin\",\n c: \"c\",\n h: \"c\",\n cpp: \"cpp\",\n cc: \"cpp\",\n hpp: \"cpp\",\n cs: \"csharp\",\n php: \"php\",\n swift: \"swift\",\n sh: \"shell\",\n bash: \"shell\",\n zsh: \"shell\",\n sql: \"sql\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n html: \"html\",\n xml: \"xml\",\n yml: \"yaml\",\n yaml: \"yaml\",\n toml: \"ini\",\n ini: \"ini\",\n dockerfile: \"dockerfile\",\n graphql: \"graphql\",\n gql: \"graphql\",\n md: \"markdown\",\n markdown: \"markdown\",\n txt: \"plaintext\",\n};\n\nconst extensionOf = (fileName: string | undefined) => {\n if (!fileName) return \"\";\n const dot = fileName.lastIndexOf(\".\");\n if (dot < 0 || dot === fileName.length - 1) return \"\";\n return fileName.slice(dot + 1).toLowerCase();\n};\n\nconst isImage = (fileName: string | undefined, mimeType: string | undefined) => {\n if (mimeType?.startsWith(\"image/\")) return true;\n return IMAGE_EXTENSIONS.has(extensionOf(fileName));\n};\n\nexport const pickFileKind = (fileName: string | undefined, mimeType: string | undefined): FileKind => {\n if (isImage(fileName, mimeType)) return \"image\";\n const extension = extensionOf(fileName);\n if (!PROSE_EXTENSIONS.has(extension) && extension in CODE_LANGUAGE_BY_EXTENSION) return \"code\";\n return \"markdown\";\n};\n\n// Monaco language for a code file; falls back to plaintext for unknown extensions.\nexport const codeLanguageFor = (fileName: string | undefined) =>\n CODE_LANGUAGE_BY_EXTENSION[extensionOf(fileName)] ?? \"plaintext\";\n","import type { FileRendererContent } from \"../../../core\";\nimport { codeLanguageFor, pickFileKind } from \"./file-kind\";\n\nexport type FileRendererPresentation =\n | { kind: \"empty\"; isEditable: false }\n | { kind: \"image\"; isEditable: false }\n | { kind: \"code\"; isEditable: boolean; language: string }\n | { kind: \"markdown\"; isEditable: boolean };\n\nexport const resolveFileRendererPresentation = (\n content: FileRendererContent,\n contributionCanSave: boolean,\n): FileRendererPresentation => {\n if (content.emptyState) return { kind: \"empty\", isEditable: false };\n\n const automaticKind = pickFileKind(content.fileName, content.mimeType);\n if (automaticKind === \"image\") return { kind: \"image\", isEditable: false };\n\n const isEditable = contributionCanSave && content.editable !== false;\n if (automaticKind === \"code\" || content.textRenderer === \"monaco\") {\n return { kind: \"code\", isEditable, language: codeLanguageFor(content.fileName) };\n }\n return { kind: \"markdown\", isEditable };\n};\n","import { Box, Center, Flex, Image, Text } from \"@chakra-ui/react\";\nimport type { FileSourcePosition } from \"@pstdio/sdk/extensions\";\nimport { AlertMessage, EmptyState } from \"@pstdio/ui\";\nimport { CodeEditor } from \"@pstdio/ui/diff\";\nimport { MarkdownEditor } from \"@pstdio/ui/rich-text\";\nimport type { ReactNode, RefObject } from \"react\";\nimport type { FileRendererContent } from \"../../../core\";\nimport { resolveFileRendererPresentation } from \"./file-renderer-presentation\";\n\ninterface FileRendererContentViewProps {\n content: FileRendererContent;\n position?: FileSourcePosition;\n editorKey: string;\n errorNotice: ReactNode;\n contributionCanSave: boolean;\n onActiveSectionChange?: (sectionId: string | null) => void;\n onChange: (value: string) => void;\n rendererRef: RefObject<HTMLDivElement | null>;\n sectionNavigation?: {\n anchors: Array<{ id: string; heading: string; occurrence?: number }>;\n targetId: string;\n };\n title: string;\n}\n\nexport const FileRendererContentView = (props: FileRendererContentViewProps) => {\n const {\n content,\n position,\n editorKey,\n errorNotice,\n contributionCanSave,\n onActiveSectionChange,\n onChange,\n rendererRef,\n sectionNavigation,\n title,\n } = props;\n const presentation = resolveFileRendererPresentation(content, contributionCanSave);\n const positionNotice =\n position && presentation.kind !== \"code\" && presentation.kind !== \"empty\" ? (\n <AlertMessage status=\"info\" title=\"Source location unavailable\">\n This preview does not support source line selection.\n </AlertMessage>\n ) : null;\n\n if (presentation.kind === \"empty\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <EmptyState\n flex=\"1\"\n minH=\"0\"\n title={content.emptyState?.title ?? \"Select a file\"}\n description={content.emptyState?.description}\n />\n </Flex>\n );\n }\n\n if (presentation.kind === \"image\") {\n if (!content.dataUrl) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\">\n <Text color=\"fg.muted\">This image preview is unavailable.</Text>\n </Center>\n );\n }\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <Center ref={rendererRef} flex=\"1\" minH=\"0\" p=\"md\" overflow=\"auto\">\n <Image src={content.dataUrl} alt={content.fileName ?? title} maxW=\"100%\" maxH=\"100%\" objectFit=\"contain\" />\n </Center>\n </Flex>\n );\n }\n\n if (presentation.kind === \"code\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <Box flex=\"1\" minH=\"0\">\n <CodeEditor\n key={editorKey}\n language={presentation.language}\n position={position}\n fileName={content.fileName}\n defaultCode={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n showLineNumbers\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n }\n\n return (\n <Flex ref={rendererRef} direction=\"column\" h=\"full\" minH=\"0\" overflow=\"hidden\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <Box flex=\"1\" minH=\"0\" overflowY=\"auto\">\n <MarkdownEditor\n key={editorKey}\n defaultState={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n sectionNavigation={sectionNavigation}\n placeholder={presentation.isEditable ? (content.placeholder ?? \"Write…\") : undefined}\n onActiveSectionChange={onActiveSectionChange}\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n};\n","// Owns the editable file renderer's save lifecycle: the last loaded or saved\n// value (the baseline), the debounced draft, the one in-flight save, and\n// refresh events that arrive while a draft or save exists.\n//\n// Invariants (from the renderer edit/refresh lifecycle PRD):\n// - a change equal to the baseline never schedules a save\n// - at most one save runs at a time; the baseline advances when it succeeds\n// - a failed save keeps the draft so a later change or flush retries it\n// - refresh events are deferred while a draft or save exists and coalesce\n// into one reload after the last save settles\n\nimport type {\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n FileRendererSaveResult,\n} from \"../../../core/registries/renderers/file-renderer-registry\";\n\nexport interface FileEditControllerState {\n dirty: boolean;\n saving: boolean;\n saveError?: string;\n removed?: true;\n}\n\nexport interface FileEditControllerInput {\n binding: Omit<FileRendererRefreshOrigin, \"operationId\"> & { resourceKey?: string };\n debounceMs: number;\n load: (event?: FileRendererRefreshEnvelope) => void;\n save: (value: string, origin: FileRendererRefreshOrigin) => Promise<FileRendererSaveResult | undefined>;\n createOperationId?: () => string;\n onStateChange?: (state: FileEditControllerState) => void;\n}\n\nexport type FileEditController = ReturnType<typeof createFileEditController>;\n\nexport const createFileEditController = (input: FileEditControllerInput) => {\n let baseline: string | undefined;\n let removed = false;\n let baselineRevision: string | undefined;\n let draft: string | null = null;\n let activeSave: { value: string; origin: FileRendererRefreshOrigin } | null = null;\n let saveError: string | undefined;\n let deferredRevision: string | undefined;\n let genericRefreshDeferred = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let operationSequence = 0;\n const seenRefreshRevisions = new Set<string>();\n const completedOperationIds = new Set<string>();\n\n const describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to save file.\");\n const getState = (): FileEditControllerState => ({\n dirty: draft !== null || (activeSave !== null && activeSave.value !== baseline),\n saving: activeSave !== null,\n ...(saveError ? { saveError } : {}),\n ...(removed ? { removed: true as const } : {}),\n });\n const notify = () => input.onStateChange?.(getState());\n\n const clearTimer = () => {\n if (timer === null) return;\n clearTimeout(timer);\n timer = null;\n };\n\n const nextOperationId = () => input.createOperationId?.() ?? `file-save-${Date.now()}-${++operationSequence}`;\n\n const hasPendingLocalState = () => draft !== null || activeSave !== null || timer !== null || Boolean(saveError);\n\n const deferRefresh = (event: FileRendererRefreshEnvelope) => {\n if (event.revision && (!deferredRevision || event.revision.localeCompare(deferredRevision) > 0)) {\n deferredRevision = event.revision;\n }\n if (!event.revision) genericRefreshDeferred = true;\n };\n\n const isSelfRefresh = (event: FileRendererRefreshEnvelope) => {\n const operationId = event.origin?.operationId;\n if (!operationId) return false;\n if (event.origin?.rendererId !== input.binding.rendererId) return false;\n if (event.origin.instanceId !== input.binding.instanceId) return false;\n return activeSave?.origin.operationId === operationId || completedOperationIds.has(operationId);\n };\n\n const takeDeferredRefresh = (savedRevision?: string) => {\n if (draft !== null || activeSave) return;\n const revision = deferredRevision;\n const generic = genericRefreshDeferred;\n deferredRevision = undefined;\n genericRefreshDeferred = false;\n if (revision && (!savedRevision || revision.localeCompare(savedRevision) > 0)) {\n input.load({ resourceKey: input.binding.resourceKey, revision });\n return;\n }\n if (generic) input.load({ resourceKey: input.binding.resourceKey });\n };\n\n const runSave = () => {\n if (removed || draft === null || activeSave || saveError) return;\n const value = draft;\n draft = null;\n const origin = {\n rendererId: input.binding.rendererId,\n instanceId: input.binding.instanceId,\n operationId: nextOperationId(),\n };\n activeSave = { value, origin };\n notify();\n void Promise.resolve(input.save(value, origin))\n .then((result) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n completedOperationIds.add(origin.operationId);\n if (completedOperationIds.size > 20) completedOperationIds.delete(completedOperationIds.values().next().value!);\n baseline = value;\n baselineRevision = result?.revision ?? baselineRevision;\n if (draft === baseline) {\n draft = null;\n clearTimer();\n }\n notify();\n if (draft !== null) {\n schedule();\n return;\n }\n takeDeferredRefresh(result?.revision);\n })\n .catch((error) => {\n if (removed) return;\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n if (draft === null) draft = value;\n saveError = describeError(error);\n notify();\n });\n };\n\n const schedule = () => {\n clearTimer();\n timer = setTimeout(() => {\n timer = null;\n runSave();\n }, input.debounceMs);\n };\n\n return {\n getDraft() {\n return draft ?? activeSave?.value ?? baseline;\n },\n markRemoved() {\n const retain = hasPendingLocalState();\n removed = true;\n draft = draft ?? activeSave?.value ?? null;\n activeSave = null;\n clearTimer();\n notify();\n return retain;\n },\n getBaseline() {\n return baseline;\n },\n getState,\n setBaseline(value: string | undefined, revision?: string) {\n baseline = value;\n baselineRevision = revision;\n notify();\n },\n // Takes a freshly loaded value as the new baseline and returns the value the\n // editor was showing, so the caller can tell whether the editor must show\n // something else. Returns null while pending local state must keep the\n // editor: the refresh is deferred until the save settles.\n acceptLoaded(value: string | undefined, revision?: string) {\n if (removed) return null;\n if (hasPendingLocalState()) {\n deferRefresh(revision ? { revision } : {});\n return null;\n }\n const shown = baseline;\n baseline = value;\n baselineRevision = revision;\n notify();\n return { shown };\n },\n handleChange(value: string) {\n if (removed) {\n draft = value;\n notify();\n return;\n }\n if (saveError && value === draft) return;\n saveError = undefined;\n if (value === baseline && !activeSave) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n if (activeSave?.value === value) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n draft = value;\n schedule();\n notify();\n },\n handleRefreshEvent(event: FileRendererRefreshEnvelope = {}) {\n if (removed) return;\n if (event.resourceKey && event.resourceKey !== input.binding.resourceKey) return;\n if (isSelfRefresh(event)) return;\n if (event.revision && seenRefreshRevisions.has(event.revision)) return;\n if (event.revision) seenRefreshRevisions.add(event.revision);\n if (hasPendingLocalState()) {\n deferRefresh(event);\n return;\n }\n if (event.revision && baselineRevision && event.revision.localeCompare(baselineRevision) <= 0) return;\n input.load(event);\n },\n retry() {\n if (!saveError || draft === null || activeSave) return;\n saveError = undefined;\n notify();\n runSave();\n },\n retryLoad() {\n if (removed) return;\n input.load({ resourceKey: input.binding.resourceKey });\n },\n flush() {\n clearTimer();\n runSave();\n },\n };\n};\n","import { Button, Flex, Text } from \"@chakra-ui/react\";\n\nexport const FileRendererErrorNotice = (props: { message: string; onRetry?: () => void }) => {\n const { message, onRetry } = props;\n return (\n <Flex\n flex=\"none\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"sm\"\n borderBottomWidth=\"1px\"\n borderColor=\"border.muted\"\n bg=\"bg.muted\"\n px=\"sm\"\n py=\"xs\"\n >\n <Text color=\"fg.muted\" textStyle=\"label/S/regular\">\n {message}\n </Text>\n {onRetry ? (\n <Button size=\"2xs\" variant=\"subtle\" onClick={onRetry}>\n Retry\n </Button>\n ) : null}\n </Flex>\n );\n};\n","import type { PageParams } from \"@pstdio/sdk/extensions\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"../../../core\";\n\ninterface FileRendererLoadKeyInput {\n fileRendererId: string;\n resource: ResourceRef | undefined;\n pageParams?: PageParams;\n}\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableValue(entry)]),\n );\n};\nexport const createFileRendererLoadKey = (input: FileRendererLoadKeyInput) => {\n const { fileRendererId, resource } = input;\n const resourceValue = resource\n ? stableValue({\n id: resource.id,\n type: resource.type,\n metadata: resource.metadata,\n })\n : null;\n const key = `${JSON.stringify(resourceKey(resource))}:${fileRendererId}:${JSON.stringify(resourceValue)}`;\n return input.pageParams ? `${key}:${JSON.stringify(stableValue(input.pageParams))}` : key;\n};\nexport const isCurrentLoadedFile = (\n loaded: {\n loadKey: string;\n } | null,\n loadKey: string,\n) => loaded?.loadKey === loadKey;\n","import { Text } from \"@chakra-ui/react\";\nimport { Header, resolveFileIconElement, useFileIconThemePreference } from \"@pstdio/ui\";\n\nexport const FileRendererPathHeader = (props: { fileName: string; filePath: string }) => {\n const { fileName, filePath } = props;\n const { activeFileIconTheme } = useFileIconThemePreference();\n\n return (\n <Header variant=\"narrow\" flexShrink={0} gap=\"2xs\" bg=\"bg\">\n {resolveFileIconElement(fileName, { theme: activeFileIconTheme })}\n <Text aria-label={`File path ${filePath}`} textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {filePath}\n </Text>\n </Header>\n );\n};\n","import { Box, Button, Center, Flex, Spinner, Text } from \"@chakra-ui/react\";\nimport { type ResourceRef, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { type ReactNode, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { RegisteredFileRendererContribution, WorkbenchCore, WorkbenchPanelInstance } from \"../../../core\";\nimport { getWorkbenchRenderers, rendererReadKey } from \"../../../core\";\nimport {\n getFileSectionNavigation,\n resolveFileSectionTargetId,\n shouldClearFileSectionSelection,\n} from \"../../../core/registries/renderers/file-section-navigation\";\nimport { useWorkbenchStore } from \"../../shared/use-workbench-store\";\nimport { usePageParams } from \"../use-page-params\";\nimport { FileRendererContentView } from \"./file-renderer-content\";\nimport {\n createFileEditController,\n type FileEditController,\n type FileEditControllerState,\n} from \"./file-renderer-edit-state\";\nimport { FileRendererErrorNotice } from \"./file-renderer-error-notice\";\nimport { createFileRendererLoadKey, isCurrentLoadedFile } from \"./file-renderer-load-key\";\nimport {\n acceptFileRendererLoad,\n type LoadedFile,\n readCachedFileContent,\n saveLoadedFile,\n storeCachedFileContent,\n} from \"./file-renderer-load-state\";\nimport { FileRendererPathHeader } from \"./file-renderer-path-header\";\n\ninterface WorkbenchFileRendererViewProps {\n workbench: WorkbenchCore;\n contribution: RegisteredFileRendererContribution;\n // The bound resource (e.g. the open ticket / ticket-file) the load/save\n // commands operate on.\n placement?: WorkbenchPanelInstance;\n}\nconst SAVE_DEBOUNCE_MS = 600;\nconst describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to load file.\");\nconst syncActiveFileSection = (input: {\n workbench: WorkbenchCore;\n navigation: ReturnType<typeof getFileSectionNavigation>;\n sectionId: string | null;\n}) => {\n const { workbench, navigation, sectionId } = input;\n if (!navigation || !getWorkbenchRenderers(workbench).getTreeRenderer(navigation.treeId)) return;\n if (sectionId && navigation.anchors.some((anchor) => anchor.id === sectionId)) {\n getWorkbenchRenderers(workbench).setSelectedNode(navigation.treeId, sectionId);\n return;\n }\n const selectedNodeId = getWorkbenchRenderers(workbench).getTreeState(navigation.treeId).selectedNodeId;\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) {\n getWorkbenchRenderers(workbench).setSelectedNode(navigation.treeId, undefined);\n }\n};\nconst getEditorSectionNavigation = (\n workbench: WorkbenchCore,\n navigation: ReturnType<typeof getFileSectionNavigation>,\n) => {\n if (!navigation) return undefined;\n const selectedNodeId = getWorkbenchRenderers(workbench).getTreeRenderer(navigation.treeId)\n ? getWorkbenchRenderers(workbench).getTreeState(navigation.treeId).selectedNodeId\n : undefined;\n return {\n anchors: navigation.anchors,\n targetId: resolveFileSectionTargetId(navigation, selectedNodeId),\n };\n};\nconst useFilePosition = (workbench: WorkbenchCore, resource?: ResourceRef) =>\n useWorkbenchStore(workbench.pages.store, (state) => {\n const location = state.location;\n if (!location?.position || resourceKey(location.resource) !== resourceKey(resource)) return undefined;\n const page = Object.values(state.pages).find(\n (page) => page.ref.id === location.page.id && page.ref.extensionId === location.page.extensionId,\n );\n const key = page?.document?.metadataKey;\n if (!key || location.resource?.metadata?.[key] !== resource?.metadata?.[key]) return undefined;\n return location.position;\n });\n\nconst FileRendererHeader = (props: { file: LoadedFile }) => {\n const { file } = props;\n return file.filePath ? (\n <FileRendererPathHeader fileName={file.fileName ?? file.filePath} filePath={file.filePath} />\n ) : null;\n};\n\nconst fileRendererOwnerKey = (\n placement: WorkbenchPanelInstance | undefined,\n contributionId: string,\n loadKey: string,\n) => (placement ? rendererReadKey(placement) : JSON.stringify([\"file\", contributionId, loadKey]));\n\nexport const WorkbenchFileRendererView = (props: WorkbenchFileRendererViewProps) => {\n const { workbench, contribution } = props;\n const resource = props.placement?.resource;\n const position = useFilePosition(workbench, resource);\n const sectionNavigation = getFileSectionNavigation(resource);\n const editorSectionNavigation = getEditorSectionNavigation(workbench, sectionNavigation);\n const pageParams = usePageParams(workbench, props.placement);\n const loadKey = createFileRendererLoadKey({ fileRendererId: contribution.id, resource, pageParams });\n const [loaded, setLoaded] = useState<LoadedFile | null>(null);\n const [error, setError] = useState<{\n loadKey: string;\n message: string;\n } | null>(null);\n const [editState, setEditState] = useState<FileEditControllerState>({ dirty: false, saving: false });\n const controllerRef = useRef<FileEditController | null>(null);\n const retryReadRef = useRef<(() => void) | undefined>(undefined);\n const rendererRef = useRef<HTMLDivElement>(null);\n const previousSectionNavigationRef = useRef<{\n resourceKey?: string;\n treeId: string;\n anchorIds: string[];\n } | null>(null);\n useEffect(() => {\n const previous = previousSectionNavigationRef.current;\n const selectedNodeId =\n previous && getWorkbenchRenderers(workbench).getTreeRenderer(previous.treeId)\n ? getWorkbenchRenderers(workbench).getTreeState(previous.treeId).selectedNodeId\n : undefined;\n if (\n shouldClearFileSectionSelection({\n previous,\n current: sectionNavigation,\n currentResourceKey: resourceKey(resource),\n selectedNodeId,\n }) &&\n previous\n ) {\n getWorkbenchRenderers(workbench).setSelectedNode(previous.treeId, undefined);\n }\n previousSectionNavigationRef.current = sectionNavigation\n ? {\n resourceKey: resourceKey(resource),\n treeId: sectionNavigation.treeId,\n anchorIds: sectionNavigation.anchors.map((anchor) => anchor.id),\n }\n : null;\n }, [resource, sectionNavigation, workbench]);\n // Contribution refresh re-registers an identical contribution as a new\n // object, and a save that changes the document title produces a new resource\n // object with a fresh label. The load key uses resource values instead of\n // object identity, while callbacks read the latest objects through refs.\n const contributionRef = useRef(contribution);\n const resourceRef = useRef(resource);\n const pageParamsRef = useRef(pageParams);\n const placementRef = useRef(props.placement);\n useEffect(() => {\n contributionRef.current = contribution;\n resourceRef.current = resource;\n pageParamsRef.current = pageParams;\n placementRef.current = props.placement;\n });\n const contributionId = contribution.id;\n const hasSave = Boolean(contribution.save);\n const ownerKey = fileRendererOwnerKey(props.placement, contributionId, loadKey);\n const instanceId = props.placement?.instanceId ?? contributionId;\n // Re-binding a singleton widget to another resource changes `resource` and reloads.\n useEffect(() => {\n let cancelled = false;\n let removed = false;\n const boundResource = resourceRef.current;\n const boundContribution = contributionRef.current;\n const read = workbench.views.reads.bind(ownerKey);\n let controller: FileEditController | null = null;\n setError(null);\n // A recently viewed document mounts immediately from the cache; the load\n // below reconciles it (unchanged content keeps the editor mounted).\n const cached = readCachedFileContent(loadKey);\n let baseline = cached;\n setLoaded(cached ? { ...cached, editorRevision: 1, loadKey } : null);\n const load = (reason: \"refresh\" | \"retry\" = \"refresh\") => {\n read.request(\n {\n queryKey: loadKey,\n load: (signal) => contributionRef.current.load(resourceRef.current, signal, pageParamsRef.current),\n onValue: (next) => {\n if (cancelled || removed) return;\n const updateLoaded = acceptFileRendererLoad(next, loadKey, controller);\n if (!updateLoaded) return;\n baseline = next;\n setError(null);\n setLoaded(updateLoaded);\n },\n onError: (loadError) => {\n if (cancelled || removed) return;\n setError({ loadKey, message: describeError(loadError) });\n },\n },\n reason,\n );\n };\n retryReadRef.current = () => load(\"retry\");\n controller = hasSave\n ? createFileEditController({\n binding: {\n rendererId: contributionId,\n instanceId,\n resourceKey: resourceKey(resourceRef.current),\n },\n debounceMs: SAVE_DEBOUNCE_MS,\n load: () => load(),\n onStateChange: (state) => {\n if (!cancelled) setEditState(state);\n },\n save: async (value, origin) => {\n const saved = await saveLoadedFile(boundContribution, boundResource, value, origin, baseline);\n baseline = saved.content;\n if (baseline && !removed) storeCachedFileContent(loadKey, baseline);\n return saved.result;\n },\n })\n : null;\n controllerRef.current = controller;\n if (cached) controllerRef.current?.setBaseline(cached.content, cached.revision);\n setEditState({ dirty: false, saving: false });\n load();\n const removalSubscription = workbench.resources.onWillRemove((resource) => {\n if (resourceKey(resource) !== resourceKey(resourceRef.current)) return [];\n removed = true;\n const retain = controllerRef.current?.markRemoved();\n const identity = placementRef.current?.placementIdentity;\n return retain && identity ? [identity] : [];\n });\n const refreshSubscription = getWorkbenchRenderers(workbench).onDidRefreshFileRenderer((event) => {\n if (removed || event.fileRendererId !== contributionId) return;\n const controller = controllerRef.current;\n if (controller) controller.handleRefreshEvent(event);\n else load();\n });\n return () => {\n cancelled = true;\n read.dispose();\n retryReadRef.current = undefined;\n refreshSubscription.dispose();\n removalSubscription.dispose();\n // Flush the last keystrokes on unbind; the load callback above is\n // cancelled, so a deferred refresh cannot resurrect the old binding.\n controller?.flush();\n if (controllerRef.current === controller) controllerRef.current = null;\n };\n }, [contributionId, hasSave, workbench, loadKey, ownerKey, instanceId]);\n // The last keystrokes are also flushed when the tab is hidden or closed.\n useEffect(() => {\n const flush = () => controllerRef.current?.flush();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") flush();\n };\n window.addEventListener(\"beforeunload\", flush);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.removeEventListener(\"beforeunload\", flush);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, []);\n const handleChange = (value: string) => {\n controllerRef.current?.handleChange(value);\n };\n const currentLoaded = isCurrentLoadedFile(loaded, loadKey) ? loaded : null;\n const scrollResetKey = currentLoaded ? `${currentLoaded.loadKey}:${currentLoaded.editorRevision}` : \"\";\n useLayoutEffect(() => {\n if (!scrollResetKey || sectionNavigation) return;\n const node = rendererRef.current;\n if (!node) return;\n requestAnimationFrame(() => {\n let current = node.parentElement;\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if ([\"auto\", \"scroll\", \"overlay\"].includes(overflowY) && current.scrollHeight > current.clientHeight) {\n current.scrollTop = 0;\n }\n current = current.parentElement;\n }\n });\n }, [scrollResetKey, sectionNavigation]);\n const loadError = error?.loadKey === loadKey ? error.message : undefined;\n if (loadError && !currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\" flexDirection=\"column\" gap=\"sm\">\n <Text color=\"fg.muted\">{loadError}</Text>\n <Button size=\"xs\" variant=\"subtle\" onClick={() => retryReadRef.current?.()}>\n Retry\n </Button>\n </Center>\n );\n }\n if (!currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\">\n <Spinner size=\"sm\" />\n </Center>\n );\n }\n // The key must carry the document identity, not just the contribution: two\n // documents from the same renderer both start at revision 1, so keying on the\n // contribution alone reuses the editor and keeps showing the previous file.\n const editorKey = `${currentLoaded.loadKey}:${currentLoaded.editorRevision}`;\n let errorNotice: ReactNode = null;\n if (editState.removed) {\n errorNotice = (\n <FileRendererErrorNotice message=\"This resource was removed. Your draft is kept here. Copy it before closing this tab.\" />\n );\n } else if (loadError) {\n errorNotice = <FileRendererErrorNotice message={loadError} onRetry={() => retryReadRef.current?.()} />;\n } else if (editState.saveError) {\n errorNotice = (\n <FileRendererErrorNotice message={editState.saveError} onRetry={() => controllerRef.current?.retry()} />\n );\n }\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n <FileRendererHeader file={currentLoaded} />\n <Box flex=\"1\" minH=\"0\">\n <FileRendererContentView\n content={currentLoaded}\n position={position}\n editorKey={editorKey}\n errorNotice={errorNotice}\n contributionCanSave={Boolean(contribution.save)}\n onActiveSectionChange={\n sectionNavigation\n ? (sectionId) => syncActiveFileSection({ workbench, navigation: sectionNavigation, sectionId })\n : undefined\n }\n onChange={handleChange}\n rendererRef={rendererRef}\n sectionNavigation={editorSectionNavigation}\n title={contribution.title}\n />\n </Box>\n </Flex>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"file-renderer-view-c0hGcYy9.js","names":["ResourceRef","FILE_SECTION_NAVIGATION_METADATA_KEY","FileSectionAnchor","id","heading","occurrence","FileSectionNavigation","treeId","targetNodeId","anchors","isAnchor","value","anchor","Record","occurrenceIsValid","undefined","Number","isInteger","getFileSectionNavigation","resource","metadata","navigation","Array","isArray","every","resolveFileSectionTargetId","selectedNodeId","some","PreviousFileSectionNavigation","resourceKey","anchorIds","shouldClearFileSectionSelection","input","previous","current","currentResourceKey","includes","FileKind","IMAGE_EXTENSIONS","Set","PROSE_EXTENSIONS","CODE_LANGUAGE_BY_EXTENSION","Record","ts","tsx","js","jsx","mjs","cjs","json","jsonc","py","rb","rs","go","java","kt","c","h","cpp","cc","hpp","cs","php","swift","sh","bash","zsh","sql","css","scss","less","html","xml","yml","yaml","toml","ini","dockerfile","graphql","gql","md","markdown","txt","extensionOf","fileName","dot","lastIndexOf","length","slice","toLowerCase","isImage","mimeType","startsWith","has","pickFileKind","extension","codeLanguageFor","FileRendererContent","codeLanguageFor","pickFileKind","FileRendererPresentation","kind","isEditable","language","resolveFileRendererPresentation","content","contributionCanSave","emptyState","automaticKind","fileName","mimeType","editable","textRenderer","Box","Center","Flex","Image","Text","FileSourcePosition","AlertMessage","EmptyState","CodeEditor","MarkdownEditor","ReactNode","RefObject","FileRendererContent","resolveFileRendererPresentation","FileRendererContentViewProps","content","position","editorKey","errorNotice","contributionCanSave","onActiveSectionChange","sectionId","onChange","value","rendererRef","HTMLDivElement","sectionNavigation","anchors","Array","id","heading","occurrence","targetId","title","FileRendererContentView","props","$","_c","t0","presentation","t1","kind","positionNotice","t2","emptyState","t3","description","t4","t5","dataUrl","Symbol","for","fileName","isEditable","undefined","language","placeholder","t6","_c","FileRendererRefreshEnvelope","FileRendererRefreshOrigin","FileRendererSaveResult","FileEditControllerState","dirty","saving","saveError","removed","FileEditControllerInput","binding","Omit","resourceKey","debounceMs","load","event","save","value","origin","Promise","createOperationId","onStateChange","state","FileEditController","ReturnType","createFileEditController","input","baseline","baselineRevision","draft","activeSave","deferredRevision","genericRefreshDeferred","timer","setTimeout","operationSequence","seenRefreshRevisions","Set","completedOperationIds","describeError","error","Error","message","getState","const","notify","clearTimer","clearTimeout","nextOperationId","Date","now","hasPendingLocalState","Boolean","deferRefresh","revision","localeCompare","isSelfRefresh","operationId","rendererId","instanceId","has","takeDeferredRefresh","savedRevision","generic","undefined","runSave","resolve","then","result","add","size","delete","values","next","schedule","catch","getDraft","markRemoved","retain","getBaseline","setBaseline","acceptLoaded","shown","handleChange","handleRefreshEvent","retry","retryLoad","flush","Button","Flex","Text","FileRendererErrorNotice","props","$","_c","message","onRetry","t0","t1","t2","_c","PageParams","resourceKey","ResourceRef","FileRendererLoadKeyInput","fileRendererId","resource","pageParams","stableValue","value","Array","isArray","map","Object","fromEntries","entries","Record","sort","left","right","localeCompare","key","entry","createFileRendererLoadKey","input","resourceValue","id","type","metadata","JSON","stringify","isCurrentLoadedFile","loaded","loadKey","Text","Header","resolveFileIconElement","useFileIconThemePreference","FileRendererPathHeader","props","$","_c","fileName","filePath","activeFileIconTheme","t0","theme","t1","t2","t3","_c","Box","Button","Center","Flex","Spinner","Text","ResourceRef","resourceKey","ReactNode","useEffect","useLayoutEffect","useRef","useState","RegisteredFileRendererContribution","WorkbenchCore","WorkbenchPanelInstance","getWorkbenchRenderers","rendererReadKey","getFileSectionNavigation","resolveFileSectionTargetId","shouldClearFileSectionSelection","useWorkbenchStore","usePageParams","FileRendererContentView","createFileEditController","FileEditController","FileEditControllerState","FileRendererErrorNotice","createFileRendererLoadKey","isCurrentLoadedFile","acceptFileRendererLoad","LoadedFile","readCachedFileContent","saveLoadedFile","storeCachedFileContent","FileRendererPathHeader","WorkbenchFileRendererViewProps","workbench","contribution","placement","SAVE_DEBOUNCE_MS","describeError","error","Error","message","syncActiveFileSection","input","navigation","ReturnType","sectionId","getTreeRenderer","treeId","anchors","some","anchor","id","setSelectedNode","selectedNodeId","getTreeState","undefined","getEditorSectionNavigation","targetId","useFilePosition","resource","$","_c","t0","state","location","position","page_0","Object","values","pages","find","page","ref","extensionId","key","document","metadataKey","metadata","store","FileRendererHeader","props","file","fileName","filePath","fileRendererOwnerKey","contributionId","loadKey","JSON","stringify","WorkbenchFileRendererView","sectionNavigation","editorSectionNavigation","pageParams","fileRendererId","loaded","setLoaded","setError","t1","Symbol","for","dirty","saving","editState","setEditState","controllerRef","retryReadRef","rendererRef","previousSectionNavigationRef","t2","t3","previous","current","currentResourceKey","anchorIds","map","_temp","contributionRef","resourceRef","pageParamsRef","placementRef","t4","hasSave","Boolean","save","ownerKey","instanceId","t5","cancelled","removed","boundResource","boundContribution","read","views","reads","bind","controller","cached","baseline","editorRevision","load","t6","reason","request","queryKey","signal","onValue","next","updateLoaded","onError","loadError","binding","rendererId","debounceMs","onStateChange","value","origin","saved","content","result","setBaseline","revision","removalSubscription","resources","onWillRemove","resource_0","retain","markRemoved","identity","placementIdentity","refreshSubscription","onDidRefreshFileRenderer","event","controller_0","handleRefreshEvent","dispose","flush","t7","t8","onVisibility","visibilityState","window","addEventListener","removeEventListener","t9","value_0","handleChange","t10","currentLoaded","scrollResetKey","t11","t12","node","requestAnimationFrame","parentElement","overflowY","getComputedStyle","includes","scrollHeight","clientHeight","scrollTop","loadError_0","t13","t14","t15","editorKey","errorNotice","saveError","retry","t16","t17","title","t18","_c","rendererReadKey","usePageParams","acceptFileRendererLoad","storeCachedFileContent","readCachedFileContent","saveLoadedFile","useWorkbenchStore","FILE_SECTION_NAVIGATION_METADATA_KEY","isAnchor","value","anchor","occurrenceIsValid","getFileSectionNavigation","resource","navigation","resolveFileSectionTargetId","selectedNodeId","shouldClearFileSectionSelection","input","previous","current","currentResourceKey","IMAGE_EXTENSIONS","PROSE_EXTENSIONS","CODE_LANGUAGE_BY_EXTENSION","extensionOf","fileName","dot","isImage","mimeType","pickFileKind","extension","codeLanguageFor","resolveFileRendererPresentation","content","automaticKind","isEditable","contributionCanSave","FileRendererContentView","$","c","props","t0","presentation","t1","position","AlertMessage","positionNotice","t2","t3","t4","EmptyState","t5","errorNotice","Flex","Center","Text","title","Image","rendererRef","onChange","editorKey","Box","CodeEditor","onActiveSectionChange","sectionNavigation","MarkdownEditor","t6","createFileEditController","baseline","removed","baselineRevision","draft","activeSave","saveError","deferredRevision","genericRefreshDeferred","timer","operationSequence","seenRefreshRevisions","completedOperationIds","describeError","error","getState","notify","clearTimer","nextOperationId","hasPendingLocalState","deferRefresh","event","isSelfRefresh","operationId","takeDeferredRefresh","revision","generic","savedRevision","runSave","origin","result","schedule","retain","shown","FileRendererErrorNotice","message","onRetry","Button","stableValue","left","right","key","entry","createFileRendererLoadKey","resourceValue","resourceKey","fileRendererId","isCurrentLoadedFile","loaded","loadKey","FileRendererPathHeader","useFileIconThemePreference","activeFileIconTheme","resolveFileIconElement","filePath","Header","SAVE_DEBOUNCE_MS","syncActiveFileSection","getWorkbenchRenderers","workbench","sectionId","getEditorSectionNavigation","useFilePosition","location","state","page","FileRendererHeader","file","fileRendererOwnerKey","placement","contributionId","WorkbenchFileRendererView","editorSectionNavigation","pageParams","contribution","setLoaded","useState","setError","editState","setEditState","controllerRef","useRef","retryReadRef","previousSectionNavigationRef","_temp","useEffect","contributionRef","resourceRef","pageParamsRef","placementRef","hasSave","ownerKey","instanceId","cancelled","boundResource","boundContribution","read","controller","cached","load","reason","signal","updateLoaded","next","loadError","saved","removalSubscription","resource_0","identity","refreshSubscription","controller_0","t7","t8","flush","onVisibility","t9","value_0","handleChange","t10","currentLoaded","scrollResetKey","t11","t12","node","overflowY","useLayoutEffect","loadError_0","t13","t14","t15","Spinner","t16","t17","t18"],"sources":["../src/core/registries/renderers/file-section-navigation.ts","../src/react/renderers/file/file-kind.ts","../src/react/renderers/file/file-renderer-presentation.ts","../src/react/renderers/file/file-renderer-content.tsx","../src/react/renderers/file/file-renderer-edit-state.ts","../src/react/renderers/file/file-renderer-error-notice.tsx","../src/react/renderers/file/file-renderer-load-key.ts","../src/react/renderers/file/file-renderer-path-header.tsx","../src/react/renderers/file/file-renderer-view.tsx"],"sourcesContent":["import type { ResourceRef } from \"../resources/resource-registry\";\n\nexport const FILE_SECTION_NAVIGATION_METADATA_KEY = \"pstdio.fileSectionNavigation\";\n\nexport interface FileSectionAnchor {\n id: string;\n heading: string;\n occurrence?: number;\n}\n\nexport interface FileSectionNavigation {\n treeId: string;\n targetNodeId: string;\n anchors: FileSectionAnchor[];\n}\n\nconst isAnchor = (value: unknown): value is FileSectionAnchor => {\n if (!value || typeof value !== \"object\") return false;\n const anchor = value as Record<string, unknown>;\n const occurrenceIsValid =\n anchor.occurrence === undefined ||\n (typeof anchor.occurrence === \"number\" && Number.isInteger(anchor.occurrence) && anchor.occurrence >= 0);\n return typeof anchor.id === \"string\" && typeof anchor.heading === \"string\" && occurrenceIsValid;\n};\n\nexport const getFileSectionNavigation = (resource: ResourceRef | undefined): FileSectionNavigation | undefined => {\n const value = resource?.metadata?.[FILE_SECTION_NAVIGATION_METADATA_KEY];\n if (!value || typeof value !== \"object\") return undefined;\n const navigation = value as Record<string, unknown>;\n if (typeof navigation.treeId !== \"string\" || typeof navigation.targetNodeId !== \"string\") return undefined;\n if (!Array.isArray(navigation.anchors) || !navigation.anchors.every(isAnchor)) return undefined;\n\n return {\n treeId: navigation.treeId,\n targetNodeId: navigation.targetNodeId,\n anchors: navigation.anchors,\n };\n};\n\nexport const resolveFileSectionTargetId = (navigation: FileSectionNavigation, selectedNodeId: string | undefined) => {\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) return selectedNodeId;\n return navigation.targetNodeId;\n};\n\nexport interface PreviousFileSectionNavigation {\n resourceKey?: string;\n treeId: string;\n anchorIds: string[];\n}\n\nexport const shouldClearFileSectionSelection = (input: {\n previous: PreviousFileSectionNavigation | null;\n current: FileSectionNavigation | undefined;\n currentResourceKey?: string;\n selectedNodeId?: string;\n}) => {\n const { previous, current, currentResourceKey, selectedNodeId } = input;\n if (!previous || !selectedNodeId || !previous.anchorIds.includes(selectedNodeId)) return false;\n if (current?.targetNodeId === selectedNodeId) return false;\n\n return !current || previous.treeId !== current.treeId || previous.resourceKey !== currentResourceKey;\n};\n","// Generic file-type dispatch for the file renderer. Markdown is the default so\n// `.md` / `.txt` / extension-less files open in the prose editor; recognised code\n// extensions open in Monaco; images render read-only. This is deliberately\n// domain-agnostic — it knows about file types, not about tickets.\n\nexport type FileKind = \"markdown\" | \"code\" | \"image\";\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"bmp\", \"ico\"]);\nconst PROSE_EXTENSIONS = new Set([\"md\", \"markdown\", \"txt\"]);\n\n// Extension → Monaco language id. Markdown/plain text intentionally absent so\n// they fall through to the prose editor.\nconst CODE_LANGUAGE_BY_EXTENSION: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n kt: \"kotlin\",\n c: \"c\",\n h: \"c\",\n cpp: \"cpp\",\n cc: \"cpp\",\n hpp: \"cpp\",\n cs: \"csharp\",\n php: \"php\",\n swift: \"swift\",\n sh: \"shell\",\n bash: \"shell\",\n zsh: \"shell\",\n sql: \"sql\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n html: \"html\",\n xml: \"xml\",\n yml: \"yaml\",\n yaml: \"yaml\",\n toml: \"ini\",\n ini: \"ini\",\n dockerfile: \"dockerfile\",\n graphql: \"graphql\",\n gql: \"graphql\",\n md: \"markdown\",\n markdown: \"markdown\",\n txt: \"plaintext\",\n};\n\nconst extensionOf = (fileName: string | undefined) => {\n if (!fileName) return \"\";\n const dot = fileName.lastIndexOf(\".\");\n if (dot < 0 || dot === fileName.length - 1) return \"\";\n return fileName.slice(dot + 1).toLowerCase();\n};\n\nconst isImage = (fileName: string | undefined, mimeType: string | undefined) => {\n if (mimeType?.startsWith(\"image/\")) return true;\n return IMAGE_EXTENSIONS.has(extensionOf(fileName));\n};\n\nexport const pickFileKind = (fileName: string | undefined, mimeType: string | undefined): FileKind => {\n if (isImage(fileName, mimeType)) return \"image\";\n const extension = extensionOf(fileName);\n if (!PROSE_EXTENSIONS.has(extension) && extension in CODE_LANGUAGE_BY_EXTENSION) return \"code\";\n return \"markdown\";\n};\n\n// Monaco language for a code file; falls back to plaintext for unknown extensions.\nexport const codeLanguageFor = (fileName: string | undefined) =>\n CODE_LANGUAGE_BY_EXTENSION[extensionOf(fileName)] ?? \"plaintext\";\n","import type { FileRendererContent } from \"../../../core\";\nimport { codeLanguageFor, pickFileKind } from \"./file-kind\";\n\nexport type FileRendererPresentation =\n | { kind: \"empty\"; isEditable: false }\n | { kind: \"image\"; isEditable: false }\n | { kind: \"code\"; isEditable: boolean; language: string }\n | { kind: \"markdown\"; isEditable: boolean };\n\nexport const resolveFileRendererPresentation = (\n content: FileRendererContent,\n contributionCanSave: boolean,\n): FileRendererPresentation => {\n if (content.emptyState) return { kind: \"empty\", isEditable: false };\n\n const automaticKind = pickFileKind(content.fileName, content.mimeType);\n if (automaticKind === \"image\") return { kind: \"image\", isEditable: false };\n\n const isEditable = contributionCanSave && content.editable !== false;\n if (automaticKind === \"code\" || content.textRenderer === \"monaco\") {\n return { kind: \"code\", isEditable, language: codeLanguageFor(content.fileName) };\n }\n return { kind: \"markdown\", isEditable };\n};\n","import { Box, Center, Flex, Image, Text } from \"@chakra-ui/react\";\nimport type { FileSourcePosition } from \"@pstdio/sdk/extensions\";\nimport { AlertMessage, EmptyState } from \"@pstdio/ui\";\nimport { CodeEditor } from \"@pstdio/ui/diff\";\nimport { MarkdownEditor } from \"@pstdio/ui/rich-text\";\nimport type { ReactNode, RefObject } from \"react\";\nimport type { FileRendererContent } from \"../../../core\";\nimport { resolveFileRendererPresentation } from \"./file-renderer-presentation\";\n\ninterface FileRendererContentViewProps {\n content: FileRendererContent;\n position?: FileSourcePosition;\n editorKey: string;\n errorNotice: ReactNode;\n contributionCanSave: boolean;\n onActiveSectionChange?: (sectionId: string | null) => void;\n onChange: (value: string) => void;\n rendererRef: RefObject<HTMLDivElement | null>;\n sectionNavigation?: {\n anchors: Array<{ id: string; heading: string; occurrence?: number }>;\n targetId: string;\n };\n title: string;\n}\n\nexport const FileRendererContentView = (props: FileRendererContentViewProps) => {\n const {\n content,\n position,\n editorKey,\n errorNotice,\n contributionCanSave,\n onActiveSectionChange,\n onChange,\n rendererRef,\n sectionNavigation,\n title,\n } = props;\n const presentation = resolveFileRendererPresentation(content, contributionCanSave);\n const positionNotice =\n position && presentation.kind !== \"code\" && presentation.kind !== \"empty\" ? (\n <AlertMessage status=\"info\" title=\"Source location unavailable\">\n This preview does not support source line selection.\n </AlertMessage>\n ) : null;\n\n if (presentation.kind === \"empty\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <EmptyState\n flex=\"1\"\n minH=\"0\"\n title={content.emptyState?.title ?? \"Select a file\"}\n description={content.emptyState?.description}\n />\n </Flex>\n );\n }\n\n if (presentation.kind === \"image\") {\n if (!content.dataUrl) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\">\n <Text color=\"fg.muted\">This image preview is unavailable.</Text>\n </Center>\n );\n }\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <Center ref={rendererRef} flex=\"1\" minH=\"0\" p=\"md\" overflow=\"auto\">\n <Image src={content.dataUrl} alt={content.fileName ?? title} maxW=\"100%\" maxH=\"100%\" objectFit=\"contain\" />\n </Center>\n </Flex>\n );\n }\n\n if (presentation.kind === \"code\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <Box flex=\"1\" minH=\"0\">\n <CodeEditor\n key={editorKey}\n language={presentation.language}\n position={position}\n fileName={content.fileName}\n defaultCode={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n showLineNumbers\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n }\n\n return (\n <Flex ref={rendererRef} direction=\"column\" h=\"full\" minH=\"0\" overflow=\"hidden\" bg=\"bg\">\n {errorNotice}\n {positionNotice}\n <Box flex=\"1\" minH=\"0\" overflowY=\"auto\">\n <MarkdownEditor\n key={editorKey}\n defaultState={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n sectionNavigation={sectionNavigation}\n placeholder={presentation.isEditable ? (content.placeholder ?? \"Write…\") : undefined}\n onActiveSectionChange={onActiveSectionChange}\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n};\n","// Owns the editable file renderer's save lifecycle: the last loaded or saved\n// value (the baseline), the debounced draft, the one in-flight save, and\n// refresh events that arrive while a draft or save exists.\n//\n// Invariants (from the renderer edit/refresh lifecycle PRD):\n// - a change equal to the baseline never schedules a save\n// - at most one save runs at a time; the baseline advances when it succeeds\n// - a failed save keeps the draft so a later change or flush retries it\n// - refresh events are deferred while a draft or save exists and coalesce\n// into one reload after the last save settles\n\nimport type {\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n FileRendererSaveResult,\n} from \"../../../core/registries/renderers/file-renderer-registry\";\n\nexport interface FileEditControllerState {\n dirty: boolean;\n saving: boolean;\n saveError?: string;\n removed?: true;\n}\n\nexport interface FileEditControllerInput {\n binding: Omit<FileRendererRefreshOrigin, \"operationId\"> & { resourceKey?: string };\n debounceMs: number;\n load: (event?: FileRendererRefreshEnvelope) => void;\n save: (value: string, origin: FileRendererRefreshOrigin) => Promise<FileRendererSaveResult | undefined>;\n createOperationId?: () => string;\n onStateChange?: (state: FileEditControllerState) => void;\n}\n\nexport type FileEditController = ReturnType<typeof createFileEditController>;\n\nexport const createFileEditController = (input: FileEditControllerInput) => {\n let baseline: string | undefined;\n let removed = false;\n let baselineRevision: string | undefined;\n let draft: string | null = null;\n let activeSave: { value: string; origin: FileRendererRefreshOrigin } | null = null;\n let saveError: string | undefined;\n let deferredRevision: string | undefined;\n let genericRefreshDeferred = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let operationSequence = 0;\n const seenRefreshRevisions = new Set<string>();\n const completedOperationIds = new Set<string>();\n\n const describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to save file.\");\n const getState = (): FileEditControllerState => ({\n dirty: draft !== null || (activeSave !== null && activeSave.value !== baseline),\n saving: activeSave !== null,\n ...(saveError ? { saveError } : {}),\n ...(removed ? { removed: true as const } : {}),\n });\n const notify = () => input.onStateChange?.(getState());\n\n const clearTimer = () => {\n if (timer === null) return;\n clearTimeout(timer);\n timer = null;\n };\n\n const nextOperationId = () => input.createOperationId?.() ?? `file-save-${Date.now()}-${++operationSequence}`;\n\n const hasPendingLocalState = () => draft !== null || activeSave !== null || timer !== null || Boolean(saveError);\n\n const deferRefresh = (event: FileRendererRefreshEnvelope) => {\n if (event.revision && (!deferredRevision || event.revision.localeCompare(deferredRevision) > 0)) {\n deferredRevision = event.revision;\n }\n if (!event.revision) genericRefreshDeferred = true;\n };\n\n const isSelfRefresh = (event: FileRendererRefreshEnvelope) => {\n const operationId = event.origin?.operationId;\n if (!operationId) return false;\n if (event.origin?.rendererId !== input.binding.rendererId) return false;\n if (event.origin.instanceId !== input.binding.instanceId) return false;\n return activeSave?.origin.operationId === operationId || completedOperationIds.has(operationId);\n };\n\n const takeDeferredRefresh = (savedRevision?: string) => {\n if (draft !== null || activeSave) return;\n const revision = deferredRevision;\n const generic = genericRefreshDeferred;\n deferredRevision = undefined;\n genericRefreshDeferred = false;\n if (revision && (!savedRevision || revision.localeCompare(savedRevision) > 0)) {\n input.load({ resourceKey: input.binding.resourceKey, revision });\n return;\n }\n if (generic) input.load({ resourceKey: input.binding.resourceKey });\n };\n\n const runSave = () => {\n if (removed || draft === null || activeSave || saveError) return;\n const value = draft;\n draft = null;\n const origin = {\n rendererId: input.binding.rendererId,\n instanceId: input.binding.instanceId,\n operationId: nextOperationId(),\n };\n activeSave = { value, origin };\n notify();\n void Promise.resolve(input.save(value, origin))\n .then((result) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n completedOperationIds.add(origin.operationId);\n if (completedOperationIds.size > 20) completedOperationIds.delete(completedOperationIds.values().next().value!);\n baseline = value;\n baselineRevision = result?.revision ?? baselineRevision;\n if (draft === baseline) {\n draft = null;\n clearTimer();\n }\n notify();\n if (draft !== null) {\n schedule();\n return;\n }\n takeDeferredRefresh(result?.revision);\n })\n .catch((error) => {\n if (removed) return;\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n if (draft === null) draft = value;\n saveError = describeError(error);\n notify();\n });\n };\n\n const schedule = () => {\n clearTimer();\n timer = setTimeout(() => {\n timer = null;\n runSave();\n }, input.debounceMs);\n };\n\n return {\n getDraft() {\n return draft ?? activeSave?.value ?? baseline;\n },\n markRemoved() {\n const retain = hasPendingLocalState();\n removed = true;\n draft = draft ?? activeSave?.value ?? null;\n activeSave = null;\n clearTimer();\n notify();\n return retain;\n },\n getBaseline() {\n return baseline;\n },\n getState,\n setBaseline(value: string | undefined, revision?: string) {\n baseline = value;\n baselineRevision = revision;\n notify();\n },\n // Takes a freshly loaded value as the new baseline and returns the value the\n // editor was showing, so the caller can tell whether the editor must show\n // something else. Returns null while pending local state must keep the\n // editor: the refresh is deferred until the save settles.\n acceptLoaded(value: string | undefined, revision?: string) {\n if (removed) return null;\n if (hasPendingLocalState()) {\n deferRefresh(revision ? { revision } : {});\n return null;\n }\n const shown = baseline;\n baseline = value;\n baselineRevision = revision;\n notify();\n return { shown };\n },\n handleChange(value: string) {\n if (removed) {\n draft = value;\n notify();\n return;\n }\n if (saveError && value === draft) return;\n saveError = undefined;\n if (value === baseline && !activeSave) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n if (activeSave?.value === value) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n draft = value;\n schedule();\n notify();\n },\n handleRefreshEvent(event: FileRendererRefreshEnvelope = {}) {\n if (removed) return;\n if (event.resourceKey && event.resourceKey !== input.binding.resourceKey) return;\n if (isSelfRefresh(event)) return;\n if (event.revision && seenRefreshRevisions.has(event.revision)) return;\n if (event.revision) seenRefreshRevisions.add(event.revision);\n if (hasPendingLocalState()) {\n deferRefresh(event);\n return;\n }\n if (event.revision && baselineRevision && event.revision.localeCompare(baselineRevision) <= 0) return;\n input.load(event);\n },\n retry() {\n if (!saveError || draft === null || activeSave) return;\n saveError = undefined;\n notify();\n runSave();\n },\n retryLoad() {\n if (removed) return;\n input.load({ resourceKey: input.binding.resourceKey });\n },\n flush() {\n clearTimer();\n runSave();\n },\n };\n};\n","import { Button, Flex, Text } from \"@chakra-ui/react\";\n\nexport const FileRendererErrorNotice = (props: { message: string; onRetry?: () => void }) => {\n const { message, onRetry } = props;\n return (\n <Flex\n flex=\"none\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"sm\"\n borderBottomWidth=\"1px\"\n borderColor=\"border.muted\"\n bg=\"bg.muted\"\n px=\"sm\"\n py=\"xs\"\n >\n <Text color=\"fg.muted\" textStyle=\"label/S/regular\">\n {message}\n </Text>\n {onRetry ? (\n <Button size=\"2xs\" variant=\"subtle\" onClick={onRetry}>\n Retry\n </Button>\n ) : null}\n </Flex>\n );\n};\n","import type { PageParams } from \"@pstdio/sdk/extensions\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"../../../core\";\n\ninterface FileRendererLoadKeyInput {\n fileRendererId: string;\n resource: ResourceRef | undefined;\n pageParams?: PageParams;\n}\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableValue(entry)]),\n );\n};\nexport const createFileRendererLoadKey = (input: FileRendererLoadKeyInput) => {\n const { fileRendererId, resource } = input;\n const resourceValue = resource\n ? stableValue({\n id: resource.id,\n type: resource.type,\n metadata: resource.metadata,\n })\n : null;\n const key = `${JSON.stringify(resourceKey(resource))}:${fileRendererId}:${JSON.stringify(resourceValue)}`;\n return input.pageParams ? `${key}:${JSON.stringify(stableValue(input.pageParams))}` : key;\n};\nexport const isCurrentLoadedFile = (\n loaded: {\n loadKey: string;\n } | null,\n loadKey: string,\n) => loaded?.loadKey === loadKey;\n","import { Text } from \"@chakra-ui/react\";\nimport { Header, resolveFileIconElement, useFileIconThemePreference } from \"@pstdio/ui\";\n\nexport const FileRendererPathHeader = (props: { fileName: string; filePath: string }) => {\n const { fileName, filePath } = props;\n const { activeFileIconTheme } = useFileIconThemePreference();\n\n return (\n <Header variant=\"narrow\" flexShrink={0} gap=\"2xs\" bg=\"bg\">\n {resolveFileIconElement(fileName, { theme: activeFileIconTheme })}\n <Text aria-label={`File path ${filePath}`} textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {filePath}\n </Text>\n </Header>\n );\n};\n","import { Box, Button, Center, Flex, Spinner, Text } from \"@chakra-ui/react\";\nimport { type ResourceRef, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { type ReactNode, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { RegisteredFileRendererContribution, WorkbenchCore, WorkbenchPanelInstance } from \"../../../core\";\nimport { getWorkbenchRenderers, rendererReadKey } from \"../../../core\";\nimport {\n getFileSectionNavigation,\n resolveFileSectionTargetId,\n shouldClearFileSectionSelection,\n} from \"../../../core/registries/renderers/file-section-navigation\";\nimport { useWorkbenchStore } from \"../../shared/use-workbench-store\";\nimport { usePageParams } from \"../use-page-params\";\nimport { FileRendererContentView } from \"./file-renderer-content\";\nimport {\n createFileEditController,\n type FileEditController,\n type FileEditControllerState,\n} from \"./file-renderer-edit-state\";\nimport { FileRendererErrorNotice } from \"./file-renderer-error-notice\";\nimport { createFileRendererLoadKey, isCurrentLoadedFile } from \"./file-renderer-load-key\";\nimport {\n acceptFileRendererLoad,\n type LoadedFile,\n readCachedFileContent,\n saveLoadedFile,\n storeCachedFileContent,\n} from \"./file-renderer-load-state\";\nimport { FileRendererPathHeader } from \"./file-renderer-path-header\";\n\ninterface WorkbenchFileRendererViewProps {\n workbench: WorkbenchCore;\n contribution: RegisteredFileRendererContribution;\n // The bound resource (e.g. the open ticket / ticket-file) the load/save\n // commands operate on.\n placement?: WorkbenchPanelInstance;\n}\nconst SAVE_DEBOUNCE_MS = 600;\nconst describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to load file.\");\nconst syncActiveFileSection = (input: {\n workbench: WorkbenchCore;\n navigation: ReturnType<typeof getFileSectionNavigation>;\n sectionId: string | null;\n}) => {\n const { workbench, navigation, sectionId } = input;\n if (!navigation || !getWorkbenchRenderers(workbench).getTreeRenderer(navigation.treeId)) return;\n if (sectionId && navigation.anchors.some((anchor) => anchor.id === sectionId)) {\n getWorkbenchRenderers(workbench).setSelectedNode(navigation.treeId, sectionId);\n return;\n }\n const selectedNodeId = getWorkbenchRenderers(workbench).getTreeState(navigation.treeId).selectedNodeId;\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) {\n getWorkbenchRenderers(workbench).setSelectedNode(navigation.treeId, undefined);\n }\n};\nconst getEditorSectionNavigation = (\n workbench: WorkbenchCore,\n navigation: ReturnType<typeof getFileSectionNavigation>,\n) => {\n if (!navigation) return undefined;\n const selectedNodeId = getWorkbenchRenderers(workbench).getTreeRenderer(navigation.treeId)\n ? getWorkbenchRenderers(workbench).getTreeState(navigation.treeId).selectedNodeId\n : undefined;\n return {\n anchors: navigation.anchors,\n targetId: resolveFileSectionTargetId(navigation, selectedNodeId),\n };\n};\nconst useFilePosition = (workbench: WorkbenchCore, resource?: ResourceRef) =>\n useWorkbenchStore(workbench.pages.store, (state) => {\n const location = state.location;\n if (!location?.position || resourceKey(location.resource) !== resourceKey(resource)) return undefined;\n const page = Object.values(state.pages).find(\n (page) => page.ref.id === location.page.id && page.ref.extensionId === location.page.extensionId,\n );\n const key = page?.document?.metadataKey;\n if (!key || location.resource?.metadata?.[key] !== resource?.metadata?.[key]) return undefined;\n return location.position;\n });\n\nconst FileRendererHeader = (props: { file: LoadedFile }) => {\n const { file } = props;\n return file.filePath ? (\n <FileRendererPathHeader fileName={file.fileName ?? file.filePath} filePath={file.filePath} />\n ) : null;\n};\n\nconst fileRendererOwnerKey = (\n placement: WorkbenchPanelInstance | undefined,\n contributionId: string,\n loadKey: string,\n) => (placement ? rendererReadKey(placement) : JSON.stringify([\"file\", contributionId, loadKey]));\n\nexport const WorkbenchFileRendererView = (props: WorkbenchFileRendererViewProps) => {\n const { workbench, contribution } = props;\n const resource = props.placement?.resource;\n const position = useFilePosition(workbench, resource);\n const sectionNavigation = getFileSectionNavigation(resource);\n const editorSectionNavigation = getEditorSectionNavigation(workbench, sectionNavigation);\n const pageParams = usePageParams(workbench, props.placement);\n const loadKey = createFileRendererLoadKey({ fileRendererId: contribution.id, resource, pageParams });\n const [loaded, setLoaded] = useState<LoadedFile | null>(null);\n const [error, setError] = useState<{\n loadKey: string;\n message: string;\n } | null>(null);\n const [editState, setEditState] = useState<FileEditControllerState>({ dirty: false, saving: false });\n const controllerRef = useRef<FileEditController | null>(null);\n const retryReadRef = useRef<(() => void) | undefined>(undefined);\n const rendererRef = useRef<HTMLDivElement>(null);\n const previousSectionNavigationRef = useRef<{\n resourceKey?: string;\n treeId: string;\n anchorIds: string[];\n } | null>(null);\n useEffect(() => {\n const previous = previousSectionNavigationRef.current;\n const selectedNodeId =\n previous && getWorkbenchRenderers(workbench).getTreeRenderer(previous.treeId)\n ? getWorkbenchRenderers(workbench).getTreeState(previous.treeId).selectedNodeId\n : undefined;\n if (\n shouldClearFileSectionSelection({\n previous,\n current: sectionNavigation,\n currentResourceKey: resourceKey(resource),\n selectedNodeId,\n }) &&\n previous\n ) {\n getWorkbenchRenderers(workbench).setSelectedNode(previous.treeId, undefined);\n }\n previousSectionNavigationRef.current = sectionNavigation\n ? {\n resourceKey: resourceKey(resource),\n treeId: sectionNavigation.treeId,\n anchorIds: sectionNavigation.anchors.map((anchor) => anchor.id),\n }\n : null;\n }, [resource, sectionNavigation, workbench]);\n // Contribution refresh re-registers an identical contribution as a new\n // object, and a save that changes the document title produces a new resource\n // object with a fresh label. The load key uses resource values instead of\n // object identity, while callbacks read the latest objects through refs.\n const contributionRef = useRef(contribution);\n const resourceRef = useRef(resource);\n const pageParamsRef = useRef(pageParams);\n const placementRef = useRef(props.placement);\n useEffect(() => {\n contributionRef.current = contribution;\n resourceRef.current = resource;\n pageParamsRef.current = pageParams;\n placementRef.current = props.placement;\n });\n const contributionId = contribution.id;\n const hasSave = Boolean(contribution.save);\n const ownerKey = fileRendererOwnerKey(props.placement, contributionId, loadKey);\n const instanceId = props.placement?.instanceId ?? contributionId;\n // Re-binding a singleton widget to another resource changes `resource` and reloads.\n useEffect(() => {\n let cancelled = false;\n let removed = false;\n const boundResource = resourceRef.current;\n const boundContribution = contributionRef.current;\n const read = workbench.views.reads.bind(ownerKey);\n let controller: FileEditController | null = null;\n setError(null);\n // A recently viewed document mounts immediately from the cache; the load\n // below reconciles it (unchanged content keeps the editor mounted).\n const cached = readCachedFileContent(loadKey);\n let baseline = cached;\n setLoaded(cached ? { ...cached, editorRevision: 1, loadKey } : null);\n const load = (reason: \"refresh\" | \"retry\" = \"refresh\") => {\n read.request(\n {\n queryKey: loadKey,\n load: (signal) => contributionRef.current.load(resourceRef.current, signal, pageParamsRef.current),\n onValue: (next) => {\n if (cancelled || removed) return;\n const updateLoaded = acceptFileRendererLoad(next, loadKey, controller);\n if (!updateLoaded) return;\n baseline = next;\n setError(null);\n setLoaded(updateLoaded);\n },\n onError: (loadError) => {\n if (cancelled || removed) return;\n setError({ loadKey, message: describeError(loadError) });\n },\n },\n reason,\n );\n };\n retryReadRef.current = () => load(\"retry\");\n controller = hasSave\n ? createFileEditController({\n binding: {\n rendererId: contributionId,\n instanceId,\n resourceKey: resourceKey(resourceRef.current),\n },\n debounceMs: SAVE_DEBOUNCE_MS,\n load: () => load(),\n onStateChange: (state) => {\n if (!cancelled) setEditState(state);\n },\n save: async (value, origin) => {\n const saved = await saveLoadedFile(boundContribution, boundResource, value, origin, baseline);\n baseline = saved.content;\n if (baseline && !removed) storeCachedFileContent(loadKey, baseline);\n return saved.result;\n },\n })\n : null;\n controllerRef.current = controller;\n if (cached) controllerRef.current?.setBaseline(cached.content, cached.revision);\n setEditState({ dirty: false, saving: false });\n load();\n const removalSubscription = workbench.resources.onWillRemove((resource) => {\n if (resourceKey(resource) !== resourceKey(resourceRef.current)) return [];\n removed = true;\n const retain = controllerRef.current?.markRemoved();\n const identity = placementRef.current?.placementIdentity;\n return retain && identity ? [identity] : [];\n });\n const refreshSubscription = getWorkbenchRenderers(workbench).onDidRefreshFileRenderer((event) => {\n if (removed || event.fileRendererId !== contributionId) return;\n const controller = controllerRef.current;\n if (controller) controller.handleRefreshEvent(event);\n else load();\n });\n return () => {\n cancelled = true;\n read.dispose();\n retryReadRef.current = undefined;\n refreshSubscription.dispose();\n removalSubscription.dispose();\n // Flush the last keystrokes on unbind; the load callback above is\n // cancelled, so a deferred refresh cannot resurrect the old binding.\n controller?.flush();\n if (controllerRef.current === controller) controllerRef.current = null;\n };\n }, [contributionId, hasSave, workbench, loadKey, ownerKey, instanceId]);\n // The last keystrokes are also flushed when the tab is hidden or closed.\n useEffect(() => {\n const flush = () => controllerRef.current?.flush();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") flush();\n };\n window.addEventListener(\"beforeunload\", flush);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.removeEventListener(\"beforeunload\", flush);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, []);\n const handleChange = (value: string) => {\n controllerRef.current?.handleChange(value);\n };\n const currentLoaded = isCurrentLoadedFile(loaded, loadKey) ? loaded : null;\n const scrollResetKey = currentLoaded ? `${currentLoaded.loadKey}:${currentLoaded.editorRevision}` : \"\";\n useLayoutEffect(() => {\n if (!scrollResetKey || sectionNavigation) return;\n const node = rendererRef.current;\n if (!node) return;\n requestAnimationFrame(() => {\n let current = node.parentElement;\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if ([\"auto\", \"scroll\", \"overlay\"].includes(overflowY) && current.scrollHeight > current.clientHeight) {\n current.scrollTop = 0;\n }\n current = current.parentElement;\n }\n });\n }, [scrollResetKey, sectionNavigation]);\n const loadError = error?.loadKey === loadKey ? error.message : undefined;\n if (loadError && !currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\" flexDirection=\"column\" gap=\"sm\">\n <Text color=\"fg.muted\">{loadError}</Text>\n <Button size=\"xs\" variant=\"subtle\" onClick={() => retryReadRef.current?.()}>\n Retry\n </Button>\n </Center>\n );\n }\n if (!currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\">\n <Spinner size=\"sm\" />\n </Center>\n );\n }\n // The key must carry the document identity, not just the contribution: two\n // documents from the same renderer both start at revision 1, so keying on the\n // contribution alone reuses the editor and keeps showing the previous file.\n const editorKey = `${currentLoaded.loadKey}:${currentLoaded.editorRevision}`;\n let errorNotice: ReactNode = null;\n if (editState.removed) {\n errorNotice = (\n <FileRendererErrorNotice message=\"This resource was removed. Your draft is kept here. Copy it before closing this tab.\" />\n );\n } else if (loadError) {\n errorNotice = <FileRendererErrorNotice message={loadError} onRetry={() => retryReadRef.current?.()} />;\n } else if (editState.saveError) {\n errorNotice = (\n <FileRendererErrorNotice message={editState.saveError} onRetry={() => controllerRef.current?.retry()} />\n );\n }\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n <FileRendererHeader file={currentLoaded} />\n <Box flex=\"1\" minH=\"0\">\n <FileRendererContentView\n content={currentLoaded}\n position={position}\n editorKey={editorKey}\n errorNotice={errorNotice}\n contributionCanSave={Boolean(contribution.save)}\n onActiveSectionChange={\n sectionNavigation\n ? (sectionId) => syncActiveFileSection({ workbench, navigation: sectionNavigation, sectionId })\n : undefined\n }\n onChange={handleChange}\n rendererRef={rendererRef}\n sectionNavigation={editorSectionNavigation}\n title={contribution.title}\n />\n </Box>\n </Flex>\n );\n};\n"],"mappings":"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"}