-
Notifications
You must be signed in to change notification settings - Fork 41
example window request attention
Stable.
A live "pay attention to me" affordance for any registered native window. Use it when something happens in the background that the user should notice — a long task finishing, an error condition becoming user-actionable, an inbound notification from a sister plugin.
This API replaces the previous "rely on a setInterval that
manipulates the DOM under #os-dock" workaround. The badge
- attention paths are now first-class.
// Pulse a registered window for 4 seconds.
const win = wp.os.windowManager.getById( 'my-plugin-inbox' );
win?.requestAttention( 'pulse', { durationMs: 4000 } );
// Or route through the rail directly:
wp.os.dock?.setAttention( 'my-plugin-inbox', 'shake', {
durationMs: 1500,
intensity: 'strong',
} );| Mode | Visual |
|---|---|
'pulse' |
Soft halo + scale, ~1.4s loop. Default for "you have a notification". |
'shake' |
Short horizontal jiggle. Good for nudges / urgent attention. |
'bounce' |
Vertical bob. Reads as "look here, now". |
null |
Clear any active attention. |
All three respect prefers-reduced-motion: reduce — the animation
is replaced by a static accent ring for the same duration.
window.requestAttention(
mode: 'pulse' | 'shake' | 'bounce' | null,
opts?: {
durationMs?: number; // default 4000; 0 = until cleared
intensity?: 'subtle' | 'normal' | 'strong'; // default 'normal'
},
): void;Sister API for setting the numeric badge without poking the DOM:
wp.os.dock?.setBadge?.( 'my-plugin-inbox', 7 );
wp.os.sideDock?.setBadge?.( 'my-plugin-inbox', 7 );
wp.os.icons?.setBadge?.( 'my-plugin-inbox', 7 );
wp.os.dock?.clearBadge?.( 'my-plugin-inbox' );
wp.os.sideDock?.clearBadge?.( 'my-plugin-inbox' );
wp.os.icons?.clearBadge?.( 'my-plugin-inbox' );Fan to all three rails — the rail that owns the id paints, the
others silently no-op. Every applied change publishes
os/badge-changed on the activity bus with rail
identifying the surface.
Window.requestAttention runs the request through the JS filter
os.window.attention first. Return null to mute the
request entirely:
wp.os.hooks.addFilter(
'os.window.attention',
'my-plugin/dnd',
( mode, { windowId } ) => {
if ( windowId === 'my-plugin-inbox' && isDoNotDisturbActive() ) {
return null;
}
return mode;
}
);A window registered without a tile (e.g.,
openstation_register_window( ..., [ 'placement' => 'none' ] ))
has no rail tile to pulse. requestAttention falls back to a
setHighlight('persistent') ring on the window itself, auto-cleared
after durationMs. The API is therefore safe to call regardless of
placement.
-
docs/examples/dock-badge.md—Dock.setBadgefor live badge counts. -
docs/examples/connect-to-window.md—Window.setHighlightfor cross-window pointing.
This wiki is generated from the docs/ directory — edits made here are overwritten by the next sync.
To change a page, open a pull request against docs/.
Guides
- Development guide
- Releasing openstation
- Agents security model
- API Index
- Architecture
- Bridge protocol — wiring overview
- <os-*> component reference
- Native Desktop Host — Experimental
- Desktop themes
- Dock customization — two registries, one mental model
- The event-driven framework
- Files on the Desktop
- Folder sharing
- Getting Started
- Hooks Reference
- Icons
- JavaScript Reference
- The Living Tree — algorithm definition
- Mio
- Native Windows & Framework Interop
- Plugin compatibility layer
- Progressive Web App (PWA)
- Station Home
- Using openstation from your own plugin
Migration notes
- Migration: built-in activity channels move to the os/ namespace
- Migration: window, wallpaper and widget bundles load on demand
- Migration — the navigation model
- Migration: a native window's tabs move to the window chrome
All examples
- AI Agents — extend and invoke from a plugin
- wp.os.ai.ask() — programmatic AI Copilot
- Tune the AI model config
- Custom arrange-menu action
- Open a child window its owner can't cover
- Style a specific admin page inside the iframe
- Code Blue — register your plugin's log file
- Open a file in the Code editor (deep-link from any window)
- Connect to a window — title-bar button + iframe pub/sub
- Content changes — live-refresh every window listing your type
- Custom window chrome (Experimental)
- Register a custom unfocused-window effect
- Example: render a data table
- Real file storage — react to uploads, gate policy, share from PHP
- React to a window being set free onto the real desktop
- Cross-window devtools — instrumentation primitives
- Add a dock item with a badge
- Decorate the dock without forking the renderer
- Replace the dock rail entirely
- Retune the Drafts widget's AI writing assistant
- Gate OpenStation by role
- Iframe-initiated window opens
- Build a feed reader without the bookkeeping
- Inject data into openStationConfig
- Render a list without losing clicks — renderKeyedList()
- Example: layout primitives (body → panel → row → col)
- Use <os-*> components from a plugin that ships as a zip
- Restyle and drive Mio
- Add an action that works on a whole selection
- WP Explorer — custom post types and their folder
- Add an action button to a WP Explorer preview pane
- Example: native Posts window
- Example: native window with tabs
- Native windows
- Customize note → post conversion
- Send a notification
- OAuth relay — connect to an external service
- OS-file drop
- <os-flyout> — window-scoped sliding card
- Plugins window — extras
- Track who's around — wp.os.presence
- Example: progress bar
- PWA install — surface your own button
- React to window events
- Example: extend the Trash
- Register a slash-command
- Register a desktop theme from a plugin
- Register a game
- Example: register a desktop icon (Jorvy)
- Register a wallpaper
- Register a widget
- Related entities — extend the title bar's "Related" menu
- The native-window render ctx
- Programmatic folder sharing
- Share state across multi-bundle plugins — wp.os.createSharedStore()
- Example: loading spinner
- Add an opt-in card to Station Home
- Accept drops on your desktop icon
- Give a tile two icons, one per state
- Add a row to a window's ⋯ menu
- Example: window activity & the status ring
- Window controls
- Subscribe to window lifecycle events
- Window links — relate windows and restyle the ties (Experimental)
- Window loading state — spinner overlay & ready signal
- Show a banner at the top of a window
- Pulse a window's icon — Window.requestAttention()
- Register a custom window reveal
- Window slots
- Window themes
- Native window with bundle-bound config