@tour-kit/announcements API
API reference for @tour-kit/announcements: Modal, Toast, Banner, Slideout, Spotlight, queue hooks, and provider config
Complete API reference for the announcements package. This package provides multi-variant product announcements.
For prose-style docs and recipes, see the @tour-kit/announcements package overview, or jump to components, headless primitives, hooks, provider, or frequency / audience config.
Providers
AnnouncementsProvider
Provider for announcements.
import { AnnouncementsProvider } from '@tour-kit/announcements';
<AnnouncementsProvider
announcements={announcements}
userId="user-123"
userProperties={{ plan: 'pro' }}
onShow={(id) => console.log('Shown:', id)}
onDismiss={(id, reason) => console.log('Dismissed:', id, reason)}
>
{children}
</AnnouncementsProvider>| Prop | Type | Description |
|---|---|---|
announcements | AnnouncementConfig[] | Array of announcement configs |
userId | string | User identifier |
userProperties | Record<string, unknown> | User properties for targeting |
onShow | (id: string) => void | Called when announcement shown |
onDismiss | (id: string, reason: DismissalReason) => void | Called on dismiss |
Hooks
useAnnouncement
Hook for single announcement control.
import { useAnnouncement } from '@tour-kit/announcements';
const {
announcement,
isVisible,
show,
dismiss,
complete,
} = useAnnouncement('announcement-id');| Return | Type | Description |
|---|---|---|
announcement | AnnouncementConfig | undefined | Announcement config |
isVisible | boolean | Whether currently visible |
show | () => void | Show the announcement |
dismiss | (reason?: DismissalReason) => void | Dismiss the announcement |
complete | () => void | Mark as completed |
useAnnouncements
Hook for all announcements.
import { useAnnouncements } from '@tour-kit/announcements';
const {
announcements,
visible,
showAnnouncement,
dismissAnnouncement,
} = useAnnouncements();useAnnouncementQueue
Hook for queue management.
import { useAnnouncementQueue } from '@tour-kit/announcements';
const {
queue,
current,
next,
clear,
} = useAnnouncementQueue();Components
AnnouncementModal
Centered dialog variant.
import { AnnouncementModal } from '@tour-kit/announcements';
<AnnouncementModal id="welcome-modal" />| Prop | Type | Description |
|---|---|---|
id | string | Announcement ID |
size | 'sm' | 'md' | 'lg' | Modal size |
closeOnOverlay | boolean | Close when clicking overlay |
AnnouncementSlideout
Side panel variant.
import { AnnouncementSlideout } from '@tour-kit/announcements';
<AnnouncementSlideout id="feature-slideout" />| Prop | Type | Description |
|---|---|---|
id | string | Announcement ID |
position | 'left' | 'right' | Slide from direction |
width | string | Panel width |
AnnouncementBanner
Top/bottom strip variant.
import { AnnouncementBanner } from '@tour-kit/announcements';
<AnnouncementBanner id="maintenance-banner" />| Prop | Type | Description |
|---|---|---|
id | string | Announcement ID |
position | 'top' | 'bottom' | Banner position |
dismissible | boolean | Show close button |
AnnouncementToast
Corner notification variant.
import { AnnouncementToast } from '@tour-kit/announcements';
<AnnouncementToast id="update-toast" />| Prop | Type | Description |
|---|---|---|
id | string | Announcement ID |
position | string | Toast position |
duration | number | Auto-dismiss duration (ms) |
AnnouncementSpotlight
Element highlight with overlay.
import { AnnouncementSpotlight } from '@tour-kit/announcements';
<AnnouncementSpotlight id="feature-spotlight" />| Prop | Type | Description |
|---|---|---|
id | string | Announcement ID |
target | string | CSS selector for target |
placement | Placement | Tooltip placement |
Shared Components
import {
AnnouncementOverlay,
AnnouncementClose,
AnnouncementContent,
AnnouncementActions,
} from '@tour-kit/announcements';Headless Components
Per-variant headless docs: <HeadlessModal>, <HeadlessSlideout>, <HeadlessBanner>, <HeadlessToast>, <HeadlessSpotlight>.
import {
HeadlessModal,
HeadlessSlideout,
HeadlessBanner,
HeadlessToast,
HeadlessSpotlight,
} from '@tour-kit/announcements/headless';
<HeadlessModal id="my-modal">
{({ isVisible, dismiss, announcement }) => (
<CustomModal />
)}
</HeadlessModal>Configuration
Frequency Rules
// Show only once ever
frequency: 'once'
// Show once per session
frequency: 'session'
// Show every time conditions met
frequency: 'always'
// Show N times total
frequency: { type: 'times', count: 3 }
// Show every N days
frequency: { type: 'interval', days: 7 }Audience Targeting
audience: [
{ property: 'plan', operator: 'equals', value: 'pro' },
{ property: 'signupDate', operator: 'before', value: '2024-01-01' },
{ property: 'features', operator: 'contains', value: 'beta' },
]| Operator | Description |
|---|---|
equals | Exact match |
not_equals | Not equal |
contains | Array contains value |
not_contains | Array doesn't contain |
in | Value in array |
not_in | Value not in array |
exists | Property exists |
not_exists | Property doesn't exist |
Priority
priority: 'low' | 'normal' | 'high' | 'critical'Types
AnnouncementConfig
interface AnnouncementConfig {
id: string;
variant: 'modal' | 'slideout' | 'banner' | 'toast' | 'spotlight';
priority?: 'low' | 'normal' | 'high' | 'critical';
title?: string;
description?: string | ReactNode;
media?: AnnouncementMedia;
primaryAction?: AnnouncementAction;
secondaryAction?: AnnouncementAction;
frequency?: FrequencyRule;
schedule?: Schedule;
audience?: AudienceCondition[];
modalOptions?: ModalOptions;
slideoutOptions?: SlideoutOptions;
bannerOptions?: BannerOptions;
toastOptions?: ToastOptions;
spotlightOptions?: SpotlightOptions;
onShow?: () => void;
onDismiss?: (reason: DismissalReason) => void;
onComplete?: () => void;
}DismissalReason
type DismissalReason =
| 'close_button'
| 'overlay_click'
| 'escape_key'
| 'primary_action'
| 'secondary_action'
| 'auto_dismiss'
| 'programmatic';AnnouncementState
interface AnnouncementState {
id: string;
isActive: boolean;
isVisible: boolean;
isDismissed: boolean;
viewCount: number;
lastViewedAt: Date | null;
dismissedAt: Date | null;
dismissalReason: DismissalReason | null;
completedAt: Date | null;
}AudienceProp
// Audience prop accepted by AnnouncementConfig.audience
type AudienceProp = AudienceCondition[] | { segment: string };
// Re-exported from @tour-kit/core
import { isSegmentAudience } from '@tour-kit/announcements';
isSegmentAudience(audience): audience is { segment: string };Audience Evaluator
import { evaluateAnnouncementAudience } from '@tour-kit/announcements';
// Single-item evaluator used by useFilteredAnnouncements. Returns `true` for
// undefined and array-shape audiences (deferred to the scheduler); evaluates
// the segment branch against the current segments map.
evaluateAnnouncementAudience(
audience: AudienceProp | undefined,
segments: Record<string, boolean>
): boolean;ForceShowBypassKey
// Storage key used by useAnnouncement(id, { forceShow: true }) to bypass
// frequency / schedule / persistence gates during development.
const ForceShowBypassKey: string;Reactions
type Reaction = '👍' | '👎' | '🎉' | '🚀' | '❤️' | '🤔';
interface ReactionsProps {
announcementId: string;
available?: Reaction[]; // default: all
onReact?: (reaction: Reaction) => void;
className?: string;
}Changelog Components
interface ChangelogPageProps {
announcements: AnnouncementConfig[];
title?: string;
description?: string;
filters?: ChangelogFilterProps['filters'];
className?: string;
}
interface ChangelogFilterProps {
filters: Array<{ id: string; label: string; predicate: (a: AnnouncementConfig) => boolean }>;
value: string | null;
onChange: (next: string | null) => void;
}
interface ChangelogEntryProps {
announcement: AnnouncementConfig;
className?: string;
}See Changelog page.
Toast Adapter
Plug a host-app toast library (sonner, react-hot-toast, etc.) into @tour-kit/announcements instead of using the built-in toast variant.
interface ToastAdapterRenderArgs {
id: string;
title?: React.ReactNode;
description?: React.ReactNode;
variant?: 'default' | 'success' | 'warning' | 'destructive';
duration?: number;
onDismiss?: () => void;
onAction?: () => void;
}
interface ToastAdapterHandle {
/** Dismiss the toast programmatically. */
dismiss: () => void;
}
interface ToastAdapter {
/** Show a toast and return a handle the provider can use to dismiss it. */
show: (args: ToastAdapterRenderArgs) => ToastAdapterHandle;
}Pass <AnnouncementsProvider toastAdapter={...}> to route toast-variant announcements through your adapter.
See also
@tour-kit/announcementspackage overview — prose docs and recipes for every symbol above.- API reference index — browse other package references.
- Announcements & scheduling guide — wire announcements into
@tour-kit/schedulingfor time-based rollouts. - Queue configuration — priority and ordering when multiple announcements are eligible.
Ship onboarding, not config.
npm i @tour-kit/core is MIT and free. The Pro packages work unlicensed too — a one-time $99 license removes the production watermark when you ship.
MIT-licensed — no signup, no credit card. Pay once, only when you ship.