fix(shell): hide notification/share/settings icons on mobile, add to identity dropdown

On mobile (<=640px), the header right section was too crowded with icons.
Now hides notification bell, share panel, and settings gear buttons, and
adds equivalent mobile-only items in the identity dropdown menu. Share
uses native navigator.share() when available.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-03-16 20:58:52 -07:00
parent 9b81ba70b6
commit 315a29a6d7
4 changed files with 52 additions and 0 deletions

View File

@ -382,6 +382,10 @@ export class RStackIdentity extends HTMLElement {
<button class="dropdown-item" data-action="my-account">👤 My Account</button> <button class="dropdown-item" data-action="my-account">👤 My Account</button>
<button class="dropdown-item" data-action="my-spaces">🌐 My Spaces</button> <button class="dropdown-item" data-action="my-spaces">🌐 My Spaces</button>
<button class="dropdown-item" data-action="my-wallets">💰 My Wallets</button> <button class="dropdown-item" data-action="my-wallets">💰 My Wallets</button>
<div class="dropdown-divider mobile-only"></div>
<button class="dropdown-item mobile-only" data-action="notifications">🔔 Notifications</button>
<button class="dropdown-item mobile-only" data-action="share">📤 Share</button>
<button class="dropdown-item mobile-only" data-action="settings"> Space Settings</button>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<div class="dropdown-theme-row"> <div class="dropdown-theme-row">
<span class="theme-icon"></span> <span class="theme-icon"></span>
@ -431,6 +435,16 @@ export class RStackIdentity extends HTMLElement {
this.#showSpacesModal(); this.#showSpacesModal();
} else if (action === "my-wallets") { } else if (action === "my-wallets") {
this.#showWalletsModal(); this.#showWalletsModal();
} else if (action === "notifications") {
(document.querySelector("rstack-notification-bell") as any)?.toggle();
} else if (action === "share") {
if (navigator.share) {
navigator.share({ url: location.href, title: document.title }).catch(() => {});
} else {
(document.querySelector("rstack-share-panel") as any)?.toggle();
}
} else if (action === "settings") {
(document.getElementById("settings-btn") as HTMLElement)?.click();
} }
}); });
}); });
@ -1530,6 +1544,13 @@ const STYLES = `
.dropdown-divider { height: 1px; margin: 4px 0; } .dropdown-divider { height: 1px; margin: 4px 0; }
.dropdown-divider { background: var(--rs-border-subtle); } .dropdown-divider { background: var(--rs-border-subtle); }
/* Mobile-only items — hidden on desktop, shown on mobile */
.mobile-only { display: none; }
@media (max-width: 640px) {
.mobile-only { display: flex; }
.mobile-only.dropdown-divider { display: block; }
}
/* Theme toggle in dropdown */ /* Theme toggle in dropdown */
.dropdown-theme-row { .dropdown-theme-row {
display: flex; align-items: center; justify-content: center; display: flex; align-items: center; justify-content: center;

View File

@ -282,6 +282,9 @@ export class RStackNotificationBell extends HTMLElement {
} }
} }
/** Public toggle — called from identity dropdown on mobile */
toggle() { this.#togglePanel(); }
#togglePanel() { #togglePanel() {
this.#open = !this.#open; this.#open = !this.#open;
if (this.#open && this.#notifications.length === 0) { if (this.#open && this.#notifications.length === 0) {
@ -623,4 +626,16 @@ const STYLES = `
.notif-dismiss:hover { .notif-dismiss:hover {
color: var(--rs-text-primary, #e2e8f0); color: var(--rs-text-primary, #e2e8f0);
} }
@media (max-width: 640px) {
.bell-btn { display: none; }
.panel {
position: fixed;
top: 60px;
right: 8px;
left: 8px;
width: auto;
max-height: calc(100vh - 80px);
}
}
`; `;

View File

@ -31,6 +31,9 @@ export class RStackSharePanel extends HTMLElement {
return document.body?.dataset?.spaceSlug || ""; return document.body?.dataset?.spaceSlug || "";
} }
/** Public toggle — called from identity dropdown on mobile */
toggle() { this.#togglePanel(); }
#togglePanel() { #togglePanel() {
this.#open = !this.#open; this.#open = !this.#open;
this.#render(); this.#render();
@ -359,4 +362,15 @@ label {
.btn-blue:hover { .btn-blue:hover {
background: #2563eb; background: #2563eb;
} }
@media (max-width: 640px) {
.share-btn { display: none; }
.panel {
position: fixed;
top: 60px;
right: 8px;
left: 8px;
width: auto;
}
}
`; `;

View File

@ -413,6 +413,8 @@ body.rstack-sidebar-open #toolbar {
flex-wrap: wrap; flex-wrap: wrap;
gap: 6px; gap: 6px;
} }
/* Hide settings gear on mobile — accessible via identity dropdown */
.rstack-header__settings-btn { display: none; }
/* Sidebar overlays on mobile — no push offsets */ /* Sidebar overlays on mobile — no push offsets */
body.rstack-sidebar-open .rstack-tab-row { left: 0; } body.rstack-sidebar-open .rstack-tab-row { left: 0; }
body.rstack-sidebar-open #app { margin-left: 0; } body.rstack-sidebar-open #app { margin-left: 0; }