UNPKG

@rolemodel/optics

Version:

Optics is a css package that provides base styles and components that can be integrated and customized in a variety of projects.

135 lines (116 loc) 4.02 kB
/* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */ [data-tooltip-text] { /* Public API (customizable component options) */ --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */ --_op-tooltip-padding: var(--op-space-x-small) var(--op-space-medium); --_op-tooltip-background-color: var(--op-color-neutral-minus-max); --_op-tooltip-text-color: var(--op-color-neutral-on-minus-max); --_op-tooltip-arrow-size: calc(var(--op-space-small) / 2); --_op-tooltip-tooltip-offset: var(--op-space-x-small); --_op-tooltip-tooltip-radius: var(--op-radius-medium); --_op-tooltip-tooltip-font-size: var(--op-font-small); position: relative; &::before, &::after { opacity: var(--op-opacity-none); transition: var(--op-transition-tooltip); visibility: hidden; } &::before { position: absolute; z-index: var(--op-z-index-tooltip); display: block; width: max-content; max-width: var(--_op-tooltip-max-width); padding: var(--_op-tooltip-padding); border-radius: var(--_op-tooltip-tooltip-radius); background-color: var(--_op-tooltip-background-color); color: var(--_op-tooltip-text-color); content: attr(data-tooltip-text); font-family: var(--op-font-family); /* Makes tooltips on icons work */ font-size: var(--_op-tooltip-tooltip-font-size); overflow-wrap: break-word; pointer-events: none; text-align: center; white-space: normal; } &::after { position: absolute; z-index: var(--op-z-index-tooltip); border: var(--_op-tooltip-arrow-size) solid var(--_op-tooltip-background-color); content: ''; pointer-events: none; } &:hover { &::before, &::after { opacity: var(--op-opacity-full); visibility: visible; } } &[data-tooltip-position='top'], &:not([data-tooltip-position]) { &::before, &::after { inset-inline-start: 50%; transform: translateX(-50%); } &::before { inset-block-end: 100%; margin-block-end: calc(var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } &::after { border-color: var(--_op-tooltip-background-color) transparent transparent transparent; inset-block-end: 100%; margin-block-end: calc(-1 * var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } } &[data-tooltip-position='left'] { &::before, &::after { inset-block-start: 50%; transform: translateY(-50%); } &::before { inset-inline-end: 100%; margin-inline-end: calc(var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } &::after { border-color: transparent transparent transparent var(--_op-tooltip-background-color); inset-inline-end: 100%; margin-inline-end: calc(-1 * var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } } &[data-tooltip-position='bottom'] { &::before, &::after { inset-inline-start: 50%; transform: translateX(-50%); } &::before { inset-block-start: 100%; margin-block-start: calc(var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } &::after { border-color: transparent transparent var(--_op-tooltip-background-color) transparent; inset-block-start: 100%; margin-block-start: calc(-1 * var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } } &[data-tooltip-position='right'] { &::before, &::after { inset-block-start: 50%; transform: translateY(-50%); } &::before { inset-inline-start: 100%; margin-inline-start: calc(var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } &::after { border-color: transparent var(--_op-tooltip-background-color) transparent transparent; inset-inline-start: 100%; margin-inline-start: calc(-1 * var(--_op-tooltip-arrow-size) + var(--_op-tooltip-tooltip-offset)); } } }