Open any URL in a floating, draggable, resizable panel that sits on top of your current page. Instead of navigating users away to a detail page or popup, bring the content to them - perfect for quick lookups, side-by-side editing, or letting users reference one page while working on another.
Demo URL: https://stein-plugins.bubbleapps.io/version-test/floating-page-viewer-pro/1778882786299x163115094521659740Editor URL: https://bubble.io/page?id=stein-plugins&tab=Design&name=floating-page-viewer-pro&type=pagePro includes two elements.
Page Viewer manages a single panel that opens, closes, minimizes, expands, docks, and reopens - the standard "show me this detail page without losing context" use case.
Page Viewer Multi is a full window manager that spawns a new floating window every time you call Open, with cascade positioning, click-to-focus, and standard desktop-style z-index stacking for true multi-document workflows like CRMs, internal tools, and dashboards.
Both elements support opening panels as centered floating windows, right or left side drawers, bottom sheets, or fullscreen - choose per-Open call from your workflow. Both are built primarily for embedding your own Bubble app pages (detail views, edit forms, related records) without losing context. Each window behaves like a real desktop window with header bar, minimize, expand, close, and optional "open in new tab" buttons, plus full drag and resize. Drop an element on a page or in a reusable header once and call it from any workflow.
Important - Read Before InstallingThis plugin uses iframes to display pages, which means
not every URL will work. Whether a URL loads is controlled by the
target site's security headers, not by this plugin or by Bubble.
Works reliably:· Your own Bubble app pages (after enabling the iframe setting - see instructions)
· Wikipedia, MDN, most documentation sites
· YouTube videos via the embed URL format
· Vimeo, CodePen, JSFiddle, and other sites that explicitly allow embedding
· Your own websites and internal tools that you control
Will NOT work (blocked by the site itself):· Google, Gmail, Google Docs, Google Drive
· Facebook, Instagram, Twitter/X, LinkedIn, Reddit
· Most banks, SaaS apps, ChatGPT, Claude.ai
· Amazon and most major e-commerce sites
· YouTube's main site (use the embed URL instead)
When a site blocks embedding, the panel will load but show a broken page icon.
There is no way around this from the client side - the browser refuses to render the content based on headers the target site sends. This is a fundamental web security feature, not a plugin limitation. The plugin includes an optional "Open in new tab" button you can enable so users have a one-click escape hatch for any URL the browser refuses to embed.
If your use case is embedding arbitrary external websites, this plugin will not meet your needs. It is built for embedding pages within your own Bubble app or trusted embed-friendly sources.
Element 1 - Page Viewer (Single Window)FeaturesFloating PanelOpens any URL in a draggable, resizable floating window above the current page · Drag by the header bar to reposition · Resize from the bottom-right corner · Loading spinner overlay shown until the page finishes loading
Position ModesPass a position with each Open call -
center (default floating window),
right (right side drawer),
left (left side drawer),
bottom (bottom sheet), or
fullscreen · Docked positions get edge-only resize handles on their inward-facing edge · Drag a docked panel's header to undock it back to a centered floating window · Double-click the header to snap between docked, centered, and fullscreen states
Window ControlsMinimize button collapses the panel to just the header so it stays accessible without taking up space · Expand button maximizes the panel to fullscreen and back · Close button dismisses the panel · Optional "Open in new tab" button lets users pop the loaded URL into a browser tab · Optional ESC key closes the panel when the parent page has focus · Optional dimmed backdrop for modal-style focus with configurable click-to-close
Workflow IntegrationOpen, close, minimize, restore, expand, contract, navigate, and reload via element actions · Set the panel title contextually with each open call · Set position per open call · Pass an optional separate external URL for the "Open in new tab" button (useful when the iframe loads an embed URL but the new-tab button should open the canonical page) · Reopen on the same panel without recreating the element
Nested Iframe SafetyIf the plugin runs inside an iframe (e.g. preview-in-preview or embedded reusable), Open delegates up to the top-level Viewer via postMessage so panels never get trapped inside an existing panel's iframe
Media Playback CleanupOn close the iframe source is cleared to immediately stop any audio or video playback - no orphaned media after the user dismisses the panel
StylingHeader background color · Header text color · Panel corner radius · Initial width and height · Backdrop toggle · ESC-to-close toggle · Open-in-new-tab button toggle
UX DetailsPanel centers automatically on first open · Remembers user position once moved · Cannot be dragged fully off-screen · Docked positions remember user-resized widths and heights · Full touch support for mobile drag and resize
States Exposedis_open - whether the panel is currently visible ·
is_minimized - whether the panel is collapsed to just the header ·
is_expanded - whether the panel is currently in fullscreen mode ·
current_url - the URL loaded in the panel ·
current_position - the active position mode (center, right, left, bottom, or fullscreen)
Events Triggeredopened - fires when the panel opens ·
closed - fires when the panel closes via the X button, ESC, or backdrop ·
minimized - fires when the panel collapses ·
restored - fires when the panel expands from minimized ·
expanded - fires when the panel enters fullscreen ·
contracted - fires when the panel exits fullscreen ·
iframe_loaded - fires every time the loaded page finishes loading
Element 2 - Page Viewer Multi (Window Manager)FeaturesMultiple Floating WindowsEvery Open call spawns a brand new window · Centered windows cascade-offset from the previous one so they do not fully overlap · Docked windows cascade along their dock edge so prior drawers peek out beyond newer ones · Each window is independent with its own header buttons, drag handlers, expand state, and resize logic
Position Modes Per WindowEach Open call accepts a position -
center,
right drawer,
left drawer,
bottom sheet, or
fullscreen · Mix positions freely - open one window as a right drawer and another as a centered float · Drag a docked window's header to undock it · Double-click any header to snap between docked, centered, and fullscreen states
Click to FocusClicking, dragging, or resizing any window brings it to the front · Clicking the iframe area of a back window also brings it forward via an invisible click-catcher overlay · Focused window URL exposed as a state for workflow logic · Standard desktop-style z-index management across all open windows
Window ControlsEach window has its own minimize, expand, and close buttons · Optional "Open in new tab" button per window · Optional ESC key closes the topmost (focused) window when the parent page has focus · Close All button automatically appears in every window header once 2+ windows are open (toggleable off) · Close All element action wipes every open window in one call · Optional shared backdrop dims the page when any window is open
Nested Iframe SafetyIf the plugin runs inside an iframe, Open delegates up to the top-level Viewer via postMessage so new windows always open at the page level, not nested inside another window's iframe
Media Playback CleanupOn close (single or Close All) each iframe source is cleared to immediately stop any audio or video playback
StylingHeader background color and text color apply uniformly across all windows · Panel corner radius · Default width and height for new windows (each can be resized after opening) · Backdrop toggle · ESC-to-close toggle · Open-in-new-tab button toggle · Close All button visibility toggle
UX DetailsCentered cascade wraps after 8 windows to prevent off-screen drift · Docked cascade wraps after 6 windows · Each window remembers its own minimized state, expanded state, and per-position resized dimensions · Touch support for mobile drag and resize
States Exposedopen_window_count - how many windows are currently open ·
last_opened_url - URL of the most recently opened window ·
focused_window_url - URL of the topmost window, updates when the user clicks a different window
Events Triggeredwindow_opened - fires every time a new window is opened ·
window_closed - fires when any single window is closed via its X button or ESC ·
all_closed - fires when the last window closes or Close All is called ·
iframe_loaded - fires every time any window finishes loading