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!')