@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
323 lines (273 loc) • 9.33 kB
JavaScript
import { createStaticStyles } from "antd-style";
//#region src/base-ui/Tooltip/style.ts
const styles = createStaticStyles(({ css, cssVar }) => ({
arrow: css`
--lobe-tooltip-arrow-offset-block: 4px;
--lobe-tooltip-arrow-offset-inline: 6px;
pointer-events: none;
position: absolute;
transform-origin: center;
display: flex;
width: 8px;
height: 4px;
& > svg {
display: block;
width: 100%;
height: 100%;
fill: ${cssVar.colorBgElevated};
}
& [data-role='stroke'] {
stroke: ${cssVar.colorBorderSecondary};
}
&[data-side='top'] {
inset-block-end: calc(var(--lobe-tooltip-arrow-offset-block) * -1);
transform: rotate(180deg);
}
&[data-side='left'] {
inset-inline-end: calc(var(--lobe-tooltip-arrow-offset-inline) * -1);
transform: rotate(90deg);
}
&[data-side='right'] {
inset-inline-start: calc(var(--lobe-tooltip-arrow-offset-inline) * -1);
transform: rotate(-90deg);
}
&[data-side='bottom'] {
inset-block-start: calc(var(--lobe-tooltip-arrow-offset-block) * -1);
}
`,
popup: css`
/* Keep the popup on its own compositor layer for its whole lifetime: when the opacity
transition ends the browser otherwise drops the layer and re-rasterizes with pixel
snapping — a visible one-frame shift when the measured width is fractional
(single-line tooltips). */
will-change: transform, opacity;
user-select: none;
position: relative;
transform-origin: var(--transform-origin);
max-width: min(320px, var(--available-width));
border: 1px solid ${cssVar.colorFill};
border-radius: ${cssVar.borderRadiusSM};
font-size: ${cssVar.fontSizeSM};
line-height: 1.2;
color: ${cssVar.colorTextLabel};
background: ${cssVar.colorBgElevated};
box-shadow:
0 1px 2px 0 rgb(0 0 0 / 3%),
0 1px 6px -1px rgb(0 0 0 / 2%),
0 2px 4px 0 rgb(0 0 0 / 2%);
/* Opacity gets its own monotonic curve: running it on the overshooting spring makes the
fade look finished at ~0.96, pause, then visibly step to 1 at the clamp point — reads
as a dropped frame. The spring stays on transform only. */
transition-timing-function:
var(--lobe-tooltip-fade-ease), var(--lobe-tooltip-animation-ease-out);
transition-duration: var(--lobe-tooltip-fade-duration), var(--lobe-tooltip-animation-duration);
transition-property: opacity, transform;
&[data-layout-animation] {
transition-timing-function:
var(--lobe-tooltip-fade-ease), var(--lobe-tooltip-animation-ease-out),
var(--lobe-tooltip-layout-ease), var(--lobe-tooltip-layout-ease);
transition-duration:
var(--lobe-tooltip-fade-duration), var(--lobe-tooltip-animation-duration),
var(--lobe-tooltip-layout-duration), var(--lobe-tooltip-layout-duration);
transition-property: opacity, transform, width, height;
}
&[data-starting-style],
&[data-ending-style] {
transform: translate3d(var(--lobe-tooltip-translate-x), var(--lobe-tooltip-translate-y), 0)
scale(var(--lobe-tooltip-animation-scale));
opacity: 0;
}
&[data-ending-style] {
transition-timing-function: var(--lobe-tooltip-animation-ease-in);
transition-duration: var(--lobe-tooltip-animation-duration-exit);
}
&[data-instant] {
transition: none;
}
`,
positioner: css`
/* Springs baked as linear(): stiffness 700 / damping 38 (enter) and 380 / 28 (glide),
both zeta ~0.72 with ~4% overshoot. Durations are the springs' settle times —
change them together with the curves, not independently. */
--lobe-tooltip-animation-duration: 280ms;
--lobe-tooltip-fade-duration: 160ms;
--lobe-tooltip-fade-ease: cubic-bezier(0.33, 1, 0.68, 1);
--lobe-tooltip-animation-duration-exit: 100ms;
--lobe-tooltip-animation-translate: 3px;
--lobe-tooltip-animation-scale: 0.97;
--lobe-tooltip-animation-ease-in: cubic-bezier(0.4, 0, 1, 1);
--lobe-tooltip-animation-ease-out: linear(
0,
0.041,
0.14,
0.268,
0.407,
0.541,
0.662,
0.765,
0.849,
0.915,
0.964,
0.998,
1.02,
1.032,
1.038,
1.039,
1.036,
1.032,
1.027,
1.022,
1.016,
1.012,
1.008,
1.005,
1.003
);
--lobe-tooltip-layout-duration: 380ms;
--lobe-tooltip-layout-ease: linear(
0,
0.041,
0.14,
0.268,
0.407,
0.541,
0.661,
0.765,
0.849,
0.915,
0.964,
0.998,
1.02,
1.032,
1.038,
1.039,
1.036,
1.032,
1.027,
1.022,
1.016,
1.012,
1.008,
1.005,
1.003
);
--lobe-tooltip-translate-x: 0;
--lobe-tooltip-translate-y: calc(var(--lobe-tooltip-animation-translate) * -1);
will-change: transform, opacity;
z-index: 114514;
width: min(var(--positioner-width), 320px, var(--available-width));
height: var(--positioner-height);
transition-timing-function: var(--lobe-tooltip-animation-ease-out);
transition-duration: var(--lobe-tooltip-animation-duration);
transition-property: none;
&[data-layout-animation] {
transition-timing-function: var(--lobe-tooltip-layout-ease);
transition-duration: var(--lobe-tooltip-layout-duration);
transition-property:
inset-block-start, inset-inline-start, inset-inline-end, inset-block-end, transform;
}
&[data-instant] {
transition: none;
}
/* Fallback: never show a tooltip when the anchor is hidden or the positioner falls back to (0,0). */
&[data-anchor-hidden],
&[data-zero-origin='true'] {
pointer-events: none;
visibility: hidden;
}
&[data-placement='top'],
&[data-placement='topLeft'],
&[data-placement='topRight'] {
--lobe-tooltip-translate-x: 0;
--lobe-tooltip-translate-y: var(--lobe-tooltip-animation-translate);
}
&[data-placement='bottom'],
&[data-placement='bottomLeft'],
&[data-placement='bottomRight'] {
--lobe-tooltip-translate-x: 0;
--lobe-tooltip-translate-y: calc(var(--lobe-tooltip-animation-translate) * -1);
}
&[data-placement='left'],
&[data-placement='leftTop'],
&[data-placement='leftBottom'] {
--lobe-tooltip-translate-x: var(--lobe-tooltip-animation-translate);
--lobe-tooltip-translate-y: 0;
}
&[data-placement='right'],
&[data-placement='rightTop'],
&[data-placement='rightBottom'] {
--lobe-tooltip-translate-x: calc(var(--lobe-tooltip-animation-translate) * -1);
--lobe-tooltip-translate-y: 0;
}
@media (prefers-reduced-motion: reduce) {
--lobe-tooltip-animation-duration: 0s;
--lobe-tooltip-fade-duration: 0s;
--lobe-tooltip-animation-duration-exit: 0s;
--lobe-tooltip-layout-duration: 0s;
}
`,
viewport: css`
--lobe-tooltip-viewport-inline-padding: 8px;
--lobe-tooltip-content-shift: 40%;
position: relative;
overflow: clip;
display: flex;
gap: 6px;
align-items: center;
padding-block: 4px;
padding-inline: var(--lobe-tooltip-viewport-inline-padding);
overflow-wrap: break-word;
white-space: normal;
[data-previous],
[data-current] {
transform: translateX(0);
display: flex;
gap: 6px;
align-items: center;
opacity: 1;
transition:
transform var(--lobe-tooltip-layout-duration) var(--lobe-tooltip-layout-ease),
opacity calc(var(--lobe-tooltip-layout-duration) / 2) var(--lobe-tooltip-fade-ease);
}
[data-previous] {
position: absolute;
inset-block-start: 4px;
inset-inline-start: var(--lobe-tooltip-viewport-inline-padding);
}
&[data-activation-direction~='right'] [data-previous][data-ending-style] {
transform: translateX(calc(var(--lobe-tooltip-content-shift) * -1));
opacity: 0;
}
&[data-activation-direction~='right'] [data-current][data-starting-style] {
transform: translateX(var(--lobe-tooltip-content-shift));
opacity: 0;
}
&[data-activation-direction~='left'] [data-previous][data-ending-style] {
transform: translateX(var(--lobe-tooltip-content-shift));
opacity: 0;
}
&[data-activation-direction~='left'] [data-current][data-starting-style] {
transform: translateX(calc(var(--lobe-tooltip-content-shift) * -1));
opacity: 0;
}
&[data-activation-direction~='down'] [data-previous][data-ending-style] {
transform: translateY(calc(var(--lobe-tooltip-content-shift) * -1));
opacity: 0;
}
&[data-activation-direction~='down'] [data-current][data-starting-style] {
transform: translateY(var(--lobe-tooltip-content-shift));
opacity: 0;
}
&[data-activation-direction~='up'] [data-previous][data-ending-style] {
transform: translateY(var(--lobe-tooltip-content-shift));
opacity: 0;
}
&[data-activation-direction~='up'] [data-current][data-starting-style] {
transform: translateY(calc(var(--lobe-tooltip-content-shift) * -1));
opacity: 0;
}
`
}));
//#endregion
export { styles };
//# sourceMappingURL=style.mjs.map