Help needed: Fixed-position elements in Confluence Global Page Custom UI
Hey Forge community! ![]()
I’m hoping someone has tackled this challenge before and can point me in the right direction.
What we’re building
We’ve built an interactive Domain Model visualization app using Forge Custom UI - think of it like a simplified Miro or a mind-map tool for software architecture. It shows our company’s domain hierarchy as an expandable tree graph that engineers can explore, with:
-
Zoom controls (bottom-left corner)
-
Component details panel (slides in from the right when you click a node)
-
Stats panel (team metrics, headcounts)
-
Pan/zoom on the SVG canvas
The app works beautifully in Compass using the compass:globalPage module - all the fixed-position overlay controls stick to the browser viewport exactly as expected.
The Problem
We want to offer the same visualization in Confluence using the confluence:globalPage module so non-technical stakeholders can explore the domain model too. But here’s where we’re stuck:
Confluence uses iframe-resizer to auto-size the Forge app iframe based on content height. This means our position: fixed elements (zoom controls, panels) are positioned relative to the iframe - which can be much taller than the visible browser viewport. The result? All our overlay controls end up “below the fold” and users have to scroll way down to find them.
In Compass, the iframe seems to match the viewport, so position: fixed works as expected. In Confluence Global Page, the iframe grows to content height, breaking the fixed positioning UX.
What we’ve tried (nothing worked)
-
CSS constraints:
height: 100vh; max-height: 100vh; overflow: hiddenon html/body/root - iframe-resizer overrides it -
data-iframe-sizeattribute: Tried to tell iframe-resizer to use a specific element’s height - still measures DOM content -
window.parentIFrame.size()API: Called from child to request specific height - works momentarily but host-side iframe-resizer immediately overrides it -
Inline scripts to configure iframe-resizer: Blocked by CSP (no inline scripts allowed)
-
confluence:fullPagemodule: Had React IntlProvider errors for non-admin users
We noticed the macro module supports viewportSize property, but confluence:globalPage doesn’t have this option in the manifest schema.
Questions for the community
-
Has anyone successfully used
position: fixedoverlays in aconfluence:globalPageCustom UI app? -
Is there a way to prevent iframe-resizer from auto-expanding the iframe height?
-
Any creative workarounds for sticky/fixed UI elements in Confluence Forge apps?
-
Should we be using a different module type altogether for this kind of full-page interactive visualization?
Technical details
-
Module:
confluence:globalPagewith Custom UI -
Framework: React 18, vanilla SVG for the graph
-
Forge CLI: Latest version
-
Positioning strategy:
position: fixedwithbottom: 20px/right: 0etc.
Any pointers would be hugely appreciated! ![]()
Thanks!