<main>
  <div class="keyboard" ontouchstart="">
    <div class="row">
      <button type="button" class="btn-0">
        <span class="xs">esc</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xs noxscale">
          <span class="emoji">&#128261;</span>
        </span>
        <span class="lr xxxs">F1</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xs noxscale">
          <span class="emoji">&#128262;</span>
        </span>
        <span class="lr xxxs">F2</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xs noxscale">
          <span class="cascade"></span>
          <span class="block"></span>
        </span>
        <span class="lr xxxs">F3</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xxxs noxscale">
          <span class="apps"></span>
        </span>
        <span class="lr xxxs">F4</span>
      </button>
      <button type="button" class="btn-0">
        <span class="lr xxxs">F5</span>
      </button>
      <button type="button" class="btn-0">
        <span class="lr xxxs">F6</span>
      </button>
      <button type="button" class="btn-0">
        <span class="sm">
          <span class="left"></span>
          <span class="left"></span>
        </span>
        <span class="lr xxxs">F7</span>
      </button>
      <button type="button" class="btn-0">
        <span class="sm">
          <span class="right"></span>
          <span class="pause"></span>
        </span>
        <span class="lr xxxs">F8</span>
      </button>
      <button type="button" class="btn-0">
        <span class="sm">
          <span class="right"></span>
          <span class="right"></span>
        </span>
        <span class="lr xxxs">F9</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xs noxscale">
          <span class="emoji">&#128264;</span>
        </span>
        <span class="lr xxxs">F10</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xs noxscale">
          <span class="emoji">&#128265;</span>
        </span>
        <span class="lr xxxs">F11</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xs noxscale">
          <span class="emoji">&#128266;</span>
        </span>
        <span class="lr xxxs">F12</span>
      </button>
      <button type="button" class="btn-0">
        <span class="xs noxscale"></span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-1">
        <span class="lr xxxs">F13</span>
      </button>
      <button type="button" class="btn-1">
        <span class="lr xxxs">F14</span>
      </button>
      <button type="button" class="btn-1">
        <span class="lr xxxs">F15</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-1">
        <span class="lr xxxs">F16</span>
      </button>
      <button type="button" class="btn-1">
        <span class="lr xxxs">F17</span>
      </button>
      <button type="button" class="btn-1">
        <span class="lr xxxs">F18</span>
      </button>
      <button type="button" class="btn-1">
        <span class="lr xxxs">F19</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span class="sm">~<br/>`</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">!<br/>1</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">@<br/>2</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">#<br/>3</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">$<br/>4</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">%<br/>5</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">^<br/>6</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">&amp;<br/>7</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">*<br/>8</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">(<br/>9</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">)<br/>0</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">_<br/>-</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">+<br/>=</span>
      </button>
      <button type="button" class="btn-3">
        <span class="lr xs">delete</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span class="xs">fn</span>
      </button>
      <button type="button" class="btn-2">
        <span class="xs">home</span>
      </button>
      <button type="button" class="btn-2">
        <span class="xs">page up</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span class="xs">clear</span>
      </button>
      <button type="button" class="btn-2">
        <span>=</span>
      </button>
      <button type="button" class="btn-2">
        <span>/</span>
      </button>
      <button type="button" class="btn-2">
        <span>*</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-3">
        <span class="ll xs">tab</span>
      </button>
      <button type="button" class="btn-2">
        <span>Q</span>
      </button>
      <button type="button" class="btn-2">
        <span>W</span>
      </button>
      <button type="button" class="btn-2">
        <span>E</span>
      </button>
      <button type="button" class="btn-2">
        <span>R</span>
      </button>
      <button type="button" class="btn-2">
        <span>T</span>
      </button>
      <button type="button" class="btn-2">
        <span>Y</span>
      </button>
      <button type="button" class="btn-2">
        <span>U</span>
      </button>
      <button type="button" class="btn-2">
        <span>I</span>
      </button>
      <button type="button" class="btn-2">
        <span>O</span>
      </button>
      <button type="button" class="btn-2">
        <span>P</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">{<br/>[</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">}<br/>]</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">|<br/>\</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span class="xs noxpad">delete⌦</span>
      </button>
      <button type="button" class="btn-2">
        <span class="xs">end</span>
      </button>
      <button type="button" class="btn-2">
        <span class="xs">page down</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span>7</span>
      </button>
      <button type="button" class="btn-2">
        <span>8</span>
      </button>
      <button type="button" class="btn-2">
        <span>9</span>
      </button>
      <button type="button" class="btn-2">
        <span>-</span>
      </button>
    </div>
    <div class="row">
      <button type="button" id="caps-lock" class="btn-4" aria-pressed="false">
        <span class="ul xs dot-light" aria-hidden="true"></span>
        <span class="ll xs">caps lock</span>
      </button>
      <button type="button" class="btn-2">
        <span>A</span>
      </button>
      <button type="button" class="btn-2">
        <span>S</span>
      </button>
      <button type="button" class="btn-2">
        <span>D</span>
      </button>
      <button type="button" class="btn-2">
        <span>F</span>
        <span class="bump"></span>
      </button>
      <button type="button" class="btn-2">
        <span>G</span>
      </button>
      <button type="button" class="btn-2">
        <span>H</span>
      </button>
      <button type="button" class="btn-2">
        <span>J</span>
        <span class="bump"></span>
      </button>
      <button type="button" class="btn-2">
        <span>K</span>
      </button>
      <button type="button" class="btn-2">
        <span>L</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">:<br/>;</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">&quot;<br/>'</span>
      </button>
      <button type="button" class="btn-4">
        <span class="lr xs">return</span>
      </button>
    </div>
    <div class="row"></div>
    <div class="row">
      <button type="button" class="btn-2">
        <span>4</span>
      </button>
      <button type="button" class="btn-2">
        <span>5</span>
        <span class="bump"></span>
      </button>
      <button type="button" class="btn-2">
        <span>6</span>
      </button>
      <button type="button" class="btn-2">
        <span>+</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-5">
        <span class="ll xs">shift</span>
      </button>
      <button type="button" class="btn-2">
        <span>Z</span>
      </button>
      <button type="button" class="btn-2">
        <span>X</span>
      </button>
      <button type="button" class="btn-2">
        <span>C</span>
      </button>
      <button type="button" class="btn-2">
        <span>V</span>
      </button>
      <button type="button" class="btn-2">
        <span>B</span>
      </button>
      <button type="button" class="btn-2">
        <span>N</span>
      </button>
      <button type="button" class="btn-2">
        <span>M</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">&lt;<br/>,</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">&gt;<br/>.</span>
      </button>
      <button type="button" class="btn-2">
        <span class="sm">?<br/>/</span>
      </button>
      <button type="button" class="btn-5">
        <span class="lr xs">shift</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span>
          <span class="up"></span>
        </span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span>1</span>
      </button>
      <button type="button" class="btn-2">
        <span>2</span>
      </button>
      <button type="button" class="btn-2">
        <span>3</span>
      </button>
      <button type="button" class="btn-10">
        <span class="lr xs">enter</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-7">
        <span class="ll xs">control</span>
      </button>
      <button type="button" class="btn-6">
        <span class="ul xxs">alt</span>
        <span class="ll xs">option</span>
      </button>
      <button type="button" class="btn-7">
        <span class="ll xs">command</span>
        <span class="lr xs noxscale"></span>
      </button>
      <button type="button" class="btn-longest">
        <span></span>
      </button>
      <button type="button" class="btn-7">
        <span class="ll xs noxscale"></span>
        <span class="lr xs">command</span>
      </button>
      <button type="button" class="btn-6">
        <span class="ur xxs">alt</span>
        <span class="lr xs">option</span>
      </button>
      <button type="button" class="btn-7">
        <span class="lr xs">control</span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-2">
        <span>
          <span class="left"></span>
        </span>
      </button>
      <button type="button" class="btn-2">
        <span>
          <span class="down"></span>
        </span>
      </button>
      <button type="button" class="btn-2">
        <span>
          <span class="right"></span>
        </span>
      </button>
    </div>
    <div class="row">
      <button type="button" class="btn-9">
        <span>0</span>
      </button>
      <button type="button" class="btn-8">
        <span>.</span>
      </button>
    </div>
  </div>
</main>
*,
*:before,
*:after {
  border: 0;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
:root {
  font-size: 16px;
}
body,
button {
  font: 1em -apple-system, BlinkMacSystemFont,"Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
body {
  display: flex;
  height: 100vh;
}
button {
  background-color: hsl(0,0%,93%);
  border-radius: 0.125em;
  box-shadow:
    -0.2em -0.125em 0.125em hsla(0,0%,0%,0.25),
    0 0 0 0.04em hsla(0,0%,0%,0.3),
    0.02em 0.02em 0.02em hsla(0,0%,0%,0.4) inset,
    -0.05em -0.05em 0.02em hsla(0,0%,100%,0.8) inset;
  color: hsl(0,0%,47%);
  display: block;
  font-size: 1em;
  outline: transparent;
  position: relative;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  -webkit-tap-highlight-color: transparent;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;

  &:active {
    box-shadow:
      0.1em 0.1em 0.1em hsla(0,0%,0%,0.2),
      0 0 0 0.05em hsla(0,0%,0%,0.4),
      -0.025em -0.05em 0.025em hsla(0,0%,100%,0.8) inset;
  }
  &:focus-visible {
    background-color: hsl(0,0%,100%);
    color: hsl(0,0%,54%);
  }
  & span {
    display: inline-flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
  }
  & > span {
    margin: auto;
    padding: 0.2em 0.375em;
    position: absolute;
    top: 50%;
    left: 0;
    font-size: 0.5em;
    line-height: 2;
    transform: translateY(-50%) scaleX(0.875);
    width: 100%;
  }
  &[aria-pressed="true"] .dot-light {
    color: hsl(88,100%,50%);
    text-shadow: 0 0 2px hsl(88,100%,27%);
  }
}
main {
  display: flex;
  overflow: auto;
  padding: 4.5em;
  width: 100vw;
  height: 100vh;
}

/* Keyboard */
.keyboard {
  background-image: linear-gradient(90deg,hsl(0,0%,53%),hsl(0,0%,80%));
  border-radius: 0.5em;
  box-shadow:
    -1em -1em 1.5em hsla(0,0%,0%,0.6),
    0 0 0 1px hsl(0,0%,67%) inset;
  display: grid;
  gap: 0.375em 0.875em;
  grid: {
    template: {
      columns: 21.25em 4.125em 5.65em;
      rows: 0.75em 1.125em 1.125em 1.125em 1.125em 1.375em;
    };
  };
  font-size: 36px;
  margin: auto;
  padding: 0.25em;
  width: 33.25em;
  height: 9em;
}
.row {
  display: flex;
  gap: 0.35em;

  &:nth-of-type(14) {
    margin: auto;
  }
  &:nth-of-type(n + 14):nth-of-type(-3n + 17) {
    transform: translateY(0.25em);
  }
}
.bump {
  border-radius: 0.1em;
  box-shadow: -0.05em -0.02em 0 0.05em hsla(0,0%,0%,0.3);
  padding: 0;
  top: 85%;
  left: calc(50% - 0.4em);
  width: 0.8em;
  height: 0.15em;
}

/* Button size */
.btn {
  &-0 {
    width: 1.19em;
    height: 0.75em;
  }
  &-1 {
    width: 1.125em;
    height: 0.75em;
  }
  &-2 {
    width: 1.125em;
    height: 1.125em;
  }
  &-3 {
    width: 2em;
    height: 1.125em;
  }
  &-4 {
    width: 2.3em;
    height: 1.125em;
  }
  &-5 {
    width: 3.05em;
    height: 1.125em;
  }
  &-6 {
    width: 1.5625em;
    height: 1.375em;
  }
  &-7 {
    width: 1.8375em;
    height: 1.375em;
  }
  &-8 {
    width: 1.125em;
    height: 1.375em;
  }
  &-9 {
    width: 2.6875em;
    height: 1.375em;
  }
  &-10 {
    width: 1.125em;
    height: 2.875em;
  }
  &-longest {
    width: 8.625em;
    height: 1.375em;
  }
}

/* Button text alignment */
.ul,
.ll,
.ur,
.lr {
  top: 0;
  transform: scaleX(0.875);
}
.ul,
.ll {
  justify-content: flex-start;
  transform-origin: 0 50%;
}
.ur,
.lr {
  justify-content: flex-end;
  transform-origin: 100% 50%;
}
.ll,
.lr {
  top: auto;
  bottom: 0;
}
.noxscale {
  transform: translateY(-50%) scaleX(1);
}
.ll,
.lr {
  &.noxscale {
    transform: scaleX(1);
  }
}

/* Button font size */
.xxxs {
  font-size: 0.2em;
  line-height: 1.5;
}
.xxs {
  font-size: 0.25em;
  line-height: 1.5;
}
.xs {
  font-size: 0.3em;
  line-height: 1.125;
}
.sm {
  font-size: 0.4em;
  line-height: 1.25;
}

/* Icons */
.up,
.right,
.down,
.left {
  width: 0;
  height: 0;
  vertical-align: 0.1em;
}
.up {
  border: {
    left: 0.25em solid transparent;
    right: 0.25em solid transparent;
    bottom: 0.5em solid currentColor;
  };
}
.right {
  border: {
    left: 0.5em solid currentColor;
    top: 0.25em solid transparent;
    bottom: 0.25em solid transparent;
  };
}
.down {
  border: {
    left: 0.25em solid transparent;
    right: 0.25em solid transparent;
    top: 0.5em solid currentColor;
  };
}
.left {
  border: {
    right: 0.5em solid currentColor;
    top: 0.25em solid transparent;
    bottom: 0.25em solid transparent;
  };
}
.pause {
  border: {
    left: 0.2em solid;
    right: 0.2em solid;
  };
  vertical-align: 0.1em;
  width: 0.475em;
  height: 0.5em;
}
.emoji {
  filter: saturate(0);
  -webkit-filter: saturate(0);
}
.block {
  margin-left: 0.1em;
  height: 0.8em;
  width: 0.6em;
  vertical-align: 0.1em;
}
.cascade {
  position: relative;
  height: 1em;
  width: 1.2em;

  &:before,
  &:after {
    content: "";
    position: absolute;
    height: 0.45em;
    width: 0.8em;
  }
  &:before {
    top: 0;
    left: 0;
  }
  &:after {
    right: 0;
    bottom: 0;
  }
}
.block,
.cascade:before,
.cascade:after {
  border: 1px solid;
}
.apps {
  &:before,
  &:after {
    font-weight: bold;
    display: block;
    content: "\25A1\25A1\25A1";
    line-height: 0.875;
  }
}

/* Miscellaneous */
.noxpad {
  padding: 0.2em 0;
}

/* IE 11 fix */
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
  button:not(:last-of-type) {
    margin-right: 0.35em;
  }
  .keyboard {
    display: -ms-grid;
    grid-gap: 0.375em 0.875em;
    -ms-grid-columns: 22.125em 5em 5.75em;
    -ms-grid-rows: 1.125em 1.5em 1.5em 1.5em 1.5em 1.375em;
  }
  .row {
    &:nth-child(3n + 2) {
      -ms-grid-column: 2;
    }
    &:nth-child(3n + 3) {
      -ms-grid-column: 3;
    }
    &:nth-child(n + 4):nth-child(-n + 6) {
      -ms-grid-row: 2;
    }
    &:nth-child(n + 7):nth-child(-n + 9) {
      -ms-grid-row: 3;
    }
    &:nth-child(n + 10):nth-child(-n + 12) {
      -ms-grid-row: 4;
    }
    &:nth-child(n + 13):nth-child(-n + 15) {
      -ms-grid-row: 5;
    }
    &:nth-child(n + 16) {
      -ms-grid-row: 6;
    }
    &:nth-of-type(14) button {
      transform: translateX(-0.5em);
    }
  }
}
View Compiled
// caps lock key
document.addEventListener("DOMContentLoaded", function() {
  const capsLock = document.getElementById("caps-lock");
  capsLock?.addEventListener("click", function() {
    const pressed = this.ariaPressed === "true";
    this.setAttribute("aria-pressed",!pressed);
  });
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.