Skip to content

Instantly share code, notes, and snippets.

@Markshall
Created May 27, 2020 15:38
Show Gist options
  • Save Markshall/153de2dd91d5a11d0a2c6a586ac2c158 to your computer and use it in GitHub Desktop.
Save Markshall/153de2dd91d5a11d0a2c6a586ac2c158 to your computer and use it in GitHub Desktop.
iOS 14 widgets
<h1>Click on an app to change its widget state.</h1>
<div class="iphone-shell">
<div class="iphone">
<div class="topbar">
<div class="topbar__left">3:13</div>
<div class="topbar__right">4G</div>
</div>
<div class="apps apps--main">
<div class="app" style="--widget: #0471E6;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/facebook-2019-05-21.png" /></div>
<div class="app__name">Facebook</div>
<div class="widget-window widget-window--light">actions here...</div>
</div>
<div class="app" style="--widget: #3F8DC9;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/twitter-2013-10-08.png" /></div>
<div class="app__name">Twitter</div>
<div class="widget-window widget-window--light">actions here...</div>
</div>
<div class="app app--widget app--widget--box" style="--widget: #006AC2;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/microsoft-outlook-email-calendar-2016-01-22.png" /></div>
<div class="app__name">Outlook</div>
<div class="widget-window widget-window--light">
<div class="apps">
<div class="app"><i class="fas fa-pen"></i></div>
<div class="app"><i class="fas fa-inbox"></i></div>
<div class="app"><i class="fas fa-search"></i></div>
<div class="app"><i class="fas fa-sync"></i></div>
</div>
</div>
</div>
<div class="app" style="--widget: #29292A;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/stocks-2018-04-25.png" /></div>
<div class="app__name">Stocks</div>
<div class="widget-window widget-window--light">actions here...</div>
</div>
<div class="app app--widget app--widget--tall" style="--widget: #1dd55f;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/spotify-music-2015-07-30.png" /></div>
<div class="app__name">Spotify</div>
<div class="widget-window widget-window--light">
<div class="apps">
<div class="app"><i class="fas fa-backward"></i></div>
<div class="app"><i class="fas fa-play"></i></div>
<div class="app"><i class="fas fa-forward"></i></div>
</div>
</div>
</div>
<div class="app" style="--widget: #1AAAF8;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/weather-2017-06-19.png" /></div>
<div class="app__name">Weather</div>
<div class="widget-window widget-window--light">actions here...</div>
</div>
<div class="app">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/maps-2017-10-10.png" /></div>
<div class="app__name">Maps</div>
<div class="widget-window">actions here...</div>
</div>
<div class="app" style="--widget: #5D60B6;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/microsoft-teams-2019-03-21.png" /></div>
<div class="app__name">Teams</div>
<div class="widget-window widget-window--light">actions here...</div>
</div>
<div class="app app--widget app--widget--long">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/chrome-web-browser-by-google-2016-01-25.png" /></div>
<div class="app__name">Chrome</div>
<div class="widget-window">
<div class="apps">
<div class="app"><i class="fas fa-window-restore"></i></div>
<div class="app"><i class="fas fa-user-secret"></i></div>
</div>
</div>
</div>
<div class="app" style="--widget: #FFE01B;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/mailchimp-marketing-crm-2020-02-26.png" /></div>
<div class="app__name">Mailchimp</div>
<div class="widget-window">actions here...</div>
</div>
<div class="app" style="--widget: #000;">
<div class="app__icon"><img src="https://cdn.jim-nielsen.com/ios/512/netflix-2018-11-01.png" /></div>
<div class="app__name">Netflix</div>
<div class="widget-window widget-window--light">actions here...</div>
</div>
</div>
</div>
</div>
console.clear();
document.querySelectorAll(".apps--main > .app").forEach((app) => {
app.addEventListener("click", function (e) {
let widgetState = "";
let newWidgetState = "";
if (app.classList.contains("app--widget")) {
widgetState = [...app.classList].filter((x) =>
x.startsWith("app--widget--")
)[0];
}
if (widgetState === "") {
newWidgetState = "long";
} else if (widgetState === "app--widget--long") {
newWidgetState = "tall";
} else if (widgetState === "app--widget--tall") {
newWidgetState = "box";
} else {
newWidgetState = "";
}
if (newWidgetState) {
app.classList.add("app--widget");
app.classList.add(`app--widget--${newWidgetState}`);
} else {
app.classList.remove("app--widget");
}
if (widgetState) app.classList.remove(widgetState);
});
});
.iphone-shell {
background-color: #000;
padding: 5px;
border-radius: 15px;
box-shadow: 0 10px 42px -12px rgba(0, 0, 0, 0.7);
}
.iphone {
padding-top: 30px;
width: 320px;
height: 580px;
border-radius: 15px;
background: url(https://fsb.zobj.net/crop.php?r=5SuaNgr02ixxWxB6b8gm07woEzZr2xbIle4vXCnbzQIZgO3BAYosya1PHxtEwVXytv98HlqTkDbULdorR2shL5a5AVBYH4Af2_pcn6f3RJUBIAvCLcrif_RZQQxVgQT2ftoRPim2FNNh_DYG)
no-repeat;
background-size: cover;
position: relative;
&::after {
content: "";
background-color: #000;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
height: 22px;
width: 160px;
border-radius: 0 0 10px 10px;
}
}
.apps {
padding: 24px 18px 20px;
height: 100%;
max-height: 100%;
overflow-y: auto;
display: grid;
column-gap: 20px;
row-gap: 40px;
grid-template-columns: repeat(4, 1fr);
&.apps--main {
grid-template-rows: repeat(auto-fill, 56px);
}
}
.app {
position: relative;
&__icon {
img {
max-width: 100%;
display: block;
cursor: pointer;
border-radius: 15px;
}
}
&__name {
color: #fff;
font: {
weight: 500;
size: 12px;
}
letter-spacing: 0.62px;
text-align: center;
margin-top: 5px;
position: absolute;
top: 100%;
width: 100%;
text-align: center;
}
&--widget {
.widget-window {
display: block;
}
.apps {
width: 100%;
height: 100%;
place-items: center;
.app {
cursor: pointer;
}
}
&--long {
grid-column: span 2;
.apps {
grid-template-columns: repeat(auto-fit, minmax(25%, 1fr));
}
}
&--tall {
grid-row: span 2;
.apps {
grid-template-columns: auto;
}
}
&--box {
grid-row: span 2;
grid-column: span 2;
.apps {
grid: 1fr 1fr/1fr 1fr;
}
}
.app__icon {
--size: 22px;
position: absolute;
top: calc(var(--size) * -0.5);
left: calc(var(--size) * -0.5);
img {
height: var(--size);
width: var(--size);
border-radius: 5px;
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.3);
}
}
.app__name {
text-align: left;
}
}
}
.widget-window {
border-radius: 15px;
background-color: var(--widget, #fff);
height: 100%;
width: 100%;
padding: 10px;
display: none;
&--light {
color: #fff;
}
.apps {
gap: 5px;
padding: 0;
overflow: visible;
}
}
.topbar {
display: flex;
position: absolute;
top: 0;
width: 100%;
color: #fff;
font-weight: 600;
justify-content: space-between;
padding: 5px 18px;
}
/* resets etc etc below */
*,
*::before,
*::after {
box-sizing: border-box;
}
[class*="fa-"] {
font-size: 18px;
}
body {
display: grid;
place-items: center;
height: 100vh;
grid-template-rows: 100px auto;
}
body,
html {
font-family: "Helvetica";
font-size: 13px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css" rel="stylesheet" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment