<svg class="background" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1009.8 705.5">
  <polygon points="1009.8 0 504.1 704.2 1009.8 704.2 1009.8 0"/>
  <polygon fill="#fcfafa" points="0 705.5 979.6 705.5 0 23.5 0 705.5"/>
</svg>

<div id="app"></div>
@font-face {
    font-family: 'arconregular';
    src: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/arcon-regular-webfont.eot');
    src: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/arcon-regular-webfont.eot?#iefix') format('embedded-opentype'),
         url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/arcon-regular-webfont.woff2') format('woff2'),
         url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/arcon-regular-webfont.woff') format('woff'),
         url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/arcon-regular-webfont.ttf') format('truetype'),
         url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/arcon-regular-webfont.svg#arconregular') format('svg');
    font-weight: normal;
    font-style: normal;
}

html, body {
  background: #EAEDEF;
  width: 100%;
  height: 100%;
  font-family: 'arconregular', sans-serif;
  font-size: 12px;
  -webkit-overflow-scrolling: touch;
  overflow: auto;
}

.container-fluid {
  margin-bottom: 25px;
  -webkit-overflow-scrolling: touch;
  overflow: auto;
  position: relative;
}

.itals {
  font-family: 'Crimson Text', serif;
  font-style: italic;
}

h3 {
  font-size: 25px;
  padding-bottom: 1px !important;
  margin: 12px 0 8px 12px !important;
}

.pR {
  position: relative;
}

.stripe-vt {
  position: absolute;
  left: 50%;
  height: 110%;
  border-left: 2px solid #000;
  width: 1px;
}

.stripe-hz {
  position: absolute;
  width: 100%;
  top: 400px;
  height: 1%;
  border-top: 2px solid #898989;
  z-index: 40;
  opacity: 0.75;
}

.background {
  position: absolute;
  width: 100%;
  height: 110%;
}

.printArea {
  border: 2px solid #000;
  margin: 25px 0;
  .printrow {
    display: flex;
    flex-flow: row wrap;
    >div {
      border: 1px solid #000;
      padding: 5px;
    }
  }
}

.lg-top {
  width: 60%;
}

.sm-top {
  width: 40%;
}

.sm-bot {
  width: 50px;
}

.lg-bot {
  float: left;
  width: calc(100% - 50px);
  padding: 0 !important;
  .two-print-rows {
    .tr {
      padding: 5px;
    }
    .first {
      border-bottom: 2px solid;
      height: 32px;
    }
  }
}

@mixin photoCol($height) {
  width: 100%;
  height: $height;
  margin-top: 25px;
  background-size: cover !important;
}

.long {
  @include photoCol(300px);
}

.short {
  @include photoCol(100px);
}

h2 {
  font-size: 15px;
  border-top: 2px solid;
  border-bottom: 2px solid;
  padding: 8px 0 5px;
  text-transform: uppercase;
  letter-spacing: 0.1em;
}

.long1 {
  background: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/gugg.jpg") no-repeat 15% top;
}

.long2 {
  background: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/ramp.jpg") no-repeat center center;
  margin-top: 200px;
}

.long3 {
  background: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/window.jpg") no-repeat bottom left;
}

.long4 {
  background: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/gugg.jpg") no-repeat center top;
  margin-top: 200px;
}

.short1 {
  background: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/spike.jpg") no-repeat center center;
}

.short2 {
  background: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/ramp.jpg") no-repeat bottom right;
}

@media screen and (min-width:600px) {
  .long {
    height: 300px !important;
  }

  .short {
    height: 150px !important;
  }
}

@media screen and (max-width:750px) {
  .stripe-hz {
    border-top: none !important;
  }
}

button.slide {
  border: 2px solid;
  padding: 6px 20px 5px;
}

