hoverCard function

BloomNode hoverCard({
  1. required BloomNode trigger,
  2. required BloomNode content,
  3. String side = 'bottom',
  4. String align = 'center',
  5. String extraClassName = '',
})

Pure CSS hover card preview component.

Reveals rich preview content on hover and focus-within.

Implementation

BloomNode hoverCard({
  required BloomNode trigger,
  required BloomNode content,
  String side = 'bottom',
  String align = 'center',
  String extraClassName = '',
}) {
  String positionClasses;
  switch (side) {
    case 'top':
      final alignClass = align == 'left'
          ? 'left-0'
          : align == 'right'
              ? 'right-0'
              : 'left-1/2 -translate-x-1/2';
      positionClasses = 'bottom-full mb-2 $alignClass';
      break;
    case 'left':
      positionClasses = 'right-full top-1/2 -translate-y-1/2 mr-2';
      break;
    case 'right':
      positionClasses = 'left-full top-1/2 -translate-y-1/2 ml-2';
      break;
    case 'bottom':
    default:
      final alignClass = align == 'left'
          ? 'left-0'
          : align == 'right'
              ? 'right-0'
              : 'left-1/2 -translate-x-1/2';
      positionClasses = 'top-full mt-2 $alignClass';
      break;
  }

  return Div(
    attrs: const {'data-slot': 'hover-card'},
    className: cn(['relative inline-block group/hc', extraClassName]),
    children: [
      trigger,
      Div(
        attrs: const {'role': 'tooltip'},
        className: cn([
          'invisible opacity-0 group-hover/hc:visible group-hover/hc:opacity-100 '
          'group-focus-within/hc:visible group-focus-within/hc:opacity-100 '
          'transition-all duration-150 absolute z-50 min-w-[220px] max-w-xs '
          'rounded-[var(--radius-md)] border border-[var(--border)] '
          'bg-[var(--card)] text-[var(--card-foreground)] p-3 shadow-[var(--shadow-overlay)] text-xs',
          positionClasses,
        ]),
        children: [content],
      ),
    ],
  );
}