RiseUI
Components

Popover

HeroUI v3 popover — overlay surface, rounded-3xl, shadow, dialog padding, curved arrow, placements — popover.tsx + popover.css.

Usage

Default story — heading + body + close (no arrow).

RisePopover(
  controller: controller,
  overlay: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    mainAxisSize: MainAxisSize.min,
    children: [
      Text('Popover heading', style: headingStyle),
      Text('This is the popover content'),
      TextButton(onPressed: controller.hide, child: const Text('Close')),
    ],
  ),
  child: RiseButton(
    label: 'Open popover',
    variant: RiseButtonVariant.outline,
    onPressed: controller.show,
  ),
)

With arrow

`Popover.Arrow` geometry — `M0 0 Q6 9 12 0`, placement-aware rotation.

RisePopover(
  controller: controller,
  showArrow: true,
  overlay: /* … */,
  child: RiseButton(
    label: 'With arrow',
    variant: RiseButtonVariant.outline,
    onPressed: controller.show,
  ),
)

Placement

Top, right, bottom, left — each with arrow + anchor.

RisePopover(
  controller: controller,
  placement: RisePopoverPlacement.right,
  showArrow: true,
  overlay: /* … */,
  child: RiseButton(
    label: 'Right',
    variant: RiseButtonVariant.outline,
    onPressed: controller.show,
  ),
)

Interactive content

Rich body + actions (profile-style blocks).

RisePopover(
  controller: controller,
  showArrow: true,
  maxWidth: 300,
  overlay: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    mainAxisSize: MainAxisSize.min,
    children: [
      Text('Sarah Johnson'),
      Text('@sarahj'),
      Row(
        children: [
          Expanded(child: RiseButton(label: 'Message', onPressed: () {})),
          Expanded(
            child: RiseButton(
              label: 'Close',
              variant: RiseButtonVariant.outline,
              onPressed: controller.hide,
            ),
          ),
        ],
      ),
    ],
  ),
  child: RiseButton(
    label: 'Interactive content',
    variant: RiseButtonVariant.outline,
    onPressed: controller.show,
  ),
)

Custom trigger

`Popover.Trigger`-style custom hit target.

RisePopover(
  controller: controller,
  overlay: const Text('Any widget can trigger'),
  child: InkWell(
    onTap: controller.show,
    child: const Row(
      mainAxisSize: MainAxisSize.min,
      children: [Icon(Icons.more_horiz), Text('Open popover')],
    ),
  ),
)

Card with helptext

Storybook `CardWithHelptext` — help icon + `placement: right` help popover.

RisePopover(
  controller: helpController,
  placement: RisePopoverPlacement.right,
  showArrow: true,
  maxWidth: 220,
  overlay: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    mainAxisSize: MainAxisSize.min,
    children: [
      Text('Help Information'),
      Text('Short helptext next to the card title.'),
      TextButton(onPressed: helpController.hide, child: const Text('Close')),
    ],
  ),
  child: RiseButton(
    isIconOnly: true,
    variant: RiseButtonVariant.ghost,
    size: RiseButtonSize.sm,
    onPressed: helpController.show,
    child: const Icon(Icons.info_outline),
  ),
)