Merge branch 'daniel/landing-page'
diff --git a/Gruntfile.js b/Gruntfile.js
index e8e7f23..333bd3c 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -73,6 +73,7 @@
'<%= meta.src.css_soc_dir %>/search_page.css': '<%= meta.src.less_soc_dir %>/search_page.less',
'<%= meta.src.css_soc_dir %>/server-error-style.css': '<%= meta.src.less_soc_dir %>/server-error-style.less',
'<%= meta.src.css_soc_dir %>/user-error-style.css': '<%= meta.src.less_soc_dir %>/user-error-style.less',
+ '<%= meta.src.css_soc_dir %>/main.css': '<%= meta.src.less_soc_dir %>/main.less',
/* Development GSOC files */
'<%= meta.src.css_gsoc_dir %>/buttons.css': '<%= meta.src.less_gsoc_dir %>/buttons.less',
'<%= meta.src.css_gsoc_dir %>/dashboard.css': '<%= meta.src.less_gsoc_dir %>/dashboard.less',
@@ -107,6 +108,7 @@
'<%= meta.build.css_soc_dir %>/search_page.css': '<%= meta.src.less_soc_dir %>/search_page.less',
'<%= meta.build.css_soc_dir %>/server-error-style.css': '<%= meta.src.less_soc_dir %>/server-error-style.less',
'<%= meta.build.css_soc_dir %>/user-error-style.css': '<%= meta.src.less_soc_dir %>/user-error-style.less',
+ '<%= meta.build.css_soc_dir %>/main.css': '<%= meta.src.less_soc_dir %>/main.less',
/* Build GSOC files */
'<%= meta.build.css_gsoc_dir %>/buttons.css': '<%= meta.src.less_gsoc_dir %>/buttons.less',
'<%= meta.build.css_gsoc_dir %>/dashboard.css': '<%= meta.src.less_gsoc_dir %>/dashboard.less',
diff --git a/app/melange/content/html/melange/base.html b/app/melange/content/html/melange/base.html
new file mode 100644
index 0000000..f8ba285
--- /dev/null
+++ b/app/melange/content/html/melange/base.html
@@ -0,0 +1,39 @@
+{% extends "melange/root.html" %}
+{% comment %}
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+{% endcomment %}
+
+{% block stylesheets %}
+ <link rel="stylesheet" type="text/css" media="screen" href="/soc/content/{{ app_version }}/css/soc/main.css" />
+ <link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,400,300,600' rel='stylesheet' type='text/css'>
+{% endblock stylesheets %}
+
+{% block body %}
+ <header class="main-header" role="banner">
+ <h1><span>Welcome to </span><span class="visuallyhidden">melange</span><img src="/soc/content/{{ app_version }}/images/soc/logo/melange-logo.png" alt="melange"/></h1>
+ <p>{{ site_description }}</p>
+ </header>
+
+ <main class="main-content" role="main">
+ {% block page_content %}
+ {{ templ.render }}
+ {% endblock page_content %}
+ </main>
+
+ <footer class="main-footer" role="contentinfo">
+ <p>
+ <span class="powered">Powered by: <img class="melange-logo" src="/soc/content/{{ app_version }}/images/soc/logo/melange-logo.png" alt="melange"/></span>
+ <span class="empowered">Empowered by: <a class="ir echoditto-logo" href="http://www.echoditto.com/">echoditto</a> <span class="plus-symbol">+</span> <a class="ir neal-maher-logo" href="http://nealmaher.com/">neal maher</a></span>
+ </p>
+ </footer>
+{% endblock body %}
diff --git a/app/melange/content/html/melange/landing_page/_contact_us_section.html b/app/melange/content/html/melange/landing_page/_contact_us_section.html
new file mode 100644
index 0000000..19e15f4
--- /dev/null
+++ b/app/melange/content/html/melange/landing_page/_contact_us_section.html
@@ -0,0 +1,7 @@
+<h3>Find us on ...</h3>
+<ul class="no-list">
+ {% if google_plus %}<li class="google-icon"><a class="ir" href="{{ google_plus }}">google+</a></li>{% endif %}
+ {% if blog %}<li class="blogger-icon"><a class="ir" href="{{ blog }}">blogger</a></li>{% endif %}
+ {% if irc_channel %}<li class="irc-icon"><a href="{{ irc_channel }}">irc</a></li>{% endif %}
+ {% if mailing_list %}<li class="email-icon"><a class="ir" href="{{ mailing_list }}">email</a></li>{% endif %}
+</ul>
diff --git a/app/melange/content/html/melange/landing_page/_program_section.html b/app/melange/content/html/melange/landing_page/_program_section.html
new file mode 100644
index 0000000..e4ae2c1
--- /dev/null
+++ b/app/melange/content/html/melange/landing_page/_program_section.html
@@ -0,0 +1,20 @@
+<div class="project {% if is_active %} active{% endif %}">
+ <a href="{{ homepage_url }}">
+ <div class="active-banner">
+ <div class="triangle-top"></div>
+ <div class="triangle-bottom"></div>
+ <p>Currently<br>Active!</p>
+ </div>
+ <div class="project-image">
+ <img src="/soc/content/{{ app_version }}/{{ image_path }}" alt="{{ program.name }}" />
+ </div>
+ <div class="project-info">
+ <div class="project-title>{{ program.name }}</div>
+ <div class="project-description">
+ <p>{{ program.description }}</p>
+ <p class="unactive-description">TODO(daniel): unactive description</p>
+ <p class="project-button">Visit</p>
+ </div>
+ </div>
+ </a>
+</div>
\ No newline at end of file
diff --git a/app/melange/content/html/melange/landing_page/landing_page.html b/app/melange/content/html/melange/landing_page/landing_page.html
new file mode 100644
index 0000000..01293dd
--- /dev/null
+++ b/app/melange/content/html/melange/landing_page/landing_page.html
@@ -0,0 +1,32 @@
+{% extends "melange/base.html" %}
+{% comment %}
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+{% endcomment %}
+
+{% block page_content %}
+<main class="main-content" role="main">
+ <section class="projects {% if active_programs_counter == 1 %}one-active{% else %}two-active{% endif %}">
+ {% for program_section in program_sections %}
+ {{ program_section.render }}
+ {% empty %}
+ <span>Sorry, there are no active programs at this time</span>
+ {% endfor %}
+ </section>
+
+ {% if contact_us_section.isAnyContactChannelSet %}
+ <section class="main-footer" role="contentinfo">
+ {{ contact_us_section.render }}
+ </section>
+ {% endif %}
+</main>
+{% endblock page_content %}
diff --git a/app/soc/templates/soc/base.html b/app/melange/content/html/melange/root.html
similarity index 100%
rename from app/soc/templates/soc/base.html
rename to app/melange/content/html/melange/root.html
diff --git a/app/settings.py b/app/settings.py
index 229a8ef..b72a2b7 100755
--- a/app/settings.py
+++ b/app/settings.py
@@ -91,6 +91,7 @@
# TODO(proto): customize the template search directories
os.path.join(ROOT_PATH, 'soc', 'templates'),
os.path.join(ROOT_PATH, 'shell', 'templates'),
+ os.path.join(ROOT_PATH, 'melange', 'content', 'html'),
os.path.join(ROOT_PATH, 'summerofcode', 'content', 'html'),
os.path.join(ROOT_PATH, 'codein', 'content', 'html'),
)
diff --git a/app/soc/content/images/gci/logo/landing-page-gci2013.png b/app/soc/content/images/gci/logo/landing-page-gci2013.png
new file mode 100644
index 0000000..f25270b
--- /dev/null
+++ b/app/soc/content/images/gci/logo/landing-page-gci2013.png
Binary files differ
diff --git a/app/soc/content/images/gsoc/logo/landing-page-gsoc2014.png b/app/soc/content/images/gsoc/logo/landing-page-gsoc2014.png
new file mode 100644
index 0000000..bb1db26
--- /dev/null
+++ b/app/soc/content/images/gsoc/logo/landing-page-gsoc2014.png
Binary files differ
diff --git a/app/soc/content/images/soc/active-bg-hover.png b/app/soc/content/images/soc/active-bg-hover.png
new file mode 100644
index 0000000..a144059
--- /dev/null
+++ b/app/soc/content/images/soc/active-bg-hover.png
Binary files differ
diff --git a/app/soc/content/images/soc/active-bg.jpg b/app/soc/content/images/soc/active-bg.jpg
new file mode 100644
index 0000000..f8a3c97
--- /dev/null
+++ b/app/soc/content/images/soc/active-bg.jpg
Binary files differ
diff --git a/app/soc/content/images/soc/arrow-bottom.png b/app/soc/content/images/soc/arrow-bottom.png
new file mode 100644
index 0000000..0f60abc
--- /dev/null
+++ b/app/soc/content/images/soc/arrow-bottom.png
Binary files differ
diff --git a/app/soc/content/images/soc/arrow-bottom.svg b/app/soc/content/images/soc/arrow-bottom.svg
new file mode 100644
index 0000000..9633af9
--- /dev/null
+++ b/app/soc/content/images/soc/arrow-bottom.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="100px" height="19px" viewBox="0 0 100 19" enable-background="new 0 0 100 19" xml:space="preserve">
+<polygon fill="#F19906" points="50,19 0,0 100,0 "/>
+</svg>
diff --git a/app/soc/content/images/soc/arrow-top.png b/app/soc/content/images/soc/arrow-top.png
new file mode 100644
index 0000000..23be340
--- /dev/null
+++ b/app/soc/content/images/soc/arrow-top.png
Binary files differ
diff --git a/app/soc/content/images/soc/arrow-top.svg b/app/soc/content/images/soc/arrow-top.svg
new file mode 100644
index 0000000..68a605f
--- /dev/null
+++ b/app/soc/content/images/soc/arrow-top.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="12px" height="10px" viewBox="0 0 12 10" enable-background="new 0 0 12 10" xml:space="preserve">
+<polygon fill="#D96500" points="12,10 0,10 12,0 "/>
+</svg>
diff --git a/app/soc/content/images/soc/blogger-icon-sprite.png b/app/soc/content/images/soc/blogger-icon-sprite.png
new file mode 100644
index 0000000..3836f7e
--- /dev/null
+++ b/app/soc/content/images/soc/blogger-icon-sprite.png
Binary files differ
diff --git a/app/soc/content/images/soc/blogger-icon-sprite.svg b/app/soc/content/images/soc/blogger-icon-sprite.svg
new file mode 100644
index 0000000..1a04d62
--- /dev/null
+++ b/app/soc/content/images/soc/blogger-icon-sprite.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="56px" height="28px" viewBox="0 0 56 28" enable-background="new 0 0 56 28" xml:space="preserve">
+<g id="Layer_2" display="none">
+ <rect display="inline" fill="#F680FF" width="28" height="28"/>
+ <rect x="28" display="inline" fill="#F9C5FF" width="28" height="28"/>
+</g>
+<path fill="#1F93CF" d="M25.309,10.838h-1.147c-1.126,0-1.791-0.703-1.791-1.527V8.577c0-3.738-4.079-7.664-7.594-7.664H9.242
+ c-4.65,0-8.313,3.663-8.313,8.313v9.93c0,4.366,3.758,7.931,7.621,7.931h10.512c4.287,0,8.008-3.604,8.008-8.008v-6.285
+ C27.07,11.626,26.73,10.838,25.309,10.838z M9.242,7.793h4.751c0.837,0,1.522,0.685,1.522,1.522c0,0.834-0.69,1.522-1.522,1.522
+ H9.242c-0.839,0-1.524-0.685-1.524-1.522C7.719,8.482,8.407,7.793,9.242,7.793z M18.681,20.305H9.242
+ c-0.837,0-1.524-0.685-1.524-1.522c0.001-0.834,0.689-1.524,1.524-1.524h9.439c0.839,0,1.524,0.685,1.524,1.524
+ C20.205,19.616,19.514,20.305,18.681,20.305z"/>
+<path fill="#F29B07" d="M53.309,10.838h-1.147c-1.126,0-1.791-0.703-1.791-1.527V8.577c0-3.738-4.079-7.664-7.594-7.664h-5.535
+ c-4.65,0-8.313,3.663-8.313,8.313v9.93c0,4.366,3.758,7.931,7.621,7.931h10.512c4.287,0,8.008-3.604,8.008-8.008v-6.285
+ C55.07,11.626,54.73,10.838,53.309,10.838z M37.242,7.793h4.751c0.837,0,1.522,0.685,1.522,1.522c0,0.834-0.69,1.522-1.522,1.522
+ h-4.751c-0.839,0-1.524-0.685-1.524-1.522C35.719,8.482,36.407,7.793,37.242,7.793z M46.681,20.305h-9.439
+ c-0.837,0-1.524-0.685-1.524-1.522c0.001-0.834,0.689-1.524,1.524-1.524h9.439c0.839,0,1.524,0.685,1.524,1.524
+ C48.205,19.616,47.514,20.305,46.681,20.305z"/>
+<g id="Layer_3" display="none">
+ <path display="inline" fill="#1F93CF" d="M24.745,5.092H3.637c-1.186,0-2.931,0.977-2.931,2.394v13.138
+ c0,1.433,1.717,2.285,2.931,2.285h21.108c1.263,0,2.549-0.941,2.549-2.284V7.486C27.294,6.137,26.008,5.092,24.745,5.092z
+ M24.712,6.736c-3.09,2.467-7.842,5.822-8.881,6.43c-1.049,0.616-2.359,0.663-3.417,0.118c-1.173-0.603-6.176-4.389-8.959-6.525
+ C3.517,6.75,3.578,6.736,3.637,6.736H24.712z M11.673,14.731c0.723,0.371,1.525,0.556,2.33,0.556c0.916,0,1.836-0.239,2.647-0.713
+ c0.147-0.086,0.372-0.276,0.629-0.449l5.555,7.139H5.29l5.524-7.099C11.171,14.399,11.469,14.626,11.673,14.731z M2.077,20.624
+ V7.91c1.645,1.188,4.965,3.721,7.297,5.376l-6.246,8.008C2.615,21.159,2.077,20.789,2.077,20.624z M24.801,21.336L18.5,13.239
+ c2.231-1.586,5.504-4.068,7.148-5.276v12.66C25.649,20.926,25.251,21.275,24.801,21.336z"/>
+ <path display="inline" fill="#F29B07" d="M52.745,5.092H31.637c-1.186,0-2.931,0.977-2.931,2.394v13.138
+ c0,1.433,1.717,2.285,2.931,2.285h21.108c1.263,0,2.549-0.941,2.549-2.284V7.486C55.294,6.137,54.008,5.092,52.745,5.092z
+ M52.712,6.736c-3.09,2.467-7.842,5.822-8.881,6.43c-1.049,0.616-2.359,0.663-3.417,0.118c-1.173-0.603-6.176-4.389-8.959-6.525
+ c0.061-0.009,0.122-0.023,0.182-0.023C31.637,6.736,52.712,6.736,52.712,6.736z M39.673,14.731c0.723,0.371,1.525,0.556,2.33,0.556
+ c0.916,0,1.836-0.239,2.647-0.713c0.147-0.086,0.372-0.276,0.629-0.449l5.555,7.139H33.29l5.524-7.099
+ C39.171,14.399,39.469,14.626,39.673,14.731z M30.077,20.624V7.91c1.645,1.188,4.965,3.721,7.297,5.376l-6.246,8.008
+ C30.615,21.159,30.077,20.789,30.077,20.624z M52.801,21.336L46.5,13.239c2.231-1.586,5.504-4.068,7.148-5.276v12.66
+ C53.649,20.926,53.251,21.275,52.801,21.336z"/>
+</g>
+</svg>
diff --git a/app/soc/content/images/soc/echoditto-logo-sprite.png b/app/soc/content/images/soc/echoditto-logo-sprite.png
new file mode 100644
index 0000000..809cf31
--- /dev/null
+++ b/app/soc/content/images/soc/echoditto-logo-sprite.png
Binary files differ
diff --git a/app/soc/content/images/soc/email-icon-sprite.png b/app/soc/content/images/soc/email-icon-sprite.png
new file mode 100644
index 0000000..0a5bf50
--- /dev/null
+++ b/app/soc/content/images/soc/email-icon-sprite.png
Binary files differ
diff --git a/app/soc/content/images/soc/email-icon-sprite.svg b/app/soc/content/images/soc/email-icon-sprite.svg
new file mode 100644
index 0000000..fbf7a5d
--- /dev/null
+++ b/app/soc/content/images/soc/email-icon-sprite.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="56px"
+ height="28px" viewBox="0 0 56 28" enable-background="new 0 0 56 28" xml:space="preserve">
+<g id="Layer_2" display="none">
+ <rect display="inline" fill="#F680FF" width="28" height="28"/>
+ <rect x="28" display="inline" fill="#F9C5FF" width="28" height="28"/>
+</g>
+<g id="Layer_1" display="none">
+ <path display="inline" fill-rule="evenodd" clip-rule="evenodd" fill="#1F93CF" d="M9.242,0.913h5.535
+ c3.515,0,7.594,3.926,7.594,7.664v0.734c0,0.824,0.665,1.527,1.791,1.527h1.147c1.421,0,1.761,0.788,1.761,1.956v6.285
+ c0,4.404-3.721,8.008-8.008,8.008H8.55c-3.863,0-7.621-3.565-7.621-7.931V9.226C0.929,4.576,4.592,0.913,9.242,0.913L9.242,0.913z
+ M9.242,7.793h4.751c0.837,0,1.522,0.685,1.522,1.522c0,0.834-0.69,1.522-1.522,1.522H9.242c-0.839,0-1.524-0.685-1.524-1.522
+ C7.719,8.482,8.407,7.793,9.242,7.793L9.242,7.793z M9.242,17.259h9.439c0.839,0,1.524,0.685,1.524,1.524
+ c0,0.833-0.691,1.522-1.524,1.522H9.242c-0.837,0-1.524-0.685-1.524-1.522C7.719,17.949,8.407,17.259,9.242,17.259L9.242,17.259z"
+ />
+ <path display="inline" fill-rule="evenodd" clip-rule="evenodd" fill="#F29B07" d="M37.242,0.913h5.535
+ c3.515,0,7.594,3.926,7.594,7.664v0.734c0,0.824,0.665,1.527,1.791,1.527h1.147c1.421,0,1.761,0.788,1.761,1.956v6.285
+ c0,4.404-3.721,8.008-8.008,8.008H36.55c-3.863,0-7.621-3.565-7.621-7.931V9.226C28.929,4.576,32.592,0.913,37.242,0.913
+ L37.242,0.913z M37.242,7.793h4.751c0.837,0,1.522,0.685,1.522,1.522c0,0.834-0.69,1.522-1.522,1.522h-4.751
+ c-0.839,0-1.524-0.685-1.524-1.522C35.719,8.482,36.407,7.793,37.242,7.793L37.242,7.793z M37.242,17.259h9.439
+ c0.839,0,1.524,0.685,1.524,1.524c0,0.833-0.691,1.522-1.524,1.522h-9.439c-0.837,0-1.524-0.685-1.524-1.522
+ C35.719,17.949,36.407,17.259,37.242,17.259L37.242,17.259z"/>
+</g>
+<g id="Layer_4" display="none">
+ <g display="inline">
+ <polygon fill="#1F93CF" points="27,13 24,13 24,10 22,10 22,13 19,13 19,15 22,15 22,17 24,17 24,15 27,15 "/>
+ <path fill="#1F93CF" d="M14.644,15.739l-1.209-0.923c-0.369-0.299-0.872-0.695-0.872-1.421c0-0.728,0.503-1.192,0.939-1.621
+ c1.409-1.089,2.818-2.111,2.818-4.556c0-2.513-1.529-3.218-2.3-4.218h1.988l2.172-1.465l-6.994-0.07
+ c-1.813,0-4.257,0.153-6.17,1.706C3.576,4.393,3.102,6.173,3.102,7.693c0,2.576,2.013,5.18,5.569,5.18
+ c0.336,0,0.703-0.037,1.074-0.07c-0.167,0.396-0.336,0.725-0.336,1.287c0,1.024,0.536,1.65,1.007,2.245
+ c-1.509,0.101-4.329,0.265-6.407,1.52c-1.982,1.158-2.584,2.842-2.584,4.033c0,2.447,2.252,4.751,7.117,4.751
+ c5.77,0,8.919-3.164,8.919-6.271C17.461,18.088,16.12,16.963,14.644,15.739z M10.249,12.022c-2.886,0-4.194-3.669-4.194-5.883
+ c0-0.86,0.167-1.834,0.737-2.529c0.538-0.662,1.477-1.008,2.35-1.008c2.784,0,4.226,3.702,4.226,6.082
+ c0,0.595-0.067,1.568-0.838,2.33C11.992,11.543,11.087,12.022,10.249,12.022z M10.278,25.229c-3.589,0-5.905-1.687-5.905-4.034
+ c0-2.347,2.147-3.14,2.885-3.404c1.409-0.463,3.222-0.53,3.524-0.53c0.334,0,0.502,0,0.769,0.034
+ c2.552,1.786,3.659,2.676,3.659,4.364C15.211,23.705,13.498,25.229,10.278,25.229z"/>
+ </g>
+ <g display="inline">
+ <polygon fill="#F29B07" points="55,13 52,13 52,10 50,10 50,13 47,13 47,15 50,15 50,17 52,17 52,15 55,15 "/>
+ <path fill="#F29B07" d="M42.432,15.687l-1.209-0.923c-0.369-0.299-0.872-0.695-0.872-1.421c0-0.728,0.503-1.192,0.939-1.621
+ c1.409-1.089,2.818-2.085,2.818-4.53c0-2.513-1.529-3.192-2.3-4.192h1.988l2.172-1.491l-6.994-0.083
+ c-1.813,0-4.257,0.146-6.17,1.7c-1.441,1.222-1.914,2.998-1.914,4.518c0,2.576,2.013,5.178,5.569,5.178
+ c0.336,0,0.703-0.038,1.074-0.07c-0.167,0.396-0.336,0.725-0.336,1.287c0,1.024,0.536,1.65,1.007,2.245
+ c-1.509,0.101-4.329,0.265-6.407,1.52c-1.982,1.158-2.584,2.842-2.584,4.033c0,2.447,2.252,4.751,7.117,4.751
+ c5.77,0,8.919-3.164,8.919-6.271C45.249,18.036,43.907,16.911,42.432,15.687z M38.037,11.97c-2.886,0-4.194-3.669-4.194-5.883
+ c0-0.86,0.167-1.834,0.737-2.529c0.538-0.662,1.477-1.008,2.35-1.008c2.784,0,4.226,3.702,4.226,6.082
+ c0,0.595-0.067,1.568-0.838,2.33C39.779,11.491,38.875,11.97,38.037,11.97z M38.066,25.176c-3.589,0-5.905-1.687-5.905-4.034
+ c0-2.347,2.147-3.14,2.885-3.404c1.409-0.463,3.222-0.53,3.524-0.53c0.334,0,0.502,0,0.769,0.034
+ c2.552,1.786,3.659,2.676,3.659,4.364C42.998,23.653,41.285,25.176,38.066,25.176z"/>
+ </g>
+</g>
+<g id="Layer_3">
+ <path fill="#1F93CF" d="M25.133,4.77H3.263c-1.229,0-3.037,1.012-3.037,2.48v13.612c0,1.485,1.779,2.367,3.037,2.367h21.87
+ c1.309,0,2.641-0.975,2.641-2.367V7.25C27.774,5.853,26.442,4.77,25.133,4.77z M25.099,6.474c-3.202,2.556-8.125,6.032-9.201,6.662
+ c-1.087,0.638-2.445,0.687-3.54,0.123c-1.215-0.625-6.399-4.547-9.283-6.761c0.063-0.009,0.127-0.024,0.188-0.024H25.099z
+ M11.589,14.758c0.749,0.385,1.58,0.576,2.414,0.576c0.949,0,1.902-0.248,2.742-0.739c0.153-0.089,0.385-0.286,0.652-0.465
+ l5.756,7.397H4.976l5.724-7.355C11.069,14.414,11.378,14.649,11.589,14.758z M1.646,20.863V7.69
+ c1.704,1.231,5.145,3.856,7.561,5.57l-6.472,8.298C2.203,21.418,1.646,21.035,1.646,20.863z M25.191,21.601l-6.528-8.389
+ c2.311-1.643,5.703-4.215,7.407-5.467v13.118C26.07,21.176,25.657,21.538,25.191,21.601z"/>
+ <path fill="#F29B07" d="M53.133,4.77h-21.87c-1.229,0-3.037,1.012-3.037,2.48v13.612c0,1.485,1.779,2.367,3.037,2.367h21.87
+ c1.309,0,2.641-0.975,2.641-2.367V7.25C55.774,5.853,54.442,4.77,53.133,4.77z M53.099,6.474c-3.202,2.556-8.125,6.032-9.201,6.662
+ c-1.087,0.638-2.445,0.687-3.54,0.123c-1.215-0.625-6.399-4.547-9.283-6.761c0.063-0.009,0.127-0.024,0.188-0.024H53.099z
+ M39.589,14.758c0.749,0.385,1.58,0.576,2.414,0.576c0.949,0,1.902-0.248,2.742-0.739c0.153-0.089,0.385-0.286,0.652-0.465
+ l5.756,7.397H32.976l5.724-7.355C39.069,14.414,39.378,14.649,39.589,14.758z M29.646,20.863V7.69
+ c1.704,1.231,5.145,3.856,7.561,5.57l-6.472,8.298C30.203,21.418,29.646,21.035,29.646,20.863z M53.191,21.601l-6.528-8.389
+ c2.311-1.643,5.703-4.215,7.407-5.467v13.118C54.07,21.176,53.657,21.538,53.191,21.601z"/>
+</g>
+</svg>
diff --git a/app/soc/content/images/soc/google-icon-sprite.png b/app/soc/content/images/soc/google-icon-sprite.png
new file mode 100644
index 0000000..f32499c
--- /dev/null
+++ b/app/soc/content/images/soc/google-icon-sprite.png
Binary files differ
diff --git a/app/soc/content/images/soc/google-icon-sprite.svg b/app/soc/content/images/soc/google-icon-sprite.svg
new file mode 100644
index 0000000..8afa8df
--- /dev/null
+++ b/app/soc/content/images/soc/google-icon-sprite.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="56px"
+ height="28px" viewBox="0 0 56 28" enable-background="new 0 0 56 28" xml:space="preserve">
+<g id="Layer_2" display="none">
+ <rect display="inline" fill="#F680FF" width="28" height="28"/>
+ <rect x="28" display="inline" fill="#F9C5FF" width="28" height="28"/>
+</g>
+<g id="Layer_1" display="none">
+ <path display="inline" fill-rule="evenodd" clip-rule="evenodd" fill="#1F93CF" d="M9.242,0.913h5.535
+ c3.515,0,7.594,3.926,7.594,7.664v0.734c0,0.824,0.665,1.527,1.791,1.527h1.147c1.421,0,1.761,0.788,1.761,1.956v6.285
+ c0,4.404-3.721,8.008-8.008,8.008H8.55c-3.863,0-7.621-3.565-7.621-7.931V9.226C0.929,4.576,4.592,0.913,9.242,0.913L9.242,0.913z
+ M9.242,7.793h4.751c0.837,0,1.522,0.685,1.522,1.522c0,0.834-0.69,1.522-1.522,1.522H9.242c-0.839,0-1.524-0.685-1.524-1.522
+ C7.719,8.482,8.407,7.793,9.242,7.793L9.242,7.793z M9.242,17.259h9.439c0.839,0,1.524,0.685,1.524,1.524
+ c0,0.833-0.691,1.522-1.524,1.522H9.242c-0.837,0-1.524-0.685-1.524-1.522C7.719,17.949,8.407,17.259,9.242,17.259L9.242,17.259z"
+ />
+ <path display="inline" fill-rule="evenodd" clip-rule="evenodd" fill="#F29B07" d="M37.242,0.913h5.535
+ c3.515,0,7.594,3.926,7.594,7.664v0.734c0,0.824,0.665,1.527,1.791,1.527h1.147c1.421,0,1.761,0.788,1.761,1.956v6.285
+ c0,4.404-3.721,8.008-8.008,8.008H36.55c-3.863,0-7.621-3.565-7.621-7.931V9.226C28.929,4.576,32.592,0.913,37.242,0.913
+ L37.242,0.913z M37.242,7.793h4.751c0.837,0,1.522,0.685,1.522,1.522c0,0.834-0.69,1.522-1.522,1.522h-4.751
+ c-0.839,0-1.524-0.685-1.524-1.522C35.719,8.482,36.407,7.793,37.242,7.793L37.242,7.793z M37.242,17.259h9.439
+ c0.839,0,1.524,0.685,1.524,1.524c0,0.833-0.691,1.522-1.524,1.522h-9.439c-0.837,0-1.524-0.685-1.524-1.522
+ C35.719,17.949,36.407,17.259,37.242,17.259L37.242,17.259z"/>
+</g>
+<g id="Layer_4">
+ <g>
+ <polygon fill="#1F93CF" points="27,13 24,13 24,10 22,10 22,13 19,13 19,15 22,15 22,17 24,17 24,15 27,15 "/>
+ <path fill="#1F93CF" d="M14.644,15.739l-1.209-0.923c-0.369-0.299-0.872-0.695-0.872-1.421c0-0.728,0.503-1.192,0.939-1.621
+ c1.409-1.089,2.818-2.111,2.818-4.556c0-2.513-1.529-3.218-2.3-4.218h1.988l2.172-1.465l-6.994-0.07
+ c-1.813,0-4.257,0.153-6.17,1.706C3.576,4.393,3.102,6.173,3.102,7.693c0,2.576,2.013,5.18,5.569,5.18
+ c0.336,0,0.703-0.037,1.074-0.07c-0.167,0.396-0.336,0.725-0.336,1.287c0,1.024,0.536,1.65,1.007,2.245
+ c-1.509,0.101-4.329,0.265-6.407,1.52c-1.982,1.158-2.584,2.842-2.584,4.033c0,2.447,2.252,4.751,7.117,4.751
+ c5.77,0,8.919-3.164,8.919-6.271C17.461,18.088,16.12,16.963,14.644,15.739z M10.249,12.022c-2.886,0-4.194-3.669-4.194-5.883
+ c0-0.86,0.167-1.834,0.737-2.529c0.538-0.662,1.477-1.008,2.35-1.008c2.784,0,4.226,3.702,4.226,6.082
+ c0,0.595-0.067,1.568-0.838,2.33C11.992,11.543,11.087,12.022,10.249,12.022z M10.278,25.229c-3.589,0-5.905-1.687-5.905-4.034
+ c0-2.347,2.147-3.14,2.885-3.404c1.409-0.463,3.222-0.53,3.524-0.53c0.334,0,0.502,0,0.769,0.034
+ c2.552,1.786,3.659,2.676,3.659,4.364C15.211,23.705,13.498,25.229,10.278,25.229z"/>
+ </g>
+ <g>
+ <polygon fill="#F29B07" points="55,13 52,13 52,10 50,10 50,13 47,13 47,15 50,15 50,17 52,17 52,15 55,15 "/>
+ <path fill="#F29B07" d="M42.432,15.687l-1.209-0.923c-0.369-0.299-0.872-0.695-0.872-1.421c0-0.728,0.503-1.192,0.939-1.621
+ c1.409-1.089,2.818-2.085,2.818-4.53c0-2.513-1.529-3.192-2.3-4.192h1.988l2.172-1.491l-6.994-0.083
+ c-1.813,0-4.257,0.146-6.17,1.7c-1.441,1.222-1.914,2.998-1.914,4.518c0,2.576,2.013,5.178,5.569,5.178
+ c0.336,0,0.703-0.038,1.074-0.07c-0.167,0.396-0.336,0.725-0.336,1.287c0,1.024,0.536,1.65,1.007,2.245
+ c-1.509,0.101-4.329,0.265-6.407,1.52c-1.982,1.158-2.584,2.842-2.584,4.033c0,2.447,2.252,4.751,7.117,4.751
+ c5.77,0,8.919-3.164,8.919-6.271C45.249,18.036,43.907,16.911,42.432,15.687z M38.037,11.97c-2.886,0-4.194-3.669-4.194-5.883
+ c0-0.86,0.167-1.834,0.737-2.529c0.538-0.662,1.477-1.008,2.35-1.008c2.784,0,4.226,3.702,4.226,6.082
+ c0,0.595-0.067,1.568-0.838,2.33C39.779,11.491,38.875,11.97,38.037,11.97z M38.066,25.176c-3.589,0-5.905-1.687-5.905-4.034
+ c0-2.347,2.147-3.14,2.885-3.404c1.409-0.463,3.222-0.53,3.524-0.53c0.334,0,0.502,0,0.769,0.034
+ c2.552,1.786,3.659,2.676,3.659,4.364C42.998,23.653,41.285,25.176,38.066,25.176z"/>
+ </g>
+</g>
+<g id="Layer_3" display="none">
+ <path display="inline" fill="#1F93CF" d="M24.745,5.092H3.637c-1.186,0-2.931,0.977-2.931,2.394v13.138
+ c0,1.433,1.717,2.285,2.931,2.285h21.108c1.263,0,2.549-0.941,2.549-2.284V7.486C27.294,6.137,26.008,5.092,24.745,5.092z
+ M24.712,6.736c-3.09,2.467-7.842,5.822-8.881,6.43c-1.049,0.616-2.359,0.663-3.417,0.118c-1.173-0.603-6.176-4.389-8.959-6.525
+ C3.517,6.75,3.578,6.736,3.637,6.736H24.712z M11.673,14.731c0.723,0.371,1.525,0.556,2.33,0.556c0.916,0,1.836-0.239,2.647-0.713
+ c0.147-0.086,0.372-0.276,0.629-0.449l5.555,7.139H5.29l5.524-7.099C11.171,14.399,11.469,14.626,11.673,14.731z M2.077,20.624
+ V7.91c1.645,1.188,4.965,3.721,7.297,5.376l-6.246,8.008C2.615,21.159,2.077,20.789,2.077,20.624z M24.801,21.336l-6.301-8.097
+ c2.231-1.586,5.504-4.068,7.148-5.276v12.66C25.649,20.926,25.251,21.275,24.801,21.336z"/>
+ <path display="inline" fill="#F29B07" d="M52.745,5.092H31.637c-1.186,0-2.931,0.977-2.931,2.394v13.138
+ c0,1.433,1.717,2.285,2.931,2.285h21.108c1.263,0,2.549-0.941,2.549-2.284V7.486C55.294,6.137,54.008,5.092,52.745,5.092z
+ M52.712,6.736c-3.09,2.467-7.842,5.822-8.881,6.43c-1.049,0.616-2.359,0.663-3.417,0.118c-1.173-0.603-6.176-4.389-8.959-6.525
+ c0.061-0.009,0.122-0.023,0.182-0.023H52.712z M39.673,14.731c0.723,0.371,1.525,0.556,2.33,0.556c0.916,0,1.836-0.239,2.647-0.713
+ c0.147-0.086,0.372-0.276,0.629-0.449l5.555,7.139H33.29l5.524-7.099C39.171,14.399,39.469,14.626,39.673,14.731z M30.077,20.624
+ V7.91c1.645,1.188,4.965,3.721,7.297,5.376l-6.246,8.008C30.615,21.159,30.077,20.789,30.077,20.624z M52.801,21.336l-6.301-8.097
+ c2.231-1.586,5.504-4.068,7.148-5.276v12.66C53.649,20.926,53.251,21.275,52.801,21.336z"/>
+</g>
+</svg>
diff --git a/app/soc/content/images/soc/house-icon-small.png b/app/soc/content/images/soc/house-icon-small.png
new file mode 100644
index 0000000..e4a6964
--- /dev/null
+++ b/app/soc/content/images/soc/house-icon-small.png
Binary files differ
diff --git a/app/soc/content/images/soc/house-icon-small.svg b/app/soc/content/images/soc/house-icon-small.svg
new file mode 100644
index 0000000..537a64a
--- /dev/null
+++ b/app/soc/content/images/soc/house-icon-small.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="28px" height="14px" viewBox="0 0 28 14" enable-background="new 0 0 28 14" xml:space="preserve">
+<polygon fill="#F6A006" points="20.902,0.096 14.778,5.348 14.778,13.904 18.667,13.904 18.667,8.46 23.333,8.46 23.333,13.904
+ 27.222,13.904 27.222,5.413 "/>
+<polygon fill="#1F93CF" points="6.902,0.096 0.778,5.348 0.778,13.904 4.667,13.904 4.667,8.46 9.333,8.46 9.333,13.904
+ 13.222,13.904 13.222,5.413 "/>
+</svg>
diff --git a/app/soc/content/images/soc/house-icon.png b/app/soc/content/images/soc/house-icon.png
new file mode 100644
index 0000000..268e28f
--- /dev/null
+++ b/app/soc/content/images/soc/house-icon.png
Binary files differ
diff --git a/app/soc/content/images/soc/house-icon.svg b/app/soc/content/images/soc/house-icon.svg
new file mode 100644
index 0000000..3a29ec0
--- /dev/null
+++ b/app/soc/content/images/soc/house-icon.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="36px" height="18px" viewBox="0 0 36 18" enable-background="new 0 0 36 18" xml:space="preserve">
+<g id="Layer_2" display="none">
+ <rect x="-9.163" y="0.318" display="inline" fill="#F78DFF" width="18" height="18"/>
+ <rect x="8.837" y="0.318" display="inline" fill="#F9C5FF" width="18" height="18"/>
+</g>
+<g id="Layer_1_1_">
+ <polygon fill="#F6A006" points="26.874,0.123 19,6.876 19,17.876 24,17.876 24,10.877 30,10.877 30,17.876 35,17.876 35,6.959 "/>
+ <polygon fill="#1F93CF" points="8.874,0.123 1,6.876 1,17.876 6,17.876 6,10.877 12,10.877 12,17.876 17,17.876 17,6.959 "/>
+</g>
+</svg>
diff --git a/app/soc/content/images/soc/logo/melange-logo.png b/app/soc/content/images/soc/logo/melange-logo.png
new file mode 100644
index 0000000..7643a84
--- /dev/null
+++ b/app/soc/content/images/soc/logo/melange-logo.png
Binary files differ
diff --git a/app/soc/content/images/soc/melange.png b/app/soc/content/images/soc/melange.png
new file mode 100644
index 0000000..c279a7b
--- /dev/null
+++ b/app/soc/content/images/soc/melange.png
Binary files differ
diff --git a/app/soc/content/images/soc/neal-maher-logo-sprite.png b/app/soc/content/images/soc/neal-maher-logo-sprite.png
new file mode 100644
index 0000000..a2c3f28
--- /dev/null
+++ b/app/soc/content/images/soc/neal-maher-logo-sprite.png
Binary files differ
diff --git a/app/soc/content/images/soc/non-bg-hover.png b/app/soc/content/images/soc/non-bg-hover.png
new file mode 100644
index 0000000..f49defd
--- /dev/null
+++ b/app/soc/content/images/soc/non-bg-hover.png
Binary files differ
diff --git a/app/soc/content/images/soc/non-bg.png b/app/soc/content/images/soc/non-bg.png
new file mode 100644
index 0000000..9043e06
--- /dev/null
+++ b/app/soc/content/images/soc/non-bg.png
Binary files differ
diff --git a/app/soc/content/less/soc/elements/footer.less b/app/soc/content/less/soc/elements/footer.less
new file mode 100644
index 0000000..a8b17e7
--- /dev/null
+++ b/app/soc/content/less/soc/elements/footer.less
@@ -0,0 +1,58 @@
+// ==========================================================================
+// Footer
+// ==========================================================================
+
+.main-footer {
+ max-width: 700px;
+ padding: 1em 5% 10em;
+ margin: 0 auto;
+ text-align: center;
+
+ p {
+ font-size: 0.8em;
+ color: #999999;
+ }
+
+ .melange-logo {
+ width: 70px;
+ margin: 0 2.5em 0 0.5em;
+ }
+
+ .echoditto-logo {
+ &:extend(.ir); //these styles are in _helper.scss
+ display: inline-block;
+ width: 70px;
+ height: 20px;
+ background: url('@{images_soc_location}/echoditto-logo-sprite.png');
+ margin: 0 5px -3px;
+ &:hover {
+ background-position: 100%;
+ }
+ }
+
+ .neal-maher-logo {
+ &:extend(.ir); //these styles are in _helper.scss
+ display: inline-block;
+ width: 59px;
+ height: 20px;
+ background: url('@{images_soc_location}/neal-maher-logo-sprite.png');
+ margin: 0 5px -3px;
+ &:hover {
+ background-position: 100%;
+ }
+ }
+
+ .powered, .empowered {
+ display: block;
+ margin-bottom: 1em;
+
+ @media @break-medium {
+ display: inline;
+ margin: 0;
+ }
+ }
+}
+
+
+
+
diff --git a/app/soc/content/less/soc/elements/general.less b/app/soc/content/less/soc/elements/general.less
new file mode 100644
index 0000000..7d24e92
--- /dev/null
+++ b/app/soc/content/less/soc/elements/general.less
@@ -0,0 +1,24 @@
+// ==========================================================================
+// General
+// ==========================================================================
+
+body {
+ font-family: @serif;
+ font-size: 100%;
+ line-height: 1.5;
+ color: @web-black;
+ background: #F1F1F1;
+ position: relative;
+ min-width: 300px;
+}
+
+.main-content {
+ max-width: 960px;
+ padding: 0 5%;
+ margin: 0 auto;
+
+ @media @break-medium {
+ padding: 0;
+ width: 960px;
+ }
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/elements/grid.less b/app/soc/content/less/soc/elements/grid.less
new file mode 100644
index 0000000..d5ccadb
--- /dev/null
+++ b/app/soc/content/less/soc/elements/grid.less
@@ -0,0 +1,462 @@
+//
+// Variable Grid System.
+// Learn more ~ http://www.spry-soft.com/grids/
+// Based on 960 Grid System - http://960.gs/
+
+// Licensed under GPL and MIT.
+//
+
+//
+// Forces backgrounds to span full width,
+// even if there is horizontal scrolling.
+// Increase this if your layout is wider.
+
+// Note: IE6 works fine without this fix.
+//
+
+body {
+ min-width: 960px;
+}
+
+// Containers
+// --------------------------------------------------------------------------------------------------*/
+.container_16 {
+ margin-left: auto;
+ margin-right: auto;
+ width: 960px;
+}
+
+// Grid >> Global
+// --------------------------------------------------------------------------------------------------*/
+
+
+.grid_1,
+.grid_2,
+.grid_3,
+.grid_4,
+.grid_5,
+.grid_6,
+.grid_7,
+.grid_8,
+.grid_9,
+.grid_10,
+.grid_11,
+.grid_12,
+.grid_13,
+.grid_14,
+.grid_15,
+.grid_16 {
+ display:inline;
+ float: left;
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+
+
+.push_1, .pull_1,
+.push_2, .pull_2,
+.push_3, .pull_3,
+.push_4, .pull_4,
+.push_5, .pull_5,
+.push_6, .pull_6,
+.push_7, .pull_7,
+.push_8, .pull_8,
+.push_9, .pull_9,
+.push_10, .pull_10,
+.push_11, .pull_11,
+.push_12, .pull_12,
+.push_13, .pull_13,
+.push_14, .pull_14,
+.push_15, .pull_15,
+.push_16, .pull_16 {
+ position:relative;
+}
+
+
+// Grid >> Children (Alpha ~ First, Omega ~ Last)
+// --------------------------------------------------------------------------------------------------*/
+
+.alpha {
+ margin-left: 0;
+}
+
+.omega {
+ margin-right: 0;
+}
+
+// Grid >> 16 Columns
+// --------------------------------------------------------------------------------------------------*/
+
+
+.container_16 .grid_1 {
+ width:40px;
+}
+
+.container_16 .grid_2 {
+ width:100px;
+}
+
+.container_16 .grid_3 {
+ width:160px;
+}
+
+.container_16 .grid_4 {
+ width:220px;
+}
+
+.container_16 .grid_5 {
+ width:280px;
+}
+
+.container_16 .grid_6 {
+ width:340px;
+}
+
+.container_16 .grid_7 {
+ width:400px;
+}
+
+.container_16 .grid_8 {
+ width:460px;
+}
+
+.container_16 .grid_9 {
+ width:520px;
+}
+
+.container_16 .grid_10 {
+ width:580px;
+}
+
+.container_16 .grid_11 {
+ width:640px;
+}
+
+.container_16 .grid_12 {
+ width:700px;
+}
+
+.container_16 .grid_13 {
+ width:760px;
+}
+
+.container_16 .grid_14 {
+ width:820px;
+}
+
+.container_16 .grid_15 {
+ width:880px;
+}
+
+.container_16 .grid_16 {
+ width:940px;
+}
+
+
+
+
+// Prefix Extra Space >> 16 Columns
+// --------------------------------------------------------------------------------------------------*/
+
+
+.container_16 .prefix_1 {
+ padding-left:60px;
+}
+
+.container_16 .prefix_2 {
+ padding-left:120px;
+}
+
+.container_16 .prefix_3 {
+ padding-left:180px;
+}
+
+.container_16 .prefix_4 {
+ padding-left:240px;
+}
+
+.container_16 .prefix_5 {
+ padding-left:300px;
+}
+
+.container_16 .prefix_6 {
+ padding-left:360px;
+}
+
+.container_16 .prefix_7 {
+ padding-left:420px;
+}
+
+.container_16 .prefix_8 {
+ padding-left:480px;
+}
+
+.container_16 .prefix_9 {
+ padding-left:540px;
+}
+
+.container_16 .prefix_10 {
+ padding-left:600px;
+}
+
+.container_16 .prefix_11 {
+ padding-left:660px;
+}
+
+.container_16 .prefix_12 {
+ padding-left:720px;
+}
+
+.container_16 .prefix_13 {
+ padding-left:780px;
+}
+
+.container_16 .prefix_14 {
+ padding-left:840px;
+}
+
+.container_16 .prefix_15 {
+ padding-left:900px;
+}
+
+
+
+// Suffix Extra Space >> 16 Columns
+// --------------------------------------------------------------------------------------------------*/
+
+
+.container_16 .suffix_1 {
+ padding-right:60px;
+}
+
+.container_16 .suffix_2 {
+ padding-right:120px;
+}
+
+.container_16 .suffix_3 {
+ padding-right:180px;
+}
+
+.container_16 .suffix_4 {
+ padding-right:240px;
+}
+
+.container_16 .suffix_5 {
+ padding-right:300px;
+}
+
+.container_16 .suffix_6 {
+ padding-right:360px;
+}
+
+.container_16 .suffix_7 {
+ padding-right:420px;
+}
+
+.container_16 .suffix_8 {
+ padding-right:480px;
+}
+
+.container_16 .suffix_9 {
+ padding-right:540px;
+}
+
+.container_16 .suffix_10 {
+ padding-right:600px;
+}
+
+.container_16 .suffix_11 {
+ padding-right:660px;
+}
+
+.container_16 .suffix_12 {
+ padding-right:720px;
+}
+
+.container_16 .suffix_13 {
+ padding-right:780px;
+}
+
+.container_16 .suffix_14 {
+ padding-right:840px;
+}
+
+.container_16 .suffix_15 {
+ padding-right:900px;
+}
+
+
+
+// Push Space >> 16 Columns
+// --------------------------------------------------------------------------------------------------*/
+
+
+.container_16 .push_1 {
+ left:60px;
+}
+
+.container_16 .push_2 {
+ left:120px;
+}
+
+.container_16 .push_3 {
+ left:180px;
+}
+
+.container_16 .push_4 {
+ left:240px;
+}
+
+.container_16 .push_5 {
+ left:300px;
+}
+
+.container_16 .push_6 {
+ left:360px;
+}
+
+.container_16 .push_7 {
+ left:420px;
+}
+
+.container_16 .push_8 {
+ left:480px;
+}
+
+.container_16 .push_9 {
+ left:540px;
+}
+
+.container_16 .push_10 {
+ left:600px;
+}
+
+.container_16 .push_11 {
+ left:660px;
+}
+
+.container_16 .push_12 {
+ left:720px;
+}
+
+.container_16 .push_13 {
+ left:780px;
+}
+
+.container_16 .push_14 {
+ left:840px;
+}
+
+.container_16 .push_15 {
+ left:900px;
+}
+
+
+
+// Pull Space >> 16 Columns
+//--------------------------------------------------------------------------------------------------*/
+
+
+.container_16 .pull_1 {
+ left:-60px;
+}
+
+.container_16 .pull_2 {
+ left:-120px;
+}
+
+.container_16 .pull_3 {
+ left:-180px;
+}
+
+.container_16 .pull_4 {
+ left:-240px;
+}
+
+.container_16 .pull_5 {
+ left:-300px;
+}
+
+.container_16 .pull_6 {
+ left:-360px;
+}
+
+.container_16 .pull_7 {
+ left:-420px;
+}
+
+.container_16 .pull_8 {
+ left:-480px;
+}
+
+.container_16 .pull_9 {
+ left:-540px;
+}
+
+.container_16 .pull_10 {
+ left:-600px;
+}
+
+.container_16 .pull_11 {
+ left:-660px;
+}
+
+.container_16 .pull_12 {
+ left:-720px;
+}
+
+.container_16 .pull_13 {
+ left:-780px;
+}
+
+.container_16 .pull_14 {
+ left:-840px;
+}
+
+.container_16 .pull_15 {
+ left:-900px;
+}
+
+
+
+
+// `Clear Floated Elements
+//--------------------------------------------------------------------------------------------------*/
+
+/* http://sonspring.com/journal/clearing-floats */
+
+.clear {
+ clear: both;
+ display: block;
+ overflow: hidden;
+ visibility: hidden;
+ width: 0;
+ height: 0;
+}
+
+// http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified */
+
+.clearfix:before,
+.clearfix:after {
+ content: '\0020';
+ display: block;
+ overflow: hidden;
+ visibility: hidden;
+ width: 0;
+ height: 0;
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+//
+// The following zoom:1 rule is specifically for IE6 + IE7.
+// Move to separate stylesheet if invalid CSS is a problem.
+//
+
+.clearfix {
+ zoom: 1;
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/elements/header.less b/app/soc/content/less/soc/elements/header.less
new file mode 100644
index 0000000..24507b3
--- /dev/null
+++ b/app/soc/content/less/soc/elements/header.less
@@ -0,0 +1,14 @@
+// ==========================================================================
+// header
+// ==========================================================================
+
+.main-header {
+ max-width: 700px;
+ padding: 3.5em 5% 3em;
+ margin: 0 auto;
+ text-align: center;
+
+ p {
+ margin: 0;
+ }
+}
diff --git a/app/soc/content/less/soc/elements/headers-styles.less b/app/soc/content/less/soc/elements/headers-styles.less
new file mode 100644
index 0000000..2506cbd
--- /dev/null
+++ b/app/soc/content/less/soc/elements/headers-styles.less
@@ -0,0 +1,45 @@
+// ==========================================================================
+// h1, h2, h3, etc.
+// ==========================================================================
+
+h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5 {
+ text-rendering: optimizelegibility;
+}
+
+h1, .h1 {
+ font-size: 2.5em;
+ line-height: 1em;
+ font-weight: 300;
+ margin: 0 0 .2em 0;
+ color: #333333;
+}
+
+h2, .h2 {
+ font-size: 1.5em;
+ line-height: 1.1em;
+ font-weight: 300;
+ margin: 0 0 .2em 0;
+ color: #333333;
+
+}
+
+h3, .h3 {
+ font-size: 1.5em;
+ line-height: 1.2em;
+ font-weight: 300;
+ margin: 0 0 .2em 0;
+ color: #333333;
+
+}
+
+h4, .h4 {
+ font-size: 1em;
+ font-weight: 600;
+}
+
+h5, .h5 {
+ font-size: 0.846em;
+ line-height: 2.09em;
+ text-transform: uppercase;
+ font-weight: 600;
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/elements/helper.less b/app/soc/content/less/soc/elements/helper.less
new file mode 100644
index 0000000..a80ff87
--- /dev/null
+++ b/app/soc/content/less/soc/elements/helper.less
@@ -0,0 +1,93 @@
+
+// uncomment this if you're feeling daring
+// * {
+// @include box-sizing(border-box);
+// }
+
+img {
+ // for fluid images
+ max-width: 100%;
+ // Remove the gap between images and the bottom of their containers: h5bp.com/i/440
+ vertical-align: middle;
+}
+
+// fluid video
+.fluidvideowrapper {
+ position: relative;
+ padding-bottom: 56.25%;
+ padding-top: 25px;
+ height: 0;
+
+ object, embed, iframe {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ }
+}
+
+// Dont break or wrap text
+.nobr, .together {
+ white-space: nowrap;
+}
+
+// Image replacement
+.ir {
+ background-color: transparent;
+ border: 0;
+ overflow: hidden;
+ /* IE 6/7 fallback */
+ *text-indent: -9999px;
+}
+
+.ir:before {
+ content: "";
+ display: block;
+ width: 0;
+ height: 100%;
+}
+
+// Hide from both screenreaders and browsers: h5bp.com/u
+.hidden {
+ display: none !important;
+ visibility: hidden;
+}
+
+// Hide only visually, but have it available for screenreaders: h5bp.com/v
+.visuallyhidden {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+
+// Extends the .visuallyhidden class to allow the element to be focusable
+// when navigated to via the keyboard: h5bp.com/p
+.visuallyhidden.focusable:active,
+.visuallyhidden.focusable:focus {
+ clip: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ position: static;
+ width: auto;
+}
+
+// Hide visually and from screenreaders, but maintain layout
+.invisible {
+ visibility: hidden;
+}
+
+// text alignment
+.text-left { text-align: left; }
+.text-center { text-align: center; }
+.text-right { text-align: right; }
+
+.clearfix {
+ .clearfix;
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/elements/latest.less b/app/soc/content/less/soc/elements/latest.less
new file mode 100644
index 0000000..95c67c5
--- /dev/null
+++ b/app/soc/content/less/soc/elements/latest.less
@@ -0,0 +1,31 @@
+.latest {
+ max-width: 700px;
+ padding: 1em 5% 3em;
+ margin: 0 auto;
+ text-align: center;
+
+ h3 {
+ margin: 0 0 1em 0;
+ }
+}
+
+.post {
+
+ .date {
+ font-size: .55em;
+ line-height: 1.4em;
+ text-transform: uppercase;
+ letter-spacing: 2.5px;
+ font-weight: 600;
+ color: #999999;
+ margin: 0 0 1em;
+ padding: 0;
+ }
+}
+
+.post-description {
+
+ p {
+ margin-top: 0;
+ }
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/elements/link-styles.less b/app/soc/content/less/soc/elements/link-styles.less
new file mode 100644
index 0000000..43556e0
--- /dev/null
+++ b/app/soc/content/less/soc/elements/link-styles.less
@@ -0,0 +1,9 @@
+a, a:link, a:visited, a:active {
+ text-decoration: none;
+ color: @link-color;
+}
+
+a:hover {
+ text-decoration: none;
+ color: @link-color-hover;
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/elements/projects.less b/app/soc/content/less/soc/elements/projects.less
new file mode 100644
index 0000000..5b3ba3b
--- /dev/null
+++ b/app/soc/content/less/soc/elements/projects.less
@@ -0,0 +1,350 @@
+// ==========================================================================
+// projects
+// ==========================================================================
+@import "common.less";
+
+.projects {
+ max-width: 460px;
+ margin: 0 auto 2em;
+ position: relative;
+
+ @media @break-medium {
+ width: 960px;
+ max-width: 100%;
+ .clearfix;
+ }
+}
+
+.project {
+ background: white;
+ .box-shadow(rgba(0,0,0,.3) 0 0 6px);
+ position: relative;
+ margin: 0 0 3em 0;
+ text-align: center;
+
+ .no-boxshadow & {
+ border: 1px solid #ccc;
+ }
+
+ &:hover {
+ .box-shadow(rgba(0,0,0,.6) 0 0 6px);
+ }
+
+ .no-boxshadow &:hover {
+ border-color: #aaa;
+ }
+
+ h2 {
+ color: @link-color;
+ }
+
+ a:hover h2 {
+ color: @link-color-hover;
+ }
+
+ @media @break-medium {
+ float: left;
+ width: 460px;
+ margin: 10px;
+ }
+
+ a {
+ display: block;
+ width: 100%;
+ height: 100%;
+ }
+}
+
+.project-button {
+ font-size: 1.125em;
+ line-height: 1.25em;
+ margin: 0 auto .5em;
+ width: 65px;
+
+ &:before {
+ content:"";
+ float:left;
+ background: url('@{images_soc_location}/house-icon.svg');
+ width: 18px;
+ height: 18px;
+ padding: 0;
+ margin-right: 8px;
+ }
+
+ .no-svg &:before {
+ background-image: url('@{images_soc_location}/house-icon.png');
+ }
+
+ .active & {
+ color: @google-orange;
+
+ &:before {
+ background-position: 100%;
+ }
+ }
+
+ a:hover & {
+ &:before {
+ background: url('@{images_soc_location}/house-icon.svg');
+ background-position: 100%;
+ }
+
+ }
+
+ .no-svg a:hover &:before {
+ background-image: url('@{images_soc_location}/house-icon.png');
+ }
+
+ .active a:hover & {
+ color: @google-blue;
+ &:before {
+ background: url('@{images_soc_location}/house-icon.svg');
+ }
+ }
+
+ .no-svg .active a:hover &:before {
+ background-image: url('@{images_soc_location}/house-icon.png');
+ }
+
+}
+
+.project-info {
+ padding: 20px;
+}
+
+.project-description {
+ color: @web-black;
+ margin: 0 20px 2em;
+ font-size: .8em;
+}
+
+.project-image {
+ background: url('@{images_soc_location}/non-bg.png');
+ .background-size(cover);
+ padding: 20px;
+ height: 275px;
+ .box-sizing(border-box);
+
+ img {
+ max-height: 100%;
+ }
+
+ .active & {
+ background: url('@{images_soc_location}/active-bg.jpg');
+ .background-size(cover);
+ }
+
+ a:hover & {
+ background: url('@{images_soc_location}/non-bg-hover.png');
+ .background-size(cover);
+
+ .active & {
+ background: url('@{images_soc_location}/active-bg-hover.png');
+ .background-size(cover);
+ }
+ }
+}
+
+
+.active-banner {
+ display: none;
+ position: absolute;
+ top: 0;
+ right: 20px;
+ width: 100px;
+ background: #F19906;
+ .background-image(linear-gradient(top, #FFBD1F, #F19906));
+ color: white;
+ text-align: center;
+ margin: -10px 0 0 0;
+
+ p {
+ font-size: .55em;
+ line-height: 1.4em;
+ text-transform: uppercase;
+ letter-spacing: 2.5px;
+ font-weight: 600;
+ margin: 10px 0 0 0;
+ }
+
+ .triangle-top {
+ background: url('@{images_soc_location}/arrow-top.svg');
+ position: absolute;
+ left: 0;
+ top: 0;
+ margin: 0 0 0 -12px;
+ width: 12px;
+ height: 10px;
+ }
+
+ .no-svg & .triangle-top {
+ background-image: url('@{images_soc_location}/arrow-top.png');
+ }
+
+ .triangle-bottom {
+ background: url('@{images_soc_location}/arrow-bottom.svg');
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ margin: 0 0 -19px 0;
+ width: 100px;
+ height: 19px;
+ }
+
+ .no-svg & .triangle-bottom {
+ background-image: url('@{images_soc_location}/arrow-bottom.png');
+ }
+
+ .active & {
+ display: block;
+ }
+}
+
+.unactive-description {
+ display: none;
+ margin: 5px 0 0 0;
+}
+
+// special only one of them is active styles
+.one-active {
+
+ @media @break-medium {
+
+ // this makes all projects the size of the small one
+ /////////////////////////////////////////////////////
+ .project {
+ width: 300px;
+ float: right;
+ margin-top: 70px;
+ min-height: 360px;
+ }
+
+ .project-image {
+ height: 190px;
+ }
+
+ .project-title {
+ padding: 0 10px;
+ }
+ .project-info {
+ padding: 20px 35px 0;
+ }
+ .project-description {
+ margin: 0 0 1.5em 0;
+
+ p {
+ display: none;
+ &.unactive-description {
+ display: block;
+ }
+ }
+ }
+
+ .project-button {
+ font-size: .9em;
+ width: 50px;
+
+ &:before {
+ background: url('@{images_soc_location}/house-icon-small.svg');
+ width: 14px;
+ height: 14px;
+ }
+ }
+
+ .no-svg & .project-button:before {
+ background-image: url('@{images_soc_location}/house-icon-small.png');
+ }
+
+ a:hover .project-button:before {
+ background: url('@{images_soc_location}/img/house-icon-small.svg');
+ width: 14px;
+ height: 14px;
+ background-position: 100%;
+ }
+
+ .no-svg & a:hover .project-button:before {
+ background-image: url('@{images_soc_location}/house-icon-small.png');
+ }
+
+ // this makes the active project look big
+ /////////////////////////////////////////////////////
+ .active {
+
+ &.project {
+ width: 660px;
+ z-index: 100;
+ height: 400px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ margin-top: 10px;
+
+ a {
+ .clearfix;
+ }
+ }
+
+ .project-image {
+ float: left;
+ width: 400px;
+ height: 100%;
+ padding: 50px 40px;
+ }
+
+ .project-info {
+ text-align: left;
+ padding: 50px 20px 20px 420px;
+ }
+
+ .project-title {
+ padding: 0;
+ font-size: 1.95em;
+ }
+
+ .project-description {
+ margin: 0 0 1.5em 0;
+
+ p {
+ display: block;
+ &.unactive-description {
+ display: none;
+ }
+ }
+ }
+
+ .active-banner {
+ right: 140px;
+ }
+
+ .project-button {
+ position: absolute;
+ bottom: 20px;
+ font-size: 1em;
+ width: 60px;
+
+ &:before {
+ background: url('@{images_soc_location}/house-icon.svg');
+ width: 18px;
+ height: 18px;
+ background-position: 100%;
+ }
+ }
+
+ .no-svg & .project-button:before {
+ background-image: url('@{images_soc_location}/house-icon.png');
+ }
+
+ a:hover .project-button:before {
+ background: url('@{images_soc_location}/house-icon.svg');
+ width: 18px;
+ height: 18px;
+ background-position: 0;
+ }
+
+ .no-svg & a:hover .project-button:before {
+ background-image: url('@{images_soc_location}/house-icon.png');
+ }
+
+ }
+ }
+}
diff --git a/app/soc/content/less/soc/elements/social-media.less b/app/soc/content/less/soc/elements/social-media.less
new file mode 100644
index 0000000..70428d3
--- /dev/null
+++ b/app/soc/content/less/soc/elements/social-media.less
@@ -0,0 +1,61 @@
+.social-media {
+ max-width: 700px;
+ padding: 1em 5% 1.4em;
+ margin: 0 auto;
+ text-align: center;
+
+ li {
+ &:extend(h3);
+ font-weight: 400;
+ display: inline-block;
+ margin: 4px .5em 0;
+ }
+}
+
+
+.blogger-icon, .google-icon, .email-icon {
+ a {
+ &:extend(.ir); //these styles are in _helper.scss
+ display: block;
+ width: 28px;
+ height: 28px;
+ margin-bottom: -5px;
+ }
+}
+
+.google-icon {
+ a {
+ background: url('@{images_soc_location}/google-icon-sprite.svg');
+ &:hover {
+ background-position: 100%;
+ }
+ }
+
+ .no-svg & a {
+ background-image: url('@{images_soc_location}/google-icon-sprite.png');
+ }
+}
+
+.blogger-icon {
+ a {
+ background: url('@{images_soc_location}/blogger-icon-sprite.svg');
+ &:hover {
+ background-position: 100%;
+ }
+ }
+ .no-svg & a {
+ background-image: url('@{images_soc_location}/blogger-icon-sprite.png');
+ }
+}
+
+.email-icon {
+ a {
+ background: url('@{images_soc_location}/email-icon-sprite.svg');
+ &:hover {
+ background-position: 100%;
+ }
+ }
+ .no-svg & a {
+ background-image: url('@{images_soc_location}/email-icon-sprite.png');
+ }
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/ie8-and-down.less b/app/soc/content/less/soc/ie8-and-down.less
new file mode 100644
index 0000000..4f27232
--- /dev/null
+++ b/app/soc/content/less/soc/ie8-and-down.less
@@ -0,0 +1,177 @@
+// ie 8 and down styles!
+
+/* import mixins again */
+@import "mixins";
+
+//all those breakpoint styles
+
+
+// ==========================================================================
+// projects
+// ==========================================================================
+
+
+.projects {
+ width: 960px;
+ max-width: 100%;
+ .clearfix;
+}
+
+.project {
+ float: left;
+ width: 455px;
+ margin: 10px;
+}
+
+.project-image {
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='@{images_soc_location}/non-bg.png', sizingMethod='scale');
+ -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='@{images_soc_location}/non-bg.png', sizingMethod='scale')";
+
+ .active & {
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='@{images_soc_location}/active-bg.jpg', sizingMethod='scale');
+ -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='@{images_soc_location}/active-bg.jpg', sizingMethod='scale')";
+ }
+
+ a:hover & {
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='@{images_soc_location}/non-bg-hover.png', sizingMethod='scale');
+ -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='@{images_soc_location}/non-bg-hover.png', sizingMethod='scale')";
+
+ .active & {
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='@{images_soc_location}/active-bg-hover.png', sizingMethod='scale');
+ -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../img/active-bg-hover.png', sizingMethod='scale')";
+ }
+ }
+}
+.one-active {
+
+ // this makes all projects the size of the small one
+ /////////////////////////////////////////////////////
+ .project {
+ width: 300px;
+ float: right;
+ margin-top: 70px;
+ min-height: 360px;
+ }
+
+ .project-image {
+ height: 190px;
+ }
+
+ .project-title {
+ padding: 0 10px;
+ }
+ .project-info {
+ padding: 20px 35px 0;
+ }
+ .project-description {
+ margin: 0 0 1.5em 0;
+
+ p {
+ display: none;
+ &.unactive-description {
+ display: block;
+ }
+ }
+ }
+
+ .project-button {
+ font-size: .9em;
+ width: 50px;
+
+ &:before {
+ background: url('@{images_soc_location}/house-icon-small.png');
+ width: 14px;
+ height: 14px;
+ }
+ }
+
+ a:hover .project-button:before {
+ background: url('@{images_soc_location}/house-icon-small.png');
+ width: 14px;
+ height: 14px;
+ background-position: 100%;
+ }
+
+
+ // this makes the active project look big
+ /////////////////////////////////////////////////////
+ .active {
+
+ &.project {
+ width: 660px;
+ z-index: 100;
+ height: 400px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ margin-top: 10px;
+
+ a {
+ .clearfix;
+ }
+ }
+
+ .project-image {
+ float: left;
+ width: 400px;
+ height: 100%;
+ padding: 50px 40px;
+ }
+
+ .project-info {
+ text-align: left;
+ padding: 50px 20px 20px 420px;
+ }
+
+ .project-title {
+ padding: 0;
+ font-size: 1.95em;
+ }
+
+ .project-description {
+ margin: 0 0 1.5em 0;
+
+ p {
+ display: block;
+ &.unactive-description {
+ display: none;
+ }
+ }
+ }
+
+ .active-banner {
+ right: 140px;
+ }
+
+ .project-button {
+ position: absolute;
+ bottom: 20px;
+ font-size: 1em;
+ width: 60px;
+
+ &:before {
+ background: url('@{images_soc_location}/house-icon.png');
+ width: 18px;
+ height: 18px;
+ background-position: 100%;
+ }
+ }
+
+ a:hover .project-button:before {
+ background: url('@{images_soc_location}/house-icon.png');
+ width: 18px;
+ height: 18px;
+ background-position: 0;
+ }
+
+ }
+}
+
+
+.main-footer {
+
+ .powered, .empowered {
+ display: inline;
+ margin: 0;
+ }
+}
diff --git a/app/soc/content/less/soc/lesshat.less b/app/soc/content/less/soc/lesshat.less
new file mode 100755
index 0000000..a822a82
--- /dev/null
+++ b/app/soc/content/less/soc/lesshat.less
@@ -0,0 +1,2198 @@
+// LESS Hat 1.1.2
+// LESSHat.com
+// From creators of CSSHat.com
+// 2012
+// Petr Brzek & Jan Kuca
+
+
+// @GlobalConfig
+
+// .animation
+ // .animation-delay
+ // .animation-direction
+ // .animation-duration
+ // .animation-fill-mode
+ // .animation-timing-function
+ // .animation-iteration-count
+ // .animation-name
+ // .animation-play-state
+ // .keyframes - in future
+// .appearance
+// .backface-visibility
+// .background-clip
+// .background-image
+// .background-origin
+// .background-size
+// .border-radius
+ // .border-top-left-radius
+ // .border-top-right-radius
+ // .border-bottom-left-radius
+ // .border-bottom-right-radius
+// .border-image
+// .box-shadow
+// .box-sizing
+// .columns
+ // .column-count
+ // .column-gap
+ // .column-rule
+ // .column-width
+// .font-face
+// .gradient
+// .opacity
+// .perspective
+ // .perspective-origin
+// .size
+// .transform
+ // .transform-origin
+ // .transform-style
+ // .translate
+ // .translate3d
+ // .translateX
+ // .translateY
+ // .translateZ
+ // .scale
+ // .scale3d
+ // .scaleX
+ // .scaleY
+ // .scaleZ
+ // .rotate
+ // .rotate3d
+ // .rotateX
+ // .rotateY
+ // .rotateZ
+ // .skew
+ // .skewX
+ // .skewY
+// .transition
+ // .transition-property
+ // .transition-duration
+ // .transition-timing-function
+ // .transition-delay
+// .user-select
+// DEPRECATED mixins
+
+
+// @GlobalConfig
+
+ // Config supported browsers for your project
+
+ @w3c: true; // Unprefixed W3C syntax
+ @webkit: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @moz: true; // Firefox 4+
+ @opera: true; // Opera 10.5+
+ @ms: true; // IE 10+
+
+ // Signals
+
+ @webkitSignal: 1;
+ @mozSignal: 2;
+ @operaSignal: 3;
+ @msSignal: 4;
+ @w3cSignal: 5;
+
+// .animation
+
+ .animation(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}".replace("[","").replace("]","") || "none"; if( !/^\w*([ X])/.test(arg) ) { arg = arg.replace(/,/g,"") } return arg; })()`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation(nameAnimation 2s linear alternate anim 3s linear alternate ); }
+
+
+ // .animation-delay
+
+ .animation-delay(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "0"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-delay: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-delay: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-delay: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation-delay: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-delay: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-delay(1s); }
+ // element{ .animation-delay(750ms, 2s, 3s); } // For multiple animation-direction
+
+
+ // .animation-direction
+
+ .animation-direction(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "normal"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-direction: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-direction: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-direction: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation-direction: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-direction: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-direction(); }
+ // element{ .animation-direction(normal, alternate); }
+
+
+ // .animation-duration
+
+ .animation-duration(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "0"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-duration: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-duration: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-duration: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation-duration: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-duration: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-duration(2s); }
+
+
+ // .animation-fill-mode
+
+ .animation-fill-mode(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "none"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-fill-mode: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-fill-mode: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-fill-mode: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-fill-mode: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-fill-mode(forwards); }
+
+
+ // .animation-timing-function
+
+ .animation-timing-function(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "ease"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-timing-function: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-timing-function: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-timing-function: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation-timing-function: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-timing-function: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-timing-function(ease-in-out); }
+
+
+ // .animation-iteration-count
+
+ .animation-iteration-count(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "0"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-iteration-count: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-iteration-count: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-iteration-count: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation-iteration-count: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-iteration-count: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-iteration-count(3); }
+
+
+ // .animation-name
+
+ .animation-name(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "none"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-name: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-name: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-name: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation-name: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-name: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-name(myReallyCoolAnimationName); }
+
+
+ // .animation-play-state
+
+ .animation-play-state(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "running"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-animation-play-state: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-animation-play-state: @processing;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-animation-play-state: @processing;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-animation-play-state: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { animation-play-state: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .animation-play-state(paused); }
+
+
+// .appearance
+
+ .appearance(@argument:none){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @argument) when (@signal = 1) { -webkit-appearance: @argument;}
+ .inception (@signal, @argument) when (@signal = 2) { -moz-appearance: @argument;}
+ .inception (@signal, @argument) when (@signal = 5) { appearance: @argument;}
+ .inception (@signal, @argument) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @argument);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .appearance(button); }
+
+
+// .backface-visibility
+
+ .backface-visibility(@argument:visible){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @argument) when (@signal = 1) { -webkit-backface-visibility: @argument;}
+ .inception (@signal, @argument) when (@signal = 2) { -moz-backface-visibility: @argument;}
+ .inception (@signal, @argument) when (@signal = 5) { backface-visibility: @argument;}
+ .inception (@signal, @argument) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @argument);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .backface-visibility(hidden); }
+
+
+// .background-clip
+
+ .background-clip(@arguments:border-box){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-background-clip: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-background-clip: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { background-clip: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .background-clip(padding-box); }
+
+
+// .background-image
+
+ .background-image(...){
+
+ // Local config for disabling properties
+
+ @svg: true; // SVG gradient for IE9
+ @mozLocal: true; // Firefox 4+
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5+, Android
+ @operaLocal: true; // Opera 10.5+
+ @w3cLocal: true; // Unprefixed W3C syntax
+
+ @backgroundSVG: ~`(function(){function K(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c,d,e,f,g,h,i,j,k=0,l=0,m="",n=[];if(!a)return a;do c=a.charCodeAt(k++),d=a.charCodeAt(k++),e=a.charCodeAt(k++),j=c<<16|d<<8|e,f=j>>18&63,g=j>>12&63,h=j>>6&63,i=j&63,n[l++]=b.charAt(f)+b.charAt(g)+b.charAt(h)+b.charAt(i);while(k<a.length);m=n.join("");var o=a.length%3;return(o?m.slice(0,o-3):m)+"===".slice(o||3)}String.prototype.trim===undefined&&(String.prototype.trim=function(){return this.replace(/^\s+/,"").replace(/\s+$/,"")});var a="@{arguments}",b=null,c=!0,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,f=/top/,g=/right/,h=/bottom/,i=/left/,j=/to\s*top/,k=/to\s*right/,l=/to\s*bottom/,m=/to\s*left/,n=/45deg/,o=/-45deg/,p=/\d*deg/;for(var q=0;q<e;q++){if(/linear/.test(d[q])){d[q]=d[q].replace(/linear-gradient\s*\(/,'<?xml version="1.0" ?><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 1 1" preserveAspectRatio="none">');if(f.test(d[q])&&!j.test(d[q])||l.test(d[q])||/180deg/.test(d[q])){var r=null;l.test(d[q])?r=l:/180deg/.test(d[q])?r=/180deg/:r=f,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="0%" y2="100%">')}else if(g.test(d[q])&&!k.test(d[q])||m.test(d[q])||/270deg/.test(d[q])){var r=null;m.test(d[q])?r=m:/270deg/.test(d[q])?r=/270deg/:r=g,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="100%" y1="0%" x2="0%" y2="0%">')}else if(h.test(d[q])&&!l.test(d[q])||j.test(d[q])||/[^\d]0deg/.test(d[q])){var r=null;j.test(d[q])?r=j:/0deg/.test(d[q])?r=/0deg/:r=h,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="100%" x2="0%" y2="0%">')}else if(i.test(d[q])&&!m.test(d[q])||k.test(d[q])||/90deg/.test(d[q])){var r=null;k.test(d[q])?r=k:/90deg/.test(d[q])?r=/90deg/:r=i,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="100%" y2="0%">')}else n.test(d[q])&&!o.test(d[q])?d[q]=d[q].replace(n,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="100%" x2="100%" y2="0%">'):o.test(d[q])?d[q]=d[q].replace(o,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="100%" y2="100%">'):c=!1}try{"".trim(),b=!0}catch(s){b=!1}b&&(d[q]=d[q].trim());if(/linear/.test(d[q])||/radial/.test(d[q])){d[q]=d[q].slice(0,-1),d[q]="url(data:image/svg+xml;base64--"+d[q]+'</linearGradient><rect x="0" y="0" width="1" height="1" fill="url(***)" /></svg>)';var t=d.join("@@@"),u=t.match(/rgba?\(\d+,\s*\d+,\s*\d+,\s*(?:0|1|\.\d+|0\.\d+)\)\s*\d*%*/g)||0,v=t.match(/hsla?\(\d+,\s*\d+%,\s*\d+%,\s*(?:0|1|\.\d+|0\.\d+)\)\s*\d*%*/g)||0,w=[],x=[];for(var y=0;y<u.length;y++)w[y]=u[y].replace(/,/g,"--");for(var z=0;z<v.length;z++)x[z]=v[z].replace(/,/g,"--");for(var A=0;A<u.length;A++)t=t.replace(u[A],w[A]);for(var B=0;B<v.length;B++)t=t.replace(v[B],x[B]);var C=t.split(","),D=0;for(var E=0;E<C.length;E++){C[E]=C[E].replace(/(#\w{3,6})\s*(\d*.?\d*%)?/g,'<stop offset="$2" stop-color="$1" stop-opacity="1"/>').replace(/(rgba?\(\d+--\s*\d+--\s*\d+--\s*(0|1|\.\d+|0\.\d+)\))\s*(\d*.?\d*%)*/g,'<stop offset="$3" stop-color="$1" stop-opacity="$2"/>').replace(/rgba/g,"rgb").replace(/(hsla?\(\d+--\s*\d+%--\s*\d+%--\s*(0|1|\.\d+|0\.\d+)\))\s*(\d*.?\d*%)*/g,'<stop offset="$3" stop-color="$1" stop-opacity="$2"/>').replace(/hsla/g,"hsl").replace(/((?:aqua|black|blue|fuchsia|gray|grey|green|lime|maroon|navy|olive|purple|red|silver|teal|white|yellow))\s*(\d*%)*/g,'<stop offset="$2" stop-color="$1" stop-opacity="1"/>').replace(/\*\*\*/,"#grad-ucgg-generated");try{"".trim(),b=!0}catch(s){b=!1}b&&(C[E]=C[E].trim());if(/offset=""/g.test(C[E])){var F=C.length-2,G=Math.round(100/F)*D;var H='offset="'+G+'%"';C[E]=C[E].replace(/offset=""/,H),D++}}C=C.toString().replace(/,/g,"").replace(/--/g,",").replace(/(rgb?\(\d+,\s*\d+,\s*\d+),\s*(?:0|1|\.\d+|0\.\d+)\)/g,"$1)").replace(/(hsl?\(\d+,\s*\d+%,\s*\d+%),\s*(?:0|1|\.\d+|0\.\d+)\)/g,"$1)")}}/radial/.test(C)&&(/((ellipse).*(center)|(circle).*(center))/g.test(C)?C=C.replace(/<\/linearGradient>/g,"</radialGradient>").replace(/radial-gradient[^<]+/g,'<?xml version="1.0" ?><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 1 1" preserveAspectRatio="none"><radialGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" cx="50%" cy="50%" r="75%">').replace(/<rect x=\S+\d\S+ y=\S+\d\S+ width=\S+\d\S+ height=\S+\d\S+ fill=\S+\w\S+ \/>/g,'<rect x="-50" y="-50" width="101" height="101" fill="url(#grad-ucgg-generated)" />'):C=!1);var I=null;try{C=C.split("@@@");var J=0;for(J;J<C.length;J++)I=C[J].match(/<\?xml.*<\/svg>/),I=K(I.join("")),C[J]=C[J].replace(/(<\?xml.*<\/svg>)/,I)}catch(s){}return c?C:C=!1,C?C.toString():C})()`;
+ @backgroundMoz: ~`(function(){var a,b,c,d,e,f,g,h,i,j,k;a="@{arguments}",c=null,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,k=/to\s*top/,j=/to\s*right/,h=/to\s*bottom/,i=/to\s*left/,b=/\d*deg/,f=0;while(f<e){/linear/.test(d[f])?(d[f]=d[f].replace(/linear-gradient/,"-moz-linear-gradient"),k.test(d[f])?d[f]=d[f].replace(k,"bottom"):j.test(d[f])?d[f]=d[f].replace(j,"left"):h.test(d[f])?d[f]=d[f].replace(h,"top"):i.test(d[f])?d[f]=d[f].replace(i,"right"):b.test(d[f])&&(g=d[f].match(/\d*deg/),g=(parseInt(g)-90)*-1+"deg",d[f]=d[f].replace(b,g))):d[f]=d[f].replace(/radial-gradient/,"-moz-radial-gradient").replace(/,\s* \d*(px|%) \d*(px|%)/,", circle").replace(/\(+\s*(.*) at\s*([^,]+)/g,"($2, $1");try{"".trim(),c=!0}catch(l){c=!1}c&&(d[f]=d[f].trim()),f++}return d.toString().replace(/\[/g,"").replace(/\]/g,"")}())`;
+ @backgroundWebkit: ~`(function(){var a,b,c,d,e,f,g,h,i,j,k;a="@{arguments}",c=null,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,k=/to\s*top/,j=/to\s*right/,h=/to\s*bottom/,i=/to\s*left/,b=/\d*deg/,f=0;while(f<e){/linear/.test(d[f])?(d[f]=d[f].replace(/linear-gradient/,"-webkit-linear-gradient"),k.test(d[f])?d[f]=d[f].replace(k,"bottom"):j.test(d[f])?d[f]=d[f].replace(j,"left"):h.test(d[f])?d[f]=d[f].replace(h,"top"):i.test(d[f])?d[f]=d[f].replace(i,"right"):b.test(d[f])&&(g=d[f].match(/\d*deg/),g=(parseInt(g)-90)*-1+"deg",d[f]=d[f].replace(b,g))):d[f]=d[f].replace(/radial-gradient/,"-webkit-radial-gradient").replace(/\(+\s*(.*) at\s*([^,]+)/g,"($2, $1");try{"".trim(),c=!0}catch(l){c=!1}c&&(d[f]=d[f].trim()),f++}return d.toString().replace(/\[/g,"").replace(/\]/g,"");}())`;
+ @backgroundOpera: ~`(function(){var a,b,c,d,e,f,g,h,i,j,k;a="@{arguments}",c=null,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,k=/to\s*top/,j=/to\s*right/,h=/to\s*bottom/,i=/to\s*left/,b=/\d*deg/,f=0;while(f<e){/linear/.test(d[f])?(d[f]=d[f].replace(/linear-gradient/,"-o-linear-gradient"),k.test(d[f])?d[f]=d[f].replace(k,"bottom"):j.test(d[f])?d[f]=d[f].replace(j,"left"):h.test(d[f])?d[f]=d[f].replace(h,"top"):i.test(d[f])?d[f]=d[f].replace(i,"right"):b.test(d[f])&&(g=d[f].match(/\d*deg/),g=(parseInt(g)-90)*-1+"deg",d[f]=d[f].replace(b,g))):d[f]=d[f].replace(/radial-gradient/,"-o-radial-gradient").replace(/\(+\s*(.*) at\s*([^,]+)/g,"($2, $1");try{"".trim(),c=!0}catch(l){c=!1}c&&(d[f]=d[f].trim()),f++}return d.toString().replace(/\[/g,"").replace(/\]/g,"");})()`;
+ @backgroundW3C: ~`(function(){var a,b,c,d,e;a="@{arguments}",b=null,c=a.split(/,(?=\s*(?:linear|radial))/g),d=c.length,e=0;while(e<d){try{"".trim(),b=!0}catch(f){b=!1}b&&(c[e]=c[e].trim()),e++}return c.toString().replace(/\[/g,"").replace(/\]/g,"");}())`;
+
+ .result(@arguments, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) { background-image: @arguments; }
+ .result(@arguments, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+ .result(@arguments, @boolean, @localBoolean, @property) when (@boolean = true) and (@localBoolean = true) and (isstring(@property)) { background-image: @arguments; }
+ .result(@arguments, @boolean, @localBoolean, @property) when not (@boolean = true), not (@localBoolean = true), not (isstring(@property)) { }
+
+ .result(@backgroundSVG, @svg, @svg, @backgroundSVG);
+ // -- this comment must be here because of LESS bug
+ .result(@backgroundMoz, @moz, @mozLocal);
+ // --
+ .result(@backgroundWebkit, @webkit, @webkitLocal);
+ // --
+ .result(@backgroundOpera, @opera, @operaLocal);
+ // --
+ .result(@backgroundW3C, @w3c, @w3cLocal);
+ }
+
+ // element{ .background-image(linear-gradient(to bottom, #ffffff, #929292)); }
+
+
+// .background-origin
+
+ .background-origin(@arguments:padding-box){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-background-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-background-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { background-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .background-origin(content-box); }
+
+
+// .background-size
+
+ .background-size(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ @processing: ~`(function(){ var arg = "@{arguments}".replace("[","").replace("]","") || "none"; if( !/^\w*%?([ X])/.test(arg) ) { arg = arg.replace(/,/g,"") } return arg; })()`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-background-size: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-background-size: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { background-size: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .background-size(50% auto); }
+
+
+// .border-radius
+
+ .border-radius(@arguments:0) {
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-border-radius: @arguments; -webkit-background-clip: padding-box;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-border-radius: @arguments; -moz-background-clip: padding;}
+ .inception (@signal, @arguments) when (@signal = 5) { border-radius: @arguments; background-clip: padding-box; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .border-radius(10px); } // all corner rounded
+ // element{ .border-radius(~"10px / 20px"); } // NEED TO BE ESCAPED OR LESS DEVIDE IT! Horizontal and vertical rounded differently
+ // element{ .border-radius(0 10px 0 0); } // only top right corner rounded
+
+
+// .border-top-left-radius
+
+ .border-top-left-radius(@arguments:0) {
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-border-top-left-radius: @arguments; -webkit-background-clip: padding-box;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-border-radius-topleft: @arguments; -moz-background-clip: padding;}
+ .inception (@signal, @arguments) when (@signal = 5) { border-top-left-radius: @arguments; background-clip: padding-box; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .border-top-left-radius(10px); }
+
+
+// .border-top-right-radius
+
+ .border-top-right-radius(@arguments:0) {
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-border-top-right-radius: @arguments; -webkit-background-clip: padding-box;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-border-radius-topright: @arguments; -moz-background-clip: padding;}
+ .inception (@signal, @arguments) when (@signal = 5) { border-top-right-radius: @arguments; background-clip: padding-box; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .border-top-right-radius(10px); }
+
+
+// .border-bottom-left-radius
+
+ .border-bottom-left-radius(@arguments:0) {
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-border-bottom-left-radius: @arguments; -webkit-background-clip: padding-box;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-border-radius-bottomleft: @arguments; -moz-background-clip: padding;}
+ .inception (@signal, @arguments) when (@signal = 5) { border-bottom-left-radius: @arguments; background-clip: padding-box; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .border-bottom-left-radius(10px); }
+
+
+// .border-bottom-right-radius
+
+ .border-bottom-right-radius(@arguments:0) {
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-border-bottom-right-radius: @arguments; -webkit-background-clip: padding-box;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-border-radius-bottomright: @arguments; -moz-background-clip: padding;}
+ .inception (@signal, @arguments) when (@signal = 5) { border-bottom-right-radius: @arguments; background-clip: padding-box; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .border-bottom-right-radius(10px); }
+
+
+// .border-image
+
+ .border-image(@arguments:none){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-border-image: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-border-image: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-border-image: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { border-image: @arguments; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .border-image(url(border.png) 30 30 round); }
+
+
+// .box-shadow
+
+ .box-shadow(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ @processing: ~`(function(){ var arg = "@{arguments}".replace("[","").replace("]","") || "none"; if( !/^#?\w*%?([ X])/.test(arg) ) { arg = arg.replace(/,(?=[^()]*\))/g,'--').replace(/,/g,"").replace(/--/g,','); } return arg; })()`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-box-shadow: @processing;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-box-shadow: @processing;}
+ .inception (@signal, @arguments) when (@signal = 5) { box-shadow: @processing;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .box-shadow(0 1px 10px rgba(20,20,20,0.5), 0 1px 10px rgba(20,20,20,0.5)); }
+
+
+// .box-sizing
+
+ .box-sizing(@arguments:content-box){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-box-sizing: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-box-sizing: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { box-sizing: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .box-sizing(border-box); }
+
+
+// .columns
+
+ .columns(@arguments:auto auto){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-columns: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-columns: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { columns: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .columns(100px 3); }
+
+
+// .column-count
+
+ .column-count(@arguments:auto){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-column-count: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-column-count: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { column-count: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .column-count(3); }
+
+
+// .column-gap
+
+ .column-gap(@arguments:normal){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-column-gap: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-column-gap: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { column-gap: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .column-gap(40px); }
+
+
+// .column-rule
+
+ .column-rule(@arguments:medium none black){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-column-rule: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-column-rule: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { column-rule: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .column-rule(3px outset #ff00ff); }
+
+
+// .column-width
+
+ .column-width(@arguments:auto){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-column-width: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-column-width: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { column-width: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .column-width(100px); }
+
+
+// .font-face
+
+ .font-face(@fontname, @fontfile) {
+
+ font-family: "@{fontname}";
+ src: url("@{fontfile}-webfont.eot");
+ src: url("@{fontfile}-webfont.eot?#iefix") format("embedded-opentype"),
+ url("@{fontfile}-webfont.woff") format("woff"),
+ url("@{fontfile}-webfont.ttf") format("truetype"),
+ url("@{fontfile}-webfont.svg#@{fontname}") format("svg");
+ font-weight: normal;
+ font-style: normal;
+ }
+
+ // element{ .font-face(ZendaRegular, zenda-webfont); }
+
+
+// .opacity
+
+ .opacity(@arguments:1){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-opacity: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-opacity: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { opacity: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .opacity(.5); }
+
+
+// .perspective
+
+ .perspective(@arguments:none){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-perspective: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-perspective: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { perspective: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .perspective(350px); }
+
+
+// .perspective-origin
+
+ .perspective-origin(@arguments:50% 50%){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-perspective-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-perspective-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { perspective-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .perspective-origin(top left); }
+
+
+// .size
+
+ .size(@square){
+ width: @square;
+ height: @square;
+ }
+
+ .size(@width, @height){
+ width: @width;
+ height: @height;
+ }
+
+ // element{ .size(10px); } // render width:10px; height:10px;
+ // element{ .size(10px, 20px); } // render width:10px; height: 20px;
+
+
+// .transform
+
+ .transform(@arguments:none, ...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transform(scale(.5) translate(10px, 20px)); }
+
+
+// .transform-origin
+
+ .transform-origin(@arguments:50% 50% 0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { transform-origin: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transform-origin(20% 40%); }
+
+
+// .transform-style
+
+ .transform-style(@arguments:flat){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform-style: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform-style: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform-style: @arguments;}
+ .inception (@signal, @arguments) when (@signal = 5) { transform-style: @arguments;}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transform-style(preserve-3d); }
+
+
+// .translate
+
+ .translate(@x:0, @y:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: translate(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: translate(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: translate(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: translate(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: translate(@x, @y);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .translate(100px); }
+ // element{ .translate(100px, 50px); }
+
+
+// .translate3d
+
+ .translate3d(@x:0, @y:0, @z:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: translate3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: translate3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: translate3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: translate3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: translate3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .translate3d(10px, 20px, 30px); }
+
+
+// .translateX
+
+ .translateX(@x:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: translateX(@x);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: translateX(@x);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: translateX(@x);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: translateX(@x);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: translateX(@x);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .translateX(10px); }
+
+
+// .translateY
+
+ .translateY(@y:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: translateY(@y);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: translateY(@y);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: translateY(@y);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: translateY(@y);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: translateY(@y);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .translateY(15px); }
+
+
+// .translateZ
+
+ .translateZ(@z:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: translateZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: translateZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: translateZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: translateZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: translateZ(@z);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .translateZ(32px); }
+
+
+// .scale
+
+ .scale(@x:1){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: scale(@x);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: scale(@x);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: scale(@x);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: scale(@x);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: scale(@x);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ .scale(@x, @y){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: scale(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: scale(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: scale(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: scale(@x, @y);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: scale(@x, @y);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .scale(2); }
+ // element{ .scale(2, 1); }
+
+
+// .scale3d
+
+ .scale3d(@x:1, @y:1, @z:1){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: scale3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: scale3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: scale3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: scale3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: scale3d(@x, @y, @z);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .scale3d(1, 2, 1); }
+
+
+// .scaleX
+
+ .scaleX(@x:1){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: scaleX(@x);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: scaleX(@x);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: scaleX(@x);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: scaleX(@x);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: scaleX(@x);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .scaleX(1.5); }
+
+
+// .scaleY
+
+ .scaleY(@y:1){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: scaleY(@y);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: scaleY(@y);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: scaleY(@y);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: scaleY(@y);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: scaleY(@y);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .scaleX(1.5); }
+
+
+// .scaleZ
+
+ .scaleZ(@z:1){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: scaleZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: scaleZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: scaleZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: scaleZ(@z);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: scaleZ(@z);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .scaleZ(2.7); }
+
+
+// .rotate
+
+ .rotate(@angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: rotate(@angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: rotate(@angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: rotate(@angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: rotate(@angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: rotate(@angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .rotate(45deg); }
+
+
+// .rotate3d
+
+ .rotate3d(@x:0, @y:0, @z: 0, @angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: rotate3d(@x, @y, @z, @angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: rotate3d(@x, @y, @z, @angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: rotate3d(@x, @y, @z, @angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: rotate3d(@x, @y, @z, @angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: rotate3d(@x, @y, @z, @angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .rotate3d(1, 2.0, 3.0, 10deg); }
+
+
+// .rotateX
+
+ .rotateX(@angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: rotateX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: rotateX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: rotateX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: rotateX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: rotateX(@angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .rotateX(63deg); }
+
+
+// .rotateY
+
+ .rotateY(@angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: rotateY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: rotateY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: rotateY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: rotateY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: rotateY(@angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .rotateY(24deg); }
+
+
+// .rotateZ
+
+ .rotateZ(@angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: rotateZ(@angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: rotateZ(@angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: rotateZ(@angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: rotateZ(@angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: rotateZ(@angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .rotateZ(280deg); }
+
+
+// .skew
+
+ .skew(@angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: skew(@angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: skew(@angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: skew(@angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: skew(@angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: skew(@angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .skew(20deg); }
+
+
+// .skewX
+
+ .skewX(@angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: skewX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: skewX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: skewX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: skewX(@angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: skewX(@angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .skewX(24deg); }
+
+
+// .skewY
+
+ .skewY(@angle:0){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transform: skewY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transform: skewY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transform: skewY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transform: skewY(@angle);}
+ .inception (@signal, @arguments) when (@signal = 5) { transform: skewY(@angle);}
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .skewY(36deg); }
+
+
+// .transition
+
+ .transition(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @transitionWebkit: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["background-size","border-","box-shadow","column","transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-webkit-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionMoz: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["background-size","border-","box-shadow","column","transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-moz-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionOpera: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-o-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionMs: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-ms-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionW3C: ~`(function(){var a,b,c;a="@{arguments}".split(","),c=!1,b=a.length;for(var d=0;d<b;d++){try{"".trim(),c=!0}catch(e){c=!1}a[d]=c?a[d].trim():a[d]}return a.join(", ").replace("[","").replace("]","");}())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transition: ~`(function(){ var arg = "@{transitionWebkit}" || "all 0 ease 0"; if( !/^\w*([ X])/.test(arg) ) { arg = arg.replace(/,/g,"") } return arg; })()`; }
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transition: ~`(function(){ var arg = "@{transitionMoz}" || "all 0 ease 0"; if( !/^\w*([ X])/.test(arg) ) { arg = arg.replace(/,/g,"") } return arg; })()`; }
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transition:~`(function(){ var arg = "@{transitionOpera}" || "all 0 ease 0"; if( !/^\w*([ X])/.test(arg) ) { arg = arg.replace(/,/g,"") } return arg; })()`; }
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transition: ~`(function(){ var arg = "@{transitionMs}" || "all 0 ease 0"; if( !/^\w*([ X])/.test(arg) ) { arg = arg.replace(/,/g,"") } return arg; })()`; }
+ .inception (@signal, @arguments) when (@signal = 5) { transition: ~`(function(){ var arg = "@{transitionW3C}" || "all 0 ease 0"; if( !/^\w*([ X])/.test(arg) ) { arg = arg.replace(/,/g,"") } return arg; })()`; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transition(transform 3s linear); }
+
+
+// .transition-property
+
+ .transition-property(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @transitionWebkit: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["background-size","border-","box-shadow","column","transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-webkit-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionMoz: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["background-size","border-","box-shadow","column","transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-moz-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionOpera: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-o-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionMs: ~`(function(){var a,b,c,d,e,f,g;a="@{arguments}".split(","),c=["transform"],d=c.length,e=a,f=!1,b=a.length;for(var h=0;h<d;h++)for(var i=0;i<b;i++){g=new RegExp(c[h],"g");try{"".trim(),f=!0}catch(j){f=!1}a[i]=f?a[i].trim():a[i],g.test(a[i])&&(e[i]=a[i].replace(g,"-ms-"+c[h]))}return e.join(", ").replace("[","").replace("]","");}())`;
+ @transitionW3C: ~`(function(){var a,b,c;a="@{arguments}".split(","),c=!1,b=a.length;for(var d=0;d<b;d++){try{"".trim(),c=!0}catch(e){c=!1}a[d]=c?a[d].trim():a[d]}return a.join(", ").replace("[","").replace("]","");}())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transition-property: ~`(function(){ var arg = "@{transitionWebkit}" || "0"; var decision = false; try{ var hasComma = arg.match(/([^ ,][a-z0-9-]*)/g); if (hasComma.length < 2) { decision = true; } } catch (e) {} if (decision === true) arg = hasComma.join(" ").replace(/,/g,""); return arg; }())`; }
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transition-property: ~`(function(){ var arg = "@{transitionMoz}" || "0"; var decision = false; try{ var hasComma = arg.match(/([^ ,][a-z0-9-]*)/g); if (hasComma.length < 2) { decision = true; } } catch (e) {} if (decision === true) arg = hasComma.join(" ").replace(/,/g,""); return arg; }())`; }
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transition-property: ~`(function(){ var arg = "@{transitionOpera}" || "0"; var decision = false; try{ var hasComma = arg.match(/([^ ,][a-z0-9-]*)/g); if (hasComma.length < 2) { decision = true; } } catch (e) {} if (decision === true) arg = hasComma.join(" ").replace(/,/g,""); return arg; }())`; }
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-transition-property: ~`(function(){ var arg = "@{transitionMs}" || "0"; var decision = false; try{ var hasComma = arg.match(/([^ ,][a-z0-9-]*)/g); if (hasComma.length < 2) { decision = true; } } catch (e) {} if (decision === true) arg = hasComma.join(" ").replace(/,/g,""); return arg; }())`; }
+ .inception (@signal, @arguments) when (@signal = 5) { transition-property: ~`(function(){ var arg = "@{transitionW3C}" || "0"; var decision = false; try{ var hasComma = arg.match(/([^ ,][a-z0-9-]*)/g); if (hasComma.length < 2) { decision = true; } } catch (e) {} if (decision === true) arg = hasComma.join(" ").replace(/,/g,""); return arg; }())`; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transition-property(width, height); }
+
+
+// .transition-duration
+
+ .transition-duration(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "0"; try{ var hasComma = arg.match(/,/g).length > 1 ? true : false; } catch (e) {} if (hasComma === true) arg = arg.replace(/,/g,""); arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transition-duration: @processing; }
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transition-duration: @processing; }
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transition-duration: @processing; }
+ .inception (@signal, @arguments) when (@signal = 5) { transition-duration: @processing; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transition-duration(250ms); }
+
+
+// .transition-timing-function
+
+ .transition-timing-function(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "ease"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transition-timing-function: @processing; }
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transition-timing-function: @processing; }
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transition-timing-function: @processing; }
+ .inception (@signal, @arguments) when (@signal = 5) { transition-timing-function: @processing; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transition-timing-function(cubic-bezier(0,0,1,1)); }
+
+
+// .transition-delay
+
+ .transition-delay(...){
+
+ // Local config for disabling properties
+
+ @w3cLocal: true; // Unprefixed W3C syntax
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @operaLocal: true; // Opera 10.5+
+ @msLocal: true; // IE 10+
+
+ @processing: ~`(function(){ var arg = "@{arguments}" || "0"; arg = arg.replace("[","").replace("]",""); return arg; }())`;
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-transition-delay: @processing; }
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-transition-delay: @processing; }
+ .inception (@signal, @arguments) when (@signal = 3) { -o-transition-delay: @processing; }
+ .inception (@signal, @arguments) when (@signal = 5) { transition-delay: @processing; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @operaSignal, @opera, @operaLocal);
+ // --
+ .result(@arguments, @w3cSignal, @w3c, @w3cLocal);
+ }
+
+ // element{ .transition-delay(2s); }
+
+
+// .user-select
+
+ .user-select(@arguments:auto){
+
+ // Local config for disabling properties
+
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @mozLocal: true; // Firefox 4+
+ @msLocal: true; // IE 10+
+
+ .result (@arguments, @signal, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) {
+ .inception (@signal, @arguments) when (@signal = 1) { -webkit-user-select: @arguments; }
+ .inception (@signal, @arguments) when (@signal = 2) { -moz-user-select: @arguments; }
+ .inception (@signal, @arguments) when (@signal = 4) { -ms-user-select: @arguments; }
+ .inception (@signal, @arguments) when (@signal > 5),(@signal < 1) { error: "Signal is out of range"; }
+ .inception(@signal, @arguments);
+ }
+ .result (@arguments, @signal, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+
+ .result(@arguments, @webkitSignal, @webkit, @webkitLocal);
+ // -- this comment must be here because of LESS bug
+ .result(@arguments, @mozSignal, @moz, @mozLocal);
+ // --
+ .result(@arguments, @msSignal, @ms, @msLocal);
+ }
+
+ // element{ .user-select(text); }
+
+
+// DEPRECATED mixins (must be supported because of old version of CSS Hat)
+
+ // .gradient (renamed background-image)
+
+ .gradient(...){
+
+ // Local config for disabling properties
+
+ @svg: true; // SVG gradient for IE9
+ @mozLocal: true; // Firefox 4+
+ @webkitLocal: true; // Chrome 7+, Safari 5+, iOS5, Android
+ @operaLocal: true; // Opera 10.5+
+ @w3cLocal: true; // Unprefixed W3C syntax
+
+ @backgroundSVG: ~`(function(){function G(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c,d,e,f,g,h,i,j,k=0,l=0,m="",n=[];if(!a)return a;do c=a.charCodeAt(k++),d=a.charCodeAt(k++),e=a.charCodeAt(k++),j=c<<16|d<<8|e,f=j>>18&63,g=j>>12&63,h=j>>6&63,i=j&63,n[l++]=b.charAt(f)+b.charAt(g)+b.charAt(h)+b.charAt(i);while(k<a.length);m=n.join("");var o=a.length%3;return(o?m.slice(0,o-3):m)+"===".slice(o||3)}var a="@{arguments}",b=null,c=!0,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,f=/top/,g=/right/,h=/bottom/,i=/left/,j=/to\s*top/,k=/to\s*right/,l=/to\s*bottom/,m=/to\s*left/,n=/45deg/,o=/-45deg/,p=/\d*deg/;for(var q=0;q<e;q++){if(/linear/.test(d[q])){d[q]=d[q].replace(/linear-gradient\s*\(/,'<?xml version="1.0" ?><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 1 1" preserveAspectRatio="none">');if(f.test(d[q])&&!j.test(d[q])||l.test(d[q])||/180deg/.test(d[q])){var r=null;l.test(d[q])?r=l:/180deg/.test(d[q])?r=/180deg/:r=f,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="0%" y2="100%">')}else if(g.test(d[q])&&!k.test(d[q])||m.test(d[q])||/270deg/.test(d[q])){var r=null;m.test(d[q])?r=m:/270deg/.test(d[q])?r=/270deg/:r=g,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="100%" y1="0%" x2="0%" y2="0%">')}else if(h.test(d[q])&&!l.test(d[q])||j.test(d[q])||/[^\d]0deg/.test(d[q])){var r=null;j.test(d[q])?r=j:/0deg/.test(d[q])?r=/0deg/:r=h,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="100%" x2="0%" y2="0%">')}else if(i.test(d[q])&&!m.test(d[q])||k.test(d[q])||/90deg/.test(d[q])){var r=null;k.test(d[q])?r=k:/90deg/.test(d[q])?r=/90deg/:r=i,d[q]=d[q].replace(r,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="100%" y2="0%">')}else n.test(d[q])&&!o.test(d[q])?d[q]=d[q].replace(n,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="100%" x2="100%" y2="0%">'):o.test(d[q])?d[q]=d[q].replace(o,'<linearGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" x1="0%" y1="0%" x2="100%" y2="100%">'):c=!1}try{"".trim(),b=!0}catch(s){b=!1}b&&(d[q]=d[q].trim());if(/linear/.test(d[q])||/radial/.test(d[q])){d[q]=d[q].slice(0,-1),d[q]="url(data:image/svg+xml;base64--"+d[q]+'</linearGradient><rect x="0" y="0" width="1" height="1" fill="url(***)" /></svg>)';var t=d.join("@@@"),u=t.match(/rgba?\(\d+,\s*\d+,\s*\d+,\s*(?:0|1|\.\d+|0\.\d+)\)\s*\d*%*/g)||0,v=t.match(/hsla?\(\d+,\s*\d+%,\s*\d+%,\s*(?:0|1|\.\d+|0\.\d+)\)\s*\d*%*/g)||0,w=[],x=[];for(var y=0;y<u.length;y++)w[y]=u[y].replace(/,/g,"--");for(var z=0;z<v.length;z++)x[z]=v[z].replace(/,/g,"--");for(var A=0;A<u.length;A++)t=t.replace(u[A],w[A]);for(var B=0;B<v.length;B++)t=t.replace(v[B],x[B]);var C=t.split(",");for(var D=0;D<C.length;D++){C[D]=C[D].replace(/(#\w{3,6})\s*(\d*%*)/g,'<stop offset="$2" stop-color="$1" stop-opacity="1"/>').replace(/(rgba?\(\d+--\s*\d+--\s*\d+--\s*(0|1|\.\d+|0\.\d+)\))\s*(\d*%)*/g,'<stop offset="$3" stop-color="$1" stop-opacity="$2"/>').replace(/rgba/g,"rgb").replace(/(hsla?\(\d+--\s*\d+%--\s*\d+%--\s*(0|1|\.\d+|0\.\d+)\))\s*(\d*%)*/g,'<stop offset="$3" stop-color="$1" stop-opacity="$2"/>').replace(/hsla/g,"hsl").replace(/((?:aqua|black|blue|fuchsia|gray|grey|green|lime|maroon|navy|olive|purple|red|silver|teal|white|yellow))\s*(\d*%)*/g,'<stop offset="$2" stop-color="$1" stop-opacity="1"/>').replace(/\*\*\*/,"#grad-ucgg-generated");try{"".trim(),b=!0}catch(s){b=!1}b&&(C[D]=C[D].trim())}C=C.toString().replace(/,/g,"").replace(/--/g,",").replace(/(rgb?\(\d+,\s*\d+,\s*\d+),\s*(?:0|1|\.\d+|0\.\d+)\)/g,"$1)").replace(/(hsl?\(\d+,\s*\d+%,\s*\d+%),\s*(?:0|1|\.\d+|0\.\d+)\)/g,"$1)")}}/radial/.test(C)&&(/((ellipse).*(center)|(circle).*(center))/g.test(C)?C=C.replace(/<\/linearGradient>/g,"</radialGradient>").replace(/radial-gradient[^<]+/g,'<?xml version="1.0" ?><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 1 1" preserveAspectRatio="none"><radialGradient id="grad-ucgg-generated" gradientUnits="userSpaceOnUse" cx="50%" cy="50%" r="75%">').replace(/<rect x=\S+\d\S+ y=\S+\d\S+ width=\S+\d\S+ height=\S+\d\S+ fill=\S+\w\S+ \/>/g,'<rect x="-50" y="-50" width="101" height="101" fill="url(#grad-ucgg-generated)" />'):C=!1);var E=null;try{C=C.split("@@@");var F=0;for(F;F<C.length;F++)E=C[F].match(/<\?xml.*<\/svg>/),E=G(E.join("")),C[F]=C[F].replace(/(<\?xml.*<\/svg>)/,E)}catch(s){}return c?C:C=!1,C?C.toString().replace(/\[/g,"").replace(/\]/g,""):C}())`;
+ @backgroundMoz: ~`(function(){var a,b,c,d,e,f,g,h,i,j,k;a="@{arguments}",c=null,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,k=/to\s*top/,j=/to\s*right/,h=/to\s*bottom/,i=/to\s*left/,b=/\d*deg/,f=0;while(f<e){/linear/.test(d[f])?(d[f]=d[f].replace(/linear-gradient/,"-moz-linear-gradient"),k.test(d[f])?d[f]=d[f].replace(k,"bottom"):j.test(d[f])?d[f]=d[f].replace(j,"left"):h.test(d[f])?d[f]=d[f].replace(h,"top"):i.test(d[f])?d[f]=d[f].replace(i,"right"):b.test(d[f])&&(g=d[f].match(/\d*deg/),g=(parseInt(g)-90)*-1+"deg",d[f]=d[f].replace(b,g))):d[f]=d[f].replace(/radial-gradient/,"-moz-radial-gradient").replace(/,\s* \d*(px|%) \d*(px|%)/,", circle").replace(/\(+\s*(.*) at\s*([^,]+)/g,"($2, $1");try{"".trim(),c=!0}catch(l){c=!1}c&&(d[f]=d[f].trim()),f++}return d.toString().replace(/\[/g,"").replace(/\]/g,"");}())`;
+ @backgroundWebkit: ~`(function(){var a,b,c,d,e,f,g,h,i,j,k;a="@{arguments}",c=null,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,k=/to\s*top/,j=/to\s*right/,h=/to\s*bottom/,i=/to\s*left/,b=/\d*deg/,f=0;while(f<e){/linear/.test(d[f])?(d[f]=d[f].replace(/linear-gradient/,"-webkit-linear-gradient"),k.test(d[f])?d[f]=d[f].replace(k,"bottom"):j.test(d[f])?d[f]=d[f].replace(j,"left"):h.test(d[f])?d[f]=d[f].replace(h,"top"):i.test(d[f])?d[f]=d[f].replace(i,"right"):b.test(d[f])&&(g=d[f].match(/\d*deg/),g=(parseInt(g)-90)*-1+"deg",d[f]=d[f].replace(b,g))):d[f]=d[f].replace(/radial-gradient/,"-webkit-radial-gradient").replace(/\(+\s*(.*) at\s*([^,]+)/g,"($2, $1");try{"".trim(),c=!0}catch(l){c=!1}c&&(d[f]=d[f].trim()),f++}return d.toString().replace(/\[/g,"").replace(/\]/g,"");}())`;
+ @backgroundOpera: ~`(function(){var a,b,c,d,e,f,g,h,i,j,k;a="@{arguments}",c=null,d=a.split(/,(?=\s*(?:linear|radial))/g),e=d.length,k=/to\s*top/,j=/to\s*right/,h=/to\s*bottom/,i=/to\s*left/,b=/\d*deg/,f=0;while(f<e){/linear/.test(d[f])?(d[f]=d[f].replace(/linear-gradient/,"-o-linear-gradient"),k.test(d[f])?d[f]=d[f].replace(k,"bottom"):j.test(d[f])?d[f]=d[f].replace(j,"left"):h.test(d[f])?d[f]=d[f].replace(h,"top"):i.test(d[f])?d[f]=d[f].replace(i,"right"):b.test(d[f])&&(g=d[f].match(/\d*deg/),g=(parseInt(g)-90)*-1+"deg",d[f]=d[f].replace(b,g))):d[f]=d[f].replace(/radial-gradient/,"-o-radial-gradient").replace(/\(+\s*(.*) at\s*([^,]+)/g,"($2, $1");try{"".trim(),c=!0}catch(l){c=!1}c&&(d[f]=d[f].trim()),f++}return d.toString().replace(/\[/g,"").replace(/\]/g,"");})()`;
+ @backgroundW3C: ~`(function(){var a,b,c,d,e;a="@{arguments}",b=null,c=a.split(/,(?=\s*(?:linear|radial))/g),d=c.length,e=0;while(e<d){try{"".trim(),b=!0}catch(f){b=!1}b&&(c[e]=c[e].trim()),e++}return c.toString().replace(/\[/g,"").replace(/\]/g,"");}())`;
+
+ .result(@arguments, @boolean, @localBoolean) when (@boolean = true) and (@localBoolean = true) { background-image: @arguments; }
+ .result(@arguments, @boolean, @localBoolean) when not (@boolean = true), not (@localBoolean = true) { }
+ .result(@arguments, @boolean, @localBoolean, @property) when (@boolean = true) and (@localBoolean = true) and (isstring(@property)) { background-image: @arguments; }
+ .result(@arguments, @boolean, @localBoolean, @property) when not (@boolean = true), not (@localBoolean = true), not (isstring(@property)) { }
+
+ .result(@backgroundSVG, @svg, @svg, @backgroundSVG);
+ // -- this comment must be here because of LESS bug
+ .result(@backgroundMoz, @moz, @mozLocal);
+ // --
+ .result(@backgroundWebkit, @webkit, @webkitLocal);
+ // --
+ .result(@backgroundOpera, @opera, @operaLocal);
+ // --
+ .result(@backgroundW3C, @w3c, @w3cLocal);
+ }
+
+ // element{ .gradient(~"linear-gradient(to right, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%)"); }
diff --git a/app/soc/content/less/soc/main.less b/app/soc/content/less/soc/main.less
new file mode 100755
index 0000000..0673b2e
--- /dev/null
+++ b/app/soc/content/less/soc/main.less
@@ -0,0 +1,30 @@
+// Welcome to my Sass setup!
+// I like to break out my sass into individual files,
+// so this page mainly just imports those partials
+
+
+// import normalize (a version of css reset)
+@import "normalize";
+
+// import mixins and variables (special Sass stuff)
+@import "mixins";
+
+// import site partials
+@import "elements/helper";
+@import "elements/grid";
+@import "elements/link-styles";
+@import "elements/headers-styles";
+
+// partials specific to a page
+@import "elements/general";
+@import "elements/header";
+@import "elements/footer";
+@import "elements/projects";
+@import "elements/latest";
+@import "elements/social-media";
+
+
+// print stylesheet
+@media print {
+ @import "print";
+}
diff --git a/app/soc/content/less/soc/mixins.less b/app/soc/content/less/soc/mixins.less
new file mode 100755
index 0000000..4e2426d
--- /dev/null
+++ b/app/soc/content/less/soc/mixins.less
@@ -0,0 +1,55 @@
+
+
+@import "lesshat";
+
+// ==========================================================================
+// Breakpoints
+
+@small: 45em;
+@medium: 62em;
+
+@break-small: ~"only screen and (min-width: 45em)";
+@break-medium: ~"only screen and (min-width: 62em)";
+
+// ==========================================================================
+// Colors
+
+
+@alert-yellow: #ebe16f;
+@alert-red: #fbe3e4;
+@alert-green: #e6efc2;
+@alert-blue: #d5edf8;
+
+@black: #000;
+@white: #fff;
+@web-black: #666666;
+
+@google-blue: #1F93CF;
+@google-orange: #F29B07;
+
+@link-color: @google-blue;
+@link-color-hover: @google-orange;
+
+
+// ==========================================================================
+// Typography
+
+@serif: 'Open Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
+@sans-serif: @serif;
+
+
+// ==========================================================================
+// clearfix
+
+.clearfix {
+ zoom: 1; // For IE 6/7 (trigger hasLayout)
+
+ &:before, &:after {
+ content: "";
+ display: table;
+ }
+
+ &:after {
+ clear:both;
+ }
+}
\ No newline at end of file
diff --git a/app/soc/content/less/soc/normalize.less b/app/soc/content/less/soc/normalize.less
new file mode 100755
index 0000000..9528d00
--- /dev/null
+++ b/app/soc/content/less/soc/normalize.less
@@ -0,0 +1,536 @@
+/*! normalize.css 2012-07-07T09:50 UTC - http://github.com/necolas/normalize.css */
+
+/* ==========================================================================
+ HTML5 display definitions
+ ========================================================================== */
+
+/*
+ * Corrects `block` display not defined in IE6/7/8/9 & FF3.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/*
+ * Corrects `inline-block` display not defined in IE6/7/8/9 & FF3.
+ */
+
+audio,
+canvas,
+video {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+}
+
+/*
+ * Prevents modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/*
+ * Addresses styling for `hidden` attribute not present in IE7/8/9, FF3, S4.
+ * Known issue: no IE6 support.
+ */
+
+[hidden] {
+ display: none;
+}
+
+/* ==========================================================================
+ Base
+ ========================================================================== */
+
+/*
+ * 1. Corrects text resizing oddly in IE6/7 when body `font-size` is set using
+ * `em` units.
+ * 2. Prevents iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-size: 100%; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+ -ms-text-size-adjust: 100%; /* 2 */
+}
+
+/*
+ * Addresses `font-family` inconsistency between `textarea` and other form
+ * elements.
+ */
+
+html,
+button,
+input,
+select,
+textarea {
+ font-family: sans-serif;
+}
+
+/*
+ * Addresses margins handled incorrectly in IE6/7.
+ */
+
+body {
+ margin: 0;
+}
+
+/* ==========================================================================
+ Links
+ ========================================================================== */
+
+/*
+ * Addresses `outline` inconsistency between Chrome and other browsers.
+ */
+
+a:focus {
+ outline: thin dotted;
+}
+
+/*
+ * Improves readability when focused and also mouse hovered in all browsers.
+ * people.opera.com/patrickl/experiments/keyboard/test
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* ==========================================================================
+ Typography
+ ========================================================================== */
+
+/*
+ * Addresses font sizes and margins set differently in IE6/7.
+ * Addresses font sizes within `section` and `article` in FF4+, Chrome, S5.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+h2 {
+ font-size: 1.5em;
+ margin: 0.83em 0;
+}
+
+h3 {
+ font-size: 1.17em;
+ margin: 1em 0;
+}
+
+h4 {
+ font-size: 1em;
+ margin: 1.33em 0;
+}
+
+h5 {
+ font-size: 0.83em;
+ margin: 1.67em 0;
+}
+
+h6 {
+ font-size: 0.75em;
+ margin: 2.33em 0;
+}
+
+/*
+ * Addresses styling not present in IE7/8/9, S5, Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/*
+ * Addresses style set to `bolder` in FF3+, S4/5, Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+blockquote {
+ margin: 1em 40px;
+}
+
+/*
+ * Addresses styling not present in S5, Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/*
+ * Addresses styling not present in IE6/7/8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/*
+ * Addresses margins set differently in IE6/7.
+ */
+
+p,
+pre {
+ margin: 1em 0;
+}
+
+/*
+ * Corrects font family set oddly in IE6, S4/5, Chrome.
+ * en.wikipedia.org/wiki/User:Davidgothberg/Test59
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, serif;
+ _font-family: 'courier new', monospace;
+ font-size: 1em;
+}
+
+/*
+ * Improves readability of pre-formatted text in all browsers.
+ */
+
+pre {
+ white-space: pre;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+/*
+ * Addresses CSS quotes not supported in IE6/7.
+ */
+
+q {
+ quotes: none;
+}
+
+/*
+ * Addresses `quotes` property not supported in S4.
+ */
+
+q:before,
+q:after {
+ content: '';
+ content: none;
+}
+
+small {
+ font-size: 75%;
+}
+
+/*
+ * Prevents `sub` and `sup` affecting `line-height` in all browsers.
+ * gist.github.com/413930
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* ==========================================================================
+ Lists
+ ========================================================================== */
+
+/*
+ * Addresses margins set differently in IE6/7.
+ */
+
+dl,
+menu,
+ol,
+ul {
+ margin: 1em 0;
+}
+
+dd {
+ margin: 0 0 0 40px;
+}
+
+/*
+ * Addresses paddings set differently in IE6/7.
+ */
+
+menu,
+ol,
+ul {
+ padding: 0 0 0 40px;
+}
+
+/*
+ * Corrects list images handled incorrectly in IE7.
+ */
+
+nav ul,
+nav ol {
+ list-style: none;
+ list-style-image: none;
+}
+
+/* ==========================================================================
+ Embedded content
+ ========================================================================== */
+
+/*
+ * 1. Removes border when inside `a` element in IE6/7/8/9, FF3.
+ * 2. Improves image quality when scaled in IE7.
+ * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
+ */
+
+img {
+ border: 0; /* 1 */
+ -ms-interpolation-mode: bicubic; /* 2 */
+}
+
+/*
+ * Corrects overflow displayed oddly in IE9.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* ==========================================================================
+ Figures
+ ========================================================================== */
+
+/*
+ * Addresses margin not present in IE6/7/8/9, S5, O11.
+ */
+
+figure {
+ margin: 0;
+}
+
+/* ==========================================================================
+ Forms
+ ========================================================================== */
+
+/*
+ * Corrects margin displayed oddly in IE6/7.
+ */
+
+form {
+ margin: 0;
+}
+
+/*
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/*
+ * 1. Corrects color not being inherited in IE6/7/8/9.
+ * 2. Corrects text not wrapping in FF3.
+ * 3. Corrects alignment displayed oddly in IE6/7.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0;
+ white-space: normal; /* 2 */
+ *margin-left: -7px; /* 3 */
+}
+
+/*
+ * 1. Corrects font size not being inherited in all browsers.
+ * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome.
+ * 3. Improves appearance and consistency in all browsers.
+ */
+
+button,
+input,
+select,
+textarea {
+ font-size: 100%; /* 1 */
+ margin: 0; /* 2 */
+ vertical-align: baseline; /* 3 */
+ *vertical-align: middle; /* 3 */
+}
+
+/*
+ * Addresses FF3/4 setting `line-height` on `input` using `!important` in the
+ * UA stylesheet.
+ */
+
+button,
+input {
+ line-height: normal;
+}
+
+/*
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Corrects inability to style clickable `input` types in iOS.
+ * 3. Improves usability and consistency of cursor style between image-type
+ * `input` and others.
+ * 4. Removes inner spacing in IE7 without affecting normal text inputs.
+ * Known issue: inner spacing remains in IE6.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+ *overflow: visible; /* 4 */
+}
+
+/*
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+input[disabled] {
+ cursor: default;
+}
+
+/*
+ * 1. Addresses box sizing set to content-box in IE8/9.
+ * 2. Removes excess padding in IE8/9.
+ * 3. Removes excess padding in IE7.
+ * Known issue: excess padding remains in IE6.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ *height: 13px; /* 3 */
+ *width: 13px; /* 3 */
+}
+
+/*
+ * 1. Addresses `appearance` set to `searchfield` in S5, Chrome.
+ * 2. Addresses `box-sizing` set to `border-box` in S5, 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;
+}
+
+/*
+ * Removes inner padding and search cancel button in S5, Chrome on OS X.
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+ * Removes inner padding and border in FF3+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/*
+ * 1. Removes default vertical scrollbar in IE6/7/8/9.
+ * 2. Improves 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;
+}
+
+/******************************************************************
+CUSTOMIZED RESET VALUES
+I added these extra styles as a more personalized reset. Feel free
+to remove them if you like or add your own. If you want to update
+the normalize styles, make sure to edit from this point up.
+******************************************************************/
+
+// proper formatting (http://blog.fontdeck.com/post/9037028497/hyphens)
+p {
+ -webkit-hyphens: auto;
+ -epub-hyphens: auto;
+ -moz-hyphens: auto;
+ hyphens: auto;
+}
+
+b, strong, .strong { font-weight: bold; }
+
+dfn, em, .em { font-style: italic; }
+
+small, .small { font-size: 75%; }
+
+ul, ol {
+ padding: 0;
+ list-style-type: none;
+}
+
+dd {
+ margin: 0;
+}
+
+.sidebar ul,
+.sidebar ol,
+.commentlist {
+ list-style: none;
+}
diff --git a/app/soc/content/less/soc/print.less b/app/soc/content/less/soc/print.less
new file mode 100755
index 0000000..72ef681
--- /dev/null
+++ b/app/soc/content/less/soc/print.less
@@ -0,0 +1,78 @@
+//******************************************************************
+// Print stylesheet
+//
+//******************************************************************
+
+
+
+
+
+// some generic print styles
+
+ * {
+ background: transparent !important;
+ color: black !important;
+ text-shadow: none !important;
+ filter:none !important;
+ -ms-filter: none !important;
+ }
+
+ a, a:visited {
+ color: #444 !important;
+ text-decoration: underline;
+
+ // show links on printed pages
+ &:after {
+ content: " (" attr(href) ")";
+ }
+
+ // show title too
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+ }
+
+ .ir a:after,
+ a[href^="javascript:"]:after,
+ a[href^="#"]:after {
+ content: "";
+ }
+
+ pre, blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+
+ thead {
+ display: table-header-group;
+ }
+
+ tr, img {
+ page-break-inside: avoid;
+ }
+
+ img {
+ max-width: 100% !important;
+ }
+
+ @page {
+ margin: 0.5cm;
+ }
+
+ p, h2, h3 {
+ orphans: 3;
+ widows: 3;
+ }
+
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+
+ // hide content people who print don't need to see
+ .page-navigation,
+ .wp-prev-next,
+ .respond-form,
+ nav {
+ display: none;
+ }
diff --git a/app/soc/models/seed_db.py b/app/soc/models/seed_db.py
index c9d27c3..3cb7156 100644
--- a/app/soc/models/seed_db.py
+++ b/app/soc/models/seed_db.py
@@ -61,7 +61,7 @@
site_properties = {
'key_name': 'site',
- 'latest_gsoc': 'google/gsoc2009',
+ 'latest_gsoc': 'google/gsoc2014',
'latest_gci': 'google/gci2009',
}
@@ -134,8 +134,8 @@
after = now + datetime.timedelta(365)
timeline_properties = {
- 'key_name': 'google/gsoc2009',
- 'link_id': 'gsoc2009',
+ 'key_name': 'google/gsoc2014',
+ 'link_id': 'gsoc2014',
'scope': google,
'program_start': before,
'program_end': after,
@@ -144,28 +144,28 @@
'student_signup_end': after,
}
- gsoc2009_timeline = GSoCTimeline(**timeline_properties)
- gsoc2009_timeline.put()
+ gsoc2014_timeline = GSoCTimeline(**timeline_properties)
+ gsoc2014_timeline.put()
program_properties = {
- 'key_name': 'google/gsoc2009',
- 'link_id': 'gsoc2009',
- 'program_id': 'gsoc2009',
+ 'key_name': 'google/gsoc2014',
+ 'link_id': 'gsoc2014',
+ 'program_id': 'gsoc2014',
'sponsor': google,
'scope': google,
- 'name': 'Google Summer of Code 2009',
+ 'name': 'Google Summer of Code 2014',
'short_name': 'GSoC 2009',
'group_label': 'GSOC',
- 'description': 'This is the program for GSoC 2009.',
+ 'description': 'This is the program for GSoC 2014.',
'apps_tasks_limit': 42,
'slots': 42,
- 'timeline': gsoc2009_timeline,
+ 'timeline': gsoc2014_timeline,
'status': program_model.STATUS_VISIBLE,
}
- gsoc2009 = GSoCProgram(**program_properties)
- gsoc2009.put()
+ gsoc2014 = GSoCProgram(**program_properties)
+ gsoc2014.put()
timeline_properties.update({
@@ -243,17 +243,17 @@
melange.put()
group_properties.update({
- 'scope': gsoc2009,
- 'program': gsoc2009,
+ 'scope': gsoc2014,
+ 'program': gsoc2014,
})
role_properties = {
- 'key_name': 'google/gsoc2009/test',
+ 'key_name': 'google/gsoc2014/test',
'parent': current_user,
'link_id': 'test',
'public_name': 'test',
- 'scope': gsoc2009,
- 'program': gsoc2009,
+ 'scope': gsoc2014,
+ 'program': gsoc2014,
'user': current_user,
'given_name': 'Test',
'surname': 'Example',
@@ -277,7 +277,7 @@
orgs = []
for i in range(15):
group_properties.update({
- 'key_name': 'google/gsoc2009/org_%d' % i,
+ 'key_name': 'google/gsoc2014/org_%d' % i,
'link_id': 'org_%d' % i,
'name': 'Organization %d' % i,
'short_name': 'Org %d' % i,
@@ -347,11 +347,11 @@
student_id = 'student'
student_properties = {
- 'key_name': gsoc2009.key().name() + "/" + student_id,
+ 'key_name': gsoc2014.key().name() + "/" + student_id,
'link_id': student_id,
'parent': student_user,
- 'scope': gsoc2009,
- 'program': gsoc2009,
+ 'scope': gsoc2014,
+ 'program': gsoc2014,
'user': student_user,
'is_student': True,
'public_name': 'Student',
@@ -383,8 +383,8 @@
student_info_properties = {
'key_name': melange_student.key().name(),
'parent': melange_student,
- 'expected_graduation': 2009,
- 'program': gsoc2009,
+ 'expected_graduation': 2016,
+ 'program': gsoc2014,
'school_country': 'United States',
'school_name': 'Test School',
'school_home_page': 'http://www.example.com',
@@ -406,7 +406,7 @@
student_user2.put()
student_id = 'student2'
student_properties.update({
- 'key_name': gsoc2009.key().name() + "/" + student_id,
+ 'key_name': gsoc2014.key().name() + "/" + student_id,
'link_id': student_id,
'user': student_user2,
'parent': student_user2,
@@ -424,7 +424,7 @@
'parent': melange_student,
'has_mentor': True,
'org': orgs[1],
- 'program': gsoc2009,
+ 'program': gsoc2014,
}
melange_proposal = GSoCProposal(**proposal_properties)
melange_proposal.put()
@@ -435,7 +435,7 @@
'status': 'accepted',
'parent': melange_student,
'mentors': [profile.key()],
- 'program': gsoc2009,
+ 'program': gsoc2014,
'org': orgs[1].key(),
}
@@ -461,7 +461,7 @@
})
student_info_properties.update({
- 'key_name': gsoc2009.key().name() + "/" + student_id,
+ 'key_name': gsoc2014.key().name() + "/" + student_id,
'link_id': student_id,
'parent': melange_student2,
})
diff --git a/app/soc/models/site.py b/app/soc/models/site.py
index 7ecc993..0124dc6 100644
--- a/app/soc/models/site.py
+++ b/app/soc/models/site.py
@@ -166,3 +166,30 @@
verbose_name=ugettext('Latest GCI'))
latest_gci.help_text = ugettext(
'The key of the latest GCI program')
+
+ #: Optional public mailing list.
+ mailing_list = db.StringProperty(required=False,
+ verbose_name=ugettext('Mailing List'))
+ mailing_list.help_text = ugettext(
+ 'Mailing list email address, URL to sign-up page, etc.')
+
+ #: Optional public IRC channel.
+ irc_channel = db.StringProperty(required=False,
+ verbose_name=ugettext('Public IRC Channel'))
+ irc_channel.help_text = ugettext(
+ 'Address of a public IRC channel.')
+
+ #: Blog page about the site.
+ blog = db.StringProperty(required=False,
+ verbose_name=ugettext('Blog'))
+ blog.help_text = ugettext('Blog page about the site.')
+
+ #: Google Plus page of the site.
+ google_plus = db.StringProperty(required=False,
+ verbose_name=ugettext('Google+ page'))
+ google_plus.help_text = ugettext('Google+ page of the site.')
+
+ #: Field storing description of the site.
+ description = db.TextProperty(verbose_name=ugettext('Description'))
+ description.help_text = ugettext(
+ 'Description of the site to be placed on the site header.')
diff --git a/app/soc/modules/soc_core/callback.py b/app/soc/modules/soc_core/callback.py
index cf92431..0411114 100644
--- a/app/soc/modules/soc_core/callback.py
+++ b/app/soc/modules/soc_core/callback.py
@@ -43,6 +43,7 @@
self.views.append(oauth.PopupOAuthVerified())
self.views.append(site.EditSitePage())
self.views.append(site.SiteHomepage())
+ self.views.append(site.LandingPage())
self.views.append(user.CreateUserPage())
self.views.append(user.EditUserPage())
self.views.append(warmup.WarmupPage())
diff --git a/app/soc/templates/modules/gci/base.html b/app/soc/templates/modules/gci/base.html
index 0b224c0..ca7ea71 100644
--- a/app/soc/templates/modules/gci/base.html
+++ b/app/soc/templates/modules/gci/base.html
@@ -1,4 +1,4 @@
-{% extends "soc/base.html" %}
+{% extends "melange/root.html" %}
{% comment %}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/app/soc/templates/modules/gsoc/base.html b/app/soc/templates/modules/gsoc/base.html
index 3416ed4..424122b 100644
--- a/app/soc/templates/modules/gsoc/base.html
+++ b/app/soc/templates/modules/gsoc/base.html
@@ -1,4 +1,4 @@
-{% extends "soc/base.html" %}
+{% extends "melange/root.html" %}
{% comment %}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/app/soc/views/helper/context.py b/app/soc/views/helper/context.py
index c77ffe9..a226c92 100644
--- a/app/soc/views/helper/context.py
+++ b/app/soc/views/helper/context.py
@@ -61,4 +61,5 @@
'ds_write_disabled': data.ds_write_disabled,
'css_path': css_path,
'gdata_is_logged_in': str(bool(gdata_is_logged_in)).lower(),
+ 'site_description': data.site.description,
}
diff --git a/app/soc/views/site.py b/app/soc/views/site.py
index 9c54519..9240fcb 100644
--- a/app/soc/views/site.py
+++ b/app/soc/views/site.py
@@ -27,15 +27,24 @@
from melange.request import access
from melange.request import exception
from soc.logic import cleaning
+from soc.logic import links
from soc.logic import site as site_logic
from soc.models import document
from soc.models import site
from soc.views import base
from soc.views import forms as views_forms
+from soc.views import template
+from soc.views.helper import request_data
+
DEF_NO_DEVELOPER = ugettext(
'This page is only accessible to developers.')
+CI_PROGRAM_IMAGE_PATH = '/images/gci/logo/landing-page-%s.png'
+SOC_PROGRAM_IMAGE_PATH = '/images/gsoc/logo/landing-page-%s.png'
+
+LANDING_PAGE_NAME = ugettext('Welcome to Melange')
+
def getProgramMap():
# TODO(nathaniel): Magic string? This isn't a program.
@@ -170,3 +179,130 @@
return self.error_handler.handleUserError(user_error, data)
except exception.ServerError as server_error:
return self.error_handler.handleServerError(server_error, data)
+
+
+class ProgramSection(template.Template):
+ """Template that displays a program on the landing page."""
+
+ def __init__(self, data, program, image_path):
+ """Initializes new instance of this class for the specified program.
+
+ Args:
+ data: request_data.RequestData for the current request.
+ program: program entity.
+ image_path: path to the static file with a logo image to be put
+ on the landing page.
+ """
+ super(ProgramSection, self).__init__(data)
+ self._program = program
+ self._image_path = image_path
+
+ def templatePath(self):
+ """See template.Template.templatePath for specification."""
+ return 'melange/landing_page/_program_section.html'
+
+ def isActive(self):
+ """Tells whether the program in this section is currently active or not.
+
+ Returns:
+ bool indication whether the program is currently active or not.
+ """
+ return request_data.TimelineHelper(
+ self._program.timeline, None).programActive()
+
+ def context(self):
+ """See template.Template.context for specification."""
+ homepage_url = links.LINKER.program(
+ self._program, self._program.homepage_url_name)
+
+ return {
+ 'program': self._program,
+ 'homepage_url': homepage_url,
+ 'is_active': self.isActive(),
+ 'image_path': self._image_path,
+ }
+
+
+class ContactUsSection(template.Template):
+ """Template that displays contact information on the landing page."""
+
+ def templatePath(self):
+ """See template.Template.templatePath for specification."""
+ return 'melange/landing_page/_contact_us_section.html'
+
+ def isAnyContactChannelSet(self):
+ """Tells whether there is at least one contact channel set for the site.
+
+ Returns:
+ True if at least one contact channel is defined; False otherwise.
+ """
+ return (self.data.site.blog or self.data.site.google_plus or
+ self.data.site.irc_channel or self.data.site.mailing_list)
+
+ def context(self):
+ """See template.Template.context for specification."""
+ return {
+ 'blog': self.data.site.blog,
+ 'google_plus': self.data.site.google_plus,
+ 'irc_channel': self.data.site.irc_channel,
+ 'mailing_list': self.data.site.mailing_list,
+ }
+
+
+class LandingPage(base.RequestHandler):
+ """View with the landing page that is displayed when user visits
+ the main URL for the application.
+ """
+ # TODO(daniel): it should be changed to All Allowed Checker
+ access_checker = access.DEVELOPER_ACCESS_CHECKER
+
+ def djangoURLPatterns(self):
+ """See base.RequestHandler.getDjangoURLPatterns for specification."""
+ # TODO(daniel): this should be changed to '/' when the page is public
+ return [django_url(r'^landing_page$', self, name='landing_page')]
+
+ def templatePath(self):
+ """See base.RequestHandler.templatePath for specification."""
+ return 'melange/landing_page/landing_page.html'
+
+ def context(self, data, check, mutator):
+ """See base.RequestHandler.context for specification."""
+ # TODO(daniel): these models should not be imported directly here
+ from soc.modules.gsoc.models import program as soc_program_model
+ from soc.modules.gci.models import program as ci_program_model
+
+ program_sections = []
+
+ if data.site.latest_gsoc:
+ latest_soc = soc_program_model.GSoCProgram.get_by_key_name(
+ data.site.latest_gsoc)
+ if latest_soc:
+ program_sections.append(
+ ProgramSection(data, latest_soc,
+ SOC_PROGRAM_IMAGE_PATH % latest_soc.program_id))
+
+ if data.site.latest_gci:
+ latest_ci = ci_program_model.GCIProgram.get_by_key_name(
+ data.site.latest_gci)
+ if latest_ci:
+ program_sections.append(
+ ProgramSection(
+ data, latest_ci, CI_PROGRAM_IMAGE_PATH % latest_ci.program_id))
+
+ if len(program_sections) == 1:
+ # do not bother to show landing page if there is only one active program
+ # just redirect to the corresponding home page instead
+ raise exception.Redirect(program_sections[0].context()['homepage_url'])
+ else:
+ active_programs_counter = len([
+ program_section for program_section in program_sections
+ if program_section.isActive()])
+
+ contact_us_section = ContactUsSection(data)
+
+ return {
+ 'active_programs_counter': active_programs_counter,
+ 'contact_us_section': contact_us_section,
+ 'program_sections': program_sections,
+ 'page_name': LANDING_PAGE_NAME,
+ }
diff --git a/tests/app/soc/views/test_site.py b/tests/app/soc/views/test_site.py
new file mode 100644
index 0000000..67cc4ba
--- /dev/null
+++ b/tests/app/soc/views/test_site.py
@@ -0,0 +1,82 @@
+# Copyright 2013 the Melange authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for site related views."""
+
+from soc.models import site as site_model
+from soc.modules.gci.models import program as gci_program_model
+from soc.modules.gsoc.models import program as gsoc_program_model
+from soc.modules.seeder.logic.seeder import logic as seeder_logic
+
+from tests import profile_utils
+from tests import test_utils
+
+
+class LandingPageTest(test_utils.DjangoTestCase):
+ """Unit tests for LandingPage class."""
+
+ def setUp(self):
+ """See unittest.TestCase.setUp for specification."""
+ # TODO(daniel): eliminate it when page is publicly accessible
+ user = profile_utils.seedUser(is_developer=True)
+ profile_utils.login(user)
+
+ site_properties = {'key_name': 'site'}
+ self.site = seeder_logic.seed(site_model.Site, properties=site_properties)
+
+ self.gsoc_program = seeder_logic.seed(gsoc_program_model.GSoCProgram)
+ self.gci_program = seeder_logic.seed(gci_program_model.GCIProgram)
+
+ def _assertPageTemplatesUsed(self, response):
+ """Asserts that all templates for the tested page are used."""
+ self.assertTemplateUsed(
+ response, 'melange/landing_page/_program_section.html')
+ self.assertTemplateUsed(
+ response, 'melange/landing_page/_contact_us_section.html')
+
+ def testPageLoads(self):
+ """Tests that page loads correctly."""
+ self.site.latest_gsoc = self.gsoc_program.key().name()
+ self.site.latest_gci = self.gci_program.key().name()
+ self.site.mailing_list = 'dev@test.com'
+ self.site.put()
+
+ response = self.get('/landing_page')
+ self.assertResponseOK(response)
+ self._assertPageTemplatesUsed(response)
+
+ def testOneLatestProgram(self):
+ """Tests that redirect response is returned for one defined program."""
+ self.site.latest_gsoc = self.gsoc_program.key().name()
+ self.site.latest_gci = None
+ self.site.put()
+
+ response = self.get('/landing_page')
+ self.assertResponseRedirect(response)
+
+ self.site.latest_gsoc = None
+ self.site.latest_gci = self.gci_program.key().name()
+ self.site.put()
+
+ response = self.get('/landing_page')
+ self.assertResponseRedirect(response)
+
+ def testTwoLatestPrograms(self):
+ """Tests that redirect response is returned for one defined program."""
+ self.site.latest_gsoc = self.gsoc_program.key().name()
+ self.site.latest_gci = self.gci_program.key().name()
+ self.site.put()
+
+ response = self.get('/landing_page')
+ self.assertResponseOK(response)