UNPKG

@symbion/opalui

Version:

A minimalistic CSS framework

268 lines (226 loc) 6.06 kB
/* ========================================================================== Tooltip Component - OpalUI Pure CSS tooltips on hover/focus ========================================================================== */ .c-tooltip { position: relative; display: inline-block; } /* Tooltip text container */ .c-tooltip::before, .c-tooltip::after { position: absolute; visibility: hidden; opacity: 0; pointer-events: none; z-index: var(--z-tooltip, 800); transition: opacity 0.15s ease, visibility 0.15s ease; } /* Tooltip content */ .c-tooltip::after { content: attr(data-tooltip); bottom: calc(100% + 0.5rem); left: 50%; transform: translateX(-50%); padding: 0.5rem 0.75rem; font-size: 0.8125rem; font-weight: 400; line-height: 1.4; white-space: nowrap; background-color: var(--col-container-high); color: var(--col-on-container-high); border-radius: var(--border-radius-sm, 0.25rem); box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); } /* Arrow */ .c-tooltip::before { content: ""; bottom: calc(100% + 0.25rem); left: 50%; transform: translateX(-50%); border: 0.25rem solid transparent; border-top-color: var(--col-container-high); } /* Show on hover/focus */ .c-tooltip:hover::before, .c-tooltip:hover::after, .c-tooltip:focus::before, .c-tooltip:focus::after, .c-tooltip:focus-within::before, .c-tooltip:focus-within::after { visibility: visible; opacity: 1; } /* ------------------------------------------------------------------------- Position Variants ------------------------------------------------------------------------- */ /* Bottom */ .c-tooltip.bottom::after { bottom: auto; top: calc(100% + 0.5rem); } .c-tooltip.bottom::before { bottom: auto; top: calc(100% + 0.25rem); border-top-color: transparent; border-bottom-color: var(--col-container-high); } /* Left */ .c-tooltip.left::after { bottom: auto; top: 50%; left: auto; right: calc(100% + 0.5rem); transform: translateY(-50%); } .c-tooltip.left::before { bottom: auto; top: 50%; left: auto; right: calc(100% + 0.25rem); transform: translateY(-50%); border-top-color: transparent; border-left-color: var(--col-container-high); } /* Right */ .c-tooltip.right::after { bottom: auto; top: 50%; left: calc(100% + 0.5rem); transform: translateY(-50%); } .c-tooltip.right::before { bottom: auto; top: 50%; left: calc(100% + 0.25rem); transform: translateY(-50%); border-top-color: transparent; border-right-color: var(--col-container-high); } /* ------------------------------------------------------------------------- Alignment Variants (for top/bottom tooltips) ------------------------------------------------------------------------- */ /* Start aligned */ .c-tooltip.start::after { left: 0; transform: none; } .c-tooltip.start::before { left: 1rem; transform: none; } /* End aligned */ .c-tooltip.end::after { left: auto; right: 0; transform: none; } .c-tooltip.end::before { left: auto; right: 1rem; transform: none; } /* ------------------------------------------------------------------------- Color Variants ------------------------------------------------------------------------- */ /* Dark theme (default works well on both) */ .c-tooltip.dark::after { background-color: var(--col-neutral-m2); color: white; } .c-tooltip.dark::before { border-top-color: var(--col-neutral-m2); } .c-tooltip.dark.bottom::before { border-top-color: transparent; border-bottom-color: var(--col-neutral-m2); } .c-tooltip.dark.left::before { border-top-color: transparent; border-left-color: var(--col-neutral-m2); } .c-tooltip.dark.right::before { border-top-color: transparent; border-right-color: var(--col-neutral-m2); } /* Primary */ .c-tooltip.primary::after { background-color: var(--col-primary); color: var(--col-on-primary); } .c-tooltip.primary::before { border-top-color: var(--col-primary); } .c-tooltip.primary.bottom::before { border-top-color: transparent; border-bottom-color: var(--col-primary); } /* Error */ .c-tooltip.error::after { background-color: var(--col-error); color: var(--col-on-error); } .c-tooltip.error::before { border-top-color: var(--col-error); } .c-tooltip.error.bottom::before { border-top-color: transparent; border-bottom-color: var(--col-error); } /* ------------------------------------------------------------------------- Size Variants ------------------------------------------------------------------------- */ /* Small */ .c-tooltip.sm::after { padding: 0.25rem 0.5rem; font-size: 0.75rem; } /* Large */ .c-tooltip.lg::after { padding: 0.75rem 1rem; font-size: 0.875rem; } /* ------------------------------------------------------------------------- Multiline Support ------------------------------------------------------------------------- */ .c-tooltip.multiline::after { white-space: normal; width: max-content; max-width: 250px; text-align: left; } /* ------------------------------------------------------------------------- Animation Variants ------------------------------------------------------------------------- */ /* Fade + Scale */ .c-tooltip.animated::after, .c-tooltip.animated::before { transform-origin: bottom center; } .c-tooltip.animated::after { transform: translateX(-50%) scale(0.95); } .c-tooltip.animated:hover::after, .c-tooltip.animated:focus::after { transform: translateX(-50%) scale(1); } .c-tooltip.animated.bottom::after { transform-origin: top center; } /* ------------------------------------------------------------------------- Delay ------------------------------------------------------------------------- */ .c-tooltip.delay::before, .c-tooltip.delay::after { transition-delay: 0.3s; } /* ------------------------------------------------------------------------- Always Visible (for demos/testing) ------------------------------------------------------------------------- */ .c-tooltip.always-visible::before, .c-tooltip.always-visible::after { visibility: visible; opacity: 1; } /* vim: ts=4 */