input[id^=postcard-] {
  display: none;
  width: 0;
  height: 0;
  overflow:hidden;
  visibility: hidden;

  &:checked ~ label .postcard  {
    --flip: 180deg;
  }
}

.postcard {
  aspect-ratio: var(--aspect-ratio);
  position: relative;
  box-sizing: border-box;
  display: flex;
  flex-direction: row;
  align-items: center;

  --flip: 0deg;
  --p: perspective(1000px);
  --v1: calc(min(1, max(0,
    cos(var(--flip)),
    cos(var(--flip) + 180deg),
    tan(45deg + var(--flip)/2),
    tan(135deg + var(--flip)/2)
  )) * 192 + 64);
  --v2: calc(min(1, max(0,
    cos(var(--flip)),
    cos(var(--flip) + 180deg),
    tan(45deg - var(--flip)/2),
    tan(135deg - var(--flip)/2)
  )) * 192 + 64);
  --offset: translate(0px, 0px);

  .shadow {
    width: 90%;
    margin: 5%;
    aspect-ratio: var(--aspect-ratio);
    position: absolute;
    z-index: 0;
    transform-style: preserve-3d;
    background: rgb(0, 0, 0, 0.1) !important;
    box-shadow: 0px 0px 45px 45px rgb(0, 0, 0, 0.1);
    --offset: translate(40px, 40px);
  }

  &::before, &::after {
    content: '';
    width: 100%;
    aspect-ratio: var(--aspect-ratio);
    position: absolute;
    box-sizing: inherit;
    display: flex;
    align-items: center;
    justify-content: center;
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
    transform-style: preserve-3d;
    background-blend-mode: multiply;
    z-index: 2;
  }

  &.portrait {
    flex-direction: column;
  
    .shadow {
      width:auto;
      height:90%;
      margin: 5%;
    }

    &::before, &::after {
      width:auto;
      height:100%;
    }
  }

  &::after {
    background: no-repeat top/100%;
    mask: var(--postcard) top/100%;
  }
  
  &::before {
    background: no-repeat bottom/100%;
    mask: var(--postcard) bottom/100%;
  }

  &::before, &::after, .shadow {
    transition: transform 1s ease-in-out;
  }

  /* TODO: Does this break accessibility? */
  img {
    display: none;
  }

  &.left-hand,&.right-hand {
    aspect-ratio: 1/1;
  }

  &.flip-book::after,&.flip-book .shadow {
    transform: var(--p) var(--offset) rotateY(var(--flip));
    background-image: linear-gradient(to right,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }
  &.flip-book::before {
    transform: var(--p) rotateY(calc(var(--flip) + 180deg));
    background-image: linear-gradient(to right,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }

  &.flip-calendar::after,&.flip-calendar .shadow {
    transform: var(--p) var(--offset) rotateX(var(--flip));
    background-image: linear-gradient(to top,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }
  &.flip-calendar::before {
    transform: var(--p) rotateX(calc(var(--flip) + 180deg));
    background-image: linear-gradient(to top,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }
  
  &.flip-right-hand::after,&.flip-right-hand .shadow {
    transform: var(--p) var(--offset) rotate3d(1,1,0,var(--flip));
    background-image: linear-gradient(to top right,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }
  &.flip-right-hand::before {
    transform: var(--p) rotate3d(1,1,0,calc(var(--flip) + 180deg)) rotate(-90deg);
    background-image: linear-gradient(to bottom right,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }
  
  &.flip-left-hand::after,&.flip-left-hand .shadow {
    transform: var(--p) var(--offset) rotate3d(-1,1,0,var(--flip));
    background-image: linear-gradient(to bottom right,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }
  &.flip-left-hand::before {
    transform: var(--p) rotate3d(-1,1,0,calc(var(--flip) + 180deg)) rotate(90deg);
    background-image: linear-gradient(to top right,
        rgb(var(--v1), var(--v1), var(--v1)),
        rgb(var(--v2), var(--v2), var(--v2))
      ), var(--postcard);
  }
}
