PNotify is a vanilla JavaScript notification and confirmation/prompt library. PNotify can provide desktop notifications based on the Web Notifications spec with fall back to an in-browser notice.
This README is for an old version of PNotify.
Upgrade to the latest version of PNotify to get new features and fixes.
You can get PNotify using NPM or Yarn. (You can also use jsDelivr or UNPKG.)
npm install --save pnotify@4 # If you plan to use Material style: npm install --save material-design-icons # If you plan to use the Animate module: npm install --save animate.css # If you plan to use the NonBlock module: npm install --save nonblockjs
Inside the pnotify module directory:
src
Svelte components and uncompressed Bright Theme CSS.lib/es
uncompressed ECMAScript modules.lib/umd
uncompressed UMD modules.lib/iife
uncompressed IIFE scripts.dist
compressed Bright Theme CSS.dist/es
compressed ECMAScript modules.dist/umd
compressed UMD modules.dist/iife
compressed IIFE scripts.In addition to the JS, be sure to include a PNotify style.
PNotify in Svelte. Import the Svelte files from src
:
import PNotify from 'pnotify/src/PNotify.html'; import PNotifyButtons from 'pnotify/src/PNotifyButtons.html'; PNotify.alert('Notice me, senpai!');
PNotify in React. Import the ES modules from dist
:
import PNotify from 'pnotify/dist/es/PNotify'; import PNotifyButtons from 'pnotify/dist/es/PNotifyButtons'; PNotify.alert('Notice me, senpai!');
PNotify in Angular. Import the ES modules from dist
and initiate the modules:
import PNotify from 'pnotify/dist/es/PNotify'; import PNotifyButtons from 'pnotify/dist/es/PNotifyButtons'; //... export class WhateverComponent { constructor() { PNotifyButtons; // Initiate the module. Important! PNotify.alert('Notice me, senpai!'); } }
For IE support, see this issue.
PNotify in Angular as an injectable service:
// pnotify.service.ts import { Injectable } from '@angular/core'; import PNotify from 'pnotify/dist/es/PNotify'; import PNotifyButtons from 'pnotify/dist/es/PNotifyButtons'; @Injectable() export class PNotifyService { getPNotify() { PNotifyButtons; // Initiate the module. Important! return PNotify; } } // whatever.module.ts //... import { PNotifyService } from './pnotify.service'; @NgModule({ declarations: [...], imports: [...], providers: [PNotifyService], bootstrap: [...] }) export class WhateverModule {} // whatever.component.ts import { PNotifyService } from './pnotify.service'; //... export class WhateverComponent { pnotify = undefined; constructor(pnotifyService: PNotifyService) { this.pnotify = pnotifyService.getPNotify(); this.pnotify.alert('Notice me, senpai!'); } }
PNotify in AngularJS. Import the UMD modules from dist
:
var angular = require('angular'); var PNotify = require('pnotify/dist/umd/PNotify'); var PNotifyButtons = require('pnotify/dist/umd/PNotifyButtons'); angular.module('WhateverModule', []) .value('PNotify', PNotify) .controller('WhateverController', ['PNotify', function(PNotify) { PNotify.alert('Notice me, senpai!'); }]);
PNotify in vanilla ECMAScript 5. Include the IIFE scripts from dist
:
<script type="text/javascript" src="node_modules/pnotify/dist/iife/PNotify.js"></script> <script type="text/javascript" src="node_modules/pnotify/dist/iife/PNotifyButtons.js"></script> <script type="text/javascript"> PNotify.alert('Notice me, senpai!'); </script>
PNotify in vanilla ECMAScript 6+. Include the ES modules from dist
:
import PNotify from 'node_modules/pnotify/dist/es/PNotify.js'; import PNotifyButtons from 'node_modules/pnotify/dist/es/PNotifyButtons.js'; PNotify.alert('Notice me, senpai!');
The default, standalone theme, Bright Theme. Include the CSS file in your page:
<link href="node_modules/pnotify/dist/PNotifyBrightTheme.css" rel="stylesheet" type="text/css" />
The Material Style module. Requires material-design-icons. Include the module in your JS, and set it as the default:
import PNotifyStyleMaterial from 'pnotify/dist/es/PNotifyStyleMaterial.js'; // or var PNotifyStyleMaterial = require('pnotify/dist/umd/PNotifyStyleMaterial.js'); // Set default styling. PNotify.defaults.styling = 'material'; // This icon setting requires the Material Icons font. (See below.) PNotify.defaults.icons = 'material';
To use the Material Style icons, include the Material Design Icons Font in your page.
# The official Google package: npm install --save material-design-icons # OR, An unofficial package that only includes the font: npm install --save material-design-icon-fonts
<link rel="stylesheet" href="node_modules/material-design-icons/iconfont/material-icons.css" />
Alternatively, you can use the Google Fonts CDN:
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" />
To set Bootstrap as the default style, include the appropriate line(s) from below after you import PNotify:
PNotify.defaults.styling = 'bootstrap3'; // Bootstrap version 3 PNotify.defaults.icons = 'bootstrap3'; // glyphicons // or PNotify.defaults.styling = 'bootstrap4'; // Bootstrap version 4
To set Font Awesome as the default icons, include the appropriate line from below after you import PNotify:
PNotify.defaults.icons = 'fontawesome4'; // Font Awesome 4 // or PNotify.defaults.icons = 'fontawesome5'; // Font Awesome 5
To make a notice, use the factory functions:
// Manually set the type. PNotify.alert({ text: "I'm an alert.", type: 'notice' }); // Automatically set the type. PNotify.notice({ text: "I'm a notice." }); PNotify.info({ text: "I'm an info message." }); PNotify.success({ text: "I'm a success message." }); PNotify.error({ text: "I'm an error message." });
PNotify options and default values.
PNotify.defaults = {
title: false
titleTrusted: false
text: false
textTrusted: false
styling: 'brighttheme'
icons: 'brighttheme'
addClass: ''
cornerClass: ''
autoDisplay: true
width: '360px'
minHeight: '16px'
type: 'notice'
icon: true
animation: 'fade'
animateSpeed: 'normal'
shadow: true
hide: true
delay: 8000
mouseReset: true
remove: true
destroy: true
stack: PNotify.defaultStack
modules: {}
}
PNotify.defaultStack = { dir1: 'down', dir2: 'left', firstpos1: 25, firstpos2: 25, spacing1: 36, spacing2: 36, push: 'bottom', context: document.body }
PNotify.defaults.width = '400px';
Changing a default for modules can be done in a couple ways.
// This will change the default for every notice, and is the recommended way. PNotify.modules.History.defaults.maxInStack = 10; // This will change the default only for notices that don't have a `modules` option. PNotify.defaults.modules = { History: { maxInStack: 10 } };
Desktop: {
desktop: false
fallback: true
icon: null
tag: null
update
function.title: null
text: null
options: {}
}
Buttons: {
closer: true
closerHover: true
sticker: true
stickerHover: true
labels: {close: 'Close', stick: 'Stick', unstick: 'Unstick'}
classes: {closer: null, pinUp: null, pinDown: null}
}
ℹ️ In v4, it's no longer possible to show closer/sticker buttons when the notice is nonblocking.
Requires NonBlock.js 1.0.8 or higher.
It is also deprecated and unnecessary in v4. All it does is add the 'nonblock' class to your notice. You can do the same yourself with addClass: 'nonblock'
.
NonBlock: {
nonblock: false
}
Mobile: {
swipeDismiss: true
styling: true
}
Requires Animate.css.
Animate: {
animate: false
inClass: ''
outClass: ''
}
The Animate module also creates a method, attention
, on notices which accepts an attention grabber class and an animation completed callback.
Confirm: {
confirm: false
focus: null
prompt: false
promptClass: ''
promptValue: ''
promptMultiLine: false
align: 'right'
buttons: [ { text: 'Ok', textTrusted: false, addClass: '', primary: true, // Whether to trigger this button when the user hits enter in a single line // prompt. Also, focus the button if it is a modal prompt. promptTrigger: true, click: (notice, value) => { notice.close(); notice.fire('pnotify.confirm', {notice, value}); } }, { text: 'Cancel', textTrusted: false, addClass: '', click: (notice) => { notice.close(); notice.fire('pnotify.cancel', {notice}); } } ]
}
Because the default buttons fire notice events on confirmation and cancellation, you can listen for them like this:
const notice = PNotify.alert({ title: 'Confirmation Needed', text: 'Are you sure?', hide: false, modules: { Confirm: { confirm: true } } }); notice.on('pnotify.confirm', () => { // User confirmed, continue here... }); notice.on('pnotify.cancel', () => { // User canceled, continue here... });
History: {
history: true
maxInStack: Infinity
}
The History module also has two methods:
PNotify.modules.History.showLast(stack)
PNotify.modules.History.showAll(stack)
true
, it will reopen all notices from every stack.ℹ️ In v4, the History module can no longer make a dropdown for you. But hey, it's smaller now.
The callback options all expect the value to be a callback function. If the function returns false on the beforeOpen
or beforeClose
callback, that event will be canceled.
Callbacks: {
beforeInit
afterInit
beforeOpen
afterOpen
beforeClose
afterClose
}
PNotify.alert(options)
PNotify.notice(options)
PNotify.info(options)
PNotify.success(options)
PNotify.error(options)
PNotify.closeAll()
PNotify.removeAll()
PNotify.closeStack(stack)
PNotify.removeStack(stack)
PNotify.positionAll()
PNotify.VERSION
PNotify.defaults
PNotify.defaultStack
PNotify.notices
PNotify.modules
PNotify.styling
notice.open()
notice.close()
notice.remove()
notice.update(options)
notice.addModuleClass(...classNames)
notice.removeModuleClass(...classNames)
notice.hasModuleClass(...classNames)
notice.refs.elem
notice.refs.container
notice.refs.titleContainer
notice.refs.textContainer
notice.refs.iconContainer
notice.get(option)
notice.set(options)
update(options)
instead. It has some special PNotify secret sauce to make sure your notice doesn't break.notice.observe(key, callback[, options])
notice.destroy()
close()
instead. It will animate the notice out and you can open it again. Once you destroy it, you can't open it again.notice.on(eventName, callback)
event
argument.notice.fire(eventName, event)
A stack is an object used to determine where to position notices.
Stack properties:
dir1
'up'
, 'down'
, 'right'
, or 'left'
.firstpos1
dir1
, the first notice will appear. If undefined, the current position of the notice, whatever that is, will be used.spacing1
dir1
. If undefined, 25
will be used.dir2
dir1
. The notices will continue in this direction when they reach the edge of the viewport along dir1
.firstpos2
dir2
, the first notice will appear. If undefined, the current position of the notice, whatever that is, will be used.spacing2
dir2
. If undefined, 25
will be used.push
'top'
or 'bottom'
.modal
overlayClose
context
document.body
will be used.Stack behavior:
dir1
property, the notice will be centered in the context.dir1
and no dir2
, the notices will be centered along the axis of dir1
.firstpos*
values are relative to an edge determined by the corresponding dir*
value.
dirX === 'up'
means firstposX
is relative to the bottom edge.dirX === 'down'
means firstposX
is relative to the top edge.dirX === 'left'
means firstposX
is relative to the right edge.dirX === 'right'
means firstposX
is relative to the left edge.⚠️ Calling something like
PNotify.alert({text: 'notice', stack: {dir1: 'down', firstpos1: 25}});
may not do what you want. It will create a notice, but that notice will be in its own stack and will overlap other notices.
Here is an example stack with comments to explain. You can play with it here.
const stackBottomModal = { dir1: 'up', // With a dir1 of 'up', the stacks will start appearing at the bottom. // Without a `dir2`, this stack will be horizontally centered, since the `dir1` axis is vertical. firstpos1: 25, // The notices will appear 25 pixels from the bottom of the context. // Without a `spacing1`, this stack's notices will be placed 25 pixels apart. push: 'top', // Each new notice will appear at the bottom of the screen, which is where the 'top' of the stack is. Other notices will be pushed up. modal: true, // When a notice appears in this stack, a modal overlay will be created. overlayClose: true, // When the user clicks on the overlay, all notices in this stack will be closed. context: document.getElementById('page-container') // The notices will be placed in the 'page-container' element. };
If you just want to position a single notice programmatically, and don't want to add any other notices into the stack, you can use something like this:
PNotify.alert({ text: "Notice that's positioned in its own stack.", stack: { dir1: 'down', dir2: 'right', // Position from the top left corner. firstpos1: 90, firstpos2: 90 // 90px from the top, 90px from the left. } });
Copyright 2009-2020 Hunter Perrin Copyright 2015 Google, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
See http://sciactive.com/pnotify/ for more information, and demos.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4