From 873e898fb409326132219fde6e5d453c0c2bcbff Mon Sep 17 00:00:00 2001 From: Benjamin Leonard Date: Mon, 3 Mar 2025 19:21:32 +0000 Subject: [PATCH] Adjust metrics side tabs spacing (#2724) * Adjust metrics side tabs spacing * Inline more classes * Remove need for on tab and container * Remove need for div wrapper on tab and container * Update RouteTabs.tsx * Sneak in tighter properties table spacing * `38px` properties table row height --- app/components/RouteTabs.tsx | 28 ++++---- app/components/oxql-metrics/OxqlMetric.tsx | 4 +- app/pages/project/instances/InstancePage.tsx | 2 +- app/pages/project/instances/MetricsTab.tsx | 14 ++-- app/pages/project/vpcs/RouterPage.tsx | 2 +- app/pages/project/vpcs/VpcPage.tsx | 2 +- app/pages/settings/ProfilePage.tsx | 2 +- app/pages/system/inventory/sled/SledPage.tsx | 2 +- app/pages/system/silos/SiloPage.tsx | 2 +- app/ui/lib/PropertiesTable.tsx | 2 +- app/ui/styles/components/Tabs.css | 75 +++++++++++--------- 11 files changed, 69 insertions(+), 66 deletions(-) diff --git a/app/components/RouteTabs.tsx b/app/components/RouteTabs.tsx index ae82a9ba0..6210a4cc5 100644 --- a/app/components/RouteTabs.tsx +++ b/app/components/RouteTabs.tsx @@ -50,23 +50,27 @@ export function RouteTabs({ sideTabs = false, tabListClassName, }: RouteTabsProps) { - const wrapperClasses = sideTabs - ? 'ox-side-tabs flex' - : cn('ox-tabs', { 'full-width': fullWidth }) - const tabListClasses = sideTabs ? 'ox-side-tabs-list' : 'ox-tabs-list' - const panelClasses = cn('ox-tabs-panel @container', { 'ml-5 flex-grow': sideTabs }) + /* TODO: Add aria-describedby for active tab */ return ( -
+
{/* eslint-disable-next-line jsx-a11y/interactive-supports-focus */}
{children}
- {/* TODO: Add aria-describedby for active tab */} -
+ +
@@ -76,16 +80,14 @@ export function RouteTabs({ export interface TabProps { to: string children: ReactNode - sideTab?: boolean } -export const Tab = ({ to, children, sideTab = false }: TabProps) => { +export const Tab = ({ to, children }: TabProps) => { const isActive = useIsActivePath({ to }) - const baseClass = sideTab ? 'ox-side-tab' : 'ox-tab' return ( diff --git a/app/components/oxql-metrics/OxqlMetric.tsx b/app/components/oxql-metrics/OxqlMetric.tsx index f3187856c..00be89d4b 100644 --- a/app/components/oxql-metrics/OxqlMetric.tsx +++ b/app/components/oxql-metrics/OxqlMetric.tsx @@ -134,8 +134,8 @@ export function OxqlMetric({ title, description, unit, ...queryObj }: OxqlMetric export const MetricHeader = ({ children }: { children: ReactNode }) => { // If header has only one child, align it to the end of the container const justify = Children.count(children) === 1 ? 'justify-end' : 'justify-between' - return
{children}
+ return
{children}
} -export const MetricCollection = classed.div`mt-4 flex flex-col gap-4` +export const MetricCollection = classed.div`mt-3 flex flex-col gap-4` export const MetricRow = classed.div`flex w-full flex-col gap-4 @[48rem]:flex-row` diff --git a/app/pages/project/instances/InstancePage.tsx b/app/pages/project/instances/InstancePage.tsx index 64998cf84..6e003f687 100644 --- a/app/pages/project/instances/InstancePage.tsx +++ b/app/pages/project/instances/InstancePage.tsx @@ -218,7 +218,7 @@ export default function InstancePage() {
- + {instance.ncpus} {pluralize(' vCPU', instance.ncpus)} diff --git a/app/pages/project/instances/MetricsTab.tsx b/app/pages/project/instances/MetricsTab.tsx index fb8537f09..6e87e9e1c 100644 --- a/app/pages/project/instances/MetricsTab.tsx +++ b/app/pages/project/instances/MetricsTab.tsx @@ -57,16 +57,10 @@ export default function MetricsTab() { // Find the relevant in RouteTabs return ( - - - CPU - - - Disk - - - Network - + + CPU + Disk + Network ) diff --git a/app/pages/project/vpcs/RouterPage.tsx b/app/pages/project/vpcs/RouterPage.tsx index 5abec76c8..c989ec22a 100644 --- a/app/pages/project/vpcs/RouterPage.tsx +++ b/app/pages/project/vpcs/RouterPage.tsx @@ -200,7 +200,7 @@ export default function RouterPage() {
- + {routerData.kind} diff --git a/app/pages/project/vpcs/VpcPage.tsx b/app/pages/project/vpcs/VpcPage.tsx index 9b4d00897..45ff0d4e4 100644 --- a/app/pages/project/vpcs/VpcPage.tsx +++ b/app/pages/project/vpcs/VpcPage.tsx @@ -75,7 +75,7 @@ export default function VpcPage() { - + {vpc.dnsName} diff --git a/app/pages/settings/ProfilePage.tsx b/app/pages/settings/ProfilePage.tsx index 4e85e5feb..cf07e080e 100644 --- a/app/pages/settings/ProfilePage.tsx +++ b/app/pages/settings/ProfilePage.tsx @@ -43,7 +43,7 @@ export default function ProfilePage() { }>Profile - + {me.displayName} {me.id} diff --git a/app/pages/system/inventory/sled/SledPage.tsx b/app/pages/system/inventory/sled/SledPage.tsx index 5994b5c43..fd90de5f1 100644 --- a/app/pages/system/inventory/sled/SledPage.tsx +++ b/app/pages/system/inventory/sled/SledPage.tsx @@ -43,7 +43,7 @@ export default function SledPage() { }>Sled - + {sled.id} diff --git a/app/pages/system/silos/SiloPage.tsx b/app/pages/system/silos/SiloPage.tsx index 9683b3652..50ac9653a 100644 --- a/app/pages/system/silos/SiloPage.tsx +++ b/app/pages/system/silos/SiloPage.tsx @@ -66,7 +66,7 @@ export default function SiloPage() { /> - + diff --git a/app/ui/lib/PropertiesTable.tsx b/app/ui/lib/PropertiesTable.tsx index 68915fc70..9162cb4ea 100644 --- a/app/ui/lib/PropertiesTable.tsx +++ b/app/ui/lib/PropertiesTable.tsx @@ -62,7 +62,7 @@ PropertiesTable.Row = ({ label, children }: PropertiesTableRowProps) => ( {label} -
+
{children}
diff --git a/app/ui/styles/components/Tabs.css b/app/ui/styles/components/Tabs.css index aeecb8982..329639177 100644 --- a/app/ui/styles/components/Tabs.css +++ b/app/ui/styles/components/Tabs.css @@ -6,83 +6,90 @@ * Copyright Oxide Computer Company */ -.ox-tabs.full-width { - @apply !mx-0 !w-full; -} - -.ox-tabs.full-width .ox-tabs-panel { - @apply mx-[var(--content-gutter)]; -} - -.ox-tabs.full-width .ox-side-tabs .ox-tabs-panel { - @apply mx-0 ml-4; -} - +/* Tab list container styles */ .ox-tabs-list { - @apply mb-8 flex bg-transparent; + @apply mb-10 flex bg-transparent; } .ox-tabs-list:after { @apply block w-full border-b border-secondary; - content: ' '; -} -.ox-tabs.full-width .ox-tabs-list:before { - @apply block w-10 min-w-max flex-shrink-0 border-b border-secondary; - content: ' '; + content: ''; } +/* Panel styles */ .ox-tabs-panel:focus-visible { @apply outline outline-2 outline-offset-[1rem] outline-accent-secondary; } +/* Base tab styles */ .ox-tab { @apply h-10 space-x-2 whitespace-nowrap border-b px-1.5 pb-1 pt-2 uppercase !no-underline text-mono-sm text-secondary border-secondary; } -.ox-tab[data-state='active'], -.ox-tab.is-selected { - @apply text-accent border-accent; -} - -.ox-tab > * { +.ox-tabs-list .ox-tab > * { @apply rounded bg-transparent px-1.5 py-1; } -.ox-tab:hover > * { + +/* Hover states */ +.ox-tabs-list .ox-tab:hover > * { @apply bg-hover; } -.ox-tab[data-state='active']:hover > *, +/* Active states */ +.ox-tab.is-selected { + @apply text-accent border-accent; +} + .ox-tab.is-selected:hover > * { @apply !bg-accent-secondary; } +/* Badge styles */ .ox-tab > .ox-badge { @apply -mt-1 select-none text-current; } -.ox-tab[data-state='inactive'] > .ox-badge, .ox-tab:not(.is-selected) > .ox-badge { @apply bg-disabled; } -.ox-tab[data-state='active'] > .ox-badge, .ox-tab.is-selected > .ox-badge { @apply bg-accent-secondary; } +/* Full width variants */ +.ox-tabs.full-width { + @apply !mx-0 !w-full; +} + +.ox-tabs.full-width > .ox-tabs-panel { + @apply mx-[var(--content-gutter)]; +} + +.ox-tabs.full-width .ox-tabs-list:before { + @apply block w-10 min-w-max flex-shrink-0 border-b border-secondary; + content: ''; +} + +/* Side tabs styles */ .ox-side-tabs-list { - @apply flex w-[180px] flex-shrink-0 flex-col gap-1; + @apply sticky top-10 flex w-[180px] flex-shrink-0 flex-col gap-0.5 self-start; } -.ox-side-tab { - @apply space-x-2 whitespace-nowrap rounded p-2 py-1.5 !no-underline text-sans-md text-secondary; +.ox-side-tabs-list .ox-tab { + @apply h-auto whitespace-nowrap rounded p-2 py-1.5 normal-case !no-underline text-sans-md text-secondary; + border-bottom: none; } -.ox-side-tab[data-state='active'], -.ox-side-tab.is-selected { +.ox-side-tabs .ox-tab.is-selected { @apply text-accent bg-accent-secondary; + border: none; +} + +.ox-side-tabs .ox-tabs-panel { + @apply mx-0 ml-4; } -.ox-side-tab:not([data-state='active'], .is-selected):hover { +.ox-side-tabs-list .ox-tab:not(.is-selected):hover { @apply text-default bg-hover; }