JSFiddle - React, Tailwind, and code Playground
by Keith Jeter
HTML
<div class="container">
<h1>Responsive Tournament Bracket</h1>
<h2>Ice hockey at the 1998 Winter Olympics – Men's tournament</h2>
<div class="tournament-bracket tournament-bracket--rounded">
<div class="tournament-bracket__round tournament-bracket__round--quarterfinals">
<h3 class="tournament-bracket__round-title">Quarterfinals</h3>
<ul class="tournament-bracket__list">
<li class="tournament-bracket__item">
<div class="tournament-bracket__match" tabindex="0">
<table class="tournament-bracket__table">
<caption class="tournament-bracket__caption">
<time datetime="1998-02-18">18 February 1998</time>
</caption>
<thead class="sr-only">
<tr>
<th>Country</th>
<th>Score</th>
</tr>
</thead>
<tbody class="tournament-bracket__content">
<tr class="tournament-bracket__team tournament-bracket__team--winner">
<td class="tournament-bracket__country">
<abbr class="tournament-bracket__code" title="Canada">CAN</abbr>
<span class="tournament-bracket__flag flag-icon flag-icon-ca" aria-label="Flag"></span>
</td>
<td class="tournament-bracket__score">
<span class="tournament-bracket__number">4</span>
</td>
</tr>
<tr class="tournament-bracket__team">
<td class="tournament-bracket__country">
<abbr class="tournament-bracket__code" title="Kazakhstan">KAZ</abbr>
<span class="tournament-bracket__flag flag-icon flag-icon-kz" aria-label="Flag"></span>
</td>
<td class="tournament-bracket__score">
<span class="tournament-bracket__number">1</span>
...
SCSS
/*!
* Responsive Tournament Bracket
* Copyright 2016 Jakub Hájek
* Licensed under MIT (https://opensource.org/licenses/MIT)
*/
//
// GOOGLE FONT
// ---------------------------
@import 'https://fonts.googleapis.com/css?family=Work+Sans:300,400,600,700&subset=latin-ext';
//
// VARIABLES
// ---------------------------
@breakpoint-xs: 24em;
@breakpoint-sm: 38em;
@breakpoint-md: 52em;
@breakpoint-lg: 72em;
//
// GENERAL RULES
// ---------------------------
* {
&,
&::before,
&::after {
box-sizing: border-box;
}
}
html {
font-size: 15px;
@media (min-width: @breakpoint-sm) { font-size: 14px; }
@media (min-width: @breakpoint-md) { font-size: 15px; }
@media (min-width: @breakpoint-lg) { font-size: 16px; }
}
body {
background-color: #f1f1f1;
font-family: 'Work Sans', 'Helvetica Neue', Arial, sans-serif;
}
.container {
width: 90%;
min-width: 18em;
margin: 20px auto;
}
h1, h2 {
text-align: center;
}
h1 {
font-size: 2rem;
font-weight: 700;
margin-bottom: 0.5em;
}
h2 {
font-size: 1.4rem;
font-weight: 600;
margin-bottom: 2em;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
//
// TOURNAMENT BRACKET
// ---------------------------
.tournament-bracket {
display: flex;
flex-direction: column;
@media (min-width: @breakpoint-sm) {
flex-direction: row;
}
}
.tournament-bracket__round {
display: block;
margin-left: -3px;
flex: 1;
}
.tournament-bracket__round-title {
color: #9e9e9e;
font-size: 0.95rem;
font-weight: 400;
text-align: center;
font-style: italic;
margin-bottom: 0.5em;
}
.tournament-bracket__list {
display: flex;
flex-direction: column;
flex-flow: row wrap;
justify-content: center;
height: 100%;
min-height: 100%;
border-bottom: 1px dashed #e5e5e5;
padding-bottom: 2em;
margin-bottom: 2em;
transition: padding 0.2s ease-in-out, margin 0.2s ease-in-out;
...