DP-~xp16Q!v{$_npz{??bL`8J{MLwH`>qJPelab{F%ed%mz$Me&p_hx!q1%vElOA
zG0I_s?ma2SFP$KY6OQ)hxN&ua*w_xF#9A>xBZ}FZNmE*DptYi}#|Plv(=R-lD&VJG
z9^M{nLn5-gTIc@buNW(2Gbyqe7teF(&H3cJJ+x9N4JU^Vv>;=xG@FJWOY795n94?z
zrBaokR3j+WsQig2hY|bp9?$MvZ0)3#V($AY&tLtbXP-wlmTGdPgL?{ZuJaTJ@e
z**Sz2VdzMXY$nBWrAAP!Ghe9iyIi9jHVCU*gll!qo*rOiusvR4tZ1!J{4a}8+l&b}
zHd!iG0bz9b&<-Rb*mf8TRxBbQ2wE%BT`tyGe5duHzheM577150ihzhIyW8IX$L{Irtt
z#G+IN$CUh}R0X%pqSW&IqU>S?=U@}IO_vt{)$Q|iaSV}|+B@MOmrH<1+y9BSOG|cl
zrqqj-?c#o3VtQ&&YGO)d;mK4RprU+F7srr_TS*BG4gU+66dD9L6dDqox*d5M7@D{ZoF%n-
zW@+zhiezA93H~mx#Sj$Vf7PaeA<5wy)8(TbOC|}RZa(GVaa
z1pXrdB9xP?1j+dSBx@!@!>IZA18FpTM#Bex2%yO(B_$Oh0p#?9BwPekhNh87?)B@}
rkeoj9j`y89wejKhKDk}*Bi6_KI(pzkw8s?R-iO!M-Ud3~fTPoh
zgHu`L@2;Y+|JUB`aXcu%zVWu@pIt>$8yg><{w~kqn$!LK@Aq%1B0|5uzLUMu>2ydy
zl%xH>*7~$9#SPWGH?ML`PP%L)QNX~O>B;bfH!+R*zQA-~*fMy!`njxgN@xNABz?A_
diff --git a/includes/functions/theme-functions.php b/includes/functions/theme-functions.php
index 5804883..a433c9a 100644
--- a/includes/functions/theme-functions.php
+++ b/includes/functions/theme-functions.php
@@ -62,20 +62,7 @@ add_action( 'widgets_init', 'trestle_register_widget_areas' );
* @since 1.0.0
*/
function trestle_register_widget_areas() {
-//* Register after post widget area
-genesis_register_sidebar( array(
- 'id' => 'after-post',
- 'name' => __( 'After Post', 'themename' ),
- 'description' => __( 'This is a widget area that can be placed after the post', 'themename' ),
-) );
-add_action( 'genesis_header', 'sp_after_post_widget', 12 );
- function sp_after_post_widget() {
- if ( is_singular( 'post' ) )
- genesis_widget_area( 'after-post', array(
- 'before' => '',
- 'after' => '
',
- ) );
-}
+
}
/*===========================================
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index edb99e4..b10c695 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -32,7 +32,7 @@ jQuery(document).ready(function() {
jQuery('ul, ol').parent('li').addClass('parent');
// Mobile header toggle buttons
- jQuery('.site-header .wrap').prepend('
');
+ jQuery('.site-header .title-area').after('
');
jQuery('.site-header .widget-area, .nav-primary').each(function(i) {
var target = jQuery(this);
diff --git a/style.css b/style.css
index 40be55e..e68ebc8 100644
--- a/style.css
+++ b/style.css
@@ -1302,6 +1302,8 @@ Site Header
--------------------------------------------- */
.title-area {
+ float: left;
+ width: auto;
font-weight: 700;
}
@@ -1375,8 +1377,12 @@ Site Header
--------------------------------------------- */
.site-header .toggle-buttons {
- float: right;
font-size: 0;
+ text-align: right;
+}
+
+.site-header .toggle-button.open {
+ color: #f15123;
}
.site-header .toggle-button:before {
@@ -2091,10 +2097,6 @@ Media Queries
background-position: left top;
}
- .title-area {
- float: left;
- }
-
.logo-mobile {
display: none;
}
From 6124471b99f3397c5595a5ca8a49c20b280c9745 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Thu, 16 Oct 2014 14:55:36 -0700
Subject: [PATCH 016/108] Re-add missing functions.php stuff
---
functions.php | 7 +++++++
includes/functions/theme-functions.php | 15 ---------------
includes/js/theme-jquery.js | 7 ++++---
includes/sidebars/sidebars.php | 14 ++++++++++++--
style.css | 6 ++++--
5 files changed, 27 insertions(+), 22 deletions(-)
diff --git a/functions.php b/functions.php
index f37916f..a66f673 100644
--- a/functions.php
+++ b/functions.php
@@ -27,6 +27,9 @@ function trestle_theme_setup() {
// Additional sidebars
require_once dirname( __FILE__ ) . '/includes/sidebars/sidebars.php';
+ // Plugin activation class
+ require_once dirname( __FILE__ ) . '/lib/classes/class-tgm-plugin-activation.php';
+
/*===========================================
* Theme Setup
@@ -46,4 +49,8 @@ function trestle_theme_setup() {
// Add viewport meta tag for mobile browsers
add_theme_support( 'genesis-responsive-viewport' );
+ // Add support for footer widgets if specified in Trestle settings
+ $trestle_footer_widgets_number = esc_attr( genesis_get_option( 'trestle_footer_widgets_number' ) );
+ add_theme_support( 'genesis-footer-widgets', $trestle_footer_widgets_number );
+
}
diff --git a/includes/functions/theme-functions.php b/includes/functions/theme-functions.php
index a433c9a..7395f18 100644
--- a/includes/functions/theme-functions.php
+++ b/includes/functions/theme-functions.php
@@ -50,21 +50,6 @@ function trestle_header_actions() {
}
-
-/*===========================================
- * Widget Areas
-===========================================*/
-
-add_action( 'widgets_init', 'trestle_register_widget_areas' );
-/**
- * Register custom widget areas
- *
- * @since 1.0.0
- */
-function trestle_register_widget_areas() {
-
-}
-
/*===========================================
* Body Classes
===========================================*/
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index b10c695..1e61921 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -48,19 +48,20 @@ jQuery(document).ready(function() {
target.addClass('toggle-target-' + i );
});
+ // Toggle widget areas and primary nav
jQuery('.site-header .toggle-button').click( function( event ) {
event.preventDefault();
var button = jQuery(this);
- var targetID = button.attr('id').match(/\d+/);
+ var target = jQuery( '.toggle-target-' + button.attr('id').match(/\d+/) );
// Toggle buttons
button.toggleClass('open');
jQuery('.site-header .toggle-button').not(button).removeClass('open');
// Toggle targets
- jQuery('.toggle-target-' + targetID).toggleClass('open');
- jQuery('[class*="toggle-target"]').not('.toggle-target-' + targetID).removeClass('open');
+ target.toggleClass('open');
+ jQuery('[class*="toggle-target"]').not(target).removeClass('open');
});
// Mobile navigation icons
diff --git a/includes/sidebars/sidebars.php b/includes/sidebars/sidebars.php
index dd820ec..72b377e 100644
--- a/includes/sidebars/sidebars.php
+++ b/includes/sidebars/sidebars.php
@@ -1,9 +1,19 @@
Date: Thu, 16 Oct 2014 14:55:57 -0700
Subject: [PATCH 017/108] Re-add missing functions.php stuff
---
functions.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/functions.php b/functions.php
index a66f673..f9d62fc 100644
--- a/functions.php
+++ b/functions.php
@@ -28,7 +28,7 @@ function trestle_theme_setup() {
require_once dirname( __FILE__ ) . '/includes/sidebars/sidebars.php';
// Plugin activation class
- require_once dirname( __FILE__ ) . '/lib/classes/class-tgm-plugin-activation.php';
+ require_once dirname( __FILE__ ) . '/includes/classes/class-tgm-plugin-activation.php';
/*===========================================
From cb289402efdfb68e730082da727584bede4755e5 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Thu, 16 Oct 2014 16:49:37 -0700
Subject: [PATCH 018/108] More updated.
---
functions.php | 45 +++++++++++++++++++++++++--------------------
style.css | 2 +-
2 files changed, 26 insertions(+), 21 deletions(-)
diff --git a/functions.php b/functions.php
index f9d62fc..2809cd6 100644
--- a/functions.php
+++ b/functions.php
@@ -8,29 +8,34 @@
* @package Trestle
*/
+/*===========================================
+ * Required Files
+===========================================*/
+
+// Theme functions
+require_once dirname( __FILE__ ) . '/includes/functions/theme-functions.php';
+
+// Admin functionality
+require_once dirname( __FILE__ ) . '/includes/admin/admin.php';
+
+// Shortcodes
+require_once dirname( __FILE__ ) . '/includes/shortcodes/shortcodes.php';
+
+// Additional sidebars
+require_once dirname( __FILE__ ) . '/includes/sidebars/sidebars.php';
+
+// Plugin activation class
+require_once dirname( __FILE__ ) . '/includes/classes/class-tgm-plugin-activation.php';
+
+
add_action( 'genesis_setup' ,'trestle_theme_setup', 15 );
+/**
+ * Initialize Trestle
+ *
+ * @since 1.0.0
+ */
function trestle_theme_setup() {
- /*===========================================
- * Required Files
- ===========================================*/
-
- // Theme functions
- require_once dirname( __FILE__ ) . '/includes/functions/theme-functions.php';
-
- // Admin functionality
- require_once dirname( __FILE__ ) . '/includes/admin/admin.php';
-
- // Shortcodes
- require_once dirname( __FILE__ ) . '/includes/shortcodes/shortcodes.php';
-
- // Additional sidebars
- require_once dirname( __FILE__ ) . '/includes/sidebars/sidebars.php';
-
- // Plugin activation class
- require_once dirname( __FILE__ ) . '/includes/classes/class-tgm-plugin-activation.php';
-
-
/*===========================================
* Theme Setup
===========================================*/
diff --git a/style.css b/style.css
index d681c7a..eab2539 100644
--- a/style.css
+++ b/style.css
@@ -889,7 +889,6 @@ img.alignright,
.archive-description,
.author-box {
- overflow: auto;
background-color: #fff;
margin-bottom: 40px;
margin-bottom: 4rem;
@@ -1360,6 +1359,7 @@ Site Header
.site-header .widget-area {
width: 100%;
+ padding: 20px;
background-color: #eee;
border: 1px solid #ddd;
border-width: 1px 0;
From 2f738da893c1cf051b10e21555ff03ee00d69566 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 20 Oct 2014 13:46:37 -0700
Subject: [PATCH 019/108] CSS fixes for mobile header.
---
style.css | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/style.css b/style.css
index eab2539..3c18276 100644
--- a/style.css
+++ b/style.css
@@ -306,11 +306,6 @@ a:hover {
border: none;
}
-a img {
- margin-bottom: -4px;
- margin-bottom: -0.4rem;
-}
-
.external-link-icons .external-link:after,
.email-link-icons .email-link:before,
.pdf-link-icons .pdf-link:before,
@@ -1391,8 +1386,8 @@ Site Header
.site-header .toggle-button:before {
content: "\f002";
font-family: FontAwesome;
- font-size: 24px;
- font-size: 2.4rem;
+ font-size: 28px;
+ font-size: 2.8rem;
line-height: 1;
}
@@ -1408,13 +1403,14 @@ Site Header
top: 100%;
left: 0;
right: 0;
+ max-height: 0;
opacity: 0;
filter: alpha(opacity=0);
- -webkit-transition: opacity .5s ease;
- -moz-transition: opacity .5s ease;
- -ms-transition: opacity .5s ease;
- -o-transition: opacity .5s ease;
- transition: opacity .5s ease;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -ms-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
}
.site-container > .nav-primary {
@@ -1424,6 +1420,7 @@ Site Header
.nav-primary.open,
.widget-area.open {
z-index: 50;
+ max-height: 9999px;
opacity: 1;
filter: alpha(opacity=100);
}
@@ -2152,6 +2149,7 @@ Media Queries
top: auto;
right: auto;
left: auto;
+ max-height: 9999px;
opacity: 1;
filter: alpha(opacity=100);
}
From 2b66402f47913122e0f32691f8e55ed4d9db6724 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 20 Oct 2014 14:00:05 -0700
Subject: [PATCH 020/108] Change "sidebars" to "widget-areas"
---
functions.php | 2 +-
includes/sidebars/sidebars.php | 19 --------------
includes/widget-areas/widget-areas.php | 36 ++++++++++++++++++++++++++
3 files changed, 37 insertions(+), 20 deletions(-)
delete mode 100644 includes/sidebars/sidebars.php
create mode 100644 includes/widget-areas/widget-areas.php
diff --git a/functions.php b/functions.php
index 2809cd6..20b3121 100644
--- a/functions.php
+++ b/functions.php
@@ -22,7 +22,7 @@ require_once dirname( __FILE__ ) . '/includes/admin/admin.php';
require_once dirname( __FILE__ ) . '/includes/shortcodes/shortcodes.php';
// Additional sidebars
-require_once dirname( __FILE__ ) . '/includes/sidebars/sidebars.php';
+require_once dirname( __FILE__ ) . '/includes/widget-areas/widget-areas.php';
// Plugin activation class
require_once dirname( __FILE__ ) . '/includes/classes/class-tgm-plugin-activation.php';
diff --git a/includes/sidebars/sidebars.php b/includes/sidebars/sidebars.php
deleted file mode 100644
index 72b377e..0000000
--- a/includes/sidebars/sidebars.php
+++ /dev/null
@@ -1,19 +0,0 @@
- 'sample-widget-area',
+ 'name' => __( 'Sample Widget Area', 'trestle' ),
+ 'description' => __( 'This is the sample widget area', 'trestle' ),
+ ) );
+}
+
+//add_action( 'genesis_header', 'trestle_output_sample_widget_area' );
+/**
+ * Output sample widget area.
+ *
+ * @since 1.2.0
+ */
+function trestle_output_sample_widget_area() {
+ genesis_widget_area( 'sample-widget-area', array(
+ 'before' => '',
+ ) );
+}
\ No newline at end of file
From 4f9b6b87c823632745a23fcc920e9303a560aab1 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 20 Oct 2014 14:05:42 -0700
Subject: [PATCH 021/108] * Add github updater header comment. * Update
readme.md.
---
README.md | 14 ++------------
style.css | 1 +
2 files changed, 3 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index 3d1ba22..f09490e 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,8 @@
-Trestle (beta)
+Trestle
=======
-[](https://gitter.im/MickeyKay/trestle?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-**IMPORTANT: If you're using a version of Trestle that is prior to the [commit e3db022b760254df95cc6e306ea53b3da46b6ed1](https://github.com/MickeyKay/trestle/commit/e3db022b760254df95cc6e306ea53b3da46b6ed1), please make sure to update your version of Trestle, or at least merge in the changes in this commit or a later commit, including changes to these files:**
-* functions.php
-* lib/functions/theme-functions.php
-* lib/admin/admin-functions.php
-
-This will ensure you avoid the bug in which posts spontaneously switch post_type when looping through a query.
-
-=======
-
### A handy boilerplate child theme for serious Genesis developers.
+[](https://gitter.im/MickeyKay/trestle?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
### [View Demo →](http://demo.mightyminnow.com/theme/trestle/)
diff --git a/style.css b/style.css
index 3c18276..55e9bff 100644
--- a/style.css
+++ b/style.css
@@ -8,6 +8,7 @@
Version: 1.1.0
Tags: black, gray, red, white, light, one-column, two-columns, three-columns, left-sidebar, right-sidebar, fluid-layout, responsive-layout, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, flexible-header, front-page-post-form, full-width-template, post-formats, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready, genesis, mobile-first, responsive, clean
Text Domain: trestle
+ GitHub Theme URI: mickeykay/trestle
*/
/* Table of Contents
From 0a87ff0a7423279489f65b0ad6701617888e8400 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 20 Oct 2014 14:08:17 -0700
Subject: [PATCH 022/108] Fix nav extras wrapping on resize.
---
style.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/style.css b/style.css
index 55e9bff..516c522 100644
--- a/style.css
+++ b/style.css
@@ -2362,6 +2362,7 @@ Media Queries
}
.genesis-nav-menu > li {
+ float: left;
border-top-width: 0;
}
From b2e6ff661bd3eddf3ad2832456709f2daee782fe Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 20 Oct 2014 14:22:26 -0700
Subject: [PATCH 023/108] Add box shadow to mobile nav components.
---
style.css | 2 ++
1 file changed, 2 insertions(+)
diff --git a/style.css b/style.css
index 516c522..646851b 100644
--- a/style.css
+++ b/style.css
@@ -1406,6 +1406,7 @@ Site Header
right: 0;
max-height: 0;
opacity: 0;
+ box-shadow: 0 4px 8px 1px rgba(0,0,0,0.4);
filter: alpha(opacity=0);
-webkit-transition: all .5s ease;
-moz-transition: all .5s ease;
@@ -2153,6 +2154,7 @@ Media Queries
max-height: 9999px;
opacity: 1;
filter: alpha(opacity=100);
+ box-shadow: none;
}
.site-header .nav-primary,
From d4e67b382a4071b1c1071545ead6f58105385539 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 20 Oct 2014 16:34:36 -0700
Subject: [PATCH 024/108] Adding alpha opacity IE8 support :(
---
style.css | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/style.css b/style.css
index 646851b..912c02d 100644
--- a/style.css
+++ b/style.css
@@ -1407,7 +1407,7 @@ Site Header
max-height: 0;
opacity: 0;
box-shadow: 0 4px 8px 1px rgba(0,0,0,0.4);
- filter: alpha(opacity=0);
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
-webkit-transition: all .5s ease;
-moz-transition: all .5s ease;
-ms-transition: all .5s ease;
@@ -1424,7 +1424,7 @@ Site Header
z-index: 50;
max-height: 9999px;
opacity: 1;
- filter: alpha(opacity=100);
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
}
@@ -2153,7 +2153,7 @@ Media Queries
left: auto;
max-height: 9999px;
opacity: 1;
- filter: alpha(opacity=100);
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
box-shadow: none;
}
From 7920c8ace9b38ede730bce498c12f55888b5ee85 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Tue, 21 Oct 2014 09:09:05 -0700
Subject: [PATCH 025/108] Remove unecessary header styles.
---
style.css | 6 ------
1 file changed, 6 deletions(-)
diff --git a/style.css b/style.css
index 912c02d..d0ec9b5 100644
--- a/style.css
+++ b/style.css
@@ -1331,12 +1331,6 @@ Site Header
top: -9999px;
}
-/* Full width header, no widgets */
-
-.header-full-width .title-area,
-.header-full-width .site-title {
- width: 100%;
-}
/* Logo
--------------------------------------------- */
From 64c725f9429f918b71d05d9f782a0d5ec7b760d7 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Thu, 23 Oct 2014 11:19:52 -0700
Subject: [PATCH 026/108] Update header logo style to remove bottom margin.
---
style.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/style.css b/style.css
index d0ec9b5..0f8c3b4 100644
--- a/style.css
+++ b/style.css
@@ -2097,7 +2097,7 @@ Media Queries
}
.logo-full {
- display: inline-block;
+ display: block;
}
.site-header .widget-area {
From c8097483202d318fdaa8f511ab4a12a70400a729 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Thu, 23 Oct 2014 14:52:22 -0700
Subject: [PATCH 027/108] Fix broken hover style for desktop sub-menus staying
closed on hover.
---
style.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/style.css b/style.css
index 0f8c3b4..8584fe4 100644
--- a/style.css
+++ b/style.css
@@ -2459,6 +2459,7 @@ Media Queries
.genesis-nav-menu li:hover > ul {
left: auto;
opacity: 1;
+ display: block !important;
}
.genesis-nav-menu ul li:hover > ul {
From ddcc3bab7ba2eb5baeaf347b555c35cac966bcc4 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Thu, 23 Oct 2014 16:27:01 -0700
Subject: [PATCH 028/108] Simplify nav menu explicit widths and borders.
---
style.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/style.css b/style.css
index 8584fe4..2ef3b13 100644
--- a/style.css
+++ b/style.css
@@ -2422,12 +2422,12 @@ Media Queries
}
.genesis-nav-menu ul li {
+ width: 100%;
padding-left: 0;
}
.genesis-nav-menu ul a {
position: relative;
- width: 200px;
padding: 10px 20px;
padding: 1rem 2rem;
border-width: 1px 1px 0 1px;
From d7f0f40f6c9d01aa47991ab8ce93e4b06703266a Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 27 Oct 2014 10:29:06 -0700
Subject: [PATCH 029/108] Fix comment order in functions.
---
includes/functions/theme-functions.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/includes/functions/theme-functions.php b/includes/functions/theme-functions.php
index 7395f18..ad05d30 100644
--- a/includes/functions/theme-functions.php
+++ b/includes/functions/theme-functions.php
@@ -331,6 +331,7 @@ function trestle_update_revisions_number( $num ) {
return $num;
}
+add_action( 'the_post', 'trestle_post_info_meta', 5 );
/**
* Manually controls display of post info/meta for all post types.
*
@@ -339,7 +340,6 @@ function trestle_update_revisions_number( $num ) {
* @see trestle_set_page_post_type()
* @global object $post The current $post object.
*/
-add_action( 'the_post', 'trestle_post_info_meta', 5 );
function trestle_post_info_meta() {
if ( ! is_admin() && in_the_loop() && genesis_get_option( 'trestle_manual_post_info_meta' ) ) {
From 8c51135a171ceab876ca84fe97976c55a3c3e59e Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 27 Oct 2014 12:19:19 -0700
Subject: [PATCH 030/108] Update README.md.
---
style.css | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/style.css b/style.css
index 2ef3b13..a6246c2 100644
--- a/style.css
+++ b/style.css
@@ -420,6 +420,10 @@ img {
width: auto; /* IE8 */
}
+.wp-caption img {
+ display: block;
+}
+
/* Forms & Buttons
--------------------------------------------- */
From 7e43fe8c81c169daa1a29fb61a45024e1177e1c0 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 27 Oct 2014 12:20:51 -0700
Subject: [PATCH 031/108] add
---
style.css | 4 ----
1 file changed, 4 deletions(-)
diff --git a/style.css b/style.css
index a6246c2..2ef3b13 100644
--- a/style.css
+++ b/style.css
@@ -420,10 +420,6 @@ img {
width: auto; /* IE8 */
}
-.wp-caption img {
- display: block;
-}
-
/* Forms & Buttons
--------------------------------------------- */
From a1a1fe96c3f6059df2f9f09da5cfd0f659d7053c Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 27 Oct 2014 12:22:41 -0700
Subject: [PATCH 032/108] Update style.css
---
style.css | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/style.css b/style.css
index 2ef3b13..a6246c2 100644
--- a/style.css
+++ b/style.css
@@ -420,6 +420,10 @@ img {
width: auto; /* IE8 */
}
+.wp-caption img {
+ display: block;
+}
+
/* Forms & Buttons
--------------------------------------------- */
From 241643cda0df4b07b2a2bd9183840d40886ca2ab Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Mon, 27 Oct 2014 16:40:45 -0700
Subject: [PATCH 033/108] Add archive template that displays pages excluded by
exclude pages plugin.
---
page_archive_all_pages.php | 67 ++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
create mode 100644 page_archive_all_pages.php
diff --git a/page_archive_all_pages.php b/page_archive_all_pages.php
new file mode 100644
index 0000000..986d64e
--- /dev/null
+++ b/page_archive_all_pages.php
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Date: Mon, 3 Nov 2014 17:08:19 -0800
Subject: [PATCH 034/108] Update equal heights script
---
includes/js/theme-jquery.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 1e61921..896f184 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -133,7 +133,7 @@ jQuery(window).load(function() {
breakPoint = breakPoint || 0;
// Bind functionality to appropriate events
- jQuery(window).bind('load orientationchange resize', function() {
+ jQuery(window).on('load orientationchange resize equalheights', function() {
tallest = (minHeight) ? minHeight : 0;
items.each(function() {
jQuery(this).height('auto');
From 2afc6ec1741992d45773496f5d724f030abb341f Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Thu, 6 Nov 2014 16:39:54 -0800
Subject: [PATCH 035/108] Add responsive table CSS
---
style.css | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/style.css b/style.css
index a6246c2..8786f28 100644
--- a/style.css
+++ b/style.css
@@ -2079,6 +2079,63 @@ Media Queries
}
+/* Responsive Tables CSS
+--------------------------------------------- */
+@media (max-width: 600px) {
+
+ table {
+ clear: both;
+ }
+
+ tr {
+ padding: 0.5em;
+ }
+
+ th,
+ td {
+ padding: 0;
+ }
+
+ table tbody td {
+ vertical-align: top;
+ }
+
+ table thead {
+ display: none;
+ }
+
+ table tbody {
+ line-height: 1.2;
+ }
+
+ table tbody tr {
+ margin-top: 0.5em;
+ border: 1px solid #CCC;
+ }
+
+ table tbody tr,
+ table tbody td {
+ display: block;
+ width: 100%;
+ height: auto;
+ }
+
+ table tbody td {
+ display: block;
+ border: none;
+ }
+
+ table ul {
+ margin: 5px 0px 10px 20px;
+ margin: 0.5rem 0 1rem 2rem;
+ }
+
+ table li {
+ margin-bottom: .5em;
+ }
+
+}
+
@media (min-width: 768px) {
/* General
From 6c9194abc0dc6d435577210d119aeb924af72ec6 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Tue, 11 Nov 2014 12:20:11 -0800
Subject: [PATCH 036/108] Add title att to button shortcode
---
includes/shortcodes/shortcodes.php | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/includes/shortcodes/shortcodes.php b/includes/shortcodes/shortcodes.php
index c6c3e15..5f6adcb 100644
--- a/includes/shortcodes/shortcodes.php
+++ b/includes/shortcodes/shortcodes.php
@@ -53,10 +53,11 @@ add_shortcode( 'col', 'trestle_column' );
*/
function trestle_button( $atts, $content = null ) {
extract( shortcode_atts( array(
- 'href' => '#',
+ 'href' => '#',
+ 'title' => '',
'class' => '',
), $atts ) );
- return '' . do_shortcode( $content ) . ' ';
+ return '' . do_shortcode( $content ) . ' ';
}
add_shortcode( 'button', 'trestle_button' );
From b29901ef042d16f45a751819a6a3230fa885ea68 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Wed, 12 Nov 2014 09:49:01 -0800
Subject: [PATCH 037/108] Re-added favicon
---
images/favicon.ico | Bin 0 -> 3262 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100755 images/favicon.ico
diff --git a/images/favicon.ico b/images/favicon.ico
new file mode 100755
index 0000000000000000000000000000000000000000..1fb7cec0be89a06ccaa10553ca3f6c977f670a50
GIT binary patch
literal 3262
zcmZQzU<5)11qL7~!LWjdfkBLcfk6X^fkF%pKnxNGfd-(QFgFB)1%QOoC>RZa(GVaa
z1pXrdB9xP?1j+dSBx@!@!>IZA18FpTM#Bex2%yO(B_$Oh0p#?9BwPekhNh87?)B@}
rk
Date: Wed, 12 Nov 2014 15:18:08 -0800
Subject: [PATCH 038/108] Update styles to fix IE8 header nav
---
style.css | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/style.css b/style.css
index 8786f28..b6e1143 100644
--- a/style.css
+++ b/style.css
@@ -2347,7 +2347,6 @@ Media Queries
.one-third,
.two-sixths,
.sidebar-primary,
- .title-area,
.footer-widgets-number-3 .footer-widgets .widget-area {
width: 31.623931623931625%;
}
@@ -2536,6 +2535,12 @@ Media Queries
text-align: right;
}
+ .site-header .nav-primary .wrap,
+ .site-header .nav-primary .wrap .menu { /* Required for IE8 */
+ float: right;
+ width: auto;
+ }
+
.site-header .nav-primary .menu > li > a {
padding: 0.6em 1.2em;
}
From a84e293186c8a10069a240dbd5e2790ff3fcd751 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Wed, 12 Nov 2014 15:40:24 -0800
Subject: [PATCH 039/108] Update input outline styles for mobile.
---
style.css | 3 +++
1 file changed, 3 insertions(+)
diff --git a/style.css b/style.css
index b6e1143..41aa6ed 100644
--- a/style.css
+++ b/style.css
@@ -170,11 +170,14 @@ input[type="reset"]:focus,
input[type="submit"]:focus,
textarea:focus,
.button {
+ outline: none;
+
-webkit-transition: all 0.1s ease-in-out;
-moz-transition: all 0.1s ease-in-out;
-ms-transition: all 0.1s ease-in-out;
-o-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
+
-webkit-appearance: none;
-moz-appearance: none;
}
From 3146ae3c98cf6d26eed1669b3cb3da1094f5a89e Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Tue, 18 Nov 2014 11:06:18 -0800
Subject: [PATCH 040/108] Add more useful classes to menu toggle buttons
---
includes/js/theme-jquery.js | 101 +++++++++++++++++++-----------------
1 file changed, 54 insertions(+), 47 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 896f184..4a167fc 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -32,13 +32,20 @@ jQuery(document).ready(function() {
jQuery('ul, ol').parent('li').addClass('parent');
// Mobile header toggle buttons
- jQuery('.site-header .title-area').after('
');
- jQuery('.site-header .widget-area, .nav-primary').each(function(i) {
- var target = jQuery(this);
+ jQuery('.site-header .title-area').after('
');
+ jQuery('.site-header .widget-area, .nav-primary').each(function(i) {
+ var target = jQuery(this);
- var buttonClass = 'toggle-button';
+ var buttonClass = 'toggle-button';
+
+ // Add classes of target element
+ var targetClass = target.attr('class').split(/\s+/);
+ jQuery.each(targetClass, function(index,value) {
+ buttonClass += ' targets-' + value;
+ });
+
if ( jQuery(this).is( 'nav' ) ) {
- buttonClass += ' nav-toggle';
+ buttonClass += ' nav-toggle';
}
// Add toggle buttons to header
@@ -47,13 +54,13 @@ jQuery(document).ready(function() {
// Add target class to nav and widget areas
target.addClass('toggle-target-' + i );
});
-
+
// Toggle widget areas and primary nav
jQuery('.site-header .toggle-button').click( function( event ) {
- event.preventDefault();
+ event.preventDefault();
- var button = jQuery(this);
- var target = jQuery( '.toggle-target-' + button.attr('id').match(/\d+/) );
+ var button = jQuery(this);
+ var target = jQuery( '.toggle-target-' + button.attr('id').match(/\d+/) );
// Toggle buttons
button.toggleClass('open');
@@ -73,28 +80,28 @@ jQuery(document).ready(function() {
// Mobile navigation expand/contract functionality
jQuery('.sub-icon').click(function(event) {
- event.preventDefault();
- var icon = jQuery(this);
- icon.next('ul').slideToggle().toggleClass('open');
- if ( icon.text().indexOf( closedIcon ) !== -1 )
- icon.text(openIcon);
- else if ( icon.text().indexOf( openIcon ) !== -1 )
- icon.text(closedIcon);
+ event.preventDefault();
+ var icon = jQuery(this);
+ icon.next('ul').slideToggle().toggleClass('open');
+ if ( icon.text().indexOf( closedIcon ) !== -1 )
+ icon.text(openIcon);
+ else if ( icon.text().indexOf( openIcon ) !== -1 )
+ icon.text(closedIcon);
});
jQuery('.widget-area-toggle').click(function(event) {
- event.preventDefault();
- var button = jQuery(this);
- button.toggleClass('open');
- button.next('.widget-area').slideToggle();
+ event.preventDefault();
+ var button = jQuery(this);
+ button.toggleClass('open');
+ button.next('.widget-area').slideToggle();
});
// Equal height homepage cols
- jQuery('.equal-height-genesis-extender-cols .ez-home-container-area').each(function() {
- jQuery(this).children('.widget-area').equalHeights(null,null,trestleEqualColsBreakpoint);
- });
+ jQuery('.equal-height-genesis-extender-cols .ez-home-container-area').each(function() {
+ jQuery(this).children('.widget-area').equalHeights(null,null,trestleEqualColsBreakpoint);
+ });
-
+
}); /* end of as page load scripts */
@@ -128,38 +135,38 @@ jQuery(window).load(function() {
*
*/
(function(jQuery) {
- jQuery.fn.equalHeights = function(minHeight, maxHeight, breakPoint) {
- var items = this;
- breakPoint = breakPoint || 0;
+ jQuery.fn.equalHeights = function(minHeight, maxHeight, breakPoint) {
+ var items = this;
+ breakPoint = breakPoint || 0;
// Bind functionality to appropriate events
jQuery(window).on('load orientationchange resize equalheights', function() {
- tallest = (minHeight) ? minHeight : 0;
- items.each(function() {
- jQuery(this).height('auto');
- if(jQuery(this).outerHeight() > tallest) {
- tallest = jQuery(this).outerHeight();
- }
- });
+ tallest = (minHeight) ? minHeight : 0;
+ items.each(function() {
+ jQuery(this).height('auto');
+ if(jQuery(this).outerHeight() > tallest) {
+ tallest = jQuery(this).outerHeight();
+ }
+ });
// Get viewport width (taking scrollbars into account)
var e = window;
a = 'inner';
if (!('innerWidth' in window )) {
- a = 'client';
- e = document.documentElement || document.body;
- }
- width = e[ a+'Width' ];
+ a = 'client';
+ e = document.documentElement || document.body;
+ }
+ width = e[ a+'Width' ];
// Equalize column heights if above the specified breakpoint
if ( width >= breakPoint ) {
- if((maxHeight) && tallest > maxHeight) tallest = maxHeight;
- console.log(tallest);
- return items.each(function() {
- jQuery(this).height(tallest);
- });
- }
- });
-}
+ if((maxHeight) && tallest > maxHeight) tallest = maxHeight;
+ console.log(tallest);
+ return items.each(function() {
+ jQuery(this).height(tallest);
+ });
+ }
+ });
+ }
-})(jQuery);
\ No newline at end of file
+ })(jQuery);
\ No newline at end of file
From f716b06429aed7009561fdb02fb2c61403b1ae64 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 21 Nov 2014 16:03:12 -0800
Subject: [PATCH 041/108] Cool changes to jquery and shortcodes.
---
includes/functions/theme-functions.php | 2 +-
includes/js/theme-jquery.js | 4 ++--
includes/shortcodes/shortcodes.php | 20 +++++++++-----------
3 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/includes/functions/theme-functions.php b/includes/functions/theme-functions.php
index ad05d30..ea71f76 100644
--- a/includes/functions/theme-functions.php
+++ b/includes/functions/theme-functions.php
@@ -46,7 +46,7 @@ function trestle_header_actions() {
$php_vars = array (
'trestle_equal_cols_breakpoint' => genesis_get_option( 'trestle_equal_cols_breakpoint' ),
);
- wp_localize_script( 'theme-jquery', 'php_vars', $php_vars );
+ wp_localize_script( 'theme-jquery', 'trestle_vars', $php_vars );
}
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 4a167fc..57cb300 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -10,8 +10,8 @@
jQuery(document).ready(function() {
// Get PHP vars passed via wp_localize_script()
- trestleEqualColsBreakpoint = php_vars.trestle_equal_cols_breakpoint;
- trestleEqualHeightCols = php_vars.trestle_equal_height_cols
+ trestleEqualColsBreakpoint = trestle_vars.trestle_equal_cols_breakpoint;
+ trestleEqualHeightCols = trestle_vars.trestle_equal_height_cols;
// Remove .no-jquery body class
jQuery('body').removeClass('no-jquery');
diff --git a/includes/shortcodes/shortcodes.php b/includes/shortcodes/shortcodes.php
index 5f6adcb..1c9cb09 100644
--- a/includes/shortcodes/shortcodes.php
+++ b/includes/shortcodes/shortcodes.php
@@ -62,20 +62,18 @@ function trestle_button( $atts, $content = null ) {
add_shortcode( 'button', 'trestle_button' );
/**
- * Blockquote
+ * Buttons
*
* Example:
- * [blockquote name="Speaker" sub_text="Position, Company"]Contents[/blockquote]
+ * [button href="url" title="title" target="target" class="class"]Text[/button]
*/
-function trestle_blockquote( $atts, $content = null ) {
+function trestle_button( $atts, $content = null ) {
extract( shortcode_atts( array(
- 'name' => '',
- 'sub_text' => '',
+ 'href' => '#',
+ 'target' => '',
+ 'title' => '',
+ 'class' => '',
), $atts ) );
-
- $sub_text_html = $sub_text ? '' . $sub_text . ' ' : '';
- $cite = $name ? '' . $name . $sub_text_html . ' ' : '';
-
- return '' . $content . $cite . '
';
+ return '' . do_shortcode( $content ) . ' ';
}
-add_shortcode( 'blockquote', 'trestle_blockquote' );
\ No newline at end of file
+add_shortcode( 'button', 'trestle_button' );
From 2c9d35ab7f9ea8a50bb0894dadbc3fe0cf4015e4 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Tue, 25 Nov 2014 13:47:18 -0800
Subject: [PATCH 042/108] Add date shortcode - thanks Braad!
---
includes/shortcodes/shortcodes.php | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/includes/shortcodes/shortcodes.php b/includes/shortcodes/shortcodes.php
index 1c9cb09..3463e3f 100644
--- a/includes/shortcodes/shortcodes.php
+++ b/includes/shortcodes/shortcodes.php
@@ -18,7 +18,7 @@ function trestle_shortcode_empty_paragraph_fix($content)
'[' => '[',
']
' => ']',
'] ' => ']'
- );
+ );
$content = strtr($content, $array);
@@ -40,7 +40,7 @@ add_filter('the_content', 'trestle_shortcode_empty_paragraph_fix');
function trestle_column( $atts, $content = null ) {
extract( shortcode_atts( array(
'class' => '',
- ), $atts ) );
+ ), $atts ) );
return '' . do_shortcode( $content ) . '
';
}
add_shortcode( 'col', 'trestle_column' );
@@ -56,13 +56,13 @@ function trestle_button( $atts, $content = null ) {
'href' => '#',
'title' => '',
'class' => '',
- ), $atts ) );
+ ), $atts ) );
return '' . do_shortcode( $content ) . ' ';
}
add_shortcode( 'button', 'trestle_button' );
/**
- * Buttons
+ * Button
*
* Example:
* [button href="url" title="title" target="target" class="class"]Text[/button]
@@ -73,7 +73,26 @@ function trestle_button( $atts, $content = null ) {
'target' => '',
'title' => '',
'class' => '',
- ), $atts ) );
+ ), $atts ) );
return '' . do_shortcode( $content ) . ' ';
}
add_shortcode( 'button', 'trestle_button' );
+
+/**
+ * Date
+ *
+ * Example: [date format="M d, Y"]
+ *
+ */
+function trestle_date( $atts ) {
+ extract( shortcode_atts( array(
+ 'format' => 'M d, Y',
+ ), $format ) );
+
+ if ( ! $format ) {
+ $format = 'M d, Y';
+ }
+
+ return date( $format );
+}
+add_shortcode( 'date', 'trestle_date' );
From dd46238210ff9b1e074980fb26ac72185f241149 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Wed, 26 Nov 2014 14:02:57 -0800
Subject: [PATCH 043/108] Add defaults for logo urls
---
includes/admin/admin.php | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/includes/admin/admin.php b/includes/admin/admin.php
index e4d9737..cf09130 100644
--- a/includes/admin/admin.php
+++ b/includes/admin/admin.php
@@ -36,17 +36,19 @@ add_filter( 'genesis_theme_settings_defaults', 'trestle_custom_defaults' );
function trestle_custom_defaults( $defaults ) {
// Trestle default key/value pairs
$trestle_defaults = array(
- 'trestle_layout' => 'solid',
- 'trestle_nav_primary_location' => 'full',
- 'trestle_auto_nav' => 0,
- 'trestle_auto_nav_depth' => 0,
- 'trestle_include_home_link' => 0,
- 'trestle_home_link_text' => __( 'Home', 'trestle' ),
- 'trestle_nav_button_text' => '[icon name="icon-list-ul"] ' . __( 'Navigation', 'trestle' ),
- 'trestle_read_more_text' => __( 'Read More »', 'trestle' ),
- 'trestle_revisions_number' => 3,
+ 'trestle_layout' => 'solid',
+ 'trestle_logo_url' => '',
+ 'trestle_logo_url_mobile' => '',
+ 'trestle_nav_primary_location' => 'full',
+ 'trestle_auto_nav' => 0,
+ 'trestle_auto_nav_depth' => 0,
+ 'trestle_include_home_link' => 0,
+ 'trestle_home_link_text' => __( 'Home', 'trestle' ),
+ 'trestle_nav_button_text' => '[icon name="icon-list-ul"] ' . __( 'Navigation', 'trestle' ),
+ 'trestle_read_more_text' => __( 'Read More »', 'trestle' ),
+ 'trestle_revisions_number' => 3,
'trestle_footer_widgets_number' => 3,
- 'trestle_equal_height_cols' => 1,
+ 'trestle_equal_height_cols' => 1,
'trestle_equal_cols_breakpoint' => 768,
);
From 82cf1961bf08836134250d7181778a1e4debc2a8 Mon Sep 17 00:00:00 2001
From: Mickey Kay
Date: Fri, 12 Dec 2014 09:40:47 -0800
Subject: [PATCH 044/108] Remove outline on toggle buttons.
---
style.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/style.css b/style.css
index 41aa6ed..cfeefc2 100644
--- a/style.css
+++ b/style.css
@@ -1379,6 +1379,7 @@ Site Header
.site-header .toggle-button {
margin-left: 15px;
+ outline: none;
}
.site-header .toggle-button.open {
From 60504cec9ce30ea43ed588832dbf76e6bbcaa206 Mon Sep 17 00:00:00 2001
From: Mickey Kay
Date: Thu, 18 Dec 2014 10:03:38 -0800
Subject: [PATCH 045/108] Update README.md
---
README.md | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index f09490e..8b11220 100644
--- a/README.md
+++ b/README.md
@@ -29,8 +29,12 @@ Here are some of Trestle's many features, check out the [Trestle Demo](http://de
* Examples and usage can all be viewed on the [Trestle Demo](http://demo.mightyminnow.com/theme/trestle/)
#### To Do
-* Add header for Github Updater plugin
* Rework menu CSS for simplicity (general / primary / secondary / header)
-* Add Grunt support for
- - CSSComb
- - Sass (one day)
+* Convert non-theme functionality to separate Genesis-dependant plugin
+* Add in Grunt support for:
+ * Sass
+ * Auto-ordering of CSS (CSSComb)
+ * Translation
+ * Check other themes for other ideas. . .
+* Switch to customizer for theme options instead of Genesis panel (pros? cons?)
+* Remove custom background CSS that doesn't make sense (different max-widths, etc)
From c6f391254a4942a333344ecda45a3b8456e8a694 Mon Sep 17 00:00:00 2001
From: Mickey Kay
Date: Fri, 19 Dec 2014 10:03:23 -0800
Subject: [PATCH 046/108] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 8b11220..7ea83fc 100644
--- a/README.md
+++ b/README.md
@@ -38,3 +38,4 @@ Here are some of Trestle's many features, check out the [Trestle Demo](http://de
* Check other themes for other ideas. . .
* Switch to customizer for theme options instead of Genesis panel (pros? cons?)
* Remove custom background CSS that doesn't make sense (different max-widths, etc)
+* Weird extra icons on accordions on demo site.
From 0307d91ec346013ba936ffef3eaa14bab9c6a8b2 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 19 Dec 2014 14:12:47 -0800
Subject: [PATCH 047/108] Remove duplicate button shortcode.
---
includes/shortcodes/shortcodes.php | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/includes/shortcodes/shortcodes.php b/includes/shortcodes/shortcodes.php
index 3463e3f..b8ceddb 100644
--- a/includes/shortcodes/shortcodes.php
+++ b/includes/shortcodes/shortcodes.php
@@ -45,22 +45,6 @@ function trestle_column( $atts, $content = null ) {
}
add_shortcode( 'col', 'trestle_column' );
-/**
- * Buttons
- *
- * Example:
- * [button href="url" class="class"]Text[/button]
- */
-function trestle_button( $atts, $content = null ) {
- extract( shortcode_atts( array(
- 'href' => '#',
- 'title' => '',
- 'class' => '',
- ), $atts ) );
- return '' . do_shortcode( $content ) . ' ';
-}
-add_shortcode( 'button', 'trestle_button' );
-
/**
* Button
*
From 7586b72710e498f5f156176e507aaf797744daac Mon Sep 17 00:00:00 2001
From: Mickey Kay
Date: Mon, 5 Jan 2015 10:41:19 -0800
Subject: [PATCH 048/108] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 7ea83fc..9c24615 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,7 @@ Here are some of Trestle's many features, check out the [Trestle Demo](http://de
* Examples and usage can all be viewed on the [Trestle Demo](http://demo.mightyminnow.com/theme/trestle/)
#### To Do
+* Add ability to click off of mobile menu/search to hide menu/search.
* Rework menu CSS for simplicity (general / primary / secondary / header)
* Convert non-theme functionality to separate Genesis-dependant plugin
* Add in Grunt support for:
From ceedb4ccf2220a2e632e80c5e2d4d7f2375b6c02 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Wed, 7 Jan 2015 10:23:25 -0800
Subject: [PATCH 049/108] Add blockquote shortcode
---
includes/shortcodes/shortcodes.php | 78 ++++++++++++++++++++++++++----
1 file changed, 69 insertions(+), 9 deletions(-)
diff --git a/includes/shortcodes/shortcodes.php b/includes/shortcodes/shortcodes.php
index b8ceddb..b5cbad2 100644
--- a/includes/shortcodes/shortcodes.php
+++ b/includes/shortcodes/shortcodes.php
@@ -11,8 +11,17 @@
* Shortcodes
===========================================*/
-// Fix for empty tags around shortcodes
-function trestle_shortcode_empty_paragraph_fix($content)
+add_filter('the_content', 'trestle_shortcode_empty_paragraph_fix');
+/**
+ * Fix for empty
tags around shortcodes
+ *
+ * @since 1.0.0
+ *
+ * @param string $content HTML content.
+ *
+ * @return string Updated content.
+ */
+function trestle_shortcode_empty_paragraph_fix( $content )
{
$array = array (
'
[' => '[',
@@ -24,8 +33,8 @@ function trestle_shortcode_empty_paragraph_fix($content)
return $content;
}
-add_filter('the_content', 'trestle_shortcode_empty_paragraph_fix');
+add_shortcode( 'col', 'trestle_column' );
/**
* Columns
*
@@ -36,6 +45,10 @@ add_filter('the_content', 'trestle_shortcode_empty_paragraph_fix');
* - width (one-half, one-third, etc - uses native Genesis column classes in style.css)
* - first (used to specify the first column in a row)
* - no-list-margin (will cause contained list elements to collapse as one on mobile sizes)
+ *
+ * @param array $atts Shortcode attributes.
+ *
+ * @return string Shortcode output.
*/
function trestle_column( $atts, $content = null ) {
extract( shortcode_atts( array(
@@ -43,13 +56,18 @@ function trestle_column( $atts, $content = null ) {
), $atts ) );
return '
' . do_shortcode( $content ) . '
';
}
-add_shortcode( 'col', 'trestle_column' );
+
+
+add_shortcode( 'button', 'trestle_button' );
/**
* Button
*
- * Example:
- * [button href="url" title="title" target="target" class="class"]Text[/button]
+ * Example: [button href="url" title="title" target="target" class="class"]Text[/button]
+ *
+ * @param array $atts Shortcode attributes.
+ *
+ * @return string Shortcode output.
*/
function trestle_button( $atts, $content = null ) {
extract( shortcode_atts( array(
@@ -60,13 +78,17 @@ function trestle_button( $atts, $content = null ) {
), $atts ) );
return '' . do_shortcode( $content ) . ' ';
}
-add_shortcode( 'button', 'trestle_button' );
+
+add_shortcode( 'date', 'trestle_date' );
/**
* Date
*
* Example: [date format="M d, Y"]
- *
+ *
+ * @param array $atts Shortcode attributes.
+ *
+ * @return string Shortcode output.
*/
function trestle_date( $atts ) {
extract( shortcode_atts( array(
@@ -79,4 +101,42 @@ function trestle_date( $atts ) {
return date( $format );
}
-add_shortcode( 'date', 'trestle_date' );
+
+add_shortcode( 'blockquote', 'igg_blockquote_shortcode' );
+/**
+ * Blockquote
+ *
+ * Example: [blockquote citation=""]Content[/blockquote]
+ *
+ * @since 1.2.0
+ *
+ * @param array $atts Shortcode attributes.
+ *
+ * @return string Shortcode output.
+ */
+function igg_blockquote_shortcode( $atts, $content = null ) {
+
+ $atts = shortcode_atts( array(
+ 'citation' => '',
+ ), $atts );
+
+ ob_start(); ?>
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
Date: Wed, 7 Jan 2015 10:50:08 -0800
Subject: [PATCH 050/108] Update README.md
---
README.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.md b/README.md
index 9c24615..7cf55d6 100644
--- a/README.md
+++ b/README.md
@@ -40,3 +40,6 @@ Here are some of Trestle's many features, check out the [Trestle Demo](http://de
* Switch to customizer for theme options instead of Genesis panel (pros? cons?)
* Remove custom background CSS that doesn't make sense (different max-widths, etc)
* Weird extra icons on accordions on demo site.
+* Mobile menu button setting - either:
+ * Remove (currently controlled from JS), or
+ * Pass icon/text as params to jQuery
From 49855ce7c30691f3961cb31d07f8c1dc59d99629 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Wed, 7 Jan 2015 13:14:22 -0800
Subject: [PATCH 051/108] Remove external link on pdf\'s - courtesy of B-Raad
---
style.css | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/style.css b/style.css
index cfeefc2..144a514 100644
--- a/style.css
+++ b/style.css
@@ -331,6 +331,10 @@ a:hover {
content: "\f1c1";
}
+.pdf-link-icons .pdf-link:after {
+ display: none;
+}
+
.doc-link-icons .doc-link:before {
content: "\f1c2";
}
@@ -511,7 +515,7 @@ input:hover[type="button"],
input:hover[type="reset"],
input:hover[type="submit"],
body .button:hover,
-.genesis-nav-menu input[type="submit"] {
+ .genesis-nav-menu input[type="submit"] {
background-color: #f15123;
border-color: #f15123;
color: #fff;
From df581703f624d3fcb8fa709db33e86f82653c4b9 Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Sat, 10 Jan 2015 11:21:50 -0800
Subject: [PATCH 052/108] Switch to using $ instead of jQuery within functions
---
includes/js/theme-jquery.js | 78 ++++++++++++++++++-------------------
1 file changed, 38 insertions(+), 40 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 57cb300..784db77 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -7,81 +7,81 @@
*/
// Executes when the document is ready
-jQuery(document).ready(function() {
+jQuery(document).ready(function( $ ) {
// Get PHP vars passed via wp_localize_script()
trestleEqualColsBreakpoint = trestle_vars.trestle_equal_cols_breakpoint;
trestleEqualHeightCols = trestle_vars.trestle_equal_height_cols;
// Remove .no-jquery body class
- jQuery('body').removeClass('no-jquery');
+ $('body').removeClass('no-jquery');
// External Links
var h = window.location.host.toLowerCase();
- jQuery('[href^="http"]').not('[href*="' + h + '"]').addClass('external-link').attr("target", "_blank");
+ $('[href^="http"]').not('[href*="' + h + '"]').addClass('external-link').attr("target", "_blank");
// Add classes to different types of links
- jQuery('a[href^="mailto:"]').addClass('email-link');
- jQuery('a[href*=".pdf"]').attr({"target":"_blank"}).addClass('pdf-link');
- jQuery('a[href*=".doc"]').attr({"target":"_blank"}).addClass('doc-link');
- jQuery('a').has('img').addClass('image-link');
+ $('a[href^="mailto:"]').addClass('email-link');
+ $('a[href*=".pdf"]').attr({"target":"_blank"}).addClass('pdf-link');
+ $('a[href*=".doc"]').attr({"target":"_blank"}).addClass('doc-link');
+ $('a').has('img').addClass('image-link');
// Add classes to parts of lists
- jQuery('li:last-child').addClass('last');
- jQuery('li:first-child').addClass('first');
- jQuery('ul, ol').parent('li').addClass('parent');
+ $('li:last-child').addClass('last');
+ $('li:first-child').addClass('first');
+ $('ul, ol').parent('li').addClass('parent');
// Mobile header toggle buttons
- jQuery('.site-header .title-area').after('
');
- jQuery('.site-header .widget-area, .nav-primary').each(function(i) {
- var target = jQuery(this);
+ $('.site-header .title-area').after('
');
+ $('.site-header .widget-area, .nav-primary').each(function(i) {
+ var target = $(this);
var buttonClass = 'toggle-button';
// Add classes of target element
var targetClass = target.attr('class').split(/\s+/);
- jQuery.each(targetClass, function(index,value) {
+ $.each(targetClass, function(index,value) {
buttonClass += ' targets-' + value;
});
- if ( jQuery(this).is( 'nav' ) ) {
+ if ( $(this).is( 'nav' ) ) {
buttonClass += ' nav-toggle';
}
// Add toggle buttons to header
- jQuery('.toggle-buttons').prepend('Toggle ');
+ $('.toggle-buttons').prepend('Toggle ');
// Add target class to nav and widget areas
target.addClass('toggle-target-' + i );
});
// Toggle widget areas and primary nav
- jQuery('.site-header .toggle-button').click( function( event ) {
+ $('.site-header .toggle-button').click( function( event ) {
event.preventDefault();
- var button = jQuery(this);
- var target = jQuery( '.toggle-target-' + button.attr('id').match(/\d+/) );
+ var button = $(this);
+ var target = $( '.toggle-target-' + button.attr('id').match(/\d+/) );
// Toggle buttons
button.toggleClass('open');
- jQuery('.site-header .toggle-button').not(button).removeClass('open');
+ $('.site-header .toggle-button').not(button).removeClass('open');
// Toggle targets
target.toggleClass('open');
- jQuery('[class*="toggle-target"]').not(target).removeClass('open');
+ $('[class*="toggle-target"]').not(target).removeClass('open');
});
// Mobile navigation icons
var closedIcon = '+';
var openIcon = '-';
- jQuery('.nav-primary').find('.genesis-nav-menu .parent:not(.current-menu-item, .current_page_item, .current_page_parent, .current_page_ancestor) > a').after('' + closedIcon + ' ');
- jQuery('.nav-primary').find('.genesis-nav-menu .parent.current-menu-item > a, .genesis-nav-menu .parent.current_page_item > a, .genesis-nav-menu .parent.current_page_parent > a, .genesis-nav-menu .parent.current_page_ancestor > a').after('' + openIcon + ' ');
+ $('.nav-primary').find('.genesis-nav-menu .parent:not(.current-menu-item, .current_page_item, .current_page_parent, .current_page_ancestor) > a').after('' + closedIcon + ' ');
+ $('.nav-primary').find('.genesis-nav-menu .parent.current-menu-item > a, .genesis-nav-menu .parent.current_page_item > a, .genesis-nav-menu .parent.current_page_parent > a, .genesis-nav-menu .parent.current_page_ancestor > a').after('' + openIcon + ' ');
// Mobile navigation expand/contract functionality
- jQuery('.sub-icon').click(function(event) {
+ $('.sub-icon').click(function(event) {
event.preventDefault();
- var icon = jQuery(this);
+ var icon = $(this);
icon.next('ul').slideToggle().toggleClass('open');
if ( icon.text().indexOf( closedIcon ) !== -1 )
icon.text(openIcon);
@@ -89,16 +89,16 @@ jQuery(document).ready(function() {
icon.text(closedIcon);
});
- jQuery('.widget-area-toggle').click(function(event) {
+ $('.widget-area-toggle').click(function(event) {
event.preventDefault();
- var button = jQuery(this);
+ var button = $(this);
button.toggleClass('open');
button.next('.widget-area').slideToggle();
});
// Equal height homepage cols
- jQuery('.equal-height-genesis-extender-cols .ez-home-container-area').each(function() {
- jQuery(this).children('.widget-area').equalHeights(null,null,trestleEqualColsBreakpoint);
+ $('.equal-height-genesis-extender-cols .ez-home-container-area').each(function() {
+ $(this).children('.widget-area').equalHeights(null,null,trestleEqualColsBreakpoint);
});
@@ -106,13 +106,11 @@ jQuery(document).ready(function() {
// Executes when complete page is fully loaded, including all frames, objects, and images
-jQuery(window).load(function() {
+jQuery(window).load(function( $ ) {
});
-
-
/**
* Equal Heights Plugin
*
@@ -134,18 +132,18 @@ jQuery(window).load(function() {
* Example 4: jQuery(".cols").equalHeights(null, null,768); Only resize columns above 768px viewport
*
*/
- (function(jQuery) {
- jQuery.fn.equalHeights = function(minHeight, maxHeight, breakPoint) {
+ (function( $ ) {
+ $.fn.equalHeights = function(minHeight, maxHeight, breakPoint) {
var items = this;
breakPoint = breakPoint || 0;
// Bind functionality to appropriate events
- jQuery(window).on('load orientationchange resize equalheights', function() {
+ $(window).on('load orientationchange resize equalheights', function() {
tallest = (minHeight) ? minHeight : 0;
items.each(function() {
- jQuery(this).height('auto');
- if(jQuery(this).outerHeight() > tallest) {
- tallest = jQuery(this).outerHeight();
+ $(this).height('auto');
+ if($(this).outerHeight() > tallest) {
+ tallest = $(this).outerHeight();
}
});
@@ -163,10 +161,10 @@ jQuery(window).load(function() {
if((maxHeight) && tallest > maxHeight) tallest = maxHeight;
console.log(tallest);
return items.each(function() {
- jQuery(this).height(tallest);
+ $(this).height(tallest);
});
}
});
}
- })(jQuery);
\ No newline at end of file
+ })(jQuery);
From 9e2d7c3354eefb7ec79428b7e65ac0f92cc8fcff Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Tue, 13 Jan 2015 15:39:49 -0800
Subject: [PATCH 053/108] Switch fancybox plugin (suggested).
---
includes/admin/admin.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/includes/admin/admin.php b/includes/admin/admin.php
index cf09130..b6b7d14 100644
--- a/includes/admin/admin.php
+++ b/includes/admin/admin.php
@@ -374,8 +374,8 @@ function trestle_register_required_plugins() {
),
array(
- 'name' => 'FancyBox for WordPress',
- 'slug' => 'fancybox-for-wordpress',
+ 'name' => 'Easy Fancybox',
+ 'slug' => 'easy-fancybox',
'required' => false,
),
From 37144f5414ebc3a344d2da794a4dfa148e6ab54a Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Thu, 15 Jan 2015 11:47:48 -0800
Subject: [PATCH 054/108] Add spacing to match WP standards, comment out
logging, add $ to variable names for jQuery objects
---
includes/js/theme-jquery.js | 123 ++++++++++++++++++------------------
1 file changed, 63 insertions(+), 60 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 784db77..ef3bf8b 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -7,98 +7,101 @@
*/
// Executes when the document is ready
-jQuery(document).ready(function( $ ) {
+jQuery( document ).ready( function( $ ) {
// Get PHP vars passed via wp_localize_script()
trestleEqualColsBreakpoint = trestle_vars.trestle_equal_cols_breakpoint;
trestleEqualHeightCols = trestle_vars.trestle_equal_height_cols;
// Remove .no-jquery body class
- $('body').removeClass('no-jquery');
+ $( 'body' ).removeClass( 'no-jquery' );
// External Links
var h = window.location.host.toLowerCase();
- $('[href^="http"]').not('[href*="' + h + '"]').addClass('external-link').attr("target", "_blank");
+ $( '[href^="http"]' ).not( '[href*="' + h + '"]' ).addClass( 'external-link' ).attr( "target", "_blank" );
// Add classes to different types of links
- $('a[href^="mailto:"]').addClass('email-link');
- $('a[href*=".pdf"]').attr({"target":"_blank"}).addClass('pdf-link');
- $('a[href*=".doc"]').attr({"target":"_blank"}).addClass('doc-link');
- $('a').has('img').addClass('image-link');
+ $( 'a[href^="mailto:"]' ).addClass( 'email-link' );
+ $( 'a[href*=".pdf"]' ).attr({ "target":"_blank" }).addClass( 'pdf-link' );
+ $( 'a[href*=".doc"]' ).attr({ "target":"_blank" }).addClass( 'doc-link' );
+ $( 'a' ).has( 'img' ).addClass( 'image-link' );
// Add classes to parts of lists
- $('li:last-child').addClass('last');
- $('li:first-child').addClass('first');
- $('ul, ol').parent('li').addClass('parent');
+ $( 'li:last-child' ).addClass( 'last' );
+ $( 'li:first-child' ).addClass( 'first' );
+ $( 'ul, ol' ).parent( 'li' ).addClass( 'parent' );
// Mobile header toggle buttons
- $('.site-header .title-area').after('
');
- $('.site-header .widget-area, .nav-primary').each(function(i) {
- var target = $(this);
-
+ $( '.site-header .title-area' ).after( '
' );
+ $( '.site-header .widget-area, .nav-primary' ).each( function( i ) {
+ var $target = $( this );
var buttonClass = 'toggle-button';
// Add classes of target element
- var targetClass = target.attr('class').split(/\s+/);
- $.each(targetClass, function(index,value) {
+ var targetClass = $target.attr( 'class' ).split( /\s+/ );
+ $.each( targetClass, function( index, value ) {
buttonClass += ' targets-' + value;
});
- if ( $(this).is( 'nav' ) ) {
+ if ( $( this ).is( 'nav' ) ) {
buttonClass += ' nav-toggle';
}
// Add toggle buttons to header
- $('.toggle-buttons').prepend('Toggle ');
+ $( '.toggle-buttons' ).prepend( 'Toggle ' );
// Add target class to nav and widget areas
- target.addClass('toggle-target-' + i );
+ $target.addClass( 'toggle-target-' + i );
});
// Toggle widget areas and primary nav
- $('.site-header .toggle-button').click( function( event ) {
+ $( '.site-header .toggle-button' ).click( function( event ) {
event.preventDefault();
- var button = $(this);
- var target = $( '.toggle-target-' + button.attr('id').match(/\d+/) );
+ var $button = $( this );
+ var $target = $( '.toggle-target-' + button.attr( 'id' ).match( /\d+/ ) );
// Toggle buttons
- button.toggleClass('open');
- $('.site-header .toggle-button').not(button).removeClass('open');
+ $button.toggleClass( 'open' );
+ $( '.site-header .toggle-button' ).not( $button ).removeClass( 'open' );
// Toggle targets
- target.toggleClass('open');
- $('[class*="toggle-target"]').not(target).removeClass('open');
+ $target.toggleClass( 'open' );
+ $( '[class*="toggle-target"]' ).not( $target ).removeClass( 'open' );
});
// Mobile navigation icons
var closedIcon = '+';
var openIcon = '-';
- $('.nav-primary').find('.genesis-nav-menu .parent:not(.current-menu-item, .current_page_item, .current_page_parent, .current_page_ancestor) > a').after('' + closedIcon + ' ');
- $('.nav-primary').find('.genesis-nav-menu .parent.current-menu-item > a, .genesis-nav-menu .parent.current_page_item > a, .genesis-nav-menu .parent.current_page_parent > a, .genesis-nav-menu .parent.current_page_ancestor > a').after('' + openIcon + ' ');
+ $( '.nav-primary' )
+ .find( '.genesis-nav-menu .parent:not(.current-menu-item, .current_page_item, .current_page_parent, .current_page_ancestor) > a' )
+ .after( '' + closedIcon + ' ' );
+ $( '.nav-primary' )
+ .find( '.genesis-nav-menu .parent.current-menu-item > a, .genesis-nav-menu .parent.current_page_item > a, .genesis-nav-menu .parent.current_page_parent > a, .genesis-nav-menu .parent.current_page_ancestor > a' )
+ .after( '' + openIcon + ' ' );
// Mobile navigation expand/contract functionality
- $('.sub-icon').click(function(event) {
+ $( '.sub-icon' ).click( function( event ) {
event.preventDefault();
- var icon = $(this);
- icon.next('ul').slideToggle().toggleClass('open');
- if ( icon.text().indexOf( closedIcon ) !== -1 )
- icon.text(openIcon);
- else if ( icon.text().indexOf( openIcon ) !== -1 )
- icon.text(closedIcon);
+ var $icon = $( this );
+ $icon.next( 'ul' ).slideToggle().toggleClass( 'open' );
+ if ( $icon.text().indexOf( closedIcon ) !== -1 )
+ $icon.text( openIcon );
+ else if ( $icon.text().indexOf( openIcon ) !== -1 )
+ $icon.text( closedIcon );
});
- $('.widget-area-toggle').click(function(event) {
+ $( '.widget-area-toggle' ).click( function( event ) {
event.preventDefault();
- var button = $(this);
- button.toggleClass('open');
- button.next('.widget-area').slideToggle();
+ var $button = $( this );
+ $button.toggleClass( 'open' );
+ $button.next( '.widget-area' ).slideToggle();
});
// Equal height homepage cols
- $('.equal-height-genesis-extender-cols .ez-home-container-area').each(function() {
- $(this).children('.widget-area').equalHeights(null,null,trestleEqualColsBreakpoint);
+ $( '.equal-height-genesis-extender-cols .ez-home-container-area' ).each( function() {
+ $( this ).children( '.widget-area' ).equalHeights( null, null, trestleEqualColsBreakpoint );
});
@@ -106,7 +109,7 @@ jQuery(document).ready(function( $ ) {
// Executes when complete page is fully loaded, including all frames, objects, and images
-jQuery(window).load(function( $ ) {
+jQuery( window ).load( function( $ ) {
});
@@ -125,32 +128,32 @@ jQuery(window).load(function( $ ) {
*
* Usage: jQuery(object).equalHeights([minHeight], [maxHeight], [breakPoint]);
*
- * Example 1: jQuery(".cols").equalHeights(); Sets all columns to the same height.
- * Example 2: jQuery(".cols").equalHeights(400); Sets all cols to at least 400px tall.
- * Example 3: jQuery(".cols").equalHeights(100,300); Cols are at least 100 but no more
+ * Example 1: jQuery( ".cols" ).equalHeights(); Sets all columns to the same height.
+ * Example 2: jQuery( ".cols" ).equalHeights( 400 ); Sets all cols to at least 400px tall.
+ * Example 3: jQuery( ".cols" ).equalHeights( 100, 300 ); Cols are at least 100 but no more
* than 300 pixels tall. Elements with too much content will gain a scrollbar.
- * Example 4: jQuery(".cols").equalHeights(null, null,768); Only resize columns above 768px viewport
+ * Example 4: jQuery( ".cols" ).equalHeights( null, null,768 ); Only resize columns above 768px viewport
*
*/
- (function( $ ) {
- $.fn.equalHeights = function(minHeight, maxHeight, breakPoint) {
- var items = this;
+ ( function( $ ) {
+ $.fn.equalHeights = function( minHeight, maxHeight, breakPoint ) {
+ var $items = this;
breakPoint = breakPoint || 0;
// Bind functionality to appropriate events
- $(window).on('load orientationchange resize equalheights', function() {
- tallest = (minHeight) ? minHeight : 0;
- items.each(function() {
- $(this).height('auto');
- if($(this).outerHeight() > tallest) {
- tallest = $(this).outerHeight();
+ $( window ).on( 'load orientationchange resize equalheights', function() {
+ tallest = ( minHeight ) ? minHeight : 0;
+ $items.each( function() {
+ $( this ).height( 'auto' );
+ if( $( this ).outerHeight() > tallest ) {
+ tallest = $( this ).outerHeight();
}
});
// Get viewport width (taking scrollbars into account)
var e = window;
a = 'inner';
- if (!('innerWidth' in window )) {
+ if ( !( 'innerWidth' in window ) ) {
a = 'client';
e = document.documentElement || document.body;
}
@@ -158,10 +161,10 @@ jQuery(window).load(function( $ ) {
// Equalize column heights if above the specified breakpoint
if ( width >= breakPoint ) {
- if((maxHeight) && tallest > maxHeight) tallest = maxHeight;
- console.log(tallest);
- return items.each(function() {
- $(this).height(tallest);
+ if( ( maxHeight ) && tallest > maxHeight ) tallest = maxHeight;
+ //console.log( tallest );
+ return items.each( function() {
+ $( this ).height( tallest );
});
}
});
From 3327b1518cabe1d475970928e049b16d6fd3ef4b Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Thu, 15 Jan 2015 17:27:39 -0800
Subject: [PATCH 055/108] Fix $button selector
---
includes/js/theme-jquery.js | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index ef3bf8b..2063e31 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -15,7 +15,7 @@ jQuery( document ).ready( function( $ ) {
// Remove .no-jquery body class
$( 'body' ).removeClass( 'no-jquery' );
-
+
// External Links
var h = window.location.host.toLowerCase();
$( '[href^="http"]' ).not( '[href*="' + h + '"]' ).addClass( 'external-link' ).attr( "target", "_blank" );
@@ -42,7 +42,7 @@ jQuery( document ).ready( function( $ ) {
$.each( targetClass, function( index, value ) {
buttonClass += ' targets-' + value;
});
-
+
if ( $( this ).is( 'nav' ) ) {
buttonClass += ' nav-toggle';
}
@@ -53,13 +53,13 @@ jQuery( document ).ready( function( $ ) {
// Add target class to nav and widget areas
$target.addClass( 'toggle-target-' + i );
});
-
+
// Toggle widget areas and primary nav
$( '.site-header .toggle-button' ).click( function( event ) {
event.preventDefault();
var $button = $( this );
- var $target = $( '.toggle-target-' + button.attr( 'id' ).match( /\d+/ ) );
+ var $target = $( '.toggle-target-' + $button.attr( 'id' ).match( /\d+/ ) );
// Toggle buttons
$button.toggleClass( 'open' );
@@ -80,7 +80,7 @@ jQuery( document ).ready( function( $ ) {
$( '.nav-primary' )
.find( '.genesis-nav-menu .parent.current-menu-item > a, .genesis-nav-menu .parent.current_page_item > a, .genesis-nav-menu .parent.current_page_parent > a, .genesis-nav-menu .parent.current_page_ancestor > a' )
.after( '' + openIcon + ' ' );
-
+
// Mobile navigation expand/contract functionality
$( '.sub-icon' ).click( function( event ) {
event.preventDefault();
@@ -91,7 +91,7 @@ jQuery( document ).ready( function( $ ) {
else if ( $icon.text().indexOf( openIcon ) !== -1 )
$icon.text( closedIcon );
});
-
+
$( '.widget-area-toggle' ).click( function( event ) {
event.preventDefault();
var $button = $( this );
@@ -104,7 +104,7 @@ jQuery( document ).ready( function( $ ) {
$( this ).children( '.widget-area' ).equalHeights( null, null, trestleEqualColsBreakpoint );
});
-
+
}); /* end of as page load scripts */
@@ -116,7 +116,7 @@ jQuery( window ).load( function( $ ) {
/**
* Equal Heights Plugin
- *
+ *
* Equalize the heights of elements. Great for columns or any elements
* that need to be the same size (floats, etc).
*
@@ -127,13 +127,13 @@ jQuery( window ).load( function( $ ) {
* - binds the script to run on load, orientation change (for mobile), and when resizing the window
*
* Usage: jQuery(object).equalHeights([minHeight], [maxHeight], [breakPoint]);
- *
+ *
* Example 1: jQuery( ".cols" ).equalHeights(); Sets all columns to the same height.
* Example 2: jQuery( ".cols" ).equalHeights( 400 ); Sets all cols to at least 400px tall.
* Example 3: jQuery( ".cols" ).equalHeights( 100, 300 ); Cols are at least 100 but no more
* than 300 pixels tall. Elements with too much content will gain a scrollbar.
* Example 4: jQuery( ".cols" ).equalHeights( null, null,768 ); Only resize columns above 768px viewport
- *
+ *
*/
( function( $ ) {
$.fn.equalHeights = function( minHeight, maxHeight, breakPoint ) {
From 0ef64a39a288f37636a30d1e4cab69a15e606079 Mon Sep 17 00:00:00 2001
From: Mickey Kay
Date: Fri, 16 Jan 2015 09:48:17 -0800
Subject: [PATCH 056/108] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 7cf55d6..aa65e6e 100644
--- a/README.md
+++ b/README.md
@@ -40,6 +40,7 @@ Here are some of Trestle's many features, check out the [Trestle Demo](http://de
* Switch to customizer for theme options instead of Genesis panel (pros? cons?)
* Remove custom background CSS that doesn't make sense (different max-widths, etc)
* Weird extra icons on accordions on demo site.
+* Add checkbox to control author box (along with post info/meta) output (see ES: esw-custom.php)
* Mobile menu button setting - either:
* Remove (currently controlled from JS), or
* Pass icon/text as params to jQuery
From 41494c53ae85bc5f3ba456e73ace8edaab266815 Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Fri, 16 Jan 2015 13:48:16 -0800
Subject: [PATCH 057/108] Improvements to the equalHeights plugin, relocation
of load scripts, various fixes
---
includes/js/theme-jquery.js | 105 +++++++++++++++++++++---------------
1 file changed, 63 insertions(+), 42 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 2063e31..d825bf3 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -99,19 +99,17 @@ jQuery( document ).ready( function( $ ) {
$button.next( '.widget-area' ).slideToggle();
});
- // Equal height homepage cols
- $( '.equal-height-genesis-extender-cols .ez-home-container-area' ).each( function() {
- $( this ).children( '.widget-area' ).equalHeights( null, null, trestleEqualColsBreakpoint );
- });
+ // Executes when complete page is fully loaded, including all frames, objects, and images
+ $( window ).on( 'load', function() {
+ // Equal height homepage cols
+ $( '.equal-height-genesis-extender-cols .ez-home-container-area' ).each( function() {
+ $( this ).children( '.widget-area' ).equalHeights( null, null, trestleEqualColsBreakpoint );
+ });
-}); /* end of as page load scripts */
+ });
-
-// Executes when complete page is fully loaded, including all frames, objects, and images
-jQuery( window ).load( function( $ ) {
-
-});
+}); /* end of page load scripts */
/**
@@ -135,39 +133,62 @@ jQuery( window ).load( function( $ ) {
* Example 4: jQuery( ".cols" ).equalHeights( null, null,768 ); Only resize columns above 768px viewport
*
*/
- ( function( $ ) {
- $.fn.equalHeights = function( minHeight, maxHeight, breakPoint ) {
- var $items = this;
- breakPoint = breakPoint || 0;
+( function( $ ) {
- // Bind functionality to appropriate events
- $( window ).on( 'load orientationchange resize equalheights', function() {
- tallest = ( minHeight ) ? minHeight : 0;
- $items.each( function() {
- $( this ).height( 'auto' );
- if( $( this ).outerHeight() > tallest ) {
- tallest = $( this ).outerHeight();
- }
- });
+ $.fn.equalHeights = function( minHeight, maxHeight, breakPoint ) {
- // Get viewport width (taking scrollbars into account)
- var e = window;
- a = 'inner';
- if ( !( 'innerWidth' in window ) ) {
- a = 'client';
- e = document.documentElement || document.body;
- }
- width = e[ a+'Width' ];
+ /**
+ * Unbind all plugin events so that we can call this function again
+ * to reset it without creating multiple handlers for the same events.
+ * This allows us to manually retrigger if we have added new elements
+ * into the DOM using ajax or .clone().
+ */
+ $( window ).off( '.equalheights', equalHeightsInit );
- // Equalize column heights if above the specified breakpoint
- if ( width >= breakPoint ) {
- if( ( maxHeight ) && tallest > maxHeight ) tallest = maxHeight;
- //console.log( tallest );
- return items.each( function() {
- $( this ).height( tallest );
- });
- }
- });
- }
+ // Scope our local variables
+ var $items, breakPoint;
- })(jQuery);
+ // Store the jQuery objects upon which this function has been called
+ $items = this;
+
+ // Store the breakPoint arg if it was passsed in
+ breakPoint = breakPoint || 0;
+
+ // Actual logic for this plugin
+ var equalHeightsInit = function() {
+
+ // Calculate the tallest
+ tallest = ( minHeight ) ? minHeight : 0;
+ $items.each( function() {
+ $( this ).height( 'auto' );
+ if( $( this ).outerHeight() > tallest ) {
+ tallest = $( this ).outerHeight();
+ }
+ });
+
+ // Get viewport width (taking scrollbars into account)
+ var e = window;
+ a = 'inner';
+ if ( !( 'innerWidth' in window ) ) {
+ a = 'client';
+ e = document.documentElement || document.body;
+ }
+ width = e[ a+'Width' ];
+
+ // Equalize heights if viewport width is above the specified breakpoint
+ if ( width >= breakPoint ) {
+ if( ( maxHeight ) && tallest > maxHeight ) tallest = maxHeight;
+ return $items.each( function() {
+ $( this ).height( tallest );
+ });
+ }
+ }
+
+ // Trigger the main plugin function
+ equalHeightsInit();
+
+ // Bind appropriate events for the first time this plugin is run
+ $( window ).on( 'orientationchange.equalheights resize.equalheights equalheights.equalheights', equalHeightsInit );
+ }
+
+})( jQuery );
From 38b1f84f633326d2b15b28b1eb74020ea6bc16bf Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Wed, 21 Jan 2015 10:24:01 -0800
Subject: [PATCH 058/108] Add favicon theme option.
---
includes/admin/admin.php | 9 ++++++++-
includes/functions/theme-functions.php | 21 ++++++++++++++++++---
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/includes/admin/admin.php b/includes/admin/admin.php
index b6b7d14..0dee9e2 100644
--- a/includes/admin/admin.php
+++ b/includes/admin/admin.php
@@ -39,6 +39,7 @@ function trestle_custom_defaults( $defaults ) {
'trestle_layout' => 'solid',
'trestle_logo_url' => '',
'trestle_logo_url_mobile' => '',
+ 'trestle_favicon_url' => '',
'trestle_nav_primary_location' => 'full',
'trestle_auto_nav' => 0,
'trestle_auto_nav_depth' => 0,
@@ -123,6 +124,7 @@ function trestle_register_social_sanitization_filters() {
array(
'trestle_logo_url',
'trestle_logo_url_mobile',
+ 'trestle_favicon_url',
'trestle_home_link_text',
'trestle_nav_button_text',
'trestle_custom_nav_extras_text',
@@ -167,7 +169,7 @@ function trestle_settings_box() {
/>
-
+
@@ -176,6 +178,11 @@ function trestle_settings_box() {
+
+
+
+ /wp-content/themes/trestle/images/favicon.ico
if not specified.', 'trestle' ); ?>
+
diff --git a/includes/functions/theme-functions.php b/includes/functions/theme-functions.php
index ea71f76..5f4ddfd 100644
--- a/includes/functions/theme-functions.php
+++ b/includes/functions/theme-functions.php
@@ -10,7 +10,7 @@
*/
/*===========================================
- * Head Styles & Scripts
+ * Header
===========================================*/
add_action( 'wp_enqueue_scripts', 'trestle_header_actions' );
@@ -50,6 +50,20 @@ function trestle_header_actions() {
}
+add_filter( 'genesis_pre_load_favicon', 'trestle_do_custom_favicon' );
+/**
+ * Output custom favicon if specified in the theme options.
+ *
+ * @since 1.0.0
+ *
+ * @param string $favicon_url Default favicon URL.
+ *
+ * @return string Custom favicon URL (if specified), or the default URL.
+ */
+function trestle_do_custom_favicon( $favicon_url ) {
+ return genesis_get_option( 'trestle_favicon_url' ) ? genesis_get_option( 'trestle_favicon_url' ) : $favicon_url;
+}
+
/*===========================================
* Body Classes
===========================================*/
@@ -420,8 +434,9 @@ function trestle_read_more_link( $default_text ) {
// Get Trestle custom "read more" link text
$custom_text = esc_attr( genesis_get_option( 'trestle_read_more_text' ) );
- if ( $custom_text )
+ if ( $custom_text ) {
return '… ' . $custom_text . ' ';
- else
+ } else {
return $default_text;
+ }
}
From f9b299eb87489a969910fa40cbfe204c382b92b9 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Wed, 21 Jan 2015 12:10:20 -0800
Subject: [PATCH 059/108] Improve jQuery to automatically remove focus (dotted
line) on events with e.preventDefault.
---
includes/js/theme-jquery.js | 32 ++++++++++++++++++++++++++++----
style.css | 1 -
2 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 784db77..71ff524 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -57,9 +57,16 @@ jQuery(document).ready(function( $ ) {
// Toggle widget areas and primary nav
$('.site-header .toggle-button').click( function( event ) {
- event.preventDefault();
+
+ // Prevent default behavior
+ event.preventDefault();
+ // Get toggle button that was clicked
var button = $(this);
+
+ // Remove focus
+ button.blur();
+
var target = $( '.toggle-target-' + button.attr('id').match(/\d+/) );
// Toggle buttons
@@ -69,6 +76,7 @@ jQuery(document).ready(function( $ ) {
// Toggle targets
target.toggleClass('open');
$('[class*="toggle-target"]').not(target).removeClass('open');
+
});
// Mobile navigation icons
@@ -80,8 +88,16 @@ jQuery(document).ready(function( $ ) {
// Mobile navigation expand/contract functionality
$('.sub-icon').click(function(event) {
- event.preventDefault();
- var icon = $(this);
+
+ // Prevent default behavior
+ event.preventDefault();
+
+ // Get icon clicked
+ var icon = $(this);
+
+ // Remove focus
+ icon.blur();
+
icon.next('ul').slideToggle().toggleClass('open');
if ( icon.text().indexOf( closedIcon ) !== -1 )
icon.text(openIcon);
@@ -90,8 +106,16 @@ jQuery(document).ready(function( $ ) {
});
$('.widget-area-toggle').click(function(event) {
- event.preventDefault();
+
+ // Prevent default behavior
+ event.preventDefault();
+
+ // Get button clicked
var button = $(this);
+
+ // Remove focus
+ button.blur();
+
button.toggleClass('open');
button.next('.widget-area').slideToggle();
});
diff --git a/style.css b/style.css
index 144a514..685abf3 100644
--- a/style.css
+++ b/style.css
@@ -1383,7 +1383,6 @@ Site Header
.site-header .toggle-button {
margin-left: 15px;
- outline: none;
}
.site-header .toggle-button.open {
From b0fa089bd035e39abd887507aa76f2f05de445d8 Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Fri, 23 Jan 2015 16:46:53 -0800
Subject: [PATCH 060/108] Improvements to the equalHeights plugin
Now we're using $.proxy() to keep the context correct when executing the event handlers
---
includes/js/theme-jquery.js | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index d825bf3..057fe74 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -143,7 +143,7 @@ jQuery( document ).ready( function( $ ) {
* This allows us to manually retrigger if we have added new elements
* into the DOM using ajax or .clone().
*/
- $( window ).off( '.equalheights', equalHeightsInit );
+ $( window ).off( '.equalheights', doEqualHeights );
// Scope our local variables
var $items, breakPoint;
@@ -155,7 +155,7 @@ jQuery( document ).ready( function( $ ) {
breakPoint = breakPoint || 0;
// Actual logic for this plugin
- var equalHeightsInit = function() {
+ function doEqualHeights( $items ) {
// Calculate the tallest
tallest = ( minHeight ) ? minHeight : 0;
@@ -185,10 +185,12 @@ jQuery( document ).ready( function( $ ) {
}
// Trigger the main plugin function
- equalHeightsInit();
+ doEqualHeights( $items );
+
+ // Attach doEqualHeights as an event handler to the window resize events
+ // We're using $.proxy() to pass in the right $items to keep our context correct
+ $( window ).on( 'orientationchange.equalheights resize.equalheights equalheights.equalheights', $.proxy( doEqualHeights, null, $items ) );
- // Bind appropriate events for the first time this plugin is run
- $( window ).on( 'orientationchange.equalheights resize.equalheights equalheights.equalheights', equalHeightsInit );
}
})( jQuery );
From c6a8b0726dfa2285e7068ddd1c5be82bdebbd42f Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Fri, 23 Jan 2015 16:48:17 -0800
Subject: [PATCH 061/108] Update the inline documentation for equalHeights
---
includes/js/theme-jquery.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 057fe74..feae7ec 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -118,11 +118,14 @@ jQuery( document ).ready( function( $ ) {
* Equalize the heights of elements. Great for columns or any elements
* that need to be the same size (floats, etc).
*
+ * Must be first triggered on either ready (if only text) or load (if images are included)
+ *
* Based on Rob Glazebrook's (cssnewbie.com) script
*
* Additions
* - ability to include a break point (the minimum viewport width at which the script does anything)
- * - binds the script to run on load, orientation change (for mobile), and when resizing the window
+ * - binds to window resize events (resize and orientationchange), unbinds and rebinds if called again
+ * - can be called multiple times to reset or handle DOM changes via ajax or .clone()
*
* Usage: jQuery(object).equalHeights([minHeight], [maxHeight], [breakPoint]);
*
@@ -190,7 +193,6 @@ jQuery( document ).ready( function( $ ) {
// Attach doEqualHeights as an event handler to the window resize events
// We're using $.proxy() to pass in the right $items to keep our context correct
$( window ).on( 'orientationchange.equalheights resize.equalheights equalheights.equalheights', $.proxy( doEqualHeights, null, $items ) );
-
}
})( jQuery );
From 10b473d97e321a3015a7d41e5f6e5107e9f5bba0 Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Fri, 23 Jan 2015 20:54:08 -0800
Subject: [PATCH 062/108] Improve jQuery to automatically remove focus (dotted
line) on events with e.preventDefault
Also simplifying the equalHeights inline docs
---
includes/js/theme-jquery.js | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index feae7ec..a9a8199 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -56,9 +56,16 @@ jQuery( document ).ready( function( $ ) {
// Toggle widget areas and primary nav
$( '.site-header .toggle-button' ).click( function( event ) {
+
+ // Prevent default behavior
event.preventDefault();
+ // Get toggle button that was clicked
var $button = $( this );
+
+ //Remove focus
+ $button.blur();
+
var $target = $( '.toggle-target-' + $button.attr( 'id' ).match( /\d+/ ) );
// Toggle buttons
@@ -68,6 +75,7 @@ jQuery( document ).ready( function( $ ) {
// Toggle targets
$target.toggleClass( 'open' );
$( '[class*="toggle-target"]' ).not( $target ).removeClass( 'open' );
+
});
// Mobile navigation icons
@@ -83,8 +91,16 @@ jQuery( document ).ready( function( $ ) {
// Mobile navigation expand/contract functionality
$( '.sub-icon' ).click( function( event ) {
+
+ // Prevent default behavior
event.preventDefault();
+
+ // Get icon click
var $icon = $( this );
+
+ // Remove focus
+ $icon.blur();
+
$icon.next( 'ul' ).slideToggle().toggleClass( 'open' );
if ( $icon.text().indexOf( closedIcon ) !== -1 )
$icon.text( openIcon );
@@ -93,8 +109,16 @@ jQuery( document ).ready( function( $ ) {
});
$( '.widget-area-toggle' ).click( function( event ) {
+
+ // Prevent default behavior
event.preventDefault();
+
+ // Get button clicked
var $button = $( this );
+
+ // Remove focus
+ $button.blur();
+
$button.toggleClass( 'open' );
$button.next( '.widget-area' ).slideToggle();
});
@@ -118,14 +142,12 @@ jQuery( document ).ready( function( $ ) {
* Equalize the heights of elements. Great for columns or any elements
* that need to be the same size (floats, etc).
*
- * Must be first triggered on either ready (if only text) or load (if images are included)
- *
* Based on Rob Glazebrook's (cssnewbie.com) script
*
* Additions
* - ability to include a break point (the minimum viewport width at which the script does anything)
* - binds to window resize events (resize and orientationchange), unbinds and rebinds if called again
- * - can be called multiple times to reset or handle DOM changes via ajax or .clone()
+ * - can be called multiple times to handle DOM changes via ajax or .clone()
*
* Usage: jQuery(object).equalHeights([minHeight], [maxHeight], [breakPoint]);
*
From e9afb553708eabf1a5a1bc201d3a3adcc3b97d3f Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Fri, 23 Jan 2015 22:20:01 -0800
Subject: [PATCH 063/108] Formatting, first-pass at documenting every block
---
includes/js/theme-jquery.js | 82 ++++++++++++++++++++++---------------
1 file changed, 48 insertions(+), 34 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index a9a8199..8b78df1 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -34,21 +34,29 @@ jQuery( document ).ready( function( $ ) {
// Mobile header toggle buttons
$( '.site-header .title-area' ).after( '
' );
$( '.site-header .widget-area, .nav-primary' ).each( function( i ) {
- var $target = $( this );
- var buttonClass = 'toggle-button';
- // Add classes of target element
- var targetClass = $target.attr( 'class' ).split( /\s+/ );
+ // Store target
+ $target = $( this );
+
+ // Scope variables
+ var $target, buttonClass, targetClass;
+
+ // Setup classes
+ buttonClass = 'toggle-button';
+ targetClass = $target.attr( 'class' ).split( /\s+/ );
+
+ // Add targets-[] class to buttonClass
$.each( targetClass, function( index, value ) {
buttonClass += ' targets-' + value;
});
- if ( $( this ).is( 'nav' ) ) {
+ // Add nav-toggle class to buttonClass if the button is for the nav
+ if ( $target.is( 'nav' ) ) {
buttonClass += ' nav-toggle';
}
// Add toggle buttons to header
- $( '.toggle-buttons' ).prepend( 'Toggle ' );
+ $( '.toggle-buttons' ).prepend( 'Toggle ');
// Add target class to nav and widget areas
$target.addClass( 'toggle-target-' + i );
@@ -57,16 +65,20 @@ jQuery( document ).ready( function( $ ) {
// Toggle widget areas and primary nav
$( '.site-header .toggle-button' ).click( function( event ) {
- // Prevent default behavior
+ // Prevent default behavior
event.preventDefault();
- // Get toggle button that was clicked
- var $button = $( this );
-
+ // Scope our variables
+ var $button, $target;
+
+ // Get toggle button that was clicked
+ $button = $( this );
+
//Remove focus
$button.blur();
-
- var $target = $( '.toggle-target-' + $button.attr( 'id' ).match( /\d+/ ) );
+
+ // Match the button to the right target
+ $target = $( '.toggle-target-' + $button.attr( 'id' ).match( /\d+/ ) );
// Toggle buttons
$button.toggleClass( 'open' );
@@ -75,52 +87,52 @@ jQuery( document ).ready( function( $ ) {
// Toggle targets
$target.toggleClass( 'open' );
$( '[class*="toggle-target"]' ).not( $target ).removeClass( 'open' );
-
});
// Mobile navigation icons
var closedIcon = '+';
var openIcon = '-';
- $( '.nav-primary' )
- .find( '.genesis-nav-menu .parent:not(.current-menu-item, .current_page_item, .current_page_parent, .current_page_ancestor) > a' )
- .after( '' + closedIcon + ' ' );
- $( '.nav-primary' )
- .find( '.genesis-nav-menu .parent.current-menu-item > a, .genesis-nav-menu .parent.current_page_item > a, .genesis-nav-menu .parent.current_page_parent > a, .genesis-nav-menu .parent.current_page_ancestor > a' )
- .after( '' + openIcon + ' ' );
+ // Insert the icons into the nav where appropriate
+ $( '.nav-primary' ).find( '.genesis-nav-menu .parent:not( .current-menu-item, .current_page_item, .current_page_parent, .current_page_ancestor) > a' ).after( '' + closedIcon + ' ' );
+ $( '.nav-primary' ).find( '.genesis-nav-menu .parent.current-menu-item > a, .genesis-nav-menu .parent.current_page_item > a, .genesis-nav-menu .parent.current_page_parent > a, .genesis-nav-menu .parent.current_page_ancestor > a' ).after( '' + openIcon + ' ' );
// Mobile navigation expand/contract functionality
$( '.sub-icon' ).click( function( event ) {
-
+
// Prevent default behavior
event.preventDefault();
-
+
// Get icon click
var $icon = $( this );
-
+
// Remove focus
$icon.blur();
-
+
+ // Expand/contract
$icon.next( 'ul' ).slideToggle().toggleClass( 'open' );
- if ( $icon.text().indexOf( closedIcon ) !== -1 )
+
+ // Change the icon to indicate open/closed
+ if ( $icon.text().indexOf( closedIcon ) !== -1 )
$icon.text( openIcon );
else if ( $icon.text().indexOf( openIcon ) !== -1 )
$icon.text( closedIcon );
});
+ // Header widget area expand/contract functionality
$( '.widget-area-toggle' ).click( function( event ) {
-
+
// Prevent default behavior
event.preventDefault();
-
+
// Get button clicked
var $button = $( this );
-
+
// Remove focus
$button.blur();
-
- $button.toggleClass( 'open' );
- $button.next( '.widget-area' ).slideToggle();
+
+ // Expand/contract
+ $button.toggleClass( 'open' ).next( '.widget-area' ).slideToggle();
});
// Executes when complete page is fully loaded, including all frames, objects, and images
@@ -179,7 +191,7 @@ jQuery( document ).ready( function( $ ) {
// Store the breakPoint arg if it was passsed in
breakPoint = breakPoint || 0;
- // Actual logic for this plugin
+ // Equalize the heights
function doEqualHeights( $items ) {
// Calculate the tallest
@@ -209,12 +221,14 @@ jQuery( document ).ready( function( $ ) {
}
}
- // Trigger the main plugin function
+ // Start the equalizing
doEqualHeights( $items );
// Attach doEqualHeights as an event handler to the window resize events
- // We're using $.proxy() to pass in the right $items to keep our context correct
- $( window ).on( 'orientationchange.equalheights resize.equalheights equalheights.equalheights', $.proxy( doEqualHeights, null, $items ) );
+ // Use $.proxy() to pass in the right $items to keep the context correct
+ // when dealing with more than one collection of $items
+ $( window ).on( 'orientationchange.equalheights resize.equalheights equalheights.equalheights',
+ $.proxy( doEqualHeights, null, $items ) );
}
})( jQuery );
From 8c3122e90b41a9546c2ecb5192c831a1fe3c2ef4 Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Fri, 23 Jan 2015 22:28:08 -0800
Subject: [PATCH 064/108] Whitespace
---
includes/js/theme-jquery.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index 8b78df1..df586c2 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -56,7 +56,7 @@ jQuery( document ).ready( function( $ ) {
}
// Add toggle buttons to header
- $( '.toggle-buttons' ).prepend( 'Toggle ');
+ $( '.toggle-buttons' ).prepend( 'Toggle ' );
// Add target class to nav and widget areas
$target.addClass( 'toggle-target-' + i );
From e978081319ccfeae00ea3fd266a66dbf788acefe Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Thu, 29 Jan 2015 15:36:31 -0800
Subject: [PATCH 065/108] * Add SSN style for Custom Post Type Parents plugin.
* Remove general input/button 100% width for sidebar.
---
style.css | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/style.css b/style.css
index 685abf3..a3ab71a 100644
--- a/style.css
+++ b/style.css
@@ -537,11 +537,6 @@ body .button:hover,
/* Sidebar Forms, Buttons, & Inputs */
-.sidebar input,
-.sidebar select,
-.sidebar textarea,
-.sidebar button,
-.sidebar .button,
.sidebar #subscribe-email input, /* Begin Jetpack - Blog Subscription */
.sidebar div.gform_wrapper input[type="email"], /* Begin Gravity Forms */
.sidebar div.gform_wrapper input[type="text"],
@@ -555,11 +550,6 @@ body .button:hover,
padding: 0.5em;
}
-.sidebar input[type="radio"],
-.sidebar input[type="checkbox"] {
- width: auto !important;
-}
-
.sidebar input[type="file"] {
padding: 0;
}
@@ -1172,7 +1162,8 @@ body .mapp-layout {
}
-.simple-section-nav .current_page_item > a {
+.simple-section-nav .current_page_item > a,
+.simple-section-nav .custom-custom-post-type-parent > a {
font-weight: bold;
}
From da54115ae5e8bad63acb4ce1573a0ee93bc5e9db Mon Sep 17 00:00:00 2001
From: Braad Martin
Date: Fri, 30 Jan 2015 00:29:06 -0800
Subject: [PATCH 066/108] Big improvements to the equalHeights plugin
Also more specific selectors for the link classes
---
includes/js/theme-jquery.js | 115 +++++++++++++++++++++++++-----------
1 file changed, 80 insertions(+), 35 deletions(-)
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
index df586c2..d33dd9e 100644
--- a/includes/js/theme-jquery.js
+++ b/includes/js/theme-jquery.js
@@ -22,8 +22,8 @@ jQuery( document ).ready( function( $ ) {
// Add classes to different types of links
$( 'a[href^="mailto:"]' ).addClass( 'email-link' );
- $( 'a[href*=".pdf"]' ).attr({ "target":"_blank" }).addClass( 'pdf-link' );
- $( 'a[href*=".doc"]' ).attr({ "target":"_blank" }).addClass( 'doc-link' );
+ $( 'a[href$=".pdf"]' ).attr({ "target":"_blank" }).addClass( 'pdf-link' );
+ $( 'a[href$=".doc"]' ).attr({ "target":"_blank" }).addClass( 'doc-link' );
$( 'a' ).has( 'img' ).addClass( 'image-link' );
// Add classes to parts of lists
@@ -86,7 +86,7 @@ jQuery( document ).ready( function( $ ) {
// Toggle targets
$target.toggleClass( 'open' );
- $( '[class*="toggle-target"]' ).not( $target ).removeClass( 'open' );
+ $( '[class^="toggle-target"]' ).not( $target ).removeClass( 'open' );
});
// Mobile navigation icons
@@ -147,7 +147,6 @@ jQuery( document ).ready( function( $ ) {
}); /* end of page load scripts */
-
/**
* Equal Heights Plugin
*
@@ -156,45 +155,66 @@ jQuery( document ).ready( function( $ ) {
*
* Based on Rob Glazebrook's (cssnewbie.com) script
*
- * Additions
+ * Features
* - ability to include a break point (the minimum viewport width at which the script does anything)
- * - binds to window resize events (resize and orientationchange), unbinds and rebinds if called again
- * - can be called multiple times to handle DOM changes via ajax or .clone()
+ * - binds to window resize events (resize and orientationchange)
+ * - will automatically detect new elements added to the DOM
+ * - can be called multiple times without duplicating any events
*
- * Usage: jQuery(object).equalHeights([minHeight], [maxHeight], [breakPoint]);
+ * Usage: jQuery( object ).equalHeights( [minHeight], [maxHeight], [breakPoint] );
*
* Example 1: jQuery( ".cols" ).equalHeights(); Sets all columns to the same height.
* Example 2: jQuery( ".cols" ).equalHeights( 400 ); Sets all cols to at least 400px tall.
* Example 3: jQuery( ".cols" ).equalHeights( 100, 300 ); Cols are at least 100 but no more
* than 300 pixels tall. Elements with too much content will gain a scrollbar.
- * Example 4: jQuery( ".cols" ).equalHeights( null, null,768 ); Only resize columns above 768px viewport
- *
+ * Example 4: jQuery( ".cols" ).equalHeights( null, null, 768 ); Only resize columns above 768px viewport
*/
( function( $ ) {
$.fn.equalHeights = function( minHeight, maxHeight, breakPoint ) {
- /**
- * Unbind all plugin events so that we can call this function again
- * to reset it without creating multiple handlers for the same events.
- * This allows us to manually retrigger if we have added new elements
- * into the DOM using ajax or .clone().
- */
- $( window ).off( '.equalheights', doEqualHeights );
+ // Scope our variables
+ var selector, args, eventData, resizeSet;
- // Scope our local variables
- var $items, breakPoint;
+ // Get the selector used to call equalHeights
+ selector = this.selector;
- // Store the jQuery objects upon which this function has been called
- $items = this;
-
- // Store the breakPoint arg if it was passsed in
+ // Use the args that were passed in or use the defaults
+ minHeight = minHeight || null;
+ maxHeight = maxHeight || null;
breakPoint = breakPoint || 0;
- // Equalize the heights
- function doEqualHeights( $items ) {
+ // Combine args into an array
+ args = [ minHeight, maxHeight, breakPoint ];
- // Calculate the tallest
+ // Check if our global already exists
+ if ( window.equalHeightsItems ) {
+
+ // It does, so add or overwrite the current object in it
+ window.equalHeightsItems[selector] = args;
+
+ } else {
+
+ // It doesn't, so create the global and store the current object in it
+ window.equalHeightsItems = {};
+ window.equalHeightsItems[selector] = args;
+ }
+
+ // Function to do the equalizing of the heights
+ function doEqualHeights( selector, args ) {
+
+ // Scope our variables
+ var $items, tallest, e, a, width;
+
+ // Grab the collection of items fresh from the DOM
+ $items = $( selector );
+
+ // Store the passed in args
+ minHeight = args[0];
+ maxHeight = args[1];
+ breakPoint = args[2];
+
+ // Calculate the tallest item
tallest = ( minHeight ) ? minHeight : 0;
$items.each( function() {
$( this ).height( 'auto' );
@@ -204,7 +224,7 @@ jQuery( document ).ready( function( $ ) {
});
// Get viewport width (taking scrollbars into account)
- var e = window;
+ e = window;
a = 'inner';
if ( !( 'innerWidth' in window ) ) {
a = 'client';
@@ -212,7 +232,7 @@ jQuery( document ).ready( function( $ ) {
}
width = e[ a+'Width' ];
- // Equalize heights if viewport width is above the specified breakpoint
+ // Equalize heights if viewport width is above the breakpoint
if ( width >= breakPoint ) {
if( ( maxHeight ) && tallest > maxHeight ) tallest = maxHeight;
return $items.each( function() {
@@ -221,14 +241,39 @@ jQuery( document ).ready( function( $ ) {
}
}
- // Start the equalizing
- doEqualHeights( $items );
+ // Function to trigger the equalizing
+ function triggerEqualHeights() {
- // Attach doEqualHeights as an event handler to the window resize events
- // Use $.proxy() to pass in the right $items to keep the context correct
- // when dealing with more than one collection of $items
- $( window ).on( 'orientationchange.equalheights resize.equalheights equalheights.equalheights',
- $.proxy( doEqualHeights, null, $items ) );
+ // Loop through each object in our global
+ $.each( window.equalHeightsItems, function( selector, args ) {
+
+ // Call doEqualHeights and pass in the current object
+ doEqualHeights( selector, args );
+ });
+ }
+
+ // Grab the event data from the window object
+ eventData = $( window ).data('events');
+
+ // Check if the window has the smartresize event
+ if ( eventData.resize ) {
+
+ // Check if the smartresize event has our namespace
+ $( eventData.resize ).each( function() {
+
+ // It does, so store this information in a variable
+ if( this.namespace == 'equalheights' ) { resizeSet = true; }
+ });
+ }
+
+ // Bind the window smartresize event to our trigger function if we
+ // haven't already done so
+ if ( ! resizeSet ) {
+ $( window ).on( 'resize.equalheights', triggerEqualHeights );
+ }
+
+ // Trigger the first equalizing
+ triggerEqualHeights();
}
})( jQuery );
From 59dac77d1209fea73abf71a000f22593cd1d6095 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 30 Jan 2015 11:33:56 -0800
Subject: [PATCH 067/108] Remove inadvertent igg_ prefix on blockquote
shortcode.
---
includes/shortcodes/shortcodes.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/includes/shortcodes/shortcodes.php b/includes/shortcodes/shortcodes.php
index b5cbad2..68a6398 100644
--- a/includes/shortcodes/shortcodes.php
+++ b/includes/shortcodes/shortcodes.php
@@ -102,7 +102,7 @@ function trestle_date( $atts ) {
return date( $format );
}
-add_shortcode( 'blockquote', 'igg_blockquote_shortcode' );
+add_shortcode( 'blockquote', 'trestle_blockquote_shortcode' );
/**
* Blockquote
*
@@ -114,7 +114,7 @@ add_shortcode( 'blockquote', 'igg_blockquote_shortcode' );
*
* @return string Shortcode output.
*/
-function igg_blockquote_shortcode( $atts, $content = null ) {
+function trestle_blockquote_shortcode( $atts, $content = null ) {
$atts = shortcode_atts( array(
'citation' => '',
From e20b588bbbf8a431ecf1a46ec2d8e1a8f5daa578 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 30 Jan 2015 12:08:54 -0800
Subject: [PATCH 068/108] Change link icons to default to on.
---
includes/admin/admin.php | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/includes/admin/admin.php b/includes/admin/admin.php
index 0dee9e2..8a6aaf9 100644
--- a/includes/admin/admin.php
+++ b/includes/admin/admin.php
@@ -51,6 +51,10 @@ function trestle_custom_defaults( $defaults ) {
'trestle_footer_widgets_number' => 3,
'trestle_equal_height_cols' => 1,
'trestle_equal_cols_breakpoint' => 768,
+ 'trestle_external_link_icons' => 1,
+ 'trestle_email_link_icons' => 1,
+ 'trestle_pdf_link_icons' => 1,
+ 'trestle_doc_link_icons' => 1,
);
// Populate Trestle settings with default values if they don't yet exist
From 5550d10c5a133d47b6ea7133efb0c9e2e5912ce1 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 30 Jan 2015 12:21:01 -0800
Subject: [PATCH 069/108] Incorporate Better Font Awesome Library in /lib.
---
functions.php | 3 +++
includes/functions/theme-functions.php | 28 ++++++++++++++++++++++++++
lib/better-font-awesome-library | 1 +
3 files changed, 32 insertions(+)
create mode 160000 lib/better-font-awesome-library
diff --git a/functions.php b/functions.php
index 20b3121..e143591 100644
--- a/functions.php
+++ b/functions.php
@@ -27,6 +27,9 @@ require_once dirname( __FILE__ ) . '/includes/widget-areas/widget-areas.php';
// Plugin activation class
require_once dirname( __FILE__ ) . '/includes/classes/class-tgm-plugin-activation.php';
+// Better Font Awesome Library
+require_once dirname( __FILE__ ) . '/lib/better-font-awesome-library/better-font-awesome-library.php';
+
add_action( 'genesis_setup' ,'trestle_theme_setup', 15 );
/**
diff --git a/includes/functions/theme-functions.php b/includes/functions/theme-functions.php
index 5f4ddfd..cb0936f 100644
--- a/includes/functions/theme-functions.php
+++ b/includes/functions/theme-functions.php
@@ -9,6 +9,34 @@
* @package Trestle
*/
+/*===========================================
+ * 3rd Party Libraries
+===========================================*/
+
+add_action( 'init', 'trestle_load_bfa' );
+/**
+ * Initialize the Better Font Awesome Library.
+ *
+ * @since 2.0.0
+ */
+function trestle_load_bfa() {
+
+ // Set the library initialization args
+ $args = array(
+ 'version' => 'latest',
+ 'minified' => true,
+ 'remove_existing_fa' => false,
+ 'load_styles' => true,
+ 'load_admin_styles' => true,
+ 'load_shortcode' => true,
+ 'load_tinymce_plugin' => true,
+ );
+
+ // Initialize the Better Font Awesome Library.
+ Better_Font_Awesome_Library::get_instance( $args );
+
+}
+
/*===========================================
* Header
===========================================*/
diff --git a/lib/better-font-awesome-library b/lib/better-font-awesome-library
new file mode 160000
index 0000000..9d9be10
--- /dev/null
+++ b/lib/better-font-awesome-library
@@ -0,0 +1 @@
+Subproject commit 9d9be1041dc2e4db0eeec0efabcbde3499abc04a
From e439b6f449926321b2a139423f1c696c15ad41d6 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 30 Jan 2015 12:21:46 -0800
Subject: [PATCH 070/108] Remove Better Font Awesome from required plugins
list.
---
includes/admin/admin.php | 6 ------
1 file changed, 6 deletions(-)
diff --git a/includes/admin/admin.php b/includes/admin/admin.php
index 8a6aaf9..3628874 100644
--- a/includes/admin/admin.php
+++ b/includes/admin/admin.php
@@ -347,12 +347,6 @@ add_action( 'tgmpa_register', 'trestle_register_required_plugins' );
function trestle_register_required_plugins() {
$plugins = array(
// Required plugins
- array(
- 'name' => 'Better Font Awesome',
- 'slug' => 'better-font-awesome',
- 'required' => true,
- ),
-
array(
'name' => 'Respond.js',
'slug' => 'respondjs',
From c0ed475f76cafb3bb3121d4cd7a0be208593f0d9 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 30 Jan 2015 12:30:58 -0800
Subject: [PATCH 071/108] Remove BFAL.;
---
lib/better-font-awesome-library | 1 -
1 file changed, 1 deletion(-)
delete mode 160000 lib/better-font-awesome-library
diff --git a/lib/better-font-awesome-library b/lib/better-font-awesome-library
deleted file mode 160000
index 9d9be10..0000000
--- a/lib/better-font-awesome-library
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9d9be1041dc2e4db0eeec0efabcbde3499abc04a
From 52ece55aeb72d69833fa163adc188e0674fec843 Mon Sep 17 00:00:00 2001
From: MickeyKay
Date: Fri, 30 Jan 2015 12:31:35 -0800
Subject: [PATCH 072/108] Re-add Better Font Awesome Library as non submodule.
---
lib/better-font-awesome-library/README.md | 294 +++
.../better-font-awesome-library.php | 1258 +++++++++++++
.../css/admin-styles.css | 56 +
.../js/tinymce-icons-old.js | 43 +
.../js/tinymce-icons.js | 48 +
.../lib/fallback-font-awesome/.npmignore | 42 +
.../lib/fallback-font-awesome/README.md | 7 +
.../css/font-awesome.css | 1672 +++++++++++++++++
.../css/font-awesome.min.css | 4 +
.../fonts/FontAwesome.otf | Bin 0 -> 85908 bytes
.../fonts/fontawesome-webfont.eot | Bin 0 -> 56006 bytes
.../fonts/fontawesome-webfont.svg | 520 +++++
.../fonts/fontawesome-webfont.ttf | Bin 0 -> 112160 bytes
.../fonts/fontawesome-webfont.woff | Bin 0 -> 65452 bytes
.../lib/fallback-font-awesome/package.json | 48 +
15 files changed, 3992 insertions(+)
create mode 100644 lib/better-font-awesome-library/README.md
create mode 100644 lib/better-font-awesome-library/better-font-awesome-library.php
create mode 100644 lib/better-font-awesome-library/css/admin-styles.css
create mode 100644 lib/better-font-awesome-library/js/tinymce-icons-old.js
create mode 100644 lib/better-font-awesome-library/js/tinymce-icons.js
create mode 100644 lib/better-font-awesome-library/lib/fallback-font-awesome/.npmignore
create mode 100644 lib/better-font-awesome-library/lib/fallback-font-awesome/README.md
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.css
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.min.css
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/FontAwesome.otf
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.eot
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.svg
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.ttf
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.woff
create mode 100755 lib/better-font-awesome-library/lib/fallback-font-awesome/package.json
diff --git a/lib/better-font-awesome-library/README.md b/lib/better-font-awesome-library/README.md
new file mode 100644
index 0000000..fe57314
--- /dev/null
+++ b/lib/better-font-awesome-library/README.md
@@ -0,0 +1,294 @@
+Better Font Awesome Library
+===========================
+
+*The easiest way to integrate Font Awesome into your WordPress project.*
+
+## Table of contents ##
+1. [Introduction](https://github.com/MickeyKay/better-font-awesome-library#introduction)
+1. [Features](https://github.com/MickeyKay/better-font-awesome-library#features)
+1. [Installation](https://github.com/MickeyKay/better-font-awesome-library#installation)
+1. [Usage](https://github.com/MickeyKay/better-font-awesome-library#usage)
+1. [Initialization Parameters](https://github.com/MickeyKay/better-font-awesome-library#initialization-parameters-args)
+1. [Shortcode](https://github.com/MickeyKay/better-font-awesome-library#shortcode)
+1. [The Better Font Awesome Library Object](https://github.com/MickeyKay/better-font-awesome-library#the-better-font-awesome-library-object)
+1. [Filters](https://github.com/MickeyKay/better-font-awesome-library#filters)
+1. [To Do](https://github.com/MickeyKay/better-font-awesome-library#to-do)
+1. [Credits](https://github.com/MickeyKay/better-font-awesome-library#credits)
+
+## Introduction ##
+The Better Font Awesome Library allows you to automatically integrate the latest available version of [Font Awesome](http://fontawesome.io/) into your WordPress project, along with accompanying CSS, shortcode, and TinyMCE icon shortcode generator. Furthermore, it generates all the data you need to create new functionality of your own.
+
+## Features ##
+* Automatically fetches the most recent available version of Font Awesome, meaning you no longer need to manually update the version included in your theme/plugin.
+* Generates an easy-to-use [PHP object](#the-better-font-awesome-library-object) that contains all relevant info for the version of Font Awesome you're using, including: version, stylesheet URL, array of available icons, and prefix used (`icon` or `fa`).
+* CDN speeds - Font Awesome CSS is pulled from the super-fast and reliable [jsDelivr CDN](http://www.jsdelivr.com/#!fontawesome).
+* Includes a TinyMCE drop-down shortcode generator.
+* Includes a local copy of Font Awesome to use as a fallback in case the remote fetch fails (or you can specify your own with the [`bfa_fallback_directory_path`](https://github.com/MickeyKay/better-font-awesome-library#bfa_fallback_directory_path) filter).
+* Utilizes transients to optimize for speed and performance.
+
+## Installation ##
+The Better Font Awesome Library contains a [Git submodule](http://git-scm.com/book/en/Git-Tools-Submodules) which will require you to recursively clone this repo:
+```
+git clone --recursive https://github.com/MickeyKay/better-font-awesome-library.git
+```
+
+Alternately, if you've already cloned the repo and need to add the submodules, you can run the following commands:
+```
+// Initialize all submodules.
+git submodule init
+
+// Pull in updated copies of all submodules.
+git submodule update
+```
+
+## Usage ##
+1. Copy the /better-font-awesome-library folder into your project.
+
+2. Add the following code to your main plugin file or your theme's functions.php file.
+ ```
+ // Include the main library file. Make sure to modify the path to match your directory structure.
+ require_once ( dirname( __FILE__ ) . '/better-font-awesome-library/better-font-awesome-library.php' );
+
+ add_action( 'plugins_loaded', 'my_prefix_load_bfa' );
+ /**
+ * Initialize the Better Font Awesome Library.
+ *
+ * (see usage notes below on proper hook priority)
+ */
+ function my_prefix_load_bfa() {
+
+ // Set the library initialization args (defaults shown).
+ $args = array(
+ 'version' => 'latest',
+ 'minified' => true,
+ 'remove_existing_fa' => false,
+ 'load_styles' => true,
+ 'load_admin_styles' => true,
+ 'load_shortcode' => true,
+ 'load_tinymce_plugin' => true,
+ );
+
+ // Initialize the Better Font Awesome Library.
+ Better_Font_Awesome_Library::get_instance( $args );
+
+ }
+```
+
+3. If desired, use the [Better Font Awesome Library object](#the-better-font-awesome-library-object) to manually include Font Awesome CSS, output lists of available icons, create your own shortcodes, and much more.
+
+#### Usage Notes ####
+The Better Font Awesome Library is designed to work in conjunction with the [Better Font Awesome](https://wordpress.org/plugins/better-font-awesome/) WordPress plugin. The plugin initializes this library (with its initialization args) on the `plugins_loaded` hook, priority `5`. When using the Better Font Awesome Library in your project, you have two options:
+
+1. Initialize later, to ensure that any Better Font Awesome plugin settings override yours.
+1. Initialize earlier, to "take over" and prevent Better Font Awesome settings from having an effect.
+
+## Initialization Parameters ($args) ##
+The following arguments can be used to initialize the library using `Better_Font_Awesome_Library::get_instance( $args )`:
+
+#### $args['version'] ####
+(string) Which version of Font Awesome you want to use.
+* `'latest'` (default) - always use the latest available version.
+* `'3.2.1'` - any existing Font Awesome version number.
+
+#### $args['minified'] ####
+(boolean) Use minified Font Awesome CSS.
+* `true` (default) - uses minifed CSS.
+* `false` - uses unminified CSS.
+
+#### $args['remove_existing_fa'] ####
+(boolean) Attempts to remove existing Font Awesome styles and shortcodes. This can be useful to prevent conflicts with other themes/plugins, but is no guarantee.
+* `true`
+* `false` (default)
+
+#### $args['load_styles'] ####
+(boolean) Automatically loads Font Awesome CSS on the **front-end** of your site using `wp_enqueue_scripts()`.
+* `true` (default)
+* `false` - use this if you don't want to load the Font Awesome CSS on the front-end, or wish to do it yourself.
+
+#### $args['load_admin_styles'] ####
+(boolean) Automatically loads Font Awesome CSS on the **admin** of your site using `admin_enqueue_scripts()`.
+* `true` (default)
+* `false` - use this if you don't want to load the Font Awesome CSS in the admin, or wish to do it yourself.
+
+#### $args['load_shortcode'] ####
+(boolean) Loads the included `[icon]` [shortcode](https://github.com/MickeyKay/better-font-awesome-library#shortcode).
+* `true` (default)
+* `false`
+
+#### load_tinymce_plugin ####
+(boolean) Loads a TinyMCE drop-down list of available icons (based on the active Font Awesome version), which generates an `[icon]` shortcode.
+* `true` (default)
+* `false`
+
+## Shortcode ##
+If either the `$args['load_shortcode']` or `$args['load_tinymce_plugin']` initialization arg is set to `true`, then the Better Font Awesome Library will include an icon shortcode that can be used as follows:
+```
+[icon name="star" class="2x spin" unprefixed_class="my-custom-class"]
+```
+
+**name**
+The unprefixed icon name (e.g. star). The version-specific prefix will be automatically prepended.
+
+**class**
+Unprefixed [Font Awesome icon classes](http://fortawesome.github.io/Font-Awesome/examples/). The version-specific prefix will be automatically prepended to each class.
+
+**unprefixed_class**
+Any additional classes that you wish to remain unprefixed (e.g. my-custom-class).
+
+#### Shortcode Output ####
+The example shortcode above would output the following depending on which version of Font Awesome you've selected:
+
+**Version 4+**
+```
+
+```
+**Version 3**
+```
+
+```
+
+## The Better Font Awesome Library Object ##
+The Better Font Awesome Library object can be accessed with the following code:
+`Better_Font_Awesome_Library::get_instance();`
+
+The object has the following public methods:
+#### get_version() ####
+(string) Returns the active version of Font Awesome being used.
+
+#### get_stylesheet_url() ####
+(string) Returns the active Font Awesome stylesheet URL.
+
+#### get_icons() ####
+(array) Returns an associative array of icon hex values (index, e.g. \f000) and unprefixed icon names (values, e.g. rocket) for all available icons in the active Font Awesome version.
+
+#### get_prefix() ####
+(string) Returns the version-dependent prefix ('fa' or 'icon') that is used in the icons' CSS classes.
+
+#### get_api_data() ####
+(object) Returns version data for the remote jsDelivr CDN (uses [jsDelivr API](https://github.com/jsdelivr/api)). Includes all available versions and latest version.
+
+#### get_errors() ####
+(array) Returns all library errors, including API and CDN fetch failures.
+
+#### Example: ####
+```
+// Initialize the library with custom args.
+Better_Font_Awesome_Library::get_instance( $args );
+
+// Get the active Better Font Awesome Library Object.
+$my_bfa = Better_Font_Awesome_Library::get_instance();
+
+// Get info on the Better Font Awesome Library object.
+$version = $my_bfa->get_version();
+$stylesheet_url = $my_bfa->get_stylesheet_url();
+$prefix = $my_bfa->get_prefix();
+$icons = $my_bfa->get_icons();
+
+// Output all available icons.
+foreach ( $icons as $icon ) {
+ echo $icon . ' ';
+}
+```
+
+## Filters ##
+The Better Font Awesome Library applies the following filters:
+
+#### bfa_init_args ####
+Applied to the initialization arguments after they have been parsed with default args, but before they are used to fetch any Font Awesome data.
+
+**Parameters**
+
+* `$init_args` (array)
+
+#### bfa_wp_remote_get_args ####
+Applied to arguments passed to all `wp_remote_get()` calls (useful for adjusting the timeout if needed).
+
+**Parameters**
+
+* `$wp_remote_get_args` (array)
+
+#### bfa_fallback_directory_path ####
+Applied to the fallback directory path before setting up any fallback CSS info. Can be used to specify an alternate fallback directory to replace the default fallback directory.
+
+*The path must be to a local, non-remote, directory.*
+
+**Parameters**
+
+* `$path` (string)
+
+#### bfa_api_transient_expiration ####
+Applied to the API (version information) transient [expiration](http://codex.wordpress.org/Transients_API#Using_Transients). Can be used to increase/decrease the expiration as desired.
+
+**Parameters**
+
+* `$api_expiration` (int)
+
+#### bfa_css_transient_expiration ####
+Applied to the CSS stylesheet data transient [expiration](http://codex.wordpress.org/Transients_API#Using_Transients). Can be used to increase/decrease the expiration as desired.
+
+**Parameters**
+
+* `$css_expiration` (int)
+
+#### bfa_icon_list ####
+Applied to the icon array after it has been generated from the Font Awesome stylesheet, and before it is assigned to the Better Font Awesome Library object's `$icons` property.
+
+**Parameters**
+
+* `$icons` (array)
+
+#### bfa_prefix ####
+Applied to the Font Awesome prefix ('fa' or 'icon') before it is assigned to the Better Font Awesome Library object's `$prefix` property.
+
+**Parameters**
+
+* `$prefix` (string)
+
+#### bfa_icon_class ####
+Applied to the classes that are output on each icon's `` element.
+
+**Parameters**
+
+* `$class` (string)
+
+#### bfa_icon ####
+Applied to the entire `` element that is output for each icon.
+
+**Parameters**
+
+* `$output` (string)
+
+#### bfa_force_fallback ####
+Applied to the boolean that determines whether or not to force the included fallback version of Font Awesome to load. This can be useful if you're having trouble with delays or timeouts.
+
+**Parameters**
+
+* `$force_fallback` (false)
+
+#### bfa_show_errors ####
+Applied to the boolean that determines whether or not to suppress all Font Awesome warnings that normally display in the admin.
+
+**Parameters**
+
+* `$show_errors` (true)
+
+
+## To Do ##
+Ideas? File an issue or add a pull request!
+* Add README section on manually updating the fallback version.
+* Remove existing FA? - move to later hook so that it works for styles enqueued via shortcode (= wp_footer basically)
+
+## Credits ##
+Special thanks to the following folks and their plugins for inspiration and support:
+* [Font Awesome Icons](http://wordpress.org/plugins/font-awesome/ "Font Awesome Icons") by [Rachel Baker](http://rachelbaker.me/ "Rachel Baker")
+* [Font Awesome More Icons](https://wordpress.org/plugins/font-awesome-more-icons/ "Font Awesome More Icons") by [Web Guys](http://webguysaz.com/ "Web Guys")
+* [Font Awesome Shortcodes](https://wordpress.org/plugins/font-awesome-shortcodes/) by [FoolsRun](https://profiles.wordpress.org/foolsrun/ "FoolsRun")
+* Dmitriy Akulov and the awesome folks at [jsDelivr](http://www.jsdelivr.com/)
+
+And many thanks to the following folks who helped with testing and QA:
+* [Jeffrey Dubinksy](http://vanishingforests.org/)
+* [Neil Gee](https://twitter.com/_neilgee)
+* [Michael Beil](https://twitter.com/MichaelBeil)
+* [Rob Neue](https://twitter.com/rob_neu)
+* [Gary Jones](https://twitter.com/GaryJ)
+* [Jan Hoek](https://twitter.com/JanHoekdotCom)
diff --git a/lib/better-font-awesome-library/better-font-awesome-library.php b/lib/better-font-awesome-library/better-font-awesome-library.php
new file mode 100644
index 0000000..79c4658
--- /dev/null
+++ b/lib/better-font-awesome-library/better-font-awesome-library.php
@@ -0,0 +1,1258 @@
+ 'latest',
+ 'minified' => true,
+ 'remove_existing_fa' => false,
+ 'load_styles' => true,
+ 'load_admin_styles' => true,
+ 'load_shortcode' => true,
+ 'load_tinymce_plugin' => true,
+ );
+
+ /**
+ * Args for wp_remote_get() calls.
+ *
+ * @since 1.0.0
+ *
+ * @var array
+ */
+ private $wp_remote_get_args = array(
+ 'timeout' => 10
+ );
+
+ /**
+ * Array to hold the jsDelivr API data.
+ *
+ * @since 1.0.0
+ *
+ * @var string
+ */
+ private $api_data = array();
+
+ /**
+ * Version of Font Awesome being used.
+ *
+ * @since 1.0.0
+ *
+ * @var string
+ */
+ private $font_awesome_version;
+
+ /**
+ * Font Awesome stylesheet URL.
+ *
+ * @since 1.0.0
+ *
+ * @var string
+ */
+ private $stylesheet_url;
+
+ /**
+ * Font Awesome CSS.
+ *
+ * @since 1.0.0
+ *
+ * @var string
+ */
+ private $css;
+
+ /**
+ * Data associated with the local fallback version of Font Awesome.
+ *
+ * @since 1.0.0
+ *
+ * @var string
+ */
+ private $fallback_data = array(
+ 'directory' => 'lib/fallback-font-awesome/',
+ 'path' => '',
+ 'url' => '',
+ 'version' => '',
+ 'css' => '',
+ );
+
+ /**
+ * Array of available Font Awesome icon slugs.
+ *
+ * @since 1.0.0
+ *
+ * @var string
+ */
+ private $icons = array();
+
+ /**
+ * Font Awesome prefix to be used ('icon' or 'fa').
+ *
+ * @since 1.0.0
+ *
+ * @var string
+ */
+ private $prefix;
+
+ /**
+ * Array to track errors and wp_remote_get() failures.
+ *
+ * @since 1.0.0
+ *
+ * @var array
+ */
+ private $errors = array();
+
+ /**
+ * Instance of this class.
+ *
+ * @since 1.0.0
+ *
+ * @var Better_Font_Awesome_Library
+ */
+ private static $instance = null;
+
+ /**
+ * Returns the instance of this class, and initializes
+ * the instance if it doesn't already exist.
+ *
+ * @since 1.0.0
+ *
+ * @return Better_Font_Awesome_Library The BFAL object.
+ */
+ public static function get_instance( $args = array() ) {
+
+ // If the single instance hasn't been set, set it now.
+ if ( null == self::$instance ) {
+ self::$instance = new self( $args );
+ }
+
+ return self::$instance;
+
+ }
+
+ /**
+ * Better Font Awesome Library constructor.
+ *
+ * @since 1.0.0
+ *
+ * @param array $args Initialization arguments.
+ */
+ private function __construct( $args = array() ) {
+
+ // Get initialization args.
+ $this->args = $args;
+
+ // Load the library functionality.
+ $this->load();
+
+ }
+
+ /**
+ * Set up all plugin library functionality.
+ *
+ * @since 1.0.0
+ */
+ public function load() {
+
+ // Initialize library properties and actions as needed.
+ $this->initialize( $this->args );
+
+ // Use the jsDelivr API to fetch info on the jsDelivr Font Awesome CDN.
+ $this->setup_api_data();
+
+ // Set the version of Font Awesome to be used.
+ $this->set_active_version();
+
+ // Set the URL for the Font Awesome stylesheet.
+ $this->set_stylesheet_url( $this->font_awesome_version );
+
+ // Get stylesheet and generate list of available icons in Font Awesome stylesheet.
+ $this->setup_stylesheet_data();
+
+ /**
+ * Remove existing Font Awesome CSS and shortcodes if needed.
+ *
+ * Use priority 15 to ensure this is done after other plugin
+ * CSS/shortcodes are loaded. This must run before any other
+ * style/script/shortcode actions so it doesn't accidentally
+ * remove them.
+ */
+ if ( $this->args['remove_existing_fa'] ) {
+
+ add_action( 'wp_enqueue_scripts', array( $this, 'remove_font_awesome_css' ), 15 );
+ add_action( 'init', array( $this, 'remove_icon_shortcode' ), 15 );
+
+ }
+
+ /**
+ * Load front-end scripts and styles.
+ *
+ * Use priority 15 to make sure styles/scripts load after other plugins.
+ */
+ if ( $this->args['load_styles'] || $this->args['remove_existing_fa'] ) {
+ add_action( 'wp_enqueue_scripts', array( $this, 'register_font_awesome_css' ), 15 );
+ }
+
+ /**
+ * Load admin scripts and styles.
+ *
+ * Use priority 15 to make sure styles/scripts load after other plugins.
+ */
+ if ( $this->args['load_admin_styles'] || $this->args['load_tinymce_plugin'] ) {
+ add_action( 'admin_enqueue_scripts', array( $this, 'register_font_awesome_css' ), 15 );
+ }
+
+ /**
+ * Add [icon] shortcode.
+ *
+ * Use priority 15 to ensure this is done after removing existing Font
+ * Awesome CSS and shortcodes.
+ */
+ if ( $this->args['load_shortcode'] || $this->args['load_tinymce_plugin'] ) {
+ add_action( 'init', array( $this, 'add_icon_shortcode' ), 15 );
+ }
+
+ // Add Font Awesome and/or custom CSS to the editor.
+ add_action( 'init', array( $this, 'add_editor_styles' ) );
+
+ // Load TinyMCE functionality.
+ if ( $this->args['load_tinymce_plugin'] ) {
+
+ add_action( 'admin_init', array( $this, 'add_tinymce_components' ) );
+ add_action( 'admin_head', array( $this, 'output_admin_head_variables' ) );
+ add_action( 'admin_enqueue_scripts', array( $this, 'register_custom_admin_css' ), 15 );
+
+ }
+
+ // Output any necessary admin notices.
+ add_action( 'admin_notices', array( $this, 'do_admin_notice' ) );
+
+ }
+
+ /**
+ * Do necessary initialization actions.
+ *
+ * @since 1.0.0
+ */
+ private function initialize( $args ) {
+
+ // Parse the initialization args with the defaults.
+ $this->parse_args( $args );
+
+ // Set fallback stylesheet directory URL and path.
+ $this->setup_fallback_data();
+
+ }
+
+ /**
+ * Parse the initialization args with the defaults and apply bfa_args filter.
+ *
+ * @since 1.0.0
+ *
+ * @param array $args Args used to initialize BFAL.
+ */
+ private function parse_args( $args = array() ) {
+
+ // Parse initialization args with defaults.
+ $this->args = wp_parse_args( $args, $this->default_args );
+
+ /**
+ * Filter the initialization args.
+ *
+ * @since 1.0.0
+ *
+ * @param array $this->args BFAL initialization args.
+ */
+ $this->args = apply_filters( 'bfa_init_args', $this->args );
+
+ /**
+ * Filter the wp_remote_get args.
+ *
+ * @since 1.0.0
+ *
+ * @param array $this->wp_remote_get_args BFAL wp_remote_get_args args.
+ */
+ $this->wp_remote_get_args = apply_filters( 'bfa_wp_remote_get_args', $this->wp_remote_get_args );
+
+ }
+
+ /**
+ * Set up data for the local fallback version of Font Awesome.
+ *
+ * @since 1.0.0
+ */
+ private function setup_fallback_data() {
+
+ // Set fallback directory path.
+ $directory_path = plugin_dir_path( __FILE__ ) . $this->fallback_data['directory'];
+
+ /**
+ * Filter directory path.
+ *
+ * @since 1.0.0
+ *
+ * @param string $directory_path The path to the fallback Font Awesome directory.
+ */
+ $directory_path = trailingslashit( apply_filters( 'bfa_fallback_directory_path', $directory_path ) );
+
+ // Set fallback path and URL.
+ $this->fallback_data['path'] = $directory_path . 'css/font-awesome' . $this->get_min_suffix() . '.css';
+ $this->fallback_data['url'] = plugins_url( $this->fallback_data['directory'] . 'css/font-awesome' . $this->get_min_suffix() . '.css', dirname( $directory_path ) );
+
+ // Get the fallback version based on package.json.
+ $fallback_json_file_path = $directory_path . 'package.json';
+ $fallback_data = json_decode( $this->get_local_file_contents( $fallback_json_file_path ) );
+ $this->fallback_data['version'] = $fallback_data->version;
+
+ // Get the fallback CSS.
+ $this->fallback_data['css'] = $this->get_fallback_css();
+
+ }
+
+ /**
+ * Set up data for all versions of Font Awesome available on the jsDelivr
+ * CDN.
+ *
+ * Uses the jsDelivr API.
+ *
+ * @since 1.0.0
+ */
+ private function setup_api_data() {
+ $this->api_data = $this->fetch_api_data( self::JSDELIVR_API_URL );
+ }
+
+ /**
+ * Fetch the jsDelivr API data.
+ *
+ * First check to see if the api-versions transient is set, and if not use
+ * the jsDelivr API to retrieve all available versions of Font Awesome.
+ *
+ * @since 1.0.0
+ *
+ * @return array|WP_ERROR Available CDN Font Awesome versions, or a
+ * WP_ERROR if the fetch fails.
+ */
+ private function fetch_api_data( $url ) {
+
+ if ( false === ( $response = get_transient( self::SLUG . '-api-versions' ) ) ) {
+
+ $response = wp_remote_get( $url, $this->wp_remote_get_args );
+
+ if ( 200 == wp_remote_retrieve_response_code( $response ) ) {
+
+ // Decode the API data and grab the versions info.
+ $json_data = json_decode( wp_remote_retrieve_body( $response ) );
+ $response = $json_data[0];
+
+ /**
+ * Filter the API transient expiration.
+ *
+ * @since 1.0.0
+ *
+ * @param int Expiration for API transient.
+ */
+ $transient_expiration = apply_filters( 'bfa_api_transient_expiration', 12 * HOUR_IN_SECONDS );
+
+ // Set the API transient.
+ set_transient( self::SLUG . '-api-versions', $response, $transient_expiration );
+
+ } elseif ( is_wp_error( $response ) ) { // Check for faulty wp_remote_get()
+
+ $this->set_error( 'api', $response->get_error_code(), $response->get_error_message() . " (URL: $url)" );
+ $response = '';
+
+ } elseif ( isset( $response['response'] ) ) { // Check for 404 and other non-WP_ERROR codes
+
+ $this->set_error( 'api', $response['response']['code'], $response['response']['message'] . " (URL: $url)" );
+ $response = '';
+
+ } else { // Total failsafe
+
+ $this->set_error( 'api', 'Unknown', __( 'The jsDelivr API servers appear to be temporarily unavailable.', 'better-font-awesome' ) . " (URL: $url)" );
+ $response = '';
+
+ }
+
+ }
+
+ return $response;
+
+ }
+
+ /**
+ * Set the version of Font Awesome to use.
+ *
+ * @since 1.0.0
+ */
+ private function set_active_version() {
+
+ if ( 'latest' == $this->args['version'] ) {
+ $this->font_awesome_version = $this->get_latest_version();
+ } else {
+ $this->font_awesome_version = $this->args['version'];
+ }
+
+ }
+
+ /**
+ * Get the latest available Font Awesome version.
+ *
+ * @since 1.0.0
+ *
+ * @return string Latest available Font Awesome version, either via the
+ * jsDelivr API data (if available), or a best guess based on transient and
+ * fallback version data.
+ */
+ private function get_latest_version() {
+
+ if ( $this->api_data_exists() ) {
+ return $this->get_api_value( 'lastversion' );
+ } else {
+ return $this->guess_latest_version();
+ }
+
+ }
+
+ /**
+ * Guess the latest Font Awesome version.
+ *
+ * Check both the transient Font Awesome CSS array and the locally-hosted
+ * version of Font Awesome to determine the latest listed version.
+ *
+ * @since 1.0.0
+ *
+ * @return string Latest transient or fallback version of Font Awesome CSS.
+ */
+ private function guess_latest_version() {
+
+ $css_transient_latest_version = $this->get_css_transient_latest_version();
+
+ if ( version_compare( $css_transient_latest_version, $this->fallback_data['version'], '>' ) ) {
+ return $css_transient_latest_version;
+ } else {
+ return $this->fallback_data['version'];
+ }
+
+ }
+
+ /**
+ * Get the latest version saved in the CSS transient.
+ *
+ * @since 1.0.0
+ *
+ * @return string Latest version key in the CSS transient array.
+ * Return '0' if the CSS transient isn't set.
+ */
+ private function get_css_transient_latest_version() {
+
+ $transient_css_array = get_transient( self::SLUG . '-css' );
+
+ if ( ! empty( $transient_css_array ) ) {
+ return max( array_keys( $transient_css_array ) );
+ } else {
+ return '0';
+ }
+
+ }
+
+ /**
+ * Determine the remote Font Awesome stylesheet URL based on the selected
+ * version.
+ *
+ * @since 1.0.0
+ *
+ * @param string $version Version of Font Awesome to use.
+ */
+ private function set_stylesheet_url( $version ) {
+ $this->stylesheet_url = '//cdn.jsdelivr.net/fontawesome/' . $version . '/css/font-awesome' . $this->get_min_suffix() . '.css';
+ }
+
+ /**
+ * Get stylesheet CSS and populate icons array.
+ *
+ * @since 1.0.0
+ */
+ private function setup_stylesheet_data() {
+
+ // Get the Font Awesome CSS.
+ $this->css = $this->get_css( $this->stylesheet_url, $this->font_awesome_version );
+
+ // Get the list of available icons from the Font Awesome CSS.
+ $this->icons = $this->setup_icon_array( $this->css );
+
+ // Set up prefix based on version ('fa' or 'icon').
+ $this->prefix = $this->setup_prefix( $this->font_awesome_version );
+
+ }
+
+ /**
+ * Get the Font Awesome CSS.
+ *
+ * @since 1.0.0
+ *
+ * @param string $url URL of the remote stylesheet.
+ * @param string $version Version of Font Awesome to fetch.
+ *
+ * @return string $response Font Awesome CSS, from either:
+ * 1. transient,
+ * 2. wp_remote_get(), or
+ * 3. fallback CSS.
+ */
+ private function get_css( $url, $version ) {
+
+ // First try getting the transient CSS.
+ $response = $this->get_transient_css( $version );
+
+ // Next, try fetching the CSS from the remote jsDelivr CDN.
+ if ( ! $response ) {
+ $response = $this->get_remote_css( $url, $version );
+ }
+
+ /**
+ * Filter the force fallback flag.
+ *
+ * @since 1.0.4
+ *
+ * @param bool Whether or not to force the fallback CSS.
+ */
+ $force_fallback = apply_filters( 'bfa_force_fallback', false );
+
+ /**
+ * Use the local fallback if both the transient and wp_remote_get()
+ * methods fail, or if fallback is forced with bfa_force_fallback filter.
+ */
+ if ( is_wp_error( $response ) || $force_fallback ) {
+
+ // Log the CSS fetch error.
+ if ( ! $force_fallback ) {
+ $this->set_error( 'css', $response->get_error_code(), $response->get_error_message() . " (URL: $url)" );
+ }
+
+ // Use the local fallback CSS.
+ $response = $this->fallback_data['css'];
+
+ // Update the version string to match the fallback version.
+ $this->font_awesome_version = $this->fallback_data['version'];
+
+ // Update the stylesheet URL to match the fallback version.
+ $this->stylesheet_url = $this->fallback_data['url'];
+ }
+
+ return $response;
+
+ }
+
+ /**
+ * Get the transient copy of the CSS for the specified version.
+ *
+ * @since 1.0.0
+ *
+ * @param string $version Font Awesome version to check.
+ *
+ * @return string Transient CSS if it exists, otherwise null.
+ */
+ private function get_transient_css( $version ) {
+
+ $transient_css_array = get_transient( self::SLUG . '-css' );
+ return isset( $transient_css_array[ $version ] ) ? $transient_css_array[ $version ] : '';
+
+ }
+
+ /**
+ * Get the CSS from the remote jsDelivr CDN.
+ *
+ * @since 1.0.0
+ *
+ * @param string $url URL for the remote stylesheet.
+ * @param string $version Font Awesome version to fetch.
+ *
+ * @return string|WP_ERROR $response Remote CSS, or WP_ERROR if
+ * wp_remote_get() fails.
+ */
+ private function get_remote_css( $url, $version ) {
+
+ // Get the remote Font Awesome CSS.
+ $url = set_url_scheme( $url );
+ $response = wp_remote_get( $url, $this->wp_remote_get_args );
+
+ /**
+ * If fetch was successful, return the remote CSS, and set the CSS
+ * transient for this version. Otherwise, return a WP_Error object.
+ */
+ if ( 200 == wp_remote_retrieve_response_code( $response ) ) {
+
+ $response = wp_remote_retrieve_body( $response );
+ $this->set_css_transient( $version, $response );
+
+ } elseif ( is_wp_error( $response ) ) { // Check for faulty wp_remote_get()
+ $response = $response;
+ } elseif ( isset( $response['response'] ) ) { // Check for 404 and other non-WP_ERROR codes
+ $response = new WP_Error( $response['response']['code'], $response['response']['message'] . " (URL: $url)" );
+ } else { // Total failsafe
+ $response = '';
+ }
+
+ return $response;
+
+ }
+
+ /**
+ * Set the CSS transient array.
+ *
+ * @since 1.0.0
+ *
+ * @param string $version Version of Font Awesome for which to set the
+ * transient.
+ * @param string $value CSS for corresponding version of Font Awesome.
+ */
+ private function set_css_transient( $version, $value ) {
+
+ /**
+ * Get the transient array, which contains data for multiple Font
+ * Awesome version.
+ */
+ $transient_css_array = get_transient( self::SLUG . '-css' );
+
+ // Set the new value for the specified Font Awesome version.
+ $transient_css_array[ $version ] = $value;
+
+ /**
+ * Filter the CSS transient expiration.
+ *
+ * @since 1.0.0
+ *
+ * @param int Expiration for the CSS transient.
+ */
+ $transient_expiration = apply_filters( 'bfa_css_transient_expiration', 30 * DAY_IN_SECONDS );
+
+ // Set the new CSS array transient.
+ set_transient( self::SLUG . '-css', $transient_css_array, $transient_expiration );
+
+ }
+
+ /**
+ * Get the CSS of the local fallback Font Awesome version.
+ *
+ * @since 1.0.0
+ *
+ * @return string Contents of the local fallback Font Awesome stylesheet.
+ */
+ private function get_fallback_css() {
+ return $this->get_local_file_contents( $this->fallback_data['path'] );
+ }
+
+ /**
+ * Get array of icons from the Font Awesome CSS.
+ *
+ * @since 1.0.0
+ *
+ * @param string $css The Font Awesome CSS.
+ *
+ * @return array All available icon names (e.g. adjust, car, pencil).
+ */
+ private function setup_icon_array( $css ) {
+
+ $icons = array();
+ $hex_codes = array();
+
+ /**
+ * Get all CSS selectors that have a "content:" pseudo-element rule,
+ * as well as all associated hex codes.
+ */
+ preg_match_all( '/\.(icon-|fa-)([^,}]*)\s*:before\s*{\s*(content:)\s*"(\\\\[^"]+)"/s', $css, $matches );
+ $icons = $matches[2];
+ $hex_codes = $matches[4];
+
+ // Add hex codes as icon array index.
+ $icons = array_combine( $hex_codes, $icons );
+
+ // Alphabetize the icons array by icon name.
+ asort( $icons );
+
+ /**
+ * Filter the array of available icons.
+ *
+ * @since 1.0.0
+ *
+ * @param array $icons Array of all available icons.
+ */
+ $icons = apply_filters( 'bfa_icon_list', $icons );
+
+ return $icons;
+
+ }
+
+ /**
+ * Get the Font Awesosome prefix ('fa' or 'icon').
+ *
+ * @since 1.0.0
+ *
+ * @param string $version Font Awesome version being used.
+ *
+ * @return string $prefix 'fa' or 'icon', depending on the version.
+ */
+ private function setup_prefix( $version ) {
+
+ if ( 0 <= version_compare( $version, '4' ) ) {
+ $prefix = 'fa';
+ } else {
+ $prefix = 'icon';
+ }
+
+ /**
+ * Filter the Font Awesome prefix.
+ *
+ * @since 1.0.0
+ *
+ * @param string $prefix Font Awesome prefix ('icon' or 'fa').
+ */
+ $prefix = apply_filters( 'bfa_prefix', $prefix );
+
+ return $prefix;
+
+ }
+
+ /**
+ * Remove styles that include 'fontawesome' or 'font-awesome' in their slug.
+ *
+ * @since 1.0.0
+ */
+ public function remove_font_awesome_css() {
+
+ global $wp_styles;
+
+ // Loop through all registered styles and remove any that appear to be Font Awesome.
+ foreach ( $wp_styles->registered as $script => $details ) {
+
+ if ( false !== strpos( $script, 'fontawesome' ) || false !== strpos( $script, 'font-awesome' ) ) {
+ wp_dequeue_style( $script );
+ }
+
+ }
+
+ }
+
+ /**
+ * Remove [icon] shortcode.
+ *
+ * @since 1.0.0
+ */
+ public function remove_icon_shortcode() {
+ remove_shortcode( 'icon' );
+ }
+
+ /**
+ * Add [icon] shortcode.
+ *
+ * Usage:
+ * [icon name="flag" class="fw 2x spin" unprefixed_class="custom_class"]
+ *
+ * @since 1.0.0
+ */
+ public function add_icon_shortcode() {
+ add_shortcode( 'icon', array( $this, 'render_shortcode' ) );
+ }
+
+ /**
+ * Render [icon] shortcode.
+ *
+ * Usage:
+ * [icon name="flag" class="fw 2x spin" unprefixed_class="custom_class"]
+ *
+ * @param array $atts Shortcode attributes.
+ * @return string $output Icon HTML (e.g. ).
+ */
+ public function render_shortcode( $atts ) {
+
+ extract( shortcode_atts( array(
+ 'name' => '',
+ 'class' => '',
+ 'unprefixed_class' => '',
+ 'title' => '', /* For compatibility with other plugins */
+ 'size' => '', /* For compatibility with other plugins */
+ 'space' => '',
+ ), $atts )
+ );
+
+ /**
+ * Include for backwards compatibility with Font Awesome More Icons plugin.
+ *
+ * @see https://wordpress.org/plugins/font-awesome-more-icons/
+ */
+ $title = $title ? 'title="' . $title . '" ' : '';
+ $space = 'true' == $space ? ' ' : '';
+ $size = $size ? ' '. $this->prefix . '-' . $size : '';
+
+ // Remove "icon-" and "fa-" from name
+ // This helps both:
+ // 1. Incorrect shortcodes (when user includes full class name including prefix)
+ // 2. Old shortcodes from other plugins that required prefixes
+
+ /**
+ * Strip 'icon-' and 'fa-' from $name.
+ *
+ * This corrects for:
+ * 1. Incorrect shortcodes (when user includes full class name including prefix)
+ * 2. Old shortcodes from other plugins that required prefixes
+ */
+ $name = str_replace( 'icon-', '', $name );
+ $name = str_replace( 'fa-', '', $name );
+
+ // Add the version-specific prefix back on to $name.
+ $icon_name = $this->prefix . '-' . $name;
+
+ // Remove "icon-" and "fa-" from the icon class.
+ $class = str_replace( 'icon-', '', $class );
+ $class = str_replace( 'fa-', '', $class );
+
+ // Remove extra spaces from the icon class.
+ $class = trim( $class );
+ $class = preg_replace( '/\s{3,}/', ' ', $class );
+
+ // Add the version-specific prefix back on to each class.
+ $class = $class ? ' ' . $this->prefix . '-' . str_replace( ' ', ' ' . $this->prefix . '-', $class ) : '';
+
+ // Add unprefixed classes.
+ $class .= $unprefixed_class ? ' ' . $unprefixed_class : '';
+
+ /**
+ * Filter the icon class.
+ *
+ * @since 1.0.0
+ *
+ * @param string $class Classes attached to the icon.
+ */
+ $class = apply_filters( 'bfa_icon_class', $class, $name );
+
+ // Generate the HTML icon element output.
+ $output = sprintf( '%s ',
+ $this->prefix,
+ $icon_name . $class . $size,
+ $title,
+ $space
+ );
+
+ /**
+ * Filter the icon output.
+ *
+ * @since 1.0.0
+ *
+ * @param string $output Icon output.
+ */
+ return apply_filters( 'bfa_icon', $output );
+
+ }
+
+ /**
+ * Register and enqueue Font Awesome CSS.
+ */
+ public function register_font_awesome_css() {
+
+ wp_register_style( self::SLUG . '-font-awesome', $this->stylesheet_url, '', $this->font_awesome_version );
+ wp_enqueue_style( self::SLUG . '-font-awesome' );
+
+ }
+
+ /**
+ * Add Font Awesome CSS to TinyMCE.
+ *
+ * @since 1.0.0
+ */
+ public function add_editor_styles() {
+ add_editor_style( $this->stylesheet_url );
+ }
+
+ /**
+ * Add TinyMCE button functionality.
+ *
+ * @since 1.0.0
+ */
+ function add_tinymce_components() {
+
+ if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
+ return;
+ }
+
+ if ( get_user_option( 'rich_editing' ) == 'true' ) {
+
+ add_filter( 'mce_external_plugins', array( $this, 'register_tinymce_plugin' ) );
+ add_filter( 'mce_buttons', array( $this, 'add_tinymce_buttons' ) );
+
+ }
+
+ }
+
+ /**
+ * Load TinyMCE Font Awesome dropdown plugin.
+ *
+ * @since 1.0.0
+ */
+ function register_tinymce_plugin( $plugin_array ) {
+
+ global $tinymce_version;
+
+ /**
+ * Register the correct TinyMCE plugin based on the version of TinyMCE
+ * being used.
+ */
+ if ( version_compare( $tinymce_version, '4000', '>=' ) ) {
+ $plugin_array['bfa_plugin'] = plugins_url( 'js/tinymce-icons.js', __FILE__ );
+ } else {
+ $plugin_array['bfa_plugin'] = plugins_url( 'js/tinymce-icons-old.js', __FILE__ );
+ }
+
+ return $plugin_array;
+
+ }
+
+ /**
+ * Add the TinyMCE button(s).
+ *
+ * @since 1.0.0
+ */
+ function add_tinymce_buttons( $buttons ) {
+
+ array_push( $buttons, 'bfaSelect' );
+ return $buttons;
+
+ }
+
+ /**
+ * Add PHP variables in HTML for use by TinyMCE JavaScript.
+ *
+ * @since 1.0.0
+ */
+ function output_admin_head_variables() {
+
+ $icon_list = implode( ",", $this->icons );
+ ?>
+
+
+
+ errors ) && apply_filters( 'bfa_show_errors', true ) ) :
+ ?>
+
+
+
+
+
+
+ get_error('api') ) ) : ?>
+
+
+ ' . $this->get_error('api')->get_error_code() . ': ' . $this->get_error('api')->get_error_message() . ''
+ );
+ ?>
+
+
+
+
+ get_error('css') ) ) : ?>
+
+
+ ' . $this->get_error('css')->get_error_code() . ': ' . $this->get_error('css')->get_error_message() . '',
+ ' ',
+ '' . $this->font_awesome_version . ''
+ );
+ ?>
+
+
+
+
+
Don\'t worry! Better Font Awesome will still render using the included fallback version: ', 'better-font-awesome' ) . '' . $this->fallback_data['version'] . '' ; ?>
+
+
+
+
+ ',
+ ''
+ );
+ ?>
+
+
+ args['minified'] ) ? '.min' : '';
+ }
+
+ /**
+ * Add an error to the $this->errors array.
+ *
+ * @since 1.0.0
+ *
+ * @param string $error_type Type of error (api, css, etc).
+ * @param string $code Error code.
+ * @param string $message Error message.
+ */
+ private function set_error( $error_type, $code, $message ) {
+ $this->errors[ $error_type ] = new WP_Error( $code, $message );
+ }
+
+ /**
+ * Retrieve a library error.
+ *
+ * @since 1.0.0
+ *
+ * @param string $process Slug of the process to check (e.g. 'api').
+ *
+ * @return WP_ERROR The error for the specified process.
+ */
+ public function get_error( $process ) {
+ return isset( $this->errors[ $process ] ) ? $this->errors[ $process ] : '';
+ }
+
+ /**
+ * Check if API version data has been retrieved.
+ *
+ * @since 1.0.0
+ *
+ * @return boolean Whether or not the API version info was successfully fetched.
+ */
+ public function api_data_exists() {
+
+ if ( $this->api_data ) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+ /**
+ * Get a specific API value.
+ *
+ * @since 1.0.0
+ *
+ * @param string $key Array key of the API data to get.
+ *
+ * @return mixed $value Value associated with specified key.
+ */
+ public function get_api_value( $key ) {
+
+ if ( $this->api_data ) {
+ $value = $this->api_data->$key;
+ } else {
+ $value = '';
+ }
+
+ return $value;
+
+ }
+
+ /*----------------------------------------------------------------------------*
+ * Public User Functions
+ *----------------------------------------------------------------------------*/
+
+ /**
+ * Get the version of Font Awesome currently in use.
+ *
+ * @since 1.0.0
+ *
+ * @return string Font Awesome version.
+ */
+ public function get_version() {
+ return $this->font_awesome_version;
+ }
+
+ /**
+ * Get the fallback version of Font Awesome included locally.
+ *
+ * @since 1.0.0
+ *
+ * @return string Font Awesome fallback version.
+ */
+ public function get_fallback_version() {
+ return $this->fallback_data['version'];
+ }
+
+ /**
+ * Get the stylesheet URL.
+ *
+ * @since 1.0.0
+ *
+ * @return string Stylesheet URL.
+ */
+ public function get_stylesheet_url() {
+ return $this->stylesheet_url;
+ }
+
+ /**
+ * Get the array of available icons.
+ *
+ * @since 1.0.0
+ *
+ * @return array Available Font Awesome icons.
+ */
+ public function get_icons() {
+ return $this->icons;
+ }
+
+ /**
+ * Get the icon prefix ('fa' or 'icon').
+ *
+ * @since 1.0.0
+ *
+ * @return string Font Awesome prefix.
+ */
+ public function get_prefix() {
+ return $this->prefix;
+ }
+
+ /**
+ * Get version data for the remote jsDelivr CDN.
+ *
+ * @since 1.0.0
+ *
+ * @return object jsDelivr API data.
+ */
+ public function get_api_data() {
+ return $this->api_data;
+ }
+
+ /**
+ * Get errors.
+ *
+ * @since 1.0.0
+ *
+ * @return array All library errors that have occured.
+ */
+ public function get_errors() {
+ return $this->errors;
+ }
+
+}
+endif;
diff --git a/lib/better-font-awesome-library/css/admin-styles.css b/lib/better-font-awesome-library/css/admin-styles.css
new file mode 100644
index 0000000..ae72c46
--- /dev/null
+++ b/lib/better-font-awesome-library/css/admin-styles.css
@@ -0,0 +1,56 @@
+/**
+ * Better Font Awesome admin styles
+ *
+ * @package Better Font Awesome Library
+ * @author MIGHTYminnow & Mickey Kay
+ * @license GPL-2.0+
+ * @link https://github.com/MickeyKay/better-font-awesome-library
+ * @copyright 2014 MIGHTYminnow & Mickey Kay
+ */
+
+/**
+ * TinyMCE
+ */
+
+/* Override TinyMCE rules blocking these native Font Awesome styles */
+#menu_content_content_bfaSelect_menu .icon-fw,
+#menu_content_content_bfaSelect_menu .fa-fw,
+.mce-stack-layout-item .icon-fw,
+.mce-stack-layout-item .fa-fw {
+ display: inline-block;
+ width: 1.2857142857142858em;
+ text-align: center;
+}
+
+/* Override TinyMCE icon font family */
+.fa {
+ font-family: FontAwesome !important;
+}
+
+/* BFA select icon (for versions < TinyMCE 4) */
+[id*="bfaSelect_text"]:before {
+ content: "\f024";
+ margin-right: .5em;
+ font-family: FontAwesome;
+}
+
+/**
+ * Settings page
+ */
+
+.bfa-usage-text {
+ padding: 20px;
+ background-color: #fff;
+ border: 1px solid #efefef;
+}
+
+.bfa-usage-text h3 {
+ margin-top: 0;
+}
+
+.bfa-usage-text .fa,
+.bfa-usage-text .icon {
+ width: 40px;
+ text-align: center;
+ box-sizing: border-box;
+}
\ No newline at end of file
diff --git a/lib/better-font-awesome-library/js/tinymce-icons-old.js b/lib/better-font-awesome-library/js/tinymce-icons-old.js
new file mode 100644
index 0000000..b4e60e6
--- /dev/null
+++ b/lib/better-font-awesome-library/js/tinymce-icons-old.js
@@ -0,0 +1,43 @@
+(function() {
+
+ if( typeof bfa_vars != 'undefined' ) {
+ var icons = bfa_vars.fa_icons.split(',');
+ var prefix = bfa_vars.fa_prefix;
+
+ var icon_i = function(id) {
+ return ' ';
+ }
+
+ var icon_shortcode = function(id) {
+ return '[icon name="' + id + '" class=""]';
+ }
+
+ var createControl = function(name, controlManager) {
+ if (name != 'bfaSelect') return null;
+ var listBox = controlManager.createListBox('bfaSelect', {
+ title: 'Icons',
+ onselect: function(v) {
+ var editor = this.control_manager.editor;
+ if (v) {
+ editor.selection.setContent(icon_shortcode(v));
+ }
+ return false;
+ }
+ });
+
+ for (var i = 0; i < icons.length; i++) {
+ var _id = icons[i];
+ listBox.add(icon_i(_id) + ' ' + _id, _id);
+ }
+
+ return listBox;
+ };
+
+ tinymce.create('tinymce.plugins.bfa_plugin', {
+ createControl: createControl
+ });
+
+ tinymce.PluginManager.add('bfa_plugin', tinymce.plugins.bfa_plugin);
+
+ }
+})();
\ No newline at end of file
diff --git a/lib/better-font-awesome-library/js/tinymce-icons.js b/lib/better-font-awesome-library/js/tinymce-icons.js
new file mode 100644
index 0000000..2bd0a53
--- /dev/null
+++ b/lib/better-font-awesome-library/js/tinymce-icons.js
@@ -0,0 +1,48 @@
+( function() {
+ "use strict";
+
+ var icons = bfa_vars.fa_icons.split(',');
+ var prefix = bfa_vars.fa_prefix;
+
+ var icon_shortcode = function(id) {
+ return '[icon name="' + id + '" class=""]';
+ }
+
+ var bfaSelect = function( editor, url ) {
+ editor.addButton('bfaSelect', function() {
+ var values = [];
+
+ for (var i = 0; i < icons.length; i++) {
+ var _id = icons[i];
+ values.push({text: _id, value: _id, icon: ' fa fa-fw icon-fw fa-' + _id + ' icon-' + _id });
+ }
+
+ return {
+ type: 'listbox',
+ name: 'bfaSelect',
+ tooltip: 'Better Font Awesome Icons',
+ icon: ' fa fa-flag icon-flag',
+ text: 'Icons',
+ label: 'Select :',
+ fixedWidth: true,
+ values: values,
+ onselect: function(e) {
+ if (e) {
+ editor.insertContent(icon_shortcode(e.control.settings.value));
+ }
+
+ // Reset back to inital "Icons" text
+ this.value(null);
+
+ return false;
+ },
+ onPostRender: function() {
+ this.addClass('bfaSelect');
+ }
+
+ };
+ });
+
+ };
+ tinymce.PluginManager.add( 'bfa_plugin', bfaSelect );
+} )();
\ No newline at end of file
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/.npmignore b/lib/better-font-awesome-library/lib/fallback-font-awesome/.npmignore
new file mode 100644
index 0000000..54a691f
--- /dev/null
+++ b/lib/better-font-awesome-library/lib/fallback-font-awesome/.npmignore
@@ -0,0 +1,42 @@
+*.pyc
+*.egg-info
+*.db
+*.db.old
+*.swp
+*.db-journal
+
+.coverage
+.DS_Store
+.installed.cfg
+_gh_pages/*
+
+.idea/*
+.svn/*
+src/website/static/*
+src/website/media/*
+
+bin
+cfcache
+develop-eggs
+dist
+downloads
+eggs
+parts
+tmp
+.sass-cache
+node_modules
+
+src/website/settingslocal.py
+stunnel.log
+
+.ruby-version
+
+# don't need these in the npm package.
+src/
+_config.yml
+bower.json
+component.json
+composer.json
+CONTRIBUTING.md
+Gemfile
+Gemfile.lock
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/README.md b/lib/better-font-awesome-library/lib/fallback-font-awesome/README.md
new file mode 100644
index 0000000..bc7b1e9
--- /dev/null
+++ b/lib/better-font-awesome-library/lib/fallback-font-awesome/README.md
@@ -0,0 +1,7 @@
+# Font Awesome #
+This is a custom version of the Font Awesome repo pared down to only include:
+* package.json
+* /css
+* /fonts
+
+It is intended to be as small as possible while still including all of the necessary components to embed Font Awesome in a project.
\ No newline at end of file
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.css b/lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.css
new file mode 100755
index 0000000..4040b3c
--- /dev/null
+++ b/lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.css
@@ -0,0 +1,1672 @@
+/*!
+ * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('../fonts/fontawesome-webfont.eot?v=4.2.0');
+ src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
+}
+.fa-2x {
+ font-size: 2em;
+}
+.fa-3x {
+ font-size: 3em;
+}
+.fa-4x {
+ font-size: 4em;
+}
+.fa-5x {
+ font-size: 5em;
+}
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center;
+}
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none;
+}
+.fa-ul > li {
+ position: relative;
+}
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: 0.14285714em;
+ text-align: center;
+}
+.fa-li.fa-lg {
+ left: -1.85714286em;
+}
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eeeeee;
+ border-radius: .1em;
+}
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+.fa.pull-left {
+ margin-right: .3em;
+}
+.fa.pull-right {
+ margin-left: .3em;
+}
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+.fa-rotate-90 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.fa-rotate-180 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.fa-rotate-270 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ filter: none;
+}
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+.fa-stack-1x {
+ line-height: inherit;
+}
+.fa-stack-2x {
+ font-size: 2em;
+}
+.fa-inverse {
+ color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "\f000";
+}
+.fa-music:before {
+ content: "\f001";
+}
+.fa-search:before {
+ content: "\f002";
+}
+.fa-envelope-o:before {
+ content: "\f003";
+}
+.fa-heart:before {
+ content: "\f004";
+}
+.fa-star:before {
+ content: "\f005";
+}
+.fa-star-o:before {
+ content: "\f006";
+}
+.fa-user:before {
+ content: "\f007";
+}
+.fa-film:before {
+ content: "\f008";
+}
+.fa-th-large:before {
+ content: "\f009";
+}
+.fa-th:before {
+ content: "\f00a";
+}
+.fa-th-list:before {
+ content: "\f00b";
+}
+.fa-check:before {
+ content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "\f00d";
+}
+.fa-search-plus:before {
+ content: "\f00e";
+}
+.fa-search-minus:before {
+ content: "\f010";
+}
+.fa-power-off:before {
+ content: "\f011";
+}
+.fa-signal:before {
+ content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+ content: "\f013";
+}
+.fa-trash-o:before {
+ content: "\f014";
+}
+.fa-home:before {
+ content: "\f015";
+}
+.fa-file-o:before {
+ content: "\f016";
+}
+.fa-clock-o:before {
+ content: "\f017";
+}
+.fa-road:before {
+ content: "\f018";
+}
+.fa-download:before {
+ content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+ content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+ content: "\f01b";
+}
+.fa-inbox:before {
+ content: "\f01c";
+}
+.fa-play-circle-o:before {
+ content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "\f01e";
+}
+.fa-refresh:before {
+ content: "\f021";
+}
+.fa-list-alt:before {
+ content: "\f022";
+}
+.fa-lock:before {
+ content: "\f023";
+}
+.fa-flag:before {
+ content: "\f024";
+}
+.fa-headphones:before {
+ content: "\f025";
+}
+.fa-volume-off:before {
+ content: "\f026";
+}
+.fa-volume-down:before {
+ content: "\f027";
+}
+.fa-volume-up:before {
+ content: "\f028";
+}
+.fa-qrcode:before {
+ content: "\f029";
+}
+.fa-barcode:before {
+ content: "\f02a";
+}
+.fa-tag:before {
+ content: "\f02b";
+}
+.fa-tags:before {
+ content: "\f02c";
+}
+.fa-book:before {
+ content: "\f02d";
+}
+.fa-bookmark:before {
+ content: "\f02e";
+}
+.fa-print:before {
+ content: "\f02f";
+}
+.fa-camera:before {
+ content: "\f030";
+}
+.fa-font:before {
+ content: "\f031";
+}
+.fa-bold:before {
+ content: "\f032";
+}
+.fa-italic:before {
+ content: "\f033";
+}
+.fa-text-height:before {
+ content: "\f034";
+}
+.fa-text-width:before {
+ content: "\f035";
+}
+.fa-align-left:before {
+ content: "\f036";
+}
+.fa-align-center:before {
+ content: "\f037";
+}
+.fa-align-right:before {
+ content: "\f038";
+}
+.fa-align-justify:before {
+ content: "\f039";
+}
+.fa-list:before {
+ content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "\f03b";
+}
+.fa-indent:before {
+ content: "\f03c";
+}
+.fa-video-camera:before {
+ content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "\f03e";
+}
+.fa-pencil:before {
+ content: "\f040";
+}
+.fa-map-marker:before {
+ content: "\f041";
+}
+.fa-adjust:before {
+ content: "\f042";
+}
+.fa-tint:before {
+ content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "\f044";
+}
+.fa-share-square-o:before {
+ content: "\f045";
+}
+.fa-check-square-o:before {
+ content: "\f046";
+}
+.fa-arrows:before {
+ content: "\f047";
+}
+.fa-step-backward:before {
+ content: "\f048";
+}
+.fa-fast-backward:before {
+ content: "\f049";
+}
+.fa-backward:before {
+ content: "\f04a";
+}
+.fa-play:before {
+ content: "\f04b";
+}
+.fa-pause:before {
+ content: "\f04c";
+}
+.fa-stop:before {
+ content: "\f04d";
+}
+.fa-forward:before {
+ content: "\f04e";
+}
+.fa-fast-forward:before {
+ content: "\f050";
+}
+.fa-step-forward:before {
+ content: "\f051";
+}
+.fa-eject:before {
+ content: "\f052";
+}
+.fa-chevron-left:before {
+ content: "\f053";
+}
+.fa-chevron-right:before {
+ content: "\f054";
+}
+.fa-plus-circle:before {
+ content: "\f055";
+}
+.fa-minus-circle:before {
+ content: "\f056";
+}
+.fa-times-circle:before {
+ content: "\f057";
+}
+.fa-check-circle:before {
+ content: "\f058";
+}
+.fa-question-circle:before {
+ content: "\f059";
+}
+.fa-info-circle:before {
+ content: "\f05a";
+}
+.fa-crosshairs:before {
+ content: "\f05b";
+}
+.fa-times-circle-o:before {
+ content: "\f05c";
+}
+.fa-check-circle-o:before {
+ content: "\f05d";
+}
+.fa-ban:before {
+ content: "\f05e";
+}
+.fa-arrow-left:before {
+ content: "\f060";
+}
+.fa-arrow-right:before {
+ content: "\f061";
+}
+.fa-arrow-up:before {
+ content: "\f062";
+}
+.fa-arrow-down:before {
+ content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "\f064";
+}
+.fa-expand:before {
+ content: "\f065";
+}
+.fa-compress:before {
+ content: "\f066";
+}
+.fa-plus:before {
+ content: "\f067";
+}
+.fa-minus:before {
+ content: "\f068";
+}
+.fa-asterisk:before {
+ content: "\f069";
+}
+.fa-exclamation-circle:before {
+ content: "\f06a";
+}
+.fa-gift:before {
+ content: "\f06b";
+}
+.fa-leaf:before {
+ content: "\f06c";
+}
+.fa-fire:before {
+ content: "\f06d";
+}
+.fa-eye:before {
+ content: "\f06e";
+}
+.fa-eye-slash:before {
+ content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "\f071";
+}
+.fa-plane:before {
+ content: "\f072";
+}
+.fa-calendar:before {
+ content: "\f073";
+}
+.fa-random:before {
+ content: "\f074";
+}
+.fa-comment:before {
+ content: "\f075";
+}
+.fa-magnet:before {
+ content: "\f076";
+}
+.fa-chevron-up:before {
+ content: "\f077";
+}
+.fa-chevron-down:before {
+ content: "\f078";
+}
+.fa-retweet:before {
+ content: "\f079";
+}
+.fa-shopping-cart:before {
+ content: "\f07a";
+}
+.fa-folder:before {
+ content: "\f07b";
+}
+.fa-folder-open:before {
+ content: "\f07c";
+}
+.fa-arrows-v:before {
+ content: "\f07d";
+}
+.fa-arrows-h:before {
+ content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "\f080";
+}
+.fa-twitter-square:before {
+ content: "\f081";
+}
+.fa-facebook-square:before {
+ content: "\f082";
+}
+.fa-camera-retro:before {
+ content: "\f083";
+}
+.fa-key:before {
+ content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+ content: "\f085";
+}
+.fa-comments:before {
+ content: "\f086";
+}
+.fa-thumbs-o-up:before {
+ content: "\f087";
+}
+.fa-thumbs-o-down:before {
+ content: "\f088";
+}
+.fa-star-half:before {
+ content: "\f089";
+}
+.fa-heart-o:before {
+ content: "\f08a";
+}
+.fa-sign-out:before {
+ content: "\f08b";
+}
+.fa-linkedin-square:before {
+ content: "\f08c";
+}
+.fa-thumb-tack:before {
+ content: "\f08d";
+}
+.fa-external-link:before {
+ content: "\f08e";
+}
+.fa-sign-in:before {
+ content: "\f090";
+}
+.fa-trophy:before {
+ content: "\f091";
+}
+.fa-github-square:before {
+ content: "\f092";
+}
+.fa-upload:before {
+ content: "\f093";
+}
+.fa-lemon-o:before {
+ content: "\f094";
+}
+.fa-phone:before {
+ content: "\f095";
+}
+.fa-square-o:before {
+ content: "\f096";
+}
+.fa-bookmark-o:before {
+ content: "\f097";
+}
+.fa-phone-square:before {
+ content: "\f098";
+}
+.fa-twitter:before {
+ content: "\f099";
+}
+.fa-facebook:before {
+ content: "\f09a";
+}
+.fa-github:before {
+ content: "\f09b";
+}
+.fa-unlock:before {
+ content: "\f09c";
+}
+.fa-credit-card:before {
+ content: "\f09d";
+}
+.fa-rss:before {
+ content: "\f09e";
+}
+.fa-hdd-o:before {
+ content: "\f0a0";
+}
+.fa-bullhorn:before {
+ content: "\f0a1";
+}
+.fa-bell:before {
+ content: "\f0f3";
+}
+.fa-certificate:before {
+ content: "\f0a3";
+}
+.fa-hand-o-right:before {
+ content: "\f0a4";
+}
+.fa-hand-o-left:before {
+ content: "\f0a5";
+}
+.fa-hand-o-up:before {
+ content: "\f0a6";
+}
+.fa-hand-o-down:before {
+ content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+ content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+ content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+ content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+ content: "\f0ab";
+}
+.fa-globe:before {
+ content: "\f0ac";
+}
+.fa-wrench:before {
+ content: "\f0ad";
+}
+.fa-tasks:before {
+ content: "\f0ae";
+}
+.fa-filter:before {
+ content: "\f0b0";
+}
+.fa-briefcase:before {
+ content: "\f0b1";
+}
+.fa-arrows-alt:before {
+ content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+ content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+ content: "\f0c1";
+}
+.fa-cloud:before {
+ content: "\f0c2";
+}
+.fa-flask:before {
+ content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+ content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+ content: "\f0c5";
+}
+.fa-paperclip:before {
+ content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "\f0c7";
+}
+.fa-square:before {
+ content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "\f0c9";
+}
+.fa-list-ul:before {
+ content: "\f0ca";
+}
+.fa-list-ol:before {
+ content: "\f0cb";
+}
+.fa-strikethrough:before {
+ content: "\f0cc";
+}
+.fa-underline:before {
+ content: "\f0cd";
+}
+.fa-table:before {
+ content: "\f0ce";
+}
+.fa-magic:before {
+ content: "\f0d0";
+}
+.fa-truck:before {
+ content: "\f0d1";
+}
+.fa-pinterest:before {
+ content: "\f0d2";
+}
+.fa-pinterest-square:before {
+ content: "\f0d3";
+}
+.fa-google-plus-square:before {
+ content: "\f0d4";
+}
+.fa-google-plus:before {
+ content: "\f0d5";
+}
+.fa-money:before {
+ content: "\f0d6";
+}
+.fa-caret-down:before {
+ content: "\f0d7";
+}
+.fa-caret-up:before {
+ content: "\f0d8";
+}
+.fa-caret-left:before {
+ content: "\f0d9";
+}
+.fa-caret-right:before {
+ content: "\f0da";
+}
+.fa-columns:before {
+ content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "\f0de";
+}
+.fa-envelope:before {
+ content: "\f0e0";
+}
+.fa-linkedin:before {
+ content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+ content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "\f0e4";
+}
+.fa-comment-o:before {
+ content: "\f0e5";
+}
+.fa-comments-o:before {
+ content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+ content: "\f0e7";
+}
+.fa-sitemap:before {
+ content: "\f0e8";
+}
+.fa-umbrella:before {
+ content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+ content: "\f0eb";
+}
+.fa-exchange:before {
+ content: "\f0ec";
+}
+.fa-cloud-download:before {
+ content: "\f0ed";
+}
+.fa-cloud-upload:before {
+ content: "\f0ee";
+}
+.fa-user-md:before {
+ content: "\f0f0";
+}
+.fa-stethoscope:before {
+ content: "\f0f1";
+}
+.fa-suitcase:before {
+ content: "\f0f2";
+}
+.fa-bell-o:before {
+ content: "\f0a2";
+}
+.fa-coffee:before {
+ content: "\f0f4";
+}
+.fa-cutlery:before {
+ content: "\f0f5";
+}
+.fa-file-text-o:before {
+ content: "\f0f6";
+}
+.fa-building-o:before {
+ content: "\f0f7";
+}
+.fa-hospital-o:before {
+ content: "\f0f8";
+}
+.fa-ambulance:before {
+ content: "\f0f9";
+}
+.fa-medkit:before {
+ content: "\f0fa";
+}
+.fa-fighter-jet:before {
+ content: "\f0fb";
+}
+.fa-beer:before {
+ content: "\f0fc";
+}
+.fa-h-square:before {
+ content: "\f0fd";
+}
+.fa-plus-square:before {
+ content: "\f0fe";
+}
+.fa-angle-double-left:before {
+ content: "\f100";
+}
+.fa-angle-double-right:before {
+ content: "\f101";
+}
+.fa-angle-double-up:before {
+ content: "\f102";
+}
+.fa-angle-double-down:before {
+ content: "\f103";
+}
+.fa-angle-left:before {
+ content: "\f104";
+}
+.fa-angle-right:before {
+ content: "\f105";
+}
+.fa-angle-up:before {
+ content: "\f106";
+}
+.fa-angle-down:before {
+ content: "\f107";
+}
+.fa-desktop:before {
+ content: "\f108";
+}
+.fa-laptop:before {
+ content: "\f109";
+}
+.fa-tablet:before {
+ content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "\f10b";
+}
+.fa-circle-o:before {
+ content: "\f10c";
+}
+.fa-quote-left:before {
+ content: "\f10d";
+}
+.fa-quote-right:before {
+ content: "\f10e";
+}
+.fa-spinner:before {
+ content: "\f110";
+}
+.fa-circle:before {
+ content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "\f112";
+}
+.fa-github-alt:before {
+ content: "\f113";
+}
+.fa-folder-o:before {
+ content: "\f114";
+}
+.fa-folder-open-o:before {
+ content: "\f115";
+}
+.fa-smile-o:before {
+ content: "\f118";
+}
+.fa-frown-o:before {
+ content: "\f119";
+}
+.fa-meh-o:before {
+ content: "\f11a";
+}
+.fa-gamepad:before {
+ content: "\f11b";
+}
+.fa-keyboard-o:before {
+ content: "\f11c";
+}
+.fa-flag-o:before {
+ content: "\f11d";
+}
+.fa-flag-checkered:before {
+ content: "\f11e";
+}
+.fa-terminal:before {
+ content: "\f120";
+}
+.fa-code:before {
+ content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "\f123";
+}
+.fa-location-arrow:before {
+ content: "\f124";
+}
+.fa-crop:before {
+ content: "\f125";
+}
+.fa-code-fork:before {
+ content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "\f127";
+}
+.fa-question:before {
+ content: "\f128";
+}
+.fa-info:before {
+ content: "\f129";
+}
+.fa-exclamation:before {
+ content: "\f12a";
+}
+.fa-superscript:before {
+ content: "\f12b";
+}
+.fa-subscript:before {
+ content: "\f12c";
+}
+.fa-eraser:before {
+ content: "\f12d";
+}
+.fa-puzzle-piece:before {
+ content: "\f12e";
+}
+.fa-microphone:before {
+ content: "\f130";
+}
+.fa-microphone-slash:before {
+ content: "\f131";
+}
+.fa-shield:before {
+ content: "\f132";
+}
+.fa-calendar-o:before {
+ content: "\f133";
+}
+.fa-fire-extinguisher:before {
+ content: "\f134";
+}
+.fa-rocket:before {
+ content: "\f135";
+}
+.fa-maxcdn:before {
+ content: "\f136";
+}
+.fa-chevron-circle-left:before {
+ content: "\f137";
+}
+.fa-chevron-circle-right:before {
+ content: "\f138";
+}
+.fa-chevron-circle-up:before {
+ content: "\f139";
+}
+.fa-chevron-circle-down:before {
+ content: "\f13a";
+}
+.fa-html5:before {
+ content: "\f13b";
+}
+.fa-css3:before {
+ content: "\f13c";
+}
+.fa-anchor:before {
+ content: "\f13d";
+}
+.fa-unlock-alt:before {
+ content: "\f13e";
+}
+.fa-bullseye:before {
+ content: "\f140";
+}
+.fa-ellipsis-h:before {
+ content: "\f141";
+}
+.fa-ellipsis-v:before {
+ content: "\f142";
+}
+.fa-rss-square:before {
+ content: "\f143";
+}
+.fa-play-circle:before {
+ content: "\f144";
+}
+.fa-ticket:before {
+ content: "\f145";
+}
+.fa-minus-square:before {
+ content: "\f146";
+}
+.fa-minus-square-o:before {
+ content: "\f147";
+}
+.fa-level-up:before {
+ content: "\f148";
+}
+.fa-level-down:before {
+ content: "\f149";
+}
+.fa-check-square:before {
+ content: "\f14a";
+}
+.fa-pencil-square:before {
+ content: "\f14b";
+}
+.fa-external-link-square:before {
+ content: "\f14c";
+}
+.fa-share-square:before {
+ content: "\f14d";
+}
+.fa-compass:before {
+ content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+ content: "\f153";
+}
+.fa-gbp:before {
+ content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+ content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+ content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+ content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "\f15a";
+}
+.fa-file:before {
+ content: "\f15b";
+}
+.fa-file-text:before {
+ content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+ content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+ content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+ content: "\f160";
+}
+.fa-sort-amount-desc:before {
+ content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+ content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+ content: "\f163";
+}
+.fa-thumbs-up:before {
+ content: "\f164";
+}
+.fa-thumbs-down:before {
+ content: "\f165";
+}
+.fa-youtube-square:before {
+ content: "\f166";
+}
+.fa-youtube:before {
+ content: "\f167";
+}
+.fa-xing:before {
+ content: "\f168";
+}
+.fa-xing-square:before {
+ content: "\f169";
+}
+.fa-youtube-play:before {
+ content: "\f16a";
+}
+.fa-dropbox:before {
+ content: "\f16b";
+}
+.fa-stack-overflow:before {
+ content: "\f16c";
+}
+.fa-instagram:before {
+ content: "\f16d";
+}
+.fa-flickr:before {
+ content: "\f16e";
+}
+.fa-adn:before {
+ content: "\f170";
+}
+.fa-bitbucket:before {
+ content: "\f171";
+}
+.fa-bitbucket-square:before {
+ content: "\f172";
+}
+.fa-tumblr:before {
+ content: "\f173";
+}
+.fa-tumblr-square:before {
+ content: "\f174";
+}
+.fa-long-arrow-down:before {
+ content: "\f175";
+}
+.fa-long-arrow-up:before {
+ content: "\f176";
+}
+.fa-long-arrow-left:before {
+ content: "\f177";
+}
+.fa-long-arrow-right:before {
+ content: "\f178";
+}
+.fa-apple:before {
+ content: "\f179";
+}
+.fa-windows:before {
+ content: "\f17a";
+}
+.fa-android:before {
+ content: "\f17b";
+}
+.fa-linux:before {
+ content: "\f17c";
+}
+.fa-dribbble:before {
+ content: "\f17d";
+}
+.fa-skype:before {
+ content: "\f17e";
+}
+.fa-foursquare:before {
+ content: "\f180";
+}
+.fa-trello:before {
+ content: "\f181";
+}
+.fa-female:before {
+ content: "\f182";
+}
+.fa-male:before {
+ content: "\f183";
+}
+.fa-gittip:before {
+ content: "\f184";
+}
+.fa-sun-o:before {
+ content: "\f185";
+}
+.fa-moon-o:before {
+ content: "\f186";
+}
+.fa-archive:before {
+ content: "\f187";
+}
+.fa-bug:before {
+ content: "\f188";
+}
+.fa-vk:before {
+ content: "\f189";
+}
+.fa-weibo:before {
+ content: "\f18a";
+}
+.fa-renren:before {
+ content: "\f18b";
+}
+.fa-pagelines:before {
+ content: "\f18c";
+}
+.fa-stack-exchange:before {
+ content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+ content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+ content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "\f191";
+}
+.fa-dot-circle-o:before {
+ content: "\f192";
+}
+.fa-wheelchair:before {
+ content: "\f193";
+}
+.fa-vimeo-square:before {
+ content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "\f195";
+}
+.fa-plus-square-o:before {
+ content: "\f196";
+}
+.fa-space-shuttle:before {
+ content: "\f197";
+}
+.fa-slack:before {
+ content: "\f198";
+}
+.fa-envelope-square:before {
+ content: "\f199";
+}
+.fa-wordpress:before {
+ content: "\f19a";
+}
+.fa-openid:before {
+ content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "\f19d";
+}
+.fa-yahoo:before {
+ content: "\f19e";
+}
+.fa-google:before {
+ content: "\f1a0";
+}
+.fa-reddit:before {
+ content: "\f1a1";
+}
+.fa-reddit-square:before {
+ content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+ content: "\f1a3";
+}
+.fa-stumbleupon:before {
+ content: "\f1a4";
+}
+.fa-delicious:before {
+ content: "\f1a5";
+}
+.fa-digg:before {
+ content: "\f1a6";
+}
+.fa-pied-piper:before {
+ content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+ content: "\f1a8";
+}
+.fa-drupal:before {
+ content: "\f1a9";
+}
+.fa-joomla:before {
+ content: "\f1aa";
+}
+.fa-language:before {
+ content: "\f1ab";
+}
+.fa-fax:before {
+ content: "\f1ac";
+}
+.fa-building:before {
+ content: "\f1ad";
+}
+.fa-child:before {
+ content: "\f1ae";
+}
+.fa-paw:before {
+ content: "\f1b0";
+}
+.fa-spoon:before {
+ content: "\f1b1";
+}
+.fa-cube:before {
+ content: "\f1b2";
+}
+.fa-cubes:before {
+ content: "\f1b3";
+}
+.fa-behance:before {
+ content: "\f1b4";
+}
+.fa-behance-square:before {
+ content: "\f1b5";
+}
+.fa-steam:before {
+ content: "\f1b6";
+}
+.fa-steam-square:before {
+ content: "\f1b7";
+}
+.fa-recycle:before {
+ content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+ content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+ content: "\f1ba";
+}
+.fa-tree:before {
+ content: "\f1bb";
+}
+.fa-spotify:before {
+ content: "\f1bc";
+}
+.fa-deviantart:before {
+ content: "\f1bd";
+}
+.fa-soundcloud:before {
+ content: "\f1be";
+}
+.fa-database:before {
+ content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+ content: "\f1c1";
+}
+.fa-file-word-o:before {
+ content: "\f1c2";
+}
+.fa-file-excel-o:before {
+ content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+ content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "\f1c8";
+}
+.fa-file-code-o:before {
+ content: "\f1c9";
+}
+.fa-vine:before {
+ content: "\f1ca";
+}
+.fa-codepen:before {
+ content: "\f1cb";
+}
+.fa-jsfiddle:before {
+ content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+ content: "\f1ce";
+}
+.fa-ra:before,
+.fa-rebel:before {
+ content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+ content: "\f1d1";
+}
+.fa-git-square:before {
+ content: "\f1d2";
+}
+.fa-git:before {
+ content: "\f1d3";
+}
+.fa-hacker-news:before {
+ content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+ content: "\f1d5";
+}
+.fa-qq:before {
+ content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "\f1d9";
+}
+.fa-history:before {
+ content: "\f1da";
+}
+.fa-circle-thin:before {
+ content: "\f1db";
+}
+.fa-header:before {
+ content: "\f1dc";
+}
+.fa-paragraph:before {
+ content: "\f1dd";
+}
+.fa-sliders:before {
+ content: "\f1de";
+}
+.fa-share-alt:before {
+ content: "\f1e0";
+}
+.fa-share-alt-square:before {
+ content: "\f1e1";
+}
+.fa-bomb:before {
+ content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "\f1e3";
+}
+.fa-tty:before {
+ content: "\f1e4";
+}
+.fa-binoculars:before {
+ content: "\f1e5";
+}
+.fa-plug:before {
+ content: "\f1e6";
+}
+.fa-slideshare:before {
+ content: "\f1e7";
+}
+.fa-twitch:before {
+ content: "\f1e8";
+}
+.fa-yelp:before {
+ content: "\f1e9";
+}
+.fa-newspaper-o:before {
+ content: "\f1ea";
+}
+.fa-wifi:before {
+ content: "\f1eb";
+}
+.fa-calculator:before {
+ content: "\f1ec";
+}
+.fa-paypal:before {
+ content: "\f1ed";
+}
+.fa-google-wallet:before {
+ content: "\f1ee";
+}
+.fa-cc-visa:before {
+ content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+ content: "\f1f1";
+}
+.fa-cc-discover:before {
+ content: "\f1f2";
+}
+.fa-cc-amex:before {
+ content: "\f1f3";
+}
+.fa-cc-paypal:before {
+ content: "\f1f4";
+}
+.fa-cc-stripe:before {
+ content: "\f1f5";
+}
+.fa-bell-slash:before {
+ content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+ content: "\f1f7";
+}
+.fa-trash:before {
+ content: "\f1f8";
+}
+.fa-copyright:before {
+ content: "\f1f9";
+}
+.fa-at:before {
+ content: "\f1fa";
+}
+.fa-eyedropper:before {
+ content: "\f1fb";
+}
+.fa-paint-brush:before {
+ content: "\f1fc";
+}
+.fa-birthday-cake:before {
+ content: "\f1fd";
+}
+.fa-area-chart:before {
+ content: "\f1fe";
+}
+.fa-pie-chart:before {
+ content: "\f200";
+}
+.fa-line-chart:before {
+ content: "\f201";
+}
+.fa-lastfm:before {
+ content: "\f202";
+}
+.fa-lastfm-square:before {
+ content: "\f203";
+}
+.fa-toggle-off:before {
+ content: "\f204";
+}
+.fa-toggle-on:before {
+ content: "\f205";
+}
+.fa-bicycle:before {
+ content: "\f206";
+}
+.fa-bus:before {
+ content: "\f207";
+}
+.fa-ioxhost:before {
+ content: "\f208";
+}
+.fa-angellist:before {
+ content: "\f209";
+}
+.fa-cc:before {
+ content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "\f20b";
+}
+.fa-meanpath:before {
+ content: "\f20c";
+}
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.min.css b/lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.min.css
new file mode 100755
index 0000000..ec53d4d
--- /dev/null
+++ b/lib/better-font-awesome-library/lib/fallback-font-awesome/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}
\ No newline at end of file
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/FontAwesome.otf b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/FontAwesome.otf
new file mode 100755
index 0000000000000000000000000000000000000000..81c9ad949b47f64afeca5642ee2494b6e3147f44
GIT binary patch
literal 85908
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