Skip to content

Message

Used to show feedback after an activity.

NameCategoryDescriptionTypeDefault
type? StyleMessage type'success' | 'warning' | 'info' | 'danger' | 'error''info'
center? StyleWhether to center textbooleanfalse
offset? StyleOffset from top of windownumber20
plain? StyleWhether to use plain style (lighter bg, colored text)booleanfalse
ghost? StyleWhether to use ghost style (transparent bg, border only)booleanfalse
duration? BehaviorDisplay duration (ms), 0 for persistentnumber3000
showClose? BehaviorWhether to show close buttonbooleanfalse
showTimer? BehaviorWhether to show duration progress barbooleantrue
max? BehaviorMax visible messages, oldest closed when exceedednumber
message? ContentMessage textstring | VNode
icon? ContentCustom icon name, overrides default type iconstring
PxMessage? MethodShow message(options: MessageOptions | string) => MessageHandler
PxMessage.success? MethodShow success message(options: MessageOptions | string) => MessageHandler
PxMessage.warning? MethodShow warning message(options: MessageOptions | string) => MessageHandler
PxMessage.info? MethodShow info message(options: MessageOptions | string) => MessageHandler
PxMessage.danger? MethodShow danger message(options: MessageOptions | string) => MessageHandler
PxMessage.error? MethodShow error message(options: MessageOptions | string) => MessageHandler
PxMessage.closeAll? MethodClose all messages(type?: MessageType) => void
close? MethodClose current message() => void

Basic Usage

Displays at the top and disappears after 3 seconds.

<template>
  <px-button @click="showMessage">Show Message</px-button>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showMessage = () => {
  PxMessage('This is a message');
};
</script>

Different Types

Used to show feedback for success, warning, message, and error activities.

<template>
  <div class="demo-message">
    <px-button @click="showSuccess">Success</px-button>
    <px-button @click="showWarning">Warning</px-button>
    <px-button @click="showInfo">Info</px-button>
    <px-button @click="showDanger">Danger</px-button>
  </div>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showSuccess = () => {
  PxMessage.success('Success!');
};
const showWarning = () => {
  PxMessage.warning('Warning!');
};
const showInfo = () => {
  PxMessage.info('Info message');
};
const showDanger = () => {
  PxMessage.danger('Danger!');
};
</script>

<style scoped>
.demo-message {
  display: flex;
  gap: 12px;
}
</style>

Plain Variant

Use plain for a lighter background with colored text.

<template>
  <div class="demo-message">
    <px-button @click="showInfo">Info</px-button>
    <px-button @click="showSuccess">Success</px-button>
    <px-button @click="showWarning">Warning</px-button>
    <px-button @click="showDanger">Danger</px-button>
  </div>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showInfo = () => {
  PxMessage({ message: 'Plain info message', plain: true, type: 'info' });
};
const showSuccess = () => {
  PxMessage({ message: 'Plain success message', plain: true, type: 'success' });
};
const showWarning = () => {
  PxMessage({ message: 'Plain warning message', plain: true, type: 'warning' });
};
const showDanger = () => {
  PxMessage({ message: 'Plain danger message', plain: true, type: 'danger' });
};
</script>

<style scoped>
.demo-message {
  display: flex;
  gap: 12px;
}
</style>

Ghost Variant

Use ghost for a transparent background with border only.

<template>
  <div class="demo-message">
    <px-button @click="showInfo">Info</px-button>
    <px-button @click="showSuccess">Success</px-button>
    <px-button @click="showWarning">Warning</px-button>
    <px-button @click="showDanger">Danger</px-button>
  </div>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showInfo = () => {
  PxMessage({ message: 'Ghost info message', ghost: true, type: 'info' });
};
const showSuccess = () => {
  PxMessage({ message: 'Ghost success message', ghost: true, type: 'success' });
};
const showWarning = () => {
  PxMessage({ message: 'Ghost warning message', ghost: true, type: 'warning' });
};
const showDanger = () => {
  PxMessage({ message: 'Ghost danger message', ghost: true, type: 'danger' });
};
</script>

<style scoped>
.demo-message {
  display: flex;
  gap: 12px;
}
</style>

Custom Icon

Use the icon prop to override the default type icon.

<template>
  <div class="demo-message">
    <px-button @click="showStar">Star Icon</px-button>
    <px-button @click="showHeart">Heart Icon</px-button>
  </div>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showStar = () => {
  PxMessage({ message: 'Starred message!', icon: 'star', type: 'warning' });
};
const showHeart = () => {
  PxMessage({ message: 'Liked message!', icon: 'heart', type: 'danger' });
};
</script>

<style scoped>
.demo-message {
  display: flex;
  gap: 12px;
}
</style>

Closable Message

A close button can be added.

<template>
  <px-button @click="showMessage">Show Closable Message</px-button>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showMessage = () => {
  PxMessage({
    message: 'This is a closable message',
    showClose: true,
    duration: 0,
  });
};
</script>

Duration Timer Bar

A thin progress bar at the bottom shows the remaining duration. Controlled by showTimer (default: true).

<template>
  <div class="demo-message">
    <px-button @click="showWithTimer">With Timer Bar</px-button>
    <px-button @click="showWithoutTimer">Without Timer Bar</px-button>
    <px-button @click="showLongDuration">Long Duration (8s)</px-button>
  </div>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showWithTimer = () => {
  PxMessage({ message: 'Watch the timer bar below', duration: 5000 });
};
const showWithoutTimer = () => {
  PxMessage({ message: 'No timer bar here', duration: 5000, showTimer: false });
};
const showLongDuration = () => {
  PxMessage({ message: 'This stays for 8 seconds', duration: 8000, type: 'success' });
};
</script>

<style scoped>
.demo-message {
  display: flex;
  gap: 12px;
}
</style>

Centered Text

Use center attribute to center the text.

<template>
  <px-button @click="showMessage">Show Centered Message</px-button>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showMessage = () => {
  PxMessage({
    message: 'Centered text message',
    center: true,
  });
};
</script>

Max Visible Count

Set max to limit the number of visible messages. Oldest messages are closed when the limit is exceeded.

<template>
  <div class="demo-message">
    <px-button @click="showMessages">Show Messages (max 3)</px-button>
  </div>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

let count = 0;
const showMessages = () => {
  count++;
  PxMessage({
    message: `Message #${count}`,
    duration: 5000,
    max: 3,
  });
};
</script>

<style scoped>
.demo-message {
  display: flex;
  gap: 12px;
}
</style>

Close All Messages

Call PxMessage.closeAll() to close all messages.

<template>
  <div class="demo-message">
    <px-button @click="showMessages">Show Multiple Messages</px-button>
    <px-button @click="closeAll">Close All</px-button>
  </div>
</template>

<script setup lang="ts">
import { PxMessage } from 'sakana-element';

const showMessages = () => {
  PxMessage.success('Message 1');
  PxMessage.warning('Message 2');
  PxMessage.info('Message 3');
};

const closeAll = () => {
  PxMessage.closeAll();
};
</script>

<style scoped>
.demo-message {
  display: flex;
  gap: 12px;
}
</style>