// Framework grid generation // // Used only to generate the correct number of grid classes given // any value of `@grid-columns`. Thanks to Bootstrap. .make-grid-columns() { // Common styles for all sizes of grid columns, widths 1-12 .col(@index) { // initial @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; .col((@index + 1), @item); } .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; .col((@index + 1), ~"@{list}, @{item}"); } .col(@index, @list) when (@index > @grid-columns) { // terminal @{list} { position: relative; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: ceil((@grid-gutter-width / 2)); padding-right: floor((@grid-gutter-width / 2)); } } .col(1); // kickstart it } .float-grid-columns(@class) { .col(@index) { // initial @item: ~".col-@{class}-@{index}"; .col((@index + 1), @item); } .col(@index, @list) when (@index =< @grid-columns) { // general @item: ~".col-@{class}-@{index}"; .col((@index + 1), ~"@{list}, @{item}"); } .col(@index, @list) when (@index > @grid-columns) { // terminal @{list} { float: left; } } .col(1); // kickstart it } .calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) { .col-@{class}-@{index} { width: percentage((@index / @grid-columns)); } } .calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) { .col-@{class}-push-@{index} { left: percentage((@index / @grid-columns)); } } .calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) { .col-@{class}-push-0 { left: auto; } } .calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) { .col-@{class}-pull-@{index} { right: percentage((@index / @grid-columns)); } } .calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) { .col-@{class}-pull-0 { right: auto; } } .calc-grid-column(@index, @class, @type) when (@type = offset) { .col-@{class}-offset-@{index} { margin-left: percentage((@index / @grid-columns)); } } // Basic looping in LESS .loop-grid-columns(@index, @class, @type) when (@index >= 0) { .calc-grid-column(@index, @class, @type); // next iteration .loop-grid-columns((@index - 1), @class, @type); } // Create grid for specific class .make-grid(@class) { .float-grid-columns(@class); .loop-grid-columns(@grid-columns, @class, width); .loop-grid-columns(@grid-columns, @class, pull); .loop-grid-columns(@grid-columns, @class, push); .loop-grid-columns(@grid-columns, @class, offset); } // Centered container element .container-fixed(@gutter: @grid-gutter-width) { margin-right: auto; margin-left: auto; padding-left: (@gutter / 2); padding-right: (@gutter / 2); &:extend(.clearfix all); } // Creates a wrapper for a series of columns .make-row(@gutter: @grid-gutter-width) { margin-left: ceil((@gutter / -2)); margin-right: floor((@gutter / -2)); &:extend(.clearfix all); } // Generate the extra small columns .make-xs-column(@columns; @gutter: @grid-gutter-width) { position: relative; float: left; width: percentage((@columns / @grid-columns)); min-height: 1px; padding-left: (@gutter / 2); padding-right: (@gutter / 2); } .make-xs-column-offset(@columns) { margin-left: percentage((@columns / @grid-columns)); } .make-xs-column-push(@columns) { left: percentage((@columns / @grid-columns)); } .make-xs-column-pull(@columns) { right: percentage((@columns / @grid-columns)); } // Generate the small columns .make-sm-column(@columns; @gutter: @grid-gutter-width) { position: relative; min-height: 1px; padding-left: (@gutter / 2); padding-right: (@gutter / 2); @media (min-width: @screen-sm-min) { float: left; width: percentage((@columns / @grid-columns)); } } .make-sm-column-offset(@columns) { @media (min-width: @screen-sm-min) { margin-left: percentage((@columns / @grid-columns)); } } .make-sm-column-push(@columns) { @media (min-width: @screen-sm-min) { left: percentage((@columns / @grid-columns)); } } .make-sm-column-pull(@columns) { @media (min-width: @screen-sm-min) { right: percentage((@columns / @grid-columns)); } } // Generate the medium columns .make-md-column(@columns; @gutter: @grid-gutter-width) { position: relative; min-height: 1px; padding-left: (@gutter / 2); padding-right: (@gutter / 2); @media (min-width: @screen-md-min) { float: left; width: percentage((@columns / @grid-columns)); } } .make-md-column-offset(@columns) { @media (min-width: @screen-md-min) { margin-left: percentage((@columns / @grid-columns)); } } .make-md-column-push(@columns) { @media (min-width: @screen-md-min) { left: percentage((@columns / @grid-columns)); } } .make-md-column-pull(@columns) { @media (min-width: @screen-md-min) { right: percentage((@columns / @grid-columns)); } } // Generate the large columns .make-lg-column(@columns; @gutter: @grid-gutter-width) { position: relative; min-height: 1px; padding-left: (@gutter / 2); padding-right: (@gutter / 2); @media (min-width: @screen-lg-min) { float: left; width: percentage((@columns / @grid-columns)); } } .make-lg-column-offset(@columns) { @media (min-width: @screen-lg-min) { margin-left: percentage((@columns / @grid-columns)); } } .make-lg-column-push(@columns) { @media (min-width: @screen-lg-min) { left: percentage((@columns / @grid-columns)); } } .make-lg-column-pull(@columns) { @media (min-width: @screen-lg-min) { right: percentage((@columns / @grid-columns)); } } // Responsive utilities // // More easily include all the states for responsive-utilities.less. .responsive-visibility() { display: block !important; table& { display: table; } tr& { display: table-row !important; } th&, td& { display: table-cell !important; } } .responsive-invisibility() { display: none !important; } // Visibility utilities // Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 .visible-xs, .visible-sm, .visible-md, .visible-lg { .responsive-invisibility(); } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } .visible-xs { @media (max-width: @screen-xs-max) { .responsive-visibility(); } } .visible-xs-block { @media (max-width: @screen-xs-max) { display: block !important; } } .visible-xs-inline { @media (max-width: @screen-xs-max) { display: inline !important; } } .visible-xs-inline-block { @media (max-width: @screen-xs-max) { display: inline-block !important; } } .visible-sm { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { .responsive-visibility(); } } .visible-sm-block { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { display: block !important; } } .visible-sm-inline { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { display: inline !important; } } .visible-sm-inline-block { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { display: inline-block !important; } } .visible-md { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { .responsive-visibility(); } } .visible-md-block { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { display: block !important; } } .visible-md-inline { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { display: inline !important; } } .visible-md-inline-block { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { display: inline-block !important; } } .visible-lg { @media (min-width: @screen-lg-min) { .responsive-visibility(); } } .visible-lg-block { @media (min-width: @screen-lg-min) { display: block !important; } } .visible-lg-inline { @media (min-width: @screen-lg-min) { display: inline !important; } } .visible-lg-inline-block { @media (min-width: @screen-lg-min) { display: inline-block !important; } } .hidden-xs { @media (max-width: @screen-xs-max) { .responsive-invisibility(); } } .hidden-sm { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { .responsive-invisibility(); } } .hidden-md { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { .responsive-invisibility(); } } .hidden-lg { @media (min-width: @screen-lg-min) { .responsive-invisibility(); } } // Print utilities // // Media queries are placed on the inside to be mixin-friendly. // Note: Deprecated .visible-print as of v3.2.0 .visible-print { .responsive-invisibility(); @media print { .responsive-visibility(); } } .visible-print-block { display: none !important; @media print { display: block !important; } } .visible-print-inline { display: none !important; @media print { display: inline !important; } } .visible-print-inline-block { display: none !important; @media print { display: inline-block !important; } } .hidden-print { @media print { .responsive-invisibility(); } }