import type {RouteComponentProps} from 'react-router'; import styled from '@emotion/styled'; import {space} from 'sentry/styles/space'; import EmptyStory from 'sentry/views/stories/emptyStory'; import ErrorStory from 'sentry/views/stories/errorStory'; import storiesContext from 'sentry/views/stories/storiesContext'; import StoryFile from 'sentry/views/stories/storyFile'; import StoryHeader from 'sentry/views/stories/storyHeader'; import StoryTree from 'sentry/views/stories/storyTree'; import type {StoriesQuery} from 'sentry/views/stories/types'; import useStoriesLoader from 'sentry/views/stories/useStoriesLoader'; type Props = RouteComponentProps<{}, {}, any, StoriesQuery>; export default function Stories({location}: Props) { const story = useStoriesLoader({filename: location.query.name}); return ( <Layout> <StoryHeader style={{gridArea: 'head'}} /> <aside style={{gridArea: 'aside'}}> <StoryTree files={storiesContext().files()} /> </aside> {story.error ? ( <VerticalScroll style={{gridArea: 'body'}}> <ErrorStory error={story.error} /> </VerticalScroll> ) : story.resolved ? ( <Main style={{gridArea: 'body'}}> <StoryFile filename={story.filename} resolved={story.resolved} /> </Main> ) : ( <VerticalScroll style={{gridArea: 'body'}}> <EmptyStory /> </VerticalScroll> )} </Layout> ); } const Layout = styled('div')` --stories-grid-space: ${space(2)}; display: grid; grid-template: 'head head' max-content 'aside body' auto/ ${p => p.theme.settings.sidebarWidth} 1fr; gap: var(--stories-grid-space); place-items: stretch; height: 100vh; padding: var(--stories-grid-space); `; const VerticalScroll = styled('main')` overflow-x: hidden; overflow-y: scroll; `; /** * Avoid <Panel> here because nested panels will have a modified theme. * Therefore stories will look different in prod. */ const Main = styled(VerticalScroll)` background: ${p => p.theme.background}; border-radius: ${p => p.theme.panelBorderRadius}; border: 1px solid ${p => p.theme.border}; padding: var(--stories-grid-space); overflow-x: hidden; overflow-y: scroll; position: relative; `;