|
|
|
|
/* ── Content (variant-shared base) ──────────────────────────────────────── */
|
|
|
|
|
|
|
|
|
|
[data-soma-floating-wrapper]:has(> [data-tooltip-content]) {
|
|
|
|
|
z-index: var(--tooltip-content-z);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content] {
|
|
|
|
|
--_tooltip-py: var(--tooltip-padding-y-md);
|
|
|
|
|
--_tooltip-px: var(--tooltip-padding-x-md);
|
|
|
|
|
--_tooltip-font-size: var(--tooltip-font-size-md);
|
|
|
|
|
--_tooltip-bg: var(--tooltip-bg);
|
|
|
|
|
--_tooltip-border: var(--tooltip-border);
|
|
|
|
|
--_tooltip-shadow: var(--tooltip-shadow);
|
|
|
|
|
|
|
|
|
|
display: block;
|
|
|
|
|
max-inline-size: min(var(--tooltip-max-width), calc(100vw - var(--space-4)));
|
|
|
|
|
padding: var(--_tooltip-py) var(--_tooltip-px);
|
|
|
|
|
border: var(--tooltip-border-width) solid var(--_tooltip-border);
|
|
|
|
|
border-radius: var(--tooltip-radius);
|
|
|
|
|
background: var(--_tooltip-bg);
|
|
|
|
|
color: var(--tooltip-color);
|
|
|
|
|
box-shadow: var(--_tooltip-shadow);
|
|
|
|
|
font-family: var(--tooltip-font-family);
|
|
|
|
|
font-size: var(--_tooltip-font-size);
|
|
|
|
|
font-weight: var(--tooltip-font-weight);
|
|
|
|
|
line-height: var(--tooltip-line-height);
|
|
|
|
|
text-wrap: pretty;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ── Sizes ──────────────────────────────────────────────────────────────── */
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-size='sm'] {
|
|
|
|
|
--_tooltip-py: var(--tooltip-padding-y-sm);
|
|
|
|
|
--_tooltip-px: var(--tooltip-padding-x-sm);
|
|
|
|
|
--_tooltip-font-size: var(--tooltip-font-size-sm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-size='lg'] {
|
|
|
|
|
--_tooltip-py: var(--tooltip-padding-y-lg);
|
|
|
|
|
--_tooltip-px: var(--tooltip-padding-x-lg);
|
|
|
|
|
--_tooltip-font-size: var(--tooltip-font-size-lg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ── Variants ───────────────────────────────────────────────────────────── */
|
|
|
|
|
|
|
|
|
|
/* `solid` is the default surface — the base block already paints it. */
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-variant='outline'] {
|
|
|
|
|
--_tooltip-bg: transparent;
|
|
|
|
|
--_tooltip-border: var(--color-border-strong);
|
|
|
|
|
--_tooltip-shadow: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-variant='ghost'] {
|
|
|
|
|
--_tooltip-bg: color-mix(in srgb, var(--color-surface-overlay) 70%, transparent);
|
|
|
|
|
--_tooltip-border: transparent;
|
|
|
|
|
--_tooltip-shadow: none;
|
|
|
|
|
backdrop-filter: blur(8px);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ── Arrow ──────────────────────────────────────────────────────────────── */
|
|
|
|
|
|
|
|
|
|
[data-tooltip-arrow] {
|
|
|
|
|
fill: var(--_tooltip-bg, var(--tooltip-bg));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Outline variant: arrow needs a stroke since the bg is transparent. */
|
|
|
|
|
[data-tooltip-content][data-variant='outline'] ~ [data-tooltip-arrow],
|
|
|
|
|
[data-tooltip-content][data-variant='outline'] [data-tooltip-arrow] {
|
|
|
|
|
fill: var(--color-surface-default);
|
|
|
|
|
stroke: var(--color-border-strong);
|
|
|
|
|
stroke-width: 1px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ── Entrance / exit per anchored side ──────────────────────────────────────
|
|
|
|
|
* Tooltip morfo's data-state values: 'closed' | 'delayed-open' |
|
|
|
|
|
* 'instant-open'. Both open variants should animate in. Soma's Floating
|
|
|
|
|
* layer writes data-side (top/right/bottom/left). 'instant-open' is used
|
|
|
|
|
* for keyboard focus (no entrance) and 'delayed-open' for hover.
|
|
|
|
|
*
|
|
|
|
|
* Distance is smaller than Popover (2px vs 4px) — tooltip is lighter. */
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-state='delayed-open'][data-side='top'] {
|
|
|
|
|
animation: eidos-tooltip-in-top var(--duration-fast) var(--ease-out) both;
|
|
|
|
|
}
|
|
|
|
|
[data-tooltip-content][data-state='closed'][data-side='top'] {
|
|
|
|
|
animation: eidos-tooltip-out-top var(--duration-fast) var(--ease-default) both;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-state='delayed-open'][data-side='bottom'] {
|
|
|
|
|
animation: eidos-tooltip-in-bottom var(--duration-fast) var(--ease-out) both;
|
|
|
|
|
}
|
|
|
|
|
[data-tooltip-content][data-state='closed'][data-side='bottom'] {
|
|
|
|
|
animation: eidos-tooltip-out-bottom var(--duration-fast) var(--ease-default) both;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-state='delayed-open'][data-side='right'] {
|
|
|
|
|
animation: eidos-tooltip-in-right var(--duration-fast) var(--ease-out) both;
|
|
|
|
|
}
|
|
|
|
|
[data-tooltip-content][data-state='closed'][data-side='right'] {
|
|
|
|
|
animation: eidos-tooltip-out-right var(--duration-fast) var(--ease-default) both;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[data-tooltip-content][data-state='delayed-open'][data-side='left'] {
|
|
|
|
|
animation: eidos-tooltip-in-left var(--duration-fast) var(--ease-out) both;
|
|
|
|
|
}
|
|
|
|
|
[data-tooltip-content][data-state='closed'][data-side='left'] {
|
|
|
|
|
animation: eidos-tooltip-out-left var(--duration-fast) var(--ease-default) both;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* instant-open: no entrance — element appears at final position. */
|
|
|
|
|
[data-tooltip-content][data-state='instant-open'] {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
transform: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@keyframes eidos-tooltip-in-top {
|
|
|
|
|
from { opacity: 0; transform: translateY(2px); }
|
|
|
|
|
}
|
|
|
|
|
@keyframes eidos-tooltip-out-top {
|
|
|
|
|
to { opacity: 0; transform: translateY(2px); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@keyframes eidos-tooltip-in-bottom {
|
|
|
|
|
from { opacity: 0; transform: translateY(-2px); }
|
|
|
|
|
}
|
|
|
|
|
@keyframes eidos-tooltip-out-bottom {
|
|
|
|
|
to { opacity: 0; transform: translateY(-2px); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@keyframes eidos-tooltip-in-right {
|
|
|
|
|
from { opacity: 0; transform: translateX(-2px); }
|
|
|
|
|
}
|
|
|
|
|
@keyframes eidos-tooltip-out-right {
|
|
|
|
|
to { opacity: 0; transform: translateX(-2px); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@keyframes eidos-tooltip-in-left {
|
|
|
|
|
from { opacity: 0; transform: translateX(2px); }
|
|
|
|
|
}
|
|
|
|
|
@keyframes eidos-tooltip-out-left {
|
|
|
|
|
to { opacity: 0; transform: translateX(2px); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ── Reduced motion ─────────────────────────────────────────────────────────
|
|
|
|
|
* Honour the user's OS-level preference: tooltips appear instantly with
|
|
|
|
|
* no slide-in / slide-out, just a binary visibility toggle. The exit
|
|
|
|
|
* animation is also short-circuited so the element is removed without a
|
|
|
|
|
* trailing fade. */
|
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
|
|
|
[data-tooltip-content][data-state='delayed-open'],
|
|
|
|
|
[data-tooltip-content][data-state='instant-open'],
|
|
|
|
|
[data-tooltip-content][data-state='closed'] {
|
|
|
|
|
animation: none;
|
|
|
|
|
}
|
|
|
|
|
}
|