Open Props CSS Variables Playground
by Keith Rowles • 03/12/2023HTML
Summary
Testing out supercharged css variables, design tokens and components with Open Props.
Some of the design tokens include:
- colours
- gradients
- shadows
- aspect ratios
- typography
- sizes
- and more…
I have integrated the components into a basic CSS Grid template.
Here is the CDN link.
<link rel="stylesheet" href="https://unpkg.com/open-props" />
Tech
- HTML
- CSS
- Open Props (CSS Variables and Design Tokens)
- Glitch
Demo
Here is a link to the demo hosted on Glitch.
Link to DemoHere is the link to the Open Props website.
Link to Open PropsHTML
I have included the code below.
<div class="site">
<!-- header -->
<header>
<div class="header-container">
<!-- navbar -->
<nav class="nav-bar">
<h3>Logo</h3>
<div class="nav-bar-menu">
<a href="#">Link</a>
<a href="#">Link</a>
</div>
</nav>
</div>
</header>
<main>
<div class="main-container">
<h1>Lorem ipsum dolor sit amet consectetur adipisicing elit.</h1>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Fuga
consequuntur delectus aspernatur perferendis quos dolorum.
</p>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Earum sit
officia magnam, fugit perspiciatis modi eaque odit ex neque animi
consectetur quod culpa! Impedit repellendus id quaerat cum veritatis
quasi assumenda quod reiciendis, magni adipisci, et iure libero quo
sequi in unde expedita? Officiis possimus corrupti at expedita,
distinctio fugit aut, debitis id ut consequatur, rem porro asperiores
molestiae animi!
</p>
<hr />
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
<h6>Heading 6</h6>
<blockquote>
<p>
A block quotation (also known as a long quotation or extract) is a
quotation in a written document, that is set off from the main text as
a paragraph, or block of text.
</p>
<p>
It is typically distinguished visually using indentation and a
different typeface or smaller size quotation. It may or may not
include a citation, usually placed at the bottom.
</p>
<cite><a href="#!">Said no one, ever.</a></cite>
</blockquote>
<h3>Ordered List</h3>
<ol>
<li>List Item 1</li>
<li>List Item 2</li>
<li>List Item 3</li>
</ol>
<h3>Unordered List</h3>
<ul>
<li>List Item 1</li>
<li>List Item 2</li>
<li>List Item 3</li>
</ul>
<h6 class="display-2">Display Heading - H6</h6>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Recusandae
blanditiis a cumque aliquam assumenda dolorem tenetur ea nam, maiores
delectus voluptatum totam, quia id obcaecati, illo adipisci soluta vel
deserunt veniam necessitatibus voluptas pariatur voluptates? Recusandae
qui voluptatem natus minus eaque! Nihil accusantium provident minus cum
quaerat qui consectetur impedit molestias, quam quod aspernatur,
repellat vel neque sit praesentium culpa ratione! Iusto adipisci
delectus cum aperiam magni tempore expedita unde possimus architecto,
illum nemo obcaecati est at fugit optio voluptatibus explicabo iure
quis! Tempore minus possimus cumque blanditiis ducimus dolorem odio
consequatur itaque. Possimus ratione minima error rem, sint molestiae.
</p>
<h3>Details</h3>
<details>
<summary>Details and summary element</summary>
<p>Example paragraph text.</p>
</details>
<hr />
<div class="demos">
<div class="box box-square">Box</div>
<div class="box box-landscape">Box Landscape</div>
<div class="box box-golden">Box Golden</div>
</div>
<hr />
<h3>Buttons</h3>
<button type="submit">Ready for action</button>
<button type="reset">Ready for action</button>
<button type="button">Ready for action</button>
<hr />
<button class="primary">Large Custom</button>
<button>Default with Icon <span data-icon="cloud"></span></button>
<hr />
<h3>Form Fields</h3>
<form>
<fieldset>
<legend>Input Fields</legend>
<p>
<label for="input__text">Text Input</label>
<input
id="input__text"
type="text"
placeholder="Text Input"
required
/>
</p>
<p>
<label for="input__password">Password</label>
<input
id="input__password"
type="password"
placeholder="Type your Password"
required
/>
</p>
</fieldset>
<fieldset id="forms__select">
<legend>Select menus</legend>
<p>
<label for="select">Select</label>
<select id="select">
<optgroup label="Option Group">
<option>Option One</option>
<option>Option Two</option>
<option>Option Three</option>
</optgroup>
</select>
</p>
</fieldset>
<fieldset id="forms__html5">
<legend>HTML5 inputs</legend>
<p>
<label for="ic">Color input</label>
<input type="color" id="ic" value="#000000" />
</p>
<p>
<label for="idd">Date input</label>
<input type="date" id="idd" value="1970-01-01" />
</p>
</fieldset>
<button type="submit">Submit</button>
</form>
<hr />
<h3>Card</h3>
<div class="card-container">
<div class="card">
<img
src="https://doodleipsum.com/500x500/hand-drawn?i=b48528b59f8d071fde57e51d2d6c433d"
alt="Card image cap"
/>
<h5>Lorem ipsum dolor</h5>
<p>Quis nostrud nisi ut aliquip ea commodo consequat.</p>
<a href="#">Check it</a>
</div>
</div>
</div>
</main>
<!-- left sidebar -->
<aside class="left-sidebar">
<div class="left-sidebar-container">
<section class="left-sidebar-menu">
<h3>Menu</h3>
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Link</a>
</section>
<section class="left-sidebar-icons">
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Link</a>
</section>
</div>
</aside>
<!-- right sidebar -->
<aside class="right-sidebar">
<div class="right-sidebar-container">
<h3>Heading</h3>
<p>
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Autem eveniet
repudiandae tempora quisquam accusantium quo praesentium totam assumenda
laboriosam reiciendis pariatur, aspernatur laborum debitis laudantium
voluptatem, ea nihil nesciunt? Deserunt?
</p>
</div>
</aside>
<!-- footer -->
<footer>
<div class="footer-container">
<div class="footer-details">
Copyright © Logo <sl-format-date></sl-format-date>
</div>
<div class="footer-social">
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Link</a>
</div>
</div>
</footer>
</div>
CSS
@import 'https://unpkg.com/open-props';
@import 'https://unpkg.com/open-props/normalize.min.css';
@import 'https://unpkg.com/open-props/buttons.min.css';
/* css reset */
:is(h1, h2, h3, h4, h5, h6) {
margin-bottom: var(--size-3);
margin-top: var(--size-3);
}
p {
margin-bottom: var(--size-3);
}
body {
background-color: var(--gradient-9);
}
/* grid */
.site {
min-height: 100vh;
display: grid;
grid-template-areas: 'header' 'main' 'right-sidebar' 'left-sidebar' 'footer';
grid-template-rows: min-content 1fr min-content min-content min-content;
gap: var(--size-3);
padding: var(--size-3);
background-color: var(--gray-1);
background-image: var(--gradient-9);
}
/* header and navbar */
header {
grid-area: header;
}
.header-container {
background-color: var(--blue-0);
padding: var(--size-3);
border-radius: var(--radius-2);
}
header nav.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
flex-direction: row;
flex-wrap: wrap;
gap: var(--size-3);
}
header .header-container .nav-bar .nav-bar-menu a {
margin-left: var(--size-3);
}
/* content */
main {
grid-area: main;
}
.main-container {
background-color: var(--stone-0);
padding: var(--size-3);
border-radius: var(--radius-2);
}
/* footer */
footer {
grid-area: footer;
}
.footer-container {
display: flex;
align-items: center;
justify-content: space-between;
flex-direction: row;
flex-wrap: wrap;
gap: var(--size-3);
background-color: var(--gray-2);
padding: var(--size-3);
border-radius: var(--radius-2);
}
.footer-social {
font-size: var(--font-size-1);
}
.footer-social a {
color: var(--blue-7);
margin-left: var(--size-3);
}
.footer-social a:hover {
color: var(--blue-5);
}
.footer-social sl-icon {
margin-left: var(--size-3);
}
/* left menu bar */
.left-sidebar {
grid-area: left-sidebar;
}
.left-sidebar-container {
background-color: var(--gray-2);
padding: var(--size-3);
display: flex;
flex-direction: column;
gap: var(--size-3);
justify-content: space-between;
height: 100%;
border-radius: var(--radius-2);
}
.left-sidebar .left-sidebar-container .left-sidebar-icons {
display: flex;
flex-direction: row;
gap: var(--size-3);
justify-content: center;
align-items: center;
flex-wrap: wrap;
}
.left-sidebar .left-sidebar-container .left-sidebar-icons a {
color: var(--red-7);
}
.left-sidebar .left-sidebar-container .left-sidebar-menu {
display: flex;
flex-direction: column;
gap: var(--size-3);
justify-content: flex-start;
align-items: flex-start;
}
.left-sidebar .left-sidebar-container .left-sidebar-menu a {
color: var(--blue-7);
border-bottom: 1px solid var(--stone-4);
display: inline-block;
width: 100%;
padding-bottom: var(--size-3);
}
/* right general information */
.right-sidebar {
grid-area: right-sidebar;
}
.right-sidebar-container {
background-color: var(--gray-2);
padding: var(--size-3);
height: 100%;
border-radius: var(--radius-2);
}
/* Boxes */
.demos {
display: flex;
flex-flow: row wrap;
gap: var(--size-4);
}
.box {
block-size: var(--size-12);
max-inline-size: var(--max-inline-body);
border-width: var(--border-size-3);
border-color: var(--surface-4);
box-shadow: var(--shadow-3);
display: grid;
place-content: center;
}
.box-square {
aspect-ratio: var(--ratio-square);
}
.box-landscape {
aspect-ratio: var(--ratio-landscape);
}
.box-golden {
aspect-ratio: var(--ratio-golden);
}
/* Display Headings */
.display-2 {
font-size: var(--font-size-7);
}
/* Buttons */
button.primary {
background: var(--indigo-8);
text-shadow: 0 1px 0 var(--indigo-9);
color: white;
font-size: var(--font-size-3);
padding-inline: var(--size-8);
padding-block: var(--size-3);
border-radius: var(--radius-2);
box-shadow: var(--shadow-3);
}
button.primary:hover {
background: var(--indigo-5);
}
[data-icon='cloud']::after {
content: url('https://api.iconify.design/fa6-brands/github-alt.svg');
padding: 0;
margin: 0;
vertical-align: middle;
}
/* Card */
.card-container {
display: flex;
flex-flow: row wrap;
align-items: flex-start;
justify-content: space-around;
max-inline-size: calc(var(--size-content-1) * 4);
gap: var(--size-5);
padding: var(--size-5);
}
.card {
flex-basis: var(--size-content-2);
display: flex;
flex-direction: column;
gap: var(--size-2);
background: var(--surface-3);
border: 1px solid var(--surface-1);
padding: var(--size-4);
border-radius: var(--radius-3);
box-shadow: var(--shadow-2);
}
.card > h5 {
line-height: var(--font-lineheight-1);
}
@media screen and (min-width: 600px) {
.site {
grid-template-columns: minmax(auto, 250px) minmax(250px, 1fr) minmax(auto, 250px);
grid-template-rows: min-content 1fr min-content min-content;
grid-template-areas:
'header header header'
'main main right-sidebar'
'left-sidebar left-sidebar left-sidebar'
'footer footer footer';
}
}
@media screen and (min-width: 900px) {
.site {
grid-template-columns: minmax(auto, 250px) minmax(250px, 1fr) minmax(auto, 250px);
grid-template-rows: min-content 1fr min-content;
grid-template-areas:
'header header header'
'left-sidebar main right-sidebar'
'footer footer footer';
}
}