• src/syncterm/scripts/ui_markdown.wrensrc/syncterm/Wren.adoc src/syncte

    From Deucе@VERT to Git commit to main/sbbs/master on Mon May 4 11:26:55 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/3b482030a400bbdeac8cef99
    Added Files:
    src/syncterm/scripts/ui_markdown.wren
    Modified Files:
    src/syncterm/Wren.adoc src/syncterm/scripts/auto/connected/capture_menu.wren src/syncterm/scripts/sftp_app.wren sftp_queue.wren syncterm.wren ui_help.wren ui_help_test.wren ui_list_test.wren ui_pane.wren ui_popup.wren ui_style.wren src/syncterm/wren_bind_conn.c wren_bind_fs.c
    Log Message:
    SyncTERM: markdown help renderer + UIFC popup padding

    Help body strings (and any pane.helpText) are now parsed as a small
    CommonMark + Pandoc subset by ui_markdown.wren — # / ## / ### headings,
    - bullets, **bold**, `code`, Pandoc def-lists (term \n : desc), and trailing-2-space hard breaks. Layout reflows on width, descriptions
    in def-lists wrap inside the description column, and headings render
    as a UIFC-style blue-on-cyan reverse bar.

    Help dialog placement matches UIFC: full cterm height minus the
    status row, 2-cell horizontal margin, 1-cell text padding inside the
    frame on every side except the scrollbar column. The frame [X] now
    dismisses (handle() falls through to Pane). ESC/Enter, Up/Down/Page,
    Home/End, wheel, and scrollbar drag all still work.

    Pane gains contentBounds — innerBounds inset by 1 cell — and the
    Popup family (Alert/Confirm/Prompt/PopStatus) lays itself out inside
    that. Buttons anchor against the bottom frame, leaving the row above
    them as a natural visual separator.

    Style roles: help body bright white on blue (was dim grey, now matches
    UIFC lclr); help.bold and help.code both yellow (UIFC hclr); help.heading.{1,2,3} blue on cyan reverse bar.

    Host.downloadDir also returns null when DownloadPath doesn't exist on
    disk — funnels the configured-but-missing case through the same null
    gate that callers already check. dir_check reorders the existence
    test before the dead-flag test so the misleading "ancestor's
    Directory.delete invalidated it" message no longer eats the real
    "backing directory no longer exists" cause. SFTP queue ETA floors
    to integer seconds before formatting (avoids %g scientific notation
    for sub-second values).

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

    ---
    ■ Synchronet ■ Vertrauen ■ Home of Synchronet ■ [vert/cvs/bbs].synchro.net