Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Toast component #831

Merged
merged 28 commits into from
Jul 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8797e0e
Create toast module, begin styling work
ampinsk Jun 18, 2019
bcd08ec
Add icons and organize examples
ampinsk Jun 18, 2019
8309f72
Add bright style to compare
ampinsk Jun 18, 2019
4970315
Add some more examples to compare
ampinsk Jun 18, 2019
cb88870
Add block style and more examples
ampinsk Jun 21, 2019
84f2340
Add responsiveness
ampinsk Jun 21, 2019
be2e9ed
Adjust animation
ampinsk Jun 21, 2019
7b9f83b
Tweak spacing
ampinsk Jun 21, 2019
138dce2
Decrease max width
ampinsk Jun 21, 2019
5e7b760
remove extra toast styles
emilybrick Jul 1, 2019
331a96f
changed border to inset box shadow and fixed vertical alignment
emilybrick Jul 2, 2019
fd5b2e4
Remove wrapper
simurai Jul 3, 2019
8822123
Rename Toast-octicon to Toast-icon
simurai Jul 3, 2019
2a50f41
Remove nesting of child elements
simurai Jul 3, 2019
d02a459
Switch to a button
simurai Jul 3, 2019
f2020fd
Change modifier class names
simurai Jul 3, 2019
e04789e
Split animation
simurai Jul 3, 2019
bb882aa
Tweak button states
simurai Jul 3, 2019
9160ce6
Fix linter
simurai Jul 3, 2019
2074596
Clean up documentation
ampinsk Jul 15, 2019
0ebf31d
Use color instead of fill
simurai Jul 16, 2019
7ad5802
Remove rest of the fills
simurai Jul 16, 2019
8c2d441
Use inline svgs for the icons
simurai Jul 17, 2019
04a14d8
Add wrapper div with padding
simurai Jul 17, 2019
e7bf2f9
Mention both animation modifiers
simurai Jul 17, 2019
bd43628
Document positioning of a Toast
simurai Jul 17, 2019
56b3dae
Merge pull request #834 from primer/toasts-v2.1
simurai Jul 17, 2019
4064696
Merge branch 'master' into toasts-v2
simurai Jul 17, 2019
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
156 changes: 156 additions & 0 deletions pages/css/components/toasts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
---
title: Toasts
path: components/toasts
status: Experimental
status_issue: 'https://github.com/github/design-systems/issues/101'
source: ''
bundle: toasts
---

Toasts are used to show live, time-sensitive feedback to users.


## Default

To create a default toast, use `.Toast`. Always use the `info` icon for default messages.

```html title="Default toast"
<div class="p-1">
<div class="Toast">
<span class="Toast-icon">
<!-- <%= octicon "info" %> -->
<svg class="octicon octicon-info" style="fill:currentColor" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
</span>
<span class="Toast-content">Toast message goes here</span>
</div>
</div>
```

The Toast content is formattable. We recommend keeping your message under 140 characters.

```html title="Toast with long text"
<div class="p-1">
<div class="Toast">
<span class="Toast-icon">
<!-- <%= octicon "info" %> -->
<svg class="octicon octicon-info" style="fill:currentColor" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
</span>
<span class="Toast-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <strong>Aenean commodo ligula eget dolor.</strong> Aenean massa. Cum sociis <em>natoque</em> penatibus et ma</span>
</div>
</div>
```

## Variations

Use the success, warning, and error modifiers to communicate different states.

Always use the `check` octicon for success states.

```html title="Success toast"
<div class="p-1">
<div class="Toast Toast--success">
<span class="Toast-icon">
<!-- <%= octicon "check" %> -->
<svg class="octicon octicon-check" style="fill:currentColor" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"></path></svg>
</span>
<span class="Toast-content">Success message goes here.</span>
</div>
</div>
```

Always use the `alert` octicon for warning states.

```html title="Warning toast"
<div class="p-1">
<div class="Toast Toast--warning">
<span class="Toast-icon">
<!-- <%= octicon "alert" %> -->
<svg class="octicon octicon-alert" style="fill:currentColor" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg>
</span>
<span class="Toast-content">Warning message goes here.</span>
</div>
</div>
```

Always use the `stop` octicon for error states.

```html title="Error toast"
<div class="p-1">
<div class="Toast Toast--error">
<span class="Toast-icon">
<!-- <%= octicon "stop" %> -->
<svg class="octicon octicon-stop" style="fill:currentColor" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M10 1H4L0 5v6l4 4h6l4-4V5l-4-4zm3 9.5L9.5 14h-5L1 10.5v-5L4.5 2h5L13 5.5v5zM6 4h2v5H6V4zm0 6h2v2H6v-2z"></path></svg>
</span>
<span class="Toast-content">Error message goes here</span>
</div>
</div>
```

