Skip to content

sheetCreate renders blank body — dispatch/runtime arg-shape mismatch (flagged in v0.5.345 CHANGELOG, never tracked) #1033

Description

@proggeramlug

Summary

sheetCreate(body, width, height) opens a sheet at the requested dimensions but the body widget's children are invisible. The sheet appears as a blank white rounded rect.

This was explicitly flagged in the v0.5.345 CHANGELOG entry:

Latent mismatches surfaced during the audit but NOT fixed in this commit (they don't crash today by luck and are tracked separately): Picker / tabbarAddTab / frameSplitCreate / TextArea constructor / sheetCreate arg shapes — each will need a similar dispatch-vs-runtime alignment, but only when those code paths actually exercise the Win64 ABI path.

…but no follow-up issue was filed. Hit it via macOS while building a real app, so the "doesn't crash today by luck" assumption doesn't hold for the body rendering — the dimensions work but the body handle is being misinterpreted.

Environment

  • Perry: 0.5.958
  • Target: macOS arm64 (perry-ui-macos)
  • macOS 26.4 (Darwin 25.4.0)

Minimal repro

import {
  App, VStack, HStack, Text, Button, Spacer,
  sheetCreate, sheetPresent, sheetDismiss,
  widgetSetBackgroundColor, setCornerRadius, setPadding,
  textSetFontSize,
} from 'perry/ui';

const titleText = Text('Hello from inside the sheet');
textSetFontSize(titleText, 16);
const okBtn = Button('OK', () => {});

const card = VStack(10, [titleText, okBtn]);
widgetSetBackgroundColor(card, 1.0, 1.0, 1.0, 1.0);
setCornerRadius(card, 12);
setPadding(card, 20, 24, 20, 24);

const open = Button('Open sheet', () => {
  const sheet = sheetCreate(card, 400, 240);
  sheetPresent(sheet);
});

App({ title: 'Sheet repro', width: 600, height: 400, body: VStack(0, [open]) });

Expected: click "Open sheet" → modal sheet appears with "Hello from inside the sheet" and an OK button.

Actual: modal sheet appears at 400×240, but it is completely blank — the title text and OK button are not rendered. The sheet IS in the AppKit window list (CGWindowListCopyWindowInfo shows a Mango-owned window at the expected size) but contains no visible children.

I verified the card widget is well-formed by adding it to a regular window — the title + button render normally there.

Workaround I'm using in MangoQuery/app

For modal-style dialogs I switched to either:

  1. NSAlert via alertWithButtons(title, message, buttons[], cb) — works perfectly for yes/no destructive confirmations (drop collection, bulk delete, etc.).

  2. ZStack overlay over appBody for richer panels like the Cmd+K command palette:

    const paletteOverlay = VStack(0, []);
    widgetSetBackgroundColor(paletteOverlay, 0, 0, 0, 0.45); // dim backdrop
    widgetSetHidden(paletteOverlay, 1);
    const appRoot = ZStack();
    widgetAddChild(appRoot, appBody);
    widgetAddChild(appRoot, paletteOverlay);
    App({ ..., body: appRoot });

    Then showCommandPalette() fills paletteOverlay with the card and flips widgetSetHidden(..., 0).

Both work, but neither gives the native sheet animation/positioning users expect on macOS.

Related (same arg-shape mismatch family)

From the same v0.5.345 CHANGELOG paragraph: Picker, tabbarAddTab, frameSplitCreate, TextArea constructor. Worth checking if these are tracked elsewhere — if not, may be worth one umbrella tracking issue or filing them at the same time.

Cross-link

Worked around in MangoQuery/app commit 8fd84f8 — see the commit message body for context on the user-visible impact (Cmd+K palette and destructive-confirm dialogs were appearing blank on every launch).

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugConfirmed defect or regression

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions