mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-02 09:59:55 +08:00
205cd7a86d
Closes: BS-2946
81 lines
1.9 KiB
TypeScript
81 lines
1.9 KiB
TypeScript
import type { EditorHost } from '@blocksuite/std';
|
|
import { baseTheme } from '@toeverything/theme';
|
|
import { html } from 'lit';
|
|
|
|
import { createToastContainer } from './create.js';
|
|
import { htmlToElement } from './html-to-element.js';
|
|
|
|
let ToastContainer: HTMLDivElement | null = null;
|
|
|
|
/**
|
|
* @example
|
|
* ```ts
|
|
* toast('Hello World');
|
|
* ```
|
|
*/
|
|
export const toast = (
|
|
editorHost: EditorHost,
|
|
message: string,
|
|
duration = 2500
|
|
) => {
|
|
if (!ToastContainer) {
|
|
ToastContainer = createToastContainer(editorHost);
|
|
}
|
|
|
|
const styles = `
|
|
max-width: 480px;
|
|
text-align: center;
|
|
font-family: ${baseTheme.fontSansFamily};
|
|
font-size: var(--affine-font-sm);
|
|
padding: 6px 12px;
|
|
margin: 10px 0 0 0;
|
|
color: var(--affine-white);
|
|
background: var(--affine-tooltip);
|
|
box-shadow: var(--affine-float-button-shadow);
|
|
border-radius: 10px;
|
|
transition: all 230ms cubic-bezier(0.21, 1.02, 0.73, 1);
|
|
opacity: 0;
|
|
`;
|
|
|
|
const template = html`<div style="${styles}"></div>`;
|
|
const element = htmlToElement<HTMLDivElement>(template);
|
|
// message is not trusted
|
|
element.textContent = message;
|
|
ToastContainer?.append(element);
|
|
|
|
const fadeIn = [
|
|
{
|
|
opacity: 0,
|
|
},
|
|
{ opacity: 1 },
|
|
];
|
|
const options = {
|
|
duration: 230,
|
|
easing: 'cubic-bezier(0.21, 1.02, 0.73, 1)',
|
|
fill: 'forwards' as const,
|
|
}; // satisfies KeyframeAnimationOptions;
|
|
element.animate(fadeIn, options);
|
|
|
|
setTimeout(() => {
|
|
const fadeOut = fadeIn.reverse();
|
|
const animation = element.animate(fadeOut, options);
|
|
animation.finished
|
|
.then(() => {
|
|
element.style.maxHeight = '0';
|
|
element.style.margin = '0';
|
|
element.style.padding = '0';
|
|
element.addEventListener(
|
|
'transitionend',
|
|
() => {
|
|
element.remove();
|
|
},
|
|
{
|
|
once: true,
|
|
}
|
|
);
|
|
})
|
|
.catch(console.error);
|
|
}, duration);
|
|
return element;
|
|
};
|