Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 57 additions & 10 deletions src/components/Layout/layout-content.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,17 @@ export const Content: Story = {
flushAllOnSmall: false,
},
render: (properties) => (
<Layout.Main>
<Layout.Main layout='2-1'>
<Layout.Wrapper>
<Layout.Content {...properties}>
<h1>Layout.Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate
architecto voluptatem nostrum recusandae, eaque consectetur iure,
veritatis eos, mollitia possimus error earum?
</p>
</Layout.Content>
<Layout.Sidebar>
<div>
<h2>Layout.Sidebar</h2>
Expand All @@ -62,17 +71,55 @@ export const Content: Story = {
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul><h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Layout.Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div>
</Layout.Sidebar>
<Layout.Content {...properties}>
<h1>Layout.Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate
architecto voluptatem nostrum recusandae, eaque consectetur iure,
veritatis eos, mollitia possimus error earum?
</p>
</Layout.Content>
</Layout.Wrapper>
</Layout.Main>
),
Expand Down
133 changes: 83 additions & 50 deletions src/components/Layout/layout-main.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { Meta, StoryObj } from '@storybook/react-vite';
import type { ReactElement } from 'react';
import { Layout } from '~/src/index';
import type { LayoutMainProperties } from './layout-main';

const meta: Meta<typeof Layout.Main> = {
title: 'Components (Draft)/Layout/Main',
Expand Down Expand Up @@ -40,6 +42,8 @@ import Layout from './Layout<br/>
&nbsp;&nbsp;&nbsp;&nbsp;< /Layout.Sidebar ><br/>
&nbsp;&nbsp;< /Layout.Wrapper ><br/>
< /Layout.Main ><br/>

**Note:** For \`layout="1-3"\` (sidebar on the left), put \`Layout.Sidebar\` **before** \`Layout.Content\` inside \`Layout.Wrapper\`. For \`layout="2-1"\`, put **main first**, then sidebar—matching the [CFPB markup](https://cfpb.github.io/design-system/development/main-content-and-sidebars).
`,
},
},
Expand All @@ -50,64 +54,93 @@ export default meta;

type Story = StoryObj<typeof meta>;

const exampleContent = (
<Layout.Content key='content'>
<h1>Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat alias
eum ut officiis optio similique explicabo cupiditate architecto
voluptatem nostrum recusandae, eaque consectetur iure, veritatis eos,
mollitia possimus error earum?
</p>
</Layout.Content>
);

const exampleSidebar = (
<Layout.Sidebar key='sidebar'>
<div>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div>
</Layout.Sidebar>
);

function renderMainLayout(
properties: LayoutMainProperties,
): ReactElement {
const layout = properties.layout ?? '2-1';
const columnChildren =
layout === '1-3'
? [exampleSidebar, exampleContent]
: [exampleContent, exampleSidebar];

return (
<Layout.Main {...properties}>
<Layout.Wrapper>{columnChildren}</Layout.Wrapper>
</Layout.Main>
);
}

export const Layout_2_1: Story = {
args: {
layout: '2-1',
},
render: (properties) => (
<Layout.Main {...properties}>
<Layout.Wrapper>
<Layout.Content>
<h1>Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate
architecto voluptatem nostrum recusandae, eaque consectetur iure,
veritatis eos, mollitia possimus error earum?
</p>
</Layout.Content>
<Layout.Sidebar>
<div>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div>
</Layout.Sidebar>
</Layout.Wrapper>
</Layout.Main>
),
render: (properties) => renderMainLayout(properties),
};

