12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import type { DefaultProps, Props } from 'tippy.js';
- import type { App, SetupContext } from 'vue';
- import { h, watchEffect } from 'vue';
- import { setDefaultProps, Tippy as TippyComponent } from 'vue-tippy';
- import { usePreferences } from '@vben-core/preferences';
- import useTippyDirective from './directive';
- import 'tippy.js/dist/tippy.css';
- import 'tippy.js/dist/backdrop.css';
- import 'tippy.js/themes/light.css';
- import 'tippy.js/animations/scale.css';
- import 'tippy.js/animations/shift-toward.css';
- import 'tippy.js/animations/shift-away.css';
- import 'tippy.js/animations/perspective.css';
- const { isDark } = usePreferences();
- export type TippyProps = Partial<
- Props & {
- animation?:
- | 'fade'
- | 'perspective'
- | 'scale'
- | 'shift-away'
- | 'shift-toward'
- | boolean;
- theme?: 'auto' | 'dark' | 'light';
- }
- >;
- export function initTippy(app: App<Element>, options?: DefaultProps) {
- setDefaultProps({
- allowHTML: true,
- delay: [500, 200],
- theme: isDark.value ? '' : 'light',
- ...options,
- });
- if (!options || !Reflect.has(options, 'theme') || options.theme === 'auto') {
- watchEffect(() => {
- setDefaultProps({ theme: isDark.value ? '' : 'light' });
- });
- }
- app.directive('tippy', useTippyDirective(isDark));
- }
- export const Tippy = (props: any, { attrs, slots }: SetupContext) => {
- let theme: string = (attrs.theme as string) ?? 'auto';
- if (theme === 'auto') {
- theme = isDark.value ? '' : 'light';
- }
- if (theme === 'dark') {
- theme = '';
- }
- return h(
- TippyComponent,
- {
- ...props,
- ...attrs,
- theme,
- },
- slots,
- );
- };
|