• v0.1.501-beta beddfc963e

    Ghost released this 2026-07-23 11:55:57 +02:00 | 161 commits to main since this release

    Studio: viewport-gated highlight for the executed Python script (follow-up to #7240) (#7363)

    • Studio: keep the executed Python script visible in chat, with download + viewport-gated highlight

    Always show the executed Python script under the tool card (not only inside the
    collapsible run/output section, which is unmounted from history), with Copy and a
    client-side .py Download button, so the script stays visible on reopen (#7165).

    The script is rendered eagerly, but shiki syntax-highlighting only runs once the
    block scrolls near the viewport (IntersectionObserver, 200px margin); until then a
    plain monospace placeholder shows the same source with matching padding, so there
    is no layout jump. This bounds highlighting to the cards actually on screen instead
    of tokenizing every script up front. Measured shiki cost is ~8 ms per typical 2 KB
    script, so eager highlighting of a long agentic transcript (20-50+ Python calls)
    would add ~170-420 ms of main-thread work on load; viewport-gating keeps it to the
    few visible cards (~15-35 ms) regardless of transcript length. Falls back to
    immediate highlight when IntersectionObserver is unavailable (SSR / tests).

    • Use a div for the pre-highlight placeholder so container [&_pre]:!p-0 doesn't strip its p-3

    The placeholder shares the highlighted block's p-3 padding to avoid a layout
    jump, but as a

     it was caught by the container's [&_pre]:!p-0 !important
    rule and rendered with no padding, so the script shifted by p-3 when shiki
    swapped in. A plain div keeps the padding.

    • Match placeholder wrapping to the highlighted pre (whitespace-pre, not pre-wrap)

    The placeholder wrapped long lines while the highlighted Streamdown

     keeps
    them on one line and scrolls in the container's overflow-auto, so a script with a
    long line changed height when shiki swapped in. Use whitespace-pre so the
    placeholder scrolls the same way and the height stays stable.


    Co-authored-by: danielhanchen unslothai@gmail.com

    Downloads