lesscpy-0.13.0/0000755000175000017500000000000013236067221012343 5ustar totoltotollesscpy-0.13.0/MANIFEST.in0000644000175000017500000000017312273500632014100 0ustar totoltotolinclude LICENSE include README.rst include requirements.txt test-requirements.txt include tox.ini recursive-include test * lesscpy-0.13.0/requirements.txt0000644000175000017500000000001012435433733015623 0ustar totoltotolply six lesscpy-0.13.0/LICENSE0000644000175000017500000000204712171520733013352 0ustar totoltotolCopyright (c) 2012 Jóhann T Maríusson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.lesscpy-0.13.0/setup.cfg0000644000175000017500000000007513236067221014166 0ustar totoltotol[wheel] universal = 1 [egg_info] tag_build = tag_date = 0 lesscpy-0.13.0/setup.py0000755000175000017500000000371013221205430014047 0ustar totoltotol#!/usr/bin/env python # -*- coding: utf-8 -*- from setuptools import find_packages, setup import pkg_resources import codecs import lesscpy with codecs.open('README.rst', encoding='utf-8') as f: long_description = f.read() with open("requirements.txt", "r") as f: install_requires = [str(req) for req in pkg_resources.parse_requirements(f)] with open("test-requirements.txt", "r") as f: test_requires = [] for line in f.readlines(): # Skip '-r ...' includes which pkg_resources doesn't understand: if not line.startswith('-r '): test_requires.append(str(pkg_resources.Requirement.parse(line))) setup( name='lesscpy', version=lesscpy.__version__, license="MIT", description='Python LESS compiler', long_description=long_description, author='Jóhann T Maríusson', author_email='jtm@robot.is', url='https://github.com/lesscpy/lesscpy', packages=find_packages(exclude=['*test*']), package_data={'': ['LICENSE']}, entry_points = { 'console_scripts' : [ 'lesscpy = lesscpy.scripts.compiler:run' ] }, install_requires=install_requires, tests_require=test_requires, test_suite='nose.collector', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Intended Audience :: End Users/Desktop', 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Topic :: Software Development :: Code Generators', 'Topic :: Software Development :: Pre-processors', ], ) lesscpy-0.13.0/test-requirements.txt0000644000175000017500000000005112435433733016605 0ustar totoltotol-r requirements.txt coverage flake8 nose lesscpy-0.13.0/PKG-INFO0000644000175000017500000001530113236067221013440 0ustar totoltotolMetadata-Version: 1.1 Name: lesscpy Version: 0.13.0 Summary: Python LESS compiler Home-page: https://github.com/lesscpy/lesscpy Author: Jóhann T Maríusson Author-email: jtm@robot.is License: MIT Description-Content-Type: UNKNOWN Description: LESSCPY ======= .. image:: https://travis-ci.org/lesscpy/lesscpy.png?branch=master :target: https://travis-ci.org/lesscpy/lesscpy .. image:: https://coveralls.io/repos/lesscpy/lesscpy/badge.png :target: https://coveralls.io/r/lesscpy/lesscpy .. image:: https://pypip.in/d/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy .. image:: https://pypip.in/v/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy .. image:: https://pypip.in/wheel/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy :alt: Wheel Status .. image:: https://pypip.in/license/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy :alt: License Python LESS Compiler. A compiler written in Python for the LESS language. For those of us not willing or able to have node.js installed in our environment. Not all features of LESS are supported (yet). Some features wil probably never be supported (JavaScript evaluation). This program uses PLY (Python Lex-Yacc) to tokenize / parse the input and is considerably slower than the NodeJS compiler. The plan is to utilize this to build in proper syntax checking and perhaps YUI compressing. This is an early version, so you are likely to find bugs. For more information on LESS: http://lesscss.org/ or https://github.com/cloudhead/less.js Development files: https://github.com/lesscpy/lesscpy Supported features ------------------ - Variables - String interpolation - Mixins (nested, calls, closures, recursive) - Guard expressions - Parametered mixins (class / id) - @arguments - Nesting - Escapes ~/e() - Expressions - Keyframe blocks - Color functions (lighten, darken, saturate, desaturate, spin, hue, mix, saturation, lightness) - Other functions (round, increment, decrement, format '%(', ...) Differences from less.js ------------------------ - All colors are auto-formatted to #nnnnnn. eg, #f7e923 - Does not preserve CSS comments Not supported ------------- - JavaScript evaluation Requirements ------------ - Python 2.6, 2.7, 3.3, 3.4, or 3.5 - ply (Python Lex-Yacc) (check requirements.txt) Installation ------------ To install lesscpy from the `Python Package Index`_, simply: .. code-block:: bash $ pip install lesscpy To do a local system-wide install: .. code-block:: bash python setup.py install Or simply place the package into your Python path. Or rather use packages provided by your distribution (openSUSE has them at least). Compiler script Usage --------------------- .. code-block:: text usage: lesscpy [-h] [-v] [-I INCLUDE] [-V] [-x] [-X] [-t] [-s SPACES] [-o OUT] [-r] [-f] [-m] [-D] [-g] [-S] [-L] [-N] target LessCss Compiler positional arguments: target less file or directory optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit -I INCLUDE, --include INCLUDE Included less-files (comma separated) -V, --verbose Verbose mode Formatting options: -x, --minify Minify output -X, --xminify Minify output, no end of block newlines -t, --tabs Use tabs -s SPACES, --spaces SPACES Number of startline spaces (default 2) Directory options: Compiles all \*.less files in directory that have a newer timestamp than it's css file. -o OUT, --out OUT Output directory -r, --recurse Recursive into subdirectorys -f, --force Force recompile on all files -m, --min-ending Add '.min' into output filename. eg, name.min.css -D, --dry-run Dry run, do not write files Debugging: -g, --debug Debugging information -S, --scopemap Scopemap -L, --lex-only Run lexer on target -N, --no-css No css output Python usage ------------ If you want to use the compiler from within Python, you can do it like this: .. code-block:: python import lesscpy from six import StringIO print(lesscpy.compile(StringIO(u"a { border-width: 2px * 3; }"), minify=True)) The output will be: .. code-block:: text a{border-width:6px;} License ------- See the LICENSE file .. _`Python Package Index`: https://pypi.python.org/pypi/lesscpy Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Intended Audience :: End Users/Desktop Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Topic :: Software Development :: Code Generators Classifier: Topic :: Software Development :: Pre-processors lesscpy-0.13.0/lesscpy/0000755000175000017500000000000013236067221014025 5ustar totoltotollesscpy-0.13.0/lesscpy/lessc/0000755000175000017500000000000013236067221015136 5ustar totoltotollesscpy-0.13.0/lesscpy/lessc/lexer.py0000644000175000017500000003221213115557313016631 0ustar totoltotol""" Lexer for LESSCSS. http://www.dabeaz.com/ply/ply.html http://www.w3.org/TR/CSS21/grammar.html#scanner http://lesscss.org/#docs Copyright (c) See LICENSE for details. """ import re import ply.lex as lex from six import string_types from lesscpy.lib import dom from lesscpy.lib import css from lesscpy.lib import reserved class LessLexer: states = ( ('parn', 'inclusive'), ('escapequotes', 'inclusive'), ('escapeapostrophe', 'inclusive'), ('istringquotes', 'inclusive'), ('istringapostrophe', 'inclusive'), ('iselector', 'inclusive'), ('mediaquery', 'inclusive'), ('import', 'inclusive'), ) literals = '<>=%!/*-+&' tokens = [ 'css_ident', 'css_dom', 'css_class', 'css_id', 'css_property', 'css_vendor_property', 'css_comment', 'css_string', 'css_color', 'css_filter', 'css_number', 'css_important', 'css_vendor_hack', 'css_uri', 'css_ms_filter', 'css_keyframe_selector', 'css_media_type', 'css_media_feature', 't_and', 't_not', 't_only', 'less_variable', 'less_comment', 'less_open_format', 'less_when', 'less_and', 'less_not', 't_ws', 't_popen', 't_pclose', 't_semicolon', 't_tilde', 't_colon', 't_comma', 't_eopen', 't_eclose', 't_isopen', 't_isclose', 't_bopen', 't_bclose' ] tokens += list(set(reserved.tokens.values())) # Tokens with significant following whitespace significant_ws = set([ 'css_class', 'css_id', 'css_dom', 'css_property', 'css_vendor_property', 'css_ident', 'css_number', 'css_color', 'css_media_type', 'css_filter', 'less_variable', 't_and', 't_not', 't_only', '&', ]) significant_ws.update(reserved.tokens.values()) def __init__(self): self.build(reflags=re.UNICODE | re.IGNORECASE) self.last = None self.next_ = None self.pretok = True def t_css_filter(self, t): (r'\[[^\]]*\]' '|(not|lang|nth-[a-z\-]+)\(.+\)' '|and[ \t]\([^><=\{]+\)') return t def t_css_ms_filter(self, t): r'(?:progid:|DX\.)[^;\(]*' return t def t_t_bopen(self, t): r'\{' t.lexer.in_property_decl = False return t def t_t_bclose(self, t): r'\}' return t def t_t_colon(self, t): r':' return t def t_t_comma(self, t): r',' t.lexer.in_property_decl = False return t def t_css_number(self, t): r'-?(\d*\.\d+|\d+)(s|%|in|ex|[ecm]m|p[txc]|deg|g?rad|ms?|k?hz|dpi|dpcm|dppx)?' return t def t_css_ident(self, t): (r'([\-\.\#]?' '([_a-z]' '|[\200-\377]' '|\\\[0-9a-f]{1,6}' '|\\\[^\s\r\n0-9a-f])' '([_a-z0-9\-]' '|[\200-\377]' '|\\\[0-9a-f]{1,6}' '|\\\[^\s\r\n0-9a-f])*)' '|\.') v = t.value.strip() c = v[0] if c == '.': # In some cases, only the '.' can be marked as CSS class. # # Example: .@{name} # t.type = 'css_class' if t.lexer.lexstate != "iselector": # Selector-chaining case (a.b.c), we are already in state 'iselector' t.lexer.push_state("iselector") elif c == '#': t.type = 'css_id' if len(v) in [4, 7]: try: int(v[1:], 16) t.type = 'css_color' except ValueError: pass elif v == 'when': t.type = 'less_when' elif v == 'and': t.type = 'less_and' elif v == 'not': t.type = 'less_not' elif v in ('from', 'to'): t.type = 'css_keyframe_selector' elif v in css.propertys: t.type = 'css_property' t.lexer.in_property_decl = True elif (v in dom.elements or v.lower() in dom.elements) and not t.lexer.in_property_decl: # DOM elements can't be part of property declarations, avoids ambiguity between 'rect' DOM # element and rect() CSS function. t.type = 'css_dom' elif c == '-': t.type = 'css_vendor_property' t.lexer.in_property_decl = True t.value = v return t def t_iselector_less_variable(self, t): r'@\{[^@\}]+\}' return t def t_iselector_t_eclose(self, t): r'"|\'' # Can only happen if iselector state is on top of estring state. # # Example: @item: ~".col-xs-@{index}"; # t.lexer.pop_state() return t def t_iselector_css_filter(self, t): (r'\[[^\]]*\]' '|(not|lang|nth-[a-z\-]+)\(.+\)' '|and[ \t]\([^><\{]+\)') # TODO/FIXME(saschpe): Only needs to be redifined in state 'iselector' so that # the following css_class doesn't catch everything. return t def t_iselector_css_class(self, t): r'[_a-z0-9\-]+' # The first part of CSS class was tokenized by t_css_ident() already. # Here we gather up the any LESS variable. # # Example: .span_@{num}_small # return t def t_iselector_t_ws(self, t): r'[ \t\f\v]+' # # Example: .span_@{num} # t.lexer.pop_state() t.value = ' ' return t def t_iselector_t_bopen(self, t): r'\{' t.lexer.pop_state() return t def t_iselector_t_colon(self, t): r':' t.lexer.pop_state() return t def t_mediaquery_t_not(self, t): r'not' return t def t_mediaquery_t_only(self, t): r'only' return t def t_mediaquery_t_and(self, t): r'and' return t def t_mediaquery_t_popen(self, t): r'\(' # Redefine global t_popen to avoid pushing state 'parn' return t @lex.TOKEN('|'.join(css.media_types)) def t_mediaquery_css_media_type(self, t): return t @lex.TOKEN('|'.join(css.media_features)) def t_mediaquery_css_media_feature(self, t): return t def t_mediaquery_t_bopen(self, t): r'\{' t.lexer.pop_state() return t def t_mediaquery_t_semicolon(self, t): r';' # This can happen only as part of a CSS import statement. The # "mediaquery" state is reused there. Ordinary media queries always # end at '{', i.e. when a block is opened. t.lexer.pop_state() # state mediaquery # We have to pop the 'import' state here because we already ate the # t_semicolon and won't trigger t_import_t_semicolon. t.lexer.pop_state() # state import return t @lex.TOKEN('|'.join(css.media_types)) def t_import_css_media_type(self, t): # Example: @import url("bar.css") handheld and (max-width: 500px); # Alternatively, we could use a lookahead "if not ';'" after the URL # part of the @import statement... t.lexer.push_state("mediaquery") return t def t_import_t_semicolon(self, t): r';' t.lexer.pop_state() return t def t_less_variable(self, t): r'@@?[\w-]+|@\{[^@\}]+\}' v = t.value.lower() if v in reserved.tokens: t.type = reserved.tokens[v] if t.type == "css_media": t.lexer.push_state("mediaquery") elif t.type == "css_import": t.lexer.push_state("import") return t def t_css_color(self, t): r'\#[0-9]([0-9a-f]{5}|[0-9a-f]{2})' return t def t_parn_css_uri(self, t): (r'data:[^\)]+' '|(([a-z]+://)?' '(' '(/?[\.a-z:]+[\w\.:]*[\\/][\\/]?)+' '|([a-z][\w\.\-]+(\.[a-z0-9]+))' '(\#[a-z]+)?)' ')+') return t def t_parn_css_ident(self, t): (r'(([_a-z]' '|[\200-\377]' '|\\\[0-9a-f]{1,6}' '|\\\[^\r\n\s0-9a-f])' '([_a-z0-9\-]|[\200-\377]' '|\\\[0-9a-f]{1,6}' '|\\\[^\r\n\s0-9a-f])*)') return t def t_newline(self, t): r'[\n\r]+' t.lexer.lineno += t.value.count('\n') def t_css_comment(self, t): r'(/\*(.|\n|\r)*?\*/)' t.lexer.lineno += t.value.count('\n') pass def t_less_comment(self, t): r'//.*' pass def t_css_important(self, t): r'!\s*important' t.value = '!important' return t def t_t_ws(self, t): r'[ \t\f\v]+' t.value = ' ' return t def t_t_popen(self, t): r'\(' t.lexer.push_state('parn') return t def t_less_open_format(self, t): r'%\(' t.lexer.push_state('parn') return t def t_parn_t_pclose(self, t): r'\)' t.lexer.pop_state() return t def t_t_pclose(self, t): r'\)' return t def t_t_semicolon(self, t): r';' t.lexer.in_property_decl = False return t def t_t_eopen(self, t): r'~"|~\'' if t.value[1] == '"': t.lexer.push_state('escapequotes') elif t.value[1] == '\'': t.lexer.push_state('escapeapostrophe') return t def t_t_tilde(self, t): r'~' return t def t_escapequotes_less_variable(self, t): r'@\{[^@"\}]+\}' return t def t_escapeapostrophe_less_variable(self, t): r'@\{[^@\'\}]+\}' return t def t_escapequotes_t_eclose(self, t): r'"' t.lexer.pop_state() return t def t_escapeapostrophe_t_eclose(self, t): r'\'' t.lexer.pop_state() return t def t_css_string(self, t): r'"[^"@]*"|\'[^\'@]*\'' t.lexer.lineno += t.value.count('\n') return t def t_t_isopen(self, t): r'"|\'' if t.value[0] == '"': t.lexer.push_state('istringquotes') elif t.value[0] == '\'': t.lexer.push_state('istringapostrophe') return t def t_istringquotes_less_variable(self, t): r'@\{[^@"\}]+\}' return t def t_istringapostrophe_less_variable(self, t): r'@\{[^@\'\}]+\}' return t def t_istringapostrophe_css_string(self, t): r'[^\'@]+' t.lexer.lineno += t.value.count('\n') return t def t_istringquotes_css_string(self, t): r'[^"@]+' t.lexer.lineno += t.value.count('\n') return t def t_istringquotes_t_isclose(self, t): r'"' t.lexer.pop_state() return t def t_istringapostrophe_t_isclose(self, t): r'\'' t.lexer.pop_state() return t # Error handling rule def t_error(self, t): raise SyntaxError("Illegal character '%s' line %d" % (t.value[0], t.lexer.lineno)) t.lexer.skip(1) # Build the lexer def build(self, **kwargs): self.lexer = lex.lex(module=self, **kwargs) # State-tracking variable, see http://www.dabeaz.com/ply/ply.html#ply_nn18 self.lexer.in_property_decl = False def file(self, filename): """ Lex file. """ with open(filename) as f: self.lexer.input(f.read()) return self def input(self, file): """ Load lexer with content from `file` which can be a path or a file like object. """ if isinstance(file, string_types): with open(file) as f: self.lexer.input(f.read()) else: self.lexer.input(file.read()) def token(self): """ Token function. Contains 2 hacks: 1. Injects ';' into blocks where the last property leaves out the ; 2. Strips out whitespace from nonsignificant locations to ease parsing. """ if self.next_: t = self.next_ self.next_ = None return t while True: t = self.lexer.token() if not t: return t if t.type == 't_ws' and ( self.pretok or (self.last and self.last.type not in self.significant_ws)): continue self.pretok = False if t.type == 't_bclose' and self.last and self.last.type not in ['t_bopen', 't_bclose'] and self.last.type != 't_semicolon' \ and not (hasattr(t, 'lexer') and (t.lexer.lexstate == 'escapequotes' or t.lexer.lexstate == 'escapeapostrophe')): self.next_ = t tok = lex.LexToken() tok.type = 't_semicolon' tok.value = ';' tok.lineno = t.lineno tok.lexpos = t.lexpos self.last = tok self.lexer.in_property_decl = False return tok self.last = t break return t lesscpy-0.13.0/lesscpy/lessc/scope.py0000644000175000017500000001330313115557313016623 0ustar totoltotol""" .. module:: lesscpy.lessc.scope :synopsis: Scope class. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ import six from . import utility class Scope(list): """ Scope class. A stack implementation. """ def __init__(self, init=False): """Scope Args: init (bool): Initiate scope """ super(Scope, self).__init__() self._mixins = {} if init: self.push() self.deferred = False self.real = [] def push(self): """Push level on scope """ self.append({ '__variables__': {}, '__blocks__': [], '__names__': [], '__current__': None }) @property def current(self): return self[-1]['__current__'] @current.setter def current(self, value): self[-1]['__current__'] = value @property def scopename(self): """Current scope name as list Returns: list """ return [r['__current__'] for r in self if r['__current__']] def add_block(self, block): """Add block element to scope Args: block (Block): Block object """ self[-1]['__blocks__'].append(block) self[-1]['__names__'].append(block.raw()) def remove_block(self, block, index="-1"): """Remove block element from scope Args: block (Block): Block object """ self[index]["__blocks__"].remove(block) self[index]["__names__"].remove(block.raw()) def add_mixin(self, mixin): """Add mixin to scope Args: mixin (Mixin): Mixin object """ raw = mixin.tokens[0][0].raw() if raw in self._mixins: self._mixins[raw].append(mixin) else: self._mixins[raw] = [mixin] def add_variable(self, variable): """Add variable to scope Args: variable (Variable): Variable object """ self[-1]['__variables__'][variable.name] = variable def variables(self, name): """Search for variable by name. Searches scope top down Args: name (string): Search term Returns: Variable object OR False """ if isinstance(name, tuple): name = name[0] if name.startswith('@{'): name = '@' + name[2:-1] i = len(self) while i >= 0: i -= 1 if name in self[i]['__variables__']: return self[i]['__variables__'][name] return False def mixins(self, name): """ Search mixins for name. Allow '>' to be ignored. '.a .b()' == '.a > .b()' Args: name (string): Search term Returns: Mixin object list OR False """ m = self._smixins(name) if m: return m return self._smixins(name.replace('?>?', ' ')) def _smixins(self, name): """Inner wrapper to search for mixins by name. """ return (self._mixins[name] if name in self._mixins else False) def blocks(self, name): """ Search for defined blocks recursively. Allow '>' to be ignored. '.a .b' == '.a > .b' Args: name (string): Search term Returns: Block object OR False """ b = self._blocks(name) if b: return b return self._blocks(name.replace('?>?', ' ')) def _blocks(self, name): """Inner wrapper to search for blocks by name. """ i = len(self) while i >= 0: i -= 1 if name in self[i]['__names__']: for b in self[i]['__blocks__']: r = b.raw() if r and r == name: return b else: for b in self[i]['__blocks__']: r = b.raw() if r and name.startswith(r): b = utility.blocksearch(b, name) if b: return b return False def update(self, scope, at=0): """Update scope. Add another scope to this one. Args: scope (Scope): Scope object Kwargs: at (int): Level to update """ if hasattr(scope, '_mixins') and not at: self._mixins.update(scope._mixins) self[at]['__variables__'].update(scope[at]['__variables__']) self[at]['__blocks__'].extend(scope[at]['__blocks__']) self[at]['__names__'].extend(scope[at]['__names__']) def swap(self, name): """ Swap variable name for variable value Args: name (str): Variable name Returns: Variable value (Mixed) """ if name.startswith('@@'): var = self.variables(name[1:]) if var is False: raise SyntaxError('Unknown variable %s' % name) name = '@' + utility.destring(var.value[0]) var = self.variables(name) if var is False: raise SyntaxError('Unknown variable %s' % name) elif name.startswith('@{'): var = self.variables('@' + name[2:-1]) if var is False: raise SyntaxError('Unknown escaped variable %s' % name) if isinstance(var.value[0], six.string_types): var.value[0] = utility.destring(var.value[0]) else: var = self.variables(name) if var is False: raise SyntaxError('Unknown variable %s' % name) return var.value lesscpy-0.13.0/lesscpy/lessc/utility.py0000644000175000017500000001544713115557313017230 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.lessc.utility :synopsis: various utility functions Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from __future__ import print_function import collections import itertools import math import re import sys from six import string_types def flatten(lst): """Flatten list. Args: lst (list): List to flatten Returns: generator """ for elm in lst: if isinstance(elm, collections.Iterable) and not isinstance(elm, string_types): for sub in flatten(elm): yield sub else: yield elm def pairwise(lst): """ yield item i and item i+1 in lst. e.g. (lst[0], lst[1]), (lst[1], lst[2]), ..., (lst[-1], None) Args: lst (list): List to process Returns: list """ if not lst: return length = len(lst) for i in range(length - 1): yield lst[i], lst[i + 1] yield lst[-1], None def rename(blocks, scope, stype): """ Rename all sub-blocks moved under another block. (mixins) Args: lst (list): block list scope (object): Scope object """ for p in blocks: if isinstance(p, stype): p.tokens[0].parse(scope) if p.tokens[1]: scope.push() scope.current = p.tokens[0] rename(p.tokens[1], scope, stype) scope.pop() def blocksearch(block, name): """ Recursive search for name in block (inner blocks) Args: name (str): search term Returns: Block OR False """ if hasattr(block, 'tokens'): for b in block.tokens[1]: b = (b if hasattr(b, 'raw') and b.raw() == name else blocksearch(b, name)) if b: return b return False def reverse_guard(lst): """ Reverse guard expression. not (@a > 5) -> (@a =< 5) Args: lst (list): Expression returns: list """ rev = { '<': '>=', '>': '=<', '>=': '<', '=<': '>' } return [rev[l] if l in rev else l for l in lst] def debug_print(lst, lvl=0): """ Print scope tree args: lst (list): parse result lvl (int): current nesting level """ pad = ''.join(['\t.'] * lvl) t = type(lst) if t is list: for p in lst: debug_print(p, lvl) elif hasattr(lst, 'tokens'): print(pad, t) debug_print(list(flatten(lst.tokens)), lvl + 1) def destring(value): """ Strip quotes from string args: value (str) returns: str """ return value.strip('"\'') def analyze_number(var, err=''): """ Analyse number for type and split from unit 1px -> (q, 'px') args: var (str): number string kwargs: err (str): Error message raises: SyntaxError returns: tuple """ n, u = split_unit(var) if not isinstance(var, string_types): return (var, u) if is_color(var): return (var, 'color') if is_int(n): n = int(n) elif is_float(n): n = float(n) else: raise SyntaxError('%s ´%s´' % (err, var)) return (n, u) def with_unit(number, unit=None): """ Return number with unit args: number (mixed): Number unit (str): Unit returns: str """ if isinstance(number, tuple): number, unit = number if number == 0: return '0' if unit: number = str(number) if number.startswith('.'): number = '0' + number return "%s%s" % (number, unit) return number if isinstance(number, string_types) else str(number) def is_color(value): """ Is string CSS color args: value (str): string returns: bool """ if not value or not isinstance(value, string_types): return False if value[0] == '#' and len(value) in [4, 5, 7, 9]: try: int(value[1:], 16) return True except ValueError: pass return False def is_variable(value): """ Check if string is LESS variable args: value (str): string returns: bool """ if isinstance(value, string_types): return (value.startswith('@') or value.startswith('-@')) elif isinstance(value, tuple): value = ''.join(value) return (value.startswith('@') or value.startswith('-@')) return False def is_int(value): """ Is value integer args: value (str): string returns: bool """ try: int(str(value)) return True except (ValueError, TypeError): pass return False def is_float(value): """ Is value float args: value (str): string returns: bool """ if not is_int(value): try: float(str(value)) return True except (ValueError, TypeError): pass return False def split_unit(value): """ Split a number from its unit 1px -> (q, 'px') Args: value (str): input returns: tuple """ r = re.search('^(\-?[\d\.]+)(.*)$', str(value)) return r.groups() if r else ('', '') def away_from_zero_round(value, ndigits=0): """Round half-way away from zero. Python2's round() method. """ if sys.version_info[0] >= 3: p = 10 ** ndigits return float(math.floor((value * p) + math.copysign(0.5, value))) / p else: return round(value, ndigits) def convergent_round(value, ndigits=0): """Convergent rounding. Round to neareas even, similar to Python3's round() method. """ if sys.version_info[0] < 3: if value < 0.0: return -convergent_round(-value) epsilon = 0.0000001 integral_part, _ = divmod(value, 1) if abs(value - (integral_part + 0.5)) < epsilon: if integral_part % 2.0 < epsilon: return integral_part else: nearest_even = integral_part + 0.5 return math.ceil(nearest_even) return round(value, ndigits) def pc_or_float(s): """ Utility function to process strings that contain either percentiles or floats args: str: s returns: float """ if isinstance(s, string_types) and '%' in s: return float(s.strip('%')) / 100.0 return float(s) def permutations_with_replacement(iterable, r=None): """Return successive r length permutations of elements in the iterable. Similar to itertools.permutation but withouth repeated values filtering. """ pool = tuple(iterable) n = len(pool) r = n if r is None else r for indices in itertools.product(range(n), repeat=r): yield list(pool[i] for i in indices) lesscpy-0.13.0/lesscpy/lessc/color.py0000644000175000017500000003327313221205430016624 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.lessc.color :synopsis: Lesscpy Color functions Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ import operator import colorsys import re import six from . import utility from lesscpy.lib import colors class Color(): def process(self, expression): """ Process color expression args: expression (tuple): color expression returns: str """ a, o, b = expression c1 = self._hextorgb(a) c2 = self._hextorgb(b) r = ['#'] for i in range(3): v = self.operate(c1[i], c2[i], o) if v > 0xff: v = 0xff if v < 0: v = 0 r.append("%02x" % int(v)) return ''.join(r) def operate(self, left, right, operation): """ Do operation on colors args: left (str): left side right (str): right side operation (str): Operation returns: str """ operation = { '+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv }.get(operation) return operation(left, right) def rgb(self, *args): """ Translate rgb(...) to color string raises: ValueError returns: str """ if len(args) == 4: args = args[:3] if len(args) == 3: try: return self._rgbatohex(list(map(int, args))) except ValueError: if all((a for a in args if a[-1] == '%' and 100 >= int(a[:-1]) >= 0)): return self._rgbatohex([int(a[:-1]) * 255 / 100.0 for a in args]) raise ValueError('Illegal color values') def rgba(self, *args): """ Translate rgba(...) to color string raises: ValueError returns: str """ if len(args) == 4: try: falpha = float(list(args)[3]) if falpha > 1: args = args[:3] if falpha == 0: values = self._rgbatohex_raw(list(map(int, args))) return "rgba(%s)" % ','.join([str(a) for a in values]) return self._rgbatohex(list(map(int, args))) except ValueError: if all((a for a in args if a[-1] == '%' and 100 >= int(a[:-1]) >= 0)): alpha = list(args)[3] if alpha[-1] == '%' and float(alpha[:-1]) == 0: values = self._rgbatohex_raw([int(a[:-1]) * 255 / 100.0 for a in args]) return "rgba(%s)" % ','.join([str(a) for a in values]) return self._rgbatohex([int(a[:-1]) * 255 / 100.0 for a in args]) raise ValueError('Illegal color values') def argb(self, *args): """ Translate argb(...) to color string Creates a hex representation of a color in #AARRGGBB format (NOT #RRGGBBAA!). This format is used in Internet Explorer, and .NET and Android development. raises: ValueError returns: str """ if len(args) == 1 and type(args[0]) is str: match = re.match(r'rgba\((.*)\)', args[0]) if match: # NOTE(saschpe): Evil hack to cope with rgba(.., .., .., 0.5) passed through untransformed rgb = re.sub(r'\s+', '', match.group(1)).split(',') else: rgb = list(self._hextorgb(args[0])) else: rgb = list(args) if len(rgb) == 3: return self._rgbatohex([255] + list(map(int, rgb))) elif len(rgb) == 4: rgb = [rgb.pop()] + rgb # Move Alpha to front try: fval = float(list(rgb)[0]) if fval > 1: rgb = [255] + rgb[1:] # Clip invalid integer/float values elif 1 >= fval >= 0: rgb = [fval * 256] + rgb[1:] # Convert 0-1 to 0-255 range for _rgbatohex else: rgb = [0] + rgb[1:] # Clip lower bound return self._rgbatohex(list(map(int, rgb))) except ValueError: if all((a for a in rgb if a[-1] == '%' and 100 >= int(a[:-1]) >= 0)): return self._rgbatohex([int(a[:-1]) * 255 / 100.0 for a in rgb]) raise ValueError('Illegal color values') def hsl(self, *args): """ Translate hsl(...) to color string raises: ValueError returns: str """ if len(args) == 4: return self.hsla(*args) elif len(args) == 3: h, s, l = args rgb = colorsys.hls_to_rgb(int(h) / 360.0, utility.pc_or_float(l), utility.pc_or_float(s)) color = (utility.convergent_round(c * 255) for c in rgb) return self._rgbatohex(color) raise ValueError('Illegal color values') def hsla(self, *args): """ Translate hsla(...) to color string raises: ValueError returns: str """ if len(args) == 4: h, s, l, a = args rgb = colorsys.hls_to_rgb(int(h) / 360.0, utility.pc_or_float(l), utility.pc_or_float(s)) color = [float(utility.convergent_round(c * 255)) for c in rgb] color.append(utility.pc_or_float(a)) return "rgba(%s,%s,%s,%s)" % tuple(color) raise ValueError('Illegal color values') def hue(self, color, *args): """ Return the hue value of a color args: color (str): color raises: ValueError returns: float """ if color: h, l, s = self._hextohls(color) return utility.convergent_round(h * 360.0, 3) raise ValueError('Illegal color values') def saturation(self, color, *args): """ Return the saturation value of a color args: color (str): color raises: ValueError returns: float """ if color: h, l, s = self._hextohls(color) return s * 100.0 raise ValueError('Illegal color values') def lightness(self, color, *args): """ Return the lightness value of a color args: color (str): color raises: ValueError returns: float """ if color: h, l, s = self._hextohls(color) return l * 100.0 raise ValueError('Illegal color values') def opacity(self, *args): """ """ pass def lighten(self, color, diff, *args): """ Lighten a color args: color (str): color diff (str): percentage returns: str """ if color and diff: return self._ophsl(color, diff, 1, operator.add) raise ValueError('Illegal color values') def darken(self, color, diff, *args): """ Darken a color args: color (str): color diff (str): percentage returns: str """ if color and diff: return self._ophsl(color, diff, 1, operator.sub) raise ValueError('Illegal color values') def saturate(self, color, diff, *args): """ Saturate a color args: color (str): color diff (str): percentage returns: str """ if color and diff: return self._ophsl(color, diff, 2, operator.add) raise ValueError('Illegal color values') def desaturate(self, color, diff, *args): """ Desaturate a color args: color (str): color diff (str): percentage returns: str """ if color and diff: return self._ophsl(color, diff, 2, operator.sub) raise ValueError('Illegal color values') def _clamp(self, value): # Clamp value return min(1, max(0, value)) def greyscale(self, color, *args): """ Simply 100% desaturate. args: color (str): color returns: str """ if color: return self.desaturate(color, 100.0) raise ValueError('Illegal color values') def grayscale(self, color, *args): """Wrapper for greyscale, other spelling """ return self.greyscale(color, *args) def spin(self, color, degree, *args): """ Spin color by degree. (Increase / decrease hue) args: color (str): color degree (str): percentage raises: ValueError returns: str """ if color and degree: if isinstance(degree, six.string_types): degree = float(degree.strip('%')) h, l, s = self._hextohls(color) h = ((h * 360.0) + degree) % 360.0 h = 360.0 + h if h < 0 else h rgb = colorsys.hls_to_rgb(h / 360.0, l, s) color = (utility.convergent_round(c * 255) for c in rgb) return self._rgbatohex(color) raise ValueError('Illegal color values') def mix(self, color1, color2, weight=50, *args): """This algorithm factors in both the user-provided weight and the difference between the alpha values of the two colors to decide how to perform the weighted average of the two RGB values. It works by first normalizing both parameters to be within [-1, 1], where 1 indicates "only use color1", -1 indicates "only use color 0", and all values in between indicated a proportionately weighted average. Once we have the normalized variables w and a, we apply the formula (w + a)/(1 + w*a) to get the combined weight (in [-1, 1]) of color1. This formula has two especially nice properties: * When either w or a are -1 or 1, the combined weight is also that number (cases where w * a == -1 are undefined, and handled as a special case). * When a is 0, the combined weight is w, and vice versa Finally, the weight of color1 is renormalized to be within [0, 1] and the weight of color2 is given by 1 minus the weight of color1. Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein http://sass-lang.com args: color1 (str): first color color2 (str): second color weight (int/str): weight raises: ValueError returns: str """ if color1 and color2: if isinstance(weight, six.string_types): weight = float(weight.strip('%')) weight = ((weight / 100.0) * 2) - 1 rgb1 = self._hextorgb(color1) rgb2 = self._hextorgb(color2) alpha = 0 w1 = (((weight if weight * alpha == -1 else weight + alpha) / (1 + weight * alpha)) + 1) w1 = w1 / 2.0 w2 = 1 - w1 rgb = [ rgb1[0] * w1 + rgb2[0] * w2, rgb1[1] * w1 + rgb2[1] * w2, rgb1[2] * w1 + rgb2[2] * w2, ] return self._rgbatohex(rgb) raise ValueError('Illegal color values') def fmt(self, color): """ Format CSS Hex color code. uppercase becomes lowercase, 3 digit codes expand to 6 digit. args: color (str): color raises: ValueError returns: str """ if utility.is_color(color): color = color.lower().strip('#') if len(color) in [3, 4]: color = ''.join([c * 2 for c in color]) return '#%s' % color raise ValueError('Cannot format non-color') def _rgbatohex_raw(self, rgba): values = ["%x" % int(v) for v in [0xff if h > 0xff else 0 if h < 0 else h for h in rgba]] return values def _rgbatohex(self, rgba): return '#%s' % ''.join(["%02x" % int(v) for v in [0xff if h > 0xff else 0 if h < 0 else h for h in rgba] ]) def _hextorgb(self, hex): if hex.lower() in colors.lessColors: hex = colors.lessColors[hex.lower()] hex = hex.strip() if hex[0] == '#': hex = hex.strip('#').strip(';') if len(hex) == 3: hex = [c * 2 for c in hex] else: hex = [hex[i:i + 2] for i in range(0, len(hex), 2)] return tuple(int(c, 16) for c in hex) try: return [int(hex, 16)] * 3 except: return [float(hex)] * 3 def _hextohls(self, hex): rgb = self._hextorgb(hex) return colorsys.rgb_to_hls(*[c / 255.0 for c in rgb]) def _ophsl(self, color, diff, idx, operation): if isinstance(diff, six.string_types): diff = float(diff.strip('%')) hls = list(self._hextohls(color)) hls[idx] = self._clamp(operation(hls[idx], diff / 100.0)) rgb = colorsys.hls_to_rgb(*hls) color = (utility.away_from_zero_round(c * 255) for c in rgb) return self._rgbatohex(color) lesscpy-0.13.0/lesscpy/lessc/__init__.py0000644000175000017500000000014213115557313017246 0ustar totoltotol""" Main lesscss parse library. Contains lexer and parser, along with utility classes """ lesscpy-0.13.0/lesscpy/lessc/parser.py0000644000175000017500000007774013115557313017025 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.lessc.parser :synopsis: Lesscss parser. http://www.dabeaz.com/ply/ply.html http://www.w3.org/TR/CSS21/grammar.html#scanner http://lesscss.org/#docs Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from __future__ import print_function import os import tempfile import sys import ply.yacc import six from . import lexer from . import utility from .scope import Scope from .color import Color from lesscpy.exceptions import CompilationError from lesscpy.plib import Block, Call, Deferred, Expression, Identifier, Mixin, NegatedExpression, Property, Statement, Variable, Import, KeyframeSelector class ErrorRegister(object): """ Raises CompilationError when an error occurs. """ def __init__(self): self.errors = [] def register(self, error): self.errors.append(error) # we could store them or just raise here. def __close__(self): if self.errors: raise CompilationError("\n".join(self.errors)) close = __close__ class PrintErrorRegister(object): """ Colored error output to stderr. """ def __init__(self): self.has_errored = False def register(self, error): self.has_errored = True color = '\x1b[31m' if error[0] == 'E' else '\x1b[33m' print("%s%s\x1b[0m" % (color, error), end='\x1b[0m', file=sys.stderr) def __close__(self): pass close = __close__ class LessParser(object): precedence = ( ('left', '+', '-'), ('left', '*', '/'), ) def __init__(self, lex_optimize=True, yacc_optimize=True, tabfile='yacctab', yacc_debug=False, scope=None, outputdir=tempfile.gettempdir(), importlvl=0, verbose=False, fail_with_exc=False ): """ Parser object Kwargs: lex_optimize (bool): Optimize lexer yacc_optimize (bool): Optimize parser tabfile (str): Yacc tab filename yacc_debug (bool): yacc debug mode scope (Scope): Inherited scope outputdir (str): Output (debugging) importlvl (int): Import depth verbose (bool): Verbose mode fail_with_exc (bool): Throw exception on syntax error instead of printing to stderr """ self.verbose = verbose self.importlvl = importlvl self.lex = lexer.LessLexer() if not tabfile: tabfile = 'yacctab' self.ignored = ('css_comment', 'less_comment', 'css_vendor_hack') self.tokens = [t for t in self.lex.tokens if t not in self.ignored] self.parser = ply.yacc.yacc( module=self, start='tunit', debug=yacc_debug, optimize=yacc_optimize, tabmodule=tabfile, outputdir=outputdir ) self.scope = scope if scope else Scope() self.stash = {} self.result = None self.target = None self.fail_with_exc = fail_with_exc if fail_with_exc: self.register = ErrorRegister() else: self.register = PrintErrorRegister() def parse(self, filename=None, file=None, debuglevel=0): """ Parse file. kwargs: filename (str): File to parse debuglevel (int): Parser debuglevel """ self.scope.push() if not file: # We use a path. file = filename else: # We use a stream and try to extract the name from the stream. if hasattr(file, 'name'): if filename is not None: raise AssertionError( 'names of file and filename are in conflict') filename = file.name else: filename = '(stream)' self.target = filename if self.verbose and not self.fail_with_exc: print('Compiling target: %s' % filename, file=sys.stderr) self.result = self.parser.parse( file, lexer=self.lex, debug=debuglevel) self.post_parse() self.register.close() def post_parse(self): """ Post parse cycle. nodejs version allows calls to mixins not yet defined or known to the parser. We defer all calls to mixins until after first cycle when all names are known. """ if self.result: out = [] for pu in self.result: try: out.append(pu.parse(self.scope)) except SyntaxError as e: self.handle_error(e, 0) self.result = list(utility.flatten(out)) def scopemap(self): """ Output scopemap. """ utility.debug_print(self.result) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_tunit(self, p): """ tunit : unit_list """ p[0] = [u for u in p[1] if u] def p_unit_list(self, p): """ unit_list : unit_list unit | unit """ if isinstance(p[1], list): if len(p) >= 3: if isinstance(p[2], list): p[1].extend(p[2]) else: p[1].append(p[2]) else: p[1] = [p[1]] p[0] = p[1] def p_unit(self, p): """ unit : statement | variable_decl | block_decl | mixin_decl | call_mixin | import_statement """ p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_statement_aux(self, p): """ statement : css_charset t_ws css_string t_semicolon | css_namespace t_ws css_string t_semicolon """ p[0] = Statement(list(p)[1:], p.lineno(1)) p[0].parse(None) def p_statement_namespace(self, p): """ statement : css_namespace t_ws word css_string t_semicolon """ p[0] = Statement(list(p)[1:], p.lineno(1)) p[0].parse(None) def p_statement_import(self, p): """ import_statement : css_import t_ws string t_semicolon | css_import t_ws css_string t_semicolon | css_import t_ws css_string media_query_list t_semicolon | css_import t_ws fcall t_semicolon | css_import t_ws fcall media_query_list t_semicolon """ #import pdb; pdb.set_trace() if self.importlvl > 8: raise ImportError( 'Recrusive import level too deep > 8 (circular import ?)') if isinstance(p[3], six.string_types): ipath = utility.destring(p[3]) elif isinstance(p[3], list): p[3] = Import(p[3], p.lineno(4)).parse(self.scope) ipath = utility.destring(p[3]) elif isinstance(p[3], Call): # NOTE(saschpe): Always in the form of 'url("...");', so parse it # and retrieve the inner css_string. This whole func is messy. p[3] = p[3].parse(self.scope) # Store it as string, Statement.fmt expects it. ipath = utility.destring(p[3][4:-1]) fn, fe = os.path.splitext(ipath) if not fe or fe.lower() == '.less': try: cpath = os.path.dirname(os.path.abspath(self.target)) if not fe: ipath += '.less' filename = "%s%s%s" % (cpath, os.sep, ipath) if os.path.exists(filename): recurse = LessParser(importlvl=self.importlvl + 1, verbose=self.verbose, scope=self.scope) recurse.parse(filename=filename, debuglevel=0) p[0] = recurse.result else: err = "Cannot import '%s', file not found" % filename self.handle_error(err, p.lineno(1), 'W') p[0] = None except ImportError as e: self.handle_error(e, p) else: p[0] = Statement(list(p)[1:], p.lineno(1)) p[0].parse(None) sys.stdout.flush() # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_block(self, p): """ block_decl : block_open declaration_list brace_close """ p[0] = Block(list(p)[1:-1], p.lineno(3)) self.scope.pop() self.scope.add_block(p[0]) def p_block_replace(self, p): """ block_decl : identifier t_semicolon """ m = p[1].parse(None) block = self.scope.blocks(m.raw()) if block: p[0] = block.copy_inner(self.scope) else: # fallback to mixin. Allow calls to mixins without parens p[0] = Deferred(p[1], None, p.lineno(2)) def p_block_open(self, p): """ block_open : identifier brace_open """ try: p[1].parse(self.scope) except SyntaxError: pass p[0] = p[1] self.scope.current = p[1] def p_block_open_media_query(self, p): """ block_open : media_query_decl brace_open """ p[0] = Identifier(p[1]).parse(self.scope) def p_font_face_open(self, p): """ block_open : css_font_face t_ws brace_open """ p[0] = Identifier([p[1], p[2]]).parse(self.scope) def p_keyframe_open(self, p): """block_open : css_keyframe_selector brace_open | number brace_open """ p[0] = KeyframeSelector([p[1]]).parse(self.scope) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_mixin(self, p): """ mixin_decl : open_mixin declaration_list brace_close """ self.scope.add_mixin(Mixin(list(p)[1:], p.lineno(3)).parse(self.scope)) self.scope.pop() p[0] = None def p_open_mixin(self, p): """ open_mixin : identifier t_popen mixin_args_list t_pclose brace_open | identifier t_popen mixin_args_list t_pclose mixin_guard brace_open """ p[1].parse(self.scope) self.scope.current = p[1] p[0] = [p[1], p[3]] if len(p) > 6: p[0].append(p[5]) else: p[0].append(None) def p_mixin_guard(self, p): """ mixin_guard : less_when mixin_guard_cond_list """ p[0] = p[2] def p_mixin_guard_cond_list_aux(self, p): """ mixin_guard_cond_list : mixin_guard_cond_list t_comma mixin_guard_cond | mixin_guard_cond_list less_and mixin_guard_cond """ p[1].append(p[2]) p[1].append(p[3]) p[0] = p[1] def p_mixin_guard_cond_list(self, p): """ mixin_guard_cond_list : mixin_guard_cond """ p[0] = [p[1]] def p_mixin_guard_cond_rev(self, p): """ mixin_guard_cond : less_not t_popen argument mixin_guard_cmp argument t_pclose | less_not t_popen argument t_pclose """ p[0] = utility.reverse_guard(list(p)[3:-1]) def p_mixin_guard_cond(self, p): """ mixin_guard_cond : t_popen argument mixin_guard_cmp argument t_pclose | t_popen argument t_pclose """ p[0] = list(p)[2:-1] def p_mixin_guard_cmp(self, p): """ mixin_guard_cmp : '>' | '<' | '=' | '>' '=' | '=' '<' """ p[0] = ''.join(list(p)[1:]) def p_call_mixin(self, p): """ call_mixin : identifier t_popen mixin_args_list t_pclose t_semicolon """ p[1].parse(None) p[0] = Deferred(p[1], p[3], p.lineno(4)) def p_mixin_args_arguments(self, p): """ mixin_args_list : less_arguments """ p[0] = [p[1]] def p_mixin_args_list_aux(self, p): """ mixin_args_list : mixin_args_list t_comma mixin_args | mixin_args_list t_semicolon mixin_args """ p[1].extend([p[3]]) p[0] = p[1] def p_mixin_args_list(self, p): """ mixin_args_list : mixin_args """ p[0] = [p[1]] def p_mixin_args_aux(self, p): """ mixin_args : mixin_args argument """ p[1].extend(list(p)[2:]) p[0] = p[1] def p_mixin_args(self, p): """ mixin_args : argument | mixin_kwarg """ p[0] = [p[1]] def p_mixin_args_empty(self, p): """ mixin_args : empty """ p[0] = None def p_mixin_kwarg(self, p): """ mixin_kwarg : variable t_colon mixin_kwarg_arg_list """ p[0] = Variable(list(p)[1:], p.lineno(2)) def p_margument_list_aux(self, p): """ mixin_kwarg_arg_list : mixin_kwarg_arg_list argument """ p[1].extend(list(p)[2:]) p[0] = p[1] def p_margument_list(self, p): """ mixin_kwarg_arg_list : argument """ p[0] = [p[1]] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_declaration_list(self, p): """ declaration_list : declaration_list declaration | declaration | empty """ if len(p) > 2: p[1].extend(p[2]) p[0] = p[1] def p_declaration(self, p): """ declaration : variable_decl | property_decl | block_decl | mixin_decl | call_mixin | import_statement """ p[0] = p[1] if isinstance(p[1], list) else [p[1]] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_variable_decl(self, p): """ variable_decl : variable t_colon style_list t_semicolon """ p[0] = Variable(list(p)[1:-1], p.lineno(4)) p[0].parse(self.scope) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_property_decl(self, p): """ property_decl : prop_open style_list t_semicolon | prop_open style_list css_important t_semicolon | prop_open empty t_semicolon """ l = len(p) p[0] = Property(list(p)[1:-1], p.lineno(l - 1)) def p_property_decl_arguments(self, p): """ property_decl : prop_open less_arguments t_semicolon """ p[0] = Property([p[1], [p[2]]], p.lineno(3)) def p_prop_open_ie_hack(self, p): """ prop_open : '*' prop_open """ p[0] = (p[1][0], p[2][0]) def p_prop_open(self, p): """ prop_open : property t_colon | vendor_property t_colon | word t_colon """ p[0] = (p[1][0], '') # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_style_list_aux(self, p): """ style_list : style_list style | style_list t_comma style | style_list t_ws style """ p[1].extend(list(p)[2:]) p[0] = p[1] def p_style_list(self, p): """ style_list : style """ p[0] = [p[1]] def p_style(self, p): """ style : expression | string | word | property | vendor_property | estring """ p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_identifier(self, p): """ identifier : identifier_list | page | page filter """ p[0] = Identifier(p[1], 0) def p_identifier_istr(self, p): """ identifier : t_popen estring t_pclose """ p[0] = Identifier(Call([p[2], p[3]]), 0) def p_identifier_list_aux(self, p): """ identifier_list : identifier_list t_comma identifier_group """ p[1].extend([p[2]]) p[1].extend(p[3]) p[0] = p[1] def p_identifier_list(self, p): """ identifier_list : identifier_group """ p[0] = p[1] def p_identifier_list_keyframe(self, p): """ identifier_list : css_keyframes t_ws css_ident | css_keyframes t_ws css_ident t_ws """ p[0] = list(p)[1:] def p_identifier_list_viewport(self, p): """ identifier_list : css_viewport | css_viewport t_ws """ p[0] = list(p)[1:] def p_identifier_group_op(self, p): """ identifier_group : identifier_group child_selector ident_parts | identifier_group '+' ident_parts | identifier_group general_sibling_selector ident_parts | identifier_group '*' """ p[1].extend([p[2]]) if len(p) > 3: p[1].extend(p[3]) p[0] = p[1] def p_identifier_group(self, p): """ identifier_group : ident_parts """ p[0] = p[1] def p_ident_parts_aux(self, p): """ ident_parts : ident_parts ident_part | ident_parts filter_group """ if isinstance(p[2], list): p[1].extend(p[2]) else: p[1].append(p[2]) p[0] = p[1] def p_ident_parts(self, p): """ ident_parts : ident_part | selector | filter_group """ if not isinstance(p[1], list): p[1] = [p[1]] p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_media_query_decl(self, p): """ media_query_decl : css_media t_ws | css_media t_ws media_query_list """ p[0] = list(p)[1:] def p_media_query_list_aux(self, p): """ media_query_list : media_query_list t_comma media_query """ p[0] = list(p)[1:] def p_media_query_list(self, p): """ media_query_list : media_query """ p[0] = [p[1]] def p_media_query_a(self, p): """ media_query : media_type | media_type media_query_expression_list | not media_type | not media_type media_query_expression_list | only media_type | only media_type media_query_expression_list """ p[0] = list(p)[1:] def p_media_query_b(self, p): """ media_query : media_query_expression media_query_expression_list | media_query_expression """ p[0] = list(p)[1:] def p_media_query_expression_list_aux(self, p): """ media_query_expression_list : media_query_expression_list and media_query_expression | and media_query_expression """ p[0] = list(p)[1:] def p_media_query_expression(self, p): """ media_query_expression : t_popen css_media_feature t_pclose | t_popen css_media_feature t_colon media_query_value t_pclose """ p[0] = list(p)[1:] def p_media_query_value(self, p): """ media_query_value : number | variable | word | color | expression """ if utility.is_variable(p[1]): var = self.scope.variables(''.join(p[1])) if var: value = var.value[0] if hasattr(value, 'parse'): p[1] = value.parse(self.scope) else: p[1] = value if isinstance(p[1], Expression): p[0] = p[1].parse(self.scope) else: p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_selector(self, p): """ selector : '*' | '+' | child_selector | general_sibling_selector """ p[0] = p[1] def p_ident_part(self, p): """ ident_part : iclass | id | dom | combinator | color """ p[0] = p[1] def p_ident_part_aux(self, p): """ ident_part : combinator vendor_property """ p[0] = [p[1], p[2]] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_filter_group_aux(self, p): """ filter_group : filter_group filter """ p[1].extend(p[2]) p[0] = p[1] def p_filter_group(self, p): """ filter_group : filter """ p[0] = p[1] def p_filter(self, p): """ filter : css_filter | css_filter t_ws | t_colon word | t_colon vendor_property | t_colon vendor_property t_ws | t_colon css_property | t_colon css_property t_ws | t_colon css_filter | t_colon css_filter t_ws | t_colon t_colon word | t_colon t_colon vendor_property """ p[0] = list(p)[1:] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_ms_filter(self, p): """ ms_filter : css_ms_filter | css_ms_filter t_ws """ p[0] = tuple(list(p)[1:]) def p_fcall(self, p): """ fcall : word t_popen argument_list t_pclose | property t_popen argument_list t_pclose | vendor_property t_popen argument_list t_pclose | less_open_format argument_list t_pclose | ms_filter t_popen argument_list t_pclose """ p[0] = Call(list(p)[1:], 0) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_argument_list_empty(self, p): """ argument_list : empty """ p[0] = '' def p_argument_list_aux(self, p): """ argument_list : argument_list argument | argument_list t_comma argument """ p[1].extend(list(p)[2:]) p[0] = p[1] def p_argument_list(self, p): """ argument_list : argument """ p[0] = [p[1]] def p_argument(self, p): """ argument : expression | string | estring | word | id | css_uri | '=' | fcall """ p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_expression_aux(self, p): """ expression : expression '+' expression | expression '-' expression | expression '/' expression | expression '*' expression | word '/' expression """ p[0] = Expression(list(p)[1:], 0) def p_expression_p_neg(self, p): """ expression : '-' t_popen expression t_pclose """ p[0] = NegatedExpression([p[3]], 0) def p_expression_p(self, p): """ expression : t_popen expression t_pclose """ p[0] = p[2] def p_expression(self, p): """ expression : factor """ p[0] = p[1] def p_factor(self, p): """ factor : color | number | variable | css_dom | fcall """ p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_escaped_string(self, p): """ estring : t_eopen style_list t_eclose | t_eopen identifier_list t_eclose """ p[0] = p[2] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_string_part(self, p): """ string_part : variable | css_string """ p[0] = p[1] def p_string_part_list_aux(self, p): """ string_part_list : string_part_list string_part """ p[1].extend([p[2]]) p[0] = p[1] def p_string_part_list(self, p): """ string_part_list : string_part """ p[0] = [p[1]] def p_string_aux(self, p): """ string : t_isopen string_part_list t_isclose """ p[0] = ['"', p[2], '"'] def p_string(self, p): """ string : css_string """ p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_variable_neg(self, p): """ variable : '-' variable """ p[0] = ['-', p[2]] def p_variable_strange(self, p): """ variable : t_popen variable t_pclose """ p[0] = p[2] def p_variable(self, p): """ variable : less_variable | less_variable t_ws """ # p[0] = p[1] p[0] = tuple(list(p)[1:]) def p_color(self, p): """ color : css_color | css_color t_ws """ try: p[0] = Color().fmt(p[1]) if len(p) > 2: p[0] = [p[0], p[2]] except ValueError: self.handle_error( 'Illegal color value `%s`' % p[1], p.lineno(1), 'W') p[0] = p[1] def p_number(self, p): """ number : css_number | css_number t_ws """ p[0] = tuple(list(p)[1:]) def p_dom(self, p): """ dom : css_dom | css_dom t_ws """ p[0] = tuple(list(p)[1:]) def p_word(self, p): """ word : css_ident | css_ident t_ws """ p[0] = tuple(list(p)[1:]) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_class(self, p): """ class : css_class | css_class t_ws """ p[0] = tuple(list(p)[1:]) def p_interpolated_class_part(self, p): """ iclass_part : less_variable | less_variable t_ws | class """ p[0] = list(p)[1:] def p_interpolated_class_part_list_aux(self, p): """ iclass_part_list : iclass_part_list iclass_part """ p[1].extend([p[2]]) p[0] = p[1] def p_interpolated_class_part_list(self, p): """ iclass_part_list : iclass_part """ p[0] = [p[1]] def p_interpolated_class(self, p): """ iclass : iclass_part_list """ p[0] = p[1] # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_id(self, p): """ id : css_id | css_id t_ws """ p[0] = tuple(list(p)[1:]) def p_property(self, p): """ property : css_property | css_property t_ws """ p[0] = tuple(list(p)[1:]) def p_page(self, p): """ page : css_page | css_page t_ws """ p[0] = tuple(list(p)[1:]) def p_vendor_property(self, p): """ vendor_property : css_vendor_property | css_vendor_property t_ws """ p[0] = tuple(list(p)[1:]) def p_media_type(self, p): """ media_type : css_media_type | css_media_type t_ws """ p[0] = tuple(list(p)[1:]) def p_combinator(self, p): """ combinator : '&' t_ws | '&' """ p[0] = tuple(list(p)[1:]) def p_child_selector(self, p): """ child_selector : '>' t_ws | '>' """ p[0] = tuple(list(p)[1:]) def p_general_sibling_selector(self, p): """ general_sibling_selector : t_tilde t_ws | t_tilde """ p[0] = tuple(list(p)[1:]) def p_scope_open(self, p): """ brace_open : t_bopen """ self.scope.push() p[0] = p[1] def p_scope_close(self, p): """ brace_close : t_bclose """ p[0] = p[1] def p_and(self, p): """ and : t_and t_ws | t_and """ p[0] = tuple(list(p)[1:]) def p_not(self, p): """ not : t_not t_ws | t_not """ p[0] = tuple(list(p)[1:]) def p_only(self, p): """ only : t_only t_ws | t_only """ p[0] = tuple(list(p)[1:]) def p_empty(self, p): 'empty :' pass # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # def p_error(self, t): """ Internal error handler args: t (Lex token): Error token """ if t: error_msg = "E: %s line: %d, Syntax Error, token: `%s`, `%s`" % \ (self.target, t.lineno, t.type, t.value) self.register.register(error_msg) while True: t = self.lex.token() if not t or t.value == '}': if len(self.scope) > 1: self.scope.pop() break self.parser.restart() return t def handle_error(self, e, line, t='E'): """ Custom error handler args: e (Mixed): Exception or str line (int): line number t(str): Error type """ self.register.register("%s: line: %d: %s\n" % (t, line, e)) lesscpy-0.13.0/lesscpy/lessc/formatter.py0000644000175000017500000000210213115557313017510 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.lessc.formatter :synopsis: CSS Formatter class. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ class Formatter(object): def __init__(self, args): self.args = args def format(self, parse): """ """ if not parse.result: return '' eb = '\n' if self.args.xminify: eb = '' self.args.minify = True self.items = {} if self.args.minify: self.items.update({ 'nl': '', 'tab': '', 'ws': '', 'eb': eb }) else: tab = '\t' if self.args.tabs else ' ' * int(self.args.spaces) self.items.update({ 'nl': '\n', 'tab': tab, 'ws': ' ', 'eb': eb }) self.out = [u.fmt(self.items) for u in parse.result if u] return ''.join(self.out).strip() lesscpy-0.13.0/lesscpy/plib/0000755000175000017500000000000013236067221014753 5ustar totoltotollesscpy-0.13.0/lesscpy/plib/block.py0000644000175000017500000002036513115557313016427 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.block :synopsis: Block parse node. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from .node import Node from lesscpy.lessc import utility from lesscpy.plib.identifier import Identifier class Block(Node): """ Block node. Represents one parse-block. Can contain property nodes or other block nodes. identifier { propertys inner blocks } """ def parse(self, scope): """Parse block node. args: scope (Scope): Current scope raises: SyntaxError returns: self """ if not self.parsed: scope.push() self.name, inner = self.tokens scope.current = self.name scope.real.append(self.name) if not self.name.parsed: self.name.parse(scope) if not inner: inner = [] inner = list(utility.flatten([p.parse(scope) for p in inner if p])) self.parsed = [] self.inner = [] if not hasattr(self, "inner_media_queries"): self.inner_media_queries = [] for p in inner: if p is not None: if isinstance(p, Block): if (len(scope) == 2 and p.tokens[1] is not None): p_is_mediaquery = p.name.tokens[0] == '@media' # Inner block @media ... { ... } is a nested media # query. But double-nested media queries have to be # removed and marked as well. While parsing ".foo", # both nested "@media print" and double-nested # "@media all" will be handled as we have to # re-arrange the scope and block layout quite a bit: # # .foo { # @media print { # color: blue; # @media screen { font-size: 12em; } # } # } # # Expected result: # # @media print { # .foo { color: blue; } # } # @media print and screen { # .foo { font-size: 12 em; } # } append_list = [] reparse_p = False for child in p.tokens[1]: if isinstance(child, Block) and child.name.raw().startswith("@media"): # Remove child from the nested media query, it will be re-added to # the parent with 'merged' media query (see above example). p.tokens[1].remove(child) if p_is_mediaquery: # Media query inside a & block # Double-nested media query found. We remove it from 'p' and add # it to this block with a new 'name'. reparse_p = True part_a = p.name.tokens[2:][0][0][0] part_b = child.name.tokens[2:][0][0] new_ident_tokens = ['@media', ' ', [part_a, (' ', 'and', ' '), part_b]] # Parse child again with new @media $BLA {} part child.tokens[0] = Identifier(new_ident_tokens) child.parsed = None child = child.parse(scope) else: child.block_name = p.name append_list.append(child) if reparse_p: p.parsed = None p = p.parse(scope) if not p_is_mediaquery and not append_list: self.inner.append(p) else: append_list.insert(0, p) # This media query should occur before it's children for media_query in append_list: self.inner_media_queries.append(media_query) # NOTE(saschpe): The code is not recursive but we hope that people # wont use triple-nested media queries. else: self.inner.append(p) else: self.parsed.append(p) if self.inner_media_queries: # Nested media queries, we have to remove self from scope and # push all nested @media ... {} blocks. scope.remove_block(self, index=-2) for mb in self.inner_media_queries: # New inner block with current name and media block contents if hasattr(mb, 'block_name'): cb_name = mb.block_name else: cb_name = self.tokens[0] cb = Block([cb_name, mb.tokens[1]]).parse(scope) # Replace inner block contents with new block new_mb = Block([mb.tokens[0], [cb]]).parse(scope) self.inner.append(new_mb) scope.add_block(new_mb) scope.real.pop() scope.pop() return self def raw(self, clean=False): """Raw block name args: clean (bool): clean name returns: str """ try: return self.tokens[0].raw(clean) except (AttributeError, TypeError): pass def fmt(self, fills): """Format block (CSS) args: fills (dict): Fill elements returns: str (CSS) """ f = "%(identifier)s%(ws)s{%(nl)s%(proplist)s}%(eb)s" out = [] name = self.name.fmt(fills) if self.parsed and any(p for p in self.parsed if str(type(p)) != ""): fills.update({ 'identifier': name, 'proplist': ''.join([p.fmt(fills) for p in self.parsed if p]), }) out.append(f % fills) if hasattr(self, 'inner'): if self.name.subparse and len(self.inner) > 0: # @media inner = ''.join([p.fmt(fills) for p in self.inner]) inner = inner.replace(fills['nl'], fills['nl'] + fills['tab']).rstrip(fills['tab']) if not fills['nl']: inner = inner.strip() fills.update({ 'identifier': name, 'proplist': fills['tab'] + inner }) out.append(f % fills) else: out.append(''.join([p.fmt(fills) for p in self.inner])) return ''.join(out) def copy(self): """ Return a full copy of self returns: Block object """ name, inner = self.tokens if inner: inner = [u.copy() if u else u for u in inner] if name: name = name.copy() return Block([name, inner], 0) def copy_inner(self, scope): """Copy block contents (properties, inner blocks). Renames inner block from current scope. Used for mixins. args: scope (Scope): Current scope returns: list (block contents) """ if self.tokens[1]: tokens = [u.copy() if u else u for u in self.tokens[1]] out = [p for p in tokens if p] utility.rename(out, scope, Block) return out return None lesscpy-0.13.0/lesscpy/plib/negated_expression.py0000644000175000017500000000072213115557313021216 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.negated_expression :synopsis: Node for unary negated expressions. Copyright (c) See LICENSE for details. """ import six from .node import Node class NegatedExpression(Node): """Expressions preceded by unary negation.""" def parse(self, scope): val, = self.process(self.tokens, scope) if isinstance(val, six.string_types): return '-' + val return -val lesscpy-0.13.0/lesscpy/plib/import_.py0000644000175000017500000000146413115557313017005 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.property :synopsis: Import node. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from .node import Node class Import(Node): """Represents CSS property declaration. """ def parse(self, scope): """Parse node args: scope (Scope): current scope raises: SyntaxError returns: parsed """ if not self.parsed: self.parsed = ''.join(self.process(self.tokens, scope)) return self.parsed def fmt(self, fills): return '' def copy(self): """ Return a full copy of self Returns: Import object """ return Import([t for t in self.tokens], 0) lesscpy-0.13.0/lesscpy/plib/keyframe_selector.py0000644000175000017500000000223413221207445021027 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.keyframe_selector :synopsis: Keyframe selector node. Copyright (c) See LICENSE for details. """ from .node import Node class KeyframeSelector(Node): """Keyframe selector node. Represents the keyframe selector in an animation sequence. Keyframes can be identified by the keywords "from" or "to", or by percentage. http://www.w3.org/TR/css3-animations/#keyframes """ def parse(self, scope): """Parse node. args: scope (Scope): Current scope raises: SyntaxError returns: self """ self.keyframe, = [e[0] if isinstance(e, tuple) else e for e in self.tokens if str(e).strip()] self.subparse = False return self def copy(self): """ Return copy of self Returns: KeyframeSelector object """ return KeyframeSelector(self.tokens, 0) def fmt(self, fills): """Format identifier args: fills (dict): replacements returns: str (CSS) """ return self.keyframe lesscpy-0.13.0/lesscpy/plib/variable.py0000644000175000017500000000164113115557313017116 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.variable :synopsis: Variable declaration Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from .node import Node class Variable(Node): def parse(self, scope): """ Parse function args: scope (Scope): Scope object returns: self """ self.name, _, self.value = self.tokens if isinstance(self.name, tuple): if len(self.name) > 1: self.name, pad = self.name self.value.append(pad) else: self.name = self.name[0] scope.add_variable(self) return self def copy(self): """ Return a copy of self Returns: Variable object """ return Variable([t for t in self.tokens]) def fmt(self, fills): return '' lesscpy-0.13.0/lesscpy/plib/deferred.py0000644000175000017500000000757013115557313017120 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.deferred :synopsis: Deferred mixin call. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from .node import Node class Deferred(Node): def __init__(self, mixin, args, lineno=0): """This node represents mixin calls. The calls to these mixins are deferred until the second parse cycle. lessc.js allows calls to mixins not yet defined or known. args: mixin (Mixin): Mixin object args (list): Call arguments """ self.tokens = [mixin, args] self.lineno = lineno def parse(self, scope, error=False, depth=0): """ Parse function. We search for mixins first within current scope then fallback to global scope. The special scope.deferred is used when local scope mixins are called within parent mixins. If nothing is found we fallback to block-mixin as lessc.js allows calls to blocks and mixins to be inter-changable. clx: This method is a HACK that stems from poor design elsewhere. I will fix it when I have more time. args: scope (Scope): Current scope returns: mixed """ res = False ident, args = self.tokens ident.parse(scope) mixins = scope.mixins(ident.raw()) if not mixins: ident.parse(None) mixins = scope.mixins(ident.raw()) if depth > 64: raise SyntaxError('NameError `%s`' % ident.raw(True)) if not mixins: if scope.deferred: store = [t for t in scope.deferred.parsed[-1]] i = 0 while scope.deferred.parsed[-1]: scope.current = scope.deferred ident.parse(scope) mixins = scope.mixins(ident.raw()) scope.current = None if mixins or i > 64: break scope.deferred.parsed[-1].pop() i += 1 scope.deferred.parsed[-1] = store if not mixins: # Fallback to blocks block = scope.blocks(ident.raw()) if not block: ident.parse(None) block = scope.blocks(ident.raw()) if block: scope.current = scope.real[-1] if scope.real else None res = block.copy_inner(scope) scope.current = None if mixins: for mixin in mixins: scope.current = scope.real[-1] if scope.real else None res = mixin.call(scope, args) if res: # Add variables to scope to support # closures [scope.add_variable(v) for v in mixin.vars] scope.deferred = ident break if res: store = [t for t in scope.deferred.parsed[ -1]] if scope.deferred else False tmp_res = [] for p in res: if p: if isinstance(p, Deferred): tmp_res.append(p.parse(scope, depth=depth + 1)) else: tmp_res.append(p.parse(scope)) res = tmp_res #res = [p.parse(scope, depth=depth+1) for p in res if p] while(any(t for t in res if isinstance(t, Deferred))): res = [p.parse(scope) for p in res if p] if store: scope.deferred.parsed[-1] = store if error and not res: raise SyntaxError('NameError `%s`' % ident.raw(True)) return res def copy(self): """ Returns self (used when Block objects are copy'd) returns: self """ return self lesscpy-0.13.0/lesscpy/plib/call.py0000644000175000017500000001415213115557313016245 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.call :synopsis: Call parse node Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ import re import math try: from urllib.parse import quote as urlquote except ImportError: from urllib import quote as urlquote import six from .node import Node import lesscpy.lessc.utility as utility import lesscpy.lessc.color as Color from lesscpy.lib.colors import lessColors class Call(Node): """Call node. Node represents a function call. All builtin none-color functions are in this node. This node attempts calls on built-ins and lets non-builtins through. increment(3px) --> 4px unknown(3px) --> unknown(3px) """ def parse(self, scope): """Parse Node within scope. the functions ~( and e( map to self.escape and %( maps to self.sformat args: scope (Scope): Current scope """ name = ''.join(self.tokens[0]) parsed = self.process(self.tokens[1:], scope) if name == '%(': name = 'sformat' elif name in ('~', 'e'): name = 'escape' color = Color.Color() args = [t for t in parsed if not isinstance(t, six.string_types) or t not in '(),'] if hasattr(self, name): try: return getattr(self, name)(*args) except ValueError: pass if hasattr(color, name): try: result = getattr(color, name)(*args) try: return result + ' ' except TypeError: return result except ValueError: pass return name + ''.join([p for p in parsed]) def escape(self, string, *args): """Less Escape. args: string (str): string to escape returns: str """ return utility.destring(string.strip('~')) def sformat(self, string, *args): """ String format. args: string (str): string to format args (list): format options returns: str """ format = string items = [] m = re.findall('(%[asdA])', format) if m and not args: raise SyntaxError('Not enough arguments...') i = 0 for n in m: v = { '%A': urlquote, '%s': utility.destring, }.get(n, str)(args[i]) items.append(v) i += 1 format = format.replace('%A', '%s') format = format.replace('%d', '%s') return format % tuple(items) def isnumber(self, string, *args): """Is number args: string (str): match returns: bool """ try: n, u = utility.analyze_number(string) except SyntaxError: return False return True def iscolor(self, string, *args): """Is color args: string (str): match returns: bool """ return (string in lessColors) def isurl(self, string, *args): """Is url args: string (str): match returns: bool """ arg = utility.destring(string) regex = re.compile(r'^(?:http|ftp)s?://' # http:// or https:// r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+' r'(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... # localhost... r'localhost|' r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip # optional port r'(?::\d+)?' r'(?:/?|[/?]\S+)$', re.IGNORECASE) return regex.match(arg) def isstring(self, string, *args): """Is string args: string (str): match returns: bool """ regex = re.compile(r'\'[^\']*\'|"[^"]*"') return regex.match(string) def iskeyword(self, string, *args): """Is less keyword args: string (str): match returns: bool """ return (string in ('when', 'and', 'not')) def increment(self, value, *args): """ Increment function args: value (str): target returns: str """ n, u = utility.analyze_number(value) return utility.with_unit(n + 1, u) def decrement(self, value, *args): """ Decrement function args: value (str): target returns: str """ n, u = utility.analyze_number(value) return utility.with_unit(n - 1, u) def add(self, *args): """ Add integers args: args (list): target returns: str """ if(len(args) <= 1): return 0 return sum([int(v) for v in args]) def round(self, value, *args): """ Round number args: value (str): target returns: str """ n, u = utility.analyze_number(value) return utility.with_unit(int(utility.away_from_zero_round(float(n))), u) def ceil(self, value, *args): """ Ceil number args: value (str): target returns: str """ n, u = utility.analyze_number(value) return utility.with_unit(int(math.ceil(n)), u) def floor(self, value, *args): """ Floor number args: value (str): target returns: str """ n, u = utility.analyze_number(value) return utility.with_unit(int(math.floor(n)), u) def percentage(self, value, *args): """ Return percentage value args: value (str): target returns: str """ n, u = utility.analyze_number(value) n = int(n * 100.0) u = '%' return utility.with_unit(n, u) lesscpy-0.13.0/lesscpy/plib/expression.py0000644000175000017500000000673613115557313017542 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.expression :synopsis: Expression node. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ import operator from .node import Node from lesscpy.lessc import utility from lesscpy.lessc import color class Expression(Node): """Expression node. Parses all expression except color expressions (handled in the color class) and unary negation (handled in the NegatedExpression class). """ def parse(self, scope): """ Parse Node args: scope (Scope): Scope object raises: SyntaxError returns: str """ assert(len(self.tokens) == 3) expr = self.process(self.tokens, scope) A, O, B = [e[0] if isinstance(e, tuple) else e for e in expr if str(e).strip()] try: a, ua = utility.analyze_number(A, 'Illegal element in expression') b, ub = utility.analyze_number(B, 'Illegal element in expression') except SyntaxError: return ' '.join([str(A), str(O), str(B)]) if(a is False or b is False): return ' '.join([str(A), str(O), str(B)]) if ua == 'color' or ub == 'color': return color.Color().process((A, O, B)) if a == 0 and O == '/': # NOTE(saschpe): The ugliest but valid CSS since sliced bread: 'font: 0/1 a;' return ''.join([str(A), str(O), str(B), ' ']) out = self.operate(a, b, O) if isinstance(out, bool): return out return self.with_units(out, ua, ub) def with_units(self, val, ua, ub): """Return value with unit. args: val (mixed): result ua (str): 1st unit ub (str): 2nd unit raises: SyntaxError returns: str """ if not val: return str(val) if ua or ub: if ua and ub: if ua == ub: return str(val) + ua else: # Nodejs version does not seem to mind mismatched # units within expressions. So we choose the first # as they do # raise SyntaxError("Error in expression %s != %s" % (ua, ub)) return str(val) + ua elif ua: return str(val) + ua elif ub: return str(val) + ub return repr(val) def operate(self, vala, valb, oper): """Perform operation args: vala (mixed): 1st value valb (mixed): 2nd value oper (str): operation returns: mixed """ operation = { '+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv, '=': operator.eq, '>': operator.gt, '<': operator.lt, '>=': operator.ge, '=<': operator.le, }.get(oper) if operation is None: raise SyntaxError("Unknown operation %s" % oper) ret = operation(vala, valb) if oper in '+-*/' and int(ret) == ret: ret = int(ret) return ret def expression(self): """Return str representation of expression returns: str """ return utility.flatten(self.tokens) lesscpy-0.13.0/lesscpy/plib/node.py0000644000175000017500000000437613115557313016266 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.node :synopsis: Base Node Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from lesscpy.lessc import utility class Node(object): def __init__(self, tokens, lineno=0): """ Base Node args: tokens (list): tokenlist lineno (int): Line number of node """ self.tokens = tokens self.lineno = lineno self.parsed = False def parse(self, scope): """ Base parse function args: scope (Scope): Current scope returns: self """ return self def process(self, tokens, scope): """ Process tokenslist, flattening and parsing it args: tokens (list): tokenlist scope (Scope): Current scope returns: list """ while True: tokens = list(utility.flatten(tokens)) done = True if any(t for t in tokens if hasattr(t, 'parse')): tokens = [t.parse(scope) if hasattr(t, 'parse') else t for t in tokens] done = False if any(t for t in tokens if (utility.is_variable(t)) or str(type(t)) == ""): tokens = self.replace_variables(tokens, scope) done = False if done: break return tokens def replace_variables(self, tokens, scope): """ Replace variables in tokenlist args: tokens (list): tokenlist scope (Scope): Current scope returns: list """ list = [] for t in tokens: if utility.is_variable(t): list.append(scope.swap(t)) elif str(type(t)) == "": list.append(scope.swap(t.name)) else: list.append(t) return list def fmt(self, fills): """ Format node args: fills (dict): replacements returns: str """ raise ValueError('No defined format') lesscpy-0.13.0/lesscpy/plib/__init__.py0000644000175000017500000000151113115557313017064 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib :synopsis: Parse Nodes for Lesscpy Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ __all__ = [ 'Block', 'Call', 'Deferred', 'Expression', 'Identifier', 'KeyframeSelector', 'Mixin', 'NegatedExpression', 'Node', 'Property', 'Statement', 'Variable' 'Import', ] from .block import Block from .call import Call from .deferred import Deferred from .expression import Expression from .identifier import Identifier from .keyframe_selector import KeyframeSelector from .mixin import Mixin from .negated_expression import NegatedExpression from .node import Node from .property import Property from .statement import Statement from .variable import Variable from .import_ import Import lesscpy-0.13.0/lesscpy/plib/statement.py0000644000175000017500000000170413115557313017335 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.statement :synopsis: Statement node. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ from .node import Node from lesscpy.lessc import utility class Statement(Node): """Represents CSS statement (@import, @charset...) """ def parse(self, scope): """Parse node args: scope (Scope): current scope raises: SyntaxError returns: self """ self.parsed = list(utility.flatten(self.tokens)) if self.parsed[0] == '@import': if len(self.parsed) > 4: # Media @import self.parsed.insert(3, ' ') return self def fmt(self, fills): """ Format node args: fills (dict): replacements returns: str """ return ''.join(self.parsed) + fills['eb'] lesscpy-0.13.0/lesscpy/plib/mixin.py0000644000175000017500000001175413115557313016463 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.mixin :synopsis: Mixin node. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ import sys import copy import itertools from .node import Node from .block import Block from .expression import Expression from .variable import Variable from lesscpy.lessc import utility class Mixin(Node): """ Mixin Node. Represents callable mixin types. """ def parse(self, scope): """Parse node args: scope (Scope): current scope raises: SyntaxError returns: self """ self.name, args, self.guards = self.tokens[0] self.args = [a for a in utility.flatten(args) if a] self.body = Block([None, self.tokens[1]], 0) self.vars = list(utility.flatten([list(v.values()) for v in [s['__variables__'] for s in scope]])) return self def raw(self): """Raw mixin name returns: str """ return self.name.raw() def parse_args(self, args, scope): """Parse arguments to mixin. Add them to scope as variables. Sets upp special variable @arguments as well. args: args (list): arguments scope (Scope): current scope raises: SyntaxError """ arguments = list(zip(args, [' '] * len(args))) if args and args[0] else None zl = itertools.zip_longest if sys.version_info[ 0] == 3 else itertools.izip_longest if self.args: parsed = [v if hasattr(v, 'parse') else v for v in copy.copy(self.args)] args = args if isinstance(args, list) else [args] vars = [self._parse_arg(var, arg, scope) for arg, var in zl([a for a in args], parsed)] for var in vars: if var: var.parse(scope) if not arguments: arguments = [v.value for v in vars if v] if not arguments: arguments = '' Variable(['@arguments', None, arguments]).parse(scope) def _parse_arg(self, var, arg, scope): """ Parse a single argument to mixin. args: var (Variable object): variable arg (mixed): argument scope (Scope object): current scope returns: Variable object or None """ if isinstance(var, Variable): # kwarg if arg: if utility.is_variable(arg[0]): tmp = scope.variables(arg[0]) if not tmp: return None val = tmp.value else: val = arg var = Variable(var.tokens[:-1] + [val]) else: # arg if utility.is_variable(var): if arg is None: raise SyntaxError('Missing argument to mixin') elif utility.is_variable(arg[0]): tmp = scope.variables(arg[0]) if not tmp: return None val = tmp.value else: val = arg var = Variable([var, None, val]) else: return None return var def parse_guards(self, scope): """Parse guards on mixin. args: scope (Scope): current scope raises: SyntaxError returns: bool (passes guards) """ if self.guards: cor = True if ',' in self.guards else False for g in self.guards: if isinstance(g, list): res = (g[0].parse(scope) if len(g) == 1 else Expression(g).parse(scope)) if cor: if res: return True elif not res: return False return True def call(self, scope, args=[]): """Call mixin. Parses a copy of the mixins body in the current scope and returns it. args: scope (Scope): current scope args (list): arguments raises: SyntaxError returns: list or False """ ret = False if args: args = [[a.parse(scope) if isinstance(a, Expression) else a for a in arg] if arg else arg for arg in args] try: self.parse_args(args, scope) except SyntaxError: pass else: if self.parse_guards(scope): body = self.body.copy() ret = body.tokens[1] if ret: utility.rename(ret, scope, Block) return ret lesscpy-0.13.0/lesscpy/plib/property.py0000644000175000017500000000514513115557313017220 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.property :synopsis: Property node. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ import re from .node import Node class Property(Node): """Represents CSS property declaration. """ def parse(self, scope): """Parse node args: scope (Scope): current scope raises: SyntaxError returns: self """ if not self.parsed: if len(self.tokens) > 2: property, style, _ = self.tokens self.important = True else: property, style = self.tokens self.important = False self.property = ''.join(property) self.parsed = [] if style: style = self.preprocess(style) self.parsed = self.process(style, scope) return self def preprocess(self, style): """Hackish preprocessing from font shorthand tags. Skips expression parse on certain tags. args: style (list): . returns: list """ if self.property == 'font': style = [''.join(u.expression()) if hasattr(u, 'expression') else u for u in style] else: style = [(u, ' ') if hasattr(u, 'expression') else u for u in style] return style def fmt(self, fills): """ Format node args: fills (dict): replacements returns: str """ f = "%(tab)s%(property)s:%(ws)s%(style)s%(important)s;%(nl)s" imp = ' !important' if self.important else '' if fills['nl']: self.parsed = [',%s' % fills['ws'] if p == ',' else p for p in self.parsed] style = ''.join([p.fmt(fills) if hasattr(p, 'fmt') else str(p) for p in self.parsed]) # IE cannot handle no space after url() style = re.sub("(url\([^\)]*\))([^\s,])", "\\1 \\2", style) fills.update({ 'property': self.property, 'style': style.strip(), 'important': imp }) return f % fills def copy(self): """ Return a full copy of self Returns: Property object """ return Property([t for t in self.tokens], 0) lesscpy-0.13.0/lesscpy/plib/identifier.py0000644000175000017500000001441613115557313017457 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.plib.identifier :synopsis: Identifier node. Copyright (c) See LICENSE for details. .. moduleauthor:: Johann T. Mariusson """ import re from .node import Node from lesscpy.lessc import utility from lesscpy.lib import reserved class Identifier(Node): """Identifier node. Represents block identifier. """ def parse(self, scope): """Parse node. Block identifiers are stored as strings with spaces replaced with ? args: scope (Scope): Current scope raises: SyntaxError returns: self """ names = [] name = [] self._subp = ( '@media', '@keyframes', '@-moz-keyframes', '@-webkit-keyframes', '@-ms-keyframes' ) if self.tokens and hasattr(self.tokens, 'parse'): self.tokens = list(utility.flatten([id.split() + [','] for id in self.tokens.parse(scope).split(',')])) self.tokens.pop() if self.tokens and any(hasattr(t, 'parse') for t in self.tokens): tmp_tokens = [] for t in self.tokens: if hasattr(t, 'parse'): tmp_tokens.append(t.parse(scope)) else: tmp_tokens.append(t) self.tokens = list(utility.flatten(tmp_tokens)) if self.tokens and self.tokens[0] in self._subp: name = list(utility.flatten(self.tokens)) self.subparse = True else: self.subparse = False for n in utility.flatten(self.tokens): if n == '*': name.append('* ') elif n in '>+~': if name and name[-1] == ' ': name.pop() name.append('?%s?' % n) elif n == ',': names.append(name) name = [] else: name.append(n) names.append(name) parsed = self.root(scope, names) if scope else names # Interpolated selectors need another step, we have to replace variables. Avoid reserved words though # # Example: '.@{var}' results in [['.', '@{var}']] # But: '@media print' results in [['@media', ' ', 'print']] # def replace_variables(tokens, scope): return [scope.swap(t) if (utility.is_variable(t) and not t in reserved.tokens) else t for t in tokens] parsed = [list(utility.flatten(replace_variables(part, scope))) for part in parsed] self.parsed = [[i for i, j in utility.pairwise(part) if i != ' ' or (j and '?' not in j)] for part in parsed] return self def root(self, scope, names): """Find root of identifier, from scope args: scope (Scope): current scope names (list): identifier name list (, separated identifiers) returns: list """ parent = scope.scopename if parent: parent = parent[-1] if parent.parsed: parsed_names = [] for name in names: ampersand_count = name.count('&') if ampersand_count: filtered_parts = [] for part in parent.parsed: if part and part[0] not in self._subp: filtered_parts.append(part) permutations = list(utility.permutations_with_replacement(filtered_parts, ampersand_count)) for permutation in permutations: parsed = [] for name_part in name: if name_part == "&": parent_part = permutation.pop(0) if parsed and parsed[-1].endswith(']'): parsed.extend(' ') if parent_part[-1] == ' ': parent_part.pop() parsed.extend(parent_part) else: parsed.append(name_part) parsed_names.append(parsed) else: # NOTE(saschpe): Maybe this code can be expressed with permutations too? for part in parent.parsed: if part and part[0] not in self._subp: parsed = [] if name[0] == "@media": parsed.extend(name) else: parsed.extend(part) if part[-1] != ' ': parsed.append(' ') parsed.extend(name) parsed_names.append(parsed) else: parsed_names.append(name) return parsed_names return names def raw(self, clean=False): """Raw identifier. args: clean (bool): clean name returns: str """ if clean: return ''.join(''.join(p) for p in self.parsed).replace('?', ' ') return '%'.join('%'.join(p) for p in self.parsed).strip().strip('%') def copy(self): """ Return copy of self Returns: Identifier object """ tokens = ([t for t in self.tokens] if isinstance(self.tokens, list) else self.tokens) return Identifier(tokens, 0) def fmt(self, fills): """Format identifier args: fills (dict): replacements returns: str (CSS) """ name = ',$$'.join(''.join(p).strip() for p in self.parsed) name = re.sub('\?(.)\?', '%(ws)s\\1%(ws)s', name) % fills return name.replace('$$', fills['nl']).replace(' ', ' ') lesscpy-0.13.0/lesscpy/__init__.py0000644000175000017500000000103413236067103016133 0ustar totoltotol__version_info__ = ('0', '13', '0') __version__ = '.'.join(__version_info__) def compile(file, minify=False, xminify=False, tabs=False, spaces=True): from .lessc import parser from .lessc import formatter class Opt(object): def __init__(self): self.minify = minify self.xminify = xminify self.tabs = tabs self.spaces = spaces p = parser.LessParser(fail_with_exc=True) opt = Opt() p.parse(file=file) f = formatter.Formatter(opt) return f.format(p) lesscpy-0.13.0/lesscpy/scripts/0000755000175000017500000000000013236067221015514 5ustar totoltotollesscpy-0.13.0/lesscpy/scripts/compiler.py0000644000175000017500000002024113221207207017671 0ustar totoltotol# -*- coding: utf8 -*- """ .. module:: lesscpy.scripts.compiler CSS/LESSCSS run script http://lesscss.org/#docs Copyright (c) See LICENSE for details .. moduleauthor:: Johann T. Mariusson """ from __future__ import print_function import os import sys import glob import copy import argparse sys.path.append(os.path.abspath(os.path.dirname(__file__))) from lesscpy.lessc import parser from lesscpy.lessc import lexer from lesscpy.lessc import formatter VERSION_STR = 'Lesscpy compiler 0.9h' def ldirectory(inpath, outpath, args, scope): """Compile all *.less files in directory Args: inpath (str): Path to compile outpath (str): Output directory args (object): Argparse Object scope (Scope): Scope object or None """ yacctab = 'yacctab' if args.debug else None if not outpath: sys.exit("Compile directory option needs -o ...") else: if not os.path.isdir(outpath): if args.verbose: print("Creating '%s'" % outpath, file=sys.stderr) if not args.dry_run: os.mkdir(outpath) less = glob.glob(os.path.join(inpath, '*.less')) f = formatter.Formatter(args) for lf in less: outf = os.path.splitext(os.path.basename(lf)) minx = '.min' if args.min_ending else '' outf = "%s/%s%s.css" % (outpath, outf[0], minx) if not args.force and os.path.exists(outf): recompile = os.path.getmtime(outf) < os.path.getmtime(lf) else: recompile = True if recompile: print('%s -> %s' % (lf, outf)) p = parser.LessParser(yacc_debug=(args.debug), lex_optimize=True, yacc_optimize=(not args.debug), scope=scope, tabfile=yacctab, verbose=args.verbose) p.parse(filename=lf, debuglevel=0) css = f.format(p) if not args.dry_run: with open(outf, 'w') as outfile: outfile.write(css) elif args.verbose: print('skipping %s, not modified' % lf, file=sys.stderr) sys.stdout.flush() if args.recurse: [ldirectory(os.path.join(inpath, name), os.path.join(outpath, name), args, scope) for name in os.listdir(inpath) if os.path.isdir(os.path.join(inpath, name)) and not name.startswith('.') and not name == outpath] def run(): """Run compiler """ aparse = argparse.ArgumentParser(description='LessCss Compiler', epilog='<< jtm@robot.is @_o >>') aparse.add_argument('-v', '--version', action='version', version=VERSION_STR) aparse.add_argument('-I', '--include', action="store", type=str, help="Included less-files (comma separated)") aparse.add_argument('-V', '--verbose', action="store_true", default=False, help="Verbose mode") aparse.add_argument('-C', '--dont_create_dirs', action="store_true", default=False, help="Creates directories when outputing files (lessc non-compatible)") fgroup = aparse.add_argument_group('Formatting options') fgroup.add_argument('-x', '--minify', action="store_true", default=False, help="Minify output") fgroup.add_argument('-X', '--xminify', action="store_true", default=False, help="Minify output, no end of block newlines") fgroup.add_argument('-t', '--tabs', help="Use tabs", action="store_true") fgroup.add_argument( '-s', '--spaces', help="Number of startline spaces (default 2)", default=2) dgroup = aparse.add_argument_group('Directory options', 'Compiles all *.less files in directory that ' 'have a newer timestamp than it\'s css file.') dgroup.add_argument('-o', '--out', action="store", help="Output directory") dgroup.add_argument( '-r', '--recurse', action="store_true", help="Recursive into subdirectorys") dgroup.add_argument( '-f', '--force', action="store_true", help="Force recompile on all files") dgroup.add_argument('-m', '--min-ending', action="store_true", default=False, help="Add '.min' into output filename. eg, name.min.css") dgroup.add_argument('-D', '--dry-run', action="store_true", default=False, help="Dry run, do not write files") group = aparse.add_argument_group('Debugging') group.add_argument('-g', '--debug', action="store_true", default=False, help="Debugging information") group.add_argument('-S', '--scopemap', action="store_true", default=False, help="Scopemap") group.add_argument('-L', '--lex-only', action="store_true", default=False, help="Run lexer on target") group.add_argument('-N', '--no-css', action="store_true", default=False, help="No css output") aparse.add_argument('target', help="less file or directory") aparse.add_argument('output', nargs='?', help="output file path") args = aparse.parse_args() try: # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # if args.lex_only: lex = lexer.LessLexer() ll = lex.file(args.target) while True: tok = ll.token() if not tok: break if hasattr(tok, "lexer"): # literals don't have the lexer attribute print(tok, "State:", tok.lexer.lexstate) else: print(tok) print('EOF') sys.exit() # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # yacctab = 'yacctab' if args.debug else None scope = None if args.include: for u in args.include.split(','): if os.path.exists(u): p = parser.LessParser(yacc_debug=(args.debug), lex_optimize=True, yacc_optimize=(not args.debug), tabfile=yacctab, verbose=args.verbose) p.parse(filename=u, debuglevel=args.debug) if not scope: scope = p.scope else: scope.update(p.scope) else: sys.exit('included file `%s` not found ...' % u) sys.stdout.flush() p = None f = formatter.Formatter(args) if not os.path.exists(args.target): sys.exit("Target not found '%s' ..." % args.target) if os.path.isdir(args.target): ldirectory(args.target, args.out, args, scope) if args.dry_run: print('Dry run, nothing done.', file=sys.stderr) else: p = parser.LessParser(yacc_debug=(args.debug), lex_optimize=True, yacc_optimize=(not args.debug), scope=copy.deepcopy(scope), verbose=args.verbose) p.parse(filename=args.target, debuglevel=args.debug) if args.scopemap: args.no_css = True p.scopemap() if not args.no_css and p: out = f.format(p) if args.output: if not args.dont_create_dirs and not os.path.exists(os.path.dirname(args.output)): try: os.makedirs(os.path.dirname(args.output)) except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise with open(args.output, "w") as f: f.write(out) else: print(out) except (KeyboardInterrupt, SystemExit, IOError): sys.exit('\nAborting...') lesscpy-0.13.0/lesscpy/scripts/__init__.py0000644000175000017500000000000013115557313017615 0ustar totoltotollesscpy-0.13.0/lesscpy/__main__.py0000644000175000017500000000012013221205541016101 0ustar totoltotolfrom lesscpy.scripts.compiler import run if __name__ == '__main__': run() lesscpy-0.13.0/lesscpy/exceptions.py0000644000175000017500000000005613115557313016563 0ustar totoltotolclass CompilationError(SyntaxError): pass lesscpy-0.13.0/lesscpy/lib/0000755000175000017500000000000013236067221014573 5ustar totoltotollesscpy-0.13.0/lesscpy/lib/css.py0000644000175000017500000002012013115557313015732 0ustar totoltotol""" CSS syntax names. Copyright (c) See LICENSE for details. """ css2 = [ 'azimuth', 'background-attachment', 'background-color', 'background-image', 'background-position', 'background-repeat', 'background', 'border-collapse', 'border-color', 'border-spacing', 'border-style', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color', 'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style', 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width', 'border-width', 'border', 'bottom', 'caption-side', 'clear', 'clip', 'color', 'content', 'counter-increment', 'counter-reset', 'cue-after', 'cue-before', 'cue', 'cursor', 'direction', 'display', 'elevation', 'empty-cells', 'float', 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight', 'font', 'height', 'left', 'letter-spacing', 'line-height', 'list-style-image', 'list-style-position', 'list-style-type', 'list-style', 'margin-right', 'margin-left', 'margin-top', 'margin-bottom', 'margin', 'max-height', 'max-width', 'min-height', 'min-width', 'orphans', 'outline-color', 'outline-style', 'outline-width', 'outline', 'overflow', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 'padding', 'page-break-after', 'page-break-before', 'page-break-inside', 'pause-after', 'pause-before', 'pause', 'pitch-range', 'pitch', 'play-during', 'position', 'quotes', 'richness', 'right', 'speak-header', 'speak-numeral', 'speak-punctuation', 'speak', 'speech-rate', 'stress', 'table-layout', 'text-align', 'text-decoration', 'text-indent', 'text-transform', 'top', 'unicode-bidi', 'vertical-align', 'visibility', 'voice-family', 'volume', 'white-space', 'widows', 'width', 'word-spacing', 'z-index', ] css3 = [ 'alignment-adjust', 'alignment-baseline', 'animation', 'animation-delay', 'animation-direction', 'animation-duration', 'animation-iteration-count', 'animation-name', 'animation-play-state', 'animation-timing-function', 'appearance', 'backface-visibility', 'background-clip', 'background-origin', 'background-size', 'baseline-shift', 'bookmark-label', 'bookmark-level', 'bookmark-target', 'border-bottom-left-radius', 'border-bottom-right-radius', 'border-image', 'border-image-outset', 'border-image-repeat', 'border-image-slice', 'border-image-source', 'border-image-width', 'border-radius', 'border-top-left-radius', 'border-top-right-radius', 'box-align', 'box-decoration-break', 'box-direction', 'box-flex', 'box-flex-group', 'box-lines', 'box-ordinal-group', 'box-orient', 'box-pack', 'box-shadow', 'box-sizing', 'color-profile', 'column-count', 'column-fill', 'column-gap', 'column-rule', 'column-rule-color', 'column-rule-style', 'column-rule-width', 'column-span', 'column-width', 'columns', 'crop', 'dominant-baseline', 'drop-initial-after-adjust', 'drop-initial-after-align', 'drop-initial-before-adjust', 'drop-initial-before-align', 'drop-initial-size', 'drop-initial-value', 'fit', 'fit-position', 'float-offset', 'font-size-adjust', 'font-stretch', 'grid-columns', 'grid-rows', 'hanging-punctuation', 'hyphenate-after', 'hyphenate-before', 'hyphenate-character', 'hyphenate-lines', 'hyphenate-resource', 'hyphens', 'icon', 'image-orientation', 'image-resolution', 'inline-box-align', 'line-stacking', 'line-stacking-ruby', 'line-stacking-shift', 'line-stacking-strategy', # 'mark', 'mark-after', 'mark-before', 'marks', 'marquee-direction', 'marquee-play-count', 'marquee-speed', 'marquee-style', 'move-to', 'nav-down', 'nav-index', 'nav-left', 'nav-right', 'nav-up', 'opacity', 'outline-offset', 'overflow-style', 'overflow-x', 'overflow-y', 'page', 'page-policy', 'perspective', 'perspective-origin', 'phonemes', 'punctuation-trim', 'rendering-intent', 'resize', 'rest', 'rest-after', 'rest-before', 'rotation', 'rotation-point', 'ruby-align', 'ruby-overhang', 'ruby-position', 'ruby-span', 'size', 'string-set', 'target', 'target-name', 'target-new', 'target-position', 'text-align-last', 'text-height', 'text-justify', 'text-outline', 'text-overflow', 'text-shadow', 'text-wrap', 'transform', 'transform-origin', 'transform-style', 'transition', 'transition-delay', 'transition-duration', 'transition-property', 'transition-timing-function', 'voice-balance', 'voice-duration', 'voice-pitch', 'voice-pitch-range', 'voice-rate', 'voice-stress', 'voice-volume', 'word-break', 'word-wrap' ] # SVG only includes style not present in either css2 or css3: svg = [ # clipping / masking / compositing: 'clip-path', 'clip-rule', 'mask', # filter effects: 'enable-background', 'filter', 'flood-color', 'flood-opacity', 'lightning-color', # gradient: 'stop-color', 'stop-opacity', # interactivity: 'pointer-events', # color / painting: 'color-interpolation', 'color-interpolation-filters', 'color-rendering', 'fill', 'fill-opacity', 'fill-rule', 'image-rendering', 'marker', 'marker-end', 'marker-mid', 'marker-start', 'shape-rendering', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-rendering', # text: 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'kerning', 'text-anchor', 'writing-mode', ] vendor_prefix = [ '-ms-', '-moz-', '-o-', '-atsc-', '-wap-', '-webkit-', '-khtml-' '-xv-', 'mso-', ] vendor_ugly = [ 'accelerator', 'behavior', 'zoom', ] propertys = css2 + css3 + svg + vendor_ugly # CSS-2(.1) media types: http://www.w3.org/TR/CSS2/media.html#media-types # Include media types as defined in HTML4: http://www.w3.org/TR/1999/REC-html401-19991224/types.html#h-6.13 # Also explained in http://www.w3.org/TR/css3-mediaqueries/#background html4_media_types = [ 'all', 'aural', # deprecated by CSS 2.1, which reserves "speech" 'braille', 'handheld', 'print', 'projection', 'screen', 'tty', 'tv', ] css2_media_types = [ 'embossed', # CSS2, not HTML4 'speech', # CSS2. not HTML4 ] media_types = html4_media_types + css2_media_types css3_media_features = [ 'width', 'min-width', 'max-width', 'height', 'min-height', 'max-height', 'device-width', 'min-device-width', 'max-device-width', 'device-height', 'min-device-height', 'max-device-height', 'orientation', 'aspect-ratio', 'min-aspect-ratio', 'max-aspect-ratio', 'device-aspect-ratio', 'min-device-aspect-ratio', 'max-device-aspect-ratio', 'color', 'min-color', 'max-color', 'color-index', 'min-color-index', 'max-color-index', 'monochrome', 'min-monochrome', 'max-monochrome', 'resolution', 'min-resolution', 'max-resolution', 'scan', 'grid', ] vendor_media_features = [ '-webkit-min-device-pixel-ratio', 'min--moz-device-pixel-ratio', '-o-min-device-pixel-ratio', 'min-device-pixel-ratio', ] media_features = css3_media_features + vendor_media_features lesscpy-0.13.0/lesscpy/lib/dom.py0000644000175000017500000000377413115557313015741 0ustar totoltotol""" HTML DOM names Copyright (c) See LICENSE for details. """ html4 = [ 'a', 'abbr', 'acronym', 'address', 'applet', 'area', 'b', 'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', 'font', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', # 'link', 'map', 'mark', 'menu', 'meta', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'p', 'param', 'pre', 'q', 's', 'samp', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'tt', 'u', 'ul', 'var', ] html5 = [ 'article', 'aside', 'audio', 'bdi', 'canvas', 'command', 'datalist', 'details', 'embed', 'figcaption', 'figure', 'footer', 'header', 'hgroup', 'keygen', 'main', 'mark', 'meter', 'nav', 'output', 'progress', ' progress-bar-stripes', 'rp', 'rt', 'ruby', 'section', 'source', 'summary', 'svg', 'time', 'track', 'video', 'wbr', 'only', # TODO/FIXME: What is this?!? ] svg = [ 'altGlyph', 'altGlyphDef', 'altGlyphItem', 'circle', 'desc', 'ellipse', 'glyphRef', 'line', 'path', 'polygon', 'polyline', 'rect', 'text', 'textPath', 'tref', 'tspan', ] elements = html4 elements.extend(html5) elements.extend(svg) lesscpy-0.13.0/lesscpy/lib/colors.py0000644000175000017500000001003613115557313016450 0ustar totoltotol""" """ lessColors = { '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' } lesscpy-0.13.0/lesscpy/lib/__init__.py0000644000175000017500000000000013115557313016674 0ustar totoltotollesscpy-0.13.0/lesscpy/lib/reserved.py0000644000175000017500000000112713115557313016767 0ustar totoltotol""" Reserved token names Copyright (c) See LICENSE for details. """ tokens = { '@media': 'css_media', '@page': 'css_page', '@import': 'css_import', '@charset': 'css_charset', '@font-face': 'css_font_face', '@namespace': 'css_namespace', '@keyframes': 'css_keyframes', '@-moz-keyframes': 'css_keyframes', '@-webkit-keyframes': 'css_keyframes', '@-ms-keyframes': 'css_keyframes', '@-o-keyframes': 'css_keyframes', '@viewport': 'css_viewport', '@-ms-viewport': 'css_viewport', '@arguments': 'less_arguments', } lesscpy-0.13.0/tox.ini0000644000175000017500000000034413221207602013650 0ustar totoltotol[tox] envlist = py27,py33,p36 [testenv] deps = -r{toxinidir}/test-requirements.txt commands = nosetests -v [testenv:flake8] commands = flake8 [flake8] ignore = E501 show-source = True exclude = .venv,.tox,build,dist,doc,*egg lesscpy-0.13.0/lesscpy.egg-info/0000755000175000017500000000000013236067221015517 5ustar totoltotollesscpy-0.13.0/lesscpy.egg-info/requires.txt0000644000175000017500000000001013236067221020106 0ustar totoltotolply six lesscpy-0.13.0/lesscpy.egg-info/top_level.txt0000644000175000017500000000001013236067221020240 0ustar totoltotollesscpy lesscpy-0.13.0/lesscpy.egg-info/PKG-INFO0000644000175000017500000001530113236067221016614 0ustar totoltotolMetadata-Version: 1.1 Name: lesscpy Version: 0.13.0 Summary: Python LESS compiler Home-page: https://github.com/lesscpy/lesscpy Author: Jóhann T Maríusson Author-email: jtm@robot.is License: MIT Description-Content-Type: UNKNOWN Description: LESSCPY ======= .. image:: https://travis-ci.org/lesscpy/lesscpy.png?branch=master :target: https://travis-ci.org/lesscpy/lesscpy .. image:: https://coveralls.io/repos/lesscpy/lesscpy/badge.png :target: https://coveralls.io/r/lesscpy/lesscpy .. image:: https://pypip.in/d/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy .. image:: https://pypip.in/v/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy .. image:: https://pypip.in/wheel/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy :alt: Wheel Status .. image:: https://pypip.in/license/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy :alt: License Python LESS Compiler. A compiler written in Python for the LESS language. For those of us not willing or able to have node.js installed in our environment. Not all features of LESS are supported (yet). Some features wil probably never be supported (JavaScript evaluation). This program uses PLY (Python Lex-Yacc) to tokenize / parse the input and is considerably slower than the NodeJS compiler. The plan is to utilize this to build in proper syntax checking and perhaps YUI compressing. This is an early version, so you are likely to find bugs. For more information on LESS: http://lesscss.org/ or https://github.com/cloudhead/less.js Development files: https://github.com/lesscpy/lesscpy Supported features ------------------ - Variables - String interpolation - Mixins (nested, calls, closures, recursive) - Guard expressions - Parametered mixins (class / id) - @arguments - Nesting - Escapes ~/e() - Expressions - Keyframe blocks - Color functions (lighten, darken, saturate, desaturate, spin, hue, mix, saturation, lightness) - Other functions (round, increment, decrement, format '%(', ...) Differences from less.js ------------------------ - All colors are auto-formatted to #nnnnnn. eg, #f7e923 - Does not preserve CSS comments Not supported ------------- - JavaScript evaluation Requirements ------------ - Python 2.6, 2.7, 3.3, 3.4, or 3.5 - ply (Python Lex-Yacc) (check requirements.txt) Installation ------------ To install lesscpy from the `Python Package Index`_, simply: .. code-block:: bash $ pip install lesscpy To do a local system-wide install: .. code-block:: bash python setup.py install Or simply place the package into your Python path. Or rather use packages provided by your distribution (openSUSE has them at least). Compiler script Usage --------------------- .. code-block:: text usage: lesscpy [-h] [-v] [-I INCLUDE] [-V] [-x] [-X] [-t] [-s SPACES] [-o OUT] [-r] [-f] [-m] [-D] [-g] [-S] [-L] [-N] target LessCss Compiler positional arguments: target less file or directory optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit -I INCLUDE, --include INCLUDE Included less-files (comma separated) -V, --verbose Verbose mode Formatting options: -x, --minify Minify output -X, --xminify Minify output, no end of block newlines -t, --tabs Use tabs -s SPACES, --spaces SPACES Number of startline spaces (default 2) Directory options: Compiles all \*.less files in directory that have a newer timestamp than it's css file. -o OUT, --out OUT Output directory -r, --recurse Recursive into subdirectorys -f, --force Force recompile on all files -m, --min-ending Add '.min' into output filename. eg, name.min.css -D, --dry-run Dry run, do not write files Debugging: -g, --debug Debugging information -S, --scopemap Scopemap -L, --lex-only Run lexer on target -N, --no-css No css output Python usage ------------ If you want to use the compiler from within Python, you can do it like this: .. code-block:: python import lesscpy from six import StringIO print(lesscpy.compile(StringIO(u"a { border-width: 2px * 3; }"), minify=True)) The output will be: .. code-block:: text a{border-width:6px;} License ------- See the LICENSE file .. _`Python Package Index`: https://pypi.python.org/pypi/lesscpy Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Intended Audience :: End Users/Desktop Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Topic :: Software Development :: Code Generators Classifier: Topic :: Software Development :: Pre-processors lesscpy-0.13.0/lesscpy.egg-info/entry_points.txt0000644000175000017500000000007213236067221021014 0ustar totoltotol[console_scripts] lesscpy = lesscpy.scripts.compiler:run lesscpy-0.13.0/lesscpy.egg-info/SOURCES.txt0000644000175000017500000001406013236067221017404 0ustar totoltotolLICENSE MANIFEST.in README.rst requirements.txt setup.cfg setup.py test-requirements.txt tox.ini lesscpy/__init__.py lesscpy/__main__.py lesscpy/exceptions.py lesscpy.egg-info/PKG-INFO lesscpy.egg-info/SOURCES.txt lesscpy.egg-info/dependency_links.txt lesscpy.egg-info/entry_points.txt lesscpy.egg-info/requires.txt lesscpy.egg-info/top_level.txt lesscpy/lessc/__init__.py lesscpy/lessc/color.py lesscpy/lessc/formatter.py lesscpy/lessc/lexer.py lesscpy/lessc/parser.py lesscpy/lessc/scope.py lesscpy/lessc/utility.py lesscpy/lib/__init__.py lesscpy/lib/colors.py lesscpy/lib/css.py lesscpy/lib/dom.py lesscpy/lib/reserved.py lesscpy/plib/__init__.py lesscpy/plib/block.py lesscpy/plib/call.py lesscpy/plib/deferred.py lesscpy/plib/expression.py lesscpy/plib/identifier.py lesscpy/plib/import_.py lesscpy/plib/keyframe_selector.py lesscpy/plib/mixin.py lesscpy/plib/negated_expression.py lesscpy/plib/node.py lesscpy/plib/property.py lesscpy/plib/statement.py lesscpy/plib/variable.py lesscpy/scripts/__init__.py lesscpy/scripts/compiler.py test/__init__.py test/__init__.pyc test/core.py test/core.pyc test/test_bootstrap3.py test/test_bootstrap3.pyc test/test_color.py test/test_color.pyc test/test_expression.py test/test_expression.pyc test/test_font_awesome.pyc test/test_identifier.py test/test_identifier.pyc test/test_issues.py test/test_issues.pyc test/test_less.py test/test_less.pyc test/test_lexer.py test/test_lexer.pyc test/test_parser.py test/test_parser.pyc test/test_pycompile.py test/test_pycompile.pyc test/test_utility.py test/test_utility.pyc test/bootstrap3/css/bootstrap.css test/bootstrap3/css/bootstrap.min.css test/bootstrap3/css/theme.css test/bootstrap3/css/theme.min.css test/bootstrap3/less/alerts.less test/bootstrap3/less/badges.less test/bootstrap3/less/bootstrap.less test/bootstrap3/less/breadcrumbs.less test/bootstrap3/less/button-groups.less test/bootstrap3/less/buttons.less test/bootstrap3/less/carousel.less test/bootstrap3/less/close.less test/bootstrap3/less/code.less test/bootstrap3/less/component-animations.less test/bootstrap3/less/dropdowns.less test/bootstrap3/less/forms.less test/bootstrap3/less/glyphicons.less test/bootstrap3/less/grid.less test/bootstrap3/less/input-groups.less test/bootstrap3/less/jumbotron.less test/bootstrap3/less/labels.less test/bootstrap3/less/list-group.less test/bootstrap3/less/media.less test/bootstrap3/less/mixins.less test/bootstrap3/less/modals.less test/bootstrap3/less/navbar.less test/bootstrap3/less/navs.less test/bootstrap3/less/normalize.less test/bootstrap3/less/pager.less test/bootstrap3/less/pagination.less test/bootstrap3/less/panels.less test/bootstrap3/less/popovers.less test/bootstrap3/less/print.less test/bootstrap3/less/progress-bars.less test/bootstrap3/less/responsive-utilities.less test/bootstrap3/less/scaffolding.less test/bootstrap3/less/tables.less test/bootstrap3/less/theme.less test/bootstrap3/less/thumbnails.less test/bootstrap3/less/tooltip.less test/bootstrap3/less/type.less test/bootstrap3/less/utilities.less test/bootstrap3/less/variables.less test/bootstrap3/less/wells.less test/css/argb.css test/css/argb.min.css test/css/calls.css test/css/calls.min.css test/css/colors.css test/css/colors.min.css test/css/comments.css test/css/comments.min.css test/css/elements.css test/css/elements.min.css test/css/escapes.css test/css/escapes.min.css test/css/expressions.css test/css/expressions.min.css test/css/functions.css test/css/functions.min.css test/css/grid.css test/css/grid.min.css test/css/identifiers.css test/css/identifiers.min.css test/css/ie.css test/css/ie.min.css test/css/imports.css test/css/imports.min.css test/css/keyframes.css test/css/keyframes.min.css test/css/media.css test/css/media.min.css test/css/mixin-args-guards.css test/css/mixin-args-guards.min.css test/css/mixin-args-local-calls.css test/css/mixin-args-local-calls.min.css test/css/mixin-args-nested.css test/css/mixin-args-nested.min.css test/css/mixin-args-recursive.css test/css/mixin-args-recursive.min.css test/css/mixin-args-semicolon.css test/css/mixin-args-semicolon.min.css test/css/mixin-args-undeclared.css test/css/mixin-args-undeclared.min.css test/css/mixin-args.css test/css/mixin-args.min.css test/css/mixin-blocks.css test/css/mixin-blocks.min.css test/css/mixin-closure.css test/css/mixin-closure.min.css test/css/nesting.css test/css/nesting.min.css test/css/page.css test/css/page.min.css test/css/properties-uri.css test/css/properties-uri.min.css test/css/properties-vendor.css test/css/properties-vendor.min.css test/css/properties.css test/css/properties.min.css test/css/strings.css test/css/strings.min.css test/css/svg.css test/css/svg.min.css test/css/variables.css test/css/variables.min.css test/css/viewport.css test/css/viewport.min.css test/css/ws.css test/css/ws.min.css test/css/issues/issue3.css test/css/issues/issue30.css test/css/issues/issue31.css test/css/issues/issue4.css test/css/issues/issue5.css test/css/issues/issue6.css test/css/issues/issue67.css test/less/argb.less test/less/calls.less test/less/colors.less test/less/comments.less test/less/elements.less test/less/escapes.less test/less/expressions.less test/less/functions.less test/less/grid.less test/less/identifiers.less test/less/ie.less test/less/imports.less test/less/keyframes.less test/less/media.less test/less/mixin-args-guards.less test/less/mixin-args-local-calls.less test/less/mixin-args-nested.less test/less/mixin-args-recursive.less test/less/mixin-args-semicolon.less test/less/mixin-args-undeclared.less test/less/mixin-args.less test/less/mixin-blocks.less test/less/mixin-closure.less test/less/nesting.less test/less/page.less test/less/properties-uri.less test/less/properties-vendor.less test/less/properties.less test/less/strings.less test/less/svg.less test/less/variables.less test/less/viewport.less test/less/ws.less test/less/imports/circular.less test/less/imports/foo.less test/less/imports/import.less test/less/imports/import_f.less test/less/issues/issue3.less test/less/issues/issue30.less test/less/issues/issue31.less test/less/issues/issue4.less test/less/issues/issue5.less test/less/issues/issue6.less test/less/issues/issue67.lesslesscpy-0.13.0/lesscpy.egg-info/dependency_links.txt0000644000175000017500000000000113236067221021565 0ustar totoltotol lesscpy-0.13.0/README.rst0000644000175000017500000001061113221205430014017 0ustar totoltotolLESSCPY ======= .. image:: https://travis-ci.org/lesscpy/lesscpy.png?branch=master :target: https://travis-ci.org/lesscpy/lesscpy .. image:: https://coveralls.io/repos/lesscpy/lesscpy/badge.png :target: https://coveralls.io/r/lesscpy/lesscpy .. image:: https://pypip.in/d/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy .. image:: https://pypip.in/v/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy .. image:: https://pypip.in/wheel/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy :alt: Wheel Status .. image:: https://pypip.in/license/lesscpy/badge.png :target: https://pypi.python.org/pypi/lesscpy :alt: License Python LESS Compiler. A compiler written in Python for the LESS language. For those of us not willing or able to have node.js installed in our environment. Not all features of LESS are supported (yet). Some features wil probably never be supported (JavaScript evaluation). This program uses PLY (Python Lex-Yacc) to tokenize / parse the input and is considerably slower than the NodeJS compiler. The plan is to utilize this to build in proper syntax checking and perhaps YUI compressing. This is an early version, so you are likely to find bugs. For more information on LESS: http://lesscss.org/ or https://github.com/cloudhead/less.js Development files: https://github.com/lesscpy/lesscpy Supported features ------------------ - Variables - String interpolation - Mixins (nested, calls, closures, recursive) - Guard expressions - Parametered mixins (class / id) - @arguments - Nesting - Escapes ~/e() - Expressions - Keyframe blocks - Color functions (lighten, darken, saturate, desaturate, spin, hue, mix, saturation, lightness) - Other functions (round, increment, decrement, format '%(', ...) Differences from less.js ------------------------ - All colors are auto-formatted to #nnnnnn. eg, #f7e923 - Does not preserve CSS comments Not supported ------------- - JavaScript evaluation Requirements ------------ - Python 2.6, 2.7, 3.3, 3.4, or 3.5 - ply (Python Lex-Yacc) (check requirements.txt) Installation ------------ To install lesscpy from the `Python Package Index`_, simply: .. code-block:: bash $ pip install lesscpy To do a local system-wide install: .. code-block:: bash python setup.py install Or simply place the package into your Python path. Or rather use packages provided by your distribution (openSUSE has them at least). Compiler script Usage --------------------- .. code-block:: text usage: lesscpy [-h] [-v] [-I INCLUDE] [-V] [-x] [-X] [-t] [-s SPACES] [-o OUT] [-r] [-f] [-m] [-D] [-g] [-S] [-L] [-N] target LessCss Compiler positional arguments: target less file or directory optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit -I INCLUDE, --include INCLUDE Included less-files (comma separated) -V, --verbose Verbose mode Formatting options: -x, --minify Minify output -X, --xminify Minify output, no end of block newlines -t, --tabs Use tabs -s SPACES, --spaces SPACES Number of startline spaces (default 2) Directory options: Compiles all \*.less files in directory that have a newer timestamp than it's css file. -o OUT, --out OUT Output directory -r, --recurse Recursive into subdirectorys -f, --force Force recompile on all files -m, --min-ending Add '.min' into output filename. eg, name.min.css -D, --dry-run Dry run, do not write files Debugging: -g, --debug Debugging information -S, --scopemap Scopemap -L, --lex-only Run lexer on target -N, --no-css No css output Python usage ------------ If you want to use the compiler from within Python, you can do it like this: .. code-block:: python import lesscpy from six import StringIO print(lesscpy.compile(StringIO(u"a { border-width: 2px * 3; }"), minify=True)) The output will be: .. code-block:: text a{border-width:6px;} License ------- See the LICENSE file .. _`Python Package Index`: https://pypi.python.org/pypi/lesscpy lesscpy-0.13.0/test/0000755000175000017500000000000013253471741013327 5ustar totoltotollesscpy-0.13.0/test/core.py0000644000175000017500000000611513115557313014631 0ustar totoltotol""" Test bootstrap module. For flexible testing. """ import os import glob from lesscpy.lessc import parser from lesscpy.lessc import formatter class Opt(object): def __init__(self): self.minify = False self.xminify = False self.tabs = True def find_and_load_cases(cls, less_dir, css_dir, less_files=None, css_minimized=True): _less_path = os.path.join(os.path.dirname(__file__), less_dir) _css_path = os.path.join(os.path.dirname(__file__), css_dir) if less_files: LESS = [os.path.join(_less_path, "%s.less" % f) for f in less_files] else: LESS = glob.glob(os.path.join(_less_path, '*.less')) for less in LESS: lessf = less.split('.')[0].split('/')[-1] css = os.path.join(_css_path, lessf + '.css') if css_minimized: mincss = os.path.join(_css_path, lessf + '.min.css') test_method = create_case((less, css, mincss)) else: test_method = create_case((less, css, None)) test_method.__name__ = 'test_%s' % "_".join(reversed(os.path.basename(less).split('.'))) setattr(cls, test_method.__name__, test_method) def create_case(args): def do_case_expected(self): lessf, cssf, minf = args if os.path.exists(cssf): p = parser.LessParser() p.parse(filename=lessf) f = formatter.Formatter(Opt()) pout = f.format(p).split('\n') pl = len(pout) i = 0 with open(cssf) as cssf: for line in cssf.readlines(): if i >= pl: self.fail( "%s: result has less lines (%d < %d)" % (cssf, i, pl)) line = line.rstrip() if not line: continue self.assertEqual( line, pout[i], '%s: Line %d' % (cssf, i + 1)) i += 1 if pl > i and i: self.fail( "%s: result has more lines (%d > %d)" % (cssf, i, pl)) else: self.fail("%s not found..." % cssf) if minf: if os.path.exists(minf): p = parser.LessParser() opt = Opt() opt.minify = True p.parse(filename=lessf) f = formatter.Formatter(opt) mout = f.format(p).split('\n') ml = len(mout) i = 0 with open(minf) as cssf: for line in cssf.readlines(): if i >= ml: self.fail( "%s: result has less lines (%d < %d)" % (minf, i, ml)) self.assertEqual( line.rstrip(), mout[i], '%s: Line %d' % (minf, i + 1)) i += 1 if ml > i and i: self.fail( "%s: result has more lines (%d > %d)" % (minf, i, ml)) else: self.fail("%s not found..." % minf) return do_case_expected lesscpy-0.13.0/test/test_pycompile.py0000644000175000017500000000216313221207034016726 0ustar totoltotol""" Test the high-level compile function """ import unittest from six import StringIO from lesscpy import compile class TestCompileFunction(unittest.TestCase): """ Unit tests for compile """ def test_compile_from_stream(self): """ It can compile input from a file-like object """ output = compile(StringIO("a { border-width: 2px * 3; }"), minify=True) self.assertEqual(output, "a{border-width:6px;}") def test_compile_from_file(self): """ It can compile input from a file object """ import tempfile in_file = tempfile.NamedTemporaryFile(mode='w+') in_file.write("a { border-width: 2px * 3; }") in_file.seek(0) output = compile(in_file, minify=True) self.assertEqual(output, "a{border-width:6px;}") def test_raises_exception(self): """ Test if a syntax error raises an exception """ from lesscpy.exceptions import CompilationError def fail_func(): compile(StringIO("a }"), minify=True) self.assertRaises(CompilationError, fail_func) lesscpy-0.13.0/test/test_issues.py0000644000175000017500000000047713115557313016260 0ustar totoltotol""" lesscpy reported issues tests. """ import unittest from test.core import find_and_load_cases class IssuesTestCase(unittest.TestCase): pass find_and_load_cases(IssuesTestCase, less_dir='less/issues', css_dir='css/issues', css_minimized=False) lesscpy-0.13.0/test/test_expression.py0000644000175000017500000000346713115557313017146 0ustar totoltotol""" lesscpy expression tests. """ import unittest from lesscpy.plib.expression import Expression class TestExpression(unittest.TestCase): def test_basic(self): for test in [ ['0', '+', '0', '0'], ['2', '+', '2', '4'], ['2.0', '+', '2', '4'], ['2', '+', '2.0', '4'], ['2.0', '+', '2.0', '4'], [('2.0',), '+', '2.0', '4'], [('2.0',), '+', ('2.0',), '4'], ['0px', '+', '0', '0'], ['2px', '+', '2', '4px'], ['2.0px', '+', '2', '4px'], [('2px', ' '), '+', '2.0', '4px'], ['2.0px', '+', '2.0', '4px'], ]: e = Expression(test[:3]) self.assertEqual(test[3], e.parse(None), str(test)) def test_neg(self): for test in [ ['-0', '+', '0', '0'], ['-2', '+', '-2', '-4'], ['-2.0', '+', '-2', '-4'], ['-2', '+', '-2.0', '-4'], ['-2.0', '+', '-2.0', '-4'], ['-0', '-', '0', '0'], ['-2', '-', '-2', '0'], ['-2.0', '-', '2', '-4'], ['-2', '-', '-2.0', '0'], ['2.0', '-', '-2.0', '4'], ['-0px', '+', '0', '0'], ['-2px', '+', '-2', '-4px'], ['-2.0', '+', '-2px', '-4px'], ['-2em', '+', '-2.0', '-4em'], ['-2.0s', '+', '-2.0s', '-4s'], ]: e = Expression(test[:3]) self.assertEqual(test[3], e.parse(None), str(test)) def test_op(self): for test in [ ['0', '=', '0', True], ['1', '>', '2', False], ['1', '<', '2', True], ['1', '>=', '2', False], ['1', '=<', '2', True], ]: e = Expression(test[:3]) self.assertEqual(test[3], e.parse(None), test) lesscpy-0.13.0/test/test_lexer.py0000644000175000017500000000166113221207053016047 0ustar totoltotol""" Unit tests for the lexer. """ from tempfile import NamedTemporaryFile import unittest from six import StringIO from lesscpy.lessc.lexer import LessLexer class TestLessLexer(unittest.TestCase): """ Unit tests for LessLexer """ def setUp(self): self.lexer = LessLexer() def test_input_stream(self): """ It can load content from a string. """ file = StringIO(""" @simple-var: 1; """) self.lexer.input(file) token = self.lexer.token() self.assertEqual('@simple-var', token.value) def test_input_path(self): """ It can load content from a path. """ file = NamedTemporaryFile() file.write(b""" @simple-var: 1; """) file.seek(0) self.lexer.input(file.name) token = self.lexer.token() self.assertEqual('@simple-var', token.value) lesscpy-0.13.0/test/test_color.py0000644000175000017500000001443313115557313016060 0ustar totoltotol""" lesscpy color tests. """ import unittest from lesscpy.lessc import color class TestLessColor(unittest.TestCase): def setUp(self): self.color = color.Color() def test_rgb(self): test = self.color.rgb for r, g, b, v in [ (255, 255, 255, '#ffffff'), (100, 100, 100, '#646464'), (0, 0, 0, '#000000'), ('70%', '70%', '70%', '#b2b2b2'), ('1%', '1%', '1%', '#020202'), ('100%', '100%', '100%', '#ffffff'), ('0%', '0%', '0%', '#000000'), ]: self.assertEqual(test(r, g, b), v) for r, g, b, a, v in [ (255, 255, 255, 0.5, '#ffffff'), (100, 100, 100, 0.9, '#646464'), (0, 0, 0, 100, '#000000'), ]: self.assertEqual(test(r, g, b, a), v) for args in [ (255, 255, 256), (0, -1, 0), ('100%', '100%', 200), ('100%', '100%', '200%'), ]: self.assertRaises(ValueError, test, args) def test_rgba(self): test = self.color.rgba for r, g, b, a, v in [ (255, 255, 255, 255, '#ffffff'), (100, 100, 100, 100, '#646464'), (0, 0, 0, 0, 'rgba(0,0,0,0)'), ('70%', '70%', '70%', '70%', '#b2b2b2b2'), ('1%', '1%', '1%', '1%', '#02020202'), ('100%', '100%', '100%', '100%', '#ffffffff'), ('0%', '0%', '0%', '0%', 'rgba(0,0,0,0)'), ]: self.assertEqual(test(r, g, b, a), v) for args in [ (255, 255, 255, 256), (0, 0, 0, -1), ('100%', '100%', '100%', 200), ('100%', '100%', '100%', '200%'), ]: self.assertRaises(ValueError, test, args) def test_argb(self): test = self.color.argb for a, r, g, b, v in [ (255, 255, 255, 255, '#ffffffff'), (100, 100, 100, 100, '#ff646464'), (0, 0, 0, 0, '#00000000'), ('70%', '70%', '70%', '70%', '#b2b2b2b2'), ('1%', '1%', '1%', '1%', '#02020202'), ('100%', '100%', '100%', '100%', '#ffffffff'), ('0%', '0%', '0%', '0%', '#00000000'), ]: self.assertEqual(test(a, r, g, b), v) for args in [ (255, 255, 255, 256), (-1, 0, 0, 0), (200, '100%', '100%', '100%'), ('200%', '100%', '100%', '100%'), ]: self.assertRaises(ValueError, test, args) def test_hsl(self): """ """ test = self.color.hsl for h, s, l, v in [ (31, '1%', '4%', '#0a0a0a'), (0, '100%', '100%', '#ffffff'), (100, '100%', '100%', '#ffffff'), (0, '0%', '0%', '#000000'), (100, '0%', '0%', '#000000'), ]: self.assertEqual(test(h, s, l), v) def test_hsla(self): test = self.color.hsla for h, s, l, a, v in [ (31, '1%', '4%', '0%', 'rgba(10.0,10.0,10.0,0.0)'), (31, '30%', '4%', '1%', 'rgba(13.0,10.0,7.0,0.01)'), (31, '60%', '4%', '20%', 'rgba(16.0,10.0,4.0,0.2)'), (31, '90%', '4%', '60%', 'rgba(19.0,11.0,1.0,0.6)'), (31, '100%', '4%', '100%', 'rgba(20.0,11.0,0.0,1.0)'), ]: self.assertEqual(test(h, s, l, a), v) def test_fmt(self): test = self.color.fmt self.assertEqual(test('#000'), '#000000') self.assertEqual(test('#000000'), '#000000') self.assertEqual(test('#0000'), '#00000000') self.assertEqual(test('#00000000'), '#00000000') self.assertEqual(test('#AAA'), '#aaaaaa') self.assertEqual(test('#Abc'), '#aabbcc') self.assertEqual(test('#AbCdEf'), '#abcdef') self.assertRaises(ValueError, test, '#xxx') self.assertRaises(ValueError, test, None) self.assertRaises(ValueError, test, 'aabbcc') self.assertRaises(ValueError, test, '#4aabbcc') def test_saturate(self): test = self.color.saturate for c, p, v in [ ('#555', '1%', '#565454'), ('#555', '10%', '#5e4c4c'), ('#555', '20%', '#664444'), ('#555', '40%', '#773333'), ('#555', '60%', '#882222'), ('#555', '100%', '#aa0000'), ('#000', '100%', '#000000'), ('#000', '0%', '#000000'), ('#fff', '100%', '#ffffff'), ('#fff', '0%', '#ffffff'), ('#29332f', '1%', '#29332f'), ('#29332f', '10%', '#243830'), ('#29332f', '20%', '#203c31'), ('#29332f', '40%', '#174533'), ('#29332f', '60%', '#0d4f35'), ('#29332f', '100%', '#005c37'), ]: self.assertEqual(test(c, p), v, v) def test_desaturate(self): test = self.color.desaturate for c, p, v in [ ('#555', '1%', '#555555'), ('#555', '10%', '#555555'), ('#555', '20%', '#555555'), ('#555', '40%', '#555555'), ('#555', '60%', '#555555'), ('#555', '100%', '#555555'), ('#000', '100%', '#000000'), ('#000', '0%', '#000000'), ('#fff', '100%', '#ffffff'), ('#fff', '0%', '#ffffff'), ('#29332f', '1%', '#29332f'), ('#29332f', '10%', '#2e2e2e'), ('#29332f', '20%', '#2e2e2e'), ('#29332f', '40%', '#2e2e2e'), ('#29332f', '60%', '#2e2e2e'), ('#29332f', '100%', '#2e2e2e'), ]: self.assertEqual(test(c, p), v, v) def test_spin(self): test = self.color.spin for c, p, v in [ ('#555', '1%', '#555555'), ('#555', '10%', '#555555'), ('#555', '20%', '#555555'), ('#555', '40%', '#555555'), ('#555', '60%', '#555555'), ('#555', '100%', '#555555'), ('#000', '100%', '#000000'), ('#000', '0%', '#000000'), ('#fff', '100%', '#ffffff'), ('#fff', '0%', '#ffffff'), ('#29332f', '1%', '#29332f'), ('#29332f', '10%', '#293331'), ('#29332f', '20%', '#293332'), ('#29332f', '40%', '#293033'), ('#29332f', '60%', '#292d33'), ('#29332f', '100%', '#2c2933'), ]: self.assertEqual(test(c, p), v, v) lesscpy-0.13.0/test/test_utility.py0000644000175000017500000000745513115557313016453 0ustar totoltotolimport unittest import lesscpy.lessc.utility as utility class TestUtility(unittest.TestCase): def test_analyze(self): test = utility.analyze_number self.assertEqual((0, ''), test('0')) self.assertEqual((1, ''), test('1')) self.assertEqual(type(test('1')[0]), int) self.assertEqual(type(test('-1')[0]), int) self.assertEqual((1.0, ''), test('1.0')) self.assertEqual(type(test('-1.0')[0]), float) self.assertEqual((0, 'px'), test('0px')) self.assertEqual((1, 'px'), test('1px')) self.assertEqual((1.0, 'px'), test('1.0px')) self.assertEqual((0, 'px'), test('-0px')) self.assertEqual((-1, 'px'), test('-1px')) self.assertEqual(type(test('-1px')[0]), int) self.assertEqual((-1.0, 'px'), test('-1.0px')) self.assertEqual(type(test('-1.0px')[0]), float) self.assertRaises(SyntaxError, test, 'gg') self.assertRaises(SyntaxError, test, '-o') self.assertRaises(SyntaxError, test, '') def test_split_unit(self): test = utility.split_unit self.assertEqual(('', ''), test(None)) self.assertEqual(('', ''), test(False)) self.assertEqual(('', ''), test('qwerty')) self.assertEqual(('1', ''), test(1)) self.assertEqual(('1', ''), test('1')) self.assertEqual(('1', 'px'), test('1px')) self.assertEqual(('-1', 'px'), test('-1px')) def test_is_int(self): test = utility.is_int self.assertTrue(test(1)) self.assertTrue(test('1')) self.assertTrue(test('-1')) self.assertTrue(test(-1)) self.assertFalse(test(False)) self.assertFalse(test(None)) self.assertFalse(test(0.0)) def test_is_float(self): test = utility.is_float self.assertFalse(test(1)) self.assertFalse(test('1')) self.assertFalse(test(False)) self.assertFalse(test(None)) self.assertTrue(test(0.0)) self.assertTrue(test(-0.0)) self.assertTrue(test('77.0565')) self.assertTrue(test('-0.0')) def test_is_color(self): test = utility.is_color self.assertTrue(test('#123')) self.assertTrue(test('#123456')) self.assertTrue(test('#Df3')) self.assertTrue(test('#AbCdEf')) self.assertFalse(test('#AbCdEg')) self.assertFalse(test('#h12345')) self.assertFalse(test('#12345')) self.assertFalse(test('AbCdEf')) self.assertFalse(test('')) self.assertFalse(test('.925')) self.assertFalse(test(False)) self.assertFalse(test([])) def test_is_variable(self): test = utility.is_variable self.assertTrue(test('@var')) self.assertTrue(test('-@var')) self.assertFalse(test('var')) self.assertFalse(test('')) self.assertFalse(test(False)) self.assertFalse(test([])) def test_with_unit(self): test = utility.with_unit self.assertEqual('1px', test((1, 'px'))) self.assertEqual('1px', test(1, 'px')) self.assertEqual('1.0px', test(1.0, 'px')) self.assertEqual('0.0px', test('.0', 'px')) self.assertEqual('0.6px', test(.6, 'px')) self.assertEqual('1', test(1)) self.assertEqual('1', test(1, None)) self.assertEqual('1', test(1,)) def test_convergent_round(self): test = utility.convergent_round self.assertEqual(-4, test(-4.5)) self.assertEqual(-4, test(-3.5)) self.assertEqual(-2, test(-2.5)) self.assertEqual(-2, test(-1.5)) self.assertEqual(0, test(-0.5)) self.assertEqual(0, test(0.5)) self.assertEqual(2, test(1.5)) self.assertEqual(2, test(2.5)) self.assertEqual(3.0, test(10.0 / 3, 0)) self.assertEqual(4, test(3.5)) self.assertEqual(4, test(4.5)) lesscpy-0.13.0/test/less/0000755000175000017500000000000013236067221014270 5ustar totoltotollesscpy-0.13.0/test/less/mixin-args.less0000644000175000017500000000343513115557313017245 0ustar totoltotol/* Mixin-functions */ .empty () {} #empty { .empty(); .empty(red, 1px); } .basic(@a: 3px) { line-height: @a; } #basic { .basic(); .basic(6px); } #idbasic (@a: 3px){ line-height: @a; } .idbasic { #idbasic(); #idbasic(6px); } /* Args */ .args (@color, @width) { color: @color; width: @width; } #args { .args(red, 1px); } #args_locals { @a: green; @b: 3px; .args(@a, @b); } /* Vars and scope */ .local () { @var: red; color: @var; } #local { @var: blue; padding: 0; .local(); } @glob: 5; .global-mixin(@a:2) { width: @glob + @a; } .scope-mix { .global-mixin(3); } /* Call as block mixin */ .hidden() { color: transparent; } #hidden { .hidden; .hidden(); } /* kwargs */ .kwarg (@a: 1px, @b: 50%) { width: @a * 5; height: @b - 1%; } .both { .kwarg(3px, 20%); } .one-arg { .kwarg(3px); } .no-parens { .kwarg; } .no-args { .kwarg(); } /* @arguments */ .mixin-arguments (@width: 0px) { border: @arguments; } .arguments { .mixin-arguments(1px, solid, black); } .arguments2 { .mixin-arguments(1px); } .arguments3 { .mixin-arguments(); } .arguments_empty() { border: @arguments; } .arguments3 { .arguments_empty(1px, solid, red); } .arguments4 { .arguments_empty(1px solid red); } // // filter mixins // .placeholder(@color: #000) { :-moz-placeholder { color: @color; } &::-webkit-input-placeholder { color: @color; } } .div { .placeholder(#fff); } // argument list variables .box-shadow(@shadow: 0 1px 3px rgba(0,0,0,.25)) { -webkit-box-shadow: @shadow; -moz-box-shadow: @shadow; box-shadow: @shadow; } .arglist { .box-shadow(); } // Reversed .border-radius(@radius: 5px) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; } .a { .border-radius(0 3px 3px 0); } lesscpy-0.13.0/test/less/variables.less0000644000175000017500000000264513115557313017141 0ustar totoltotol/* Less variables */ @a: 2; @x: @a * @a; @y: @x + 1; @z: @x * 2 + @y; .variables { width: @z + 1cm; // 14cm } @b: @a * 10; @c: #888; @fonts: "Trebuchet MS", Verdana, sans-serif; @f: @fonts; @quotes: "~" "~"; @q: @quotes; .variables { height: @b + @x + 0px; // 24px color: @c; font-family: @f; quotes: @q; } .redefinition { @var: 4; @var: 2; @var: 3; three: @var; } .values { @a: 'Trebuchet'; @multi: 'A', B, C; font-family: @a, @a, @a; color: @c !important; url: url(@a); multi: something @multi, @a; } .variable-names { @var: 'hello'; @name: 'var'; name: @@name; } .alpha { @var: 42; filter: alpha(opacity=@var); } /* Lazy eval */ @lazy: @j; @j: 100%; .lazy-eval { width: @lazy; } /* Variable scoping */ @x: blue; @z: transparent; .scope1 { @y: orange; @z: black; color: @x; // blue border-color: @z; // black .hidden { @x: #131313; } .scope2 { @y: red; color: @x; // blue .scope3 { @local: white; color: @y; // red border-color: @z; // black background-color: @local; // white .scope4 { @y: @z; color: @y; } } } } @gnegvar: 1px; .negvar { padding: -@gnegvar; } @a: 1px; .varpad { border-left: @a solid transparent; border-right: @a solid transparent; border-top: @a solid black; } /* Names */ @1col: 12px; .testname { width: @1col; }lesscpy-0.13.0/test/less/calls.less0000644000175000017500000000200013115557313016250 0ustar totoltotol/* Built in functions */ @r: 32; #standard { @var: 10; width: increment(15); height: undefined("self"); border-width: add(2, 3); variable: increment(@var); decrement: decrement(@var); rounded: round(@r/3); roundedpx: round(10px / 3); round25: round(2.5); round15: round(1.5); } #escapes { escaped: e("-Some(#thing, y)"); escaped1: ~"-Some(#thing, z)"; eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); } #format { format: %("rgb(%d, %d, %d)", @r, 128, 64); format-string: %("hello %s", "world"); format-multiple: %("hello %s %d", "earth", 2); format-url-encode: %('red is %A', #ff0000); } #more { width: ceil(5/3.0px); height: floor(5.0/3px); top: percentage(0.5); } #colors { filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",#fff,#333)); } #gradient(@startColor, @endColor) { background-image: linear-gradient(top, @startColor, @endColor); } a { #gradient(#fff, #333); #gradient(#a6a6a6, #000); } lesscpy-0.13.0/test/less/ws.less0000644000175000017500000000136013115557313015613 0ustar totoltotol/* Whitespace */ .whitespace { color: white; } .whitespace { color: blue; } .whitespace { color: green; } .whitespace { color: pink; } .whitespace{color:yellow;} .whitespace { color : black ; } .white, .space, .mania { color: white; } .newlines { background: the, great, wall; border: 2px solid black; } .empty { } .no_final_semi { color: white } .no_final_semi1 { color: yellow; color: white } @media all { html { padding: src('no semi in media block') } } @font-face { src: url('x') format('e'), url('r') format('s'); } .form-control { fieldset[disabled] & { cursor: not-allowed; } } lesscpy-0.13.0/test/less/mixin-args-recursive.less0000644000175000017500000000160113115557313021243 0ustar totoltotol/* Recursive mixin calls ala bootstrap */ .span (@columns) { width: (12px * @columns) + (12px * (@columns - 1)); } .spanX (@index) when (@index > 0) { .span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .a { .spanX(12); } // Nested recursion @gridColumns: 3; @gridColumnWidth: 60px; @gridGutterWidth: 20px; #grid { .core (@gridColumnWidth, @gridGutterWidth) { .spanX (@index) when (@index > 0) { .span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .span (@columns) { width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); } .spanX (@gridColumns); .nested { padding: 1px; .spanX (@gridColumns); .deep { padding: 1px; .spanX (@gridColumns); } } } } #grid > .core(@gridColumnWidth, @gridGutterWidth); lesscpy-0.13.0/test/less/mixin-args-guards.less0000644000175000017500000000325413115557313020527 0ustar totoltotol/* Guards */ .inner(@index) { width: @index * 1px; } .sign (@index) when (@index > 0) { .inner(@index); } .sign (@index) when (@index < 0) { height: @index; } .sign (@index: 0) when (@index = 0) { padding: @index; } .a { .sign(1px); .sign(-1px); .sign(0); // No arg .sign(); .sign; } // condition list .mixin1 (@a) when (@a > 10), (@a < -10) { margin: @a; } .b{ .mixin1(11); .mixin1(-11); } .eq (@a, @b) when (@a < @b) and (@b = @a) { } .max (@a, @b) when (@a > @b) { width: @a } .max (@a, @b) when (@a < @b) { height: @b } .c { .max(3px, 5px); .max(5px, 3px); } @media1: mobile; .mmixin (@a) when (@media1 = mobile) { src: 'mobile'; padding: @a; } .mmixin (@a) when (@media1 = desktop) { src: 'desktop'; padding: @a * 3px; } .d { .mmixin(1px); } /* isType functions */ .mixtype (@a, @b: 0) when (isnumber(@b)) { width: @b; } .mixtype (@a, @b: black) when (iscolor(@b)) { color: @b; } .mixtype (@a, @b: 'http://www.lesscss.org') when (isurl(@b)) { src: @b; } .mixtype (@a, @b: 'somestr') when (isstring(@b)) { filter: @b; } .mixtype (@a, @b: 'somestr') when (iskeyword(@b)) { ignore: @b; } .e { .mixtype (6px, 9px); .mixtype (6px, yellow); .mixtype (6px, 'http://www.lesscss.org/#-parametric-mixins'); .mixtype (6px, 'wtf'); .mixtype (6px, when); } /* Mixed conditions */ .mixcond (@a) when (isnumber(@a)) and (@a > 0) { width: @a; } /* .mixcond (@a) when (isnumber(@a)) and (@a = 0) { margin: @a; } */ .mixcond (@b) when not (@b > 0) { height: @b; } .f { .mixcond(9px); // .mixcond(0); .mixcond(-9px); } /* Bootstrap example */ .span(@index) { width: @index * 1px; } .spanX (@index) when (@index > 0) { .span@{index} { .span(@index); } } .a { .spanX(5); } lesscpy-0.13.0/test/less/argb.less0000644000175000017500000000046613115557313016103 0ustar totoltotol.well { filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d')", argb(#555))); color: rgba(90, 23, 148, 0.5); color: argb(rgb(100, 100, 100)); color: argb(rgb(140, 100, 100, 100)); color: argb(rgba(90, 23, 148, 50)); color: argb(rgba(90, 23, 148, 0.5)); color: argb(#555); } lesscpy-0.13.0/test/less/mixin-args-nested.less0000644000175000017500000000334113115557313020521 0ustar totoltotol/* Args nested */ .a(@radius) { radius: @radius; } .b(@radius) { .a(@radius); } .c(@radius) { .b(@radius); } .d(@radius) { .c(@radius); } #e { .d(5px); } // kwarg .f(@radius: 1px) { radius: @radius; } .g(@radius) { .f(@radius); } .h(@radius) { .g(@radius); } .i(@radius: 1px) { .h(@radius); } #j { .i(5px); } #k { .i(); } // // Nested // .nested-ruleset (@width: 200px) { width: @width; .column { margin: @width; &.blue { color: blue; .deep { padding: @width; } } } } .content { .nested-ruleset(600px); } .content-em { .nested-ruleset(); } .nested-2(@width: 300px) { width: @width; .nested-ruleset(@width); } .test-2 { .nested-2(); } .test-2-em { .nested-2(600px); } /* Inner nested mixins */ .outer { .inner(@width) { padding: @width; } .innerkwarg(@width: 3px) { margin: @width; } } .tx { .outer .inner(3px); .outer .innerkwarg(1px); } .ty { @width: 7px; .outer .inner(@width); .outer .innerkwarg(); } #font { #family { .serif() { font-family: Georgia, "Times New Roman", Times, serif; } } .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { #font > #family > .serif; } } .font { #font > .serif(); } /* Deferred calls. */ .gradientBar(@primaryColor, @secondaryColor) { #gradient > .vertical(@primaryColor, @secondaryColor); } #gradient { .vertical(@startColor: #555, @endColor: #333) { background-color: mix(@startColor, @endColor, 60%); } } .deferred { .gradientBar(#555, #964); } /* Mixins called within own scope */ .callswithinscope { .inner() { .call(@index: 3px) { padding: @index; } .call(6px); } } span.callswithinscope { .callswithinscope > .inner(); }lesscpy-0.13.0/test/less/issues/0000755000175000017500000000000013236067221015603 5ustar totoltotollesscpy-0.13.0/test/less/issues/issue5.less0000644000175000017500000000006413115557313017712 0ustar totoltotol.test { border: darken(#555555, 10%) solid 1px; }lesscpy-0.13.0/test/less/issues/issue4.less0000644000175000017500000000012113115557313017703 0ustar totoltotol/* Allow nested imports */ @media print { @import "../imports/import.less"; }lesscpy-0.13.0/test/less/issues/issue67.less0000644000175000017500000000004213115557313017776 0ustar totoltotol.c { left: -(1 + 1) * -(1 + 1); } lesscpy-0.13.0/test/less/issues/issue3.less0000644000175000017500000000005413115557313017707 0ustar totoltotol/* HTML5 svg tag */ svg { padding: 50px; }lesscpy-0.13.0/test/less/issues/issue6.less0000644000175000017500000000017713115557313017720 0ustar totoltotol.reset-filter() { filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); } .reset { .reset-filter(); }lesscpy-0.13.0/test/less/issues/issue31.less0000644000175000017500000000011013115557313017761 0ustar totoltotola.color { color: hsla(0, 0%, 0%, 0.5); color: hsla(31, 1%, 4%, 0%); } lesscpy-0.13.0/test/less/issues/issue30.less0000644000175000017500000000007713115557313017774 0ustar totoltotoltr:nth-child(odd) td, tr:nth-child(odd) th { color: red; } lesscpy-0.13.0/test/less/imports.less0000644000175000017500000000110513115557313016654 0ustar totoltotol/* CSS imports */ @import 'some.css.file.css'; @import 'some/other.css.file.CSS'; /* CSS imports (media) */ @import 'some.css' all; @import "some.print.css" print; /* Less imports */ @foo: "foo"; @import './imports/@{foo}.less'; @import './imports/import.less'; @import './imports/import.less'; // redundant @import './imports/import_f'; // No ext .import { .mixin; .mixf(6px); height: @imported; } @import "styles.css"; @import url("styles.css"); @import url("druck.css") print; @import url("foo.css") projection, tv; @import url("bar.css") handheld and (max-width: 500px); lesscpy-0.13.0/test/less/escapes.less0000644000175000017500000000024413115557313016605 0ustar totoltotol/* css escapes */ .escape\|random\|char { color: red; } .mixin\!tUp { font-weight: bold; } .trailingTest\+ { color: red; } .font-madness { font: ~"0/0" a; } lesscpy-0.13.0/test/less/nesting.less0000644000175000017500000000347413115557313016641 0ustar totoltotol/* Simple nesting */ .div { color: blue; .nest { &.deep { color: yellow; .deeper { color: angry; .deepest { color: purple; .hidden {} } } } color: red; } } /* & combinator and placements */ h1, h2, h3 { a, p { &:hover { color: red; } } } a { &.btn { &-small { span { font-size: 10px; } } } } a { color: red; &:hover { color: blue; } div & { color: green; } p & span { color: yellow; } } .foo { .bar, .baz { & .qux { display: block; } .qux & { display: inline; } .qux & .biz { display: none; } } } /* @_o */ #first > .one { > #second .two > #deux { width: 50%; #third { &:focus { color: black; #fifth { > #sixth { .seventh #eighth { color: purple; + .sibling_selector { color: angry; } } } &:hover { // empty } } } ~ p.general_sibling_selector { color: unused; } height: 100%; } #fourth, #five, #six { color: #110000; .seven, .eight > #nine { border: 1px solid black; } #ten { color: red; } } } font-size: 2em; } /* Multiples expands to 160 identifiers */ h1, h2, h3, h4, h5 { a, p, div, span { .one, .two, .three, .four { &:hover, &:focus { display: block; } } } } .child, .sibling { & + & { color: red; } } .child, .sibling { & + & + & { color: red; } } .child, .sibling, .foo { & + & + & { color: red; } } .child, .sibling, .foo { & + & { color: red; } } lesscpy-0.13.0/test/less/mixin-closure.less0000644000175000017500000000044313115557313017761 0ustar totoltotol.scope { @var: 99px; .mixin () { width: @var; } } .class { .scope > .mixin; } .overwrite { @var: 0px; .scope > .mixin; } .nested { @var: 5px; .mixin () { width: @var; } .class { @var: 10px; .nested .mixin(); } } lesscpy-0.13.0/test/less/elements.less0000644000175000017500000001217013115557313016777 0ustar totoltotol/*--------------------------------------------------- LESS Elements 0.6 --------------------------------------------------- A set of useful LESS mixins by Dmitry Fadeyev Special thanks for mixin suggestions to: Kris Van Herzeele, Benoit Adam, Portenart Emile-Victor, Ryan Faerman More info at: http://lesselements.com -----------------------------------------------------*/ .gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) { background: @color; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, @start), color-stop(1, @stop)); background: -ms-linear-gradient(bottom, @start, @stop); background: -moz-linear-gradient(center bottom, @start 0%, @stop 100%); } .bw-gradient(@color: #F5F5F5, @start: 0, @stop: 255) { background: @color; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, rgb(@start,@start,@start)), color-stop(1, rgb(@stop,@stop,@stop))); background: -ms-linear-gradient(bottom, rgb(@start,@start,@start) 0%, rgb(@start,@start,@start) 100%); background: -moz-linear-gradient(center bottom, rgb(@start,@start,@start) 0%, rgb(@stop,@stop,@stop) 100%); } .bordered(@top-color: #EEE, @right-color: #EEE, @bottom-color: #EEE, @left-color: #EEE) { border-top: solid 1px @top-color; border-left: solid 1px @left-color; border-right: solid 1px @right-color; border-bottom: solid 1px @bottom-color; } .drop-shadow(@x-axis: 0, @y-axis: 1px, @blur: 2px, @alpha: 0.1) { -webkit-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); -moz-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); } .rounded(@radius: 2px) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; } .border-radius(@topright: 0, @bottomright: 0, @bottomleft: 0, @topleft: 0) { -webkit-border-top-right-radius: @topright; -webkit-border-bottom-right-radius: @bottomright; -webkit-border-bottom-left-radius: @bottomleft; -webkit-border-top-left-radius: @topleft; -moz-border-radius-topright: @topright; -moz-border-radius-bottomright: @bottomright; -moz-border-radius-bottomleft: @bottomleft; -moz-border-radius-topleft: @topleft; border-top-right-radius: @topright; border-bottom-right-radius: @bottomright; border-bottom-left-radius: @bottomleft; border-top-left-radius: @topleft; -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; } .opacity(@opacity: 0.5) { -moz-opacity: @opacity; -khtml-opacity: @opacity; -webkit-opacity: @opacity; opacity: @opacity; } .transition-duration(@duration: 0.2s) { -moz-transition-duration: @duration; -webkit-transition-duration: @duration; transition-duration: @duration; } .rotation(@deg:5deg){ -webkit-transform: rotate(@deg); -moz-transform: rotate(@deg); transform: rotate(@deg); } .scale(@ratio:1.5){ -webkit-transform:scale(@ratio); -moz-transform:scale(@ratio); transform:scale(@ratio); } .transition(@duration:0.2s, @ease:ease-out) { -webkit-transition: all @duration @ease; -moz-transition: all @duration @ease; transition: all @duration @ease; } .inner-shadow(@horizontal:0, @vertical:1px, @blur:2px, @alpha: 0.4) { -webkit-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); -moz-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); } .box-shadow(@arguments) { -webkit-box-shadow: @arguments; -moz-box-shadow: @arguments; box-shadow: @arguments; } .columns(@colwidth: 250px, @colcount: 0, @colgap: 50px, @columnRuleColor: #EEE, @columnRuleStyle: solid, @columnRuleWidth: 1px) { -moz-column-width: @colwidth; -moz-column-count: @colcount; -moz-column-gap: @colgap; -moz-column-rule-color: @columnRuleColor; -moz-column-rule-style: @columnRuleStyle; -moz-column-rule-width: @columnRuleWidth; -webkit-column-width: @colwidth; -webkit-column-count: @colcount; -webkit-column-gap: @colgap; -webkit-column-rule-color: @columnRuleColor; -webkit-column-rule-style: @columnRuleStyle; -webkit-column-rule-width: @columnRuleWidth; column-width: @colwidth; column-count: @colcount; column-gap: @colgap; column-rule-color: @columnRuleColor; column-rule-style: @columnRuleStyle; column-rule-width: @columnRuleWidth; } .translate(@x:0, @y:0) { -moz-transform: translate(@x, @y); -webkit-transform: translate(@x, @y); -o-transform: translate(@x, @y); -ms-transform: translate(@x, @y); transform: translate(@x, @y); } lesscpy-0.13.0/test/less/properties-uri.less0000644000175000017500000000214313115557313020153 0ustar totoltotol/* CSS url/uri */ #data-uri { background: url(data:image/png;charset=utf-8;base64, kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); } #svg-data-uri { background: transparent url('data:image/svg+xml, '); } .uri_test { background-image: url(images/image.jpg); background-image: url(../some/path); background-image: url(./../some/path); background-image: url(./images/image.jpg); background-image: url(http://some/path/img.jpeg); background-image: url(https://some.server.com:9696/path/img.jpeg); behavior:url(border-radius.htc); background-image: url(fonts.svg#MyGeometricModern); image: url(http://), "}", url("http://}"); image: url(http://tooks.com); // issue 7 background: url(/static/dashboard/img/search.png) no-repeat 195px 5px; } .uri_2 { // IE cannot handle no space behind 'url()' background-image: url('images/image.jpg') top left repeat-x #002e55; }lesscpy-0.13.0/test/less/mixin-args-undeclared.less0000644000175000017500000000014713115557313021346 0ustar totoltotol/* Calls to undeclared mixins */ .a { .mmundecl(3px); } /* Declare */ @import 'imports/import.less';lesscpy-0.13.0/test/less/properties-vendor.less0000644000175000017500000000056413115557313020656 0ustar totoltotoldiv.vendor { -moz-transform: translate(0, 11em) rotate(-90deg); -webkit-animation: anim2 7s infinite ease-in-out; } div.long { -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; } div.styles { display: -moz-inline-stack; background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); }lesscpy-0.13.0/test/less/functions.less0000644000175000017500000000201213115557313017165 0ustar totoltotol/* CSS Function tests inspired by http://www.suburban-glory.com/blog?page=130 */ /* CSS 2.1 Functions */ #wrapper { background : url(images/photo-one.jpg); } body { counter-reset: paras 0; } p:before { counter-increment: paras 1; content: "New Paragraph: " counter(paras, decimal) ": "; } @media print { a:after { content: " (" attr(href) ") " } } @media print { abbr:after { content: " (" attr(title) ") "; } } a:hover:after { content: " Page: (" attr(href) ") "; } /* CSS 3 Functions */ /* NOTE(saschpe): Not yet, even lessc chokes on it: SyntaxError: expected ')' got '–' in /root/Projects/python/Lesscpy/lesscpy/test/less/functions.less on line 40, column 61: 39 #example { 40 width: calc(100% * (attr(value) - attr(min)) / (attr(max) – attr(min))) 41 } #example { width: calc(100% * (attr(value) - attr(min)) / (attr(max) – attr(min))) } #example { position: fixed; height: 25px; width: 300px; top: calc(min(500px, 1vh-25px)); left: calc(min(30px, 1wh-300px)); } */ lesscpy-0.13.0/test/less/viewport.less0000644000175000017500000000011413115557313017035 0ustar totoltotol@-ms-viewport { width: device-width; } @viewport { width: device-width; } lesscpy-0.13.0/test/less/mixin-blocks.less0000644000175000017500000000254113115557313017563 0ustar totoltotol/* Mixins */ .mixin { direction: rtl; } #mixin { unicode-bidi: embed; } .bible-quote { .mixin; #mixin; } /* Nested */ .nested_mixin_1 { letter-spacing: -1px; #mixin { white-space: pre; } } .nested { .nested_mixin_1; } #nested_mixin_1 { color: red; .mixin { color: yellow; } } pre { #nested_mixin_1; } div.nest { a { &:hover, &:focus { .deep p { widows: 3; } } } } .nest_deep { div.nest; } /* */ .mixout { border-color: orange; } .borders { border-style: dashed; } #namespace { .borders { border-style: dotted; } .biohazard { content: "death"; .man { color: transparent; } } } #theme { > .mixin { background-color: grey; } } #container { color: black; .mixout; #theme > .mixin; } #header { .milk { color: white; #theme > .mixin; } #cookie { .chips { #namespace .borders; .calories { #container; } } .borders; } } .secure-zone { #namespace .biohazard .man; } // // Direct access // .outer { .inner { padding: 3px; } } .tx { .outer .inner; // Same .outer > .inner; } // // Fallbacks // .clear { padding: -100px; &:before { display: table; content: ""; } } .fallback { margin: 2px; .clear(); } #fallback { .bam() { .row { margin: 2px; .clear(); } } } #fallback > .bam(); lesscpy-0.13.0/test/less/properties.less0000644000175000017500000000160013115557313017353 0ustar totoltotol/* CSS Properties */ div.properties { color: red; } div.empty { margin: ; } div.important { color: red !important; width: 100%!important; height: 20px ! important; } div.annoying_font_property { font : 12px/16px Arial; font: 100%/16px Arial; font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; } div.shorthands { border: 1px solid #000; margin: 1px 0; padding: 0 auto; padding: 1px 0 2px 0; margin: 0; padding: -1px -0 -2px -0; } /* */ table { counter-reset: group; } tbody { counter-increment: group; counter-reset: row; } tbody tr { counter-increment: row; } tbody td:first-child:before { content: counter(group, upper-latin) "." counter(row); } /* Escapes */ .escape\|random\|char { color: red; } .mixin\!tUp { font-weight: bold; } .trailingTest\+ { color: red; } .sr-only { clip: rect(0 0 0 0); } .font-madness { font: 0/0 a; } lesscpy-0.13.0/test/less/expressions.less0000644000175000017500000000323513115557313017547 0ustar totoltotol/* Expressions */ #operations { color: #110000 + #000011 + #001100; // #111111 // No space color: #110000+#000011+#001100; height: 10px / 2px + 6px - 1px * 2; // 9px width: 2 * 4 - 5em; // 3em text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; .spacing { height: 10px / 2px+6px- 1px*2; width: 2 * 4 - 5em; } substraction: 20 - 10 - 5 - 5; // 0 division: 20 / 5 / 4; // 1 } /* Variables */ @x: 4; @y: 12em; .with-variables { height: @x + @y; // 16em width: 12 + @y; // 24em size: 5cm - @x; // 1cm } @z: -2; .negative { height: 2px + @z; // 0px width: 2px - @z; // 4px } @m: ((8 * (@z + 5) - 12) * (5 + -1)); a { width: (@m)px; // 48px } /* */ .shorthands { padding: -1px 2px 0 -4px; // } /* Colors */ .colors { color: #123; // #112233 border-color: #234 + #111111; // #334455 background-color: #222222 - #fff; // #000000 .other { color: 2 * #111; // #222222 border-color: #333333 / 3 + #111; // #222222 } } /* Parentheses */ .parens { @var: 1px; border: (@var * 2) solid black; margin: (@var * 1) (@var + 2) (4 * 4) 3; width: (6 * 6); padding: 2px (6px * 6px); } .more-parens { @var: (2 * 2); padding: (2 * @var) 4 4 (@var * 1px); width: (@var * @var) * 6; height: (7 * 7) + (8 * 8); margin: 4 * (5 + 5) / 2 - (@var * 2); margin: (6 * 6)px; } .nested-parens { width: 2 * (4 * (2 + (1 + 6))) - 1; height: ((2+3)*(2+3) / (9 - 4)) + 1; } .mixed-units { margin: 2px 4em 1 5pc; padding: (2px + 4px) 1em 2px 2; } /* As arguments to mixin */ .am(@index) { padding: @index; } @index: 1px; .bm { .am(@index - 1); } /* */ @foo: (floor(1.2px)); h1 { margin: @foo; } lesscpy-0.13.0/test/less/imports/0000755000175000017500000000000013236067221015765 5ustar totoltotollesscpy-0.13.0/test/less/imports/import_f.less0000644000175000017500000000005213115557313020473 0ustar totoltotol/* */ .mixf (@var: 7px) { width: @var; }lesscpy-0.13.0/test/less/imports/import.less0000644000175000017500000000012613115557313020170 0ustar totoltotol@imported: 9px; .mixin { color: red; } .mmundecl(@index) { padding: @index * 1px; }lesscpy-0.13.0/test/less/imports/circular.less0000644000175000017500000000003013115557313020454 0ustar totoltotol@import 'circular.less';lesscpy-0.13.0/test/less/imports/foo.less0000644000175000017500000000002613115557313017440 0ustar totoltotol.foo { color: blue; } lesscpy-0.13.0/test/less/comments.less0000644000175000017500000000203013115557313017002 0ustar totoltotol/******************\ * * * Comment Header * * * \******************/ /* Comment */ /* * Comment Test * * - cloudhead (http://cloudhead.net) * */ //////////////// @var: "content"; //////////////// /* Colors * ------ * #EDF8FC (background blue) * #166C89 (darkest blue) * * Text: * #333 (standard text) // A comment within a comment! * #1F9EC9 (standard link) * */ /* @group Variables ------------------- */ #comments /* boo */ { /**/ // An empty comment color: red; /* A C-style comment */ background-color: orange; // A little comment font-size: 12px; /* lost comment */ content: @var; border: 1px solid black; // padding & margin // padding: 0; // }{ '" margin: 2em; } // /* commented out #more-comments { color: grey; } */ .selector /* .with */, .lots, /* of */ .comments { color: grey, /* blue */ orange; -webkit-border-radius: 2px /* webkit only */; -moz-border-radius: 2px * 4 /* moz only with operation */; } #last { color: blue; } // lesscpy-0.13.0/test/less/page.less0000644000175000017500000000037513115557313016103 0ustar totoltotol@page { margin: 2.5cm; /* default for all pages */ } @page :left { margin-left: 5cm; /* left pages only */ } @page :right { margin-right: 5cm; /* right pages only */ } @page :first { margin-top: 8cm; /* extra top margin on the first page */ }lesscpy-0.13.0/test/less/mixin-args-semicolon.less0000644000175000017500000000016313115557313021226 0ustar totoltotol.mixin-arguments (@width: 0px) { border: @arguments; } .arguments { .mixin-arguments(1px; solid; black); } lesscpy-0.13.0/test/less/ie.less0000644000175000017500000000152213115557313015557 0ustar totoltotol@fat: 0; @cloudhead: "#000000"; // // IE Filters // .nav { filter: ~'progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333", endColorstr="@{cloudhead}", GradientType=@{fat})'; } .nav1 { filter: ~"progid:DXImageTransform.Microsoft.Alpha(opacity=@{fat})"; } .nav2 { filter: ~'progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333", endColorstr="@{cloudhead}", GradientType=@{fat})'; } // // IE Hacks // body { *zoom: 1px; } >body { *zoom: 1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ } lesscpy-0.13.0/test/less/grid.less0000644000175000017500000000663513115557313016121 0ustar totoltotol/* bootstrap grid system */ #gridSystem { // Setup the mixins to be used .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, @columns) { width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); } .offset(@gridColumnWidth, @gridGutterWidth, @columns) { margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)) + (@gridGutterWidth * 2); } .gridColumn(@gridGutterWidth) { float: left; margin-left: @gridGutterWidth; } // Take these values and mixins, and make 'em do their thang .generate(@gridColumns, @gridColumnWidth, @gridGutterWidth) { // Row surrounds the columns .row { margin-left: @gridGutterWidth * -1; } // Find all .span# classes within .row and give them the necessary properties for grid columns (supported by all browsers back to IE7, thanks @dhg) [class*="span"] { #gridSystem > .gridColumn(@gridGutterWidth); } // Default columns .span1 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 1); } .span2 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 2); } .span3 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 3); } .span4 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 4); } .span5 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 5); } .span6 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 6); } .span7 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 7); } .span8 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 8); } .span9 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 9); } .span10 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 10); } .span11 { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 11); } .span12, .container { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 12); } // Offset column options .offset1 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 1); } .offset2 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 2); } .offset3 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 3); } .offset4 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 4); } .offset5 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 5); } .offset6 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 6); } .offset7 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 7); } .offset8 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 8); } .offset9 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 9); } .offset10 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 10); } .offset11 { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 11); } } } // Default 940px grid @gridColumns: 12; @gridColumnWidth: 60px; @gridGutterWidth: 20px; @gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); // Fixed (940px) #gridSystem > .generate(@gridColumns, @gridColumnWidth, @gridGutterWidth); // Test #gridSystem > .generate(7, 27, 1.7); lesscpy-0.13.0/test/less/identifiers.less0000644000175000017500000000463313115557313017475 0ustar totoltotol/** CSS Identifiers */ p { color: red; } p span { display: inline; } * { min-width: 45em; } * html .div { height: 12px; } h1, h2 > a > p, h3 { color: none; } div.class { color: blue; } div#id { color: green; } .class#id { color: purple; } .one.two.three { color: grey; } .one .two .three { color: grey; } a:hover, a:link { color: #999; } p + h1 { font-size: 2.2em; } p ~ h1 { color: yellow; } /** Selectors */ p, p:first-child { text-transform: none; } q:lang(no) { quotes: none; } p:not([class*="lead"]) { color: black; } input[type="text"].class#id[attr=32]:not(1) { color: white; } div#id.class[a=1][b=2].class:not(1) { color: white; } ul.comma > li:not(:only-child)::after { color: white; } ol.comma > li:nth-last-child(2)::after { color: white; } li:nth-child(4n+1), li:nth-child(-5n), li:nth-child(-n+2) { color: white; } a[href^="http://"] { color: black; } a[href$="http://"] { color: black; } a[href^="http://"] { color: black; } form[data-disabled] { color: black; } p::before { color: black; } :lang(en-us)>q { quotes: "\201c" "\201d" "\2018" "\2019"; } :lang(en-gb)>q { quotes: "\2018" "\2019" "\201c" "\201d"; } /* Lists */ a.one, a.two, a.three, a.four, a.five, a.six, a.seven, a.eight, a.nine, a.ten { max-width: 12px; } a.longclassname.one, a.longclassname.two, a.longclassname.three, a.longclassname.four, a.longclassname.five, a.longclassname.six, a.longclassname.seven, a.longclassname.eight, a.longclassname.nine, a.longclassname.ten { max-height: 12px; } 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, 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, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { padding: 0; } // HTML5 list article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { padding: 0; } /* ... */ #f7 { color: #fff777; } .asterisk_last * { padding: 0; } @var: 3; .class_no_@{var} { padding: @var * -1px; } /* */ .label, .badge { // Composite identifiers &-important { background-color: #F00; } &-important[href] { background-color: darken(#F00, 10%);} } lesscpy-0.13.0/test/less/media.less0000644000175000017500000000340513115557313016243 0ustar totoltotol/* CSS media groups */ @media screen, projection { html { background: #fffef0; color: #300; } body { max-width: 35em; margin: 0 auto; } } /* Variables */ @media print { @var: 42; .class { color: blue; .sub { width: @var; } } .top, header > h1 { color: #222 * 2; } } @media screen { @base: 8; body { max-width: @base * 60; } } /* pseudo */ @media all and (orientation:portrait) { aside { float: none; } } @media not screen and (color), print and (color) { body { margin: 0 auto; } } /* */ @media (min-width: 768px) and (max-width: 979px) { .hidden-desktop { display: none !important; } } @minwidth: 12px; @media (min-width: @minwidth) { body { margin: 0 auto; } } /* Expressions */ @foo: 768px - 1; @media (width: @foo) { .visible-xs { display: block; } } /* Vendor extensions and expressions */ @media only screen and ( min--moz-device-pixel-ratio: 5/2), only screen and ( -o-min-device-pixel-ratio: 2/1), only screen and ( min-device-pixel-ratio: 2), only screen and ( min-resolution: 192dpi), only screen and ( min-resolution: 2dppx) { background-size: 10px; } /* Nested media queries */ .lead { @media (width: 768px) { font-size: 21px; } } .one { @media (width: 400px){ font-size: 1.2em; @media print and (color) { color: blue; } } } .two { @media (width: 400px){ font-size: 1.2em; } @media print and (color) { color: blue; } width: 100px; } .visible { @media print { color: green; } &.visible-sm { @media screen { color: green; } } } .navbar { .form { @media (max-width: 10px) { margin-bottom: 5px; } } } lesscpy-0.13.0/test/less/colors.less0000644000175000017500000001036613115557313016471 0ustar totoltotol/* Less colors */ #yellow { #short { color: #fea; } #long { color: #ffeeaa; } } #blue { #short { color: #00f; } #long { color: #0000ff; } } #overflow { .a { color: #111111 - #444444; } // #000000 .b { color: #eee + #fff; } // #ffffff .c { color: #aaa * 3; } // #ffffff .d { color: #00ee00 + #009900; } // #00ff00 } #grey { color: rgb(200, 200, 200); } /* Colors as ID's */ #808080 { color: hsl(50, 0%, 50%); } #00ff00 { color: hsl(120, 100%, 50%); } /* color functions */ .hsl { color: hsl(0, 100%, 100%); color: hsl(100, 100%, 100%); color: hsl(0, 0%, 0%); color: hsl(100, 0%, 0%); } .saturate { color: saturate(#555, 1%); color: saturate(#555, 10%); color: saturate(#555, 20%); color: saturate(#555, 40%); color: saturate(#555, 60%); color: saturate(#555, 100%); color: saturate(#000, 100%); color: saturate(#000, 0%); color: saturate(#fff, 100%); color: saturate(#fff, 0%); color: saturate(#29332f, 1%); color: saturate(#29332f, 10%); color: saturate(#29332f, 20%); color: saturate(#29332f, 40%); color: saturate(#29332f, 60%); color: saturate(#29332f, 100%); } .desaturate { color: desaturate(#555, 1%); color: desaturate(#555, 10%); color: desaturate(#555, 20%); color: desaturate(#555, 40%); color: desaturate(#555, 60%); color: desaturate(#555, 100%); color: desaturate(#000, 100%); color: desaturate(#000, 0%); color: desaturate(#fff, 100%); color: desaturate(#fff, 0%); color: desaturate(#29332f, 1%); color: desaturate(#29332f, 10%); color: desaturate(#29332f, 20%); color: desaturate(#29332f, 40%); color: desaturate(#29332f, 60%); color: desaturate(#29332f, 100%); } .lighten { color: lighten(#555, 1%); color: lighten(#555, 10%); color: lighten(#555, 20%); color: lighten(#555, 40%); color: lighten(#555, 60%); color: lighten(#555, 100%); color: lighten(#000, 100%); color: lighten(#000, 0%); color: lighten(#fff, 100%); color: lighten(#fff, 0%); color: lighten(#29332f, 1%); color: lighten(#29332f, 10%); color: lighten(#29332f, 20%); color: lighten(#29332f, 40%); color: lighten(#29332f, 60%); color: lighten(#29332f, 100%); } .darken { color: darken(#555, 1%); color: darken(#555, 10%); color: darken(#555, 20%); color: darken(#555, 40%); color: darken(#555, 60%); color: darken(#555, 100%); color: darken(#000, 100%); color: darken(#000, 0%); color: darken(#fff, 100%); color: darken(#fff, 0%); color: darken(#29332f, 1%); color: darken(#29332f, 10%); color: darken(#29332f, 20%); color: darken(#29332f, 40%); color: darken(#29332f, 60%); color: darken(#29332f, 100%); } .spin { color: spin(#555, 1); color: spin(#555, -10); color: spin(#555, 20); color: spin(#555, -40); color: spin(#555, 60); color: spin(#555, -100); color: spin(#000, 100); color: spin(#000, 0); color: spin(#fff, 100); color: spin(#fff, 0); color: spin(#29332f, 1); color: spin(#29332f, -10); color: spin(#29332f, 20); color: spin(#29332f, -40); color: spin(#29332f, 60); color: spin(#29332f, 100); } .greyscale { color: greyscale(#000, 100%); color: greyscale(#000, 0%); color: greyscale(#fff, 100%); color: greyscale(#fff, 0%); color: greyscale(#29332f, 1%); color: greyscale(#29332f, 10%); color: greyscale(#29332f, 20%); color: greyscale(#29332f, 40%); color: greyscale(#29332f, 60%); color: greyscale(#29332f, 100%); } .mix { color: mix(#f00, #00f); color: mix(#f00, #0ff); color: mix(#f70, #0aa); color: mix(#f00, #00f, 25%); color: mix(#f00, #00f, 100%); color: mix(#f00, #00f, 0%); } /* Variables */ @base: #f04615; .vars { color: saturate(@base, 5%); background-color: lighten(spin(@base, 8), 25%); @new: hsl(hue(@base), 45%, 90%); color: @new; } /* Color names */ .names { color: red; color: darken(blue, 10%); } .alpha { color: rgb(200, 200, 200, 100); color: rgb(201, 200, 200, 0.5); color: rgb(202, 200, 200, 0.0); color: rgba(200, 201, 200, 100); color: rgba(201, 200, 200, 0.5); color: rgba(202, 200, 200, 0.0); color: rgba(0, 0, 0, 0.0); color: rgba(1, 0, 0, 0); color: rgba(0%, 2%, 0%, 0%); } .fraction { color: darken(#29332f, 45.3%); color: lighten(#000, 93.5%); color: mix(#f00, #00f, 98.9%); color: spin(#29332f, 45.5); color: greyscale(#29332f, 98.5%); color: saturate(#29332f, 99.9%); color: desaturate(#555, 1.5%); } lesscpy-0.13.0/test/less/svg.less0000644000175000017500000000131613115557313015762 0ustar totoltotolsvg {color: red;} circle { stroke: #006600; fill: #00cc00; } circle .green { stroke: #006600; stroke-width: 9; fill: #00cc00; } rect { fill: blue; fill-opacity: 0.1; stroke: green; opacity: 0.5; } ellipse { fill: yellow; } line { stroke: red; } path { stroke: blue; } polygon { fill: lime; fill-rule: nonzero; } polygon { fill: lime; fill-rule: evenodd; } polyline { fill: none; } .node text { font: 12px sans-serif; } tref { font-weight: bold; } text tref { font-weight: bold; } tspan { font-weight: bold; } text tspan { font-weight: bold; } textPath { font-weight: bold; } text textPath { font-weight: bold; } svg text textPath { font-weight: bold; } lesscpy-0.13.0/test/less/mixin-args-local-calls.less0000644000175000017500000000151213115557313021423 0ustar totoltotol/* */ .a() { padding: 1px; .b() { padding: 2px; } .c() { .b(); } .d() { .a(); } } span { .a(); // 1px .a .b(); // 2px .a .c(); // 2px .a .d(); // 1px } /* Bootstrap style funkyness */ @gridColumnWidth: 20; @gridGutterWidth: 20; @gridColumns: 12; #grid { .input(@gridColumnWidthx, @gridGutterWidthx) { .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: ((@gridColumnWidthx) * @columns) + (@gridGutterWidthx * (@columns - 1)) - 10; } input, textarea, .uneditable-input { margin-left: 0; // override margin-left from core grid system } // generate .spanX .spanX (@gridColumns); } } #grid > .input (12, 20); lesscpy-0.13.0/test/less/strings.less0000644000175000017500000000127013115557313016653 0ustar totoltotol#strings { quotes: "~" "~"; content: "#*%:&^,)!.(~*})"; empty: ""; brackets: "{" "}"; } #comments { content: "/* hello */ // not-so-secret"; } #quotes { quotes: "'" "'"; quotes: '"' '"'; content: '""#!&""'; empty: ''; semi-colon: ';'; } #escaped { filter: ~"DX.Transform.MS.BS.filter(opacity=50)"; } .escaped { filter: ~'alpha(opacity=0.1)'; } #interpolation { @var: '/dev'; url: "http://lesscss.org@{var}/image.jpg"; @var2: 256; url2: "http://lesscss.org/image-@{var2}.jpg"; @var3: #456; url3: "http://lesscss.org@{var3}"; @var4: hello; url4: "http://lesscss.org/@{var4}"; @var5: 54.4px; url5: "http://lesscss.org/@{var5}"; } lesscpy-0.13.0/test/less/keyframes.less0000644000175000017500000000120613115557313017147 0ustar totoltotol// Webkit @-webkit-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } // Firefox @-moz-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } // Spec @keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } // using percentages @keyframes using-percentages { 0% { top: 0; } 50% { top: 1px; } 100% { top: 2px; } } // in a mix-in .keyframe-mixin() { from { left: 0; } 50% { left: 1px; } to { left: 2px; } } @keyframes mixed-in { .keyframe-mixin(); } lesscpy-0.13.0/test/test_bootstrap3.py0000644000175000017500000000115713115557313017041 0ustar totoltotol""" lesscpy bootstrap3 tests. """ import unittest from test.core import find_and_load_cases @unittest.skip("Minor semantic issues left") class Bootstrap3TestCase(unittest.TestCase): pass class Bootstrap3ThemeTestCase(unittest.TestCase): pass find_and_load_cases(Bootstrap3TestCase, less_dir='bootstrap3/less', less_files=['bootstrap'], css_dir='bootstrap3/css') find_and_load_cases(Bootstrap3ThemeTestCase, less_dir='bootstrap3/less', less_files=['theme'], css_dir='bootstrap3/css') lesscpy-0.13.0/test/test_parser.py0000644000175000017500000000157013115557313016234 0ustar totoltotol""" Unit test for the parser. """ import unittest from six import StringIO from lesscpy.lessc.parser import LessParser class TestLessParser(unittest.TestCase): """ Unit tests for LessParser. """ def setUp(self): self.parser = LessParser() def test_parse_stream(self): """ It can parse input from a file stream. """ stream = StringIO(""" @nice-blue: #5B83AD; """) self.parser.parse(file=stream) # A single object is parser which is the expected variable. self.assertEqual(1, len(self.parser.result)) # This is a stream without a name so it sets default name. self.assertEqual('(stream)', self.parser.target) variable = self.parser.result[0] self.assertEqual('@nice-blue', variable.name) self.assertEqual(['#5b83ad'], variable.value) lesscpy-0.13.0/test/__init__.py0000644000175000017500000000143613115557313015441 0ustar totoltotol""" lesscpy test runner. """ import os import re import sys import unittest here = os.path.dirname(__file__) path = os.path.abspath(here) while os.path.dirname(path) != path: if os.path.exists(os.path.join(path, 'lesscpy', '__init__.py')): sys.path.insert(0, path) break path = os.path.dirname(path) def find(): svn = re.compile('\.svn') test = re.compile('test.+\.py$') alltests = unittest.TestSuite() for path, _, files in os.walk(here): if svn.search(path): continue for f in files: if test.search(f): module = __import__(f.split('.')[0]) alltests.addTest(unittest.findTestCases(module)) return alltests if __name__ == '__main__': unittest.main(defaultTest='find') lesscpy-0.13.0/test/css/0000755000175000017500000000000013236067221014112 5ustar totoltotollesscpy-0.13.0/test/css/functions.min.css0000644000175000017500000000050113115557313017414 0ustar totoltotol#wrapper{background:url(images/photo-one.jpg);} body{counter-reset:paras 0;} p:before{counter-increment:paras 1;content:"New Paragraph: "counter(paras,decimal)": ";} @media print{a:after{content:" ("attr(href)") ";}} @media print{abbr:after{content:" ("attr(title)") ";}} a:hover:after{content:" Page: ("attr(href)") ";} lesscpy-0.13.0/test/css/mixin-args-recursive.min.css0000644000175000017500000000110713115557313021472 0ustar totoltotol.a .span12{width:276px;} .a .span11{width:252px;} .a .span10{width:228px;} .a .span9{width:204px;} .a .span8{width:180px;} .a .span7{width:156px;} .a .span6{width:132px;} .a .span5{width:108px;} .a .span4{width:84px;} .a .span3{width:60px;} .a .span2{width:36px;} .a .span1{width:12px;} .span3{width:60px;} .span2{width:36px;} .span1{width:12px;} .nested{padding:1px;} .nested .span3{width:60px;} .nested .span2{width:36px;} .nested .span1{width:12px;} .nested .deep{padding:1px;} .nested .deep .span3{width:60px;} .nested .deep .span2{width:36px;} .nested .deep .span1{width:12px;} lesscpy-0.13.0/test/css/mixin-args-recursive.css0000644000175000017500000000127213115557313020713 0ustar totoltotol.a .span12 { width: 276px; } .a .span11 { width: 252px; } .a .span10 { width: 228px; } .a .span9 { width: 204px; } .a .span8 { width: 180px; } .a .span7 { width: 156px; } .a .span6 { width: 132px; } .a .span5 { width: 108px; } .a .span4 { width: 84px; } .a .span3 { width: 60px; } .a .span2 { width: 36px; } .a .span1 { width: 12px; } .span3 { width: 60px; } .span2 { width: 36px; } .span1 { width: 12px; } .nested { padding: 1px; } .nested .span3 { width: 60px; } .nested .span2 { width: 36px; } .nested .span1 { width: 12px; } .nested .deep { padding: 1px; } .nested .deep .span3 { width: 60px; } .nested .deep .span2 { width: 36px; } .nested .deep .span1 { width: 12px; } lesscpy-0.13.0/test/css/colors.min.css0000644000175000017500000000417513115557313016720 0ustar totoltotol#yellow #short{color:#ffeeaa;} #yellow #long{color:#ffeeaa;} #blue #short{color:#0000ff;} #blue #long{color:#0000ff;} #overflow .a{color:#000000;} #overflow .b{color:#ffffff;} #overflow .c{color:#ffffff;} #overflow .d{color:#00ff00;} #grey{color:#c8c8c8;} #808080{color:#808080;} #00ff00{color:#00ff00;} .hsl{color:#ffffff;color:#ffffff;color:#000000;color:#000000;} .saturate{color:#565454;color:#5e4c4c;color:#664444;color:#773333;color:#882222;color:#aa0000;color:#000000;color:#000000;color:#ffffff;color:#ffffff;color:#29332f;color:#243830;color:#203c31;color:#174533;color:#0d4f35;color:#005c37;} .desaturate{color:#555555;color:#555555;color:#555555;color:#555555;color:#555555;color:#555555;color:#000000;color:#000000;color:#ffffff;color:#ffffff;color:#29332f;color:#2e2e2e;color:#2e2e2e;color:#2e2e2e;color:#2e2e2e;color:#2e2e2e;} .lighten{color:#585858;color:#6f6f6f;color:#888888;color:#bbbbbb;color:#eeeeee;color:#ffffff;color:#ffffff;color:#000000;color:#ffffff;color:#ffffff;color:#2b3632;color:#404f49;color:#566c63;color:#88a096;color:#c1cdc8;color:#ffffff;} .darken{color:#525252;color:#3b3b3b;color:#222222;color:#000000;color:#000000;color:#000000;color:#000000;color:#000000;color:#000000;color:#ffffff;color:#27302c;color:#121715;color:#000000;color:#000000;color:#000000;color:#000000;} .spin{color:#555555;color:#555555;color:#555555;color:#555555;color:#555555;color:#555555;color:#000000;color:#000000;color:#ffffff;color:#ffffff;color:#29332f;color:#29332d;color:#293332;color:#2a3329;color:#292d33;color:#2c2933;} .greyscale{color:#000000;color:#000000;color:#ffffff;color:#ffffff;color:#2e2e2e;color:#2e2e2e;color:#2e2e2e;color:#2e2e2e;color:#2e2e2e;color:#2e2e2e;} .mix{color:#7f007f;color:#7f7f7f;color:#7f9055;color:#3f00bf;color:#ff0000;color:#0000ff;} .vars{color:#f6430f;background-color:#f8b38d;color:#f1dfda;} .names{color:red;color:#0000cc;} .alpha{color:#c8c8c8;color:#c9c8c8;color:#cac8c8;color:#c8c9c8;color:rgba(201,200,200,0.5);color:rgba(202,200,200,0.0);color:rgba(0,0,0,0.0);color:rgba(1,0,0,0);color:rgba(0,5,0,0);} .fraction{color:#000000;color:#eeeeee;color:#fc0002;color:#292f33;color:#2e2e2e;color:#005c37;color:#555555;} lesscpy-0.13.0/test/css/elements.min.css0000644000175000017500000000000013115557313017212 0ustar totoltotollesscpy-0.13.0/test/css/nesting.css0000644000175000017500000001367713115557313016313 0ustar totoltotol.div { color: blue; } .div .nest { color: red; } .div .nest.deep { color: yellow; } .div .nest.deep .deeper { color: angry; } .div .nest.deep .deeper .deepest { color: purple; } h1 a:hover, h2 a:hover, h3 a:hover, h1 p:hover, h2 p:hover, h3 p:hover { color: red; } a.btn-small span { font-size: 10px; } a { color: red; } a:hover { color: blue; } div a { color: green; } p a span { color: yellow; } .foo .bar .qux, .foo .baz .qux { display: block; } .qux .foo .bar, .qux .foo .baz { display: inline; } .qux .foo .bar .biz, .qux .foo .baz .biz { display: none; } #first > .one { font-size: 2em; } #first > .one > #second .two > #deux { width: 50%; } #first > .one > #second .two > #deux #third { height: 100%; } #first > .one > #second .two > #deux #third:focus { color: black; } #first > .one > #second .two > #deux #third:focus #fifth > #sixth .seventh #eighth { color: purple; } #first > .one > #second .two > #deux #third:focus #fifth > #sixth .seventh #eighth + .sibling_selector { color: angry; } #first > .one > #second .two > #deux #third ~ p.general_sibling_selector { color: unused; } #first > .one > #second .two > #deux #fourth, #first > .one > #second .two > #deux #five, #first > .one > #second .two > #deux #six { color: #110000; } #first > .one > #second .two > #deux #fourth .seven, #first > .one > #second .two > #deux #five .seven, #first > .one > #second .two > #deux #six .seven, #first > .one > #second .two > #deux #fourth .eight > #nine, #first > .one > #second .two > #deux #five .eight > #nine, #first > .one > #second .two > #deux #six .eight > #nine { border: 1px solid black; } #first > .one > #second .two > #deux #fourth #ten, #first > .one > #second .two > #deux #five #ten, #first > .one > #second .two > #deux #six #ten { color: red; } h1 a .one:hover, h2 a .one:hover, h3 a .one:hover, h4 a .one:hover, h5 a .one:hover, h1 p .one:hover, h2 p .one:hover, h3 p .one:hover, h4 p .one:hover, h5 p .one:hover, h1 div .one:hover, h2 div .one:hover, h3 div .one:hover, h4 div .one:hover, h5 div .one:hover, h1 span .one:hover, h2 span .one:hover, h3 span .one:hover, h4 span .one:hover, h5 span .one:hover, h1 a .two:hover, h2 a .two:hover, h3 a .two:hover, h4 a .two:hover, h5 a .two:hover, h1 p .two:hover, h2 p .two:hover, h3 p .two:hover, h4 p .two:hover, h5 p .two:hover, h1 div .two:hover, h2 div .two:hover, h3 div .two:hover, h4 div .two:hover, h5 div .two:hover, h1 span .two:hover, h2 span .two:hover, h3 span .two:hover, h4 span .two:hover, h5 span .two:hover, h1 a .three:hover, h2 a .three:hover, h3 a .three:hover, h4 a .three:hover, h5 a .three:hover, h1 p .three:hover, h2 p .three:hover, h3 p .three:hover, h4 p .three:hover, h5 p .three:hover, h1 div .three:hover, h2 div .three:hover, h3 div .three:hover, h4 div .three:hover, h5 div .three:hover, h1 span .three:hover, h2 span .three:hover, h3 span .three:hover, h4 span .three:hover, h5 span .three:hover, h1 a .four:hover, h2 a .four:hover, h3 a .four:hover, h4 a .four:hover, h5 a .four:hover, h1 p .four:hover, h2 p .four:hover, h3 p .four:hover, h4 p .four:hover, h5 p .four:hover, h1 div .four:hover, h2 div .four:hover, h3 div .four:hover, h4 div .four:hover, h5 div .four:hover, h1 span .four:hover, h2 span .four:hover, h3 span .four:hover, h4 span .four:hover, h5 span .four:hover, h1 a .one:focus, h2 a .one:focus, h3 a .one:focus, h4 a .one:focus, h5 a .one:focus, h1 p .one:focus, h2 p .one:focus, h3 p .one:focus, h4 p .one:focus, h5 p .one:focus, h1 div .one:focus, h2 div .one:focus, h3 div .one:focus, h4 div .one:focus, h5 div .one:focus, h1 span .one:focus, h2 span .one:focus, h3 span .one:focus, h4 span .one:focus, h5 span .one:focus, h1 a .two:focus, h2 a .two:focus, h3 a .two:focus, h4 a .two:focus, h5 a .two:focus, h1 p .two:focus, h2 p .two:focus, h3 p .two:focus, h4 p .two:focus, h5 p .two:focus, h1 div .two:focus, h2 div .two:focus, h3 div .two:focus, h4 div .two:focus, h5 div .two:focus, h1 span .two:focus, h2 span .two:focus, h3 span .two:focus, h4 span .two:focus, h5 span .two:focus, h1 a .three:focus, h2 a .three:focus, h3 a .three:focus, h4 a .three:focus, h5 a .three:focus, h1 p .three:focus, h2 p .three:focus, h3 p .three:focus, h4 p .three:focus, h5 p .three:focus, h1 div .three:focus, h2 div .three:focus, h3 div .three:focus, h4 div .three:focus, h5 div .three:focus, h1 span .three:focus, h2 span .three:focus, h3 span .three:focus, h4 span .three:focus, h5 span .three:focus, h1 a .four:focus, h2 a .four:focus, h3 a .four:focus, h4 a .four:focus, h5 a .four:focus, h1 p .four:focus, h2 p .four:focus, h3 p .four:focus, h4 p .four:focus, h5 p .four:focus, h1 div .four:focus, h2 div .four:focus, h3 div .four:focus, h4 div .four:focus, h5 div .four:focus, h1 span .four:focus, h2 span .four:focus, h3 span .four:focus, h4 span .four:focus, h5 span .four:focus { display: block; } .child + .child, .child + .sibling, .sibling + .child, .sibling + .sibling { color: red; } .child + .child + .child, .child + .child + .sibling, .child + .sibling + .child, .child + .sibling + .sibling, .sibling + .child + .child, .sibling + .child + .sibling, .sibling + .sibling + .child, .sibling + .sibling + .sibling { color: red; } .child + .child + .child, .child + .child + .sibling, .child + .child + .foo, .child + .sibling + .child, .child + .sibling + .sibling, .child + .sibling + .foo, .child + .foo + .child, .child + .foo + .sibling, .child + .foo + .foo, .sibling + .child + .child, .sibling + .child + .sibling, .sibling + .child + .foo, .sibling + .sibling + .child, .sibling + .sibling + .sibling, .sibling + .sibling + .foo, .sibling + .foo + .child, .sibling + .foo + .sibling, .sibling + .foo + .foo, .foo + .child + .child, .foo + .child + .sibling, .foo + .child + .foo, .foo + .sibling + .child, .foo + .sibling + .sibling, .foo + .sibling + .foo, .foo + .foo + .child, .foo + .foo + .sibling, .foo + .foo + .foo { color: red; } .child + .child, .child + .sibling, .child + .foo, .sibling + .child, .sibling + .sibling, .sibling + .foo, .foo + .child, .foo + .sibling, .foo + .foo { color: red; } lesscpy-0.13.0/test/css/keyframes.css0000644000175000017500000000104213115557313016611 0ustar totoltotol@-webkit-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes using-percentages { 0% { top: 0; } 50% { top: 1px; } 100% { top: 2px; } } @keyframes mixed-in { from { left: 0; } 50% { left: 1px; } to { left: 2px; } } lesscpy-0.13.0/test/css/mixin-blocks.css0000644000175000017500000000274313115557313017233 0ustar totoltotol.mixin { direction: rtl; } #mixin { unicode-bidi: embed; } .bible-quote { direction: rtl; unicode-bidi: embed; } .nested_mixin_1 { letter-spacing: -1px; } .nested_mixin_1 #mixin { white-space: pre; } .nested { letter-spacing: -1px; } .nested #mixin { white-space: pre; } #nested_mixin_1 { color: red; } #nested_mixin_1 .mixin { color: yellow; } pre { color: red; } pre .mixin { color: yellow; } div.nest a:hover .deep p, div.nest a:focus .deep p { widows: 3; } .nest_deep a:hover .deep p, .nest_deep a:focus .deep p { widows: 3; } .mixout { border-color: orange; } .borders { border-style: dashed; } #namespace .borders { border-style: dotted; } #namespace .biohazard { content: "death"; } #namespace .biohazard .man { color: transparent; } #theme > .mixin { background-color: grey; } #container { color: black; border-color: orange; background-color: grey; } #header .milk { color: white; background-color: grey; } #header #cookie { border-style: dashed; } #header #cookie .chips { border-style: dotted; } #header #cookie .chips .calories { color: black; border-color: orange; background-color: grey; } .secure-zone { color: transparent; } .outer .inner { padding: 3px; } .tx { padding: 3px; padding: 3px; } .clear { padding: -100px; } .clear:before { display: table; content: ""; } .fallback { margin: 2px; padding: -100px; } .fallback:before { display: table; content: ""; } .row { margin: 2px; padding: -100px; } .row:before { display: table; content: ""; } lesscpy-0.13.0/test/css/ws.css0000644000175000017500000000107713115557313015264 0ustar totoltotol.whitespace { color: white; } .whitespace { color: blue; } .whitespace { color: green; } .whitespace { color: pink; } .whitespace { color: yellow; } .whitespace { color: black; } .white, .space, .mania { color: white; } .newlines { background: the, great, wall; border: 2px solid black; } .no_final_semi { color: white; } .no_final_semi1 { color: yellow; color: white; } @media all { html { padding: src('no semi in media block'); } } @font-face { src: url('x') format('e'), url('r') format('s'); } fieldset[disabled] .form-control { cursor: not-allowed; } lesscpy-0.13.0/test/css/mixin-closure.min.css0000644000175000017500000000010713115557313020204 0ustar totoltotol.class{width:99px;} .overwrite{width:99px;} .nested .class{width:5px;} lesscpy-0.13.0/test/css/properties-vendor.css0000644000175000017500000000053613115557313020321 0ustar totoltotoldiv.vendor { -moz-transform: translate(0,11em)rotate(-90deg); -webkit-animation: anim2 7s infinite ease-in-out; } div.long { -moz-box-shadow: 0pt 0pt 2px rgba(255,255,255,0.4)inset, 0pt 4px 6px rgba(255,255,255,0.4)inset; } div.styles { display: -moz-inline-stack; background: -webkit-gradient(linear,left top,left bottom,from(red),to(blue)); } lesscpy-0.13.0/test/css/mixin-args-guards.min.css0000644000175000017500000000044213115557313020751 0ustar totoltotol.a{width:1px;height:-1px;padding:0;padding:0;padding:0;} .b{margin:11;margin:-11;} .c{height:5px;width:5px;} .d{src:'mobile';padding:1px;} .e{width:9px;color:yellow;src:'http://www.lesscss.org/#-parametric-mixins';filter:'wtf';ignore:when;} .f{width:9px;height:-9px;} .a .span5{width:5px;} lesscpy-0.13.0/test/css/expressions.css0000644000175000017500000000152713115557313017215 0ustar totoltotol#operations { color: #111111; color: #111111; height: 9px; width: 3em; text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; substraction: 0; division: 1; } #operations .spacing { height: 9px; width: 3em; } .with-variables { height: 16em; width: 24em; size: 1cm; } .negative { height: 0; width: 4px; } a { width: 48px; } .shorthands { padding: -1px 2px 0 -4px; } .colors { color: #112233; border-color: #334455; background-color: #000000; } .colors .other { color: #222222; border-color: #222222; } .parens { border: 2px solid black; margin: 1px 3px 16 3; width: 36; padding: 2px 36px; } .more-parens { padding: 8 4 4 4px; width: 96; height: 113; margin: 12; margin: 36 px; } .nested-parens { width: 71; height: 6; } .mixed-units { margin: 2px 4em 1 5pc; padding: 6px 1em 2px 2; } .bm { padding: 0; } h1 { margin: 1px; } lesscpy-0.13.0/test/css/properties-vendor.min.css0000644000175000017500000000051013115557313021073 0ustar totoltotoldiv.vendor{-moz-transform:translate(0,11em)rotate(-90deg);-webkit-animation:anim2 7s infinite ease-in-out;} div.long{-moz-box-shadow:0pt 0pt 2px rgba(255,255,255,0.4)inset,0pt 4px 6px rgba(255,255,255,0.4)inset;} div.styles{display:-moz-inline-stack;background:-webkit-gradient(linear,left top,left bottom,from(red),to(blue));} lesscpy-0.13.0/test/css/strings.css0000644000175000017500000000105513115557313016320 0ustar totoltotol#strings { quotes: "~""~"; content: "#*%:&^,)!.(~*})"; empty: ""; brackets: "{""}"; } #comments { content: "/* hello */ // not-so-secret"; } #quotes { quotes: "'""'"; quotes: '"''"'; content: '""#!&""'; empty: ''; semi-colon: ';'; } #escaped { filter: DX.Transform.MS.BS.filter(opacity=50); } .escaped { filter: alpha(opacity=0.1); } #interpolation { url: "http://lesscss.org/dev/image.jpg"; url2: "http://lesscss.org/image-256.jpg"; url3: "http://lesscss.org#445566"; url4: "http://lesscss.org/hello"; url5: "http://lesscss.org/54.4px"; } lesscpy-0.13.0/test/css/identifiers.css0000644000175000017500000000442413115557313017137 0ustar totoltotolp { color: red; } p span { display: inline; } * { min-width: 45em; } * html .div { height: 12px; } h1, h2 > a > p, h3 { color: none; } div.class { color: blue; } div#id { color: green; } .class#id { color: purple; } .one.two.three { color: grey; } .one .two .three { color: grey; } a:hover, a:link { color: #999999; } p + h1 { font-size: 2.2em; } p ~ h1 { color: yellow; } p, p:first-child { text-transform: none; } q:lang(no) { quotes: none; } p:not([class*="lead"]) { color: black; } input[type="text"].class#id[attr=32]:not(1) { color: white; } div#id.class[a=1][b=2].class:not(1) { color: white; } ul.comma > li:not(:only-child)::after { color: white; } ol.comma > li:nth-last-child(2)::after { color: white; } li:nth-child(4n+1), li:nth-child(-5n), li:nth-child(-n+2) { color: white; } a[href^="http://"] { color: black; } a[href$="http://"] { color: black; } a[href^="http://"] { color: black; } form[data-disabled] { color: black; } p::before { color: black; } :lang(en-us) > q { quotes: "\201c""\201d""\2018""\2019"; } :lang(en-gb) > q { quotes: "\2018""\2019""\201c""\201d"; } a.one, a.two, a.three, a.four, a.five, a.six, a.seven, a.eight, a.nine, a.ten { max-width: 12px; } a.longclassname.one, a.longclassname.two, a.longclassname.three, a.longclassname.four, a.longclassname.five, a.longclassname.six, a.longclassname.seven, a.longclassname.eight, a.longclassname.nine, a.longclassname.ten { max-height: 12px; } 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, 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, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { padding: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { padding: 0; } #f7 { color: #fff777; } .asterisk_last * { padding: 0; } .class_no_3 { padding: -3px; } .label-important, .badge-important { background-color: #ff0000; } .label-important[href], .badge-important[href] { background-color: #cc0000; } lesscpy-0.13.0/test/css/grid.min.css0000644000175000017500000000245713115557313016345 0ustar totoltotol.row{margin-left:-20px;} [class*="span"]{float:left;margin-left:20px;} .span1{width:60px;} .span2{width:140px;} .span3{width:220px;} .span4{width:300px;} .span5{width:380px;} .span6{width:460px;} .span7{width:540px;} .span8{width:620px;} .span9{width:700px;} .span10{width:780px;} .span11{width:860px;} .span12,.container{width:940px;} .offset1{margin-left:100px;} .offset2{margin-left:180px;} .offset3{margin-left:260px;} .offset4{margin-left:340px;} .offset5{margin-left:420px;} .offset6{margin-left:500px;} .offset7{margin-left:580px;} .offset8{margin-left:660px;} .offset9{margin-left:740px;} .offset10{margin-left:820px;} .offset11{margin-left:900px;} .row{margin-left:-1.7;} [class*="span"]{float:left;margin-left:1.7;} .span1{width:27;} .span2{width:55.7;} .span3{width:84.4;} .span4{width:113.1;} .span5{width:141.8;} .span6{width:170.5;} .span7{width:199.2;} .span8{width:227.9;} .span9{width:256.6;} .span10{width:285.3;} .span11{width:314;} .span12,.container{width:342.7;} .offset1{margin-left:30.4;} .offset2{margin-left:59.1;} .offset3{margin-left:87.80000000000001;} .offset4{margin-left:116.5;} .offset5{margin-left:145.20000000000002;} .offset6{margin-left:173.9;} .offset7{margin-left:202.6;} .offset8{margin-left:231.3;} .offset9{margin-left:260;} .offset10{margin-left:288.7;} .offset11{margin-left:317.4;} lesscpy-0.13.0/test/css/issues/0000755000175000017500000000000013236067221015425 5ustar totoltotollesscpy-0.13.0/test/css/issues/issue5.css0000644000175000017500000000004513115557313017355 0ustar totoltotol.test { border: #3b3b3b solid 1px; }lesscpy-0.13.0/test/css/issues/issue6.css0000644000175000017500000000012113115557313017351 0ustar totoltotol.reset { filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } lesscpy-0.13.0/test/css/issues/issue4.css0000644000175000017500000000005413115557313017354 0ustar totoltotol@media print { .mixin { color: red; } } lesscpy-0.13.0/test/css/issues/issue67.css0000644000175000017500000000002113115557313017437 0ustar totoltotol.c { left: 4; } lesscpy-0.13.0/test/css/issues/issue31.css0000644000175000017500000000011413115557313017431 0ustar totoltotola.color { color: rgba(0.0,0.0,0.0,0.5); color: rgba(10.0,10.0,10.0,0.0); }lesscpy-0.13.0/test/css/issues/issue30.css0000644000175000017500000000007413115557313017435 0ustar totoltotoltr:nth-child(odd) td, tr:nth-child(odd) th { color: red; } lesscpy-0.13.0/test/css/issues/issue3.css0000644000175000017500000000002713115557313017353 0ustar totoltotolsvg { padding: 50px; }lesscpy-0.13.0/test/css/mixin-args-undeclared.min.css0000644000175000017500000000004413115557313021570 0ustar totoltotol.a{padding:3px;} .mixin{color:red;} lesscpy-0.13.0/test/css/calls.min.css0000644000175000017500000000115613115557313016511 0ustar totoltotol#standard{width:16;height:undefined("self");border-width:5;variable:11;decrement:9;rounded:11;roundedpx:3px;round25:3;round15:2;} #escapes{escaped:-Some(#thing, y);escaped1:-Some(#thing,z);eformat:rgb(32, 128, 64);} #format{format:"rgb(32, 128, 64)";format-string:"hello world";format-multiple:"hello earth 2";format-url-encode:'red is %23ff0000';} #more{width:2px;height:1px;top:50%;} #colors{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#333333', GradientType=1);} a{background-image:linear-gradient(top,#ffffff,#333333);background-image:linear-gradient(top,#a6a6a6,#000000);} lesscpy-0.13.0/test/css/mixin-args-undeclared.css0000644000175000017500000000005613115557313021011 0ustar totoltotol.a { padding: 3px; } .mixin { color: red; } lesscpy-0.13.0/test/css/mixin-closure.css0000644000175000017500000000012613115557313017423 0ustar totoltotol.class { width: 99px; } .overwrite { width: 99px; } .nested .class { width: 5px; } lesscpy-0.13.0/test/css/properties-uri.css0000644000175000017500000000202613115557313017617 0ustar totoltotol#data-uri { background: url(data:image/png;charset=utf-8;base64, kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC); background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==); } #svg-data-uri { background: transparent url('data:image/svg+xml, '); } .uri_test { background-image: url(images/image.jpg); background-image: url(../some/path); background-image: url(./../some/path); background-image: url(./images/image.jpg); background-image: url(http://some/path/img.jpeg); background-image: url(https://some.server.com:9696/path/img.jpeg); behavior: url(border-radius.htc); background-image: url(fonts.svg#MyGeometricModern); image: url(http://), "}", url("http://}"); image: url(http://tooks.com); background: url(/static/dashboard/img/search.png) no-repeat 195px 5px; } .uri_2 { background-image: url('images/image.jpg') top left repeat-x #002e55; } lesscpy-0.13.0/test/css/media.min.css0000644000175000017500000000225013115557313016466 0ustar totoltotol@media screen,projection{html{background:#fffef0;color:#330000;} body{max-width:35em;margin:0 auto;}} @media print{.class{color:blue;} .class .sub{width:42;} .top,header>h1{color:#444444;}} @media screen{body{max-width:480;}} @media all and (orientation:portrait){aside{float:none;}} @media not screen and (color),print and (color){body{margin:0 auto;}} @media (min-width:768px)and (max-width:979px){.hidden-desktop{display:none !important;}} @media (min-width:12px){body{margin:0 auto;}} @media (width:767px){.visible-xs{display:block;}} @media only screen and (min--moz-device-pixel-ratio:2.5),only screen and (-o-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){background-size:10px;} @media (width:768px){.lead{font-size:21px;}} @media (width:400px){.one{font-size:1.2em;}} @media (width:400px) and print and (color){.one{color:blue;}} .two{width:100px;} @media (width:400px){.two{font-size:1.2em;}} @media print and (color){.two{color:blue;}} @media print{.visible{color:green;}} @media screen{.visible.visible-sm{color:green;}} @media (max-width:10px){.navbar .form{margin-bottom:5px;}} lesscpy-0.13.0/test/css/properties.min.css0000644000175000017500000000132113115557313017601 0ustar totoltotoldiv.properties{color:red;} div.empty{margin:;} div.important{color:red !important;width:100% !important;height:20px !important;} div.annoying_font_property{font:12px/16px Arial;font:100%/16px Arial;font:normal small/20px 'Trebuchet MS',Verdana,sans-serif;} div.shorthands{border:1px solid #000000;margin:1px 0;padding:0 auto;padding:1px 0 2px 0;margin:0;padding:-1px -0 -2px -0;} table{counter-reset:group;} tbody{counter-increment:group;counter-reset:row;} tbody tr{counter-increment:row;} tbody td:first-child:before{content:counter(group,upper-latin)"."counter(row);} .escape\|random\|char{color:red;} .mixin\!tUp{font-weight:bold;} .trailingTest\+{color:red;} .sr-only{clip:rect(0 0 0 0);} .font-madness{font:0/0 a;} lesscpy-0.13.0/test/css/ws.min.css0000644000175000017500000000075513115557313016050 0ustar totoltotol.whitespace{color:white;} .whitespace{color:blue;} .whitespace{color:green;} .whitespace{color:pink;} .whitespace{color:yellow;} .whitespace{color:black;} .white,.space,.mania{color:white;} .newlines{background:the,great,wall;border:2px solid black;} .no_final_semi{color:white;} .no_final_semi1{color:yellow;color:white;} @media all{html{padding:src('no semi in media block');}} @font-face{src:url('x') format('e'),url('r') format('s');} fieldset[disabled] .form-control{cursor:not-allowed;} lesscpy-0.13.0/test/css/functions.css0000644000175000017500000000055613115557313016644 0ustar totoltotol#wrapper { background: url(images/photo-one.jpg); } body { counter-reset: paras 0; } p:before { counter-increment: paras 1; content: "New Paragraph: "counter(paras,decimal)": "; } @media print { a:after { content: " ("attr(href)") "; } } @media print { abbr:after { content: " ("attr(title)") "; } } a:hover:after { content: " Page: ("attr(href)") "; } lesscpy-0.13.0/test/css/escapes.css0000644000175000017500000000021413115557313016246 0ustar totoltotol.escape\|random\|char { color: red; } .mixin\!tUp { font-weight: bold; } .trailingTest\+ { color: red; } .font-madness { font: 0/0 a; } lesscpy-0.13.0/test/css/viewport.min.css0000644000175000017500000000010213115557313017260 0ustar totoltotol@-ms-viewport{width:device-width;} @viewport{width:device-width;} lesscpy-0.13.0/test/css/page.css0000644000175000017500000000016113115557313015540 0ustar totoltotol@page { margin: 2.5cm; } @page { margin-left: 5cm; } @page { margin-right: 5cm; } @page { margin-top: 8cm; } lesscpy-0.13.0/test/css/media.css0000644000175000017500000000260613115557313015711 0ustar totoltotol@media screen,projection { html { background: #fffef0; color: #330000; } body { max-width: 35em; margin: 0 auto; } } @media print { .class { color: blue; } .class .sub { width: 42; } .top, header > h1 { color: #444444; } } @media screen { body { max-width: 480; } } @media all and (orientation:portrait) { aside { float: none; } } @media not screen and (color),print and (color) { body { margin: 0 auto; } } @media (min-width:768px)and (max-width:979px) { .hidden-desktop { display: none !important; } } @media (min-width:12px) { body { margin: 0 auto; } } @media (width:767px) { .visible-xs { display: block; } } @media only screen and (min--moz-device-pixel-ratio:2.5),only screen and (-o-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx) { background-size: 10px; } @media (width:768px) { .lead { font-size: 21px; } } @media (width:400px) { .one { font-size: 1.2em; } } @media (width:400px) and print and (color) { .one { color: blue; } } .two { width: 100px; } @media (width:400px) { .two { font-size: 1.2em; } } @media print and (color) { .two { color: blue; } } @media print { .visible { color: green; } } @media screen { .visible.visible-sm { color: green; } } @media (max-width:10px) { .navbar .form { margin-bottom: 5px; } } lesscpy-0.13.0/test/css/mixin-args-local-calls.css0000644000175000017500000000171113115557313021070 0ustar totoltotolspan { padding: 1px; padding: 2px; padding: 2px; padding: 1px; } input, textarea, .uneditable-input { margin-left: 0; } input.span12, textarea.span12, .uneditable-input.span12 { width: 354; } input.span11, textarea.span11, .uneditable-input.span11 { width: 322; } input.span10, textarea.span10, .uneditable-input.span10 { width: 290; } input.span9, textarea.span9, .uneditable-input.span9 { width: 258; } input.span8, textarea.span8, .uneditable-input.span8 { width: 226; } input.span7, textarea.span7, .uneditable-input.span7 { width: 194; } input.span6, textarea.span6, .uneditable-input.span6 { width: 162; } input.span5, textarea.span5, .uneditable-input.span5 { width: 130; } input.span4, textarea.span4, .uneditable-input.span4 { width: 98; } input.span3, textarea.span3, .uneditable-input.span3 { width: 66; } input.span2, textarea.span2, .uneditable-input.span2 { width: 34; } input.span1, textarea.span1, .uneditable-input.span1 { width: 2; } lesscpy-0.13.0/test/css/mixin-blocks.min.css0000644000175000017500000000242613115557313020013 0ustar totoltotol.mixin{direction:rtl;} #mixin{unicode-bidi:embed;} .bible-quote{direction:rtl;unicode-bidi:embed;} .nested_mixin_1{letter-spacing:-1px;} .nested_mixin_1 #mixin{white-space:pre;} .nested{letter-spacing:-1px;} .nested #mixin{white-space:pre;} #nested_mixin_1{color:red;} #nested_mixin_1 .mixin{color:yellow;} pre{color:red;} pre .mixin{color:yellow;} div.nest a:hover .deep p,div.nest a:focus .deep p{widows:3;} .nest_deep a:hover .deep p,.nest_deep a:focus .deep p{widows:3;} .mixout{border-color:orange;} .borders{border-style:dashed;} #namespace .borders{border-style:dotted;} #namespace .biohazard{content:"death";} #namespace .biohazard .man{color:transparent;} #theme>.mixin{background-color:grey;} #container{color:black;border-color:orange;background-color:grey;} #header .milk{color:white;background-color:grey;} #header #cookie{border-style:dashed;} #header #cookie .chips{border-style:dotted;} #header #cookie .chips .calories{color:black;border-color:orange;background-color:grey;} .secure-zone{color:transparent;} .outer .inner{padding:3px;} .tx{padding:3px;padding:3px;} .clear{padding:-100px;} .clear:before{display:table;content:"";} .fallback{margin:2px;padding:-100px;} .fallback:before{display:table;content:"";} .row{margin:2px;padding:-100px;} .row:before{display:table;content:"";} lesscpy-0.13.0/test/css/argb.css0000644000175000017500000000032713115557313015543 0ustar totoltotol.well { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555 '); color: rgba(90,23,148,0.5); color: #ff646464; color: #ff8c6464; color: #ff5a1794; color: #805a1794; color: #ff555555; } lesscpy-0.13.0/test/css/imports.min.css0000644000175000017500000000060713115557313017110 0ustar totoltotol@import 'some.css.file.css'; @import 'some/other.css.file.CSS'; @import 'some.css' all; @import "some.print.css" print; .foo{color:blue;} .mixin{color:red;} .mixin{color:red;} .import{color:red;width:6px;height:9px;} @import "styles.css"; @import url("styles.css"); @import url("druck.css") print; @import url("foo.css") projection,tv; @import url("bar.css") handheld and (max-width:500px); lesscpy-0.13.0/test/css/argb.min.css0000644000175000017500000000030013115557313016314 0ustar totoltotol.well{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555 ');color:rgba(90,23,148,0.5);color:#ff646464;color:#ff8c6464;color:#ff5a1794;color:#805a1794;color:#ff555555;} lesscpy-0.13.0/test/css/comments.min.css0000644000175000017500000000035513115557313017240 0ustar totoltotol#comments{color:red;background-color:orange;font-size:12px;content:"content";border:1px solid black;padding:0;margin:2em;} .selector,.lots,.comments{color:grey,orange;-webkit-border-radius:2px;-moz-border-radius:8px;} #last{color:blue;} lesscpy-0.13.0/test/css/nesting.min.css0000644000175000017500000001246013115557313017062 0ustar totoltotol.div{color:blue;} .div .nest{color:red;} .div .nest.deep{color:yellow;} .div .nest.deep .deeper{color:angry;} .div .nest.deep .deeper .deepest{color:purple;} h1 a:hover,h2 a:hover,h3 a:hover,h1 p:hover,h2 p:hover,h3 p:hover{color:red;} a.btn-small span{font-size:10px;} a{color:red;} a:hover{color:blue;} div a{color:green;} p a span{color:yellow;} .foo .bar .qux,.foo .baz .qux{display:block;} .qux .foo .bar,.qux .foo .baz{display:inline;} .qux .foo .bar .biz,.qux .foo .baz .biz{display:none;} #first>.one{font-size:2em;} #first>.one>#second .two>#deux{width:50%;} #first>.one>#second .two>#deux #third{height:100%;} #first>.one>#second .two>#deux #third:focus{color:black;} #first>.one>#second .two>#deux #third:focus #fifth>#sixth .seventh #eighth{color:purple;} #first>.one>#second .two>#deux #third:focus #fifth>#sixth .seventh #eighth+.sibling_selector{color:angry;} #first>.one>#second .two>#deux #third~p.general_sibling_selector{color:unused;} #first>.one>#second .two>#deux #fourth,#first>.one>#second .two>#deux #five,#first>.one>#second .two>#deux #six{color:#110000;} #first>.one>#second .two>#deux #fourth .seven,#first>.one>#second .two>#deux #five .seven,#first>.one>#second .two>#deux #six .seven,#first>.one>#second .two>#deux #fourth .eight>#nine,#first>.one>#second .two>#deux #five .eight>#nine,#first>.one>#second .two>#deux #six .eight>#nine{border:1px solid black;} #first>.one>#second .two>#deux #fourth #ten,#first>.one>#second .two>#deux #five #ten,#first>.one>#second .two>#deux #six #ten{color:red;} h1 a .one:hover,h2 a .one:hover,h3 a .one:hover,h4 a .one:hover,h5 a .one:hover,h1 p .one:hover,h2 p .one:hover,h3 p .one:hover,h4 p .one:hover,h5 p .one:hover,h1 div .one:hover,h2 div .one:hover,h3 div .one:hover,h4 div .one:hover,h5 div .one:hover,h1 span .one:hover,h2 span .one:hover,h3 span .one:hover,h4 span .one:hover,h5 span .one:hover,h1 a .two:hover,h2 a .two:hover,h3 a .two:hover,h4 a .two:hover,h5 a .two:hover,h1 p .two:hover,h2 p .two:hover,h3 p .two:hover,h4 p .two:hover,h5 p .two:hover,h1 div .two:hover,h2 div .two:hover,h3 div .two:hover,h4 div .two:hover,h5 div .two:hover,h1 span .two:hover,h2 span .two:hover,h3 span .two:hover,h4 span .two:hover,h5 span .two:hover,h1 a .three:hover,h2 a .three:hover,h3 a .three:hover,h4 a .three:hover,h5 a .three:hover,h1 p .three:hover,h2 p .three:hover,h3 p .three:hover,h4 p .three:hover,h5 p .three:hover,h1 div .three:hover,h2 div .three:hover,h3 div .three:hover,h4 div .three:hover,h5 div .three:hover,h1 span .three:hover,h2 span .three:hover,h3 span .three:hover,h4 span .three:hover,h5 span .three:hover,h1 a .four:hover,h2 a .four:hover,h3 a .four:hover,h4 a .four:hover,h5 a .four:hover,h1 p .four:hover,h2 p .four:hover,h3 p .four:hover,h4 p .four:hover,h5 p .four:hover,h1 div .four:hover,h2 div .four:hover,h3 div .four:hover,h4 div .four:hover,h5 div .four:hover,h1 span .four:hover,h2 span .four:hover,h3 span .four:hover,h4 span .four:hover,h5 span .four:hover,h1 a .one:focus,h2 a .one:focus,h3 a .one:focus,h4 a .one:focus,h5 a .one:focus,h1 p .one:focus,h2 p .one:focus,h3 p .one:focus,h4 p .one:focus,h5 p .one:focus,h1 div .one:focus,h2 div .one:focus,h3 div .one:focus,h4 div .one:focus,h5 div .one:focus,h1 span .one:focus,h2 span .one:focus,h3 span .one:focus,h4 span .one:focus,h5 span .one:focus,h1 a .two:focus,h2 a .two:focus,h3 a .two:focus,h4 a .two:focus,h5 a .two:focus,h1 p .two:focus,h2 p .two:focus,h3 p .two:focus,h4 p .two:focus,h5 p .two:focus,h1 div .two:focus,h2 div .two:focus,h3 div .two:focus,h4 div .two:focus,h5 div .two:focus,h1 span .two:focus,h2 span .two:focus,h3 span .two:focus,h4 span .two:focus,h5 span .two:focus,h1 a .three:focus,h2 a .three:focus,h3 a .three:focus,h4 a .three:focus,h5 a .three:focus,h1 p .three:focus,h2 p .three:focus,h3 p .three:focus,h4 p .three:focus,h5 p .three:focus,h1 div .three:focus,h2 div .three:focus,h3 div .three:focus,h4 div .three:focus,h5 div .three:focus,h1 span .three:focus,h2 span .three:focus,h3 span .three:focus,h4 span .three:focus,h5 span .three:focus,h1 a .four:focus,h2 a .four:focus,h3 a .four:focus,h4 a .four:focus,h5 a .four:focus,h1 p .four:focus,h2 p .four:focus,h3 p .four:focus,h4 p .four:focus,h5 p .four:focus,h1 div .four:focus,h2 div .four:focus,h3 div .four:focus,h4 div .four:focus,h5 div .four:focus,h1 span .four:focus,h2 span .four:focus,h3 span .four:focus,h4 span .four:focus,h5 span .four:focus{display:block;} .child+.child,.child+.sibling,.sibling+.child,.sibling+.sibling{color:red;} .child+.child+.child,.child+.child+.sibling,.child+.sibling+.child,.child+.sibling+.sibling,.sibling+.child+.child,.sibling+.child+.sibling,.sibling+.sibling+.child,.sibling+.sibling+.sibling{color:red;} .child+.child+.child,.child+.child+.sibling,.child+.child+.foo,.child+.sibling+.child,.child+.sibling+.sibling,.child+.sibling+.foo,.child+.foo+.child,.child+.foo+.sibling,.child+.foo+.foo,.sibling+.child+.child,.sibling+.child+.sibling,.sibling+.child+.foo,.sibling+.sibling+.child,.sibling+.sibling+.sibling,.sibling+.sibling+.foo,.sibling+.foo+.child,.sibling+.foo+.sibling,.sibling+.foo+.foo,.foo+.child+.child,.foo+.child+.sibling,.foo+.child+.foo,.foo+.sibling+.child,.foo+.sibling+.sibling,.foo+.sibling+.foo,.foo+.foo+.child,.foo+.foo+.sibling,.foo+.foo+.foo{color:red;} .child+.child,.child+.sibling,.child+.foo,.sibling+.child,.sibling+.sibling,.sibling+.foo,.foo+.child,.foo+.sibling,.foo+.foo{color:red;} lesscpy-0.13.0/test/css/elements.css0000644000175000017500000000000013115557313016430 0ustar totoltotollesscpy-0.13.0/test/css/mixin-args.min.css0000644000175000017500000000152013115557313017464 0ustar totoltotol#basic{line-height:3px;line-height:6px;} .idbasic{line-height:3px;line-height:6px;} #args{color:red;width:1px;} #args_locals{color:green;width:3px;} #local{padding:0;color:red;} .scope-mix{width:8;} #hidden{color:transparent;color:transparent;} .both{width:15px;height:19%;} .one-arg{width:15px;height:49%;} .no-parens{width:5px;height:49%;} .no-args{width:5px;height:49%;} .arguments{border:1px solid black;} .arguments2{border:1px;} .arguments3{border:0px;} .arguments3{border:1px solid red;} .arguments4{border:1px solid red;} .div :-moz-placeholder{color:#ffffff;} .div::-webkit-input-placeholder{color:#ffffff;} .arglist{-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25);-moz-box-shadow:0 1px 3px rgba(0,0,0,.25);box-shadow:0 1px 3px rgba(0,0,0,.25);} .a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} lesscpy-0.13.0/test/css/mixin-args-local-calls.min.css0000644000175000017500000000154013115557313021652 0ustar totoltotolspan{padding:1px;padding:2px;padding:2px;padding:1px;} input,textarea,.uneditable-input{margin-left:0;} input.span12,textarea.span12,.uneditable-input.span12{width:354;} input.span11,textarea.span11,.uneditable-input.span11{width:322;} input.span10,textarea.span10,.uneditable-input.span10{width:290;} input.span9,textarea.span9,.uneditable-input.span9{width:258;} input.span8,textarea.span8,.uneditable-input.span8{width:226;} input.span7,textarea.span7,.uneditable-input.span7{width:194;} input.span6,textarea.span6,.uneditable-input.span6{width:162;} input.span5,textarea.span5,.uneditable-input.span5{width:130;} input.span4,textarea.span4,.uneditable-input.span4{width:98;} input.span3,textarea.span3,.uneditable-input.span3{width:66;} input.span2,textarea.span2,.uneditable-input.span2{width:34;} input.span1,textarea.span1,.uneditable-input.span1{width:2;} lesscpy-0.13.0/test/css/variables.min.css0000644000175000017500000000132113115557313017355 0ustar totoltotol.variables{width:14cm;} .variables{height:24px;color:#888888;font-family:"Trebuchet MS",Verdana,sans-serif;quotes:"~""~";} .redefinition{three:3;} .values{font-family:'Trebuchet','Trebuchet','Trebuchet';color:#888888 !important;url:url('Trebuchet');multi:something 'A',B,C,'Trebuchet';} .variable-names{name:'hello';} .alpha{filter:alpha(opacity=42);} .lazy-eval{width:100%;} .scope1{color:blue;border-color:black;} .scope1 .scope2{color:blue;} .scope1 .scope2 .scope3{color:red;border-color:black;background-color:white;} .scope1 .scope2 .scope3 .scope4{color:black;} .negvar{padding:-1px;} .varpad{border-left:1px solid transparent;border-right:1px solid transparent;border-top:1px solid black;} .testname{width:12px;} lesscpy-0.13.0/test/css/keyframes.min.css0000644000175000017500000000066313115557313017403 0ustar totoltotol@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}} @-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}} @keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}} @keyframes using-percentages{0%{top:0;} 50%{top:1px;} 100%{top:2px;}} @keyframes mixed-in{from{left:0;} 50%{left:1px;} to{left:2px;}} lesscpy-0.13.0/test/css/colors.css0000644000175000017500000000506713115557313016137 0ustar totoltotol#yellow #short { color: #ffeeaa; } #yellow #long { color: #ffeeaa; } #blue #short { color: #0000ff; } #blue #long { color: #0000ff; } #overflow .a { color: #000000; } #overflow .b { color: #ffffff; } #overflow .c { color: #ffffff; } #overflow .d { color: #00ff00; } #grey { color: #c8c8c8; } #808080 { color: #808080; } #00ff00 { color: #00ff00; } .hsl { color: #ffffff; color: #ffffff; color: #000000; color: #000000; } .saturate { color: #565454; color: #5e4c4c; color: #664444; color: #773333; color: #882222; color: #aa0000; color: #000000; color: #000000; color: #ffffff; color: #ffffff; color: #29332f; color: #243830; color: #203c31; color: #174533; color: #0d4f35; color: #005c37; } .desaturate { color: #555555; color: #555555; color: #555555; color: #555555; color: #555555; color: #555555; color: #000000; color: #000000; color: #ffffff; color: #ffffff; color: #29332f; color: #2e2e2e; color: #2e2e2e; color: #2e2e2e; color: #2e2e2e; color: #2e2e2e; } .lighten { color: #585858; color: #6f6f6f; color: #888888; color: #bbbbbb; color: #eeeeee; color: #ffffff; color: #ffffff; color: #000000; color: #ffffff; color: #ffffff; color: #2b3632; color: #404f49; color: #566c63; color: #88a096; color: #c1cdc8; color: #ffffff; } .darken { color: #525252; color: #3b3b3b; color: #222222; color: #000000; color: #000000; color: #000000; color: #000000; color: #000000; color: #000000; color: #ffffff; color: #27302c; color: #121715; color: #000000; color: #000000; color: #000000; color: #000000; } .spin { color: #555555; color: #555555; color: #555555; color: #555555; color: #555555; color: #555555; color: #000000; color: #000000; color: #ffffff; color: #ffffff; color: #29332f; color: #29332d; color: #293332; color: #2a3329; color: #292d33; color: #2c2933; } .greyscale { color: #000000; color: #000000; color: #ffffff; color: #ffffff; color: #2e2e2e; color: #2e2e2e; color: #2e2e2e; color: #2e2e2e; color: #2e2e2e; color: #2e2e2e; } .mix { color: #7f007f; color: #7f7f7f; color: #7f9055; color: #3f00bf; color: #ff0000; color: #0000ff; } .vars { color: #f6430f; background-color: #f8b38d; color: #f1dfda; } .names { color: red; color: #0000cc; } .alpha { color: #c8c8c8; color: #c9c8c8; color: #cac8c8; color: #c8c9c8; color: rgba(201,200,200,0.5); color: rgba(202,200,200,0.0); color: rgba(0,0,0,0.0); color: rgba(1,0,0,0); color: rgba(0,5,0,0); } .fraction { color: #000000; color: #eeeeee; color: #fc0002; color: #292f33; color: #2e2e2e; color: #005c37; color: #555555; } lesscpy-0.13.0/test/css/variables.css0000644000175000017500000000147713115557313016607 0ustar totoltotol.variables { width: 14cm; } .variables { height: 24px; color: #888888; font-family: "Trebuchet MS", Verdana, sans-serif; quotes: "~""~"; } .redefinition { three: 3; } .values { font-family: 'Trebuchet', 'Trebuchet', 'Trebuchet'; color: #888888 !important; url: url('Trebuchet'); multi: something 'A', B, C, 'Trebuchet'; } .variable-names { name: 'hello'; } .alpha { filter: alpha(opacity=42); } .lazy-eval { width: 100%; } .scope1 { color: blue; border-color: black; } .scope1 .scope2 { color: blue; } .scope1 .scope2 .scope3 { color: red; border-color: black; background-color: white; } .scope1 .scope2 .scope3 .scope4 { color: black; } .negvar { padding: -1px; } .varpad { border-left: 1px solid transparent; border-right: 1px solid transparent; border-top: 1px solid black; } .testname { width: 12px; } lesscpy-0.13.0/test/css/mixin-args.css0000644000175000017500000000173613115557313016713 0ustar totoltotol#basic { line-height: 3px; line-height: 6px; } .idbasic { line-height: 3px; line-height: 6px; } #args { color: red; width: 1px; } #args_locals { color: green; width: 3px; } #local { padding: 0; color: red; } .scope-mix { width: 8; } #hidden { color: transparent; color: transparent; } .both { width: 15px; height: 19%; } .one-arg { width: 15px; height: 49%; } .no-parens { width: 5px; height: 49%; } .no-args { width: 5px; height: 49%; } .arguments { border: 1px solid black; } .arguments2 { border: 1px; } .arguments3 { border: 0px; } .arguments3 { border: 1px solid red; } .arguments4 { border: 1px solid red; } .div :-moz-placeholder { color: #ffffff; } .div::-webkit-input-placeholder { color: #ffffff; } .arglist { -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25); -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25); box-shadow: 0 1px 3px rgba(0,0,0,.25); } .a { -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } lesscpy-0.13.0/test/css/ie.css0000644000175000017500000000102513115557313015221 0ustar totoltotol.nav { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333",endColorstr="#000000",GradientType=0); } .nav1 { filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0); } .nav2 { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333",endColorstr="#000000",GradientType=0); } body { *zoom: 1px; } > body { *zoom: 1px; } .ui-datepicker-cover { display: none; display: block; position: absolute; z-index: -1; filter: mask(); top: -4px; left: -4px; width: 200px; height: 200px; } lesscpy-0.13.0/test/css/viewport.css0000644000175000017500000000011413115557313016501 0ustar totoltotol@-ms-viewport { width: device-width; } @viewport { width: device-width; } lesscpy-0.13.0/test/css/mixin-args-nested.min.css0000644000175000017500000000145513115557313020753 0ustar totoltotol#e{radius:5px;} #j{radius:5px;} #k{radius:1px;} .content{width:600px;} .content .column{margin:600px;} .content .column.blue{color:blue;} .content .column.blue .deep{padding:600px;} .content-em{width:200px;} .content-em .column{margin:200px;} .content-em .column.blue{color:blue;} .content-em .column.blue .deep{padding:200px;} .test-2{width:300px;width:300px;} .test-2 .column{margin:300px;} .test-2 .column.blue{color:blue;} .test-2 .column.blue .deep{padding:300px;} .test-2-em{width:600px;width:600px;} .test-2-em .column{margin:600px;} .test-2-em .column.blue{color:blue;} .test-2-em .column.blue .deep{padding:600px;} .tx{padding:3px;margin:1px;} .ty{padding:7px;margin:3px;} .font{font-family:Georgia,"Times New Roman",Times,serif;} .deferred{background-color:#705b4e;} span.callswithinscope{padding:6px;} lesscpy-0.13.0/test/css/mixin-args-semicolon.css0000644000175000017500000000005113115557313020666 0ustar totoltotol.arguments { border: 1px solid black; } lesscpy-0.13.0/test/css/escapes.min.css0000644000175000017500000000017013115557313017031 0ustar totoltotol.escape\|random\|char{color:red;} .mixin\!tUp{font-weight:bold;} .trailingTest\+{color:red;} .font-madness{font:0/0 a;} lesscpy-0.13.0/test/css/page.min.css0000644000175000017500000000013513115557313016323 0ustar totoltotol@page{margin:2.5cm;} @page{margin-left:5cm;} @page{margin-right:5cm;} @page{margin-top:8cm;} lesscpy-0.13.0/test/css/strings.min.css0000644000175000017500000000075613115557313017111 0ustar totoltotol#strings{quotes:"~""~";content:"#*%:&^,)!.(~*})";empty:"";brackets:"{""}";} #comments{content:"/* hello */ // not-so-secret";} #quotes{quotes:"'""'";quotes:'"''"';content:'""#!&""';empty:'';semi-colon:';';} #escaped{filter:DX.Transform.MS.BS.filter(opacity=50);} .escaped{filter:alpha(opacity=0.1);} #interpolation{url:"http://lesscss.org/dev/image.jpg";url2:"http://lesscss.org/image-256.jpg";url3:"http://lesscss.org#445566";url4:"http://lesscss.org/hello";url5:"http://lesscss.org/54.4px";} lesscpy-0.13.0/test/css/expressions.min.css0000644000175000017500000000131613115557313017773 0ustar totoltotol#operations{color:#111111;color:#111111;height:9px;width:3em;text-shadow:-1px -1px 1px red,6px 5px 5px yellow;substraction:0;division:1;} #operations .spacing{height:9px;width:3em;} .with-variables{height:16em;width:24em;size:1cm;} .negative{height:0;width:4px;} a{width:48px;} .shorthands{padding:-1px 2px 0 -4px;} .colors{color:#112233;border-color:#334455;background-color:#000000;} .colors .other{color:#222222;border-color:#222222;} .parens{border:2px solid black;margin:1px 3px 16 3;width:36;padding:2px 36px;} .more-parens{padding:8 4 4 4px;width:96;height:113;margin:12;margin:36 px;} .nested-parens{width:71;height:6;} .mixed-units{margin:2px 4em 1 5pc;padding:6px 1em 2px 2;} .bm{padding:0;} h1{margin:1px;} lesscpy-0.13.0/test/css/svg.css0000644000175000017500000000125113115557313015424 0ustar totoltotolsvg { color: red; } circle { stroke: #006600; fill: #00cc00; } circle .green { stroke: #006600; stroke-width: 9; fill: #00cc00; } rect { fill: blue; fill-opacity: 0.1; stroke: green; opacity: 0.5; } ellipse { fill: yellow; } line { stroke: red; } path { stroke: blue; } polygon { fill: lime; fill-rule: nonzero; } polygon { fill: lime; fill-rule: evenodd; } polyline { fill: none; } .node text { font: 12px sans-serif; } tref { font-weight: bold; } text tref { font-weight: bold; } tspan { font-weight: bold; } text tspan { font-weight: bold; } textPath { font-weight: bold; } text textPath { font-weight: bold; } svg text textPath { font-weight: bold; } lesscpy-0.13.0/test/css/mixin-args-guards.css0000644000175000017500000000055113115557313020170 0ustar totoltotol.a { width: 1px; height: -1px; padding: 0; padding: 0; padding: 0; } .b { margin: 11; margin: -11; } .c { height: 5px; width: 5px; } .d { src: 'mobile'; padding: 1px; } .e { width: 9px; color: yellow; src: 'http://www.lesscss.org/#-parametric-mixins'; filter: 'wtf'; ignore: when; } .f { width: 9px; height: -9px; } .a .span5 { width: 5px; } lesscpy-0.13.0/test/css/mixin-args-nested.css0000644000175000017500000000166313115557313020172 0ustar totoltotol#e { radius: 5px; } #j { radius: 5px; } #k { radius: 1px; } .content { width: 600px; } .content .column { margin: 600px; } .content .column.blue { color: blue; } .content .column.blue .deep { padding: 600px; } .content-em { width: 200px; } .content-em .column { margin: 200px; } .content-em .column.blue { color: blue; } .content-em .column.blue .deep { padding: 200px; } .test-2 { width: 300px; width: 300px; } .test-2 .column { margin: 300px; } .test-2 .column.blue { color: blue; } .test-2 .column.blue .deep { padding: 300px; } .test-2-em { width: 600px; width: 600px; } .test-2-em .column { margin: 600px; } .test-2-em .column.blue { color: blue; } .test-2-em .column.blue .deep { padding: 600px; } .tx { padding: 3px; margin: 1px; } .ty { padding: 7px; margin: 3px; } .font { font-family: Georgia, "Times New Roman", Times, serif; } .deferred { background-color: #705b4e; } span.callswithinscope { padding: 6px; }lesscpy-0.13.0/test/css/svg.min.css0000644000175000017500000000106713115557313016213 0ustar totoltotolsvg{color:red;} circle{stroke:#006600;fill:#00cc00;} circle .green{stroke:#006600;stroke-width:9;fill:#00cc00;} rect{fill:blue;fill-opacity:0.1;stroke:green;opacity:0.5;} ellipse{fill:yellow;} line{stroke:red;} path{stroke:blue;} polygon{fill:lime;fill-rule:nonzero;} polygon{fill:lime;fill-rule:evenodd;} polyline{fill:none;} .node text{font:12px sans-serif;} tref{font-weight:bold;} text tref{font-weight:bold;} tspan{font-weight:bold;} text tspan{font-weight:bold;} textPath{font-weight:bold;} text textPath{font-weight:bold;} svg text textPath{font-weight:bold;} lesscpy-0.13.0/test/css/calls.css0000644000175000017500000000127413115557313015730 0ustar totoltotol#standard { width: 16; height: undefined("self"); border-width: 5; variable: 11; decrement: 9; rounded: 11; roundedpx: 3px; round25: 3; round15: 2; } #escapes { escaped: -Some(#thing, y); escaped1: -Some(#thing,z); eformat: rgb(32, 128, 64); } #format { format: "rgb(32, 128, 64)"; format-string: "hello world"; format-multiple: "hello earth 2"; format-url-encode: 'red is %23ff0000'; } #more { width: 2px; height: 1px; top: 50%; } #colors { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#333333', GradientType=1); } a { background-image: linear-gradient(top,#ffffff,#333333); background-image: linear-gradient(top,#a6a6a6,#000000); } lesscpy-0.13.0/test/css/comments.css0000644000175000017500000000042713115557313016456 0ustar totoltotol#comments { color: red; background-color: orange; font-size: 12px; content: "content"; border: 1px solid black; padding: 0; margin: 2em; } .selector, .lots, .comments { color: grey, orange; -webkit-border-radius: 2px; -moz-border-radius: 8px; } #last { color: blue; } lesscpy-0.13.0/test/css/properties-uri.min.css0000644000175000017500000000173713115557313020411 0ustar totoltotol#data-uri{background:url(data:image/png;charset=utf-8;base64, kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);background-image:url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);} #svg-data-uri{background:transparent url('data:image/svg+xml, ');} .uri_test{background-image:url(images/image.jpg);background-image:url(../some/path);background-image:url(./../some/path);background-image:url(./images/image.jpg);background-image:url(http://some/path/img.jpeg);background-image:url(https://some.server.com:9696/path/img.jpeg);behavior:url(border-radius.htc);background-image:url(fonts.svg#MyGeometricModern);image:url(http://),"}",url("http://}");image:url(http://tooks.com);background:url(/static/dashboard/img/search.png) no-repeat 195px 5px;} .uri_2{background-image:url('images/image.jpg') top left repeat-x #002e55;} lesscpy-0.13.0/test/css/imports.css0000644000175000017500000000064113115557313016324 0ustar totoltotol@import 'some.css.file.css'; @import 'some/other.css.file.CSS'; @import 'some.css' all; @import "some.print.css" print; .foo { color: blue; } .mixin { color: red; } .mixin { color: red; } .import { color: red; width: 6px; height: 9px; } @import "styles.css"; @import url("styles.css"); @import url("druck.css") print; @import url("foo.css") projection,tv; @import url("bar.css") handheld and (max-width:500px); lesscpy-0.13.0/test/css/mixin-args-semicolon.min.css0000644000175000017500000000004413115557313021452 0ustar totoltotol.arguments{border:1px solid black;} lesscpy-0.13.0/test/css/grid.css0000644000175000017500000000306113115557313015553 0ustar totoltotol.row { margin-left: -20px; } [class*="span"] { float: left; margin-left: 20px; } .span1 { width: 60px; } .span2 { width: 140px; } .span3 { width: 220px; } .span4 { width: 300px; } .span5 { width: 380px; } .span6 { width: 460px; } .span7 { width: 540px; } .span8 { width: 620px; } .span9 { width: 700px; } .span10 { width: 780px; } .span11 { width: 860px; } .span12, .container { width: 940px; } .offset1 { margin-left: 100px; } .offset2 { margin-left: 180px; } .offset3 { margin-left: 260px; } .offset4 { margin-left: 340px; } .offset5 { margin-left: 420px; } .offset6 { margin-left: 500px; } .offset7 { margin-left: 580px; } .offset8 { margin-left: 660px; } .offset9 { margin-left: 740px; } .offset10 { margin-left: 820px; } .offset11 { margin-left: 900px; } .row { margin-left: -1.7; } [class*="span"] { float: left; margin-left: 1.7; } .span1 { width: 27; } .span2 { width: 55.7; } .span3 { width: 84.4; } .span4 { width: 113.1; } .span5 { width: 141.8; } .span6 { width: 170.5; } .span7 { width: 199.2; } .span8 { width: 227.9; } .span9 { width: 256.6; } .span10 { width: 285.3; } .span11 { width: 314; } .span12, .container { width: 342.7; } .offset1 { margin-left: 30.4; } .offset2 { margin-left: 59.1; } .offset3 { margin-left: 87.80000000000001; } .offset4 { margin-left: 116.5; } .offset5 { margin-left: 145.20000000000002; } .offset6 { margin-left: 173.9; } .offset7 { margin-left: 202.6; } .offset8 { margin-left: 231.3; } .offset9 { margin-left: 260; } .offset10 { margin-left: 288.7; } .offset11 { margin-left: 317.4; } lesscpy-0.13.0/test/css/properties.css0000644000175000017500000000146713115557313017032 0ustar totoltotoldiv.properties { color: red; } div.empty { margin: ; } div.important { color: red !important; width: 100% !important; height: 20px !important; } div.annoying_font_property { font: 12px/16px Arial; font: 100%/16px Arial; font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; } div.shorthands { border: 1px solid #000000; margin: 1px 0; padding: 0 auto; padding: 1px 0 2px 0; margin: 0; padding: -1px -0 -2px -0; } table { counter-reset: group; } tbody { counter-increment: group; counter-reset: row; } tbody tr { counter-increment: row; } tbody td:first-child:before { content: counter(group,upper-latin)"."counter(row); } .escape\|random\|char { color: red; } .mixin\!tUp { font-weight: bold; } .trailingTest\+ { color: red; } .sr-only { clip: rect(0 0 0 0); } .font-madness { font: 0/0 a; } lesscpy-0.13.0/test/css/ie.min.css0000644000175000017500000000073513115557313016012 0ustar totoltotol.nav{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333",endColorstr="#000000",GradientType=0);} .nav1{filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);} .nav2{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333",endColorstr="#000000",GradientType=0);} body{*zoom:1px;} >body{*zoom:1px;} .ui-datepicker-cover{display:none;display:block;position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px;} lesscpy-0.13.0/test/css/identifiers.min.css0000644000175000017500000000370413115557313017721 0ustar totoltotolp{color:red;} p span{display:inline;} *{min-width:45em;} * html .div{height:12px;} h1,h2>a>p,h3{color:none;} div.class{color:blue;} div#id{color:green;} .class#id{color:purple;} .one.two.three{color:grey;} .one .two .three{color:grey;} a:hover,a:link{color:#999999;} p+h1{font-size:2.2em;} p~h1{color:yellow;} p,p:first-child{text-transform:none;} q:lang(no){quotes:none;} p:not([class*="lead"]){color:black;} input[type="text"].class#id[attr=32]:not(1){color:white;} div#id.class[a=1][b=2].class:not(1){color:white;} ul.comma>li:not(:only-child)::after{color:white;} ol.comma>li:nth-last-child(2)::after{color:white;} li:nth-child(4n+1),li:nth-child(-5n),li:nth-child(-n+2){color:white;} a[href^="http://"]{color:black;} a[href$="http://"]{color:black;} a[href^="http://"]{color:black;} form[data-disabled]{color:black;} p::before{color:black;} :lang(en-us)>q{quotes:"\201c""\201d""\2018""\2019";} :lang(en-gb)>q{quotes:"\2018""\2019""\201c""\201d";} a.one,a.two,a.three,a.four,a.five,a.six,a.seven,a.eight,a.nine,a.ten{max-width:12px;} a.longclassname.one,a.longclassname.two,a.longclassname.three,a.longclassname.four,a.longclassname.five,a.longclassname.six,a.longclassname.seven,a.longclassname.eight,a.longclassname.nine,a.longclassname.ten{max-height:12px;} 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,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,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{padding:0;} article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{padding:0;} #f7{color:#fff777;} .asterisk_last *{padding:0;} .class_no_3{padding:-3px;} .label-important,.badge-important{background-color:#ff0000;} .label-important[href],.badge-important[href]{background-color:#cc0000;} lesscpy-0.13.0/test/test_less.py0000644000175000017500000000037113115557313015704 0ustar totoltotol""" lesscpy LESS tests. """ import unittest from test.core import find_and_load_cases class LessTestCase(unittest.TestCase): pass find_and_load_cases(LessTestCase, less_dir='less', css_dir='css') lesscpy-0.13.0/test/bootstrap3/0000755000175000017500000000000013236067221015422 5ustar totoltotollesscpy-0.13.0/test/bootstrap3/less/0000755000175000017500000000000013236067221016370 5ustar totoltotollesscpy-0.13.0/test/bootstrap3/less/variables.less0000644000175000017500000004627713115557313021252 0ustar totoltotol// // Variables // -------------------------------------------------- // Global values // -------------------------------------------------- // Grays // ------------------------- @gray-darker: lighten(#000, 13.5%); // #222 @gray-dark: lighten(#000, 20%); // #333 @gray: lighten(#000, 33.5%); // #555 @gray-light: lighten(#000, 60%); // #999 @gray-lighter: lighten(#000, 93.5%); // #eee // Brand colors // ------------------------- @brand-primary: #428bca; @brand-success: #5cb85c; @brand-warning: #f0ad4e; @brand-danger: #d9534f; @brand-info: #5bc0de; // Scaffolding // ------------------------- @body-bg: #fff; @text-color: @gray-dark; // Links // ------------------------- @link-color: @brand-primary; @link-hover-color: darken(@link-color, 15%); // Typography // ------------------------- @font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; @font-family-serif: Georgia, "Times New Roman", Times, serif; @font-family-monospace: Monaco, Menlo, Consolas, "Courier New", monospace; @font-family-base: @font-family-sans-serif; @font-size-base: 14px; @font-size-large: ceil(@font-size-base * 1.25); // ~18px @font-size-small: ceil(@font-size-base * 0.85); // ~12px @font-size-h1: floor(@font-size-base * 2.6); // ~36px @font-size-h2: floor(@font-size-base * 2.15); // ~30px @font-size-h3: ceil(@font-size-base * 1.7); // ~24px @font-size-h4: ceil(@font-size-base * 1.25); // ~18px @font-size-h5: @font-size-base; @font-size-h6: ceil(@font-size-base * 0.85); // ~12px @line-height-base: 1.428571429; // 20/14 @line-height-computed: floor(@font-size-base * @line-height-base); // ~20px @headings-font-family: @font-family-base; @headings-font-weight: 500; @headings-line-height: 1.1; @headings-color: inherit; // Iconography // ------------------------- @icon-font-path: "../fonts/"; @icon-font-name: "glyphicons-halflings-regular"; // Components // ------------------------- // Based on 14px font-size and 1.428 line-height (~20px to start) @padding-base-vertical: 6px; @padding-base-horizontal: 12px; @padding-large-vertical: 10px; @padding-large-horizontal: 16px; @padding-small-vertical: 5px; @padding-small-horizontal: 10px; @line-height-large: 1.33; @line-height-small: 1.5; @border-radius-base: 4px; @border-radius-large: 6px; @border-radius-small: 3px; @component-active-color: #fff; @component-active-bg: @brand-primary; @caret-width-base: 4px; @caret-width-large: 5px; // Tables // ------------------------- @table-cell-padding: 8px; @table-condensed-cell-padding: 5px; @table-bg: transparent; // overall background-color @table-bg-accent: #f9f9f9; // for striping @table-bg-hover: #f5f5f5; @table-bg-active: @table-bg-hover; @table-border-color: #ddd; // table and cell border // Buttons // ------------------------- @btn-font-weight: normal; @btn-default-color: #333; @btn-default-bg: #fff; @btn-default-border: #ccc; @btn-primary-color: #fff; @btn-primary-bg: @brand-primary; @btn-primary-border: darken(@btn-primary-bg, 5%); @btn-success-color: #fff; @btn-success-bg: @brand-success; @btn-success-border: darken(@btn-success-bg, 5%); @btn-warning-color: #fff; @btn-warning-bg: @brand-warning; @btn-warning-border: darken(@btn-warning-bg, 5%); @btn-danger-color: #fff; @btn-danger-bg: @brand-danger; @btn-danger-border: darken(@btn-danger-bg, 5%); @btn-info-color: #fff; @btn-info-bg: @brand-info; @btn-info-border: darken(@btn-info-bg, 5%); @btn-link-disabled-color: @gray-light; // Forms // ------------------------- @input-bg: #fff; @input-bg-disabled: @gray-lighter; @input-color: @gray; @input-border: #ccc; @input-border-radius: @border-radius-base; @input-border-focus: #66afe9; @input-color-placeholder: @gray-light; @input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); @input-height-large: (floor(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); @input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); @legend-color: @gray-dark; @legend-border-color: #e5e5e5; @input-group-addon-bg: @gray-lighter; @input-group-addon-border-color: @input-border; // Dropdowns // ------------------------- @dropdown-bg: #fff; @dropdown-border: rgba(0,0,0,.15); @dropdown-fallback-border: #ccc; @dropdown-divider-bg: #e5e5e5; @dropdown-link-color: @gray-dark; @dropdown-link-hover-color: darken(@gray-dark, 5%); @dropdown-link-hover-bg: #f5f5f5; @dropdown-link-active-color: @component-active-color; @dropdown-link-active-bg: @component-active-bg; @dropdown-link-disabled-color: @gray-light; @dropdown-header-color: @gray-light; @dropdown-caret-color: #000; // 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 :) @zindex-navbar: 1000; @zindex-dropdown: 1000; @zindex-popover: 1010; @zindex-tooltip: 1030; @zindex-navbar-fixed: 1030; @zindex-modal-background: 1040; @zindex-modal: 1050; // Media queries breakpoints // -------------------------------------------------- // Extra small screen / phone // Note: Deprecated @screen-xs and @screen-phone as of v3.0.1 @screen-xs: 480px; @screen-xs-min: @screen-xs; @screen-phone: @screen-xs-min; // Small screen / tablet // Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1 @screen-sm: 768px; @screen-sm-min: @screen-sm; @screen-tablet: @screen-sm-min; // Medium screen / desktop // Note: Deprecated @screen-md and @screen-desktop as of v3.0.1 @screen-md: 992px; @screen-md-min: @screen-md; @screen-desktop: @screen-md-min; // Large screen / wide desktop // Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1 @screen-lg: 1200px; @screen-lg-min: @screen-lg; @screen-lg-desktop: @screen-lg-min; // So media queries don't overlap when required, provide a maximum @screen-xs-max: (@screen-sm-min - 1); @screen-sm-max: (@screen-md-min - 1); @screen-md-max: (@screen-lg-min - 1); // Grid system // -------------------------------------------------- // Number of columns in the grid system @grid-columns: 12; // Padding, to be divided by two and applied to the left and right of all columns @grid-gutter-width: 30px; // Point at which the navbar stops collapsing @grid-float-breakpoint: @screen-sm-min; // Navbar // ------------------------- // Basics of a navbar @navbar-height: 50px; @navbar-margin-bottom: @line-height-computed; @navbar-border-radius: @border-radius-base; @navbar-padding-horizontal: floor(@grid-gutter-width / 2); @navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); @navbar-default-color: #777; @navbar-default-bg: #f8f8f8; @navbar-default-border: darken(@navbar-default-bg, 6.5%); // Navbar links @navbar-default-link-color: #777; @navbar-default-link-hover-color: #333; @navbar-default-link-hover-bg: transparent; @navbar-default-link-active-color: #555; @navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%); @navbar-default-link-disabled-color: #ccc; @navbar-default-link-disabled-bg: transparent; // Navbar brand label @navbar-default-brand-color: @navbar-default-link-color; @navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%); @navbar-default-brand-hover-bg: transparent; // Navbar toggle @navbar-default-toggle-hover-bg: #ddd; @navbar-default-toggle-icon-bar-bg: #ccc; @navbar-default-toggle-border-color: #ddd; // Inverted navbar // // Reset inverted navbar basics @navbar-inverse-color: @gray-light; @navbar-inverse-bg: #222; @navbar-inverse-border: darken(@navbar-inverse-bg, 10%); // Inverted navbar links @navbar-inverse-link-color: @gray-light; @navbar-inverse-link-hover-color: #fff; @navbar-inverse-link-hover-bg: transparent; @navbar-inverse-link-active-color: @navbar-inverse-link-hover-color; @navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%); @navbar-inverse-link-disabled-color: #444; @navbar-inverse-link-disabled-bg: transparent; // Inverted navbar brand label @navbar-inverse-brand-color: @navbar-inverse-link-color; @navbar-inverse-brand-hover-color: #fff; @navbar-inverse-brand-hover-bg: transparent; // Inverted navbar toggle @navbar-inverse-toggle-hover-bg: #333; @navbar-inverse-toggle-icon-bar-bg: #fff; @navbar-inverse-toggle-border-color: #333; // Navs // ------------------------- @nav-link-padding: 10px 15px; @nav-link-hover-bg: @gray-lighter; @nav-disabled-link-color: @gray-light; @nav-disabled-link-hover-color: @gray-light; @nav-open-link-hover-color: #fff; @nav-open-caret-border-color: #fff; // Tabs @nav-tabs-border-color: #ddd; @nav-tabs-link-hover-border-color: @gray-lighter; @nav-tabs-active-link-hover-bg: @body-bg; @nav-tabs-active-link-hover-color: @gray; @nav-tabs-active-link-hover-border-color: #ddd; @nav-tabs-justified-link-border-color: #ddd; @nav-tabs-justified-active-link-border-color: @body-bg; // Pills @nav-pills-border-radius: @border-radius-base; @nav-pills-active-link-hover-bg: @component-active-bg; @nav-pills-active-link-hover-color: @component-active-color; // Pagination // ------------------------- @pagination-bg: #fff; @pagination-border: #ddd; @pagination-hover-bg: @gray-lighter; @pagination-active-bg: @brand-primary; @pagination-active-color: #fff; @pagination-disabled-color: @gray-light; // Pager // ------------------------- @pager-border-radius: 15px; @pager-disabled-color: @gray-light; // Jumbotron // ------------------------- @jumbotron-padding: 30px; @jumbotron-color: inherit; @jumbotron-bg: @gray-lighter; @jumbotron-heading-color: inherit; @jumbotron-font-size: ceil(@font-size-base * 1.5); // Form states and alerts // ------------------------- @state-success-text: #468847; @state-success-bg: #dff0d8; @state-success-border: darken(spin(@state-success-bg, -10), 5%); @state-info-text: #3a87ad; @state-info-bg: #d9edf7; @state-info-border: darken(spin(@state-info-bg, -10), 7%); @state-warning-text: #c09853; @state-warning-bg: #fcf8e3; @state-warning-border: darken(spin(@state-warning-bg, -10), 5%); @state-danger-text: #b94a48; @state-danger-bg: #f2dede; @state-danger-border: darken(spin(@state-danger-bg, -10), 5%); // Tooltips // ------------------------- @tooltip-max-width: 200px; @tooltip-color: #fff; @tooltip-bg: #000; @tooltip-arrow-width: 5px; @tooltip-arrow-color: @tooltip-bg; // Popovers // ------------------------- @popover-bg: #fff; @popover-max-width: 276px; @popover-border-color: rgba(0,0,0,.2); @popover-fallback-border-color: #ccc; @popover-title-bg: darken(@popover-bg, 3%); @popover-arrow-width: 10px; @popover-arrow-color: #fff; @popover-arrow-outer-width: (@popover-arrow-width + 1); @popover-arrow-outer-color: rgba(0,0,0,.25); @popover-arrow-outer-fallback-color: #999; // Labels // ------------------------- @label-default-bg: @gray-light; @label-primary-bg: @brand-primary; @label-success-bg: @brand-success; @label-info-bg: @brand-info; @label-warning-bg: @brand-warning; @label-danger-bg: @brand-danger; @label-color: #fff; @label-link-hover-color: #fff; // Modals // ------------------------- @modal-inner-padding: 20px; @modal-title-padding: 15px; @modal-title-line-height: @line-height-base; @modal-content-bg: #fff; @modal-content-border-color: rgba(0,0,0,.2); @modal-content-fallback-border-color: #999; @modal-backdrop-bg: #000; @modal-header-border-color: #e5e5e5; @modal-footer-border-color: @modal-header-border-color; // Alerts // ------------------------- @alert-padding: 15px; @alert-border-radius: @border-radius-base; @alert-link-font-weight: bold; @alert-success-bg: @state-success-bg; @alert-success-text: @state-success-text; @alert-success-border: @state-success-border; @alert-info-bg: @state-info-bg; @alert-info-text: @state-info-text; @alert-info-border: @state-info-border; @alert-warning-bg: @state-warning-bg; @alert-warning-text: @state-warning-text; @alert-warning-border: @state-warning-border; @alert-danger-bg: @state-danger-bg; @alert-danger-text: @state-danger-text; @alert-danger-border: @state-danger-border; // Progress bars // ------------------------- @progress-bg: #f5f5f5; @progress-bar-color: #fff; @progress-bar-bg: @brand-primary; @progress-bar-success-bg: @brand-success; @progress-bar-warning-bg: @brand-warning; @progress-bar-danger-bg: @brand-danger; @progress-bar-info-bg: @brand-info; // List group // ------------------------- @list-group-bg: #fff; @list-group-border: #ddd; @list-group-border-radius: @border-radius-base; @list-group-hover-bg: #f5f5f5; @list-group-active-color: @component-active-color; @list-group-active-bg: @component-active-bg; @list-group-active-border: @list-group-active-bg; @list-group-link-color: #555; @list-group-link-heading-color: #333; // Panels // ------------------------- @panel-bg: #fff; @panel-inner-border: #ddd; @panel-border-radius: @border-radius-base; @panel-footer-bg: #f5f5f5; @panel-default-text: @gray-dark; @panel-default-border: #ddd; @panel-default-heading-bg: #f5f5f5; @panel-primary-text: #fff; @panel-primary-border: @brand-primary; @panel-primary-heading-bg: @brand-primary; @panel-success-text: @state-success-text; @panel-success-border: @state-success-border; @panel-success-heading-bg: @state-success-bg; @panel-warning-text: @state-warning-text; @panel-warning-border: @state-warning-border; @panel-warning-heading-bg: @state-warning-bg; @panel-danger-text: @state-danger-text; @panel-danger-border: @state-danger-border; @panel-danger-heading-bg: @state-danger-bg; @panel-info-text: @state-info-text; @panel-info-border: @state-info-border; @panel-info-heading-bg: @state-info-bg; // Thumbnails // ------------------------- @thumbnail-padding: 4px; @thumbnail-bg: @body-bg; @thumbnail-border: #ddd; @thumbnail-border-radius: @border-radius-base; @thumbnail-caption-color: @text-color; @thumbnail-caption-padding: 9px; // Wells // ------------------------- @well-bg: #f5f5f5; // Badges // ------------------------- @badge-color: #fff; @badge-link-hover-color: #fff; @badge-bg: @gray-light; @badge-active-color: @link-color; @badge-active-bg: #fff; @badge-font-weight: bold; @badge-line-height: 1; @badge-border-radius: 10px; // Breadcrumbs // ------------------------- @breadcrumb-bg: #f5f5f5; @breadcrumb-color: #ccc; @breadcrumb-active-color: @gray-light; @breadcrumb-separator: "/"; // Carousel // ------------------------ @carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6); @carousel-control-color: #fff; @carousel-control-width: 15%; @carousel-control-opacity: .5; @carousel-control-font-size: 20px; @carousel-indicator-active-bg: #fff; @carousel-indicator-border-color: #fff; @carousel-caption-color: #fff; // Close // ------------------------ @close-font-weight: bold; @close-color: #000; @close-text-shadow: 0 1px 0 #fff; // Code // ------------------------ @code-color: #c7254e; @code-bg: #f9f2f4; @pre-bg: #f5f5f5; @pre-color: @gray-dark; @pre-border-color: #ccc; @pre-scrollable-max-height: 340px; // Type // ------------------------ @text-muted: @gray-light; @abbr-border-color: @gray-light; @headings-small-color: @gray-light; @blockquote-small-color: @gray-light; @blockquote-border-color: @gray-lighter; @page-header-border-color: @gray-lighter; // Miscellaneous // ------------------------- // Hr border color @hr-border: @gray-lighter; // Horizontal forms & lists @component-offset-horizontal: 180px; // Container sizes // -------------------------------------------------- // Small screen / tablet @container-tablet: ((720px + @grid-gutter-width)); @container-sm: @container-tablet; // Medium screen / desktop @container-desktop: ((940px + @grid-gutter-width)); @container-md: @container-desktop; // Large screen / wide desktop @container-large-desktop: ((1140px + @grid-gutter-width)); @container-lg: @container-large-desktop; lesscpy-0.13.0/test/bootstrap3/less/close.less0000644000175000017500000000125313115557313020370 0ustar totoltotol// // Close icons // -------------------------------------------------- .close { float: right; font-size: (@font-size-base * 1.5); font-weight: @close-font-weight; line-height: 1; color: @close-color; text-shadow: @close-text-shadow; .opacity(.2); &:hover, &:focus { color: @close-color; text-decoration: none; cursor: pointer; .opacity(.5); } // 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& { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } } lesscpy-0.13.0/test/bootstrap3/less/alerts.less0000644000175000017500000000262613115557313020562 0ustar totoltotol// // Alerts // -------------------------------------------------- // Base styles // ------------------------- .alert { padding: @alert-padding; margin-bottom: @line-height-computed; border: 1px solid transparent; border-radius: @alert-border-radius; // Headings for larger alerts h4 { margin-top: 0; // Specified for the h4 to prevent conflicts of changing @headings-color color: inherit; } // Provide class for links that match alerts .alert-link { font-weight: @alert-link-font-weight; } // Improve alignment and spacing of inner content > p, > ul { margin-bottom: 0; } > p + p { margin-top: 5px; } } // Dismissable alerts // // Expand the right padding and account for the close button's positioning. .alert-dismissable { padding-right: (@alert-padding + 20); // Adjust close link position .close { position: relative; top: -2px; right: -21px; color: inherit; } } // Alternate styles // // Generate contextual modifier classes for colorizing the alert. .alert-success { .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); } .alert-info { .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); } .alert-warning { .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); } .alert-danger { .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); } lesscpy-0.13.0/test/bootstrap3/less/thumbnails.less0000644000175000017500000000113113115557313021424 0ustar totoltotol// // Thumbnails // -------------------------------------------------- // Mixin and adjust the regular image class .thumbnail { .img-thumbnail(); display: block; // Override the inline-block from `.img-thumbnail` margin-bottom: @line-height-computed; > img { .img-responsive(); margin-left: auto; margin-right: auto; } } // Add a hover state for linked versions only a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: @link-color; } // Image captions .thumbnail .caption { padding: @thumbnail-caption-padding; color: @thumbnail-caption-color; } lesscpy-0.13.0/test/bootstrap3/less/pagination.less0000644000175000017500000000350213115557313021413 0ustar totoltotol// // Pagination (multiple pages) // -------------------------------------------------- .pagination { display: inline-block; padding-left: 0; margin: @line-height-computed 0; border-radius: @border-radius-base; > li { display: inline; // Remove list-style and block-level defaults > a, > span { position: relative; float: left; // Collapse white-space padding: @padding-base-vertical @padding-base-horizontal; line-height: @line-height-base; text-decoration: none; background-color: @pagination-bg; border: 1px solid @pagination-border; margin-left: -1px; } &:first-child { > a, > span { margin-left: 0; .border-left-radius(@border-radius-base); } } &:last-child { > a, > span { .border-right-radius(@border-radius-base); } } } > li > a, > li > span { &:hover, &:focus { background-color: @pagination-hover-bg; } } > .active > a, > .active > span { &, &:hover, &:focus { z-index: 2; color: @pagination-active-color; background-color: @pagination-active-bg; border-color: @pagination-active-bg; cursor: default; } } > .disabled { > span, > span:hover, > span:focus, > a, > a:hover, > a:focus { color: @pagination-disabled-color; background-color: @pagination-bg; border-color: @pagination-border; cursor: not-allowed; } } } // Sizing // -------------------------------------------------- // Large .pagination-lg { .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large); } // Small .pagination-sm { .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small); } lesscpy-0.13.0/test/bootstrap3/less/responsive-utilities.less0000644000175000017500000001142013115557313023466 0ustar totoltotol// // Responsive: Utility classes // -------------------------------------------------- // IE10 in Windows (Phone) 8 // // Support for responsive views via media queries is kind of borked in IE10, for // Surface/desktop in split view and for Windows Phone 8. This particular fix // must be accompanied by a snippet of JavaScript to sniff the user agent and // apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at // our Getting Started page for more information on this bug. // // For more information, see the following: // // Issue: https://github.com/twbs/bootstrap/issues/10497 // Docs: http://getbootstrap.com/getting-started/#browsers // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ @-ms-viewport { width: device-width; } // Visibility utilities .visible-xs { .responsive-invisibility(); @media (max-width: @screen-xs-max) { .responsive-visibility(); } &.visible-sm { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { .responsive-visibility(); } } &.visible-md { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { .responsive-visibility(); } } &.visible-lg { @media (min-width: @screen-lg-min) { .responsive-visibility(); } } } .visible-sm { .responsive-invisibility(); &.visible-xs { @media (max-width: @screen-xs-max) { .responsive-visibility(); } } @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { .responsive-visibility(); } &.visible-md { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { .responsive-visibility(); } } &.visible-lg { @media (min-width: @screen-lg-min) { .responsive-visibility(); } } } .visible-md { .responsive-invisibility(); &.visible-xs { @media (max-width: @screen-xs-max) { .responsive-visibility(); } } &.visible-sm { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { .responsive-visibility(); } } @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { .responsive-visibility(); } &.visible-lg { @media (min-width: @screen-lg-min) { .responsive-visibility(); } } } .visible-lg { .responsive-invisibility(); &.visible-xs { @media (max-width: @screen-xs-max) { .responsive-visibility(); } } &.visible-sm { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { .responsive-visibility(); } } &.visible-md { @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { .responsive-visibility(); } } @media (min-width: @screen-lg-min) { .responsive-visibility(); } } .hidden-xs { .responsive-visibility(); @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(); } } } .hidden-sm { .responsive-visibility(); &.hidden-xs { @media (max-width: @screen-xs-max) { .responsive-invisibility(); } } @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(); } } } .hidden-md { .responsive-visibility(); &.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(); } } @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { .responsive-invisibility(); } &.hidden-lg { @media (min-width: @screen-lg-min) { .responsive-invisibility(); } } } .hidden-lg { .responsive-visibility(); &.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(); } } @media (min-width: @screen-lg-min) { .responsive-invisibility(); } } // Print utilities .visible-print { .responsive-invisibility(); } @media print { .visible-print { .responsive-visibility(); } .hidden-print { .responsive-invisibility(); } } lesscpy-0.13.0/test/bootstrap3/less/dropdowns.less0000644000175000017500000001006213115557313021300 0ustar totoltotol// // Dropdown menus // -------------------------------------------------- // Dropdown arrow/caret .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: @caret-width-base solid @dropdown-caret-color; border-right: @caret-width-base solid transparent; border-left: @caret-width-base solid transparent; // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once fixed, // we can just straight up remove this. border-bottom: 0 dotted; } // The dropdown wrapper (div) .dropdown { position: relative; } // Prevent the focus on the dropdown toggle when closing dropdowns .dropdown-toggle:focus { outline: 0; } // The dropdown menu (ul) .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: @zindex-dropdown; 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; font-size: @font-size-base; background-color: @dropdown-bg; border: 1px solid @dropdown-fallback-border; // IE8 fallback border: 1px solid @dropdown-border; border-radius: @border-radius-base; .box-shadow(0 6px 12px rgba(0,0,0,.175)); 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(@dropdown-divider-bg); } // Links within the dropdown menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: @line-height-base; color: @dropdown-link-color; white-space: nowrap; // prevent links from randomly breaking onto new lines } } // Hover/Focus state .dropdown-menu > li > a { &:hover, &:focus { text-decoration: none; color: @dropdown-link-hover-color; background-color: @dropdown-link-hover-bg; } } // Active state .dropdown-menu > .active > a { &, &:hover, &:focus { color: @dropdown-link-active-color; text-decoration: none; outline: 0; background-color: @dropdown-link-active-bg; } } // Disabled state // // Gray out text and ensure the hover/focus state remains gray .dropdown-menu > .disabled > a { &, &:hover, &:focus { color: @dropdown-link-disabled-color; } } // Nuke hover/focus effects .dropdown-menu > .disabled > a { &:hover, &:focus { text-decoration: none; background-color: transparent; background-image: none; // Remove CSS gradient .reset-filter(); cursor: not-allowed; } } // Open state for the dropdown .open { // Show the menu > .dropdown-menu { display: block; } // Remove the outline when :focus is triggered > a { outline: 0; } } // Dropdown section headers .dropdown-header { display: block; padding: 3px 20px; font-size: @font-size-small; line-height: @line-height-base; color: @dropdown-header-color; } // Backdrop to catch body clicks on mobile, etc. .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: @zindex-dropdown - 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 { // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once this // gets fixed, restore `border-top: 0;`. border-top: 0 dotted; border-bottom: @caret-width-base solid @dropdown-caret-color; content: ""; } // Different positioning for bottom up menu .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } } // Component alignment // // Reiterate per navbar.less and the modified component alignment there. @media (min-width: @grid-float-breakpoint) { .navbar-right { .dropdown-menu { .pull-right > .dropdown-menu(); } } } lesscpy-0.13.0/test/bootstrap3/less/type.less0000644000175000017500000001201213115557313020237 0ustar totoltotol// // Typography // -------------------------------------------------- // Body text // ------------------------- p { margin: 0 0 (@line-height-computed / 2); } .lead { margin-bottom: @line-height-computed; font-size: floor(@font-size-base * 1.15); font-weight: 200; line-height: 1.4; @media (min-width: @screen-sm-min) { font-size: (@font-size-base * 1.5); } } // Emphasis & misc // ------------------------- // Ex: 14px base font * 85% = about 12px small, .small { font-size: 85%; } // Undo browser default styling cite { font-style: normal; } // Contextual emphasis .text-muted { color: @text-muted; } .text-primary { color: @brand-primary; &:hover { color: darken(@brand-primary, 10%); } } .text-warning { color: @state-warning-text; &:hover { color: darken(@state-warning-text, 10%); } } .text-danger { color: @state-danger-text; &:hover { color: darken(@state-danger-text, 10%); } } .text-success { color: @state-success-text; &:hover { color: darken(@state-success-text, 10%); } } .text-info { color: @state-info-text; &:hover { color: darken(@state-info-text, 10%); } } // Alignment .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } // Headings // ------------------------- h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: @headings-font-family; font-weight: @headings-font-weight; line-height: @headings-line-height; color: @headings-color; small, .small { font-weight: normal; line-height: 1; color: @headings-small-color; } } h1, h2, h3 { margin-top: @line-height-computed; margin-bottom: (@line-height-computed / 2); small, .small { font-size: 65%; } } h4, h5, h6 { margin-top: (@line-height-computed / 2); margin-bottom: (@line-height-computed / 2); small, .small { font-size: 75%; } } h1, .h1 { font-size: @font-size-h1; } h2, .h2 { font-size: @font-size-h2; } h3, .h3 { font-size: @font-size-h3; } h4, .h4 { font-size: @font-size-h4; } h5, .h5 { font-size: @font-size-h5; } h6, .h6 { font-size: @font-size-h6; } // Page header // ------------------------- .page-header { padding-bottom: ((@line-height-computed / 2) - 1); margin: (@line-height-computed * 2) 0 @line-height-computed; border-bottom: 1px solid @page-header-border-color; } // Lists // -------------------------------------------------- // Unordered and Ordered lists ul, ol { margin-top: 0; margin-bottom: (@line-height-computed / 2); ul, ol { margin-bottom: 0; } } // List options // Unstyled keeps list items block level, just removes default browser padding and list-style .list-unstyled { padding-left: 0; list-style: none; } // Inline turns list items into inline-block .list-inline { .list-unstyled(); > li { display: inline-block; padding-left: 5px; padding-right: 5px; &:first-child { padding-left: 0; } } } // Description Lists dl { margin-bottom: @line-height-computed; } dt, dd { line-height: @line-height-base; } dt { font-weight: bold; } dd { margin-left: 0; // Undo browser default } // Horizontal description lists // // Defaults to being stacked without any of the below styles applied, until the // grid breakpoint is reached (default of ~768px). @media (min-width: @grid-float-breakpoint) { .dl-horizontal { dt { float: left; width: (@component-offset-horizontal - 20); clear: left; text-align: right; .text-overflow(); } dd { margin-left: @component-offset-horizontal; .clearfix(); // Clear the floated `dt` if an empty `dd` is present } } } // MISC // ---- // Abbreviations and acronyms abbr[title], // Add 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 @abbr-border-color; } abbr.initialism { font-size: 90%; text-transform: uppercase; } // Blockquotes blockquote { padding: (@line-height-computed / 2) @line-height-computed; margin: 0 0 @line-height-computed; border-left: 5px solid @blockquote-border-color; p { font-size: (@font-size-base * 1.25); font-weight: 300; line-height: 1.25; } p:last-child { margin-bottom: 0; } small { display: block; line-height: @line-height-base; color: @blockquote-small-color; &:before { content: '\2014 \00A0'; // EM DASH, NBSP } } // Float right with text-align: right &.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid @blockquote-border-color; border-left: 0; p, small, .small { text-align: right; } small, .small { &:before { content: ''; } &:after { content: '\00A0 \2014'; // NBSP, EM DASH } } } } // Quotes blockquote:before, blockquote:after { content: ""; } // Addresses address { margin-bottom: @line-height-computed; font-style: normal; line-height: @line-height-base; } lesscpy-0.13.0/test/bootstrap3/less/tooltip.less0000644000175000017500000000502013115557313020751 0ustar totoltotol// // Tooltips // -------------------------------------------------- // Base class .tooltip { position: absolute; z-index: @zindex-tooltip; display: block; visibility: visible; font-size: @font-size-small; line-height: 1.4; .opacity(0); &.in { .opacity(.9); } &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } } // Wrapper for the tooltip content .tooltip-inner { max-width: @tooltip-max-width; padding: 3px 8px; color: @tooltip-color; text-align: center; text-decoration: none; background-color: @tooltip-bg; border-radius: @border-radius-base; } // 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: -@tooltip-arrow-width; border-width: @tooltip-arrow-width @tooltip-arrow-width 0; border-top-color: @tooltip-arrow-color; } &.top-left .tooltip-arrow { bottom: 0; left: @tooltip-arrow-width; border-width: @tooltip-arrow-width @tooltip-arrow-width 0; border-top-color: @tooltip-arrow-color; } &.top-right .tooltip-arrow { bottom: 0; right: @tooltip-arrow-width; border-width: @tooltip-arrow-width @tooltip-arrow-width 0; border-top-color: @tooltip-arrow-color; } &.right .tooltip-arrow { top: 50%; left: 0; margin-top: -@tooltip-arrow-width; border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; border-right-color: @tooltip-arrow-color; } &.left .tooltip-arrow { top: 50%; right: 0; margin-top: -@tooltip-arrow-width; border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; border-left-color: @tooltip-arrow-color; } &.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -@tooltip-arrow-width; border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; border-bottom-color: @tooltip-arrow-color; } &.bottom-left .tooltip-arrow { top: 0; left: @tooltip-arrow-width; border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; border-bottom-color: @tooltip-arrow-color; } &.bottom-right .tooltip-arrow { top: 0; right: @tooltip-arrow-width; border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; border-bottom-color: @tooltip-arrow-color; } } lesscpy-0.13.0/test/bootstrap3/less/labels.less0000644000175000017500000000174013115557313020526 0ustar totoltotol// // Labels // -------------------------------------------------- .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: @label-color; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; // Add hover effects, but only for links &[href] { &:hover, &:focus { color: @label-link-hover-color; text-decoration: none; cursor: pointer; } } // Empty labels collapse automatically (not available in IE8) &:empty { display: none; } } // Colors // Contextual variations (linked labels get darker on :hover) .label-default { .label-variant(@label-default-bg); } .label-primary { .label-variant(@label-primary-bg); } .label-success { .label-variant(@label-success-bg); } .label-info { .label-variant(@label-info-bg); } .label-warning { .label-variant(@label-warning-bg); } .label-danger { .label-variant(@label-danger-bg); } lesscpy-0.13.0/test/bootstrap3/less/bootstrap.less0000644000175000017500000000205713115557313021303 0ustar totoltotol// Core variables and mixins @import "variables.less"; @import "mixins.less"; // Reset @import "normalize.less"; @import "print.less"; // Core CSS @import "scaffolding.less"; @import "type.less"; @import "code.less"; @import "grid.less"; @import "tables.less"; @import "forms.less"; @import "buttons.less"; // Components @import "component-animations.less"; @import "glyphicons.less"; @import "dropdowns.less"; @import "button-groups.less"; @import "input-groups.less"; @import "navs.less"; @import "navbar.less"; @import "breadcrumbs.less"; @import "pagination.less"; @import "pager.less"; @import "labels.less"; @import "badges.less"; @import "jumbotron.less"; @import "thumbnails.less"; @import "alerts.less"; @import "progress-bars.less"; @import "media.less"; @import "list-group.less"; @import "panels.less"; @import "wells.less"; @import "close.less"; // Components w/ JavaScript @import "modals.less"; @import "tooltip.less"; @import "popovers.less"; @import "carousel.less"; // Utility classes @import "utilities.less"; @import "responsive-utilities.less"; lesscpy-0.13.0/test/bootstrap3/less/list-group.less0000644000175000017500000000357213115557313021376 0ustar totoltotol// // List groups // -------------------------------------------------- // Base class // // Easily usable on
    ,
      , or
      . .list-group { // No need to set list-style: none; since .list-group-item is block level margin-bottom: 20px; padding-left: 0; // reset padding because ul and ol } // Individual list items // ------------------------- .list-group-item { position: relative; display: block; padding: 10px 15px; // Place the border on the list items and negative margin up for better styling margin-bottom: -1px; background-color: @list-group-bg; border: 1px solid @list-group-border; // Round the first and last items &:first-child { .border-top-radius(@list-group-border-radius); } &:last-child { margin-bottom: 0; .border-bottom-radius(@list-group-border-radius); } // Align badges within list items > .badge { float: right; } > .badge + .badge { margin-right: 5px; } } // Linked list items a.list-group-item { color: @list-group-link-color; .list-group-item-heading { color: @list-group-link-heading-color; } // Hover state &:hover, &:focus { text-decoration: none; background-color: @list-group-hover-bg; } // Active class on item itself, not parent &.active, &.active:hover, &.active:focus { z-index: 2; // Place active items above their siblings for proper border styling color: @list-group-active-color; background-color: @list-group-active-bg; border-color: @list-group-active-border; // Force color to inherit for custom content .list-group-item-heading { color: inherit; } .list-group-item-text { color: lighten(@list-group-active-bg, 40%); } } } // Custom content options // ------------------------- .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } lesscpy-0.13.0/test/bootstrap3/less/theme.less0000644000175000017500000001530613115557313020371 0ustar totoltotol // // Load core variables and mixins // -------------------------------------------------- @import "variables.less"; @import "mixins.less"; // // Buttons // -------------------------------------------------- // Common styles .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0,0,0,.2); @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075); .box-shadow(@shadow); // Reset the shadow &:active, &.active { .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); } } // Mixin for generating new styles .btn-styles(@btn-color: #555) { #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%)); .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners background-repeat: repeat-x; border-color: darken(@btn-color, 14%); &:hover, &:focus { background-color: darken(@btn-color, 12%); background-position: 0 -15px; } &:active, &.active { background-color: darken(@btn-color, 12%); border-color: darken(@btn-color, 14%); } } // Common styles .btn { // Remove the gradient for the pressed/active state &:active, &.active { background-image: none; } } // Apply the mixin to the buttons .btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; } .btn-primary { .btn-styles(@btn-primary-bg); } .btn-success { .btn-styles(@btn-success-bg); } .btn-warning { .btn-styles(@btn-warning-bg); } .btn-danger { .btn-styles(@btn-danger-bg); } .btn-info { .btn-styles(@btn-info-bg); } // // Images // -------------------------------------------------- .thumbnail, .img-thumbnail { .box-shadow(0 1px 2px rgba(0,0,0,.075)); } // // Dropdowns // -------------------------------------------------- .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%)); background-color: darken(@dropdown-link-hover-bg, 5%); } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); background-color: darken(@dropdown-link-active-bg, 5%); } // // Navbar // -------------------------------------------------- // Default navbar .navbar-default { #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg); .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered border-radius: @navbar-border-radius; @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075); .box-shadow(@shadow); .navbar-nav > .active > a { #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%)); .box-shadow(inset 0 3px 9px rgba(0,0,0,.075)); } } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255,255,255,.25); } // Inverted navbar .navbar-inverse { #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg); .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered .navbar-nav > .active > a { #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%)); .box-shadow(inset 0 3px 9px rgba(0,0,0,.25)); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0,0,0,.25); } } // Undo rounded corners in static and fixed navbars .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } // // Alerts // -------------------------------------------------- // Common styles .alert { text-shadow: 0 1px 0 rgba(255,255,255,.2); @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05); .box-shadow(@shadow); } // Mixin for generating new styles .alert-styles(@color) { #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%)); border-color: darken(@color, 15%); } // Apply the mixin to the alerts .alert-success { .alert-styles(@alert-success-bg); } .alert-info { .alert-styles(@alert-info-bg); } .alert-warning { .alert-styles(@alert-warning-bg); } .alert-danger { .alert-styles(@alert-danger-bg); } // // Progress bars // -------------------------------------------------- // Give the progress background some depth .progress { #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg) } // Mixin for generating new styles .progress-bar-styles(@color) { #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%)); } // Apply the mixin to the progress bars .progress-bar { .progress-bar-styles(@progress-bar-bg); } .progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); } .progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); } .progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); } .progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); } // // List groups // -------------------------------------------------- .list-group { border-radius: @border-radius-base; .box-shadow(0 1px 2px rgba(0,0,0,.075)); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%); #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%)); border-color: darken(@list-group-active-border, 7.5%); } // // Panels // -------------------------------------------------- // Common styles .panel { .box-shadow(0 1px 2px rgba(0,0,0,.05)); } // Mixin for generating new styles .panel-heading-styles(@color) { #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%)); } // Apply the mixin to the panel headings only .panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); } .panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); } .panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); } .panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); } .panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); } .panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); } // // Wells // -------------------------------------------------- .well { #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg); border-color: darken(@well-bg, 10%); @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); .box-shadow(@shadow); } lesscpy-0.13.0/test/bootstrap3/less/jumbotron.less0000644000175000017500000000155713115557313021311 0ustar totoltotol// // Jumbotron // -------------------------------------------------- .jumbotron { padding: @jumbotron-padding; margin-bottom: @jumbotron-padding; font-size: @jumbotron-font-size; font-weight: 200; line-height: (@line-height-base * 1.5); color: @jumbotron-color; background-color: @jumbotron-bg; h1 { line-height: 1; color: @jumbotron-heading-color; } p { line-height: 1.4; } .container & { border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container } @media screen and (min-width: @screen-sm-min) { padding-top: (@jumbotron-padding * 1.6); padding-bottom: (@jumbotron-padding * 1.6); .container & { padding-left: (@jumbotron-padding * 2); padding-right: (@jumbotron-padding * 2); } h1 { font-size: (@font-size-base * 4.5); } } } lesscpy-0.13.0/test/bootstrap3/less/normalize.less0000644000175000017500000001615313115557313021270 0ustar totoltotol/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ // ========================================================================== // HTML5 display definitions // ========================================================================== // // Correct `block` display not defined in IE 8/9. // article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } // // Correct `inline-block` display not defined in IE 8/9. // audio, canvas, video { display: inline-block; } // // Prevent modern browsers from displaying `audio` without controls. // Remove excess height in iOS 5 devices. // audio:not([controls]) { display: none; height: 0; } // // Address `[hidden]` styling not present in IE 8/9. // Hide the `template` element in IE, Safari, and Firefox < 22. // [hidden], template { display: none; } // ========================================================================== // Base // ========================================================================== // // 1. Set default font family to sans-serif. // 2. Prevent iOS text size adjust after orientation change, without disabling // user zoom. // html { font-family: sans-serif; // 1 -ms-text-size-adjust: 100%; // 2 -webkit-text-size-adjust: 100%; // 2 } // // Remove default margin. // body { margin: 0; } // ========================================================================== // Links // ========================================================================== // // Remove the gray background color from active links in IE 10. // a { background: transparent; } // // Address `outline` inconsistency between Chrome and other browsers. // a:focus { outline: thin dotted; } // // Improve readability when focused and also mouse hovered in all browsers. // a:active, a:hover { outline: 0; } // ========================================================================== // Typography // ========================================================================== // // Address variable `h1` font-size and margin within `section` and `article` // contexts in Firefox 4+, Safari 5, and Chrome. // h1 { font-size: 2em; margin: 0.67em 0; } // // Address styling not present in IE 8/9, Safari 5, and Chrome. // abbr[title] { border-bottom: 1px dotted; } // // Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. // b, strong { font-weight: bold; } // // Address styling not present in Safari 5 and Chrome. // dfn { font-style: italic; } // // Address differences between Firefox and other browsers. // hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } // // Address styling not present in IE 8/9. // mark { background: #ff0; color: #000; } // // Correct font family set oddly in Safari 5 and Chrome. // code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } // // Improve readability of pre-formatted text in all browsers. // pre { white-space: pre-wrap; } // // Set consistent quote types. // q { quotes: "\201C" "\201D" "\2018" "\2019"; } // // Address inconsistent and variable font size in all browsers. // small { font-size: 80%; } // // Prevent `sub` and `sup` affecting `line-height` in all browsers. // sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } // ========================================================================== // Embedded content // ========================================================================== // // Remove border when inside `a` element in IE 8/9. // img { border: 0; } // // Correct overflow displayed oddly in IE 9. // svg:not(:root) { overflow: hidden; } // ========================================================================== // Figures // ========================================================================== // // Address margin not present in IE 8/9 and Safari 5. // figure { margin: 0; } // ========================================================================== // Forms // ========================================================================== // // Define consistent border, margin, and padding. // fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } // // 1. Correct `color` not being inherited in IE 8/9. // 2. Remove padding so people aren't caught out if they zero out fieldsets. // legend { border: 0; // 1 padding: 0; // 2 } // // 1. Correct font family not being inherited in all browsers. // 2. Correct font size not being inherited in all browsers. // 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. // button, input, select, textarea { font-family: inherit; // 1 font-size: 100%; // 2 margin: 0; // 3 } // // Address Firefox 4+ setting `line-height` on `input` using `!important` in // the UA stylesheet. // button, input { line-height: normal; } // // Address inconsistent `text-transform` inheritance for `button` and `select`. // All other form control elements do not inherit `text-transform` values. // Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. // Correct `select` style inheritance in Firefox 4+ and Opera. // button, select { text-transform: none; } // // 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` // and `video` controls. // 2. Correct inability to style clickable `input` types in iOS. // 3. Improve usability and consistency of cursor style between image-type // `input` and others. // button, html input[type="button"], // 1 input[type="reset"], input[type="submit"] { -webkit-appearance: button; // 2 cursor: pointer; // 3 } // // Re-set default cursor for disabled elements. // button[disabled], html input[disabled] { cursor: default; } // // 1. Address box sizing set to `content-box` in IE 8/9/10. // 2. Remove excess padding in IE 8/9/10. // input[type="checkbox"], input[type="radio"] { box-sizing: border-box; // 1 padding: 0; // 2 } // // 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. // 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome // (include `-moz` to future-proof). // input[type="search"] { -webkit-appearance: textfield; // 1 -moz-box-sizing: content-box; -webkit-box-sizing: content-box; // 2 box-sizing: content-box; } // // Remove inner padding and search cancel button in Safari 5 and Chrome // on OS X. // input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } // // Remove inner padding and border in Firefox 4+. // button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } // // 1. Remove default vertical scrollbar in IE 8/9. // 2. Improve readability and alignment in all browsers. // textarea { overflow: auto; // 1 vertical-align: top; // 2 } // ========================================================================== // Tables // ========================================================================== // // Remove most spacing between table cells. // table { border-collapse: collapse; border-spacing: 0; } lesscpy-0.13.0/test/bootstrap3/less/carousel.less0000644000175000017500000001073513115557313021105 0ustar totoltotol// // Carousel // -------------------------------------------------- // Wrapper for the slide container and indicators .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; > .item { display: none; position: relative; .transition(.6s ease-in-out left); // Account for jankitude on images > img, > a > img { .img-responsive(); 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: 0; left: 0; bottom: 0; width: @carousel-control-width; .opacity(@carousel-control-opacity); font-size: @carousel-control-font-size; color: @carousel-control-color; text-align: center; text-shadow: @carousel-text-shadow; // We can't have this transition here because WebKit cancels the carousel // animation if you trip this while in the middle of another animation. // Set gradients for backgrounds &.left { #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); } &.right { left: auto; right: 0; #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); } // Hover/focus state &:hover, &:focus { color: @carousel-control-color; text-decoration: none; .opacity(.9); } // Toggles .icon-prev, .icon-next, .glyphicon-chevron-left, .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; } .icon-prev, .glyphicon-chevron-left { left: 50%; } .icon-next, .glyphicon-chevron-right { right: 50%; } .icon-prev, .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .icon-prev { &:before { content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) } } .icon-next { &:before { content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) } } } // Optional indicator pips // // Add an unordered list with the following class and add a list item for each // slide your carousel holds. .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid @carousel-indicator-border-color; border-radius: 10px; cursor: pointer; // IE8-9 hack for event handling // // Internet Explorer 8-9 does not support clicks on elements without a set // `background-color`. We cannot use `filter` since that's not viewed as a // background color by the browser. Thus, a hack is needed. // // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we // set alpha transparency for the best results possible. background-color: #000 \9; // IE8 background-color: rgba(0,0,0,0); // IE9 } .active { margin: 0; width: 12px; height: 12px; background-color: @carousel-indicator-active-bg; } } // Optional captions // ----------------------------- // Hidden by default for smaller viewports .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: @carousel-caption-color; text-align: center; text-shadow: @carousel-text-shadow; & .btn { text-shadow: none; // No shadow for button elements in carousel-caption } } // Scale up controls for tablets and up @media screen and (min-width: @screen-sm-min) { // Scale up the controls a smidge .carousel-control { .glyphicons-chevron-left, .glyphicons-chevron-right, .icon-prev, .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } } // Show and left align the captions .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } // Move up the indicators .carousel-indicators { bottom: 20px; } } lesscpy-0.13.0/test/bootstrap3/less/navs.less0000644000175000017500000001246513115557313020241 0ustar totoltotol// // Navs // -------------------------------------------------- // Base class // -------------------------------------------------- .nav { margin-bottom: 0; padding-left: 0; // Override default ul/ol list-style: none; .clearfix(); > li { position: relative; display: block; > a { position: relative; display: block; padding: @nav-link-padding; &:hover, &:focus { text-decoration: none; background-color: @nav-link-hover-bg; } } // Disabled state sets text to gray and nukes hover/tab effects &.disabled > a { color: @nav-disabled-link-color; &:hover, &:focus { color: @nav-disabled-link-hover-color; text-decoration: none; background-color: transparent; cursor: not-allowed; } } } // Open dropdowns .open > a { &, &:hover, &:focus { background-color: @nav-link-hover-bg; border-color: @link-color; .caret { border-top-color: @link-hover-color; border-bottom-color: @link-hover-color; } } } // Nav dividers (deprecated with v3.0.1) // // This should have been removed in v3 with the dropping of `.nav-list`, but // we missed it. We don't currently support this anywhere, but in the interest // of maintaining backward compatibility in case you use it, it's deprecated. .nav-divider { .nav-divider(); } // Prevent IE8 from misplacing imgs // // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 > li > a > img { max-width: none; } } // Tabs // ------------------------- // Give the tabs something to sit on .nav-tabs { border-bottom: 1px solid @nav-tabs-border-color; > li { float: left; // Make the list-items overlay the bottom border margin-bottom: -1px; // Actual tabs (as links) > a { margin-right: 2px; line-height: @line-height-base; border: 1px solid transparent; border-radius: @border-radius-base @border-radius-base 0 0; &:hover { border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color; } } // Active state, and it's :hover to override normal :hover &.active > a { &, &:hover, &:focus { color: @nav-tabs-active-link-hover-color; background-color: @nav-tabs-active-link-hover-bg; border: 1px solid @nav-tabs-active-link-hover-border-color; border-bottom-color: transparent; cursor: default; } } } // pulling this in mainly for less shorthand &.nav-justified { .nav-justified(); .nav-tabs-justified(); } } // Pills // ------------------------- .nav-pills { > li { float: left; // Links rendered as pills > a { border-radius: @nav-pills-border-radius; } + li { margin-left: 2px; } // Active state &.active > a { &, &:hover, &:focus { color: @nav-pills-active-link-hover-color; background-color: @nav-pills-active-link-hover-bg; .caret { border-top-color: @nav-pills-active-link-hover-color; border-bottom-color: @nav-pills-active-link-hover-color; } } } } } // Stacked pills .nav-stacked { > li { float: none; + li { margin-top: 2px; margin-left: 0; // no need for this gap between nav items } } } // Nav variations // -------------------------------------------------- // Justified nav links // ------------------------- .nav-justified { width: 100%; > li { float: none; > a { text-align: center; margin-bottom: 5px; } } > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: @screen-sm-min) { > li { display: table-cell; width: 1%; > a { margin-bottom: 0; } } } } // Move borders to anchors instead of bottom of list // // Mixin for adding on top the shared `.nav-justified` styles for our tabs .nav-tabs-justified { border-bottom: 0; > li > a { // Override margin from .nav-tabs margin-right: 0; border-radius: @border-radius-base; } > .active > a, > .active > a:hover, > .active > a:focus { border: 1px solid @nav-tabs-justified-link-border-color; } @media (min-width: @screen-sm-min) { > li > a { border-bottom: 1px solid @nav-tabs-justified-link-border-color; border-radius: @border-radius-base @border-radius-base 0 0; } > .active > a, > .active > a:hover, > .active > a:focus { border-bottom-color: @nav-tabs-justified-active-link-border-color; } } } // Tabbable tabs // ------------------------- // Hide tabbable panes to start, show them when `.active` .tab-content { > .tab-pane { display: none; } > .active { display: block; } } // Dropdowns // ------------------------- // Make dropdown carets use link color in navs .nav .caret { border-top-color: @link-color; border-bottom-color: @link-color; } .nav a:hover .caret { border-top-color: @link-hover-color; border-bottom-color: @link-hover-color; } // Specific dropdowns .nav-tabs .dropdown-menu { // make dropdown border overlap tab border margin-top: -1px; // Remove the top rounded corners here since there is a hard edge above the menu .border-top-radius(0); } lesscpy-0.13.0/test/bootstrap3/less/code.less0000644000175000017500000000211613115557313020174 0ustar totoltotol// // Code (inline and block) // -------------------------------------------------- // Inline and block code styles code, kbd, pre, samp { font-family: @font-family-monospace; } // Inline code code { padding: 2px 4px; font-size: 90%; color: @code-color; background-color: @code-bg; white-space: nowrap; border-radius: @border-radius-base; } // Blocks of code pre { display: block; padding: ((@line-height-computed - 1) / 2); margin: 0 0 (@line-height-computed / 2); font-size: (@font-size-base - 1); // 14px to 13px line-height: @line-height-base; word-break: break-all; word-wrap: break-word; color: @pre-color; background-color: @pre-bg; border: 1px solid @pre-border-color; border-radius: @border-radius-base; // Account for some code outputs that place code tags in pre tags code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } } // Enable scrollable blocks of code .pre-scrollable { max-height: @pre-scrollable-max-height; overflow-y: scroll; } lesscpy-0.13.0/test/bootstrap3/less/glyphicons.less0000644000175000017500000003506713115557313021454 0ustar totoltotol// // Glyphicons for Bootstrap // // Since icons are fonts, they can be placed anywhere text is placed and are // thus automatically sized to match the surrounding child. To use, create an // inline element with the appropriate classes, like so: // // Star // Import the fonts @font-face { font-family: 'Glyphicons Halflings'; src: url('@{icon-font-path}@{icon-font-name}.eot'); src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'), url('@{icon-font-path}@{icon-font-name}.woff') format('woff'), url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'), url('@{icon-font-path}@{icon-font-name}.svg#glyphicons_halflingsregular') format('svg'); } // Catchall baseclass .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; &:empty { width: 1em; } } // Individual icons .glyphicon-asterisk { &:before { content: "\2a"; } } .glyphicon-plus { &:before { content: "\2b"; } } .glyphicon-euro { &:before { content: "\20ac"; } } .glyphicon-minus { &:before { content: "\2212"; } } .glyphicon-cloud { &:before { content: "\2601"; } } .glyphicon-envelope { &:before { content: "\2709"; } } .glyphicon-pencil { &:before { content: "\270f"; } } .glyphicon-glass { &:before { content: "\e001"; } } .glyphicon-music { &:before { content: "\e002"; } } .glyphicon-search { &:before { content: "\e003"; } } .glyphicon-heart { &:before { content: "\e005"; } } .glyphicon-star { &:before { content: "\e006"; } } .glyphicon-star-empty { &:before { content: "\e007"; } } .glyphicon-user { &:before { content: "\e008"; } } .glyphicon-film { &:before { content: "\e009"; } } .glyphicon-th-large { &:before { content: "\e010"; } } .glyphicon-th { &:before { content: "\e011"; } } .glyphicon-th-list { &:before { content: "\e012"; } } .glyphicon-ok { &:before { content: "\e013"; } } .glyphicon-remove { &:before { content: "\e014"; } } .glyphicon-zoom-in { &:before { content: "\e015"; } } .glyphicon-zoom-out { &:before { content: "\e016"; } } .glyphicon-off { &:before { content: "\e017"; } } .glyphicon-signal { &:before { content: "\e018"; } } .glyphicon-cog { &:before { content: "\e019"; } } .glyphicon-trash { &:before { content: "\e020"; } } .glyphicon-home { &:before { content: "\e021"; } } .glyphicon-file { &:before { content: "\e022"; } } .glyphicon-time { &:before { content: "\e023"; } } .glyphicon-road { &:before { content: "\e024"; } } .glyphicon-download-alt { &:before { content: "\e025"; } } .glyphicon-download { &:before { content: "\e026"; } } .glyphicon-upload { &:before { content: "\e027"; } } .glyphicon-inbox { &:before { content: "\e028"; } } .glyphicon-play-circle { &:before { content: "\e029"; } } .glyphicon-repeat { &:before { content: "\e030"; } } .glyphicon-refresh { &:before { content: "\e031"; } } .glyphicon-list-alt { &:before { content: "\e032"; } } .glyphicon-lock { &:before { content: "\e033"; } } .glyphicon-flag { &:before { content: "\e034"; } } .glyphicon-headphones { &:before { content: "\e035"; } } .glyphicon-volume-off { &:before { content: "\e036"; } } .glyphicon-volume-down { &:before { content: "\e037"; } } .glyphicon-volume-up { &:before { content: "\e038"; } } .glyphicon-qrcode { &:before { content: "\e039"; } } .glyphicon-barcode { &:before { content: "\e040"; } } .glyphicon-tag { &:before { content: "\e041"; } } .glyphicon-tags { &:before { content: "\e042"; } } .glyphicon-book { &:before { content: "\e043"; } } .glyphicon-bookmark { &:before { content: "\e044"; } } .glyphicon-print { &:before { content: "\e045"; } } .glyphicon-camera { &:before { content: "\e046"; } } .glyphicon-font { &:before { content: "\e047"; } } .glyphicon-bold { &:before { content: "\e048"; } } .glyphicon-italic { &:before { content: "\e049"; } } .glyphicon-text-height { &:before { content: "\e050"; } } .glyphicon-text-width { &:before { content: "\e051"; } } .glyphicon-align-left { &:before { content: "\e052"; } } .glyphicon-align-center { &:before { content: "\e053"; } } .glyphicon-align-right { &:before { content: "\e054"; } } .glyphicon-align-justify { &:before { content: "\e055"; } } .glyphicon-list { &:before { content: "\e056"; } } .glyphicon-indent-left { &:before { content: "\e057"; } } .glyphicon-indent-right { &:before { content: "\e058"; } } .glyphicon-facetime-video { &:before { content: "\e059"; } } .glyphicon-picture { &:before { content: "\e060"; } } .glyphicon-map-marker { &:before { content: "\e062"; } } .glyphicon-adjust { &:before { content: "\e063"; } } .glyphicon-tint { &:before { content: "\e064"; } } .glyphicon-edit { &:before { content: "\e065"; } } .glyphicon-share { &:before { content: "\e066"; } } .glyphicon-check { &:before { content: "\e067"; } } .glyphicon-move { &:before { content: "\e068"; } } .glyphicon-step-backward { &:before { content: "\e069"; } } .glyphicon-fast-backward { &:before { content: "\e070"; } } .glyphicon-backward { &:before { content: "\e071"; } } .glyphicon-play { &:before { content: "\e072"; } } .glyphicon-pause { &:before { content: "\e073"; } } .glyphicon-stop { &:before { content: "\e074"; } } .glyphicon-forward { &:before { content: "\e075"; } } .glyphicon-fast-forward { &:before { content: "\e076"; } } .glyphicon-step-forward { &:before { content: "\e077"; } } .glyphicon-eject { &:before { content: "\e078"; } } .glyphicon-chevron-left { &:before { content: "\e079"; } } .glyphicon-chevron-right { &:before { content: "\e080"; } } .glyphicon-plus-sign { &:before { content: "\e081"; } } .glyphicon-minus-sign { &:before { content: "\e082"; } } .glyphicon-remove-sign { &:before { content: "\e083"; } } .glyphicon-ok-sign { &:before { content: "\e084"; } } .glyphicon-question-sign { &:before { content: "\e085"; } } .glyphicon-info-sign { &:before { content: "\e086"; } } .glyphicon-screenshot { &:before { content: "\e087"; } } .glyphicon-remove-circle { &:before { content: "\e088"; } } .glyphicon-ok-circle { &:before { content: "\e089"; } } .glyphicon-ban-circle { &:before { content: "\e090"; } } .glyphicon-arrow-left { &:before { content: "\e091"; } } .glyphicon-arrow-right { &:before { content: "\e092"; } } .glyphicon-arrow-up { &:before { content: "\e093"; } } .glyphicon-arrow-down { &:before { content: "\e094"; } } .glyphicon-share-alt { &:before { content: "\e095"; } } .glyphicon-resize-full { &:before { content: "\e096"; } } .glyphicon-resize-small { &:before { content: "\e097"; } } .glyphicon-exclamation-sign { &:before { content: "\e101"; } } .glyphicon-gift { &:before { content: "\e102"; } } .glyphicon-leaf { &:before { content: "\e103"; } } .glyphicon-fire { &:before { content: "\e104"; } } .glyphicon-eye-open { &:before { content: "\e105"; } } .glyphicon-eye-close { &:before { content: "\e106"; } } .glyphicon-warning-sign { &:before { content: "\e107"; } } .glyphicon-plane { &:before { content: "\e108"; } } .glyphicon-calendar { &:before { content: "\e109"; } } .glyphicon-random { &:before { content: "\e110"; } } .glyphicon-comment { &:before { content: "\e111"; } } .glyphicon-magnet { &:before { content: "\e112"; } } .glyphicon-chevron-up { &:before { content: "\e113"; } } .glyphicon-chevron-down { &:before { content: "\e114"; } } .glyphicon-retweet { &:before { content: "\e115"; } } .glyphicon-shopping-cart { &:before { content: "\e116"; } } .glyphicon-folder-close { &:before { content: "\e117"; } } .glyphicon-folder-open { &:before { content: "\e118"; } } .glyphicon-resize-vertical { &:before { content: "\e119"; } } .glyphicon-resize-horizontal { &:before { content: "\e120"; } } .glyphicon-hdd { &:before { content: "\e121"; } } .glyphicon-bullhorn { &:before { content: "\e122"; } } .glyphicon-bell { &:before { content: "\e123"; } } .glyphicon-certificate { &:before { content: "\e124"; } } .glyphicon-thumbs-up { &:before { content: "\e125"; } } .glyphicon-thumbs-down { &:before { content: "\e126"; } } .glyphicon-hand-right { &:before { content: "\e127"; } } .glyphicon-hand-left { &:before { content: "\e128"; } } .glyphicon-hand-up { &:before { content: "\e129"; } } .glyphicon-hand-down { &:before { content: "\e130"; } } .glyphicon-circle-arrow-right { &:before { content: "\e131"; } } .glyphicon-circle-arrow-left { &:before { content: "\e132"; } } .glyphicon-circle-arrow-up { &:before { content: "\e133"; } } .glyphicon-circle-arrow-down { &:before { content: "\e134"; } } .glyphicon-globe { &:before { content: "\e135"; } } .glyphicon-wrench { &:before { content: "\e136"; } } .glyphicon-tasks { &:before { content: "\e137"; } } .glyphicon-filter { &:before { content: "\e138"; } } .glyphicon-briefcase { &:before { content: "\e139"; } } .glyphicon-fullscreen { &:before { content: "\e140"; } } .glyphicon-dashboard { &:before { content: "\e141"; } } .glyphicon-paperclip { &:before { content: "\e142"; } } .glyphicon-heart-empty { &:before { content: "\e143"; } } .glyphicon-link { &:before { content: "\e144"; } } .glyphicon-phone { &:before { content: "\e145"; } } .glyphicon-pushpin { &:before { content: "\e146"; } } .glyphicon-usd { &:before { content: "\e148"; } } .glyphicon-gbp { &:before { content: "\e149"; } } .glyphicon-sort { &:before { content: "\e150"; } } .glyphicon-sort-by-alphabet { &:before { content: "\e151"; } } .glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } } .glyphicon-sort-by-order { &:before { content: "\e153"; } } .glyphicon-sort-by-order-alt { &:before { content: "\e154"; } } .glyphicon-sort-by-attributes { &:before { content: "\e155"; } } .glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } } .glyphicon-unchecked { &:before { content: "\e157"; } } .glyphicon-expand { &:before { content: "\e158"; } } .glyphicon-collapse-down { &:before { content: "\e159"; } } .glyphicon-collapse-up { &:before { content: "\e160"; } } .glyphicon-log-in { &:before { content: "\e161"; } } .glyphicon-flash { &:before { content: "\e162"; } } .glyphicon-log-out { &:before { content: "\e163"; } } .glyphicon-new-window { &:before { content: "\e164"; } } .glyphicon-record { &:before { content: "\e165"; } } .glyphicon-save { &:before { content: "\e166"; } } .glyphicon-open { &:before { content: "\e167"; } } .glyphicon-saved { &:before { content: "\e168"; } } .glyphicon-import { &:before { content: "\e169"; } } .glyphicon-export { &:before { content: "\e170"; } } .glyphicon-send { &:before { content: "\e171"; } } .glyphicon-floppy-disk { &:before { content: "\e172"; } } .glyphicon-floppy-saved { &:before { content: "\e173"; } } .glyphicon-floppy-remove { &:before { content: "\e174"; } } .glyphicon-floppy-save { &:before { content: "\e175"; } } .glyphicon-floppy-open { &:before { content: "\e176"; } } .glyphicon-credit-card { &:before { content: "\e177"; } } .glyphicon-transfer { &:before { content: "\e178"; } } .glyphicon-cutlery { &:before { content: "\e179"; } } .glyphicon-header { &:before { content: "\e180"; } } .glyphicon-compressed { &:before { content: "\e181"; } } .glyphicon-earphone { &:before { content: "\e182"; } } .glyphicon-phone-alt { &:before { content: "\e183"; } } .glyphicon-tower { &:before { content: "\e184"; } } .glyphicon-stats { &:before { content: "\e185"; } } .glyphicon-sd-video { &:before { content: "\e186"; } } .glyphicon-hd-video { &:before { content: "\e187"; } } .glyphicon-subtitles { &:before { content: "\e188"; } } .glyphicon-sound-stereo { &:before { content: "\e189"; } } .glyphicon-sound-dolby { &:before { content: "\e190"; } } .glyphicon-sound-5-1 { &:before { content: "\e191"; } } .glyphicon-sound-6-1 { &:before { content: "\e192"; } } .glyphicon-sound-7-1 { &:before { content: "\e193"; } } .glyphicon-copyright-mark { &:before { content: "\e194"; } } .glyphicon-registration-mark { &:before { content: "\e195"; } } .glyphicon-cloud-download { &:before { content: "\e197"; } } .glyphicon-cloud-upload { &:before { content: "\e198"; } } .glyphicon-tree-conifer { &:before { content: "\e199"; } } .glyphicon-tree-deciduous { &:before { content: "\e200"; } } lesscpy-0.13.0/test/bootstrap3/less/tables.less0000644000175000017500000001037713115557313020544 0ustar totoltotol// // Tables // -------------------------------------------------- table { max-width: 100%; background-color: @table-bg; } th { text-align: left; } // Baseline styles .table { width: 100%; margin-bottom: @line-height-computed; // Cells > thead, > tbody, > tfoot { > tr { > th, > td { padding: @table-cell-padding; line-height: @line-height-base; vertical-align: top; border-top: 1px solid @table-border-color; } } } // Bottom align for column headings > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid @table-border-color; } // Remove top border from thead by default > caption + thead, > colgroup + thead, > thead:first-child { > tr:first-child { > th, > td { border-top: 0; } } } // Account for multiple tbody instances > tbody + tbody { border-top: 2px solid @table-border-color; } // Nesting .table { background-color: @body-bg; } } // Condensed table w/ half padding .table-condensed { > thead, > tbody, > tfoot { > tr { > th, > td { padding: @table-condensed-cell-padding; } } } } // Bordered version // // Add borders all around the table and between all the columns. .table-bordered { border: 1px solid @table-border-color; > thead, > tbody, > tfoot { > tr { > th, > td { border: 1px solid @table-border-color; } } } > thead > tr { > th, > td { border-bottom-width: 2px; } } } // Zebra-striping // // Default zebra-stripe styles (alternating gray and transparent backgrounds) .table-striped > tbody > tr:nth-child(odd) { > td, > th { background-color: @table-bg-accent; } } // Hover effect // // Placed here since it has to come after the potential zebra striping .table-hover > tbody > tr:hover { > td, > th { background-color: @table-bg-hover; } } // Table cell sizing // // Reset default table behavior table col[class*="col-"] { float: none; display: table-column; } table { td, th { &[class*="col-"] { float: none; display: table-cell; } } } // Table backgrounds // // Exact selectors below required to override `.table-striped` and prevent // inheritance to nested tables. .table > thead > tr, .table > tbody > tr, .table > tfoot > tr { > td.active, > th.active, &.active > td, &.active > th { background-color: @table-bg-active; } } // Generate the contextual variants .table-row-variant(success; @state-success-bg; @state-success-border); .table-row-variant(danger; @state-danger-bg; @state-danger-border); .table-row-variant(warning; @state-warning-bg; @state-warning-border); // Responsive tables // // Wrap your tables in `.table-responsive` and we'll make them mobile friendly // by enabling horizontal scrolling. Only applies <768px. Everything above that // will display normally. @media (max-width: @screen-xs-max) { .table-responsive { width: 100%; margin-bottom: (@line-height-computed * 0.75); overflow-y: hidden; overflow-x: scroll; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid @table-border-color; -webkit-overflow-scrolling: touch; // Tighten up spacing > .table { margin-bottom: 0; // Ensure the content doesn't wrap > thead, > tbody, > tfoot { > tr { > th, > td { white-space: nowrap; } } } } // Special overrides for the bordered tables > .table-bordered { border: 0; // Nuke the appropriate borders so that the parent can handle them > thead, > tbody, > tfoot { > tr { > th:first-child, > td:first-child { border-left: 0; } > th:last-child, > td:last-child { border-right: 0; } } } // Only nuke the last row's bottom-border in `tbody` and `tfoot` since // chances are there will be only one `tr` in a `thead` and that would // remove the border altogether. > tbody, > tfoot { > tr:last-child { > th, > td { border-bottom: 0; } } } } } } lesscpy-0.13.0/test/bootstrap3/less/popovers.less0000644000175000017500000000632213115557313021142 0ustar totoltotol// // Popovers // -------------------------------------------------- .popover { position: absolute; top: 0; left: 0; z-index: @zindex-popover; display: none; max-width: @popover-max-width; padding: 1px; text-align: left; // Reset given new insertion method background-color: @popover-bg; background-clip: padding-box; border: 1px solid @popover-fallback-border-color; border: 1px solid @popover-border-color; border-radius: @border-radius-large; .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: @font-size-base; font-weight: normal; line-height: 18px; background-color: @popover-title-bg; border-bottom: 1px solid darken(@popover-title-bg, 5%); border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } // Arrows // // .arrow is outer, .arrow:after is inner .popover .arrow { &, &:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } } .popover .arrow { border-width: @popover-arrow-outer-width; } .popover .arrow:after { border-width: @popover-arrow-width; content: ""; } .popover { &.top .arrow { left: 50%; margin-left: -@popover-arrow-outer-width; border-bottom-width: 0; border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback border-top-color: @popover-arrow-outer-color; bottom: -@popover-arrow-outer-width; &:after { content: " "; bottom: 1px; margin-left: -@popover-arrow-width; border-bottom-width: 0; border-top-color: @popover-arrow-color; } } &.right .arrow { top: 50%; left: -@popover-arrow-outer-width; margin-top: -@popover-arrow-outer-width; border-left-width: 0; border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback border-right-color: @popover-arrow-outer-color; &:after { content: " "; left: 1px; bottom: -@popover-arrow-width; border-left-width: 0; border-right-color: @popover-arrow-color; } } &.bottom .arrow { left: 50%; margin-left: -@popover-arrow-outer-width; border-top-width: 0; border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback border-bottom-color: @popover-arrow-outer-color; top: -@popover-arrow-outer-width; &:after { content: " "; top: 1px; margin-left: -@popover-arrow-width; border-top-width: 0; border-bottom-color: @popover-arrow-color; } } &.left .arrow { top: 50%; right: -@popover-arrow-outer-width; margin-top: -@popover-arrow-outer-width; border-right-width: 0; border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback border-left-color: @popover-arrow-outer-color; &:after { content: " "; right: 1px; border-right-width: 0; border-left-color: @popover-arrow-color; bottom: -@popover-arrow-width; } } } lesscpy-0.13.0/test/bootstrap3/less/badges.less0000644000175000017500000000175713115557313020521 0ustar totoltotol// // Badges // -------------------------------------------------- // Base classes .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: @font-size-small; font-weight: @badge-font-weight; color: @badge-color; line-height: @badge-line-height; vertical-align: baseline; white-space: nowrap; text-align: center; background-color: @badge-bg; border-radius: @badge-border-radius; // Empty badges collapse automatically (not available in IE8) &:empty { display: none; } } // Hover state, but only for links a.badge { &:hover, &:focus { color: @badge-link-hover-color; text-decoration: none; cursor: pointer; } } // Quick fix for labels/badges in buttons .btn .badge { position: relative; top: -1px; } // Account for counters in navs a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: @badge-active-color; background-color: @badge-active-bg; } .nav-pills > li > a > .badge { margin-left: 3px; } lesscpy-0.13.0/test/bootstrap3/less/breadcrumbs.less0000644000175000017500000000103413115557313021551 0ustar totoltotol// // Breadcrumbs // -------------------------------------------------- .breadcrumb { padding: 8px 15px; margin-bottom: @line-height-computed; list-style: none; background-color: @breadcrumb-bg; border-radius: @border-radius-base; > li { display: inline-block; + li:before { content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space padding: 0 5px; color: @breadcrumb-color; } } > .active { color: @breadcrumb-active-color; } } lesscpy-0.13.0/test/bootstrap3/less/modals.less0000644000175000017500000000611413115557313020543 0ustar totoltotol// // Modals // -------------------------------------------------- // .modal-open - body class for killing the scroll // .modal - container to scroll within // .modal-dialog - positioning shell for the actual modal // .modal-content - actual modal w/ bg and corners and shit // Kill the scroll on the body .modal-open { overflow: hidden; } // Container that the modal scrolls within .modal { display: none; overflow: auto; overflow-y: scroll; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: @zindex-modal-background; // When fading in the modal, animate it to slide down &.fade .modal-dialog { .translate(0, -25%); .transition-transform(~"0.3s ease-out"); } &.in .modal-dialog { .translate(0, 0)} } // Shell div to position the modal with bottom padding .modal-dialog { position: relative; margin-left: auto; margin-right: auto; width: auto; padding: 10px; z-index: (@zindex-modal-background + 10); } // Actual modal .modal-content { position: relative; background-color: @modal-content-bg; border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc) border: 1px solid @modal-content-border-color; border-radius: @border-radius-large; .box-shadow(0 3px 9px rgba(0,0,0,.5)); background-clip: padding-box; // Remove focus outline from opened modal outline: none; } // Modal background .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: (@zindex-modal-background - 10); background-color: @modal-backdrop-bg; // Fade for backdrop &.fade { .opacity(0); } &.in { .opacity(.5); } } // Modal header // Top section of the modal w/ title and dismiss .modal-header { padding: @modal-title-padding; border-bottom: 1px solid @modal-header-border-color; min-height: (@modal-title-padding + @modal-title-line-height); } // Close icon .modal-header .close { margin-top: -2px; } // Title text within header .modal-title { margin: 0; line-height: @modal-title-line-height; } // Modal body // Where all modal content resides (sibling of .modal-header and .modal-footer) .modal-body { position: relative; padding: @modal-inner-padding; } // Footer (for actions) .modal-footer { margin-top: 15px; padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding; text-align: right; // right align buttons border-top: 1px solid @modal-footer-border-color; .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; } } // Scale up the modal @media screen and (min-width: @screen-sm-min) { .modal-dialog { width: 600px; padding-top: 30px; padding-bottom: 30px; } .modal-content { .box-shadow(0 5px 15px rgba(0,0,0,.5)); } } lesscpy-0.13.0/test/bootstrap3/less/scaffolding.less0000644000175000017500000000351313115557313021543 0ustar totoltotol// // Scaffolding // -------------------------------------------------- // Reset the box-sizing *, *:before, *:after { .box-sizing(border-box); } // Body reset html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0,0,0,0); } body { font-family: @font-family-base; font-size: @font-size-base; line-height: @line-height-base; color: @text-color; background-color: @body-bg; } // Reset fonts for relevant elements input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } // Links a { color: @link-color; text-decoration: none; &:hover, &:focus { color: @link-hover-color; text-decoration: underline; } &:focus { .tab-focus(); } } // Images img { vertical-align: middle; } // Responsive images (ensure images don't scale beyond their parents) .img-responsive { .img-responsive(); } // Rounded corners .img-rounded { border-radius: @border-radius-large; } // Image thumbnails // // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. .img-thumbnail { padding: @thumbnail-padding; line-height: @line-height-base; background-color: @thumbnail-bg; border: 1px solid @thumbnail-border; border-radius: @thumbnail-border-radius; .transition(all .2s ease-in-out); // Keep them at most 100% wide .img-responsive(inline-block); } // Perfect circle .img-circle { border-radius: 50%; // set radius in percents } // Horizontal rules hr { margin-top: @line-height-computed; margin-bottom: @line-height-computed; border: 0; border-top: 1px solid @hr-border; } // Only display content to screen readers // // See: http://a11yproject.com/posts/how-to-hide-content/ .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0,0,0,0); border: 0; } lesscpy-0.13.0/test/bootstrap3/less/input-groups.less0000644000175000017500000000630613115557313021743 0ustar totoltotol// // Input groups // -------------------------------------------------- // Base styles // ------------------------- .input-group { position: relative; // For dropdowns display: table; border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table // Undo padding and float of grid classes &.col { float: none; padding-left: 0; padding-right: 0; } .form-control { width: 100%; margin-bottom: 0; } } // Sizing options // // Remix the default form control sizing classes into new ones for easier // manipulation. .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { .input-lg(); } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { .input-sm(); } // Display as table-cell // ------------------------- .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; &:not(:first-child):not(:last-child) { border-radius: 0; } } // Addon and addon wrapper for buttons .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; // Match the inputs } // Text input groups // ------------------------- .input-group-addon { padding: @padding-base-vertical @padding-base-horizontal; font-size: @font-size-base; font-weight: normal; line-height: 1; color: @input-color; text-align: center; background-color: @input-group-addon-bg; border: 1px solid @input-group-addon-border-color; border-radius: @border-radius-base; // Sizing &.input-sm { padding: @padding-small-vertical @padding-small-horizontal; font-size: @font-size-small; border-radius: @border-radius-small; } &.input-lg { padding: @padding-large-vertical @padding-large-horizontal; font-size: @font-size-large; border-radius: @border-radius-large; } // Nuke default margins from checkboxes and radios to vertically center within. input[type="radio"], input[type="checkbox"] { margin-top: 0; } } // Reset rounded corners .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { .border-right-radius(0); } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child) { .border-left-radius(0); } .input-group-addon:last-child { border-left: 0; } // Button input groups // ------------------------- .input-group-btn { position: relative; white-space: nowrap; // Negative margin to only have a 1px border between the two &:first-child > .btn { margin-right: -1px; } &:last-child > .btn { margin-left: -1px; } } .input-group-btn > .btn { position: relative; // Jankily prevent input button groups from wrapping + .btn { margin-left: -4px; } // Bring the "active" button to the front &:hover, &:active { z-index: 2; } } lesscpy-0.13.0/test/bootstrap3/less/button-groups.less0000644000175000017500000001234513115557313022117 0ustar totoltotol// // Button groups // -------------------------------------------------- // Button carets // // Match the button text color to the arrow/caret for indicating dropdown-ness. .caret { .btn-default & { border-top-color: @btn-default-color; } .btn-primary &, .btn-success &, .btn-warning &, .btn-danger &, .btn-info & { border-top-color: #fff; } } .dropup { .btn-default .caret { border-bottom-color: @btn-default-color; } .btn-primary, .btn-success, .btn-warning, .btn-danger, .btn-info { .caret { border-bottom-color: #fff; } } } // Make the div behave like a button .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; // match .btn alignment given font-size hack above > .btn { position: relative; float: left; // Bring the "active" button to the front &:hover, &:focus, &:active, &.active { z-index: 2; } &:focus { // Remove focus outline when dropdown JS adds it after closing the menu outline: none; } } } // Prevent double borders when buttons are next to each other .btn-group { .btn + .btn, .btn + .btn-group, .btn-group + .btn, .btn-group + .btn-group { margin-left: -1px; } } // Optional: Group multiple button groups together for a toolbar .btn-toolbar { .clearfix(); .btn-group { float: left; } // Space out series of button groups > .btn, > .btn-group { + .btn, + .btn-group { margin-left: 5px; } } } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } // 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; &:not(:last-child):not(.dropdown-toggle) { .border-right-radius(0); } } // Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { .border-left-radius(0); } // Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child { > .btn:last-child, > .dropdown-toggle { .border-right-radius(0); } } .btn-group > .btn-group:last-child > .btn:first-child { .border-left-radius(0); } // On active and open, don't show outline .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } // Sizing // // Remix the default button sizing classes into new ones for easier manipulation. .btn-group-xs > .btn { .btn-xs(); } .btn-group-sm > .btn { .btn-sm(); } .btn-group-lg > .btn { .btn-lg(); } // Split button dropdowns // ---------------------- // Give the line between buttons some depth .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } // The clickable button for toggling the menu // Remove the gradient and set the same inset shadow as the :active state .btn-group.open .dropdown-toggle { .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); // Show no shadow for `.btn-link` since it has no other button styles. &.btn-link { .box-shadow(none); } } // Reposition the caret .btn .caret { margin-left: 0; } // Carets in other button sizes .btn-lg .caret { border-width: @caret-width-large @caret-width-large 0; border-bottom-width: 0; } // Upside down carets for .dropup .dropup .btn-lg .caret { border-width: 0 @caret-width-large @caret-width-large; } // Vertical button groups // ---------------------- .btn-group-vertical { > .btn, > .btn-group { display: block; float: none; width: 100%; max-width: 100%; } // Clear floats so dropdown menus can be properly placed > .btn-group { .clearfix(); > .btn { float: none; } } > .btn + .btn, > .btn + .btn-group, > .btn-group + .btn, > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } } .btn-group-vertical > .btn { &:not(:first-child):not(:last-child) { border-radius: 0; } &:first-child:not(:last-child) { border-top-right-radius: @border-radius-base; .border-bottom-radius(0); } &:last-child:not(:first-child) { border-bottom-left-radius: @border-radius-base; .border-top-radius(0); } } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child { > .btn:last-child, > .dropdown-toggle { .border-bottom-radius(0); } } .btn-group-vertical > .btn-group:last-child > .btn:first-child { .border-top-radius(0); } // Justified button groups // ---------------------- .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; .btn { float: none; display: table-cell; width: 1%; } } // Checkbox and radio options [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } lesscpy-0.13.0/test/bootstrap3/less/wells.less0000644000175000017500000000102713115557313020410 0ustar totoltotol// // Wells // -------------------------------------------------- // Base class .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: @well-bg; border: 1px solid darken(@well-bg, 7%); border-radius: @border-radius-base; .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); blockquote { border-color: #ddd; border-color: rgba(0,0,0,.15); } } // Sizes .well-lg { padding: 24px; border-radius: @border-radius-large; } .well-sm { padding: 9px; border-radius: @border-radius-small; } lesscpy-0.13.0/test/bootstrap3/less/component-animations.less0000644000175000017500000000077513115557313023435 0ustar totoltotol// // Component animations // -------------------------------------------------- // Heads up! // // We don't use the `.opacity()` mixin here since it causes a bug with text // fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552. .fade { opacity: 0; .transition(opacity .15s linear); &.in { opacity: 1; } } .collapse { display: none; &.in { display: block; } } .collapsing { position: relative; height: 0; overflow: hidden; .transition(height .35s ease); } lesscpy-0.13.0/test/bootstrap3/less/grid.less0000644000175000017500000000423113115557313020207 0ustar totoltotol// // Grid system // -------------------------------------------------- // Set the container width, and override it for fixed navbars in media queries .container { .container-fixed(); } // mobile first defaults .row { .make-row(); } // Common styles for small and large grid columns .make-grid-columns(); // Extra small grid // // Grid classes for extra small devices like smartphones. No offset, push, or // pull classes are present here due to the size of the target. // // Note that `.col-xs-12` doesn't get floated on purpose--there's no need since // it's full-width. .make-grid-columns-float(xs); .make-grid(@grid-columns, xs, width); .make-grid(@grid-columns, xs, pull); .make-grid(@grid-columns, xs, push); .make-grid(@grid-columns, xs, offset); // Small grid // // Columns, offsets, pushes, and pulls for the small device range, from phones // to tablets. // // Note that `.col-sm-12` doesn't get floated on purpose--there's no need since // it's full-width. @media (min-width: @screen-sm-min) { .container { width: @container-sm; } .make-grid-columns-float(sm); .make-grid(@grid-columns, sm, width); .make-grid(@grid-columns, sm, pull); .make-grid(@grid-columns, sm, push); .make-grid(@grid-columns, sm, offset); } // Medium grid // // Columns, offsets, pushes, and pulls for the desktop device range. // // Note that `.col-md-12` doesn't get floated on purpose--there's no need since // it's full-width. @media (min-width: @screen-md-min) { .container { width: @container-md; } .make-grid-columns-float(md); .make-grid(@grid-columns, md, width); .make-grid(@grid-columns, md, pull); .make-grid(@grid-columns, md, push); .make-grid(@grid-columns, md, offset); } // Large grid // // Columns, offsets, pushes, and pulls for the large desktop device range. // // Note that `.col-lg-12` doesn't get floated on purpose--there's no need since // it's full-width. @media (min-width: @screen-lg-min) { .container { width: @container-lg; } .make-grid-columns-float(lg); .make-grid(@grid-columns, lg, width); .make-grid(@grid-columns, lg, pull); .make-grid(@grid-columns, lg, push); .make-grid(@grid-columns, lg, offset); } lesscpy-0.13.0/test/bootstrap3/less/print.less0000644000175000017500000000316213115557313020420 0ustar totoltotol// // Basic print styles // -------------------------------------------------- // 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 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: 2cm .5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 // Once fixed, we can just straight up remove this. select { background: #fff !important; } // Bootstrap components .navbar { display: none; } .table { td, th { background-color: #fff !important; } } .btn, .dropup > .btn { > .caret { border-top-color: #000 !important; } } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered { th, td { border: 1px solid #ddd !important; } } } lesscpy-0.13.0/test/bootstrap3/less/forms.less0000644000175000017500000002122713115557313020414 0ustar totoltotol// // Forms // -------------------------------------------------- // Normalize non-controls // // Restyle and baseline non-control form elements. fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: @line-height-computed; font-size: (@font-size-base * 1.5); line-height: inherit; color: @legend-color; border: 0; border-bottom: 1px solid @legend-border-color; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } // Normalize form controls // Override content-box in Normalize (* isn't specific enough) input[type="search"] { .box-sizing(border-box); } // Position radios and checkboxes better input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } // Set the height of select and file controls to match text inputs input[type="file"] { display: block; } // Make multiple select elements height not fixed select[multiple], select[size] { height: auto; } // Fix optgroup Firefox bug per https://github.com/twbs/bootstrap/issues/7611 select optgroup { font-size: inherit; font-style: inherit; font-family: inherit; } // Focus for select, file, radio, and checkbox input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { .tab-focus(); } // Fix for Chrome number input // Setting certain font-sizes causes the `I` bar to appear on hover of the bottom increment button. // See https://github.com/twbs/bootstrap/issues/8350 for more. input[type="number"] { &::-webkit-outer-spin-button, &::-webkit-inner-spin-button { height: auto; } } // Adjust output element output { display: block; padding-top: (@padding-base-vertical + 1); font-size: @font-size-base; line-height: @line-height-base; color: @input-color; vertical-align: middle; } // Placeholder // // Placeholder text gets special styles because when browsers invalidate entire // lines if it doesn't understand a selector/ .form-control { .placeholder(); } // Common form controls // // Shared size and type resets for form controls. Apply `.form-control` to any // of the following form controls: // // 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"] .form-control { display: block; width: 100%; height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) padding: @padding-base-vertical @padding-base-horizontal; font-size: @font-size-base; line-height: @line-height-base; color: @input-color; vertical-align: middle; background-color: @input-bg; background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 border: 1px solid @input-border; border-radius: @input-border-radius; .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); // Customize the `:focus` state to imitate native WebKit styles. .form-control-focus(); // Disabled and read-only inputs // Note: HTML5 says that controls under a fieldset > legend:first-child won't // be disabled if the fieldset is disabled. Due to implementation difficulty, // we don't honor that edge case; we style them as disabled anyway. &[disabled], &[readonly], fieldset[disabled] & { cursor: not-allowed; background-color: @input-bg-disabled; } // Reset height for `textarea`s textarea& { height: auto; } } // Form groups // // Designed to help with the organization and spacing of vertical forms. For // horizontal forms, use the predefined grid classes. .form-group { margin-bottom: 15px; } // Checkboxes and radios // // Indent the labels to position radios/checkboxes as hanging controls. .radio, .checkbox { display: block; min-height: @line-height-computed; // clear the floating input if there is no label text margin-top: 10px; margin-bottom: 10px; padding-left: 20px; vertical-align: middle; label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer; } } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing } // Radios and checkboxes on same line .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; // space out consecutive inline controls } // Apply same disabled cursor tweak as for inputs // // Note: Neither radios nor checkboxes can be readonly. input[type="radio"], input[type="checkbox"], .radio, .radio-inline, .checkbox, .checkbox-inline { &[disabled], fieldset[disabled] & { cursor: not-allowed; } } // Form control sizing .input-sm { .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); } .input-lg { .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); } // Form control feedback states // // Apply contextual and semantic states to individual form controls. // Warning .has-warning { .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg); } // Error .has-error { .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg); } // Success .has-success { .form-control-validation(@state-success-text; @state-success-text; @state-success-bg); } // Static form control text // // Apply class to a `p` element to make any string of text align with labels in // a horizontal form layout. .form-control-static { margin-bottom: 0; // Remove default margin from `p` } // Help text // // Apply to any element you wish to create light text for placement immediately // below a form control. Use for general help, formatting, or instructional text. .help-block { display: block; // account for any element using help-block margin-top: 5px; margin-bottom: 10px; color: lighten(@text-color, 25%); // lighten the text some for contrast } // Inline forms // // Make forms appear inline(-block) by adding the `.form-inline` class. Inline // forms begin stacked on extra small (mobile) devices and then go inline when // viewports reach <768px. // // Requires wrapping inputs and labels with `.form-group` for proper display of // default HTML form controls and our custom form controls (e.g., input groups). // // Heads up! This is mixin-ed into `.navbar-form` in navbars.less. .form-inline { // Kick in the inline @media (min-width: @screen-sm) { // Inline-block all the things for "inline" .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } // In navbar-form, allow folks to *not* use `.form-group` .form-control { display: inline-block; } // Remove default margin on radios/checkboxes that were used for stacking, and // then undo the floating of radios and checkboxes to match (which also avoids // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969). .radio, .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; padding-left: 0; } .radio input[type="radio"], .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } } // Horizontal forms // // Horizontal forms are built on grid classes and allow you to create forms with // labels on the left and inputs on the right. .form-horizontal { // Consistent vertical alignment of labels, radios, and checkboxes .control-label, .radio, .checkbox, .radio-inline, .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: (@padding-base-vertical + 1); // Default padding plus a border } // Make form groups behave like rows .form-group { .make-row(); } .form-control-static { padding-top: (@padding-base-vertical + 1); } // Only right align form labels here when the columns stop stacking @media (min-width: @screen-sm-min) { .control-label { text-align: right; } } } lesscpy-0.13.0/test/bootstrap3/less/mixins.less0000644000175000017500000006263613115557313020606 0ustar totoltotol// // Mixins // -------------------------------------------------- // Utilities // ------------------------- // Clearfix // Source: http://nicolasgallagher.com/micro-clearfix-hack/ // // For modern browsers // 1. The space content is one way to avoid an Opera bug when the // contenteditable attribute is included anywhere else in the document. // Otherwise it causes space to appear at the top and bottom of elements // that are clearfixed. // 2. The use of `table` rather than `block` is only necessary if using // `:before` to contain the top-margins of child elements. .clearfix() { &:before, &:after { content: " "; /* 1 */ display: table; /* 2 */ } &: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; } // Sizing shortcuts .size(@width; @height) { width: @width; height: @height; } .square(@size) { .size(@size; @size); } // Placeholder text .placeholder(@color: @input-color-placeholder) { &:-moz-placeholder { color: @color; } // Firefox 4-18 &::-moz-placeholder { color: @color; } // Firefox 19+ &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+ &::-webkit-input-placeholder { color: @color; } // Safari and Chrome } // Text overflow // Requires inline-block or block for proper styling .text-overflow() { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } // CSS image replacement // // Heads up! v3 launched with with only `.hide-text()`, but per our pattern for // mixins being reused as classes with the same name, this doesn't hold up. As // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note // that we cannot chain the mixins together in Less, so they are repeated. // // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 // Deprecated as of v3.0.1 (will be removed in v4) .hide-text() { font: ~"0/0" a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } // New mixin to use as of v3.0.1 .text-hide() { font: ~"0/0" a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } // CSS3 PROPERTIES // -------------------------------------------------- // Single side border-radius .border-top-radius(@radius) { border-top-right-radius: @radius; border-top-left-radius: @radius; } .border-right-radius(@radius) { border-bottom-right-radius: @radius; border-top-right-radius: @radius; } .border-bottom-radius(@radius) { border-bottom-right-radius: @radius; border-bottom-left-radius: @radius; } .border-left-radius(@radius) { border-bottom-left-radius: @radius; border-top-left-radius: @radius; } // Drop shadows .box-shadow(@shadow) { -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 box-shadow: @shadow; } // Transitions .transition(@transition) { -webkit-transition: @transition; transition: @transition; } .transition-property(@transition-property) { -webkit-transition-property: @transition-property; transition-property: @transition-property; } .transition-delay(@transition-delay) { -webkit-transition-delay: @transition-delay; transition-delay: @transition-delay; } .transition-duration(@transition-duration) { -webkit-transition-duration: @transition-duration; transition-duration: @transition-duration; } .transition-transform(@transition) { -webkit-transition: -webkit-transform @transition; -moz-transition: -moz-transform @transition; -o-transition: -o-transform @transition; transition: transform @transition; } // Transformations .rotate(@degrees) { -webkit-transform: rotate(@degrees); -ms-transform: rotate(@degrees); // IE9+ transform: rotate(@degrees); } .scale(@ratio) { -webkit-transform: scale(@ratio); -ms-transform: scale(@ratio); // IE9+ transform: scale(@ratio); } .translate(@x; @y) { -webkit-transform: translate(@x, @y); -ms-transform: translate(@x, @y); // IE9+ transform: translate(@x, @y); } .skew(@x; @y) { -webkit-transform: skew(@x, @y); -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ transform: skew(@x, @y); } .translate3d(@x; @y; @z) { -webkit-transform: translate3d(@x, @y, @z); transform: translate3d(@x, @y, @z); } .rotateX(@degrees) { -webkit-transform: rotateX(@degrees); -ms-transform: rotateX(@degrees); // IE9+ transform: rotateX(@degrees); } .rotateY(@degrees) { -webkit-transform: rotateY(@degrees); -ms-transform: rotateY(@degrees); // IE9+ transform: rotateY(@degrees); } .perspective(@perspective) { -webkit-perspective: @perspective; -moz-perspective: @perspective; perspective: @perspective; } .perspective-origin(@perspective) { -webkit-perspective-origin: @perspective; -moz-perspective-origin: @perspective; perspective-origin: @perspective; } .transform-origin(@origin) { -webkit-transform-origin: @origin; -moz-transform-origin: @origin; transform-origin: @origin; } // Animations .animation(@animation) { -webkit-animation: @animation; animation: @animation; } // Backface visibility // Prevent browsers from flickering when using CSS 3D transforms. // Default value is `visible`, but can be changed to `hidden` .backface-visibility(@visibility){ -webkit-backface-visibility: @visibility; -moz-backface-visibility: @visibility; backface-visibility: @visibility; } // 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; // IE10+ -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(@column-count; @column-gap: @grid-gutter-width) { -webkit-column-count: @column-count; -moz-column-count: @column-count; column-count: @column-count; -webkit-column-gap: @column-gap; -moz-column-gap: @column-gap; column-gap: @column-gap; } // Optional hyphenation .hyphens(@mode: auto) { word-wrap: break-word; -webkit-hyphens: @mode; -moz-hyphens: @mode; -ms-hyphens: @mode; // IE10+ -o-hyphens: @mode; hyphens: @mode; } // Opacity .opacity(@opacity) { opacity: @opacity; // IE8 filter @opacity-ie: (@opacity * 100); filter: ~"alpha(opacity=@{opacity-ie})"; } // GRADIENTS // -------------------------------------------------- #gradient { // Horizontal gradient, from left to right // // Creates two color stops, start and end, by specifying a color and position for each color stop. // Color stops are not available in IE9 and below. .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { background-image: -webkit-gradient(linear, @start-percent top, @end-percent top, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+ background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1+, Chrome 10+ background-image: -moz-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // FF 3.6+ background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10 background-repeat: repeat-x; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down } // Vertical gradient, from top to bottom // // Creates two color stops, start and end, by specifying a color and position for each color stop. // Color stops are not available in IE9 and below. .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+ background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1+, Chrome 10+ background-image: -moz-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // FF 3.6+ background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10 background-repeat: repeat-x; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down } .directional(@start-color: #555; @end-color: #333; @deg: 45deg) { background-repeat: repeat-x; background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1+, Chrome 10+ background-image: -moz-linear-gradient(@deg, @start-color, @end-color); // FF 3.6+ background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10 } .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color)); background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); background-image: -moz-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color); background-repeat: no-repeat; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback } .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color)); background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color); background-image: -moz-linear-gradient(top, @start-color, @mid-color @color-stop, @end-color); background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color); background-repeat: no-repeat; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback } .radial(@inner-color: #555; @outer-color: #333) { background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@inner-color), to(@outer-color)); background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color); background-image: -moz-radial-gradient(circle, @inner-color, @outer-color); background-image: radial-gradient(circle, @inner-color, @outer-color); background-repeat: no-repeat; } .striped(@color: rgba(255,255,255,.15); @angle: 45deg) { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, @color), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, @color), color-stop(.75, @color), color-stop(.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); } } // Reset filters for IE // // When you need to remove a gradient background, do not forget to use this to reset // the IE filter for IE9 and below. .reset-filter() { filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); } // Retina images // // Short retina mixin for setting background-image and -size .img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { background-image: url("@{file-1x}"); @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and ( min--moz-device-pixel-ratio: 2), only screen and ( -o-min-device-pixel-ratio: 2/1), only screen and ( min-device-pixel-ratio: 2), only screen and ( min-resolution: 192dpi), only screen and ( min-resolution: 2dppx) { background-image: url("@{file-2x}"); background-size: @width-1x @height-1x; } } // Responsive image // // Keep images from scaling beyond the width of their parents. .img-responsive(@display: block;) { display: @display; max-width: 100%; // Part 1: Set a maximum relative to the parent height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching } // COMPONENT MIXINS // -------------------------------------------------- // Horizontal dividers // ------------------------- // Dividers (basically an hr) within dropdowns and nav lists .nav-divider(@color: #e5e5e5) { height: 1px; margin: ((@line-height-computed / 2) - 1) 0; overflow: hidden; background-color: @color; } // Panels // ------------------------- .panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border;) { border-color: @border; & > .panel-heading { color: @heading-text-color; background-color: @heading-bg-color; border-color: @heading-border; + .panel-collapse .panel-body { border-top-color: @border; } & > .dropdown .caret { border-color: @heading-text-color transparent; } } & > .panel-footer { + .panel-collapse .panel-body { border-bottom-color: @border; } } } // Alerts // ------------------------- .alert-variant(@background; @border; @text-color) { background-color: @background; border-color: @border; color: @text-color; hr { border-top-color: darken(@border, 5%); } .alert-link { color: darken(@text-color, 10%); } } // Tables // ------------------------- .table-row-variant(@state; @background; @border) { // Exact selectors below required to override `.table-striped` and prevent // inheritance to nested tables. .table > thead > tr, .table > tbody > tr, .table > tfoot > tr { > td.@{state}, > th.@{state}, &.@{state} > td, &.@{state} > th { background-color: @background; } } // Hover states for `.table-hover` // Note: this is not available for cells or rows within `thead` or `tfoot`. .table-hover > tbody > tr { > td.@{state}:hover, > th.@{state}:hover, &.@{state}:hover > td, &.@{state}:hover > th { background-color: darken(@background, 5%); } } } // Button variants // ------------------------- // Easily pump out default styles, as well as :hover, :focus, :active, // and disabled options for all buttons .button-variant(@color; @background; @border) { color: @color; background-color: @background; border-color: @border; &:hover, &:focus, &:active, &.active, .open .dropdown-toggle& { color: @color; background-color: darken(@background, 8%); border-color: darken(@border, 12%); } &:active, &.active, .open .dropdown-toggle& { background-image: none; } &.disabled, &[disabled], fieldset[disabled] & { &, &:hover, &:focus, &:active, &.active { background-color: @background; border-color: @border; } } } // Button sizes // ------------------------- .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { padding: @padding-vertical @padding-horizontal; font-size: @font-size; line-height: @line-height; border-radius: @border-radius; } // Pagination // ------------------------- .pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) { > li { > a, > span { padding: @padding-vertical @padding-horizontal; font-size: @font-size; } &:first-child { > a, > span { .border-left-radius(@border-radius); } } &:last-child { > a, > span { .border-right-radius(@border-radius); } } } } // Labels // ------------------------- .label-variant(@color) { background-color: @color; &[href] { &:hover, &:focus { background-color: darken(@color, 10%); } } } // Navbar vertical align // ------------------------- // Vertically center elements in the navbar. // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. .navbar-vertical-align(@element-height) { margin-top: ((@navbar-height - @element-height) / 2); margin-bottom: ((@navbar-height - @element-height) / 2); } // Progress bars // ------------------------- .progress-bar-variant(@color) { background-color: @color; .progress-striped & { #gradient > .striped(); } } // Responsive utilities // ------------------------- // More easily include all the states for responsive-utilities.less. .responsive-visibility() { display: block !important; tr& { display: table-row !important; } th&, td& { display: table-cell !important; } } .responsive-invisibility() { &, tr&, th&, td& { display: none !important; } } // Grid System // ----------- // Centered container element .container-fixed() { margin-right: auto; margin-left: auto; padding-left: (@grid-gutter-width / 2); padding-right: (@grid-gutter-width / 2); .clearfix(); } // Creates a wrapper for a series of columns .make-row(@gutter: @grid-gutter-width) { margin-left: (@gutter / -2); margin-right: (@gutter / -2); .clearfix(); } // Generate the extra small columns .make-xs-column(@columns; @gutter: @grid-gutter-width) { position: relative; float: left; width: percentage((@columns / @grid-columns)); // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); } // Generate the small columns .make-sm-column(@columns; @gutter: @grid-gutter-width) { position: relative; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); // Calculate width based on number of columns available @media (min-width: @screen-sm-min) { float: left; width: percentage((@columns / @grid-columns)); } } // Generate the small column offsets .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; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); // Calculate width based on number of columns available @media (min-width: @screen-md-min) { float: left; width: percentage((@columns / @grid-columns)); } } // Generate the medium column offsets .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) { 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; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); // Calculate width based on number of columns available @media (min-width: @screen-lg-min) { float: left; width: percentage((@columns / @grid-columns)); } } // Generate the large column offsets .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)); } } // Framework grid generation // // Used only by Bootstrap to generate the correct number of grid classes given // any value of `@grid-columns`. .make-grid-columns() { // Common styles for all sizes of grid columns, widths 1-12 .col(@index) when (@index = 1) { // 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: (@grid-gutter-width / 2); padding-right: (@grid-gutter-width / 2); } } .col(1); // kickstart it } .make-grid-columns-float(@class) { .col(@index) when (@index = 1) { // 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(@index, @class, @type) when (@type = width) { .col-@{class}-@{index} { width: percentage((@index / @grid-columns)); } } .calc-grid(@index, @class, @type) when (@type = push) { .col-@{class}-push-@{index} { left: percentage((@index / @grid-columns)); } } .calc-grid(@index, @class, @type) when (@type = pull) { .col-@{class}-pull-@{index} { right: percentage((@index / @grid-columns)); } } .calc-grid(@index, @class, @type) when (@type = offset) { .col-@{class}-offset-@{index} { margin-left: percentage((@index / @grid-columns)); } } // Basic looping in LESS .make-grid(@index, @class, @type) when (@index > 0) { .calc-grid(@index, @class, @type); // next iteration .make-grid(@index - 1, @class, @type); } // Form validation states // // Used in forms.less to generate the form validation CSS for warnings, errors, // and successes. .form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { // Color the label and help text .help-block, .control-label, .radio, .checkbox, .radio-inline, .checkbox-inline { color: @text-color; } // Set the border and box shadow on specific inputs to match .form-control { border-color: @border-color; .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work &:focus { border-color: darken(@border-color, 10%); @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); .box-shadow(@shadow); } } // Set validation states also for addons .input-group-addon { color: @text-color; border-color: @border-color; background-color: @background-color; } } // Form control focus state // // Generate a customized focus state and for any input with the specified color, // which defaults to the `@input-focus-border` variable. // // We highly encourage you to not customize the default value, but instead use // this to tweak colors on an as-needed basis. This aesthetic change is based on // WebKit's default styles, but applicable to a wider range of browsers. Its // usability and accessibility should be taken into account with any change. // // Example usage: change the default blue border and shadow to white for better // contrast against a dark gray background. .form-control-focus(@color: @input-border-focus) { @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); &:focus { border-color: @color; outline: 0; .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); } } // Form control sizing // // Relative text size, padding, and border-radii changes for form controls. For // horizontal sizing, wrap controls in the predefined grid classes. `