Search code examples
htmlcsssvgcss-shapes

How can I add a colored shadow at the right inside of my hexagon?


Thankfully I've found a hexagon on SO but now I've a problem. The hexagon can be filled with any color - currently orange but I need to fill it with a color and a shadow:

<svg viewBox="0 0 180 100" style="width:180px;height:130px">
  <defs>
    <clipPath id="hexagon_clip">
      <path id="hexagon" d="M38,2 
           L82,2 
           A12,12 0 0,1 94,10 
           L112,44 
           A12,12 0 0,1 112,56
           L94,90       
           A12,12 0 0,1 82,98
           L38,98
           A12,12 0 0,1 26,90
           L8,56
           A12,12 0 0,1 8,44
           L26,10
           A12,12 0 0,1 38,2" />
    </clipPath>
  </defs>
  <use xlink:href="#hexagon" x="0" y="0" stroke="orange" stroke-width="12" fill="transparent" />
</svg>

This is my current example I want to re-build:

enter image description here

So my goal is it to pass a color hex code at the end. Is this possible or not?

With colored shadow I mean the darker color at the right inside of each hexagon. Sorry for being to unclear!


Solution

  • I will consider a different hexagon taken from this answer then as a background coloration I will use two layers, the main color and the gradient to simulate the shadow:

    .hex {
      width: 200px;
      display: inline-block;
      color:orange;
      position:relative;
      filter: url('#goo'); /* to get the rounded edge */
    }
    .hex::before,
    .hex::after { /* the polygon shape */
      clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
      display:flex;
    }
    .hex::before{
      content: "";
      background:
        linear-gradient(50deg,transparent 10px, rgba(0,0,0,0.2) 0 calc(100% - 45px),transparent calc(100% - 44px)) 
        100% 100%/ 70% 89% no-repeat, 
        currentColor; /* Use the color defined by "color" */
      padding-top: 86.6%; /* 100%*cos(30) */
    }
    .hex::after {
      content: attr(data-text);
      font-size:80px;
      position:absolute;
      top:18px;
      left:18px;
      right:18px;
      bottom:18px;
      background:#fff; /* this should match the main background */
      align-items:center;
      justify-content:center;
    }
    <div class="hex" data-text="01"></div>
    <div class="hex" data-text="02" style="color:pink;filter:none"></div>
    <div class="hex" data-text="03" style="color:lightblue"></div>
    
    
    <svg style="visibility: hidden; position: absolute;" width="0" height="0" xmlns="http://www.w3.org/2000/svg" version="1.1">
      <defs>
            <filter id="goo"><feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur" />    
                <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 19 -9" result="goo" />
                <feComposite in="SourceGraphic" in2="goo" operator="atop"/>
            </filter>
        </defs>
    </svg>