Fix sub-app permissions bug, add Comments app, support Site Editor

- Root-cause fix for "Sorry, you are not allowed to access this page" on
  Menu Creator/Activity Log/Role Editor: remove_submenu_page() was
  corrupting WP core's user_can_access_admin_page() capability lookup.
  Sub-apps now stay registered in $submenu; MenuSerializer filters them
  out of the sidebar instead.
- Add a 6th sub-app, Comments, with a redirect from native edit-comments.php.
- Extend the window-chrome/taskbar framing to the Site Editor
  (site-editor.php), including a fix for a CSS position:fixed
  over-constraint bug that let its frame run past the viewport.
- Rewrite the taskbar from a single sessionStorage slot to a list so
  multiple minimized windows are each independently restorable.
- Extend native-dark.css coverage to the block editor's own chrome.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
nixpanel
2026-07-03 18:48:25 -05:00
co-authored by Claude Sonnet 5
parent b0b0a9999a
commit 8153d4397c
16 changed files with 1510 additions and 194 deletions
+158 -23
View File
@@ -17,6 +17,10 @@
/* SiteShell.vue's taskbar, shown only while a window is minimized
(html.aurora-has-taskbar toggles the bottom space reserved for it). */
--aurora-taskbar-h: 56px;
/* Height of the strip reserved at the top of the block editor's frame
for .aurora-winbar--editor's traffic-light dots (a sibling element,
not a child of the skeleton — see windowChrome.js). */
--aurora-editor-winbar-h: 44px;
/* Space between the sidebar card and the browser's left/top/bottom
edges (Sidebar.vue) — the toolbar and #wpcontent offsets below add
the same amount so nothing overlaps the floating sidebar. */
@@ -83,7 +87,14 @@ html.aurora-dark {
html.aurora-ready,
html.aurora-ready body {
background: var(--aurora-app-bg);
/* !important: WP core ships `body.js.block-editor-page { background:
#fff }` on the block editor, which has higher specificity (two
classes) than this selector (one) despite this having more type
selectors — CSS specificity compares class count before type count.
Without !important that rule wins and paints body solid white,
hiding the gradient completely on that page (everywhere else this
conflict doesn't exist, so it was never needed until now). */
background: var(--aurora-app-bg) !important;
/* Fixed so the gradient stays pinned to the viewport instead of
scrolling with document height — the sidebar/toolbar are also
position:fixed and paint no background of their own (see
@@ -108,22 +119,72 @@ html.aurora-ready #wpcontent {
}
/* The block editor (Gutenberg) doesn't live inside #wpcontent's normal
box model — it renders its own skeleton as position:fixed, inset:0,
completely independent of the margin-left above. Left unchecked it
spans the full viewport and renders underneath the (higher z-index)
sidebar and toolbar. Inset it the same amount #wpcontent gets. */
html.aurora-ready .interface-interface-skeleton {
left: calc(var(--aurora-sidebar-w) + var(--aurora-sidebar-gap) * 2) !important;
top: var(--aurora-toolbar-h) !important;
transition: left 0.2s ease;
}
box model — it renders its own fixed, full-viewport root, completely
independent of the margin-left above. Left unchecked it spans the full
viewport and renders underneath the (higher z-index) sidebar and
toolbar. Framed the same way #wpbody-content is everywhere else — same
insets, same card background/border/radius — just expressed as
fixed-position offsets instead of margin, since this element can't
participate in normal document flow.
/* Aurora's own toolbar is skipped on the block editor (SiteShell.vue) —
its own toolbar sits flush against the top instead, so no toolbar
height needs to be reserved here; just the same top gap the sidebar
gets, so the two line up. */
html.aurora-ready.aurora-no-toolbar .interface-interface-skeleton {
top: var(--aurora-sidebar-gap) !important;
Two different pages, two different fixed roots, both matched here:
- post.php/post-new.php: .interface-interface-skeleton itself is
position:fixed, inset:0.
- site-editor.php: .interface-interface-skeleton is only
position:relative, nested inside #site-editor, which is the actual
position:fixed, inset:0 element there — the rule below with
"#site-editor .interface-interface-skeleton" resets the nested one
back to a plain unpositioned child so the two frames don't stack. */
html.aurora-ready .interface-interface-skeleton,
html.aurora-ready #site-editor {
top: calc(var(--aurora-toolbar-h) + 16px) !important;
left: calc(var(--aurora-sidebar-w) + var(--aurora-sidebar-gap) * 2 + 24px) !important;
right: var(--aurora-gutter-r) !important;
bottom: 24px !important;
/* WP core's own .edit-site class (also present on #site-editor) sets
height: 100vh. A position:fixed box with top, height, AND bottom all
specified is over-constrained — per spec, 'bottom' is then silently
recomputed from top+height instead of honoring the value here, which
is exactly why the frame ran past the bottom of the viewport instead
of stopping at the inset above. Forcing height back to auto lets
top+bottom actually determine the box's size again. */
height: auto !important;
background: var(--aurora-frame-bg);
/* No border — an asymmetric one (3 sides, one "none") combined with
border-radius and this element's sub-pixel calc()-derived fixed
position produced a visible double-edge rendering artifact right at
the rounded corners. The background/gradient contrast alone is
enough to read as a distinct surface without it. */
border-radius: var(--aurora-radius-lg);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
transition: left 0.2s ease;
/* Reserves a strip at the top for .aurora-winbar--editor's dots (a
sibling, not a child — see windowChrome.js) so they sit in their own
clear space instead of overlapping the editor's own logo/toolbar row.
border-box so the padding comes out of the top/left/right/bottom
inset box already defined above, rather than adding to it. */
padding-top: var(--aurora-editor-winbar-h);
box-sizing: border-box;
/* border-radius alone doesn't clip children — Gutenberg's own white
canvas background ran straight past the rounded bottom corners as a
hard square edge without this. Floating UI (block toolbars, popovers)
portals to document.body rather than nesting here, so this doesn't
clip anything that needs to escape the frame. */
overflow: hidden;
}
#site-editor .interface-interface-skeleton {
position: relative !important;
top: auto !important;
left: auto !important;
right: auto !important;
bottom: auto !important;
background: transparent !important;
border-radius: 0 !important;
box-shadow: none !important;
padding-top: 0 !important;
overflow: visible !important;
width: 100%;
height: 100%;
}
html.aurora-ready #wpbody-content {
@@ -144,14 +205,60 @@ html.aurora-ready #wpbody-content {
width: auto;
}
/* SiteShell.vue's taskbar docks along the bottom edge only while a window
is minimized — push content up by its height so pages stop above it
instead of rendering underneath. */
html.aurora-has-taskbar #wpbody-content {
margin-bottom: calc(24px + var(--aurora-taskbar-h));
/* Gutenberg renders in its own fixed skeleton. The regular #wpbody-content
wrapper still exists on post-new.php/post.php, but it is inert; if framed
like normal native pages, it appears as a stray empty pill above the editor. */
html.aurora-ready body.block-editor-page #wpbody-content,
html.aurora-ready body.post-new-php #wpbody-content,
html.aurora-ready body.post-php #wpbody-content {
background: transparent !important;
border: 0 !important;
border-radius: 0 !important;
box-shadow: none !important;
margin: 0 !important;
min-height: 0 !important;
padding: 0 !important;
}
html.aurora-ready body.block-editor-page #wpbody-content > .aurora-winbar,
html.aurora-ready body.post-new-php #wpbody-content > .aurora-winbar,
html.aurora-ready body.post-php #wpbody-content > .aurora-winbar {
display: none !important;
}
/* SiteShell.vue's taskbar floats along the bottom edge (inset by
--aurora-sidebar-gap, same as the sidebar) only while a window is
minimized. A plain margin-bottom only guarantees a gap once the page is
scrolled all the way down — content taller than the viewport still
renders underneath the fixed taskbar on first paint, since a fixed
element doesn't reserve space from the rest of the page's flow. Instead,
cap the content box's own height to whatever's actually left between the
toolbar and the taskbar and let *it* scroll internally — the same way
the toolbar's reserved space at the top never lets content start behind
it, not just "eventually scroll clear of it". */
html.aurora-has-taskbar #wpbody-content,
html.aurora-has-taskbar .aurora-dashboard-frame {
margin-bottom: calc(24px + var(--aurora-taskbar-h));
/* #wpbody-content's base rule sets min-height: calc(100vh - toolbar-h -
40px) for the normal (no-taskbar) case — per spec, when min-height is
larger than max-height, min-height always wins and max-height is
silently ignored. Without this override the box kept sizing to that
taller min-height regardless of the taskbar, which is why the
max-height below appeared to do nothing. */
min-height: 0;
max-height: calc(
100vh - var(--aurora-toolbar-h) - 16px - 24px - var(--aurora-taskbar-h) -
var(--aurora-sidebar-gap) * 2
);
overflow-y: auto;
}
/* The block editor's skeleton is already positioned with fixed insets
(top/left/right/bottom) rather than margin, so reserving taskbar space
is just moving its bottom inset in — no max-height/overflow trick
needed there, unlike the margin-based elements above. */
html.aurora-has-taskbar .interface-interface-skeleton,
html.aurora-has-taskbar #site-editor {
bottom: calc(24px + var(--aurora-taskbar-h) + var(--aurora-sidebar-gap) * 2) !important;
}
/* macOS-style title bar (windowChrome.js). Most pages get it injected as
@@ -162,6 +269,24 @@ html.aurora-has-taskbar .aurora-dashboard-frame {
align-items: center;
gap: 8px;
}
.aurora-winbar--editor {
position: fixed;
/* Centered vertically within the skeleton's reserved top strip
(--aurora-editor-winbar-h), inset from its left edge to line up with
the padding every other title bar uses. */
top: calc(
var(--aurora-toolbar-h) + 16px + (var(--aurora-editor-winbar-h) - 12px) / 2
);
left: calc(var(--aurora-sidebar-w) + var(--aurora-sidebar-gap) * 2 + 24px + 20px);
height: 12px;
padding: 0;
background: transparent;
border: 0;
border-radius: 0;
box-shadow: none;
z-index: 100000;
transition: left 0.2s ease;
}
#wpbody-content > .aurora-winbar {
margin: -32px -32px 20px -32px;
padding: 14px 16px;
@@ -227,8 +352,18 @@ html.aurora-maximized .toolbar {
html.aurora-ready.aurora-maximized #wpcontent {
margin-left: 0 !important;
}
html.aurora-ready.aurora-maximized .interface-interface-skeleton {
html.aurora-ready.aurora-maximized .interface-interface-skeleton,
html.aurora-ready.aurora-maximized #site-editor {
top: 0 !important;
left: 0 !important;
right: 0 !important;
bottom: 0 !important;
height: auto !important;
border-radius: 0;
}
html.aurora-maximized .aurora-winbar--editor {
top: calc((var(--aurora-editor-winbar-h) - 12px) / 2);
left: 20px;
}
html.aurora-maximized .aurora-taskbar {
left: 0 !important;