);
const onClick = (e: MouseEvent) => this._navigateToPiece(e);
clip.addEventListener("click", onClick);
return () => {
clip.removeEventListener("click", onClick);
inner?.();
clip.remove();
};
}
/** Navigate to the rendered piece (same behavior as cf-cell-link). */
private _navigateToPiece(e: MouseEvent) {
e.stopPropagation();
try {
const target = this._resolvedCell ?? this.cell;
const view = {
spaceDid: target.space(),
pieceId: target.id(),
};
// Cmd (Mac) / Ctrl (Win/Linux) opens in a new tab.
if (e.metaKey || e.ctrlKey) {
const url = appViewToUrlPath(
preserveAppViewMode(
urlToAppView(new URL(globalThis.location.href)),
view,
),
);
globalThis.open(url, "_blank");
} else {
navigate(view);
}
} catch (error) {
console.error("[cf-render] tile navigation failed:", error);
}
}
private _cleanupRender() {
if (this._cleanup) {
this._log("cleaning up previous render");
this._cleanup();
this._cleanup = undefined;
}
}
private _handleRenderError(error: unknown) {
// A disposal race (runtime swap, logout) cancels an in-flight cell sync;
// that is cancellation, not a render failure to surface.
if (this.cell?.runtime().signal.aborted) return;
console.error("[cf-render] Error rendering cell:", error);
const container = this._containerRef.value;
if (container) {
container.innerHTML =
`Error rendering content: ${
error instanceof Error ? error.message : "Unknown error"
}
`;
}
}
override disconnectedCallback() {
this._log("disconnectedCallback called");
super.disconnectedCallback();
this._renderingCellId = undefined;
this._resolvedCell = undefined;
this._hasRendered = false;
this._cleanupRender();
}
}