https://dribbble.com/shots/13971226-Smart-Home-OS
A Pen by Lorik Mehmeti on CodePen.
| <div class="card card:smert"> | |
| <div class="display:flex top"> | |
| <div class="top:left display:flex"> | |
| <div class="icon:card icon:lamp"> | |
| <svg width="26" height="26"> | |
| <use xlink:href="#bulb" /> | |
| </svg> | |
| </div> | |
| <div class="text:card"> | |
| <h2 class="link title:card">Lamp</h2> | |
| <p class="desc:card">Living Room</p> | |
| </div> | |
| </div> | |
| <div class="top:right"> | |
| <div class="input:switch"> | |
| <input type="checkbox" class="hide" id="switch" checked> | |
| <p class="indicator:text"></p> | |
| <label for="switch" class="switch:indicator"> | |
| <div class="switch"> | |
| <div class="dot"></div> | |
| </div> | |
| </label> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="after:top display:flex"> | |
| <p class="text:sector">Dimming</p> | |
| <div class="input:switch"> | |
| <input type="checkbox" class="hide" id="dimming" checked> | |
| <p class="indicator:text dimming"></p> | |
| <label for="dimming" class="switch:indicator"> | |
| <div class="switch dimming"> | |
| <div class="dot"></div> | |
| </div> | |
| </label> | |
| </div> | |
| </div> | |
| <div class="range:slide"> | |
| <div class="grid:slide"> | |
| <svg width="20" height="20" class="slider:down"> | |
| <use xlink:href="#sun" /> | |
| </svg> | |
| <input type="range" name="" id="range" value=""> | |
| <svg width="26" height="26"> | |
| <use xlink:href="#sun" /> | |
| </svg> | |
| </div> | |
| </div> | |
| <div class="color:section"> | |
| <p class="text:sector">Color selection</p> | |
| <div class="colors:grid"> | |
| <div class="color"> | |
| <input type="radio" name="color" class="hide color:sel" id="white"> | |
| <label for="white" class="color:label white"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#check" /> | |
| </svg> | |
| </label> | |
| </div> | |
| <div class="color"> | |
| <input type="radio" name="color" class="hide color:sel" id="orange" checked> | |
| <label for="orange" class="color:label orange"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#check" /> | |
| </svg> | |
| </label> | |
| </div> | |
| <div class="color"> | |
| <input type="radio" name="color" class="hide color:sel" id="black"> | |
| <label for="black" class="color:label black"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#check" /> | |
| </svg> | |
| </label> | |
| </div> | |
| <div class="color"> | |
| <input type="radio" name="color" class="hide color:sel" id="blue"> | |
| <label for="blue" class="color:label blue"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#check" /> | |
| </svg> | |
| </label> | |
| </div> | |
| <div class="color"> | |
| <input type="radio" name="color" class="hide color:sel" id="cyan"> | |
| <label for="cyan" class="color:label cyan"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#check" /> | |
| </svg> | |
| </label> | |
| </div> | |
| <div class="color"> | |
| <input type="radio" name="color" class="hide color:sel" id="purple"> | |
| <label for="purple" class="color:label purple"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#check" /> | |
| </svg> | |
| </label> | |
| </div> | |
| <div class="color"> | |
| <input type="radio" name="color" class="hide color:sel" id="red"> | |
| <label for="red" class="color:label red"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#check" /> | |
| </svg> | |
| </label> | |
| </div> | |
| <div class="color"> | |
| <input type="radio" class="hide color:sel"> | |
| <label class="color:label no"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#plus" /> | |
| </svg> | |
| </label> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="scene:section"> | |
| <p class="text:sector">Scene selection</p> | |
| <div class="labels:scene"> | |
| <div class="scene:label"> | |
| <input type="radio" name="scene" id="none" class="hide scene" checked> | |
| <label for="none" class="lbl"> | |
| None | |
| </label> | |
| </div> | |
| <div class="scene:label"> | |
| <input type="radio" name="scene" id="sleeping" class="hide scene"> | |
| <label for="sleeping" class="lbl"> | |
| Sleeping | |
| </label> | |
| </div> | |
| <div class="scene:label"> | |
| <input type="radio" name="scene" id="reading" class="hide scene"> | |
| <label for="reading" class="lbl"> | |
| Reading | |
| </label> | |
| </div> | |
| <div class="scene:label"> | |
| <input type="radio" name="scene" id="working" class="hide scene"> | |
| <label for="working" class="lbl"> | |
| Working | |
| </label> | |
| </div> | |
| <div class="scene:label"> | |
| <input type="radio" class="hide" id="no"> | |
| <label for="no" class="add"> | |
| <svg width="18" height="18"> | |
| <use xlink:href="#plus" /> | |
| </svg> | |
| </label> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <svg class="hide"> | |
| <symbol fill="none" viewBox="0 0 24 24" stroke="currentColor" id="check"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path> | |
| </symbol> | |
| <symbol fill="none" viewBox="0 0 24 24" stroke="currentColor" id="plus"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6"></path> | |
| </symbol> | |
| <symbol fill="currentColor" viewBox="0 0 24 24" stroke="currentColor" id="sun"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" | |
| d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"> | |
| </path> | |
| </symbol> | |
| <symbol xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="bulb" | |
| x="0px" y="0px" viewBox="0 0 512 512" fill="currentColor" style="enable-background:new 0 0 512 512;" | |
| xml:space="preserve"> | |
| <g> | |
| <g> | |
| <path | |
| d="M388.56,192.8c-18.579-18.499-40.358-32.648-64.077-41.919V84.116H271V0h-30v84.116h-53.483v66.765 c-23.719,9.27-45.498,23.419-64.077,41.919c-31.96,31.84-51.09,73.18-54.69,117.68h374.5 C439.65,265.98,420.52,224.64,388.56,192.8z" /> | |
| </g> | |
| </g> | |
| <g> | |
| <g> | |
| <rect x="241" y="450.65" width="30" height="61.35" /> | |
| </g> | |
| </g> | |
| <g> | |
| <g> | |
| <rect x="342.883" y="412.78" transform="matrix(0.7597 -0.6503 0.6503 0.7597 -202.3702 339.2961)" | |
| width="30.001" height="61.351" /> | |
| </g> | |
| </g> | |
| <g> | |
| <g> | |
| <rect x="123.461" y="428.485" transform="matrix(0.6503 -0.7596 0.7596 0.6503 -282.9958 272.1567)" | |
| width="61.346" height="29.998" /> | |
| </g> | |
| </g> | |
| <g> | |
| <g> | |
| <path | |
| d="M167.24,340.48c7.47,42.21,44.5,74.43,88.76,74.43s81.29-32.22,88.76-74.43l-177.58-0.36 C167.19,340.24,167.22,340.36,167.24,340.48z" /> | |
| </g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| <g> | |
| </g> | |
| </symbol> | |
| <symbol viewBox="0 0 24 24" stroke="currentColor" fill="var(--color-svg)" id="heart"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width=".4" | |
| d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"> | |
| </path> | |
| </symbol> | |
| <symbol viewBox="0 0 24 24" stroke="currentColor" fill="var(--color-svg)" id="icon-star"> | |
| <path stroke-linecap="square" stroke-linejoin="square" stroke-width=".4" | |
| d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"> | |
| </path> | |
| </symbol> | |
| <symbol fill="var(--color-svg)" viewBox="0 0 24 24" stroke="currentColor" id="icon-bookmark"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width=".4" | |
| d="M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z"></path> | |
| </symbol> | |
| <symbol fill="var(--color-svg)" viewBox="0 0 24 24" stroke="currentColor" id="moon"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width=".4" | |
| d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path> | |
| </symbol> | |
| </svg> |
| const range = document.getElementById('range'); | |
| document.documentElement.style.setProperty("--range", range.value + "%"); | |
| range.setAttribute('value', range.value); | |
| range.addEventListener("input", () => { | |
| range.setAttribute('value', range.value); | |
| document.documentElement.style.setProperty("--range", range.value + "%"); | |
| }); |
| @import url('https://rsms.me/inter/inter.css'); | |
| html { | |
| font-family: 'Inter', sans-serif; | |
| } | |
| @supports (font-variation-settings: normal) { | |
| html { | |
| font-family: 'Inter var', sans-serif; | |
| } | |
| } | |
| :root { | |
| --bg-page: #1a1a1a; | |
| --text-color: #f3f3f3; | |
| --card-bg: #202020; | |
| --icon-bg: #45423C; | |
| --blue: #0870f8; | |
| --blue-rgb: 8, 112, 248; | |
| --orange: #FF9232; | |
| --g-purple: linear-gradient(30deg, #85f, #9966ff); | |
| --g-yellow: linear-gradient(30deg, #fc0, #fc0); | |
| --g-red: linear-gradient(30deg, #f36, #f24); | |
| --g-blue: linear-gradient(30deg, #0cf, #0af); | |
| --g-purple: linear-gradient(30deg, #85f, #9966ff); | |
| --range: 0%; | |
| --shadow: rgba(0, 6, 39, .1); | |
| --light-shadow: rgba(255, 255, 255, .8); | |
| --light-shadow-2: rgba(255, 255, 255, .1); | |
| } | |
| * { | |
| box-sizing: border-box; | |
| font-family: "Inter var", sans-serif; | |
| font-size: 16px; | |
| font-weight: 400; | |
| user-select: none; | |
| transition: all 200ms ease; | |
| &:focus { | |
| outline: none; | |
| } | |
| } | |
| html, | |
| body, | |
| .full-width { | |
| height: 100%; | |
| } | |
| body { | |
| &, | |
| html { | |
| margin: 0; | |
| padding: 0; | |
| } | |
| padding: 0 10px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-direction: column; | |
| background:var(--bg-page); | |
| color:var(--text-color); | |
| } | |
| .hide { | |
| display: none; | |
| visibility: hidden; | |
| height: 0; | |
| } | |
| h1, | |
| h2, | |
| h3, | |
| h4, | |
| h5, | |
| h6, | |
| span, | |
| p, | |
| a, | |
| label { | |
| margin: 0; | |
| &.link { | |
| cursor: pointer; | |
| } | |
| @media (hover: hover) { | |
| &.link:hover { | |
| filter: brightness(120%) saturate(120%); | |
| } | |
| } | |
| } | |
| .display\:flex { | |
| display: flex; | |
| } | |
| .center { | |
| @extend .display\:flex; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .card { | |
| max-width: 480px; | |
| width: 100%; | |
| margin: 0 auto; | |
| background: var(--card-bg); | |
| padding: 20px; | |
| border-radius: 20px; | |
| } | |
| .top { | |
| align-items: center; | |
| } | |
| .top\:left { | |
| align-items: center; | |
| .text\:card { | |
| margin-left: 16px; | |
| .title\:card { | |
| font-size: 18px; | |
| font-variation-settings: 'wght'700; | |
| font-weight: 700; | |
| } | |
| .desc\:card { | |
| margin-top: 6px; | |
| color: rgba(255, 255, 255, .6); | |
| font-size: 12px; | |
| font-variation-settings: 'wght'300; | |
| font-weight: 300; | |
| } | |
| } | |
| } | |
| .top\:right { | |
| margin-left: auto; | |
| } | |
| .icon\:card { | |
| --size: 48px; | |
| border-radius: 50%; | |
| width: var(--size); | |
| height: var(--size); | |
| @extend .center; | |
| color: var(--orange); | |
| background: var(--icon-bg); | |
| } | |
| .switch { | |
| --offset: 0; | |
| --gradient: 0; | |
| --height: 22px; | |
| --width: 40px; | |
| --dot: 24px; | |
| --bg-switch: #FF9232; | |
| position: relative; | |
| display: inline-block; | |
| z-index: 1; | |
| vertical-align: middle; | |
| height: var(--height); | |
| width: var(--width); | |
| border-radius: 11px; | |
| background: rgba(255, 255, 255, .1); | |
| &.dimming { | |
| --height: 18px; | |
| --dot: 21px; | |
| --bg-switch: linear-gradient(30deg, #85f, #9966ff); | |
| --width: 34px; | |
| } | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| right: 0; | |
| bottom: 0; | |
| border-radius: inherit; | |
| background: var(--bg-switch); | |
| opacity: var(--gradient, 0); | |
| transition: opacity .4s; | |
| } | |
| .dot { | |
| background: #D1D6EE; | |
| position: absolute; | |
| width: var(--dot); | |
| height: var(--dot); | |
| border-radius: 50%; | |
| left: -1px; | |
| top: -1px; | |
| cursor: pointer; | |
| transform: translateX(var(--offset, 0)); | |
| transition: transform .4s, box-shadow .4s; | |
| box-shadow: -4px -4px 8px var(--light-shadow-2, transparent), 4px 4px 8px var(--shadow, transparent); | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| right: 0; | |
| bottom: 0; | |
| border-radius: inherit; | |
| background: linear-gradient(160deg, #F1F4FF, #F9FAFF); | |
| opacity: var(--gradient, 0); | |
| transition: opacity .4s; | |
| } | |
| } | |
| } | |
| #switch { | |
| &:checked~.switch\:indicator { | |
| .switch { | |
| --offset: 18px; | |
| --gradient: 1; | |
| } | |
| } | |
| &:checked~.indicator\:text { | |
| &:after { | |
| --content: 'On'; | |
| } | |
| } | |
| } | |
| #dimming { | |
| &:checked~.switch\:indicator { | |
| .switch { | |
| --offset: 14px; | |
| --gradient: 1; | |
| } | |
| } | |
| &:checked~.indicator\:text { | |
| --content: 'Auto'; | |
| } | |
| } | |
| .indicator\:text { | |
| margin-right: 15px; | |
| font-size: 12px; | |
| color: rgba(255, 255, 255, .6); | |
| text-transform: uppercase; | |
| position: relative; | |
| text-align: right; | |
| vertical-align: middle; | |
| display: inline-block; | |
| line-height: 100%; | |
| margin-top: 2px; | |
| --content: 'Off'; | |
| &.dimming { | |
| font-size: 11px; | |
| margin-top: 3px; | |
| text-transform: capitalize; | |
| } | |
| &:after { | |
| content: var(--content); | |
| transition: all 200ms ease; | |
| } | |
| } | |
| .after\:top { | |
| margin-top: 25px; | |
| align-items: center; | |
| justify-content: space-between; | |
| } | |
| .text\:sector { | |
| color: rgba(255, 255, 255, .6); | |
| font-size: 12px; | |
| line-height: 150%; | |
| } | |
| .input\:switch { | |
| @extend .display\:flex; | |
| align-items: center; | |
| } | |
| .range\:slide { | |
| margin-top: 40px; | |
| .grid\:slide { | |
| display: grid; | |
| grid-template-columns: auto 1fr auto; | |
| grid-gap: 10px; | |
| align-items: center; | |
| } | |
| .slider\:down { | |
| color: rgba(255, 255, 255, .4); | |
| } | |
| input[type="range"] { | |
| -webkit-appearance: none; | |
| height: 6px; | |
| border-radius: 4px; | |
| position: relative; | |
| &[value="100"] { | |
| &:before { | |
| border-top-right-radius: 4px; | |
| border-bottom-right-radius: 4px; | |
| } | |
| } | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| height: 6px; | |
| border-top-left-radius: 4px; | |
| border-bottom-left-radius: 4px; | |
| width: var(--range); | |
| background: var(--orange); | |
| } | |
| &::-webkit-slider-thumb { | |
| -webkit-appearance: none; | |
| width: 20px; | |
| height: 20px; | |
| border-radius: 50%; | |
| position: relative; | |
| background: #fff; | |
| box-shadow: -4px -4px 8px var(--light-shadow-2, transparent), 4px 4px 8px var(--shadow, transparent); | |
| outline: none; | |
| border: none; | |
| cursor: pointer; | |
| } | |
| &:active:after { | |
| opacity: 1; | |
| } | |
| &:after { | |
| opacity: 0; | |
| font-size: 12px; | |
| content: attr(value); | |
| position: absolute; | |
| top: -40px; | |
| border-radius: 20px; | |
| background: #3B3B3B; | |
| color: var(--text-color); | |
| padding: 6px 15px; | |
| left: calc(var(--range)); | |
| transform: translateX(calc(var(--range) * -1)); | |
| } | |
| } | |
| } | |
| .color\:section, | |
| .scene\:section { | |
| margin-top: 20px; | |
| } | |
| .colors\:grid { | |
| display: grid; | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| margin-top: 10px; | |
| } | |
| .color\:label { | |
| width: 32px; | |
| height: 32px; | |
| border-radius: 50%; | |
| @extend .center; | |
| cursor: pointer; | |
| border: 2px solid transparent; | |
| svg { | |
| display: none; | |
| } | |
| @media (hover: hover) { | |
| &:hover { | |
| filter: brightness(150%) saturate(150%); | |
| } | |
| } | |
| &.no { | |
| border: 1px solid rgba(255, 255, 255, .5); | |
| svg { | |
| display: block; | |
| ; | |
| } | |
| color: rgba(255, 255, 255, .5); | |
| } | |
| &.white { | |
| background: #fff; | |
| color: var(--bg-page); | |
| } | |
| &.orange { | |
| background: var(--orange); | |
| color: var(--bg-page); | |
| } | |
| &.black { | |
| background: #353535; | |
| } | |
| &.blue { | |
| background: #3A68FF; | |
| } | |
| &.cyan { | |
| background: #36E0FF; | |
| color: var(--bg-page); | |
| } | |
| &.purple { | |
| background: #9120FF; | |
| } | |
| &.red { | |
| background: #FF5252; | |
| } | |
| } | |
| input[type="radio"].color\:sel { | |
| &:checked { | |
| &~label { | |
| border: 2px solid #fff; | |
| &.white { | |
| border-color: #454545; | |
| } | |
| svg { | |
| display: block; | |
| ; | |
| } | |
| } | |
| } | |
| } | |
| .labels\:scene { | |
| @extend .display\:flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| margin-top: 10px; | |
| } | |
| .lbl { | |
| font-variation-settings: 'wght'400; | |
| color: rgba(255, 255, 255, .6); | |
| letter-spacing: .1px; | |
| padding: 8px 20px; | |
| border-radius: 30px; | |
| font-size: 11px; | |
| background: #454545; | |
| cursor: pointer; | |
| } | |
| .scene { | |
| &:not(:checked) { | |
| & ~ .lbl { | |
| @media (hover: hover) { | |
| &:hover { | |
| filter: brightness(150%) saturate(150%); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| .add { | |
| margin-top: 2px; | |
| width: 30px; | |
| height: 30px; | |
| border-radius: 50%; | |
| color: rgba(255, 255, 255, .5); | |
| @extend .center; | |
| box-shadow: 0 0 0 1px rgba(255, 255, 255, .5); | |
| } | |
| .scene { | |
| &:checked { | |
| & ~ .lbl { | |
| background: #fff; | |
| color: var(--bg-page); | |
| } | |
| } | |
| } |