diff --git a/less/bootstrap-tokenfield.less b/less/bootstrap-tokenfield.less index 540ca49..21d41d3 100644 --- a/less/bootstrap-tokenfield.less +++ b/less/bootstrap-tokenfield.less @@ -6,236 +6,5 @@ @import "../bower_components/bootstrap/less/mixins.less"; @import "../bower_components/bootstrap/less/variables.less"; - -// Variables - -@token-background: #ededed; -@token-border: #d9d9d9; -@token-hover-border: #b9b9b9; -@token-active-border: rgba(82, 168, 236, 0.8); -@token-active-border-fallback: rgb(82, 168, 236); // IE8 -@token-active-invalid-border: @token-background; - - -// Mixins - -.tokenfield-focus(@color: @input-border-focus) { - @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); - border-color: @color; - outline: 0; - .box-shadow(~"inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px @{color-rgba}"); -} - -.tokenfield-validation(@border-color) { - border-color: darken(@border-color, 10%); - @shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px lighten(@border-color, 20%); - .box-shadow(@shadow); -} - -.border-radius(@border-radius) { - -webkit-border-radius: @border-radius; - -moz-border-radius: @border-radius; - border-radius: @border-radius; -} - -// Blink animation for duplicate tokens - -@-webkit-keyframes blink { - 0% { - border-color: #ededed; - } - 100% { - border-color: #b94a48; - } -} -@-moz-keyframes blink { - 0% { - border-color: #ededed; - } - 100% { - border-color: #b94a48; - } -} -@keyframes blink { - 0% { - border-color: #ededed; - } - 100% { - border-color: #b94a48; - } -} - -// Tokenfield - -.tokenfield { - height: auto; - min-height: @input-height-base; - padding-bottom: 0px; - &.focus { - .tokenfield-focus(); - } - - // Tokens - .token { - .box-sizing(border-box); - .border-radius(3px); - display: inline-block; - border: 1px solid @token-border; - background-color: @token-background; - white-space: nowrap; - margin: -1px 5px 5px 0; - height: 22px; - vertical-align: top; - cursor: default; - &:hover { - border-color: @token-hover-border; - } - &.active { - border-color: rgb(82, 168, 236); - border-color: rgba(82, 168, 236, 0.8); - } - &.duplicate { - border-color: @state-danger-border; - .animation-name(blink); - .animation-duration(0.1s); - .animation-direction(normal); - .animation-timing-function(ease); - .animation-iteration-count(infinite); - } - &.invalid { - background: none; - border: 1px solid transparent; - .border-radius(0); - border-bottom: 1px dotted @brand-danger; - &.active { - background: @token-background; - border: 1px solid @token-active-invalid-border; - .border-radius(3px); - } - } - .token-label { - display: inline-block; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 4px; - vertical-align: top; - } - .close { - font-family: Arial; - display: inline-block; - line-height: 100%; - font-size: 1.1em; - line-height: 1.49em; - margin-left: 5px; - float: none; - height: 100%; - vertical-align: top; - padding-right: 4px; - } - } - - // Inputs - .token-input { - background: none; - width: 60px; - min-width: 60px; - border: 0; - height: 20px; - padding: 0; - margin-bottom: 6px; - .box-shadow(none); - } - .token-input:focus { - border-color: transparent; - outline: 0; - /* IE6-9 */ - .box-shadow(none); - } - - // Disabled state - &.disabled { - cursor: not-allowed; - background-color: @gray-lighter; - .token-input { - cursor: not-allowed; - } - .token:hover { - cursor: not-allowed; - border-color: @token-border; - .close { - cursor: not-allowed; - .opacity(0.2); - } - } - } -} - -// Validation states - -.has-warning .tokenfield.focus { - .tokenfield-validation(@state-warning-text); -} -.has-error .tokenfield.focus { - .tokenfield-validation(@state-danger-text); -} -.has-success .tokenfield.focus { - .tokenfield-validation(@state-success-text); -} - -// Various sizes - -.tokenfield.input-sm, -.input-group-sm .tokenfield { - min-height: 30px; - padding-bottom: 0px; -} -.input-group-sm .token, -.tokenfield.input-sm .token { - height: 20px; - margin-bottom: 4px; -} -.input-group-sm .token-input, -.tokenfield.input-sm .token-input { - height: 18px; - margin-bottom: 5px; -} - -.tokenfield.input-lg, -.input-group-lg .tokenfield { - height: auto; - min-height: 45px; - padding-bottom: 4px; -} -.input-group-lg .token, -.tokenfield.input-lg .token { - height: 25px; -} -.input-group-lg .token-label, -.tokenfield.input-lg .token-label { - line-height: 23px; -} -.input-group-lg .token .close, -.tokenfield.input-lg .token .close { - line-height: 1.3em; -} -.input-group-lg .token-input, -.tokenfield.input-lg .token-input { - height: 23px; - line-height: 23px; - margin-bottom: 6px; - vertical-align: top; -} - -// RTL - -.tokenfield.rtl { - direction: rtl; - text-align: right; -} -.tokenfield.rtl .token { - margin: -1px 0 5px 5px; -} -.tokenfield.rtl .token .token-label { - padding-left: 0px; - padding-right: 4px; -} +@import "./variables.less"; +@import "./tokenfield.less"; diff --git a/less/tokenfield-typeahead.less b/less/tokenfield-typeahead.less index e8c33a8..cdc2288 100644 --- a/less/tokenfield-typeahead.less +++ b/less/tokenfield-typeahead.less @@ -6,137 +6,4 @@ @import "../bower_components/bootstrap/less/mixins.less"; @import "../bower_components/bootstrap/less/variables.less"; - -/* General Typeahead styling, from http://jsfiddle.net/ragulka/Dy9au/1/ */ -.twitter-typeahead { - width: 100%; - position: relative; - vertical-align: top; -} -.twitter-typeahead .tt-input, -.twitter-typeahead .tt-hint { - margin: 0; - width: 100%; - vertical-align: middle; - background-color: @input-bg; -} -.twitter-typeahead .tt-hint { - color: @input-color-placeholder; - z-index: 1; - border: 1px solid transparent; -} -.twitter-typeahead .tt-input { - color: @input-color; - z-index: 2; -} -.twitter-typeahead .tt-input, -.twitter-typeahead .tt-hint { - height: @input-height-base; - padding: @padding-base-vertical @padding-base-horizontal; - font-size: 14px; - line-height: 1.428571429; -} -.twitter-typeahead .input-sm.tt-input, -.twitter-typeahead .hint-sm.tt-hint { - border-radius: 3px; -} -.twitter-typeahead .input-lg.tt-input, -.twitter-typeahead .hint-lg.tt-hint { - border-radius: 6px; -} -.input-group .twitter-typeahead:first-child .tt-input, -.input-group .twitter-typeahead:first-child .tt-hint { - border-radius: 4px 0 0 4px !important; -} -.input-group .twitter-typeahead:last-child .tt-input, -.input-group .twitter-typeahead:last-child .tt-hint { - border-radius: 0 4px 4px 0 !important; -} -.input-group.input-group-sm .twitter-typeahead:first-child .tt-input, -.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint { - border-radius: 3px 0 0 3px !important; -} -.input-group.input-group-sm .twitter-typeahead:last-child .tt-input, -.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint { - border-radius: 0 3px 3px 0 !important; -} -.input-sm.tt-input, -.hint-sm.tt-hint, -.input-group.input-group-sm .tt-input, -.input-group.input-group-sm .tt-hint { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.input-group.input-group-lg .twitter-typeahead:first-child .tt-input, -.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint { - border-radius: 6px 0 0 6px !important; -} -.input-group.input-group-lg .twitter-typeahead:last-child .tt-input, -.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint { - border-radius: 0 6px 6px 0 !important; -} -.input-lg.tt-input, -.hint-lg.tt-hint, -.input-group.input-group-lg .tt-input, -.input-group.input-group-lg .tt-hint { - height: 45px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; -} -.tt-dropdown-menu { - width: 100%; - min-width: 160px; - margin-top: 2px; - padding: 5px 0; - background-color: @dropdown-bg; - border: 1px solid #ccc; - border: 1px solid @dropdown-border; - *border-right-width: 2px; - *border-bottom-width: 2px; - border-radius: 6px; - .box-shadow(0 5px 10px rgba(0, 0, 0, .2)); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} -.tt-suggestion { - display: block; - padding: 3px 20px; -} -.tt-suggestion.tt-cursor { - color: @dropdown-link-hover-color; - #gradient > .vertical(@dropdown-link-hover-bg, darken(@dropdown-link-hover-bg, 5%)); -} -.tt-suggestion.tt-cursor a { - color: @dropdown-bg; -} -.tt-suggestion p { - margin: 0; -} - -/* Tokenfield-specific Typeahead styling */ -.tokenfield .twitter-typeahead { - width: auto; -} -.tokenfield .twitter-typeahead .tt-hint { - padding: 0; - height: 20px; -} -.tokenfield.input-sm .twitter-typeahead .tt-input, -.tokenfield.input-sm .twitter-typeahead .tt-hint { - height: 18px; - font-size: 12px; - line-height: 1.5; -} -.tokenfield.input-lg .twitter-typeahead .tt-input, -.tokenfield.input-lg .twitter-typeahead .tt-hint { - height: 23px; - font-size: 18px; - line-height: 1.33; -} -.tokenfield .twitter-typeahead .tt-suggestions { - font-size: 14px; -} +@import "./typeahead.less"; diff --git a/less/tokenfield.less b/less/tokenfield.less new file mode 100644 index 0000000..b166410 --- /dev/null +++ b/less/tokenfield.less @@ -0,0 +1,222 @@ + +// Mixins + +.tokenfield-focus(@color: @input-border-focus) { + @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); + border-color: @color; + outline: 0; + .box-shadow(~"inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px @{color-rgba}"); +} + +.tokenfield-validation(@border-color) { + border-color: darken(@border-color, 10%); + @shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px lighten(@border-color, 20%); + .box-shadow(@shadow); +} + +.border-radius(@border-radius) { + -webkit-border-radius: @border-radius; + -moz-border-radius: @border-radius; + border-radius: @border-radius; +} + +// Blink animation for duplicate tokens + +@-webkit-keyframes blink { + 0% { + border-color: #ededed; + } + 100% { + border-color: #b94a48; + } +} +@-moz-keyframes blink { + 0% { + border-color: #ededed; + } + 100% { + border-color: #b94a48; + } +} +@keyframes blink { + 0% { + border-color: #ededed; + } + 100% { + border-color: #b94a48; + } +} + +// Tokenfield + +.tokenfield { + height: auto; + min-height: @input-height-base; + padding-bottom: 0px; + &.focus { + .tokenfield-focus(); + } + + // Tokens + .token { + .box-sizing(border-box); + .border-radius(3px); + display: inline-block; + border: 1px solid @token-border; + background-color: @token-background; + white-space: nowrap; + margin: -1px 5px 5px 0; + height: 22px; + vertical-align: top; + cursor: default; + &:hover { + border-color: @token-hover-border; + } + &.active { + border-color: rgb(82, 168, 236); + border-color: rgba(82, 168, 236, 0.8); + } + &.duplicate { + border-color: @state-danger-border; + .animation-name(blink); + .animation-duration(0.1s); + .animation-direction(normal); + .animation-timing-function(ease); + .animation-iteration-count(infinite); + } + &.invalid { + background: none; + border: 1px solid transparent; + .border-radius(0); + border-bottom: 1px dotted @brand-danger; + &.active { + background: @token-background; + border: 1px solid @token-active-invalid-border; + .border-radius(3px); + } + } + .token-label { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + padding-left: 4px; + vertical-align: top; + } + .close { + font-family: Arial; + display: inline-block; + line-height: 100%; + font-size: 1.1em; + line-height: 1.49em; + margin-left: 5px; + float: none; + height: 100%; + vertical-align: top; + padding-right: 4px; + } + } + + // Inputs + .token-input { + background: none; + width: 60px; + min-width: 60px; + border: 0; + height: 20px; + padding: 0; + margin-bottom: 6px; + .box-shadow(none); + } + .token-input:focus { + border-color: transparent; + outline: 0; + /* IE6-9 */ + .box-shadow(none); + } + + // Disabled state + &.disabled { + cursor: not-allowed; + background-color: @gray-lighter; + .token-input { + cursor: not-allowed; + } + .token:hover { + cursor: not-allowed; + border-color: @token-border; + .close { + cursor: not-allowed; + .opacity(0.2); + } + } + } +} + +// Validation states + +.has-warning .tokenfield.focus { + .tokenfield-validation(@state-warning-text); +} +.has-error .tokenfield.focus { + .tokenfield-validation(@state-danger-text); +} +.has-success .tokenfield.focus { + .tokenfield-validation(@state-success-text); +} + +// Various sizes + +.tokenfield.input-sm, +.input-group-sm .tokenfield { + min-height: 30px; + padding-bottom: 0px; +} +.input-group-sm .token, +.tokenfield.input-sm .token { + height: 20px; + margin-bottom: 4px; +} +.input-group-sm .token-input, +.tokenfield.input-sm .token-input { + height: 18px; + margin-bottom: 5px; +} + +.tokenfield.input-lg, +.input-group-lg .tokenfield { + min-height: 45px; + padding-bottom: 4px; +} +.input-group-lg .token, +.tokenfield.input-lg .token { + height: 25px; +} +.input-group-lg .token-label, +.tokenfield.input-lg .token-label { + line-height: 23px; +} +.input-group-lg .token .close, +.tokenfield.input-lg .token .close { + line-height: 1.3em; +} +.input-group-lg .token-input, +.tokenfield.input-lg .token-input { + height: 23px; + line-height: 23px; + margin-bottom: 6px; + vertical-align: top; +} + +// RTL + +.tokenfield.rtl { + direction: rtl; + text-align: right; +} +.tokenfield.rtl .token { + margin: -1px 0 5px 5px; +} +.tokenfield.rtl .token .token-label { + padding-left: 0px; + padding-right: 4px; +} diff --git a/less/typeahead.less b/less/typeahead.less new file mode 100644 index 0000000..6005c05 --- /dev/null +++ b/less/typeahead.less @@ -0,0 +1,134 @@ + +/* General Typeahead styling, from http://jsfiddle.net/ragulka/Dy9au/1/ */ +.twitter-typeahead { + width: 100%; + position: relative; + vertical-align: top; +} +.twitter-typeahead .tt-input, +.twitter-typeahead .tt-hint { + margin: 0; + width: 100%; + vertical-align: middle; + background-color: @input-bg; +} +.twitter-typeahead .tt-hint { + color: @input-color-placeholder; + z-index: 1; + border: 1px solid transparent; +} +.twitter-typeahead .tt-input { + color: @input-color; + z-index: 2; +} +.twitter-typeahead .tt-input, +.twitter-typeahead .tt-hint { + height: @input-height-base; + padding: @padding-base-vertical @padding-base-horizontal; + font-size: 14px; + line-height: 1.428571429; +} +.twitter-typeahead .input-sm.tt-input, +.twitter-typeahead .hint-sm.tt-hint { + border-radius: 3px; +} +.twitter-typeahead .input-lg.tt-input, +.twitter-typeahead .hint-lg.tt-hint { + border-radius: 6px; +} +.input-group .twitter-typeahead:first-child .tt-input, +.input-group .twitter-typeahead:first-child .tt-hint { + border-radius: 4px 0 0 4px !important; +} +.input-group .twitter-typeahead:last-child .tt-input, +.input-group .twitter-typeahead:last-child .tt-hint { + border-radius: 0 4px 4px 0 !important; +} +.input-group.input-group-sm .twitter-typeahead:first-child .tt-input, +.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint { + border-radius: 3px 0 0 3px !important; +} +.input-group.input-group-sm .twitter-typeahead:last-child .tt-input, +.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint { + border-radius: 0 3px 3px 0 !important; +} +.input-sm.tt-input, +.hint-sm.tt-hint, +.input-group.input-group-sm .tt-input, +.input-group.input-group-sm .tt-hint { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-group.input-group-lg .twitter-typeahead:first-child .tt-input, +.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint { + border-radius: 6px 0 0 6px !important; +} +.input-group.input-group-lg .twitter-typeahead:last-child .tt-input, +.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint { + border-radius: 0 6px 6px 0 !important; +} +.input-lg.tt-input, +.hint-lg.tt-hint, +.input-group.input-group-lg .tt-input, +.input-group.input-group-lg .tt-hint { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; +} +.tt-dropdown-menu { + width: 100%; + min-width: 160px; + margin-top: 2px; + padding: 5px 0; + background-color: @dropdown-bg; + border: 1px solid #ccc; + border: 1px solid @dropdown-border; + *border-right-width: 2px; + *border-bottom-width: 2px; + border-radius: 6px; + .box-shadow(0 5px 10px rgba(0, 0, 0, .2)); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} +.tt-suggestion { + display: block; + padding: 3px 20px; +} +.tt-suggestion.tt-cursor { + color: @dropdown-link-hover-color; + #gradient > .vertical(@dropdown-link-hover-bg, darken(@dropdown-link-hover-bg, 5%)); +} +.tt-suggestion.tt-cursor a { + color: @dropdown-bg; +} +.tt-suggestion p { + margin: 0; +} + +/* Tokenfield-specific Typeahead styling */ +.tokenfield .twitter-typeahead { + width: auto; +} +.tokenfield .twitter-typeahead .tt-hint { + padding: 0; + height: 20px; +} +.tokenfield.input-sm .twitter-typeahead .tt-input, +.tokenfield.input-sm .twitter-typeahead .tt-hint { + height: 18px; + font-size: 12px; + line-height: 1.5; +} +.tokenfield.input-lg .twitter-typeahead .tt-input, +.tokenfield.input-lg .twitter-typeahead .tt-hint { + height: 23px; + font-size: 18px; + line-height: 1.33; +} +.tokenfield .twitter-typeahead .tt-suggestions { + font-size: 14px; +} diff --git a/less/variables.less b/less/variables.less new file mode 100644 index 0000000..5b3cf40 --- /dev/null +++ b/less/variables.less @@ -0,0 +1,9 @@ +// Variables + +@token-background: #ededed; +@token-border: #d9d9d9; +@token-hover-border: #b9b9b9; +@token-active-border: rgba(82, 168, 236, 0.8); +@token-active-border-fallback: rgb(82, 168, 236); // IE8 +@token-active-invalid-border: @token-background; +