Skip to content

Notivue - Astro ​

Notivue is a powerful toast notification system for Vue, Nuxt and Astro. Display your notifications using the built-in <Notification /> component or bring your own components.

Installation ​

bash
npm i notivue
bash
yarn add notivue
bash
pnpm add notivue

Getting Started ​

Import Path

When using Notivue with Astro, make sure to import any function, component or object mentioned in this documentation from notivue/astro and not notivue.

1. Add Notivue to the Vue app entry point ​

pages/_app.js/ts

js
import { createNotivue } from 'notivue/astro'

const notivue = createNotivue({
  // Options
})

export default (app) => {
  app.use(notivue)
}
js
import { createNotivue } from 'notivue/astro'

const notivue = createNotivue({
  teleportTo: '#notivue_teleport'
})

export default (app) => {
  app.use(notivue)
}

2. Create a Vue island to render the stream ​

components/Notivue.vue

vue
<script setup>
import { Notivue, Notification } from 'notivue/astro'
</script>

<template>
  <Notivue v-slot="item">
    <Notification :item="item" />
  </Notivue>
</template>
vue
<script setup>
import { Notivue, NotivueSwipe, Notification } from 'notivue/astro'
</script>

<template>
  <Notivue v-slot="item">
    <NotivueSwipe :item="item">
      <Notification :item="item" />
    </NotivueSwipe>
  </Notivue>
</template>
vue
<script setup>
import { Notivue, Notification, NotificationProgress } from 'notivue/astro'
</script>

<template>
  <Notivue v-slot="item">
    <Notification :item="item">
      <NotificationProgress />
    </Notification>
  </Notivue>
</template>
vue
<script setup>
import {
  Notivue,
  NotivueSwipe,
  Notification,
  NotificationProgress
} from 'notivue/astro'
</script>

<template>
  <Notivue v-slot="item">
    <NotivueSwipe :item="item">
      <Notification :item="item">
        <NotificationProgress />
      </Notification>
    </NotivueSwipe>
  </Notivue>
</template>

2. Add the Notivue island ​

Option A - Site-wide usage ​

💡 Prefer this method if using Vue or Notivue in almost all your pages.

layouts/Layout.astro

astro
---
import Notivue from '@/components/Notivue.vue'

import 'notivue/astro/notification.css'
import 'notivue/astro/animations.css'
---

<html lang="en">
   <head>
      <!-- ... -->
   </head>

   <body>
      <slot />

      <Notivue client:only="vue" />
   </body>
</html>
astro
---
import Notivue from '@/components/Notivue.vue'

import 'notivue/astro/notification.css'
import 'notivue/astro/animations.css'
---

<html lang="en">
   <head>
      <!-- ... -->
   </head>

   <body>
      <slot />

      <div id="notivue_teleport" transition:persist transition:persist-props>
         <Notivue client:only="vue" />
      </div>
   </body>
</html>

Option B - Page-specific usage ​

💡 Prefer this method if using Notivue only on few specific pages in order to avoid loading the whole Vue library on pages that do not need it.

layouts/Layout.astro

astro
---
import Notivue from '@/components/Notivue.vue'

import 'notivue/astro/notification.css'
import 'notivue/astro/animations.css'
---

<html>
  <head>
    <!-- ... -->
  </head>

  <body>
    <!-- ... -->

    <slot name="body-end" />
  </body>
</html>

pages/contact.astro

astro
---
import Notivue from '@/components/Notivue.vue'

import 'notivue/astro/notification.css'
import 'notivue/astro/animations.css'
---

<Layout>
  <!-- ... -->

  <Notivue slot="body-end" client:only="vue" />
</Layout>
astro
---
import Notivue from '@/components/Notivue.vue'

import 'notivue/astro/notification.css'
import 'notivue/astro/animations.css'
---

<Layout>
  <!-- ... -->

  <div slot="body-end" id="notivue_teleport" transition:persist transition:persist-props>
      <Notivue client:only="vue" />
  </div>
</Layout>

Usage ​

Use the push function to render notifications from any script tag, client-side file or UI framework component. Could be a Vue, React or Svelte component, it will just work.

js
import { push } from 'notivue/astro'

push.success('Hello from your first notification!')