export const Layout_1_3: Story = {
args: {
layout: '1-3',
},
render: (properties) => (
<Layout.Main {...properties}>
<Layout.Wrapper>
<Layout.Sidebar>
<div>
<h2>Sidebar</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div>
</Layout.Sidebar>
<Layout.Content>
<h1>Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate
architecto voluptatem nostrum recusandae, eaque consectetur iure,
veritatis eos, mollitia possimus error earum?
</p>
</Layout.Content>
</Layout.Wrapper>
</Layout.Main>
),
render: (properties) => renderMainLayout(properties),
};
20 changes: 10 additions & 10 deletions src/components/Layout/layout-sidebar.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,17 @@ export const Sidebar: Story = {
flushAllOnSmall: false,
},
render: (properties) => (
<Layout.Main>
<Layout.Main layout='2-1'>
<Layout.Wrapper>
<Layout.Content>
<h1>Layout.Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate
architecto voluptatem nostrum recusandae, eaque consectetur iure,
veritatis eos, mollitia possimus error earum?
</p>
</Layout.Content>
<Layout.Sidebar {...properties}>
<div>
<h2>Layout.Sidebar</h2>
Expand All @@ -65,15 +74,6 @@ export const Sidebar: Story = {
</ul>
</div>
</Layout.Sidebar>
<Layout.Content>
<h1>Layout.Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate
architecto voluptatem nostrum recusandae, eaque consectetur iure,
veritatis eos, mollitia possimus error earum?
</p>
</Layout.Content>
</Layout.Wrapper>
</Layout.Main>
),
Expand Down
19 changes: 10 additions & 9 deletions src/components/Layout/layout-wrapper.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,17 @@ type Story = StoryObj<typeof meta>;

export const Wrapper: Story = {
args: {
// Order matches default Layout.Main layout "2-1" (main first, then sidebar).
children: [
<Layout.Content key='content'>
<h1>Layout.Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate architecto
voluptatem nostrum recusandae, eaque consectetur iure, veritatis eos,
mollitia possimus error earum?
</p>
</Layout.Content>,
<Layout.Sidebar key='sidebar'>
<div>
<h2>Layout.Sidebar</h2>
Expand All @@ -53,15 +63,6 @@ export const Wrapper: Story = {
</ul>
</div>
</Layout.Sidebar>,
<Layout.Content key='content'>
<h1>Layout.Content</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quaerat
alias eum ut officiis optio similique explicabo cupiditate architecto
voluptatem nostrum recusandae, eaque consectetur iure, veritatis eos,
mollitia possimus error earum?
</p>
</Layout.Content>,
],
},
render: ({ children }) => (
Expand Down
57 changes: 57 additions & 0 deletions src/components/Layout/layout.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,60 @@
margin-right: 0 !important;
}
}

// At the two-column breakpoint, use flex so main and sidebar share the row height of the
// taller column. The vertical divider is drawn from `.content__main::after` with `bottom: 0`,
// so it only reaches the bottom of `.content__main`; stretching that box matches the divider
// to the full sidebar/main height (CFPB DS uses inline-block, which does not equalize height).
@media only screen and (width >= 56.3125em) {
.content--1-3 .wrapper,
.content--2-1 .wrapper {
align-items: stretch;
display: flex;
}

.content--1-3 .wrapper > .content__main,
.content--1-3 .wrapper > .content__sidebar,
.content--2-1 .wrapper > .content__main,
.content--2-1 .wrapper > .content__sidebar {
display: block;
margin-right: 0 !important;
}

.content--1-3 .wrapper > .content__sidebar {
flex: 0 0 25%;
max-width: 25%;
}

.content--1-3 .wrapper > .content__main {
flex: 0 0 75%;
max-width: 75%;
}

.content--2-1 .wrapper > .content__main {
flex: 0 0 66.6667%;
max-width: 66.6667%;
}

.content--2-1 .wrapper > .content__sidebar {
flex: 0 0 33.3333%;
max-width: 33.3333%;
}

// CFPB DS 5.3.2 defines the column divider via `.content__main::after` for `content--1-3`
// but only emits `right: -1.875em` for `content--2-1` (no `content`, border, or positioning).
// Mirror the 1-3 rule so the vertical rule appears between main and a right-hand sidebar.
.content--2-1 .content__main {
position: relative;
}

.content--2-1 .content__main::after {
border-right: 1px solid var(--content-main-border);
bottom: 0;
content: '';
position: absolute;
right: -1.875em;
top: 2.8125em;
width: 0;
}
}
Loading
Loading