From 98d8571d37bc828d9d264fc96b330b663cbbd8e6 Mon Sep 17 00:00:00 2001 From: Lovly Date: Wed, 27 May 2026 15:47:11 +0200 Subject: [PATCH 1/4] Make portal UI responsive for small viewports Add responsive styles and small-viewport behavior across the portal UI. Key changes: - app.scss: responsive paddings, loading margins, header layout and small-viewport positioning. - global.scss: add $BREAKPOINT_* variables, prevent iOS zoom on inputs, hide horizontal overflow. - Sidebar: overlay behavior below 1024px, backdrop element, mobile full-width sidebar and z-index (SCSS + Sidebar.tsx portal markup). - Table: enable horizontal scrolling on narrow screens and set CSS var --table-min-width computed in Table.tsx (adds fallback column width calculation). - MetricsBreakdown: constrain label widths on mobile. - Scenes (CreateDestination, Destination, DestinationSettings, Attempts, DestinationsList): multiple layout, wrapping, grid and spacing adjustments for tablet/mobile viewports; improved wrapping for long values and tooltips. These changes improve usability on tablet/phone widths and add safeguards for mobile browsers. --- internal/portal/src/app.scss | 24 +++++++++ .../common/MetricsChart/MetricsBreakdown.scss | 5 ++ .../portal/src/common/Sidebar/Sidebar.scss | 25 ++++++++++ .../portal/src/common/Sidebar/Sidebar.tsx | 15 +++--- internal/portal/src/common/Table/Table.scss | 17 +++++++ internal/portal/src/common/Table/Table.tsx | 15 +++++- internal/portal/src/global.scss | 16 ++++++ .../CreateDestination/CreateDestination.scss | 17 +++++++ .../src/scenes/Destination/Destination.scss | 50 +++++++++++++++++++ .../DestinationSettings.scss | 6 +++ .../scenes/Destination/Events/Attempts.scss | 22 ++++++++ .../DestinationsList/DestinationList.scss | 13 +++++ 12 files changed, 218 insertions(+), 7 deletions(-) diff --git a/internal/portal/src/app.scss b/internal/portal/src/app.scss index 068150dd1..2e6db8fb0 100644 --- a/internal/portal/src/app.scss +++ b/internal/portal/src/app.scss @@ -8,6 +8,16 @@ padding-left: calc(var(--base-grid-multiplier) * 24); padding-right: calc(var(--base-grid-multiplier) * 24); + @media (max-width: 1024px) { + padding-left: var(--spacing-6); + padding-right: var(--spacing-6); + } + + @media (max-width: 640px) { + padding-left: var(--spacing-4); + padding-right: var(--spacing-4); + } + &__loading { display: flex; justify-content: center; @@ -23,6 +33,11 @@ margin-top: calc(var(--base-grid-multiplier) * 20); margin-bottom: calc(var(--base-grid-multiplier) * 12); + @media (max-width: 640px) { + margin-top: var(--spacing-6); + margin-bottom: var(--spacing-6); + } + a { color: var(--colors-foreground-neutral-3); text-decoration: none; @@ -46,6 +61,9 @@ display: flex; gap: var(--spacing-2); color: var(--colors-foreground-neutral-3); + flex-wrap: wrap; + align-items: center; + width: 100%; span, a { @@ -66,6 +84,12 @@ left: var(--spacing-4); color: var(--colors-foreground-neutral-2); + @media (max-width: 640px) { + position: static; + text-align: center; + padding: var(--spacing-4); + } + a { color: var(--colors-foreground-neutral-2); text-decoration: none; diff --git a/internal/portal/src/common/MetricsChart/MetricsBreakdown.scss b/internal/portal/src/common/MetricsChart/MetricsBreakdown.scss index 48e5489ce..7461098ed 100644 --- a/internal/portal/src/common/MetricsChart/MetricsBreakdown.scss +++ b/internal/portal/src/common/MetricsChart/MetricsBreakdown.scss @@ -46,6 +46,11 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + + @media (max-width: 640px) { + min-width: 72px; + max-width: 72px; + } } &__bar-container { diff --git a/internal/portal/src/common/Sidebar/Sidebar.scss b/internal/portal/src/common/Sidebar/Sidebar.scss index df3beef8d..219c31470 100644 --- a/internal/portal/src/common/Sidebar/Sidebar.scss +++ b/internal/portal/src/common/Sidebar/Sidebar.scss @@ -1,5 +1,22 @@ .sidebar-open #root { margin-right: 408px; + + // Below 1024px the sidebar overlays content instead of pushing it. + @media (max-width: 1024px) { + margin-right: 0; + } +} + +#sidebar-backdrop { + display: none; + + @media (max-width: 1024px) { + display: block; + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.32); + z-index: 9; + } } #sidebar { @@ -12,6 +29,14 @@ border-left: 1px solid var(--colors-outline-neutral); overflow-y: auto; box-sizing: border-box; + background: var(--colors-background); + z-index: 10; + + @media (max-width: 640px) { + width: 100vw; + max-width: 100vw; + padding: var(--spacing-4); + } .close-button { margin-left: calc(var(--spacing-2) * -1); diff --git a/internal/portal/src/common/Sidebar/Sidebar.tsx b/internal/portal/src/common/Sidebar/Sidebar.tsx index c97e5c168..62a31b1c7 100644 --- a/internal/portal/src/common/Sidebar/Sidebar.tsx +++ b/internal/portal/src/common/Sidebar/Sidebar.tsx @@ -78,12 +78,15 @@ const SidebarPortal = ({ } return createPortal( - , + <> +