| Current Path : /home/w/u/e/wuectly/www/03cbe/ |
| Current File : /home/w/u/e/wuectly/www/03cbe/less.zip |
PK ��!]{��ݞ � buttons.lessnu &1i� //
// Buttons
// --------------------------------------------------
// Base styles
// --------------------------------------------------
// Core
.btn {
display: inline-block;
.ie7-inline-block();
padding: 4px 12px;
margin-bottom: 0; // For input.btn
font-size: @baseFontSize;
line-height: @baseLineHeight;
text-align: center;
vertical-align: middle;
cursor: pointer;
.buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
border: 1px solid @btnBorder;
*border: 0; // Remove the border to prevent IE7's black border on input:focus
border-bottom-color: darken(@btnBorder, 10%);
.border-radius(@baseBorderRadius);
.ie7-restore-left-whitespace(); // Give IE7 some love
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
// Hover/focus state
&:hover,
&:focus {
color: @grayDark;
text-decoration: none;
background-position: 0 -15px;
// transition is only when going to hover/focus, otherwise the background
// behind the gradient (there for IE<=9 fallback) gets mismatched
.transition(background-position .1s linear);
}
// Focus state for keyboard and accessibility
&:focus {
.tab-focus();
}
// Active state
&.active,
&:active {
background-image: none;
outline: 0;
.box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
}
// Disabled state
&.disabled,
&[disabled] {
cursor: default;
background-image: none;
.opacity(65);
.box-shadow(none);
}
}
// Button Sizes
// --------------------------------------------------
// Large
.btn-large {
padding: @paddingLarge;
font-size: @fontSizeLarge;
.border-radius(@borderRadiusLarge);
}
.btn-large [class^="icon-"],
.btn-large [class*=" icon-"] {
margin-top: 4px;
}
// Small
.btn-small {
padding: @paddingSmall;
font-size: @fontSizeSmall;
.border-radius(@borderRadiusSmall);
}
.btn-small [class^="icon-"],
.btn-small [class*=" icon-"] {
margin-top: 0;
}
.btn-mini [class^="icon-"],
.btn-mini [class*=" icon-"] {
margin-top: -1px;
}
// Mini
.btn-mini {
padding: @paddingMini;
font-size: @fontSizeMini;
.border-radius(@borderRadiusSmall);
}
// Block button
// -------------------------
.btn-block {
display: block;
width: 100%;
padding-left: 0;
padding-right: 0;
.box-sizing(border-box);
}
// Vertically space out multiple block buttons
.btn-block + .btn-block {
margin-top: 5px;
}
// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"] {
&.btn-block {
width: 100%;
}
}
// Alternate buttons
// --------------------------------------------------
// Provide *some* extra contrast for those who can get it
.btn-primary.active,
.btn-warning.active,
.btn-danger.active,
.btn-success.active,
.btn-info.active,
.btn-inverse.active {
color: rgba(255,255,255,.75);
}
// Set the backgrounds
// -------------------------
.btn-primary {
.buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
}
// Warning appears are orange
.btn-warning {
.buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);
}
// Danger and error appear as red
.btn-danger {
.buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
}
// Success appears as green
.btn-success {
.buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
}
// Info appears as a neutral blue
.btn-info {
.buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);
}
// Inverse appears as dark gray
.btn-inverse {
.buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);
}
// Cross-browser Jank
// --------------------------------------------------
button.btn,
input[type="submit"].btn {
// Firefox 3.6 only I believe
&::-moz-focus-inner {
padding: 0;
border: 0;
}
// IE7 has some default padding on button controls
*padding-top: 3px;
*padding-bottom: 3px;
&.btn-large {
*padding-top: 7px;
*padding-bottom: 7px;
}
&.btn-small {
*padding-top: 3px;
*padding-bottom: 3px;
}
&.btn-mini {
*padding-top: 1px;
*padding-bottom: 1px;
}
}
// Link buttons
// --------------------------------------------------
// Make a button look and behave like a link
.btn-link,
.btn-link:active,
.btn-link[disabled] {
background-color: transparent;
background-image: none;
.box-shadow(none);
}
.btn-link {
border-color: transparent;
cursor: pointer;
color: @linkColor;
.border-radius(0);
}
.btn-link:hover,
.btn-link:focus {
color: @linkColorHover;
text-decoration: underline;
background-color: transparent;
}
.btn-link[disabled]:hover,
.btn-link[disabled]:focus {
color: @grayDark;
text-decoration: none;
}
PK ��!]G�e� colour_brown.lessnu &1i� // colour_brown.less
//
// Less to compile Hathor in the brown colour scheme
// -----------------------------------------------------
/**
* #2c2c2c Text
* #054993 Links
* #ffffff Background, border, text
* #d5c1b2 Background alternate, button/icon/menu background
* #d5c1b2-d5c1b2 Gradient Background
* #e5f0fa Background (input required)
* #e1d3c8 Background Hover, Top/Left icon borders
* #000000 Main borders
* #000000 Top/Left hover borders
* #000000 Right/Bottom hover borders
*
* Special Use Colors:
* #a20000 Text Error, border invalid
* #cccccc Text (faded)
* #005800 Text (success)
* #eeeeee Background (input disabled)
* #ffffcf Background permissions debug
* #cfffda Background permissions debug
* #ffcfcf Background permissions debug
*/
// Import the variables file first to get common variables loaded
@import "hathor_variables.less";
// Define variables unique to this colour scheme, as well as override variables already defined in the common file
@altBackground: #d5c1b2;
@gradientTop: #d5c1b2;
@gradientBottom: #d5c1b2;
@mainBorder: #000000;
@toolbarColor: #054993;
@hoverBackground: #e5d9c3;
@nwBorder: #868778;
@seBorder: #f6f7db;
// Import the baseline to compile the CSS
@import "colour_baseline.less";
PK ��!]N��� � colour_blue.lessnu &1i� // colour_blue.less
//
// Less to compile Hathor in the blue colour scheme
// -----------------------------------------------------
/**
* #2c2c2c Text
* #054993 Links
* #ffffff Background, border, text
* #c3d2e5 Background alternate, button/icon/menu background
* #a5bbd4-c3d2e5 Gradient Background
* #e5f0fa Background (input required)
* #e5d9c3 Background Hover, Top/Left icon borders
* #738498 Main borders
* #868778 Top/Left hover borders
* #f6f7db Right/Bottom hover borders
*
* Special Use Colors:
* #a20000 Text Error, border invalid
* #cccccc Text (faded)
* #005800 Text (success)
* #eeeeee Background (input disabled)
* #ffffcf Background permissions debug
* #cfffda Background permissions debug
* #ffcfcf Background permissions debug
*/
// Import the variables file first to get common variables loaded
@import "hathor_variables.less";
// Define variables unique to this colour scheme, as well as override variables already defined in the common file
@altBackground: #c3d2e5;
@gradientTop: #a5bbd4;
@gradientBottom: #c3d2e5;
@mainBorder: #738498;
// Import the baseline to compile the CSS
@import "colour_baseline.less";
PK ��!]Ӄ��I� I�
template.lessnu &1i� // Import the variables file first to get common variables loaded
@import "hathor_variables.less";
// Core variables and mixins
@import "../../../../media/jui/less/mixins.less";
// Bootstrap Component Animations
@import "../../../../media/jui/less/component-animations.less";
// Bootstrap Modals
@import "modals.less";
//@import "../../../../media/jui/less/modals.joomla.less";
// Bootstrap Popovers
@import "../../../../media/jui/less/popovers.less";
// Icon Font
@import "icomoon.less";
/**
* CSS Reset
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
background: transparent;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
del {
text-decoration: line-through;
}
/**
* General styles
*/
html {
overflow-y: scroll;
height: 100%;
}
body {
margin: 0;
padding: 0;
font-size: 62.5%;
line-height: 1.5em;
height: 100%;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body, td, th, span, a {
font-family: Arial, Helvetica, sans-serif;
}
html, body {
height: 100%;
}
a, img {
padding: 0;
margin: 0;
}
img {
border: 0 none;
}
form {
margin: 0;
padding: 0;
}
ul {
padding: 0;
margin: 0;
}
h1 {
margin: 0;
padding-bottom: 8px;
font-size: 1.4em;
font-weight: bold;
line-height: 2em;
}
h2 {
padding-top: .83em;
padding-bottom: .83em;
}
h3 {
font-size: 1.4em;
}
a:link {
color: #054993;
text-decoration: none;
}
a:visited {
color: #054993;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:focus {
text-decoration: underline;
}
iframe {
border: 0;
}
/* new styles */
.enabled {
color: #005800;
font-weight: bold;
}
.disabled {
color: #a20000;
font-weight: bold;
}
p.error {
color: #a20000;
font-weight: bold;
}
.warning {
color: #a20000;
font-weight: bold;
}
.nowarning {
color: #2c2c2c;
font-weight: bold;
}
.success {
color: #005800;
font-weight: bold;
}
.allow {
color: #005800;
}
span.writable {
color: #005800;
}
.deny {
color: #a20000;
}
span.unwritable {
color: #a20000;
}
.none {
color: #aaaaaa;
}
.pointer {
cursor: pointer;
}
.nowrap {
white-space: nowrap;
}
p.nowarning, p.warning {
margin: 10px;
}
/* end new styles */
/**
* Overall Styles
*/
#minwidth, #minwidth-body {
min-width: 980px;
}
#containerwrap {
position: relative;
}
#header {
position: relative;
}
#header h1.title {
font-size: 1.5em;
font-weight: normal;
line-height: 25px;
margin: 0;
padding: 0 0 0 120px;
}
#footer {
padding: 10px 20px;
}
#footer .copyright {
margin: 0 0 0 0;
text-align: center;
}
#footer p {
font-size: 1.2em;
}
#nav .no-nav {
line-height: 2em;
}
#content {
margin: 5px 20px 20px 20px;
}
.cpanel-page div#element-box {
padding: 15px;
}
/**
* Status layout
*/
#module-status {
float: right;
position: relative;
top: -48px;
}
#module-status div.btn-group {
display: block;
float: left;
padding: 4px 10px 0 10px;
font-size: 1.2em;
}
#module-status div.divider {
display: none;
}
#module-status .unread-messages a {
font-weight: bold;
}
.title-ua {
position: relative;
width: 60%;
}
/**
* Various Styles
*/
.enabled,
.disabled,
p.error,
.warning,
.nowarning,
.success {
font-weight: bold;
}
.pointer {
cursor: pointer;
}
.nowrap {
white-space: nowrap;
}
span.note {
display: block;
padding: 5px;
}
div.checkin-tick {
text-indent: -9999px;
}
/**
* Overlib
*/
.ol-textfont {
font-family: Arial, Helvetica, sans-serif;
font-size: 1.2em;
}
.ol-captionfont {
font-family: Arial, Helvetica, sans-serif;
font-size: 1.2em;
font-weight: bold;
}
.ol-captionfont a {
text-decoration: none;
}
/**
* Subheader, toolbar, page title
*/
div.subheader .padding {
padding: 0;
}
div.pagetitle {
padding: 0 0 5px 5px;
margin: 0;
background-repeat: no-repeat;
background-position: left 50%;
line-height: 54px;
width: 100%;
margin-top: -20px;
height: 60px;
}
.tabs-left > .nav-tabs {
float: left;
margin-right: 19px;
border-right: 1px solid #DDD;
}
tabs-below > .nav-tabs, .tabs-right > .nav-tabs, .tabs-left > .nav-tabs {
border-bottom: 0;
}
/* Tabbed Content */
.tab-content {
overflow: visible;
}
.tabs-left .tab-content {
overflow: auto;
}
/* Non-linkable nav-tabs */
.nav-tabs > li > span {
display: block;
margin-right: 2px;
padding-right: 12px;
padding-left: 12px;
padding-top: 8px;
padding-bottom: 8px;
line-height: 18px;
border: 1px solid transparent;
-webkit-border-radius: 4px 4px 0 0;
-moz-border-radius: 4px 4px 0 0;
border-radius: 4px 4px 0 0;
}
/* Extended Joomla Button Classes */
.btn-micro {
padding: 1px 4px;
font-size: 10px;
line-height: 8px;
}
/* Joomla => Bootstrap Tooltip */
.tip-wrap {
max-width: 200px;
padding: 3px 8px;
color: #ffffff;
text-align: center;
text-decoration: none;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
z-index: 100;
}
.pagetitle h2 {
padding: 0 0 0 50px;
font-size: 1.3em;
font-weight: bold;
line-height: 48px;
font-style: italic;
}
div.configuration {
font-size: 1.2em;
font-weight: bold;
line-height: 2em;
padding-left: 30px;
margin-left: 10px;
}
div.toolbar-box h3 {
height: 0;
overflow: hidden;
position: absolute;
padding: 0;
margin: 0;
}
.btn-toolbar {
margin-bottom: 3px;
margin-top: 14px;
}
div.btn-toolbar, div.toolbar-list {
float: left;
text-align: left;
padding: 0;
}
div.toolbar-list li {
padding: 5px 1px 5px 4px;
text-align: center;
height: 52px;
list-style: none;
float: left;
}
div.toolbar-list li.spacer {
width: 10px;
}
div.toolbar-list li.divider {
width: 10px;
margin-right: 10px;
}
div.toolbar-list span {
float: none;
width: 32px;
height: 32px;
margin: 0 auto;
display: block;
}
div.toolbar-list a {
display: block;
float: left;
white-space: nowrap;
padding: 1px 5px;
cursor: pointer;
font-weight: bold;
}
div.btn-toolbar div.btn-group button {
display: block;
float: left;
white-space: nowrap;
padding: 1px 5px;
cursor: pointer;
text-align: center;
}
div.btn-toolbar button:hover, div.btn-toolbar button:focus, div.toolbar-list a:hover, div.toolbar-list a:focus {
text-decoration: none;
}
/**
* Massmail component
*/
td#mm_pane {
width: 90%;
}
input#mm_subject {
width: 200px;
}
textarea#mm_message {
width: 100%;
}
textarea {
resize:both;
}
textarea.vert {
resize:vertical;
}
textarea.noResize {
resize:none;
}
/**
* Pane Slider pane Toggler styles
*/
.pane-sliders {
margin: 0;
position: relative;
}
.pane-sliders .title {
margin: 0;
padding: 2px;
cursor: pointer;
}
.pane-sliders .panel {
margin-bottom: 3px;
}
.pane-sliders .adminlist td {
border: 0 none;
}
h3.pane-toggler-down a:focus,
h3.pane-toggler a:focus {
outline: none;
}
.pane-toggler span {
padding-left: 20px;
}
.pane-toggler-down span {
padding-left: 20px;
}
/* The following line hides the unseen panel (prevents the mouse from activating in IE, so overridden in the ie css files) */
/*.pane-toggler + div.pane-slider {display: none;}*/
.pane-slider.pane-hide {
display: none;
}
div#position-icon.pane-sliders div.pane-down div.quickicon-wrapper {
margin: 5px 0 5px 0;
}
div#position-icon.pane-sliders div.pane-down .quickicon-wrapper .icon {
padding: 5px 0 5px 10px;
margin: 0;
}
/**
* Tabs
*/
dl.tabs {
float: left;
margin: 10px 0 -1px 0;
z-index: 50;
}
dl.tabs dt {
float: left;
padding: 4px 10px;
margin-left: 3px;
}
dl.tabs dt.open {
z-index: 100;
}
div.current {
clear: both;
padding: 10px 10px;
}
div.current dd {
padding: 0;
margin: 0;
}
/* New parameter styles */
dl#content-pane.tabs {
margin: 1px 0 0 0;
}
div.current label, div.current span.faux-label {
display: block;
min-width: 150px;
float: left;
clear: left;
margin-top: 8px;
}
div.current fieldset.radio {
float: left;
}
div.current fieldset.radio input {
clear: none;
min-width: 15px;
float: left;
margin: 3px 0 0 2px;
}
div.current fieldset.radio label {
clear: none;
min-width: 45px;
float: left;
margin: 3px 0 0 2px;
}
div.current fieldset.checkboxes {
float: left;
clear: right;
}
div.current fieldset.checkboxes input {
clear: left;
min-width: 15px;
float: left;
margin: 3px 0 0 2px;
}
div.current fieldset.checkboxes label {
clear: right;
min-width: 45px;
margin: 3px 0 0 2px;
}
div.current input,
div.current span.faux-input,
div.current textarea,
div.current select {
clear: none;
float: left;
margin: 3px 0 0 2px;
}
div.current select {
margin-bottom: 15px;
}
div.current table#acl-config th.acl-groups {
text-align: left;
}
div.current table#filter-config th.acl-groups {
text-align: left;
}
div.current table#filter-config select {
margin-bottom: 0;
}
/* -------- Menu Assigments ---------- */
div#menu-assignment {
clear: left;
}
div#menu-assignment ul.menu-links {
float: left;
width: 49%;
}
div#menu-assignment ul.menu-links label {
clear: none;
float: left;
margin: 3px 0 0 2px;
}
div#menu-assignment ul.menu-links input {
clear: left;
float: left;
}
button.jform-rightbtn {
float: right;
margin-right: 0;
}
p.tab-description {
font-size: 1.091em;
margin-left: 0;
margin-top: 5px;
}
/* end new parameter styles */
/**
* Login Settings
*/
#login-page input, #login-page select {
float: right;
clear: none;
}
#login-page .login {
margin: 0 auto;
width: 575px;
margin-bottom: 100px;
}
#login-page .pagetitle h2 {
margin: -70px 0 30px 0;
font-size: 2em;
padding: 0;
}
#login-page p {
margin: 0;
padding: 0;
margin-bottom: 1em;
font-size: 1.2em;
}
#login-page #header {
margin-bottom: 100px;
}
#login-page .login-inst {
float: left;
width: 35%;
}
#login-page .login-box {
float: right;
width: 63%;
}
#login-page #lock {
width: 150px;
height: 137px;
}
#login-page #element-box.login {
padding: 20px;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
#login-page .button {
text-align: right;
}
#login-page .login-text {
text-align: left;
width: 40%;
float: left;
}
#form-login {
float: left;
padding: 1.1em;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
#form-login fieldset {
border: none;
}
#form-login label {
display: block;
float: left;
clear: left;
width: 100px;
text-align: right;
padding: 4px;
color: #2c2c2c;
font-weight: bold;
font-size: 1.4em;
margin-bottom: 15px;
}
#form-login div.button1 div.next {
float: left;
}
#form-login div.button1 a {
height: 2.2em;
line-height: 2.2em;
font-size: 1.5em;
cursor: default;
padding: 0 15px 0 15px;
}
.login-submit {
border: 0;
padding: 0;
margin: 0;
width: 0;
height: 0;
}
/**
* Cpanel Settings
*/
#cpanel div.icon, .cpanel div.icon {
text-align: center;
margin-right: 5px;
float: left;
margin-bottom: 5px;
}
#cpanel div.icon a, .cpanel div.icon a {
display: block;
float: left;
height: auto;
min-height: 97px;
width: 108px;
color: #2c2c2c;
vertical-align: middle;
text-decoration: none;
font-weight: bold;
}
#cpanel img, .cpanel img {
padding: 10px;
margin: 0 auto;
}
#cpanel span, .cpanel span {
display: block;
text-align: center;
padding: 0 0 5px;
}
div.cpanel-icons {
width: 54%;
float: left;
}
div.cpanel-component {
width: 45%;
float: right;
}
/**
* Standard Layout Styles
*/
div.col {
float: left;
}
div.options-section.col {
float: right;
}
div.col1 {
float: left;
width: 45%;
}
div.col2 {
float: right;
width: 45%;
}
/* Avoid using the width divs. They are here for 3PD Extensions if needed
* Use the specific layout divs listed after. See also the th.width entries */
div.width-1 {
width: 1%;
}
div.width-3 {
width: 3%;
}
div.width-5 {
width: 5%;
}
div.width-10 {
width: 10%;
}
div.width-20 {
width: 20%;
}
div.width-30 {
width: 30%;
}
div.width-35 {
width: 35%;
}
div.width-40 {
width: 40%;
}
div.width-45 {
width: 45%;
}
div.width-50 {
width: 50%;
}
div.width-55 {
width: 55%;
}
div.width-60 {
width: 60%;
}
div.width-65 {
width: 65%;
}
div.width-70 {
width: 70%;
}
div.width-80 {
width: 80%;
}
div.width-100 {
width: 100%;
}
.clrlft {
clear: left;
}
.clrrt {
clear: right;
}
.fltlft {
float: left;
}
.fltrt {
float: right;
}
.fltnone {
float: none;
}
/* Layout Divs */
div.main-section {
width: 60%;
}
div.options-section {
width: 38%;
margin: 10px 10px 10px 0;
}
/* for bluestork style html */
div.width-40.fltrt {
width: 38%;
margin: 10px 10px 10px 0;
}
div.rules-section {
width: 98%;
margin: 10px;
}
/**
* Form Styles
*/
fieldset {
margin: 2px 10px 2px 10px;
padding: 5px;
text-align: left;
}
legend {
font-size: 1.3em;
font-weight: bold;
padding-bottom: 5px;
}
fieldset p {
margin: 10px 0;
font-size: 1.2em;
}
fieldset ol, ol#property-values, fieldset ul, ul#property-values {
margin: 0;
padding: 0;
}
fieldset li, ol#property-values li, ul#property-values li {
list-style: none;
margin: 0;
padding: 5px;
}
fieldset.adminform fieldset.radio,
fieldset.panelform fieldset.radio,
fieldset.adminform-legacy fieldset.radio {
border: 0;
float: left;
padding: 0;
margin: 0 0 5px 0;
clear: right;
}
fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
min-width: 40px;
float: left;
clear: none;
}
/* checkboxes */
fieldset.adminform fieldset.checkboxes,
fieldset.panelform fieldset.checkboxes,
fieldset.adminform-legacy fieldset.checkboxes {
border: 0;
float: left;
padding: 0;
margin: 0 0 5px 0;
clear: right;
}
fieldset.adminform fieldset.checkboxes input[type="checkbox"],
fieldset.panelform fieldset.checkboxes input[type="checkbox"] {
float: left;
clear: left;
}
fieldset.adminform fieldset.checkboxes label,
fieldset.panelform fieldset.checkboxes label,
fieldset.adminform fieldset.checkboxes span.faux-label,
fieldset.panelform fieldset.checkboxes span.faux-label {
clear: right;
}
/* end checkboxes */
/* spacer */
div.current span.spacer > span.before,
fieldset.adminform span.spacer > span.before,
fieldset.panelform span.spacer > span.before {
clear: both;
overflow: hidden;
height: 0;
display: block;
}
/* end spacer */
fieldset.panelform-legacy label,
fieldset.adminform-legacy label,
fieldset.panelform-legacy span.faux-label,
fieldset.adminform-legacy span.faux-label {
min-width: 150px;
float: left;
}
fieldset.adminform,
fieldset.panelform {
.input-prepend,
.input-append {
float: left;
}
.adminformlist .btn.modal,
.input-prepend > *,
.input-append > * {
float: none;
vertical-align: middle;
}
}
/* JParameter classes on radio button labels */
fieldset.panelform-legacy label.radiobtn-jno,
fieldset.panelform-legacy label.radiobtn-jyes,
fieldset.panelform-legacy label.radiobtn-show,
fieldset.panelform-legacy label.radiobtn-hide,
fieldset.panelform-legacy label.radiobtn-off,
fieldset.panelform-legacy label.radiobtn-on {
min-width: 40px !important;
clear: none !important;
}
#jform_plugdesc-lbl,
#jform_description-lbl {
font-weight: bold;
clear: both;
margin-top: 15px;
}
p.jform_desc {
clear: left;
}
div#jform_ordering {
font-size: 1.091em;
margin-top: 3px;
}
fieldset ul.checklist {
margin-left: 27px;
}
fieldset ul.checklist input,
fieldset ul.checklist label {
float: none;
}
fieldset ul.checklist input:focus {
outline: thin dotted #333333;
}
fieldset#filter-bar {
margin: 0;
padding: 5px 10px 5px 10px;
float: left;
width: 98%
}
fieldset#filter-bar ol, fieldset#filter-bar ul {
list-style: none;
margin: 0;
padding: 5px 0 0;
}
fieldset#filter-bar ol li, fieldset#filter-bar ul li {
float: left;
padding: 0 5px 0 0;
}
fieldset#filter-bar ol li fieldset, fieldset#filter-bar ul li fieldset {
margin: 0;
padding: 0;
}
fieldset#filter-bar .filter-search {
float: left;
padding-bottom: 3px;
}
fieldset#filter-bar .filter-select {
float: right;
}
fieldset#filter-bar input#search {
width: 10em;
}
/* Note: these visual cues should be augmented by aria */
.invalid {
font-weight: bold;
}
/* augmented by aria in template javascript */
input.readonly, span.faux-input {
border: 0;
}
.star {
color: #cc0000;
font-size: 1.2em;
}
input, select, span.faux-input {
font-size: 1.2em;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
span.readonly {
float: left;
font-size: 1.2em;
line-height: 2em;
}
div.readonly {
font-size: 1.2em;
line-height: 2em;
}
div.extdescript {
margin-left: 10px;
}
input[type="button"],
input[type="submit"],
input[type="reset"] {
font-family: Arial, Helvetica, sans-serif;
padding: 1px 6px;
font-size: 1.2em;
line-height: 1.5em;
}
textarea {
font-size: 1.4em;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
input.button {
cursor: pointer;
}
label {
font-weight: bold;
font-size: 1.1em;
}
span.faux-label {
font-weight: bold;
font-size: 1.1em;
}
label.selectlabel {
position: absolute;
left: -1000em;
}
/**
* Option or Parameter styles
*/
.paramrules {
padding: 10px;
}
span.gi {
font-weight: bold;
margin-right: 5px;
}
span.gtr {
visibility: hidden;
margin-right: 5px;
}
/**
* Admintable Styles
*/
table.admintable td {
padding: 3px;
font-size: 1em;
}
table.admintable td.key, table.admintable td.paramlist_key {
text-align: right;
width: 140px;
font-weight: bold;
font-size: 1em;
}
table.admintable td.key label, table.admintable td.paramlist_key label {
font-size: 1em;
}
table.admintable td.paramlist_value label {
font-size: 1em;
}
table.admintable input, table.admintable span.faux-input, table.admintable select {
font-size: 1em;
}
table.paramlist td.paramlist_description {
text-align: left;
width: 170px;
font-weight: normal;
}
table.admintable td.key.vtop {
vertical-align: top;
}
/**
* Admin Form Styles
*/
fieldset.adminform {
margin: 0 10px 10px 10px;
overflow: hidden;
}
.adminformlist .btn.modal{
float: left;
margin-top: 7px;
}
ul.adminformlist,
ul.adminformlist li,
dl.adminformlist,
dl.adminformlist li {
margin: 0;
padding: 0;
list-style: none;
}
ul.adminformlist pre {
font-size: 1.3em;
}
ul.adminformlist .button2-left, ul.adminformlist .button2-left {
margin-top: 5px;
}
/* Table styles are for use with tabular data */
table.adminform {
width: 100%;
border-collapse: collapse;
margin: 8px 0 10px 0;
margin-bottom: 15px;
}
table.adminform.nospace {
margin-bottom: 0;
}
table.adminform th {
font-size: 1.4em;
padding: 6px 2px 4px 4px;
text-align: left;
height: 25px;
}
table.adminform td {
padding: 3px;
text-align: left;
}
table.adminform td#filter-bar {
text-align: left;
}
table.adminform td.helpMenu {
text-align: right;
}
table.adminform tr {
padding-left: 10px;
padding-right: 10px;
}
/**
* Table formating styles
*/
td.center, th.center {
text-align: center;
}
/* Avoid using the width classes. They are here for 3PD Extensions if needed
* Use the specific layout table headers listed after. See also the div.width entries */
th.width-1 {
width: 1%;
}
th.width-3 {
width: 3%;
}
th.width-5 {
width: 5%;
}
th.width-10 {
width: 10%;
}
th.width-12 {
width: 12%;
}
th.width-15 {
width: 15%;
}
th.width-20 {
width: 20%;
}
th.width-25 {
width: 25%;
}
th.width-30 {
width: 30%;
}
th.width-40 {
width: 40%;
}
/* Table header layout classes */
th.row-number-col {
width: 3%;
}
th.checkmark-col {
width: 1%;
}
th.state-col {
width: 5%;
}
th.ordering-col {
width: 10%;
}
th.ordering-col a {
display: block;
float: left;
margin-left: 3px;
}
th.ordering-col a img {
margin-left: 4px;
margin-right: 4px;
}
.categories th.ordering-col input, .categories td.order input {
font-size: 1em;
}
th.category-col {
width: 5%;
}
th.access-col {
width: 10%;
}
.categories th.access-col {
width: 5%;
}
th.hits-col {
width: 5%;
}
th.id-col {
width: 3%;
}
th.featured-col {
width: 5%;
}
th.created-by-col {
width: 15%;
}
th.date-col {
width: 5%;
}
th.language-col {
width: 5%;
}
th.home-col {
width: 5%;
}
/**
* Adminlist Table layout
*/
table.adminlist {
width: 100%;
float: left;
}
table.adminlist td, table.adminlist th {
padding: 4px;
font-size: 1.2em;
}
table.adminlist thead th {
text-align: center;
}
table.adminlist thead a:hover {
text-decoration: none;
}
table.adminlist thead th img {
vertical-align: middle;
}
table.adminlist tbody th {
font-weight: bold;
}
/* Table row styles */
table.adminlist tr {
padding-left: 30px;
padding-right: 30px;
}
table.adminlist tbody tr {
text-align: left;
}
table.adminlist tbody tr td,
table.adminlist tbody tr th {
height: 25px;
}
table.adminlist tfoot tr {
text-align: center;
}
/* Table td/th styles */
table.adminlist tfoot td, table.adminlist tfoot th {
text-align: center;
}
table.adminlist td.order {
text-align: center;
white-space: nowrap;
}
table.adminlist td.order span {
float: left;
width: 20px;
text-align: center;
}
table.adminlist td.order input {
text-align: center;
width: 3em;
font-size: 100%;
}
/**
* Tree indentation & nesting - Up to 10 levels deep so don't go crazy :
*/
#media-tree_tree ul {
list-style: none outside none;
margin: 0 10px;
}
table.adminlist td.indent-4 {
padding-left: 4px;
}
table.adminlist td.indent-19 {
padding-left: 19px;
}
table.adminlist td.indent-34 {
padding-left: 34px;
}
table.adminlist td.indent-49 {
padding-left: 49px;
}
table.adminlist td.indent-64 {
padding-left: 64px;
}
table.adminlist td.indent-79 {
padding-left: 79px;
}
table.adminlist td.indent-94 {
padding-left: 94px;
}
table.adminlist td.indent-109 {
padding-left: 109px;
}
table.adminlist td.indent-124 {
padding-left: 124px;
}
table.adminlist td.indent-139 {
padding-left: 139px;
}
/**
* Adminlist buttons
*/
table.adminlist tr td.btns a {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
padding: 3px 20px;
}
table.adminlist tr td.btns a:hover, table.adminlist tr td.btns a:active, table.adminlist tr td.btns a:focus {
text-decoration: none;
}
/**
* Adminlist lists
*/
table.adminlist td li {
list-style: inside;
}
/**
* Modal Modules styles
*/
ul#new-modules-list {
margin-left: 50px;
font-size: 1.4em;
line-height: 1.5em;
}
/**
* Utility styles
*/
/* General Clearing Class */
.clr {
clear: both;
overflow: hidden;
height: 0;
}
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.menu-module-list {
list-style-position: inside;
padding-left: 10px;
margin-left: 5px;
}
/* stu nicholls solution for centering divs */
.container {
clear: both;
text-decoration: none;
}
* html .container {
display: inline-block;
}
/* table solution for global config */
table.noshow {
width: 100%;
border-collapse: collapse;
padding: 0;
margin: 0;
}
table.noshow tr {
vertical-align: top;
}
table.noshow fieldset {
margin: 15px 7px 7px 7px;
}
/**
* Saving order icon styling in admin tables
*/
a.saveorder {
width: 16px;
height: 16px;
display: block;
overflow: hidden;
float: right;
margin-right: 8px;
}
/**
* Button styling
*/
#editor-xtd-buttons {
padding: 5px;
}
button {
font-family: Arial, Helvetica, sans-serif;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
margin-right: 3px;
margin-left: 3px;
}
.invalid {
font-weight: bold;
}
/* Button 1 Type */
.button1, .button1 div {
height: 1%;
float: right;
}
.button1 {
white-space: nowrap;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
.button1 a {
display: block;
height: 2.2em;
float: left;
line-height: 2.2em;
font-size: 1.2em;
font-weight: bold;
cursor: default;
padding: 0 6px 0 6px;
/* add padding if you are using the directional images */
/* padding: 0 30px 0 6px; */
}
.button1 a:hover, .button1 a:focus {
text-decoration: none;
}
/* Button 2 Type */
.button2-left, .button2-right {
float: left;
line-height: 1.5em;
font-size: 1.2em;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
.button2-left.smallsub, .button2-right.smallsub {
line-height: 1.2em;
font-size: .9em;
}
.button2-left a, .button2-right a, .button2-left span, .button2-right span {
display: block;
float: left;
cursor: default;
}
/* these are inactive buttons */
.button2-left span, .button2-right span {
cursor: default;
}
.button2-left .page a, .button2-right .page a,
.button2-left .page span, .button2-right .page span,
.button2-left .blank a, .button2-right .blank a,
.button2-left .blank span, .button2-right .blank span {
padding: 0 6px;
}
.page span, .blank span {
font-weight: bold;
}
.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
text-decoration: none;
}
.button2-left a, .button2-left span {
padding: 0 24px 0 6px;
}
.button2-right a, .button2-right span {
padding: 0 6px 0 24px;
}
.button2-left {
float: left;
margin-left: 5px;
}
.button2-right {
float: left;
margin-left: 5px;
}
/**
* Pagination styles
*/
/* Normal pagination styles */
div.containerpg {
position: relative;
left: 50%;
float: left;
clear: left;
}
div.pagination {
position: relative;
left: -50%;
margin: 0 auto;
padding: .5em;
}
.pagination div.limit {
float: left;
margin: 0 10px;
font-size: 1.2em;
height: 1.8em;
line-height: 1.8em;
}
.pagination div.limit label {
font-size: 100%;
height: 1.8em;
line-height: 1.8em;
}
.pagination div.limit select {
font-size: 100%;
}
/* The Go submittal button */
.pagination button {
font-size: 100%;
height: 2.0em;
line-height: 1.8em;
margin-right: 20px;
}
div.pagination .button2-right, div.pagination .button2-left {
font-size: 1.2em;
height: 1.6em;
line-height: 1.6em;
}
/* Style if pagination is part of the table (old style) */
table.adminlist .pagination {
display: table;
padding: 0;
margin: 0 auto;
font-size: .8em;
}
table.adminlist .pagination button {
font-size: 1.2em;
height: 1.6em;
line-height: 1.5em;
margin-right: 20px;
}
/**
* MCE Editor
*/
div.toggle-editor {
margin-top: 9px;
}
/**
* Tooltips
*/
.tip {
float: left;
padding: 5px;
max-width: 400px;
z-index: 50;
}
.tip-title {
padding: 0;
margin: 0;
font-size: 120%;
margin-top: -15px;
padding-top: 15px;
padding-bottom: 5px;
}
.tip-text {
font-size: 100%;
text-align: left;
margin: 0;
}
/**
* Calendar
*/
a img.calendar {
width: 16px;
height: 16px;
margin-left: 3px;
cursor: pointer;
vertical-align: middle;
}
/**
* JGrid styles
*/
a.jgrid:hover {
text-decoration: none;
}
.jgrid span.state {
display: inline-block;
height: 16px;
width: 16px;
}
.jgrid span.text {
display: none;
}
/**
* Icons
* The Background Icons for Menus, Toolbars, Quick Icons
* are now in the color css files
*/
/**
* General styles
*/
div.message {
text-align: center;
font-family: Arial, Helvetica, sans-serif;
font-size: 1.2em;
padding: 3px;
margin-bottom: 10px;
font-weight: bold;
}
.helpIndex {
border: 0;
width: 100%;
height: 100%;
padding: 0;
overflow: auto;
}
.helpFrame {
width: 100%;
height: 800px;
padding: 0 5px 0 10px;
}
#treecellhelp {
width: 25%;
display: block;
position: relative;
float: left;
margin: 0;
padding: 2px;
overflow: hidden;
}
#datacellhelp {
width: 73%;
display: block;
float: left;
margin: 0;
padding: 2px 0 0 0;
}
.outline {
padding: 2px;
}
/**
* Modal Styles
*/
h2.modal-title {
margin-left: 15px;
margin-bottom: 0;
margin-top: 5px;
font-size: 1.8em;
padding-bottom: .5em;
}
ul.menu_types {
padding: 0 0 0 15px;
width: 95%;
margin: 0;
}
ul.menu_types li,
dl.menu_type dd ul li {
width: 240px;
list-style: none;
display: block;
float: left;
margin-right: 10px;
}
ul.menu_types li {
width: 47%;
}
dl.menu_type {
width: 240px;
margin: 0;
padding: 0;
}
dl.menu_type dt {
font-weight: bold;
font-size: 1.5em;
float: left;
margin: 13px 0 5px 0;
width: 240px;
}
dl.menu_type dd {
clear: left;
margin: 0;
}
dl.menu_type dd a {
font-size: 1.2em;
}
dl.menu_type dd ul li {
margin: 0;
}
ul#new-modules-list {
padding: 5px 0 0 15px;
width: 95%;
margin: 0;
list-style: none;
}
ul#new-modules-list li {
list-style: none;
display: block;
float: left;
margin: 0 20px 0 0;
width: 47%;
}
ul#new-modules-list li a {
font-size: 1em;
line-height: 1.5em;
}
body.contentpane #filter-bar {
font-size: 80%;
}
body.contentpane input, body.contentpane select {
font-size: 120%;
}
#filter-bar input, #filter-bar select, #filter-bar button {
font-size: 110%;
}
/**
* User Accessibility
*/
/* Skip to Content Structural Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
display: block;
width: 99%;
position: absolute;
top: 0;
left: -200%;
z-index: 2;
}
#skiplinkholder a:focus, #skiplinkholder a:active {
left: 0;
top: 0;
z-index: 100;
}
#skiplinkholder p {
margin: 0;
}
#skiptargetholder {
position: absolute;
left: -200%;
}
/* Skip to Content Visual Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
text-decoration: underline;
padding: 5px;
font-size: 1.3em;
font-weight: bold;
padding-left: 20px;
padding-right: 20px;
}
/* Hide overlayed controls so that keyboarders can get to the modal */
.body-overlayed a,
.body-overlayed input,
.body-overlayed button {
visibility: hidden;
}
.body-overlayed #sbox-window a,
.body-overlayed #sbox-window input,
.body-overlayed #sbox-window button {
visibility: visible;
}
/**
* Admin Form Styles
*/
/* For elements that aren't to be seen by users unless the user does something
* like clicking on a header to see the collapsed section. */
.element-hidden, .hide {
display: none;
}
.hidebtn {
border: 0 !important;
padding: 0 !important;
margin: 0;
width: 0;
height: 0;
}
/* For elements that aren't to be seen by visual users but do need to be read by screenreaders.
* Cannot be used for elements that can get focus such as links and form elements */
.element-invisible, .hidelabeltxt {
height: 0;
overflow: hidden;
position: absolute;
padding: 0;
margin: 0;
}
/* Firefox has issues styling legend so this is a universal fix
for making the legend invisible (i.e. visually it's not there, but screen readers see it */
legend.element-invisible {
position: absolute !important;
margin: 0;
padding: 0;
border: 0;
margin-left: -10000px;
font-size: 1px;
height: 0;
}
fieldset.panelform {
overflow: hidden;
clear: both;
}
fieldset.adminform label,
fieldset.panelform label,
fieldset.adminform span.faux-label,
fieldset.panelform span.faux-label {
line-height: 2em;
clear: left;
min-width: 12em;
float: left;
margin-left: 10px;
margin-right: 5px;
}
fieldset.adminform.long label,
fieldset.panelform.long label,
fieldset.adminform.long span.faux-label,
fieldset.panelform.long span.faux-label {
min-width: 18em;
}
fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
margin-left: 0;
}
fieldset.adminform input, fieldset.adminform span.faux-input, fieldset.adminform textarea, fieldset.adminform select, fieldset.adminform img, fieldset.adminform button,
fieldset.panelform input, fieldset.panelform span.faux-input, fieldset.panelform textarea, fieldset.panelform select, fieldset.panelform img, fieldset.panelform button {
float: left;
margin: 5px 5px 5px 0;
width: auto;
}
/* -------- Batch Section ---------- */
fieldset.batch {
margin: 20px 10px 10px 10px;
padding: 10px;
}
fieldset.batch label {
margin: 5px;
min-width: 40px;
}
fieldset.batch button {
margin: 3px;
}
fieldset#batch-choose-action {
clear: left;
border: 0 none;
}
fieldset.batch label {
float: left;
clear: none;
}
fieldset label#batch-choose-action-lbl {
clear: left;
margin-top: 15px;
}
label#batch-language-lbl,
label#batch-user-lbl {
clear: left;
margin-right: 10px;
margin-top: 15px;
}
select#batch-language-id,
select#batch-user-id {
margin-top: 15px;
}
select#batch-category-id,
select#batch-position-id,
select#batch-menu-id {
margin-right: 30px;
}
fieldset.batch select, fieldset.batch input, fieldset.batch img, fieldset.batch button {
float: left;
}
label#batch-access-lbl,
label#batch-client-lbl {
margin-right: 10px;
}
div#jform_ordering {
font-size: 1.091em;
margin-top: 3px;
}
/* Banner edit */
#jform_impmade, #jform_clicks {
width: 30px;
}
fieldset.panelform label#jform-imp {
min-width: 3em;
font-size: 1.091em;
}
fieldset.adminform input#jform_clickurl {
width: 20em;
}
/**
* ACL STYLES relocated from com_users/media/grid.css
*/
a.move_up {
display: inline-block;
height: 16px;
text-indent: -1000em;
width: 16px;
}
span.move_up {
display: inline-block;
height: 16px;
width: 16px;
}
a.move_down {
display: inline-block;
height: 16px;
text-indent: -1000em;
width: 16px;
}
span.move_down {
display: inline-block;
height: 16px;
width: 16px;
}
a.grid_false {
display: inline-block;
height: 16px;
text-indent: -1000em;
width: 16px;
}
a.grid_true {
display: inline-block;
height: 16px;
text-indent: -1000em;
width: 16px;
}
a.grid_trash {
display: inline-block;
height: 16px;
text-indent: -1000em;
width: 16px;
}
/**
* ACL PANEL STYLES
*/
div.acl-options {
width: 100%;
}
/* All Tabs */
table.aclsummary-table,
table.aclmodify-table {
border-collapse: collapse;
width: 100%;
font-size: 1.091em;
}
td.col1 {
font-size: 1.091em;
text-align: left;
padding: 4px;
}
table.aclsummary-table caption,
table.aclmodify-table caption {
display: none;
}
/* Summary Tab */
table.aclsummary-table th.col1 {
width: 25%;
}
table.aclsummary-table th.col2,
table.aclsummary-table th.col3,
table.aclsummary-table th.col4,
table.aclsummary-table th.col5,
table.aclsummary-table th.col6 {
width: 15%;
vertical-align: bottom;
text-align: center;
}
/* Icons (background images moved to color css files */
span.icon-16-unset,
span.icon-16-allowed,
span.icon-16-denied,
span.icon-16-locked {
padding-left: 18px;
}
label.icon-16-allow,
label.icon-16-deny,
a.icon-16-allow,
a.icon-16-deny,
a.icon-16-allowinactive,
a.icon-16-denyinactive {
display: block;
height: 16px;
width: 16px;
margin: 0 auto;
}
label.icon-16-allow {
text-indent: -9999em;
position: relative;
left: 40%;
}
label.icon-16-deny {
text-indent: -9999em;
position: relative;
left: 40%;
}
/* Create, Edit, Edit State & Delete Tabs */
table.aclmodify-table th.col2,
table.aclmodify-table th.col3,
table.aclmodify-table th.col4 {
width: 20%;
vertical-align: bottom;
text-align: center;
}
table.aclmodify-table select {
margin: 1px;
}
table.aclsummary-table td label,
table.aclmodify-table td label {
min-width: 20px;
}
/* ACL footer/legend */
ul.acllegend {
list-style: none;
font-size: 1.091em;
padding-bottom: 10px;
}
ul.acllegend li {
display: block;
float: left;
padding-right: 20px;
margin: 15px 0 15px 10px;
}
ul.acllegend li.acl-allowed {
padding-left: 20px;
padding-right: 10px;
}
ul.acllegend li.acl-denied {
padding-left: 20px;
padding-right: 20px;
}
ul.acllegend li.acl-editgroups {
padding-right: 10px;
}
ul.acllegend li.acl-resetbtn {
padding-right: 0;
}
li.acl-editgroups,
li.acl-resetbtn {
display: block;
float: left;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
li.acl-editgroups a,
li.acl-resetbtn a {
padding: 6px;
cursor: default;
}
li.acl-editgroups a:hover,
li.acl-resetbtn a:hover,
li.acl-editgroups a:focus,
li.acl-resetbtn a:focus {
text-decoration: none;
cursor: default;
}
li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
text-decoration: none;
cursor: default;
}
table#acl-config {
width: 100%;
margin-top: 15px;
}
table#acl-config th,
table#acl-config td {
height: 2em;
background: #f9fade;
text-align: center;
vertical-align: middle;
}
table#acl-config th.acl-groups {
padding-left: 8px;
font-weight: bold;
text-align: left;
}
table#acl-config th.acl-groups span.gi {
margin-right: 2px;
}
table#acl-config td {
width: 9em;
}
table#acl-config td select {
float: none;
}
.acl-action {
font-size: 1.091em;
margin: auto 0;
}
.acl-groups {
font-size: 1.091em;
font-weight: normal;
}
label#jform_rules-lbl {
float: none;
white-space: nowrap;
display: none;
visibility: hidden;
}
label#jform_filters-lbl {
float: none;
white-space: nowrap;
display: none;
visibility: hidden;
}
/**
* Options modal- config
*/
ul.config-option-list,
ul.config-option-list li {
margin: 0;
padding: 0;
list-style: none;
}
ul.config-option-list fieldset {
margin: 0;
padding-left: 0;
padding-right: 0;
}
/* *
* Permission Rules
*/
#permissions-sliders {
margin-top: 15px;
}
#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
margin: 0 !important;
padding: 0 !important;
list-style-type: none;
}
#permissions-sliders ul#rules li {
margin: 0;
padding: 0;
}
#permissions-sliders ul#rules table.group-rules {
border-collapse: collapse;
margin: 5px;
width: 100%;
}
#permissions-sliders ul#rules table.group-rules td {
padding: 4px;
vertical-align: middle;
text-align: left;
overflow: hidden;
}
#permissions-sliders ul#rules table.group-rules th {
font-size: 1.2em;
overflow: hidden;
font-weight: bold;
}
#permissions-sliders .panel {
margin-bottom: 3px;
margin-left: 0;
border: 0;
}
#permissions-sliders p.rule-desc {
font-size: 1.1em;
}
#permissions-sliders div.rule-notes {
font-size: 1.1em;
}
ul#rules table.group-rules td label {
margin: 0 !important;
line-height: 1.1em;
}
ul#rules table.group-rules td span {
font-size: 1.1em;
padding-bottom: 4px;
}
ul#rules table.group-rules td span span {
font-size: 100%;
}
table.group-rules td select {
margin: 0 !important;
}
#permissions-sliders ul#rules .mypanel {
padding: 0;
line-height: 1.3em;
}
#permissions-sliders .mypanel table.group-rules caption {
font-size: 1.3em;
}
#permissions-sliders ul#rules {
padding: 5px;
}
#permissions-sliders ul#rules table.group-rules th {
text-align: left;
padding: 4px;
}
#permissions-sliders ul#rules table.group-rules td label {
min-width: 1em;
}
#permissions-sliders .pane-toggler span {
padding-left: 20px;
}
#permissions-sliders .pane-toggler-down span {
padding-left: 20px;
}
#permissions-sliders .pane-toggler-down span.level,
#permissions-sliders .pane-toggler span.level {
padding: 0;
}
/*
* Debug styles
*/
.swatch {
text-align: center;
padding: 0 15px 0 15px;
}
/* Tab changes for accessibility */
dl.tabs dt h3 {
padding: 0;
font-size: 100%;
}
/**
* Helpmenus
*/
ul.helpmenu li {
float: right;
margin: 10px;
padding: 0;
list-style-type: none;
font-weight: bold;
}
/* CSS file for Accessible Admin Menu
* based on Matt Carrolls' son of suckerfish
* with javascript by Bill Tomczak
*/
/* Note: set up the font-size on the id and used 100% on the elements.
If ul/li/a are different ems, then the shifting back via non-js keyboard
doesn't work properly */
/**
* Menu Styling
*/
#menu {
/* this is on the main ul */
position: relative;
z-index: 100;
padding: 0;
margin: 0;
width: 100%;
list-style: none;
font-size: 1.2em;
font-weight: bold;
}
#menu ul {
/* all lists */
padding: 0;
margin: 0;
list-style: none;
font-size: 100%;
}
#menu ul li.separator {
margin-bottom: 1em;
}
#menu a {
padding: 0.35em 2.5em 0.35em 2em;
vertical-align: middle;
display: block;
/* width: 10em; */
text-decoration: none;
font-size: 100%;
}
#menu li {
/* all list items */
float: left;
/* width: 12em; width needed or else Opera goes nuts */
font-size: 100%;
}
#menu li a {
white-space: nowrap;
}
#menu li li a {
margin-bottom: 1px;
margin-top: 1px;
width: 10em;
}
#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
cursor: default;
}
#menu li ul {
/* second-level lists */
position: absolute;
width: 16em;
margin-left: -1000em;
/* using left instead of display to hide menus because display: none isn't read by screen readers */
}
#menu li li {
/* second-level row */
border: none;
width: 16em;
}
#menu li ul ul {
/* third-and-above-level lists */
margin: -2.3em 0 0 -1000em;
/* top margin is equal to parent line height+bottom padding */
}
#menu li:hover ul ul, #menu li.sfhover ul ul {
margin-left: -1000em;
}
#menu li:hover ul, #menu li.sfhover ul {
/* lists nested under hovered list items */
margin-left: 0;
}
#menu li li:hover ul, #menu li li.sfhover ul {
margin-left: 16em;
}
/**
* Menu Icons
* These icons are used on the Administrator menu
* The classes are constructed dynamically when the menu is generated
*/
[class^="menu-"],
[class*=" menu-"] {
background-position: 3px 50% !important;
}
.menu-archive {
background-image: url(../images/menu/icon-16-archive.png);
}
.menu-article {
background-image: url(../images/menu/icon-16-article.png);
}
.menu-associations {
background-image: url(../images/menu/icon-16-assoc.png);
}
.menu-banners {
background-image: url(../images/menu/icon-16-banner.png);
}
.menu-banners-clients {
background-image: url(../images/menu/icon-16-banner-client.png);
}
.menu-banners-tracks {
background-image: url(../images/menu/icon-16-banner-tracks.png);
}
.menu-banners-cat {
background-image: url(../images/menu/icon-16-banner-categories.png);
}
.menu-category {
background-image: url(../images/menu/icon-16-category.png);
}
.menu-checkin {
background-image: url(../images/menu/icon-16-checkin.png);
}
.menu-clear {
background-image: url(../images/menu/icon-16-clear.png);
}
.menu-component {
background-image: url(../images/menu/icon-16-component.png);
}
.menu-config {
background-image: url(../images/menu/icon-16-config.png);
}
.menu-contact {
background-image: url(../images/menu/icon-16-contacts.png);
}
.menu-contact-cat {
background-image: url(../images/menu/icon-16-contacts-categories.png);
}
.menu-content {
background-image: url(../images/menu/icon-16-content.png);
}
.menu-cpanel {
background-image: url(../images/menu/icon-16-cpanel.png);
}
.menu-default {
background-image: url(../images/menu/icon-16-default.png);
}
.menu-featured {
background-image: url(../images/menu/icon-16-featured.png);
}
.menu-fields {
background-image: url(../images/menu/icon-16-puzzle.png);
}
.menu-groups {
background-image: url(../images/menu/icon-16-groups.png);
}
.menu-help {
background-image: url(../images/menu/icon-16-help.png);
}
.menu-help-this {
background-image: url(../images/menu/icon-16-help-this.png);
}
.menu-help-forum {
background-image: url(../images/menu/icon-16-help-forum.png);
}
.menu-help-docs {
background-image: url(../images/menu/icon-16-help-docs.png);
}
.menu-help-jed {
background-image: url(../images/menu/icon-16-help-jed.png);
}
.menu-help-jrd {
background-image: url(../images/menu/icon-16-help-jrd.png);
}
.menu-help-community {
background-image: url(../images/menu/icon-16-help-community.png);
}
.menu-help-security {
background-image: url(../images/menu/icon-16-help-security.png);
}
.menu-help-dev {
background-image: url(../images/menu/icon-16-help-dev.png);
}
.menu-help-shop {
background-image: url(../images/menu/icon-16-help-shop.png);
}
.menu-info {
background-image: url(../images/menu/icon-16-info.png);
}
.menu-install {
background-image: url(../images/menu/icon-16-install.png);
}
.menu-joomlaupdate {
background-image: url(../images/menu/icon-16-install.png);
}
.menu-language {
background-image: url(../images/menu/icon-16-language.png);
}
.menu-levels {
background-image: url(../images/menu/icon-16-levels.png);
}
.menu-logout {
background-image: url(../images/menu/icon-16-logout.png);
}
.menu-maintenance {
background-image: url(../images/menu/icon-16-maintenance.png);
}
.menu-massmail {
background-image: url(../images/menu/icon-16-massmail.png);
}
.menu-media {
background-image: url(../images/menu/icon-16-media.png);
}
.menu-menu {
background-image: url(../images/menu/icon-16-menu.png);
}
.menu-menumgr {
background-image: url(../images/menu/icon-16-menumgr.png);
}
.menu-messages {
background-image: url(../images/menu/icon-16-messaging.png);
}
.menu-messages-add {
background-image: url(../images/menu/icon-16-new-privatemessage.png);
}
.menu-messages-read {
background-image: url(../images/menu/icon-16-messages.png);
}
.menu-module {
background-image: url(../images/menu/icon-16-module.png);
}
.menu-newarticle {
background-image: url(../images/menu/icon-16-newarticle.png);
}
.menu-newcategory {
background-image: url(../images/menu/icon-16-newcategory.png);
}
.menu-newgroup {
background-image: url(../images/menu/icon-16-newgroup.png);
}
.menu-newlevel {
background-image: url(../images/menu/icon-16-newlevel.png);
}
.menu-newuser {
background-image: url(../images/menu/icon-16-newuser.png);
}
.menu-plugin {
background-image: url(../images/menu/icon-16-plugin.png);
}
.menu-profile {
background-image: url(../images/menu/icon-16-user.png);
}
.menu-purge {
background-image: url(../images/menu/icon-16-purge.png);
}
.menu-readmess {
background-image: url(../images/menu/icon-16-readmess.png);
}
.menu-section {
background-image: url(../images/menu/icon-16-section.png);
}
.menu-static {
background-image: url(../images/menu/icon-16-static.png);
}
.menu-stats {
background-image: url(../images/menu/icon-16-stats.png);
}
.menu-themes {
background-image: url(../images/menu/icon-16-themes.png);
}
.menu-trash {
background-image: url(../images/menu/icon-16-trash.png);
}
.menu-user {
background-image: url(../images/menu/icon-16-user.png);
}
.menu-user-note {
background-image: url(../images/menu/icon-16-user-note.png);
}
.menu-delete {
background-image: url(../images/menu/icon-16-delete.png);
}
.menu-help-trans {
background-image: url(../images/menu/icon-16-help-trans.png);
}
.menu-newsfeeds {
background-image: url(../images/menu/icon-16-newsfeeds.png);
}
.menu-newsfeeds-cat {
background-image: url(../images/menu/icon-16-newsfeeds-cat.png);
}
.menu-redirect {
background-image: url(../images/menu/icon-16-redirect.png);
}
.menu-search {
background-image: url(../images/menu/icon-16-search.png);
}
.menu-finder {
background-image: url(../images/menu/icon-16-search.png);
}
.menu-weblinks {
background-image: url(../images/menu/icon-16-links.png);
}
.menu-weblinks-cat {
background-image: url(../images/menu/icon-16-links-cat.png);
}
.menu-tags {
background-image: url(../images/menu/icon-16-tags.png);
}
.menu-postinstall {
background-image: url(../images/menu/icon-16-generic.png);
}
.icon-32-cog {
background-image: url(../images/toolbar/icon-32-cog.png);
}
/**
* Extra positioning rules for limited noscript keyboard accessibility
* need the backgrounds here to keep the background as the nav background
* since it is overlaying other content.
* Using margin-left instead of left so that can move back without javascript
* display downlevel ul
*/
#menu li a:focus+ul {
margin-left: 0;
}
#menu li li a:focus+ul {
margin-left: 1016em;
}
/* bring back the focus elements into view */
#menu li li a:focus {
margin-left: 1000em;
width: 10em;
}
#menu li li li a:focus {
margin-left: 2016em;
width: 10em;
}
#menu li:hover a:focus, #menu li.sfhover a.sffocus {
margin-left: 0;
}
#menu li li:hover a:focus+ul, #menu li li.sfhover a.sffocus+ul {
margin-left: 16em;
}
/**
* Sidebar styling
*/
#sidebar {
float:left;
margin: 15px 5px;
}
/**
* Submenu styling
*/
#submenu {
list-style: none;
padding: 0;
margin: 0;
/* border-bottom plus padding-bottom is the technique */
padding-bottom: 2.5em;
line-height: 2em;
}
#submenu ul, #submenu li {
display: inline;
list-style-type: none;
margin: 0;
padding: 0;
}
#submenu li, #submenu span.nolink {
float: left;
font-weight: bold;
margin-right: 8px;
padding: 2px 10px 2px 10px;
text-decoration: none;
cursor: pointer;
-moz-border-radius-topright: 3px;
-moz-border-radius-topleft: 3px;
-webkit-border-top-right-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-right-radius: 3px;
border-top-left-radius: 3px;
}
#submenu span.nolink {
color: #999;
}
#submenu li.active, #submenu span.nolink.active {
cursor: default;
}
#submenu li.active a, #submenu span.nolink.active, #submenu li a:hover, #submenu li a:focus {
text-decoration: none;
}
/* -- CUSTOM LANG STRINGS STYLES ----------- */
.red {
font-weight: bold;
color: #c00;
}
/* -- OTHER STYLES ----------- */
.pre_message {
font-size: 1.3em;
}
/* -- Update check badges -- */
span.update-badge {
background-image: -moz-linear-gradient(center bottom, #FF0000 41%, #FC7E7E 79%);
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.41, rgb(255, 0, 0)), color-stop(0.79, rgb(252, 126, 126)));
border: 2px solid white;
border-radius: 1.5em 1.5em 1.5em 1.5em;
color: white;
display: block;
float: left;
font-size: 1.2em;
font-weight: bold;
height: 1.2em;
left: 60px;
min-width: 1em;
padding: 0 0.1em 0;
position: relative;
top: -88px;
}
/* User Notes */
.unotes ul, .unotes ol {
list-style: none;
list-style-position: inside;
padding-left: 0;
padding-right: 0;
}
.unotes div.utitle {
padding: 10px;
float: left;
font-size: 1.2em;
line-height: 1.2em;
}
.unotes h4 {
margin-top: 0;
margin-bottom: 0;
font-size: 1.3em;
}
.unotes .ubody {
padding-left: 10px;
padding-right: 10px;
font-size: 1.2em;
line-height: 1.5em;
}
.unotes p {
padding-bottom: 10px;
}
/* com-install styling */
div#database-sliders {
margin: 10px;
}
fieldset.uploadform {
margin-top: 10px;
margin-bottom: 10px;
min-height: 200px;
}
/* Installer Database */
#installer-database, #installer-discover, #installer-update, #installer-warnings {
margin-top: 10px;
}
#installer-database #sidebar {
float: none
}
#installer-database p.warning {
padding-left: 20px;
}
#installer-database p.nowarning {
padding-left: 20px;
}
/* Spinner */
.joomlaupdate_spinner {
float: left;
margin-right: 15px;
}
.btn-group {
position: relative;
display: inline-block;
}
.btn-group + .btn-group {
margin-left: 5px;
}
.btn-group > .btn {
position: relative;
float: left;
margin-left: -1px;
}
.icon-48-cpanel {
height: 50px;
width: 50%;
}
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #eee;
border: 1px solid rgba(0, 0, 0, 0.05);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
}
.well blockquote {
border-color: #ddd;
border-color: rgba(0, 0, 0, 0.15);
}
.well-large {
padding: 24px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
.well-small {
padding: 9px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
/* Striped */
.list-striped,
.row-striped {
list-style: none;
line-height: 18px;
text-align: left;
vertical-align: middle;
border-top: 1px solid #dddddd;
margin-left: 0;
font-size: 1.2em;
padding: 9px;
}
.list-striped li,
.list-striped dd,
.row-striped .row,
.row-striped .row-fluid {
border-bottom: 1px solid #dddddd;
padding: 8px;
}
.list-striped li:nth-child(odd),
.list-striped dd:nth-child(odd),
.row-striped .row:nth-child(odd),
.row-striped .row-fluid:nth-child(odd) {
background-color: #f9f9f9;
}
.list-striped li:hover,
.list-striped dd:hover,
.row-striped .row:hover,
.row-striped .row-fluid:hover {
background-color: #f5f5f5;
}
.row-striped .row-fluid {
width: 100%;
box-sizing: border-box;
}
.row-striped .row-fluid [class*="span"] {
min-height: 10px;
}
.alert {
padding: 8px 35px 8px 14px;
margin-bottom: 18px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: #fcf8e3;
border: 1px solid #fbeed5;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
color: #c09853;
font-size: 120%;
}
.alert-heading {
color: inherit;
}
.alert .close {
position: relative;
right: -30px;
top: -5px;
line-height: 18px;
float: right;
font-size: 20px;
font-weight: bold;
}
.alert-success {
background-color: #dff0d8;
border-color: #d6e9c6;
color: #468847;
}
.alert-danger,
.alert-error {
background-color: #f2dede;
border-color: #eed3d7;
color: #b94a48;
}
.alert-info {
background-color: #d9edf7;
border-color: #bce8f1;
color: #3a87ad;
}
.alert-block {
padding-top: 14px;
padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
margin-bottom: 0;
}
.alert-block p + p {
margin-top: 5px;
}
.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active {
z-index: 2;
}
.btn-group > .btn {
position: relative;
float: left;
margin-left: -1px;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
table {
max-width: 100%;
background-color: transparent;
border-collapse: collapse;
border-spacing: 0;
}
.table {
width: 100%;
margin-bottom: 18px;
}
.tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none;
}
.tab-content > .active,
.pill-content > .active {
display: block;
}
.tabs-below > .nav-tabs {
border-top: 1px solid #ddd;
}
#status .btn-toolbar, #status p {
margin: 0px;
}
.navbar .btn-group {
margin: 0;
padding: 5px 5px 6px;
}
/**
* Media
*/
.media .btn {
margin: 10px 20px;
}
.thumbnails > li {
list-style: none outside none;
float: left;
margin-bottom: 18px;
margin-left: 20px;
}
#mediamanager-form {
margin: 10px;
}
.is-tagbox {
float: left;
}
/* Item associations */
.item-associations {
margin: 0;
}
.item-associations li {
list-style: none;
display: inline-block;
margin: 0 0 3px 0;
}
.item-associations li a,
table.adminlist .item-associations li a {
color: #ffffff;
}
.hidden {
display: none;
visibility: hidden;
}
// Bootstrap Tooltips (need to load last, something is overriding these styles in the CSS, debug later ;-) )
@import "../../../../media/jui/less/tooltip.less";
.tooltip {
max-width: 400px;
}
.tooltip-inner {
max-width: none;
text-align: left;
text-shadow: none;
}
th .tooltip-inner {
font-weight: normal;
}
.tooltip.hasimage {
opacity: 1;
}
fieldset.panelform .tooltip img {
float: none;
margin: 0;
}
//Toggle editor button
div.toggle-editor {
float: right;
}
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
.module-edit {
display: inline-block;
}
.break-word {
word-break: break-all;
word-wrap: break-word;
}
.muted {
color: #999;
}
/* Popover minimum height - overwrite bootstrap default */
.popover-content {
min-height: 33px;
}PK ��!]鱦� � colour_standard.lessnu &1i� // colour_standard.less
//
// Less to compile Hathor in the default colour scheme
// -----------------------------------------------------
/**
* Main colors:
* #2c2c2c Text
* #054993 Links
* #ffffff Background, border, text
* #f9fade Background alternate, button/icon/menu background
* #e5f0fa Background (input required)
* #e3e4ca Background Hover, Right/Bottom icon borders
* #c7c8b2 Main borders
* #868778 Top/Left icon hover borders
* #f6f7db Right/Bottom icon hover borders
*
* Special Use Colors:
* #a20000 Text Error, border invalid
* #cccccc Text (faded)
* #005800 Text (success)
* #eeeeee Background (input disabled)
* #ffffcf Background‚ permissions debug
* #cfffda Background‚ permissions debug
* #ffcfcf Background‚ permissions debug
*/
// Import the variables file first to get common variables loaded
@import "hathor_variables.less";
// Define variables unique to this colour scheme, as well as override variables already defined in the common file
@altBackground: #f9fade;
@gradientTop: #f9fade;
@gradientBottom: #f9fade;
@mainBorder: #c7c8b2;
// Import the baseline to compile the CSS
@import "colour_baseline.less";
PK ��!]@e�= �=
forms.lessnu &1i� //
// Forms
// --------------------------------------------------
// GENERAL STYLES
// --------------
// Make all forms have space below them
form {
margin: 0 0 @baseLineHeight;
}
fieldset {
padding: 0;
margin: 0;
border: 0;
}
// Groups of fields with labels on top (legends)
legend {
display: block;
width: 100%;
padding: 0;
margin-bottom: @baseLineHeight;
font-size: @baseFontSize * 1.5;
line-height: @baseLineHeight * 2;
color: @grayDark;
border: 0;
border-bottom: 1px solid #e5e5e5;
// Small
small {
font-size: @baseLineHeight * .75;
color: @grayLight;
}
}
// Set font for forms
label,
input,
button,
select,
textarea {
#font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
}
input,
button,
select,
textarea {
font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
}
// Identify controls by their labels
label {
display: block;
margin-bottom: 5px;
}
// Form controls
// -------------------------
// Shared size and type resets
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
display: inline-block;
height: @baseLineHeight;
padding: 4px 6px;
margin-bottom: @baseLineHeight / 2;
font-size: @baseFontSize;
line-height: @baseLineHeight;
color: @gray;
.border-radius(@inputBorderRadius);
vertical-align: middle;
}
// Reset appearance properties for textual inputs and textarea
// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
input,
textarea,
.uneditable-input {
width: 206px; // plus 12px padding and 2px border
}
// Reset height since textareas have rows
textarea {
height: auto;
}
// Everything else
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
background-color: @inputBackground;
border: 1px solid @inputBorder;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
.transition(~"border linear .2s, box-shadow linear .2s");
// Focus state
&:focus {
border-color: rgba(82,168,236,.8);
outline: 0;
outline: thin dotted \9; /* IE6-9 */
.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
}
}
// Position radios and checkboxes better
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
*margin-top: 0; /* IE7 */
margin-top: 1px \9; /* IE8-9 */
line-height: normal;
}
// Reset width of input images, buttons, radios, checkboxes
input[type="file"],
input[type="image"],
input[type="submit"],
input[type="reset"],
input[type="button"],
input[type="radio"],
input[type="checkbox"] {
width: auto; // Override of generic input selector
}
// Set the height of select and file controls to match text inputs
select,
input[type="file"] {
height: @inputHeight; /* In IE7, the height of the select element cannot be changed by height, only font-size */
*margin-top: 4px; /* For IE7, add top margin to align select with labels */
line-height: @inputHeight;
}
// Make select elements obey height by applying a border
select {
width: 220px; // default input width + 10px of padding that doesn't get applied
border: 1px solid @inputBorder;
background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
}
// Make multiple select elements height not fixed
select[multiple],
select[size] {
height: auto;
}
// Focus for select, file, radio, and checkbox
select:focus,
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
.tab-focus();
}
// Uneditable inputs
// -------------------------
// Make uneditable inputs look inactive
.uneditable-input,
.uneditable-textarea {
color: @grayLight;
background-color: darken(@inputBackground, 1%);
border-color: @inputBorder;
.box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
cursor: not-allowed;
}
// For text that needs to appear as an input but should not be an input
.uneditable-input {
overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
white-space: nowrap;
}
// Make uneditable textareas behave like a textarea
.uneditable-textarea {
width: auto;
height: auto;
}
// Placeholder
// -------------------------
// Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector
input,
textarea {
.placeholder();
}
// CHECKBOXES & RADIOS
// -------------------
// Indent the labels to position radios/checkboxes as hanging
.radio,
.checkbox {
min-height: @baseLineHeight; // clear the floating input if there is no label text
padding-left: 20px;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
float: left;
margin-left: -20px;
}
// Move the options list down to align with labels
.controls > .radio:first-child,
.controls > .checkbox:first-child {
padding-top: 5px; // has to be padding because margin collaspes
}
// Radios and checkboxes on same line
// TODO v3: Convert .inline to .control-inline
.radio.inline,
.checkbox.inline {
display: inline-block;
padding-top: 5px;
margin-bottom: 0;
vertical-align: middle;
}
.radio.inline + .radio.inline,
.checkbox.inline + .checkbox.inline {
margin-left: 10px; // space out consecutive inline controls
}
// INPUT SIZES
// -----------
// General classes for quick sizes
.input-mini { width: 60px; }
.input-small { width: 90px; }
.input-medium { width: 150px; }
.input-large { width: 210px; }
.input-xlarge { width: 270px; }
.input-xxlarge { width: 530px; }
// Grid style input sizes
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input[class*="span"],
// Redeclare since the fluid row class is more specific
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"] {
float: none;
margin-left: 0;
}
// Ensure input-prepend/append never wraps
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
display: inline-block;
}
// GRID SIZING FOR INPUTS
// ----------------------
// Grid sizes
#grid > .input(@gridColumnWidth, @gridGutterWidth);
// Control row for multiple inputs per line
.controls-row {
.clearfix(); // Clear the float from controls
}
// Float to collapse white-space for proper grid alignment
.controls-row [class*="span"],
// Redeclare the fluid grid collapse since we undo the float for inputs
.row-fluid .controls-row [class*="span"] {
float: left;
}
// Explicity set top padding on all checkboxes/radios, not just first-child
.controls-row .checkbox[class*="span"],
.controls-row .radio[class*="span"] {
padding-top: 5px;
}
// DISABLED STATE
// --------------
// Disabled and read-only inputs
input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
cursor: not-allowed;
background-color: @inputDisabledBackground;
}
// Explicitly reset the colors here
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"][readonly],
input[type="checkbox"][readonly] {
background-color: transparent;
}
// FORM FIELD FEEDBACK STATES
// --------------------------
// Warning
.control-group.warning {
.formFieldState(@warningText, @warningText, @warningBackground);
}
// Error
.control-group.error {
.formFieldState(@errorText, @errorText, @errorBackground);
}
// Success
.control-group.success {
.formFieldState(@successText, @successText, @successBackground);
}
// Success
.control-group.info {
.formFieldState(@infoText, @infoText, @infoBackground);
}
// HTML5 invalid states
// Shares styles with the .control-group.error above
input:focus:invalid,
textarea:focus:invalid,
select:focus:invalid {
color: #b94a48;
border-color: #ee5f5b;
&:focus {
border-color: darken(#ee5f5b, 10%);
@shadow: 0 0 6px lighten(#ee5f5b, 20%);
.box-shadow(@shadow);
}
}
// FORM ACTIONS
// ------------
.form-actions {
padding: (@baseLineHeight - 1) 20px @baseLineHeight;
margin-top: @baseLineHeight;
margin-bottom: @baseLineHeight;
background-color: @formActionsBackground;
border-top: 1px solid #e5e5e5;
.clearfix(); // Adding clearfix to allow for .pull-right button containers
}
// HELP TEXT
// ---------
.help-block,
.help-inline {
color: lighten(@textColor, 15%); // lighten the text some for contrast
}
.help-block {
display: block; // account for any element using help-block
margin-bottom: @baseLineHeight / 2;
}
.help-inline {
display: inline-block;
.ie7-inline-block();
vertical-align: middle;
padding-left: 5px;
}
// INPUT GROUPS
// ------------
// Allow us to put symbols and text within the input field for a cleaner look
.input-append,
.input-prepend {
display: inline-block;
margin-bottom: @baseLineHeight / 2;
vertical-align: middle;
font-size: 0; // white space collapse hack
white-space: nowrap; // Prevent span and input from separating
// Reset the white space collapse hack
input,
select,
.uneditable-input,
.dropdown-menu,
.popover {
font-size: @baseFontSize;
}
input,
select,
.uneditable-input {
position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
*margin-left: 0;
vertical-align: top;
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
// Make input on top when focused so blue border and shadow always show
&:focus {
z-index: 2;
}
}
.add-on {
display: inline-block;
width: auto;
height: @baseLineHeight;
min-width: 16px;
padding: 4px 5px;
font-size: @baseFontSize;
font-weight: normal;
line-height: @baseLineHeight;
text-align: center;
text-shadow: 0 1px 0 @white;
background-color: @grayLighter;
border: 1px solid #ccc;
}
.add-on,
.btn,
.btn-group > .dropdown-toggle {
vertical-align: top;
.border-radius(0);
}
.active {
background-color: lighten(@green, 30);
border-color: @green;
}
}
.input-prepend {
.add-on,
.btn {
margin-right: -1px;
}
.add-on:first-child,
.btn:first-child {
// FYI, `.btn:first-child` accounts for a button group that's prepended
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
}
}
.input-append {
input,
select,
.uneditable-input {
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ .btn-group .btn:last-child {
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
.add-on,
.btn,
.btn-group {
margin-left: -1px;
}
.add-on:last-child,
.btn:last-child,
.btn-group:last-child > .dropdown-toggle {
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
// Remove all border-radius for inputs with both prepend and append
.input-prepend.input-append {
input,
select,
.uneditable-input {
.border-radius(0);
+ .btn-group .btn {
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
.add-on:first-child,
.btn:first-child {
margin-right: -1px;
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
}
.add-on:last-child,
.btn:last-child {
margin-left: -1px;
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
.btn-group:first-child {
margin-left: 0;
}
}
// SEARCH FORM
// -----------
input.search-query {
padding-right: 14px;
padding-right: 4px \9;
padding-left: 14px;
padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
margin-bottom: 0; // Remove the default margin on all inputs
.border-radius(15px);
}
/* Allow for input prepend/append in search forms */
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
.border-radius(0); // Override due to specificity
}
.form-search .input-append .search-query {
.border-radius(14px 0 0 14px);
}
.form-search .input-append .btn {
.border-radius(0 14px 14px 0);
}
.form-search .input-prepend .search-query {
.border-radius(0 14px 14px 0);
}
.form-search .input-prepend .btn {
.border-radius(14px 0 0 14px);
}
// HORIZONTAL & VERTICAL FORMS
// ---------------------------
// Common properties
// -----------------
.form-search,
.form-inline,
.form-horizontal {
input,
textarea,
select,
.help-inline,
.uneditable-input,
.input-prepend,
.input-append {
display: inline-block;
.ie7-inline-block();
margin-bottom: 0;
vertical-align: middle;
}
// Re-hide hidden elements due to specifity
.hide {
display: none;
}
}
.form-search label,
.form-inline label,
.form-search .btn-group,
.form-inline .btn-group {
display: inline-block;
}
// Remove margin for input-prepend/-append
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
margin-bottom: 0;
}
// Inline checkbox/radio labels (remove padding on left)
.form-search .radio,
.form-search .checkbox,
.form-inline .radio,
.form-inline .checkbox {
padding-left: 0;
margin-bottom: 0;
vertical-align: middle;
}
// Remove float and margin, set to inline-block
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"],
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
float: left;
margin-right: 3px;
margin-left: 0;
}
// Margin to space out fieldsets
.control-group {
margin-bottom: @baseLineHeight / 2;
}
// Legend collapses margin, so next element is responsible for spacing
legend + .control-group {
margin-top: @baseLineHeight;
-webkit-margin-top-collapse: separate;
}
// Horizontal-specific styles
// --------------------------
.form-horizontal {
// Increase spacing between groups
.control-group {
margin-bottom: @baseLineHeight;
.clearfix();
}
// Float the labels left
.control-label {
float: left;
width: @horizontalComponentOffset - 20;
padding-top: 5px;
text-align: right;
}
// Move over all input controls and content
.controls {
// Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
// don't inherit the margin of the parent, in this case .controls
*display: inline-block;
*padding-left: 20px;
margin-left: @horizontalComponentOffset;
*margin-left: 0;
&:first-child {
*padding-left: @horizontalComponentOffset;
}
}
// Remove bottom margin on block level help text since that's accounted for on .control-group
.help-block {
margin-bottom: 0;
}
// And apply it only to .help-block instances that follow a form control
input,
select,
textarea,
.uneditable-input,
.input-prepend,
.input-append {
+ .help-block {
margin-top: @baseLineHeight / 2;
}
}
// Move over buttons in .form-actions to align with .controls
.form-actions {
padding-left: @horizontalComponentOffset;
}
}
PK ��!]"V.�� � icomoon.lessnu &1i� @font-face {
font-family: 'IcoMoon';
src: url('../../../../media/jui/fonts/IcoMoon.eot');
src: url('../../../../media/jui/fonts/IcoMoon.eot?#iefix') format('embedded-opentype'),
url('../../../../media/jui/fonts/IcoMoon.woff') format('woff'),
url('../../../../media/jui/fonts/IcoMoon.ttf') format('truetype'),
url('../../../../media/jui/fonts/IcoMoon.svg#IcoMoon') format('svg');
font-weight: normal;
font-style: normal;
}
@import "../../../../media/jui/less/icomoon.less";
PK ��!])w��� � modals.lessnu &1i� //
// Modals
// --------------------------------------------------
// Background
.modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: @zindexModalBackdrop;
background-color: @black;
// Fade for backdrop
&.fade { opacity: 0; }
}
.modal-backdrop,
.modal-backdrop.fade.in {
.opacity(80);
}
// Base modal
.modal {
position: fixed;
top: 10%;
left: 50%;
z-index: @zindexModal;
width: 560px;
margin-left: -280px;
background-color: @white;
border: 1px solid #999;
border: 1px solid rgba(0,0,0,.3);
*border: 1px solid #999; /* IE6-7 */
.border-radius(6px);
.box-shadow(0 3px 7px rgba(0,0,0,0.3));
.background-clip(padding-box);
// Remove focus outline from opened modal
outline: none;
&.fade {
.transition(e('opacity .3s linear, top .3s ease-out'));
top: -25%;
}
&.fade.in { top: 10%; }
}
.modal-header {
padding: 9px 15px;
border-bottom: 1px solid #eee;
// Close icon
.close { margin-top: 2px; }
// Heading
h3 {
margin: 0;
line-height: 30px;
}
}
// Body (where all modal content resides)
.modal-body {
position: relative;
overflow-y: auto;
max-height: 400px;
padding: 15px;
}
// Remove bottom margin if need be
.modal-form {
margin-bottom: 0;
}
// Footer (for actions)
.modal-footer {
padding: 14px 15px 15px;
margin-bottom: 0;
text-align: right; // right align buttons
background-color: #f5f5f5;
border-top: 1px solid #ddd;
.border-radius(0 0 6px 6px);
.box-shadow(inset 0 1px 0 @white);
.clearfix(); // clear it in case folks use .pull-* classes on buttons
// Properly space out buttons
.btn + .btn {
margin-left: 5px;
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
}
// but override that for button groups
.btn-group .btn + .btn {
margin-left: -1px;
}
// and override it for block buttons as well
.btn-block + .btn-block {
margin-left: 0;
}
}
PK ��!]�x�� hathor_variables.lessnu &1i� // hathor_variables.less
//
// Less file containing Bootstrap variables needed to compile its CSS
// -----------------------------------------------------
// Grays
// -------------------------
@black: #000000;
@grayDarker: #222222;
@grayDark: #333333;
@gray: #555555;
@grayLight: #999999;
@grayLighter: #eeeeee;
@white: #ffffff;
// Accent colors
// -------------------------
@blue: #049cdb;
@blueDark: #0064cd;
@green: #46a546;
@red: #9d261d;
@yellow: #ffc40d;
@orange: #f89406;
@pink: #c3325f;
@purple: #7a43b6;
// Scaffolding
// -------------------------
@bodyBackground: @white;
@textColor: #2c2c2c;
// Links
// -------------------------
@linkColor: #054993;
@linkColorHover: darken(@linkColor, 15%);
// Typography
// -------------------------
@baseFontSize: 13px;
@baseLineHeight: 15px;
@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
@headingsFontWeight: bold; // instead of browser default, bold
@headingsColor: inherit; // empty to use BS default, @textColor
// Component sizing
// -------------------------
@baseBorderRadius: 4px;
@borderRadiusLarge: 6px;
@borderRadiusSmall: 3px;
// Buttons
// -------------------------
@btnBackground: @white;
@btnBackgroundHighlight: darken(@white, 10%);
@btnBorder: #bbb;
@btnPrimaryBackground: @linkColor;
@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%);
@btnInfoBackground: #5bc0de;
@btnInfoBackgroundHighlight: #2f96b4;
@btnSuccessBackground: #62c462;
@btnSuccessBackgroundHighlight: #51a351;
@btnWarningBackground: lighten(@orange, 15%);
@btnWarningBackgroundHighlight: @orange;
@btnDangerBackground: #ee5f5b;
@btnDangerBackgroundHighlight: #bd362f;
@btnInverseBackground: #444;
@btnInverseBackgroundHighlight: @grayDarker;
// Forms
// -------------------------
@inputBackground: #e5f0fa;
@inputBorder: #ccc;
@inputBorderRadius: 3px;
@inputDisabledBackground: @grayLighter;
@formActionsBackground: #f5f5f5;
@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
// Z-index master list
// -------------------------
// Used for a bird's eye view of components dependent on the z-axis
// Try to avoid customizing these :)
@zindexDropdown: 1000;
@zindexTooltip: 1030;
@zindexFixedNavbar: 1030;
@zindexModalBackdrop: 1040;
@zindexModal: 1050;
@zindexPopover: 1060;
// Form states and alerts
// -------------------------
@warningText: #c09853;
@warningBackground: #fcf8e3;
@warningBorder: darken(spin(@warningBackground, -10), 3%);
@errorText: #a20000;
@errorBackground: #f2dede;
@errorBorder: darken(spin(@errorBackground, -10), 3%);
@successText: #005800;
@successBackground: #dff0d8;
@successBorder: darken(spin(@successBackground, -10), 5%);
@infoText: #3a87ad;
@infoBackground: #d9edf7;
@infoBorder: darken(spin(@infoBackground, -10), 7%);
// Tooltips and popovers
// -------------------------
@tooltipColor: @white;
@tooltipBackground: @black;
@tooltipArrowWidth: 5px;
@tooltipArrowColor: @tooltipBackground;
@popoverBackground: @white;
@popoverArrowWidth: 10px;
@popoverArrowColor: @white;
@popoverTitleBackground: darken(@popoverBackground, 3%);
// Special enhancement for popovers
@popoverArrowOuterWidth: @popoverArrowWidth + 1;
@popoverArrowOuterColor: rgba(0,0,0,.25);
// Variables unique to Hathor
// -------------------------
@toolbarColor: @linkColor;
@hoverBackground: #e5d9c3;
@nwBorder: #868778;
@seBorder: #f6f7db;
@fadedText: #cccccc;
@disabledBackground: #eeeeee;
@permissionDefault: #ffffcf;
@permissionAllowed: #cfffda;
@permissionDenied: #ffcfcf;
PK ��!]�i�9� 9� colour_baseline.lessnu &1i� // colour_baseline.less
//
// Baseline CSS for the Hathor colours.
// Compilers should include this in their colour's imports, but not directly
// compile using this file.
// -----------------------------------------------------
// Core variables and mixins
@import "../../../../media/jui/less/mixins.less";
// Bootstrap Buttons
// Using override for Hathor to target specific instances only
@import "buttons.less";
// Bootstrap Forms
// Using override for Hathor since we're not pulling in all Bootstrap form styles
@import "forms.less";
// Bootstrap Labels and Badges
@import "../../../../media/jui/less/labels-badges.less";
/*
* General styles
*/
body {
background-color: @bodyBackground;
color: @textColor;
}
h1 {
color: @textColor;
}
a:link {
color: @linkColor;
}
a:visited {
color: @linkColor;
}
/*
* Overall Styles
*/
#header {
background: @bodyBackground url(../images/j_logo.png) no-repeat;
}
#header h1.title {
color: @textColor;
}
#nav {
#gradient > .vertical(@gradientTop, @gradientBottom);
border: 1px solid @mainBorder;
}
#content {
background: @bodyBackground;
}
#no-submenu {
border-bottom: 1px solid @mainBorder;
}
#element-box {
background: @bodyBackground;
border-right: 1px solid @mainBorder;
border-bottom: 1px solid @mainBorder;
border-left: 1px solid @mainBorder;
}
#element-box.login {
border-top: 1px solid @mainBorder;
}
/*
* Various Styles
*/
.enabled,
.success,
.allow,
span.writable {
color: @successText;
}
.disabled,
p.error,
.warning,
.deny,
span.unwritable {
color: @errorText;
}
.nowarning {
color: @textColor;
}
.none,
.protected {
color: @mainBorder;
}
span.note {
background: @bodyBackground;
color: @textColor;
}
div.checkin-tick {
background: url(../images/admin/tick.png) 20px 50% no-repeat;
}
/*
* Overlib
*/
.ol-foreground {
background-color: @altBackground;
}
.ol-background {
background-color: @successText;
}
.ol-textfont {
color: @textColor;
}
.ol-captionfont {
color: @bodyBackground;
}
.ol-captionfont a {
color: @linkColor;
}
/*
* Subheader, toolbar, page title
*/
div.subheader .padding {
background: @bodyBackground;
}
.pagetitle h2 {
color: @textColor;
}
div.configuration {
color: @textColor;
background-image: url(../images/menu/icon-16-config.png);
background-repeat: no-repeat;
}
div.toolbar-box {
border-right: 1px solid @mainBorder;
border-bottom: 1px solid @mainBorder;
border-left: 1px solid @mainBorder;
background: @bodyBackground;
}
div.toolbar-list li {
color: @textColor;
}
div.toolbar-list li.divider {
border-right: 1px dotted @hoverBackground;
}
div.toolbar-list a {
border-left: 1px solid @hoverBackground;
border-top: 1px solid @hoverBackground;
border-right: 1px solid @mainBorder;
border-bottom: 1px solid @mainBorder;
background: @altBackground;
}
div.toolbar-list a:hover {
border-left: 1px solid @nwBorder;
border-top: 1px solid @nwBorder;
border-right: 1px solid @seBorder;
border-bottom: 1px solid @seBorder;
background: @hoverBackground;
color: @toolbarColor;
}
div.btn-toolbar {
margin-left: 5px;
padding-top: 3px;
}
div.btn-toolbar li.divider {
border-right: 1px dotted @hoverBackground;
}
div.btn-toolbar div.btn-group button {
border-left: 1px solid @hoverBackground;
border-top: 1px solid @hoverBackground;
border-right: 1px solid @mainBorder;
border-bottom: 1px solid @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
padding: 5px 4px 5px 4px;
}
div.btn-toolbar div.btn-group button:hover {
border-left: 1px solid @nwBorder;
border-top: 1px solid @nwBorder;
border-right: 1px solid @seBorder;
border-bottom: 1px solid @seBorder;
background: @hoverBackground;
color: @toolbarColor;
cursor: pointer;
}
div.btn-toolbar a {
border-left: 1px solid @hoverBackground;
border-top: 1px solid @hoverBackground;
border-right: 1px solid @mainBorder;
border-bottom: 1px solid @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
padding: 6px 5px;
text-align: center;
white-space: nowrap;
font-size: 1.2em;
text-decoration: none;
}
div.btn-toolbar a:hover {
border-left: 1px solid @nwBorder;
border-top: 1px solid @nwBorder;
border-right: 1px solid @seBorder;
border-bottom: 1px solid @seBorder;
background: @hoverBackground;
color: @toolbarColor;
cursor: pointer;
}
div.btn-toolbar div.btn-group button.inactive {
background: @altBackground;
}
/*
* Pane Slider pane Toggler styles
*/
.pane-sliders .title {
color: @textColor;
}
.pane-sliders .panel {
border: 1px solid @mainBorder;
}
.pane-sliders .panel h3 {
#gradient > .vertical(@gradientTop, @gradientBottom);
color: @linkColor;
}
.pane-sliders .panel h3:hover {
background: @hoverBackground;
}
.pane-sliders .panel h3:hover a {
text-decoration: none;
}
.pane-sliders .adminlist {
border: 0 none;
}
.pane-sliders .adminlist td {
border: 0 none;
}
.pane-toggler span {
background: transparent url(../images/j_arrow.png) 5px 50% no-repeat;
}
.pane-toggler-down span {
background: transparent url(../images/j_arrow_down.png) 5px 50% no-repeat;
}
.pane-toggler-down {
border-bottom: 1px solid @mainBorder;
}
/*
* Tabs
*/
dl.tabs dt {
border: 1px solid @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
color: @linkColor;
}
dl.tabs dt:hover {
background: @hoverBackground;
}
dl.tabs dt.open {
background: @bodyBackground;
border-bottom: 1px solid @bodyBackground;
color: @textColor;
}
dl.tabs dt.open a:visited {
color: @textColor;
}
dl.tabs dt a:hover {
text-decoration: none;
}
dl.tabs dt a:focus {
text-decoration: underline;
}
div.current {
border: 1px solid @mainBorder;
background: @bodyBackground;
}
/*
* New parameter styles
*/
div.current fieldset {
border: none 0;
}
div.current fieldset.adminform {
border: 1px solid @mainBorder;
}
/*
* Login Settings
*/
#login-page .pagetitle h2 {
background: transparent;
}
#login-page #header {
border-bottom: 1px solid @mainBorder;
}
#login-page #lock {
background: url(../images/j_login_lock.png) 50% 0 no-repeat;
}
#login-page #element-box.login {
#gradient > .vertical(@gradientTop, @gradientBottom);
}
#form-login {
background: @bodyBackground;
border: 1px solid @mainBorder;
}
#form-login label {
color: @textColor;
}
#form-login div.button1 a {
color: @linkColor;
}
/*
* Cpanel Settings
*/
#cpanel div.icon a, .cpanel div.icon a {
color: @linkColor;
border-left: 1px solid @hoverBackground;
border-top: 1px solid @hoverBackground;
border-right: 1px solid @mainBorder;
border-bottom: 1px solid @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
}
#cpanel div.icon a:hover,
#cpanel div.icon a:focus,
.cpanel div.icon a:hover,
.cpanel div.icon a:focus {
border-left: 1px solid @nwBorder;
border-top: 1px solid @nwBorder;
border-right: 1px solid @seBorder;
border-bottom: 1px solid @seBorder;
color: @linkColor;
background: @hoverBackground;
}
/*
* Form Styles
*/
fieldset {
border: 1px @mainBorder solid;
}
legend {
color: @textColor;
}
fieldset ul.checklist input:focus {
outline: thin dotted @textColor;
}
fieldset#filter-bar {
border-top: 0 solid @mainBorder;
border-right: 0 solid @mainBorder;
border-bottom: 1px solid @mainBorder;
border-left: 0 solid @mainBorder;
}
fieldset#filter-bar ol, fieldset#filter-bar ul {
border: 0;
}
fieldset#filter-bar ol li fieldset, fieldset#filter-bar ul li fieldset {
border: 0;
}
/* Note: these visual cues should be augmented by aria */
.invalid {
color: @errorText;
}
/* must be augmented by aria at the same time if changed dynamically by js
aria-invalid=true or aria-invalid=false */
input.invalid {
border: 1px solid @errorText;
}
/* augmented by aria in template javascript */
input.readonly, span.faux-input {
border: 0;
}
input.required {
background-color: @inputBackground;
}
input.disabled {
background-color: @disabledBackground;
}
input, select, span.faux-input {
background-color: @bodyBackground;
border: 1px solid @mainBorder;
}
/* Inputs used as buttons */
input[type="button"], input[type="submit"], input[type="reset"] {
color: @linkColor;
#gradient > .vertical(@gradientTop, @gradientBottom);
}
input[type="button"]:hover, input[type="button"]:focus,
input[type="submit"]:hover, input[type="submit"]:focus,
input[type="reset"]:hover, input[type="reset"]:focus {
background: @hoverBackground;
}
textarea {
background-color: @bodyBackground;
border: 1px solid @mainBorder;
}
input:focus, select:focus, textarea:focus, option:focus,
input:hover, select:hover, textarea:hover, option:hover {
background-color: @hoverBackground;
color: @linkColor;
}
/*
* Option or Parameter styles
*/
.paramrules {
background: @altBackground;
}
span.gi {
color: @mainBorder;
}
/*
* Admintable Styles
*/
table.admintable td.key, table.admintable td.paramlist_key {
background-color: @altBackground;
color: @textColor;
border-bottom: 1px solid @mainBorder;
border-right: 1px solid @mainBorder;
}
table.paramlist td.paramlist_description {
background-color: @altBackground;
color: @textColor;
border-bottom: 1px solid @mainBorder;
border-right: 1px solid @mainBorder;
}
/*
* Admin Form Styles
*/
fieldset.adminform {
border: 1px solid @mainBorder;
}
/*
* Table styles are for use with tabular data
*/
table.adminform {
background-color: @bodyBackground;
}
table.adminform tr.row0 {
background-color: @bodyBackground;
}
table.adminform tr.row1 {
background-color: @hoverBackground;
}
table.adminform th {
color: @textColor;
background: @bodyBackground;
}
table.adminform tr {
border-bottom: 1px solid @mainBorder;
border-right: 1px solid @mainBorder;
}
/*
* Adminlist Table layout
*/
table.adminlist {
border-spacing: 1px;
background-color: @bodyBackground;
color: @textColor;
}
table.adminlist.modal {
border-top: 1px solid @mainBorder;
border-right: 1px solid @mainBorder;
border-left: 1px solid @mainBorder;
}
table.adminlist a {
color: @linkColor;
}
table.adminlist thead th {
background: @bodyBackground;
color: @textColor;
border-bottom: 1px solid @mainBorder;
}
/*
* Table row styles
*/
table.adminlist tbody tr {
background: @bodyBackground;
}
table.adminlist tbody tr.row1 {
background: @bodyBackground;
}
table.adminlist tbody tr.row1:last-child td,
table.adminlist tbody tr.row1:last-child th {
border-bottom: 1px solid @mainBorder;
}
table.adminlist tbody tr.row0:hover td,
table.adminlist tbody tr.row1:hover td,
table.adminlist tbody tr.row0:hover th,
table.adminlist tbody tr.row1:hover th,
table.adminlist tbody tr.row0:focus td,
table.adminlist tbody tr.row1:focus td,
table.adminlist tbody tr.row0:focus th,
table.adminlist tbody tr.row1:focus th {
background-color: @hoverBackground;
}
table.adminlist tbody tr td,
table.adminlist tbody tr th {
border-right: 1px solid @mainBorder;
}
table.adminlist tbody tr td:last-child {
border-right: none;
}
table.adminlist tbody tr.row0:last-child td,
table.adminlist tbody tr.row0:last-child th {
border-bottom: 1px solid @mainBorder;
}
table.adminlist tbody tr.row0 td,
table.adminlist tbody tr.row0 th {
#gradient > .vertical(@gradientTop, @gradientBottom);
}
table.adminlist {
border-bottom: 0 solid @mainBorder;
}
table.adminlist tfoot tr {
color: @textColor;
}
/*
* Table td/th styles
*/
table.adminlist tfoot td,
table.adminlist tfoot th {
background-color: @bodyBackground;
border-top: 1px solid @mainBorder;
}
/*
* Adminlist buttons
*/
table.adminlist tr td.btns a {
border: 1px solid @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
color: @linkColor;
}
table.adminlist tr td.btns a:hover,
table.adminlist tr td.btns a:active,
table.adminlist tr td.btns a:focus {
background-color: @bodyBackground;
}
/*
* Saving order icon styling in admin tables
*/
a.saveorder {
background: url(../images/admin/filesave.png) no-repeat;
}
a.saveorder.inactive {
background-position: 0 -16px;
}
/*
* Saving order icon styling in admin tables
*/
fieldset.batch {
background: @bodyBackground;
}
/**
* Button styling
*/
button {
color: @toolbarColor;
border: 1px solid @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
}
button:hover,
button:focus {
background: @hoverBackground;
}
.invalid {
color: #ff0000;
}
/* Button 1 Type */
.button1 {
border: 1px solid @mainBorder;
color: @linkColor;
#gradient > .vertical(@gradientTop, @gradientBottom);
}
/* Use this if you add images to the buttons such as directional arrows */
.button1 a {
color: @linkColor;
/* add padding if you are using the directional images */
/* padding: 0 30px 0 6px; */
}
.button1 a:hover,
.button1 a:focus {
background: @hoverBackground;
}
/* Button 2 Type */
.button2-left,
.button2-right {
border: 1px solid @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
}
.button2-left a,
.button2-right a,
.button2-left span,
.button2-right span {
color: @linkColor;
}
/* these are inactive buttons */
.button2-left span,
.button2-right span {
color: #999999;
}
.page span,
.blank span {
color: @linkColor;
}
.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
background: @hoverBackground;
}
/**
* Pagination styles
*/
/* Grey out the current page number */
.pagination .page span {
color: #999999;
}
/**
* Tooltips
*/
.tip {
background: #000000;
border: 1px solid #FFFFFF;
}
.tip-title {
background: url(../images/selector-arrow-std.png) no-repeat;
}
/**
* Calendar
*/
a img.calendar {
background: url(../images/calendar.png) no-repeat;
}
/**
* JGrid styles
*/
.jgrid span.publish {
background-image: url(../images/admin/tick.png);
}
.jgrid span.unpublish {
background-image: url(../images/admin/publish_x.png);
}
.jgrid span.archive {
background-image: url(../images/menu/icon-16-archive.png);
}
.jgrid span.trash {
background-image: url(../images/menu/icon-16-trash.png);
}
.jgrid span.default {
background-image: url(../images/menu/icon-16-default.png);
}
.jgrid span.notdefault {
background-image: url(../images/menu/icon-16-notdefault.png);
}
.jgrid span.checkedout {
background-image: url(../images/admin/checked_out.png);
}
.jgrid span.downarrow {
background-image: url(../images/admin/downarrow.png);
}
.jgrid span.downarrow_disabled {
background-image: url(../images/admin/downarrow0.png);
}
.jgrid span.uparrow {
background-image: url(../images/admin/uparrow.png);
}
.jgrid span.uparrow_disabled {
background-image: url(../images/admin/uparrow0.png);
}
.jgrid span.published {
background-image: url(../images/admin/publish_g.png);
}
.jgrid span.expired {
background-image: url(../images/admin/publish_r.png);
}
.jgrid span.pending {
background-image: url(../images/admin/publish_y.png);
}
.jgrid span.warning {
background-image: url(../images/admin/publish_y.png);
}
/**
* Toolbar icons
* These icons are used for the toolbar buttons
* The classes are constructed dynamically when the toolbar is created
*/
.icon-32-send {
background-image: url(../images/toolbar/icon-32-send.png);
}
.icon-32-delete {
background-image: url(../images/toolbar/icon-32-delete.png);
}
.icon-32-help {
background-image: url(../images/toolbar/icon-32-help.png);
}
.icon-32-cancel {
background-image: url(../images/toolbar/icon-32-cancel.png);
}
.icon-32-checkin {
background-image: url(../images/toolbar/icon-32-checkin.png);
}
.icon-32-options {
background-image: url(../images/toolbar/icon-32-config.png);
}
.icon-32-apply {
background-image: url(../images/toolbar/icon-32-apply.png);
}
.icon-32-back {
background-image: url(../images/toolbar/icon-32-back.png);
}
.icon-32-forward {
background-image: url(../images/toolbar/icon-32-forward.png);
}
.icon-32-save {
background-image: url(../images/toolbar/icon-32-save.png);
}
.icon-32-edit {
background-image: url(../images/toolbar/icon-32-edit.png);
}
.icon-32-copy {
background-image: url(../images/toolbar/icon-32-copy.png);
}
.icon-32-move {
background-image: url(../images/toolbar/icon-32-move.png);
}
.icon-32-new {
background-image: url(../images/toolbar/icon-32-new.png);
}
.icon-32-upload {
background-image: url(../images/toolbar/icon-32-upload.png);
}
.icon-32-assign {
background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-html {
background-image: url(../images/toolbar/icon-32-html.png);
}
.icon-32-css {
background-image: url(../images/toolbar/icon-32-css.png);
}
.icon-32-menus {
background-image: url(../images/toolbar/icon-32-menu.png);
}
.icon-32-publish {
background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-unblock {
background-image: url(../images/toolbar/icon-32-unblock.png);
}
.icon-32-unpublish {
background-image: url(../images/toolbar/icon-32-unpublish.png);
}
.icon-32-restore {
background-image: url(../images/toolbar/icon-32-revert.png);
}
.icon-32-trash {
background-image: url(../images/toolbar/icon-32-trash.png);
}
.icon-32-archive {
background-image: url(../images/toolbar/icon-32-archive.png);
}
.icon-32-unarchive {
background-image: url(../images/toolbar/icon-32-unarchive.png);
}
.icon-32-preview {
background-image: url(../images/toolbar/icon-32-preview.png);
}
.icon-32-default {
background-image: url(../images/toolbar/icon-32-default.png);
}
.icon-32-refresh {
background-image: url(../images/toolbar/icon-32-refresh.png);
}
.icon-32-save-new {
background-image: url(../images/toolbar/icon-32-save-new.png);
}
.icon-32-save-copy {
background-image: url(../images/toolbar/icon-32-save-copy.png);
}
.icon-32-error {
background-image: url(../images/toolbar/icon-32-error.png);
}
.icon-32-new-style {
background-image: url(../images/toolbar/icon-32-new-style.png);
}
.icon-32-delete-style {
background-image: url(../images/toolbar/icon-32-delete-style.png);
}
.icon-32-purge {
background-image: url(../images/toolbar/icon-32-purge.png);
}
.icon-32-remove {
background-image: url(../images/toolbar/icon-32-remove.png);
}
.icon-32-featured {
background-image: url(../images/toolbar/icon-32-featured.png);
}
.icon-32-unfeatured {
background-image: url(../images/toolbar/icon-32-featured.png);
background-position: 0% 100%;
}
.icon-32-export {
background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-stats {
background-image: url(../images/toolbar/icon-32-stats.png);
}
.icon-32-print {
background-image: url(../images/toolbar/icon-32-print.png);
}
.icon-32-batch {
background-image: url(../images/toolbar/icon-32-batch.png);
}
.icon-32-envelope {
background-image: url(../images/toolbar/icon-32-messaging.png);
}
.icon-32-download {
background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-bars {
background-image: url(../images/toolbar/icon-32-stats.png);
}
/**
* Quick Icons
* Also knows as Header Icons
* These are used for the Quick Icons on the Control Panel
* The same classes are also assigned the Component Title
*/
.icon-48-categories {
background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-edit {
background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-add {
background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-generic {
background-image: url(../images/header/icon-48-generic.png);
}
.icon-48-banners {
background-image: url(../images/header/icon-48-banner.png);
}
.icon-48-banners-categories {
background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-edit {
background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-add {
background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-banners-clients {
background-image: url(../images/header/icon-48-banner-client.png);
}
.icon-48-banners-tracks {
background-image: url(../images/header/icon-48-banner-tracks.png);
}
.icon-48-checkin {
background-image: url(../images/header/icon-48-checkin.png);
}
.icon-48-clear {
background-image: url(../images/header/icon-48-clear.png);
}
.icon-48-contact {
background-image: url(../images/header/icon-48-contacts.png);
}
.icon-48-contact-categories {
background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-edit {
background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-add {
background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-purge {
background-image: url(../images/header/icon-48-purge.png);
}
.icon-48-cpanel {
background-image: url(../images/header/icon-48-cpanel.png);
}
.icon-48-config {
background-image: url(../images/header/icon-48-config.png);
}
.icon-48-groups {
background-image: url(../images/header/icon-48-groups.png);
}
.icon-48-groups-add {
background-image: url(../images/header/icon-48-groups-add.png);
}
.icon-48-levels {
background-image: url(../images/header/icon-48-levels.png);
}
.icon-48-levels-add {
background-image: url(../images/header/icon-48-levels-add.png);
}
.icon-48-module {
background-image: url(../images/header/icon-48-module.png);
}
.icon-48-menu {
background-image: url(../images/header/icon-48-menu.png);
}
.icon-48-menu-add {
background-image: url(../images/header/icon-48-menu-add.png);
}
.icon-48-menumgr {
background-image: url(../images/header/icon-48-menumgr.png);
}
.icon-48-trash {
background-image: url(../images/header/icon-48-trash.png);
}
.icon-48-user {
background-image: url(../images/header/icon-48-user.png);
}
.icon-48-user-add {
background-image: url(../images/header/icon-48-user-add.png);
}
.icon-48-user-edit {
background-image: url(../images/header/icon-48-user-edit.png);
}
.icon-48-user-profile {
background-image: url(../images/header/icon-48-user-profile.png);
}
.icon-48-inbox {
background-image: url(../images/header/icon-48-inbox.png);
}
.icon-48-new-privatemessage {
background-image: url(../images/header/icon-48-new-privatemessage.png);
}
.icon-48-msgconfig {
background-image: url(../images/header/icon-48-message_config.png);
}
.icon-48-langmanager {
background-image: url(../images/header/icon-48-language.png);
}
.icon-48-mediamanager {
background-image: url(../images/header/icon-48-media.png);
}
.icon-48-plugin {
background-image: url(../images/header/icon-48-plugin.png);
}
.icon-48-help_header {
background-image: url(../images/header/icon-48-help_header.png);
}
.icon-48-impressions {
background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-browser {
background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-searchtext {
background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-thememanager {
background-image: url(../images/header/icon-48-themes.png);
}
.icon-48-writemess {
background-image: url(../images/header/icon-48-writemess.png);
}
.icon-48-featured {
background-image: url(../images/header/icon-48-featured.png);
}
.icon-48-sections {
background-image: url(../images/header/icon-48-section.png);
}
.icon-48-article-add {
background-image: url(../images/header/icon-48-article-add.png);
}
.icon-48-article-edit {
background-image: url(../images/header/icon-48-article-edit.png);
}
.icon-48-article {
background-image: url(../images/header/icon-48-article.png);
}
.icon-48-content-categories {
background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-edit {
background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-add {
background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-install {
background-image: url(../images/header/icon-48-extension.png);
}
.icon-48-dbbackup {
background-image: url(../images/header/icon-48-backup.png);
}
.icon-48-dbrestore {
background-image: url(../images/header/icon-48-dbrestore.png);
}
.icon-48-dbquery {
background-image: url(../images/header/icon-48-query.png);
}
.icon-48-systeminfo {
background-image: url(../images/header/icon-48-info.png);
}
.icon-48-massmail {
background-image: url(../images/header/icon-48-massmail.png);
}
.icon-48-redirect {
background-image: url(../images/header/icon-48-redirect.png);
}
.icon-48-search {
background-image: url(../images/header/icon-48-search.png);
}
.icon-48-finder {
background-image: url(../images/header/icon-48-search.png);
}
.icon-48-newsfeeds {
background-image: url(../images/header/icon-48-newsfeeds.png);
}
.icon-48-newsfeeds-categories {
background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-edit {
background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-add {
background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-weblinks {
background-image: url(../images/header/icon-48-links.png);
}
.icon-48-weblinks-categories {
background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-edit {
background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-add {
background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-tags {
background-image: url(../images/header/icon-48-tags.png);
}
.icon-48-assoc {
background-image: url(../images/header/icon-48-assoc.png);
}
.icon-48-puzzle {
background-image: url(../images/header/icon-48-puzzle.png);
}
/**
* General styles
*/
div.message {
border: 1px solid @mainBorder;
color: @textColor;
}
.helpFrame {
border-left: 0 solid @mainBorder;
border-right: none;
border-top: none;
border-bottom: none;
}
.outline {
border: 1px solid @mainBorder;
background: @bodyBackground;
}
/**
* Modal Styles
*/
dl.menu_type dt {
border-bottom: 1px solid @mainBorder;
}
ul#new-modules-list {
border-top: 1px solid @mainBorder;
}
/**
* User Accessibility
*/
/* Skip to Content Visual Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
color: @bodyBackground;
background: @linkColor;
border-bottom: solid #336 2px;
}
/**
* Admin Form Styles
*/
fieldset.panelform {
border: none 0;
}
/**
* ACL STYLES relocated from com_users/media/grid.css
*/
a.move_up {
background-image: url('../images/admin/uparrow.png');
}
span.move_up {
background-image: url('../images/admin/uparrow0.png');
}
a.move_down {
background-image: url('../images/admin/downarrow.png');
}
span.move_down {
background-image: url('../images/admin/downarrow0.png');
}
a.grid_false {
background-image: url('../images/admin/publish_x.png');
}
a.grid_true {
background-image: url('../images/admin/tick.png');
}
a.grid_trash {
background-image: url('../images/admin/icon-16-trash.png');
}
/**
* ACL PANEL STYLES
*/
/* All Tabs */
tr.row1 {
background-color: @altBackground;
}
/* Summary Tab */
table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
border-left: 1px solid @mainBorder;
}
/* Icons */
span.icon-16-unset {
background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
span.icon-16-allowed {
background: url(../images/admin/icon-16-allow.png) no-repeat;
}
span.icon-16-denied {
background: url(../images/admin/icon-16-deny.png) no-repeat;
}
span.icon-16-locked {
background: url(../images/admin/checked_out.png) 0 0 no-repeat;
}
label.icon-16-allow {
background: url(../images/admin/icon-16-allow.png) no-repeat;
}
label.icon-16-deny {
background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allow {
background: url(../images/admin/icon-16-allow.png) no-repeat;
}
a.icon-16-deny {
background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allowinactive {
background: url(../images/admin/icon-16-allowinactive.png) no-repeat;
}
a.icon-16-denyinactive {
background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
/* ACL footer/legend */
ul.acllegend li.acl-allowed {
background: url(../images/admin/icon-16-allow.png) no-repeat left;
}
ul.acllegend li.acl-denied {
background: url(../images/admin/icon-16-deny.png) no-repeat left;
}
li.acl-editgroups,
li.acl-resetbtn {
background-color: @altBackground;
border: 1px solid @mainBorder;
}
li.acl-editgroups a,
li.acl-resetbtn a {
color: @linkColor;
}
li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
background-color: @hoverBackground;
}
/* ACL Config --------- */
table#acl-config {
border: 1px solid @mainBorder;
}
table#acl-config th,
table#acl-config td {
background: @altBackground;
border-bottom: 1px solid @mainBorder;
}
table#acl-config th.acl-groups {
border-right: 1px solid @mainBorder;
}
/**
* Mod_rewrite Warning
*/
#jform_sef_rewrite-lbl {
background: url(../images/admin/icon-16-notice-note.png) right top no-repeat;
}
/**
* Permission Rules
*/
#permissions-sliders .tip {
background: @bodyBackground;
border: 1px solid @mainBorder;
}
#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
border: solid 0 @mainBorder;
background: @bodyBackground;
}
ul#rules li .pane-sliders .panel h3.title {
border: solid 0 @mainBorder;
}
#permissions-sliders ul#rules .pane-slider {
border: solid 1px @mainBorder;
}
#permissions-sliders ul#rules li h3 {
border: solid 1px @mainBorder;
}
#permissions-sliders ul#rules li h3.pane-toggler-down a {
border: solid 0;
}
#permissions-sliders ul#rules .group-kind {
color: @textColor;
}
#permissions-sliders ul#rules table.group-rules {
border: solid 1px @mainBorder;
}
#permissions-sliders ul#rules table.group-rules td {
border-right: solid 1px @mainBorder;
border-bottom: solid 1px @mainBorder;
}
#permissions-sliders ul#rules table.group-rules th {
background: @hoverBackground;
border-right: solid 1px @mainBorder;
border-bottom: solid 1px @mainBorder;
color: @textColor;
}
ul#rules table.aclmodify-table {
border: solid 1px @mainBorder;
}
ul#rules table.group-rules td label {
border: solid 0 @mainBorder;
}
#permissions-sliders ul#rules .mypanel {
border: solid 0 @mainBorder;
}
#permissions-sliders ul#rules table.group-rules td {
background: @bodyBackground;
}
#permissions-sliders span.level {
color: @mainBorder;
background-image: none;
}
/*
* Debug styles
*/
.check-0,
table.adminlist tbody td.check-0 {
background-color: @permissionDefault;
}
.check-a,
table.adminlist tbody td.check-a {
background-color: @permissionAllowed;
}
.check-d,
table.adminlist tbody td.check-d {
background-color: @permissionDenied;
}
/**
* System Messages
*/
#system-message dd ul {
color: @textColor;
}
#system-message dd.error ul {
color: @textColor;
}
#system-message dd.message ul {
color: @textColor;
}
#system-message dd.notice ul {
color: @textColor;
}
/** CSS file for Accessible Admin Menu
* based on Matt Carrolls' son of suckerfish
* with javascript by Bill Tomczak
*/
/* Note: set up the font-size on the id and used 100% on the elements.
If ul/li/a are different ems, then the shifting back via non-js keyboard
doesn't work properly */
/**
* Menu Styling
*/
#menu {
/* this is on the main ul */
color: @textColor;
}
#menu ul.dropdown-menu {
/* all lists */
#gradient > .vertical(@gradientTop, @gradientBottom);
color: @textColor;
}
#menu ul.dropdown-menu li.dropdown-submenu {
background: url(../images/j_arrow.png) no-repeat right 50%;
}
#menu ul.dropdown-menu li.divider {
margin-bottom: 0;
border-bottom: 1px dotted @mainBorder;
}
#menu a {
color: @toolbarColor;
background-repeat: no-repeat;
background-position: left 50%;
}
#menu li {
/* all list items */
border-right: 1px solid @mainBorder;
background-color: transparent;
}
#menu li a:hover, #menu li a:focus {
background-color: @hoverBackground;
}
#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
color: @mainBorder;
#gradient > .vertical(@gradientTop, @gradientBottom);
}
#menu li ul {
/* second-level lists */
border: 1px solid @mainBorder;
}
#menu li li {
/* second-level row */
background-color: transparent;
}
/**
* Styling parents
*/
/* 1 level - sfhover */
#menu li.sfhover a {
background-color: @hoverBackground;
}
/* 2 level - normal */
#menu li.sfhover li a {
background-color: transparent;
}
/* 2 level - hover */
#menu li.sfhover li.sfhover a, #menu li li a:focus {
background-color: @hoverBackground;
}
/* 3 level - normal */
#menu li.sfhover li.sfhover li a {
background-color: transparent;
}
/* 3 level - hover */
#menu li.sfhover li.sfhover li.sfhover a, #menu li li li a:focus {
background-color: @hoverBackground;
}
/* bring back the focus elements into view */
#menu li li a:focus, #menu li li li a:focus {
background-color: @hoverBackground;
}
#menu li li li a:focus {
background-color: @hoverBackground;
}
/**
* Submenu styling
*/
#submenu {
border-bottom: 1px solid @mainBorder;
/* border-bottom plus padding-bottom is the technique */
/* This is the background befind the tabs */
/*background: @bodyBackground;*/
}
#submenu li, #submenu span.nolink {
#gradient > .vertical(@gradientTop, @gradientBottom);
border: 1px solid @mainBorder;
color: @linkColor;
}
#submenu li:hover, #submenu li:focus {
background: @hoverBackground;
}
#submenu li.active, #submenu span.nolink.active {
background: @bodyBackground;
border-bottom: 1px solid @bodyBackground;
}
#submenu li.active a,
#submenu span.nolink.active {
color: #000;
}
.element-invisible {
margin: 0;
padding: 0;
}
/* -- Codemirror Editor ----------- */
div.CodeMirror-wrapping {
border: 1px solid @mainBorder;
}
/* User Notes */
table.adminform tr.row0 {
background-color: @bodyBackground;
}
ul.alternating > li:nth-child(odd) {
background-color: @bodyBackground;
}
ul.alternating > li:nth-child(even) {
background-color: @altBackground;
}
ol.alternating > li:nth-child(odd) {
background-color: @bodyBackground;
}
ol.alternating > li:nth-child(even) {
background-color: @altBackground;
}
/* Installer Database */
#installer-database, #installer-discover, #installer-update, #installer-warnings {
border-top: 1px solid @mainBorder;
}
#installer-database p.warning {
background: transparent url(../images/admin/icon-16-deny.png) center left no-repeat;
}
#installer-database p.nowarning {
background: transparent url(../images/admin/icon-16-allow.png) center left no-repeat;
}
/* Override default bootstrap font-size */
.input-append,
.input-prepend {
font-size: 1.2em;
}
PK ��!]��u�# �# variables.lessnu &1i� //
// Variables
// --------------------------------------------------
// Global values
// --------------------------------------------------
// Grays
// -------------------------
@black: #000;
@grayDarker: #222;
@grayDark: #333;
@gray: #555;
@grayLight: #999;
@grayLighter: #eee;
@white: #fff;
// Accent colors
// -------------------------
@blue: #049cdb;
@blueDark: #0064cd;
@green: #46a546;
@red: #9d261d;
@yellow: #ffc40d;
@orange: #f89406;
@pink: #c3325f;
@purple: #7a43b6;
// Scaffolding
// -------------------------
@bodyBackground: @white;
@textColor: @grayDark;
// Links
// -------------------------
@linkColor: #08c;
@linkColorHover: darken(@linkColor, 15%);
// Typography
// -------------------------
@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif;
@serifFontFamily: Georgia, "Times New Roman", Times, serif;
@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace;
@baseFontSize: 14px;
@baseFontFamily: @sansFontFamily;
@baseLineHeight: 20px;
@altFontFamily: @serifFontFamily;
@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
@headingsFontWeight: bold; // instead of browser default, bold
@headingsColor: inherit; // empty to use BS default, @textColor
// Component sizing
// -------------------------
// Based on 14px font-size and 20px line-height
@fontSizeLarge: @baseFontSize * 1.25; // ~18px
@fontSizeSmall: @baseFontSize * 0.85; // ~12px
@fontSizeMini: @baseFontSize * 0.75; // ~11px
@paddingLarge: 11px 19px; // 44px
@paddingSmall: 2px 10px; // 26px
@paddingMini: 0 6px; // 22px
@baseBorderRadius: 4px;
@borderRadiusLarge: 6px;
@borderRadiusSmall: 3px;
// Tables
// -------------------------
@tableBackground: transparent; // overall background-color
@tableBackgroundAccent: #f9f9f9; // for striping
@tableBackgroundHover: #f5f5f5; // for hover
@tableBorder: #ddd; // table and cell border
// Buttons
// -------------------------
@btnBackground: @white;
@btnBackgroundHighlight: darken(@white, 10%);
@btnBorder: #ccc;
@btnPrimaryBackground: @linkColor;
@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%);
@btnInfoBackground: #5bc0de;
@btnInfoBackgroundHighlight: #2f96b4;
@btnSuccessBackground: #62c462;
@btnSuccessBackgroundHighlight: #51a351;
@btnWarningBackground: lighten(@orange, 15%);
@btnWarningBackgroundHighlight: @orange;
@btnDangerBackground: #ee5f5b;
@btnDangerBackgroundHighlight: #bd362f;
@btnInverseBackground: #444;
@btnInverseBackgroundHighlight: @grayDarker;
// Forms
// -------------------------
@inputBackground: @white;
@inputBorder: #ccc;
@inputBorderRadius: @baseBorderRadius;
@inputDisabledBackground: @grayLighter;
@formActionsBackground: #f5f5f5;
@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
// Dropdowns
// -------------------------
@dropdownBackground: @white;
@dropdownBorder: rgba(0,0,0,.2);
@dropdownDividerTop: #e5e5e5;
@dropdownDividerBottom: @white;
@dropdownLinkColor: @grayDark;
@dropdownLinkColorHover: @white;
@dropdownLinkColorActive: @white;
@dropdownLinkBackgroundActive: @linkColor;
@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive;
// COMPONENT VARIABLES
// --------------------------------------------------
// Z-index master list
// -------------------------
// Used for a bird's eye view of components dependent on the z-axis
// Try to avoid customizing these :)
@zindexDropdown: 1000;
@zindexPopover: 1010;
@zindexTooltip: 1030;
@zindexFixedNavbar: 1030;
@zindexModalBackdrop: 1040;
@zindexModal: 1050;
// Sprite icons path
// -------------------------
@iconSpritePath: "../img/glyphicons-halflings.png";
@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
// Input placeholder text color
// -------------------------
@placeholderText: @grayLight;
// Hr border color
// -------------------------
@hrBorder: @grayLighter;
// Horizontal forms & lists
// -------------------------
@horizontalComponentOffset: 180px;
// Wells
// -------------------------
@wellBackground: #f5f5f5;
// Navbar
// -------------------------
@navbarCollapseWidth: 979px;
@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1;
@navbarHeight: 40px;
@navbarBackgroundHighlight: #ffffff;
@navbarBackground: darken(@navbarBackgroundHighlight, 5%);
@navbarBorder: darken(@navbarBackground, 12%);
@navbarText: #777;
@navbarLinkColor: #777;
@navbarLinkColorHover: @grayDark;
@navbarLinkColorActive: @gray;
@navbarLinkBackgroundHover: transparent;
@navbarLinkBackgroundActive: darken(@navbarBackground, 5%);
@navbarBrandColor: @navbarLinkColor;
// Inverted navbar
@navbarInverseBackground: #111111;
@navbarInverseBackgroundHighlight: #222222;
@navbarInverseBorder: #252525;
@navbarInverseText: @grayLight;
@navbarInverseLinkColor: @grayLight;
@navbarInverseLinkColorHover: @white;
@navbarInverseLinkColorActive: @navbarInverseLinkColorHover;
@navbarInverseLinkBackgroundHover: transparent;
@navbarInverseLinkBackgroundActive: @navbarInverseBackground;
@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%);
@navbarInverseSearchBackgroundFocus: @white;
@navbarInverseSearchBorder: @navbarInverseBackground;
@navbarInverseSearchPlaceholderColor: #ccc;
@navbarInverseBrandColor: @navbarInverseLinkColor;
// Pagination
// -------------------------
@paginationBackground: #fff;
@paginationBorder: #ddd;
@paginationActiveBackground: #f5f5f5;
// Hero unit
// -------------------------
@heroUnitBackground: @grayLighter;
@heroUnitHeadingColor: inherit;
@heroUnitLeadColor: inherit;
// Form states and alerts
// -------------------------
@warningText: #c09853;
@warningBackground: #fcf8e3;
@warningBorder: darken(spin(@warningBackground, -10), 3%);
@errorText: #b94a48;
@errorBackground: #f2dede;
@errorBorder: darken(spin(@errorBackground, -10), 3%);
@successText: #468847;
@successBackground: #dff0d8;
@successBorder: darken(spin(@successBackground, -10), 5%);
@infoText: #3a87ad;
@infoBackground: #d9edf7;
@infoBorder: darken(spin(@infoBackground, -10), 7%);
// Tooltips and popovers
// -------------------------
@tooltipColor: #fff;
@tooltipBackground: #000;
@tooltipArrowWidth: 5px;
@tooltipArrowColor: @tooltipBackground;
@popoverBackground: #fff;
@popoverArrowWidth: 10px;
@popoverArrowColor: #fff;
@popoverTitleBackground: darken(@popoverBackground, 3%);
// Special enhancement for popovers
@popoverArrowOuterWidth: @popoverArrowWidth + 1;
@popoverArrowOuterColor: rgba(0,0,0,.25);
// GRID
// --------------------------------------------------
// Default 940px grid
// -------------------------
@gridColumns: 12;
@gridColumnWidth: 60px;
@gridGutterWidth: 20px;
@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
// 1200px min
@gridColumnWidth1200: 70px;
@gridGutterWidth1200: 30px;
@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
// 768px-979px
@gridColumnWidth768: 42px;
@gridGutterWidth768: 20px;
@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
// Fluid grid
// -------------------------
@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth);
@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth);
// 1200px min
@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200);
@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200);
// 768px-979px
@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768);
@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768);
PK g}!]c�w w
strapper.lessnu &1i� /*!
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file defines Akeeba Strapper specific styling overrides
*/
@import 'bootstrap/variables.less';
div.akeeba-bootstrap {
font-size: 10pt;
background: transparent;
// RocketTheme templates force a background image in alerts
.alert {
background-image: none;
}
// Wide form layout
form.form-horizontal-wide {
label.control-label {
width: 300px;
}
div.controls {
margin-left: 320px;
}
textarea {
width: 450px;
}
}
// Table layout fixes
td.order {
& {
width: 12px;
}
span {
line-height: 16px;
height: 16px;
margin: 0;
padding: 0;
}
a.jgrid span.state {
background-repeat: no-repeat;
height: 12px;
margin-bottom: 2px;
span.text {
line-height: 16px;
}
}
input.text-area-order {
margin-bottom: 0;
width: 20px;
}
.sortable-handler {
display: block;
float: left;
margin: 1px 0 0 0;
padding: 5px 5px;
}
.order-enabled {
width: 60px;
}
.order-disabled {
.sortable-handler {
margin: 0;
padding: 0;
}
}
}
th a.save-order {
height: 19px;
}
div {
// Clear fixes
&.ak_clr_left {
clear: left;
}
&.ak_clr {
clear: both;
}
// Modal toolbar button fix
&.icon a.modal {
position: relative;
top: inherit;
left: inherit;
z-index: inherit;
margin: 0 !important;
box-shadow: none;
}
// Icon wrapper fix
[class^="icon-wrapper"] {
display: inline;
}
}
}
#akeeba-bootstrap {
&:not(.joomla-version-25) {
input[name="cid[]"] {
margin: -3px 0 0 0;
}
}
}
// Icon wrapper fix
div.icon-wrapper {
display: inline;
}
/**
* Akeeba Live Update button styling
*/
span.liveupdate-icon-
{
¬supported {
color: @gray;
}
&crashed {
color: @gray;
}
&updates {
font-weight: bold;
color: @red;
font-size: 0.87em;
}
&noupdates {
color: @green;
}
}PK g}!]��(4 4 strapper.j25.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file defines Akeeba Strapper specific styling overrides
*/
.akeeba-bootstrap {
// Joomla! 2.5+ workaround for booleanlist controls
label.radiobtn {
display: inline-block;
float: none;
margin: 0.6em 0.5em 0 0;
}
div.controls {
input[type="radio"] {
display: inline-block;
float: none;
margin: -0.3em 0 0 0;
}
}
// Beez2 overrides for front-end link bars
ul.nav-tabs li {
list-style: none;
}
// Fixed margin for span* elements
.row-fluid [class*="span"]{
margin-left: 15px;
}
.row-fluid form [class*="span"]:first-of-type{
margin-left: 0;
}
}PK g}!]a�(z� � strapper.j3.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file defines Akeeba Strapper specific styling overrides
*/
.akeeba-bootstrap {
// Backport of Joomla! 1.x/2.x cpanel icons to Joomla! 3.x
.cpanel div.icon,
#cpanel div.icon {
text-align: center;
margin-right: 15px;
float: left;
margin-bottom: 15px;
font-size: 0.9em;
a {
padding: 7px 5px 5px;
background-color: white;
background-position: -30px;
display: block;
float: left;
height: 97px;
width: 108px;
color: #565656;
vertical-align: middle;
text-decoration: none;
border: 1px solid #CCC;
border-radius: 5px;
transition-property: none;
box-shadow: inset -5px -5px 10px rgba(0, 0, 0, 0.1), inset 5px 5px 10px rgba(0, 0, 0, 0.05);
&:hover, &:focus, &:active {
background-position: 0;
-webkit-border-bottom-left-radius: inherit;
-moz-border-radius-bottomleft: inherit;
border-bottom-left-radius: inherit;
box-shadow: inset 5px 5px 10px rgba(0, 0, 0, 0.1), inset -5px -5px 10px rgba(0, 0, 0, 0.05);
position: relative;
z-index: 10;
}
}
span {
display: block;
text-align: center;
}
}
// Joomla! 3.x workarounds for missing icon classes
div#toolbar div#toolbar-back button.btn span.icon-back::before {
content: "";
}
// Joomla! 3.x workarounds for sort icons
.icon-downarrow::before, .akeeba-bootstrap .icon-arrow-down::before {
content:""
}
.icon-uparrow::before, .akeeba-bootstrap .icon-arrow-up::before {
content:""
}
// Joomla! 3.0+ workaround for booleanlist controls
label.radio {
display: inline-block;
}
div.controls>div.controls {
margin: 0;
}
}
PK g}!]XZ��L L bootstrap.j32.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes only Joomla! 3.2-specific style overrides
*/
/*
* Bootstrap (namespaced)
*/
div.akeeba-bootstrap
{
/**
* If your template already includes Bootstrap CSS styling please comment
* out this line and uncomment the include below.
*/
// @import "bootstrap.full.j32.less";
/**
* If your template already includes Bootstrap CSS styling please uncomment
* out this line and comment out the include above.
*/
@import "bootstrap.minimal.j32.less";
}
// Popovers must not be namespaced
@import "bootstrap/variables";
@import "bootstrap/mixins";
@import "bootstrap/popovers";
/*
* Akeeba Strapper overrides
*/
@import "strapper.less";
@import "strapper.j3.less";PK g}!]�=� bootstrap/hero-unit.lessnu &1i� //
// Hero unit
// --------------------------------------------------
.hero-unit {
padding: 60px;
margin-bottom: 30px;
font-size: 18px;
font-weight: 200;
line-height: @baseLineHeight * 1.5;
color: @heroUnitLeadColor;
background-color: @heroUnitBackground;
.border-radius(6px);
h1 {
margin-bottom: 0;
font-size: 60px;
line-height: 1;
color: @heroUnitHeadingColor;
letter-spacing: -1px;
}
li {
line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less
}
}
PK g}!]l{nc( ( bootstrap/wells.lessnu &1i� //
// Wells
// --------------------------------------------------
// Base class
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: @wellBackground;
border: 1px solid darken(@wellBackground, 7%);
.border-radius(@baseBorderRadius);
.box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
blockquote {
border-color: #ddd;
border-color: rgba(0,0,0,.15);
}
}
// Sizes
.well-large {
padding: 24px;
.border-radius(@borderRadiusLarge);
}
.well-small {
padding: 9px;
.border-radius(@borderRadiusSmall);
}
PK g}!]���Y �Y bootstrap/mixins.lessnu &1i� //
// Mixins
// --------------------------------------------------
// UTILITY MIXINS
// --------------------------------------------------
// Clearfix
// --------
// For clearing floats like a boss h5bp.com/q
.clearfix {
*zoom: 1;
&:before,
&:after {
display: table;
content: "";
// Fixes Opera/contenteditable bug:
// http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
line-height: 0;
}
&:after {
clear: both;
}
}
// Webkit-style focus
// ------------------
.tab-focus() {
// Default
outline: thin dotted #333;
// Webkit
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
// Center-align a block level element
// ----------------------------------
.center-block() {
display: block;
margin-left: auto;
margin-right: auto;
}
// IE7 inline-block
// ----------------
.ie7-inline-block() {
*display: inline; /* IE7 inline-block hack */
*zoom: 1;
}
// IE7 likes to collapse whitespace on either side of the inline-block elements.
// Ems because we're attempting to match the width of a space character. Left
// version is for form buttons, which typically come after other elements, and
// right version is for icons, which come before. Applying both is ok, but it will
// mean that space between those elements will be .6em (~2 space characters) in IE7,
// instead of the 1 space in other browsers.
.ie7-restore-left-whitespace() {
*margin-left: .3em;
&:first-child {
*margin-left: 0;
}
}
.ie7-restore-right-whitespace() {
*margin-right: .3em;
}
// Sizing shortcuts
// -------------------------
.size(@height, @width) {
width: @width;
height: @height;
}
.square(@size) {
.size(@size, @size);
}
// Placeholder text
// -------------------------
.placeholder(@color: @placeholderText) {
&:-moz-placeholder {
color: @color;
}
&:-ms-input-placeholder {
color: @color;
}
&::-webkit-input-placeholder {
color: @color;
}
}
// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
.text-overflow() {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
// CSS image replacement
// -------------------------
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
.hide-text {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
// FONTS
// --------------------------------------------------
#font {
#family {
.serif() {
font-family: @serifFontFamily;
}
.sans-serif() {
font-family: @sansFontFamily;
}
.monospace() {
font-family: @monoFontFamily;
}
}
.shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
font-size: @size;
font-weight: @weight;
line-height: @lineHeight;
}
.serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .serif;
#font > .shorthand(@size, @weight, @lineHeight);
}
.sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .sans-serif;
#font > .shorthand(@size, @weight, @lineHeight);
}
.monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .monospace;
#font > .shorthand(@size, @weight, @lineHeight);
}
}
// FORMS
// --------------------------------------------------
// Block level inputs
.input-block-level {
display: block;
width: 100%;
min-height: @inputHeight; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
.box-sizing(border-box); // Makes inputs behave like true block-level elements
}
// Mixin for form field states
.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
// Set the text color
.control-label,
.help-block,
.help-inline {
color: @textColor;
}
// Style inputs accordingly
.checkbox,
.radio,
input,
select,
textarea {
color: @textColor;
}
input,
select,
textarea {
border-color: @borderColor;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
&:focus {
border-color: darken(@borderColor, 10%);
@shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
.box-shadow(@shadow);
}
}
// Give a small background color for input-prepend/-append
.input-prepend .add-on,
.input-append .add-on {
color: @textColor;
background-color: @backgroundColor;
border-color: @textColor;
}
}
// CSS3 PROPERTIES
// --------------------------------------------------
// Border Radius
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
// Single Corner Border Radius
.border-top-left-radius(@radius) {
-webkit-border-top-left-radius: @radius;
-moz-border-radius-topleft: @radius;
border-top-left-radius: @radius;
}
.border-top-right-radius(@radius) {
-webkit-border-top-right-radius: @radius;
-moz-border-radius-topright: @radius;
border-top-right-radius: @radius;
}
.border-bottom-right-radius(@radius) {
-webkit-border-bottom-right-radius: @radius;
-moz-border-radius-bottomright: @radius;
border-bottom-right-radius: @radius;
}
.border-bottom-left-radius(@radius) {
-webkit-border-bottom-left-radius: @radius;
-moz-border-radius-bottomleft: @radius;
border-bottom-left-radius: @radius;
}
// Single Side Border Radius
.border-top-radius(@radius) {
.border-top-right-radius(@radius);
.border-top-left-radius(@radius);
}
.border-right-radius(@radius) {
.border-top-right-radius(@radius);
.border-bottom-right-radius(@radius);
}
.border-bottom-radius(@radius) {
.border-bottom-right-radius(@radius);
.border-bottom-left-radius(@radius);
}
.border-left-radius(@radius) {
.border-top-left-radius(@radius);
.border-bottom-left-radius(@radius);
}
// Drop shadows
.box-shadow(@shadow) {
-webkit-box-shadow: @shadow;
-moz-box-shadow: @shadow;
box-shadow: @shadow;
}
// Transitions
.transition(@transition) {
-webkit-transition: @transition;
-moz-transition: @transition;
-o-transition: @transition;
transition: @transition;
}
.transition-delay(@transition-delay) {
-webkit-transition-delay: @transition-delay;
-moz-transition-delay: @transition-delay;
-o-transition-delay: @transition-delay;
transition-delay: @transition-delay;
}
.transition-duration(@transition-duration) {
-webkit-transition-duration: @transition-duration;
-moz-transition-duration: @transition-duration;
-o-transition-duration: @transition-duration;
transition-duration: @transition-duration;
}
// Transformations
.rotate(@degrees) {
-webkit-transform: rotate(@degrees);
-moz-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
-o-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.scale(@ratio) {
-webkit-transform: scale(@ratio);
-moz-transform: scale(@ratio);
-ms-transform: scale(@ratio);
-o-transform: scale(@ratio);
transform: scale(@ratio);
}
.translate(@x, @y) {
-webkit-transform: translate(@x, @y);
-moz-transform: translate(@x, @y);
-ms-transform: translate(@x, @y);
-o-transform: translate(@x, @y);
transform: translate(@x, @y);
}
.skew(@x, @y) {
-webkit-transform: skew(@x, @y);
-moz-transform: skew(@x, @y);
-ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885
-o-transform: skew(@x, @y);
transform: skew(@x, @y);
-webkit-backface-visibility: hidden; // See https://github.com/twbs/bootstrap/issues/5319
}
.translate3d(@x, @y, @z) {
-webkit-transform: translate3d(@x, @y, @z);
-moz-transform: translate3d(@x, @y, @z);
-o-transform: translate3d(@x, @y, @z);
transform: translate3d(@x, @y, @z);
}
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
.backface-visibility(@visibility){
-webkit-backface-visibility: @visibility;
-moz-backface-visibility: @visibility;
backface-visibility: @visibility;
}
// Background clipping
// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
.background-clip(@clip) {
-webkit-background-clip: @clip;
-moz-background-clip: @clip;
background-clip: @clip;
}
// Background sizing
.background-size(@size) {
-webkit-background-size: @size;
-moz-background-size: @size;
-o-background-size: @size;
background-size: @size;
}
// Box sizing
.box-sizing(@boxmodel) {
-webkit-box-sizing: @boxmodel;
-moz-box-sizing: @boxmodel;
box-sizing: @boxmodel;
}
// User select
// For selecting text on the page
.user-select(@select) {
-webkit-user-select: @select;
-moz-user-select: @select;
-ms-user-select: @select;
-o-user-select: @select;
user-select: @select;
}
// Resize anything
.resizable(@direction) {
resize: @direction; // Options: horizontal, vertical, both
overflow: auto; // Safari fix
}
// CSS3 Content Columns
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
-webkit-column-count: @columnCount;
-moz-column-count: @columnCount;
column-count: @columnCount;
-webkit-column-gap: @columnGap;
-moz-column-gap: @columnGap;
column-gap: @columnGap;
}
// Optional hyphenation
.hyphens(@mode: auto) {
word-wrap: break-word;
-webkit-hyphens: @mode;
-moz-hyphens: @mode;
-ms-hyphens: @mode;
-o-hyphens: @mode;
hyphens: @mode;
}
// Opacity
.opacity(@opacity) {
opacity: @opacity / 100;
filter: ~"alpha(opacity=@{opacity})";
}
// BACKGROUNDS
// --------------------------------------------------
// Add an alphatransparency value to any background or border color (via Elyse Holladay)
#translucent {
.background(@color: @white, @alpha: 1) {
background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
}
.border(@color: @white, @alpha: 1) {
border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
.background-clip(padding-box);
}
}
// Gradient Bar Colors for buttons and alerts
.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
color: @textColor;
text-shadow: @textShadow;
#gradient > .vertical(@primaryColor, @secondaryColor);
border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
}
// Gradients
#gradient {
.horizontal(@startColor: #555, @endColor: #333) {
background-color: @endColor;
background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
}
.vertical(@startColor: #555, @endColor: #333) {
background-color: mix(@startColor, @endColor, 60%);
background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
}
.directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
background-color: @endColor;
background-repeat: repeat-x;
background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
}
.horizontal-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
background-color: mix(@midColor, @endColor, 80%);
background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
background-image: -webkit-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
background-image: -moz-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
background-image: -o-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
background-image: linear-gradient(to right, @startColor, @midColor @colorStop, @endColor);
background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
}
.vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
background-color: mix(@midColor, @endColor, 80%);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
}
.radial(@innerColor: #555, @outerColor: #333) {
background-color: @outerColor;
background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
background-repeat: no-repeat;
}
.striped(@color: #555, @angle: 45deg) {
background-color: @color;
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
}
}
// Reset filters for IE
.reset-filter() {
filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}
// COMPONENT MIXINS
// --------------------------------------------------
// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
.nav-divider(@top: #e5e5e5, @bottom: @white) {
// IE7 needs a set width since we gave a height. Restricting just
// to IE7 to keep the 1px left/right space in other browsers.
// It is unclear where IE is getting the extra space that we need
// to negative-margin away, but so it goes.
*width: 100%;
height: 1px;
margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
*margin: -5px 0 5px;
overflow: hidden;
background-color: @top;
border-bottom: 1px solid @bottom;
}
// Button backgrounds
// ------------------
.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
// gradientBar will set the background to a pleasing blend of these, to support IE<=9
.gradientBar(@startColor, @endColor, @textColor, @textShadow);
*background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
.reset-filter();
// in these cases the gradient won't cover the background, so we override
&:hover, &:focus, &:active, &.active, &.disabled, &[disabled] {
color: @textColor;
background-color: @endColor;
*background-color: darken(@endColor, 5%);
}
// IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
&:active,
&.active {
background-color: darken(@endColor, 10%) e("\9");
}
}
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
.navbarVerticalAlign(@elementHeight) {
margin-top: (@navbarHeight - @elementHeight) / 2;
}
// Grid System
// -----------
// Centered container element
.container-fixed() {
margin-right: auto;
margin-left: auto;
.clearfix();
}
// Table columns
.tableColumns(@columnSpan: 1) {
float: none; // undo default grid column styles
width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
margin-left: 0; // undo default grid column styles
}
// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
margin-left: @gridGutterWidth * -1;
.clearfix();
}
.makeColumn(@columns: 1, @offset: 0) {
float: left;
margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}
// The Grid
#grid {
.core (@gridColumnWidth, @gridGutterWidth) {
.spanX (@index) when (@index > 0) {
.span@{index} { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.offsetX (@index) when (@index > 0) {
.offset@{index} { .offset(@index); }
.offsetX(@index - 1);
}
.offsetX (0) {}
.offset (@columns) {
margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
}
.span (@columns) {
width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}
.row {
margin-left: @gridGutterWidth * -1;
.clearfix();
}
[class*="span"] {
float: left;
min-height: 1px; // prevent collapsing columns
margin-left: @gridGutterWidth;
}
// Set the container width, and override it for fixed navbars in media queries
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container { .span(@gridColumns); }
// generate .spanX and .offsetX
.spanX (@gridColumns);
.offsetX (@gridColumns);
}
.fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {
.spanX (@index) when (@index > 0) {
.span@{index} { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.offsetX (@index) when (@index > 0) {
.offset@{index} { .offset(@index); }
.offset@{index}:first-child { .offsetFirstChild(@index); }
.offsetX(@index - 1);
}
.offsetX (0) {}
.offset (@columns) {
margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
*margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
}
.offsetFirstChild (@columns) {
margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
*margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
}
.span (@columns) {
width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
*width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
}
.row-fluid {
width: 100%;
.clearfix();
[class*="span"] {
.input-block-level();
float: left;
margin-left: @fluidGridGutterWidth;
*margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
}
[class*="span"]:first-child {
margin-left: 0;
}
// Space grid-sized controls properly if multiple per line
.controls-row [class*="span"] + [class*="span"] {
margin-left: @fluidGridGutterWidth;
}
// generate .spanX and .offsetX
.spanX (@gridColumns);
.offsetX (@gridColumns);
}
}
.input(@gridColumnWidth, @gridGutterWidth) {
.spanX (@index) when (@index > 0) {
input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.span(@columns) {
width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
}
input,
textarea,
.uneditable-input {
margin-left: 0; // override margin-left from core grid system
}
// Space grid-sized controls properly if multiple per line
.controls-row [class*="span"] + [class*="span"] {
margin-left: @gridGutterWidth;
}
// generate .spanX
.spanX (@gridColumns);
}
}
PK g}!]��EO O bootstrap/utilities.lessnu &1i� //
// Utility classes
// --------------------------------------------------
// Quick floats
.pull-right {
float: right;
}
.pull-left {
float: left;
}
// Toggling content
.hide {
display: none;
}
.show {
display: block;
}
// Visibility
.invisible {
visibility: hidden;
}
// For Affix plugin
.affix {
position: fixed;
}
PK g}!]��zr\ \ bootstrap/labels-badges.lessnu &1i� //
// Labels and badges
// --------------------------------------------------
// Base classes
.label,
.badge {
display: inline-block;
padding: 2px 4px;
font-size: @baseFontSize * .846;
font-weight: bold;
line-height: 14px; // ensure proper line-height if floated
color: @white;
vertical-align: baseline;
white-space: nowrap;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
background-color: @grayLight;
}
// Set unique padding and border-radii
.label {
.border-radius(3px);
}
.badge {
padding-left: 9px;
padding-right: 9px;
.border-radius(9px);
}
// Empty labels/badges collapse
.label,
.badge {
&:empty {
display: none;
}
}
// Hover/focus state, but only for links
a {
&.label:hover,
&.label:focus,
&.badge:hover,
&.badge:focus {
color: @white;
text-decoration: none;
cursor: pointer;
}
}
// Colors
// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
.label,
.badge {
// Important (red)
&-important { background-color: @errorText; }
&-important[href] { background-color: darken(@errorText, 10%); }
// Warnings (orange)
&-warning { background-color: @orange; }
&-warning[href] { background-color: darken(@orange, 10%); }
// Success (green)
&-success { background-color: @successText; }
&-success[href] { background-color: darken(@successText, 10%); }
// Info (turquoise)
&-info { background-color: @infoText; }
&-info[href] { background-color: darken(@infoText, 10%); }
// Inverse (black)
&-inverse { background-color: @grayDark; }
&-inverse[href] { background-color: darken(@grayDark, 10%); }
}
// Quick fix for labels/badges in buttons
.btn {
.label,
.badge {
position: relative;
top: -1px;
}
}
.btn-mini {
.label,
.badge {
top: 0;
}
}
PK g}!]�5Y Y bootstrap/alerts.lessnu &1i� //
// Alerts
// --------------------------------------------------
// Base styles
// -------------------------
.alert {
padding: 8px 35px 8px 14px;
margin-bottom: @baseLineHeight;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
background-color: @warningBackground;
border: 1px solid @warningBorder;
.border-radius(@baseBorderRadius);
}
.alert,
.alert h4 {
// Specified for the h4 to prevent conflicts of changing @headingsColor
color: @warningText;
}
.alert h4 {
margin: 0;
}
// Adjust close link position
.alert .close {
position: relative;
top: -2px;
right: -21px;
line-height: @baseLineHeight;
}
// Alternate styles
// -------------------------
.alert-success {
background-color: @successBackground;
border-color: @successBorder;
color: @successText;
}
.alert-success h4 {
color: @successText;
}
.alert-danger,
.alert-error {
background-color: @errorBackground;
border-color: @errorBorder;
color: @errorText;
}
.alert-danger h4,
.alert-error h4 {
color: @errorText;
}
.alert-info {
background-color: @infoBackground;
border-color: @infoBorder;
color: @infoText;
}
.alert-info h4 {
color: @infoText;
}
// Block alerts
// -------------------------
.alert-block {
padding-top: 14px;
padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
margin-bottom: 0;
}
.alert-block p + p {
margin-top: 5px;
}
PK g}!]`36�2 2 # bootstrap/component-animations.lessnu &1i� //
// Component animations
// --------------------------------------------------
.fade {
opacity: 0;
.transition(opacity .15s linear);
&.in {
opacity: 1;
}
}
.collapse {
position: relative;
height: 0;
overflow: hidden;
.transition(height .35s ease);
&.in {
height: auto;
}
}
PK g}!]?���u u bootstrap/scaffolding.lessnu &1i� //
// Scaffolding
// --------------------------------------------------
// Body reset
// -------------------------
body {
margin: 0;
font-family: @baseFontFamily;
font-size: @baseFontSize;
line-height: @baseLineHeight;
color: @textColor;
background-color: @bodyBackground;
}
// Links
// -------------------------
a {
color: @linkColor;
text-decoration: none;
}
a:hover,
a:focus {
color: @linkColorHover;
text-decoration: underline;
}
// Images
// -------------------------
// Rounded corners
.img-rounded {
.border-radius(6px);
}
// Add polaroid-esque trim
.img-polaroid {
padding: 4px;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0,0,0,.2);
.box-shadow(0 1px 3px rgba(0,0,0,.1));
}
// Perfect circle
.img-circle {
.border-radius(500px); // crank the border-radius so it works with most reasonably sized images
}
PK g}!]�Տ�i i bootstrap/reset.lessnu &1i� //
// Reset CSS
// Adapted from http://github.com/necolas/normalize.css
// --------------------------------------------------
// Display in IE6-9 and FF3
// -------------------------
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section {
display: block;
}
// Display block in IE6-9 and FF3
// -------------------------
audio,
canvas,
video {
display: inline-block;
*display: inline;
*zoom: 1;
}
// Prevents modern browsers from displaying 'audio' without controls
// -------------------------
audio:not([controls]) {
display: none;
}
// Base settings
// -------------------------
html {
font-size: 100%;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
// Focus states
a:focus {
.tab-focus();
}
// Hover & Active
a:hover,
a:active {
outline: 0;
}
// Prevents sub and sup affecting line-height in all browsers
// -------------------------
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
// Img border in a's and image quality
// -------------------------
img {
/* Responsive images (ensure images don't scale beyond their parents) */
max-width: 100%; /* Part 1: Set a maxium relative to the parent */
width: auto\9; /* IE7-8 need help adjusting responsive images */
height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */
vertical-align: middle;
border: 0;
-ms-interpolation-mode: bicubic;
}
// Prevent max-width from affecting Google Maps
#map_canvas img,
.google-maps img {
max-width: none;
}
// Forms
// -------------------------
// Font size in all browsers, margin changes, misc consistency
button,
input,
select,
textarea {
margin: 0;
font-size: 100%;
vertical-align: middle;
}
button,
input {
*overflow: visible; // Inner spacing ie IE6/7
line-height: normal; // FF3/4 have !important on line-height in UA stylesheet
}
button::-moz-focus-inner,
input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
padding: 0;
border: 0;
}
button,
html input[type="button"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls.
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS.
cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
}
label,
select,
button,
input[type="button"],
input[type="reset"],
input[type="submit"],
input[type="radio"],
input[type="checkbox"] {
cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
}
input[type="search"] { // Appearance in Safari/Chrome
.box-sizing(content-box);
-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
-webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
}
textarea {
overflow: auto; // Remove vertical scrollbar in IE6-9
vertical-align: top; // Readability and alignment cross-browser
}
// Printing
// -------------------------
// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
@media print {
* {
text-shadow: none !important;
color: #000 !important; // Black prints faster: h5bp.com/s
background: transparent !important;
box-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
// Don't show links for images, or javascript/internal links
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group; // h5bp.com/t
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 0.5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
}
PK g}!]��w�� � bootstrap/type.lessnu &1i� //
// Typography
// --------------------------------------------------
// Body text
// -------------------------
p {
margin: 0 0 @baseLineHeight / 2;
}
.lead {
margin-bottom: @baseLineHeight;
font-size: @baseFontSize * 1.5;
font-weight: 200;
line-height: @baseLineHeight * 1.5;
}
// Emphasis & misc
// -------------------------
// Ex: 14px base font * 85% = about 12px
small { font-size: 85%; }
strong { font-weight: bold; }
em { font-style: italic; }
cite { font-style: normal; }
// Utility classes
.muted { color: @grayLight; }
a.muted:hover,
a.muted:focus { color: darken(@grayLight, 10%); }
.text-warning { color: @warningText; }
a.text-warning:hover,
a.text-warning:focus { color: darken(@warningText, 10%); }
.text-error { color: @errorText; }
a.text-error:hover,
a.text-error:focus { color: darken(@errorText, 10%); }
.text-info { color: @infoText; }
a.text-info:hover,
a.text-info:focus { color: darken(@infoText, 10%); }
.text-success { color: @successText; }
a.text-success:hover,
a.text-success:focus { color: darken(@successText, 10%); }
.text-left { text-align: left; }
.text-right { text-align: right; }
.text-center { text-align: center; }
// Headings
// -------------------------
h1, h2, h3, h4, h5, h6 {
margin: (@baseLineHeight / 2) 0;
font-family: @headingsFontFamily;
font-weight: @headingsFontWeight;
line-height: @baseLineHeight;
color: @headingsColor;
text-rendering: optimizelegibility; // Fix the character spacing for headings
small {
font-weight: normal;
line-height: 1;
color: @grayLight;
}
}
h1,
h2,
h3 { line-height: @baseLineHeight * 2; }
h1 { font-size: @baseFontSize * 2.75; } // ~38px
h2 { font-size: @baseFontSize * 2.25; } // ~32px
h3 { font-size: @baseFontSize * 1.75; } // ~24px
h4 { font-size: @baseFontSize * 1.25; } // ~18px
h5 { font-size: @baseFontSize; }
h6 { font-size: @baseFontSize * 0.85; } // ~12px
h1 small { font-size: @baseFontSize * 1.75; } // ~24px
h2 small { font-size: @baseFontSize * 1.25; } // ~18px
h3 small { font-size: @baseFontSize; }
h4 small { font-size: @baseFontSize; }
// Page header
// -------------------------
.page-header {
padding-bottom: (@baseLineHeight / 2) - 1;
margin: @baseLineHeight 0 (@baseLineHeight * 1.5);
border-bottom: 1px solid @grayLighter;
}
// Lists
// --------------------------------------------------
// Unordered and Ordered lists
ul, ol {
padding: 0;
margin: 0 0 @baseLineHeight / 2 25px;
}
ul ul,
ul ol,
ol ol,
ol ul {
margin-bottom: 0;
}
li {
line-height: @baseLineHeight;
}
// Remove default list styles
ul.unstyled,
ol.unstyled {
margin-left: 0;
list-style: none;
}
// Single-line list items
ul.inline,
ol.inline {
margin-left: 0;
list-style: none;
> li {
display: inline-block;
.ie7-inline-block();
padding-left: 5px;
padding-right: 5px;
}
}
// Description Lists
dl {
margin-bottom: @baseLineHeight;
}
dt,
dd {
line-height: @baseLineHeight;
}
dt {
font-weight: bold;
}
dd {
margin-left: @baseLineHeight / 2;
}
// Horizontal layout (like forms)
.dl-horizontal {
.clearfix(); // Ensure dl clears floats if empty dd elements present
dt {
float: left;
width: @horizontalComponentOffset - 20;
clear: left;
text-align: right;
.text-overflow();
}
dd {
margin-left: @horizontalComponentOffset;
}
}
// MISC
// ----
// Horizontal rules
hr {
margin: @baseLineHeight 0;
border: 0;
border-top: 1px solid @hrBorder;
border-bottom: 1px solid @white;
}
// Abbreviations and acronyms
abbr[title],
// Added data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
abbr[data-original-title] {
cursor: help;
border-bottom: 1px dotted @grayLight;
}
abbr.initialism {
font-size: 90%;
text-transform: uppercase;
}
// Blockquotes
blockquote {
padding: 0 0 0 15px;
margin: 0 0 @baseLineHeight;
border-left: 5px solid @grayLighter;
p {
margin-bottom: 0;
font-size: @baseFontSize * 1.25;
font-weight: 300;
line-height: 1.25;
}
small {
display: block;
line-height: @baseLineHeight;
color: @grayLight;
&:before {
content: '\2014 \00A0';
}
}
// Float right with text-align: right
&.pull-right {
float: right;
padding-right: 15px;
padding-left: 0;
border-right: 5px solid @grayLighter;
border-left: 0;
p,
small {
text-align: right;
}
small {
&:before {
content: '';
}
&:after {
content: '\00A0 \2014';
}
}
}
}
// Quotes
q:before,
q:after,
blockquote:before,
blockquote:after {
content: "";
}
// Addresses
address {
display: block;
margin-bottom: @baseLineHeight;
font-style: normal;
line-height: @baseLineHeight;
}
PK g}!]YR>!�* �* bootstrap/sprites.j3.lessnu &1i� //
// Sprites
// --------------------------------------------------
// ICONS
// -----
// All icons receive the styles of the <i> tag with a base class
// of .i and are then given a unique class to add width, height,
// and background-position. Your resulting HTML will look like
// <i class="icon-inbox"></i>.
// For the white version of the icons, just add the .icon-white class:
// <i class="icon-inbox icon-white"></i>
[class^="icon-"],
[class*=" icon-"] {
display: inline-block;
width: 14px;
height: 14px;
.ie7-restore-right-whitespace();
line-height: 14px;
vertical-align: text-top;
background-image: url("@{iconSpritePath}");
background-position: 14px 14px;
background-repeat: no-repeat;
margin-top: 1px;
}
/* White icons with optional class, or on hover/focus/active states of certain elements */
.icon-white,
.nav-pills > .active > a > [class^="icon-"],
.nav-pills > .active > a > [class*=" icon-"],
.nav-list > .active > a > [class^="icon-"],
.nav-list > .active > a > [class*=" icon-"],
.navbar-inverse .nav > .active > a > [class^="icon-"],
.navbar-inverse .nav > .active > a > [class*=" icon-"],
.dropdown-menu > li > a:hover > [class^="icon-"],
.dropdown-menu > li > a:focus > [class^="icon-"],
.dropdown-menu > li > a:hover > [class*=" icon-"],
.dropdown-menu > li > a:focus > [class*=" icon-"],
.dropdown-menu > .active > a > [class^="icon-"],
.dropdown-menu > .active > a > [class*=" icon-"],
.dropdown-submenu:hover > a > [class^="icon-"],
.dropdown-submenu:focus > a > [class^="icon-"],
.dropdown-submenu:hover > a > [class*=" icon-"],
.dropdown-submenu:focus > a > [class*=" icon-"] {
background-image: url("@{iconWhiteSpritePath}");
}
.icon-glass { background-position: 0 0; }
//.icon-music { background-position: -24px 0; }
//.icon-search { background-position: -48px 0; }
//.icon-envelope { background-position: -72px 0; }
.icon-heart { background-position: -96px 0; }
//.icon-star { background-position: -120px 0; }
//.icon-star-empty { background-position: -144px 0; }
//.icon-user { background-position: -168px 0; }
.icon-film { background-position: -192px 0; }
.icon-th-large { background-position: -216px 0; }
.icon-th { background-position: -240px 0; }
.icon-th-list { background-position: -264px 0; }
//.icon-ok { background-position: -288px 0; }
//.icon-remove { background-position: -312px 0; }
//.icon-zoom-in { background-position: -336px 0; }
//.icon-zoom-out { background-position: -360px 0; }
.icon-off { background-position: -384px 0; }
.icon-signal { background-position: -408px 0; }
//.icon-cog { background-position: -432px 0; }
//.icon-trash { background-position: -456px 0; }
//.icon-home { background-position: 0 -24px; }
//.icon-file { background-position: -24px -24px; }
.icon-time { background-position: -48px -24px; }
.icon-road { background-position: -72px -24px; }
.icon-download-alt { background-position: -96px -24px; }
//.icon-download { background-position: -120px -24px; }
//.icon-upload { background-position: -144px -24px; }
.icon-inbox { background-position: -168px -24px; }
.icon-play-circle { background-position: -192px -24px; }
.icon-repeat { background-position: -216px -24px; }
//.icon-refresh { background-position: -240px -24px; }
.icon-list-alt { background-position: -264px -24px; }
//.icon-lock { background-position: -287px -24px; } // 1px off
//.icon-flag { background-position: -312px -24px; }
.icon-headphones { background-position: -336px -24px; }
.icon-volume-off { background-position: -360px -24px; }
.icon-volume-down { background-position: -384px -24px; }
.icon-volume-up { background-position: -408px -24px; }
.icon-qrcode { background-position: -432px -24px; }
.icon-barcode { background-position: -456px -24px; }
.icon-tag { background-position: 0 -48px; }
.icon-tags { background-position: -25px -48px; } // 1px off
.icon-book { background-position: -48px -48px; }
//.icon-bookmark { background-position: -72px -48px; }
//.icon-print { background-position: -96px -48px; }
//.icon-camera { background-position: -120px -48px; }
.icon-font { background-position: -144px -48px; }
.icon-bold { background-position: -167px -48px; } // 1px off
.icon-italic { background-position: -192px -48px; }
.icon-text-height { background-position: -216px -48px; }
.icon-text-width { background-position: -240px -48px; }
.icon-align-left { background-position: -264px -48px; }
.icon-align-center { background-position: -288px -48px; }
.icon-align-right { background-position: -312px -48px; }
.icon-align-justify { background-position: -336px -48px; }
//.icon-list { background-position: -360px -48px; }
.icon-indent-left { background-position: -384px -48px; }
.icon-indent-right { background-position: -408px -48px; }
.icon-facetime-video { background-position: -432px -48px; }
//.icon-picture { background-position: -456px -48px; }
//.icon-pencil { background-position: 0 -72px; }
.icon-map-marker { background-position: -24px -72px; }
.icon-adjust { background-position: -48px -72px; }
.icon-tint { background-position: -72px -72px; }
//.icon-edit { background-position: -96px -72px; }
//.icon-share { background-position: -120px -72px; }
.icon-check { background-position: -144px -72px; }
//.icon-move { background-position: -168px -72px; }
.icon-step-backward { background-position: -192px -72px; }
.icon-fast-backward { background-position: -216px -72px; }
.icon-backward { background-position: -240px -72px; }
//.icon-play { background-position: -264px -72px; }
.icon-pause { background-position: -288px -72px; }
.icon-stop { background-position: -312px -72px; }
.icon-forward { background-position: -336px -72px; }
.icon-fast-forward { background-position: -360px -72px; }
.icon-step-forward { background-position: -384px -72px; }
.icon-eject { background-position: -408px -72px; }
//.icon-chevron-left { background-position: -432px -72px; }
//.icon-chevron-right { background-position: -456px -72px; }
.icon-plus-sign { background-position: 0 -96px; }
//.icon-minus-sign { background-position: -24px -96px; }
.icon-remove-sign { background-position: -48px -96px; }
.icon-ok-sign { background-position: -72px -96px; }
//.icon-question-sign { background-position: -96px -96px; }
.icon-info-sign { background-position: -120px -96px; }
.icon-screenshot { background-position: -144px -96px; }
.icon-remove-circle { background-position: -168px -96px; }
.icon-ok-circle { background-position: -192px -96px; }
//.icon-ban-circle { background-position: -216px -96px; }
//.icon-arrow-left { background-position: -240px -96px; }
//.icon-arrow-right { background-position: -264px -96px; }
.icon-arrow-up { background-position: -289px -96px; } // 1px off
.icon-arrow-down { background-position: -312px -96px; }
//.icon-share-alt { background-position: -336px -96px; }
.icon-resize-full { background-position: -360px -96px; }
.icon-resize-small { background-position: -384px -96px; }
//.icon-plus { background-position: -408px -96px; }
//.icon-minus { background-position: -433px -96px; }
//.icon-asterisk { background-position: -456px -96px; }
.icon-exclamation-sign { background-position: 0 -120px; }
.icon-gift { background-position: -24px -120px; }
.icon-leaf { background-position: -48px -120px; }
.icon-fire { background-position: -72px -120px; }
//.icon-eye-open { background-position: -96px -120px; }
//.icon-eye-close { background-position: -120px -120px; }
.icon-warning-sign { background-position: -144px -120px; }
.icon-plane { background-position: -168px -120px; }
//.icon-calendar { background-position: -192px -120px; }
.icon-random { background-position: -216px -120px; width: 16px; }
//.icon-comment { background-position: -240px -120px; }
.icon-magnet { background-position: -264px -120px; }
//.icon-chevron-up { background-position: -288px -120px; }
//.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off
.icon-retweet { background-position: -336px -120px; }
.icon-shopping-cart { background-position: -360px -120px; }
//.icon-folder-close { background-position: -384px -120px; }
//.icon-folder-open { background-position: -408px -120px; width: 16px; }
.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off
.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off
.icon-hdd { background-position: 0 -144px; }
.icon-bullhorn { background-position: -24px -144px; }
.icon-bell { background-position: -48px -144px; }
.icon-certificate { background-position: -72px -144px; }
//.icon-thumbs-up { background-position: -96px -144px; }
//.icon-thumbs-down { background-position: -120px -144px; }
.icon-hand-right { background-position: -144px -144px; }
.icon-hand-left { background-position: -168px -144px; }
.icon-hand-up { background-position: -192px -144px; }
.icon-hand-down { background-position: -216px -144px; }
.icon-circle-arrow-right { background-position: -240px -144px; }
.icon-circle-arrow-left { background-position: -264px -144px; }
.icon-circle-arrow-up { background-position: -288px -144px; }
.icon-circle-arrow-down { background-position: -312px -144px; }
.icon-globe { background-position: -336px -144px; }
//.icon-wrench { background-position: -360px -144px; }
.icon-tasks { background-position: -384px -144px; }
//.icon-filter { background-position: -408px -144px; }
//.icon-briefcase { background-position: -432px -144px; }
.icon-fullscreen { background-position: -456px -144px; }
PK g}!]9-�OP P # bootstrap/responsive-767px-max.lessnu &1i� //
// Responsive: Landscape phone to desktop/tablet
// --------------------------------------------------
@media (max-width: 767px) {
// Padding to set content in a bit
body {
padding-left: 20px;
padding-right: 20px;
}
// Negative indent the now static "fixed" navbar
.navbar-fixed-top,
.navbar-fixed-bottom,
.navbar-static-top {
margin-left: -20px;
margin-right: -20px;
}
// Remove padding on container given explicit padding set on body
.container-fluid {
padding: 0;
}
// TYPOGRAPHY
// ----------
// Reset horizontal dl
.dl-horizontal {
dt {
float: none;
clear: none;
width: auto;
text-align: left;
}
dd {
margin-left: 0;
}
}
// GRID & CONTAINERS
// -----------------
// Remove width from containers
.container {
width: auto;
}
// Fluid rows
.row-fluid {
width: 100%;
}
// Undo negative margin on rows and thumbnails
.row,
.thumbnails {
margin-left: 0;
}
.thumbnails > li {
float: none;
margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present
}
// Make all grid-sized elements block level again
[class*="span"],
.uneditable-input[class*="span"], // Makes uneditable inputs full-width when using grid sizing
.row-fluid [class*="span"] {
float: none;
display: block;
width: 100%;
margin-left: 0;
.box-sizing(border-box);
}
.span12,
.row-fluid .span12 {
width: 100%;
.box-sizing(border-box);
}
.row-fluid [class*="offset"]:first-child {
margin-left: 0;
}
// FORM FIELDS
// -----------
// Make span* classes full width
.input-large,
.input-xlarge,
.input-xxlarge,
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input {
.input-block-level();
}
// But don't let it screw up prepend/append inputs
.input-prepend input,
.input-append input,
.input-prepend input[class*="span"],
.input-append input[class*="span"] {
display: inline-block; // redeclare so they don't wrap to new lines
width: auto;
}
.controls-row [class*="span"] + [class*="span"] {
margin-left: 0;
}
// Modals
.modal {
position: fixed;
top: 20px;
left: 20px;
right: 20px;
width: auto;
margin: 0;
&.fade { top: -100px; }
&.fade.in { top: 20px; }
}
}
// UP TO LANDSCAPE PHONE
// ---------------------
@media (max-width: 480px) {
// Smooth out the collapsing/expanding nav
.nav-collapse {
-webkit-transform: translate3d(0, 0, 0); // activate the GPU
}
// Block level the page header small tag for readability
.page-header h1 small {
display: block;
line-height: @baseLineHeight;
}
// Update checkboxes for iOS
input[type="checkbox"],
input[type="radio"] {
border: 1px solid #ccc;
}
// Remove the horizontal form styles
.form-horizontal {
.control-label {
float: none;
width: auto;
padding-top: 0;
text-align: left;
}
// Move over all input controls and content
.controls {
margin-left: 0;
}
// Move the options list down to align with labels
.control-list {
padding-top: 0; // has to be padding because margin collaspes
}
// Move over buttons in .form-actions to align with .controls
.form-actions {
padding-left: 10px;
padding-right: 10px;
}
}
// Medias
// Reset float and spacing to stack
.media .pull-left,
.media .pull-right {
float: none;
display: block;
margin-bottom: 10px;
}
// Remove side margins since we stack instead of indent
.media-object {
margin-right: 0;
margin-left: 0;
}
// Modals
.modal {
top: 10px;
left: 10px;
right: 10px;
}
.modal-header .close {
padding: 10px;
margin: -10px;
}
// Carousel
.carousel-caption {
position: static;
}
}
PK g}!]_+;? ? bootstrap/dropdowns.lessnu &1i� //
// Dropdown menus
// --------------------------------------------------
// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
.dropup,
.dropdown {
position: relative;
}
.dropdown-toggle {
// The caret makes the toggle a bit too tall in IE7
*margin-bottom: -3px;
}
.dropdown-toggle:active,
.open .dropdown-toggle {
outline: 0;
}
// Dropdown arrow/caret
// --------------------
.caret {
display: inline-block;
width: 0;
height: 0;
vertical-align: top;
border-top: 4px solid @black;
border-right: 4px solid transparent;
border-left: 4px solid transparent;
content: "";
}
// Place the caret
.dropdown .caret {
margin-top: 8px;
margin-left: 2px;
}
// The dropdown menu (ul)
// ----------------------
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: @zindexDropdown;
display: none; // none by default, but block on "open" of the menu
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0; // override default ul
list-style: none;
background-color: @dropdownBackground;
border: 1px solid #ccc; // Fallback for IE7-8
border: 1px solid @dropdownBorder;
*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;
// Aligns the dropdown menu to right
&.pull-right {
right: 0;
left: auto;
}
// Dividers (basically an hr) within the dropdown
.divider {
.nav-divider(@dropdownDividerTop, @dropdownDividerBottom);
}
// Links within the dropdown menu
> li > a {
display: block;
padding: 3px 20px;
clear: both;
font-weight: normal;
line-height: @baseLineHeight;
color: @dropdownLinkColor;
white-space: nowrap;
}
}
// Hover/Focus state
// -----------
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus,
.dropdown-submenu:hover > a,
.dropdown-submenu:focus > a {
text-decoration: none;
color: @dropdownLinkColorHover;
#gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
}
// Active state
// ------------
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
color: @dropdownLinkColorActive;
text-decoration: none;
outline: 0;
#gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));
}
// Disabled state
// --------------
// Gray out text and ensure the hover/focus state remains gray
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
color: @grayLight;
}
// Nuke hover/focus effects
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
text-decoration: none;
background-color: transparent;
background-image: none; // Remove CSS gradient
.reset-filter();
cursor: default;
}
// Open state for the dropdown
// ---------------------------
.open {
// IE7's z-index only goes to the nearest positioned ancestor, which would
// make the menu appear below buttons that appeared later on the page
*z-index: @zindexDropdown;
& > .dropdown-menu {
display: block;
}
}
// Backdrop to catch body clicks on mobile, etc.
// ---------------------------
.dropdown-backdrop {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: 0;
z-index: @zindexDropdown - 10;
}
// Right aligned dropdowns
// ---------------------------
.pull-right > .dropdown-menu {
right: 0;
left: auto;
}
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// ------------------------------------------------------
// Just add .dropup after the standard .dropdown class and you're set, bro.
// TODO: abstract this so that the navbar fixed styles are not placed here?
.dropup,
.navbar-fixed-bottom .dropdown {
// Reverse the caret
.caret {
border-top: 0;
border-bottom: 4px solid @black;
content: "";
}
// Different positioning for bottom up menu
.dropdown-menu {
top: auto;
bottom: 100%;
margin-bottom: 1px;
}
}
// Sub menus
// ---------------------------
.dropdown-submenu {
position: relative;
}
// Default dropdowns
.dropdown-submenu > .dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
.border-radius(0 6px 6px 6px);
}
.dropdown-submenu:hover > .dropdown-menu {
display: block;
}
// Dropups
.dropup .dropdown-submenu > .dropdown-menu {
top: auto;
bottom: 0;
margin-top: 0;
margin-bottom: -2px;
.border-radius(5px 5px 5px 0);
}
// Caret to indicate there is a submenu
.dropdown-submenu > a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: darken(@dropdownBackground, 20%);
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
border-left-color: @dropdownLinkColorHover;
}
// Left aligned submenus
.dropdown-submenu.pull-left {
// Undo the float
// Yes, this is awkward since .pull-left adds a float, but it sticks to our conventions elsewhere.
float: none;
// Positioning the submenu
> .dropdown-menu {
left: -100%;
margin-left: 10px;
.border-radius(6px 0 6px 6px);
}
}
// Tweak nav headers
// -----------------
// Increase padding from 15px to 20px on sides
.dropdown .dropdown-menu .nav-header {
padding-left: 20px;
padding-right: 20px;
}
// Typeahead
// ---------
.typeahead {
z-index: 1051;
margin-top: 2px; // give it some space to breathe
.border-radius(@baseBorderRadius);
}
PK g}!]��6o bootstrap/popovers.lessnu &1i� //
// Popovers
// --------------------------------------------------
.popover {
position: absolute;
top: 0;
left: 0;
z-index: @zindexPopover;
display: none;
max-width: 276px;
padding: 1px;
text-align: left; // Reset given new insertion method
background-color: @popoverBackground;
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
border: 1px solid #ccc;
border: 1px solid rgba(0,0,0,.2);
.border-radius(6px);
.box-shadow(0 5px 10px rgba(0,0,0,.2));
// Overrides for proper insertion
white-space: normal;
// Offset the popover to account for the popover arrow
&.top { margin-top: -10px; }
&.right { margin-left: 10px; }
&.bottom { margin-top: 10px; }
&.left { margin-left: -10px; }
}
.popover-title {
margin: 0; // reset heading margin
padding: 8px 14px;
font-size: 14px;
font-weight: normal;
line-height: 18px;
background-color: @popoverTitleBackground;
border-bottom: 1px solid darken(@popoverTitleBackground, 5%);
.border-radius(5px 5px 0 0);
&:empty {
display: none;
}
}
.popover-content {
padding: 9px 14px;
}
// Arrows
//
// .arrow is outer, .arrow:after is inner
.popover .arrow,
.popover .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.popover .arrow {
border-width: @popoverArrowOuterWidth;
}
.popover .arrow:after {
border-width: @popoverArrowWidth;
content: "";
}
.popover {
&.top .arrow {
left: 50%;
margin-left: -@popoverArrowOuterWidth;
border-bottom-width: 0;
border-top-color: #999; // IE8 fallback
border-top-color: @popoverArrowOuterColor;
bottom: -@popoverArrowOuterWidth;
&:after {
bottom: 1px;
margin-left: -@popoverArrowWidth;
border-bottom-width: 0;
border-top-color: @popoverArrowColor;
}
}
&.right .arrow {
top: 50%;
left: -@popoverArrowOuterWidth;
margin-top: -@popoverArrowOuterWidth;
border-left-width: 0;
border-right-color: #999; // IE8 fallback
border-right-color: @popoverArrowOuterColor;
&:after {
left: 1px;
bottom: -@popoverArrowWidth;
border-left-width: 0;
border-right-color: @popoverArrowColor;
}
}
&.bottom .arrow {
left: 50%;
margin-left: -@popoverArrowOuterWidth;
border-top-width: 0;
border-bottom-color: #999; // IE8 fallback
border-bottom-color: @popoverArrowOuterColor;
top: -@popoverArrowOuterWidth;
&:after {
top: 1px;
margin-left: -@popoverArrowWidth;
border-top-width: 0;
border-bottom-color: @popoverArrowColor;
}
}
&.left .arrow {
top: 50%;
right: -@popoverArrowOuterWidth;
margin-top: -@popoverArrowOuterWidth;
border-right-width: 0;
border-left-color: #999; // IE8 fallback
border-left-color: @popoverArrowOuterColor;
&:after {
right: 1px;
border-right-width: 0;
border-left-color: @popoverArrowColor;
bottom: -@popoverArrowWidth;
}
}
}
PK g}!]���| | bootstrap/accordion.lessnu &1i� //
// Accordion
// --------------------------------------------------
// Parent container
.accordion {
margin-bottom: @baseLineHeight;
}
// Group == heading + body
.accordion-group {
margin-bottom: 2px;
border: 1px solid #e5e5e5;
.border-radius(@baseBorderRadius);
}
.accordion-heading {
border-bottom: 0;
}
.accordion-heading .accordion-toggle {
display: block;
padding: 8px 15px;
}
// General toggle styles
.accordion-toggle {
cursor: pointer;
}
// Inner needs the styles because you can't animate properly with any styles on the element
.accordion-inner {
padding: 9px 15px;
border-top: 1px solid #e5e5e5;
}
PK g}!]�g�U� � bootstrap/responsive-navbar.lessnu &1i� //
// Responsive: Navbar
// --------------------------------------------------
// TABLETS AND BELOW
// -----------------
@media (max-width: @navbarCollapseWidth) {
// UNFIX THE TOPBAR
// ----------------
// Remove any padding from the body
body {
padding-top: 0;
}
// Unfix the navbars
.navbar-fixed-top,
.navbar-fixed-bottom {
position: static;
}
.navbar-fixed-top {
margin-bottom: @baseLineHeight;
}
.navbar-fixed-bottom {
margin-top: @baseLineHeight;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
padding: 5px;
}
.navbar .container {
width: auto;
padding: 0;
}
// Account for brand name
.navbar .brand {
padding-left: 10px;
padding-right: 10px;
margin: 0 0 0 -5px;
}
// COLLAPSIBLE NAVBAR
// ------------------
// Nav collapse clears brand
.nav-collapse {
clear: both;
}
// Block-level the nav
.nav-collapse .nav {
float: none;
margin: 0 0 (@baseLineHeight / 2);
}
.nav-collapse .nav > li {
float: none;
}
.nav-collapse .nav > li > a {
margin-bottom: 2px;
}
.nav-collapse .nav > .divider-vertical {
display: none;
}
.nav-collapse .nav .nav-header {
color: @navbarText;
text-shadow: none;
}
// Nav and dropdown links in navbar
.nav-collapse .nav > li > a,
.nav-collapse .dropdown-menu a {
padding: 9px 15px;
font-weight: bold;
color: @navbarLinkColor;
.border-radius(3px);
}
// Buttons
.nav-collapse .btn {
padding: 4px 10px 4px;
font-weight: normal;
.border-radius(@baseBorderRadius);
}
.nav-collapse .dropdown-menu li + li a {
margin-bottom: 2px;
}
.nav-collapse .nav > li > a:hover,
.nav-collapse .nav > li > a:focus,
.nav-collapse .dropdown-menu a:hover,
.nav-collapse .dropdown-menu a:focus {
background-color: @navbarBackground;
}
.navbar-inverse .nav-collapse .nav > li > a,
.navbar-inverse .nav-collapse .dropdown-menu a {
color: @navbarInverseLinkColor;
}
.navbar-inverse .nav-collapse .nav > li > a:hover,
.navbar-inverse .nav-collapse .nav > li > a:focus,
.navbar-inverse .nav-collapse .dropdown-menu a:hover,
.navbar-inverse .nav-collapse .dropdown-menu a:focus {
background-color: @navbarInverseBackground;
}
// Buttons in the navbar
.nav-collapse.in .btn-group {
margin-top: 5px;
padding: 0;
}
// Dropdowns in the navbar
.nav-collapse .dropdown-menu {
position: static;
top: auto;
left: auto;
float: none;
display: none;
max-width: none;
margin: 0 15px;
padding: 0;
background-color: transparent;
border: none;
.border-radius(0);
.box-shadow(none);
}
.nav-collapse .open > .dropdown-menu {
display: block;
}
.nav-collapse .dropdown-menu:before,
.nav-collapse .dropdown-menu:after {
display: none;
}
.nav-collapse .dropdown-menu .divider {
display: none;
}
.nav-collapse .nav > li > .dropdown-menu {
&:before,
&:after {
display: none;
}
}
// Forms in navbar
.nav-collapse .navbar-form,
.nav-collapse .navbar-search {
float: none;
padding: (@baseLineHeight / 2) 15px;
margin: (@baseLineHeight / 2) 0;
border-top: 1px solid @navbarBackground;
border-bottom: 1px solid @navbarBackground;
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)");
}
.navbar-inverse .nav-collapse .navbar-form,
.navbar-inverse .nav-collapse .navbar-search {
border-top-color: @navbarInverseBackground;
border-bottom-color: @navbarInverseBackground;
}
// Pull right (secondary) nav content
.navbar .nav-collapse .nav.pull-right {
float: none;
margin-left: 0;
}
// Hide everything in the navbar save .brand and toggle button */
.nav-collapse,
.nav-collapse.collapse {
overflow: hidden;
height: 0;
}
// Navbar button
.navbar .btn-navbar {
display: block;
}
// STATIC NAVBAR
// -------------
.navbar-static .navbar-inner {
padding-left: 10px;
padding-right: 10px;
}
}
// DEFAULT DESKTOP
// ---------------
@media (min-width: @navbarCollapseDesktopWidth) {
// Required to make the collapsing navbar work on regular desktops
.nav-collapse.collapse {
height: auto !important;
overflow: visible !important;
}
}
PK g}!]!)��$ $ bootstrap/responsive.lessnu &1i� /*!
* Bootstrap Responsive v2.3.2
*
* Copyright 2013 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
*/
// Responsive.less
// For phone and tablet devices
// -------------------------------------------------------------
// REPEAT VARIABLES & MIXINS
// -------------------------
// Required since we compile the responsive stuff separately
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
// RESPONSIVE CLASSES
// ------------------
@import "responsive-utilities.less";
// MEDIA QUERIES
// ------------------
// Large desktops
@import "responsive-1200px-min.less";
// Tablets to regular desktops
@import "responsive-768px-979px.less";
// Phones to portrait tablets and narrow desktops
@import "responsive-767px-max.less";
// RESPONSIVE NAVBAR
// ------------------
// From 979px and below, show a button to toggle navbar contents
@import "responsive-navbar.less";
PK g}!]��7� � bootstrap/breadcrumbs.lessnu &1i� //
// Breadcrumbs
// --------------------------------------------------
.breadcrumb {
padding: 8px 15px;
margin: 0 0 @baseLineHeight;
list-style: none;
background-color: #f5f5f5;
.border-radius(@baseBorderRadius);
> li {
display: inline-block;
.ie7-inline-block();
text-shadow: 0 1px 0 @white;
> .divider {
padding: 0 5px;
color: #ccc;
}
}
> .active {
color: @grayLight;
}
}
PK g}!]]��Y* Y* bootstrap/sprites.lessnu &1i� //
// Sprites
// --------------------------------------------------
// ICONS
// -----
// All icons receive the styles of the <i> tag with a base class
// of .i and are then given a unique class to add width, height,
// and background-position. Your resulting HTML will look like
// <i class="icon-inbox"></i>.
// For the white version of the icons, just add the .icon-white class:
// <i class="icon-inbox icon-white"></i>
[class^="icon-"],
[class*=" icon-"] {
display: inline-block;
width: 14px;
height: 14px;
.ie7-restore-right-whitespace();
line-height: 14px;
vertical-align: text-top;
background-image: url("@{iconSpritePath}");
background-position: 14px 14px;
background-repeat: no-repeat;
margin-top: 1px;
}
/* White icons with optional class, or on hover/focus/active states of certain elements */
.icon-white,
.nav-pills > .active > a > [class^="icon-"],
.nav-pills > .active > a > [class*=" icon-"],
.nav-list > .active > a > [class^="icon-"],
.nav-list > .active > a > [class*=" icon-"],
.navbar-inverse .nav > .active > a > [class^="icon-"],
.navbar-inverse .nav > .active > a > [class*=" icon-"],
.dropdown-menu > li > a:hover > [class^="icon-"],
.dropdown-menu > li > a:focus > [class^="icon-"],
.dropdown-menu > li > a:hover > [class*=" icon-"],
.dropdown-menu > li > a:focus > [class*=" icon-"],
.dropdown-menu > .active > a > [class^="icon-"],
.dropdown-menu > .active > a > [class*=" icon-"],
.dropdown-submenu:hover > a > [class^="icon-"],
.dropdown-submenu:focus > a > [class^="icon-"],
.dropdown-submenu:hover > a > [class*=" icon-"],
.dropdown-submenu:focus > a > [class*=" icon-"] {
background-image: url("@{iconWhiteSpritePath}");
}
.icon-glass { background-position: 0 0; }
.icon-music { background-position: -24px 0; }
.icon-search { background-position: -48px 0; }
.icon-envelope { background-position: -72px 0; }
.icon-heart { background-position: -96px 0; }
.icon-star { background-position: -120px 0; }
.icon-star-empty { background-position: -144px 0; }
.icon-user { background-position: -168px 0; }
.icon-film { background-position: -192px 0; }
.icon-th-large { background-position: -216px 0; }
.icon-th { background-position: -240px 0; }
.icon-th-list { background-position: -264px 0; }
.icon-ok { background-position: -288px 0; }
.icon-remove { background-position: -312px 0; }
.icon-zoom-in { background-position: -336px 0; }
.icon-zoom-out { background-position: -360px 0; }
.icon-off { background-position: -384px 0; }
.icon-signal { background-position: -408px 0; }
.icon-cog { background-position: -432px 0; }
.icon-trash { background-position: -456px 0; }
.icon-home { background-position: 0 -24px; }
.icon-file { background-position: -24px -24px; }
.icon-time { background-position: -48px -24px; }
.icon-road { background-position: -72px -24px; }
.icon-download-alt { background-position: -96px -24px; }
.icon-download { background-position: -120px -24px; }
.icon-upload { background-position: -144px -24px; }
.icon-inbox { background-position: -168px -24px; }
.icon-play-circle { background-position: -192px -24px; }
.icon-repeat { background-position: -216px -24px; }
.icon-refresh { background-position: -240px -24px; }
.icon-list-alt { background-position: -264px -24px; }
.icon-lock { background-position: -287px -24px; } // 1px off
.icon-flag { background-position: -312px -24px; }
.icon-headphones { background-position: -336px -24px; }
.icon-volume-off { background-position: -360px -24px; }
.icon-volume-down { background-position: -384px -24px; }
.icon-volume-up { background-position: -408px -24px; }
.icon-qrcode { background-position: -432px -24px; }
.icon-barcode { background-position: -456px -24px; }
.icon-tag { background-position: 0 -48px; }
.icon-tags { background-position: -25px -48px; } // 1px off
.icon-book { background-position: -48px -48px; }
.icon-bookmark { background-position: -72px -48px; }
.icon-print { background-position: -96px -48px; }
.icon-camera { background-position: -120px -48px; }
.icon-font { background-position: -144px -48px; }
.icon-bold { background-position: -167px -48px; } // 1px off
.icon-italic { background-position: -192px -48px; }
.icon-text-height { background-position: -216px -48px; }
.icon-text-width { background-position: -240px -48px; }
.icon-align-left { background-position: -264px -48px; }
.icon-align-center { background-position: -288px -48px; }
.icon-align-right { background-position: -312px -48px; }
.icon-align-justify { background-position: -336px -48px; }
.icon-list { background-position: -360px -48px; }
.icon-indent-left { background-position: -384px -48px; }
.icon-indent-right { background-position: -408px -48px; }
.icon-facetime-video { background-position: -432px -48px; }
.icon-picture { background-position: -456px -48px; }
.icon-pencil { background-position: 0 -72px; }
.icon-map-marker { background-position: -24px -72px; }
.icon-adjust { background-position: -48px -72px; }
.icon-tint { background-position: -72px -72px; }
.icon-edit { background-position: -96px -72px; }
.icon-share { background-position: -120px -72px; }
.icon-check { background-position: -144px -72px; }
.icon-move { background-position: -168px -72px; }
.icon-step-backward { background-position: -192px -72px; }
.icon-fast-backward { background-position: -216px -72px; }
.icon-backward { background-position: -240px -72px; }
.icon-play { background-position: -264px -72px; }
.icon-pause { background-position: -288px -72px; }
.icon-stop { background-position: -312px -72px; }
.icon-forward { background-position: -336px -72px; }
.icon-fast-forward { background-position: -360px -72px; }
.icon-step-forward { background-position: -384px -72px; }
.icon-eject { background-position: -408px -72px; }
.icon-chevron-left { background-position: -432px -72px; }
.icon-chevron-right { background-position: -456px -72px; }
.icon-plus-sign { background-position: 0 -96px; }
.icon-minus-sign { background-position: -24px -96px; }
.icon-remove-sign { background-position: -48px -96px; }
.icon-ok-sign { background-position: -72px -96px; }
.icon-question-sign { background-position: -96px -96px; }
.icon-info-sign { background-position: -120px -96px; }
.icon-screenshot { background-position: -144px -96px; }
.icon-remove-circle { background-position: -168px -96px; }
.icon-ok-circle { background-position: -192px -96px; }
.icon-ban-circle { background-position: -216px -96px; }
.icon-arrow-left { background-position: -240px -96px; }
.icon-arrow-right { background-position: -264px -96px; }
.icon-arrow-up { background-position: -289px -96px; } // 1px off
.icon-arrow-down { background-position: -312px -96px; }
.icon-share-alt { background-position: -336px -96px; }
.icon-resize-full { background-position: -360px -96px; }
.icon-resize-small { background-position: -384px -96px; }
.icon-plus { background-position: -408px -96px; }
.icon-minus { background-position: -433px -96px; }
.icon-asterisk { background-position: -456px -96px; }
.icon-exclamation-sign { background-position: 0 -120px; }
.icon-gift { background-position: -24px -120px; }
.icon-leaf { background-position: -48px -120px; }
.icon-fire { background-position: -72px -120px; }
.icon-eye-open { background-position: -96px -120px; }
.icon-eye-close { background-position: -120px -120px; }
.icon-warning-sign { background-position: -144px -120px; }
.icon-plane { background-position: -168px -120px; }
.icon-calendar { background-position: -192px -120px; }
.icon-random { background-position: -216px -120px; width: 16px; }
.icon-comment { background-position: -240px -120px; }
.icon-magnet { background-position: -264px -120px; }
.icon-chevron-up { background-position: -288px -120px; }
.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off
.icon-retweet { background-position: -336px -120px; }
.icon-shopping-cart { background-position: -360px -120px; }
.icon-folder-close { background-position: -384px -120px; width: 16px; }
.icon-folder-open { background-position: -408px -120px; width: 16px; }
.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off
.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off
.icon-hdd { background-position: 0 -144px; }
.icon-bullhorn { background-position: -24px -144px; }
.icon-bell { background-position: -48px -144px; }
.icon-certificate { background-position: -72px -144px; }
.icon-thumbs-up { background-position: -96px -144px; }
.icon-thumbs-down { background-position: -120px -144px; }
.icon-hand-right { background-position: -144px -144px; }
.icon-hand-left { background-position: -168px -144px; }
.icon-hand-up { background-position: -192px -144px; }
.icon-hand-down { background-position: -216px -144px; }
.icon-circle-arrow-right { background-position: -240px -144px; }
.icon-circle-arrow-left { background-position: -264px -144px; }
.icon-circle-arrow-up { background-position: -288px -144px; }
.icon-circle-arrow-down { background-position: -312px -144px; }
.icon-globe { background-position: -336px -144px; }
.icon-wrench { background-position: -360px -144px; }
.icon-tasks { background-position: -384px -144px; }
.icon-filter { background-position: -408px -144px; }
.icon-briefcase { background-position: -432px -144px; }
.icon-fullscreen { background-position: -456px -144px; }
PK g}!]^[�o o bootstrap/tables.lessnu &1i� //
// Tables
// --------------------------------------------------
// BASE TABLES
// -----------------
table {
max-width: 100%;
background-color: @tableBackground;
border-collapse: collapse;
border-spacing: 0;
}
// BASELINE STYLES
// ---------------
.table {
width: 100%;
margin-bottom: @baseLineHeight;
// Cells
th,
td {
padding: 8px;
line-height: @baseLineHeight;
text-align: left;
vertical-align: top;
border-top: 1px solid @tableBorder;
}
th {
font-weight: bold;
}
// Bottom align for column headings
thead th {
vertical-align: bottom;
}
// Remove top border from thead by default
caption + thead tr:first-child th,
caption + thead tr:first-child td,
colgroup + thead tr:first-child th,
colgroup + thead tr:first-child td,
thead:first-child tr:first-child th,
thead:first-child tr:first-child td {
border-top: 0;
}
// Account for multiple tbody instances
tbody + tbody {
border-top: 2px solid @tableBorder;
}
// Nesting
.table {
background-color: @bodyBackground;
}
}
// CONDENSED TABLE W/ HALF PADDING
// -------------------------------
.table-condensed {
th,
td {
padding: 4px 5px;
}
}
// BORDERED VERSION
// ----------------
.table-bordered {
border: 1px solid @tableBorder;
border-collapse: separate; // Done so we can round those corners!
*border-collapse: collapse; // IE7 can't round corners anyway
border-left: 0;
.border-radius(@baseBorderRadius);
th,
td {
border-left: 1px solid @tableBorder;
}
// Prevent a double border
caption + thead tr:first-child th,
caption + tbody tr:first-child th,
caption + tbody tr:first-child td,
colgroup + thead tr:first-child th,
colgroup + tbody tr:first-child th,
colgroup + tbody tr:first-child td,
thead:first-child tr:first-child th,
tbody:first-child tr:first-child th,
tbody:first-child tr:first-child td {
border-top: 0;
}
// For first th/td in the first row in the first thead or tbody
thead:first-child tr:first-child > th:first-child,
tbody:first-child tr:first-child > td:first-child,
tbody:first-child tr:first-child > th:first-child {
.border-top-left-radius(@baseBorderRadius);
}
// For last th/td in the first row in the first thead or tbody
thead:first-child tr:first-child > th:last-child,
tbody:first-child tr:first-child > td:last-child,
tbody:first-child tr:first-child > th:last-child {
.border-top-right-radius(@baseBorderRadius);
}
// For first th/td (can be either) in the last row in the last thead, tbody, and tfoot
thead:last-child tr:last-child > th:first-child,
tbody:last-child tr:last-child > td:first-child,
tbody:last-child tr:last-child > th:first-child,
tfoot:last-child tr:last-child > td:first-child,
tfoot:last-child tr:last-child > th:first-child {
.border-bottom-left-radius(@baseBorderRadius);
}
// For last th/td (can be either) in the last row in the last thead, tbody, and tfoot
thead:last-child tr:last-child > th:last-child,
tbody:last-child tr:last-child > td:last-child,
tbody:last-child tr:last-child > th:last-child,
tfoot:last-child tr:last-child > td:last-child,
tfoot:last-child tr:last-child > th:last-child {
.border-bottom-right-radius(@baseBorderRadius);
}
// Clear border-radius for first and last td in the last row in the last tbody for table with tfoot
tfoot + tbody:last-child tr:last-child td:first-child {
.border-bottom-left-radius(0);
}
tfoot + tbody:last-child tr:last-child td:last-child {
.border-bottom-right-radius(0);
}
// Special fixes to round the left border on the first td/th
caption + thead tr:first-child th:first-child,
caption + tbody tr:first-child td:first-child,
colgroup + thead tr:first-child th:first-child,
colgroup + tbody tr:first-child td:first-child {
.border-top-left-radius(@baseBorderRadius);
}
caption + thead tr:first-child th:last-child,
caption + tbody tr:first-child td:last-child,
colgroup + thead tr:first-child th:last-child,
colgroup + tbody tr:first-child td:last-child {
.border-top-right-radius(@baseBorderRadius);
}
}
// ZEBRA-STRIPING
// --------------
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
.table-striped {
tbody {
> tr:nth-child(odd) > td,
> tr:nth-child(odd) > th {
background-color: @tableBackgroundAccent;
}
}
}
// HOVER EFFECT
// ------------
// Placed here since it has to come after the potential zebra striping
.table-hover {
tbody {
tr:hover > td,
tr:hover > th {
background-color: @tableBackgroundHover;
}
}
}
// TABLE CELL SIZING
// -----------------
// Reset default grid behavior
table td[class*="span"],
table th[class*="span"],
.row-fluid table td[class*="span"],
.row-fluid table th[class*="span"] {
display: table-cell;
float: none; // undo default grid column styles
margin-left: 0; // undo default grid column styles
}
// Change the column widths to account for td/th padding
.table td,
.table th {
&.span1 { .tableColumns(1); }
&.span2 { .tableColumns(2); }
&.span3 { .tableColumns(3); }
&.span4 { .tableColumns(4); }
&.span5 { .tableColumns(5); }
&.span6 { .tableColumns(6); }
&.span7 { .tableColumns(7); }
&.span8 { .tableColumns(8); }
&.span9 { .tableColumns(9); }
&.span10 { .tableColumns(10); }
&.span11 { .tableColumns(11); }
&.span12 { .tableColumns(12); }
}
// TABLE BACKGROUNDS
// -----------------
// Exact selectors below required to override .table-striped
.table tbody tr {
&.success > td {
background-color: @successBackground;
}
&.error > td {
background-color: @errorBackground;
}
&.warning > td {
background-color: @warningBackground;
}
&.info > td {
background-color: @infoBackground;
}
}
// Hover states for .table-hover
.table-hover tbody tr {
&.success:hover > td {
background-color: darken(@successBackground, 5%);
}
&.error:hover > td {
background-color: darken(@errorBackground, 5%);
}
&.warning:hover > td {
background-color: darken(@warningBackground, 5%);
}
&.info:hover > td {
background-color: darken(@infoBackground, 5%);
}
}
PK g}!]�P��� � bootstrap/bootstrap.lessnu &1i� /*!
* Bootstrap v2.3.2
*
* Copyright 2013 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
*/
// Core variables and mixins
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
// CSS Reset
@import "reset.less";
// Grid system and page structure
@import "scaffolding.less";
@import "grid.less";
@import "layouts.less";
// Base CSS
@import "type.less";
@import "code.less";
@import "forms.less";
@import "tables.less";
// Components: common
@import "sprites.less";
@import "dropdowns.less";
@import "wells.less";
@import "component-animations.less";
@import "close.less";
// Components: Buttons & Alerts
@import "buttons.less";
@import "button-groups.less";
@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
// Components: Nav
@import "navs.less";
@import "navbar.less";
@import "breadcrumbs.less";
@import "pagination.less";
@import "pager.less";
// Components: Popovers
@import "modals.less";
@import "tooltip.less";
@import "popovers.less";
// Components: Misc
@import "thumbnails.less";
@import "media.less";
@import "labels-badges.less";
@import "progress-bars.less";
@import "accordion.less";
@import "carousel.less";
@import "hero-unit.less";
// Utility classes
@import "utilities.less"; // Has to be last to override when necessary
PK g}!]{��ݞ � bootstrap/buttons.lessnu &1i� //
// Buttons
// --------------------------------------------------
// Base styles
// --------------------------------------------------
// Core
.btn {
display: inline-block;
.ie7-inline-block();
padding: 4px 12px;
margin-bottom: 0; // For input.btn
font-size: @baseFontSize;
line-height: @baseLineHeight;
text-align: center;
vertical-align: middle;
cursor: pointer;
.buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
border: 1px solid @btnBorder;
*border: 0; // Remove the border to prevent IE7's black border on input:focus
border-bottom-color: darken(@btnBorder, 10%);
.border-radius(@baseBorderRadius);
.ie7-restore-left-whitespace(); // Give IE7 some love
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
// Hover/focus state
&:hover,
&:focus {
color: @grayDark;
text-decoration: none;
background-position: 0 -15px;
// transition is only when going to hover/focus, otherwise the background
// behind the gradient (there for IE<=9 fallback) gets mismatched
.transition(background-position .1s linear);
}
// Focus state for keyboard and accessibility
&:focus {
.tab-focus();
}
// Active state
&.active,
&:active {
background-image: none;
outline: 0;
.box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
}
// Disabled state
&.disabled,
&[disabled] {
cursor: default;
background-image: none;
.opacity(65);
.box-shadow(none);
}
}
// Button Sizes
// --------------------------------------------------
// Large
.btn-large {
padding: @paddingLarge;
font-size: @fontSizeLarge;
.border-radius(@borderRadiusLarge);
}
.btn-large [class^="icon-"],
.btn-large [class*=" icon-"] {
margin-top: 4px;
}
// Small
.btn-small {
padding: @paddingSmall;
font-size: @fontSizeSmall;
.border-radius(@borderRadiusSmall);
}
.btn-small [class^="icon-"],
.btn-small [class*=" icon-"] {
margin-top: 0;
}
.btn-mini [class^="icon-"],
.btn-mini [class*=" icon-"] {
margin-top: -1px;
}
// Mini
.btn-mini {
padding: @paddingMini;
font-size: @fontSizeMini;
.border-radius(@borderRadiusSmall);
}
// Block button
// -------------------------
.btn-block {
display: block;
width: 100%;
padding-left: 0;
padding-right: 0;
.box-sizing(border-box);
}
// Vertically space out multiple block buttons
.btn-block + .btn-block {
margin-top: 5px;
}
// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"] {
&.btn-block {
width: 100%;
}
}
// Alternate buttons
// --------------------------------------------------
// Provide *some* extra contrast for those who can get it
.btn-primary.active,
.btn-warning.active,
.btn-danger.active,
.btn-success.active,
.btn-info.active,
.btn-inverse.active {
color: rgba(255,255,255,.75);
}
// Set the backgrounds
// -------------------------
.btn-primary {
.buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
}
// Warning appears are orange
.btn-warning {
.buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);
}
// Danger and error appear as red
.btn-danger {
.buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
}
// Success appears as green
.btn-success {
.buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
}
// Info appears as a neutral blue
.btn-info {
.buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);
}
// Inverse appears as dark gray
.btn-inverse {
.buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);
}
// Cross-browser Jank
// --------------------------------------------------
button.btn,
input[type="submit"].btn {
// Firefox 3.6 only I believe
&::-moz-focus-inner {
padding: 0;
border: 0;
}
// IE7 has some default padding on button controls
*padding-top: 3px;
*padding-bottom: 3px;
&.btn-large {
*padding-top: 7px;
*padding-bottom: 7px;
}
&.btn-small {
*padding-top: 3px;
*padding-bottom: 3px;
}
&.btn-mini {
*padding-top: 1px;
*padding-bottom: 1px;
}
}
// Link buttons
// --------------------------------------------------
// Make a button look and behave like a link
.btn-link,
.btn-link:active,
.btn-link[disabled] {
background-color: transparent;
background-image: none;
.box-shadow(none);
}
.btn-link {
border-color: transparent;
cursor: pointer;
color: @linkColor;
.border-radius(0);
}
.btn-link:hover,
.btn-link:focus {
color: @linkColorHover;
text-decoration: underline;
background-color: transparent;
}
.btn-link[disabled]:hover,
.btn-link[disabled]:focus {
color: @grayDark;
text-decoration: none;
}
PK g}!]s+ bootstrap/code.lessnu &1i� //
// Code (inline and blocK)
// --------------------------------------------------
// Inline and block code styles
code,
pre {
padding: 0 3px 2px;
#font > #family > .monospace;
font-size: @baseFontSize - 2;
color: @grayDark;
.border-radius(3px);
}
// Inline code
code {
padding: 2px 4px;
color: #d14;
background-color: #f7f7f9;
border: 1px solid #e1e1e8;
white-space: nowrap;
}
// Blocks of code
pre {
display: block;
padding: (@baseLineHeight - 1) / 2;
margin: 0 0 @baseLineHeight / 2;
font-size: @baseFontSize - 1; // 14px to 13px
line-height: @baseLineHeight;
word-break: break-all;
word-wrap: break-word;
white-space: pre;
white-space: pre-wrap;
background-color: #f5f5f5;
border: 1px solid #ccc; // fallback for IE7-8
border: 1px solid rgba(0,0,0,.15);
.border-radius(@baseBorderRadius);
// Make prettyprint styles more spaced out for readability
&.prettyprint {
margin-bottom: @baseLineHeight;
}
// Account for some code outputs that place code tags in pre tags
code {
padding: 0;
color: inherit;
white-space: pre;
white-space: pre-wrap;
background-color: transparent;
border: 0;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}PK g}!]�a>v
v
bootstrap/pagination.lessnu &1i� //
// Pagination (multiple pages)
// --------------------------------------------------
// Space out pagination from surrounding content
.pagination {
margin: @baseLineHeight 0;
}
.pagination ul {
// Allow for text-based alignment
display: inline-block;
.ie7-inline-block();
// Reset default ul styles
margin-left: 0;
margin-bottom: 0;
// Visuals
.border-radius(@baseBorderRadius);
.box-shadow(0 1px 2px rgba(0,0,0,.05));
}
.pagination ul > li {
display: inline; // Remove list-style and block-level defaults
}
.pagination ul > li > a,
.pagination ul > li > span {
float: left; // Collapse white-space
padding: 4px 12px;
line-height: @baseLineHeight;
text-decoration: none;
background-color: @paginationBackground;
border: 1px solid @paginationBorder;
border-left-width: 0;
}
.pagination ul > li > a:hover,
.pagination ul > li > a:focus,
.pagination ul > .active > a,
.pagination ul > .active > span {
background-color: @paginationActiveBackground;
}
.pagination ul > .active > a,
.pagination ul > .active > span {
color: @grayLight;
cursor: default;
}
.pagination ul > .disabled > span,
.pagination ul > .disabled > a,
.pagination ul > .disabled > a:hover,
.pagination ul > .disabled > a:focus {
color: @grayLight;
background-color: transparent;
cursor: default;
}
.pagination ul > li:first-child > a,
.pagination ul > li:first-child > span {
border-left-width: 1px;
.border-left-radius(@baseBorderRadius);
}
.pagination ul > li:last-child > a,
.pagination ul > li:last-child > span {
.border-right-radius(@baseBorderRadius);
}
// Alignment
// --------------------------------------------------
.pagination-centered {
text-align: center;
}
.pagination-right {
text-align: right;
}
// Sizing
// --------------------------------------------------
// Large
.pagination-large {
ul > li > a,
ul > li > span {
padding: @paddingLarge;
font-size: @fontSizeLarge;
}
ul > li:first-child > a,
ul > li:first-child > span {
.border-left-radius(@borderRadiusLarge);
}
ul > li:last-child > a,
ul > li:last-child > span {
.border-right-radius(@borderRadiusLarge);
}
}
// Small and mini
.pagination-mini,
.pagination-small {
ul > li:first-child > a,
ul > li:first-child > span {
.border-left-radius(@borderRadiusSmall);
}
ul > li:last-child > a,
ul > li:last-child > span {
.border-right-radius(@borderRadiusSmall);
}
}
// Small
.pagination-small {
ul > li > a,
ul > li > span {
padding: @paddingSmall;
font-size: @fontSizeSmall;
}
}
// Mini
.pagination-mini {
ul > li > a,
ul > li > span {
padding: @paddingMini;
font-size: @fontSizeMini;
}
}
PK g}!]R*� � � bootstrap/close.lessnu &1i� //
// Close icons
// --------------------------------------------------
.close {
float: right;
font-size: 20px;
font-weight: bold;
line-height: @baseLineHeight;
color: @black;
text-shadow: 0 1px 0 rgba(255,255,255,1);
.opacity(20);
&:hover,
&:focus {
color: @black;
text-decoration: none;
cursor: pointer;
.opacity(40);
}
}
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
button.close {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}PK g}!]�J��\ \ bootstrap/media.lessnu &1i� // Media objects
// Source: http://stubbornella.org/content/?p=497
// --------------------------------------------------
// Common styles
// -------------------------
// Clear the floats
.media,
.media-body {
overflow: hidden;
*overflow: visible;
zoom: 1;
}
// Proper spacing between instances of .media
.media,
.media .media {
margin-top: 15px;
}
.media:first-child {
margin-top: 0;
}
// For images and videos, set to block
.media-object {
display: block;
}
// Reset margins on headings for tighter default spacing
.media-heading {
margin: 0 0 5px;
}
// Media image alignment
// -------------------------
.media > .pull-left {
margin-right: 10px;
}
.media > .pull-right {
margin-left: 10px;
}
// Media list variation
// -------------------------
// Undo default ul/ol styles
.media-list {
margin-left: 0;
list-style: none;
}
PK g}!]�"� � bootstrap/pager.lessnu &1i� //
// Pager pagination
// --------------------------------------------------
.pager {
margin: @baseLineHeight 0;
list-style: none;
text-align: center;
.clearfix();
}
.pager li {
display: inline;
}
.pager li > a,
.pager li > span {
display: inline-block;
padding: 5px 14px;
background-color: #fff;
border: 1px solid #ddd;
.border-radius(15px);
}
.pager li > a:hover,
.pager li > a:focus {
text-decoration: none;
background-color: #f5f5f5;
}
.pager .next > a,
.pager .next > span {
float: right;
}
.pager .previous > a,
.pager .previous > span {
float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
color: @grayLight;
background-color: #fff;
cursor: default;
}PK g}!]Qdk;� � bootstrap/navs.lessnu &1i� //
// Navs
// --------------------------------------------------
// BASE CLASS
// ----------
.nav {
margin-left: 0;
margin-bottom: @baseLineHeight;
list-style: none;
}
// Make links block level
.nav > li > a {
display: block;
}
.nav > li > a:hover,
.nav > li > a:focus {
text-decoration: none;
background-color: @grayLighter;
}
// Prevent IE8 from misplacing imgs
// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
.nav > li > a > img {
max-width: none;
}
// Redeclare pull classes because of specifity
.nav > .pull-right {
float: right;
}
// Nav headers (for dropdowns and lists)
.nav-header {
display: block;
padding: 3px 15px;
font-size: 11px;
font-weight: bold;
line-height: @baseLineHeight;
color: @grayLight;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
text-transform: uppercase;
}
// Space them out when they follow another list item (link)
.nav li + .nav-header {
margin-top: 9px;
}
// NAV LIST
// --------
.nav-list {
padding-left: 15px;
padding-right: 15px;
margin-bottom: 0;
}
.nav-list > li > a,
.nav-list .nav-header {
margin-left: -15px;
margin-right: -15px;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
}
.nav-list > li > a {
padding: 3px 15px;
}
.nav-list > .active > a,
.nav-list > .active > a:hover,
.nav-list > .active > a:focus {
color: @white;
text-shadow: 0 -1px 0 rgba(0,0,0,.2);
background-color: @linkColor;
}
.nav-list [class^="icon-"],
.nav-list [class*=" icon-"] {
margin-right: 2px;
}
// Dividers (basically an hr) within the dropdown
.nav-list .divider {
.nav-divider();
}
// TABS AND PILLS
// -------------
// Common styles
.nav-tabs,
.nav-pills {
.clearfix();
}
.nav-tabs > li,
.nav-pills > li {
float: left;
}
.nav-tabs > li > a,
.nav-pills > li > a {
padding-right: 12px;
padding-left: 12px;
margin-right: 2px;
line-height: 14px; // keeps the overall height an even number
}
// TABS
// ----
// Give the tabs something to sit on
.nav-tabs {
border-bottom: 1px solid #ddd;
}
// Make the list-items overlay the bottom border
.nav-tabs > li {
margin-bottom: -1px;
}
// Actual tabs (as links)
.nav-tabs > li > a {
padding-top: 8px;
padding-bottom: 8px;
line-height: @baseLineHeight;
border: 1px solid transparent;
.border-radius(4px 4px 0 0);
&:hover,
&:focus {
border-color: @grayLighter @grayLighter #ddd;
}
}
// Active state, and it's :hover/:focus to override normal :hover/:focus
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover,
.nav-tabs > .active > a:focus {
color: @gray;
background-color: @bodyBackground;
border: 1px solid #ddd;
border-bottom-color: transparent;
cursor: default;
}
// PILLS
// -----
// Links rendered as pills
.nav-pills > li > a {
padding-top: 8px;
padding-bottom: 8px;
margin-top: 2px;
margin-bottom: 2px;
.border-radius(5px);
}
// Active state
.nav-pills > .active > a,
.nav-pills > .active > a:hover,
.nav-pills > .active > a:focus {
color: @white;
background-color: @linkColor;
}
// STACKED NAV
// -----------
// Stacked tabs and pills
.nav-stacked > li {
float: none;
}
.nav-stacked > li > a {
margin-right: 0; // no need for the gap between nav items
}
// Tabs
.nav-tabs.nav-stacked {
border-bottom: 0;
}
.nav-tabs.nav-stacked > li > a {
border: 1px solid #ddd;
.border-radius(0);
}
.nav-tabs.nav-stacked > li:first-child > a {
.border-top-radius(4px);
}
.nav-tabs.nav-stacked > li:last-child > a {
.border-bottom-radius(4px);
}
.nav-tabs.nav-stacked > li > a:hover,
.nav-tabs.nav-stacked > li > a:focus {
border-color: #ddd;
z-index: 2;
}
// Pills
.nav-pills.nav-stacked > li > a {
margin-bottom: 3px;
}
.nav-pills.nav-stacked > li:last-child > a {
margin-bottom: 1px; // decrease margin to match sizing of stacked tabs
}
// DROPDOWNS
// ---------
.nav-tabs .dropdown-menu {
.border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu
}
.nav-pills .dropdown-menu {
.border-radius(6px); // make rounded corners match the pills
}
// Default dropdown links
// -------------------------
// Make carets use linkColor to start
.nav .dropdown-toggle .caret {
border-top-color: @linkColor;
border-bottom-color: @linkColor;
margin-top: 6px;
}
.nav .dropdown-toggle:hover .caret,
.nav .dropdown-toggle:focus .caret {
border-top-color: @linkColorHover;
border-bottom-color: @linkColorHover;
}
/* move down carets for tabs */
.nav-tabs .dropdown-toggle .caret {
margin-top: 8px;
}
// Active dropdown links
// -------------------------
.nav .active .dropdown-toggle .caret {
border-top-color: #fff;
border-bottom-color: #fff;
}
.nav-tabs .active .dropdown-toggle .caret {
border-top-color: @gray;
border-bottom-color: @gray;
}
// Active:hover/:focus dropdown links
// -------------------------
.nav > .dropdown.active > a:hover,
.nav > .dropdown.active > a:focus {
cursor: pointer;
}
// Open dropdowns
// -------------------------
.nav-tabs .open .dropdown-toggle,
.nav-pills .open .dropdown-toggle,
.nav > li.dropdown.open.active > a:hover,
.nav > li.dropdown.open.active > a:focus {
color: @white;
background-color: @grayLight;
border-color: @grayLight;
}
.nav li.dropdown.open .caret,
.nav li.dropdown.open.active .caret,
.nav li.dropdown.open a:hover .caret,
.nav li.dropdown.open a:focus .caret {
border-top-color: @white;
border-bottom-color: @white;
.opacity(100);
}
// Dropdowns in stacked tabs
.tabs-stacked .open > a:hover,
.tabs-stacked .open > a:focus {
border-color: @grayLight;
}
// TABBABLE
// --------
// COMMON STYLES
// -------------
// Clear any floats
.tabbable {
.clearfix();
}
.tab-content {
overflow: auto; // prevent content from running below tabs
}
// Remove border on bottom, left, right
.tabs-below > .nav-tabs,
.tabs-right > .nav-tabs,
.tabs-left > .nav-tabs {
border-bottom: 0;
}
// Show/hide tabbable areas
.tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none;
}
.tab-content > .active,
.pill-content > .active {
display: block;
}
// BOTTOM
// ------
.tabs-below > .nav-tabs {
border-top: 1px solid #ddd;
}
.tabs-below > .nav-tabs > li {
margin-top: -1px;
margin-bottom: 0;
}
.tabs-below > .nav-tabs > li > a {
.border-radius(0 0 4px 4px);
&:hover,
&:focus {
border-bottom-color: transparent;
border-top-color: #ddd;
}
}
.tabs-below > .nav-tabs > .active > a,
.tabs-below > .nav-tabs > .active > a:hover,
.tabs-below > .nav-tabs > .active > a:focus {
border-color: transparent #ddd #ddd #ddd;
}
// LEFT & RIGHT
// ------------
// Common styles
.tabs-left > .nav-tabs > li,
.tabs-right > .nav-tabs > li {
float: none;
}
.tabs-left > .nav-tabs > li > a,
.tabs-right > .nav-tabs > li > a {
min-width: 74px;
margin-right: 0;
margin-bottom: 3px;
}
// Tabs on the left
.tabs-left > .nav-tabs {
float: left;
margin-right: 19px;
border-right: 1px solid #ddd;
}
.tabs-left > .nav-tabs > li > a {
margin-right: -1px;
.border-radius(4px 0 0 4px);
}
.tabs-left > .nav-tabs > li > a:hover,
.tabs-left > .nav-tabs > li > a:focus {
border-color: @grayLighter #ddd @grayLighter @grayLighter;
}
.tabs-left > .nav-tabs .active > a,
.tabs-left > .nav-tabs .active > a:hover,
.tabs-left > .nav-tabs .active > a:focus {
border-color: #ddd transparent #ddd #ddd;
*border-right-color: @white;
}
// Tabs on the right
.tabs-right > .nav-tabs {
float: right;
margin-left: 19px;
border-left: 1px solid #ddd;
}
.tabs-right > .nav-tabs > li > a {
margin-left: -1px;
.border-radius(0 4px 4px 0);
}
.tabs-right > .nav-tabs > li > a:hover,
.tabs-right > .nav-tabs > li > a:focus {
border-color: @grayLighter @grayLighter @grayLighter #ddd;
}
.tabs-right > .nav-tabs .active > a,
.tabs-right > .nav-tabs .active > a:hover,
.tabs-right > .nav-tabs .active > a:focus {
border-color: #ddd #ddd #ddd transparent;
*border-left-color: @white;
}
// DISABLED STATES
// ---------------
// Gray out text
.nav > .disabled > a {
color: @grayLight;
}
// Nuke hover/focus effects
.nav > .disabled > a:hover,
.nav > .disabled > a:focus {
text-decoration: none;
background-color: transparent;
cursor: default;
}
PK g}!]��@W�. �. bootstrap/navbar.lessnu &1i� //
// Navbars (Redux)
// --------------------------------------------------
// COMMON STYLES
// -------------
// Base class and wrapper
.navbar {
overflow: visible;
margin-bottom: @baseLineHeight;
// Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
*position: relative;
*z-index: 2;
}
// Inner for background effects
// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
.navbar-inner {
min-height: @navbarHeight;
padding-left: 20px;
padding-right: 20px;
#gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
border: 1px solid @navbarBorder;
.border-radius(@baseBorderRadius);
.box-shadow(0 1px 4px rgba(0,0,0,.065));
// Prevent floats from breaking the navbar
.clearfix();
}
// Set width to auto for default container
// We then reset it for fixed navbars in the #gridSystem mixin
.navbar .container {
width: auto;
}
// Override the default collapsed state
.nav-collapse.collapse {
height: auto;
overflow: visible;
}
// Brand: website or project name
// -------------------------
.navbar .brand {
float: left;
display: block;
// Vertically center the text given @navbarHeight
padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
margin-left: -20px; // negative indent to left-align the text down the page
font-size: 20px;
font-weight: 200;
color: @navbarBrandColor;
text-shadow: 0 1px 0 @navbarBackgroundHighlight;
&:hover,
&:focus {
text-decoration: none;
}
}
// Plain text in topbar
// -------------------------
.navbar-text {
margin-bottom: 0;
line-height: @navbarHeight;
color: @navbarText;
}
// Janky solution for now to account for links outside the .nav
// -------------------------
.navbar-link {
color: @navbarLinkColor;
&:hover,
&:focus {
color: @navbarLinkColorHover;
}
}
// Dividers in navbar
// -------------------------
.navbar .divider-vertical {
height: @navbarHeight;
margin: 0 9px;
border-left: 1px solid @navbarBackground;
border-right: 1px solid @navbarBackgroundHighlight;
}
// Buttons in navbar
// -------------------------
.navbar .btn,
.navbar .btn-group {
.navbarVerticalAlign(30px); // Vertically center in navbar
}
.navbar .btn-group .btn,
.navbar .input-prepend .btn,
.navbar .input-append .btn,
.navbar .input-prepend .btn-group,
.navbar .input-append .btn-group {
margin-top: 0; // then undo the margin here so we don't accidentally double it
}
// Navbar forms
// -------------------------
.navbar-form {
margin-bottom: 0; // remove default bottom margin
.clearfix();
input,
select,
.radio,
.checkbox {
.navbarVerticalAlign(30px); // Vertically center in navbar
}
input,
select,
.btn {
display: inline-block;
margin-bottom: 0;
}
input[type="image"],
input[type="checkbox"],
input[type="radio"] {
margin-top: 3px;
}
.input-append,
.input-prepend {
margin-top: 5px;
white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left
input {
margin-top: 0; // remove the margin on top since it's on the parent
}
}
}
// Navbar search
// -------------------------
.navbar-search {
position: relative;
float: left;
.navbarVerticalAlign(30px); // Vertically center in navbar
margin-bottom: 0;
.search-query {
margin-bottom: 0;
padding: 4px 14px;
#font > .sans-serif(13px, normal, 1);
.border-radius(15px); // redeclare because of specificity of the type attribute
}
}
// Static navbar
// -------------------------
.navbar-static-top {
position: static;
margin-bottom: 0; // remove 18px margin for default navbar
.navbar-inner {
.border-radius(0);
}
}
// Fixed navbar
// -------------------------
// Shared (top/bottom) styles
.navbar-fixed-top,
.navbar-fixed-bottom {
position: fixed;
right: 0;
left: 0;
z-index: @zindexFixedNavbar;
margin-bottom: 0; // remove 18px margin for default navbar
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
border-width: 0 0 1px;
}
.navbar-fixed-bottom .navbar-inner {
border-width: 1px 0 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
padding-left: 0;
padding-right: 0;
.border-radius(0);
}
// Reset container width
// Required here as we reset the width earlier on and the grid mixins don't override early enough
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
#grid > .core > .span(@gridColumns);
}
// Fixed to top
.navbar-fixed-top {
top: 0;
}
.navbar-fixed-top,
.navbar-static-top {
.navbar-inner {
.box-shadow(~"0 1px 10px rgba(0,0,0,.1)");
}
}
// Fixed to bottom
.navbar-fixed-bottom {
bottom: 0;
.navbar-inner {
.box-shadow(~"0 -1px 10px rgba(0,0,0,.1)");
}
}
// NAVIGATION
// ----------
.navbar .nav {
position: relative;
left: 0;
display: block;
float: left;
margin: 0 10px 0 0;
}
.navbar .nav.pull-right {
float: right; // redeclare due to specificity
margin-right: 0; // remove margin on float right nav
}
.navbar .nav > li {
float: left;
}
// Links
.navbar .nav > li > a {
float: none;
// Vertically center the text given @navbarHeight
padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
color: @navbarLinkColor;
text-decoration: none;
text-shadow: 0 1px 0 @navbarBackgroundHighlight;
}
.navbar .nav .dropdown-toggle .caret {
margin-top: 8px;
}
// Hover/focus
.navbar .nav > li > a:focus,
.navbar .nav > li > a:hover {
background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover/:focus from .active
color: @navbarLinkColorHover;
text-decoration: none;
}
// Active nav items
.navbar .nav > .active > a,
.navbar .nav > .active > a:hover,
.navbar .nav > .active > a:focus {
color: @navbarLinkColorActive;
text-decoration: none;
background-color: @navbarLinkBackgroundActive;
.box-shadow(inset 0 3px 8px rgba(0,0,0,.125));
}
// Navbar button for toggling navbar items in responsive layouts
// These definitions need to come after '.navbar .btn'
.navbar .btn-navbar {
display: none;
float: right;
padding: 7px 10px;
margin-left: 5px;
margin-right: 5px;
.buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
}
.navbar .btn-navbar .icon-bar {
display: block;
width: 18px;
height: 2px;
background-color: #f5f5f5;
.border-radius(1px);
.box-shadow(0 1px 0 rgba(0,0,0,.25));
}
.btn-navbar .icon-bar + .icon-bar {
margin-top: 3px;
}
// Dropdown menus
// --------------
// Menu position and menu carets
.navbar .nav > li > .dropdown-menu {
&:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: @dropdownBorder;
position: absolute;
top: -7px;
left: 9px;
}
&:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid @dropdownBackground;
position: absolute;
top: -6px;
left: 10px;
}
}
// Menu position and menu caret support for dropups via extra dropup class
.navbar-fixed-bottom .nav > li > .dropdown-menu {
&:before {
border-top: 7px solid #ccc;
border-top-color: @dropdownBorder;
border-bottom: 0;
bottom: -7px;
top: auto;
}
&:after {
border-top: 6px solid @dropdownBackground;
border-bottom: 0;
bottom: -6px;
top: auto;
}
}
// Caret should match text color on hover/focus
.navbar .nav li.dropdown > a:hover .caret,
.navbar .nav li.dropdown > a:focus .caret {
border-top-color: @navbarLinkColorHover;
border-bottom-color: @navbarLinkColorHover;
}
// Remove background color from open dropdown
.navbar .nav li.dropdown.open > .dropdown-toggle,
.navbar .nav li.dropdown.active > .dropdown-toggle,
.navbar .nav li.dropdown.open.active > .dropdown-toggle {
background-color: @navbarLinkBackgroundActive;
color: @navbarLinkColorActive;
}
.navbar .nav li.dropdown > .dropdown-toggle .caret {
border-top-color: @navbarLinkColor;
border-bottom-color: @navbarLinkColor;
}
.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: @navbarLinkColorActive;
border-bottom-color: @navbarLinkColorActive;
}
// Right aligned menus need alt position
.navbar .pull-right > li > .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right {
left: auto;
right: 0;
&:before {
left: auto;
right: 12px;
}
&:after {
left: auto;
right: 13px;
}
.dropdown-menu {
left: auto;
right: 100%;
margin-left: 0;
margin-right: -1px;
.border-radius(6px 0 6px 6px);
}
}
// Inverted navbar
// -------------------------
.navbar-inverse {
.navbar-inner {
#gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
border-color: @navbarInverseBorder;
}
.brand,
.nav > li > a {
color: @navbarInverseLinkColor;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
&:hover,
&:focus {
color: @navbarInverseLinkColorHover;
}
}
.brand {
color: @navbarInverseBrandColor;
}
.navbar-text {
color: @navbarInverseText;
}
.nav > li > a:focus,
.nav > li > a:hover {
background-color: @navbarInverseLinkBackgroundHover;
color: @navbarInverseLinkColorHover;
}
.nav .active > a,
.nav .active > a:hover,
.nav .active > a:focus {
color: @navbarInverseLinkColorActive;
background-color: @navbarInverseLinkBackgroundActive;
}
// Inline text links
.navbar-link {
color: @navbarInverseLinkColor;
&:hover,
&:focus {
color: @navbarInverseLinkColorHover;
}
}
// Dividers in navbar
.divider-vertical {
border-left-color: @navbarInverseBackground;
border-right-color: @navbarInverseBackgroundHighlight;
}
// Dropdowns
.nav li.dropdown.open > .dropdown-toggle,
.nav li.dropdown.active > .dropdown-toggle,
.nav li.dropdown.open.active > .dropdown-toggle {
background-color: @navbarInverseLinkBackgroundActive;
color: @navbarInverseLinkColorActive;
}
.nav li.dropdown > a:hover .caret,
.nav li.dropdown > a:focus .caret {
border-top-color: @navbarInverseLinkColorActive;
border-bottom-color: @navbarInverseLinkColorActive;
}
.nav li.dropdown > .dropdown-toggle .caret {
border-top-color: @navbarInverseLinkColor;
border-bottom-color: @navbarInverseLinkColor;
}
.nav li.dropdown.open > .dropdown-toggle .caret,
.nav li.dropdown.active > .dropdown-toggle .caret,
.nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: @navbarInverseLinkColorActive;
border-bottom-color: @navbarInverseLinkColorActive;
}
// Navbar search
.navbar-search {
.search-query {
color: @white;
background-color: @navbarInverseSearchBackground;
border-color: @navbarInverseSearchBorder;
.box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
.transition(none);
.placeholder(@navbarInverseSearchPlaceholderColor);
// Focus states (we use .focused since IE7-8 and down doesn't support :focus)
&:focus,
&.focused {
padding: 5px 15px;
color: @grayDark;
text-shadow: 0 1px 0 @white;
background-color: @navbarInverseSearchBackgroundFocus;
border: 0;
.box-shadow(0 0 3px rgba(0,0,0,.15));
outline: 0;
}
}
}
// Navbar collapse button
.btn-navbar {
.buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
}
}
PK g}!]U�;�* * bootstrap/progress-bars.lessnu &1i� //
// Progress bars
// --------------------------------------------------
// ANIMATIONS
// ----------
// Webkit
@-webkit-keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// Firefox
@-moz-keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// IE9
@-ms-keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// Opera
@-o-keyframes progress-bar-stripes {
from { background-position: 0 0; }
to { background-position: 40px 0; }
}
// Spec
@keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// THE BARS
// --------
// Outer container
.progress {
overflow: hidden;
height: @baseLineHeight;
margin-bottom: @baseLineHeight;
#gradient > .vertical(#f5f5f5, #f9f9f9);
.box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
.border-radius(@baseBorderRadius);
}
// Bar of progress
.progress .bar {
width: 0%;
height: 100%;
color: @white;
float: left;
font-size: 12px;
text-align: center;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
#gradient > .vertical(#149bdf, #0480be);
.box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
.box-sizing(border-box);
.transition(width .6s ease);
}
.progress .bar + .bar {
.box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)");
}
// Striped bars
.progress-striped .bar {
#gradient > .striped(#149bdf);
.background-size(40px 40px);
}
// Call animation for the active one
.progress.active .bar {
-webkit-animation: progress-bar-stripes 2s linear infinite;
-moz-animation: progress-bar-stripes 2s linear infinite;
-ms-animation: progress-bar-stripes 2s linear infinite;
-o-animation: progress-bar-stripes 2s linear infinite;
animation: progress-bar-stripes 2s linear infinite;
}
// COLORS
// ------
// Danger (red)
.progress-danger .bar, .progress .bar-danger {
#gradient > .vertical(#ee5f5b, #c43c35);
}
.progress-danger.progress-striped .bar, .progress-striped .bar-danger {
#gradient > .striped(#ee5f5b);
}
// Success (green)
.progress-success .bar, .progress .bar-success {
#gradient > .vertical(#62c462, #57a957);
}
.progress-success.progress-striped .bar, .progress-striped .bar-success {
#gradient > .striped(#62c462);
}
// Info (teal)
.progress-info .bar, .progress .bar-info {
#gradient > .vertical(#5bc0de, #339bb9);
}
.progress-info.progress-striped .bar, .progress-striped .bar-info {
#gradient > .striped(#5bc0de);
}
// Warning (orange)
.progress-warning .bar, .progress .bar-warning {
#gradient > .vertical(lighten(@orange, 15%), @orange);
}
.progress-warning.progress-striped .bar, .progress-striped .bar-warning {
#gradient > .striped(lighten(@orange, 15%));
}
PK g}!])w��� � bootstrap/modals.lessnu &1i� //
// Modals
// --------------------------------------------------
// Background
.modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: @zindexModalBackdrop;
background-color: @black;
// Fade for backdrop
&.fade { opacity: 0; }
}
.modal-backdrop,
.modal-backdrop.fade.in {
.opacity(80);
}
// Base modal
.modal {
position: fixed;
top: 10%;
left: 50%;
z-index: @zindexModal;
width: 560px;
margin-left: -280px;
background-color: @white;
border: 1px solid #999;
border: 1px solid rgba(0,0,0,.3);
*border: 1px solid #999; /* IE6-7 */
.border-radius(6px);
.box-shadow(0 3px 7px rgba(0,0,0,0.3));
.background-clip(padding-box);
// Remove focus outline from opened modal
outline: none;
&.fade {
.transition(e('opacity .3s linear, top .3s ease-out'));
top: -25%;
}
&.fade.in { top: 10%; }
}
.modal-header {
padding: 9px 15px;
border-bottom: 1px solid #eee;
// Close icon
.close { margin-top: 2px; }
// Heading
h3 {
margin: 0;
line-height: 30px;
}
}
// Body (where all modal content resides)
.modal-body {
position: relative;
overflow-y: auto;
max-height: 400px;
padding: 15px;
}
// Remove bottom margin if need be
.modal-form {
margin-bottom: 0;
}
// Footer (for actions)
.modal-footer {
padding: 14px 15px 15px;
margin-bottom: 0;
text-align: right; // right align buttons
background-color: #f5f5f5;
border-top: 1px solid #ddd;
.border-radius(0 0 6px 6px);
.box-shadow(inset 0 1px 0 @white);
.clearfix(); // clear it in case folks use .pull-* classes on buttons
// Properly space out buttons
.btn + .btn {
margin-left: 5px;
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
}
// but override that for button groups
.btn-group .btn + .btn {
margin-left: -1px;
}
// and override it for block buttons as well
.btn-block + .btn-block {
margin-left: 0;
}
}
PK g}!]���� � bootstrap/tooltip.lessnu &1i� //
// Tooltips
// --------------------------------------------------
// Base class
.tooltip {
position: absolute;
z-index: @zindexTooltip;
display: block;
visibility: visible;
font-size: 11px;
line-height: 1.4;
.opacity(0);
&.in { .opacity(80); }
&.top { margin-top: -3px; padding: 5px 0; }
&.right { margin-left: 3px; padding: 0 5px; }
&.bottom { margin-top: 3px; padding: 5px 0; }
&.left { margin-left: -3px; padding: 0 5px; }
}
// Wrapper for the tooltip content
.tooltip-inner {
max-width: 200px;
padding: 8px;
color: @tooltipColor;
text-align: center;
text-decoration: none;
background-color: @tooltipBackground;
.border-radius(@baseBorderRadius);
}
// Arrows
.tooltip-arrow {
position: absolute;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.tooltip {
&.top .tooltip-arrow {
bottom: 0;
left: 50%;
margin-left: -@tooltipArrowWidth;
border-width: @tooltipArrowWidth @tooltipArrowWidth 0;
border-top-color: @tooltipArrowColor;
}
&.right .tooltip-arrow {
top: 50%;
left: 0;
margin-top: -@tooltipArrowWidth;
border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;
border-right-color: @tooltipArrowColor;
}
&.left .tooltip-arrow {
top: 50%;
right: 0;
margin-top: -@tooltipArrowWidth;
border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;
border-left-color: @tooltipArrowColor;
}
&.bottom .tooltip-arrow {
top: 0;
left: 50%;
margin-left: -@tooltipArrowWidth;
border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;
border-bottom-color: @tooltipArrowColor;
}
}
PK g}!]@e�= �= bootstrap/forms.lessnu &1i� //
// Forms
// --------------------------------------------------
// GENERAL STYLES
// --------------
// Make all forms have space below them
form {
margin: 0 0 @baseLineHeight;
}
fieldset {
padding: 0;
margin: 0;
border: 0;
}
// Groups of fields with labels on top (legends)
legend {
display: block;
width: 100%;
padding: 0;
margin-bottom: @baseLineHeight;
font-size: @baseFontSize * 1.5;
line-height: @baseLineHeight * 2;
color: @grayDark;
border: 0;
border-bottom: 1px solid #e5e5e5;
// Small
small {
font-size: @baseLineHeight * .75;
color: @grayLight;
}
}
// Set font for forms
label,
input,
button,
select,
textarea {
#font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
}
input,
button,
select,
textarea {
font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
}
// Identify controls by their labels
label {
display: block;
margin-bottom: 5px;
}
// Form controls
// -------------------------
// Shared size and type resets
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
display: inline-block;
height: @baseLineHeight;
padding: 4px 6px;
margin-bottom: @baseLineHeight / 2;
font-size: @baseFontSize;
line-height: @baseLineHeight;
color: @gray;
.border-radius(@inputBorderRadius);
vertical-align: middle;
}
// Reset appearance properties for textual inputs and textarea
// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
input,
textarea,
.uneditable-input {
width: 206px; // plus 12px padding and 2px border
}
// Reset height since textareas have rows
textarea {
height: auto;
}
// Everything else
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
background-color: @inputBackground;
border: 1px solid @inputBorder;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
.transition(~"border linear .2s, box-shadow linear .2s");
// Focus state
&:focus {
border-color: rgba(82,168,236,.8);
outline: 0;
outline: thin dotted \9; /* IE6-9 */
.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
}
}
// Position radios and checkboxes better
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
*margin-top: 0; /* IE7 */
margin-top: 1px \9; /* IE8-9 */
line-height: normal;
}
// Reset width of input images, buttons, radios, checkboxes
input[type="file"],
input[type="image"],
input[type="submit"],
input[type="reset"],
input[type="button"],
input[type="radio"],
input[type="checkbox"] {
width: auto; // Override of generic input selector
}
// Set the height of select and file controls to match text inputs
select,
input[type="file"] {
height: @inputHeight; /* In IE7, the height of the select element cannot be changed by height, only font-size */
*margin-top: 4px; /* For IE7, add top margin to align select with labels */
line-height: @inputHeight;
}
// Make select elements obey height by applying a border
select {
width: 220px; // default input width + 10px of padding that doesn't get applied
border: 1px solid @inputBorder;
background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
}
// Make multiple select elements height not fixed
select[multiple],
select[size] {
height: auto;
}
// Focus for select, file, radio, and checkbox
select:focus,
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
.tab-focus();
}
// Uneditable inputs
// -------------------------
// Make uneditable inputs look inactive
.uneditable-input,
.uneditable-textarea {
color: @grayLight;
background-color: darken(@inputBackground, 1%);
border-color: @inputBorder;
.box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
cursor: not-allowed;
}
// For text that needs to appear as an input but should not be an input
.uneditable-input {
overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
white-space: nowrap;
}
// Make uneditable textareas behave like a textarea
.uneditable-textarea {
width: auto;
height: auto;
}
// Placeholder
// -------------------------
// Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector
input,
textarea {
.placeholder();
}
// CHECKBOXES & RADIOS
// -------------------
// Indent the labels to position radios/checkboxes as hanging
.radio,
.checkbox {
min-height: @baseLineHeight; // clear the floating input if there is no label text
padding-left: 20px;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
float: left;
margin-left: -20px;
}
// Move the options list down to align with labels
.controls > .radio:first-child,
.controls > .checkbox:first-child {
padding-top: 5px; // has to be padding because margin collaspes
}
// Radios and checkboxes on same line
// TODO v3: Convert .inline to .control-inline
.radio.inline,
.checkbox.inline {
display: inline-block;
padding-top: 5px;
margin-bottom: 0;
vertical-align: middle;
}
.radio.inline + .radio.inline,
.checkbox.inline + .checkbox.inline {
margin-left: 10px; // space out consecutive inline controls
}
// INPUT SIZES
// -----------
// General classes for quick sizes
.input-mini { width: 60px; }
.input-small { width: 90px; }
.input-medium { width: 150px; }
.input-large { width: 210px; }
.input-xlarge { width: 270px; }
.input-xxlarge { width: 530px; }
// Grid style input sizes
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input[class*="span"],
// Redeclare since the fluid row class is more specific
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"] {
float: none;
margin-left: 0;
}
// Ensure input-prepend/append never wraps
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
display: inline-block;
}
// GRID SIZING FOR INPUTS
// ----------------------
// Grid sizes
#grid > .input(@gridColumnWidth, @gridGutterWidth);
// Control row for multiple inputs per line
.controls-row {
.clearfix(); // Clear the float from controls
}
// Float to collapse white-space for proper grid alignment
.controls-row [class*="span"],
// Redeclare the fluid grid collapse since we undo the float for inputs
.row-fluid .controls-row [class*="span"] {
float: left;
}
// Explicity set top padding on all checkboxes/radios, not just first-child
.controls-row .checkbox[class*="span"],
.controls-row .radio[class*="span"] {
padding-top: 5px;
}
// DISABLED STATE
// --------------
// Disabled and read-only inputs
input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
cursor: not-allowed;
background-color: @inputDisabledBackground;
}
// Explicitly reset the colors here
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"][readonly],
input[type="checkbox"][readonly] {
background-color: transparent;
}
// FORM FIELD FEEDBACK STATES
// --------------------------
// Warning
.control-group.warning {
.formFieldState(@warningText, @warningText, @warningBackground);
}
// Error
.control-group.error {
.formFieldState(@errorText, @errorText, @errorBackground);
}
// Success
.control-group.success {
.formFieldState(@successText, @successText, @successBackground);
}
// Success
.control-group.info {
.formFieldState(@infoText, @infoText, @infoBackground);
}
// HTML5 invalid states
// Shares styles with the .control-group.error above
input:focus:invalid,
textarea:focus:invalid,
select:focus:invalid {
color: #b94a48;
border-color: #ee5f5b;
&:focus {
border-color: darken(#ee5f5b, 10%);
@shadow: 0 0 6px lighten(#ee5f5b, 20%);
.box-shadow(@shadow);
}
}
// FORM ACTIONS
// ------------
.form-actions {
padding: (@baseLineHeight - 1) 20px @baseLineHeight;
margin-top: @baseLineHeight;
margin-bottom: @baseLineHeight;
background-color: @formActionsBackground;
border-top: 1px solid #e5e5e5;
.clearfix(); // Adding clearfix to allow for .pull-right button containers
}
// HELP TEXT
// ---------
.help-block,
.help-inline {
color: lighten(@textColor, 15%); // lighten the text some for contrast
}
.help-block {
display: block; // account for any element using help-block
margin-bottom: @baseLineHeight / 2;
}
.help-inline {
display: inline-block;
.ie7-inline-block();
vertical-align: middle;
padding-left: 5px;
}
// INPUT GROUPS
// ------------
// Allow us to put symbols and text within the input field for a cleaner look
.input-append,
.input-prepend {
display: inline-block;
margin-bottom: @baseLineHeight / 2;
vertical-align: middle;
font-size: 0; // white space collapse hack
white-space: nowrap; // Prevent span and input from separating
// Reset the white space collapse hack
input,
select,
.uneditable-input,
.dropdown-menu,
.popover {
font-size: @baseFontSize;
}
input,
select,
.uneditable-input {
position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
*margin-left: 0;
vertical-align: top;
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
// Make input on top when focused so blue border and shadow always show
&:focus {
z-index: 2;
}
}
.add-on {
display: inline-block;
width: auto;
height: @baseLineHeight;
min-width: 16px;
padding: 4px 5px;
font-size: @baseFontSize;
font-weight: normal;
line-height: @baseLineHeight;
text-align: center;
text-shadow: 0 1px 0 @white;
background-color: @grayLighter;
border: 1px solid #ccc;
}
.add-on,
.btn,
.btn-group > .dropdown-toggle {
vertical-align: top;
.border-radius(0);
}
.active {
background-color: lighten(@green, 30);
border-color: @green;
}
}
.input-prepend {
.add-on,
.btn {
margin-right: -1px;
}
.add-on:first-child,
.btn:first-child {
// FYI, `.btn:first-child` accounts for a button group that's prepended
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
}
}
.input-append {
input,
select,
.uneditable-input {
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ .btn-group .btn:last-child {
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
.add-on,
.btn,
.btn-group {
margin-left: -1px;
}
.add-on:last-child,
.btn:last-child,
.btn-group:last-child > .dropdown-toggle {
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
// Remove all border-radius for inputs with both prepend and append
.input-prepend.input-append {
input,
select,
.uneditable-input {
.border-radius(0);
+ .btn-group .btn {
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
.add-on:first-child,
.btn:first-child {
margin-right: -1px;
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
}
.add-on:last-child,
.btn:last-child {
margin-left: -1px;
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
.btn-group:first-child {
margin-left: 0;
}
}
// SEARCH FORM
// -----------
input.search-query {
padding-right: 14px;
padding-right: 4px \9;
padding-left: 14px;
padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
margin-bottom: 0; // Remove the default margin on all inputs
.border-radius(15px);
}
/* Allow for input prepend/append in search forms */
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
.border-radius(0); // Override due to specificity
}
.form-search .input-append .search-query {
.border-radius(14px 0 0 14px);
}
.form-search .input-append .btn {
.border-radius(0 14px 14px 0);
}
.form-search .input-prepend .search-query {
.border-radius(0 14px 14px 0);
}
.form-search .input-prepend .btn {
.border-radius(14px 0 0 14px);
}
// HORIZONTAL & VERTICAL FORMS
// ---------------------------
// Common properties
// -----------------
.form-search,
.form-inline,
.form-horizontal {
input,
textarea,
select,
.help-inline,
.uneditable-input,
.input-prepend,
.input-append {
display: inline-block;
.ie7-inline-block();
margin-bottom: 0;
vertical-align: middle;
}
// Re-hide hidden elements due to specifity
.hide {
display: none;
}
}
.form-search label,
.form-inline label,
.form-search .btn-group,
.form-inline .btn-group {
display: inline-block;
}
// Remove margin for input-prepend/-append
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
margin-bottom: 0;
}
// Inline checkbox/radio labels (remove padding on left)
.form-search .radio,
.form-search .checkbox,
.form-inline .radio,
.form-inline .checkbox {
padding-left: 0;
margin-bottom: 0;
vertical-align: middle;
}
// Remove float and margin, set to inline-block
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"],
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
float: left;
margin-right: 3px;
margin-left: 0;
}
// Margin to space out fieldsets
.control-group {
margin-bottom: @baseLineHeight / 2;
}
// Legend collapses margin, so next element is responsible for spacing
legend + .control-group {
margin-top: @baseLineHeight;
-webkit-margin-top-collapse: separate;
}
// Horizontal-specific styles
// --------------------------
.form-horizontal {
// Increase spacing between groups
.control-group {
margin-bottom: @baseLineHeight;
.clearfix();
}
// Float the labels left
.control-label {
float: left;
width: @horizontalComponentOffset - 20;
padding-top: 5px;
text-align: right;
}
// Move over all input controls and content
.controls {
// Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
// don't inherit the margin of the parent, in this case .controls
*display: inline-block;
*padding-left: 20px;
margin-left: @horizontalComponentOffset;
*margin-left: 0;
&:first-child {
*padding-left: @horizontalComponentOffset;
}
}
// Remove bottom margin on block level help text since that's accounted for on .control-group
.help-block {
margin-bottom: 0;
}
// And apply it only to .help-block instances that follow a form control
input,
select,
textarea,
.uneditable-input,
.input-prepend,
.input-append {
+ .help-block {
margin-top: @baseLineHeight / 2;
}
}
// Move over buttons in .form-actions to align with .controls
.form-actions {
padding-left: @horizontalComponentOffset;
}
}
PK g}!] �uR� � bootstrap/grid.lessnu &1i� //
// Grid system
// --------------------------------------------------
// Fixed (940px)
#grid > .core(@gridColumnWidth, @gridGutterWidth);
// Fluid (940px)
#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
// Reset utility classes due to specificity
[class*="span"].hide,
.row-fluid [class*="span"].hide {
display: none;
}
[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
float: right;
}
PK g}!]/ �� � bootstrap/carousel.lessnu &1i� //
// Carousel
// --------------------------------------------------
.carousel {
position: relative;
margin-bottom: @baseLineHeight;
line-height: 1;
}
.carousel-inner {
overflow: hidden;
width: 100%;
position: relative;
}
.carousel-inner {
> .item {
display: none;
position: relative;
.transition(.6s ease-in-out left);
// Account for jankitude on images
> img,
> a > img {
display: block;
line-height: 1;
}
}
> .active,
> .next,
> .prev { display: block; }
> .active {
left: 0;
}
> .next,
> .prev {
position: absolute;
top: 0;
width: 100%;
}
> .next {
left: 100%;
}
> .prev {
left: -100%;
}
> .next.left,
> .prev.right {
left: 0;
}
> .active.left {
left: -100%;
}
> .active.right {
left: 100%;
}
}
// Left/right controls for nav
// ---------------------------
.carousel-control {
position: absolute;
top: 40%;
left: 15px;
width: 40px;
height: 40px;
margin-top: -20px;
font-size: 60px;
font-weight: 100;
line-height: 30px;
color: @white;
text-align: center;
background: @grayDarker;
border: 3px solid @white;
.border-radius(23px);
.opacity(50);
// we can't have this transition here
// because webkit cancels the carousel
// animation if you trip this while
// in the middle of another animation
// ;_;
// .transition(opacity .2s linear);
// Reposition the right one
&.right {
left: auto;
right: 15px;
}
// Hover/focus state
&:hover,
&:focus {
color: @white;
text-decoration: none;
.opacity(90);
}
}
// Carousel indicator pips
// -----------------------------
.carousel-indicators {
position: absolute;
top: 15px;
right: 15px;
z-index: 5;
margin: 0;
list-style: none;
li {
display: block;
float: left;
width: 10px;
height: 10px;
margin-left: 5px;
text-indent: -999px;
background-color: #ccc;
background-color: rgba(255,255,255,.25);
border-radius: 5px;
}
.active {
background-color: #fff;
}
}
// Caption for text below images
// -----------------------------
.carousel-caption {
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding: 15px;
background: @grayDark;
background: rgba(0,0,0,.75);
}
.carousel-caption h4,
.carousel-caption p {
color: @white;
line-height: @baseLineHeight;
}
.carousel-caption h4 {
margin: 0 0 5px;
}
.carousel-caption p {
margin-bottom: 0;
}
PK g}!]�i�� � % bootstrap/responsive-768px-979px.lessnu &1i� //
// Responsive: Tablet to desktop
// --------------------------------------------------
@media (min-width: 768px) and (max-width: 979px) {
// Fixed grid
#grid > .core(@gridColumnWidth768, @gridGutterWidth768);
// Fluid grid
#grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);
// Input grid
#grid > .input(@gridColumnWidth768, @gridGutterWidth768);
// No need to reset .thumbnails here since it's the same @gridGutterWidth
}
PK g}!]���B B # bootstrap/responsive-utilities.lessnu &1i� //
// Responsive: Utility classes
// --------------------------------------------------
// IE10 Metro responsive
// Required for Windows 8 Metro split-screen snapping with IE10
// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
@-ms-viewport{
width: device-width;
}
// Hide from screenreaders and browsers
// Credit: HTML5 Boilerplate
.hidden {
display: none;
visibility: hidden;
}
// Visibility utilities
// For desktops
.visible-phone { display: none !important; }
.visible-tablet { display: none !important; }
.hidden-phone { }
.hidden-tablet { }
.hidden-desktop { display: none !important; }
.visible-desktop { display: inherit !important; }
// Tablets & small desktops only
@media (min-width: 768px) and (max-width: 979px) {
// Hide everything else
.hidden-desktop { display: inherit !important; }
.visible-desktop { display: none !important ; }
// Show
.visible-tablet { display: inherit !important; }
// Hide
.hidden-tablet { display: none !important; }
}
// Phones only
@media (max-width: 767px) {
// Hide everything else
.hidden-desktop { display: inherit !important; }
.visible-desktop { display: none !important; }
// Show
.visible-phone { display: inherit !important; } // Use inherit to restore previous behavior
// Hide
.hidden-phone { display: none !important; }
}
// Print utilities
.visible-print { display: none !important; }
.hidden-print { }
@media print {
.visible-print { display: inherit !important; }
.hidden-print { display: none !important; }
}
PK g}!]��>�I I bootstrap/layouts.lessnu &1i� //
// Layouts
// --------------------------------------------------
// Container (centered, fixed-width layouts)
.container {
.container-fixed();
}
// Fluid layouts (left aligned, with sidebar, min- & max-width content)
.container-fluid {
padding-right: @gridGutterWidth;
padding-left: @gridGutterWidth;
.clearfix();
}PK g}!]�Y�w�* �* bootstrap/sprites.j32.lessnu &1i� //
// Sprites
// --------------------------------------------------
// ICONS
// -----
// All icons receive the styles of the <i> tag with a base class
// of .i and are then given a unique class to add width, height,
// and background-position. Your resulting HTML will look like
// <i class="icon-inbox"></i>.
// For the white version of the icons, just add the .icon-white class:
// <i class="icon-inbox icon-white"></i>
[class^="icon-"],
[class*=" icon-"] {
display: inline-block;
width: 14px;
height: 14px;
.ie7-restore-right-whitespace();
line-height: 14px;
vertical-align: text-top;
background-image: url("@{iconSpritePath}");
background-position: 14px 14px;
background-repeat: no-repeat;
margin-top: 1px;
}
/* White icons with optional class, or on hover/active states of certain elements */
.icon-white,
.nav-pills > .active > a > [class^="icon-"],
.nav-pills > .active > a > [class*=" icon-"],
.nav-list > .active > a > [class^="icon-"],
.nav-list > .active > a > [class*=" icon-"],
.navbar-inverse .nav > .active > a > [class^="icon-"],
.navbar-inverse .nav > .active > a > [class*=" icon-"],
.dropdown-menu > li > a:hover > [class^="icon-"],
.dropdown-menu > li > a:focus > [class^="icon-"],
.dropdown-menu > li > a:hover > [class*=" icon-"],
.dropdown-menu > li > a:focus > [class*=" icon-"],
.dropdown-menu > .active > a > [class^="icon-"],
.dropdown-menu > .active > a > [class*=" icon-"],
.dropdown-submenu:hover > a > [class^="icon-"],
.dropdown-submenu:focus > a > [class^="icon-"],
.dropdown-submenu:hover > a > [class*=" icon-"],
.dropdown-submenu:focus > a > [class*=" icon-"] {
background-image: url("@{iconWhiteSpritePath}");
}
.icon-glass { background-position: 0 0; }
//.icon-music { background-position: -24px 0; }
//.icon-search { background-position: -48px 0; }
//.icon-envelope { background-position: -72px 0; }
//.icon-heart { background-position: -96px 0; }
//.icon-star { background-position: -120px 0; }
//.icon-star-empty { background-position: -144px 0; }
//.icon-user { background-position: -168px 0; }
.icon-film { background-position: -192px 0; }
.icon-th-large { background-position: -216px 0; }
.icon-th { background-position: -240px 0; }
.icon-th-list { background-position: -264px 0; }
//.icon-ok { background-position: -288px 0; }
//.icon-remove { background-position: -312px 0; }
//.icon-zoom-in { background-position: -336px 0; }
//.icon-zoom-out { background-position: -360px 0; }
.icon-off { background-position: -384px 0; }
.icon-signal { background-position: -408px 0; }
//.icon-cog { background-position: -432px 0; }
//.icon-trash { background-position: -456px 0; }
//.icon-home { background-position: 0 -24px; }
//.icon-file { background-position: -24px -24px; }
.icon-time { background-position: -48px -24px; }
.icon-road { background-position: -72px -24px; }
.icon-download-alt { background-position: -96px -24px; }
//.icon-download { background-position: -120px -24px; }
//.icon-upload { background-position: -144px -24px; }
.icon-inbox { background-position: -168px -24px; }
//.icon-play-circle { background-position: -192px -24px; }
.icon-repeat { background-position: -216px -24px; }
//.icon-refresh { background-position: -240px -24px; }
.icon-list-alt { background-position: -264px -24px; }
//.icon-lock { background-position: -287px -24px; } // 1px off
//.icon-flag { background-position: -312px -24px; }
.icon-headphones { background-position: -336px -24px; }
.icon-volume-off { background-position: -360px -24px; }
.icon-volume-down { background-position: -384px -24px; }
.icon-volume-up { background-position: -408px -24px; }
.icon-qrcode { background-position: -432px -24px; }
.icon-barcode { background-position: -456px -24px; }
//.icon-tag { background-position: 0 -48px; }
//.icon-tags { background-position: -25px -48px; } // 1px off
//.icon-book { background-position: -48px -48px; }
//.icon-bookmark { background-position: -72px -48px; }
//.icon-print { background-position: -96px -48px; }
//.icon-camera { background-position: -120px -48px; }
.icon-font { background-position: -144px -48px; }
.icon-bold { background-position: -167px -48px; } // 1px off
.icon-italic { background-position: -192px -48px; }
.icon-text-height { background-position: -216px -48px; }
.icon-text-width { background-position: -240px -48px; }
.icon-align-left { background-position: -264px -48px; }
.icon-align-center { background-position: -288px -48px; }
.icon-align-right { background-position: -312px -48px; }
.icon-align-justify { background-position: -336px -48px; }
//.icon-list { background-position: -360px -48px; }
.icon-indent-left { background-position: -384px -48px; }
.icon-indent-right { background-position: -408px -48px; }
.icon-facetime-video { background-position: -432px -48px; }
//.icon-picture { background-position: -456px -48px; }
//.icon-pencil { background-position: 0 -72px; }
.icon-map-marker { background-position: -24px -72px; }
.icon-adjust { background-position: -48px -72px; }
.icon-tint { background-position: -72px -72px; }
//.icon-edit { background-position: -96px -72px; }
//.icon-share { background-position: -120px -72px; }
.icon-check { background-position: -144px -72px; }
//.icon-move { background-position: -168px -72px; }
.icon-step-backward { background-position: -192px -72px; }
.icon-fast-backward { background-position: -216px -72px; }
//.icon-backward { background-position: -240px -72px; }
//.icon-play { background-position: -264px -72px; }
//.icon-pause { background-position: -288px -72px; }
//.icon-stop { background-position: -312px -72px; }
//.icon-forward { background-position: -336px -72px; }
.icon-fast-forward { background-position: -360px -72px; }
.icon-step-forward { background-position: -384px -72px; }
.icon-eject { background-position: -408px -72px; }
//.icon-chevron-left { background-position: -432px -72px; }
//.icon-chevron-right { background-position: -456px -72px; }
.icon-plus-sign { background-position: 0 -96px; }
//.icon-minus-sign { background-position: -24px -96px; }
.icon-remove-sign { background-position: -48px -96px; }
.icon-ok-sign { background-position: -72px -96px; }
//.icon-question-sign { background-position: -96px -96px; }
.icon-info-sign { background-position: -120px -96px; }
.icon-screenshot { background-position: -144px -96px; }
.icon-remove-circle { background-position: -168px -96px; }
.icon-ok-circle { background-position: -192px -96px; }
//.icon-ban-circle { background-position: -216px -96px; }
//.icon-arrow-left { background-position: -240px -96px; }
//.icon-arrow-right { background-position: -264px -96px; }
.icon-arrow-up { background-position: -289px -96px; } // 1px off
.icon-arrow-down { background-position: -312px -96px; }
//.icon-share-alt { background-position: -336px -96px; }
.icon-resize-full { background-position: -360px -96px; }
.icon-resize-small { background-position: -384px -96px; }
//.icon-plus { background-position: -408px -96px; }
//.icon-minus { background-position: -433px -96px; }
//.icon-asterisk { background-position: -456px -96px; }
.icon-exclamation-sign { background-position: 0 -120px; }
.icon-gift { background-position: -24px -120px; }
.icon-leaf { background-position: -48px -120px; }
.icon-fire { background-position: -72px -120px; }
//.icon-eye-open { background-position: -96px -120px; }
//.icon-eye-close { background-position: -120px -120px; }
.icon-warning-sign { background-position: -144px -120px; }
.icon-plane { background-position: -168px -120px; }
//.icon-calendar { background-position: -192px -120px; }
.icon-random { background-position: -216px -120px; width: 16px; }
//.icon-comment { background-position: -240px -120px; }
.icon-magnet { background-position: -264px -120px; }
//.icon-chevron-up { background-position: -288px -120px; }
//.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off
.icon-retweet { background-position: -336px -120px; }
.icon-shopping-cart { background-position: -360px -120px; }
//.icon-folder-close { background-position: -384px -120px; }
//.icon-folder-open { background-position: -408px -120px; width: 16px; }
.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off
.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off
.icon-hdd { background-position: 0 -144px; }
.icon-bullhorn { background-position: -24px -144px; }
.icon-bell { background-position: -48px -144px; }
.icon-certificate { background-position: -72px -144px; }
//.icon-thumbs-up { background-position: -96px -144px; }
//.icon-thumbs-down { background-position: -120px -144px; }
.icon-hand-right { background-position: -144px -144px; }
.icon-hand-left { background-position: -168px -144px; }
.icon-hand-up { background-position: -192px -144px; }
.icon-hand-down { background-position: -216px -144px; }
.icon-circle-arrow-right { background-position: -240px -144px; }
.icon-circle-arrow-left { background-position: -264px -144px; }
.icon-circle-arrow-up { background-position: -288px -144px; }
.icon-circle-arrow-down { background-position: -312px -144px; }
.icon-globe { background-position: -336px -144px; }
//.icon-wrench { background-position: -360px -144px; }
.icon-tasks { background-position: -384px -144px; }
//.icon-filter { background-position: -408px -144px; }
//.icon-briefcase { background-position: -432px -144px; }
.icon-fullscreen { background-position: -456px -144px; }
PK g}!]�-0� � bootstrap/thumbnails.lessnu &1i� //
// Thumbnails
// --------------------------------------------------
// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
// Make wrapper ul behave like the grid
.thumbnails {
margin-left: -@gridGutterWidth;
list-style: none;
.clearfix();
}
// Fluid rows have no left margin
.row-fluid .thumbnails {
margin-left: 0;
}
// Float li to make thumbnails appear in a row
.thumbnails > li {
float: left; // Explicity set the float since we don't require .span* classes
margin-bottom: @baseLineHeight;
margin-left: @gridGutterWidth;
}
// The actual thumbnail (can be `a` or `div`)
.thumbnail {
display: block;
padding: 4px;
line-height: @baseLineHeight;
border: 1px solid #ddd;
.border-radius(@baseBorderRadius);
.box-shadow(0 1px 3px rgba(0,0,0,.055));
.transition(all .2s ease-in-out);
}
// Add a hover/focus state for linked versions only
a.thumbnail:hover,
a.thumbnail:focus {
border-color: @linkColor;
.box-shadow(0 1px 4px rgba(0,105,214,.25));
}
// Images and captions
.thumbnail > img {
display: block;
max-width: 100%;
margin-left: auto;
margin-right: auto;
}
.thumbnail .caption {
padding: 9px;
color: @gray;
}
PK g}!]��u�# �# bootstrap/variables.lessnu &1i� //
// Variables
// --------------------------------------------------
// Global values
// --------------------------------------------------
// Grays
// -------------------------
@black: #000;
@grayDarker: #222;
@grayDark: #333;
@gray: #555;
@grayLight: #999;
@grayLighter: #eee;
@white: #fff;
// Accent colors
// -------------------------
@blue: #049cdb;
@blueDark: #0064cd;
@green: #46a546;
@red: #9d261d;
@yellow: #ffc40d;
@orange: #f89406;
@pink: #c3325f;
@purple: #7a43b6;
// Scaffolding
// -------------------------
@bodyBackground: @white;
@textColor: @grayDark;
// Links
// -------------------------
@linkColor: #08c;
@linkColorHover: darken(@linkColor, 15%);
// Typography
// -------------------------
@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif;
@serifFontFamily: Georgia, "Times New Roman", Times, serif;
@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace;
@baseFontSize: 14px;
@baseFontFamily: @sansFontFamily;
@baseLineHeight: 20px;
@altFontFamily: @serifFontFamily;
@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
@headingsFontWeight: bold; // instead of browser default, bold
@headingsColor: inherit; // empty to use BS default, @textColor
// Component sizing
// -------------------------
// Based on 14px font-size and 20px line-height
@fontSizeLarge: @baseFontSize * 1.25; // ~18px
@fontSizeSmall: @baseFontSize * 0.85; // ~12px
@fontSizeMini: @baseFontSize * 0.75; // ~11px
@paddingLarge: 11px 19px; // 44px
@paddingSmall: 2px 10px; // 26px
@paddingMini: 0 6px; // 22px
@baseBorderRadius: 4px;
@borderRadiusLarge: 6px;
@borderRadiusSmall: 3px;
// Tables
// -------------------------
@tableBackground: transparent; // overall background-color
@tableBackgroundAccent: #f9f9f9; // for striping
@tableBackgroundHover: #f5f5f5; // for hover
@tableBorder: #ddd; // table and cell border
// Buttons
// -------------------------
@btnBackground: @white;
@btnBackgroundHighlight: darken(@white, 10%);
@btnBorder: #ccc;
@btnPrimaryBackground: @linkColor;
@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%);
@btnInfoBackground: #5bc0de;
@btnInfoBackgroundHighlight: #2f96b4;
@btnSuccessBackground: #62c462;
@btnSuccessBackgroundHighlight: #51a351;
@btnWarningBackground: lighten(@orange, 15%);
@btnWarningBackgroundHighlight: @orange;
@btnDangerBackground: #ee5f5b;
@btnDangerBackgroundHighlight: #bd362f;
@btnInverseBackground: #444;
@btnInverseBackgroundHighlight: @grayDarker;
// Forms
// -------------------------
@inputBackground: @white;
@inputBorder: #ccc;
@inputBorderRadius: @baseBorderRadius;
@inputDisabledBackground: @grayLighter;
@formActionsBackground: #f5f5f5;
@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
// Dropdowns
// -------------------------
@dropdownBackground: @white;
@dropdownBorder: rgba(0,0,0,.2);
@dropdownDividerTop: #e5e5e5;
@dropdownDividerBottom: @white;
@dropdownLinkColor: @grayDark;
@dropdownLinkColorHover: @white;
@dropdownLinkColorActive: @white;
@dropdownLinkBackgroundActive: @linkColor;
@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive;
// COMPONENT VARIABLES
// --------------------------------------------------
// Z-index master list
// -------------------------
// Used for a bird's eye view of components dependent on the z-axis
// Try to avoid customizing these :)
@zindexDropdown: 1000;
@zindexPopover: 1010;
@zindexTooltip: 1030;
@zindexFixedNavbar: 1030;
@zindexModalBackdrop: 1040;
@zindexModal: 1050;
// Sprite icons path
// -------------------------
@iconSpritePath: "../img/glyphicons-halflings.png";
@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
// Input placeholder text color
// -------------------------
@placeholderText: @grayLight;
// Hr border color
// -------------------------
@hrBorder: @grayLighter;
// Horizontal forms & lists
// -------------------------
@horizontalComponentOffset: 180px;
// Wells
// -------------------------
@wellBackground: #f5f5f5;
// Navbar
// -------------------------
@navbarCollapseWidth: 979px;
@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1;
@navbarHeight: 40px;
@navbarBackgroundHighlight: #ffffff;
@navbarBackground: darken(@navbarBackgroundHighlight, 5%);
@navbarBorder: darken(@navbarBackground, 12%);
@navbarText: #777;
@navbarLinkColor: #777;
@navbarLinkColorHover: @grayDark;
@navbarLinkColorActive: @gray;
@navbarLinkBackgroundHover: transparent;
@navbarLinkBackgroundActive: darken(@navbarBackground, 5%);
@navbarBrandColor: @navbarLinkColor;
// Inverted navbar
@navbarInverseBackground: #111111;
@navbarInverseBackgroundHighlight: #222222;
@navbarInverseBorder: #252525;
@navbarInverseText: @grayLight;
@navbarInverseLinkColor: @grayLight;
@navbarInverseLinkColorHover: @white;
@navbarInverseLinkColorActive: @navbarInverseLinkColorHover;
@navbarInverseLinkBackgroundHover: transparent;
@navbarInverseLinkBackgroundActive: @navbarInverseBackground;
@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%);
@navbarInverseSearchBackgroundFocus: @white;
@navbarInverseSearchBorder: @navbarInverseBackground;
@navbarInverseSearchPlaceholderColor: #ccc;
@navbarInverseBrandColor: @navbarInverseLinkColor;
// Pagination
// -------------------------
@paginationBackground: #fff;
@paginationBorder: #ddd;
@paginationActiveBackground: #f5f5f5;
// Hero unit
// -------------------------
@heroUnitBackground: @grayLighter;
@heroUnitHeadingColor: inherit;
@heroUnitLeadColor: inherit;
// Form states and alerts
// -------------------------
@warningText: #c09853;
@warningBackground: #fcf8e3;
@warningBorder: darken(spin(@warningBackground, -10), 3%);
@errorText: #b94a48;
@errorBackground: #f2dede;
@errorBorder: darken(spin(@errorBackground, -10), 3%);
@successText: #468847;
@successBackground: #dff0d8;
@successBorder: darken(spin(@successBackground, -10), 5%);
@infoText: #3a87ad;
@infoBackground: #d9edf7;
@infoBorder: darken(spin(@infoBackground, -10), 7%);
// Tooltips and popovers
// -------------------------
@tooltipColor: #fff;
@tooltipBackground: #000;
@tooltipArrowWidth: 5px;
@tooltipArrowColor: @tooltipBackground;
@popoverBackground: #fff;
@popoverArrowWidth: 10px;
@popoverArrowColor: #fff;
@popoverTitleBackground: darken(@popoverBackground, 3%);
// Special enhancement for popovers
@popoverArrowOuterWidth: @popoverArrowWidth + 1;
@popoverArrowOuterColor: rgba(0,0,0,.25);
// GRID
// --------------------------------------------------
// Default 940px grid
// -------------------------
@gridColumns: 12;
@gridColumnWidth: 60px;
@gridGutterWidth: 20px;
@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
// 1200px min
@gridColumnWidth1200: 70px;
@gridGutterWidth1200: 30px;
@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
// 768px-979px
@gridColumnWidth768: 42px;
@gridGutterWidth768: 20px;
@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
// Fluid grid
// -------------------------
@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth);
@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth);
// 1200px min
@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200);
@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200);
// 768px-979px
@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768);
@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768);
PK g}!]��5 5 $ bootstrap/responsive-1200px-min.lessnu &1i� //
// Responsive: Large desktop and up
// --------------------------------------------------
@media (min-width: 1200px) {
// Fixed grid
#grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);
// Fluid grid
#grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);
// Input grid
#grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);
// Thumbnails
.thumbnails {
margin-left: -@gridGutterWidth1200;
}
.thumbnails > li {
margin-left: @gridGutterWidth1200;
}
.row-fluid .thumbnails {
margin-left: 0;
}
}
PK g}!]ʙ�fM M bootstrap/button-groups.lessnu &1i� //
// Button groups
// --------------------------------------------------
// Make the div behave like a button
.btn-group {
position: relative;
display: inline-block;
.ie7-inline-block();
font-size: 0; // remove as part 1 of font-size inline-block hack
vertical-align: middle; // match .btn alignment given font-size hack above
white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
.ie7-restore-left-whitespace();
}
// Space out series of button groups
.btn-group + .btn-group {
margin-left: 5px;
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
font-size: 0; // Hack to remove whitespace that results from using inline-block
margin-top: @baseLineHeight / 2;
margin-bottom: @baseLineHeight / 2;
> .btn + .btn,
> .btn-group + .btn,
> .btn + .btn-group {
margin-left: 5px;
}
}
// Float them, remove border radius, then re-add to first and last elements
.btn-group > .btn {
position: relative;
.border-radius(0);
}
.btn-group > .btn + .btn {
margin-left: -1px;
}
.btn-group > .btn,
.btn-group > .dropdown-menu,
.btn-group > .popover {
font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
}
// Reset fonts for other sizes
.btn-group > .btn-mini {
font-size: @fontSizeMini;
}
.btn-group > .btn-small {
font-size: @fontSizeSmall;
}
.btn-group > .btn-large {
font-size: @fontSizeLarge;
}
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child {
margin-left: 0;
.border-top-left-radius(@baseBorderRadius);
.border-bottom-left-radius(@baseBorderRadius);
}
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
.border-top-right-radius(@baseBorderRadius);
.border-bottom-right-radius(@baseBorderRadius);
}
// Reset corners for large buttons
.btn-group > .btn.large:first-child {
margin-left: 0;
.border-top-left-radius(@borderRadiusLarge);
.border-bottom-left-radius(@borderRadiusLarge);
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
.border-top-right-radius(@borderRadiusLarge);
.border-bottom-right-radius(@borderRadiusLarge);
}
// On hover/focus/active, bring the proper btn to front
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
z-index: 2;
}
// On active and open, don't show outline
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
outline: 0;
}
// Split button dropdowns
// ----------------------
// Give the line between buttons some depth
.btn-group > .btn + .dropdown-toggle {
padding-left: 8px;
padding-right: 8px;
.box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
*padding-top: 5px;
*padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-toggle {
padding-left: 5px;
padding-right: 5px;
*padding-top: 2px;
*padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-toggle {
*padding-top: 5px;
*padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-toggle {
padding-left: 12px;
padding-right: 12px;
*padding-top: 7px;
*padding-bottom: 7px;
}
.btn-group.open {
// The clickable button for toggling the menu
// Remove the gradient and set the same inset shadow as the :active state
.dropdown-toggle {
background-image: none;
.box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
}
// Keep the hover's background when dropdown is open
.btn.dropdown-toggle {
background-color: @btnBackgroundHighlight;
}
.btn-primary.dropdown-toggle {
background-color: @btnPrimaryBackgroundHighlight;
}
.btn-warning.dropdown-toggle {
background-color: @btnWarningBackgroundHighlight;
}
.btn-danger.dropdown-toggle {
background-color: @btnDangerBackgroundHighlight;
}
.btn-success.dropdown-toggle {
background-color: @btnSuccessBackgroundHighlight;
}
.btn-info.dropdown-toggle {
background-color: @btnInfoBackgroundHighlight;
}
.btn-inverse.dropdown-toggle {
background-color: @btnInverseBackgroundHighlight;
}
}
// Reposition the caret
.btn .caret {
margin-top: 8px;
margin-left: 0;
}
// Carets in other button sizes
.btn-large .caret {
margin-top: 6px;
}
.btn-large .caret {
border-left-width: 5px;
border-right-width: 5px;
border-top-width: 5px;
}
.btn-mini .caret,
.btn-small .caret {
margin-top: 8px;
}
// Upside down carets for .dropup
.dropup .btn-large .caret {
border-bottom-width: 5px;
}
// Account for other colors
.btn-primary,
.btn-warning,
.btn-danger,
.btn-info,
.btn-success,
.btn-inverse {
.caret {
border-top-color: @white;
border-bottom-color: @white;
}
}
// Vertical button groups
// ----------------------
.btn-group-vertical {
display: inline-block; // makes buttons only take up the width they need
.ie7-inline-block();
}
.btn-group-vertical > .btn {
display: block;
float: none;
max-width: 100%;
.border-radius(0);
}
.btn-group-vertical > .btn + .btn {
margin-left: 0;
margin-top: -1px;
}
.btn-group-vertical > .btn:first-child {
.border-radius(@baseBorderRadius @baseBorderRadius 0 0);
}
.btn-group-vertical > .btn:last-child {
.border-radius(0 0 @baseBorderRadius @baseBorderRadius);
}
.btn-group-vertical > .btn-large:first-child {
.border-radius(@borderRadiusLarge @borderRadiusLarge 0 0);
}
.btn-group-vertical > .btn-large:last-child {
.border-radius(0 0 @borderRadiusLarge @borderRadiusLarge);
}
PK g}!]�[�� � bootstrap.full.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes the full Bootstrap markup for Joomla! 2.5 templates which do not include Bootstrap CSS styling (default)
*/
/*
* Bootstrap (minimal, for Protostar and other templates with included Bootstrap CSS styling)
*/
// Core variables and mixins
@import "bootstrap/variables.less"; // Modify this for custom colors, font-sizes, etc
@import "bootstrap/mixins.less";
// CSS Reset
@import "bootstrap/reset.less";
// Grid system and page structure
@import "bootstrap/scaffolding.less";
@import "bootstrap/grid.less";
@import "bootstrap/layouts.less";
// Base CSS
@import "bootstrap/type.less";
@import "bootstrap/code.less";
@import "bootstrap/forms.less";
@import "bootstrap/tables.less";
// Components: common
@import "bootstrap/sprites.less";
@import "bootstrap/dropdowns.less";
@import "bootstrap/wells.less";
@import "bootstrap/component-animations.less";
@import "bootstrap/close.less";
// Components: Buttons & Alerts
@import "bootstrap/buttons.less";
@import "bootstrap/button-groups.less";
@import "bootstrap/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
// Components: Nav
@import "bootstrap/navs.less";
@import "bootstrap/navbar.less";
@import "bootstrap/breadcrumbs.less";
@import "bootstrap/pagination.less";
@import "bootstrap/pager.less";
// Components: Popovers
// @import "bootstrap/modals.less";
@import "bootstrap/tooltip.less";
@import "bootstrap/popovers.less";
// Components: Misc
@import "bootstrap/thumbnails.less";
@import "bootstrap/media.less";
@import "bootstrap/labels-badges.less";
@import "bootstrap/progress-bars.less";
@import "bootstrap/accordion.less";
@import "bootstrap/carousel.less";
@import "bootstrap/hero-unit.less";
// Utility classes
@import "bootstrap/utilities.less"; // Has to be last to override when necessary
@import "bootstrap/responsive.less";PK g}!]��'�� � bootstrap.minimal.j32.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes the minimal Bootstrap markup only for Joomla! 3.2 templates which include Bootstrap CSS styling
*/
// Core variables and mixins
@import "bootstrap/variables.less"; // Modify this for custom colors, font-sizes, etc
@import "bootstrap/mixins.less";
// Components: common
@import "bootstrap/sprites.j32.less";PK g}!]P>.�� � bootstrap.full.j32.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes the full Bootstrap markup for Joomla! 3.2 templates which do not include Bootstrap CSS styling (default)
*/
/*
* Bootstrap (minimal, for Protostar and other templates with included Bootstrap CSS styling)
*/
// Core variables and mixins
@import "bootstrap/variables.less"; // Modify this for custom colors, font-sizes, etc
@import "bootstrap/mixins.less";
// CSS Reset
@import "bootstrap/reset.less";
// Grid system and page structure
@import "bootstrap/scaffolding.less";
@import "bootstrap/grid.less";
@import "bootstrap/layouts.less";
// Base CSS
@import "bootstrap/type.less";
@import "bootstrap/code.less";
@import "bootstrap/forms.less";
@import "bootstrap/tables.less";
// Components: common
@import "bootstrap/sprites.j32.less";
@import "bootstrap/dropdowns.less";
@import "bootstrap/wells.less";
@import "bootstrap/component-animations.less";
@import "bootstrap/close.less";
// Components: Buttons & Alerts
@import "bootstrap/buttons.less";
@import "bootstrap/button-groups.less";
@import "bootstrap/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
// Components: Nav
@import "bootstrap/navs.less";
@import "bootstrap/navbar.less";
@import "bootstrap/breadcrumbs.less";
@import "bootstrap/pagination.less";
@import "bootstrap/pager.less";
// Components: Popovers
// @import "bootstrap/modals.less";
@import "bootstrap/tooltip.less";
@import "bootstrap/popovers.less";
// Components: Misc
@import "bootstrap/thumbnails.less";
@import "bootstrap/media.less";
@import "bootstrap/labels-badges.less";
@import "bootstrap/progress-bars.less";
@import "bootstrap/accordion.less";
@import "bootstrap/carousel.less";
@import "bootstrap/hero-unit.less";
// Utility classes
@import "bootstrap/utilities.less"; // Has to be last to override when necessary
@import "bootstrap/responsive.less";PK g}!]@�H�B B bootstrap.j25.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes the default Bootstrap classes (minus the modal dialog)
* and our Joomla! 2.5-specific style overrides
*/
/*
* Bootstrap (namespaced)
*/
div.akeeba-bootstrap
{
@import "bootstrap.full.less";
}
// Popovers must not be namespaced
@import "bootstrap/variables";
@import "bootstrap/mixins";
@import "bootstrap/popovers";
/*
* Akeeba Strapper overrides
*/
@import "strapper.less";
@import "strapper.j25.less";PK g}!]��� � bootstrap.minimal.j3.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes the minimal Bootstrap markup only for Joomla! 3.0/3.1 templates which include Bootstrap CSS styling
*/
// Core variables and mixins
@import "bootstrap/variables.less"; // Modify this for custom colors, font-sizes, etc
@import "bootstrap/mixins.less";
// Components: common
@import "bootstrap/sprites.j3.less";PK g}!]���� � bootstrap.minimal.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes the minimal Bootstrap markup only for Joomla! 2.5 templates which include Bootstrap CSS styling
*/
// Core variables and mixins
@import "bootstrap/variables.less"; // Modify this for custom colors, font-sizes, etc
@import "bootstrap/mixins.less";
// Components: common
@import "bootstrap/sprites.less";PK g}!]6+��� � bootstrap.full.j3.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes the full Bootstrap markup for Joomla! 3.0/3.1 templates which do not include Bootstrap CSS styling (default)
*/
/*
* Bootstrap (minimal, for Protostar and other templates with included Bootstrap CSS styling)
*/
// Core variables and mixins
@import "bootstrap/variables.less"; // Modify this for custom colors, font-sizes, etc
@import "bootstrap/mixins.less";
// CSS Reset
@import "bootstrap/reset.less";
// Grid system and page structure
@import "bootstrap/scaffolding.less";
@import "bootstrap/grid.less";
@import "bootstrap/layouts.less";
// Base CSS
@import "bootstrap/type.less";
@import "bootstrap/code.less";
@import "bootstrap/forms.less";
@import "bootstrap/tables.less";
// Components: common
@import "bootstrap/sprites.j3.less";
@import "bootstrap/dropdowns.less";
@import "bootstrap/wells.less";
@import "bootstrap/component-animations.less";
@import "bootstrap/close.less";
// Components: Buttons & Alerts
@import "bootstrap/buttons.less";
@import "bootstrap/button-groups.less";
@import "bootstrap/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
// Components: Nav
@import "bootstrap/navs.less";
@import "bootstrap/navbar.less";
@import "bootstrap/breadcrumbs.less";
@import "bootstrap/pagination.less";
@import "bootstrap/pager.less";
// Components: Popovers
// @import "bootstrap/modals.less";
@import "bootstrap/tooltip.less";
@import "bootstrap/popovers.less";
// Components: Misc
@import "bootstrap/thumbnails.less";
@import "bootstrap/media.less";
@import "bootstrap/labels-badges.less";
@import "bootstrap/progress-bars.less";
@import "bootstrap/accordion.less";
@import "bootstrap/carousel.less";
@import "bootstrap/hero-unit.less";
// Utility classes
@import "bootstrap/utilities.less"; // Has to be last to override when necessary
@import "bootstrap/responsive.less";PK g}!]H�qN N bootstrap.j3.lessnu &1i� /**
* Akeeba Strapper
* A handy distribution of namespaced jQuery, jQuery UI and Twitter
* Bootstrapper for use with Akeeba components.
*
* This file includes only Joomla! 3.0/3.1-specific style overrides
*/
/*
* Bootstrap (namespaced)
*/
div.akeeba-bootstrap
{
/**
* If your template already includes Bootstrap CSS styling please comment
* out this line and uncomment the include below.
*/
// @import "bootstrap.full.j3.less";
/**
* If your template already includes Bootstrap CSS styling please uncomment
* out this line and comment out the include above.
*/
@import "bootstrap.minimal.j3.less";
}
// Popovers must not be namespaced
@import "bootstrap/variables";
@import "bootstrap/mixins";
@import "bootstrap/popovers";
/*
* Akeeba Strapper overrides
*/
@import "strapper.less";
@import "strapper.j3.less";PK ��!]`l�&K K cache.phpnu &1i� <?php
require_once( dirname(__FILE__).'/version.php');
/**
* Utility for handling the generation and caching of css files
*
* @package Less
* @subpackage cache
*
*/
class Less_Cache{
public static $cache_dir = false; // directory less.php can use for storing data
/**
* Save and reuse the results of compiled less files.
* The first call to Get() will generate css and save it.
* Subsequent calls to Get() with the same arguments will return the same css filename
*
* @param array $less_files Array of .less files to compile
* @param array $parser_options Array of compiler options
* @param boolean $use_cache Set to false to regenerate the css file
* @return string Name of the css file
*/
public static function Get( $less_files, $parser_options = array(), $use_cache = true ){
//check $cache_dir
if( isset($parser_options['cache_dir']) ){
Less_Cache::$cache_dir = $parser_options['cache_dir'];
}
if( empty(Less_Cache::$cache_dir) ){
throw new Exception('cache_dir not set');
}
self::CheckCacheDir();
// generate name for compiled css file
$less_files = (array)$less_files;
$hash = md5(json_encode($less_files));
$list_file = Less_Cache::$cache_dir.'lessphp_'.$hash.'.list';
if( $use_cache === true ){
// check cached content
if( file_exists($list_file) ){
$list = explode("\n",file_get_contents($list_file));
$compiled_name = self::CompiledName($list);
$compiled_file = Less_Cache::$cache_dir.$compiled_name;
if( file_exists($compiled_file) ){
@touch($list_file);
@touch($compiled_file);
return $compiled_name;
}
}
}
$compiled = self::Cache( $less_files, $parser_options );
if( !$compiled ){
return false;
}
//save the file list
$cache = implode("\n",$less_files);
file_put_contents( $list_file, $cache );
//save the css
$compiled_name = self::CompiledName( $less_files );
file_put_contents( Less_Cache::$cache_dir.$compiled_name, $compiled );
//clean up
self::CleanCache();
return $compiled_name;
}
/**
* Force the compiler to regenerate the cached css file
*
* @param array $less_files Array of .less files to compile
* @param array $parser_options Array of compiler options
* @return string Name of the css file
*/
public static function Regen( $less_files, $parser_options = array() ){
return self::Get( $less_files, $parser_options, false );
}
public static function Cache( &$less_files, $parser_options = array() ){
// get less.php if it exists
$file = dirname(__FILE__) . '/Less.php';
if( file_exists($file) && !class_exists('Less_Parser') ){
require_once($file);
}
$parser_options['cache_dir'] = Less_Cache::$cache_dir;
$parser = new Less_Parser($parser_options);
// combine files
foreach($less_files as $file_path => $uri_or_less ){
//treat as less markup if there are newline characters
if( strpos($uri_or_less,"\n") !== false ){
$parser->Parse( $uri_or_less );
continue;
}
$parser->ParseFile( $file_path, $uri_or_less );
}
$compiled = $parser->getCss();
$less_files = $parser->allParsedFiles();
return $compiled;
}
private static function CompiledName( $files ){
//save the file list
$temp = array(Less_Version::cache_version);
foreach($files as $file){
$temp[] = filemtime($file)."\t".filesize($file)."\t".$file;
}
return 'lessphp_'.sha1(json_encode($temp)).'.css';
}
public static function SetCacheDir( $dir ){
Less_Cache::$cache_dir = $dir;
}
public static function CheckCacheDir(){
Less_Cache::$cache_dir = str_replace('\\','/',Less_Cache::$cache_dir);
Less_Cache::$cache_dir = rtrim(Less_Cache::$cache_dir,'/').'/';
if( !file_exists(Less_Cache::$cache_dir) ){
if( !mkdir(Less_Cache::$cache_dir) ){
throw new Less_Exception_Parser('Less.php cache directory couldn\'t be created: '.Less_Cache::$cache_dir);
}
}elseif( !is_dir(Less_Cache::$cache_dir) ){
throw new Less_Exception_Parser('Less.php cache directory doesn\'t exist: '.Less_Cache::$cache_dir);
}elseif( !is_writable(Less_Cache::$cache_dir) ){
throw new Less_Exception_Parser('Less.php cache directory isn\'t writable: '.Less_Cache::$cache_dir);
}
}
public static function CleanCache(){
static $clean = false;
if( $clean ){
return;
}
$files = scandir(Less_Cache::$cache_dir);
if( $files ){
$check_time = time() - 604800;
foreach($files as $file){
if( strpos($file,'lessphp_') !== 0 ){
continue;
}
$full_path = Less_Cache::$cache_dir.'/'.$file;
if( filemtime($full_path) > $check_time ){
continue;
}
unlink($full_path);
}
}
$clean = true;
}
}PK ��!]I�
+H H version.phpnu &1i� <?php
/**
* Release numbers
*
* @package Less
* @subpackage version
*/
class Less_Version{
const version = '1.7.0.1'; // The current build number of less.php
const less_version = '1.7'; // The less.js version that this build should be compatible with
const cache_version = '170'; // The parser cache version
}PK ��!]o�<�� �� less.phpnu &1i� <?php
require_once( dirname(__FILE__).'/cache.php');
/**
* Class for parsing and compiling less files into css
*
* @package Less
* @subpackage parser
*
*/
class Less_Parser{
/**
* Default parser options
*/
public static $default_options = array(
'compress' => false, // option - whether to compress
'strictUnits' => false, // whether units need to evaluate correctly
'strictMath' => false, // whether math has to be within parenthesis
'relativeUrls' => true, // option - whether to adjust URL's to be relative
'urlArgs' => array(), // whether to add args into url tokens
'numPrecision' => 8,
'import_dirs' => array(),
'import_callback' => null,
'cache_dir' => null,
'cache_method' => 'php', //false, 'serialize', 'php', 'var_export';
'sourceMap' => false, // whether to output a source map
'sourceMapBasepath' => null,
'sourceMapWriteTo' => null,
'sourceMapURL' => null,
'plugins' => array(),
);
public static $options = array();
private $input; // Less input string
private $input_len; // input string length
private $pos; // current index in `input`
private $saveStack = array(); // holds state for backtracking
private $furthest;
/**
* @var Less_Environment
*/
private $env;
private $rules = array();
private static $imports = array();
public static $has_extends = false;
public static $next_id = 0;
/**
* Filename to contents of all parsed the files
*
* @var array
*/
public static $contentsMap = array();
public $parensInOp;
/**
* @param Less_Environment|array|null $env
*/
public function __construct( $env = null ){
// Top parser on an import tree must be sure there is one "env"
// which will then be passed around by reference.
if( $env instanceof Less_Environment ){
$this->env = $env;
}else{
$this->SetOptions(Less_Parser::$default_options);
$this->Reset( $env );
}
}
/**
* Reset the parser state completely
*
*/
public function Reset( $options = null ){
$this->rules = array();
self::$imports = array();
self::$has_extends = false;
self::$imports = array();
self::$contentsMap = array();
$this->env = new Less_Environment($options);
$this->env->Init();
//set new options
if( is_array($options) ){
$this->SetOptions(Less_Parser::$default_options);
$this->SetOptions($options);
}
}
/**
* Set one or more compiler options
* options: import_dirs, cache_dir, cache_method
*
*/
public function SetOptions( $options ){
foreach($options as $option => $value){
$this->SetOption($option,$value);
}
}
/**
* Set one compiler option
*
*/
public function SetOption($option,$value){
switch($option){
case 'import_dirs':
$this->SetImportDirs($value);
return;
case 'cache_dir':
if( is_string($value) ){
Less_Cache::SetCacheDir($value);
Less_Cache::CheckCacheDir();
}
return;
}
Less_Parser::$options[$option] = $value;
}
/**
* Get the current css buffer
*
* @return string
*/
public function getCss(){
$precision = ini_get('precision');
@ini_set('precision',16);
$locale = setlocale(LC_NUMERIC, 0);
setlocale(LC_NUMERIC, "C");
$root = new Less_Tree_Ruleset(array(), $this->rules );
$root->root = true;
$root->firstRoot = true;
$this->PreVisitors($root);
self::$has_extends = false;
$evaldRoot = $root->compile($this->env);
$this->PostVisitors($evaldRoot);
if( Less_Parser::$options['sourceMap'] ){
$generator = new Less_SourceMap_Generator($evaldRoot, Less_Parser::$contentsMap, Less_Parser::$options );
// will also save file
// FIXME: should happen somewhere else?
$css = $generator->generateCSS();
}else{
$css = $evaldRoot->toCSS();
}
if( Less_Parser::$options['compress'] ){
$css = preg_replace('/(^(\s)+)|((\s)+$)/', '', $css);
}
//reset php settings
@ini_set('precision',$precision);
setlocale(LC_NUMERIC, $locale);
return $css;
}
/**
* Run pre-compile visitors
*
*/
private function PreVisitors($root){
if( Less_Parser::$options['plugins'] ){
foreach(Less_Parser::$options['plugins'] as $plugin){
if( !empty($plugin->isPreEvalVisitor) ){
$plugin->run($root);
}
}
}
}
/**
* Run post-compile visitors
*
*/
private function PostVisitors($evaldRoot){
$visitors = array();
$visitors[] = new Less_Visitor_joinSelector();
if( self::$has_extends ){
$visitors[] = new Less_Visitor_processExtends();
}
$visitors[] = new Less_Visitor_toCSS();
if( Less_Parser::$options['plugins'] ){
foreach(Less_Parser::$options['plugins'] as $plugin){
if( property_exists($plugin,'isPreEvalVisitor') && $plugin->isPreEvalVisitor ){
continue;
}
if( property_exists($plugin,'isPreVisitor') && $plugin->isPreVisitor ){
array_unshift( $visitors, $plugin);
}else{
$visitors[] = $plugin;
}
}
}
for($i = 0; $i < count($visitors); $i++ ){
$visitors[$i]->run($evaldRoot);
}
}
/**
* Parse a Less string into css
*
* @param string $str The string to convert
* @param string $uri_root The url of the file
* @return Less_Tree_Ruleset|Less_Parser
*/
public function parse( $str, $file_uri = null ){
if( !$file_uri ){
$uri_root = '';
$filename = 'anonymous-file-'.Less_Parser::$next_id++.'.less';
}else{
$file_uri = self::WinPath($file_uri);
$filename = basename($file_uri);
$uri_root = dirname($file_uri);
}
$previousFileInfo = $this->env->currentFileInfo;
$uri_root = self::WinPath($uri_root);
$this->SetFileInfo($filename, $uri_root);
$this->input = $str;
$this->_parse();
if( $previousFileInfo ){
$this->env->currentFileInfo = $previousFileInfo;
}
return $this;
}
/**
* Parse a Less string from a given file
*
* @throws Less_Exception_Parser
* @param string $filename The file to parse
* @param string $uri_root The url of the file
* @param bool $returnRoot Indicates whether the return value should be a css string a root node
* @return Less_Tree_Ruleset|Less_Parser
*/
public function parseFile( $filename, $uri_root = '', $returnRoot = false){
if( !file_exists($filename) ){
$this->Error(sprintf('File `%s` not found.', $filename));
}
// fix uri_root?
// Instead of The mixture of file path for the first argument and directory path for the second argument has bee
if( !$returnRoot && !empty($uri_root) && basename($uri_root) == basename($filename) ){
$uri_root = dirname($uri_root);
}
$previousFileInfo = $this->env->currentFileInfo;
$filename = self::WinPath($filename);
$uri_root = self::WinPath($uri_root);
$this->SetFileInfo($filename, $uri_root);
self::AddParsedFile($filename);
if( $returnRoot ){
$rules = $this->GetRules( $filename );
$return = new Less_Tree_Ruleset(array(), $rules );
}else{
$this->_parse( $filename );
$return = $this;
}
if( $previousFileInfo ){
$this->env->currentFileInfo = $previousFileInfo;
}
return $return;
}
/**
* Allows a user to set variables values
* @param array $vars
* @return Less_Parser
*/
public function ModifyVars( $vars ){
$this->input = $this->serializeVars( $vars );
$this->_parse();
return $this;
}
/**
* @param string $filename
*/
public function SetFileInfo( $filename, $uri_root = ''){
$filename = Less_Environment::normalizePath($filename);
$dirname = preg_replace('/[^\/\\\\]*$/','',$filename);
if( !empty($uri_root) ){
$uri_root = rtrim($uri_root,'/').'/';
}
$currentFileInfo = array();
//entry info
if( isset($this->env->currentFileInfo) ){
$currentFileInfo['entryPath'] = $this->env->currentFileInfo['entryPath'];
$currentFileInfo['entryUri'] = $this->env->currentFileInfo['entryUri'];
$currentFileInfo['rootpath'] = $this->env->currentFileInfo['rootpath'];
}else{
$currentFileInfo['entryPath'] = $dirname;
$currentFileInfo['entryUri'] = $uri_root;
$currentFileInfo['rootpath'] = $dirname;
}
$currentFileInfo['currentDirectory'] = $dirname;
$currentFileInfo['currentUri'] = $uri_root.basename($filename);
$currentFileInfo['filename'] = $filename;
$currentFileInfo['uri_root'] = $uri_root;
//inherit reference
if( isset($this->env->currentFileInfo['reference']) && $this->env->currentFileInfo['reference'] ){
$currentFileInfo['reference'] = true;
}
$this->env->currentFileInfo = $currentFileInfo;
}
/**
* @deprecated 1.5.1.2
*
*/
public function SetCacheDir( $dir ){
if( !file_exists($dir) ){
if( mkdir($dir) ){
return true;
}
throw new Less_Exception_Parser('Less.php cache directory couldn\'t be created: '.$dir);
}elseif( !is_dir($dir) ){
throw new Less_Exception_Parser('Less.php cache directory doesn\'t exist: '.$dir);
}elseif( !is_writable($dir) ){
throw new Less_Exception_Parser('Less.php cache directory isn\'t writable: '.$dir);
}else{
$dir = self::WinPath($dir);
Less_Cache::$cache_dir = rtrim($dir,'/').'/';
return true;
}
}
/**
* Set a list of directories or callbacks the parser should use for determining import paths
*
* @param array $dirs
*/
public function SetImportDirs( $dirs ){
Less_Parser::$options['import_dirs'] = array();
foreach($dirs as $path => $uri_root){
$path = self::WinPath($path);
if( !empty($path) ){
$path = rtrim($path,'/').'/';
}
if ( !is_callable($uri_root) ){
$uri_root = self::WinPath($uri_root);
if( !empty($uri_root) ){
$uri_root = rtrim($uri_root,'/').'/';
}
}
Less_Parser::$options['import_dirs'][$path] = $uri_root;
}
}
/**
* @param string $file_path
*/
private function _parse( $file_path = null ){
$this->rules = array_merge($this->rules, $this->GetRules( $file_path ));
}
/**
* Return the results of parsePrimary for $file_path
* Use cache and save cached results if possible
*
* @param string|null $file_path
*/
private function GetRules( $file_path ){
$this->SetInput($file_path);
$cache_file = $this->CacheFile( $file_path );
if( $cache_file && file_exists($cache_file) ){
switch(Less_Parser::$options['cache_method']){
// Using serialize
// Faster but uses more memory
case 'serialize':
$cache = unserialize(file_get_contents($cache_file));
if( $cache ){
touch($cache_file);
$this->UnsetInput();
return $cache;
}
break;
// Using generated php code
case 'var_export':
case 'php':
$this->UnsetInput();
return include($cache_file);
}
}
$rules = $this->parsePrimary();
if( $this->pos < $this->input_len ){
throw new Less_Exception_Chunk($this->input, null, $this->furthest, $this->env->currentFileInfo);
}
$this->UnsetInput();
//save the cache
if( $cache_file ){
//msg('write cache file');
switch(Less_Parser::$options['cache_method']){
case 'serialize':
file_put_contents( $cache_file, serialize($rules) );
break;
case 'php':
file_put_contents( $cache_file, '<?php return '.self::ArgString($rules).'; ?>' );
break;
case 'var_export':
//Requires __set_state()
file_put_contents( $cache_file, '<?php return '.var_export($rules,true).'; ?>' );
break;
}
Less_Cache::CleanCache();
}
return $rules;
}
/**
* Set up the input buffer
*
*/
public function SetInput( $file_path ){
if( $file_path ){
$this->input = file_get_contents( $file_path );
}
$this->pos = $this->furthest = 0;
// Remove potential UTF Byte Order Mark
$this->input = preg_replace('/\\G\xEF\xBB\xBF/', '', $this->input);
$this->input_len = strlen($this->input);
if( Less_Parser::$options['sourceMap'] && $this->env->currentFileInfo ){
$uri = $this->env->currentFileInfo['currentUri'];
Less_Parser::$contentsMap[$uri] = $this->input;
}
}
/**
* Free up some memory
*
*/
public function UnsetInput(){
unset($this->input, $this->pos, $this->input_len, $this->furthest);
$this->saveStack = array();
}
public function CacheFile( $file_path ){
if( $file_path && Less_Parser::$options['cache_method'] && Less_Cache::$cache_dir ){
$env = get_object_vars($this->env);
unset($env['frames']);
$parts = array();
$parts[] = $file_path;
$parts[] = filesize( $file_path );
$parts[] = filemtime( $file_path );
$parts[] = $env;
$parts[] = Less_Version::cache_version;
$parts[] = Less_Parser::$options['cache_method'];
return Less_Cache::$cache_dir.'lessphp_'.base_convert( sha1(json_encode($parts) ), 16, 36).'.lesscache';
}
}
static function AddParsedFile($file){
self::$imports[] = $file;
}
static function AllParsedFiles(){
return self::$imports;
}
/**
* @param string $file
*/
static function FileParsed($file){
return in_array($file,self::$imports);
}
function save() {
$this->saveStack[] = $this->pos;
}
private function restore() {
$this->pos = array_pop($this->saveStack);
}
private function forget(){
array_pop($this->saveStack);
}
private function isWhitespace($offset = 0) {
return preg_match('/\s/',$this->input[ $this->pos + $offset]);
}
/**
* Parse from a token, regexp or string, and move forward if match
*
* @param array $toks
* @return array
*/
private function match($toks){
// The match is confirmed, add the match length to `this::pos`,
// and consume any extra white-space characters (' ' || '\n')
// which come after that. The reason for this is that LeSS's
// grammar is mostly white-space insensitive.
//
foreach($toks as $tok){
$char = $tok[0];
if( $char === '/' ){
$match = $this->MatchReg($tok);
if( $match ){
return count($match) === 1 ? $match[0] : $match;
}
}elseif( $char === '#' ){
$match = $this->MatchChar($tok[1]);
}else{
// Non-terminal, match using a function call
$match = $this->$tok();
}
if( $match ){
return $match;
}
}
}
/**
* @param string[] $toks
*
* @return string
*/
private function MatchFuncs($toks){
foreach($toks as $tok){
$match = $this->$tok();
if( $match ){
return $match;
}
}
}
// Match a single character in the input,
private function MatchChar($tok){
if( ($this->pos < $this->input_len) && ($this->input[$this->pos] === $tok) ){
$this->skipWhitespace(1);
return $tok;
}
}
// Match a regexp from the current start point
private function MatchReg($tok){
if( preg_match($tok, $this->input, $match, 0, $this->pos) ){
$this->skipWhitespace(strlen($match[0]));
return $match;
}
return [];
}
/**
* Same as match(), but don't change the state of the parser,
* just return the match.
*
* @param string $tok
* @return integer
*/
public function PeekReg($tok){
return preg_match($tok, $this->input, $match, 0, $this->pos);
}
/**
* @param string $tok
*/
public function PeekChar($tok){
//return ($this->input[$this->pos] === $tok );
return ($this->pos < $this->input_len) && ($this->input[$this->pos] === $tok );
}
/**
* @param integer $length
*/
public function skipWhitespace($length){
$this->pos += $length;
for(; $this->pos < $this->input_len; $this->pos++ ){
$c = $this->input[$this->pos];
if( ($c !== "\n") && ($c !== "\r") && ($c !== "\t") && ($c !== ' ') ){
break;
}
}
}
/**
* @param string $tok
* @param string|null $msg
*/
public function expect($tok, $msg = NULL) {
$result = $this->match( array($tok) );
if (!$result) {
$this->Error( $msg ? "Expected '" . $tok . "' got '" . $this->input[$this->pos] . "'" : $msg );
} else {
return $result;
}
}
/**
* @param string $tok
*/
public function expectChar($tok, $msg = null ){
$result = $this->MatchChar($tok);
if( !$result ){
$this->Error( $msg ? "Expected '" . $tok . "' got '" . $this->input[$this->pos] . "'" : $msg );
}else{
return $result;
}
}
//
// Here in, the parsing rules/functions
//
// The basic structure of the syntax tree generated is as follows:
//
// Ruleset -> Rule -> Value -> Expression -> Entity
//
// Here's some LESS code:
//
// .class {
// color: #fff;
// border: 1px solid #000;
// width: @w + 4px;
// > .child {...}
// }
//
// And here's what the parse tree might look like:
//
// Ruleset (Selector '.class', [
// Rule ("color", Value ([Expression [Color #fff]]))
// Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]]))
// Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]]))
// Ruleset (Selector [Element '>', '.child'], [...])
// ])
//
// In general, most rules will try to parse a token with the `$()` function, and if the return
// value is truly, will return a new node, of the relevant type. Sometimes, we need to check
// first, before parsing, that's when we use `peek()`.
//
//
// The `primary` rule is the *entry* and *exit* point of the parser.
// The rules here can appear at any level of the parse tree.
//
// The recursive nature of the grammar is an interplay between the `block`
// rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,
// as represented by this simplified grammar:
//
// primary → (ruleset | rule)+
// ruleset → selector+ block
// block → '{' primary '}'
//
// Only at one point is the primary rule not called from the
// block rule: at the root level.
//
private function parsePrimary(){
$root = array();
while( true ){
if( $this->pos >= $this->input_len ){
break;
}
$node = $this->parseExtend(true);
if( $node ){
$root = array_merge($root,$node);
continue;
}
//$node = $this->MatchFuncs( array( 'parseMixinDefinition', 'parseRule', 'parseRuleset', 'parseMixinCall', 'parseComment', 'parseDirective'));
$node = $this->MatchFuncs( array( 'parseMixinDefinition', 'parseNameValue', 'parseRule', 'parseRuleset', 'parseMixinCall', 'parseComment', 'parseRulesetCall', 'parseDirective'));
if( $node ){
$root[] = $node;
}elseif( !$this->MatchReg('/\\G[\s\n;]+/') ){
break;
}
if( $this->PeekChar('}') ){
break;
}
}
return $root;
}
// We create a Comment node for CSS comments `/* */`,
// but keep the LeSS comments `//` silent, by just skipping
// over them.
private function parseComment(){
if( $this->input[$this->pos] !== '/' ){
return;
}
if( $this->input[$this->pos+1] === '/' ){
$match = $this->MatchReg('/\\G\/\/.*/');
return $this->NewObj4('Less_Tree_Comment',array($match[0], true, $this->pos, $this->env->currentFileInfo));
}
//$comment = $this->MatchReg('/\\G\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/');
$comment = $this->MatchReg('/\\G\/\*(?s).*?\*+\/\n?/');//not the same as less.js to prevent fatal errors
if( $comment ){
return $this->NewObj4('Less_Tree_Comment',array($comment[0], false, $this->pos, $this->env->currentFileInfo));
}
}
private function parseComments(){
$comments = array();
while( $this->pos < $this->input_len ){
$comment = $this->parseComment();
if( !$comment ){
break;
}
$comments[] = $comment;
}
return $comments;
}
//
// A string, which supports escaping " and '
//
// "milky way" 'he\'s the one!'
//
private function parseEntitiesQuoted() {
$j = $this->pos;
$e = false;
$index = $this->pos;
if( $this->input[$this->pos] === '~' ){
$j++;
$e = true; // Escaped strings
}
if( $this->input[$j] != '"' && $this->input[$j] !== "'" ){
return;
}
if ($e) {
$this->MatchChar('~');
}
$str = $this->MatchReg('/\\G"((?:[^"\\\\\r\n]|\\\\.)*)"|\'((?:[^\'\\\\\r\n]|\\\\.)*)\'/');
if( $str ){
$result = $str[0][0] == '"' ? $str[1] : $str[2];
return $this->NewObj5('Less_Tree_Quoted',array($str[0], $result, $e, $index, $this->env->currentFileInfo) );
}
return;
}
//
// A catch-all word, such as:
//
// black border-collapse
//
private function parseEntitiesKeyword(){
//$k = $this->MatchReg('/\\G[_A-Za-z-][_A-Za-z0-9-]*/');
$k = $this->MatchReg('/\\G%|\\G[_A-Za-z-][_A-Za-z0-9-]*/');
if( $k ){
$k = $k[0];
$color = $this->fromKeyword($k);
if( $color ){
return $color;
}
return $this->NewObj1('Less_Tree_Keyword',$k);
}
}
// duplicate of Less_Tree_Color::FromKeyword
private function FromKeyword( $keyword ){
$keyword = strtolower($keyword);
if( Less_Colors::hasOwnProperty($keyword) ){
// detect named color
return $this->NewObj1('Less_Tree_Color',substr(Less_Colors::color($keyword), 1));
}
if( $keyword === 'transparent' ){
return $this->NewObj3('Less_Tree_Color', array( array(0, 0, 0), 0, true));
}
}
//
// A function call
//
// rgb(255, 0, 255)
//
// We also try to catch IE's `alpha()`, but let the `alpha` parser
// deal with the details.
//
// The arguments are parsed with the `entities.arguments` parser.
//
private function parseEntitiesCall(){
$index = $this->pos;
if( !preg_match('/\\G([\w-]+|%|progid:[\w\.]+)\(/', $this->input, $name,0,$this->pos) ){
return;
}
$name = $name[1];
$nameLC = strtolower($name);
if ($nameLC === 'url') {
return null;
}
$this->pos += strlen($name);
if( $nameLC === 'alpha' ){
$alpha_ret = $this->parseAlpha();
if( $alpha_ret ){
return $alpha_ret;
}
}
$this->MatchChar('('); // Parse the '(' and consume whitespace.
$args = $this->parseEntitiesArguments();
if( !$this->MatchChar(')') ){
return;
}
if ($name) {
return $this->NewObj4('Less_Tree_Call',array($name, $args, $index, $this->env->currentFileInfo) );
}
}
/**
* Parse a list of arguments
*
* @return array
*/
private function parseEntitiesArguments(){
$args = array();
while( true ){
$arg = $this->MatchFuncs( array('parseEntitiesAssignment','parseExpression') );
if( !$arg ){
break;
}
$args[] = $arg;
if( !$this->MatchChar(',') ){
break;
}
}
return $args;
}
private function parseEntitiesLiteral(){
return $this->MatchFuncs( array('parseEntitiesDimension','parseEntitiesColor','parseEntitiesQuoted','parseUnicodeDescriptor') );
}
// Assignments are argument entities for calls.
// They are present in ie filter properties as shown below.
//
// filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )
//
private function parseEntitiesAssignment() {
$key = $this->MatchReg('/\\G\w+(?=\s?=)/');
if( !$key ){
return;
}
if( !$this->MatchChar('=') ){
return;
}
$value = $this->parseEntity();
if( $value ){
return $this->NewObj2('Less_Tree_Assignment',array($key[0], $value));
}
}
//
// Parse url() tokens
//
// We use a specific rule for urls, because they don't really behave like
// standard function calls. The difference is that the argument doesn't have
// to be enclosed within a string, so it can't be parsed as an Expression.
//
private function parseEntitiesUrl(){
if( $this->input[$this->pos] !== 'u' || !$this->matchReg('/\\Gurl\(/') ){
return;
}
$value = $this->match( array('parseEntitiesQuoted','parseEntitiesVariable','/\\Gdata\:.*?[^\)]+/','/\\G(?:(?:\\\\[\(\)\'"])|[^\(\)\'"])+/') );
if( !$value ){
$value = '';
}
$this->expectChar(')');
if( isset($value->value) || $value instanceof Less_Tree_Variable ){
return $this->NewObj2('Less_Tree_Url',array($value, $this->env->currentFileInfo));
}
return $this->NewObj2('Less_Tree_Url', array( $this->NewObj1('Less_Tree_Anonymous',$value), $this->env->currentFileInfo) );
}
//
// A Variable entity, such as `@fink`, in
//
// width: @fink + 2px
//
// We use a different parser for variable definitions,
// see `parsers.variable`.
//
private function parseEntitiesVariable(){
$index = $this->pos;
if ($this->PeekChar('@') && ($name = $this->MatchReg('/\\G@@?[\w-]+/'))) {
return $this->NewObj3('Less_Tree_Variable', array( $name[0], $index, $this->env->currentFileInfo));
}
}
// A variable entity useing the protective {} e.g. @{var}
private function parseEntitiesVariableCurly() {
$index = $this->pos;
if( $this->input_len > ($this->pos+1) && $this->input[$this->pos] === '@' && ($curly = $this->MatchReg('/\\G@\{([\w-]+)\}/')) ){
return $this->NewObj3('Less_Tree_Variable',array('@'.$curly[1], $index, $this->env->currentFileInfo));
}
}
//
// A Hexadecimal color
//
// #4F3C2F
//
// `rgb` and `hsl` colors are parsed through the `entities.call` parser.
//
private function parseEntitiesColor(){
if ($this->PeekChar('#') && ($rgb = $this->MatchReg('/\\G#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/'))) {
return $this->NewObj1('Less_Tree_Color',$rgb[1]);
}
}
//
// A Dimension, that is, a number and a unit
//
// 0.5em 95%
//
private function parseEntitiesDimension(){
$c = @ord($this->input[$this->pos]);
//Is the first char of the dimension 0-9, '.', '+' or '-'
if (($c > 57 || $c < 43) || $c === 47 || $c == 44){
return;
}
$value = $this->MatchReg('/\\G([+-]?\d*\.?\d+)(%|[a-z]+)?/');
if( $value ){
if( isset($value[2]) ){
return $this->NewObj2('Less_Tree_Dimension', array($value[1],$value[2]));
}
return $this->NewObj1('Less_Tree_Dimension',$value[1]);
}
}
//
// A unicode descriptor, as is used in unicode-range
//
// U+0?? or U+00A1-00A9
//
function parseUnicodeDescriptor() {
$ud = $this->MatchReg('/\\G(U\+[0-9a-fA-F?]+)(\-[0-9a-fA-F?]+)?/');
if( $ud ){
return $this->NewObj1('Less_Tree_UnicodeDescriptor', $ud[0]);
}
}
//
// JavaScript code to be evaluated
//
// `window.location.href`
//
private function parseEntitiesJavascript(){
$e = false;
$j = $this->pos;
if( $this->input[$j] === '~' ){
$j++;
$e = true;
}
if( $this->input[$j] !== '`' ){
return;
}
if( $e ){
$this->MatchChar('~');
}
$str = $this->MatchReg('/\\G`([^`]*)`/');
if( $str ){
return $this->NewObj3('Less_Tree_Javascript', array($str[1], $this->pos, $e));
}
}
//
// The variable part of a variable definition. Used in the `rule` parser
//
// @fink:
//
private function parseVariable(){
if ($this->PeekChar('@') && ($name = $this->MatchReg('/\\G(@[\w-]+)\s*:/'))) {
return $name[1];
}
}
//
// The variable part of a variable definition. Used in the `rule` parser
//
// @fink();
//
private function parseRulesetCall(){
if( $this->input[$this->pos] === '@' && ($name = $this->MatchReg('/\\G(@[\w-]+)\s*\(\s*\)\s*;/')) ){
return $this->NewObj1('Less_Tree_RulesetCall', $name[1] );
}
}
//
// extend syntax - used to extend selectors
//
function parseExtend($isRule = false){
$index = $this->pos;
$extendList = array();
if( !$this->MatchReg( $isRule ? '/\\G&:extend\(/' : '/\\G:extend\(/' ) ){ return; }
do{
$option = null;
$elements = array();
while( true ){
$option = $this->MatchReg('/\\G(all)(?=\s*(\)|,))/');
if( $option ){ break; }
$e = $this->parseElement();
if( !$e ){ break; }
$elements[] = $e;
}
if( $option ){
$option = $option[1];
}
$extendList[] = $this->NewObj3('Less_Tree_Extend', array( $this->NewObj1('Less_Tree_Selector',$elements), $option, $index ));
}while( $this->MatchChar(",") );
$this->expect('/\\G\)/');
if( $isRule ){
$this->expect('/\\G;/');
}
return $extendList;
}
//
// A Mixin call, with an optional argument list
//
// #mixins > .square(#fff);
// .rounded(4px, black);
// .button;
//
// The `while` loop is there because mixins can be
// namespaced, but we only support the child and descendant
// selector for now.
//
private function parseMixinCall(){
$char = $this->input[$this->pos];
if( $char !== '.' && $char !== '#' ){
return;
}
$index = $this->pos;
$this->save(); // stop us absorbing part of an invalid selector
$elements = $this->parseMixinCallElements();
if( $elements ){
if( $this->MatchChar('(') ){
$returned = $this->parseMixinArgs(true);
$args = $returned['args'];
$this->expectChar(')');
}else{
$args = array();
}
$important = $this->parseImportant();
if( $this->parseEnd() ){
$this->forget();
return $this->NewObj5('Less_Tree_Mixin_Call', array( $elements, $args, $index, $this->env->currentFileInfo, $important));
}
}
$this->restore();
}
private function parseMixinCallElements(){
$elements = array();
$c = null;
while( true ){
$elemIndex = $this->pos;
$e = $this->MatchReg('/\\G[#.](?:[\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/');
if( !$e ){
break;
}
$elements[] = $this->NewObj4('Less_Tree_Element', array($c, $e[0], $elemIndex, $this->env->currentFileInfo));
$c = $this->MatchChar('>');
}
return $elements;
}
/**
* @param boolean $isCall
*/
private function parseMixinArgs( $isCall ){
$expressions = array();
$argsSemiColon = array();
$isSemiColonSeperated = null;
$argsComma = array();
$expressionContainsNamed = null;
$name = null;
$returner = array('args'=>array(), 'variadic'=> false);
$this->save();
while( true ){
if( $isCall ){
$arg = $this->MatchFuncs( array( 'parseDetachedRuleset','parseExpression' ) );
} else {
$this->parseComments();
if( $this->input[ $this->pos ] === '.' && $this->MatchReg('/\\G\.{3}/') ){
$returner['variadic'] = true;
if( $this->MatchChar(";") && !$isSemiColonSeperated ){
$isSemiColonSeperated = true;
}
if( $isSemiColonSeperated ){
$argsSemiColon[] = array('variadic'=>true);
}else{
$argsComma[] = array('variadic'=>true);
}
break;
}
$arg = $this->MatchFuncs( array('parseEntitiesVariable','parseEntitiesLiteral','parseEntitiesKeyword') );
}
if( !$arg ){
break;
}
$nameLoop = null;
if( $arg instanceof Less_Tree_Expression ){
$arg->throwAwayComments();
}
$value = $arg;
$val = null;
if( $isCall ){
// Variable
if( property_exists($arg,'value') && count($arg->value) == 1 ){
$val = $arg->value[0];
}
} else {
$val = $arg;
}
if( $val instanceof Less_Tree_Variable ){
if( $this->MatchChar(':') ){
if( $expressions ){
if( $isSemiColonSeperated ){
$this->Error('Cannot mix ; and , as delimiter types');
}
$expressionContainsNamed = true;
}
// we do not support setting a ruleset as a default variable - it doesn't make sense
// However if we do want to add it, there is nothing blocking it, just don't error
// and remove isCall dependency below
$value = null;
if( $isCall ){
$value = $this->parseDetachedRuleset();
}
if( !$value ){
$value = $this->parseExpression();
}
if( !$value ){
if( $isCall ){
$this->Error('could not understand value for named argument');
} else {
$this->restore();
$returner['args'] = array();
return $returner;
}
}
$nameLoop = ($name = $val->name);
}elseif( !$isCall && $this->MatchReg('/\\G\.{3}/') ){
$returner['variadic'] = true;
if( $this->MatchChar(";") && !$isSemiColonSeperated ){
$isSemiColonSeperated = true;
}
if( $isSemiColonSeperated ){
$argsSemiColon[] = array('name'=> $arg->name, 'variadic' => true);
}else{
$argsComma[] = array('name'=> $arg->name, 'variadic' => true);
}
break;
}elseif( !$isCall ){
$name = $nameLoop = $val->name;
$value = null;
}
}
if( $value ){
$expressions[] = $value;
}
$argsComma[] = array('name'=>$nameLoop, 'value'=>$value );
if( $this->MatchChar(',') ){
continue;
}
if( $this->MatchChar(';') || $isSemiColonSeperated ){
if( $expressionContainsNamed ){
$this->Error('Cannot mix ; and , as delimiter types');
}
$isSemiColonSeperated = true;
if( count($expressions) > 1 ){
$value = $this->NewObj1('Less_Tree_Value', $expressions);
}
$argsSemiColon[] = array('name'=>$name, 'value'=>$value );
$name = null;
$expressions = array();
$expressionContainsNamed = false;
}
}
$this->forget();
$returner['args'] = ($isSemiColonSeperated ? $argsSemiColon : $argsComma);
return $returner;
}
//
// A Mixin definition, with a list of parameters
//
// .rounded (@radius: 2px, @color) {
// ...
// }
//
// Until we have a finer grained state-machine, we have to
// do a look-ahead, to make sure we don't have a mixin call.
// See the `rule` function for more information.
//
// We start by matching `.rounded (`, and then proceed on to
// the argument list, which has optional default values.
// We store the parameters in `params`, with a `value` key,
// if there is a value, such as in the case of `@radius`.
//
// Once we've got our params list, and a closing `)`, we parse
// the `{...}` block.
//
private function parseMixinDefinition(){
$cond = null;
$char = $this->input[$this->pos];
if( ($char !== '.' && $char !== '#') || ($char === '{' && $this->PeekReg('/\\G[^{]*\}/')) ){
return;
}
$this->save();
$match = $this->MatchReg('/\\G([#.](?:[\w-]|\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/');
if( $match ){
$name = $match[1];
$argInfo = $this->parseMixinArgs( false );
$params = $argInfo['args'];
$variadic = $argInfo['variadic'];
// .mixincall("@{a}");
// looks a bit like a mixin definition..
// also
// .mixincall(@a: {rule: set;});
// so we have to be nice and restore
if( !$this->MatchChar(')') ){
$this->furthest = $this->pos;
$this->restore();
return;
}
$this->parseComments();
if ($this->MatchReg('/\\Gwhen/')) { // Guard
$cond = $this->expect('parseConditions', 'Expected conditions');
}
$ruleset = $this->parseBlock();
if( is_array($ruleset) ){
$this->forget();
return $this->NewObj5('Less_Tree_Mixin_Definition', array( $name, $params, $ruleset, $cond, $variadic));
}
$this->restore();
}else{
$this->forget();
}
}
//
// Entities are the smallest recognized token,
// and can be found inside a rule's value.
//
private function parseEntity(){
return $this->MatchFuncs( array('parseEntitiesLiteral','parseEntitiesVariable','parseEntitiesUrl','parseEntitiesCall','parseEntitiesKeyword','parseEntitiesJavascript','parseComment') );
}
//
// A Rule terminator. Note that we use `peek()` to check for '}',
// because the `block` rule will be expecting it, but we still need to make sure
// it's there, if ';' was ommitted.
//
private function parseEnd(){
return $this->MatchChar(';') || $this->PeekChar('}');
}
//
// IE's alpha function
//
// alpha(opacity=88)
//
private function parseAlpha(){
if ( ! $this->MatchReg('/\\G\(opacity=/i')) {
return;
}
$value = $this->MatchReg('/\\G[0-9]+/');
if( $value ){
$value = $value[0];
}else{
$value = $this->parseEntitiesVariable();
if( !$value ){
return;
}
}
$this->expectChar(')');
return $this->NewObj1('Less_Tree_Alpha',$value);
}
//
// A Selector Element
//
// div
// + h1
// #socks
// input[type="text"]
//
// Elements are the building blocks for Selectors,
// they are made out of a `Combinator` (see combinator rule),
// and an element name, such as a tag a class, or `*`.
//
private function parseElement(){
$c = $this->parseCombinator();
$index = $this->pos;
$e = $this->match( array('/\\G(?:\d+\.\d+|\d+)%/', '/\\G(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/',
'#*', '#&', 'parseAttribute', '/\\G\([^()@]+\)/', '/\\G[\.#](?=@)/', 'parseEntitiesVariableCurly') );
if( is_null($e) ){
$this->save();
if( $this->MatchChar('(') ){
if( ($v = $this->parseSelector()) && $this->MatchChar(')') ){
$e = $this->NewObj1('Less_Tree_Paren',$v);
$this->forget();
}else{
$this->restore();
}
}else{
$this->forget();
}
}
if( !is_null($e) ){
return $this->NewObj4('Less_Tree_Element',array( $c, $e, $index, $this->env->currentFileInfo));
}
}
//
// Combinators combine elements together, in a Selector.
//
// Because our parser isn't white-space sensitive, special care
// has to be taken, when parsing the descendant combinator, ` `,
// as it's an empty space. We have to check the previous character
// in the input, to see if it's a ` ` character.
//
private function parseCombinator(){
$c = $this->input[$this->pos];
if ($c === '>' || $c === '+' || $c === '~' || $c === '|' || $c === '^' ){
$this->pos++;
if( $this->input[$this->pos] === '^' ){
$c = '^^';
$this->pos++;
}
$this->skipWhitespace(0);
return $c;
}
if( $this->pos > 0 && $this->isWhitespace(-1) ){
return ' ';
}
}
//
// A CSS selector (see selector below)
// with less extensions e.g. the ability to extend and guard
//
private function parseLessSelector(){
return $this->parseSelector(true);
}
//
// A CSS Selector
//
// .class > div + h1
// li a:hover
//
// Selectors are made out of one or more Elements, see above.
//
private function parseSelector( $isLess = false ){
$elements = array();
$extendList = array();
$condition = null;
$when = false;
$extend = false;
$e = null;
$c = null;
$index = $this->pos;
while( ($isLess && ($extend = $this->parseExtend())) || ($isLess && ($when = $this->MatchReg('/\\Gwhen/') )) || ($e = $this->parseElement()) ){
if( $when ){
$condition = $this->expect('parseConditions', 'expected condition');
}elseif( $condition ){
//error("CSS guard can only be used at the end of selector");
}elseif( $extend ){
$extendList = array_merge($extendList,$extend);
}else{
//if( count($extendList) ){
//error("Extend can only be used at the end of selector");
//}
$c = $this->input[ $this->pos ];
$elements[] = $e;
$e = null;
}
if( $c === '{' || $c === '}' || $c === ';' || $c === ',' || $c === ')') { break; }
}
if( $elements ){
return $this->NewObj5('Less_Tree_Selector',array($elements, $extendList, $condition, $index, $this->env->currentFileInfo));
}
if( $extendList ) {
$this->Error('Extend must be used to extend a selector, it cannot be used on its own');
}
}
private function parseTag(){
return ( $tag = $this->MatchReg('/\\G[A-Za-z][A-Za-z-]*[0-9]?/') ) ? $tag : $this->MatchChar('*');
}
private function parseAttribute(){
$val = null;
if( !$this->MatchChar('[') ){
return;
}
$key = $this->parseEntitiesVariableCurly();
if( !$key ){
$key = $this->expect('/\\G(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\\\.)+/');
}
$op = $this->MatchReg('/\\G[|~*$^]?=/');
if( $op ){
$val = $this->match( array('parseEntitiesQuoted','/\\G[0-9]+%/','/\\G[\w-]+/','parseEntitiesVariableCurly') );
}
$this->expectChar(']');
// kiendt- fix check empty option
$_op = !empty($op[0]) ? $op[0] : 0;
return $this->NewObj3('Less_Tree_Attribute',array( $key, $_op, $val));
}
//
// The `block` rule is used by `ruleset` and `mixin.definition`.
// It's a wrapper around the `primary` rule, with added `{}`.
//
private function parseBlock(){
if( $this->MatchChar('{') ){
$content = $this->parsePrimary();
if( $this->MatchChar('}') ){
return $content;
}
}
}
private function parseBlockRuleset(){
$block = $this->parseBlock();
if( $block ){
$block = $this->NewObj2('Less_Tree_Ruleset',array( null, $block));
}
return $block;
}
private function parseDetachedRuleset(){
$blockRuleset = $this->parseBlockRuleset();
if( $blockRuleset ){
return $this->NewObj1('Less_Tree_DetachedRuleset',$blockRuleset);
}
}
//
// div, .class, body > p {...}
//
private function parseRuleset(){
$selectors = array();
$this->save();
while( true ){
$s = $this->parseLessSelector();
if( !$s ){
break;
}
$selectors[] = $s;
$this->parseComments();
if( $s->condition && count($selectors) > 1 ){
$this->Error('Guards are only currently allowed on a single selector.');
}
if( !$this->MatchChar(',') ){
break;
}
if( $s->condition ){
$this->Error('Guards are only currently allowed on a single selector.');
}
$this->parseComments();
}
if( $selectors ){
$rules = $this->parseBlock();
if( is_array($rules) ){
$this->forget();
return $this->NewObj2('Less_Tree_Ruleset',array( $selectors, $rules)); //Less_Environment::$strictImports
}
}
// Backtrack
$this->furthest = $this->pos;
$this->restore();
}
/**
* Custom less.php parse function for finding simple name-value css pairs
* ex: width:100px;
*
*/
private function parseNameValue(){
$index = $this->pos;
$this->save();
//$match = $this->MatchReg('/\\G([a-zA-Z\-]+)\s*:\s*((?:\'")?[a-zA-Z0-9\-% \.,!]+?(?:\'")?)\s*([;}])/');
$match = $this->MatchReg('/\\G([a-zA-Z\-]+)\s*:\s*([\'"]?[#a-zA-Z0-9\-%\.,]+?[\'"]?) *(! *important)?\s*([;}])/');
if( $match ){
if( $match[4] == '}' ){
$this->pos = $index + strlen($match[0])-1;
}
if( $match[3] ){
$match[2] .= ' !important';
}
return $this->NewObj4('Less_Tree_NameValue',array( $match[1], $match[2], $index, $this->env->currentFileInfo));
}
$this->restore();
}
private function parseRule( $tryAnonymous = null ){
$merge = false;
$startOfRule = $this->pos;
$c = $this->input[$this->pos];
if( $c === '.' || $c === '#' || $c === '&' ){
return;
}
$this->save();
$name = $this->MatchFuncs( array('parseVariable','parseRuleProperty'));
if( $name ){
$isVariable = is_string($name);
$value = null;
if( $isVariable ){
$value = $this->parseDetachedRuleset();
}
$important = null;
if( !$value ){
// prefer to try to parse first if its a variable or we are compressing
// but always fallback on the other one
//if( !$tryAnonymous && is_string($name) && $name[0] === '@' ){
if( !$tryAnonymous && (Less_Parser::$options['compress'] || $isVariable) ){
$value = $this->MatchFuncs( array('parseValue','parseAnonymousValue'));
}else{
$value = $this->MatchFuncs( array('parseAnonymousValue','parseValue'));
}
$important = $this->parseImportant();
// a name returned by this.ruleProperty() is always an array of the form:
// [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"]
// where each item is a tree.Keyword or tree.Variable
if( !$isVariable && is_array($name) ){
$nm = array_pop($name);
if( $nm->value ){
$merge = $nm->value;
}
}
}
if( $value && $this->parseEnd() ){
$this->forget();
return $this->NewObj6('Less_Tree_Rule',array( $name, $value, $important, $merge, $startOfRule, $this->env->currentFileInfo));
}else{
$this->furthest = $this->pos;
$this->restore();
if( $value && !$tryAnonymous ){
return $this->parseRule(true);
}
}
}else{
$this->forget();
}
}
function parseAnonymousValue(){
if( preg_match('/\\G([^@+\/\'"*`(;{}-]*);/',$this->input, $match, 0, $this->pos) ){
$this->pos += strlen($match[1]);
return $this->NewObj1('Less_Tree_Anonymous',$match[1]);
}
}
//
// An @import directive
//
// @import "lib";
//
// Depending on our environment, importing is done differently:
// In the browser, it's an XHR request, in Node, it would be a
// file-system operation. The function used for importing is
// stored in `import`, which we pass to the Import constructor.
//
private function parseImport(){
$this->save();
$dir = $this->MatchReg('/\\G@import?\s+/');
if( $dir ){
$options = $this->parseImportOptions();
$path = $this->MatchFuncs( array('parseEntitiesQuoted','parseEntitiesUrl'));
if( $path ){
$features = $this->parseMediaFeatures();
if( $this->MatchChar(';') ){
if( $features ){
$features = $this->NewObj1('Less_Tree_Value',$features);
}
$this->forget();
return $this->NewObj5('Less_Tree_Import',array( $path, $features, $options, $this->pos, $this->env->currentFileInfo));
}
}
}
$this->restore();
}
private function parseImportOptions(){
$options = array();
// list of options, surrounded by parens
if( !$this->MatchChar('(') ){
return $options;
}
do{
$optionName = $this->parseImportOption();
if( $optionName ){
$value = true;
switch( $optionName ){
case "css":
$optionName = "less";
$value = false;
break;
case "once":
$optionName = "multiple";
$value = false;
break;
}
$options[$optionName] = $value;
if( !$this->MatchChar(',') ){ break; }
}
}while( $optionName );
$this->expectChar(')');
return $options;
}
private function parseImportOption(){
$opt = $this->MatchReg('/\\G(less|css|multiple|once|inline|reference)/');
if( $opt ){
return $opt[1];
}
}
private function parseMediaFeature() {
$nodes = array();
do{
$e = $this->MatchFuncs(array('parseEntitiesKeyword','parseEntitiesVariable'));
if( $e ){
$nodes[] = $e;
} elseif ($this->MatchChar('(')) {
$p = $this->parseProperty();
$e = $this->parseValue();
if ($this->MatchChar(')')) {
if ($p && $e) {
$r = $this->NewObj7('Less_Tree_Rule', array( $p, $e, null, null, $this->pos, $this->env->currentFileInfo, true));
$nodes[] = $this->NewObj1('Less_Tree_Paren',$r);
} elseif ($e) {
$nodes[] = $this->NewObj1('Less_Tree_Paren',$e);
} else {
return null;
}
} else
return null;
}
} while ($e);
if ($nodes) {
return $this->NewObj1('Less_Tree_Expression',$nodes);
}
}
private function parseMediaFeatures() {
$features = array();
do{
$e = $this->parseMediaFeature();
if( $e ){
$features[] = $e;
if (!$this->MatchChar(',')) break;
}else{
$e = $this->parseEntitiesVariable();
if( $e ){
$features[] = $e;
if (!$this->MatchChar(',')) break;
}
}
} while ($e);
return $features ? $features : null;
}
private function parseMedia() {
if( $this->MatchReg('/\\G@media/') ){
$features = $this->parseMediaFeatures();
$rules = $this->parseBlock();
if( is_array($rules) ){
return $this->NewObj4('Less_Tree_Media',array( $rules, $features, $this->pos, $this->env->currentFileInfo));
}
}
}
//
// A CSS Directive
//
// @charset "utf-8";
//
private function parseDirective(){
if( !$this->PeekChar('@') ){
return;
}
$rules = null;
$index = $this->pos;
$hasBlock = true;
$hasIdentifier = false;
$hasExpression = false;
$hasUnknown = false;
$value = $this->MatchFuncs(array('parseImport','parseMedia'));
if( $value ){
return $value;
}
$this->save();
$name = $this->MatchReg('/\\G@[a-z-]+/');
if( !$name ) return;
$name = $name[0];
$nonVendorSpecificName = $name;
$pos = strpos($name,'-', 2);
if( $name[1] == '-' && $pos > 0 ){
$nonVendorSpecificName = "@" . substr($name, $pos + 1);
}
switch( $nonVendorSpecificName ){
/*
case "@font-face":
case "@viewport":
case "@top-left":
case "@top-left-corner":
case "@top-center":
case "@top-right":
case "@top-right-corner":
case "@bottom-left":
case "@bottom-left-corner":
case "@bottom-center":
case "@bottom-right":
case "@bottom-right-corner":
case "@left-top":
case "@left-middle":
case "@left-bottom":
case "@right-top":
case "@right-middle":
case "@right-bottom":
hasBlock = true;
break;
*/
case "@charset":
$hasIdentifier = true;
$hasBlock = false;
break;
case "@namespace":
$hasExpression = true;
$hasBlock = false;
break;
case "@keyframes":
$hasIdentifier = true;
break;
case "@host":
case "@page":
case "@document":
case "@supports":
$hasUnknown = true;
break;
}
if( $hasIdentifier ){
$value = $this->parseEntity();
if( !$value ){
$this->error("expected " . $name . " identifier");
}
} else if( $hasExpression ){
$value = $this->parseExpression();
if( !$value ){
$this->error("expected " . $name. " expression");
}
} else if ($hasUnknown) {
$value = $this->MatchReg('/\\G[^{;]+/');
if( $value ){
$value = $this->NewObj1('Less_Tree_Anonymous',trim($value[0]));
}
}
if( $hasBlock ){
$rules = $this->parseBlockRuleset();
}
if( $rules || (!$hasBlock && $value && $this->MatchChar(';'))) {
$this->forget();
return $this->NewObj5('Less_Tree_Directive',array($name, $value, $rules, $index, $this->env->currentFileInfo));
}
$this->restore();
}
//
// A Value is a comma-delimited list of Expressions
//
// font-family: Baskerville, Georgia, serif;
//
// In a Rule, a Value represents everything after the `:`,
// and before the `;`.
//
private function parseValue(){
$expressions = array();
do{
$e = $this->parseExpression();
if( $e ){
$expressions[] = $e;
if (! $this->MatchChar(',')) {
break;
}
}
}while($e);
if( $expressions ){
return $this->NewObj1('Less_Tree_Value',$expressions);
}
}
private function parseImportant (){
if( $this->PeekChar('!') && $this->MatchReg('/\\G! *important/') ){
return ' !important';
}
}
private function parseSub (){
if( $this->MatchChar('(') ){
$a = $this->parseAddition();
if( $a ){
$this->expectChar(')');
return $this->NewObj2('Less_Tree_Expression',array( array($a), true) ); //instead of $e->parens = true so the value is cached
}
}
}
/**
* Parses multiplication operation
*
* @return Less_Tree_Operation|null
*/
function parseMultiplication(){
$return = $m = $this->parseOperand();
if( $return ){
while( true ){
$isSpaced = $this->isWhitespace( -1 );
if( $this->PeekReg('/\\G\/[*\/]/') ){
break;
}
$op = $this->MatchChar('/');
if( !$op ){
$op = $this->MatchChar('*');
if( !$op ){
break;
}
}
$a = $this->parseOperand();
if(!$a) { break; }
$m->parensInOp = true;
$a->parensInOp = true;
$return = $this->NewObj3('Less_Tree_Operation',array( $op, array( $return, $a ), $isSpaced) );
}
}
return $return;
}
/**
* Parses an addition operation
*
* @return Less_Tree_Operation|null
*/
private function parseAddition (){
$return = $m = $this->parseMultiplication();
if( $return ){
while( true ){
$isSpaced = $this->isWhitespace( -1 );
$op = $this->MatchReg('/\\G[-+]\s+/');
if( $op ){
$op = $op[0];
}else{
if( !$isSpaced ){
$op = $this->match(array('#+','#-'));
}
if( !$op ){
break;
}
}
$a = $this->parseMultiplication();
if( !$a ){
break;
}
$m->parensInOp = true;
$a->parensInOp = true;
$return = $this->NewObj3('Less_Tree_Operation',array($op, array($return, $a), $isSpaced));
}
}
return $return;
}
/**
* Parses the conditions
*
* @return Less_Tree_Condition|null
*/
private function parseConditions() {
$index = $this->pos;
$return = $a = $this->parseCondition();
if( $a ){
while( true ){
if( !$this->PeekReg('/\\G,\s*(not\s*)?\(/') || !$this->MatchChar(',') ){
break;
}
$b = $this->parseCondition();
if( !$b ){
break;
}
$return = $this->NewObj4('Less_Tree_Condition',array('or', $return, $b, $index));
}
return $return;
}
}
private function parseCondition() {
$index = $this->pos;
$negate = false;
$c = null;
if ($this->MatchReg('/\\Gnot/')) $negate = true;
$this->expectChar('(');
$a = $this->MatchFuncs(array('parseAddition','parseEntitiesKeyword','parseEntitiesQuoted'));
if( $a ){
$op = $this->MatchReg('/\\G(?:>=|<=|=<|[<=>])/');
if( $op ){
$b = $this->MatchFuncs(array('parseAddition','parseEntitiesKeyword','parseEntitiesQuoted'));
if( $b ){
$c = $this->NewObj5('Less_Tree_Condition',array($op[0], $a, $b, $index, $negate));
} else {
$this->Error('Unexpected expression');
}
} else {
$k = $this->NewObj1('Less_Tree_Keyword','true');
$c = $this->NewObj5('Less_Tree_Condition',array('=', $a, $k, $index, $negate));
}
$this->expectChar(')');
return $this->MatchReg('/\\Gand/') ? $this->NewObj3('Less_Tree_Condition',array('and', $c, $this->parseCondition())) : $c;
}
}
/**
* An operand is anything that can be part of an operation,
* such as a Color, or a Variable
*
*/
private function parseOperand (){
$negate = false;
$offset = $this->pos+1;
if( $offset >= $this->input_len ){
return;
}
$char = $this->input[$offset];
if( $char === '@' || $char === '(' ){
$negate = $this->MatchChar('-');
}
$o = $this->MatchFuncs(array('parseSub','parseEntitiesDimension','parseEntitiesColor','parseEntitiesVariable','parseEntitiesCall'));
if( $negate ){
$o->parensInOp = true;
$o = $this->NewObj1('Less_Tree_Negative',$o);
}
return $o;
}
/**
* Expressions either represent mathematical operations,
* or white-space delimited Entities.
*
* 1px solid black
* @var * 2
*
* @return Less_Tree_Expression|null
*/
private function parseExpression (){
$entities = array();
do{
$e = $this->MatchFuncs(array('parseAddition','parseEntity'));
if( $e ){
$entities[] = $e;
// operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here
if( !$this->PeekReg('/\\G\/[\/*]/') ){
$delim = $this->MatchChar('/');
if( $delim ){
$entities[] = $this->NewObj1('Less_Tree_Anonymous',$delim);
}
}
}
}while($e);
if( $entities ){
return $this->NewObj1('Less_Tree_Expression',$entities);
}
}
/**
* Parse a property
* eg: 'min-width', 'orientation', etc
*
* @return string
*/
private function parseProperty (){
$name = $this->MatchReg('/\\G(\*?-?[_a-zA-Z0-9-]+)\s*:/');
if( $name ){
return $name[1];
}
}
/**
* Parse a rule property
* eg: 'color', 'width', 'height', etc
*
* @return string
*/
private function parseRuleProperty(){
$offset = $this->pos;
$name = array();
$index = array();
$length = 0;
$this->rulePropertyMatch('/\\G(\*?)/', $offset, $length, $index, $name );
while( $this->rulePropertyMatch('/\\G((?:[\w-]+)|(?:@\{[\w-]+\}))/', $offset, $length, $index, $name )); // !
if( (count($name) > 1) && $this->rulePropertyMatch('/\\G\s*((?:\+_|\+)?)\s*:/', $offset, $length, $index, $name) ){
// at last, we have the complete match now. move forward,
// convert name particles to tree objects and return:
$this->skipWhitespace($length);
if( $name[0] === '' ){
array_shift($name);
array_shift($index);
}
foreach($name as $k => $s ){
if( !$s || $s[0] !== '@' ){
$name[$k] = $this->NewObj1('Less_Tree_Keyword',$s);
}else{
$name[$k] = $this->NewObj3('Less_Tree_Variable',array('@' . substr($s,2,-1), $index[$k], $this->env->currentFileInfo));
}
}
return $name;
}
}
private function rulePropertyMatch( $re, &$offset, &$length, &$index, &$name ){
preg_match($re, $this->input, $a, 0, $offset);
if( $a ){
$index[] = $this->pos + $length;
$length += strlen($a[0]);
$offset += strlen($a[0]);
$name[] = $a[1];
return true;
}
}
public function serializeVars( $vars ){
$s = '';
foreach($vars as $name => $value){
$s .= (($name[0] === '@') ? '' : '@') . $name .': '. $value . ((substr($value,-1) === ';') ? '' : ';');
}
return $s;
}
/**
* Some versions of php have trouble with method_exists($a,$b) if $a is not an object
*
* @param string $b
*/
public static function is_method($a,$b){
return is_object($a) && method_exists($a,$b);
}
/**
* Round numbers similarly to javascript
* eg: 1.499999 to 1 instead of 2
*
*/
public static function round($i, $precision = 0){
$precision = pow(10,$precision);
$i = $i*$precision;
$ceil = ceil($i);
$floor = floor($i);
if( ($ceil - $i) <= ($i - $floor) ){
return $ceil/$precision;
}else{
return $floor/$precision;
}
}
/**
* Create Less_Tree_* objects and optionally generate a cache string
*
* @return mixed
*/
public function NewObj0($class){
$obj = new $class();
if( Less_Cache::$cache_dir ){
$obj->cache_string = ' new '.$class.'()';
}
return $obj;
}
public function NewObj1($class, $arg){
$obj = new $class( $arg );
if( Less_Cache::$cache_dir ){
$obj->cache_string = ' new '.$class.'('.Less_Parser::ArgString($arg).')';
}
return $obj;
}
public function NewObj2($class, $args){
$obj = new $class( $args[0], $args[1] );
if( Less_Cache::$cache_dir ){
$this->ObjCache( $obj, $class, $args);
}
return $obj;
}
public function NewObj3($class, $args){
$obj = new $class( $args[0], $args[1], $args[2] );
if( Less_Cache::$cache_dir ){
$this->ObjCache( $obj, $class, $args);
}
return $obj;
}
public function NewObj4($class, $args){
$obj = new $class( $args[0], $args[1], $args[2], $args[3] );
if( Less_Cache::$cache_dir ){
$this->ObjCache( $obj, $class, $args);
}
return $obj;
}
public function NewObj5($class, $args){
$obj = new $class( $args[0], $args[1], $args[2], $args[3], $args[4] );
if( Less_Cache::$cache_dir ){
$this->ObjCache( $obj, $class, $args);
}
return $obj;
}
public function NewObj6($class, $args){
$obj = new $class( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5] );
if( Less_Cache::$cache_dir ){
$this->ObjCache( $obj, $class, $args);
}
return $obj;
}
public function NewObj7($class, $args){
$obj = new $class( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6] );
if( Less_Cache::$cache_dir ){
$this->ObjCache( $obj, $class, $args);
}
return $obj;
}
//caching
public function ObjCache($obj, $class, $args=array()){
$obj->cache_string = ' new '.$class.'('. self::ArgCache($args).')';
}
public function ArgCache($args){
return implode(',',array_map( array('Less_Parser','ArgString'),$args));
}
/**
* Convert an argument to a string for use in the parser cache
*
* @return string
*/
public static function ArgString($arg){
$type = gettype($arg);
if( $type === 'object'){
$string = $arg->cache_string;
unset($arg->cache_string);
return $string;
}elseif( $type === 'array' ){
$string = ' Array(';
foreach($arg as $k => $a){
$string .= var_export($k,true).' => '.self::ArgString($a).',';
}
return $string . ')';
}
return var_export($arg,true);
}
public function Error($msg){
throw new Less_Exception_Parser($msg, null, $this->furthest, $this->env->currentFileInfo);
}
public static function WinPath($path){
return str_replace('\\', '/', $path);
}
}
/**
* Utility for css colors
*
* @package Less
* @subpackage color
*/
class Less_Colors {
public static $colors = array(
'aliceblue'=>'#f0f8ff',
'antiquewhite'=>'#faebd7',
'aqua'=>'#00ffff',
'aquamarine'=>'#7fffd4',
'azure'=>'#f0ffff',
'beige'=>'#f5f5dc',
'bisque'=>'#ffe4c4',
'black'=>'#000000',
'blanchedalmond'=>'#ffebcd',
'blue'=>'#0000ff',
'blueviolet'=>'#8a2be2',
'brown'=>'#a52a2a',
'burlywood'=>'#deb887',
'cadetblue'=>'#5f9ea0',
'chartreuse'=>'#7fff00',
'chocolate'=>'#d2691e',
'coral'=>'#ff7f50',
'cornflowerblue'=>'#6495ed',
'cornsilk'=>'#fff8dc',
'crimson'=>'#dc143c',
'cyan'=>'#00ffff',
'darkblue'=>'#00008b',
'darkcyan'=>'#008b8b',
'darkgoldenrod'=>'#b8860b',
'darkgray'=>'#a9a9a9',
'darkgrey'=>'#a9a9a9',
'darkgreen'=>'#006400',
'darkkhaki'=>'#bdb76b',
'darkmagenta'=>'#8b008b',
'darkolivegreen'=>'#556b2f',
'darkorange'=>'#ff8c00',
'darkorchid'=>'#9932cc',
'darkred'=>'#8b0000',
'darksalmon'=>'#e9967a',
'darkseagreen'=>'#8fbc8f',
'darkslateblue'=>'#483d8b',
'darkslategray'=>'#2f4f4f',
'darkslategrey'=>'#2f4f4f',
'darkturquoise'=>'#00ced1',
'darkviolet'=>'#9400d3',
'deeppink'=>'#ff1493',
'deepskyblue'=>'#00bfff',
'dimgray'=>'#696969',
'dimgrey'=>'#696969',
'dodgerblue'=>'#1e90ff',
'firebrick'=>'#b22222',
'floralwhite'=>'#fffaf0',
'forestgreen'=>'#228b22',
'fuchsia'=>'#ff00ff',
'gainsboro'=>'#dcdcdc',
'ghostwhite'=>'#f8f8ff',
'gold'=>'#ffd700',
'goldenrod'=>'#daa520',
'gray'=>'#808080',
'grey'=>'#808080',
'green'=>'#008000',
'greenyellow'=>'#adff2f',
'honeydew'=>'#f0fff0',
'hotpink'=>'#ff69b4',
'indianred'=>'#cd5c5c',
'indigo'=>'#4b0082',
'ivory'=>'#fffff0',
'khaki'=>'#f0e68c',
'lavender'=>'#e6e6fa',
'lavenderblush'=>'#fff0f5',
'lawngreen'=>'#7cfc00',
'lemonchiffon'=>'#fffacd',
'lightblue'=>'#add8e6',
'lightcoral'=>'#f08080',
'lightcyan'=>'#e0ffff',
'lightgoldenrodyellow'=>'#fafad2',
'lightgray'=>'#d3d3d3',
'lightgrey'=>'#d3d3d3',
'lightgreen'=>'#90ee90',
'lightpink'=>'#ffb6c1',
'lightsalmon'=>'#ffa07a',
'lightseagreen'=>'#20b2aa',
'lightskyblue'=>'#87cefa',
'lightslategray'=>'#778899',
'lightslategrey'=>'#778899',
'lightsteelblue'=>'#b0c4de',
'lightyellow'=>'#ffffe0',
'lime'=>'#00ff00',
'limegreen'=>'#32cd32',
'linen'=>'#faf0e6',
'magenta'=>'#ff00ff',
'maroon'=>'#800000',
'mediumaquamarine'=>'#66cdaa',
'mediumblue'=>'#0000cd',
'mediumorchid'=>'#ba55d3',
'mediumpurple'=>'#9370d8',
'mediumseagreen'=>'#3cb371',
'mediumslateblue'=>'#7b68ee',
'mediumspringgreen'=>'#00fa9a',
'mediumturquoise'=>'#48d1cc',
'mediumvioletred'=>'#c71585',
'midnightblue'=>'#191970',
'mintcream'=>'#f5fffa',
'mistyrose'=>'#ffe4e1',
'moccasin'=>'#ffe4b5',
'navajowhite'=>'#ffdead',
'navy'=>'#000080',
'oldlace'=>'#fdf5e6',
'olive'=>'#808000',
'olivedrab'=>'#6b8e23',
'orange'=>'#ffa500',
'orangered'=>'#ff4500',
'orchid'=>'#da70d6',
'palegoldenrod'=>'#eee8aa',
'palegreen'=>'#98fb98',
'paleturquoise'=>'#afeeee',
'palevioletred'=>'#d87093',
'papayawhip'=>'#ffefd5',
'peachpuff'=>'#ffdab9',
'peru'=>'#cd853f',
'pink'=>'#ffc0cb',
'plum'=>'#dda0dd',
'powderblue'=>'#b0e0e6',
'purple'=>'#800080',
'red'=>'#ff0000',
'rosybrown'=>'#bc8f8f',
'royalblue'=>'#4169e1',
'saddlebrown'=>'#8b4513',
'salmon'=>'#fa8072',
'sandybrown'=>'#f4a460',
'seagreen'=>'#2e8b57',
'seashell'=>'#fff5ee',
'sienna'=>'#a0522d',
'silver'=>'#c0c0c0',
'skyblue'=>'#87ceeb',
'slateblue'=>'#6a5acd',
'slategray'=>'#708090',
'slategrey'=>'#708090',
'snow'=>'#fffafa',
'springgreen'=>'#00ff7f',
'steelblue'=>'#4682b4',
'tan'=>'#d2b48c',
'teal'=>'#008080',
'thistle'=>'#d8bfd8',
'tomato'=>'#ff6347',
'turquoise'=>'#40e0d0',
'violet'=>'#ee82ee',
'wheat'=>'#f5deb3',
'white'=>'#ffffff',
'whitesmoke'=>'#f5f5f5',
'yellow'=>'#ffff00',
'yellowgreen'=>'#9acd32'
);
public static function hasOwnProperty($color) {
return isset(self::$colors[$color]);
}
public static function color($color) {
return self::$colors[$color];
}
}
/**
* Environment
*
* @package Less
* @subpackage environment
*/
class Less_Environment{
//public $paths = array(); // option - unmodified - paths to search for imports on
//public static $files = array(); // list of files that have been imported, used for import-once
//public $rootpath; // option - rootpath to append to URL's
//public static $strictImports = null; // option -
//public $insecure; // option - whether to allow imports from insecure ssl hosts
//public $processImports; // option - whether to process imports. if false then imports will not be imported
//public $javascriptEnabled; // option - whether JavaScript is enabled. if undefined, defaults to true
//public $useFileCache; // browser only - whether to use the per file session cache
public $currentFileInfo; // information about the current file - for error reporting and importing and making urls relative etc.
public $importMultiple = false; // whether we are currently importing multiple copies
/**
* @var array
*/
public $frames = array();
/**
* @var array
*/
public $mediaBlocks = array();
/**
* @var array
*/
public $mediaPath = array();
public static $parensStack = 0;
public static $tabLevel = 0;
public static $lastRule = false;
public static $_outputMap;
public static $mixin_stack = 0;
public function Init(){
self::$parensStack = 0;
self::$tabLevel = 0;
self::$lastRule = false;
self::$mixin_stack = 0;
if( Less_Parser::$options['compress'] ){
Less_Environment::$_outputMap = array(
',' => ',',
': ' => ':',
'' => '',
' ' => ' ',
':' => ' :',
'+' => '+',
'~' => '~',
'>' => '>',
'|' => '|',
'^' => '^',
'^^' => '^^'
);
}else{
Less_Environment::$_outputMap = array(
',' => ', ',
': ' => ': ',
'' => '',
' ' => ' ',
':' => ' :',
'+' => ' + ',
'~' => ' ~ ',
'>' => ' > ',
'|' => '|',
'^' => ' ^ ',
'^^' => ' ^^ '
);
}
}
public function copyEvalEnv($frames = array() ){
$new_env = new Less_Environment();
$new_env->frames = $frames;
return $new_env;
}
public static function isMathOn(){
return !Less_Parser::$options['strictMath'] || Less_Environment::$parensStack;
}
public static function isPathRelative($path){
return !preg_match('/^(?:[a-z-]+:|\/)/',$path);
}
/**
* Canonicalize a path by resolving references to '/./', '/../'
* Does not remove leading "../"
* @param string path or url
* @return string Canonicalized path
*
*/
static function normalizePath($path){
$segments = explode('/',$path);
$segments = array_reverse($segments);
$path = array();
$path_len = 0;
while( $segments ){
$segment = array_pop($segments);
switch( $segment ) {
case '.':
break;
case '..':
if( !$path_len || ( $path[$path_len-1] === '..') ){
$path[] = $segment;
$path_len++;
}else{
array_pop($path);
$path_len--;
}
break;
default:
$path[] = $segment;
$path_len++;
break;
}
}
return implode('/',$path);
}
public function unshiftFrame($frame){
array_unshift($this->frames, $frame);
}
public function shiftFrame(){
return array_shift($this->frames);
}
}
/**
* Builtin functions
*
* @package Less
* @subpackage function
* @see http://lesscss.org/functions/
*/
class Less_Functions{
public $env;
public $currentFileInfo;
function __construct($env, $currentFileInfo = null ){
$this->env = $env;
$this->currentFileInfo = $currentFileInfo;
}
/**
* @param string $op
*/
static public function operate( $op, $a, $b ){
switch ($op) {
case '+': return $a + $b;
case '-': return $a - $b;
case '*': return $a * $b;
case '/': return $a / $b;
}
}
static public function clamp($val, $max = 1){
return min( max($val, 0), $max);
}
static function fround( $value ){
if( $value === 0 ){
return $value;
}
if( Less_Parser::$options['numPrecision'] ){
$p = pow(10, Less_Parser::$options['numPrecision']);
return round( $value * $p) / $p;
}
return $value;
}
static public function number($n){
if ($n instanceof Less_Tree_Dimension) {
return floatval( $n->unit->is('%') ? $n->value / 100 : $n->value);
} else if (is_numeric($n)) {
return $n;
} else {
throw new Less_Exception_Compiler("color functions take numbers as parameters");
}
}
static public function scaled($n, $size = 255 ){
if( $n instanceof Less_Tree_Dimension && $n->unit->is('%') ){
return (float)$n->value * $size / 100;
} else {
return Less_Functions::number($n);
}
}
public function rgb ($r, $g, $b){
return $this->rgba($r, $g, $b, 1.0);
}
public function rgba($r, $g, $b, $a){
$rgb = array($r, $g, $b);
$rgb = array_map(array('Less_Functions','scaled'),$rgb);
$a = self::number($a);
return new Less_Tree_Color($rgb, $a);
}
public function hsl($h, $s, $l){
return $this->hsla($h, $s, $l, 1.0);
}
public function hsla($h, $s, $l, $a){
$h = fmod(self::number($h), 360) / 360; // Classic % operator will change float to int
$s = self::clamp(self::number($s));
$l = self::clamp(self::number($l));
$a = self::clamp(self::number($a));
$m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s;
$m1 = $l * 2 - $m2;
return $this->rgba( self::hsla_hue($h + 1/3, $m1, $m2) * 255,
self::hsla_hue($h, $m1, $m2) * 255,
self::hsla_hue($h - 1/3, $m1, $m2) * 255,
$a);
}
/**
* @param double $h
*/
function hsla_hue($h, $m1, $m2){
$h = $h < 0 ? $h + 1 : ($h > 1 ? $h - 1 : $h);
if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6;
else if ($h * 2 < 1) return $m2;
else if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (2/3 - $h) * 6;
else return $m1;
}
public function hsv($h, $s, $v) {
return $this->hsva($h, $s, $v, 1.0);
}
/**
* @param double $a
*/
public function hsva($h, $s, $v, $a) {
$h = ((Less_Functions::number($h) % 360) / 360 ) * 360;
$s = Less_Functions::number($s);
$v = Less_Functions::number($v);
$a = Less_Functions::number($a);
$i = floor(($h / 60) % 6);
$f = ($h / 60) - $i;
$vs = array( $v,
$v * (1 - $s),
$v * (1 - $f * $s),
$v * (1 - (1 - $f) * $s));
$perm = array(array(0, 3, 1),
array(2, 0, 1),
array(1, 0, 3),
array(1, 2, 0),
array(3, 1, 0),
array(0, 1, 2));
return $this->rgba($vs[$perm[$i][0]] * 255,
$vs[$perm[$i][1]] * 255,
$vs[$perm[$i][2]] * 255,
$a);
}
public function hue($color){
$c = $color->toHSL();
return new Less_Tree_Dimension(Less_Parser::round($c['h']));
}
public function saturation($color){
$c = $color->toHSL();
return new Less_Tree_Dimension(Less_Parser::round($c['s'] * 100), '%');
}
public function lightness($color){
$c = $color->toHSL();
return new Less_Tree_Dimension(Less_Parser::round($c['l'] * 100), '%');
}
public function hsvhue( $color ){
$hsv = $color->toHSV();
return new Less_Tree_Dimension( Less_Parser::round($hsv['h']) );
}
public function hsvsaturation( $color ){
$hsv = $color->toHSV();
return new Less_Tree_Dimension( Less_Parser::round($hsv['s'] * 100), '%' );
}
public function hsvvalue( $color ){
$hsv = $color->toHSV();
return new Less_Tree_Dimension( Less_Parser::round($hsv['v'] * 100), '%' );
}
public function red($color) {
return new Less_Tree_Dimension( $color->rgb[0] );
}
public function green($color) {
return new Less_Tree_Dimension( $color->rgb[1] );
}
public function blue($color) {
return new Less_Tree_Dimension( $color->rgb[2] );
}
public function alpha($color){
$c = $color->toHSL();
return new Less_Tree_Dimension($c['a']);
}
public function luma ($color) {
return new Less_Tree_Dimension(Less_Parser::round( $color->luma() * $color->alpha * 100), '%');
}
public function luminance( $color ){
$luminance =
(0.2126 * $color->rgb[0] / 255)
+ (0.7152 * $color->rgb[1] / 255)
+ (0.0722 * $color->rgb[2] / 255);
return new Less_Tree_Dimension(Less_Parser::round( $luminance * $color->alpha * 100), '%');
}
public function saturate($color, $amount = null){
// filter: saturate(3.2);
// should be kept as is, so check for color
if( !property_exists($color,'rgb') ){
return null;
}
$hsl = $color->toHSL();
$hsl['s'] += $amount->value / 100;
$hsl['s'] = self::clamp($hsl['s']);
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
/**
* @param Less_Tree_Dimension $amount
*/
public function desaturate($color, $amount){
$hsl = $color->toHSL();
$hsl['s'] -= $amount->value / 100;
$hsl['s'] = self::clamp($hsl['s']);
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
public function lighten($color, $amount){
$hsl = $color->toHSL();
$hsl['l'] += $amount->value / 100;
$hsl['l'] = self::clamp($hsl['l']);
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
public function darken($color, $amount){
if( $color instanceof Less_Tree_Color ){
$hsl = $color->toHSL();
$hsl['l'] -= $amount->value / 100;
$hsl['l'] = self::clamp($hsl['l']);
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
Less_Functions::Expected('color',$color);
}
public function fadein($color, $amount){
$hsl = $color->toHSL();
$hsl['a'] += $amount->value / 100;
$hsl['a'] = self::clamp($hsl['a']);
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
public function fadeout($color, $amount){
$hsl = $color->toHSL();
$hsl['a'] -= $amount->value / 100;
$hsl['a'] = self::clamp($hsl['a']);
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
public function fade($color, $amount){
$hsl = $color->toHSL();
$hsl['a'] = $amount->value / 100;
$hsl['a'] = self::clamp($hsl['a']);
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
public function spin($color, $amount){
$hsl = $color->toHSL();
$hue = fmod($hsl['h'] + $amount->value, 360);
$hsl['h'] = $hue < 0 ? 360 + $hue : $hue;
return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']);
}
//
// Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
// http://sass-lang.com
//
/**
* @param Less_Tree_Color $color1
*/
public function mix($color1, $color2, $weight = null){
if (!$weight) {
$weight = new Less_Tree_Dimension('50', '%');
}
$p = $weight->value / 100.0;
$w = $p * 2 - 1;
$hsl1 = $color1->toHSL();
$hsl2 = $color2->toHSL();
$a = $hsl1['a'] - $hsl2['a'];
$w1 = (((($w * $a) == -1) ? $w : ($w + $a) / (1 + $w * $a)) + 1) / 2;
$w2 = 1 - $w1;
$rgb = array($color1->rgb[0] * $w1 + $color2->rgb[0] * $w2,
$color1->rgb[1] * $w1 + $color2->rgb[1] * $w2,
$color1->rgb[2] * $w1 + $color2->rgb[2] * $w2);
$alpha = $color1->alpha * $p + $color2->alpha * (1 - $p);
return new Less_Tree_Color($rgb, $alpha);
}
public function greyscale($color){
return $this->desaturate($color, new Less_Tree_Dimension(100));
}
public function contrast( $color, $dark = null, $light = null, $threshold = null){
// filter: contrast(3.2);
// should be kept as is, so check for color
if( !property_exists($color,'rgb') ){
return null;
}
if( !$light ){
$light = $this->rgba(255, 255, 255, 1.0);
}
if( !$dark ){
$dark = $this->rgba(0, 0, 0, 1.0);
}
//Figure out which is actually light and dark!
if( $dark->luma() > $light->luma() ){
$t = $light;
$light = $dark;
$dark = $t;
}
if( !$threshold ){
$threshold = 0.43;
} else {
$threshold = Less_Functions::number($threshold);
}
if( $color->luma() < $threshold ){
return $light;
} else {
return $dark;
}
}
public function e ($str){
if( is_string($str) ){
return new Less_Tree_Anonymous($str);
}
return new Less_Tree_Anonymous($str instanceof Less_Tree_JavaScript ? $str->expression : $str->value);
}
public function escape ($str){
$revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'",'%3F'=>'?','%26'=>'&','%2C'=>',','%2F'=>'/','%40'=>'@','%2B'=>'+','%24'=>'$');
return new Less_Tree_Anonymous(strtr(rawurlencode($str->value), $revert));
}
/**
* todo: This function will need some additional work to make it work the same as less.js
*
*/
public function replace( $string, $pattern, $replacement, $flags = null ){
$result = $string->value;
$expr = '/'.str_replace('/','\\/',$pattern->value).'/';
if( $flags && $flags->value){
$expr .= self::replace_flags($flags->value);
}
$result = preg_replace($expr,$replacement->value,$result);
if( property_exists($string,'quote') ){
return new Less_Tree_Quoted( $string->quote, $result, $string->escaped);
}
return new Less_Tree_Quoted( '', $result );
}
public static function replace_flags($flags){
$flags = str_split($flags,1);
$new_flags = '';
foreach($flags as $flag){
switch($flag){
case 'e':
case 'g':
break;
default:
$new_flags .= $flag;
break;
}
}
return $new_flags;
}
public function _percent(){
$string = func_get_arg(0);
$args = func_get_args();
array_shift($args);
$result = $string->value;
foreach($args as $arg){
if( preg_match('/%[sda]/i',$result, $token) ){
$token = $token[0];
$value = stristr($token, 's') ? $arg->value : $arg->toCSS();
$value = preg_match('/[A-Z]$/', $token) ? urlencode($value) : $value;
$result = preg_replace('/%[sda]/i',$value, $result, 1);
}
}
$result = str_replace('%%', '%', $result);
return new Less_Tree_Quoted( $string->quote , $result, $string->escaped);
}
public function unit( $val, $unit = null) {
if( !($val instanceof Less_Tree_Dimension) ){
throw new Less_Exception_Compiler('The first argument to unit must be a number' . ($val instanceof Less_Tree_Operation ? '. Have you forgotten parenthesis?' : '.') );
}
if( $unit ){
if( $unit instanceof Less_Tree_Keyword ){
$unit = $unit->value;
} else {
$unit = $unit->toCSS();
}
} else {
$unit = "";
}
return new Less_Tree_Dimension($val->value, $unit );
}
public function convert($val, $unit){
return $val->convertTo($unit->value);
}
public function round($n, $f = false) {
$fraction = 0;
if( $f !== false ){
$fraction = $f->value;
}
return $this->_math('Less_Parser::round',null, $n, $fraction);
}
public function pi(){
return new Less_Tree_Dimension(M_PI);
}
public function mod($a, $b) {
return new Less_Tree_Dimension( $a->value % $b->value, $a->unit);
}
public function pow($x, $y) {
if( is_numeric($x) && is_numeric($y) ){
$x = new Less_Tree_Dimension($x);
$y = new Less_Tree_Dimension($y);
}elseif( !($x instanceof Less_Tree_Dimension) || !($y instanceof Less_Tree_Dimension) ){
throw new Less_Exception_Compiler('Arguments must be numbers');
}
return new Less_Tree_Dimension( pow($x->value, $y->value), $x->unit );
}
// var mathFunctions = [{name:"ce ...
public function ceil( $n ){ return $this->_math('ceil', null, $n); }
public function floor( $n ){ return $this->_math('floor', null, $n); }
public function sqrt( $n ){ return $this->_math('sqrt', null, $n); }
public function abs( $n ){ return $this->_math('abs', null, $n); }
public function tan( $n ){ return $this->_math('tan', '', $n); }
public function sin( $n ){ return $this->_math('sin', '', $n); }
public function cos( $n ){ return $this->_math('cos', '', $n); }
public function atan( $n ){ return $this->_math('atan', 'rad', $n); }
public function asin( $n ){ return $this->_math('asin', 'rad', $n); }
public function acos( $n ){ return $this->_math('acos', 'rad', $n); }
private function _math() {
$args = func_get_args();
$fn = array_shift($args);
$unit = array_shift($args);
if ($args[0] instanceof Less_Tree_Dimension) {
if( $unit === null ){
$unit = $args[0]->unit;
}else{
$args[0] = $args[0]->unify();
}
$args[0] = (float)$args[0]->value;
return new Less_Tree_Dimension( call_user_func_array($fn, $args), $unit);
} else if (is_numeric($args[0])) {
return call_user_func_array($fn,$args);
} else {
throw new Less_Exception_Compiler("math functions take numbers as parameters");
}
}
/**
* @param boolean $isMin
*/
function _minmax( $isMin, $args ){
$arg_count = count($args);
if( $arg_count < 1 ){
throw new Less_Exception_Compiler( 'one or more arguments required');
}
$j = null;
$unitClone = null;
$unitStatic = null;
$order = array(); // elems only contains original argument values.
$values = array(); // key is the unit.toString() for unified tree.Dimension values,
// value is the index into the order array.
for( $i = 0; $i < $arg_count; $i++ ){
$current = $args[$i];
if( !($current instanceof Less_Tree_Dimension) ){
if( is_array($args[$i]->value) ){
$args[] = $args[$i]->value;
}
continue;
}
if( $current->unit->toString() === '' && !$unitClone ){
$temp = new Less_Tree_Dimension($current->value, $unitClone);
$currentUnified = $temp->unify();
}else{
$currentUnified = $current->unify();
}
if( $currentUnified->unit->toString() === "" && !$unitStatic ){
$unit = $unitStatic;
}else{
$unit = $currentUnified->unit->toString();
}
if( $unit !== '' && !$unitStatic || $unit !== '' && $order[0]->unify()->unit->toString() === "" ){
$unitStatic = $unit;
}
if( $unit != '' && !$unitClone ){
$unitClone = $current->unit->toString();
}
if( isset($values['']) && $unit !== '' && $unit === $unitStatic ){
$j = $values[''];
}elseif( isset($values[$unit]) ){
$j = $values[$unit];
}else{
if( $unitStatic && $unit !== $unitStatic ){
throw new Less_Exception_Compiler( 'incompatible types');
}
$values[$unit] = count($order);
$order[] = $current;
continue;
}
if( $order[$j]->unit->toString() === "" && $unitClone ){
$temp = new Less_Tree_Dimension( $order[$j]->value, $unitClone);
$referenceUnified = $temp->unifiy();
}else{
$referenceUnified = $order[$j]->unify();
}
if( ($isMin && $currentUnified->value < $referenceUnified->value) || (!$isMin && $currentUnified->value > $referenceUnified->value) ){
$order[$j] = $current;
}
}
if( count($order) == 1 ){
return $order[0];
}
$args = array();
foreach($order as $a){
$args[] = $a->toCSS($this->env);
}
return new Less_Tree_Anonymous( ($isMin?'min(':'max(') . implode(Less_Environment::$_outputMap[','],$args).')');
}
public function min(){
$args = func_get_args();
return $this->_minmax( true, $args );
}
public function max(){
$args = func_get_args();
return $this->_minmax( false, $args );
}
public function getunit($n){
return new Less_Tree_Anonymous($n->unit);
}
public function argb($color) {
return new Less_Tree_Anonymous($color->toARGB());
}
public function percentage($n) {
return new Less_Tree_Dimension($n->value * 100, '%');
}
public function color($n) {
if( $n instanceof Less_Tree_Quoted ){
$colorCandidate = $n->value;
$returnColor = Less_Tree_Color::fromKeyword($colorCandidate);
if( $returnColor ){
return $returnColor;
}
if( preg_match('/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/',$colorCandidate) ){
return new Less_Tree_Color(substr($colorCandidate, 1));
}
throw new Less_Exception_Compiler("argument must be a color keyword or 3/6 digit hex e.g. #FFF");
} else {
throw new Less_Exception_Compiler("argument must be a string");
}
}
public function iscolor($n) {
return $this->_isa($n, 'Less_Tree_Color');
}
public function isnumber($n) {
return $this->_isa($n, 'Less_Tree_Dimension');
}
public function isstring($n) {
return $this->_isa($n, 'Less_Tree_Quoted');
}
public function iskeyword($n) {
return $this->_isa($n, 'Less_Tree_Keyword');
}
public function isurl($n) {
return $this->_isa($n, 'Less_Tree_Url');
}
public function ispixel($n) {
return $this->isunit($n, 'px');
}
public function ispercentage($n) {
return $this->isunit($n, '%');
}
public function isem($n) {
return $this->isunit($n, 'em');
}
/**
* @param string $unit
*/
public function isunit( $n, $unit ){
return ($n instanceof Less_Tree_Dimension) && $n->unit->is( ( property_exists($unit,'value') ? $unit->value : $unit) ) ? new Less_Tree_Keyword('true') : new Less_Tree_Keyword('false');
}
/**
* @param string $type
*/
private function _isa($n, $type) {
return is_a($n, $type) ? new Less_Tree_Keyword('true') : new Less_Tree_Keyword('false');
}
public function tint($color, $amount) {
return $this->mix( $this->rgb(255,255,255), $color, $amount);
}
public function shade($color, $amount) {
return $this->mix($this->rgb(0, 0, 0), $color, $amount);
}
public function extract($values, $index ){
$index = (int)$index->value - 1; // (1-based index)
// handle non-array values as an array of length 1
// return 'undefined' if index is invalid
if( property_exists($values,'value') && is_array($values->value) ){
if( isset($values->value[$index]) ){
return $values->value[$index];
}
return null;
}elseif( (int)$index === 0 ){
return $values;
}
return null;
}
function length($values){
$n = (property_exists($values,'value') && is_array($values->value)) ? count($values->value) : 1;
return new Less_Tree_Dimension($n);
}
function datauri($mimetypeNode, $filePathNode = null ) {
$filePath = ( $filePathNode ? $filePathNode->value : null );
$mimetype = $mimetypeNode->value;
$args = 2;
if( !$filePath ){
$filePath = $mimetype;
$args = 1;
}
$filePath = str_replace('\\','/',$filePath);
if( Less_Environment::isPathRelative($filePath) ){
if( Less_Parser::$options['relativeUrls'] ){
$temp = $this->currentFileInfo['currentDirectory'];
} else {
$temp = $this->currentFileInfo['entryPath'];
}
if( !empty($temp) ){
$filePath = Less_Environment::normalizePath(rtrim($temp,'/').'/'.$filePath);
}
}
// detect the mimetype if not given
if( $args < 2 ){
/* incomplete
$mime = require('mime');
mimetype = mime.lookup(path);
// use base 64 unless it's an ASCII or UTF-8 format
var charset = mime.charsets.lookup(mimetype);
useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;
if (useBase64) mimetype += ';base64';
*/
$mimetype = Less_Mime::lookup($filePath);
$charset = Less_Mime::charsets_lookup($mimetype);
$useBase64 = !in_array($charset,array('US-ASCII', 'UTF-8'));
if( $useBase64 ){ $mimetype .= ';base64'; }
}else{
$useBase64 = preg_match('/;base64$/',$mimetype);
}
if( file_exists($filePath) ){
$buf = @file_get_contents($filePath);
}else{
$buf = false;
}
// IE8 cannot handle a data-uri larger than 32KB. If this is exceeded
// and the --ieCompat flag is enabled, return a normal url() instead.
$DATA_URI_MAX_KB = 32;
$fileSizeInKB = round( strlen($buf) / 1024 );
if( $fileSizeInKB >= $DATA_URI_MAX_KB ){
$url = new Less_Tree_Url( ($filePathNode ? $filePathNode : $mimetypeNode), $this->currentFileInfo);
return $url->compile($this);
}
if( $buf ){
$buf = $useBase64 ? base64_encode($buf) : rawurlencode($buf);
$filePath = '"data:' . $mimetype . ',' . $buf . '"';
}
return new Less_Tree_Url( new Less_Tree_Anonymous($filePath) );
}
//svg-gradient
function svggradient( $direction ){
$throw_message = 'svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position]';
$arguments = func_get_args();
if( count($arguments) < 3 ){
throw new Less_Exception_Compiler( $throw_message );
}
$stops = array_slice($arguments,1);
$gradientType = 'linear';
$rectangleDimension = 'x="0" y="0" width="1" height="1"';
$useBase64 = true;
$directionValue = $direction->toCSS();
switch( $directionValue ){
case "to bottom":
$gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"';
break;
case "to right":
$gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"';
break;
case "to bottom right":
$gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"';
break;
case "to top right":
$gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"';
break;
case "ellipse":
case "ellipse at center":
$gradientType = "radial";
$gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"';
$rectangleDimension = 'x="-50" y="-50" width="101" height="101"';
break;
default:
throw new Less_Exception_Compiler( "svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center'" );
}
$returner = '<?xml version="1.0" ?>' .
'<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" height="100%" viewBox="0 0 1 1" preserveAspectRatio="none">' .
'<' . $gradientType . 'Gradient id="gradient" gradientUnits="userSpaceOnUse" ' . $gradientDirectionSvg . '>';
for( $i = 0; $i < count($stops); $i++ ){
if( is_object($stops[$i]) && property_exists($stops[$i],'value') ){
$color = $stops[$i]->value[0];
$position = $stops[$i]->value[1];
}else{
$color = $stops[$i];
$position = null;
}
if( !($color instanceof Less_Tree_Color) || (!(($i === 0 || $i+1 === count($stops)) && $position === null) && !($position instanceof Less_Tree_Dimension)) ){
throw new Less_Exception_Compiler( $throw_message );
}
if( $position ){
$positionValue = $position->toCSS();
}elseif( $i === 0 ){
$positionValue = '0%';
}else{
$positionValue = '100%';
}
$alpha = $color->alpha;
$returner .= '<stop offset="' . $positionValue . '" stop-color="' . $color->toRGB() . '"' . ($alpha < 1 ? ' stop-opacity="' . $alpha . '"' : '') . '/>';
}
$returner .= '</' . $gradientType . 'Gradient><rect ' . $rectangleDimension . ' fill="url(#gradient)" /></svg>';
if( $useBase64 ){
$returner = "'data:image/svg+xml;base64,".base64_encode($returner)."'";
}else{
$returner = "'data:image/svg+xml,".$returner."'";
}
return new Less_Tree_URL( new Less_Tree_Anonymous( $returner ) );
}
/**
* @param string $type
*/
private static function Expected( $type, $arg ){
$debug = debug_backtrace();
array_shift($debug);
$last = array_shift($debug);
$last = array_intersect_key($last,array('function'=>'','class'=>'','line'=>''));
$message = 'Object of type '.get_class($arg).' passed to darken function. Expecting `'.$type.'`. '.$arg->toCSS().'. '.print_r($last,true);
throw new Less_Exception_Compiler($message);
}
/**
* Php version of javascript's `encodeURIComponent` function
*
* @param string $string The string to encode
* @return string The encoded string
*/
public static function encodeURIComponent($string){
$revert = array('%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')');
return strtr(rawurlencode($string), $revert);
}
// Color Blending
// ref: http://www.w3.org/TR/compositing-1
public function colorBlend( $mode, $color1, $color2 ){
$ab = $color1->alpha; // backdrop
$as = $color2->alpha; // source
$r = array(); // result
$ar = $as + $ab * (1 - $as);
for( $i = 0; $i < 3; $i++ ){
$cb = $color1->rgb[$i] / 255;
$cs = $color2->rgb[$i] / 255;
$cr = call_user_func( $mode, $cb, $cs );
if( $ar ){
$cr = ($as * $cs + $ab * ($cb - $as * ($cb + $cs - $cr))) / $ar;
}
$r[$i] = $cr * 255;
}
return new Less_Tree_Color($r, $ar);
}
public function multiply($color1, $color2 ){
return $this->colorBlend( array($this,'colorBlendMultiply'), $color1, $color2 );
}
private function colorBlendMultiply($cb, $cs){
return $cb * $cs;
}
public function screen($color1, $color2 ){
return $this->colorBlend( array($this,'colorBlendScreen'), $color1, $color2 );
}
private function colorBlendScreen( $cb, $cs){
return $cb + $cs - $cb * $cs;
}
public function overlay($color1, $color2){
return $this->colorBlend( array($this,'colorBlendOverlay'), $color1, $color2 );
}
private function colorBlendOverlay($cb, $cs ){
$cb *= 2;
return ($cb <= 1)
? $this->colorBlendMultiply($cb, $cs)
: $this->colorBlendScreen($cb - 1, $cs);
}
public function softlight($color1, $color2){
return $this->colorBlend( array($this,'colorBlendSoftlight'), $color1, $color2 );
}
private function colorBlendSoftlight($cb, $cs ){
$d = 1;
$e = $cb;
if( $cs > 0.5 ){
$e = 1;
$d = ($cb > 0.25) ? sqrt($cb)
: ((16 * $cb - 12) * $cb + 4) * $cb;
}
return $cb - (1 - 2 * $cs) * $e * ($d - $cb);
}
public function hardlight($color1, $color2){
return $this->colorBlend( array($this,'colorBlendHardlight'), $color1, $color2 );
}
private function colorBlendHardlight( $cb, $cs ){
return $this->colorBlendOverlay($cs, $cb);
}
public function difference($color1, $color2) {
return $this->colorBlend( array($this,'colorBlendDifference'), $color1, $color2 );
}
private function colorBlendDifference( $cb, $cs ){
return abs($cb - $cs);
}
public function exclusion( $color1, $color2 ){
return $this->colorBlend( array($this,'colorBlendExclusion'), $color1, $color2 );
}
private function colorBlendExclusion( $cb, $cs ){
return $cb + $cs - 2 * $cb * $cs;
}
public function average($color1, $color2){
return $this->colorBlend( array($this,'colorBlendAverage'), $color1, $color2 );
}
// non-w3c functions:
function colorBlendAverage($cb, $cs ){
return ($cb + $cs) / 2;
}
public function negation($color1, $color2 ){
return $this->colorBlend( array($this,'colorBlendNegation'), $color1, $color2 );
}
function colorBlendNegation($cb, $cs){
return 1 - abs($cb + $cs - 1);
}
// ~ End of Color Blending
}
/**
* Mime lookup
*
* @package Less
* @subpackage node
*/
class Less_Mime{
// this map is intentionally incomplete
// if you want more, install 'mime' dep
static $_types = array(
'.htm' => 'text/html',
'.html'=> 'text/html',
'.gif' => 'image/gif',
'.jpg' => 'image/jpeg',
'.jpeg'=> 'image/jpeg',
'.png' => 'image/png'
);
static function lookup( $filepath ){
$parts = explode('.',$filepath);
$ext = '.'.strtolower(array_pop($parts));
if( !isset(self::$_types[$ext]) ){
return null;
}
return self::$_types[$ext];
}
static function charsets_lookup( $type = null ){
// assumes all text types are UTF-8
return $type && preg_match('/^text\//',$type) ? 'UTF-8' : '';
}
}
/**
* Tree
*
* @package Less
* @subpackage tree
*/
class Less_Tree{
public $cache_string;
public function toCSS(){
$output = new Less_Output();
$this->genCSS($output);
return $output->toString();
}
/**
* Generate CSS by adding it to the output object
*
* @param Less_Output $output The output
* @return void
*/
public function genCSS($output){}
/**
* @param Less_Tree_Ruleset[] $rules
*/
public static function outputRuleset( $output, $rules ){
$ruleCnt = count($rules);
Less_Environment::$tabLevel++;
// Compressed
if( Less_Parser::$options['compress'] ){
$output->add('{');
for( $i = 0; $i < $ruleCnt; $i++ ){
$rules[$i]->genCSS( $output );
}
$output->add( '}' );
Less_Environment::$tabLevel--;
return;
}
// Non-compressed
$tabSetStr = "\n".str_repeat( ' ' , Less_Environment::$tabLevel-1 );
$tabRuleStr = $tabSetStr.' ';
$output->add( " {" );
for($i = 0; $i < $ruleCnt; $i++ ){
$output->add( $tabRuleStr );
$rules[$i]->genCSS( $output );
}
Less_Environment::$tabLevel--;
$output->add( $tabSetStr.'}' );
}
public function accept($visitor){}
public static function ReferencedArray($rules){
foreach($rules as $rule){
if( method_exists($rule, 'markReferenced') ){
$rule->markReferenced();
}
}
}
/**
* Requires php 5.3+
*/
public static function __set_state($args){
$class = get_called_class();
$obj = new $class(null,null,null,null);
foreach($args as $key => $val){
$obj->$key = $val;
}
return $obj;
}
}
/**
* Parser output
*
* @package Less
* @subpackage output
*/
class Less_Output{
/**
* Output holder
*
* @var string
*/
protected $strs = array();
/**
* Adds a chunk to the stack
*
* @param string $chunk The chunk to output
* @param Less_FileInfo $fileInfo The file information
* @param integer $index The index
* @param mixed $mapLines
*/
public function add($chunk, $fileInfo = null, $index = 0, $mapLines = null){
$this->strs[] = $chunk;
}
/**
* Is the output empty?
*
* @return boolean
*/
public function isEmpty(){
return count($this->strs) === 0;
}
/**
* Converts the output to string
*
* @return string
*/
public function toString(){
return implode('',$this->strs);
}
}
/**
* Visitor
*
* @package Less
* @subpackage visitor
*/
class Less_Visitor{
var $methods = array();
var $_visitFnCache = array();
function __construct(){
$this->_visitFnCache = get_class_methods(get_class($this));
$this->_visitFnCache = array_flip($this->_visitFnCache);
}
function visitObj( $node ){
$funcName = 'visit'.$node->type;
if( isset($this->_visitFnCache[$funcName]) ){
$visitDeeper = true;
$this->$funcName( $node, $visitDeeper );
if( $visitDeeper ){
$node->accept($this);
}
$funcName = $funcName . "Out";
if( isset($this->_visitFnCache[$funcName]) ){
$this->$funcName( $node );
}
}else{
$node->accept($this);
}
return $node;
}
function visitArray( $nodes ){
array_map( array($this,'visitObj'), $nodes);
return $nodes;
}
}
/**
* Replacing Visitor
*
* @package Less
* @subpackage visitor
*/
class Less_VisitorReplacing extends Less_Visitor{
function visitObj( $node ){
$funcName = 'visit'.$node->type;
if( isset($this->_visitFnCache[$funcName]) ){
$visitDeeper = true;
$node = $this->$funcName( $node, $visitDeeper );
if( $node ){
if( $visitDeeper && is_object($node) ){
$node->accept($this);
}
$funcName = $funcName . "Out";
if( isset($this->_visitFnCache[$funcName]) ){
$this->$funcName( $node );
}
}
}else{
$node->accept($this);
}
return $node;
}
function visitArray( $nodes ){
$newNodes = array();
foreach($nodes as $node){
$evald = $this->visitObj($node);
if( $evald ){
if( is_array($evald) ){
self::flatten($evald,$newNodes);
}else{
$newNodes[] = $evald;
}
}
}
return $newNodes;
}
function flatten( $arr, &$out ){
foreach($arr as $item){
if( !is_array($item) ){
$out[] = $item;
continue;
}
foreach($item as $nestedItem){
if( is_array($nestedItem) ){
self::flatten( $nestedItem, $out);
}else{
$out[] = $nestedItem;
}
}
}
return $out;
}
}
/**
* Configurable
*
* @package Less
* @subpackage Core
*/
abstract class Less_Configurable {
/**
* Array of options
*
* @var array
*/
protected $options = array();
/**
* Array of default options
*
* @var array
*/
protected $defaultOptions = array();
/**
* Set options
*
* If $options is an object it will be converted into an array by called
* it's toArray method.
*
* @throws Exception
* @param array|object $options
*
*/
public function setOptions($options){
$options = array_intersect_key($options,$this->defaultOptions);
$this->options = array_merge($this->defaultOptions, $this->options, $options);
}
/**
* Get an option value by name
*
* If the option is empty or not set a NULL value will be returned.
*
* @param string $name
* @param mixed $default Default value if confiuration of $name is not present
* @return mixed
*/
public function getOption($name, $default = null){
if(isset($this->options[$name])){
return $this->options[$name];
}
return $default;
}
/**
* Set an option
*
* @param string $name
* @param mixed $value
*/
public function setOption($name, $value){
$this->options[$name] = $value;
}
}
/**
* Alpha
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Alpha extends Less_Tree{
public $value;
public $type = 'Alpha';
public function __construct($val){
$this->value = $val;
}
//function accept( $visitor ){
// $this->value = $visitor->visit( $this->value );
//}
public function compile($env){
if( is_object($this->value) ){
$this->value = $this->value->compile($env);
}
return $this;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
$output->add( "alpha(opacity=" );
if( is_string($this->value) ){
$output->add( $this->value );
}else{
$this->value->genCSS( $output);
}
$output->add( ')' );
}
public function toCSS(){
return "alpha(opacity=" . (is_string($this->value) ? $this->value : $this->value->toCSS()) . ")";
}
}
/**
* Anonymous
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Anonymous extends Less_Tree{
public $value;
public $quote;
public $index;
public $mapLines;
public $currentFileInfo;
public $type = 'Anonymous';
/**
* @param integer $index
* @param boolean $mapLines
*/
public function __construct($value, $index = null, $currentFileInfo = null, $mapLines = null ){
$this->value = $value;
$this->index = $index;
$this->mapLines = $mapLines;
$this->currentFileInfo = $currentFileInfo;
}
public function compile(){
return new Less_Tree_Anonymous($this->value, $this->index, $this->currentFileInfo, $this->mapLines);
}
function compare($x){
if( !is_object($x) ){
return -1;
}
$left = $this->toCSS();
$right = $x->toCSS();
if( $left === $right ){
return 0;
}
return $left < $right ? -1 : 1;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
$output->add( $this->value, $this->currentFileInfo, $this->index, $this->mapLines );
}
public function toCSS(){
return $this->value;
}
}
/**
* Assignment
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Assignment extends Less_Tree{
public $key;
public $value;
public $type = 'Assignment';
function __construct($key, $val) {
$this->key = $key;
$this->value = $val;
}
function accept( $visitor ){
$this->value = $visitor->visitObj( $this->value );
}
public function compile($env) {
return new Less_Tree_Assignment( $this->key, $this->value->compile($env));
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
$output->add( $this->key . '=' );
$this->value->genCSS( $output );
}
public function toCss(){
return $this->key . '=' . $this->value->toCSS();
}
}
/**
* Attribute
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Attribute extends Less_Tree{
public $key;
public $op;
public $value;
public $type = 'Attribute';
function __construct($key, $op, $value){
$this->key = $key;
$this->op = $op;
$this->value = $value;
}
function compile($env){
$key_obj = is_object($this->key);
$val_obj = is_object($this->value);
if( !$key_obj && !$val_obj ){
return $this;
}
return new Less_Tree_Attribute(
$key_obj ? $this->key->compile($env) : $this->key ,
$this->op,
$val_obj ? $this->value->compile($env) : $this->value);
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$output->add( $this->toCSS() );
}
function toCSS(){
$value = $this->key;
if( $this->op ){
$value .= $this->op;
$value .= (is_object($this->value) ? $this->value->toCSS() : $this->value);
}
return '[' . $value . ']';
}
}
/**
* Call
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Call extends Less_Tree{
public $value;
var $name;
var $args;
var $index;
var $currentFileInfo;
public $type = 'Call';
public $parensInOp;
public function __construct($name, $args, $index, $currentFileInfo = null ){
$this->name = $name;
$this->args = $args;
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
}
function accept( $visitor ){
$this->args = $visitor->visitArray( $this->args );
}
//
// When evaluating a function call,
// we either find the function in `tree.functions` [1],
// in which case we call it, passing the evaluated arguments,
// or we simply print it out as it appeared originally [2].
//
// The *functions.js* file contains the built-in functions.
//
// The reason why we evaluate the arguments, is in the case where
// we try to pass a variable to a function, like: `saturate(@color)`.
// The function should receive the value, not the variable.
//
public function compile($env=null){
$args = array();
foreach($this->args as $a){
$args[] = $a->compile($env);
}
$nameLC = strtolower($this->name);
switch($nameLC){
case '%':
$nameLC = '_percent';
break;
case 'get-unit':
$nameLC = 'getunit';
break;
case 'data-uri':
$nameLC = 'datauri';
break;
case 'svg-gradient':
$nameLC = 'svggradient';
break;
}
$result = null;
if( $nameLC === 'default' ){
$result = Less_Tree_DefaultFunc::compile();
}else{
if( method_exists('Less_Functions',$nameLC) ){ // 1.
try {
$func = new Less_Functions($env, $this->currentFileInfo);
$result = call_user_func_array( array($func,$nameLC),$args);
} catch (Exception $e) {
throw new Less_Exception_Compiler('error evaluating function `' . $this->name . '` '.$e->getMessage().' index: '. $this->index);
}
}
}
if( $result !== null ){
return $result;
}
return new Less_Tree_Call( $this->name, $args, $this->index, $this->currentFileInfo );
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
$output->add( $this->name . '(', $this->currentFileInfo, $this->index );
$args_len = count($this->args);
for($i = 0; $i < $args_len; $i++ ){
$this->args[$i]->genCSS( $output );
if( $i + 1 < $args_len ){
$output->add( ', ' );
}
}
$output->add( ')' );
}
//public function toCSS(){
// return $this->compile()->toCSS();
//}
}
/**
* Color
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Color extends Less_Tree{
public $rgb;
public $alpha;
public $isTransparentKeyword;
public $type = 'Color';
public function __construct($rgb, $a = 1, $isTransparentKeyword = null ){
if( $isTransparentKeyword ){
$this->rgb = $rgb;
$this->alpha = $a;
$this->isTransparentKeyword = true;
return;
}
$this->rgb = array();
if( is_array($rgb) ){
$this->rgb = $rgb;
}else if( strlen($rgb) == 6 ){
foreach(str_split($rgb, 2) as $c){
$this->rgb[] = hexdec($c);
}
}else{
foreach(str_split($rgb, 1) as $c){
$this->rgb[] = hexdec($c.$c);
}
}
$this->alpha = is_numeric($a) ? $a : 1;
}
public function compile(){
return $this;
}
public function luma(){
$r = $this->rgb[0] / 255;
$g = $this->rgb[1] / 255;
$b = $this->rgb[2] / 255;
$r = ($r <= 0.03928) ? $r / 12.92 : pow((($r + 0.055) / 1.055), 2.4);
$g = ($g <= 0.03928) ? $g / 12.92 : pow((($g + 0.055) / 1.055), 2.4);
$b = ($b <= 0.03928) ? $b / 12.92 : pow((($b + 0.055) / 1.055), 2.4);
return 0.2126 * $r + 0.7152 * $g + 0.0722 * $b;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
$output->add( $this->toCSS() );
}
public function toCSS( $doNotCompress = false ){
$compress = Less_Parser::$options['compress'] && !$doNotCompress;
$alpha = Less_Functions::fround( $this->alpha );
//
// If we have some transparency, the only way to represent it
// is via `rgba`. Otherwise, we use the hex representation,
// which has better compatibility with older browsers.
// Values are capped between `0` and `255`, rounded and zero-padded.
//
if( $alpha < 1 ){
if( $alpha === 0 && isset($this->isTransparentKeyword) && $this->isTransparentKeyword ){
return 'transparent';
}
$values = array();
foreach($this->rgb as $c){
$values[] = Less_Functions::clamp( round($c), 255);
}
$values[] = $alpha;
$glue = ($compress ? ',' : ', ');
return "rgba(" . implode($glue, $values) . ")";
}else{
$color = $this->toRGB();
if( $compress ){
// Convert color to short format
if( $color[1] === $color[2] && $color[3] === $color[4] && $color[5] === $color[6]) {
$color = '#'.$color[1] . $color[3] . $color[5];
}
}
return $color;
}
}
//
// Operations have to be done per-channel, if not,
// channels will spill onto each other. Once we have
// our result, in the form of an integer triplet,
// we create a new Color node to hold the result.
//
/**
* @param string $op
*/
public function operate( $op, $other) {
$rgb = array();
$alpha = $this->alpha * (1 - $other->alpha) + $other->alpha;
for ($c = 0; $c < 3; $c++) {
$rgb[$c] = Less_Functions::operate( $op, $this->rgb[$c], $other->rgb[$c]);
}
return new Less_Tree_Color($rgb, $alpha);
}
public function toRGB(){
return $this->toHex($this->rgb);
}
public function toHSL(){
$r = $this->rgb[0] / 255;
$g = $this->rgb[1] / 255;
$b = $this->rgb[2] / 255;
$a = $this->alpha;
$max = max($r, $g, $b);
$min = min($r, $g, $b);
$l = ($max + $min) / 2;
$d = $max - $min;
$h = $s = 0;
if( $max !== $min ){
$s = $l > 0.5 ? $d / (2 - $max - $min) : $d / ($max + $min);
switch ($max) {
case $r: $h = ($g - $b) / $d + ($g < $b ? 6 : 0); break;
case $g: $h = ($b - $r) / $d + 2; break;
case $b: $h = ($r - $g) / $d + 4; break;
}
$h /= 6;
}
return array('h' => $h * 360, 's' => $s, 'l' => $l, 'a' => $a );
}
//Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
function toHSV() {
$r = $this->rgb[0] / 255;
$g = $this->rgb[1] / 255;
$b = $this->rgb[2] / 255;
$a = $this->alpha;
$max = max($r, $g, $b);
$min = min($r, $g, $b);
$v = $max;
$d = $max - $min;
if ($max === 0) {
$s = 0;
} else {
$s = $d / $max;
}
$h = 0;
if( $max !== $min ){
switch($max){
case $r: $h = ($g - $b) / $d + ($g < $b ? 6 : 0); break;
case $g: $h = ($b - $r) / $d + 2; break;
case $b: $h = ($r - $g) / $d + 4; break;
}
$h /= 6;
}
return array('h'=> $h * 360, 's'=> $s, 'v'=> $v, 'a' => $a );
}
public function toARGB(){
$argb = array_merge( (array) Less_Parser::round($this->alpha * 255), $this->rgb);
return $this->toHex( $argb );
}
public function compare($x){
if( !property_exists( $x, 'rgb' ) ){
return -1;
}
return ($x->rgb[0] === $this->rgb[0] &&
$x->rgb[1] === $this->rgb[1] &&
$x->rgb[2] === $this->rgb[2] &&
$x->alpha === $this->alpha) ? 0 : -1;
}
function toHex( $v ){
$ret = '#';
foreach($v as $c){
$c = Less_Functions::clamp( Less_Parser::round($c), 255);
if( $c < 16 ){
$ret .= '0';
}
$ret .= dechex($c);
}
return $ret;
}
/**
* @param string $keyword
*/
public static function fromKeyword( $keyword ){
$keyword = strtolower($keyword);
if( Less_Colors::hasOwnProperty($keyword) ){
// detect named color
return new Less_Tree_Color(substr(Less_Colors::color($keyword), 1));
}
if( $keyword === 'transparent' ){
return new Less_Tree_Color( array(0, 0, 0), 0, true);
}
}
}
/**
* Comment
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Comment extends Less_Tree{
public $value;
public $silent;
public $isReferenced;
public $currentFileInfo;
public $type = 'Comment';
public function __construct($value, $silent, $index = null, $currentFileInfo = null ){
$this->value = $value;
$this->silent = !! $silent;
$this->currentFileInfo = $currentFileInfo;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
//if( $this->debugInfo ){
//$output->add( tree.debugInfo($env, $this), $this->currentFileInfo, $this->index);
//}
$output->add( trim($this->value) );//TODO shouldn't need to trim, we shouldn't grab the \n
}
public function toCSS(){
return Less_Parser::$options['compress'] ? '' : $this->value;
}
public function isSilent(){
$isReference = ($this->currentFileInfo && isset($this->currentFileInfo['reference']) && (!isset($this->isReferenced) || !$this->isReferenced) );
$isCompressed = Less_Parser::$options['compress'] && !preg_match('/^\/\*!/', $this->value);
return $this->silent || $isReference || $isCompressed;
}
public function compile(){
return $this;
}
public function markReferenced(){
$this->isReferenced = true;
}
}
/**
* Condition
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Condition extends Less_Tree{
public $op;
public $lvalue;
public $rvalue;
public $index;
public $negate;
public $type = 'Condition';
public function __construct($op, $l, $r, $i = 0, $negate = false) {
$this->op = trim($op);
$this->lvalue = $l;
$this->rvalue = $r;
$this->index = $i;
$this->negate = $negate;
}
public function accept($visitor){
$this->lvalue = $visitor->visitObj( $this->lvalue );
$this->rvalue = $visitor->visitObj( $this->rvalue );
}
public function compile($env) {
$a = $this->lvalue->compile($env);
$b = $this->rvalue->compile($env);
switch( $this->op ){
case 'and':
$result = $a && $b;
break;
case 'or':
$result = $a || $b;
break;
default:
if( Less_Parser::is_method($a, 'compare') ){
$result = $a->compare($b);
}elseif( Less_Parser::is_method($b, 'compare') ){
$result = $b->compare($a);
}else{
throw new Less_Exception_Compiler('Unable to perform comparison', null, $this->index);
}
switch ($result) {
case -1:
$result = $this->op === '<' || $this->op === '=<' || $this->op === '<=';
break;
case 0:
$result = $this->op === '=' || $this->op === '>=' || $this->op === '=<' || $this->op === '<=';
break;
case 1:
$result = $this->op === '>' || $this->op === '>=';
break;
}
break;
}
return $this->negate ? !$result : $result;
}
}
/**
* DefaultFunc
*
* @package Less
* @subpackage tree
*/
class Less_Tree_DefaultFunc{
static $error_;
static $value_;
static function compile(){
if( self::$error_ ){
throw Exception(self::$error_);
}
if( self::$value_ !== null ){
return self::$value_ ? new Less_Tree_Keyword('true') : new Less_Tree_Keyword('false');
}
}
static function value( $v ){
self::$value_ = $v;
}
static function error( $e ){
self::$error_ = $e;
}
static function reset(){
self::$value_ = self::$error_ = null;
}
}
/**
* DetachedRuleset
*
* @package Less
* @subpackage tree
*/
class Less_Tree_DetachedRuleset extends Less_Tree{
public $ruleset;
public $frames;
public $type = 'DetachedRuleset';
function __construct( $ruleset, $frames = null ){
$this->ruleset = $ruleset;
$this->frames = $frames;
}
function accept($visitor) {
$this->ruleset = $visitor->visitObj($this->ruleset);
}
function compile($env){
if( $this->frames ){
$frames = $this->frames;
}else{
$frames = $env->frames;
}
return new Less_Tree_DetachedRuleset($this->ruleset, $frames);
}
function callEval($env) {
if( $this->frames ){
return $this->ruleset->compile( $env->copyEvalEnv( array_merge($this->frames,$env->frames) ) );
}
return $this->ruleset->compile( $env );
}
}
/**
* Dimension
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Dimension extends Less_Tree{
public $value;
public $unit;
public $type = 'Dimension';
public $parensInOp;
public function __construct($value, $unit = null){
$this->value = floatval($value);
if( $unit && ($unit instanceof Less_Tree_Unit) ){
$this->unit = $unit;
}elseif( $unit ){
$this->unit = new Less_Tree_Unit( array($unit) );
}else{
$this->unit = new Less_Tree_Unit( );
}
}
function accept( $visitor ){
$this->unit = $visitor->visitObj( $this->unit );
}
public function compile(){
return $this;
}
public function toColor() {
return new Less_Tree_Color(array($this->value, $this->value, $this->value));
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
if( Less_Parser::$options['strictUnits'] && !$this->unit->isSingular() ){
throw new Less_Exception_Compiler("Multiple units in dimension. Correct the units or use the unit function. Bad unit: ".$this->unit->toString());
}
$value = Less_Functions::fround( $this->value );
$strValue = (string)$value;
if( $value !== 0 && $value < 0.000001 && $value > -0.000001 ){
// would be output 1e-6 etc.
$strValue = number_format($strValue,10);
$strValue = preg_replace('/\.?0+$/','', $strValue);
}
if( Less_Parser::$options['compress'] ){
// Zero values doesn't need a unit
if( $value === 0 && $this->unit->isLength() ){
$output->add( $strValue );
return $strValue;
}
// Float values doesn't need a leading zero
if( $value > 0 && $value < 1 && $strValue[0] === '0' ){
$strValue = substr($strValue,1);
}
}
$output->add( $strValue );
$this->unit->genCSS( $output );
}
public function __toString(){
return $this->toCSS();
}
// In an operation between two Dimensions,
// we default to the first Dimension's unit,
// so `1px + 2em` will yield `3px`.
/**
* @param string $op
*/
public function operate( $op, $other){
$value = Less_Functions::operate( $op, $this->value, $other->value);
$unit = clone $this->unit;
if( $op === '+' || $op === '-' ){
if( !$unit->numerator && !$unit->denominator ){
$unit->numerator = $other->unit->numerator;
$unit->denominator = $other->unit->denominator;
}elseif( !$other->unit->numerator && !$other->unit->denominator ){
// do nothing
}else{
$other = $other->convertTo( $this->unit->usedUnits());
if( Less_Parser::$options['strictUnits'] && $other->unit->toString() !== $unit->toCSS() ){
throw new Less_Exception_Compiler("Incompatible units. Change the units or use the unit function. Bad units: '".$unit->toString() . "' and ".$other->unit->toString()+"'.");
}
$value = Less_Functions::operate( $op, $this->value, $other->value);
}
}elseif( $op === '*' ){
$unit->numerator = array_merge($unit->numerator, $other->unit->numerator);
$unit->denominator = array_merge($unit->denominator, $other->unit->denominator);
sort($unit->numerator);
sort($unit->denominator);
$unit->cancel();
}elseif( $op === '/' ){
$unit->numerator = array_merge($unit->numerator, $other->unit->denominator);
$unit->denominator = array_merge($unit->denominator, $other->unit->numerator);
sort($unit->numerator);
sort($unit->denominator);
$unit->cancel();
}
return new Less_Tree_Dimension( $value, $unit);
}
public function compare($other) {
if ($other instanceof Less_Tree_Dimension) {
if( $this->unit->isEmpty() || $other->unit->isEmpty() ){
$a = $this;
$b = $other;
} else {
$a = $this->unify();
$b = $other->unify();
if( $a->unit->compare($b->unit) !== 0 ){
return -1;
}
}
$aValue = $a->value;
$bValue = $b->value;
if ($bValue > $aValue) {
return -1;
} elseif ($bValue < $aValue) {
return 1;
} else {
return 0;
}
} else {
return -1;
}
}
function unify() {
return $this->convertTo(array('length'=> 'px', 'duration'=> 's', 'angle' => 'rad' ));
}
function convertTo($conversions) {
$value = $this->value;
$unit = clone $this->unit;
if( is_string($conversions) ){
$derivedConversions = array();
foreach( Less_Tree_UnitConversions::$groups as $i ){
if( isset(Less_Tree_UnitConversions::${$i}[$conversions]) ){
$derivedConversions = array( $i => $conversions);
}
}
$conversions = $derivedConversions;
}
foreach($conversions as $groupName => $targetUnit){
$group = Less_Tree_UnitConversions::${$groupName};
//numerator
foreach($unit->numerator as $i => $atomicUnit){
$atomicUnit = $unit->numerator[$i];
if( !isset($group[$atomicUnit]) ){
continue;
}
$value = $value * ($group[$atomicUnit] / $group[$targetUnit]);
$unit->numerator[$i] = $targetUnit;
}
//denominator
foreach($unit->denominator as $i => $atomicUnit){
$atomicUnit = $unit->denominator[$i];
if( !isset($group[$atomicUnit]) ){
continue;
}
$value = $value / ($group[$atomicUnit] / $group[$targetUnit]);
$unit->denominator[$i] = $targetUnit;
}
}
$unit->cancel();
return new Less_Tree_Dimension( $value, $unit);
}
}
/**
* Directive
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Directive extends Less_Tree{
public $name;
public $value;
public $rules;
public $index;
public $isReferenced;
public $currentFileInfo;
public $debugInfo;
public $type = 'Directive';
public $allExtends;
public function __construct($name, $value, $rules, $index = null, $currentFileInfo = null, $debugInfo = null ){
$this->name = $name;
$this->value = $value;
if( $rules ){
$this->rules = $rules;
$this->rules->allowImports = true;
}
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
$this->debugInfo = $debugInfo;
}
function accept( $visitor ){
if( $this->rules ){
$this->rules = $visitor->visitObj( $this->rules );
}
if( $this->value ){
$this->value = $visitor->visitObj( $this->value );
}
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$value = $this->value;
$rules = $this->rules;
$output->add( $this->name, $this->currentFileInfo, $this->index );
if( $this->value ){
$output->add(' ');
$this->value->genCSS($output);
}
if( $this->rules ){
Less_Tree::outputRuleset( $output, array($this->rules));
} else {
$output->add(';');
}
}
public function compile($env){
$value = $this->value;
$rules = $this->rules;
if( $value ){
$value = $value->compile($env);
}
if( $rules ){
$rules = $rules->compile($env);
$rules->root = true;
}
return new Less_Tree_Directive( $this->name, $value, $rules, $this->index, $this->currentFileInfo, $this->debugInfo );
}
public function variable($name){
if( $this->rules ){
return $this->rules->variable($name);
}
}
public function find($selector){
if( $this->rules ){
return $this->rules->find($selector, $this);
}
}
//rulesets: function () { if (this.rules) return tree.Ruleset.prototype.rulesets.apply(this.rules); },
public function markReferenced(){
$this->isReferenced = true;
if( $this->rules ){
Less_Tree::ReferencedArray($this->rules->rules);
}
}
}
/**
* Element
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Element extends Less_Tree{
public $combinator = '';
public $value = '';
public $index;
public $currentFileInfo;
public $type = 'Element';
public $value_is_object = false;
public function __construct($combinator, $value, $index = null, $currentFileInfo = null ){
$this->value = $value;
$this->value_is_object = is_object($value);
if( $combinator ){
$this->combinator = $combinator;
}
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
}
function accept( $visitor ){
if( $this->value_is_object ){ //object or string
$this->value = $visitor->visitObj( $this->value );
}
}
public function compile($env){
if( Less_Environment::$mixin_stack ){
return new Less_Tree_Element($this->combinator, ($this->value_is_object ? $this->value->compile($env) : $this->value), $this->index, $this->currentFileInfo );
}
if( $this->value_is_object ){
$this->value = $this->value->compile($env);
}
return $this;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
$output->add( $this->toCSS(), $this->currentFileInfo, $this->index );
}
public function toCSS(){
if( $this->value_is_object ){
$value = $this->value->toCSS();
}else{
$value = $this->value;
}
if( $value === '' && $this->combinator && $this->combinator === '&' ){
return '';
}
return Less_Environment::$_outputMap[$this->combinator] . $value;
}
}
/**
* Expression
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Expression extends Less_Tree{
public $value = array();
public $parens = false;
public $parensInOp = false;
public $type = 'Expression';
public function __construct( $value, $parens = null ){
$this->value = $value;
$this->parens = $parens;
}
function accept( $visitor ){
$this->value = $visitor->visitArray( $this->value );
}
public function compile($env) {
$doubleParen = false;
if( $this->parens && !$this->parensInOp ){
Less_Environment::$parensStack++;
}
$returnValue = null;
if( $this->value ){
$count = count($this->value);
if( $count > 1 ){
$ret = array();
foreach($this->value as $e){
$ret[] = $e->compile($env);
}
$returnValue = new Less_Tree_Expression($ret);
}else{
if( ($this->value[0] instanceof Less_Tree_Expression) && $this->value[0]->parens && !$this->value[0]->parensInOp ){
$doubleParen = true;
}
$returnValue = $this->value[0]->compile($env);
}
} else {
$returnValue = $this;
}
if( $this->parens ){
if( !$this->parensInOp ){
Less_Environment::$parensStack--;
}elseif( !Less_Environment::isMathOn() && !$doubleParen ){
$returnValue = new Less_Tree_Paren($returnValue);
}
}
return $returnValue;
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$val_len = count($this->value);
for( $i = 0; $i < $val_len; $i++ ){
$this->value[$i]->genCSS( $output );
if( $i + 1 < $val_len ){
$output->add( ' ' );
}
}
}
function throwAwayComments() {
if( is_array($this->value) ){
$new_value = array();
foreach($this->value as $v){
if( $v instanceof Less_Tree_Comment ){
continue;
}
$new_value[] = $v;
}
$this->value = $new_value;
}
}
}
/**
* Extend
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Extend extends Less_Tree{
public $selector;
public $option;
public $index;
public $selfSelectors = array();
public $allowBefore;
public $allowAfter;
public $firstExtendOnThisSelectorPath;
public $type = 'Extend';
public $ruleset;
public $object_id;
public $parent_ids = array();
/**
* @param integer $index
*/
function __construct($selector, $option, $index){
static $i = 0;
$this->selector = $selector;
$this->option = $option;
$this->index = $index;
switch($option){
case "all":
$this->allowBefore = true;
$this->allowAfter = true;
break;
default:
$this->allowBefore = false;
$this->allowAfter = false;
break;
}
$this->object_id = $i++;
$this->parent_ids = array($this->object_id);
}
function accept( $visitor ){
$this->selector = $visitor->visitObj( $this->selector );
}
function compile( $env ){
Less_Parser::$has_extends = true;
$this->selector = $this->selector->compile($env);
return $this;
//return new Less_Tree_Extend( $this->selector->compile($env), $this->option, $this->index);
}
function findSelfSelectors( $selectors ){
$selfElements = array();
for( $i = 0, $selectors_len = count($selectors); $i < $selectors_len; $i++ ){
$selectorElements = $selectors[$i]->elements;
// duplicate the logic in genCSS function inside the selector node.
// future TODO - move both logics into the selector joiner visitor
if( $i && $selectorElements && $selectorElements[0]->combinator === "") {
$selectorElements[0]->combinator = ' ';
}
$selfElements = array_merge( $selfElements, $selectors[$i]->elements );
}
$this->selfSelectors = array(new Less_Tree_Selector($selfElements));
}
}
/**
* CSS @import node
*
* The general strategy here is that we don't want to wait
* for the parsing to be completed, before we start importing
* the file. That's because in the context of a browser,
* most of the time will be spent waiting for the server to respond.
*
* On creation, we push the import path to our import queue, though
* `import,push`, we also pass it a callback, which it'll call once
* the file has been fetched, and parsed.
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Import extends Less_Tree{
public $options;
public $index;
public $path;
public $features;
public $currentFileInfo;
public $css;
public $skip;
public $root;
public $type = 'Import';
function __construct($path, $features, $options, $index, $currentFileInfo = null ){
$this->options = $options;
$this->index = $index;
$this->path = $path;
$this->features = $features;
$this->currentFileInfo = $currentFileInfo;
if( is_array($options) ){
$this->options += array('inline'=>false);
if( isset($this->options['less']) || $this->options['inline'] ){
$this->css = !isset($this->options['less']) || !$this->options['less'] || $this->options['inline'];
} else {
$pathValue = $this->getPath();
if( $pathValue && preg_match('/css([\?;].*)?$/',$pathValue) ){
$this->css = true;
}
}
}
}
//
// The actual import node doesn't return anything, when converted to CSS.
// The reason is that it's used at the evaluation stage, so that the rules
// it imports can be treated like any other rules.
//
// In `eval`, we make sure all Import nodes get evaluated, recursively, so
// we end up with a flat structure, which can easily be imported in the parent
// ruleset.
//
function accept($visitor){
if( $this->features ){
$this->features = $visitor->visitObj($this->features);
}
$this->path = $visitor->visitObj($this->path);
if( !$this->options['inline'] && $this->root ){
$this->root = $visitor->visit($this->root);
}
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
if( $this->css ){
$output->add( '@import ', $this->currentFileInfo, $this->index );
$this->path->genCSS( $output );
if( $this->features ){
$output->add( ' ' );
$this->features->genCSS( $output );
}
$output->add( ';' );
}
}
function toCSS(){
$features = $this->features ? ' ' . $this->features->toCSS() : '';
if ($this->css) {
return "@import " . $this->path->toCSS() . $features . ";\n";
} else {
return "";
}
}
/**
* @return string
*/
function getPath(){
if ($this->path instanceof Less_Tree_Quoted) {
$path = $this->path->value;
return ( isset($this->css) || preg_match('/(\.[a-z]*$)|([\?;].*)$/',$path)) ? $path : $path . '.less';
} else if ($this->path instanceof Less_Tree_URL) {
return $this->path->value->value;
}
return null;
}
function compileForImport( $env ){
return new Less_Tree_Import( $this->path->compile($env), $this->features, $this->options, $this->index, $this->currentFileInfo);
}
function compilePath($env) {
$path = $this->path->compile($env);
$rootpath = '';
if( $this->currentFileInfo && $this->currentFileInfo['rootpath'] ){
$rootpath = $this->currentFileInfo['rootpath'];
}
if( !($path instanceof Less_Tree_URL) ){
if( $rootpath ){
$pathValue = $path->value;
// Add the base path if the import is relative
if( $pathValue && Less_Environment::isPathRelative($pathValue) ){
$path->value = $this->currentFileInfo['uri_root'].$pathValue;
}
}
$path->value = Less_Environment::normalizePath($path->value);
}
return $path;
}
function compile( $env ){
$evald = $this->compileForImport($env);
//get path & uri
$path_and_uri = null;
if( is_callable(Less_Parser::$options['import_callback']) ){
$path_and_uri = call_user_func(Less_Parser::$options['import_callback'],$evald);
}
if( !$path_and_uri ){
$path_and_uri = $evald->PathAndUri();
}
if( $path_and_uri ){
list($full_path, $uri) = $path_and_uri;
}else{
$full_path = $uri = $evald->getPath();
}
//import once
if( $evald->skip( $full_path, $env) ){
return array();
}
if( $this->options['inline'] ){
//todo needs to reference css file not import
//$contents = new Less_Tree_Anonymous($this->root, 0, array('filename'=>$this->importedFilename), true );
Less_Parser::AddParsedFile($full_path);
$contents = new Less_Tree_Anonymous( file_get_contents($full_path), 0, array(), true );
if( $this->features ){
return new Less_Tree_Media( array($contents), $this->features->value );
}
return array( $contents );
}
// css ?
if( $evald->css ){
$features = ( $evald->features ? $evald->features->compile($env) : null );
return new Less_Tree_Import( $this->compilePath( $env), $features, $this->options, $this->index);
}
return $this->ParseImport( $full_path, $uri, $env );
}
/**
* Using the import directories, get the full absolute path and uri of the import
*
* @param Less_Tree_Import $evald
*/
function PathAndUri(){
$evald_path = $this->getPath();
if( $evald_path ){
$import_dirs = array();
if( Less_Environment::isPathRelative($evald_path) ){
//if the path is relative, the file should be in the current directory
$import_dirs[ $this->currentFileInfo['currentDirectory'] ] = $this->currentFileInfo['uri_root'];
}else{
//otherwise, the file should be relative to the server root
$import_dirs[ $this->currentFileInfo['entryPath'] ] = $this->currentFileInfo['entryUri'];
//if the user supplied entryPath isn't the actual root
$import_dirs[ $_SERVER['DOCUMENT_ROOT'] ] = '';
}
// always look in user supplied import directories
$import_dirs = array_merge( $import_dirs, Less_Parser::$options['import_dirs'] );
foreach( $import_dirs as $rootpath => $rooturi){
if( is_callable($rooturi) ){
list($path, $uri) = call_user_func($rooturi, $evald_path);
if( is_string($path) ){
$full_path = $path;
return array( $full_path, $uri );
}
}else{
$path = rtrim($rootpath,'/\\').'/'.ltrim($evald_path,'/\\');
if( file_exists($path) ){
$full_path = Less_Environment::normalizePath($path);
$uri = Less_Environment::normalizePath(dirname($rooturi.$evald_path));
return array( $full_path, $uri );
}
}
}
}
}
/**
* Parse the import url and return the rules
*
* @return Less_Tree_Media|array
*/
function ParseImport( $full_path, $uri, $env ){
$import_env = clone $env;
if( (isset($this->options['reference']) && $this->options['reference']) || isset($this->currentFileInfo['reference']) ){
$import_env->currentFileInfo['reference'] = true;
}
if( (isset($this->options['multiple']) && $this->options['multiple']) ){
$import_env->importMultiple = true;
}
$parser = new Less_Parser($import_env);
$root = $parser->parseFile($full_path, $uri, true);
$ruleset = new Less_Tree_Ruleset(array(), $root->rules );
$ruleset->evalImports($import_env);
return $this->features ? new Less_Tree_Media($ruleset->rules, $this->features->value) : $ruleset->rules;
}
/**
* Should the import be skipped?
*
* @return boolean|null
*/
private function Skip($path, $env){
$path = realpath($path);
if( $path && Less_Parser::FileParsed($path) ){
if( isset($this->currentFileInfo['reference']) ){
return true;
}
return !isset($this->options['multiple']) && !$env->importMultiple;
}
}
}
/**
* Javascript
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Javascript extends Less_Tree{
public $type = 'Javascript';
public $escaped;
public $expression;
public $index;
/**
* @param boolean $index
* @param boolean $escaped
*/
public function __construct($string, $index, $escaped){
$this->escaped = $escaped;
$this->expression = $string;
$this->index = $index;
}
public function compile(){
return new Less_Tree_Anonymous('/* Sorry, can not do JavaScript evaluation in PHP... :( */');
}
}
/**
* Keyword
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Keyword extends Less_Tree{
public $value;
public $type = 'Keyword';
/**
* @param string $value
*/
public function __construct($value){
$this->value = $value;
}
public function compile(){
return $this;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
if( $this->value === '%') {
throw new Less_Exception_Compiler("Invalid % without number");
}
$output->add( $this->value );
}
public function compare($other) {
if ($other instanceof Less_Tree_Keyword) {
return $other->value === $this->value ? 0 : 1;
} else {
return -1;
}
}
}
/**
* Media
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Media extends Less_Tree{
public $features;
public $rules;
public $index;
public $currentFileInfo;
public $isReferenced;
public $type = 'Media';
public $allExtends;
public function __construct($value = array(), $features = array(), $index = null, $currentFileInfo = null ){
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
$selectors = $this->emptySelectors();
$this->features = new Less_Tree_Value($features);
$this->rules = array(new Less_Tree_Ruleset($selectors, $value));
$this->rules[0]->allowImports = true;
}
function accept( $visitor ){
$this->features = $visitor->visitObj($this->features);
$this->rules = $visitor->visitArray($this->rules);
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$output->add( '@media ', $this->currentFileInfo, $this->index );
$this->features->genCSS( $output );
Less_Tree::outputRuleset( $output, $this->rules);
}
public function compile($env) {
$media = new Less_Tree_Media(array(), array(), $this->index, $this->currentFileInfo );
$strictMathBypass = false;
if( Less_Parser::$options['strictMath'] === false) {
$strictMathBypass = true;
Less_Parser::$options['strictMath'] = true;
}
$media->features = $this->features->compile($env);
if( $strictMathBypass ){
Less_Parser::$options['strictMath'] = false;
}
$env->mediaPath[] = $media;
$env->mediaBlocks[] = $media;
array_unshift($env->frames, $this->rules[0]);
$media->rules = array($this->rules[0]->compile($env));
array_shift($env->frames);
array_pop($env->mediaPath);
return !$env->mediaPath ? $media->compileTop($env) : $media->compileNested($env);
}
public function variable($name) {
return $this->rules[0]->variable($name);
}
public function find($selector) {
return $this->rules[0]->find($selector, $this);
}
public function emptySelectors(){
$el = new Less_Tree_Element('','&', $this->index, $this->currentFileInfo );
$sels = array( new Less_Tree_Selector(array($el), array(), null, $this->index, $this->currentFileInfo) );
$sels[0]->mediaEmpty = true;
return $sels;
}
public function markReferenced(){
$this->rules[0]->markReferenced();
$this->isReferenced = true;
Less_Tree::ReferencedArray($this->rules[0]->rules);
}
// evaltop
public function compileTop($env) {
$result = $this;
if (count($env->mediaBlocks) > 1) {
$selectors = $this->emptySelectors();
$result = new Less_Tree_Ruleset($selectors, $env->mediaBlocks);
$result->multiMedia = true;
}
$env->mediaBlocks = array();
$env->mediaPath = array();
return $result;
}
public function compileNested($env) {
$path = array_merge($env->mediaPath, array($this));
// Extract the media-query conditions separated with `,` (OR).
foreach ($path as $key => $p) {
$value = $p->features instanceof Less_Tree_Value ? $p->features->value : $p->features;
$path[$key] = is_array($value) ? $value : array($value);
}
// Trace all permutations to generate the resulting media-query.
//
// (a, b and c) with nested (d, e) ->
// a and d
// a and e
// b and c and d
// b and c and e
$permuted = $this->permute($path);
$expressions = array();
foreach($permuted as $path){
for( $i=0, $len=count($path); $i < $len; $i++){
$path[$i] = Less_Parser::is_method($path[$i], 'toCSS') ? $path[$i] : new Less_Tree_Anonymous($path[$i]);
}
for( $i = count($path) - 1; $i > 0; $i-- ){
array_splice($path, $i, 0, array(new Less_Tree_Anonymous('and')));
}
$expressions[] = new Less_Tree_Expression($path);
}
$this->features = new Less_Tree_Value($expressions);
// Fake a tree-node that doesn't output anything.
return new Less_Tree_Ruleset(array(), array());
}
public function permute($arr) {
if (!$arr)
return array();
if (count($arr) == 1)
return $arr[0];
$result = array();
$rest = $this->permute(array_slice($arr, 1));
foreach ($rest as $r) {
foreach ($arr[0] as $a) {
$result[] = array_merge(
is_array($a) ? $a : array($a),
is_array($r) ? $r : array($r)
);
}
}
return $result;
}
function bubbleSelectors($selectors) {
if( !$selectors) return;
$this->rules = array(new Less_Tree_Ruleset( $selectors, array($this->rules[0])));
}
}
/**
* A simple css name-value pair
* ex: width:100px;
*
* In bootstrap, there are about 600-1,000 simple name-value pairs (depending on how forgiving the match is) -vs- 6,020 dynamic rules (Less_Tree_Rule)
* Using the name-value object can speed up bootstrap compilation slightly, but it breaks color keyword interpretation: color:red -> color:#FF0000;
*
* @package Less
* @subpackage tree
*/
class Less_Tree_NameValue extends Less_Tree{
public $name;
public $value;
public $index;
public $currentFileInfo;
public $type = 'NameValue';
public function __construct($name, $value = null, $index = null, $currentFileInfo = null ){
$this->name = $name;
$this->value = $value;
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
}
function genCSS( $output ){
$output->add(
$this->name
. Less_Environment::$_outputMap[': ']
. $this->value
. (((Less_Environment::$lastRule && Less_Parser::$options['compress'])) ? "" : ";")
, $this->currentFileInfo, $this->index);
}
public function compile ($env){
return $this;
}
}
/**
* Negative
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Negative extends Less_Tree{
public $parensInOp;
public $value;
public $type = 'Negative';
function __construct($node){
$this->value = $node;
}
//function accept($visitor) {
// $this->value = $visitor->visit($this->value);
//}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$output->add( '-' );
$this->value->genCSS( $output );
}
function compile($env) {
if( Less_Environment::isMathOn() ){
$ret = new Less_Tree_Operation('*', array( new Less_Tree_Dimension(-1), $this->value ) );
return $ret->compile($env);
}
return new Less_Tree_Negative( $this->value->compile($env) );
}
}
/**
* Operation
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Operation extends Less_Tree{
public $parensInOp;
public $op;
public $operands;
public $isSpaced;
public $type = 'Operation';
/**
* @param string $op
*/
public function __construct($op, $operands, $isSpaced = false){
$this->op = trim($op);
$this->operands = $operands;
$this->isSpaced = $isSpaced;
}
function accept($visitor) {
$this->operands = $visitor->visitArray($this->operands);
}
public function compile($env){
$a = $this->operands[0]->compile($env);
$b = $this->operands[1]->compile($env);
if( Less_Environment::isMathOn() ){
if( $a instanceof Less_Tree_Dimension && $b instanceof Less_Tree_Color ){
$a = $a->toColor();
}elseif( $b instanceof Less_Tree_Dimension && $a instanceof Less_Tree_Color ){
$b = $b->toColor();
}
if( !method_exists($a,'operate') ){
throw new Less_Exception_Compiler("Operation on an invalid type");
}
return $a->operate( $this->op, $b);
}
return new Less_Tree_Operation($this->op, array($a, $b), $this->isSpaced );
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$this->operands[0]->genCSS( $output );
if( $this->isSpaced ){
$output->add( " " );
}
$output->add( $this->op );
if( $this->isSpaced ){
$output->add( ' ' );
}
$this->operands[1]->genCSS( $output );
}
}
/**
* Paren
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Paren extends Less_Tree{
public $value;
public $type = 'Paren';
public function __construct($value) {
$this->value = $value;
}
function accept($visitor){
$this->value = $visitor->visitObj($this->value);
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$output->add( '(' );
$this->value->genCSS( $output );
$output->add( ')' );
}
public function compile($env) {
return new Less_Tree_Paren($this->value->compile($env));
}
}
/**
* Quoted
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Quoted extends Less_Tree{
public $escaped;
public $value;
public $quote;
public $index;
public $currentFileInfo;
public $type = 'Quoted';
/**
* @param string $str
*/
public function __construct($str, $content = '', $escaped = false, $index = false, $currentFileInfo = null ){
$this->escaped = $escaped;
$this->value = $content;
if( $str ){
$this->quote = $str[0];
}
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
if( !$this->escaped ){
$output->add( $this->quote, $this->currentFileInfo, $this->index );
}
$output->add( $this->value );
if( !$this->escaped ){
$output->add( $this->quote );
}
}
public function compile($env){
$value = $this->value;
if( preg_match_all('/`([^`]+)`/', $this->value, $matches) ){
foreach($matches as $i => $match){
$js = new Less_Tree_JavaScript($matches[1], $this->index, true);
$js = $js->compile()->value;
$value = str_replace($matches[0][$i], $js, $value);
}
}
if( preg_match_all('/@\{([\w-]+)\}/',$value,$matches) ){
foreach($matches[1] as $i => $match){
$v = new Less_Tree_Variable('@' . $match, $this->index, $this->currentFileInfo );
$v = $v->compile($env);
$v = ($v instanceof Less_Tree_Quoted) ? $v->value : $v->toCSS();
$value = str_replace($matches[0][$i], $v, $value);
}
}
return new Less_Tree_Quoted($this->quote . $value . $this->quote, $value, $this->escaped, $this->index, $this->currentFileInfo);
}
function compare($x) {
if( !Less_Parser::is_method($x, 'toCSS') ){
return -1;
}
$left = $this->toCSS();
$right = $x->toCSS();
if ($left === $right) {
return 0;
}
return $left < $right ? -1 : 1;
}
}
/**
* Rule
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Rule extends Less_Tree{
public $name;
public $value;
public $important;
public $merge;
public $index;
public $inline;
public $variable;
public $currentFileInfo;
public $type = 'Rule';
/**
* @param string $important
*/
public function __construct($name, $value = null, $important = null, $merge = null, $index = null, $currentFileInfo = null, $inline = false){
$this->name = $name;
$this->value = ($value instanceof Less_Tree_Value || $value instanceof Less_Tree_Ruleset) ? $value : new Less_Tree_Value(array($value));
$this->important = $important ? ' ' . trim($important) : '';
$this->merge = $merge;
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
$this->inline = $inline;
$this->variable = ( is_string($name) && $name[0] === '@');
}
function accept($visitor) {
$this->value = $visitor->visitObj( $this->value );
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$output->add( $this->name . Less_Environment::$_outputMap[': '], $this->currentFileInfo, $this->index);
try{
$this->value->genCSS( $output);
}catch( Less_Exception_Parser $e ){
$e->index = $this->index;
$e->currentFile = $this->currentFileInfo;
throw $e;
}
$output->add( $this->important . (($this->inline || (Less_Environment::$lastRule && Less_Parser::$options['compress'])) ? "" : ";"), $this->currentFileInfo, $this->index);
}
public function compile ($env){
$name = $this->name;
if( is_array($name) ){
// expand 'primitive' name directly to get
// things faster (~10% for benchmark.less):
if( count($name) === 1 && $name[0] instanceof Less_Tree_Keyword ){
$name = $name[0]->value;
}else{
$name = $this->CompileName($env,$name);
}
}
$strictMathBypass = Less_Parser::$options['strictMath'];
if( $name === "font" && !Less_Parser::$options['strictMath'] ){
Less_Parser::$options['strictMath'] = true;
}
try {
$evaldValue = $this->value->compile($env);
if( !$this->variable && $evaldValue->type === "DetachedRuleset") {
throw new Less_Exception_Compiler("Rulesets cannot be evaluated on a property.", null, $this->index, $this->currentFileInfo);
}
if( Less_Environment::$mixin_stack ){
$return = new Less_Tree_Rule($name, $evaldValue, $this->important, $this->merge, $this->index, $this->currentFileInfo, $this->inline);
}else{
$this->name = $name;
$this->value = $evaldValue;
$return = $this;
}
}catch( Less_Exception_Parser $e ){
if( !is_numeric($e->index) ){
$e->index = $this->index;
$e->currentFile = $this->currentFileInfo;
}
throw $e;
}
Less_Parser::$options['strictMath'] = $strictMathBypass;
return $return;
}
function CompileName( $env, $name ){
$output = new Less_Output();
foreach($name as $n){
$n->compile($env)->genCSS($output);
}
return $output->toString();
}
function makeImportant(){
return new Less_Tree_Rule($this->name, $this->value, '!important', $this->merge, $this->index, $this->currentFileInfo, $this->inline);
}
}
/**
* Ruleset
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Ruleset extends Less_Tree{
protected $lookups;
public $_variables;
public $_rulesets;
public $strictImports;
public $selectors;
public $rules;
public $root;
public $allowImports;
public $paths;
public $firstRoot;
public $type = 'Ruleset';
public $multiMedia;
public $allExtends;
public $extendOnEveryPath;
var $ruleset_id;
var $originalRuleset;
var $first_oelements;
public function SetRulesetIndex(){
$this->ruleset_id = Less_Parser::$next_id++;
$this->originalRuleset = $this->ruleset_id;
if( $this->selectors ){
foreach($this->selectors as $sel){
if( $sel->_oelements ){
$this->first_oelements[$sel->_oelements[0]] = true;
}
}
}
}
public function __construct($selectors, $rules, $strictImports = null){
$this->selectors = $selectors;
$this->rules = $rules;
$this->lookups = array();
$this->strictImports = $strictImports;
$this->SetRulesetIndex();
}
function accept( $visitor ){
if( $this->paths ){
$paths_len = count($this->paths);
for($i = 0,$paths_len; $i < $paths_len; $i++ ){
$this->paths[$i] = $visitor->visitArray($this->paths[$i]);
}
}elseif( $this->selectors ){
$this->selectors = $visitor->visitArray($this->selectors);
}
if( $this->rules ){
$this->rules = $visitor->visitArray($this->rules);
}
}
public function compile($env){
$ruleset = $this->PrepareRuleset($env);
// Store the frames around mixin definitions,
// so they can be evaluated like closures when the time comes.
$rsRuleCnt = count($ruleset->rules);
for( $i = 0; $i < $rsRuleCnt; $i++ ){
if( $ruleset->rules[$i] instanceof Less_Tree_Mixin_Definition || $ruleset->rules[$i] instanceof Less_Tree_DetachedRuleset ){
$ruleset->rules[$i] = $ruleset->rules[$i]->compile($env);
}
}
$mediaBlockCount = 0;
if( $env instanceof Less_Environment ){
$mediaBlockCount = count($env->mediaBlocks);
}
// Evaluate mixin calls.
$this->EvalMixinCalls( $ruleset, $env, $rsRuleCnt );
// Evaluate everything else
for( $i=0; $i<$rsRuleCnt; $i++ ){
if(! ($ruleset->rules[$i] instanceof Less_Tree_Mixin_Definition || $ruleset->rules[$i] instanceof Less_Tree_DetachedRuleset) ){
$ruleset->rules[$i] = $ruleset->rules[$i]->compile($env);
}
}
// Evaluate everything else
for( $i=0; $i<$rsRuleCnt; $i++ ){
$rule = $ruleset->rules[$i];
// for rulesets, check if it is a css guard and can be removed
if( $rule instanceof Less_Tree_Ruleset && $rule->selectors && count($rule->selectors) === 1 ){
// check if it can be folded in (e.g. & where)
if( $rule->selectors[0]->isJustParentSelector() ){
array_splice($ruleset->rules,$i--,1);
$rsRuleCnt--;
for($j = 0; $j < count($rule->rules); $j++ ){
$subRule = $rule->rules[$j];
if( !($subRule instanceof Less_Tree_Rule) || !$subRule->variable ){
array_splice($ruleset->rules, ++$i, 0, array($subRule));
$rsRuleCnt++;
}
}
}
}
}
// Pop the stack
$env->shiftFrame();
if ($mediaBlockCount) {
$len = count($env->mediaBlocks);
for($i = $mediaBlockCount; $i < $len; $i++ ){
$env->mediaBlocks[$i]->bubbleSelectors($ruleset->selectors);
}
}
return $ruleset;
}
/**
* Compile Less_Tree_Mixin_Call objects
*
* @param Less_Tree_Ruleset $ruleset
* @param integer $rsRuleCnt
*/
private function EvalMixinCalls( $ruleset, $env, &$rsRuleCnt ){
for($i=0; $i < $rsRuleCnt; $i++){
$rule = $ruleset->rules[$i];
if( $rule instanceof Less_Tree_Mixin_Call ){
$rule = $rule->compile($env);
$temp = array();
foreach($rule as $r){
if( ($r instanceof Less_Tree_Rule) && $r->variable ){
// do not pollute the scope if the variable is
// already there. consider returning false here
// but we need a way to "return" variable from mixins
if( !$ruleset->variable($r->name) ){
$temp[] = $r;
}
}else{
$temp[] = $r;
}
}
$temp_count = count($temp)-1;
array_splice($ruleset->rules, $i, 1, $temp);
$rsRuleCnt += $temp_count;
$i += $temp_count;
$ruleset->resetCache();
}elseif( $rule instanceof Less_Tree_RulesetCall ){
$rule = $rule->compile($env);
$rules = array();
foreach($rule->rules as $r){
if( ($r instanceof Less_Tree_Rule) && $r->variable ){
continue;
}
$rules[] = $r;
}
array_splice($ruleset->rules, $i, 1, $rules);
$temp_count = count($rules);
$rsRuleCnt += $temp_count - 1;
$i += $temp_count-1;
$ruleset->resetCache();
}
}
}
/**
* Compile the selectors and create a new ruleset object for the compile() method
*
*/
private function PrepareRuleset($env){
$hasOnePassingSelector = false;
$selectors = array();
if( $this->selectors ){
Less_Tree_DefaultFunc::error("it is currently only allowed in parametric mixin guards,");
foreach($this->selectors as $s){
$selector = $s->compile($env);
$selectors[] = $selector;
if( $selector->evaldCondition ){
$hasOnePassingSelector = true;
}
}
Less_Tree_DefaultFunc::reset();
} else {
$hasOnePassingSelector = true;
}
if( $this->rules && $hasOnePassingSelector ){
$rules = $this->rules;
}else{
$rules = array();
}
$ruleset = new Less_Tree_Ruleset($selectors, $rules, $this->strictImports);
$ruleset->originalRuleset = $this->ruleset_id;
$ruleset->root = $this->root;
$ruleset->firstRoot = $this->firstRoot;
$ruleset->allowImports = $this->allowImports;
// push the current ruleset to the frames stack
$env->unshiftFrame($ruleset);
// Evaluate imports
if( $ruleset->root || $ruleset->allowImports || !$ruleset->strictImports ){
$ruleset->evalImports($env);
}
return $ruleset;
}
function evalImports($env) {
$rules_len = count($this->rules);
for($i=0; $i < $rules_len; $i++){
$rule = $this->rules[$i];
if( $rule instanceof Less_Tree_Import ){
$rules = $rule->compile($env);
if( is_array($rules) ){
array_splice($this->rules, $i, 1, $rules);
$temp_count = count($rules)-1;
$i += $temp_count;
$rules_len += $temp_count;
}else{
array_splice($this->rules, $i, 1, array($rules));
}
$this->resetCache();
}
}
}
function makeImportant(){
$important_rules = array();
foreach($this->rules as $rule){
if( $rule instanceof Less_Tree_Rule || $rule instanceof Less_Tree_Ruleset ){
$important_rules[] = $rule->makeImportant();
}else{
$important_rules[] = $rule;
}
}
return new Less_Tree_Ruleset($this->selectors, $important_rules, $this->strictImports );
}
public function matchArgs($args){
return !$args;
}
// lets you call a css selector with a guard
public function matchCondition( $args, $env ){
$lastSelector = end($this->selectors);
if( !$lastSelector->evaldCondition ){
return false;
}
if( $lastSelector->condition && !$lastSelector->condition->compile( $env->copyEvalEnv( $env->frames ) ) ){
return false;
}
return true;
}
function resetCache(){
$this->_rulesets = null;
$this->_variables = null;
$this->lookups = array();
}
public function variables(){
$this->_variables = array();
foreach( $this->rules as $r){
if ($r instanceof Less_Tree_Rule && $r->variable === true) {
$this->_variables[$r->name] = $r;
}
}
}
public function variable($name){
if( is_null($this->_variables) ){
$this->variables();
}
return isset($this->_variables[$name]) ? $this->_variables[$name] : null;
}
public function find( $selector, $self = null ){
$key = implode(' ',$selector->_oelements);
if( !isset($this->lookups[$key]) ){
if( !$self ){
$self = $this->ruleset_id;
}
$this->lookups[$key] = array();
$first_oelement = $selector->_oelements[0];
foreach($this->rules as $rule){
if( $rule instanceof Less_Tree_Ruleset && $rule->ruleset_id != $self ){
if( isset($rule->first_oelements[$first_oelement]) ){
foreach( $rule->selectors as $ruleSelector ){
$match = $selector->match($ruleSelector);
if( $match ){
if( $selector->elements_len > $match ){
$this->lookups[$key] = array_merge($this->lookups[$key], $rule->find( new Less_Tree_Selector(array_slice($selector->elements, $match)), $self));
} else {
$this->lookups[$key][] = $rule;
}
break;
}
}
}
}
}
}
return $this->lookups[$key];
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
if( !$this->root ){
Less_Environment::$tabLevel++;
}
$tabRuleStr = $tabSetStr = '';
if( !Less_Parser::$options['compress'] ){
if( Less_Environment::$tabLevel ){
$tabRuleStr = "\n".str_repeat( ' ' , Less_Environment::$tabLevel );
$tabSetStr = "\n".str_repeat( ' ' , Less_Environment::$tabLevel-1 );
}else{
$tabSetStr = $tabRuleStr = "\n";
}
}
$ruleNodes = array();
$rulesetNodes = array();
foreach($this->rules as $rule){
$class = get_class($rule);
if( ($class === 'Less_Tree_Media') || ($class === 'Less_Tree_Directive') || ($this->root && $class === 'Less_Tree_Comment') || ($class === 'Less_Tree_Ruleset' && $rule->rules) ){
$rulesetNodes[] = $rule;
}else{
$ruleNodes[] = $rule;
}
}
// If this is the root node, we don't render
// a selector, or {}.
if( !$this->root ){
/*
debugInfo = tree.debugInfo(env, this, tabSetStr);
if (debugInfo) {
output.add(debugInfo);
output.add(tabSetStr);
}
*/
$paths_len = count($this->paths);
for( $i = 0; $i < $paths_len; $i++ ){
$path = $this->paths[$i];
$firstSelector = true;
foreach($path as $p){
$p->genCSS( $output, $firstSelector );
$firstSelector = false;
}
if( $i + 1 < $paths_len ){
$output->add( ',' . $tabSetStr );
}
}
$output->add( (Less_Parser::$options['compress'] ? '{' : " {") . $tabRuleStr );
}
// Compile rules and rulesets
$ruleNodes_len = count($ruleNodes);
$rulesetNodes_len = count($rulesetNodes);
for( $i = 0; $i < $ruleNodes_len; $i++ ){
$rule = $ruleNodes[$i];
// @page{ directive ends up with root elements inside it, a mix of rules and rulesets
// In this instance we do not know whether it is the last property
if( $i + 1 === $ruleNodes_len && (!$this->root || $rulesetNodes_len === 0 || $this->firstRoot ) ){
Less_Environment::$lastRule = true;
}
$rule->genCSS( $output );
if( !Less_Environment::$lastRule ){
$output->add( $tabRuleStr );
}else{
Less_Environment::$lastRule = false;
}
}
if( !$this->root ){
$output->add( $tabSetStr . '}' );
Less_Environment::$tabLevel--;
}
$firstRuleset = true;
$space = ($this->root ? $tabRuleStr : $tabSetStr);
for( $i = 0; $i < $rulesetNodes_len; $i++ ){
if( $ruleNodes_len && $firstRuleset ){
$output->add( $space );
}elseif( !$firstRuleset ){
$output->add( $space );
}
$firstRuleset = false;
$rulesetNodes[$i]->genCSS( $output);
}
if( !Less_Parser::$options['compress'] && $this->firstRoot ){
$output->add( "\n" );
}
}
function markReferenced(){
if( !$this->selectors ){
return;
}
foreach($this->selectors as $selector){
$selector->markReferenced();
}
}
public function joinSelectors( $context, $selectors ){
$paths = array();
if( is_array($selectors) ){
foreach($selectors as $selector) {
$this->joinSelector( $paths, $context, $selector);
}
}
return $paths;
}
public function joinSelector( &$paths, $context, $selector){
$hasParentSelector = false;
foreach($selector->elements as $el) {
if( $el->value === '&') {
$hasParentSelector = true;
}
}
if( !$hasParentSelector ){
if( $context ){
foreach($context as $context_el){
$paths[] = array_merge($context_el, array($selector) );
}
}else {
$paths[] = array($selector);
}
return;
}
// The paths are [[Selector]]
// The first list is a list of comma seperated selectors
// The inner list is a list of inheritance seperated selectors
// e.g.
// .a, .b {
// .c {
// }
// }
// == [[.a] [.c]] [[.b] [.c]]
//
// the elements from the current selector so far
$currentElements = array();
// the current list of new selectors to add to the path.
// We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
// by the parents
$newSelectors = array(array());
foreach( $selector->elements as $el){
// non parent reference elements just get added
if( $el->value !== '&' ){
$currentElements[] = $el;
} else {
// the new list of selectors to add
$selectorsMultiplied = array();
// merge the current list of non parent selector elements
// on to the current list of selectors to add
if( $currentElements ){
$this->mergeElementsOnToSelectors( $currentElements, $newSelectors);
}
// loop through our current selectors
foreach($newSelectors as $sel){
// if we don't have any parent paths, the & might be in a mixin so that it can be used
// whether there are parents or not
if( !$context ){
// the combinator used on el should now be applied to the next element instead so that
// it is not lost
if( $sel ){
$sel[0]->elements = array_slice($sel[0]->elements,0);
$sel[0]->elements[] = new Less_Tree_Element($el->combinator, '', $el->index, $el->currentFileInfo );
}
$selectorsMultiplied[] = $sel;
}else {
// and the parent selectors
foreach($context as $parentSel){
// We need to put the current selectors
// then join the last selector's elements on to the parents selectors
// our new selector path
$newSelectorPath = array();
// selectors from the parent after the join
$afterParentJoin = array();
$newJoinedSelectorEmpty = true;
//construct the joined selector - if & is the first thing this will be empty,
// if not newJoinedSelector will be the last set of elements in the selector
if( $sel ){
$newSelectorPath = $sel;
$lastSelector = array_pop($newSelectorPath);
$newJoinedSelector = $selector->createDerived( array_slice($lastSelector->elements,0) );
$newJoinedSelectorEmpty = false;
}
else {
$newJoinedSelector = $selector->createDerived(array());
}
//put together the parent selectors after the join
if ( count($parentSel) > 1) {
$afterParentJoin = array_merge($afterParentJoin, array_slice($parentSel,1) );
}
if ( $parentSel ){
$newJoinedSelectorEmpty = false;
// join the elements so far with the first part of the parent
$newJoinedSelector->elements[] = new Less_Tree_Element( $el->combinator, $parentSel[0]->elements[0]->value, $el->index, $el->currentFileInfo);
$newJoinedSelector->elements = array_merge( $newJoinedSelector->elements, array_slice($parentSel[0]->elements, 1) );
}
if (!$newJoinedSelectorEmpty) {
// now add the joined selector
$newSelectorPath[] = $newJoinedSelector;
}
// and the rest of the parent
$newSelectorPath = array_merge($newSelectorPath, $afterParentJoin);
// add that to our new set of selectors
$selectorsMultiplied[] = $newSelectorPath;
}
}
}
// our new selectors has been multiplied, so reset the state
$newSelectors = $selectorsMultiplied;
$currentElements = array();
}
}
// if we have any elements left over (e.g. .a& .b == .b)
// add them on to all the current selectors
if( $currentElements ){
$this->mergeElementsOnToSelectors($currentElements, $newSelectors);
}
foreach( $newSelectors as $new_sel){
if( $new_sel ){
$paths[] = $new_sel;
}
}
}
function mergeElementsOnToSelectors( $elements, &$selectors){
if( !$selectors ){
$selectors[] = array( new Less_Tree_Selector($elements) );
return;
}
foreach( $selectors as &$sel){
// if the previous thing in sel is a parent this needs to join on to it
if( $sel ){
$last = count($sel)-1;
$sel[$last] = $sel[$last]->createDerived( array_merge($sel[$last]->elements, $elements) );
}else{
$sel[] = new Less_Tree_Selector( $elements );
}
}
}
}
/**
* RulesetCall
*
* @package Less
* @subpackage tree
*/
class Less_Tree_RulesetCall extends Less_Tree{
public $variable;
public $type = "RulesetCall";
function __construct($variable){
$this->variable = $variable;
}
function accept($visitor) {}
function compile( $env ){
$variable = new Less_Tree_Variable($this->variable);
$detachedRuleset = $variable->compile($env);
return $detachedRuleset->callEval($env);
}
}
/**
* Selector
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Selector extends Less_Tree{
public $elements;
public $condition;
public $extendList = array();
public $_css;
public $index;
public $evaldCondition = false;
public $type = 'Selector';
public $currentFileInfo = array();
public $isReferenced;
public $mediaEmpty;
public $elements_len = 0;
public $_oelements;
public $_oelements_len;
public $cacheable = true;
/**
* @param boolean $isReferenced
*/
public function __construct( $elements, $extendList = array() , $condition = null, $index=null, $currentFileInfo=null, $isReferenced=null ){
$this->elements = $elements;
$this->elements_len = count($elements);
$this->extendList = $extendList;
$this->condition = $condition;
if( $currentFileInfo ){
$this->currentFileInfo = $currentFileInfo;
}
$this->isReferenced = $isReferenced;
if( !$condition ){
$this->evaldCondition = true;
}
$this->CacheElements();
}
function accept($visitor) {
$this->elements = $visitor->visitArray($this->elements);
$this->extendList = $visitor->visitArray($this->extendList);
if( $this->condition ){
$this->condition = $visitor->visitObj($this->condition);
}
if( $visitor instanceof Less_Visitor_extendFinder ){
$this->CacheElements();
}
}
function createDerived( $elements, $extendList = null, $evaldCondition = null ){
$newSelector = new Less_Tree_Selector( $elements, ($extendList ? $extendList : $this->extendList), null, $this->index, $this->currentFileInfo, $this->isReferenced);
$newSelector->evaldCondition = $evaldCondition ? $evaldCondition : $this->evaldCondition;
return $newSelector;
}
public function match( $other ){
if( !$other->_oelements || ($this->elements_len < $other->_oelements_len) ){
return 0;
}
for( $i = 0; $i < $other->_oelements_len; $i++ ){
if( $this->elements[$i]->value !== $other->_oelements[$i]) {
return 0;
}
}
return $other->_oelements_len; // return number of matched elements
}
public function CacheElements(){
$this->_oelements = array();
$css = '';
foreach($this->elements as $v){
$css .= $v->combinator;
if( !$v->value_is_object ){
$css .= $v->value;
continue;
}
if( !property_exists($v->value,'value') || !is_string($v->value->value) ){
$this->cacheable = false;
return;
}
$css .= $v->value->value;
}
$this->_oelements_len = preg_match_all('/[,&#\.\w-](?:[\w-]|(?:\\\\.))*/', $css, $matches);
if( $this->_oelements_len ){
$this->_oelements = $matches[0];
if( $this->_oelements[0] === '&' ){
array_shift($this->_oelements);
$this->_oelements_len--;
}
}
}
public function isJustParentSelector(){
return !$this->mediaEmpty &&
count($this->elements) === 1 &&
$this->elements[0]->value === '&' &&
($this->elements[0]->combinator === ' ' || $this->elements[0]->combinator === '');
}
public function compile($env) {
$elements = array();
foreach($this->elements as $el){
$elements[] = $el->compile($env);
}
$extendList = array();
foreach($this->extendList as $el){
$extendList[] = $el->compile($el);
}
$evaldCondition = false;
if( $this->condition ){
$evaldCondition = $this->condition->compile($env);
}
return $this->createDerived( $elements, $extendList, $evaldCondition );
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output, $firstSelector = true ){
if( !$firstSelector && $this->elements[0]->combinator === "" ){
$output->add(' ', $this->currentFileInfo, $this->index);
}
foreach($this->elements as $element){
$element->genCSS( $output );
}
}
function markReferenced(){
$this->isReferenced = true;
}
function getIsReferenced(){
return !isset($this->currentFileInfo['reference']) || !$this->currentFileInfo['reference'] || $this->isReferenced;
}
function getIsOutput(){
return $this->evaldCondition;
}
}
/**
* UnicodeDescriptor
*
* @package Less
* @subpackage tree
*/
class Less_Tree_UnicodeDescriptor extends Less_Tree{
public $value;
public $type = 'UnicodeDescriptor';
public function __construct($value){
$this->value = $value;
}
/**
* @see Less_Tree::genCSS
*/
public function genCSS( $output ){
$output->add( $this->value );
}
public function compile(){
return $this;
}
}
/**
* Unit
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Unit extends Less_Tree{
var $numerator = array();
var $denominator = array();
public $backupUnit;
public $type = 'Unit';
function __construct($numerator = array(), $denominator = array(), $backupUnit = null ){
$this->numerator = $numerator;
$this->denominator = $denominator;
$this->backupUnit = $backupUnit;
}
function __clone(){
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
if( $this->numerator ){
$output->add( $this->numerator[0] );
}elseif( $this->denominator ){
$output->add( $this->denominator[0] );
}elseif( !Less_Parser::$options['strictUnits'] && $this->backupUnit ){
$output->add( $this->backupUnit );
return ;
}
}
function toString(){
$returnStr = implode('*',$this->numerator);
foreach($this->denominator as $d){
$returnStr .= '/'.$d;
}
return $returnStr;
}
function __toString(){
return $this->toString();
}
/**
* @param Less_Tree_Unit $other
*/
function compare($other) {
return $this->is( $other->toString() ) ? 0 : -1;
}
function is($unitString){
return $this->toString() === $unitString;
}
function isLength(){
$css = $this->toCSS();
return !!preg_match('/px|em|%|in|cm|mm|pc|pt|ex/',$css);
}
function isAngle() {
return isset( Less_Tree_UnitConversions::$angle[$this->toCSS()] );
}
function isEmpty(){
return !$this->numerator && !$this->denominator;
}
function isSingular() {
return count($this->numerator) <= 1 && !$this->denominator;
}
function usedUnits(){
$result = array();
foreach(Less_Tree_UnitConversions::$groups as $groupName){
$group = Less_Tree_UnitConversions::${$groupName};
foreach($this->numerator as $atomicUnit){
if( isset($group[$atomicUnit]) && !isset($result[$groupName]) ){
$result[$groupName] = $atomicUnit;
}
}
foreach($this->denominator as $atomicUnit){
if( isset($group[$atomicUnit]) && !isset($result[$groupName]) ){
$result[$groupName] = $atomicUnit;
}
}
}
return $result;
}
function cancel(){
$counter = array();
$backup = null;
foreach($this->numerator as $atomicUnit){
if( !$backup ){
$backup = $atomicUnit;
}
$counter[$atomicUnit] = ( isset($counter[$atomicUnit]) ? $counter[$atomicUnit] : 0) + 1;
}
foreach($this->denominator as $atomicUnit){
if( !$backup ){
$backup = $atomicUnit;
}
$counter[$atomicUnit] = ( isset($counter[$atomicUnit]) ? $counter[$atomicUnit] : 0) - 1;
}
$this->numerator = array();
$this->denominator = array();
foreach($counter as $atomicUnit => $count){
if( $count > 0 ){
for( $i = 0; $i < $count; $i++ ){
$this->numerator[] = $atomicUnit;
}
}elseif( $count < 0 ){
for( $i = 0; $i < -$count; $i++ ){
$this->denominator[] = $atomicUnit;
}
}
}
if( !$this->numerator && !$this->denominator && $backup ){
$this->backupUnit = $backup;
}
sort($this->numerator);
sort($this->denominator);
}
}
/**
* UnitConversions
*
* @package Less
* @subpackage tree
*/
class Less_Tree_UnitConversions{
public static $groups = array('length','duration','angle');
public static $length = array(
'm'=> 1,
'cm'=> 0.01,
'mm'=> 0.001,
'in'=> 0.0254,
'px'=> 0.000264583, // 0.0254 / 96,
'pt'=> 0.000352778, // 0.0254 / 72,
'pc'=> 0.004233333, // 0.0254 / 72 * 12
);
public static $duration = array(
's'=> 1,
'ms'=> 0.001
);
public static $angle = array(
'rad' => 0.1591549430919, // 1/(2*M_PI),
'deg' => 0.002777778, // 1/360,
'grad'=> 0.0025, // 1/400,
'turn'=> 1
);
}
/**
* Url
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Url extends Less_Tree{
public $attrs;
public $value;
public $currentFileInfo;
public $isEvald;
public $type = 'Url';
public function __construct($value, $currentFileInfo = null, $isEvald = null){
$this->value = $value;
$this->currentFileInfo = $currentFileInfo;
$this->isEvald = $isEvald;
}
function accept( $visitor ){
$this->value = $visitor->visitObj($this->value);
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$output->add( 'url(' );
$this->value->genCSS( $output );
$output->add( ')' );
}
/**
* @param Less_Functions $ctx
*/
public function compile($ctx){
$val = $this->value->compile($ctx);
if( !$this->isEvald ){
// Add the base path if the URL is relative
if( Less_Parser::$options['relativeUrls']
&& $this->currentFileInfo
&& is_string($val->value)
&& Less_Environment::isPathRelative($val->value)
){
$rootpath = $this->currentFileInfo['uri_root'];
if ( !$val->quote ){
$rootpath = preg_replace('/[\(\)\'"\s]/', '\\$1', $rootpath );
}
$val->value = $rootpath . $val->value;
}
$val->value = Less_Environment::normalizePath( $val->value);
}
// Add cache buster if enabled
if( Less_Parser::$options['urlArgs'] ){
if( !preg_match('/^\s*data:/',$val->value) ){
$delimiter = strpos($val->value,'?') === false ? '?' : '&';
$urlArgs = $delimiter . Less_Parser::$options['urlArgs'];
$hash_pos = strpos($val->value,'#');
if( $hash_pos !== false ){
$val->value = substr_replace($val->value,$urlArgs, $hash_pos, 0);
} else {
$val->value .= $urlArgs;
}
}
}
return new Less_Tree_URL($val, $this->currentFileInfo, true);
}
}
/**
* Value
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Value extends Less_Tree{
public $type = 'Value';
public $value;
public function __construct($value){
$this->value = $value;
}
function accept($visitor) {
$this->value = $visitor->visitArray($this->value);
}
public function compile($env){
$ret = array();
$i = 0;
foreach($this->value as $i => $v){
$ret[] = $v->compile($env);
}
if( $i > 0 ){
return new Less_Tree_Value($ret);
}
return $ret[0];
}
/**
* @see Less_Tree::genCSS
*/
function genCSS( $output ){
$len = count($this->value);
for($i = 0; $i < $len; $i++ ){
$this->value[$i]->genCSS( $output );
if( $i+1 < $len ){
$output->add( Less_Environment::$_outputMap[','] );
}
}
}
}
/**
* Variable
*
* @package Less
* @subpackage tree
*/
class Less_Tree_Variable extends Less_Tree{
public $name;
public $index;
public $currentFileInfo;
public $evaluating = false;
public $type = 'Variable';
public $parensInOp ;
/**
* @param string $name
*/
public function __construct($name, $index = null, $currentFileInfo = null) {
$this->name = $name;
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
}
public function compile($env) {
if( $this->name[1] === '@' ){
$v = new Less_Tree_Variable(substr($this->name, 1), $this->index + 1);
$name = '@' . $v->compile($env)->value;
}else{
$name = $this->name;
}
if ($this->evaluating) {
throw new Less_Exception_Compiler("Recursive variable definition for " . $name, null, $this->index, $this->currentFileInfo);
}
$this->evaluating = true;
foreach($env->frames as $frame){
if( $v = $frame->variable($name) ){
$this->evaluating = false;
return $v->value->compile($env);
}
}
throw new Less_Exception_Compiler("variable " . $name . " is undefined", null, $this->index );
}
}
class Less_Tree_Mixin_Call extends Less_Tree{
public $selector;
public $arguments;
public $index;
public $currentFileInfo;
public $important;
public $type = 'MixinCall';
/**
* less.js: tree.mixin.Call
*
*/
public function __construct($elements, $args, $index, $currentFileInfo, $important = false){
$this->selector = new Less_Tree_Selector($elements);
$this->arguments = $args;
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
$this->important = $important;
}
//function accept($visitor){
// $this->selector = $visitor->visit($this->selector);
// $this->arguments = $visitor->visit($this->arguments);
//}
public function compile($env){
$rules = array();
$match = false;
$isOneFound = false;
$candidates = array();
$defaultUsed = false;
$conditionResult = array();
$args = array();
foreach($this->arguments as $a){
$args[] = array('name'=> $a['name'], 'value' => $a['value']->compile($env) );
}
foreach($env->frames as $frame){
$mixins = $frame->find($this->selector);
if( !$mixins ){
continue;
}
$isOneFound = true;
$defNone = 0;
$defTrue = 1;
$defFalse = 2;
// To make `default()` function independent of definition order we have two "subpasses" here.
// At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),
// and build candidate list with corresponding flags. Then, when we know all possible matches,
// we make a final decision.
$mixins_len = count($mixins);
for( $m = 0; $m < $mixins_len; $m++ ){
$mixin = $mixins[$m];
if( $this->IsRecursive( $env, $mixin ) ){
continue;
}
if( $mixin->matchArgs($args, $env) ){
$candidate = array('mixin' => $mixin, 'group' => $defNone);
if( $mixin instanceof Less_Tree_Ruleset ){
for( $f = 0; $f < 2; $f++ ){
Less_Tree_DefaultFunc::value($f);
$conditionResult[$f] = $mixin->matchCondition( $args, $env);
}
if( $conditionResult[0] || $conditionResult[1] ){
if( $conditionResult[0] != $conditionResult[1] ){
$candidate['group'] = $conditionResult[1] ? $defTrue : $defFalse;
}
$candidates[] = $candidate;
}
}else{
$candidates[] = $candidate;
}
$match = true;
}
}
Less_Tree_DefaultFunc::reset();
$count = array(0, 0, 0);
for( $m = 0; $m < count($candidates); $m++ ){
$count[ $candidates[$m]['group'] ]++;
}
if( $count[$defNone] > 0 ){
$defaultResult = $defFalse;
} else {
$defaultResult = $defTrue;
if( ($count[$defTrue] + $count[$defFalse]) > 1 ){
throw Exception( 'Ambiguous use of `default()` found when matching for `'. $this->format($args) + '`' );
}
}
$candidates_length = count($candidates);
$length_1 = ($candidates_length == 1);
for( $m = 0; $m < $candidates_length; $m++){
$candidate = $candidates[$m]['group'];
if( ($candidate === $defNone) || ($candidate === $defaultResult) ){
try{
$mixin = $candidates[$m]['mixin'];
if( !($mixin instanceof Less_Tree_Mixin_Definition) ){
$mixin = new Less_Tree_Mixin_Definition('', array(), $mixin->rules, null, false);
$mixin->originalRuleset = $mixins[$m]->originalRuleset;
}
$rules = array_merge($rules, $mixin->evalCall($env, $args, $this->important)->rules);
} catch (Exception $e) {
//throw new Less_Exception_Compiler($e->getMessage(), $e->index, null, $this->currentFileInfo['filename']);
throw new Less_Exception_Compiler($e->getMessage(), null, null, $this->currentFileInfo);
}
}
}
if( $match ){
if( !$this->currentFileInfo || !isset($this->currentFileInfo['reference']) || !$this->currentFileInfo['reference'] ){
Less_Tree::ReferencedArray($rules);
}
return $rules;
}
}
if( $isOneFound ){
throw new Less_Exception_Compiler('No matching definition was found for `'.$this->Format( $args ).'`', null, $this->index, $this->currentFileInfo);
}else{
throw new Less_Exception_Compiler(trim($this->selector->toCSS()) . " is undefined", null, $this->index);
}
}
/**
* Format the args for use in exception messages
*
*/
private function Format($args){
$message = array();
if( $args ){
foreach($args as $a){
$argValue = '';
if( $a['name'] ){
$argValue += $a['name']+':';
}
if( is_object($a['value']) ){
$argValue += $a['value']->toCSS();
}else{
$argValue += '???';
}
$message[] = $argValue;
}
}
return implode(', ',$message);
}
/**
* Are we in a recursive mixin call?
*
* @return bool
*/
private function IsRecursive( $env, $mixin ){
foreach($env->frames as $recur_frame){
if( !($mixin instanceof Less_Tree_Mixin_Definition) ){
if( $mixin === $recur_frame ){
return true;
}
if( isset($recur_frame->originalRuleset) && $mixin->ruleset_id === $recur_frame->originalRuleset ){
return true;
}
}
}
return false;
}
}
class Less_Tree_Mixin_Definition extends Less_Tree_Ruleset{
public $name;
public $selectors;
public $params;
public $arity = 0;
public $rules;
public $lookups = array();
public $required = 0;
public $frames = array();
public $condition;
public $variadic;
public $type = 'MixinDefinition';
// less.js : /lib/less/tree/mixin.js : tree.mixin.Definition
public function __construct($name, $params, $rules, $condition, $variadic = false, $frames = null ){
$this->name = $name;
$this->selectors = array(new Less_Tree_Selector(array( new Less_Tree_Element(null, $name))));
$this->params = $params;
$this->condition = $condition;
$this->variadic = $variadic;
$this->rules = $rules;
if( $params ){
$this->arity = count($params);
foreach( $params as $p ){
if (! isset($p['name']) || ($p['name'] && !isset($p['value']))) {
$this->required++;
}
}
}
$this->frames = $frames;
$this->SetRulesetIndex();
}
//function accept( $visitor ){
// $this->params = $visitor->visit($this->params);
// $this->rules = $visitor->visit($this->rules);
// $this->condition = $visitor->visit($this->condition);
//}
public function toCSS(){
return '';
}
// less.js : /lib/less/tree/mixin.js : tree.mixin.Definition.evalParams
public function compileParams($env, $mixinFrames, $args = array() , &$evaldArguments = array() ){
$frame = new Less_Tree_Ruleset(null, array());
$params = $this->params;
$mixinEnv = null;
$argsLength = 0;
if( $args ){
$argsLength = count($args);
for($i = 0; $i < $argsLength; $i++ ){
$arg = $args[$i];
if( $arg && $arg['name'] ){
$isNamedFound = false;
foreach($params as $j => $param){
if( !isset($evaldArguments[$j]) && $arg['name'] === $params[$j]['name']) {
$evaldArguments[$j] = $arg['value']->compile($env);
array_unshift($frame->rules, new Less_Tree_Rule( $arg['name'], $arg['value']->compile($env) ) );
$isNamedFound = true;
break;
}
}
if ($isNamedFound) {
array_splice($args, $i, 1);
$i--;
$argsLength--;
continue;
} else {
throw new Less_Exception_Compiler("Named argument for " . $this->name .' '.$args[$i]['name'] . ' not found');
}
}
}
}
$argIndex = 0;
foreach($params as $i => $param){
if ( isset($evaldArguments[$i]) ){ continue; }
$arg = null;
if( isset($args[$argIndex]) ){
$arg = $args[$argIndex];
}
if (isset($param['name']) && $param['name']) {
if( isset($param['variadic']) ){
$varargs = array();
for ($j = $argIndex; $j < $argsLength; $j++) {
$varargs[] = $args[$j]['value']->compile($env);
}
$expression = new Less_Tree_Expression($varargs);
array_unshift($frame->rules, new Less_Tree_Rule($param['name'], $expression->compile($env)));
}else{
$val = ($arg && $arg['value']) ? $arg['value'] : false;
if ($val) {
$val = $val->compile($env);
} else if ( isset($param['value']) ) {
if( !$mixinEnv ){
$mixinEnv = new Less_Environment();
$mixinEnv->frames = array_merge( array($frame), $mixinFrames);
}
$val = $param['value']->compile($mixinEnv);
$frame->resetCache();
} else {
throw new Less_Exception_Compiler("Wrong number of arguments for " . $this->name . " (" . $argsLength . ' for ' . $this->arity . ")");
}
array_unshift($frame->rules, new Less_Tree_Rule($param['name'], $val));
$evaldArguments[$i] = $val;
}
}
if ( isset($param['variadic']) && $args) {
for ($j = $argIndex; $j < $argsLength; $j++) {
$evaldArguments[$j] = $args[$j]['value']->compile($env);
}
}
$argIndex++;
}
ksort($evaldArguments);
$evaldArguments = array_values($evaldArguments);
return $frame;
}
public function compile($env) {
if( $this->frames ){
return new Less_Tree_Mixin_Definition($this->name, $this->params, $this->rules, $this->condition, $this->variadic, $this->frames );
}
return new Less_Tree_Mixin_Definition($this->name, $this->params, $this->rules, $this->condition, $this->variadic, $env->frames );
}
public function evalCall($env, $args = NULL, $important = NULL) {
Less_Environment::$mixin_stack++;
$_arguments = array();
if( $this->frames ){
$mixinFrames = array_merge($this->frames, $env->frames);
}else{
$mixinFrames = $env->frames;
}
$frame = $this->compileParams($env, $mixinFrames, $args, $_arguments);
$ex = new Less_Tree_Expression($_arguments);
array_unshift($frame->rules, new Less_Tree_Rule('@arguments', $ex->compile($env)));
$ruleset = new Less_Tree_Ruleset(null, $this->rules);
$ruleset->originalRuleset = $this->ruleset_id;
$ruleSetEnv = new Less_Environment();
$ruleSetEnv->frames = array_merge( array($this, $frame), $mixinFrames );
$ruleset = $ruleset->compile( $ruleSetEnv );
if( $important ){
$ruleset = $ruleset->makeImportant();
}
Less_Environment::$mixin_stack--;
return $ruleset;
}
public function matchCondition($args, $env) {
if( !$this->condition ){
return true;
}
$frame = $this->compileParams($env, array_merge($this->frames,$env->frames), $args );
$compile_env = new Less_Environment();
$compile_env->frames = array_merge(
array($frame) // the parameter variables
, $this->frames // the parent namespace/mixin frames
, $env->frames // the current environment frames
);
return (bool)$this->condition->compile($compile_env);
}
public function matchArgs($args, $env = NULL){
$argsLength = count($args);
if( !$this->variadic ){
if( $argsLength < $this->required ){
return false;
}
if( $argsLength > count($this->params) ){
return false;
}
}else{
if( $argsLength < ($this->required - 1)){
return false;
}
}
$len = min($argsLength, $this->arity);
for( $i = 0; $i < $len; $i++ ){
if( !isset($this->params[$i]['name']) && !isset($this->params[$i]['variadic']) ){
if( $args[$i]['value']->compile($env)->toCSS() != $this->params[$i]['value']->compile($env)->toCSS() ){
return false;
}
}
}
return true;
}
}
/**
* Extend Finder Visitor
*
* @package Less
* @subpackage visitor
*/
class Less_Visitor_extendFinder extends Less_Visitor{
public $contexts = array();
public $allExtendsStack;
public $foundExtends;
function __construct(){
$this->contexts = array();
$this->allExtendsStack = array(array());
parent::__construct();
}
/**
* @param Less_Tree_Ruleset $root
*/
function run($root){
$root = $this->visitObj($root);
$root->allExtends =& $this->allExtendsStack[0];
return $root;
}
function visitRule($ruleNode, &$visitDeeper ){
$visitDeeper = false;
}
function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){
$visitDeeper = false;
}
function visitRuleset($rulesetNode){
if( $rulesetNode->root ){
return;
}
$allSelectorsExtendList = array();
// get &:extend(.a); rules which apply to all selectors in this ruleset
if( $rulesetNode->rules ){
foreach($rulesetNode->rules as $rule){
if( $rule instanceof Less_Tree_Extend ){
$allSelectorsExtendList[] = $rule;
$rulesetNode->extendOnEveryPath = true;
}
}
}
// now find every selector and apply the extends that apply to all extends
// and the ones which apply to an individual extend
foreach($rulesetNode->paths as $selectorPath){
$selector = end($selectorPath); //$selectorPath[ count($selectorPath)-1];
$j = 0;
foreach($selector->extendList as $extend){
$this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j);
}
foreach($allSelectorsExtendList as $extend){
$this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j);
}
}
$this->contexts[] = $rulesetNode->selectors;
}
function allExtendsStackPush($rulesetNode, $selectorPath, $extend, &$j){
$this->foundExtends = true;
$extend = clone $extend;
$extend->findSelfSelectors( $selectorPath );
$extend->ruleset = $rulesetNode;
if( $j === 0 ){
$extend->firstExtendOnThisSelectorPath = true;
}
$end_key = count($this->allExtendsStack)-1;
$this->allExtendsStack[$end_key][] = $extend;
$j++;
}
function visitRulesetOut( $rulesetNode ){
if( !is_object($rulesetNode) || !$rulesetNode->root ){
array_pop($this->contexts);
}
}
function visitMedia( $mediaNode ){
$mediaNode->allExtends = array();
$this->allExtendsStack[] =& $mediaNode->allExtends;
}
function visitMediaOut(){
array_pop($this->allExtendsStack);
}
function visitDirective( $directiveNode ){
$directiveNode->allExtends = array();
$this->allExtendsStack[] =& $directiveNode->allExtends;
}
function visitDirectiveOut(){
array_pop($this->allExtendsStack);
}
}
/*
class Less_Visitor_import extends Less_VisitorReplacing{
public $_visitor;
public $_importer;
public $importCount;
function __construct( $evalEnv ){
$this->env = $evalEnv;
$this->importCount = 0;
parent::__construct();
}
function run( $root ){
$root = $this->visitObj($root);
$this->isFinished = true;
//if( $this->importCount === 0) {
// $this->_finish();
//}
}
function visitImport($importNode, &$visitDeeper ){
$importVisitor = $this;
$inlineCSS = $importNode->options['inline'];
if( !$importNode->css || $inlineCSS ){
$evaldImportNode = $importNode->compileForImport($this->env);
if( $evaldImportNode && (!$evaldImportNode->css || $inlineCSS) ){
$importNode = $evaldImportNode;
$this->importCount++;
$env = clone $this->env;
if( (isset($importNode->options['multiple']) && $importNode->options['multiple']) ){
$env->importMultiple = true;
}
//get path & uri
$path_and_uri = null;
if( is_callable(Less_Parser::$options['import_callback']) ){
$path_and_uri = call_user_func(Less_Parser::$options['import_callback'],$importNode);
}
if( !$path_and_uri ){
$path_and_uri = $importNode->PathAndUri();
}
if( $path_and_uri ){
list($full_path, $uri) = $path_and_uri;
}else{
$full_path = $uri = $importNode->getPath();
}
//import once
if( $importNode->skip( $full_path, $env) ){
return array();
}
if( $importNode->options['inline'] ){
//todo needs to reference css file not import
//$contents = new Less_Tree_Anonymous($importNode->root, 0, array('filename'=>$importNode->importedFilename), true );
Less_Parser::AddParsedFile($full_path);
$contents = new Less_Tree_Anonymous( file_get_contents($full_path), 0, array(), true );
if( $importNode->features ){
return new Less_Tree_Media( array($contents), $importNode->features->value );
}
return array( $contents );
}
// css ?
if( $importNode->css ){
$features = ( $importNode->features ? $importNode->features->compile($env) : null );
return new Less_Tree_Import( $importNode->compilePath( $env), $features, $importNode->options, $this->index);
}
return $importNode->ParseImport( $full_path, $uri, $env );
}
}
$visitDeeper = false;
return $importNode;
}
function visitRule( $ruleNode, &$visitDeeper ){
$visitDeeper = false;
return $ruleNode;
}
function visitDirective($directiveNode, $visitArgs){
array_unshift($this->env->frames,$directiveNode);
return $directiveNode;
}
function visitDirectiveOut($directiveNode) {
array_shift($this->env->frames);
}
function visitMixinDefinition($mixinDefinitionNode, $visitArgs) {
array_unshift($this->env->frames,$mixinDefinitionNode);
return $mixinDefinitionNode;
}
function visitMixinDefinitionOut($mixinDefinitionNode) {
array_shift($this->env->frames);
}
function visitRuleset($rulesetNode, $visitArgs) {
array_unshift($this->env->frames,$rulesetNode);
return $rulesetNode;
}
function visitRulesetOut($rulesetNode) {
array_shift($this->env->frames);
}
function visitMedia($mediaNode, $visitArgs) {
array_unshift($this->env->frames, $mediaNode->ruleset);
return $mediaNode;
}
function visitMediaOut($mediaNode) {
array_shift($this->env->frames);
}
}
*/
/**
* Join Selector Visitor
*
* @package Less
* @subpackage visitor
*/
class Less_Visitor_joinSelector extends Less_Visitor{
public $contexts = array( array() );
/**
* @param Less_Tree_Ruleset $root
*/
function run( $root ){
return $this->visitObj($root);
}
function visitRule( $ruleNode, &$visitDeeper ){
$visitDeeper = false;
}
function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){
$visitDeeper = false;
}
function visitRuleset( $rulesetNode ){
$paths = array();
if( !$rulesetNode->root ){
$selectors = array();
if( $rulesetNode->selectors && $rulesetNode->selectors ){
foreach($rulesetNode->selectors as $selector){
if( $selector->getIsOutput() ){
$selectors[] = $selector;
}
}
}
if( !$selectors ){
$rulesetNode->selectors = null;
$rulesetNode->rules = null;
}else{
$context = end($this->contexts); //$context = $this->contexts[ count($this->contexts) - 1];
$paths = $rulesetNode->joinSelectors( $context, $selectors);
}
$rulesetNode->paths = $paths;
}
$this->contexts[] = $paths; //different from less.js. Placed after joinSelectors() so that $this->contexts will get correct $paths
}
function visitRulesetOut(){
array_pop($this->contexts);
}
function visitMedia($mediaNode) {
$context = end($this->contexts); //$context = $this->contexts[ count($this->contexts) - 1];
if( !count($context) || (is_object($context[0]) && $context[0]->multiMedia) ){
$mediaNode->rules[0]->root = true;
}
}
}
/**
* Process Extends Visitor
*
* @package Less
* @subpackage visitor
*/
class Less_Visitor_processExtends extends Less_Visitor{
public $allExtendsStack;
/**
* @param Less_Tree_Ruleset $root
*/
public function run( $root ){
$extendFinder = new Less_Visitor_extendFinder();
$extendFinder->run( $root );
if( !$extendFinder->foundExtends){
return $root;
}
$root->allExtends = $this->doExtendChaining( $root->allExtends, $root->allExtends);
$this->allExtendsStack = array();
$this->allExtendsStack[] = &$root->allExtends;
return $this->visitObj( $root );
}
private function doExtendChaining( $extendsList, $extendsListTarget, $iterationCount = 0){
//
// chaining is different from normal extension.. if we extend an extend then we are not just copying, altering and pasting
// the selector we would do normally, but we are also adding an extend with the same target selector
// this means this new extend can then go and alter other extends
//
// this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors
// this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already processed if
// we look at each selector at a time, as is done in visitRuleset
$extendsToAdd = array();
//loop through comparing every extend with every target extend.
// a target extend is the one on the ruleset we are looking at copy/edit/pasting in place
// e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one
// and the second is the target.
// the seperation into two lists allows us to process a subset of chains with a bigger set, as is the
// case when processing media queries
for( $extendIndex = 0, $extendsList_len = count($extendsList); $extendIndex < $extendsList_len; $extendIndex++ ){
for( $targetExtendIndex = 0; $targetExtendIndex < count($extendsListTarget); $targetExtendIndex++ ){
$extend = $extendsList[$extendIndex];
$targetExtend = $extendsListTarget[$targetExtendIndex];
// look for circular references
if( in_array($targetExtend->object_id, $extend->parent_ids,true) ){
continue;
}
// find a match in the target extends self selector (the bit before :extend)
$selectorPath = array( $targetExtend->selfSelectors[0] );
$matches = $this->findMatch( $extend, $selectorPath);
if( $matches ){
// we found a match, so for each self selector..
foreach($extend->selfSelectors as $selfSelector ){
// process the extend as usual
$newSelector = $this->extendSelector( $matches, $selectorPath, $selfSelector);
// but now we create a new extend from it
$newExtend = new Less_Tree_Extend( $targetExtend->selector, $targetExtend->option, 0);
$newExtend->selfSelectors = $newSelector;
// add the extend onto the list of extends for that selector
end($newSelector)->extendList = array($newExtend);
//$newSelector[ count($newSelector)-1]->extendList = array($newExtend);
// record that we need to add it.
$extendsToAdd[] = $newExtend;
$newExtend->ruleset = $targetExtend->ruleset;
//remember its parents for circular references
$newExtend->parent_ids = array_merge($newExtend->parent_ids,$targetExtend->parent_ids,$extend->parent_ids);
// only process the selector once.. if we have :extend(.a,.b) then multiple
// extends will look at the same selector path, so when extending
// we know that any others will be duplicates in terms of what is added to the css
if( $targetExtend->firstExtendOnThisSelectorPath ){
$newExtend->firstExtendOnThisSelectorPath = true;
$targetExtend->ruleset->paths[] = $newSelector;
}
}
}
}
}
if( $extendsToAdd ){
// try to detect circular references to stop a stack overflow.
// may no longer be needed. $this->extendChainCount++;
if( $iterationCount > 100) {
try{
$selectorOne = $extendsToAdd[0]->selfSelectors[0]->toCSS();
$selectorTwo = $extendsToAdd[0]->selector->toCSS();
}catch(Exception $e){
$selectorOne = "{unable to calculate}";
$selectorTwo = "{unable to calculate}";
}
throw new Less_Exception_Parser("extend circular reference detected. One of the circular extends is currently:"+$selectorOne+":extend(" + $selectorTwo+")");
}
// now process the new extends on the existing rules so that we can handle a extending b extending c ectending d extending e...
$extendsToAdd = $this->doExtendChaining( $extendsToAdd, $extendsListTarget, $iterationCount+1);
}
return array_merge($extendsList, $extendsToAdd);
}
protected function visitRule( $ruleNode, &$visitDeeper ){
$visitDeeper = false;
}
protected function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){
$visitDeeper = false;
}
protected function visitSelector( $selectorNode, &$visitDeeper ){
$visitDeeper = false;
}
protected function visitRuleset($rulesetNode){
if( $rulesetNode->root ){
return;
}
$allExtends = end($this->allExtendsStack);
$paths_len = count($rulesetNode->paths);
// look at each selector path in the ruleset, find any extend matches and then copy, find and replace
foreach($allExtends as $allExtend){
for($pathIndex = 0; $pathIndex < $paths_len; $pathIndex++ ){
// extending extends happens initially, before the main pass
if( isset($rulesetNode->extendOnEveryPath) && $rulesetNode->extendOnEveryPath ){
continue;
}
$selectorPath = $rulesetNode->paths[$pathIndex];
if( end($selectorPath)->extendList ){
continue;
}
$this->ExtendMatch( $rulesetNode, $allExtend, $selectorPath);
}
}
}
private function ExtendMatch( $rulesetNode, $extend, $selectorPath ){
$matches = $this->findMatch($extend, $selectorPath);
if( $matches ){
foreach($extend->selfSelectors as $selfSelector ){
$rulesetNode->paths[] = $this->extendSelector($matches, $selectorPath, $selfSelector);
}
}
}
private function findMatch($extend, $haystackSelectorPath ){
if( !$this->HasMatches($extend, $haystackSelectorPath) ){
return false;
}
//
// look through the haystack selector path to try and find the needle - extend.selector
// returns an array of selector matches that can then be replaced
//
$needleElements = $extend->selector->elements;
$potentialMatches = array();
$potentialMatches_len = 0;
$potentialMatch = null;
$matches = array();
// loop through the haystack elements
$haystack_path_len = count($haystackSelectorPath);
for($haystackSelectorIndex = 0; $haystackSelectorIndex < $haystack_path_len; $haystackSelectorIndex++ ){
$hackstackSelector = $haystackSelectorPath[$haystackSelectorIndex];
$haystack_elements_len = count($hackstackSelector->elements);
for($hackstackElementIndex = 0; $hackstackElementIndex < $haystack_elements_len; $hackstackElementIndex++ ){
$haystackElement = $hackstackSelector->elements[$hackstackElementIndex];
// if we allow elements before our match we can add a potential match every time. otherwise only at the first element.
if( $extend->allowBefore || ($haystackSelectorIndex === 0 && $hackstackElementIndex === 0) ){
$potentialMatches[] = array('pathIndex'=> $haystackSelectorIndex, 'index'=> $hackstackElementIndex, 'matched'=> 0, 'initialCombinator'=> $haystackElement->combinator);
$potentialMatches_len++;
}
for($i = 0; $i < $potentialMatches_len; $i++ ){
$potentialMatch = &$potentialMatches[$i];
$potentialMatch = $this->PotentialMatch( $potentialMatch, $needleElements, $haystackElement, $hackstackElementIndex );
// if we are still valid and have finished, test whether we have elements after and whether these are allowed
if( $potentialMatch && $potentialMatch['matched'] === $extend->selector->elements_len ){
$potentialMatch['finished'] = true;
if( !$extend->allowAfter && ($hackstackElementIndex+1 < $haystack_elements_len || $haystackSelectorIndex+1 < $haystack_path_len) ){
$potentialMatch = null;
}
}
// if null we remove, if not, we are still valid, so either push as a valid match or continue
if( $potentialMatch ){
if( $potentialMatch['finished'] ){
$potentialMatch['length'] = $extend->selector->elements_len;
$potentialMatch['endPathIndex'] = $haystackSelectorIndex;
$potentialMatch['endPathElementIndex'] = $hackstackElementIndex + 1; // index after end of match
$potentialMatches = array(); // we don't allow matches to overlap, so start matching again
$potentialMatches_len = 0;
$matches[] = $potentialMatch;
}
continue;
}
array_splice($potentialMatches, $i, 1);
$potentialMatches_len--;
$i--;
}
}
}
return $matches;
}
// Before going through all the nested loops, lets check to see if a match is possible
// Reduces Bootstrap 3.1 compile time from ~6.5s to ~5.6s
private function HasMatches($extend, $haystackSelectorPath){
if( !$extend->selector->cacheable ){
return true;
}
$first_el = $extend->selector->_oelements[0];
foreach($haystackSelectorPath as $hackstackSelector){
if( !$hackstackSelector->cacheable ){
return true;
}
if( in_array($first_el, $hackstackSelector->_oelements) ){
return true;
}
}
return false;
}
/**
* @param integer $hackstackElementIndex
*/
private function PotentialMatch( $potentialMatch, $needleElements, $haystackElement, $hackstackElementIndex ){
if( $potentialMatch['matched'] > 0 ){
// selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't
// then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to work out
// what the resulting combinator will be
$targetCombinator = $haystackElement->combinator;
if( $targetCombinator === '' && $hackstackElementIndex === 0 ){
$targetCombinator = ' ';
}
if( $needleElements[ $potentialMatch['matched'] ]->combinator !== $targetCombinator ){
return null;
}
}
// if we don't match, null our match to indicate failure
if( !$this->isElementValuesEqual( $needleElements[$potentialMatch['matched'] ]->value, $haystackElement->value) ){
return null;
}
$potentialMatch['finished'] = false;
$potentialMatch['matched']++;
return $potentialMatch;
}
private function isElementValuesEqual( $elementValue1, $elementValue2 ){
if( $elementValue1 === $elementValue2 ){
return true;
}
if( is_string($elementValue1) || is_string($elementValue2) ) {
return false;
}
if( $elementValue1 instanceof Less_Tree_Attribute ){
return $this->isAttributeValuesEqual( $elementValue1, $elementValue2 );
}
$elementValue1 = $elementValue1->value;
if( $elementValue1 instanceof Less_Tree_Selector ){
return $this->isSelectorValuesEqual( $elementValue1, $elementValue2 );
}
return false;
}
/**
* @param Less_Tree_Selector $elementValue1
*/
private function isSelectorValuesEqual( $elementValue1, $elementValue2 ){
$elementValue2 = $elementValue2->value;
if( !($elementValue2 instanceof Less_Tree_Selector) || $elementValue1->elements_len !== $elementValue2->elements_len ){
return false;
}
for( $i = 0; $i < $elementValue1->elements_len; $i++ ){
if( $elementValue1->elements[$i]->combinator !== $elementValue2->elements[$i]->combinator ){
if( $i !== 0 || ($elementValue1->elements[$i]->combinator || ' ') !== ($elementValue2->elements[$i]->combinator || ' ') ){
return false;
}
}
if( !$this->isElementValuesEqual($elementValue1->elements[$i]->value, $elementValue2->elements[$i]->value) ){
return false;
}
}
return true;
}
/**
* @param Less_Tree_Attribute $elementValue1
*/
private function isAttributeValuesEqual( $elementValue1, $elementValue2 ){
if( $elementValue1->op !== $elementValue2->op || $elementValue1->key !== $elementValue2->key ){
return false;
}
if( !$elementValue1->value || !$elementValue2->value ){
if( $elementValue1->value || $elementValue2->value ) {
return false;
}
return true;
}
$elementValue1 = ($elementValue1->value->value ? $elementValue1->value->value : $elementValue1->value );
$elementValue2 = ($elementValue2->value->value ? $elementValue2->value->value : $elementValue2->value );
return $elementValue1 === $elementValue2;
}
private function extendSelector($matches, $selectorPath, $replacementSelector){
//for a set of matches, replace each match with the replacement selector
$currentSelectorPathIndex = 0;
$currentSelectorPathElementIndex = 0;
$path = array();
$selectorPath_len = count($selectorPath);
for($matchIndex = 0, $matches_len = count($matches); $matchIndex < $matches_len; $matchIndex++ ){
$match = $matches[$matchIndex];
$selector = $selectorPath[ $match['pathIndex'] ];
$firstElement = new Less_Tree_Element(
$match['initialCombinator'],
$replacementSelector->elements[0]->value,
$replacementSelector->elements[0]->index,
$replacementSelector->elements[0]->currentFileInfo
);
if( $match['pathIndex'] > $currentSelectorPathIndex && $currentSelectorPathElementIndex > 0 ){
$last_path = end($path);
$last_path->elements = array_merge( $last_path->elements, array_slice( $selectorPath[$currentSelectorPathIndex]->elements, $currentSelectorPathElementIndex));
$currentSelectorPathElementIndex = 0;
$currentSelectorPathIndex++;
}
$newElements = array_merge(
array_slice($selector->elements, $currentSelectorPathElementIndex, ($match['index'] - $currentSelectorPathElementIndex) ) // last parameter of array_slice is different than the last parameter of javascript's slice
, array($firstElement)
, array_slice($replacementSelector->elements,1)
);
if( $currentSelectorPathIndex === $match['pathIndex'] && $matchIndex > 0 ){
$last_key = count($path)-1;
$path[$last_key]->elements = array_merge($path[$last_key]->elements,$newElements);
}else{
$path = array_merge( $path, array_slice( $selectorPath, $currentSelectorPathIndex, $match['pathIndex'] ));
$path[] = new Less_Tree_Selector( $newElements );
}
$currentSelectorPathIndex = $match['endPathIndex'];
$currentSelectorPathElementIndex = $match['endPathElementIndex'];
if( $currentSelectorPathElementIndex >= count($selectorPath[$currentSelectorPathIndex]->elements) ){
$currentSelectorPathElementIndex = 0;
$currentSelectorPathIndex++;
}
}
if( $currentSelectorPathIndex < $selectorPath_len && $currentSelectorPathElementIndex > 0 ){
$last_path = end($path);
$last_path->elements = array_merge( $last_path->elements, array_slice($selectorPath[$currentSelectorPathIndex]->elements, $currentSelectorPathElementIndex));
$currentSelectorPathIndex++;
}
$slice_len = $selectorPath_len - $currentSelectorPathIndex;
$path = array_merge($path, array_slice($selectorPath, $currentSelectorPathIndex, $slice_len));
return $path;
}
protected function visitMedia( $mediaNode ){
$newAllExtends = array_merge( $mediaNode->allExtends, end($this->allExtendsStack) );
$this->allExtendsStack[] = $this->doExtendChaining($newAllExtends, $mediaNode->allExtends);
}
protected function visitMediaOut(){
array_pop( $this->allExtendsStack );
}
protected function visitDirective( $directiveNode ){
$newAllExtends = array_merge( $directiveNode->allExtends, end($this->allExtendsStack) );
$this->allExtendsStack[] = $this->doExtendChaining($newAllExtends, $directiveNode->allExtends);
}
protected function visitDirectiveOut(){
array_pop($this->allExtendsStack);
}
}
/**
* toCSS Visitor
*
* @package Less
* @subpackage visitor
*/
class Less_Visitor_toCSS extends Less_VisitorReplacing{
private $charset;
function __construct(){
parent::__construct();
}
/**
* @param Less_Tree_Ruleset $root
*/
function run( $root ){
return $this->visitObj($root);
}
function visitRule( $ruleNode ){
if( $ruleNode->variable ){
return array();
}
return $ruleNode;
}
function visitMixinDefinition($mixinNode){
// mixin definitions do not get eval'd - this means they keep state
// so we have to clear that state here so it isn't used if toCSS is called twice
$mixinNode->frames = array();
return array();
}
function visitExtend(){
return array();
}
function visitComment( $commentNode ){
if( $commentNode->isSilent() ){
return array();
}
return $commentNode;
}
function visitMedia( $mediaNode, &$visitDeeper ){
$mediaNode->accept($this);
$visitDeeper = false;
if( !$mediaNode->rules ){
return array();
}
return $mediaNode;
}
function visitDirective( $directiveNode ){
if( isset($directiveNode->currentFileInfo['reference']) && (!property_exists($directiveNode,'isReferenced') || !$directiveNode->isReferenced) ){
return array();
}
if( $directiveNode->name === '@charset' ){
// Only output the debug info together with subsequent @charset definitions
// a comment (or @media statement) before the actual @charset directive would
// be considered illegal css as it has to be on the first line
if( isset($this->charset) && $this->charset ){
//if( $directiveNode->debugInfo ){
// $comment = new Less_Tree_Comment('/* ' . str_replace("\n",'',$directiveNode->toCSS())." */\n");
// $comment->debugInfo = $directiveNode->debugInfo;
// return $this->visit($comment);
//}
return array();
}
$this->charset = true;
}
return $directiveNode;
}
function checkPropertiesInRoot( $rulesetNode ){
if( !$rulesetNode->firstRoot ){
return;
}
foreach($rulesetNode->rules as $ruleNode){
if( $ruleNode instanceof Less_Tree_Rule && !$ruleNode->variable ){
$msg = "properties must be inside selector blocks, they cannot be in the root. Index ".$ruleNode->index.($ruleNode->currentFileInfo ? (' Filename: '.$ruleNode->currentFileInfo['filename']) : null);
throw new Less_Exception_Compiler($msg);
}
}
}
function visitRuleset( $rulesetNode, &$visitDeeper ){
$visitDeeper = false;
$this->checkPropertiesInRoot( $rulesetNode );
if( $rulesetNode->root ){
return $this->visitRulesetRoot( $rulesetNode );
}
$rulesets = array();
$rulesetNode->paths = $this->visitRulesetPaths($rulesetNode);
// by pass error; debug later - KHANH
if (!$rulesetNode->rules) return $rulesets;
//;
// Compile rules and rulesets
$nodeRuleCnt = count($rulesetNode->rules);
for( $i = 0; $i < $nodeRuleCnt; ){
$rule = $rulesetNode->rules[$i];
if( property_exists($rule,'rules') ){
// visit because we are moving them out from being a child
$rulesets[] = $this->visitObj($rule);
array_splice($rulesetNode->rules,$i,1);
$nodeRuleCnt--;
continue;
}
$i++;
}
// accept the visitor to remove rules and refactor itself
// then we can decide now whether we want it or not
if( $nodeRuleCnt > 0 ){
$rulesetNode->accept($this);
if( $rulesetNode->rules ){
if( count($rulesetNode->rules) > 1 ){
$this->_mergeRules( $rulesetNode->rules );
$this->_removeDuplicateRules( $rulesetNode->rules );
}
// now decide whether we keep the ruleset
if( $rulesetNode->paths ){
//array_unshift($rulesets, $rulesetNode);
array_splice($rulesets,0,0,array($rulesetNode));
}
}
}
if( count($rulesets) === 1 ){
return $rulesets[0];
}
return $rulesets;
}
/**
* Helper function for visitiRuleset
*
* return array|Less_Tree_Ruleset
*/
private function visitRulesetRoot( $rulesetNode ){
$rulesetNode->accept( $this );
if( $rulesetNode->firstRoot || $rulesetNode->rules ){
return $rulesetNode;
}
return array();
}
/**
* Helper function for visitRuleset()
*
* @return array
*/
private function visitRulesetPaths($rulesetNode){
$paths = array();
foreach($rulesetNode->paths as $p){
if( $p[0]->elements[0]->combinator === ' ' ){
$p[0]->elements[0]->combinator = '';
}
foreach($p as $pi){
if( $pi->getIsReferenced() && $pi->getIsOutput() ){
$paths[] = $p;
break;
}
}
}
return $paths;
}
function _removeDuplicateRules( &$rules ){
// remove duplicates
$ruleCache = array();
for( $i = count($rules)-1; $i >= 0 ; $i-- ){
$rule = $rules[$i];
if( $rule instanceof Less_Tree_Rule || $rule instanceof Less_Tree_NameValue ){
if( !isset($ruleCache[$rule->name]) ){
$ruleCache[$rule->name] = $rule;
}else{
$ruleList =& $ruleCache[$rule->name];
if( $ruleList instanceof Less_Tree_Rule || $ruleList instanceof Less_Tree_NameValue ){
$ruleList = $ruleCache[$rule->name] = array( $ruleCache[$rule->name]->toCSS() );
}
$ruleCSS = $rule->toCSS();
if( array_search($ruleCSS,$ruleList) !== false ){
array_splice($rules,$i,1);
}else{
$ruleList[] = $ruleCSS;
}
}
}
}
}
function _mergeRules( &$rules ){
$groups = array();
//obj($rules);
$rules_len = count($rules);
for( $i = 0; $i < $rules_len; $i++ ){
$rule = $rules[$i];
if( ($rule instanceof Less_Tree_Rule) && $rule->merge ){
$key = $rule->name;
if( $rule->important ){
$key .= ',!';
}
if( !isset($groups[$key]) ){
$groups[$key] = array();
}else{
array_splice($rules, $i--, 1);
$rules_len--;
}
$groups[$key][] = $rule;
}
}
foreach($groups as $parts){
if( count($parts) > 1 ){
$rule = $parts[0];
$spacedGroups = array();
$lastSpacedGroup = array();
$parts_mapped = array();
foreach($parts as $p){
if( $p->merge === '+' ){
if( $lastSpacedGroup ){
$spacedGroups[] = self::toExpression($lastSpacedGroup);
}
$lastSpacedGroup = array();
}
$lastSpacedGroup[] = $p;
}
$spacedGroups[] = self::toExpression($lastSpacedGroup);
$rule->value = self::toValue($spacedGroups);
}
}
}
static function toExpression($values){
$mapped = array();
foreach($values as $p){
$mapped[] = $p->value;
}
return new Less_Tree_Expression( $mapped );
}
static function toValue($values){
//return new Less_Tree_Value($values); ??
$mapped = array();
foreach($values as $p){
$mapped[] = $p;
}
return new Less_Tree_Value($mapped);
}
}
/**
* Parser Exception
*
* @package Less
* @subpackage exception
*/
class Less_Exception_Parser extends Exception{
/**
* The current file
*
* @var Less_ImportedFile
*/
public $currentFile;
/**
* The current parser index
*
* @var integer
*/
public $index;
protected $input;
protected $details = array();
/**
* Constructor
*
* @param string $message
* @param Exception $previous Previous exception
* @param integer $index The current parser index
* @param Less_FileInfo|string $currentFile The file
* @param integer $code The exception code
*/
public function __construct($message = null, Exception $previous = null, $index = null, $currentFile = null, $code = 0){
if (PHP_VERSION_ID < 50300) {
$this->previous = $previous;
parent::__construct($message, $code);
} else {
parent::__construct($message, $code, $previous);
}
$this->currentFile = $currentFile;
$this->index = $index;
$this->genMessage();
}
protected function getInput(){
if( !$this->input && $this->currentFile && $this->currentFile['filename'] ){
$this->input = file_get_contents( $this->currentFile['filename'] );
}
}
/**
* Converts the exception to string
*
* @return string
*/
public function genMessage(){
if( $this->currentFile && $this->currentFile['filename'] ){
$this->message .= ' in '.basename($this->currentFile['filename']);
}
if( $this->index !== null ){
$this->getInput();
if( $this->input ){
$line = self::getLineNumber();
$this->message .= ' on line '.$line.', column '.self::getColumn();
$lines = explode("\n",$this->input);
$count = count($lines);
$start_line = max(0, $line-3);
$last_line = min($count, $start_line+6);
$num_len = strlen($last_line);
for( $i = $start_line; $i < $last_line; $i++ ){
$this->message .= "\n".str_pad($i+1,$num_len,'0',STR_PAD_LEFT).'| '.$lines[$i];
}
}
}
}
/**
* Returns the line number the error was encountered
*
* @return integer
*/
public function getLineNumber(){
if( $this->index ){
return substr_count($this->input, "\n", 0, $this->index) + 1;
}
return 1;
}
/**
* Returns the column the error was encountered
*
* @return integer
*/
public function getColumn(){
$part = substr($this->input, 0, $this->index);
$pos = strrpos($part,"\n");
return $this->index - $pos;
}
}
/**
* Chunk Exception
*
* @package Less
* @subpackage exception
*/
class Less_Exception_Chunk extends Less_Exception_Parser{
protected $parserCurrentIndex = 0;
protected $emitFrom = 0;
protected $input_len;
/**
* Constructor
*
* @param string $input
* @param Exception $previous Previous exception
* @param integer $index The current parser index
* @param Less_FileInfo|string $currentFile The file
* @param integer $code The exception code
*/
public function __construct($input, Exception $previous = null, $index = null, $currentFile = null, $code = 0){
$this->message = 'ParseError: Unexpected input'; //default message
$this->index = $index;
$this->currentFile = $currentFile;
$this->input = $input;
$this->input_len = strlen($input);
$this->Chunks();
$this->genMessage();
}
/**
* See less.js chunks()
* We don't actually need the chunks
*
*/
function Chunks(){
$level = 0;
$parenLevel = 0;
$lastMultiCommentEndBrace = null;
$lastOpening = null;
$lastMultiComment = null;
$lastParen = null;
for( $this->parserCurrentIndex = 0; $this->parserCurrentIndex < $this->input_len; $this->parserCurrentIndex++ ){
$cc = $this->CharCode($this->parserCurrentIndex);
if ((($cc >= 97) && ($cc <= 122)) || ($cc < 34)) {
// a-z or whitespace
continue;
}
switch ($cc) {
// (
case 40:
$parenLevel++;
$lastParen = $this->parserCurrentIndex;
continue 2;
// )
case 41:
$parenLevel--;
if( $parenLevel < 0 ){
return $this->fail("missing opening `(`");
}
continue 2;
// ;
case 59:
//if (!$parenLevel) { $this->emitChunk(); }
continue 2;
// {
case 123:
$level++;
$lastOpening = $this->parserCurrentIndex;
continue 2;
// }
case 125:
$level--;
if( $level < 0 ){
return $this->fail("missing opening `{`");
}
//if (!$level && !$parenLevel) { $this->emitChunk(); }
continue 2;
// \
case 92:
if ($this->parserCurrentIndex < $this->input_len - 1) { $this->parserCurrentIndex++; continue 2; }
return $this->fail("unescaped `\\`");
// ", ' and `
case 34:
case 39:
case 96:
$matched = 0;
$currentChunkStartIndex = $this->parserCurrentIndex;
for ($this->parserCurrentIndex = $this->parserCurrentIndex + 1; $this->parserCurrentIndex < $this->input_len; $this->parserCurrentIndex++) {
$cc2 = $this->CharCode($this->parserCurrentIndex);
if ($cc2 > 96) { continue; }
if ($cc2 == $cc) { $matched = 1; break; }
if ($cc2 == 92) { // \
if ($this->parserCurrentIndex == $this->input_len - 1) {
return $this->fail("unescaped `\\`");
}
$this->parserCurrentIndex++;
}
}
if ($matched) { continue 2; }
return $this->fail("unmatched `" + chr($cc) + "`", $currentChunkStartIndex);
// /, check for comment
case 47:
if ($parenLevel || ($this->parserCurrentIndex == $this->input_len - 1)) { continue 2; }
$cc2 = $this->CharCode($this->parserCurrentIndex+1);
if ($cc2 == 47) {
// //, find lnfeed
for ($this->parserCurrentIndex = $this->parserCurrentIndex + 2; $this->parserCurrentIndex < $this->input_len; $this->parserCurrentIndex++) {
$cc2 = $this->CharCode($this->parserCurrentIndex);
if (($cc2 <= 13) && (($cc2 == 10) || ($cc2 == 13))) { break; }
}
} else if ($cc2 == 42) {
// /*, find */
$lastMultiComment = $currentChunkStartIndex = $this->parserCurrentIndex;
for ($this->parserCurrentIndex = $this->parserCurrentIndex + 2; $this->parserCurrentIndex < $this->input_len - 1; $this->parserCurrentIndex++) {
$cc2 = $this->CharCode($this->parserCurrentIndex);
if ($cc2 == 125) { $lastMultiCommentEndBrace = $this->parserCurrentIndex; }
if ($cc2 != 42) { continue; }
if ($this->CharCode($this->parserCurrentIndex+1) == 47) { break; }
}
if ($this->parserCurrentIndex == $this->input_len - 1) {
return $this->fail("missing closing `*/`", $currentChunkStartIndex);
}
}
continue 2;
// *, check for unmatched */
case 42:
if (($this->parserCurrentIndex < $this->input_len - 1) && ($this->CharCode($this->parserCurrentIndex+1) == 47)) {
return $this->fail("unmatched `/*`");
}
continue 2;
}
}
if( $level !== 0 ){
if( ($lastMultiComment > $lastOpening) && ($lastMultiCommentEndBrace > $lastMultiComment) ){
return $this->fail("missing closing `}` or `*/`", $lastOpening);
} else {
return $this->fail("missing closing `}`", $lastOpening);
}
} else if ( $parenLevel !== 0 ){
return $this->fail("missing closing `)`", $lastParen);
}
//chunk didn't fail
//$this->emitChunk(true);
}
function CharCode($pos){
return ord($this->input[$pos]);
}
function fail( $msg, $index = null ){
if( !$index ){
$this->index = $this->parserCurrentIndex;
}else{
$this->index = $index;
}
$this->message = 'ParseError: '.$msg;
}
/*
function emitChunk( $force = false ){
$len = $this->parserCurrentIndex - $this->emitFrom;
if ((($len < 512) && !$force) || !$len) {
return;
}
$chunks[] = substr($this->input, $this->emitFrom, $this->parserCurrentIndex + 1 - $this->emitFrom );
$this->emitFrom = $this->parserCurrentIndex + 1;
}
*/
}
/**
* Compiler Exception
*
* @package Less
* @subpackage exception
*/
class Less_Exception_Compiler extends Less_Exception_Parser{
}
/**
* Parser output with source map
*
* @package Less
* @subpackage Output
*/
class Less_Output_Mapped extends Less_Output {
/**
* The source map generator
*
* @var Less_SourceMap_Generator
*/
protected $generator;
/**
* Current line
*
* @var integer
*/
protected $lineNumber = 0;
/**
* Current column
*
* @var integer
*/
protected $column = 0;
/**
* Array of contents map (file and its content)
*
* @var array
*/
protected $contentsMap = array();
/**
* Constructor
*
* @param array $contentsMap Array of filename to contents map
* @param Less_SourceMap_Generator $generator
*/
public function __construct(array $contentsMap, $generator){
$this->contentsMap = $contentsMap;
$this->generator = $generator;
}
/**
* Adds a chunk to the stack
* The $index for less.php may be different from less.js since less.php does not chunkify inputs
*
* @param string $chunk
* @param string $fileInfo
* @param integer $index
* @param mixed $mapLines
*/
public function add($chunk, $fileInfo = null, $index = 0, $mapLines = null){
//ignore adding empty strings
if( $chunk === '' ){
return;
}
$sourceLines = array();
$sourceColumns = ' ';
if( $fileInfo ){
$url = $fileInfo['currentUri'];
if( isset($this->contentsMap[$url]) ){
$inputSource = substr($this->contentsMap[$url], 0, $index);
$sourceLines = explode("\n", $inputSource);
$sourceColumns = end($sourceLines);
}else{
throw new Exception('Filename '.$url.' not in contentsMap');
}
}
$lines = explode("\n", $chunk);
$columns = end($lines);
if($fileInfo){
if(!$mapLines){
$this->generator->addMapping(
$this->lineNumber + 1, // generated_line
$this->column, // generated_column
count($sourceLines), // original_line
strlen($sourceColumns), // original_column
$fileInfo['currentUri']
);
}else{
for($i = 0, $count = count($lines); $i < $count; $i++){
$this->generator->addMapping(
$this->lineNumber + $i + 1, // generated_line
$i === 0 ? $this->column : 0, // generated_column
count($sourceLines) + $i, // original_line
$i === 0 ? strlen($sourceColumns) : 0, // original_column
$fileInfo['currentUri']
);
}
}
}
if(count($lines) === 1){
$this->column += strlen($columns);
}else{
$this->lineNumber += count($lines) - 1;
$this->column = strlen($columns);
}
// add only chunk
parent::add($chunk);
}
}
/**
* Encode / Decode Base64 VLQ.
*
* @package Less
* @subpackage SourceMap
*/
class Less_SourceMap_Base64VLQ {
/**
* Shift
*
* @var integer
*/
private $shift = 5;
/**
* Mask
*
* @var integer
*/
private $mask = 0x1F; // == (1 << shift) == 0b00011111
/**
* Continuation bit
*
* @var integer
*/
private $continuationBit = 0x20; // == (mask - 1 ) == 0b00100000
/**
* Char to integer map
*
* @var array
*/
private $charToIntMap = array(
'A' => 0, 'B' => 1, 'C' => 2, 'D' => 3, 'E' => 4, 'F' => 5, 'G' => 6,
'H' => 7,'I' => 8, 'J' => 9, 'K' => 10, 'L' => 11, 'M' => 12, 'N' => 13,
'O' => 14, 'P' => 15, 'Q' => 16, 'R' => 17, 'S' => 18, 'T' => 19, 'U' => 20,
'V' => 21, 'W' => 22, 'X' => 23, 'Y' => 24, 'Z' => 25, 'a' => 26, 'b' => 27,
'c' => 28, 'd' => 29, 'e' => 30, 'f' => 31, 'g' => 32, 'h' => 33, 'i' => 34,
'j' => 35, 'k' => 36, 'l' => 37, 'm' => 38, 'n' => 39, 'o' => 40, 'p' => 41,
'q' => 42, 'r' => 43, 's' => 44, 't' => 45, 'u' => 46, 'v' => 47, 'w' => 48,
'x' => 49, 'y' => 50, 'z' => 51, 0 => 52, 1 => 53, 2 => 54, 3 => 55, 4 => 56,
5 => 57, 6 => 58, 7 => 59, 8 => 60, 9 => 61, '+' => 62, '/' => 63,
);
/**
* Integer to char map
*
* @var array
*/
private $intToCharMap = array(
0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G',
7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K', 11 => 'L', 12 => 'M', 13 => 'N',
14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U',
21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b',
28 => 'c', 29 => 'd', 30 => 'e', 31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i',
35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o', 41 => 'p',
42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w',
49 => 'x', 50 => 'y', 51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3',
56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8', 61 => '9', 62 => '+',
63 => '/',
);
/**
* Constructor
*/
public function __construct(){
// I leave it here for future reference
// foreach(str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/') as $i => $char)
// {
// $this->charToIntMap[$char] = $i;
// $this->intToCharMap[$i] = $char;
// }
}
/**
* Convert from a two-complement value to a value where the sign bit is
* is placed in the least significant bit. For example, as decimals:
* 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
* 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
* We generate the value for 32 bit machines, hence -2147483648 becomes 1, not 4294967297,
* even on a 64 bit machine.
* @param string $aValue
*/
public function toVLQSigned($aValue){
return 0xffffffff & ($aValue < 0 ? ((-$aValue) << 1) + 1 : ($aValue << 1) + 0);
}
/**
* Convert to a two-complement value from a value where the sign bit is
* is placed in the least significant bit. For example, as decimals:
* 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
* 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
* We assume that the value was generated with a 32 bit machine in mind.
* Hence
* 1 becomes -2147483648
* even on a 64 bit machine.
* @param integer $aValue
*/
public function fromVLQSigned($aValue){
return $aValue & 1 ? $this->zeroFill(~$aValue + 2, 1) | (-1 - 0x7fffffff) : $this->zeroFill($aValue, 1);
}
/**
* Return the base 64 VLQ encoded value.
*
* @param string $aValue The value to encode
* @return string The encoded value
*/
public function encode($aValue){
$encoded = '';
$vlq = $this->toVLQSigned($aValue);
do
{
$digit = $vlq & $this->mask;
$vlq = $this->zeroFill($vlq, $this->shift);
if($vlq > 0){
$digit |= $this->continuationBit;
}
$encoded .= $this->base64Encode($digit);
} while($vlq > 0);
return $encoded;
}
/**
* Return the value decoded from base 64 VLQ.
*
* @param string $encoded The encoded value to decode
* @return integer The decoded value
*/
public function decode($encoded){
$vlq = 0;
$i = 0;
do
{
$digit = $this->base64Decode($encoded[$i]);
$vlq |= ($digit & $this->mask) << ($i * $this->shift);
$i++;
} while($digit & $this->continuationBit);
return $this->fromVLQSigned($vlq);
}
/**
* Right shift with zero fill.
*
* @param integer $a number to shift
* @param integer $b number of bits to shift
* @return integer
*/
public function zeroFill($a, $b){
return ($a >= 0) ? ($a >> $b) : ($a >> $b) & (PHP_INT_MAX >> ($b - 1));
}
/**
* Encode single 6-bit digit as base64.
*
* @param integer $number
* @return string
* @throws Exception If the number is invalid
*/
public function base64Encode($number){
if($number < 0 || $number > 63){
throw new Exception(sprintf('Invalid number "%s" given. Must be between 0 and 63.', $number));
}
return $this->intToCharMap[$number];
}
/**
* Decode single 6-bit digit from base64
*
* @param string $char
* @return number
* @throws Exception If the number is invalid
*/
public function base64Decode($char){
if(!array_key_exists($char, $this->charToIntMap)){
throw new Exception(sprintf('Invalid base 64 digit "%s" given.', $char));
}
return $this->charToIntMap[$char];
}
}
/**
* Source map generator
*
* @package Less
* @subpackage Output
*/
class Less_SourceMap_Generator extends Less_Configurable {
/**
* What version of source map does the generator generate?
*/
const VERSION = 3;
/**
* Array of default options
*
* @var array
*/
protected $defaultOptions = array(
// an optional source root, useful for relocating source files
// on a server or removing repeated values in the 'sources' entry.
// This value is prepended to the individual entries in the 'source' field.
'sourceRoot' => '',
// an optional name of the generated code that this source map is associated with.
'sourceMapFilename' => null,
// url of the map
'sourceMapURL' => null,
// absolute path to a file to write the map to
'sourceMapWriteTo' => null,
// output source contents?
'outputSourceFiles' => false,
// base path for filename normalization
'sourceMapBasepath' => ''
);
/**
* The base64 VLQ encoder
*
* @var Less_SourceMap_Base64VLQ
*/
protected $encoder;
/**
* Array of mappings
*
* @var array
*/
protected $mappings = array();
/**
* The root node
*
* @var Less_Tree_Ruleset
*/
protected $root;
/**
* Array of contents map
*
* @var array
*/
protected $contentsMap = array();
/**
* File to content map
*
* @var array
*/
protected $sources = array();
/**
* Constructor
*
* @param Less_Tree_Ruleset $root The root node
* @param array $options Array of options
*/
public function __construct(Less_Tree_Ruleset $root, $contentsMap, $options = array()){
$this->root = $root;
$this->contentsMap = $contentsMap;
$this->encoder = new Less_SourceMap_Base64VLQ();
$this->SetOptions($options);
// fix windows paths
if( isset($this->options['sourceMapBasepath']) ){
$this->options['sourceMapBasepath'] = str_replace('\\', '/', $this->options['sourceMapBasepath']);
}
}
/**
* Generates the CSS
*
* @return string
*/
public function generateCSS(){
$output = new Less_Output_Mapped($this->contentsMap, $this);
// catch the output
$this->root->genCSS($output);
$sourceMapUrl = $this->getOption('sourceMapURL');
$sourceMapFilename = $this->getOption('sourceMapFilename');
$sourceMapContent = $this->generateJson();
$sourceMapWriteTo = $this->getOption('sourceMapWriteTo');
if( !$sourceMapUrl && $sourceMapFilename ){
$sourceMapUrl = $this->normalizeFilename($sourceMapFilename);
}
// write map to a file
if( $sourceMapWriteTo ){
$this->saveMap($sourceMapWriteTo, $sourceMapContent);
}
// inline the map
if( !$sourceMapUrl ){
$sourceMapUrl = sprintf('data:application/json,%s', Less_Functions::encodeURIComponent($sourceMapContent));
}
if( $sourceMapUrl ){
$output->add( sprintf('/*# sourceMappingURL=%s */', $sourceMapUrl) );
}
return $output->toString();
}
/**
* Saves the source map to a file
*
* @param string $file The absolute path to a file
* @param string $content The content to write
* @throws Exception If the file could not be saved
*/
protected function saveMap($file, $content){
$dir = dirname($file);
// directory does not exist
if( !is_dir($dir) ){
// FIXME: create the dir automatically?
throw new Exception(sprintf('The directory "%s" does not exist. Cannot save the source map.', $dir));
}
// FIXME: proper saving, with dir write check!
if(file_put_contents($file, $content) === false){
throw new Exception(sprintf('Cannot save the source map to "%s"', $file));
}
return true;
}
/**
* Normalizes the filename
*
* @param string $filename
* @return string
*/
protected function normalizeFilename($filename){
$filename = str_replace('\\', '/', $filename);
$basePath = $this->getOption('sourceMapBasepath');
if( $basePath && ($pos = strpos($filename, $basePath)) !== false ){
$filename = substr($filename, $pos + strlen($basePath));
if(strpos($filename, '\\') === 0 || strpos($filename, '/') === 0){
$filename = substr($filename, 1);
}
}
return sprintf('%s%s', $this->getOption('sourceMapRootpath'), $filename);
}
/**
* Adds a mapping
*
* @param integer $generatedLine The line number in generated file
* @param integer $generatedColumn The column number in generated file
* @param integer $originalLine The line number in original file
* @param integer $originalColumn The column number in original file
* @param string $sourceFile The original source file
*/
public function addMapping($generatedLine, $generatedColumn, $originalLine, $originalColumn, $sourceFile){
$this->mappings[] = array(
'generated_line' => $generatedLine,
'generated_column' => $generatedColumn,
'original_line' => $originalLine,
'original_column' => $originalColumn,
'source_file' => $sourceFile
);
$norm_file = $this->normalizeFilename($sourceFile);
$this->sources[$norm_file] = $sourceFile;
}
/**
* Generates the JSON source map
*
* @return string
* @see https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#
*/
protected function generateJson(){
$sourceMap = array();
$mappings = $this->generateMappings();
// File version (always the first entry in the object) and must be a positive integer.
$sourceMap['version'] = self::VERSION;
// An optional name of the generated code that this source map is associated with.
$file = $this->getOption('sourceMapFilename');
if( $file ){
$sourceMap['file'] = $file;
}
// An optional source root, useful for relocating source files on a server or removing repeated values in the 'sources' entry. This value is prepended to the individual entries in the 'source' field.
$root = $this->getOption('sourceRoot');
if( $root ){
$sourceMap['sourceRoot'] = $root;
}
// A list of original sources used by the 'mappings' entry.
$sourceMap['sources'] = array_keys($this->sources);
// A list of symbol names used by the 'mappings' entry.
$sourceMap['names'] = array();
// A string with the encoded mapping data.
$sourceMap['mappings'] = $mappings;
if( $this->getOption('outputSourceFiles') ){
// An optional list of source content, useful when the 'source' can't be hosted.
// The contents are listed in the same order as the sources above.
// 'null' may be used if some original sources should be retrieved by name.
$sourceMap['sourcesContent'] = $this->getSourcesContent();
}
// less.js compat fixes
if( count($sourceMap['sources']) && empty($sourceMap['sourceRoot']) ){
unset($sourceMap['sourceRoot']);
}
return json_encode($sourceMap);
}
/**
* Returns the sources contents
*
* @return array|null
*/
protected function getSourcesContent(){
if(empty($this->sources)){
return;
}
$content = array();
foreach($this->sources as $sourceFile){
$content[] = file_get_contents($sourceFile);
}
return $content;
}
/**
* Generates the mappings string
*
* @return string
*/
public function generateMappings(){
if( !count($this->mappings) ){
return '';
}
// group mappings by generated line number.
$groupedMap = $groupedMapEncoded = array();
foreach($this->mappings as $m){
$groupedMap[$m['generated_line']][] = $m;
}
ksort($groupedMap);
$lastGeneratedLine = $lastOriginalIndex = $lastOriginalLine = $lastOriginalColumn = 0;
foreach($groupedMap as $lineNumber => $line_map){
while(++$lastGeneratedLine < $lineNumber){
$groupedMapEncoded[] = ';';
}
$lineMapEncoded = array();
$lastGeneratedColumn = 0;
foreach($line_map as $m){
$mapEncoded = $this->encoder->encode($m['generated_column'] - $lastGeneratedColumn);
$lastGeneratedColumn = $m['generated_column'];
// find the index
if( $m['source_file'] ){
$index = $this->findFileIndex($this->normalizeFilename($m['source_file']));
if( $index !== false ){
$mapEncoded .= $this->encoder->encode($index - $lastOriginalIndex);
$lastOriginalIndex = $index;
// lines are stored 0-based in SourceMap spec version 3
$mapEncoded .= $this->encoder->encode($m['original_line'] - 1 - $lastOriginalLine);
$lastOriginalLine = $m['original_line'] - 1;
$mapEncoded .= $this->encoder->encode($m['original_column'] - $lastOriginalColumn);
$lastOriginalColumn = $m['original_column'];
}
}
$lineMapEncoded[] = $mapEncoded;
}
$groupedMapEncoded[] = implode(',', $lineMapEncoded) . ';';
}
return rtrim(implode($groupedMapEncoded), ';');
}
/**
* Finds the index for the filename
*
* @param string $filename
* @return integer|false
*/
protected function findFileIndex($filename){
return array_search($filename, array_keys($this->sources));
}
}
PK ��!]�P� � old.lessnu &1i� /**
* @package Tabs
* @version 5.3.0
*
* @author Peter van Westen <peter@nonumber.nl>
* @link http://www.nonumber.nl
* @copyright Copyright © 2016 NoNumber All Rights Reserved
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
*/
/*
* You can override this stylesheet by creating your own in:
* /templates/[YOUR TEMPLATE]/css/tabs/old.min.css
*/
@import "../../nnframework/less/init.less";
@import "bootstrap.less";
.nn_tabs.oldschool {
> ul {
margin: 5px 10px 0 10px !important;
line-height: 1em;
zoom: 1; // Fix for IE height issue
padding: 0 !important;
list-style: none !important;
list-style-image: none !important;
background: none !important;
border: none !important;
> li {
float: left;
margin: 5px 2px 0 0 !important;
padding: 0;
list-style: none !important;
list-style-image: none !important;
background: none !important;
&:before {
content: "";
margin: 0;
padding: 0;
}
// Tabs
> a,
> a:link,
> a:visited,
> a:active,
> a:hover {
color: #666666;
outline: 0;
text-decoration: none;
}
> a,
> a:hover {
display: block;
width: auto;
_width: 0;
padding: 5px;
font-size: 14px;
line-height: 1em !important;
font-weight: bold;
white-space: nowrap;
border: solid 1px @btnBorder;
border-bottom: none;
text-decoration: none !important;
#gradient > .vertical(@white, @white);
.border-radius(10px 10px 0 0);
}
&.blue > a, &.blue > a:hover,
&.green > a, &.green > a:hover,
&.red > a, &.red > a:hover,
&.orange > a, &.orange > a:hover,
&.grey > a, &.grey > a:hover,
&.gray > a, &.gray > a:hover,
&.primary > a, &.primary > a:hover,
&.info > a, &.info > a:hover,
&.success > a, &.success > a:hover,
&.warning > a, &.warning > a:hover,
&.danger > a, &.danger > a:hover,
&.error > a, &.error > a:hover {
padding: 5px 5px 0 5px;
border: solid 1px @btnBorder !important;
border-bottom: none !important;
.border-radius(10px 10px 0 0);
}
@bgcolor: @btnPrimaryBackground;
// Active state
&.active > a,
&.active > a:hover {
color: @white;
#gradient > .vertical(lighten(@bgcolor, 15%), lighten(@bgcolor, 0%));
}
// Hover state
> a:hover {
color: @grayDark;
#gradient > .vertical(lighten(@bgcolor, 30%), lighten(@bgcolor, 20%));
}
span.nn_tabs-title-inactive {
display: inherit;
}
span.nn_tabs-title-active {
display: none;
}
&.active {
span.nn_tabs-title-inactive {
display: none;
}
span.nn_tabs-title-active {
display: inherit;
}
}
}
}
// Content area
> .tab-content {
margin: 0;
padding: 0;
margin-bottom: 10px;
border: none !important;
> .tab-pane {
margin: 0;
margin-bottom: 10px;
clear: left;
padding: 10px 20px;
border: 1px solid @btnBorder;
.border-radius(10px);
}
}
.nn_tabs-scroll {
position: relative;
visibility: hidden;
padding: 0;
}
.nav-tabs-sm {
display: none;
}
.nn_tabs-title {
display: none;
}
.tabColor(@name, @color) {
> li.@{name} {
// Normal state
> a {
#gradient > .vertical(lighten(@color, 40%), lighten(@color, 30%));
// Hover state
&:hover {
#gradient > .vertical(lighten(@color, 30%), lighten(@color, 15%));
}
}
// Active state
&.active {
> a,
> a:hover {
#gradient > .vertical(lighten(@color, 15%), lighten(@color, 0%));
}
}
}
}
> ul {
// Style: blue
.tabColor(~'blue', @btnPrimaryBackground);
.tabColor(~'primary', @btnPrimaryBackground);
// Style: info
.tabColor(~'info', @btnInfoBackgroundHighlight);
// Style: green / success
.tabColor(~'green', @btnSuccessBackgroundHighlight);
.tabColor(~'success', @btnSuccessBackgroundHighlight);
// Style: orange / warning
.tabColor(~'orange', @btnWarningBackgroundHighlight);
.tabColor(~'warning', @btnWarningBackgroundHighlight);
// Style: red / danger
.tabColor(~'red', @btnDangerBackgroundHighlight);
.tabColor(~'danger', @btnDangerBackgroundHighlight);
.tabColor(~'error', @btnDangerBackgroundHighlight);
// Style: grey / gray
.tabColor(~'grey', #777777);
.tabColor(~'gray', #777777);
}
}
PK ��!]t&S$ $ custom.lessnu &1i� /**
* @package Tabs
* @version 8.0.1
*
* @author Peter van Westen <info@regularlabs.com>
* @link http://www.regularlabs.com
* @copyright Copyright © 2021 Regular Labs All Rights Reserved
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
*/
/*
* This is an example of how you can create custom styles
* Do not edit this file, as it will not be loaded by default and will get overwritten if you update Tabs
* Place your own custom styles in your templates stylesheet
* or copy the style.css file to /templates/[YOUR TEMPLATE]/css/tabs/style.min.css and customise that
*/
@import "../../regularlabs/less/init.less";
/* Custom Style: mystyle1 */
.rl_tabs.top {
> ul.nav {
> li.mystyle1 {
> a {
.transition-duration(0s);
font-size: 22px;
#gradient > .vertical(#ff9999, #ffffff);
background-color: #ffffff;
&:hover {
#gradient > .vertical(#9999ff, #ffffff);
background-color: #ffffff;
}
}
&.active {
> a,
> a:hover {
#gradient > .vertical(#99ff99, #ffffff);
background-color: #ffffff;
}
}
}
}
> .tab-content {
> .tab-pane.mystyle1 {
#gradient > .vertical-three-colors(#ffffff, #ffffff, 25%, #ccffcc);
}
}
}
/* Custom Style: mystyle2 */
.rl_tabs.top {
> ul.nav {
> li.mystyle2 {
> a {
.transition-duration(1s);
font-family: @monoFontFamily;
.border-radius(0 0 0 0);
margin-left: 10px;
margin-right: 10px;
padding: 8px 20px;
background-color: #aaaaaa;
color: #ffffff;
border-color: #666666;
border-bottom-color: #dddddd;
&:hover {
background-color: #999999;
border-color: #666666;
}
}
&.active {
> a,
> a:hover {
.border-radius(0 30px 0 0);
background-color: #666666;
border-color: #666666;
}
}
}
}
> .tab-content {
> .tab-pane.mystyle2 {
font-family: @monoFontFamily;
background-color: #666666;
color: #ffffff;
}
}
}
PK ��!]>�"� � bootstrap.lessnu &1i� /*!
* Bootstrap v2.3.2
*
* Copyright 2012 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world @twitter by @mdo and @fat.
*/
// Core variables and mixins
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
// CSS Reset
@import "reset.less";
// Grid system and page structure
@import "scaffolding.less";
@import "grid.less";
@import "layouts.less";
// Base CSS
@import "type.less";
@import "code.less";
@import "forms.less";
@import "tables.less";
// Components: common
@import "sprites.less";
@import "dropdowns.less";
@import "wells.less";
@import "component-animations.less";
@import "close.less";
// Components: Buttons & Alerts
@import "buttons.less";
@import "button-groups.less";
@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
// Components: Nav
@import "navs.less";
@import "navbar.less";
@import "breadcrumbs.less";
@import "pagination.less";
@import "pager.less";
// Components: Popovers
@import "modals.less";
@import "tooltip.less";
@import "popovers.less";
// Components: Misc
@import "thumbnails.less";
@import "media.less";
@import "labels-badges.less";
@import "progress-bars.less";
@import "accordion.less";
@import "carousel.less";
@import "hero-unit.less";
// Utility classes
@import "utilities.less"; // Has to be last to override when necessary
PK ��!]5z�5 5
popup.lessnu &1i� /**
* @package Tabs
* @version 8.0.1
*
* @author Peter van Westen <info@regularlabs.com>
* @link http://www.regularlabs.com
* @copyright Copyright © 2021 Regular Labs All Rights Reserved
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
*/
@import "../../regularlabs/less/init.less";
#myTabContent {
h1 > span.icon-default {
font-size: 18px;
vertical-align: top;
}
label[for$="_default0"] {
display: none;
}
label[for$="_default1"] {
.border-radius(@baseBorderRadius);
}
}
PK ��!]=u�t?. ?.
style.lessnu &1i� /**
* @package Tabs
* @version 8.0.1
*
* @author Peter van Westen <info@regularlabs.com>
* @link http://www.regularlabs.com
* @copyright Copyright © 2021 Regular Labs All Rights Reserved
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
*/
/*
* You can override this stylesheet by creating your own in:
* /templates/[YOUR TEMPLATE]/css/tabs/style.min.css
*/
@import "../../regularlabs/less/init.less";
@import "bootstrap.less";
@background-color: #f5f5f5;
@background-color-hover: #eeeeee;
@border-color: #dddddd;
@border-color-focus: #eab03f;
span.rl_tabs-title-inactive {
display: inherit;
}
span.rl_tabs-title-active {
display: none;
}
.rl_tabs-responsive,
.rl_tabs {
.clearfix();
margin-bottom: 1em;
&:last-child {
margin-bottom: 0;
}
}
.rl_tabs {
> ul.nav-tabs {
> li {
/* Reset styles to prevent templates li styles from messing stuff up */
margin: 0 !important;
margin-bottom: -1px !important;
padding: 0 !important;
list-style: none !important;
list-style-image: none !important;
background: none !important;
overflow-y: visible !important;
&:before {
content: "";
margin: 0;
padding: 0;
}
> a {
display: block !important;
.transition-duration(.2s);
color: @linkColor;
text-decoration: none;
line-height: inherit;
&:hover {
color: @linkColorHover;
text-decoration: none;
}
}
> a:focus,
&.active > a:focus {
outline: none;
border-color: @border-color-focus;
}
&.active {
span.rl_tabs-title-inactive {
display: none;
}
span.rl_tabs-title-active {
display: inherit;
}
}
}
}
> .tab-content {
padding: 0;
background-color: #ffffff;
> .tab-pane {
padding: 12px 0;
overflow-x: auto;
overflow-y: hidden;
& > :first-child {
margin-top: 0;
}
& > :last-child {
margin-bottom: 0;
}
.rl_tabs-title {
display: none;
}
}
}
.rl_tabs-scroll,
.rl_tabs-sm-scroll {
position: relative;
visibility: hidden;
padding: 0;
}
// Outline Content
&.outline_content {
> .tab-content {
border: 1px solid @border-color;
border-top: none;
.border-radius(0 0 4px 4px);
> .tab-pane {
padding: 12px;
}
}
> ul.nav-tabs {
margin-bottom: 0;
}
}
// Outline Tabs
&.outline_handles {
ul.nav-tabs > li {
a,
a:hover {
border: 1px solid @border-color;
}
}
}
&.color_inactive_handles {
> ul.nav {
> li {
> a {
background-color: @background-color;
margin-right: 5px;
&:hover {
background-color: @background-color-hover;
}
}
&.active {
> a,
> a:hover {
background-color: #ffffff;
}
}
}
}
}
// Right Alignment
&.align_right {
> ul.nav-tabs {
> li {
float: right;
> a {
margin-left: 2px;
margin-right: 0;
}
}
}
}
// Centered Alignment
&.align_center {
> ul.nav-tabs {
text-align: center;
> li {
float: none;
display: inline-block;
.ie7-inline-block();
margin-left: -1px;
margin-right: -3px;
}
}
}
// Justified Alignment
&.align_justify {
> ul.nav-tabs {
text-align: center;
display: table;
width: 100%;
margin-bottom: -1px;
> .rl_tabs-scroll {
display: table-cell;
}
> li {
float: none;
display: table-cell;
&:last-child > a {
margin-right: 0;
}
a,
a:hover {
margin-bottom: -1px;
border-bottom: 1px solid transparent;
}
}
&:before {
display: none;
}
&:after {
display: none;
}
}
&.bottom {
> ul.nav-tabs {
margin-bottom: 0;
margin-top: -1px;
> li {
a,
a:hover {
margin-bottom: 0;
margin-top: -1px;
border-bottom: 1px solid @border-color;
border-top: 1px solid transparent;
}
}
}
}
}
// Classes: Normal state + Hover state
&.top {
.tabColor(@name, @color) {
> ul.nav-tabs {
> li.@{name} {
> a,
> a:hover {
border-top: 5px solid lighten(@color, 20%);
padding-top: 4px;
.border-radius(5px 5px 0 0);
}
> a:hover, // Hover state
&.active > a {
// Active state
border-top-color: @color;
}
}
}
}
> ul.nav-tabs {
> li {
> a {
border-bottom-color: @border-color;
}
> a:focus,
&.active > a:focus {
border-bottom-color: transparent;
.box-shadow(0 -2px 2px rgba(234, 176, 63, 0.5));
}
}
> li.active {
a,
a:hover {
border-bottom-color: transparent;
}
}
}
.tabColors();
}
&.bottom {
.tabColor(@name, @color) {
> .nav-tabs {
> li.@{name} {
> a,
> a:hover {
border-bottom: 5px solid lighten(@color, 20%);
padding-bottom: 4px;
.border-radius(0 0 5px 5px);
}
> a:hover, // Hover state
&.active > a {
// Active state
border-bottom-color: @color;
}
}
}
}
> .nav-tabs {
border-bottom: 0;
margin-bottom: 18px !important;
border-top: 1px solid @border-color;
> li {
margin-top: -1px !important;
margin-bottom: 0 !important;
// Actual tabs (as links)
> a {
border-top-color: @border-color;
.border-radius(0 0 4px 4px);
&:hover {
border-color: transparent;
border-top-color: @border-color;
}
}
// Active state, and it's :hover to override normal :hover
&.active > a,
&.active > a:hover {
border-color: @border-color;
border-top-color: transparent;
}
> a:focus,
&.active > a:focus {
border-top-color: transparent;
.box-shadow(0 2px 2px rgba(234, 176, 63, 0.5));
}
}
}
.tabColors();
&.outline_content {
> .tab-content {
margin: 0;
border: 1px solid @border-color;
border-bottom: none;
.border-radius(4px 4px 0 0);
}
}
}
&.left,
&.right {
> .nav-tabs {
border-bottom: 0;
margin-bottom: 18px !important;
> li {
float: none;
> a {
min-width: 74px;
margin-right: 0 !important;
margin-bottom: 3px;
}
}
}
&.outline_content {
> .tab-content {
border: 1px solid @border-color;
}
}
}
&.left {
.tabColor(@name, @color) {
> .nav-tabs {
> li.@{name} {
> a,
> a:hover {
border-left: 5px solid lighten(@color, 20%);
padding-left: 7px;
.border-radius(5px 0 0 5px);
}
> a:hover, // Hover state
&.active > a {
// Active state
border-left-color: @color;
}
}
}
}
> .nav-tabs {
float: left;
margin-right: 19px;
border-right: 1px solid @border-color;
> li {
margin-right: -1px !important;
margin-bottom: 0 !important;
> a {
.border-radius(4px 0 0 4px);
&:hover {
border-color: transparent;
border-right-color: @border-color;
}
}
// Active state, and it's :hover to override normal :hover
&.active > a,
&.active > a:hover {
border-color: @border-color;
border-right-color: transparent;
}
> a:focus,
&.active > a:focus {
border-right-color: transparent;
.box-shadow(-2px 0 2px rgba(234, 176, 63, 0.5));
}
}
}
.tabColors();
&.outline_content {
> .tab-content {
.border-radius(0 4px 4px 4px);
}
}
}
&.right {
.tabColor(@name, @color) {
> .nav-tabs {
> li.@{name} {
> a,
> a:hover {
border-right: 5px solid lighten(@color, 20%);
padding-right: 7px;
.border-radius(0 5px 5px 0);
}
> a:hover, // Hover state
&.active > a {
// Active state
border-right-color: @color;
}
}
}
}
> .nav-tabs {
float: right;
margin-left: 19px;
border-left: 1px solid @border-color;
> li {
margin-left: -1px !important;
margin-bottom: 0 !important;
> a {
.border-radius(0 4px 4px 0);
&:hover {
border-color: transparent;
border-left-color: @border-color;
}
}
&.active > a,
&.active > a:hover {
border-color: @border-color;
border-left-color: transparent;
}
> a:focus,
&.active > a:focus {
border-left-color: transparent;
.box-shadow(2px 0 2px rgba(234, 176, 63, 0.5));
}
}
}
.tabColors();
&.outline_content {
> .tab-content {
.border-radius(4px 0 4px 4px);
}
}
}
.tabColor(@name, @color) {
> ul.nav-tabs {
> li.@{name} {
&.solid {
> a,
> a:hover {
background-color: lighten(@color, 20%);
border-color: lighten(@color, 20%);
color: #ffffff;
}
> a:hover, // Hover state
&.active > a {
// Active state
background-color: @color;
border-color: @color
}
}
}
}
&.outline_content {
> .tab-content {
> .tab-pane.color_content.@{name} {
margin: 0 -1px -1px -1px;
border: 2px solid @color;
.border-radius(0 0 4px 4px);
}
}
}
> .tab-content {
> .tab-pane.solid.color_content.@{name} {
background-color: lighten(@color, 50%);
}
}
}
.tabColors();
}
ul.rl_tabs-sm {
display: none;
}
@media (max-width: 767px) {
.rl_tabs-responsive {
> ul.rl_tabs-sm {
display: block;
}
> .rl_tabs {
.clearfix();
> ul.nav-tabs {
display: none;
}
> .tab-content {
> .tab-pane {
display: block;
visibility: visible;
.rl_tabs-title {
display: block;
}
}
}
.fade {
opacity: 1;
}
// Outline Content
&.outline_content {
> .tab-content {
border: none;
> .tab-pane {
border: 1px solid @border-color;
.border-radius(4px);
margin-bottom: 1em;
padding: 12px;
}
}
}
}
.tabColor(@name, @color) {
> ul.rl_tabs-sm {
> li.@{name} {
> a,
> a:hover {
border: 2px solid lighten(@color, 20%);
border-bottom-width: 3px;
}
&:last-child > a,
> a:hover {
border-bottom-width: 2px;
}
&.solid {
> a,
> a:hover {
background-color: lighten(@color, 20%);
border-color: lighten(@color, 20%);
color: #ffffff;
}
> a:hover, // Hover state
&.active > a {
// Active state
background-color: @color;
border-color: @color
}
}
}
}
> .rl_tabs {
&.outline_content {
> .tab-content {
> .tab-pane.@{name} {
border: 2px solid lighten(@color, 20%);
}
}
}
}
}
.tabColors();
}
}
@media print {
.rl_tabs > .nav-tabs,
.rl_tabs-sm {
display: none !important;
}
.rl_tabs > .tab-content,
.rl_tabs > .tab-content > .rl_tabs-pane {
display: block !important;
opacity: 1 !important;
}
.rl_tabs-title {
display: block !important;
}
}
.tabColors() {
// Style: blue
.tabColor(~'blue', @btnPrimaryBackground);
.tabColor(~'primary', @btnPrimaryBackground);
// Style: info
.tabColor(~'info', @btnInfoBackgroundHighlight);
// Style: green / success
.tabColor(~'green', @btnSuccessBackgroundHighlight);
.tabColor(~'success', @btnSuccessBackgroundHighlight);
// Style: orange / warning
.tabColor(~'orange', @btnWarningBackgroundHighlight);
.tabColor(~'warning', @btnWarningBackgroundHighlight);
// Style: red / danger
.tabColor(~'red', @btnDangerBackgroundHighlight);
.tabColor(~'danger', @btnDangerBackgroundHighlight);
.tabColor(~'error', @btnDangerBackgroundHighlight);
// Style: grey / gray
.tabColor(~'grey', #808080);
.tabColor(~'gray', #808080);
}
PK M�!]��.� � t3-responsive.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: https://github.com/t3framework/
*------------------------------------------------------------------------------
*/
//
// NAVIGATION RESPONSIVE
// ---------------------------------------------------------
@media (max-width: @navbarCollapseWidth) {
// Always show submenu for navigation
.always-show .mega > .mega-dropdown-menu,
.always-show .dropdown-menu {
display: block !important;
}
// ------------------------------------------------------
// Support fixed navbar when collapsed
// -------------------------------------------------------
.navbar-collapse-fixed-top,
.navbar-collapse-fixed-bottom {
border-top: none;
position: fixed;
left: 0;
top: 0;
width: 100%;
z-index: 1000;
// style for normal collapsed menu
.nav-collapse {
position: absolute;
width: 100%;
left: 0;
top: @navbarHeight + 1;
margin: 0;
&.in {
overflow-y: auto;
-webkit-overflow-scrolling: touch;
> * {
-webkit-transform: translateZ(0);
}
}
}
.nav-collapse.animate {
overflow: hidden;
}
}
.navbar-collapse-fixed-bottom {
bottom: 0;
top: auto;
.nav-collapse {
bottom: @navbarHeight + 1;
top: auto;
}
.btn-navbar {
position: absolute;
bottom: 0;
}
}
.logo-control {
.logo-img-sm {
display: block;
}
.logo-img {
display: none;
}
}
}PK M�!]�X� � grid-ext-responsive.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// Wide display
// ----------------------------------
@media (min-width: 980px) and (max-width: 1199px) {
// Fixed grid
#grid > .core(@gridColumnWidth980, @gridGutterWidth980);
// Fluid grid
#grid > .fluid(@fluidGridColumnWidth980, @fluidGridGutterWidth980);
// Input grid
#grid > .input(@gridColumnWidth980, @gridGutterWidth980);
// No need to reset .thumbnails here since it's the same @gridGutterWidth
}
// Extend for grid left offset, fluid
// PORTRAIT TABLET TO DEFAULT DESKTOP
// ----------------------------------
// Offset
@media (min-width: 768px) and (max-width: 979px) {
// Fixed grid
#grid-extend > .offset(@gridColumnWidth768, @gridGutterWidth768);
}
@media (min-width: 980px) and (max-width: 1199px) {
// Fixed grid
#grid-extend > .offset(@gridColumnWidth980, @gridGutterWidth980);
}
@media (min-width: 1200px) {
// Fixed grid
#grid-extend > .offset(@gridColumnWidth1200, @gridGutterWidth1200);
}
// Fluid for small display
@media (min-width: 600px) and (max-width: 767px) {
// Fluid grid
#grid-extend > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);
// Remove left spacing
.spanfirst { margin-left: 0 !important; clear: left; }
}
// Width by percentage
//---------------------
// 2 cols
.row, .row-fluid {
.span50 {width: 50%; float: left;}
// 3 cols
.span33 {width: 33.3333%; float: left;}
// 4 cols
.span25 {width: 25%; float: left;}
// 5 cols
.span20 {width: 20%; float: left;}
// 6 cols
.span16 {width: 16.6666%; float: left;}
}
// Visibility utilities
// For desktops
.hidden-default { display: none !important; }
// Wide screen
@media (min-width: 1200px) {
// Hide everything else
.hidden-wide { display: none !important; }
}
// Normal desktops only
@media (min-width: 980px) and (max-width: 1199px) {
// Hide everything else
.hidden-normal { display: none !important; }
}
// XTablet only
@media (min-width: 768px) and (max-width: 979px) {
// Hide everything else
.hidden-xtablet { display: none !important; }
}
// Tablet only
@media (min-width: 600px) and (max-width: 767px) {
// Hide everything else
.hidden-tablet { display: none !important; }
}
// Phones only
@media (max-width: 599px) {
// Hide everything else
.hidden-mobile { display: none !important; }
}
PK M�!]��iQ� � off-canvas.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// VARIABLES & MIXINS
// ------------------
// Prevent Bootstrap Upgrading errors
@import "../bootstrap/less/variables.less";
// T3 Base variables
@import "variables.less";
// -------------------------------------------------------
// OFF-CANVAS NAVIGATIONS ELEMENTS
// -------------------------------------------------------
#off-canvas-nav {
display: none;
}
@media (max-width: @navbarCollapseWidth) {
.off-canvas {
width: 100%;
overflow-x: hidden;
position: relative;
body {
width: 100%;
overflow-x: hidden;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
body > * {
left: 0;
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-o-transform: translateX(0);
transform: translateX(0);
-webkit-transition: -webkit-transform 500ms ease;
-moz-transition: -moz-transform 500ms ease;
-o-transition: -o-transform 500ms ease;
transition: transform 500ms ease;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
}
#t3-mainnav .nav-collapse,
#ja-mainnav .nav-collapse {
display: none;
}
#off-canvas-nav {
display: block;
position: absolute;
top: 0;
left: 0;
width: 0;
z-index: 1;
background: none;
.t3-mainnav {
margin: 0;
position: absolute;
left: 0;
top: 0;
width: @T3OffCanvasWidth;
-webkit-transform: translateX(-100%);
-moz-transform: translateX(-100%);
-o-transform: translateX(-100%);
transform: translateX(-100%);
.nav-collapse {
height: auto;
background: none;
}
}
}
}
// On stage
// --------
.off-canvas-enabled {
body > *{
-webkit-transform: translateX(@T3OffCanvasWidth);
-moz-transform: translateX(@T3OffCanvasWidth);
-o-transform: translateX(@T3OffCanvasWidth);
transform: translateX(@T3OffCanvasWidth);
}
#t3-mainnav {
display: block;
}
//End
}
// End Responsive
}PK M�!]��d� rtl/megamenu.lessnu &1i� html[dir="rtl"] {
.t3-megamenu {
.mega-align-center > .dropdown-menu {
.translate(50%, 0);
}
&.animate.zoom {
.mega > .mega-dropdown-menu {
-webkit-transform-origin: 80% 20%;
-moz-transform-origin: 80% 20%;
transform-origin: 80% 20%;
}
//special case for level 0
.level0 > .mega-align-center {
> .mega-dropdown-menu {
-webkit-transform: scale(0, 0) translate(50%, 0);
-ms-transform: scale(0, 0) translate(50%, 0);
transform: scale(0, 0) translate(50%, 0);
-webkit-transform-origin: 100% 20%;
-moz-transform-origin: 100% 20%;
transform-origin: 100% 20%;
}
&.open > .mega-dropdown-menu {
-webkit-transform: scale(1, 1) translate(50%, 0);
-ms-transform: scale(1, 1) translate(50%, 0);
transform: scale(1, 1) translate(50%, 0);
}
}
}
&.animate.elastic {
.level0 {
> .mega-align-center {
> .mega-dropdown-menu {
transform: scale(1,0) translate(50%, 0);
-webkit-transform: scale(1,0) translate(50%, 0);
-ms-transform: scale(1,0) translate(50%, 0);
}
&.open > .mega-dropdown-menu {
transform: scale(1,1) translate(50%, 0);
-webkit-transform: scale(1,1) translate(50%, 0);
-ms-transform: scale(1,1) translate(50%, 0);
}
}
}
}
}
}PK M�!]�3� � rtl/off-canvas.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
@media (max-width: @navbarCollapseWidth) {
.off-canvas {
body > * {
left: 0;
-webkit-transform: translateX(0%);
-moz-transform: translateX(0%);
-o-transform: translateX(0%);
transform: translateX(0%);
}
#off-canvas-nav {
.t3-mainnav {
-webkit-transform: translateX(100%);
-moz-transform: translateX(100%);
-o-transform: translateX(100%);
transform: translateX(100%);
}
}
}
.off-canvas-enabled {
body > *{
-webkit-transform: translateX(-@T3OffCanvasWidth);
-moz-transform: translateX(-@T3OffCanvasWidth);
-o-transform: translateX(-@T3OffCanvasWidth);
transform: translateX(-@T3OffCanvasWidth);
}
}
}PK M�!]��ͣ layout-preview.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// CSS Reset
@import "../bootstrap/less/reset.less";
// VARIABLES & MIXINS
// ------------------
// Prevent Bootstrap Upgrading errors
@import "../bootstrap/less/variables.less";
// Bootstrap mixins
@import "../bootstrap/less/mixins.less";
// T3 mixins
@import "mixins.less";
// T3 CUSTOM LAYOUT
// ------------------
.t3-admin-layout-preview {
//
// Grid system - By bootstrap
// --------------------------------------------------
width: 600px;
max-width: 100%;
// Reset utility classes due to specificity
[class*="span"].hide,
.row-fluid [class*="span"].hide {
display: none;
}
[class*="span"].pull-right,
.row [class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
float: right;
}
//
// Grid system - Extended by T3
// --------------------------------------------------
// Added "wrap" element
.wrap {
width: auto;
clear: both;
}
.container, .container-fluid {
width: 100%;
}
// Fluid grid
#grid-extend > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
// first col
.spanfirst { margin-left: 0 !important; }
// Fix offset
#grid-extend > .fixOffsetX(@fluidGridColumnWidth, @fluidGridGutterWidth);
// T3 Note: ensure those elements work good with floating elements
.t3-admin-layout-section,
header,
footer,
section,
nav,
.t3-spotlight,
.t3-content,
.t3-sidebar,
.t3-mastcol {
.clearfix();
}
// Width by percentage
//---------------------
// 1 cols
.row .span100 {width: 100%; float: left;}
// 2 cols
.row .span50 {width: 50%; float: left;}
// 3 cols
.row .span33 {width: 33.3333%; float: left;}
// 4 cols
.row .span25 {width: 25%; float: left;}
// 5 cols
.row .span20 {width: 20%; float: left;}
// 6 cols
.row .span16 {width: 16.6666%; float: left;}
// Responsive layout
// -----------------
// wide
&.wide {
width: 720px;
}
// normla
&.normal {
width: 600px;
}
// tablet
&.xtablet {
width: 500px;
}
// tablet
&.tablet {
width: 450px;
}
// Fluid for small display
&.mobile {
// Padding to set content in a bit
padding-left: 20px;
padding-right: 20px;
width: 400px;
// Make all grid-sized elements block level again
.row, .row-fluid {
[class*="span"],
.uneditable-input[class*="span"], // Makes uneditable inputs full-width when using grid sizing
[class*="span"] {
float: none;
display: block;
width: 100%;
margin-left: 0 !important;
.box-sizing(border-box);
}
}
.row, .row-fluid {
// Width by percentage
//---------------------
// 2 cols
.span100 {width: 100%; float: left;}
// 2 cols
.span50 {width: 50%; float: left;}
// 3 cols
.span33 {width: 33.3333%; float: left;}
// 4 cols
.span25 {width: 25%; float: left;}
// 5 cols
.span20 {width: 20%; float: left;}
// 6 cols
.span16 {width: 16.6666%; float: left;}
}
[class*="offset"] {
margin-left: 0;
}
}
}
PK M�!]y�p
p
megamenu-responsive.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// VARIABLES & MIXINS
// ------------------
// Prevent Bootstrap Upgrading errors
@import "../bootstrap/less/variables.less";
// Bootstrap mixins
@import "../bootstrap/less/mixins.less";
// T3 Base variables
@import "variables.less";
//
// MOBILE
// ---------------------------------------------------------
@media (max-width: @navbarCollapseWidth) {
.t3-megamenu {
// THE MEGAMENU
//------------------------------------------------------
// Global Menu Inner padding
// -------------------------
.mega-inner {
padding: (@T3globalPadding / 2) @T3globalPadding;
}
// Inner Padding for 1 column
.span12 .mega-inner {
}
// Menu Grids
// ----------
.row-fluid,
.mega-dropdown-menu,
.row-fluid [class*="span"] {
width: 100% !important;
min-width: 100% !important;
left: 0 !important;
margin-left: 0 !important;
transform: none !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
-o-transform: none !important;
}
.row-fluid + .row-fluid {
padding-top: @T3globalPadding / 2;
border-top: 1px solid @hrBorder;
}
.row-fluid [class*="span"] {
}
// Hidden when collapse
.hidden-collapse,
.always-show .caret,
.sub-hidden-collapse > .nav-child,
.sub-hidden-collapse .caret,
.sub-hidden-collapse > a:after,
.always-show .dropdown-submenu > a:after {
display: none !important;
}
// Hide the captions too
.mega-caption {
display: none !important;
}
}
// MEGAMENU RTL override
// --------------------------------------------------------------
//
html[dir="rtl"] {
.t3-megamenu {
// Menu Grids
// ----------
.row-fluid,
.mega-dropdown-menu,
.row-fluid [class*="span"] {
right: 0 !important;
margin-right: 0 !important;
}
}
}
}PK M�!]i�;� �
grid-ext.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// Added "wrap" element
.wrap {
width: auto;
clear: both;
}
// Fixed grid
#grid-extend > .offset(@gridColumnWidth, @gridGutterWidth);
// make to be first col - custom by JOOM
.row-fluid .spanfirst { margin-left: 0 !important; }
PK M�!]�s�b b global-typo.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// ---------------------------------------------------------
// BANNERS
// ---------------------------------------------------------
//
// Jumbotrons
// ---------------------------------------------------------
.jumbotron {
position: relative;
padding: (@T3globalPadding * 2) 0;
}
.jumbotron h1 {
font-size: @baseFontSize * 4;
letter-spacing: -1px;
line-height: 1;
margin: 0 0 (@T3globalMargin / 2) 0;
}
.jumbotron p {
font-size: @baseFontSize * 1.5;
line-height: 1.275;
margin: 0 0 @T3globalMargin 0;
}
.jumbotron .btn {
margin-top: @T3globalMargin / 2;
}
.jumbotron .btn-large {
margin-top: @T3globalMargin;
font-size: @baseFontSize + 4px;
}
// Masthead
// --------
.masthead {
padding: (@T3globalPadding * 4) 0 (@T3globalPadding * 3);
text-align: center;
}
.masthead h1 {
font-size: @baseFontSize * 7;
}
.masthead p {
font-size: @baseFontSize * 3;
}
.masthead .btn-large {
font-size: @baseFontSize * 2;
padding: @baseFontSize (@baseFontSize * 2);
}
/* Jumbotrons with images ---*/
.jumbotron.has-image {
.box-sizing (border-box);
}
.masthead.has-image {
text-align: left;
}
// ---------------------------------------------------------
// THUMBNAILS
// ---------------------------------------------------------
// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
// Make wrapper ul behave like the grid
.thumbnails {
margin-bottom: @T3globalMargin;
margin-left: -@gridGutterWidth;
list-style: none;
.clearfix();
}
// Fluid rows have no left margin
.row-fluid .thumbnails {
margin-left: 0;
}
// Float li to make thumbnails appear in a row
.thumbnails > li {
float: left; // Explicity set the float since we don't require .span* classes
position: relative;
margin-bottom: @T3globalMargin;
margin-left: @gridGutterWidth;
}
// The actual thumbnail (can be `a` or `div`)
.thumbnail {
border: 1px solid @T3borderColor;
display: block;
padding: 4px;
line-height: @baseLineHeight;
.border-radius(@inputBorderRadius);
.box-shadow(0 1px 3px rgba(0,0,0,.055));
.transition(all .2s ease-in-out);
}
// Add a hover state for linked versions only
a.thumbnail:hover {
border-color: @linkColor;
.box-shadow(0 1px 4px rgba(0,105,214,.25));
}
// Images and captions
.thumbnail > img {
display: block;
max-width: 100%;
margin-left: auto;
margin-right: auto;
}
.thumbnail .caption {
padding: 9px;
color: @gray;
}
// Thumbnail Styles
// ------------------
// Paper Style
.thumbnails.paper > li:before,
.thumbnails.paper > li:after {
content: '';
position: absolute;
z-index: -2;
bottom: 15px;
left: 10px;
width: 50%;
height: 20%;
box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7);
-webkit-transform: rotate(-3deg);
-moz-transform: rotate(-3deg);
-ms-transform: rotate(-3deg);
-o-transform: rotate(-3deg);
transform: rotate(-3deg);
}
.thumbnails.paper > li:after {
right: 10px;
left: auto;
-webkit-transform: rotate(3deg);
-moz-transform: rotate(3deg);
-ms-transform: rotate(3deg);
-o-transform: rotate(3deg);
transform: rotate(3deg);
}
.thumbnails.paper .thumbnail {
border: none;
padding: 0;
.box-shadow(none);
}
.thumbnails.paper a.thumbnail.paper:hover {
.box-shadow(none);
}
// ---------------------------------------------------------
// T3 Logo
// ---------------------------------------------------------
.t3-logo,
.t3-logo-small {
display: block;
text-decoration: none;
text-indent: -9999em;
text-align: left;
background-repeat: no-repeat;
background-position: center;
}
// Sizes
.t3-logo {
width: 182px;
height: 50px;
}
.t3-logo-small {
width: 60px;
height: 30px;
}
// Styles
.t3-logo,
.t3-logo-color {
background-image: url("//static.joomlart.com/images/jat3v3-documents/logo-complete/t3logo-big-color.png");
}
.t3-logo-small,
.t3-logo-small.t3-logo-color {
background-image: url("//static.joomlart.com/images/jat3v3-documents/logo-complete/t3logo-small-color.png");
}
.t3-logo-dark {
background-image: url("//static.joomlart.com/images/jat3v3-documents/logo-complete/t3logo-big-dark.png");
}
.t3-logo-small.t3-logo-dark {
background-image: url("//static.joomlart.com/images/jat3v3-documents/logo-complete/t3logo-small-dark.png");
}
.t3-logo-light {
background-image: url("//static.joomlart.com/images/jat3v3-documents/logo-complete/t3logo-big-light.png");
}
.t3-logo-small.t3-logo-light {
background-image: url("//static.joomlart.com/images/jat3v3-documents/logo-complete/t3logo-small-light.png");
}
PK M�!]���Y �Y mixins.lessnu &1i� //
// Mixins
// --------------------------------------------------
// UTILITY MIXINS
// --------------------------------------------------
// Clearfix
// --------
// For clearing floats like a boss h5bp.com/q
.clearfix {
*zoom: 1;
&:before,
&:after {
display: table;
content: "";
// Fixes Opera/contenteditable bug:
// http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
line-height: 0;
}
&:after {
clear: both;
}
}
// Webkit-style focus
// ------------------
.tab-focus() {
// Default
outline: thin dotted #333;
// Webkit
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
// Center-align a block level element
// ----------------------------------
.center-block() {
display: block;
margin-left: auto;
margin-right: auto;
}
// IE7 inline-block
// ----------------
.ie7-inline-block() {
*display: inline; /* IE7 inline-block hack */
*zoom: 1;
}
// IE7 likes to collapse whitespace on either side of the inline-block elements.
// Ems because we're attempting to match the width of a space character. Left
// version is for form buttons, which typically come after other elements, and
// right version is for icons, which come before. Applying both is ok, but it will
// mean that space between those elements will be .6em (~2 space characters) in IE7,
// instead of the 1 space in other browsers.
.ie7-restore-left-whitespace() {
*margin-left: .3em;
&:first-child {
*margin-left: 0;
}
}
.ie7-restore-right-whitespace() {
*margin-right: .3em;
}
// Sizing shortcuts
// -------------------------
.size(@height, @width) {
width: @width;
height: @height;
}
.square(@size) {
.size(@size, @size);
}
// Placeholder text
// -------------------------
.placeholder(@color: @placeholderText) {
&:-moz-placeholder {
color: @color;
}
&:-ms-input-placeholder {
color: @color;
}
&::-webkit-input-placeholder {
color: @color;
}
}
// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
.text-overflow() {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
// CSS image replacement
// -------------------------
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
.hide-text {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
// FONTS
// --------------------------------------------------
#font {
#family {
.serif() {
font-family: @serifFontFamily;
}
.sans-serif() {
font-family: @sansFontFamily;
}
.monospace() {
font-family: @monoFontFamily;
}
}
.shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
font-size: @size;
font-weight: @weight;
line-height: @lineHeight;
}
.serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .serif;
#font > .shorthand(@size, @weight, @lineHeight);
}
.sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .sans-serif;
#font > .shorthand(@size, @weight, @lineHeight);
}
.monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .monospace;
#font > .shorthand(@size, @weight, @lineHeight);
}
}
// FORMS
// --------------------------------------------------
// Block level inputs
.input-block-level {
display: block;
width: 100%;
min-height: @inputHeight; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
.box-sizing(border-box); // Makes inputs behave like true block-level elements
}
// Mixin for form field states
.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
// Set the text color
.control-label,
.help-block,
.help-inline {
color: @textColor;
}
// Style inputs accordingly
.checkbox,
.radio,
input,
select,
textarea {
color: @textColor;
}
input,
select,
textarea {
border-color: @borderColor;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
&:focus {
border-color: darken(@borderColor, 10%);
@shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
.box-shadow(@shadow);
}
}
// Give a small background color for input-prepend/-append
.input-prepend .add-on,
.input-append .add-on {
color: @textColor;
background-color: @backgroundColor;
border-color: @textColor;
}
}
// CSS3 PROPERTIES
// --------------------------------------------------
// Border Radius
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
// Single Corner Border Radius
.border-top-left-radius(@radius) {
-webkit-border-top-left-radius: @radius;
-moz-border-radius-topleft: @radius;
border-top-left-radius: @radius;
}
.border-top-right-radius(@radius) {
-webkit-border-top-right-radius: @radius;
-moz-border-radius-topright: @radius;
border-top-right-radius: @radius;
}
.border-bottom-right-radius(@radius) {
-webkit-border-bottom-right-radius: @radius;
-moz-border-radius-bottomright: @radius;
border-bottom-right-radius: @radius;
}
.border-bottom-left-radius(@radius) {
-webkit-border-bottom-left-radius: @radius;
-moz-border-radius-bottomleft: @radius;
border-bottom-left-radius: @radius;
}
// Single Side Border Radius
.border-top-radius(@radius) {
.border-top-right-radius(@radius);
.border-top-left-radius(@radius);
}
.border-right-radius(@radius) {
.border-top-right-radius(@radius);
.border-bottom-right-radius(@radius);
}
.border-bottom-radius(@radius) {
.border-bottom-right-radius(@radius);
.border-bottom-left-radius(@radius);
}
.border-left-radius(@radius) {
.border-top-left-radius(@radius);
.border-bottom-left-radius(@radius);
}
// Drop shadows
.box-shadow(@shadow) {
-webkit-box-shadow: @shadow;
-moz-box-shadow: @shadow;
box-shadow: @shadow;
}
// Transitions
.transition(@transition) {
-webkit-transition: @transition;
-moz-transition: @transition;
-o-transition: @transition;
transition: @transition;
}
.transition-delay(@transition-delay) {
-webkit-transition-delay: @transition-delay;
-moz-transition-delay: @transition-delay;
-o-transition-delay: @transition-delay;
transition-delay: @transition-delay;
}
.transition-duration(@transition-duration) {
-webkit-transition-duration: @transition-duration;
-moz-transition-duration: @transition-duration;
-o-transition-duration: @transition-duration;
transition-duration: @transition-duration;
}
// Transformations
.rotate(@degrees) {
-webkit-transform: rotate(@degrees);
-moz-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
-o-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.scale(@ratio) {
-webkit-transform: scale(@ratio);
-moz-transform: scale(@ratio);
-ms-transform: scale(@ratio);
-o-transform: scale(@ratio);
transform: scale(@ratio);
}
.translate(@x, @y) {
-webkit-transform: translate(@x, @y);
-moz-transform: translate(@x, @y);
-ms-transform: translate(@x, @y);
-o-transform: translate(@x, @y);
transform: translate(@x, @y);
}
.skew(@x, @y) {
-webkit-transform: skew(@x, @y);
-moz-transform: skew(@x, @y);
-ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885
-o-transform: skew(@x, @y);
transform: skew(@x, @y);
-webkit-backface-visibility: hidden; // See https://github.com/twbs/bootstrap/issues/5319
}
.translate3d(@x, @y, @z) {
-webkit-transform: translate3d(@x, @y, @z);
-moz-transform: translate3d(@x, @y, @z);
-o-transform: translate3d(@x, @y, @z);
transform: translate3d(@x, @y, @z);
}
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
.backface-visibility(@visibility){
-webkit-backface-visibility: @visibility;
-moz-backface-visibility: @visibility;
backface-visibility: @visibility;
}
// Background clipping
// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
.background-clip(@clip) {
-webkit-background-clip: @clip;
-moz-background-clip: @clip;
background-clip: @clip;
}
// Background sizing
.background-size(@size) {
-webkit-background-size: @size;
-moz-background-size: @size;
-o-background-size: @size;
background-size: @size;
}
// Box sizing
.box-sizing(@boxmodel) {
-webkit-box-sizing: @boxmodel;
-moz-box-sizing: @boxmodel;
box-sizing: @boxmodel;
}
// User select
// For selecting text on the page
.user-select(@select) {
-webkit-user-select: @select;
-moz-user-select: @select;
-ms-user-select: @select;
-o-user-select: @select;
user-select: @select;
}
// Resize anything
.resizable(@direction) {
resize: @direction; // Options: horizontal, vertical, both
overflow: auto; // Safari fix
}
// CSS3 Content Columns
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
-webkit-column-count: @columnCount;
-moz-column-count: @columnCount;
column-count: @columnCount;
-webkit-column-gap: @columnGap;
-moz-column-gap: @columnGap;
column-gap: @columnGap;
}
// Optional hyphenation
.hyphens(@mode: auto) {
word-wrap: break-word;
-webkit-hyphens: @mode;
-moz-hyphens: @mode;
-ms-hyphens: @mode;
-o-hyphens: @mode;
hyphens: @mode;
}
// Opacity
.opacity(@opacity) {
opacity: @opacity / 100;
filter: ~"alpha(opacity=@{opacity})";
}
// BACKGROUNDS
// --------------------------------------------------
// Add an alphatransparency value to any background or border color (via Elyse Holladay)
#translucent {
.background(@color: @white, @alpha: 1) {
background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
}
.border(@color: @white, @alpha: 1) {
border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
.background-clip(padding-box);
}
}
// Gradient Bar Colors for buttons and alerts
.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
color: @textColor;
text-shadow: @textShadow;
#gradient > .vertical(@primaryColor, @secondaryColor);
border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
}
// Gradients
#gradient {
.horizontal(@startColor: #555, @endColor: #333) {
background-color: @endColor;
background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
}
.vertical(@startColor: #555, @endColor: #333) {
background-color: mix(@startColor, @endColor, 60%);
background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
}
.directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
background-color: @endColor;
background-repeat: repeat-x;
background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
}
.horizontal-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
background-color: mix(@midColor, @endColor, 80%);
background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
background-image: -webkit-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
background-image: -moz-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
background-image: -o-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
background-image: linear-gradient(to right, @startColor, @midColor @colorStop, @endColor);
background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
}
.vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
background-color: mix(@midColor, @endColor, 80%);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
}
.radial(@innerColor: #555, @outerColor: #333) {
background-color: @outerColor;
background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
background-repeat: no-repeat;
}
.striped(@color: #555, @angle: 45deg) {
background-color: @color;
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
}
}
// Reset filters for IE
.reset-filter() {
filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}
// COMPONENT MIXINS
// --------------------------------------------------
// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
.nav-divider(@top: #e5e5e5, @bottom: @white) {
// IE7 needs a set width since we gave a height. Restricting just
// to IE7 to keep the 1px left/right space in other browsers.
// It is unclear where IE is getting the extra space that we need
// to negative-margin away, but so it goes.
*width: 100%;
height: 1px;
margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
*margin: -5px 0 5px;
overflow: hidden;
background-color: @top;
border-bottom: 1px solid @bottom;
}
// Button backgrounds
// ------------------
.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
// gradientBar will set the background to a pleasing blend of these, to support IE<=9
.gradientBar(@startColor, @endColor, @textColor, @textShadow);
*background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
.reset-filter();
// in these cases the gradient won't cover the background, so we override
&:hover, &:focus, &:active, &.active, &.disabled, &[disabled] {
color: @textColor;
background-color: @endColor;
*background-color: darken(@endColor, 5%);
}
// IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
&:active,
&.active {
background-color: darken(@endColor, 10%) e("\9");
}
}
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
.navbarVerticalAlign(@elementHeight) {
margin-top: (@navbarHeight - @elementHeight) / 2;
}
// Grid System
// -----------
// Centered container element
.container-fixed() {
margin-right: auto;
margin-left: auto;
.clearfix();
}
// Table columns
.tableColumns(@columnSpan: 1) {
float: none; // undo default grid column styles
width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
margin-left: 0; // undo default grid column styles
}
// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
margin-left: @gridGutterWidth * -1;
.clearfix();
}
.makeColumn(@columns: 1, @offset: 0) {
float: left;
margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}
// The Grid
#grid {
.core (@gridColumnWidth, @gridGutterWidth) {
.spanX (@index) when (@index > 0) {
.span@{index} { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.offsetX (@index) when (@index > 0) {
.offset@{index} { .offset(@index); }
.offsetX(@index - 1);
}
.offsetX (0) {}
.offset (@columns) {
margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
}
.span (@columns) {
width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}
.row {
margin-left: @gridGutterWidth * -1;
.clearfix();
}
[class*="span"] {
float: left;
min-height: 1px; // prevent collapsing columns
margin-left: @gridGutterWidth;
}
// Set the container width, and override it for fixed navbars in media queries
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container { .span(@gridColumns); }
// generate .spanX and .offsetX
.spanX (@gridColumns);
.offsetX (@gridColumns);
}
.fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {
.spanX (@index) when (@index > 0) {
.span@{index} { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.offsetX (@index) when (@index > 0) {
.offset@{index} { .offset(@index); }
.offset@{index}:first-child { .offsetFirstChild(@index); }
.offsetX(@index - 1);
}
.offsetX (0) {}
.offset (@columns) {
margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
*margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
}
.offsetFirstChild (@columns) {
margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
*margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
}
.span (@columns) {
width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
*width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
}
.row-fluid {
width: 100%;
.clearfix();
[class*="span"] {
.input-block-level();
float: left;
margin-left: @fluidGridGutterWidth;
*margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
}
[class*="span"]:first-child {
margin-left: 0;
}
// Space grid-sized controls properly if multiple per line
.controls-row [class*="span"] + [class*="span"] {
margin-left: @fluidGridGutterWidth;
}
// generate .spanX and .offsetX
.spanX (@gridColumns);
.offsetX (@gridColumns);
}
}
.input(@gridColumnWidth, @gridGutterWidth) {
.spanX (@index) when (@index > 0) {
input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.span(@columns) {
width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
}
input,
textarea,
.uneditable-input {
margin-left: 0; // override margin-left from core grid system
}
// Space grid-sized controls properly if multiple per line
.controls-row [class*="span"] + [class*="span"] {
margin-left: @gridGutterWidth;
}
// generate .spanX
.spanX (@gridColumns);
}
}
PK M�!]��sb� � frontend-edit.lessnu &1i� /* Radio
--------*/
/* Radio Button Groups ---*/
fieldset.t3onoff {
width: 90px;
height: 30px;
white-space: nowrap;
overflow: hidden;
display: block;
padding: 0 !important;
position: relative;
border: 1px solid #aaa;
border-radius: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
input[type=radio] {
display: none;
}
label {
width: 90px;
height: 30px;
overflow: hidden;
display: block;
border-radius: 0;
position: absolute;
top: -1px;
left: -1px;
z-index: 1;
text-transform: uppercase;
background: url(../imgs/blank.gif) no-repeat transparent;
text-indent: -999em;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
/* use before as background */
label:before,
label:after {
display: block;
position: absolute;
top: 0;
border-radius: 0;
border: 1px solid #aaa;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: all 250ms;
transition: all 250ms;
}
label:before {
content: "ON";
width: 100%;
height: 100%;
text-indent: 0;
color: white;
padding: 4px 18px;
font-weight: normal;
}
/* use after as switch */
label:after {
content: "";
width: 40%;
height: 100%;
background: #fff;
}
label.off:before {
content: "OFF";
text-align: right;
color: #555;
}
/* active label should be under => so inactive can be clickable */
label.active {
z-index: 0;
}
/* off background */
label.off:before {
background: #eee;
left: 100%;
}
label.off.active:before {
left: 0%;
}
label.on:before {
background: #690;
left: -100%;
}
label.on.active:before {
left: -0%;
}
/* off switch */
label.off:after {
left: 60%;
}
label.off.active:after {
left: 0%;
}
label.on:after {
left: 0%;
}
label.on.active:after {
left: 60%;
}
}
/* radio btn group */
fieldset.radio.btn-group {
padding: 0;
input {
display: none;
}
label {
display: inline-block;
min-width: 54px;
padding: 0 12px;
border: 1px solid #aaa;
line-height: 28px;
background: #eee;
color: #555;
border-radius: 0;
text-align: center;
border-right-width: 0px;
text-transform: uppercase;
&:last-child {
border-right-width: 1px;
border-radius: 0 4px 4px 0;
}
&.active {
background: #690;
border-color: #5c8b00;
color: #fff;
}
}
}
//
// ARTICLE FORM
// ---------------------------------------------------------
#adminForm {
.clearfix {
overflow: visible;
}
.chzn-container .chzn-results {
clear: both;
}
}
//
// MODULES OPTIONS FORM
// ---------------------------------------------------------
.com_config #modules-form {
.input-append,
.input-prepend {
.add-on {
width: 35px;
}
input {
display: inline-block;
}
.btn {
border: 1px solid #aaa;
}
}
// Accordion group
// ---------------
.accordion-group {
margin-bottom: 20px;
.accordion-heading {
.accordion-toggle {
color: #428bca;
display: block;
padding: 10px;
outline: none;
&.collapsed {
border-radius: 5px;
color: #666;
}
}
}
.accordion-body {
.nav-tabs {
border-bottom: 0;
}
}
}
}
.controls select {
vertical-align: middle;
width: 220px;
}
// View history
// ------------
[class^="icon-"], [class*=" icon-"] {
font-family: FontAwesome !important;
}
.view-history .btn-group {
margin-bottom: 10px;
}
.btn [class^="icon-"],
.btn [class*=" icon-"] {
margin-right: 5px;
}
.btn span.icon-delete {
&:before {
content: "\f057";
display: inline-block;
height: 16px;
width: 16px;
color: #333;
}
}
.icon-eye-open:before,
.icon-eye:before {
content:"\f06e";
font-family: "FontAwesome";
}
.icon-file-add:before {
content:"\f0f6";
font-family: "FontAwesome";
}
.icon-cancel:before {
content:"\f00d";
font-family: "FontAwesome";
}
.icon-publish {
&:before {
content: "\f00c";
}
}
.icon-unpublish {
&:before {
content: "\f00d";
}
}
.icon-featured {
&:before {
content: "\f005";
}
}
.icon-unfeatured {
&:before {
content: "\f005";
}
}
// Frontend Edit Elements
// ---------------------------------------
.window {
&.view-modules {
.well {
.control-label {
display: inline-block;
}
.controls {
display: inline-block;
vertical-align: middle;
margin-left: 10px;
}
}
.control-group:after {
content: "";
clear: both;
display: table;
}
#filter-bar {
margin-bottom: 10px;
.btn-group button {
margin-top: 0;
}
}
}
}
// Frontend Edit Insert module
// ---------------------------------------
.view-modules,
.view-articles,
.view-contacts,
.view-fields,
.view-items {
.js-stools {
margin-bottom: 20px;
.btn {
border: 1px solid #ccc;
margin-top: 0;
}
.input-append .btn {
border-left: 0;
}
input {
display: inline-block;
}
}
.js-stools-container-filters {
.chzn-container-single {
width: 220px !important;
}
.chzn-drop {
box-sizing: border-box !important;
}
}
table#moduleList {
td .label {
background-color: #999;
box-sizing: border-box;
border-radius: 3px;
display: inline-block;
font-weight: normal;
font-size: 100%;
padding: 10px;
width: 100%;
}
}
table#moduleList td:nth-child(1) {
vertical-align: middle;
}
.icon-publish {
&:before {
content: "\f00c";
font-size: 16px;
}
}
#extra_class.span12 {
box-sizing: border-box;
height: 40px;
line-height: 40px;
width: 100%;
}
}
.mce-container-body {
.icon-file-add {
&:before {
content: "\f067";
}
}
.icon-pictures {
&:before {
content: "\f03e";
}
}
}
// Extrafield
// -----------------------
.edit.item-page,
.profile-edit {
#jform_com_fields_checkboxs {
label.checkbox {
display: inline-block;
margin-right: 10px;
}
input[type="checkbox"] {
margin-left: 0;
margin-top: -2px;
position: relative;
vertical-align: middle;
width: auto;
}
}
.minicolors-input {
height: 28px;
width: auto;
}
}
// Edit profile
// -----------------------
.profile-edit {
#jform_com_fields_user_checkbox {
label.checkbox {
display: inline-block;
margin-right: 10px;
}
input {
position: relative;
margin-left: 0;
margin-right: 5px;
width: auto;
}
}
.minicolors-input {
height: 28px;
width: auto;
}
#jform_com_fields_user_image_chzn {
.chzn-search {
box-sizing: border-box;
}
ul.chzn-results {
box-sizing: border-box;
padding: 0;
margin: 0;
width: 100%;
}
}
#jform_com_fields_user_calendar {
float: left;
}
.chzn-container-single,
.chzn-container {
float: left;
margin-right: 10px;
@media screen and (max-width: 360px) {
width: 100% !important;
}
.chzn-drop {
box-sizing: border-box !important;
}
}
}
// User profile
// ----------------------
.profile {
#users-profile-core {
width: 100%;
}
.dl-horizontal {
dd {
margin-bottom: 10px;
border-bottom: 1px dashed #ddd;
padding-bottom: 10px;
img {
max-width: 100%;
}
}
}
}
// Media Folder List
.thumbnails-media .imgFolder span {
line-height: 70px;
}PK M�!]eP�� � non-responsive.lessnu &1i� /* Non-responsive overrides
*
* Utilitze the following CSS to disable the responsive-ness of the container,
* grid system, and navbar.
*/
PK M�!]��rh[ [ t3.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: https://github.com/t3framework/
*------------------------------------------------------------------------------
*/
//
// INCLUDES VARIOUS FUNCTIONS FOR T3
// ---------------------------------------------------------
// Logo control class
// ---------------------------------------------------------
.logo-control {
.logo-img-sm {
display: none;
}
.logo-img {
display: block;
}
}
// for interact with javascript
// ---------------------------------------------------------------------------
// place holder class to detect the grid variables value in javascript
.body-data-holder:before {
display: none;
content: "grid-float-breakpoint:@{navbarCollapseWidth} screen-xs:600px screen-sm:@{gridRowWidth768} screen-md:@{gridRowWidth} screen-lg:@{gridRowWidth1200}";
}PK M�!]`��� global-typo-responsive.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// responsive-global-typo.less
// For phone and tablet devices
// ---------------------------------------------------------
.hidden {
display: none !important;
visibility: hidden;
}
// ---------------------------------------------------------
// BANNERS
// ---------------------------------------------------------
//
// Jumbotrons
// ---------------------------------------------------------
//
// TABLET
// ---------------------------------------------------
@media (min-width: 768px) and (max-width: 979px) {
// Jumbotron
.jumbotron {
padding: @T3globalPadding 0;
}
.jumbotron h1 {
font-size: @baseFontSize * 2;
}
.jumbotron p {
font-size: @baseFontSize;
}
// Masthead
.masthead {
padding: (@T3globalPadding * 2) 0;
}
.masthead h1 {
font-size: @baseFontSize * 4;
}
.masthead p {
font-size: @baseFontSize * 2;
}
.masthead .btn-large {
font-size: @baseFontSize + 2;
padding: (@baseFontSize - 2) (@baseFontSize + 2);
margin-top: 0;
}
}
// MOBILE
// -------------------------------------------------------------
@media (max-width: 767px) {
// Jumbotron
.jumbotron {
padding: @T3globalPadding 0;
}
.jumbotron h1 {
font-size: @baseFontSize * 2;
}
.jumbotron p {
font-size: @baseFontSize + 2px;
}
// Masthead
.masthead {
padding: @T3globalPadding 0;
}
.masthead h1 {
font-size: @baseFontSize * 2;
}
.masthead p {
font-size: @baseFontSize + 2px;
}
.masthead .btn-large {
font-size: @baseFontSize;
padding: (@baseFontSize - 2px) (@baseFontSize + 2px);
margin-top: 0;
}
}PK M�!]�_�p global-modules-responsive.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
/* MODULE STYLE
--------------------------------------------------------- */
.module-style () {
}PK M�!]�_�p global-modules.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
/* MODULE STYLE
--------------------------------------------------------- */
.module-style () {
}PK M�!]eeI�$ $
megamenu.lessnu &1i� /**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// VARIABLES & MIXINS
// ------------------
// Prevent Bootstrap Upgrading errors
@import "../bootstrap/less/variables.less";
// Bootstrap mixins
@import "../bootstrap/less/mixins.less";
// T3 Base variables
@import "variables.less";
// BASIC STYLE FOR MEGAMENU
// -------------------------
.t3-megamenu {
// THE MEGAMENU
//--------------------------------------------
// Global Menu Inner padding
// -------------------------
.mega-inner {
padding: @T3globalPadding / 2;
.clearfix();
}
// Inner Padding for 1 column
.span12 .mega-inner {
}
// Menu Grids
// ----------
.row-fluid {
}
.row-fluid + .row-fluid {
padding-top: @T3globalPadding / 2;
border-top: 1px solid @hrBorder;
}
.row-fluid [class*="span"] {
}
// The Dropdown
// ------------
.mega > .mega-dropdown-menu {
min-width: 200px;
display: none;
}
.mega.open > .mega-dropdown-menu,
.mega.dropdown-submenu:hover > .mega-dropdown-menu {
display: block;
}
// The Group
// ---------
.mega-group {
.clearfix();
}
// Group Title
.mega-nav .mega-group > .mega-group-title,
.dropdown-menu .mega-nav .mega-group > .mega-group-title,
.dropdown-menu .active .mega-nav .mega-group > .mega-group-title {
background: inherit;
color: inherit;
font-weight: bold;
padding: 0;
margin: 0;
&:hover, &:active, &:focus {
background: inherit;
color: inherit;
}
}
// Group Content
.mega-group-ct {
margin: 0;
padding: 0;
.clearfix();
}
// Nav in Megamenu
// ---------------
.mega-col-nav {
}
// Inner padding
.mega-col-nav .mega-inner {
}
// Inner padding for nav in 1 column
.span12.mega-col-nav .mega-inner {
padding: 5px;
}
.mega-group .span12.mega-col-nav .mega-inner {
padding: 0;
}
// The Nav
.mega-nav,
.dropdown-menu .mega-nav {
margin: 0;
padding: 0;
list-style: none;
}
.mega-nav > li,
.dropdown-menu .mega-nav > li {
list-style: none;
margin-left: 0;
}
.mega-nav > li a,
.dropdown-menu .mega-nav > li a {
white-space: normal;
}
// Nav in Group
.mega-group > .mega-nav,
.dropdown-menu .mega-group > .mega-nav {
margin-left: -5px;
margin-right: -5px;
}
.mega-group > .mega-nav > li,
.dropdown-menu .mega-group > .mega-nav > li {
}
.mega-group .mega-nav > li a,
.dropdown-menu .mega-group .mega-nav > li a {
}
// The caret
.mega-nav .dropdown-submenu > a::after {
margin-right: 5px;
}
// Modules in Megamenu
// -------------------
.mega-col-module {
}
// Inner padding
.mega-col-module .mega-inner {
}
// Inner padding for module in 1 column
.span12.mega-col-nav .mega-inner {
}
// The module
.t3-module {
margin-bottom: @T3globalMargin / 2;
}
// Module Title
.t3-module .module-title {
margin-bottom: 0;
}
// Module Content
.t3-module .module-ct {
margin: 0;
padding: 0;
}
// Menu alignment
// --------------
.mega-align-left > .dropdown-menu {
left: 0;
}
.mega-align-right > .dropdown-menu {
left: auto;
right: 0;
}
.mega-align-center > .dropdown-menu {
left: 50%;
transform: translate(-50%);
-webkit-transform: translate(-50%);
-moz-transform: translate(-50%);
-ms-transform: translate(-50%);
-o-transform: translate(-50%);
}
.dropdown-submenu.mega-align-left > .dropdown-menu {
left: 100%;
}
.dropdown-submenu.mega-align-right > .dropdown-menu {
left: auto;
right: 100%;
}
.mega-align-justify {
position: static;
}
.mega-align-justify > .dropdown-menu {
left: 0;
margin-left: 0;
top: auto;
}
// The caption
// -----------
.mega-caption {
display: block;
white-space: nowrap;
}
// The caret
// ---------
.nav .caret,
.dropdown-submenu .caret,
.mega-menu .caret {
display: none;
}
// Show the caret on level 0 only
.nav > .dropdown > .dropdown-toggle .caret {
display: inline-block;
}
// The icon
// --------
.nav [class^="icon-"],
.nav [class*=" icon-"] {
margin-right: 5px;
}
// Menu tab
// --------------
.mega-tab > div {
position: relative;
}
.mega-tab > div > ul {
width: @t3-mega-dropdown-min-width;
}
.mega-tab > div > ul > li {
position: static;
}
.mega-tab > div > ul > li > .dropdown-menu{
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: @t3-mega-dropdown-min-width;
}
.mega-tab > div > ul > li > .mega-dropdown-menu {
border: none;
box-shadow: none;
}
.mega-tab > div > ul > li > .mega-dropdown-menu > div {
opacity: 1!important;
margin-left: 0!important;
transition: none!important;
}
// End
}
// MEGAMENU Animation
// --------------------------------------------------------------
//
@media (min-width: @navbarCollapseDesktopWidth) {
.t3-megamenu.animate {
.mega {
& > .mega-dropdown-menu {
transition: all 400ms;
-webkit-transition: all 400ms;
-ms-transition: all 400ms;
-o-transition: all 400ms;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
opacity: 0;
}
&.animating > .mega-dropdown-menu {
display: block!important;
}
&.open > .mega-dropdown-menu,
&.animating.open > .mega-dropdown-menu {
opacity: 1;
}
}
&.zoom {
.mega {
> .mega-dropdown-menu {
.scale(~"0, 0");
-webkit-transform-origin: 20% 20%;
-moz-transform-origin: 20% 20%;
transform-origin: 20% 20%;
}
&.open > .mega-dropdown-menu {
.scale(~"1, 1");
}
}
//special case for level 0
.level0 > .mega-align-center {
> .mega-dropdown-menu {
-webkit-transform: scale(0, 0) translate(-50%, 0);
-ms-transform: scale(0, 0) translate(-50%, 0);
transform: scale(0, 0) translate(-50%, 0);
-webkit-transform-origin: 0% 20%;
-moz-transform-origin: 0% 20%;
transform-origin: 0% 20%;
}
&.open > .mega-dropdown-menu {
-webkit-transform: scale(1, 1) translate(-50%, 0);
-ms-transform: scale(1, 1) translate(-50%, 0);
transform: scale(1, 1) translate(-50%, 0);
}
}
}
&.elastic {
.mega {
& > .mega-dropdown-menu {
.scale(~"0, 1");
-webkit-transform-origin: 10% 0;
-moz-transform-origin: 10% 0;
transform-origin: 10% 0;
}
&.open > .mega-dropdown-menu {
.scale(~"1, 1");
}
}
.level0 {
> .mega > .mega-dropdown-menu {
.scale(~"1, 0");
}
.open > .mega-dropdown-menu {
.scale(~"1, 1");
}
> .mega-align-center {
> .mega-dropdown-menu {
transform: scale(1,0) translate(-50%, 0);
-ms-transform: scale(1,0) translate(-50%, 0);
-webkit-transform: scale(1,0) translate(-50%, 0);
}
&.open > .mega-dropdown-menu {
transform: scale(1,1) translate(-50%, 0);
-ms-transform: scale(1,1) translate(-50%, 0);
-webkit-transform: scale(1,1) translate(-50%, 0);
}
}
}
}
&.slide {
.mega {
/* Level 0 */
&.animating > .mega-dropdown-menu {
overflow: hidden;
}
& > .mega-dropdown-menu {
& > div {
transition: all 400ms;
-webkit-transition: all 400ms;
-ms-transition: all 400ms;
-o-transition: all 400ms;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
margin-top: -100%;
}
}
&.open > .mega-dropdown-menu {
& > div {
margin-top: 0%;
}
}
/* Level > 0 */
.mega > .mega-dropdown-menu {
min-width: 0;
& > div {
min-width: 200px;
margin-top: 0;
margin-left: -500px;
}
}
.mega.open > .mega-dropdown-menu > div {
margin-left: 0;
}
}
}
}
}PK =�!]`36�2 2 component-animations.lessnu &1i� //
// Component animations
// --------------------------------------------------
.fade {
opacity: 0;
.transition(opacity .15s linear);
&.in {
opacity: 1;
}
}
.collapse {
position: relative;
height: 0;
overflow: hidden;
.transition(height .35s ease);
&.in {
height: auto;
}
}
PK =�!] �uR� � grid.lessnu &1i� //
// Grid system
// --------------------------------------------------
// Fixed (940px)
#grid > .core(@gridColumnWidth, @gridGutterWidth);
// Fluid (940px)
#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
// Reset utility classes due to specificity
[class*="span"].hide,
.row-fluid [class*="span"].hide {
display: none;
}
[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
float: right;
}
PK =�!]?���u u scaffolding.lessnu &1i� //
// Scaffolding
// --------------------------------------------------
// Body reset
// -------------------------
body {
margin: 0;
font-family: @baseFontFamily;
font-size: @baseFontSize;
line-height: @baseLineHeight;
color: @textColor;
background-color: @bodyBackground;
}
// Links
// -------------------------
a {
color: @linkColor;
text-decoration: none;
}
a:hover,
a:focus {
color: @linkColorHover;
text-decoration: underline;
}
// Images
// -------------------------
// Rounded corners
.img-rounded {
.border-radius(6px);
}
// Add polaroid-esque trim
.img-polaroid {
padding: 4px;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0,0,0,.2);
.box-shadow(0 1px 3px rgba(0,0,0,.1));
}
// Perfect circle
.img-circle {
.border-radius(500px); // crank the border-radius so it works with most reasonably sized images
}
PK =�!]���| | accordion.lessnu &1i� //
// Accordion
// --------------------------------------------------
// Parent container
.accordion {
margin-bottom: @baseLineHeight;
}
// Group == heading + body
.accordion-group {
margin-bottom: 2px;
border: 1px solid #e5e5e5;
.border-radius(@baseBorderRadius);
}
.accordion-heading {
border-bottom: 0;
}
.accordion-heading .accordion-toggle {
display: block;
padding: 8px 15px;
}
// General toggle styles
.accordion-toggle {
cursor: pointer;
}
// Inner needs the styles because you can't animate properly with any styles on the element
.accordion-inner {
padding: 9px 15px;
border-top: 1px solid #e5e5e5;
}
PK =�!]_+;? ? dropdowns.lessnu &1i� //
// Dropdown menus
// --------------------------------------------------
// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
.dropup,
.dropdown {
position: relative;
}
.dropdown-toggle {
// The caret makes the toggle a bit too tall in IE7
*margin-bottom: -3px;
}
.dropdown-toggle:active,
.open .dropdown-toggle {
outline: 0;
}
// Dropdown arrow/caret
// --------------------
.caret {
display: inline-block;
width: 0;
height: 0;
vertical-align: top;
border-top: 4px solid @black;
border-right: 4px solid transparent;
border-left: 4px solid transparent;
content: "";
}
// Place the caret
.dropdown .caret {
margin-top: 8px;
margin-left: 2px;
}
// The dropdown menu (ul)
// ----------------------
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: @zindexDropdown;
display: none; // none by default, but block on "open" of the menu
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0; // override default ul
list-style: none;
background-color: @dropdownBackground;
border: 1px solid #ccc; // Fallback for IE7-8
border: 1px solid @dropdownBorder;
*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;
// Aligns the dropdown menu to right
&.pull-right {
right: 0;
left: auto;
}
// Dividers (basically an hr) within the dropdown
.divider {
.nav-divider(@dropdownDividerTop, @dropdownDividerBottom);
}
// Links within the dropdown menu
> li > a {
display: block;
padding: 3px 20px;
clear: both;
font-weight: normal;
line-height: @baseLineHeight;
color: @dropdownLinkColor;
white-space: nowrap;
}
}
// Hover/Focus state
// -----------
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus,
.dropdown-submenu:hover > a,
.dropdown-submenu:focus > a {
text-decoration: none;
color: @dropdownLinkColorHover;
#gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
}
// Active state
// ------------
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
color: @dropdownLinkColorActive;
text-decoration: none;
outline: 0;
#gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));
}
// Disabled state
// --------------
// Gray out text and ensure the hover/focus state remains gray
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
color: @grayLight;
}
// Nuke hover/focus effects
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
text-decoration: none;
background-color: transparent;
background-image: none; // Remove CSS gradient
.reset-filter();
cursor: default;
}
// Open state for the dropdown
// ---------------------------
.open {
// IE7's z-index only goes to the nearest positioned ancestor, which would
// make the menu appear below buttons that appeared later on the page
*z-index: @zindexDropdown;
& > .dropdown-menu {
display: block;
}
}
// Backdrop to catch body clicks on mobile, etc.
// ---------------------------
.dropdown-backdrop {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: 0;
z-index: @zindexDropdown - 10;
}
// Right aligned dropdowns
// ---------------------------
.pull-right > .dropdown-menu {
right: 0;
left: auto;
}
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// ------------------------------------------------------
// Just add .dropup after the standard .dropdown class and you're set, bro.
// TODO: abstract this so that the navbar fixed styles are not placed here?
.dropup,
.navbar-fixed-bottom .dropdown {
// Reverse the caret
.caret {
border-top: 0;
border-bottom: 4px solid @black;
content: "";
}
// Different positioning for bottom up menu
.dropdown-menu {
top: auto;
bottom: 100%;
margin-bottom: 1px;
}
}
// Sub menus
// ---------------------------
.dropdown-submenu {
position: relative;
}
// Default dropdowns
.dropdown-submenu > .dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
.border-radius(0 6px 6px 6px);
}
.dropdown-submenu:hover > .dropdown-menu {
display: block;
}
// Dropups
.dropup .dropdown-submenu > .dropdown-menu {
top: auto;
bottom: 0;
margin-top: 0;
margin-bottom: -2px;
.border-radius(5px 5px 5px 0);
}
// Caret to indicate there is a submenu
.dropdown-submenu > a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: darken(@dropdownBackground, 20%);
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
border-left-color: @dropdownLinkColorHover;
}
// Left aligned submenus
.dropdown-submenu.pull-left {
// Undo the float
// Yes, this is awkward since .pull-left adds a float, but it sticks to our conventions elsewhere.
float: none;
// Positioning the submenu
> .dropdown-menu {
left: -100%;
margin-left: 10px;
.border-radius(6px 0 6px 6px);
}
}
// Tweak nav headers
// -----------------
// Increase padding from 15px to 20px on sides
.dropdown .dropdown-menu .nav-header {
padding-left: 20px;
padding-right: 20px;
}
// Typeahead
// ---------
.typeahead {
z-index: 1051;
margin-top: 2px; // give it some space to breathe
.border-radius(@baseBorderRadius);
}
PK =�!]��EO O utilities.lessnu &1i� //
// Utility classes
// --------------------------------------------------
// Quick floats
.pull-right {
float: right;
}
.pull-left {
float: left;
}
// Toggling content
.hide {
display: none;
}
.show {
display: block;
}
// Visibility
.invisible {
visibility: hidden;
}
// For Affix plugin
.affix {
position: fixed;
}
PK =�!]9-�OP P responsive-767px-max.lessnu &1i� //
// Responsive: Landscape phone to desktop/tablet
// --------------------------------------------------
@media (max-width: 767px) {
// Padding to set content in a bit
body {
padding-left: 20px;
padding-right: 20px;
}
// Negative indent the now static "fixed" navbar
.navbar-fixed-top,
.navbar-fixed-bottom,
.navbar-static-top {
margin-left: -20px;
margin-right: -20px;
}
// Remove padding on container given explicit padding set on body
.container-fluid {
padding: 0;
}
// TYPOGRAPHY
// ----------
// Reset horizontal dl
.dl-horizontal {
dt {
float: none;
clear: none;
width: auto;
text-align: left;
}
dd {
margin-left: 0;
}
}
// GRID & CONTAINERS
// -----------------
// Remove width from containers
.container {
width: auto;
}
// Fluid rows
.row-fluid {
width: 100%;
}
// Undo negative margin on rows and thumbnails
.row,
.thumbnails {
margin-left: 0;
}
.thumbnails > li {
float: none;
margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present
}
// Make all grid-sized elements block level again
[class*="span"],
.uneditable-input[class*="span"], // Makes uneditable inputs full-width when using grid sizing
.row-fluid [class*="span"] {
float: none;
display: block;
width: 100%;
margin-left: 0;
.box-sizing(border-box);
}
.span12,
.row-fluid .span12 {
width: 100%;
.box-sizing(border-box);
}
.row-fluid [class*="offset"]:first-child {
margin-left: 0;
}
// FORM FIELDS
// -----------
// Make span* classes full width
.input-large,
.input-xlarge,
.input-xxlarge,
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input {
.input-block-level();
}
// But don't let it screw up prepend/append inputs
.input-prepend input,
.input-append input,
.input-prepend input[class*="span"],
.input-append input[class*="span"] {
display: inline-block; // redeclare so they don't wrap to new lines
width: auto;
}
.controls-row [class*="span"] + [class*="span"] {
margin-left: 0;
}
// Modals
.modal {
position: fixed;
top: 20px;
left: 20px;
right: 20px;
width: auto;
margin: 0;
&.fade { top: -100px; }
&.fade.in { top: 20px; }
}
}
// UP TO LANDSCAPE PHONE
// ---------------------
@media (max-width: 480px) {
// Smooth out the collapsing/expanding nav
.nav-collapse {
-webkit-transform: translate3d(0, 0, 0); // activate the GPU
}
// Block level the page header small tag for readability
.page-header h1 small {
display: block;
line-height: @baseLineHeight;
}
// Update checkboxes for iOS
input[type="checkbox"],
input[type="radio"] {
border: 1px solid #ccc;
}
// Remove the horizontal form styles
.form-horizontal {
.control-label {
float: none;
width: auto;
padding-top: 0;
text-align: left;
}
// Move over all input controls and content
.controls {
margin-left: 0;
}
// Move the options list down to align with labels
.control-list {
padding-top: 0; // has to be padding because margin collaspes
}
// Move over buttons in .form-actions to align with .controls
.form-actions {
padding-left: 10px;
padding-right: 10px;
}
}
// Medias
// Reset float and spacing to stack
.media .pull-left,
.media .pull-right {
float: none;
display: block;
margin-bottom: 10px;
}
// Remove side margins since we stack instead of indent
.media-object {
margin-right: 0;
margin-left: 0;
}
// Modals
.modal {
top: 10px;
left: 10px;
right: 10px;
}
.modal-header .close {
padding: 10px;
margin: -10px;
}
// Carousel
.carousel-caption {
position: static;
}
}
PK =�!]�=� hero-unit.lessnu &1i� //
// Hero unit
// --------------------------------------------------
.hero-unit {
padding: 60px;
margin-bottom: 30px;
font-size: 18px;
font-weight: 200;
line-height: @baseLineHeight * 1.5;
color: @heroUnitLeadColor;
background-color: @heroUnitBackground;
.border-radius(6px);
h1 {
margin-bottom: 0;
font-size: 60px;
line-height: 1;
color: @heroUnitHeadingColor;
letter-spacing: -1px;
}
li {
line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less
}
}
PK =�!]l{nc( (
wells.lessnu &1i� //
// Wells
// --------------------------------------------------
// Base class
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: @wellBackground;
border: 1px solid darken(@wellBackground, 7%);
.border-radius(@baseBorderRadius);
.box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
blockquote {
border-color: #ddd;
border-color: rgba(0,0,0,.15);
}
}
// Sizes
.well-large {
padding: 24px;
.border-radius(@borderRadiusLarge);
}
.well-small {
padding: 9px;
.border-radius(@borderRadiusSmall);
}
PK =�!]Qdk;� � navs.lessnu &1i� //
// Navs
// --------------------------------------------------
// BASE CLASS
// ----------
.nav {
margin-left: 0;
margin-bottom: @baseLineHeight;
list-style: none;
}
// Make links block level
.nav > li > a {
display: block;
}
.nav > li > a:hover,
.nav > li > a:focus {
text-decoration: none;
background-color: @grayLighter;
}
// Prevent IE8 from misplacing imgs
// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
.nav > li > a > img {
max-width: none;
}
// Redeclare pull classes because of specifity
.nav > .pull-right {
float: right;
}
// Nav headers (for dropdowns and lists)
.nav-header {
display: block;
padding: 3px 15px;
font-size: 11px;
font-weight: bold;
line-height: @baseLineHeight;
color: @grayLight;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
text-transform: uppercase;
}
// Space them out when they follow another list item (link)
.nav li + .nav-header {
margin-top: 9px;
}
// NAV LIST
// --------
.nav-list {
padding-left: 15px;
padding-right: 15px;
margin-bottom: 0;
}
.nav-list > li > a,
.nav-list .nav-header {
margin-left: -15px;
margin-right: -15px;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
}
.nav-list > li > a {
padding: 3px 15px;
}
.nav-list > .active > a,
.nav-list > .active > a:hover,
.nav-list > .active > a:focus {
color: @white;
text-shadow: 0 -1px 0 rgba(0,0,0,.2);
background-color: @linkColor;
}
.nav-list [class^="icon-"],
.nav-list [class*=" icon-"] {
margin-right: 2px;
}
// Dividers (basically an hr) within the dropdown
.nav-list .divider {
.nav-divider();
}
// TABS AND PILLS
// -------------
// Common styles
.nav-tabs,
.nav-pills {
.clearfix();
}
.nav-tabs > li,
.nav-pills > li {
float: left;
}
.nav-tabs > li > a,
.nav-pills > li > a {
padding-right: 12px;
padding-left: 12px;
margin-right: 2px;
line-height: 14px; // keeps the overall height an even number
}
// TABS
// ----
// Give the tabs something to sit on
.nav-tabs {
border-bottom: 1px solid #ddd;
}
// Make the list-items overlay the bottom border
.nav-tabs > li {
margin-bottom: -1px;
}
// Actual tabs (as links)
.nav-tabs > li > a {
padding-top: 8px;
padding-bottom: 8px;
line-height: @baseLineHeight;
border: 1px solid transparent;
.border-radius(4px 4px 0 0);
&:hover,
&:focus {
border-color: @grayLighter @grayLighter #ddd;
}
}
// Active state, and it's :hover/:focus to override normal :hover/:focus
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover,
.nav-tabs > .active > a:focus {
color: @gray;
background-color: @bodyBackground;
border: 1px solid #ddd;
border-bottom-color: transparent;
cursor: default;
}
// PILLS
// -----
// Links rendered as pills
.nav-pills > li > a {
padding-top: 8px;
padding-bottom: 8px;
margin-top: 2px;
margin-bottom: 2px;
.border-radius(5px);
}
// Active state
.nav-pills > .active > a,
.nav-pills > .active > a:hover,
.nav-pills > .active > a:focus {
color: @white;
background-color: @linkColor;
}
// STACKED NAV
// -----------
// Stacked tabs and pills
.nav-stacked > li {
float: none;
}
.nav-stacked > li > a {
margin-right: 0; // no need for the gap between nav items
}
// Tabs
.nav-tabs.nav-stacked {
border-bottom: 0;
}
.nav-tabs.nav-stacked > li > a {
border: 1px solid #ddd;
.border-radius(0);
}
.nav-tabs.nav-stacked > li:first-child > a {
.border-top-radius(4px);
}
.nav-tabs.nav-stacked > li:last-child > a {
.border-bottom-radius(4px);
}
.nav-tabs.nav-stacked > li > a:hover,
.nav-tabs.nav-stacked > li > a:focus {
border-color: #ddd;
z-index: 2;
}
// Pills
.nav-pills.nav-stacked > li > a {
margin-bottom: 3px;
}
.nav-pills.nav-stacked > li:last-child > a {
margin-bottom: 1px; // decrease margin to match sizing of stacked tabs
}
// DROPDOWNS
// ---------
.nav-tabs .dropdown-menu {
.border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu
}
.nav-pills .dropdown-menu {
.border-radius(6px); // make rounded corners match the pills
}
// Default dropdown links
// -------------------------
// Make carets use linkColor to start
.nav .dropdown-toggle .caret {
border-top-color: @linkColor;
border-bottom-color: @linkColor;
margin-top: 6px;
}
.nav .dropdown-toggle:hover .caret,
.nav .dropdown-toggle:focus .caret {
border-top-color: @linkColorHover;
border-bottom-color: @linkColorHover;
}
/* move down carets for tabs */
.nav-tabs .dropdown-toggle .caret {
margin-top: 8px;
}
// Active dropdown links
// -------------------------
.nav .active .dropdown-toggle .caret {
border-top-color: #fff;
border-bottom-color: #fff;
}
.nav-tabs .active .dropdown-toggle .caret {
border-top-color: @gray;
border-bottom-color: @gray;
}
// Active:hover/:focus dropdown links
// -------------------------
.nav > .dropdown.active > a:hover,
.nav > .dropdown.active > a:focus {
cursor: pointer;
}
// Open dropdowns
// -------------------------
.nav-tabs .open .dropdown-toggle,
.nav-pills .open .dropdown-toggle,
.nav > li.dropdown.open.active > a:hover,
.nav > li.dropdown.open.active > a:focus {
color: @white;
background-color: @grayLight;
border-color: @grayLight;
}
.nav li.dropdown.open .caret,
.nav li.dropdown.open.active .caret,
.nav li.dropdown.open a:hover .caret,
.nav li.dropdown.open a:focus .caret {
border-top-color: @white;
border-bottom-color: @white;
.opacity(100);
}
// Dropdowns in stacked tabs
.tabs-stacked .open > a:hover,
.tabs-stacked .open > a:focus {
border-color: @grayLight;
}
// TABBABLE
// --------
// COMMON STYLES
// -------------
// Clear any floats
.tabbable {
.clearfix();
}
.tab-content {
overflow: auto; // prevent content from running below tabs
}
// Remove border on bottom, left, right
.tabs-below > .nav-tabs,
.tabs-right > .nav-tabs,
.tabs-left > .nav-tabs {
border-bottom: 0;
}
// Show/hide tabbable areas
.tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none;
}
.tab-content > .active,
.pill-content > .active {
display: block;
}
// BOTTOM
// ------
.tabs-below > .nav-tabs {
border-top: 1px solid #ddd;
}
.tabs-below > .nav-tabs > li {
margin-top: -1px;
margin-bottom: 0;
}
.tabs-below > .nav-tabs > li > a {
.border-radius(0 0 4px 4px);
&:hover,
&:focus {
border-bottom-color: transparent;
border-top-color: #ddd;
}
}
.tabs-below > .nav-tabs > .active > a,
.tabs-below > .nav-tabs > .active > a:hover,
.tabs-below > .nav-tabs > .active > a:focus {
border-color: transparent #ddd #ddd #ddd;
}
// LEFT & RIGHT
// ------------
// Common styles
.tabs-left > .nav-tabs > li,
.tabs-right > .nav-tabs > li {
float: none;
}
.tabs-left > .nav-tabs > li > a,
.tabs-right > .nav-tabs > li > a {
min-width: 74px;
margin-right: 0;
margin-bottom: 3px;
}
// Tabs on the left
.tabs-left > .nav-tabs {
float: left;
margin-right: 19px;
border-right: 1px solid #ddd;
}
.tabs-left > .nav-tabs > li > a {
margin-right: -1px;
.border-radius(4px 0 0 4px);
}
.tabs-left > .nav-tabs > li > a:hover,
.tabs-left > .nav-tabs > li > a:focus {
border-color: @grayLighter #ddd @grayLighter @grayLighter;
}
.tabs-left > .nav-tabs .active > a,
.tabs-left > .nav-tabs .active > a:hover,
.tabs-left > .nav-tabs .active > a:focus {
border-color: #ddd transparent #ddd #ddd;
*border-right-color: @white;
}
// Tabs on the right
.tabs-right > .nav-tabs {
float: right;
margin-left: 19px;
border-left: 1px solid #ddd;
}
.tabs-right > .nav-tabs > li > a {
margin-left: -1px;
.border-radius(0 4px 4px 0);
}
.tabs-right > .nav-tabs > li > a:hover,
.tabs-right > .nav-tabs > li > a:focus {
border-color: @grayLighter @grayLighter @grayLighter #ddd;
}
.tabs-right > .nav-tabs .active > a,
.tabs-right > .nav-tabs .active > a:hover,
.tabs-right > .nav-tabs .active > a:focus {
border-color: #ddd #ddd #ddd transparent;
*border-left-color: @white;
}
// DISABLED STATES
// ---------------
// Gray out text
.nav > .disabled > a {
color: @grayLight;
}
// Nuke hover/focus effects
.nav > .disabled > a:hover,
.nav > .disabled > a:focus {
text-decoration: none;
background-color: transparent;
cursor: default;
}
PK =�!]�a>v
v
pagination.lessnu &1i� //
// Pagination (multiple pages)
// --------------------------------------------------
// Space out pagination from surrounding content
.pagination {
margin: @baseLineHeight 0;
}
.pagination ul {
// Allow for text-based alignment
display: inline-block;
.ie7-inline-block();
// Reset default ul styles
margin-left: 0;
margin-bottom: 0;
// Visuals
.border-radius(@baseBorderRadius);
.box-shadow(0 1px 2px rgba(0,0,0,.05));
}
.pagination ul > li {
display: inline; // Remove list-style and block-level defaults
}
.pagination ul > li > a,
.pagination ul > li > span {
float: left; // Collapse white-space
padding: 4px 12px;
line-height: @baseLineHeight;
text-decoration: none;
background-color: @paginationBackground;
border: 1px solid @paginationBorder;
border-left-width: 0;
}
.pagination ul > li > a:hover,
.pagination ul > li > a:focus,
.pagination ul > .active > a,
.pagination ul > .active > span {
background-color: @paginationActiveBackground;
}
.pagination ul > .active > a,
.pagination ul > .active > span {
color: @grayLight;
cursor: default;
}
.pagination ul > .disabled > span,
.pagination ul > .disabled > a,
.pagination ul > .disabled > a:hover,
.pagination ul > .disabled > a:focus {
color: @grayLight;
background-color: transparent;
cursor: default;
}
.pagination ul > li:first-child > a,
.pagination ul > li:first-child > span {
border-left-width: 1px;
.border-left-radius(@baseBorderRadius);
}
.pagination ul > li:last-child > a,
.pagination ul > li:last-child > span {
.border-right-radius(@baseBorderRadius);
}
// Alignment
// --------------------------------------------------
.pagination-centered {
text-align: center;
}
.pagination-right {
text-align: right;
}
// Sizing
// --------------------------------------------------
// Large
.pagination-large {
ul > li > a,
ul > li > span {
padding: @paddingLarge;
font-size: @fontSizeLarge;
}
ul > li:first-child > a,
ul > li:first-child > span {
.border-left-radius(@borderRadiusLarge);
}
ul > li:last-child > a,
ul > li:last-child > span {
.border-right-radius(@borderRadiusLarge);
}
}
// Small and mini
.pagination-mini,
.pagination-small {
ul > li:first-child > a,
ul > li:first-child > span {
.border-left-radius(@borderRadiusSmall);
}
ul > li:last-child > a,
ul > li:last-child > span {
.border-right-radius(@borderRadiusSmall);
}
}
// Small
.pagination-small {
ul > li > a,
ul > li > span {
padding: @paddingSmall;
font-size: @fontSizeSmall;
}
}
// Mini
.pagination-mini {
ul > li > a,
ul > li > span {
padding: @paddingMini;
font-size: @fontSizeMini;
}
}
PK =�!]�Տ�i i
reset.lessnu &1i� //
// Reset CSS
// Adapted from http://github.com/necolas/normalize.css
// --------------------------------------------------
// Display in IE6-9 and FF3
// -------------------------
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section {
display: block;
}
// Display block in IE6-9 and FF3
// -------------------------
audio,
canvas,
video {
display: inline-block;
*display: inline;
*zoom: 1;
}
// Prevents modern browsers from displaying 'audio' without controls
// -------------------------
audio:not([controls]) {
display: none;
}
// Base settings
// -------------------------
html {
font-size: 100%;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
// Focus states
a:focus {
.tab-focus();
}
// Hover & Active
a:hover,
a:active {
outline: 0;
}
// Prevents sub and sup affecting line-height in all browsers
// -------------------------
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
// Img border in a's and image quality
// -------------------------
img {
/* Responsive images (ensure images don't scale beyond their parents) */
max-width: 100%; /* Part 1: Set a maxium relative to the parent */
width: auto\9; /* IE7-8 need help adjusting responsive images */
height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */
vertical-align: middle;
border: 0;
-ms-interpolation-mode: bicubic;
}
// Prevent max-width from affecting Google Maps
#map_canvas img,
.google-maps img {
max-width: none;
}
// Forms
// -------------------------
// Font size in all browsers, margin changes, misc consistency
button,
input,
select,
textarea {
margin: 0;
font-size: 100%;
vertical-align: middle;
}
button,
input {
*overflow: visible; // Inner spacing ie IE6/7
line-height: normal; // FF3/4 have !important on line-height in UA stylesheet
}
button::-moz-focus-inner,
input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
padding: 0;
border: 0;
}
button,
html input[type="button"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls.
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS.
cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
}
label,
select,
button,
input[type="button"],
input[type="reset"],
input[type="submit"],
input[type="radio"],
input[type="checkbox"] {
cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
}
input[type="search"] { // Appearance in Safari/Chrome
.box-sizing(content-box);
-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
-webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
}
textarea {
overflow: auto; // Remove vertical scrollbar in IE6-9
vertical-align: top; // Readability and alignment cross-browser
}
// Printing
// -------------------------
// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
@media print {
* {
text-shadow: none !important;
color: #000 !important; // Black prints faster: h5bp.com/s
background: transparent !important;
box-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
// Don't show links for images, or javascript/internal links
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group; // h5bp.com/t
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 0.5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
}
PK =�!]���r- - responsive.lessnu &1i� /*!
* Bootstrap Responsive v2.3.2
*
* Copyright 2012 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world @twitter by @mdo and @fat.
*/
// Responsive.less
// For phone and tablet devices
// -------------------------------------------------------------
// REPEAT VARIABLES & MIXINS
// -------------------------
// Required since we compile the responsive stuff separately
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
// RESPONSIVE CLASSES
// ------------------
@import "responsive-utilities.less";
// MEDIA QUERIES
// ------------------
// Large desktops
@import "responsive-1200px-min.less";
// Tablets to regular desktops
@import "responsive-768px-979px.less";
// Phones to portrait tablets and narrow desktops
@import "responsive-767px-max.less";
// RESPONSIVE NAVBAR
// ------------------
// From 979px and below, show a button to toggle navbar contents
@import "responsive-navbar.less";
PK =�!]��zr\ \ labels-badges.lessnu &1i� //
// Labels and badges
// --------------------------------------------------
// Base classes
.label,
.badge {
display: inline-block;
padding: 2px 4px;
font-size: @baseFontSize * .846;
font-weight: bold;
line-height: 14px; // ensure proper line-height if floated
color: @white;
vertical-align: baseline;
white-space: nowrap;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
background-color: @grayLight;
}
// Set unique padding and border-radii
.label {
.border-radius(3px);
}
.badge {
padding-left: 9px;
padding-right: 9px;
.border-radius(9px);
}
// Empty labels/badges collapse
.label,
.badge {
&:empty {
display: none;
}
}
// Hover/focus state, but only for links
a {
&.label:hover,
&.label:focus,
&.badge:hover,
&.badge:focus {
color: @white;
text-decoration: none;
cursor: pointer;
}
}
// Colors
// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
.label,
.badge {
// Important (red)
&-important { background-color: @errorText; }
&-important[href] { background-color: darken(@errorText, 10%); }
// Warnings (orange)
&-warning { background-color: @orange; }
&-warning[href] { background-color: darken(@orange, 10%); }
// Success (green)
&-success { background-color: @successText; }
&-success[href] { background-color: darken(@successText, 10%); }
// Info (turquoise)
&-info { background-color: @infoText; }
&-info[href] { background-color: darken(@infoText, 10%); }
// Inverse (black)
&-inverse { background-color: @grayDark; }
&-inverse[href] { background-color: darken(@grayDark, 10%); }
}
// Quick fix for labels/badges in buttons
.btn {
.label,
.badge {
position: relative;
top: -1px;
}
}
.btn-mini {
.label,
.badge {
top: 0;
}
}
PK =�!]R*� � �
close.lessnu &1i� //
// Close icons
// --------------------------------------------------
.close {
float: right;
font-size: 20px;
font-weight: bold;
line-height: @baseLineHeight;
color: @black;
text-shadow: 0 1px 0 rgba(255,255,255,1);
.opacity(20);
&:hover,
&:focus {
color: @black;
text-decoration: none;
cursor: pointer;
.opacity(40);
}
}
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
button.close {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}PK =�!]�J��\ \
media.lessnu &1i� // Media objects
// Source: http://stubbornella.org/content/?p=497
// --------------------------------------------------
// Common styles
// -------------------------
// Clear the floats
.media,
.media-body {
overflow: hidden;
*overflow: visible;
zoom: 1;
}
// Proper spacing between instances of .media
.media,
.media .media {
margin-top: 15px;
}
.media:first-child {
margin-top: 0;
}
// For images and videos, set to block
.media-object {
display: block;
}
// Reset margins on headings for tighter default spacing
.media-heading {
margin: 0 0 5px;
}
// Media image alignment
// -------------------------
.media > .pull-left {
margin-right: 10px;
}
.media > .pull-right {
margin-left: 10px;
}
// Media list variation
// -------------------------
// Undo default ul/ol styles
.media-list {
margin-left: 0;
list-style: none;
}
PK =�!]��7� � breadcrumbs.lessnu &1i� //
// Breadcrumbs
// --------------------------------------------------
.breadcrumb {
padding: 8px 15px;
margin: 0 0 @baseLineHeight;
list-style: none;
background-color: #f5f5f5;
.border-radius(@baseBorderRadius);
> li {
display: inline-block;
.ie7-inline-block();
text-shadow: 0 1px 0 @white;
> .divider {
padding: 0 5px;
color: #ccc;
}
}
> .active {
color: @grayLight;
}
}
PK =�!]/ �� �
carousel.lessnu &1i� //
// Carousel
// --------------------------------------------------
.carousel {
position: relative;
margin-bottom: @baseLineHeight;
line-height: 1;
}
.carousel-inner {
overflow: hidden;
width: 100%;
position: relative;
}
.carousel-inner {
> .item {
display: none;
position: relative;
.transition(.6s ease-in-out left);
// Account for jankitude on images
> img,
> a > img {
display: block;
line-height: 1;
}
}
> .active,
> .next,
> .prev { display: block; }
> .active {
left: 0;
}
> .next,
> .prev {
position: absolute;
top: 0;
width: 100%;
}
> .next {
left: 100%;
}
> .prev {
left: -100%;
}
> .next.left,
> .prev.right {
left: 0;
}
> .active.left {
left: -100%;
}
> .active.right {
left: 100%;
}
}
// Left/right controls for nav
// ---------------------------
.carousel-control {
position: absolute;
top: 40%;
left: 15px;
width: 40px;
height: 40px;
margin-top: -20px;
font-size: 60px;
font-weight: 100;
line-height: 30px;
color: @white;
text-align: center;
background: @grayDarker;
border: 3px solid @white;
.border-radius(23px);
.opacity(50);
// we can't have this transition here
// because webkit cancels the carousel
// animation if you trip this while
// in the middle of another animation
// ;_;
// .transition(opacity .2s linear);
// Reposition the right one
&.right {
left: auto;
right: 15px;
}
// Hover/focus state
&:hover,
&:focus {
color: @white;
text-decoration: none;
.opacity(90);
}
}
// Carousel indicator pips
// -----------------------------
.carousel-indicators {
position: absolute;
top: 15px;
right: 15px;
z-index: 5;
margin: 0;
list-style: none;
li {
display: block;
float: left;
width: 10px;
height: 10px;
margin-left: 5px;
text-indent: -999px;
background-color: #ccc;
background-color: rgba(255,255,255,.25);
border-radius: 5px;
}
.active {
background-color: #fff;
}
}
// Caption for text below images
// -----------------------------
.carousel-caption {
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding: 15px;
background: @grayDark;
background: rgba(0,0,0,.75);
}
.carousel-caption h4,
.carousel-caption p {
color: @white;
line-height: @baseLineHeight;
}
.carousel-caption h4 {
margin: 0 0 5px;
}
.carousel-caption p {
margin-bottom: 0;
}
PK =�!]]��Y* Y* sprites.lessnu &1i� //
// Sprites
// --------------------------------------------------
// ICONS
// -----
// All icons receive the styles of the <i> tag with a base class
// of .i and are then given a unique class to add width, height,
// and background-position. Your resulting HTML will look like
// <i class="icon-inbox"></i>.
// For the white version of the icons, just add the .icon-white class:
// <i class="icon-inbox icon-white"></i>
[class^="icon-"],
[class*=" icon-"] {
display: inline-block;
width: 14px;
height: 14px;
.ie7-restore-right-whitespace();
line-height: 14px;
vertical-align: text-top;
background-image: url("@{iconSpritePath}");
background-position: 14px 14px;
background-repeat: no-repeat;
margin-top: 1px;
}
/* White icons with optional class, or on hover/focus/active states of certain elements */
.icon-white,
.nav-pills > .active > a > [class^="icon-"],
.nav-pills > .active > a > [class*=" icon-"],
.nav-list > .active > a > [class^="icon-"],
.nav-list > .active > a > [class*=" icon-"],
.navbar-inverse .nav > .active > a > [class^="icon-"],
.navbar-inverse .nav > .active > a > [class*=" icon-"],
.dropdown-menu > li > a:hover > [class^="icon-"],
.dropdown-menu > li > a:focus > [class^="icon-"],
.dropdown-menu > li > a:hover > [class*=" icon-"],
.dropdown-menu > li > a:focus > [class*=" icon-"],
.dropdown-menu > .active > a > [class^="icon-"],
.dropdown-menu > .active > a > [class*=" icon-"],
.dropdown-submenu:hover > a > [class^="icon-"],
.dropdown-submenu:focus > a > [class^="icon-"],
.dropdown-submenu:hover > a > [class*=" icon-"],
.dropdown-submenu:focus > a > [class*=" icon-"] {
background-image: url("@{iconWhiteSpritePath}");
}
.icon-glass { background-position: 0 0; }
.icon-music { background-position: -24px 0; }
.icon-search { background-position: -48px 0; }
.icon-envelope { background-position: -72px 0; }
.icon-heart { background-position: -96px 0; }
.icon-star { background-position: -120px 0; }
.icon-star-empty { background-position: -144px 0; }
.icon-user { background-position: -168px 0; }
.icon-film { background-position: -192px 0; }
.icon-th-large { background-position: -216px 0; }
.icon-th { background-position: -240px 0; }
.icon-th-list { background-position: -264px 0; }
.icon-ok { background-position: -288px 0; }
.icon-remove { background-position: -312px 0; }
.icon-zoom-in { background-position: -336px 0; }
.icon-zoom-out { background-position: -360px 0; }
.icon-off { background-position: -384px 0; }
.icon-signal { background-position: -408px 0; }
.icon-cog { background-position: -432px 0; }
.icon-trash { background-position: -456px 0; }
.icon-home { background-position: 0 -24px; }
.icon-file { background-position: -24px -24px; }
.icon-time { background-position: -48px -24px; }
.icon-road { background-position: -72px -24px; }
.icon-download-alt { background-position: -96px -24px; }
.icon-download { background-position: -120px -24px; }
.icon-upload { background-position: -144px -24px; }
.icon-inbox { background-position: -168px -24px; }
.icon-play-circle { background-position: -192px -24px; }
.icon-repeat { background-position: -216px -24px; }
.icon-refresh { background-position: -240px -24px; }
.icon-list-alt { background-position: -264px -24px; }
.icon-lock { background-position: -287px -24px; } // 1px off
.icon-flag { background-position: -312px -24px; }
.icon-headphones { background-position: -336px -24px; }
.icon-volume-off { background-position: -360px -24px; }
.icon-volume-down { background-position: -384px -24px; }
.icon-volume-up { background-position: -408px -24px; }
.icon-qrcode { background-position: -432px -24px; }
.icon-barcode { background-position: -456px -24px; }
.icon-tag { background-position: 0 -48px; }
.icon-tags { background-position: -25px -48px; } // 1px off
.icon-book { background-position: -48px -48px; }
.icon-bookmark { background-position: -72px -48px; }
.icon-print { background-position: -96px -48px; }
.icon-camera { background-position: -120px -48px; }
.icon-font { background-position: -144px -48px; }
.icon-bold { background-position: -167px -48px; } // 1px off
.icon-italic { background-position: -192px -48px; }
.icon-text-height { background-position: -216px -48px; }
.icon-text-width { background-position: -240px -48px; }
.icon-align-left { background-position: -264px -48px; }
.icon-align-center { background-position: -288px -48px; }
.icon-align-right { background-position: -312px -48px; }
.icon-align-justify { background-position: -336px -48px; }
.icon-list { background-position: -360px -48px; }
.icon-indent-left { background-position: -384px -48px; }
.icon-indent-right { background-position: -408px -48px; }
.icon-facetime-video { background-position: -432px -48px; }
.icon-picture { background-position: -456px -48px; }
.icon-pencil { background-position: 0 -72px; }
.icon-map-marker { background-position: -24px -72px; }
.icon-adjust { background-position: -48px -72px; }
.icon-tint { background-position: -72px -72px; }
.icon-edit { background-position: -96px -72px; }
.icon-share { background-position: -120px -72px; }
.icon-check { background-position: -144px -72px; }
.icon-move { background-position: -168px -72px; }
.icon-step-backward { background-position: -192px -72px; }
.icon-fast-backward { background-position: -216px -72px; }
.icon-backward { background-position: -240px -72px; }
.icon-play { background-position: -264px -72px; }
.icon-pause { background-position: -288px -72px; }
.icon-stop { background-position: -312px -72px; }
.icon-forward { background-position: -336px -72px; }
.icon-fast-forward { background-position: -360px -72px; }
.icon-step-forward { background-position: -384px -72px; }
.icon-eject { background-position: -408px -72px; }
.icon-chevron-left { background-position: -432px -72px; }
.icon-chevron-right { background-position: -456px -72px; }
.icon-plus-sign { background-position: 0 -96px; }
.icon-minus-sign { background-position: -24px -96px; }
.icon-remove-sign { background-position: -48px -96px; }
.icon-ok-sign { background-position: -72px -96px; }
.icon-question-sign { background-position: -96px -96px; }
.icon-info-sign { background-position: -120px -96px; }
.icon-screenshot { background-position: -144px -96px; }
.icon-remove-circle { background-position: -168px -96px; }
.icon-ok-circle { background-position: -192px -96px; }
.icon-ban-circle { background-position: -216px -96px; }
.icon-arrow-left { background-position: -240px -96px; }
.icon-arrow-right { background-position: -264px -96px; }
.icon-arrow-up { background-position: -289px -96px; } // 1px off
.icon-arrow-down { background-position: -312px -96px; }
.icon-share-alt { background-position: -336px -96px; }
.icon-resize-full { background-position: -360px -96px; }
.icon-resize-small { background-position: -384px -96px; }
.icon-plus { background-position: -408px -96px; }
.icon-minus { background-position: -433px -96px; }
.icon-asterisk { background-position: -456px -96px; }
.icon-exclamation-sign { background-position: 0 -120px; }
.icon-gift { background-position: -24px -120px; }
.icon-leaf { background-position: -48px -120px; }
.icon-fire { background-position: -72px -120px; }
.icon-eye-open { background-position: -96px -120px; }
.icon-eye-close { background-position: -120px -120px; }
.icon-warning-sign { background-position: -144px -120px; }
.icon-plane { background-position: -168px -120px; }
.icon-calendar { background-position: -192px -120px; }
.icon-random { background-position: -216px -120px; width: 16px; }
.icon-comment { background-position: -240px -120px; }
.icon-magnet { background-position: -264px -120px; }
.icon-chevron-up { background-position: -288px -120px; }
.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off
.icon-retweet { background-position: -336px -120px; }
.icon-shopping-cart { background-position: -360px -120px; }
.icon-folder-close { background-position: -384px -120px; width: 16px; }
.icon-folder-open { background-position: -408px -120px; width: 16px; }
.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off
.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off
.icon-hdd { background-position: 0 -144px; }
.icon-bullhorn { background-position: -24px -144px; }
.icon-bell { background-position: -48px -144px; }
.icon-certificate { background-position: -72px -144px; }
.icon-thumbs-up { background-position: -96px -144px; }
.icon-thumbs-down { background-position: -120px -144px; }
.icon-hand-right { background-position: -144px -144px; }
.icon-hand-left { background-position: -168px -144px; }
.icon-hand-up { background-position: -192px -144px; }
.icon-hand-down { background-position: -216px -144px; }
.icon-circle-arrow-right { background-position: -240px -144px; }
.icon-circle-arrow-left { background-position: -264px -144px; }
.icon-circle-arrow-up { background-position: -288px -144px; }
.icon-circle-arrow-down { background-position: -312px -144px; }
.icon-globe { background-position: -336px -144px; }
.icon-wrench { background-position: -360px -144px; }
.icon-tasks { background-position: -384px -144px; }
.icon-filter { background-position: -408px -144px; }
.icon-briefcase { background-position: -432px -144px; }
.icon-fullscreen { background-position: -456px -144px; }
PK =�!]��@W�. �. navbar.lessnu &1i� //
// Navbars (Redux)
// --------------------------------------------------
// COMMON STYLES
// -------------
// Base class and wrapper
.navbar {
overflow: visible;
margin-bottom: @baseLineHeight;
// Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
*position: relative;
*z-index: 2;
}
// Inner for background effects
// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
.navbar-inner {
min-height: @navbarHeight;
padding-left: 20px;
padding-right: 20px;
#gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
border: 1px solid @navbarBorder;
.border-radius(@baseBorderRadius);
.box-shadow(0 1px 4px rgba(0,0,0,.065));
// Prevent floats from breaking the navbar
.clearfix();
}
// Set width to auto for default container
// We then reset it for fixed navbars in the #gridSystem mixin
.navbar .container {
width: auto;
}
// Override the default collapsed state
.nav-collapse.collapse {
height: auto;
overflow: visible;
}
// Brand: website or project name
// -------------------------
.navbar .brand {
float: left;
display: block;
// Vertically center the text given @navbarHeight
padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
margin-left: -20px; // negative indent to left-align the text down the page
font-size: 20px;
font-weight: 200;
color: @navbarBrandColor;
text-shadow: 0 1px 0 @navbarBackgroundHighlight;
&:hover,
&:focus {
text-decoration: none;
}
}
// Plain text in topbar
// -------------------------
.navbar-text {
margin-bottom: 0;
line-height: @navbarHeight;
color: @navbarText;
}
// Janky solution for now to account for links outside the .nav
// -------------------------
.navbar-link {
color: @navbarLinkColor;
&:hover,
&:focus {
color: @navbarLinkColorHover;
}
}
// Dividers in navbar
// -------------------------
.navbar .divider-vertical {
height: @navbarHeight;
margin: 0 9px;
border-left: 1px solid @navbarBackground;
border-right: 1px solid @navbarBackgroundHighlight;
}
// Buttons in navbar
// -------------------------
.navbar .btn,
.navbar .btn-group {
.navbarVerticalAlign(30px); // Vertically center in navbar
}
.navbar .btn-group .btn,
.navbar .input-prepend .btn,
.navbar .input-append .btn,
.navbar .input-prepend .btn-group,
.navbar .input-append .btn-group {
margin-top: 0; // then undo the margin here so we don't accidentally double it
}
// Navbar forms
// -------------------------
.navbar-form {
margin-bottom: 0; // remove default bottom margin
.clearfix();
input,
select,
.radio,
.checkbox {
.navbarVerticalAlign(30px); // Vertically center in navbar
}
input,
select,
.btn {
display: inline-block;
margin-bottom: 0;
}
input[type="image"],
input[type="checkbox"],
input[type="radio"] {
margin-top: 3px;
}
.input-append,
.input-prepend {
margin-top: 5px;
white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left
input {
margin-top: 0; // remove the margin on top since it's on the parent
}
}
}
// Navbar search
// -------------------------
.navbar-search {
position: relative;
float: left;
.navbarVerticalAlign(30px); // Vertically center in navbar
margin-bottom: 0;
.search-query {
margin-bottom: 0;
padding: 4px 14px;
#font > .sans-serif(13px, normal, 1);
.border-radius(15px); // redeclare because of specificity of the type attribute
}
}
// Static navbar
// -------------------------
.navbar-static-top {
position: static;
margin-bottom: 0; // remove 18px margin for default navbar
.navbar-inner {
.border-radius(0);
}
}
// Fixed navbar
// -------------------------
// Shared (top/bottom) styles
.navbar-fixed-top,
.navbar-fixed-bottom {
position: fixed;
right: 0;
left: 0;
z-index: @zindexFixedNavbar;
margin-bottom: 0; // remove 18px margin for default navbar
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
border-width: 0 0 1px;
}
.navbar-fixed-bottom .navbar-inner {
border-width: 1px 0 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
padding-left: 0;
padding-right: 0;
.border-radius(0);
}
// Reset container width
// Required here as we reset the width earlier on and the grid mixins don't override early enough
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
#grid > .core > .span(@gridColumns);
}
// Fixed to top
.navbar-fixed-top {
top: 0;
}
.navbar-fixed-top,
.navbar-static-top {
.navbar-inner {
.box-shadow(~"0 1px 10px rgba(0,0,0,.1)");
}
}
// Fixed to bottom
.navbar-fixed-bottom {
bottom: 0;
.navbar-inner {
.box-shadow(~"0 -1px 10px rgba(0,0,0,.1)");
}
}
// NAVIGATION
// ----------
.navbar .nav {
position: relative;
left: 0;
display: block;
float: left;
margin: 0 10px 0 0;
}
.navbar .nav.pull-right {
float: right; // redeclare due to specificity
margin-right: 0; // remove margin on float right nav
}
.navbar .nav > li {
float: left;
}
// Links
.navbar .nav > li > a {
float: none;
// Vertically center the text given @navbarHeight
padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
color: @navbarLinkColor;
text-decoration: none;
text-shadow: 0 1px 0 @navbarBackgroundHighlight;
}
.navbar .nav .dropdown-toggle .caret {
margin-top: 8px;
}
// Hover/focus
.navbar .nav > li > a:focus,
.navbar .nav > li > a:hover {
background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover/:focus from .active
color: @navbarLinkColorHover;
text-decoration: none;
}
// Active nav items
.navbar .nav > .active > a,
.navbar .nav > .active > a:hover,
.navbar .nav > .active > a:focus {
color: @navbarLinkColorActive;
text-decoration: none;
background-color: @navbarLinkBackgroundActive;
.box-shadow(inset 0 3px 8px rgba(0,0,0,.125));
}
// Navbar button for toggling navbar items in responsive layouts
// These definitions need to come after '.navbar .btn'
.navbar .btn-navbar {
display: none;
float: right;
padding: 7px 10px;
margin-left: 5px;
margin-right: 5px;
.buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
}
.navbar .btn-navbar .icon-bar {
display: block;
width: 18px;
height: 2px;
background-color: #f5f5f5;
.border-radius(1px);
.box-shadow(0 1px 0 rgba(0,0,0,.25));
}
.btn-navbar .icon-bar + .icon-bar {
margin-top: 3px;
}
// Dropdown menus
// --------------
// Menu position and menu carets
.navbar .nav > li > .dropdown-menu {
&:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: @dropdownBorder;
position: absolute;
top: -7px;
left: 9px;
}
&:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid @dropdownBackground;
position: absolute;
top: -6px;
left: 10px;
}
}
// Menu position and menu caret support for dropups via extra dropup class
.navbar-fixed-bottom .nav > li > .dropdown-menu {
&:before {
border-top: 7px solid #ccc;
border-top-color: @dropdownBorder;
border-bottom: 0;
bottom: -7px;
top: auto;
}
&:after {
border-top: 6px solid @dropdownBackground;
border-bottom: 0;
bottom: -6px;
top: auto;
}
}
// Caret should match text color on hover/focus
.navbar .nav li.dropdown > a:hover .caret,
.navbar .nav li.dropdown > a:focus .caret {
border-top-color: @navbarLinkColorHover;
border-bottom-color: @navbarLinkColorHover;
}
// Remove background color from open dropdown
.navbar .nav li.dropdown.open > .dropdown-toggle,
.navbar .nav li.dropdown.active > .dropdown-toggle,
.navbar .nav li.dropdown.open.active > .dropdown-toggle {
background-color: @navbarLinkBackgroundActive;
color: @navbarLinkColorActive;
}
.navbar .nav li.dropdown > .dropdown-toggle .caret {
border-top-color: @navbarLinkColor;
border-bottom-color: @navbarLinkColor;
}
.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: @navbarLinkColorActive;
border-bottom-color: @navbarLinkColorActive;
}
// Right aligned menus need alt position
.navbar .pull-right > li > .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right {
left: auto;
right: 0;
&:before {
left: auto;
right: 12px;
}
&:after {
left: auto;
right: 13px;
}
.dropdown-menu {
left: auto;
right: 100%;
margin-left: 0;
margin-right: -1px;
.border-radius(6px 0 6px 6px);
}
}
// Inverted navbar
// -------------------------
.navbar-inverse {
.navbar-inner {
#gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
border-color: @navbarInverseBorder;
}
.brand,
.nav > li > a {
color: @navbarInverseLinkColor;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
&:hover,
&:focus {
color: @navbarInverseLinkColorHover;
}
}
.brand {
color: @navbarInverseBrandColor;
}
.navbar-text {
color: @navbarInverseText;
}
.nav > li > a:focus,
.nav > li > a:hover {
background-color: @navbarInverseLinkBackgroundHover;
color: @navbarInverseLinkColorHover;
}
.nav .active > a,
.nav .active > a:hover,
.nav .active > a:focus {
color: @navbarInverseLinkColorActive;
background-color: @navbarInverseLinkBackgroundActive;
}
// Inline text links
.navbar-link {
color: @navbarInverseLinkColor;
&:hover,
&:focus {
color: @navbarInverseLinkColorHover;
}
}
// Dividers in navbar
.divider-vertical {
border-left-color: @navbarInverseBackground;
border-right-color: @navbarInverseBackgroundHighlight;
}
// Dropdowns
.nav li.dropdown.open > .dropdown-toggle,
.nav li.dropdown.active > .dropdown-toggle,
.nav li.dropdown.open.active > .dropdown-toggle {
background-color: @navbarInverseLinkBackgroundActive;
color: @navbarInverseLinkColorActive;
}
.nav li.dropdown > a:hover .caret,
.nav li.dropdown > a:focus .caret {
border-top-color: @navbarInverseLinkColorActive;
border-bottom-color: @navbarInverseLinkColorActive;
}
.nav li.dropdown > .dropdown-toggle .caret {
border-top-color: @navbarInverseLinkColor;
border-bottom-color: @navbarInverseLinkColor;
}
.nav li.dropdown.open > .dropdown-toggle .caret,
.nav li.dropdown.active > .dropdown-toggle .caret,
.nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: @navbarInverseLinkColorActive;
border-bottom-color: @navbarInverseLinkColorActive;
}
// Navbar search
.navbar-search {
.search-query {
color: @white;
background-color: @navbarInverseSearchBackground;
border-color: @navbarInverseSearchBorder;
.box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
.transition(none);
.placeholder(@navbarInverseSearchPlaceholderColor);
// Focus states (we use .focused since IE7-8 and down doesn't support :focus)
&:focus,
&.focused {
padding: 5px 15px;
color: @grayDark;
text-shadow: 0 1px 0 @white;
background-color: @navbarInverseSearchBackgroundFocus;
border: 0;
.box-shadow(0 0 3px rgba(0,0,0,.15));
outline: 0;
}
}
}
// Navbar collapse button
.btn-navbar {
.buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
}
}
PK =�!]���� � tooltip.lessnu &1i� //
// Tooltips
// --------------------------------------------------
// Base class
.tooltip {
position: absolute;
z-index: @zindexTooltip;
display: block;
visibility: visible;
font-size: 11px;
line-height: 1.4;
.opacity(0);
&.in { .opacity(80); }
&.top { margin-top: -3px; padding: 5px 0; }
&.right { margin-left: 3px; padding: 0 5px; }
&.bottom { margin-top: 3px; padding: 5px 0; }
&.left { margin-left: -3px; padding: 0 5px; }
}
// Wrapper for the tooltip content
.tooltip-inner {
max-width: 200px;
padding: 8px;
color: @tooltipColor;
text-align: center;
text-decoration: none;
background-color: @tooltipBackground;
.border-radius(@baseBorderRadius);
}
// Arrows
.tooltip-arrow {
position: absolute;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.tooltip {
&.top .tooltip-arrow {
bottom: 0;
left: 50%;
margin-left: -@tooltipArrowWidth;
border-width: @tooltipArrowWidth @tooltipArrowWidth 0;
border-top-color: @tooltipArrowColor;
}
&.right .tooltip-arrow {
top: 50%;
left: 0;
margin-top: -@tooltipArrowWidth;
border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;
border-right-color: @tooltipArrowColor;
}
&.left .tooltip-arrow {
top: 50%;
right: 0;
margin-top: -@tooltipArrowWidth;
border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;
border-left-color: @tooltipArrowColor;
}
&.bottom .tooltip-arrow {
top: 0;
left: 50%;
margin-left: -@tooltipArrowWidth;
border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;
border-bottom-color: @tooltipArrowColor;
}
}
PK =�!]G
Y� � type.lessnu &1i� //
// Typography
// --------------------------------------------------
// Body text
// -------------------------
p {
margin: 0 0 @baseLineHeight / 2;
}
.lead {
margin-bottom: @baseLineHeight;
font-size: @baseFontSize * 1.5;
font-weight: 200;
line-height: @baseLineHeight * 1.5;
}
// Emphasis & misc
// -------------------------
// Ex: 14px base font * 85% = about 12px
small { font-size: 85%; }
strong { font-weight: bold; }
em { font-style: italic; }
cite { font-style: normal; }
// Utility classes
.muted { color: @grayLight; }
a.muted:hover,
a.muted:focus { color: darken(@grayLight, 10%); }
.text-warning { color: @warningText; }
a.text-warning:hover,
a.text-warning:focus { color: darken(@warningText, 10%); }
.text-error { color: @errorText; }
a.text-error:hover,
a.text-error:focus { color: darken(@errorText, 10%); }
.text-info { color: @infoText; }
a.text-info:hover,
a.text-info:focus { color: darken(@infoText, 10%); }
.text-success { color: @successText; }
a.text-success:hover,
a.text-success:focus { color: darken(@successText, 10%); }
.text-left { text-align: left; }
.text-right { text-align: right; }
.text-center { text-align: center; }
// Headings
// -------------------------
h1, h2, h3, h4, h5, h6 {
margin: (@baseLineHeight / 2) 0;
font-family: @headingsFontFamily;
font-weight: @headingsFontWeight;
line-height: @baseLineHeight;
color: @headingsColor;
text-rendering: optimizelegibility; // Fix the character spacing for headings
small {
font-weight: normal;
line-height: 1;
color: @grayLight;
}
}
h1,
h2,
h3 { line-height: @baseLineHeight * 2; }
h1 { font-size: @baseFontSize * 2.75; } // ~38px
h2 { font-size: @baseFontSize * 2.25; } // ~32px
h3 { font-size: @baseFontSize * 1.75; } // ~24px
h4 { font-size: @baseFontSize * 1.25; } // ~18px
h5 { font-size: @baseFontSize; }
h6 { font-size: @baseFontSize * 0.85; } // ~12px
h1 small { font-size: @baseFontSize * 1.75; } // ~24px
h2 small { font-size: @baseFontSize * 1.25; } // ~18px
h3 small { font-size: @baseFontSize; }
h4 small { font-size: @baseFontSize; }
// Page header
// -------------------------
.page-header {
padding-bottom: (@baseLineHeight / 2) - 1;
margin: @baseLineHeight 0 (@baseLineHeight * 1.5);
border-bottom: 1px solid @grayLighter;
}
// Lists
// --------------------------------------------------
// Unordered and Ordered lists
ul, ol {
padding: 0;
margin: 0 0 @baseLineHeight / 2 25px;
}
ul ul,
ul ol,
ol ol,
ol ul {
margin-bottom: 0;
}
li {
line-height: @baseLineHeight;
}
// Remove default list styles
ul.unstyled,
ol.unstyled {
margin-left: 0;
list-style: none;
}
// Single-line list items
ul.inline,
ol.inline {
margin-left: 0;
list-style: none;
> li {
display: inline-block;
.ie7-inline-block();
padding-left: 5px;
padding-right: 5px;
}
}
// Description Lists
dl {
margin-bottom: @baseLineHeight;
}
dt,
dd {
line-height: @baseLineHeight;
}
dt {
font-weight: bold;
}
dd {
margin-left: @baseLineHeight / 2;
}
// Horizontal layout (like forms)
.dl-horizontal {
.clearfix(); // Ensure dl clears floats if empty dd elements present
dt {
float: left;
width: @horizontalComponentOffset - 20;
clear: left;
text-align: right;
.text-overflow();
}
dd {
margin-left: @horizontalComponentOffset;
}
}
// MISC
// ----
// Horizontal rules
hr {
margin: @baseLineHeight 0;
border: 0;
border-top: 1px solid @hrBorder;
border-bottom: 1px solid @white;
}
// Abbreviations and acronyms
abbr[title],
// Added data-* attribute to help out our tooltip plugin, per https://github.com/twitter/bootstrap/issues/5257
abbr[data-original-title] {
cursor: help;
border-bottom: 1px dotted @grayLight;
}
abbr.initialism {
font-size: 90%;
text-transform: uppercase;
}
// Blockquotes
blockquote {
padding: 0 0 0 15px;
margin: 0 0 @baseLineHeight;
border-left: 5px solid @grayLighter;
p {
margin-bottom: 0;
font-size: @baseFontSize * 1.25;
font-weight: 300;
line-height: 1.25;
}
small {
display: block;
line-height: @baseLineHeight;
color: @grayLight;
&:before {
content: '\2014 \00A0';
}
}
// Float right with text-align: right
&.pull-right {
float: right;
padding-right: 15px;
padding-left: 0;
border-right: 5px solid @grayLighter;
border-left: 0;
p,
small {
text-align: right;
}
small {
&:before {
content: '';
}
&:after {
content: '\00A0 \2014';
}
}
}
}
// Quotes
q:before,
q:after,
blockquote:before,
blockquote:after {
content: "";
}
// Addresses
address {
display: block;
margin-bottom: @baseLineHeight;
font-style: normal;
line-height: @baseLineHeight;
}
PK =�!]��5 5 responsive-1200px-min.lessnu &1i� //
// Responsive: Large desktop and up
// --------------------------------------------------
@media (min-width: 1200px) {
// Fixed grid
#grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);
// Fluid grid
#grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);
// Input grid
#grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);
// Thumbnails
.thumbnails {
margin-left: -@gridGutterWidth1200;
}
.thumbnails > li {
margin-left: @gridGutterWidth1200;
}
.row-fluid .thumbnails {
margin-left: 0;
}
}
PK =�!]^[�o o tables.lessnu &1i� //
// Tables
// --------------------------------------------------
// BASE TABLES
// -----------------
table {
max-width: 100%;
background-color: @tableBackground;
border-collapse: collapse;
border-spacing: 0;
}
// BASELINE STYLES
// ---------------
.table {
width: 100%;
margin-bottom: @baseLineHeight;
// Cells
th,
td {
padding: 8px;
line-height: @baseLineHeight;
text-align: left;
vertical-align: top;
border-top: 1px solid @tableBorder;
}
th {
font-weight: bold;
}
// Bottom align for column headings
thead th {
vertical-align: bottom;
}
// Remove top border from thead by default
caption + thead tr:first-child th,
caption + thead tr:first-child td,
colgroup + thead tr:first-child th,
colgroup + thead tr:first-child td,
thead:first-child tr:first-child th,
thead:first-child tr:first-child td {
border-top: 0;
}
// Account for multiple tbody instances
tbody + tbody {
border-top: 2px solid @tableBorder;
}
// Nesting
.table {
background-color: @bodyBackground;
}
}
// CONDENSED TABLE W/ HALF PADDING
// -------------------------------
.table-condensed {
th,
td {
padding: 4px 5px;
}
}
// BORDERED VERSION
// ----------------
.table-bordered {
border: 1px solid @tableBorder;
border-collapse: separate; // Done so we can round those corners!
*border-collapse: collapse; // IE7 can't round corners anyway
border-left: 0;
.border-radius(@baseBorderRadius);
th,
td {
border-left: 1px solid @tableBorder;
}
// Prevent a double border
caption + thead tr:first-child th,
caption + tbody tr:first-child th,
caption + tbody tr:first-child td,
colgroup + thead tr:first-child th,
colgroup + tbody tr:first-child th,
colgroup + tbody tr:first-child td,
thead:first-child tr:first-child th,
tbody:first-child tr:first-child th,
tbody:first-child tr:first-child td {
border-top: 0;
}
// For first th/td in the first row in the first thead or tbody
thead:first-child tr:first-child > th:first-child,
tbody:first-child tr:first-child > td:first-child,
tbody:first-child tr:first-child > th:first-child {
.border-top-left-radius(@baseBorderRadius);
}
// For last th/td in the first row in the first thead or tbody
thead:first-child tr:first-child > th:last-child,
tbody:first-child tr:first-child > td:last-child,
tbody:first-child tr:first-child > th:last-child {
.border-top-right-radius(@baseBorderRadius);
}
// For first th/td (can be either) in the last row in the last thead, tbody, and tfoot
thead:last-child tr:last-child > th:first-child,
tbody:last-child tr:last-child > td:first-child,
tbody:last-child tr:last-child > th:first-child,
tfoot:last-child tr:last-child > td:first-child,
tfoot:last-child tr:last-child > th:first-child {
.border-bottom-left-radius(@baseBorderRadius);
}
// For last th/td (can be either) in the last row in the last thead, tbody, and tfoot
thead:last-child tr:last-child > th:last-child,
tbody:last-child tr:last-child > td:last-child,
tbody:last-child tr:last-child > th:last-child,
tfoot:last-child tr:last-child > td:last-child,
tfoot:last-child tr:last-child > th:last-child {
.border-bottom-right-radius(@baseBorderRadius);
}
// Clear border-radius for first and last td in the last row in the last tbody for table with tfoot
tfoot + tbody:last-child tr:last-child td:first-child {
.border-bottom-left-radius(0);
}
tfoot + tbody:last-child tr:last-child td:last-child {
.border-bottom-right-radius(0);
}
// Special fixes to round the left border on the first td/th
caption + thead tr:first-child th:first-child,
caption + tbody tr:first-child td:first-child,
colgroup + thead tr:first-child th:first-child,
colgroup + tbody tr:first-child td:first-child {
.border-top-left-radius(@baseBorderRadius);
}
caption + thead tr:first-child th:last-child,
caption + tbody tr:first-child td:last-child,
colgroup + thead tr:first-child th:last-child,
colgroup + tbody tr:first-child td:last-child {
.border-top-right-radius(@baseBorderRadius);
}
}
// ZEBRA-STRIPING
// --------------
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
.table-striped {
tbody {
> tr:nth-child(odd) > td,
> tr:nth-child(odd) > th {
background-color: @tableBackgroundAccent;
}
}
}
// HOVER EFFECT
// ------------
// Placed here since it has to come after the potential zebra striping
.table-hover {
tbody {
tr:hover > td,
tr:hover > th {
background-color: @tableBackgroundHover;
}
}
}
// TABLE CELL SIZING
// -----------------
// Reset default grid behavior
table td[class*="span"],
table th[class*="span"],
.row-fluid table td[class*="span"],
.row-fluid table th[class*="span"] {
display: table-cell;
float: none; // undo default grid column styles
margin-left: 0; // undo default grid column styles
}
// Change the column widths to account for td/th padding
.table td,
.table th {
&.span1 { .tableColumns(1); }
&.span2 { .tableColumns(2); }
&.span3 { .tableColumns(3); }
&.span4 { .tableColumns(4); }
&.span5 { .tableColumns(5); }
&.span6 { .tableColumns(6); }
&.span7 { .tableColumns(7); }
&.span8 { .tableColumns(8); }
&.span9 { .tableColumns(9); }
&.span10 { .tableColumns(10); }
&.span11 { .tableColumns(11); }
&.span12 { .tableColumns(12); }
}
// TABLE BACKGROUNDS
// -----------------
// Exact selectors below required to override .table-striped
.table tbody tr {
&.success > td {
background-color: @successBackground;
}
&.error > td {
background-color: @errorBackground;
}
&.warning > td {
background-color: @warningBackground;
}
&.info > td {
background-color: @infoBackground;
}
}
// Hover states for .table-hover
.table-hover tbody tr {
&.success:hover > td {
background-color: darken(@successBackground, 5%);
}
&.error:hover > td {
background-color: darken(@errorBackground, 5%);
}
&.warning:hover > td {
background-color: darken(@warningBackground, 5%);
}
&.info:hover > td {
background-color: darken(@infoBackground, 5%);
}
}
PK =�!]�i�� � responsive-768px-979px.lessnu &1i� //
// Responsive: Tablet to desktop
// --------------------------------------------------
@media (min-width: 768px) and (max-width: 979px) {
// Fixed grid
#grid > .core(@gridColumnWidth768, @gridGutterWidth768);
// Fluid grid
#grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);
// Input grid
#grid > .input(@gridColumnWidth768, @gridGutterWidth768);
// No need to reset .thumbnails here since it's the same @gridGutterWidth
}
PK =�!]�-0� � thumbnails.lessnu &1i� //
// Thumbnails
// --------------------------------------------------
// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
// Make wrapper ul behave like the grid
.thumbnails {
margin-left: -@gridGutterWidth;
list-style: none;
.clearfix();
}
// Fluid rows have no left margin
.row-fluid .thumbnails {
margin-left: 0;
}
// Float li to make thumbnails appear in a row
.thumbnails > li {
float: left; // Explicity set the float since we don't require .span* classes
margin-bottom: @baseLineHeight;
margin-left: @gridGutterWidth;
}
// The actual thumbnail (can be `a` or `div`)
.thumbnail {
display: block;
padding: 4px;
line-height: @baseLineHeight;
border: 1px solid #ddd;
.border-radius(@baseBorderRadius);
.box-shadow(0 1px 3px rgba(0,0,0,.055));
.transition(all .2s ease-in-out);
}
// Add a hover/focus state for linked versions only
a.thumbnail:hover,
a.thumbnail:focus {
border-color: @linkColor;
.box-shadow(0 1px 4px rgba(0,105,214,.25));
}
// Images and captions
.thumbnail > img {
display: block;
max-width: 100%;
margin-left: auto;
margin-right: auto;
}
.thumbnail .caption {
padding: 9px;
color: @gray;
}
PK =�!]�"� �
pager.lessnu &1i� //
// Pager pagination
// --------------------------------------------------
.pager {
margin: @baseLineHeight 0;
list-style: none;
text-align: center;
.clearfix();
}
.pager li {
display: inline;
}
.pager li > a,
.pager li > span {
display: inline-block;
padding: 5px 14px;
background-color: #fff;
border: 1px solid #ddd;
.border-radius(15px);
}
.pager li > a:hover,
.pager li > a:focus {
text-decoration: none;
background-color: #f5f5f5;
}
.pager .next > a,
.pager .next > span {
float: right;
}
.pager .previous > a,
.pager .previous > span {
float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
color: @grayLight;
background-color: #fff;
cursor: default;
}PK =�!]ʙ�fM M button-groups.lessnu &1i� //
// Button groups
// --------------------------------------------------
// Make the div behave like a button
.btn-group {
position: relative;
display: inline-block;
.ie7-inline-block();
font-size: 0; // remove as part 1 of font-size inline-block hack
vertical-align: middle; // match .btn alignment given font-size hack above
white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
.ie7-restore-left-whitespace();
}
// Space out series of button groups
.btn-group + .btn-group {
margin-left: 5px;
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
font-size: 0; // Hack to remove whitespace that results from using inline-block
margin-top: @baseLineHeight / 2;
margin-bottom: @baseLineHeight / 2;
> .btn + .btn,
> .btn-group + .btn,
> .btn + .btn-group {
margin-left: 5px;
}
}
// Float them, remove border radius, then re-add to first and last elements
.btn-group > .btn {
position: relative;
.border-radius(0);
}
.btn-group > .btn + .btn {
margin-left: -1px;
}
.btn-group > .btn,
.btn-group > .dropdown-menu,
.btn-group > .popover {
font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
}
// Reset fonts for other sizes
.btn-group > .btn-mini {
font-size: @fontSizeMini;
}
.btn-group > .btn-small {
font-size: @fontSizeSmall;
}
.btn-group > .btn-large {
font-size: @fontSizeLarge;
}
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child {
margin-left: 0;
.border-top-left-radius(@baseBorderRadius);
.border-bottom-left-radius(@baseBorderRadius);
}
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
.border-top-right-radius(@baseBorderRadius);
.border-bottom-right-radius(@baseBorderRadius);
}
// Reset corners for large buttons
.btn-group > .btn.large:first-child {
margin-left: 0;
.border-top-left-radius(@borderRadiusLarge);
.border-bottom-left-radius(@borderRadiusLarge);
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
.border-top-right-radius(@borderRadiusLarge);
.border-bottom-right-radius(@borderRadiusLarge);
}
// On hover/focus/active, bring the proper btn to front
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
z-index: 2;
}
// On active and open, don't show outline
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
outline: 0;
}
// Split button dropdowns
// ----------------------
// Give the line between buttons some depth
.btn-group > .btn + .dropdown-toggle {
padding-left: 8px;
padding-right: 8px;
.box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
*padding-top: 5px;
*padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-toggle {
padding-left: 5px;
padding-right: 5px;
*padding-top: 2px;
*padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-toggle {
*padding-top: 5px;
*padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-toggle {
padding-left: 12px;
padding-right: 12px;
*padding-top: 7px;
*padding-bottom: 7px;
}
.btn-group.open {
// The clickable button for toggling the menu
// Remove the gradient and set the same inset shadow as the :active state
.dropdown-toggle {
background-image: none;
.box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
}
// Keep the hover's background when dropdown is open
.btn.dropdown-toggle {
background-color: @btnBackgroundHighlight;
}
.btn-primary.dropdown-toggle {
background-color: @btnPrimaryBackgroundHighlight;
}
.btn-warning.dropdown-toggle {
background-color: @btnWarningBackgroundHighlight;
}
.btn-danger.dropdown-toggle {
background-color: @btnDangerBackgroundHighlight;
}
.btn-success.dropdown-toggle {
background-color: @btnSuccessBackgroundHighlight;
}
.btn-info.dropdown-toggle {
background-color: @btnInfoBackgroundHighlight;
}
.btn-inverse.dropdown-toggle {
background-color: @btnInverseBackgroundHighlight;
}
}
// Reposition the caret
.btn .caret {
margin-top: 8px;
margin-left: 0;
}
// Carets in other button sizes
.btn-large .caret {
margin-top: 6px;
}
.btn-large .caret {
border-left-width: 5px;
border-right-width: 5px;
border-top-width: 5px;
}
.btn-mini .caret,
.btn-small .caret {
margin-top: 8px;
}
// Upside down carets for .dropup
.dropup .btn-large .caret {
border-bottom-width: 5px;
}
// Account for other colors
.btn-primary,
.btn-warning,
.btn-danger,
.btn-info,
.btn-success,
.btn-inverse {
.caret {
border-top-color: @white;
border-bottom-color: @white;
}
}
// Vertical button groups
// ----------------------
.btn-group-vertical {
display: inline-block; // makes buttons only take up the width they need
.ie7-inline-block();
}
.btn-group-vertical > .btn {
display: block;
float: none;
max-width: 100%;
.border-radius(0);
}
.btn-group-vertical > .btn + .btn {
margin-left: 0;
margin-top: -1px;
}
.btn-group-vertical > .btn:first-child {
.border-radius(@baseBorderRadius @baseBorderRadius 0 0);
}
.btn-group-vertical > .btn:last-child {
.border-radius(0 0 @baseBorderRadius @baseBorderRadius);
}
.btn-group-vertical > .btn-large:first-child {
.border-radius(@borderRadiusLarge @borderRadiusLarge 0 0);
}
.btn-group-vertical > .btn-large:last-child {
.border-radius(0 0 @borderRadiusLarge @borderRadiusLarge);
}
PK =�!]]�� � � responsive-navbar.lessnu &1i� //
// Responsive: Navbar
// --------------------------------------------------
// TABLETS AND BELOW
// -----------------
@media (max-width: @navbarCollapseWidth) {
// UNFIX THE TOPBAR
// ----------------
// Remove any padding from the body
body {
padding-top: 0;
}
// Unfix the navbars
.navbar-fixed-top,
.navbar-fixed-bottom {
position: static;
}
.navbar-fixed-top {
margin-bottom: @baseLineHeight;
}
.navbar-fixed-bottom {
margin-top: @baseLineHeight;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
padding: 5px;
}
.navbar .container {
width: auto;
padding: 0;
}
// Account for brand name
.navbar .brand {
padding-left: 10px;
padding-right: 10px;
margin: 0 0 0 -5px;
}
// COLLAPSIBLE NAVBAR
// ------------------
// Nav collapse clears brand
.nav-collapse {
clear: both;
}
// Block-level the nav
.nav-collapse .nav {
float: none;
margin: 0 0 (@baseLineHeight / 2);
}
.nav-collapse .nav > li {
float: none;
}
.nav-collapse .nav > li > a {
margin-bottom: 2px;
}
.nav-collapse .nav > .divider-vertical {
display: none;
}
.nav-collapse .nav .nav-header {
color: @navbarText;
text-shadow: none;
}
// Nav and dropdown links in navbar
.nav-collapse .nav > li > a,
.nav-collapse .dropdown-menu a {
padding: 9px 15px;
font-weight: bold;
color: @navbarLinkColor;
.border-radius(3px);
}
// Buttons
.nav-collapse .btn {
padding: 4px 10px 4px;
font-weight: normal;
.border-radius(@baseBorderRadius);
}
.nav-collapse .dropdown-menu li + li a {
margin-bottom: 2px;
}
.nav-collapse .nav > li > a:hover,
.nav-collapse .nav > li > a:focus,
.nav-collapse .dropdown-menu a:hover,
.nav-collapse .dropdown-menu a:focus {
background-color: @navbarBackground;
}
.navbar-inverse .nav-collapse .nav > li > a,
.navbar-inverse .nav-collapse .dropdown-menu a {
color: @navbarInverseLinkColor;
}
.navbar-inverse .nav-collapse .nav > li > a:hover,
.navbar-inverse .nav-collapse .nav > li > a:focus,
.navbar-inverse .nav-collapse .dropdown-menu a:hover,
.navbar-inverse .nav-collapse .dropdown-menu a:focus {
background-color: @navbarInverseBackground;
}
// Buttons in the navbar
.nav-collapse.in .btn-group {
margin-top: 5px;
padding: 0;
}
// Dropdowns in the navbar
.nav-collapse .dropdown-menu {
position: static;
top: auto;
left: auto;
float: none;
display: none;
max-width: none;
margin: 0 15px;
padding: 0;
background-color: transparent;
border: none;
.border-radius(0);
.box-shadow(none);
}
.nav-collapse .open > .dropdown-menu {
display: block;
}
.nav-collapse .dropdown-menu:before,
.nav-collapse .dropdown-menu:after {
display: none;
}
.nav-collapse .dropdown-menu .divider {
display: none;
}
.nav-collapse .nav > li > .dropdown-menu {
&:before,
&:after {
display: none;
}
}
// Forms in navbar
.nav-collapse .navbar-form,
.nav-collapse .navbar-search {
float: none;
padding: (@baseLineHeight / 2) 15px;
margin: (@baseLineHeight / 2) 0;
border-top: 1px solid @navbarBackground;
border-bottom: 1px solid @navbarBackground;
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)");
}
.navbar-inverse .nav-collapse .navbar-form,
.navbar-inverse .nav-collapse .navbar-search {
border-top-color: @navbarInverseBackground;
border-bottom-color: @navbarInverseBackground;
}
// Pull right (secondary) nav content
.navbar .nav-collapse .nav.pull-right {
float: none;
margin-left: 0;
}
// Hide everything in the navbar save .brand and toggle button */
.nav-collapse,
.nav-collapse.collapse {
overflow: hidden;
height: 0;
}
// Navbar button
.navbar .btn-navbar {
display: block;
}
// STATIC NAVBAR
// -------------
.navbar-static .navbar-inner {
padding-left: 10px;
padding-right: 10px;
}
// T3 Added: Fixed Bootstrap Navigation bugs on responsive
// -------------------------------------------------------
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
width: auto;
}
}
// DEFAULT DESKTOP
// ---------------
@media (min-width: @navbarCollapseDesktopWidth) {
// Required to make the collapsing navbar work on regular desktops
.nav-collapse.collapse {
height: auto !important;
overflow: visible !important;
}
}
PK =�!]���B B responsive-utilities.lessnu &1i� //
// Responsive: Utility classes
// --------------------------------------------------
// IE10 Metro responsive
// Required for Windows 8 Metro split-screen snapping with IE10
// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
@-ms-viewport{
width: device-width;
}
// Hide from screenreaders and browsers
// Credit: HTML5 Boilerplate
.hidden {
display: none;
visibility: hidden;
}
// Visibility utilities
// For desktops
.visible-phone { display: none !important; }
.visible-tablet { display: none !important; }
.hidden-phone { }
.hidden-tablet { }
.hidden-desktop { display: none !important; }
.visible-desktop { display: inherit !important; }
// Tablets & small desktops only
@media (min-width: 768px) and (max-width: 979px) {
// Hide everything else
.hidden-desktop { display: inherit !important; }
.visible-desktop { display: none !important ; }
// Show
.visible-tablet { display: inherit !important; }
// Hide
.hidden-tablet { display: none !important; }
}
// Phones only
@media (max-width: 767px) {
// Hide everything else
.hidden-desktop { display: inherit !important; }
.visible-desktop { display: none !important; }
// Show
.visible-phone { display: inherit !important; } // Use inherit to restore previous behavior
// Hide
.hidden-phone { display: none !important; }
}
// Print utilities
.visible-print { display: none !important; }
.hidden-print { }
@media print {
.visible-print { display: inherit !important; }
.hidden-print { display: none !important; }
}
PK =�!]��6o
popovers.lessnu &1i� //
// Popovers
// --------------------------------------------------
.popover {
position: absolute;
top: 0;
left: 0;
z-index: @zindexPopover;
display: none;
max-width: 276px;
padding: 1px;
text-align: left; // Reset given new insertion method
background-color: @popoverBackground;
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
border: 1px solid #ccc;
border: 1px solid rgba(0,0,0,.2);
.border-radius(6px);
.box-shadow(0 5px 10px rgba(0,0,0,.2));
// Overrides for proper insertion
white-space: normal;
// Offset the popover to account for the popover arrow
&.top { margin-top: -10px; }
&.right { margin-left: 10px; }
&.bottom { margin-top: 10px; }
&.left { margin-left: -10px; }
}
.popover-title {
margin: 0; // reset heading margin
padding: 8px 14px;
font-size: 14px;
font-weight: normal;
line-height: 18px;
background-color: @popoverTitleBackground;
border-bottom: 1px solid darken(@popoverTitleBackground, 5%);
.border-radius(5px 5px 0 0);
&:empty {
display: none;
}
}
.popover-content {
padding: 9px 14px;
}
// Arrows
//
// .arrow is outer, .arrow:after is inner
.popover .arrow,
.popover .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.popover .arrow {
border-width: @popoverArrowOuterWidth;
}
.popover .arrow:after {
border-width: @popoverArrowWidth;
content: "";
}
.popover {
&.top .arrow {
left: 50%;
margin-left: -@popoverArrowOuterWidth;
border-bottom-width: 0;
border-top-color: #999; // IE8 fallback
border-top-color: @popoverArrowOuterColor;
bottom: -@popoverArrowOuterWidth;
&:after {
bottom: 1px;
margin-left: -@popoverArrowWidth;
border-bottom-width: 0;
border-top-color: @popoverArrowColor;
}
}
&.right .arrow {
top: 50%;
left: -@popoverArrowOuterWidth;
margin-top: -@popoverArrowOuterWidth;
border-left-width: 0;
border-right-color: #999; // IE8 fallback
border-right-color: @popoverArrowOuterColor;
&:after {
left: 1px;
bottom: -@popoverArrowWidth;
border-left-width: 0;
border-right-color: @popoverArrowColor;
}
}
&.bottom .arrow {
left: 50%;
margin-left: -@popoverArrowOuterWidth;
border-top-width: 0;
border-bottom-color: #999; // IE8 fallback
border-bottom-color: @popoverArrowOuterColor;
top: -@popoverArrowOuterWidth;
&:after {
top: 1px;
margin-left: -@popoverArrowWidth;
border-top-width: 0;
border-bottom-color: @popoverArrowColor;
}
}
&.left .arrow {
top: 50%;
right: -@popoverArrowOuterWidth;
margin-top: -@popoverArrowOuterWidth;
border-right-width: 0;
border-left-color: #999; // IE8 fallback
border-left-color: @popoverArrowOuterColor;
&:after {
right: 1px;
border-right-width: 0;
border-left-color: @popoverArrowColor;
bottom: -@popoverArrowWidth;
}
}
}
PK =�!]��>�I I layouts.lessnu &1i� //
// Layouts
// --------------------------------------------------
// Container (centered, fixed-width layouts)
.container {
.container-fixed();
}
// Fluid layouts (left aligned, with sidebar, min- & max-width content)
.container-fluid {
padding-right: @gridGutterWidth;
padding-left: @gridGutterWidth;
.clearfix();
}PK =�!]s+ code.lessnu &1i� //
// Code (inline and blocK)
// --------------------------------------------------
// Inline and block code styles
code,
pre {
padding: 0 3px 2px;
#font > #family > .monospace;
font-size: @baseFontSize - 2;
color: @grayDark;
.border-radius(3px);
}
// Inline code
code {
padding: 2px 4px;
color: #d14;
background-color: #f7f7f9;
border: 1px solid #e1e1e8;
white-space: nowrap;
}
// Blocks of code
pre {
display: block;
padding: (@baseLineHeight - 1) / 2;
margin: 0 0 @baseLineHeight / 2;
font-size: @baseFontSize - 1; // 14px to 13px
line-height: @baseLineHeight;
word-break: break-all;
word-wrap: break-word;
white-space: pre;
white-space: pre-wrap;
background-color: #f5f5f5;
border: 1px solid #ccc; // fallback for IE7-8
border: 1px solid rgba(0,0,0,.15);
.border-radius(@baseBorderRadius);
// Make prettyprint styles more spaced out for readability
&.prettyprint {
margin-bottom: @baseLineHeight;
}
// Account for some code outputs that place code tags in pre tags
code {
padding: 0;
color: inherit;
white-space: pre;
white-space: pre-wrap;
background-color: transparent;
border: 0;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}PK =�!]U�;�* * progress-bars.lessnu &1i� //
// Progress bars
// --------------------------------------------------
// ANIMATIONS
// ----------
// Webkit
@-webkit-keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// Firefox
@-moz-keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// IE9
@-ms-keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// Opera
@-o-keyframes progress-bar-stripes {
from { background-position: 0 0; }
to { background-position: 40px 0; }
}
// Spec
@keyframes progress-bar-stripes {
from { background-position: 40px 0; }
to { background-position: 0 0; }
}
// THE BARS
// --------
// Outer container
.progress {
overflow: hidden;
height: @baseLineHeight;
margin-bottom: @baseLineHeight;
#gradient > .vertical(#f5f5f5, #f9f9f9);
.box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
.border-radius(@baseBorderRadius);
}
// Bar of progress
.progress .bar {
width: 0%;
height: 100%;
color: @white;
float: left;
font-size: 12px;
text-align: center;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
#gradient > .vertical(#149bdf, #0480be);
.box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
.box-sizing(border-box);
.transition(width .6s ease);
}
.progress .bar + .bar {
.box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)");
}
// Striped bars
.progress-striped .bar {
#gradient > .striped(#149bdf);
.background-size(40px 40px);
}
// Call animation for the active one
.progress.active .bar {
-webkit-animation: progress-bar-stripes 2s linear infinite;
-moz-animation: progress-bar-stripes 2s linear infinite;
-ms-animation: progress-bar-stripes 2s linear infinite;
-o-animation: progress-bar-stripes 2s linear infinite;
animation: progress-bar-stripes 2s linear infinite;
}
// COLORS
// ------
// Danger (red)
.progress-danger .bar, .progress .bar-danger {
#gradient > .vertical(#ee5f5b, #c43c35);
}
.progress-danger.progress-striped .bar, .progress-striped .bar-danger {
#gradient > .striped(#ee5f5b);
}
// Success (green)
.progress-success .bar, .progress .bar-success {
#gradient > .vertical(#62c462, #57a957);
}
.progress-success.progress-striped .bar, .progress-striped .bar-success {
#gradient > .striped(#62c462);
}
// Info (teal)
.progress-info .bar, .progress .bar-info {
#gradient > .vertical(#5bc0de, #339bb9);
}
.progress-info.progress-striped .bar, .progress-striped .bar-info {
#gradient > .striped(#5bc0de);
}
// Warning (orange)
.progress-warning .bar, .progress .bar-warning {
#gradient > .vertical(lighten(@orange, 15%), @orange);
}
.progress-warning.progress-striped .bar, .progress-striped .bar-warning {
#gradient > .striped(lighten(@orange, 15%));
}
PK =�!]�5Y Y alerts.lessnu &1i� //
// Alerts
// --------------------------------------------------
// Base styles
// -------------------------
.alert {
padding: 8px 35px 8px 14px;
margin-bottom: @baseLineHeight;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
background-color: @warningBackground;
border: 1px solid @warningBorder;
.border-radius(@baseBorderRadius);
}
.alert,
.alert h4 {
// Specified for the h4 to prevent conflicts of changing @headingsColor
color: @warningText;
}
.alert h4 {
margin: 0;
}
// Adjust close link position
.alert .close {
position: relative;
top: -2px;
right: -21px;
line-height: @baseLineHeight;
}
// Alternate styles
// -------------------------
.alert-success {
background-color: @successBackground;
border-color: @successBorder;
color: @successText;
}
.alert-success h4 {
color: @successText;
}
.alert-danger,
.alert-error {
background-color: @errorBackground;
border-color: @errorBorder;
color: @errorText;
}
.alert-danger h4,
.alert-error h4 {
color: @errorText;
}
.alert-info {
background-color: @infoBackground;
border-color: @infoBorder;
color: @infoText;
}
.alert-info h4 {
color: @infoText;
}
// Block alerts
// -------------------------
.alert-block {
padding-top: 14px;
padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
margin-bottom: 0;
}
.alert-block p + p {
margin-top: 5px;
}
PK ��!]{��ݞ � buttons.lessnu &1i� PK ��!]G�e� � colour_brown.lessnu &1i� PK ��!]N��� � 0 colour_blue.lessnu &1i� PK ��!]Ӄ��I� I�
template.lessnu &1i� PK ��!]鱦� � �� colour_standard.lessnu &1i� PK ��!]@e�= �=
x� forms.lessnu &1i� PK ��!]"V.�� � �6 icomoon.lessnu &1i� PK ��!])w��� � �8 modals.lessnu &1i� PK ��!]�x�� �@ hathor_variables.lessnu &1i� PK ��!]�i�9� 9� R colour_baseline.lessnu &1i� PK ��!]��u�# �# �� variables.lessnu &1i� PK g}!]c�w w
�� strapper.lessnu &1i� PK g}!]��(4 4 > strapper.j25.lessnu &1i� PK g}!]a�(z� � � strapper.j3.lessnu &1i� PK g}!]XZ��L L � bootstrap.j32.lessnu &1i� PK g}!]�=� Y bootstrap/hero-unit.lessnu &1i� PK g}!]l{nc( ( � bootstrap/wells.lessnu &1i� PK g}!]���Y �Y bootstrap/mixins.lessnu &1i� PK g}!]��EO O Ws bootstrap/utilities.lessnu &1i� PK g}!]��zr\ \ �t bootstrap/labels-badges.lessnu &1i� PK g}!]�5Y Y �| bootstrap/alerts.lessnu &1i� PK g}!]`36�2 2 # 4� bootstrap/component-animations.lessnu &1i� PK g}!]?���u u �� bootstrap/scaffolding.lessnu &1i� PK g}!]�Տ�i i x� bootstrap/reset.lessnu &1i� PK g}!]��w�� � %� bootstrap/type.lessnu &1i� PK g}!]YR>!�* �* ^� bootstrap/sprites.j3.lessnu &1i� PK g}!]9-�OP P # ]� bootstrap/responsive-767px-max.lessnu &1i� PK g}!]_+;? ? � bootstrap/dropdowns.lessnu &1i� PK g}!]��6o �� bootstrap/popovers.lessnu &1i� PK g}!]���| | � bootstrap/accordion.lessnu &1i� PK g}!]�g�U� � � bootstrap/responsive-navbar.lessnu &1i� PK g}!]!)��$ $ � bootstrap/responsive.lessnu &1i� PK g}!]��7� � <! bootstrap/breadcrumbs.lessnu &1i� PK g}!]]��Y* Y* 5# bootstrap/sprites.lessnu &1i� PK g}!]^[�o o �M bootstrap/tables.lessnu &1i� PK g}!]�P��� � �f bootstrap/bootstrap.lessnu &1i� PK g}!]{��ݞ � �l bootstrap/buttons.lessnu &1i� PK g}!]s+ | bootstrap/code.lessnu &1i� PK g}!]�a>v
v
�� bootstrap/pagination.lessnu &1i� PK g}!]R*� � � �� bootstrap/close.lessnu &1i� PK g}!]�J��\ \ H� bootstrap/media.lessnu &1i� PK g}!]�"� � � bootstrap/pager.lessnu &1i� PK g}!]Qdk;� � $� bootstrap/navs.lessnu &1i� PK g}!]��@W�. �. J� bootstrap/navbar.lessnu &1i� PK g}!]U�;�* * q� bootstrap/progress-bars.lessnu &1i� PK g}!])w��� � �� bootstrap/modals.lessnu &1i� PK g}!]���� � � bootstrap/tooltip.lessnu &1i� PK g}!]@e�= �= � bootstrap/forms.lessnu &1i� PK g}!] �uR� � �@ bootstrap/grid.lessnu &1i� PK g}!]/ �� � �B bootstrap/carousel.lessnu &1i� PK g}!]�i�� � % �L bootstrap/responsive-768px-979px.lessnu &1i� PK g}!]���B B # O bootstrap/responsive-utilities.lessnu &1i� PK g}!]��>�I I �U bootstrap/layouts.lessnu &1i� PK g}!]�Y�w�* �* /W bootstrap/sprites.j32.lessnu &1i� PK g}!]�-0� � ;� bootstrap/thumbnails.lessnu &1i� PK g}!]��u�# �# ,� bootstrap/variables.lessnu &1i� PK g}!]��5 5 $ *� bootstrap/responsive-1200px-min.lessnu &1i� PK g}!]ʙ�fM M �� bootstrap/button-groups.lessnu &1i� PK g}!]�[�� � L� bootstrap.full.lessnu &1i� PK g}!]��'�� � i� bootstrap.minimal.j32.lessnu &1i� PK g}!]P>.�� � �� bootstrap.full.j32.lessnu &1i� PK g}!]@�H�B B �� bootstrap.j25.lessnu &1i� PK g}!]��� � 5� bootstrap.minimal.j3.lessnu &1i� PK g}!]���� � Z� bootstrap.minimal.lessnu &1i� PK g}!]6+��� � u� bootstrap.full.j3.lessnu &1i� PK g}!]H�qN N �� bootstrap.j3.lessnu &1i� PK ��!]`l�&K K +� cache.phpnu &1i� PK ��!]I�
+H H �� version.phpnu &1i� PK ��!]o�<�� �� 2� less.phpnu &1i� PK ��!]�P� � &� old.lessnu &1i� PK ��!]t&S$ $ � custom.lessnu &1i� PK ��!]>�"� � s� bootstrap.lessnu &1i� PK ��!]5z�5 5
�� popup.lessnu &1i� PK ��!]=u�t?. ?.
�� style.lessnu &1i� PK M�!]��.� � j t3-responsive.lessnu &1i� PK M�!]�X� � �
grid-ext-responsive.lessnu &1i� PK M�!]��iQ� � � off-canvas.lessnu &1i� PK M�!]��d� �" rtl/megamenu.lessnu &1i� PK M�!]�3� � �( rtl/off-canvas.lessnu &1i� PK M�!]��ͣ �. layout-preview.lessnu &1i� PK M�!]y�p
p
= megamenu-responsive.lessnu &1i� PK M�!]i�;� �
�G grid-ext.lessnu &1i� PK M�!]�s�b b �K global-typo.lessnu &1i� PK M�!]���Y �Y J` mixins.lessnu &1i� PK M�!]��sb� � �� frontend-edit.lessnu &1i� PK M�!]eP�� � S� non-responsive.lessnu &1i� PK M�!]��rh[ [ %� t3.lessnu &1i� PK M�!]`��� �� global-typo-responsive.lessnu &1i� PK M�!]�_�p � global-modules-responsive.lessnu &1i� PK M�!]�_�p y� global-modules.lessnu &1i� PK M�!]eeI�$ $
�� megamenu.lessnu &1i� PK =�!]`36�2 2 /
component-animations.lessnu &1i� PK =�!] �uR� � �
grid.lessnu &1i� PK =�!]?���u u �
scaffolding.lessnu &1i� PK =�!]���| | E
accordion.lessnu &1i� PK =�!]_+;? ? �
dropdowns.lessnu &1i� PK =�!]��EO O |4
utilities.lessnu &1i� PK =�!]9-�OP P 6
responsive-767px-max.lessnu &1i� PK =�!]�=� �E
hero-unit.lessnu &1i� PK =�!]l{nc( (
�G
wells.lessnu &1i� PK =�!]Qdk;� � KJ
navs.lessnu &1i� PK =�!]�a>v
v
gj
pagination.lessnu &1i� PK =�!]�Տ�i i
u
reset.lessnu &1i� PK =�!]���r- - ��
responsive.lessnu &1i� PK =�!]��zr\ \ +�
labels-badges.lessnu &1i� PK =�!]R*� � �
ɑ
close.lessnu &1i� PK =�!]�J��\ \
��
media.lessnu &1i� PK =�!]��7� � �
breadcrumbs.lessnu &1i� PK =�!]/ �� �
�
carousel.lessnu &1i� PK =�!]]��Y* Y* ��
sprites.lessnu &1i� PK =�!]��@W�. �. ��
navbar.lessnu &1i� PK =�!]���� � ��
tooltip.lessnu &1i� PK =�!]G
Y� � } type.lessnu &1i� PK =�!]��5 5 � responsive-1200px-min.lessnu &1i� PK =�!]^[�o o . tables.lessnu &1i� PK =�!]�i�� � �2 responsive-768px-979px.lessnu &1i� PK =�!]�-0� � �4 thumbnails.lessnu &1i� PK =�!]�"� �
�9 pager.lessnu &1i� PK =�!]ʙ�fM M = button-groups.lessnu &1i� PK =�!]]�� � � �S responsive-navbar.lessnu &1i� PK =�!]���B B �e responsive-utilities.lessnu &1i� PK =�!]��6o
Hl popovers.lessnu &1i� PK =�!]��>�I I �x layouts.lessnu &1i� PK =�!]s+ z code.lessnu &1i� PK =�!]U�;�* * J progress-bars.lessnu &1i� PK =�!]�5Y Y �� alerts.lessnu &1i� PK ~ ~ �( J