<ul>
  <li>
    <a href="#">
      <i class="ai-home"></i>
      <span>Dashboard</span>
    </a>
  </li>
  <li>
    <a href="#">
      <i class="ai-image"></i>
      <span>Images</span>
    </a>
  </li> 
  <li>
    <a href="#">
      <i class="ai-file"></i>
      <span>Files</span>
    </a>
  </li>
  <li>
    <a href="#">
      <i class="ai-game-controller"></i>
      <span>Games</span>
    </a>
  </li> 
  <li>
    <a href="#">
      <i class="ai-book-open"></i>
      <span>Books</span>
    </a>
  </li>
  <li>
    <a href="#">
      <i class="ai-bell"></i>
      <span>Notifications</span>
    </a>
  </li>
  <li>  
    <a href="#">
      <i class="ai-gear"></i>
      <span>Settings</span>
    </a>
  </li>
  <li>
    <a href="#">
      <i class="ai-person"></i>
      <span>Profile</span>
    </a>
  </li>
</ul>

<details>
  <summary>How it works<i class="ai-question-fill"></i></summary>
  <div>
      <p>Inside each <code>&lt;a&gt;</code> element there's a hidden (using transform and opacity) <code>&lt;span&gt;</code> containing the text. Like this: </p>
    <p><pre><code>a span { 
&nbsp;position: absolute;
&nbsp;left: calc(100% + 1.5rem); //Moves it all the way to the right
&nbsp;
&nbsp;opacity: 0;
&nbsp;transform: scale(0);
&nbsp;transform-origin: center left;
&nbsp;transition: .15s ease;
}</code></pre> </p>
<p>On hover or focus this span becomes visible through a transition of both transform and opacity. Like this:</p>
<p><pre><code>a:hover span, a:focus span { 
&nbsp;opacity: 1;
&nbsp;transform: scale(1);
}</code></pre> </p>
  <p>The <code>&lt;span&gt;</code> also has a psuedo-element in the shape of a rectangle, but rotated 45 degrees to make it look like a triangle. See the code for more details.</p>
  </div>
</details>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');

*, *:after, *:before {
  box-sizing: border-box;
}

body {
  font-family: "Inter", sans-serif;
  line-height: 1.5;
  min-height: 100vh;
  display: flex; 
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding-top: 5vh;
  padding-bottom: 5vh;
  background-color: #f2f5f7;
}

 

ul { 
  list-style: none;
  margin: 0;
  padding: 0;
  margin-left: auto; 
  margin-right: auto;
  background-color: #05043e;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: .75rem;
  border-radius: 10px;
  box-shadow: 0 10px 50px 0 rgba(#05043e, .25);
}

li:nth-child(6) {
  margin-top: 5rem; 
  padding-top: 1.25rem;
  border-top: 1px solid #363664;
}

li + li {
  margin-top: .75rem;
}

a {
  color: #FFF; 
  text-decoration: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  border-radius: 8px;
  position: relative;
  &:hover, &:focus, &.active {
    background-color: #30305a;
    outline: 0;
    
    span { 
      transform: scale(1);
      opacity: 1;
    }
  }
  
  i {
    font-size: 1.375rem;
  }
  
  span {
    position: absolute;
    background-color: #30305a;
    white-space: nowrap;
    padding: .5rem 1rem;
    border-radius: 6px;
    left: calc(100% + 1.5rem);
    transform-origin: center left;
    transform: scale(0);
    opacity: 0;
    transition: .15s ease;
    &:before {
      content: "";
      display: block;
      width: 12px;
      height: 12px;
      position: absolute;
      background-color: #30305a;
      left: -5px;
      top: 50%;
      transform: translatey(-50%) rotate(45deg);
      border-radius: 3px;
    }
  }
  

}

details {
  position: fixed;
  right: 1rem;
  bottom: 1rem;
  margin-top: 2rem;
  color: #05043e; 
  display: flex;
  flex-direction: column;

  div {
    background-color: #fff;
    box-shadow: 0 5px 10px rgba(#000, 0.15);
    padding: 1.25rem;
    border-radius: 8px;
    position: absolute;
    max-height: calc(100vh - 100px);
    width: 400px;
    max-width: calc(100vw - 2rem);
    bottom: calc(100% + 1rem);
    right: 0;
    overflow: auto;
    transform-origin: 100% 100%;
    &::-webkit-scrollbar {
      width: 15px;
      background-color:#fff;
    }

    &::-webkit-scrollbar-thumb {
      width: 5px;
      border-radius: 99em;
      background-color: #ccc;
      border: 5px solid #fff;
    }
    & > * + * {
      margin-top: 0.75em;
    }

    p > code {
      font-size: 1rem;
      font-family: monospace;
      color: #185adb;
      font-weight: 600;
    }

    pre {
      white-space: pre-line;
      background-color: #f9f9f9;
      border: 1px solid #95a3b9;
      border-radius: 6px;
      font-family: monospace;
      padding: 0.75em;
      font-size: 0.875rem;
      // color: #fff;
    }
  }

  &[open] div {
    animation: scale 0.25s ease;
  }
}

summary {
  display: inline-flex;
  margin-left: auto;
  margin-right: auto;
  justify-content: center;
  align-items: center;
  font-weight: 600;
  padding: 0.625em 1.25em .625em 1.25em;
  border-radius: 99em;
  color: #fff;
  background-color: #185adb;
  box-shadow: 0 5px 15px rgba(#000, 0.1);
  list-style: none;
  text-align: center;
  cursor: pointer;
  transition: 0.15s ease;
  position: relative;
  &::-webkit-details-marker {
    display: none;
  }

  &:hover,
  &:focus {
    background-color: mix(#000, #185adb, 20%);
    // color: #6366f1;
  }

  i {
    font-size: 1.375em;
    margin-left: .25em;
  }
}

@keyframes scale {
  0% {
    transform: scale(0);
  }
  100% {
    transform: scale(1);
  }
}

View Compiled
// The script for the icon font from https://akaricons.com/ is in this pen's JS settings

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://unpkg.com/akar-icons-fonts