## Toast with dismiss

Use `.Toast-dismissButton` to allow a user to explicitly dismiss a Toast.

```html title="Toast with dismiss"
<div class="p-1">
<div class="Toast">
<span class="Toast-icon">
<!-- <%= octicon "info" %> -->
<svg class="octicon octicon-info" style="fill:currentColor" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
</span>
<span class="Toast-content">This toast is dismissable.</span>
<button class="Toast-dismissButton">
<svg class="octicon octicon-x" style="fill:currentcolor" viewBox="0 0 12 16" version="1.1" width="12" height="16" role="img"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"></path></svg>
</button>
</div>
</div>
```

## Toast with link

Include a link to allow users to take actions within a Toast.

```html title="Toast with link"
<div class="p-1">
<div class="Toast">
<span class="Toast-icon">
<!-- <%= octicon "info" %> -->
<svg class="octicon octicon-info" style="fill:currentColor" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
</span>
<span class="Toast-content">Toast message goes here </strong><a href="#">Action.</a></span>
</div>
</div>
```

## Toast animation

The `Toast--animateIn` and `Toast--animateOut` modifier classes can be used to animate the toast in and out from the bottom.

```html title="Toast animating"
<div class="p-1">
<div class="Toast Toast--animateIn">
<span class="Toast-icon">
<!-- <%= octicon "info" %> -->
<svg class="octicon octicon-info" style="fill:currentColor" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
</span>
<span class="Toast-content">Toast message goes here.</span>
</div>
</div>
```

## Toast position

Use the `position-fixed bottom-0` utility classes on a wrapper element to position Toasts at the **bottom left** of the viewport.

```html title="Toast animating"
<div class="border bg-gray-light" style="height:150px">
<div class="position-fixed bottom-0">
<div class="Toast">
<span class="Toast-icon">
<!-- <%= octicon "info" %> -->
<svg class="octicon octicon-info" style="fill:currentColor" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
</span>
<span class="Toast-content">Toast message goes here.</span>
</div>
</div>
</div>
```
1 change: 1 addition & 0 deletions src/product/index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@
@import "../popover/index.scss";
@import "../progress/index.scss";
@import "../subhead/index.scss";
@import "../toasts/index.scss"
1 change: 1 addition & 0 deletions src/toasts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Primer Toasts
2 changes: 2 additions & 0 deletions src/toasts/index.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@import "../support/index.scss";
@import "./toasts.scss";
89 changes: 89 additions & 0 deletions src/toasts/toasts.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Toast

.Toast {
display: flex;
margin: $spacer-2;
color: $black;
background-color: $bg-white;
border-radius: $border-radius;
box-shadow: inset 0 0 0 1px $border-gray-dark, $box-shadow-medium;

@include breakpoint(sm) {
width: max-content;
max-width: 450px;
margin: $spacer-3;
}
}

.Toast-icon {
display: flex;
align-items: center;
justify-content: center;
width: $spacer-3 * 3;
flex-shrink: 0;
color: $text-white;
background-color: $blue-500;
border-top-left-radius: inherit;
border-bottom-left-radius: inherit;
}

.Toast-content {
padding: $spacer-3;
}

.Toast-dismissButton {
max-height: 54px; // keeps button aligned to the top
padding: $spacer-3;
background-color: transparent;
border: 0;

&:focus,
&:hover {
color: $text-gray;
outline: none;
}

&:active {
color: $gray-400;
}
}

// Modifier

.Toast--error .Toast-icon {
background-color: $red-500;
}

.Toast--warning .Toast-icon {
color: $gray-900;
background-color: $yellow-600;
}

.Toast--success .Toast-icon {
background-color: $green-500;
}

// Animations

.Toast--animateIn {
animation: Toast--animateIn 0.18s cubic-bezier(0.22, 0.61, 0.36, 1) backwards;
}

@keyframes Toast--animateIn {
0% {
opacity: 0;
transform: translateY(100%);
}
}

.Toast--animateOut {
animation: Toast--animateOut 0.18s cubic-bezier(0.55, 0.06, 0.68, 0.19) forwards;
}

@keyframes Toast--animateOut {
100% {
pointer-events: none;
opacity: 0;
transform: translateY(100%);
}
}