summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/pierre/file-runtime.ts
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-26 18:23:04 -0600
committerGitHub <[email protected]>2026-02-26 18:23:04 -0600
commitfc52e4b2d3a41efde772e6de8fb2e01f27821701 (patch)
treecf23af294a00a10e55f230232585344c111f0bb9 /packages/ui/src/pierre/file-runtime.ts
parent9a6bfeb782766099d4ce3a98bb9e7b4e79f8bfe6 (diff)
downloadopencode-fc52e4b2d3a41efde772e6de8fb2e01f27821701.tar.gz
opencode-fc52e4b2d3a41efde772e6de8fb2e01f27821701.zip
feat(app): better diff/code comments (#14621)
Co-authored-by: adamelmore <[email protected]> Co-authored-by: David Hill <[email protected]>
Diffstat (limited to 'packages/ui/src/pierre/file-runtime.ts')
-rw-r--r--packages/ui/src/pierre/file-runtime.ts114
1 files changed, 114 insertions, 0 deletions
diff --git a/packages/ui/src/pierre/file-runtime.ts b/packages/ui/src/pierre/file-runtime.ts
new file mode 100644
index 000000000..a20721003
--- /dev/null
+++ b/packages/ui/src/pierre/file-runtime.ts
@@ -0,0 +1,114 @@
+type ReadyWatcher = {
+ observer?: MutationObserver
+ token: number
+}
+
+export function createReadyWatcher(): ReadyWatcher {
+ return { token: 0 }
+}
+
+export function clearReadyWatcher(state: ReadyWatcher) {
+ state.observer?.disconnect()
+ state.observer = undefined
+}
+
+export function getViewerHost(container: HTMLElement | undefined) {
+ if (!container) return
+ const host = container.querySelector("diffs-container")
+ if (!(host instanceof HTMLElement)) return
+ return host
+}
+
+export function getViewerRoot(container: HTMLElement | undefined) {
+ return getViewerHost(container)?.shadowRoot ?? undefined
+}
+
+export function applyViewerScheme(host: HTMLElement | undefined) {
+ if (!host) return
+ if (typeof document === "undefined") return
+
+ const scheme = document.documentElement.dataset.colorScheme
+ if (scheme === "dark" || scheme === "light") {
+ host.dataset.colorScheme = scheme
+ return
+ }
+
+ host.removeAttribute("data-color-scheme")
+}
+
+export function observeViewerScheme(getHost: () => HTMLElement | undefined) {
+ if (typeof document === "undefined") return () => {}
+
+ applyViewerScheme(getHost())
+ if (typeof MutationObserver === "undefined") return () => {}
+
+ const root = document.documentElement
+ const monitor = new MutationObserver(() => applyViewerScheme(getHost()))
+ monitor.observe(root, { attributes: true, attributeFilter: ["data-color-scheme"] })
+ return () => monitor.disconnect()
+}
+
+export function notifyShadowReady(opts: {
+ state: ReadyWatcher
+ container: HTMLElement
+ getRoot: () => ShadowRoot | undefined
+ isReady: (root: ShadowRoot) => boolean
+ onReady: () => void
+ settleFrames?: number
+}) {
+ clearReadyWatcher(opts.state)
+ opts.state.token += 1
+
+ const token = opts.state.token
+ const settle = Math.max(0, opts.settleFrames ?? 0)
+
+ const runReady = () => {
+ const step = (left: number) => {
+ if (token !== opts.state.token) return
+ if (left <= 0) {
+ opts.onReady()
+ return
+ }
+ requestAnimationFrame(() => step(left - 1))
+ }
+
+ requestAnimationFrame(() => step(settle))
+ }
+
+ const observeRoot = (root: ShadowRoot) => {
+ if (opts.isReady(root)) {
+ runReady()
+ return
+ }
+
+ if (typeof MutationObserver === "undefined") return
+
+ clearReadyWatcher(opts.state)
+ opts.state.observer = new MutationObserver(() => {
+ if (token !== opts.state.token) return
+ if (!opts.isReady(root)) return
+
+ clearReadyWatcher(opts.state)
+ runReady()
+ })
+ opts.state.observer.observe(root, { childList: true, subtree: true })
+ }
+
+ const root = opts.getRoot()
+ if (!root) {
+ if (typeof MutationObserver === "undefined") return
+
+ opts.state.observer = new MutationObserver(() => {
+ if (token !== opts.state.token) return
+
+ const next = opts.getRoot()
+ if (!next) return
+
+ observeRoot(next)
+ })
+ opts.state.observer.observe(opts.container, { childList: true, subtree: true })
+ return
+ }
+
+ observeRoot(root)
+}