Recreation of No Questions Asked form
http://www.noquestionsasked.nyc/challengers/new
plus MAGIC FOCUS
Haml & Sass & CoffeeScript
A Pen by Michal Niewitala 🍋 on CodePen.
| %form.form{action: ''} | |
| %p.field.required | |
| %label.label.required{for: 'name'} Full name | |
| %input.text-input#name{type: 'text', name: 'name', required: true, value: 'Use Tab'} | |
| %p.field.required.half | |
| %label.label{for: 'email'} E-mail | |
| %input.text-input#email{type: 'email', name: 'email', required: true} | |
| %p.field.half | |
| %label.label{for: 'phone'} Phone | |
| %input.text-input#phone{type: 'phone', name: 'phone'} | |
| %p.field.half.required.error | |
| %label.label{for: 'login'} Login | |
| %input.text-input#login{type: 'text', name: 'login', required: true, value: 'mican'} | |
| -# %span.message Already taken | |
| %p.field.half.required | |
| %label.label{for: 'password'} Password | |
| %input.text-input#password{type: 'password', name: 'password', required: true} | |
| %div.field | |
| %label.label Sport? | |
| %ul.checkboxes | |
| - %w(Football Basketball Volleyball Golf Swimming).each_with_index do |item,i| | |
| %li.checkbox | |
| %input.checkbox-input{name: 'choice', type: 'checkbox', value: i, id: "choice-#{i}"}/ | |
| %label.checkbox-label{:for => "choice-#{i}"}= item | |
| %div.field | |
| %label.label Favourite JS framework | |
| %ul.options | |
| - %w(React Vue Angular Riot Polymer Ember Meteor Knockout).each_with_index do |item,i| | |
| %li.option | |
| %input.option-input{name: 'option', type: 'radio', value: i, id: "option-#{i}"}/ | |
| %label.option-label{:for => "option-#{i}"}= item | |
| %p.field | |
| %label.label{for: "about"} About | |
| %textarea.textarea#about{cols: 50, name: "about", rows: 4} | |
| %p.field.half | |
| %label.label{for: "select"} Position | |
| %select#select.select | |
| %option{value: '', selected: true} | |
| %option{value: "ceo"} CEO | |
| %option{value: "front-end"} Front-end developer | |
| %option{value: "back-end"} Back-end developer | |
| %p.field.half | |
| %input.button{type: "submit", value: "Send"} |
Recreation of No Questions Asked form
http://www.noquestionsasked.nyc/challengers/new
plus MAGIC FOCUS
Haml & Sass & CoffeeScript
A Pen by Michal Niewitala 🍋 on CodePen.
| class magicFocus | |
| constructor: (@parent) -> | |
| return unless @parent | |
| @focus = document.createElement 'div' | |
| @focus.classList.add 'magic-focus' | |
| @parent.classList.add 'has-magic-focus' | |
| @parent.appendChild @focus | |
| for input in @parent.querySelectorAll('input, textarea, select') | |
| input.addEventListener 'focus', -> | |
| window.magicFocus.show() | |
| input.addEventListener 'blur', -> | |
| window.magicFocus.hide() | |
| show: => | |
| return unless ['INPUT','SELECT','TEXTAREA'].includes? (el = document.activeElement).nodeName | |
| clearTimeout(@reset) | |
| el = document.querySelector("[for=#{el.id}]") if ['checkbox', 'radio'].includes? el.type | |
| @focus.style.top = "#{el.offsetTop||0}px" | |
| @focus.style.left = "#{el.offsetLeft||0}px" | |
| @focus.style.width = "#{el.offsetWidth||0}px" | |
| @focus.style.height = "#{el.offsetHeight||0}px" | |
| hide: => | |
| @focus.style.width = 0 unless ['INPUT','SELECT','TEXTAREA', 'LABEL'].includes? (el = document.activeElement).nodeName | |
| @reset = setTimeout -> | |
| window.magicFocus.focus.removeAttribute('style') | |
| , 200 | |
| # initialize | |
| window.magicFocus = new magicFocus document.querySelector('.form') | |
| $ -> | |
| $('.select').customSelect() |
| <script src="https://codepen.io/mican/pen/XgRmNr"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.customSelect/0.5.1/jquery.customSelect.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> |
| // colors | |
| $bg: #111111 | |
| $vibrant: #E8474C | |
| $text: white | |
| $label: white | |
| $border: transparent | |
| $static: #222222 | |
| $focus: #4E4E4E | |
| $active: white | |
| $inactive: #4E4E4E | |
| $error: #E8474C | |
| html | |
| -webkit-font-smoothing: antialiased | |
| body | |
| background-color: $bg | |
| font-family: 'Titillium Web', sans-serif | |
| @media screen and (min-width: 40em) | |
| font-size: 1.25em | |
| %block | |
| padding: .75em 1em | |
| appearance: none | |
| outline: none | |
| line-height: normal | |
| border-radius: 0 | |
| border: none | |
| background: none | |
| display: block | |
| %label | |
| @extend %block | |
| font-weight: bold | |
| color: $label | |
| padding: | |
| top: 0 | |
| left: 0 | |
| letter-spacing: .025em | |
| font-size: 1.125em | |
| line-height: 1.25 | |
| position: relative | |
| z-index: 100 | |
| .required &:after | |
| content: '\0020*' | |
| color: $error | |
| font-weight: normal | |
| font-size: .75em | |
| vertical-align: top | |
| =stripes($color1: #555, $color2: transparent, $angle: 0deg, $stripe1-width: 25px, $stripe2-width: null) | |
| @if $stripe2-width == null | |
| $stripe2-width: $stripe1-width | |
| $tile-size: ($stripe1-width + $stripe2-width) * 2 | |
| $stripe2-start: $stripe1-width / $tile-size * 100% | |
| $stripe3-start: $stripe2-start + $stripe2-width / $tile-size * 100% | |
| $stripe4-start: $stripe3-start + $stripe1-width / $tile-size * 100% | |
| background-size: $tile-size $tile-size | |
| background-image: linear-gradient($angle, $color1, $color1 $stripe2-start, $color2 $stripe2-start, $color2 $stripe3-start, $color1 $stripe3-start, $color1 $stripe4-start, $color2 $stripe4-start, $color2) | |
| background-repeat: repeat | |
| %input | |
| @extend %block | |
| font: inherit | |
| line-height: normal | |
| width: 100% | |
| box-sizing: border-box | |
| background: $static | |
| color: white | |
| position: relative | |
| &:placeholder | |
| color: $label | |
| &:-webkit-autofill | |
| box-shadow: 0 0 0px 1000px $bg inset | |
| -webkit-text-fill-color: white | |
| border-top-color: $bg | |
| border-left-color: $bg | |
| border-right-color: $bg | |
| &.required, &[required] | |
| &:not(:focus):not(:active) | |
| &.error, .error & | |
| +stripes(rgba($vibrant,.5), transparent, 135deg, 2px, 2px) | |
| &:active, &:focus | |
| .form:not(.has-magic-focus) & | |
| background: $focus | |
| %error | |
| @extend %block | |
| // color: red | |
| position: absolute | |
| bottom: 0 | |
| right: 0 | |
| z-index: 100 | |
| font-size: .625em | |
| color: $label | |
| %checkbox | |
| border: 0 | |
| clip: rect(0 0 0 0) | |
| height: 1px | |
| margin: -1px | |
| overflow: hidden | |
| padding: 0 | |
| position: absolute | |
| width: 1px | |
| + label | |
| @extend %input | |
| display: inline-block | |
| width: auto | |
| color: $inactive | |
| position: relative | |
| user-select: none | |
| cursor: pointer | |
| &:focus, &:active | |
| + label | |
| color: $focus | |
| &:checked | |
| + label | |
| color: $active | |
| // &:focus, &:active | |
| // + label:before | |
| // box-shadow: inset 0px 0px 0px .5em $focus | |
| // color: $active | |
| %option | |
| + label | |
| // &:before | |
| // border-radius: 50% | |
| // &:after | |
| // top: 1px | |
| // left: 1px | |
| // width: 1em | |
| // height: 1em | |
| // box-sizing: border-box | |
| // border: 3px solid $bg | |
| // border-radius: 50% | |
| // transform: none | |
| %button | |
| @extend %block | |
| font: inherit | |
| // font-size: 1em | |
| line-height: normal | |
| cursor: pointer | |
| background: $vibrant | |
| color: white | |
| font-weight: bold | |
| width: auto | |
| margin-left: auto | |
| font-weight: bold | |
| padding: | |
| left: 2em | |
| right: 2em | |
| &:hover, &:focus, &:active | |
| color: white | |
| border-color: white | |
| &:active | |
| position: relative | |
| top: 1px | |
| left: 1px | |
| body | |
| padding: 2em | |
| .form | |
| max-width: 40em | |
| margin: 0 auto | |
| position: relative | |
| display: flex | |
| flex-flow: row wrap | |
| justify-content: space-between | |
| align-items: flex-end | |
| .field | |
| width: 100% | |
| margin: 0 0 1.5em 0 | |
| &.half | |
| @media screen and (min-width: 40em) | |
| width: calc(50% - 1px) | |
| &.last | |
| margin-left: auto | |
| .text-input | |
| @extend %input | |
| .textarea | |
| @extend %input | |
| max-width: 100% | |
| .button | |
| @extend %button | |
| .label | |
| @extend %label | |
| .message | |
| @extend %error | |
| .select | |
| @extend %input | |
| text-indent: 0.01px | |
| text-overflow: ""!important | |
| &::-ms-expand | |
| display: none | |
| .checkboxes, .options | |
| padding: 0 | |
| margin: 0 | |
| list-style-type: none | |
| overflow: hidden | |
| .checkbox, .option | |
| float: left | |
| margin: 1px | |
| .checkbox-input | |
| @extend %checkbox | |
| .option-input | |
| @extend %checkbox | |
| // @extend %option | |
| .customSelect | |
| @extend %input | |
| pointer-events: none | |
| &:after | |
| content: '' | |
| pointer-events: none | |
| width: .5em | |
| height: .5em | |
| border-style: solid | |
| border-color: $label | |
| border-width: 0 3px 3px 0 | |
| position: absolute | |
| top: 50% | |
| margin-top: -.625em | |
| right: 1em | |
| transform-origin: 0 0 | |
| transform: rotate(45deg) | |
| &.customSelectHover | |
| &.customSelectOpen | |
| &.customSelectFocus | |
| @extend %input:active | |
| &:after | |
| border-color: white | |
| .customSelectInner | |
| .magic-focus | |
| position: absolute | |
| z-index: 0 | |
| width: 0 | |
| // height: 0 | |
| pointer-events: none | |
| background: rgba(white,.15) | |
| transition: top .2s, left .2s, width .2s | |
| backface-visibility: hidden | |
| transform-style: preserve-3d | |
| will-change: top, left, width | |
| transform-origin: 0 0 |
| <link href="https://fonts.googleapis.com/css?family=Titillium+Web:400,700" rel="stylesheet" /> |