fa50a45e84
CI / Build & Quality Checks (push) Failing after 5m12s
Prettier: auto-formatted 103 files to fix baseline. Prettier check in CI is now a hard gate (removed continue-on-error). Brotli: installed libnginx-mod-http-brotli-filter/static. Enabled in nginx with brotli_static on for pre-compressed assets and comp_level 6. Sentry releases: deploy script now exports VITE_APP_VERSION=<git-short-sha> before building so each Sentry release maps to an exact commit. CI also passes github.sha as VITE_APP_VERSION. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
import React, { ReactNode } from 'react';
|
|
import { Box } from 'folds';
|
|
|
|
type ClientLayoutProps = {
|
|
nav: ReactNode;
|
|
children: ReactNode;
|
|
};
|
|
export function ClientLayout({ nav, children }: ClientLayoutProps) {
|
|
return (
|
|
<>
|
|
<a
|
|
href="#main-content"
|
|
style={{
|
|
position: 'absolute',
|
|
top: '-40px',
|
|
left: 0,
|
|
padding: '8px 16px',
|
|
background: '#000',
|
|
color: '#fff',
|
|
zIndex: 9999,
|
|
borderRadius: '0 0 4px 0',
|
|
transition: 'top 0.1s',
|
|
}}
|
|
onFocus={(e) => {
|
|
(e.currentTarget as HTMLElement).style.top = '0';
|
|
}}
|
|
onBlur={(e) => {
|
|
(e.currentTarget as HTMLElement).style.top = '-40px';
|
|
}}
|
|
>
|
|
Skip to main content
|
|
</a>
|
|
<Box grow="Yes">
|
|
<Box shrink="No" as="nav" aria-label="Room navigation">
|
|
{nav}
|
|
</Box>
|
|
<Box grow="Yes" as="main" id="main-content">
|
|
{children}
|
|
</Box>
|
|
</Box>
|
|
</>
|
|
);
|
|
}
|