@mixin circles($size, $top, $padding) {
  width: $size;
  height: $size;
  position: absolute;
  top: $top;
  left: calc(50% - (#{$size}/2));
  border-radius: 50%;
  z-index: 500;
  text-align: center;
  padding: $padding;
}

.circ-lg {
  @include circles(100px, 25px, 0);
  border: 1px solid #ccc;
}

.circled {
  animation: circlesMove 0.7s 3s ease both;
  @include circles(90px, 30px, 23px 0 0 0px);
  border: 1px solid #000;
  transform-origin: 50% 50%;
  transition: all 0.3s ease;
   h1 {
    margin-top: 2px;
    font-size: 28px;
    letter-spacing: 0.1em;
  }
  &.c1 {
    background: #EAEDEF;
    color: #000;
  }
  &.c2 {
    background: #FCFAFA;;
    color: #000;
  }
  &.c3 {
    background: #FCFAFA;
    color: #000;
  }
  &.c4 {
    background: #000000;
    color: #FCFAFA;
    border: 1px solid #777;
  }
  &.back {
    background: black;
    color: white;
  }
  &.grey {
    background: #EAEDEF;
    color: black;
  }
}

@media screen and (min-width:750px) {
  .mt {
    margin-top: 150px !important;
  }
  .circ-lg {
    @include circles(140px, 330px, 0);
  }
  .circled {
    @include circles(130px, 335px, 37px);
    h1 {
      font-size: 35px;
      margin-top: 5px !important;
      letter-spacing: 0.1em;
    }
  }
  .circleMove {
    @include circles(130px, 335px, 37px);
  }
}

.slide {
  position: relative;
  background: transparent;
  -webkit-transition: .3s ease;
  transition: .3s ease;
  z-index: 1;
  backface-visibility: hidden;
  perspective: 1000px;
  transform: translateZ(0);
  cursor: pointer;

  &:hover {
    color: #fff;
  }

  &:hover:before {
    right: -1px;
  }
}

.slide::before {
  content: "";
  display: block;
  position: absolute;
  background: #000;
  transition: right .3s ease;
  z-index: -1;
  top: -2px;
  bottom: -2px;
  left: -2px;
  right: 108%;
  backface-visibility: hidden;
}

.short, .long {
  border: 6px solid black;
}

.grey {
  color: #8F8F8F;
  margin-bottom: 30px;
  button.slide {
    border: 2px solid #8F8F8F;
  }
  .slide::before {
    background: #8F8F8F;
  }
}

@media screen and (max-width:750px) {
  .sm-grey {
    color: #8F8F8F;
    margin-bottom: 30px;
    button.slide {
      border: 2px solid #8F8F8F;
    }
    .slide::before {
      background: #8F8F8F;
    }
  }
  .circled.back {
    padding-top: 28px !important;
  }
}

.circ-lg, .circled {
  transform-style: preserve-3d;
}

.circ-lg {
  transition: 0.5s transform ease;
  z-index: 1000;
  cursor: pointer;
}

.circled {
  transition: 0.5s transform ease;
}

.front {
	backface-visibility: hidden;
}

.circled.circle-svg {
  padding: 0 !important;
}
View Compiled
const { Component, Children, PropTypes } = React
const { StaggeredMotion, Motion, spring } = ReactMotion

//Circled
const Circled = React.createClass({
  getInitialState() {
    return {open: false, opacity: 1};
  },

  handleMouseOver() {
    this.setState({open: !this.state.open});
  },

  handleTouchStart(e) {
    e.preventDefault();
    this.handleMouseOver();
  },
  
  getStyles(prevStyles) {
    // we're using the previous style to update the next ones placement
    const endValue = prevStyles.map((_, i) => {
      let staggerStiff = 100, staggerDamp = 19;
      return i === 0
        ? { opacity: spring(this.state.open ? 0 : 1, {stiffness: staggerStiff, damping: staggerDamp}) }
        : { opacity: spring(this.state.open ? 0 : 1, {stiffness: (staggerStiff - (i * 7)), damping: staggerDamp + (i * 0.2)}) }
    });
    return endValue;
  },

  render() {
    const circNum = this.props.circNum || 5,
          classNum = this.props.classNum || "c1",
          circBk = this.props.circBk || "black",
          pathColor = this.props.pathColor || "#eaedef",
          settings = {stiffness: 200, damping: 20};

    const pathData = ["M48.8,0A48.8,48.8,0,1,0,97.6,48.8,48.8,48.8,0,0,0,48.8,0Zm0,88.6A39.8,39.8,0,1,1,88.6,48.8,39.8,39.8,0,0,1,48.8,88.6Z",
          "M48.8,9.1A39.8,39.8,0,1,0,88.6,48.8,39.8,39.8,0,0,0,48.8,9.1Zm0,67.9A28.1,28.1,0,1,1,77,48.8,28.1,28.1,0,0,1,48.8,77Z",
          "M48.8,20.7A28.1,28.1,0,1,0,77,48.8,28.1,28.1,0,0,0,48.8,20.7Zm0,50.1a22,22,0,1,1,22-22A22,22,0,0,1,48.8,70.8Z",
          "M48.8,26.8a22,22,0,1,0,22,22A22,22,0,0,0,48.8,26.8Zm0,39.1A17.1,17.1,0,1,1,66,48.8,17.1,17.1,0,0,1,48.8,66Z",
          "M48.8,31.7A17.1,17.1,0,1,0,66,48.8,17.1,17.1,0,0,0,48.8,31.7Zm0,29A11.9,11.9,0,1,1,60.7,48.8,11.9,11.9,0,0,1,48.8,60.7Z",
          "M48.8,36.9A11.9,11.9,0,1,0,60.7,48.8,11.9,11.9,0,0,0,48.8,36.9Zm0,19.9a8,8,0,1,1,8-8A8,8,0,0,1,48.8,56.8Z",
          "M48.8,40.8a8,8,0,1,0,8,8A8,8,0,0,0,48.8,40.8Zm0,12.6a4.6,4.6,0,1,1,4.6-4.6A4.6,4.6,0,0,1,48.8,53.5Z",
          "M48.8,44.2a4.6,4.6,0,1,0,4.6,4.6A4.6,4.6,0,0,0,48.8,44.2Zm0,7.1a2.5,2.5,0,1,1,2.5-2.5A2.5,2.5,0,0,1,48.8,51.3Z",
          "M51.3 48.8c0 1.38-1.12 2.5-2.5 2.5s-2.5-1.12-2.5-2.5 1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5z"]
    
    let arr = [];
    for (var i = 0; i < pathData.length; i++) {
      arr.push({opacity: 1});
    }
  
    return (
      <div onClick={this.handleMouseOver}
           onTouchStart={this.handleTouchStart}
           className="circ-contain">

       <div className="circ-lg"></div>
        <div className={"circled back " + circBk}>
          Lorem Ipsum Dolor Sit
        </div>
          <div>


         <svg className="circled circle-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 97.6 97.6">
              <StaggeredMotion
                defaultStyles = {arr} 
                styles={this.getStyles}>
                {circ =>
                  <g fill={pathColor} className="cPath">
                    {circ.map(({opacity}, i) =>
                      <path
                        key={i}
                        d={pathData[i]}
                        className={`things s${i}`}
                        style={{
                          opacity: opacity
                        }} />
                    )}
                  </g>
                }
              </StaggeredMotion>
          </svg>

            <Motion style={{
            op: spring(this.state.open ? 0 : 1, settings)
              }}>
              {({op}) =>

              <div className={"circled front " + classNum}
                style={{
                    opacity: op
                  }}>
                <span className="itals">Printed</span>
                <h1>{circNum}</h1>
              </div>
              }
            </Motion>
            
        </div>
      </div>
    );
  },
});

//App
const App = React.createClass({
 render() {
   return (
     <div>
       <div className="pR">
          <div className="stripe-vt"></div>
          <div className="stripe-hz"></div>
       </div>
       
       <div className="container-fluid">
          <div className="row">
            <ColumnOne />
            <ColumnTwo />
            <ColumnThree />
            <ColumnFour />
          </div>
       </div>
     </div>
   )
 }
})

//ColumnOne
const ColumnOne = React.createClass({
 render() {
   return (
      <div className="column 
                col-xs-16 col-xs-offset-3
                col-sm-8 col-sm-offset-2 
                col-md-8 col-md-offset-2">
      <Picture />
      <Circled />
      <PrintArea margin="mt"/>
      <Picture length="short"/>
    </div>
   )
 }
})

//ColumnTwo
const ColumnTwo = React.createClass({
 render() {
   return (
      <div className="column 
                col-xs-16 col-xs-offset-2
                col-sm-8 col-sm-offset-1
                col-md-8 col-md-offset-1">
      
       <Circled classNum="c2" circNum="36"/>
      <Picture picNum="2" />
      <Text />
    </div>
   )
 }
})

//ColumnThree
const ColumnThree = React.createClass({
 render() {
   return (
      <div className="column 
                col-xs-16 col-xs-offset-3
                col-sm-8 col-sm-offset-2
                col-md-8 col-md-offset-2">
      
      <Circled classNum="c3" circNum="12"/>
      <Picture length="short" picNum="2" />
      <PrintArea />
      <Picture picNum="3" margin="mt"/>
    </div>
   )
 }
})

//ColumnFour
const ColumnFour = React.createClass({
 render() {
   return (
      <div className="column 
                col-xs-16 col-xs-offset-2
                col-sm-8 col-sm-offset-1
                col-md-8 col-md-offset-1">
      
      <Circled classNum="c4" circNum="2" circBk="grey" pathColor="black"/>
      <Picture picNum="4" />
      <Text grey="grey"/>
    </div>
   )
 }
})

// Text
function Text(props) {
  const grey = props.grey || "sm-grey";
  
  return (
    <div className={grey}>
      <h2>Lorem Ipsum</h2>
      <p>Man braid iPhone locavore hashtag pop-up, roof party forage heirloom chillwave brooklyn yr 8-bit gochujang blog. Gastropub locavore crucifix.</p>
      <button className="slide">See More ⟶</button>
    </div>
  )
}

// Picture
function Picture(props) {
  const picNum = props.picNum || 1,
        length = props.length || "long",
        margin = props.margin || "";
  
  return (
    <div className={length + " " + length + picNum + " " + margin}>
    </div>
  )
}

// PrintArea
function PrintArea(props) {
  const margin = props.margin || "";
  
  return (
      <div className={"printArea " + margin}>
        <div className="printrow">
          <div className="lg-top slide">
            <span className="itals">Date </span>
            Picture
          </div>
          <div className="sm-top slide">
            Picture
          </div>
        </div>
        <div className="printrow">
          <div className="sm-bot slide">
             <h3>6</h3>
          </div>
          <div className="lg-bot">
            <div className="two-print-rows">
              <div className="first tr slide">
                Info
              </div>
              <div className="tr slide">
                <span className="itals">Date </span>
                Picture
              </div>
            </div>
          </div>
        </div>
      </div>
  )
}

React.render(<App/>, document.querySelector("#app"));
View Compiled

External CSS

  1. https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/custom40.min.css

External JavaScript

  1. https://fb.me/react-with-addons-0.14.0.js
  2. https://npmcdn.com/react-motion/build/react-motion.js