diff --git a/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-floating-header/error-overlay-floating-header.stories.tsx b/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-floating-header/error-overlay-floating-header.stories.tsx new file mode 100644 index 00000000000000..4ace959d322e74 --- /dev/null +++ b/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-floating-header/error-overlay-floating-header.stories.tsx @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { ErrorOverlayFloatingHeader } from './error-overlay-floating-header' +import { withShadowPortal } from '../../../storybook/with-shadow-portal' + +const meta: Meta = { + title: 'ErrorOverlayFloatingHeader', + component: ErrorOverlayFloatingHeader, + parameters: { + layout: 'fullscreen', + }, + decorators: [withShadowPortal], +} + +export default meta +type Story = StoryObj + +export const Default: Story = { + args: { + readyErrors: [ + { + id: 0, + runtime: true, + error: new Error('First error message'), + frames: [], + }, + { + id: 1, + runtime: true, + error: new Error('Second error message'), + frames: [], + }, + { + id: 2, + runtime: true, + error: new Error('Third error message'), + frames: [], + }, + ], + activeIdx: 1, + versionInfo: { + installed: '15.0.0', + staleness: 'stale-major', + }, + }, +} diff --git a/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-floating-header/error-overlay-floating-header.tsx b/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-floating-header/error-overlay-floating-header.tsx new file mode 100644 index 00000000000000..5719427d9ce21f --- /dev/null +++ b/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-floating-header/error-overlay-floating-header.tsx @@ -0,0 +1,55 @@ +import type { ReadyRuntimeError } from '../../../helpers/get-error-by-type' +import type { VersionInfo } from '../../../../../../../../server/dev/parse-version-info' + +import { ErrorPagination } from '../ErrorPagination/ErrorPagination' +import { VersionStalenessInfo } from '../../VersionStalenessInfo' +import { noop as css } from '../../../helpers/noop-template' + +type ErrorOverlayFloatingHeaderProps = { + readyErrors?: ReadyRuntimeError[] + activeIdx?: number + setActiveIndex?: (index: number) => void + versionInfo?: VersionInfo +} + +export function ErrorOverlayFloatingHeader({ + readyErrors, + activeIdx, + setActiveIndex, + versionInfo, +}: ErrorOverlayFloatingHeaderProps) { + return ( +
+ {/* TODO: better passing data instead of nullish coalescing */} + {})} + /> + +
+ ) +} + +export const styles = css` + .error-overlay-floating-header { + display: flex; + width: 100%; + margin-right: auto; + margin-left: auto; + margin-bottom: var(--size-2); + outline: none; + + @media (min-width: 576px) { + max-width: 540px; + } + + @media (min-width: 768px) { + max-width: 720px; + } + + @media (min-width: 992px) { + max-width: 960px; + } + } +` diff --git a/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-layout/error-overlay-layout.tsx b/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-layout/error-overlay-layout.tsx index 74e873b0264b75..802153c34bb227 100644 --- a/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-layout/error-overlay-layout.tsx +++ b/packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/Errors/error-overlay-layout/error-overlay-layout.tsx @@ -12,12 +12,10 @@ import { DialogFooter, } from '../../Dialog' import { Overlay } from '../../Overlay' -import { ErrorPagination } from '../ErrorPagination/ErrorPagination' import { ErrorOverlayToolbar, styles as toolbarStyles, } from '../error-overlay-toolbar/error-overlay-toolbar' -import { VersionStalenessInfo } from '../../VersionStalenessInfo' import { ErrorOverlayBottomStacks } from '../error-overlay-bottom-stacks/error-overlay-bottom-stacks' import { ErrorOverlayFooter } from '../error-overlay-footer/error-overlay-footer' import { noop as css } from '../../../helpers/noop-template' @@ -29,6 +27,10 @@ import { ErrorTypeLabel, styles as errorTypeLabelStyles, } from '../error-type-label/error-type-label' +import { + ErrorOverlayFloatingHeader, + styles as floatingHeaderStyles, +} from '../error-overlay-floating-header/error-overlay-floating-header' type ErrorOverlayLayoutProps = { errorMessage: ErrorMessageType @@ -64,6 +66,12 @@ export function ErrorOverlayLayout({ }: ErrorOverlayLayoutProps) { return ( + - {/* TODO: better passing data instead of nullish coalescing */} - {})} - />
-
@@ -110,6 +111,7 @@ export function ErrorOverlayLayout({ } export const styles = css` + ${floatingHeaderStyles} ${errorTypeLabelStyles} ${errorMessageStyles} ${toolbarStyles}