=
+T extends new () => { $props: infer P } ? NonNullable :
+ T extends (props: infer P, ...args: any) => any ? P :
+ {}
+
+export type ComponentSlots =
+T extends new () => { $slots: infer S } ? NonNullable :
+ T extends (props: any, ctx: { slots: infer S; attrs: any; emit: any }, ...args: any) => any ? NonNullable :
+ {}
+
+export type ComponentEmit =
+T extends new () => { $emit: infer E } ? NonNullable :
+ T extends (props: any, ctx: { slots: any; attrs: any; emit: infer E }, ...args: any) => any ? NonNullable :
+ {}
\ No newline at end of file
diff --git a/src/runtime/types/index.d.ts b/src/runtime/types/index.d.ts
index 3c6fe96d..21188a9e 100644
--- a/src/runtime/types/index.d.ts
+++ b/src/runtime/types/index.d.ts
@@ -16,6 +16,7 @@ export * from './input'
export * from './kbd'
export * from './link'
export * from './meter'
+export * from './modal'
export * from './notification'
export * from './popper'
export * from './progress'
diff --git a/src/runtime/types/modal.d.ts b/src/runtime/types/modal.d.ts
new file mode 100644
index 00000000..9c561232
--- /dev/null
+++ b/src/runtime/types/modal.d.ts
@@ -0,0 +1,18 @@
+import type { Component } from 'vue'
+
+export interface Modal {
+ appear?: boolean
+ overlay?: boolean
+ transition?: boolean
+ preventClose?: boolean
+ fullscreen?: boolean
+ class?: string | Object | string[]
+ ui?: any
+ onClose?: () => void
+ onClosePrevented?: () => void
+}
+
+export interface ModalState {
+ component: Component | string
+ props: Modal
+}
\ No newline at end of file