import { FrameBufferRenderable, RGBA, type OptimizedBuffer, type RenderContext, type RenderableOptions, } from "@opentui/core" import { extend, useRenderer } from "@opentui/solid" import { onCleanup, onMount } from "solid-js" import { tint, useTheme } from "../context/theme" import { GoUpsellArtPainter } from "./bg-pulse-render" type GoUpsellArtOptions = RenderableOptions & { backgroundPanel?: RGBA primary?: RGBA logoBase?: RGBA } class GoUpsellArtRenderable extends FrameBufferRenderable { private painter = new GoUpsellArtPainter() constructor(ctx: RenderContext, options: GoUpsellArtOptions = {}) { const width = typeof options.width === "number" ? options.width : 1 const height = typeof options.height === "number" ? options.height : 1 super(ctx, { ...options, width, height, live: options.live ?? true, respectAlpha: false, }) if (options.width !== undefined && typeof options.width !== "number") this.width = options.width if (options.height !== undefined && typeof options.height !== "number") this.height = options.height this.painter.setBackgroundPanel(options.backgroundPanel) this.painter.setPrimary(options.primary) this.painter.setLogoBase(options.logoBase) } set backgroundPanel(value: RGBA | undefined) { if (this.painter.setBackgroundPanel(value)) this.requestRender() } set logoBase(value: RGBA | undefined) { if (this.painter.setLogoBase(value)) this.requestRender() } set primary(value: RGBA | undefined) { if (this.painter.setPrimary(value)) this.requestRender() } protected override renderSelf(buffer: OptimizedBuffer, deltaTime = 0): void { if (!this.visible || this.isDestroyed) return this.painter.render(this.frameBuffer, { deltaTime, rgb: this._ctx.capabilities?.rgb === true, }) super.renderSelf(buffer) } } declare module "@opentui/solid" { interface OpenTUIComponents { go_upsell_art: typeof GoUpsellArtRenderable } } extend({ go_upsell_art: GoUpsellArtRenderable }) export function BgPulse() { const { theme } = useTheme() const renderer = useRenderer() let targetFps = renderer.targetFps let maxFps = renderer.maxFps onMount(() => { targetFps = renderer.targetFps maxFps = renderer.maxFps renderer.targetFps = 30 renderer.maxFps = 30 }) onCleanup(() => { renderer.targetFps = targetFps renderer.maxFps = maxFps }) return ( ) }