Feedback tooltiphint

Simple Tooltip

Hover-based hint message.

Preview

Simple Tooltip

Usage

Copy the full block below to use this component with its imports.

astro
---
import { SimpleTooltip } from 'astro-component-kit';
---

<SimpleTooltip text="Edit profile" position="top"><button>Settings</button></SimpleTooltip>
--- import { SimpleTooltip } from 'astro-component-kit'; --- <SimpleTooltip text="Edit profile" position="top"><button>Settings</button></SimpleTooltip>

Manual Installation

If you are not using the npm package, create a new file src/components/lib/SimpleTooltip.astro and paste the following code:

astro
---
/**
 * SimpleTooltip — A lightweight hover-based hint for buttons or icons.
 * 
 * @param {string} text - The tooltip content text.
 * @param {'top'|'bottom'|'left'|'right'} position - Preferred placement relative to the child. Default is 'top'.
 */
interface Props {
  text: string;
  position?: 'top' | 'bottom' | 'left' | 'right';
}

const { text, position = 'top' } = Astro.props;
---

<div class:list={["tooltip-wrap", `tooltip-wrap--${position}`]} data-tip={text}>
  <slot />
</div>

<style>
  .tooltip-wrap { 
    position: relative; 
    display: inline-flex; 
    cursor: help; 
  }
  
  .tooltip-wrap::after { 
    content: attr(data-tip); 
    position: absolute; 
    padding: var(--sp-2, 6px) var(--sp-3, 12px); 
    background: var(--c-bg-elev, #111); 
    color: var(--c-text-1, #fff); 
    font-size: 0.72rem; 
    font-weight: 600;
    border-radius: var(--r-sm, 6px); 
    white-space: nowrap; 
    opacity: 0; 
    pointer-events: none; 
    transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); 
    border: 1px solid var(--c-border, rgba(255,255,255,0.1)); 
    box-shadow: 0 10px 30px rgba(0,0,0,0.5); 
    z-index: 100;
  }
  
  /* Positions */
  .tooltip-wrap--top::after { bottom: 125%; left: 50%; transform: translateX(-50%) translateY(5px); }
  .tooltip-wrap--bottom::after { top: 125%; left: 50%; transform: translateX(-50%) translateY(-5px); }
  .tooltip-wrap--left::after { right: 125%; top: 50%; transform: translateY(-50%) translateX(5px); }
  .tooltip-wrap--right::after { left: 125%; top: 50%; transform: translateY(-50%) translateX(-5px); }

  /* Hover States */
  .tooltip-wrap:hover::after { 
    opacity: 1; 
  }
  .tooltip-wrap--top:hover::after { transform: translateX(-50%) translateY(0); }
  .tooltip-wrap--bottom:hover::after { transform: translateX(-50%) translateY(0); }
  .tooltip-wrap--left:hover::after { transform: translateY(-50%) translateX(0); }
  .tooltip-wrap--right:hover::after { transform: translateY(-50%) translateX(0); }
</style>
--- /** * SimpleTooltip — A lightweight hover-based hint for buttons or icons. * * @param {string} text - The tooltip content text. * @param {'top'|'bottom'|'left'|'right'} position - Preferred placement relative to the child. Default is 'top'. */ interface Props { text: string; position?: 'top' | 'bottom' | 'left' | 'right'; } const { text, position = 'top' } = Astro.props; --- <div class:list={["tooltip-wrap", `tooltip-wrap--${position}`]} data-tip={text}> <slot /> </div> <style> .tooltip-wrap { position: relative; display: inline-flex; cursor: help; } .tooltip-wrap::after { content: attr(data-tip); position: absolute; padding: var(--sp-2, 6px) var(--sp-3, 12px); background: var(--c-bg-elev, #111); color: var(--c-text-1, #fff); font-size: 0.72rem; font-weight: 600; border-radius: var(--r-sm, 6px); white-space: nowrap; opacity: 0; pointer-events: none; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); border: 1px solid var(--c-border, rgba(255,255,255,0.1)); box-shadow: 0 10px 30px rgba(0,0,0,0.5); z-index: 100; } /* Positions */ .tooltip-wrap--top::after { bottom: 125%; left: 50%; transform: translateX(-50%) translateY(5px); } .tooltip-wrap--bottom::after { top: 125%; left: 50%; transform: translateX(-50%) translateY(-5px); } .tooltip-wrap--left::after { right: 125%; top: 50%; transform: translateY(-50%) translateX(5px); } .tooltip-wrap--right::after { left: 125%; top: 50%; transform: translateY(-50%) translateX(-5px); } /* Hover States */ .tooltip-wrap:hover::after { opacity: 1; } .tooltip-wrap--top:hover::after { transform: translateX(-50%) translateY(0); } .tooltip-wrap--bottom:hover::after { transform: translateX(-50%) translateY(0); } .tooltip-wrap--left:hover::after { transform: translateY(-50%) translateX(0); } .tooltip-wrap--right:hover::after { transform: translateY(-50%) translateX(0); } </style>

Quick Info

Category
Feedback
Filename
SimpleTooltip.astro
Dependencies
None — pure Astro + CSS
Tags
tooltiphint