UNPKG

@oruga-ui/oruga-next

Version:

UI components for Vue.js and CSS framework agnostic

1 lines 21 kB
{"version":3,"file":"notification.mjs","sources":["../../src/components/notification/Notification.vue","../../src/components/notification/NotificationNotice.vue","../../src/components/notification/useNotificationProgrammatic.ts","../../src/components/notification/index.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { NotificationProps } from \"./props\";\n\n/**\n * Bold notification blocks to alert your users of something.\n * @displayName Notification\n * @requires ./NotificationNotice.vue\n * @style _notification.scss\n */\ndefineOptions({\n isOruga: true,\n name: \"ONotification\",\n configField: \"notification\",\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<NotificationProps>(), {\n override: undefined,\n message: undefined,\n active: true,\n type: undefined,\n variant: () => getDefault(\"notification.variant\"),\n rounded: () => getDefault(\"notification.rounded\"),\n position: () => getDefault(\"notification.position\", \"top\"),\n animation: () => getDefault(\"notification.animation\", \"fade\"),\n icon: undefined,\n iconPack: () => getDefault(\"notification.iconPack\"),\n iconSize: () => getDefault(\"notification.iconSize\", \"large\"),\n closeable: false,\n closeIcon: () => getDefault(\"notification.closeIcon\", \"close\"),\n closeIconSize: () => getDefault(\"notification.closeIconSize\"),\n ariaCloseLabel: () => getDefault(\"notification.ariaCloseLabel\", \"Close\"),\n});\n\nconst emits = defineEmits<{\n /**\n * active prop two-way binding\n * @param value {boolean} - updated active prop\n */\n \"update:active\": [value: boolean];\n /**\n * on component close event\n * @param value {string} - close event method\n */\n close: [...args: [] | [string]];\n}>();\n\nconst isActive = defineModel<boolean>(\"active\", { default: true });\n\n/** Icon name (MDI) based on type. */\nconst computedIcon = computed(() => {\n if (props.icon) return props.icon;\n\n switch (props.type) {\n case \"info\":\n return \"information\";\n case \"success\":\n return \"check-circle\";\n case \"warning\":\n return \"alert\";\n case \"danger\":\n return \"alert-circle\";\n default:\n return null;\n }\n});\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [string]): void {\n isActive.value = false;\n emits(\"close\", ...args);\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n [\"rootClass\", \"o-notification\"],\n [\n \"variantClass\",\n \"o-notification--\",\n computed(() => props.variant),\n computed(() => !!props.variant),\n ],\n [\n \"roundedClass\",\n \"o-notification--rounded\",\n null,\n computed(() => props.rounded),\n ],\n [\n \"positionClass\",\n \"o-notification--\",\n computed(() => props.position),\n computed(() => !!props.position),\n ],\n);\n\nconst wrapperClasses = defineClasses([\n \"wrapperClass\",\n \"o-notification__wrapper\",\n]);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-notification__icon\"]);\n\nconst contentClasses = defineClasses([\n \"contentClass\",\n \"o-notification__content\",\n]);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-notification__close\"]);\n</script>\n\n<template>\n <transition :name=\"animation\">\n <article\n v-show=\"isActive\"\n v-bind=\"$attrs\"\n data-oruga=\"notification\"\n :class=\"rootClasses\">\n <button\n v-if=\"closeable\"\n :class=\"closeClasses\"\n type=\"button\"\n :aria-label=\"ariaCloseLabel\"\n @click=\"close('x')\">\n <o-icon\n :pack=\"iconPack\"\n :icon=\"closeIcon\"\n :size=\"closeIconSize\" />\n </button>\n\n <!--\n @slot Notification inner content, outside of the message container\n @binding {(...args): void} close - function to close the notification\n -->\n <slot name=\"inner\" :close=\"close\" />\n\n <div v-if=\"$slots.default || message\" :class=\"wrapperClasses\">\n <o-icon\n v-if=\"computedIcon\"\n :icon=\"computedIcon\"\n :pack=\"iconPack\"\n :class=\"iconClasses\"\n :size=\"iconSize\"\n aria-hidden=\"true\" />\n <div :class=\"contentClasses\">\n <!--\n @slot Notification default content, default is message prop\n @binding {(...args): void} close - function to close the notification\n -->\n <slot :close=\"close\">\n <span v-if=\"message\">{{ message }} </span>\n </slot>\n </div>\n </div>\n </article>\n </transition>\n</template>\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n computed,\n ref,\n onMounted,\n onBeforeMount,\n useTemplateRef,\n type Component,\n} from \"vue\";\n\nimport ONotification from \"./Notification.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, getActiveClasses } from \"@/composables\";\nimport type { CloseEventArgs } from \"../programmatic\";\n\nimport type { NotificationNoticeProps } from \"./props\";\n\n/**\n * Notification Notice is an extension of the Notification component and is used for the programmatic usage.\n * @displayName Notification Notice\n */\ndefineOptions({\n isOruga: true,\n name: \"ONotificationNotice\",\n configField: \"notification\",\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<NotificationNoticeProps<C>>(), {\n override: undefined,\n container: undefined,\n variant: () => getDefault(\"notification.variant\"),\n position: () => getDefault(\"notification.position\", \"top\"),\n duration: () => getDefault(\"notification.duration\", 2000),\n infinite: false,\n pauseOnHover: false,\n queue: () => getDefault(\"notification.queue\"),\n component: undefined,\n props: undefined,\n events: undefined,\n});\n\nconst emits = defineEmits<{\n /**\n * on component close event\n * @param value {string} - close event method\n */\n close: [...args: [] | [string] | CloseEventArgs<C>];\n}>();\n\nconst notificationRef = useTemplateRef(\"notificationComponent\");\n\nconst isActive = ref(true);\n\nconst parentTop = ref<Element | null>(null);\nconst parentBottom = ref<Element | null>(null);\n\n/** Create or inject notice dom container elements. */\nonBeforeMount(() => {\n if (\n noticeClasses.value &&\n positionBottomClasses.value &&\n positionTopClasses.value\n ) {\n const rootClasses = getActiveClasses(noticeClasses.value);\n const topClasses = getActiveClasses(positionTopClasses.value);\n const bottomClasses = getActiveClasses(positionBottomClasses.value);\n\n parentTop.value = props.container.querySelector(\n `.${rootClasses.join(\".\")}.${topClasses.join(\".\")}`,\n );\n parentBottom.value = props.container.querySelector(\n `.${rootClasses.join(\".\")}.${bottomClasses.join(\".\")}`,\n );\n\n if (parentTop.value && parentBottom.value) return;\n\n // create notices top container if not alread there\n if (!parentTop.value) {\n parentTop.value = document.createElement(\"div\");\n parentTop.value.className = `${rootClasses.join(\n \" \",\n )} ${topClasses.join(\" \")}`;\n parentTop.value.role = \"region\";\n parentTop.value.ariaLive = \"polite\";\n }\n\n // create notices bottom container if not alread there\n if (!parentBottom.value) {\n parentBottom.value = document.createElement(\"div\");\n parentBottom.value.className = `${rootClasses.join(\n \" \",\n )} ${bottomClasses.join(\" \")}`;\n parentBottom.value.role = \"region\";\n parentBottom.value.ariaLive = \"polite\";\n }\n\n // append notices top and bottom container to given container\n props.container.appendChild(parentTop.value);\n props.container.appendChild(parentBottom.value);\n\n if (props.container.tagName !== \"BODY\") {\n const classes = getActiveClasses(noticeContainerClasses.value);\n if (classes?.length)\n classes\n .filter((c) => !!c)\n .forEach((c: string) => {\n parentTop.value?.classList.add(c);\n parentBottom.value?.classList.add(c);\n });\n }\n }\n});\n\nonMounted(() => {\n showNotice();\n setAutoClose();\n});\n\nconst correctParent = computed(() => {\n switch (props.position) {\n case \"top-right\":\n case \"top\":\n case \"top-left\":\n return parentTop.value;\n\n case \"bottom-right\":\n case \"bottom\":\n case \"bottom-left\":\n return parentBottom.value;\n default:\n return null;\n }\n});\n\nconst shouldQueue = computed(() =>\n props.queue && parentTop.value && parentBottom.value\n ? parentTop.value.childElementCount > 0 ||\n parentBottom.value.childElementCount > 0\n : false,\n);\n\nconst isAlert = computed(\n () => props.variant === \"warning\" || props.variant === \"danger\",\n);\n\n/** move the rendered component template into the correct parent container */\nfunction showNotice(): void {\n if (!correctParent.value) return;\n\n if (shouldQueue.value) correctParent.value.innerHTML = \"\";\n correctParent.value.insertAdjacentElement(\n \"afterbegin\",\n notificationRef.value?.$el,\n );\n}\n\n// --- Auto Close Feature ---\n\nlet timer: ReturnType<typeof setTimeout> | undefined;\n\n/** Set timer to auto close message */\nfunction setAutoClose(): void {\n if (!props.infinite) {\n // clear old timer\n if (timer) clearTimeout(timer);\n // set new timer\n timer = setTimeout(() => {\n if (isActive.value) close(\"timeout\");\n }, props.duration);\n }\n}\n\nlet isPaused = false;\n\nfunction onMouseOver(): void {\n if (props.pauseOnHover && !props.infinite) {\n isPaused = true;\n // stop auto close timeout\n clearInterval(timer);\n }\n}\n\nfunction onMouseLeave(): void {\n if (isPaused)\n // close when mouse leave and is paused before\n close(\"mouseleave\");\n}\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [string] | CloseEventArgs<C>): void {\n isActive.value = false;\n if (timer) clearTimeout(timer);\n emits(\"close\", ...args);\n}\n\n// --- Computed Component Classes ---\n\nconst noticeClasses = defineClasses([\"noticeClass\", \"o-notices\"]);\n\nconst positionTopClasses = defineClasses([\n \"noticePositionClass\",\n \"o-notices--\",\n \"top\",\n]);\nconst positionBottomClasses = defineClasses([\n \"noticePositionClass\",\n \"o-notices--\",\n \"bottom\",\n]);\n\nconst noticeContainerClasses = defineClasses([\n \"noticeContainerClass\",\n \"o-notices__container\",\n]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n</script>\n\n<template>\n <o-notification\n ref=\"notificationComponent\"\n v-bind=\"$attrs\"\n v-model:active=\"isActive\"\n :override=\"override\"\n :position=\"position\"\n :variant=\"variant\"\n :role=\"isAlert ? 'alert' : 'status'\"\n :aria-atomic=\"true\"\n @close=\"close\"\n @mouseover=\"onMouseOver\"\n @mouseleave=\"onMouseLeave\">\n <template #inner=\"{ close }\">\n <!-- injected component for programmatic usage -->\n <component\n v-bind=\"$props.props\"\n :is=\"component\"\n v-if=\"component\"\n v-on=\"$props.events || {}\"\n @close=\"close\" />\n </template>\n <slot />\n </o-notification>\n</template>\n","import type {\n Component,\n ComponentInternalInstance,\n MaybeRefOrGetter,\n} from \"vue\";\nimport {\n InstanceRegistry,\n ComponentProgrammatic,\n type ProgrammaticComponentOptions,\n type ProgrammaticExpose,\n} from \"../programmatic\";\nimport { getOption } from \"@/utils/config\";\n\nimport NotificationNotice from \"./NotificationNotice.vue\";\n\nimport type { NotificationProps, NotificationNoticeProps } from \"./props\";\n\ndeclare module \"../../index\" {\n interface OrugaProgrammatic {\n notification: typeof NotificationProgrammatic;\n }\n}\n\n/** notification component programmatic instance registry */\nconst registry = new InstanceRegistry<ComponentInternalInstance>();\n\n/** useNotificationProgrammatic composable options */\nexport type NotificationProgrammaticOptions<C extends Component> = Readonly<\n Omit<NotificationNoticeProps<C>, \"container\">\n> &\n Readonly<NotificationProps> &\n ProgrammaticComponentOptions<typeof NotificationNotice<C>>;\n\nconst NotificationProgrammatic = {\n /** Returns the number of registered active instances. */\n count: registry.count,\n /**\n * Create a new programmatic notification component instance.\n * @param options notification message string or notification component props object\n * @param target specify a target the component get rendered into - default is `document.body`\n * @returns ProgrammaticExpose\n */\n open<C extends Component>(\n options: string | NotificationProgrammaticOptions<C>,\n target?: MaybeRefOrGetter<string | HTMLElement | null>,\n ): ProgrammaticExpose<typeof NotificationNotice<C>> {\n const _options: NotificationProgrammaticOptions<C> =\n typeof options === \"string\" ? { message: options } : options;\n\n const componentProps: NotificationNoticeProps<C> = {\n position: getOption(\"notification.position\", \"top-right\"),\n container: document.body,\n ..._options, // pass all props to the internal notification component\n };\n\n // create programmatic component\n return ComponentProgrammatic.open(NotificationNotice, {\n registry, // custom programmatic instance registry\n target, // target the component get rendered into\n props: componentProps, // component specific props\n onClose: _options.onClose, // on close event handler\n });\n },\n /** Close the last registred instance in the notification programmatic instance registry. */\n close(...args: unknown[]): void {\n registry.last()?.exposed?.close(...args);\n },\n /** Close all instances in the programmatic notification instance registry. */\n closeAll(...args: unknown[]): void {\n registry.walk((entry) => entry.exposed?.close(...args));\n },\n};\n\nexport default NotificationProgrammatic;\n","import type { App, Plugin } from \"vue\";\n\nimport Notification from \"./Notification.vue\";\nimport NotificationProgrammatic from \"./useNotificationProgrammatic\";\n\nimport {\n registerComponent,\n registerComponentProgrammatic,\n} from \"@/utils/plugins\";\n\n/** export notification specific types */\nexport type { NotificationProgrammaticOptions } from \"./useNotificationProgrammatic\";\n\n/** export notification plugin */\nexport default {\n install(app: App) {\n registerComponent(app, Notification);\n registerComponentProgrammatic(\n app,\n \"notification\",\n NotificationProgrammatic,\n );\n },\n} as Plugin;\n\n/** export notification components & composables */\nexport { Notification as ONotification, NotificationProgrammatic };\n"],"names":["_useModel","NotificationNotice","Notification"],"mappings":"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"}