diff --git a/README.md b/README.md
index 290a8a6..d6e0fe9 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,12 @@
Trestle
+<<<<<<< HEAD
---------------------
+=======
+=======
+>>>>>>> dev
### 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/)
@@ -32,7 +37,18 @@ Here are some of Trestle's many features, check out the [Trestle Demo](http://de
* Add in Grunt support for:
* Sass
* Auto-ordering of CSS
+* 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:
+ * 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)
+* 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
diff --git a/functions.php b/functions.php
index 5145f37..2329937 100644
--- a/functions.php
+++ b/functions.php
@@ -1,117 +1,61 @@
'solid',
+ 'logo_url' => '',
+ 'logo_url_mobile' => '',
+ 'favicon_url' => '',
+ 'nav_primary_location' => 'full',
+ 'search_in_nav' => '',
+ 'read_more_text' => __( 'Read More »', 'trestle' ),
+ 'revisions_number' => 3,
+ 'footer_widgets_number' => 3,
+ 'external_link_icons' => 0,
+ 'email_link_icons' => 0,
+ 'pdf_link_icons' => 0,
+ 'doc_link_icons' => 0,
+ );
+
+ // Populate Trestle settings with default values if they don't yet exist.
+ $options = get_option( TRESTLE_SETTINGS_FIELD );
+
+ // Set up an empty array if we're running for the first time.
+ if ( ! $options ) {
+ $options = array();
+ }
+
+ // Bail early if the settings match the defaults.
+ if ( $options === $trestle_defaults ) {
+ return;
+ }
+
+ // Populate any defaults that are missing.
+ foreach ( $trestle_defaults as $k => $v ) {
+
+ // Check each key to only add the missing settings.
+ if ( ! array_key_exists( $k, $options ) ) {
+ $options[$k] = $v;
+ }
+ }
+
+ // Update options with defaults.
+ update_option( TRESTLE_SETTINGS_FIELD, $options );
+
+}
+
+/**
+ * Wrapper function to get Trestle options.
+ *
+ * @since 2.0.0
+ * @uses genesis_get_option()
+ *
+ * @return mixed Trestle option value.
+ */
+function trestle_get_option( $key, $setting = null, $use_cache = true ) {
+
+ // Set default to TRESTLE_SETTINGS_FIELD.
+ $setting = $setting ? $setting : TRESTLE_SETTINGS_FIELD;
+
+ return genesis_get_option( $key, $setting, false );
+
+}
+
+add_action( 'admin_enqueue_scripts', 'trestle_admin_actions' );
+/**
+ * Loads admin scripts and styles.
+ *
+ * @since 1.0.0
+ */
+function trestle_admin_actions() {
+
+ // Include the main stylesheet in the editor
+ add_editor_style( get_stylesheet_uri() );
+
+}
+
+add_action( 'tgmpa_register', 'trestle_register_required_plugins' );
+/**
+ * Loads required & recommended plugins.
+ *
+ * Utilizes TGM Plugin Activation class:
+ * https://github.com/thomasgriffin/TGM-Plugin-Activation
+ *
+ * @since 1.0.0
+ *
+ * @see tgmpa() in /includes/classes/class-tgm-plugin-activation.php
+ */
+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',
+ 'required' => true,
+ ),
+
+ // Optional plugins
+ array(
+ 'name' => 'Black Studio TinyMCE Widget',
+ 'slug' => 'black-studio-tinymce-widget',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Equal Height Columns',
+ 'slug' => 'equal-height-columns',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Events Manager',
+ 'slug' => 'events-manager',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Exclude Pages',
+ 'slug' => 'exclude-pages',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Facebook Open Graph Meta Tags for WordPress',
+ 'slug' => 'wonderm00ns-simple-facebook-open-graph-tags',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Easy FancyBox',
+ 'slug' => 'easy-fancybox',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Genesis Featured Widget Amplified',
+ 'slug' => 'genesis-featured-widget-amplified',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Genesis Simple Edits',
+ 'slug' => 'genesis-simple-edits',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Google Analytics for WordPress',
+ 'slug' => 'google-analytics-for-wordpress',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Jetpack by WordPress.com',
+ 'slug' => 'jetpack',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'MapPress Easy Google Maps',
+ 'slug' => 'mappress-google-maps-for-wordpress',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'My Page Order',
+ 'slug' => 'my-page-order',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'NextGen Gallery',
+ 'slug' => 'nextgen-gallery',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Post Thumbnail Editor',
+ 'slug' => 'post-thumbnail-editor',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Post Types Order',
+ 'slug' => 'post-types-order',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Responsive Video Embeds',
+ 'slug' => 'responsive-video-embeds',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Social Media Widget',
+ 'slug' => 'social-media-widget',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Widget Context',
+ 'slug' => 'widget-context',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Simple Image Sizes',
+ 'slug' => 'simple-image-sizes',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Simple Section Navigation',
+ 'slug' => 'simple-section-navigation',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'Types - Custom Fields and Custom Post Types Management',
+ 'slug' => 'types',
+ 'required' => false,
+ ),
+
+ array(
+ 'name' => 'WP Hotkeys',
+ 'slug' => 'wp-hotkeys',
+ 'required' => false,
+ ),
+ );
+
+ // Change this to your theme text domain, used for internationalising strings.
+ $theme_text_domain = 'mightyminnow';
+
+ /**
+ * Array of configuration settings. Amend each line as needed.
+ * If you want the default strings to be available under your own theme domain,
+ * leave the strings uncommented.
+ * Some of the strings are added into a sprintf, so see the comments at the
+ * end of each line for what each argument will be.
+ */
+ $config = array(
+ 'domain' => $theme_text_domain, // Text domain - likely want to be the same as your theme.
+ 'default_path' => '', // Default absolute path to pre-packaged plugins
+ 'parent_menu_slug' => 'themes.php', // Default parent menu slug
+ 'parent_url_slug' => 'themes.php', // Default parent URL slug
+ 'menu' => 'install-required-plugins', // Menu slug
+ 'has_notices' => true, // Show admin notices or not
+ 'is_automatic' => true, // Automatically activate plugins after installation or not
+ 'message' => '', // Message to output right before the plugins table
+ 'strings' => array(
+ 'page_title' => __( 'Install Required Plugins', $theme_text_domain ),
+ 'menu_title' => __( 'Install Plugins', $theme_text_domain ),
+ 'installing' => __( 'Installing Plugin: %s', $theme_text_domain ), // %1$s = plugin name
+ 'oops' => __( 'Something went wrong with the plugin API.', $theme_text_domain ),
+ 'notice_can_install_required' => _n_noop( 'This theme requires the following plugin: %1$s.', 'This theme requires the following plugins: %1$s.' ), // %1$s = plugin name(s)
+ 'notice_can_install_recommended' => _n_noop( 'Recommended plugin: %1$s.', 'Recommended plugins: %1$s.' ), // %1$s = plugin name(s)
+ 'notice_cannot_install' => _n_noop( 'Sorry, but you do not have the correct permissions to install the %s plugin. Contact the administrator of this site for help on getting the plugin installed.', 'Sorry, but you do not have the correct permissions to install the %s plugins. Contact the administrator of this site for help on getting the plugins installed.' ), // %1$s = plugin name(s)
+ 'notice_can_activate_required' => _n_noop( 'The following required plugin is currently inactive: %1$s.', 'The following required plugins are currently inactive: %1$s.' ), // %1$s = plugin name(s)
+ 'notice_can_activate_recommended' => _n_noop( 'The following recommended plugin is currently inactive: %1$s.', 'The following recommended plugins are currently inactive: %1$s.' ), // %1$s = plugin name(s)
+ 'notice_cannot_activate' => _n_noop( 'Sorry, but you do not have the correct permissions to activate the %s plugin. Contact the administrator of this site for help on getting the plugin activated.', 'Sorry, but you do not have the correct permissions to activate the %s plugins. Contact the administrator of this site for help on getting the plugins activated.' ), // %1$s = plugin name(s)
+ 'notice_ask_to_update' => _n_noop( 'The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s.', 'The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s.' ), // %1$s = plugin name(s)
+ 'notice_cannot_update' => _n_noop( 'Sorry, but you do not have the correct permissions to update the %s plugin. Contact the administrator of this site for help on getting the plugin updated.', 'Sorry, but you do not have the correct permissions to update the %s plugins. Contact the administrator of this site for help on getting the plugins updated.' ), // %1$s = plugin name(s)
+ 'install_link' => _n_noop( 'Begin installing plugin', 'Begin installing plugins' ),
+ 'activate_link' => _n_noop( 'Activate installed plugin', 'Activate installed plugins' ),
+ 'return' => __( 'Return to Required Plugins Installer', $theme_text_domain ),
+ 'plugin_activated' => __( 'Plugin activated successfully.', $theme_text_domain ),
+ 'complete' => __( 'All plugins installed and activated successfully. %s', $theme_text_domain ), // %1$s = dashboard link
+ 'nag_type' => 'updated' // Determines admin notice type - can only be 'updated' or 'error'
+ )
+ );
+
+ tgmpa( $plugins, $config );
+}
\ No newline at end of file
diff --git a/includes/admin/customizer.php b/includes/admin/customizer.php
new file mode 100644
index 0000000..72d6cb3
--- /dev/null
+++ b/includes/admin/customizer.php
@@ -0,0 +1,338 @@
+add_section(
+ 'trestle_settings_section',
+ array(
+ 'title' => __( 'Trestle Settings', 'trestle' ),
+ 'priority' => 160,
+ )
+ );
+
+ // Layout.
+ $wp_customize->add_setting(
+ 'trestle-settings[layout]',
+ array(
+ 'default' => trestle_get_option( 'layout' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_layout_control',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[layout]',
+ 'label' => __( 'Layout', 'trestle' ),
+ 'type' => 'radio',
+ 'choices' => array(
+ 'bubble' => __( 'Bubble', 'trestle' ),
+ 'solid' => __( 'Solid', 'trestle' ),
+ )
+ )
+ );
+
+ // Upload a logo.
+ $wp_customize->add_setting(
+ 'trestle-settings[logo_url]',
+ array(
+ 'default' => trestle_get_option( 'logo_url' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ 'sanitize_callback' => 'esc_url_raw',
+ )
+ );
+ $wp_customize->add_control(
+ new WP_Customize_Image_Control(
+ $wp_customize,
+ 'trestle_logo_control',
+ array(
+ 'label' => __( 'Upload a logo', 'trestle' ),
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[logo_url]',
+ )
+ )
+ );
+
+ // Upload a mobile logo.
+ $wp_customize->add_setting(
+ 'trestle-settings[logo_url_mobile]',
+ array(
+ 'default' => trestle_get_option( 'logo_url_mobile' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ 'sanitize_callback' => 'esc_url_raw',
+ )
+ );
+ $wp_customize->add_control(
+ new WP_Customize_Image_Control(
+ $wp_customize,
+ 'trestle_mobile_logo_control',
+ array(
+ 'label' => __( 'Upload a mobile logo', 'trestle' ),
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[logo_url_mobile]',
+ )
+ )
+ );
+
+ // Upload a mobile logo.
+ $wp_customize->add_setting(
+ 'trestle-settings[favicon_url]',
+ array(
+ 'default' => trestle_get_option( 'favicon_url' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ 'sanitize_callback' => 'esc_url_raw',
+ )
+ );
+ $wp_customize->add_control(
+ new WP_Customize_Image_Control(
+ $wp_customize,
+ 'trestle_favicon_control',
+ array(
+ 'label' => __( 'Upload a favicon', 'trestle' ),
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[favicon_url]',
+ )
+ )
+ );
+
+ // Primary nav style.
+ $wp_customize->add_setting(
+ 'trestle-settings[nav_primary_location]',
+ array(
+ 'default' => trestle_get_option( 'nav_primary_location' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_nav_primary_location_control',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[nav_primary_location]',
+ 'label' => __( 'Menu style', 'trestle' ),
+ 'type' => 'select',
+ 'choices' => array(
+ 'full' => __( 'Full Width', 'trestle' ),
+ 'header' => __( 'Header Right', 'trestle' ),
+ )
+ )
+ );
+
+ // Primary nav extras.
+ $wp_customize->add_setting(
+ 'trestle-settings[search_in_nav]',
+ array(
+ 'default' => trestle_get_option( 'search_in_nav' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_search_in_nav_control',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[search_in_nav]',
+ 'label' => __( 'Add search to mobile navigation', 'trestle' ),
+ 'type' => 'checkbox',
+ )
+ );
+
+ // Blog post custom read more link text.
+ $wp_customize->add_setting(
+ 'trestle-settings[read_more_text]',
+ array(
+ 'default' => trestle_get_option( 'read_more_text' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ 'sanitize_callback' => 'wp_kses_post',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_read_more_text_control',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[read_more_text]',
+ 'label' => __( 'Custom read more link text', 'trestle' ),
+ )
+ );
+
+ // Post revisions number.
+ $wp_customize->add_setting(
+ 'trestle-settings[revisions_number]',
+ array(
+ 'default' => trestle_get_option( 'revisions_number' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_revisions_number_control',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[revisions_number]',
+ 'label' => __( 'Number of post revisions', 'trestle' ),
+ 'type' => 'select',
+ 'choices' => array(
+ '-1' => __( 'Unlimited', 'trestle' ),
+ '0' => '0',
+ '1' => '1',
+ '2' => '2',
+ '3' => '3',
+ '4' => '4',
+ '5' => '5',
+ '6' => '6',
+ '7' => '7',
+ '8' => '8',
+ '9' => '9',
+ '10' => '10',
+ )
+ )
+ );
+
+ // Footer Widget Areas.
+ $wp_customize->add_setting(
+ 'trestle-settings[footer_widgets_number]',
+ array(
+ 'default' => trestle_get_option( 'footer_widgets_number' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_footer_widgets_number_control',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[footer_widgets_number]',
+ 'label' => __( 'Number of footer widgets', 'trestle' ),
+ 'type' => 'select',
+ 'choices' => array(
+ '0' => '0',
+ '1' => '1',
+ '2' => '2',
+ '3' => '3',
+ '4' => '4',
+ '5' => '5',
+ '6' => '6',
+ )
+ )
+ );
+
+ // Add a label for the link icons.
+ $wp_customize->add_setting(
+ 'trestle-settings[link_icons_title]',
+ array(
+ 'default' => '',
+ 'type' => 'option',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_link_icons_title',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[link_icons_title]',
+ 'label' => __( 'Icon links', 'trestle' ),
+ 'type' => 'hidden',
+ )
+ );
+
+ // External Link Icons.
+ $wp_customize->add_setting(
+ 'trestle-settings[external_link_icons]',
+ array(
+ 'default' => trestle_get_option( 'external_link_icons' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_external_link_icons',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[external_link_icons]',
+ 'label' => __( 'Add icons to external links', 'trestle' ),
+ 'type' => 'checkbox',
+ )
+ );
+
+ // E-mail Link Icons.
+ $wp_customize->add_setting(
+ 'trestle-settings[email_link_icons]',
+ array(
+ 'default' => trestle_get_option( 'email_link_icons' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_email_link_icons',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[email_link_icons]',
+ 'label' => __( 'Add icons to email links', 'trestle' ),
+ 'type' => 'checkbox',
+ )
+ );
+
+ // PDF Link Icons.
+ $wp_customize->add_setting(
+ 'trestle-settings[pdf_link_icons]',
+ array(
+ 'default' => trestle_get_option( 'pdf_link_icons' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_pdf_link_icons',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[pdf_link_icons]',
+ 'label' => __( 'Add icons to .pdf links', 'trestle' ),
+ 'type' => 'checkbox',
+ )
+ );
+
+ // Doc Link Icons.
+ $wp_customize->add_setting(
+ 'trestle-settings[doc_link_icons]',
+ array(
+ 'default' => trestle_get_option( 'doc_link_icons' ),
+ 'type' => 'option',
+ 'capability' => 'edit_theme_options',
+ )
+ );
+ $wp_customize->add_control(
+ 'trestle_doc_link_icons',
+ array(
+ 'section' => 'trestle_settings_section',
+ 'settings' => 'trestle-settings[doc_link_icons]',
+ 'label' => __( 'Add icons to .doc links', 'trestle' ),
+ 'type' => 'checkbox',
+ )
+ );
+
+}
diff --git a/lib/classes/class-tgm-plugin-activation.php b/includes/classes/class-tgm-plugin-activation.php
similarity index 100%
rename from lib/classes/class-tgm-plugin-activation.php
rename to includes/classes/class-tgm-plugin-activation.php
diff --git a/includes/functions/theme-functions.php b/includes/functions/theme-functions.php
new file mode 100644
index 0000000..2e864a3
--- /dev/null
+++ b/includes/functions/theme-functions.php
@@ -0,0 +1,357 @@
+ '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
+===========================================*/
+
+add_action( 'wp_enqueue_scripts', 'trestle_header_actions' );
+/**
+ * Loads theme scripts and styles.
+ *
+ * @since 1.0.0
+ */
+function trestle_header_actions() {
+
+ // Google fonts.
+ wp_enqueue_style( 'theme-google-fonts', '//fonts.googleapis.com/css?family=Lato:300,400,700' );
+
+ // Theme jQuery.
+ wp_enqueue_script( 'theme-jquery', get_stylesheet_directory_uri() . '/includes/js/theme-jquery.js', array( 'jquery' ), TRESTLE_THEME_VERSION, true );
+
+ // Get WP uploads directory.
+ $upload_dir = wp_upload_dir();
+ $upload_path = $upload_dir['basedir'];
+ $upload_url = $upload_dir['baseurl'];
+
+ // Custom CSS (if it exists).
+ $custom_css_file = '/trestle/custom.css';
+ if ( is_readable( $upload_path . $custom_css_file ) )
+ wp_enqueue_style( 'trestle-custom-css', $upload_url . $custom_css_file );
+
+ // Custom jQuery (if it exists).
+ $custom_js_file = '/trestle/custom.js';
+ if ( is_readable( $upload_path . $custom_js_file ) )
+ wp_enqueue_script( 'trestle-custom-jquery', $upload_url . $custom_js_file, array( 'jquery' ), TRESTLE_THEME_VERSION, true );
+
+}
+
+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 ) {
+
+ $trestle_favicon_url = trestle_get_option( 'favicon_url' );
+ return $trestle_favicon_url ? $trestle_favicon_url : $favicon_url;
+}
+
+/*===========================================
+ * Body Classes
+===========================================*/
+
+add_filter( 'body_class', 'trestle_body_classes' );
+/**
+ * Adds custom classes to the
element for styling purposes.
+ *
+ * @since 1.0.0
+ *
+ * @param array $classes Body classes.
+ * @return array Updated body classes.
+ */
+function trestle_body_classes( $classes ) {
+
+ // Add 'no-jquery' class to be removed by jQuery if enabled.
+ $classes[] = 'no-jquery';
+
+ // Add 'bubble' class.
+ if ( 'bubble' == trestle_get_option( 'layout' ) )
+ $classes[] = 'bubble';
+
+ /**
+ * Add link icon classes.
+ */
+
+ if ( trestle_get_option( 'external_link_icons' ) ) {
+ $classes[] = 'external-link-icons';
+ }
+
+ if ( trestle_get_option( 'email_link_icons' ) ) {
+ $classes[] = 'email-link-icons';
+ }
+
+ if ( trestle_get_option( 'pdf_link_icons' ) ) {
+ $classes[] = 'pdf-link-icons';
+ }
+
+ if ( trestle_get_option( 'doc_link_icons' ) ) {
+ $classes[] = 'doc-link-icons';
+ }
+
+ // Add menu style class.
+ $nav_primary_location = esc_attr( trestle_get_option( 'nav_primary_location' ) );
+ if ( $nav_primary_location ) {
+ $classes[] = 'nav-primary-location-' . $nav_primary_location;
+ }
+
+ // Add footer widget number class.
+ $footer_widgets_number = esc_attr( trestle_get_option( 'footer_widgets_number' ) );
+ if ( $footer_widgets_number ) {
+ $classes[] = 'footer-widgets-number-' . $footer_widgets_number;
+ }
+
+ // Add logo class.
+ if ( trestle_get_option( 'logo_url' ) || trestle_get_option( 'logo_url_mobile' ) ) {
+ $classes[] = 'has-logo';
+ }
+
+ return $classes;
+
+}
+
+
+/*===========================================
+ * Header
+===========================================*/
+
+add_filter( 'genesis_seo_title', 'trestle_do_logos', 10, 3 );
+/**
+ * Output logos.
+ *
+ * @since 1.0.0
+ */
+function trestle_do_logos( $title, $inside, $wrap ) {
+
+ $logo_url = trestle_get_option( 'logo_url' );
+ $logo_url_mobile = trestle_get_option( 'logo_url_mobile' );
+ $logo_html = '';
+
+ // Regular logo.
+ if ( $logo_url ) {
+
+ // Default logo class.
+ $classes = array('logo-full');
+
+ // If no mobile logo is specified, make regular logo act as mobile logo too.
+ if( ! $logo_url_mobile )
+ $classes[] = 'show';
+
+ $logo_html .= sprintf( ' ',
+ implode(' ', $classes),
+ esc_attr( get_bloginfo( 'name' ) ),
+ $logo_url
+ );
+ }
+
+ // Mobile logo.
+ if ( $logo_url_mobile ) {
+
+ // Default mobile logo class.
+ $classes = array('logo-mobile');
+
+ // If no regular logo is specified, make mobile logo act as regular logo too.
+ if( ! $logo_url )
+ $classes[] = 'show';
+
+ $logo_html .= sprintf( ' ',
+ implode(' ', $classes),
+ esc_attr( get_bloginfo( 'name' ) ),
+ $logo_url_mobile
+ );
+ }
+
+ if ( $logo_html ) {
+ $inside .= sprintf( '%s ',
+ trailingslashit( home_url() ),
+ esc_attr( get_bloginfo( 'name' ) ),
+ $logo_html
+ );
+ }
+
+ // Build the title.
+ $title = genesis_html5() ? sprintf( "<{$wrap} %s>", genesis_attr( 'site-title' ) ) : sprintf( '<%s id="title">%s%s>', $wrap, $inside, $wrap );
+ $title .= genesis_html5() ? "{$inside}{$wrap}>" : '';
+
+ // Echo (filtered).
+ return $title;
+
+}
+
+
+/*===========================================
+ * Navigation
+===========================================*/
+
+add_action( 'wp_loaded', 'trestle_nav_primary_location' );
+/**
+ * Move primary navigation into the header if need be.
+ *
+ * This is hooked on wp_loaded instead of init because for some reason init
+ * won't fire on the customizer preview.
+ *
+ * @since 1.2.0
+ */
+function trestle_nav_primary_location() {
+
+ if ( 'header' == trestle_get_option( 'nav_primary_location' ) ) {
+ remove_action( 'genesis_after_header', 'genesis_do_nav' );
+ add_action( 'genesis_header', 'genesis_do_nav', 12 );
+ }
+
+}
+
+add_filter( 'wp_nav_menu_items', 'trestle_custom_nav_extras', 10, 2 );
+/**
+ * Add custom nav extras.
+ *
+ * @since 1.0.0
+ *
+ * @param string $nav_items list of menu items.
+ * @param stdClass $menu_args Arguments for the menu.
+ * @return string list of menu items with custom navigation extras appended.
+ */
+function trestle_custom_nav_extras( $nav_items, stdClass $menu_args ) {
+
+ if ( 'primary' == $menu_args->theme_location && trestle_get_option( 'search_in_nav' ) ) {
+ return $nav_items . ' ' . get_search_form( false ) . ' ';
+ }
+
+ return $nav_items;
+}
+
+
+/*===========================================
+ * Posts & Pages
+===========================================*/
+
+add_filter( 'wp_revisions_to_keep', 'trestle_update_revisions_number', 10, 2 );
+/**
+ * Sets the number of post revisions.
+ *
+ * @since 1.0.0
+ *
+ * @param int $num Default number of post revisions.
+ * @return int Number of post revisions specified in Trestle admin panel.
+ */
+function trestle_update_revisions_number( $num ) {
+
+ $trestle_revisions_number = esc_attr( trestle_get_option( 'revisions_number' ) );
+
+ if ( isset( $trestle_revisions_number ) ) {
+ return $trestle_revisions_number;
+ }
+
+ return $num;
+}
+
+add_filter( 'genesis_get_image_default_args', 'trestle_featured_image_fallback' );
+/**
+ * Unset Genesis default featured image fallback of 'first-attached'.
+ *
+ * This function prevents Genesis' default behavior of displaying
+ * the 'first-attached' image as a post's featured image (in archive)
+ * views, even when the post has no current featured image.
+ *
+ * @since 1.0.0
+ *
+ * @param array $args Default Genesis image args.
+ * @return array Updated image args.
+ */
+function trestle_featured_image_fallback( $args ) {
+
+ $args['fallback'] = false;
+
+ return $args;
+}
+
+
+/*===========================================
+ * General Actions & Filters
+===========================================*/
+
+add_filter( 'excerpt_more', 'trestle_read_more_link' );
+add_filter( 'get_the_content_more_link', 'trestle_read_more_link' );
+add_filter( 'the_content_more_link', 'trestle_read_more_link' );
+/**
+ * Displays custom Trestle "read more" text in place of WordPress default.
+ *
+ * @since 1.0.0
+ *
+ * @param string $default_text Default "read more" text.
+ * @return string (Updated) "read more" text.
+ */
+function trestle_read_more_link( $default_text ) {
+
+ // Get Trestle custom "read more" link text.
+ $custom_text = esc_attr( trestle_get_option( 'read_more_text' ) );
+
+ if ( $custom_text ) {
+ return '… ' . $custom_text . ' ';
+ } else {
+ return $default_text;
+ }
+}
diff --git a/includes/js/theme-jquery.js b/includes/js/theme-jquery.js
new file mode 100644
index 0000000..f51aa81
--- /dev/null
+++ b/includes/js/theme-jquery.js
@@ -0,0 +1,142 @@
+/**
+ * Trestle theme jQuery
+ *
+ * @since 1.0.0
+ *
+ * @package Trestle
+ */
+
+// Executes when the document is ready
+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" );
+
+ // 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' );
+
+ // Add classes to parts of lists
+ $( 'li:last-child' ).addClass( 'last' );
+ $( 'li:first-child' ).addClass( 'first' );
+ $( 'ul, ol' ).parent( 'li' ).addClass( 'parent' );
+
+ // Create mobile header toggle buttons
+ $( '.site-header .title-area' ).after( '
' );
+ $( '.site-header .widget-area, .nav-primary' ).each( function( i ) {
+
+ // 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;
+ });
+
+ // 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 ' );
+
+ // Add target class to nav and widget areas
+ $target.addClass( 'toggle-target-' + i );
+ });
+
+ // A widget areas and primary nav mobile toggle functionality
+ $( '.site-header .toggle-button' ).click( function( event ) {
+
+ // Prevent default behavior
+ event.preventDefault();
+
+ // Scope our variables
+ var $button, $target;
+
+ // Get toggle button that was clicked
+ $button = $( this );
+
+ // Match the button to the right target
+ $target = $( '.toggle-target-' + $button.attr( 'id' ).match( /\d+/ ) );
+ console.log( 'Target: ' + $target.attr('class'));
+
+ // Toggle buttons
+ $button.toggleClass( 'open' );
+ $( '.site-header .toggle-button' ).not( $button ).removeClass( 'open' );
+
+ // Toggle targets
+ $target.toggleClass( 'open' );
+ $( '[class*="toggle-target"]' ).not( $target ).removeClass( 'open' );
+
+ // Remove focus
+ $button.blur();
+
+ });
+
+ // Mobile navigation icons
+ var closedIcon = '+';
+ var 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' );
+
+ // 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();
+
+ // Expand/contract
+ $button.toggleClass( 'open' ).next( '.widget-area' ).slideToggle();
+ });
+
+ // Executes when complete page is fully loaded, including all frames, objects, and images
+ $( window ).on( 'load', function() {
+
+ });
+
+}); /* end of page load scripts */
\ No newline at end of file
diff --git a/includes/shortcodes/shortcodes.php b/includes/shortcodes/shortcodes.php
new file mode 100644
index 0000000..082a225
--- /dev/null
+++ b/includes/shortcodes/shortcodes.php
@@ -0,0 +1,137 @@
+ 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 (
+ '[' => '[',
+ ']
' => ']',
+ '] ' => ']'
+ );
+
+ $content = strtr( $content, $array );
+
+ return $content;
+}
+
+add_shortcode( 'col', 'trestle_column' );
+/**
+ * Columns.
+ *
+ * Example:
+ * [col class="one-half first no-list-margin"] Contents [/col]
+ *
+ * Classes:
+ * - 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(
+ 'class' => '',
+ ), $atts ) );
+ return '' . do_shortcode( $content ) . '
';
+}
+
+add_shortcode( 'button', 'trestle_button' );
+/**
+ * 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(
+ 'href' => '#',
+ 'target' => '',
+ 'title' => '',
+ 'class' => '',
+ ), $atts ) );
+ return '' . do_shortcode( $content ) . ' ';
+}
+
+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(
+ 'format' => 'M d, Y',
+ ), $atts ) );
+
+ if ( ! $format ) {
+ $format = 'M d, Y';
+ }
+
+ return date( $format );
+}
+
+add_shortcode( 'blockquote', 'trestle_blockquote_shortcode' );
+/**
+ * Blockquote.
+ *
+ * Example: [blockquote citation=""]Content[/blockquote]
+ *
+ * @since 1.2.0
+ *
+ * @param array $atts Shortcode attributes.
+ *
+ * @return string Shortcode output.
+ */
+function trestle_blockquote_shortcode( $atts, $content = null ) {
+ $atts = shortcode_atts( array(
+ 'citation' => '',
+ ), $atts );
+
+ ob_start(); ?>
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ '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
diff --git a/languages/trestle.pot b/languages/trestle.pot
index f4e6c5d..848419f 100644
--- a/languages/trestle.pot
+++ b/languages/trestle.pot
@@ -15,334 +15,334 @@ msgstr ""
"X-Poedit-KeywordsList: __;_e;_x;_n\n"
"X-Poedit-SearchPath-0: ..\n"
-#: ../lib/admin/admin-functions.php:38
+#: ../includes/admin/admin-functions.php:38
msgid "Navigation"
msgstr ""
-#: ../lib/admin/admin-functions.php:39
+#: ../includes/admin/admin-functions.php:39
msgid "Read More »"
msgstr ""
-#: ../lib/admin/admin-functions.php:121
+#: ../includes/admin/admin-functions.php:121
msgid "Trestle Settings by "
msgstr ""
-#: ../lib/admin/admin-functions.php:135
+#: ../includes/admin/admin-functions.php:135
msgid "Layout"
msgstr ""
-#: ../lib/admin/admin-functions.php:143
+#: ../includes/admin/admin-functions.php:143
msgid "Primary Navigation"
msgstr ""
-#: ../lib/admin/admin-functions.php:145
+#: ../includes/admin/admin-functions.php:145
msgid ""
"Automatically generate nav menu (replaces custom/manual menu with auto-"
"generated menu)"
msgstr ""
-#: ../lib/admin/admin-functions.php:146
+#: ../includes/admin/admin-functions.php:146
msgid "Include home link"
msgstr ""
-#: ../lib/admin/admin-functions.php:149
+#: ../includes/admin/admin-functions.php:149
msgid "Text for mobile navigation button (shortcodes can be included):"
msgstr ""
-#: ../lib/admin/admin-functions.php:153
+#: ../includes/admin/admin-functions.php:153
msgid "Primary Navigation Extras"
msgstr ""
-#: ../lib/admin/admin-functions.php:154
+#: ../includes/admin/admin-functions.php:154
msgid ""
"Display custom navigation extras content (overrides standard Genesis "
"navigation extras)"
msgstr ""
-#: ../lib/admin/admin-functions.php:156
+#: ../includes/admin/admin-functions.php:156
msgid "Custom navigation extras text:"
msgstr ""
-#: ../lib/admin/admin-functions.php:160
+#: ../includes/admin/admin-functions.php:160
msgid "Blog/Posts"
msgstr ""
-#: ../lib/admin/admin-functions.php:162
+#: ../includes/admin/admin-functions.php:162
msgid "Custom read more link text"
msgstr ""
-#: ../lib/admin/admin-functions.php:165
+#: ../includes/admin/admin-functions.php:165
msgid "Number of post revisions"
msgstr ""
-#: ../lib/admin/admin-functions.php:176
+#: ../includes/admin/admin-functions.php:176
msgid "Post Info & Meta"
msgstr ""
-#: ../lib/admin/admin-functions.php:177
+#: ../includes/admin/admin-functions.php:177
msgid "Manually select where to show Post Info & Meta"
msgstr ""
-#: ../lib/admin/admin-functions.php:180
+#: ../includes/admin/admin-functions.php:180
msgid "Show Post Info on:"
msgstr ""
-#: ../lib/admin/admin-functions.php:190 ../lib/admin/admin-functions.php:210
+#: ../includes/admin/admin-functions.php:190 ../includes/admin/admin-functions.php:210
#, php-format
msgid "%s (single)"
msgstr ""
-#: ../lib/admin/admin-functions.php:193 ../lib/admin/admin-functions.php:213
+#: ../includes/admin/admin-functions.php:193 ../includes/admin/admin-functions.php:213
#, php-format
msgid "%s (archive)"
msgstr ""
-#: ../lib/admin/admin-functions.php:200
+#: ../includes/admin/admin-functions.php:200
msgid "Show Post Meta on:"
msgstr ""
-#: ../lib/admin/admin-functions.php:221
+#: ../includes/admin/admin-functions.php:221
msgid "Footer Widgets"
msgstr ""
-#: ../lib/admin/admin-functions.php:223
+#: ../includes/admin/admin-functions.php:223
msgid "Number"
msgstr ""
-#: ../lib/admin/admin-functions.php:233
+#: ../includes/admin/admin-functions.php:233
msgid "Link Icons"
msgstr ""
-#: ../lib/admin/admin-functions.php:235
+#: ../includes/admin/admin-functions.php:235
msgid "Add icons to external links"
msgstr ""
-#: ../lib/admin/admin-functions.php:236
+#: ../includes/admin/admin-functions.php:236
msgid "Add icons to email links"
msgstr ""
-#: ../lib/admin/admin-functions.php:237
+#: ../includes/admin/admin-functions.php:237
msgid "Add icons to .pdf links"
msgstr ""
-#: ../lib/admin/admin-functions.php:238
+#: ../includes/admin/admin-functions.php:238
msgid "Add icons to .doc links"
msgstr ""
-#: ../lib/admin/admin-functions.php:398
-#: ../lib/classes/class-tgm-plugin-activation.php:155
+#: ../includes/admin/admin-functions.php:398
+#: ../includes/classes/class-tgm-plugin-activation.php:155
msgid "Install Required Plugins"
msgstr ""
-#: ../lib/admin/admin-functions.php:399
-#: ../lib/classes/class-tgm-plugin-activation.php:156
+#: ../includes/admin/admin-functions.php:399
+#: ../includes/classes/class-tgm-plugin-activation.php:156
msgid "Install Plugins"
msgstr ""
-#: ../lib/admin/admin-functions.php:400
-#: ../lib/classes/class-tgm-plugin-activation.php:157
+#: ../includes/admin/admin-functions.php:400
+#: ../includes/classes/class-tgm-plugin-activation.php:157
#, php-format
msgid "Installing Plugin: %s"
msgstr ""
-#: ../lib/admin/admin-functions.php:401
+#: ../includes/admin/admin-functions.php:401
msgid "Something went wrong with the plugin API."
msgstr ""
-#: ../lib/admin/admin-functions.php:412
-#: ../lib/classes/class-tgm-plugin-activation.php:169
+#: ../includes/admin/admin-functions.php:412
+#: ../includes/classes/class-tgm-plugin-activation.php:169
msgid "Return to Required Plugins Installer"
msgstr ""
-#: ../lib/admin/admin-functions.php:413
-#: ../lib/classes/class-tgm-plugin-activation.php:171
-#: ../lib/classes/class-tgm-plugin-activation.php:1840
+#: ../includes/admin/admin-functions.php:413
+#: ../includes/classes/class-tgm-plugin-activation.php:171
+#: ../includes/classes/class-tgm-plugin-activation.php:1840
msgid "Plugin activated successfully."
msgstr ""
-#: ../lib/admin/admin-functions.php:414
+#: ../includes/admin/admin-functions.php:414
#, php-format
msgid "All plugins installed and activated successfully. %s"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:158
+#: ../includes/classes/class-tgm-plugin-activation.php:158
msgid "Something went wrong."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:170
+#: ../includes/classes/class-tgm-plugin-activation.php:170
msgid "Return to the dashboard"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:172
-#: ../lib/classes/class-tgm-plugin-activation.php:1538
+#: ../includes/classes/class-tgm-plugin-activation.php:172
+#: ../includes/classes/class-tgm-plugin-activation.php:1538
msgid "The following plugin was activated successfully:"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:173
+#: ../includes/classes/class-tgm-plugin-activation.php:173
#, php-format
msgid "All plugins installed and activated successfully. %1$s"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:174
+#: ../includes/classes/class-tgm-plugin-activation.php:174
msgid "Dismiss this notice"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1085
+#: ../includes/classes/class-tgm-plugin-activation.php:1085
msgid "External Link"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1090
+#: ../includes/classes/class-tgm-plugin-activation.php:1090
msgid "Private Repository"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1093
+#: ../includes/classes/class-tgm-plugin-activation.php:1093
msgid "Pre-Packaged"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1097
+#: ../includes/classes/class-tgm-plugin-activation.php:1097
msgid "WordPress Repository"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1100
+#: ../includes/classes/class-tgm-plugin-activation.php:1100
msgid "Required"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1100
+#: ../includes/classes/class-tgm-plugin-activation.php:1100
msgid "Recommended"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1103
+#: ../includes/classes/class-tgm-plugin-activation.php:1103
msgid "Not Installed"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1105
+#: ../includes/classes/class-tgm-plugin-activation.php:1105
msgid "Installed But Not Activated"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1275
+#: ../includes/classes/class-tgm-plugin-activation.php:1275
#, php-format
msgid ""
"No plugins to install or activate. Return to the Dashboard "
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1291
+#: ../includes/classes/class-tgm-plugin-activation.php:1291
msgid "Plugin"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1292
+#: ../includes/classes/class-tgm-plugin-activation.php:1292
msgid "Source"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1293
+#: ../includes/classes/class-tgm-plugin-activation.php:1293
msgid "Type"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1294
+#: ../includes/classes/class-tgm-plugin-activation.php:1294
msgid "Status"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1312
+#: ../includes/classes/class-tgm-plugin-activation.php:1312
msgid "Install"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1313
+#: ../includes/classes/class-tgm-plugin-activation.php:1313
msgid "Activate"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1823
+#: ../includes/classes/class-tgm-plugin-activation.php:1823
msgid "Install package not available."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1824
+#: ../includes/classes/class-tgm-plugin-activation.php:1824
#, php-format
msgid "Downloading install package from %s …"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1825
+#: ../includes/classes/class-tgm-plugin-activation.php:1825
msgid "Unpacking the package…"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1826
+#: ../includes/classes/class-tgm-plugin-activation.php:1826
msgid "Installing the plugin…"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1827
+#: ../includes/classes/class-tgm-plugin-activation.php:1827
msgid "Plugin install failed."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1828
+#: ../includes/classes/class-tgm-plugin-activation.php:1828
msgid "Plugin installed successfully."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1839
+#: ../includes/classes/class-tgm-plugin-activation.php:1839
msgid "Plugin activation failed."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1949
+#: ../includes/classes/class-tgm-plugin-activation.php:1949
msgid ""
"The installation and activation process is starting. This process may take a "
"while on some hosts, so please be patient."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1950
+#: ../includes/classes/class-tgm-plugin-activation.php:1950
#, php-format
msgid "%1$s installed and activated successfully."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1950
-#: ../lib/classes/class-tgm-plugin-activation.php:1959
+#: ../includes/classes/class-tgm-plugin-activation.php:1950
+#: ../includes/classes/class-tgm-plugin-activation.php:1959
msgid "Show Details"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1950
-#: ../lib/classes/class-tgm-plugin-activation.php:1959
+#: ../includes/classes/class-tgm-plugin-activation.php:1950
+#: ../includes/classes/class-tgm-plugin-activation.php:1959
msgid "Hide Details"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1951
+#: ../includes/classes/class-tgm-plugin-activation.php:1951
msgid "All installations and activations have been completed."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1952
+#: ../includes/classes/class-tgm-plugin-activation.php:1952
#, php-format
msgid "Installing and Activating Plugin %1$s (%2$d/%3$d)"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1956
+#: ../includes/classes/class-tgm-plugin-activation.php:1956
msgid ""
"The installation process is starting. This process may take a while on some "
"hosts, so please be patient."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1957
+#: ../includes/classes/class-tgm-plugin-activation.php:1957
#, php-format
msgid "An error occurred while installing %1$s: %2$s ."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1958
+#: ../includes/classes/class-tgm-plugin-activation.php:1958
#, php-format
msgid "The installation of %1$s failed."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1959
+#: ../includes/classes/class-tgm-plugin-activation.php:1959
#, php-format
msgid "%1$s installed successfully."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1960
+#: ../includes/classes/class-tgm-plugin-activation.php:1960
msgid "All installations have been completed."
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:1961
+#: ../includes/classes/class-tgm-plugin-activation.php:1961
#, php-format
msgid "Installing Plugin %1$s (%2$d/%3$d)"
msgstr ""
-#: ../lib/classes/class-tgm-plugin-activation.php:2052
+#: ../includes/classes/class-tgm-plugin-activation.php:2052
msgid "Return to the Dashboard"
msgstr ""
-#: ../lib/functions/theme-functions.php:136
+#: ../includes/functions/theme-functions.php:136
msgid "Trestle Auto Nav Placeholder"
msgstr ""
diff --git a/lib/admin/admin-functions.php b/lib/admin/admin-functions.php
deleted file mode 100644
index b3f31e0..0000000
--- a/lib/admin/admin-functions.php
+++ /dev/null
@@ -1,505 +0,0 @@
- 'solid',
- '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_equal_height_cols' => 1,
- 'trestle_equal_cols_breakpoint' => 768,
- );
-
- // Populate Trestle settings with default values if they don't yet exist
- $options = get_option( GENESIS_SETTINGS_FIELD );
-
- foreach ( $trestle_defaults as $k => $v ) {
- // Add defaults to Genesis default settings array
- $defaults[$k] = $v;
-
- // Update actual options if they don't yet exist
- if ( $options && ! array_key_exists( $k, $options ) )
- $options[$k] = $v;
- }
-
- // Update options with defaults
- update_option( GENESIS_SETTINGS_FIELD, $options );
-
- return $defaults;
-}
-
-/**
- * Adds sanitization for various Trestle admin settings.
- *
- * @since 1.0.0
- */
-function trestle_register_social_sanitization_filters() {
- // 1 or 0
- genesis_add_option_filter(
- 'one_zero',
- GENESIS_SETTINGS_FIELD,
- array(
- 'trestle_auto_nav',
- 'trestle_include_home_link',
- 'trestle_custom_nav_extras',
- 'trestle_manual_post_info_meta',
- 'trestle_equal_height_cols',
- 'trestle_external_link_icons',
- 'trestle_email_link_icons',
- 'trestle_pdf_link_icons',
- 'trestle_doc_link_icons',
- )
- );
-
- // Integer
- genesis_add_option_filter(
- 'absint',
- GENESIS_SETTINGS_FIELD,
- array(
- 'trestle_auto_nav_depth',
- 'trestle_revisions_number',
- 'trestle_footer_widgets_number',
- 'trestle_equal_cols_breakpoint',
- )
- );
-
- // No HTML
- genesis_add_option_filter(
- 'no_html',
- GENESIS_SETTINGS_FIELD,
- array(
- 'trestle_layout',
- )
- );
-
- // Safe HTML
- genesis_add_option_filter(
- 'safe_html',
- GENESIS_SETTINGS_FIELD,
- array(
- 'trestle_logo_url',
- 'trestle_logo_url_mobile',
- 'trestle_home_link_text',
- 'trestle_nav_button_text',
- 'trestle_custom_nav_extras_text',
- 'trestle_read_more_text'
- )
- );
-}
-
-/**
- * Registers Trestle admin settings box.
- *
- * @since 1.0.0
- *
- * @global array $_genesis_admin_settings Genesis admin settings.
- *
- * @param string $_genesis_theme_settings_pagehook Hook for main Genesis settings page in admin.
- */
-function trestle_register_settings_box( $_genesis_theme_settings_pagehook ) {
- global $_genesis_admin_settings;
-
- // Create Trestle settings metabox
- $settings_box_title = __( 'Trestle Settings by ', 'trestle' ) . ' MIGHTYminnow ';
- add_meta_box( 'trestle-settings', $settings_box_title, 'trestle_settings_box', $_genesis_theme_settings_pagehook, 'main', 'high' );
-}
-
-/**
- * Outputs contents of Trestle admin settings box on Genesis settings page.
- *
- * @since 1.0.0
- */
-function trestle_settings_box() {
- // Set path for image radio inputs
- $img_path = get_stylesheet_directory_uri() . '/images/admin/';
-
- ?>
-
-
- />
- />
- />
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- />
- :
-
- >Unlimited
- ' . $i . '' . "\n";
- }
- ?>
-
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- />
-
-
-
-
-
-
-
-
- :
-
-
- :
-
- >Unlimited
- ' . $i . '' . "\n";
- }
- ?>
-
-
-
-
-
- />
-
-
-
-
-
- :
-
- ' . $i . '' . "\n";
- }
- ?>
-
-
-
-
-
- />
-
-
- px
-
-
-
-
- />
- />
- />
- />
-
- 'Better Font Awesome',
- 'slug' => 'better-font-awesome',
- 'required' => true,
- ),
-
- array(
- 'name' => 'Respond.js',
- 'slug' => 'respondjs',
- 'required' => true,
- ),
-
- // Optional plugins
- array(
- 'name' => 'Black Studio TinyMCE Widget',
- 'slug' => 'black-studio-tinymce-widget',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Events Manager',
- 'slug' => 'events-manager',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Exclude Pages',
- 'slug' => 'exclude-pages',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Facebook Open Graph Meta Tags for WordPress',
- 'slug' => 'wonderm00ns-simple-facebook-open-graph-tags',
- 'required' => false,
- ),
-
- array(
- 'name' => 'FancyBox for WordPress',
- 'slug' => 'fancybox-for-wordpress',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Genesis Featured Widget Amplified',
- 'slug' => 'genesis-featured-widget-amplified',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Genesis Simple Edits',
- 'slug' => 'genesis-simple-edits',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Google Analytics for WordPress',
- 'slug' => 'google-analytics-for-wordpress',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Jetpack by WordPress.com',
- 'slug' => 'jetpack',
- 'required' => false,
- ),
-
- array(
- 'name' => 'MapPress Easy Google Maps',
- 'slug' => 'mappress-google-maps-for-wordpress',
- 'required' => false,
- ),
-
- array(
- 'name' => 'My Page Order',
- 'slug' => 'my-page-order',
- 'required' => false,
- ),
-
- array(
- 'name' => 'NextGen Gallery',
- 'slug' => 'nextgen-gallery',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Post Thumbnail Editor',
- 'slug' => 'post-thumbnail-editor',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Post Types Order',
- 'slug' => 'post-types-order',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Responsive Video Embeds',
- 'slug' => 'responsive-video-embeds',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Social Media Widget',
- 'slug' => 'social-media-widget',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Widget Context',
- 'slug' => 'widget-context',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Simple Image Sizes',
- 'slug' => 'simple-image-sizes',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Simple Section Navigation',
- 'slug' => 'simple-section-navigation',
- 'required' => false,
- ),
-
- array(
- 'name' => 'Types - Custom Fields and Custom Post Types Management',
- 'slug' => 'types',
- 'required' => false,
- ),
-
- array(
- 'name' => 'WP Hotkeys',
- 'slug' => 'wp-hotkeys',
- 'required' => false,
- ),
- );
-
- // Change this to your theme text domain, used for internationalising strings
- $theme_text_domain = 'mightyminnow';
-
- /**
- * Array of configuration settings. Amend each line as needed.
- * If you want the default strings to be available under your own theme domain,
- * leave the strings uncommented.
- * Some of the strings are added into a sprintf, so see the comments at the
- * end of each line for what each argument will be.
- */
- $config = array(
- 'domain' => $theme_text_domain, // Text domain - likely want to be the same as your theme.
- 'default_path' => '', // Default absolute path to pre-packaged plugins
- 'parent_menu_slug' => 'themes.php', // Default parent menu slug
- 'parent_url_slug' => 'themes.php', // Default parent URL slug
- 'menu' => 'install-required-plugins', // Menu slug
- 'has_notices' => true, // Show admin notices or not
- 'is_automatic' => true, // Automatically activate plugins after installation or not
- 'message' => '', // Message to output right before the plugins table
- 'strings' => array(
- 'page_title' => __( 'Install Required Plugins', $theme_text_domain ),
- 'menu_title' => __( 'Install Plugins', $theme_text_domain ),
- 'installing' => __( 'Installing Plugin: %s', $theme_text_domain ), // %1$s = plugin name
- 'oops' => __( 'Something went wrong with the plugin API.', $theme_text_domain ),
- 'notice_can_install_required' => _n_noop( 'This theme requires the following plugin: %1$s.', 'This theme requires the following plugins: %1$s.' ), // %1$s = plugin name(s)
- 'notice_can_install_recommended' => _n_noop( 'Recommended plugin: %1$s.', 'Recommended plugins: %1$s.' ), // %1$s = plugin name(s)
- 'notice_cannot_install' => _n_noop( 'Sorry, but you do not have the correct permissions to install the %s plugin. Contact the administrator of this site for help on getting the plugin installed.', 'Sorry, but you do not have the correct permissions to install the %s plugins. Contact the administrator of this site for help on getting the plugins installed.' ), // %1$s = plugin name(s)
- 'notice_can_activate_required' => _n_noop( 'The following required plugin is currently inactive: %1$s.', 'The following required plugins are currently inactive: %1$s.' ), // %1$s = plugin name(s)
- 'notice_can_activate_recommended' => _n_noop( 'The following recommended plugin is currently inactive: %1$s.', 'The following recommended plugins are currently inactive: %1$s.' ), // %1$s = plugin name(s)
- 'notice_cannot_activate' => _n_noop( 'Sorry, but you do not have the correct permissions to activate the %s plugin. Contact the administrator of this site for help on getting the plugin activated.', 'Sorry, but you do not have the correct permissions to activate the %s plugins. Contact the administrator of this site for help on getting the plugins activated.' ), // %1$s = plugin name(s)
- 'notice_ask_to_update' => _n_noop( 'The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s.', 'The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s.' ), // %1$s = plugin name(s)
- 'notice_cannot_update' => _n_noop( 'Sorry, but you do not have the correct permissions to update the %s plugin. Contact the administrator of this site for help on getting the plugin updated.', 'Sorry, but you do not have the correct permissions to update the %s plugins. Contact the administrator of this site for help on getting the plugins updated.' ), // %1$s = plugin name(s)
- 'install_link' => _n_noop( 'Begin installing plugin', 'Begin installing plugins' ),
- 'activate_link' => _n_noop( 'Activate installed plugin', 'Activate installed plugins' ),
- 'return' => __( 'Return to Required Plugins Installer', $theme_text_domain ),
- 'plugin_activated' => __( 'Plugin activated successfully.', $theme_text_domain ),
- 'complete' => __( 'All plugins installed and activated successfully. %s', $theme_text_domain ), // %1$s = dashboard link
- 'nag_type' => 'updated' // Determines admin notice type - can only be 'updated' or 'error'
- )
- );
-
- tgmpa( $plugins, $config );
-}
\ No newline at end of file
diff --git a/lib/admin/admin.css b/lib/admin/admin.css
deleted file mode 100644
index 8a9bf26..0000000
--- a/lib/admin/admin.css
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Trestle admin styles
- *
- * @since 1.0.0
- *
- * @package Trestle
- */
-
-.trestle-layout img {
- margin-right: 10px;
- border: 4px solid transparent;
- cursor: pointer;
-}
-
-.trestle-layout img:hover {
- border-color: #EEE;
-}
-
-.trestle-layout img.checked {
- border-color: #CCC;
-}
-
-/* Columns
---------------------------------------------- */
-.five-sixths,
-.four-sixths,
-.one-fourth,
-.one-half,
-.one-sixth,
-.one-third,
-.three-fourths,
-.three-sixths,
-.two-fourths,
-.two-sixths,
-.two-thirds,
-.footer-widgets .widget-area {
- float: left;
- margin: 0;
- width: 100%;
-}
-
-
-/* Media Queries
---------------------------------------------- */
-@media (min-width: 768px) {
-
- /* Columns
- --------------------------------------------- */
-
- .five-sixths,
- .four-sixths,
- .one-fourth,
- .one-half,
- .one-sixth,
- .one-third,
- .three-fourths,
- .three-sixths,
- .two-fourths,
- .two-sixths,
- .two-thirds,
- .footer-widgets .widget-area {
- margin-left: 2.564102564102564%;
- }
-
- .one-half,
- .three-sixths,
- .two-fourths,
- .footer-widgets-number-2 .footer-widgets .widget-area {
- width: 48.717948717948715%;
- }
-
- .one-third,
- .two-sixths,
- .sidebar-primary,
- .title-area,
- .footer-widgets-number-3 .footer-widgets .widget-area {
- width: 31.623931623931625%;
- }
-
- .four-sixths,
- .two-thirds,
- .content {
- width: 65.81196581196582%;
- }
-
- .one-fourth,
- .footer-widgets-number-4 .footer-widgets .widget-area {
- width: 23.076923076923077%;
- }
-
- .three-fourths {
- width: 74.35897435897436%;
- }
-
- .one-fifth,
- .footer-widgets-number-5 .footer-widgets .widget-area {
- width: 17.948717949%;
- }
-
- .one-sixth,
- .footer-widgets-number-6 .footer-widgets .widget-area {
- width: 14.52991452991453%;
- }
-
- .five-sixths {
- width: 82.90598290598291%;
- }
-
- .first,
- .footer-widgets .footer-widgets-1 {
- clear: both;
- margin-left: 0;
- }
-
- /* Lists inside columns (to remove bottom margin as needed at mobile sizes */
- .no-list-margin ul,
- .no-list-margin ol {
- margin-bottom: 26px;
- margin-bottom: 2.6rem;
- }
-
-}
\ No newline at end of file
diff --git a/lib/admin/admin.js b/lib/admin/admin.js
deleted file mode 100644
index c580186..0000000
--- a/lib/admin/admin.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * jQuery that runs in the WordPress admin
- *
- * @since 1.0.0
- *
- * @package Trestle
- */
-
-// Executes when the document is ready
-jQuery(document).ready(function() {
-
- // Hide Trestle layout radio buttons
- jQuery('.trestle-layout img').next('input[type="radio"]').hide();
-
- // Add radio button functionality to layout icons
- jQuery('.trestle-layout img').click(function() {
- jQuery(this).next('input[type="radio"]').attr('checked', true);
- jQuery('.trestle-layout img').removeClass('checked');
- jQuery(this).addClass('checked');
- });
-
- // Add drop-down functionality for Post Info & Meta options
- if( ! jQuery('#genesis-settings\\[trestle_manual_post_info_meta\\]').is(':checked') ) {
- jQuery('.trestle-post-info-meta').hide();
- }
-
- jQuery('#genesis-settings\\[trestle_manual_post_info_meta\\]').change(function() {
- jQuery('.trestle-post-info-meta').slideToggle();
- });
-
- // Add drop-down functionality for equal height breakpoint
- if( ! jQuery('#genesis-settings\\[trestle_equal_height_cols\\]').is(':checked') ) {
- jQuery('.trestle-equal-columns-breakpoint').hide();
- }
-
- jQuery('#genesis-settings\\[trestle_equal_height_cols\\]').change(function() {
- jQuery('.trestle-equal-columns-breakpoint').slideToggle();
- });
-
-}); /* end of as page load scripts */
diff --git a/lib/admin/admin.php b/lib/admin/admin.php
deleted file mode 100644
index a508108..0000000
--- a/lib/admin/admin.php
+++ /dev/null
@@ -1,26 +0,0 @@
- '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 0000000..81c9ad9
Binary files /dev/null and b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/FontAwesome.otf differ
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.eot b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.eot
new file mode 100755
index 0000000..84677bc
Binary files /dev/null and b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.eot differ
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.svg b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.svg
new file mode 100755
index 0000000..d907b25
--- /dev/null
+++ b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.svg
@@ -0,0 +1,520 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.ttf b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.ttf
new file mode 100755
index 0000000..96a3639
Binary files /dev/null and b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.ttf differ
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.woff b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.woff
new file mode 100755
index 0000000..628b6a5
Binary files /dev/null and b/lib/better-font-awesome-library/lib/fallback-font-awesome/fonts/fontawesome-webfont.woff differ
diff --git a/lib/better-font-awesome-library/lib/fallback-font-awesome/package.json b/lib/better-font-awesome-library/lib/fallback-font-awesome/package.json
new file mode 100755
index 0000000..e7c8233
--- /dev/null
+++ b/lib/better-font-awesome-library/lib/fallback-font-awesome/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "font-awesome",
+ "description": "The iconic font and CSS framework",
+ "version": "4.2.0",
+ "keywords": ["font", "awesome", "fontawesome", "icon", "font", "bootstrap"],
+ "homepage": "http://fontawesome.io/",
+ "bugs": {
+ "url" : "http://github.com/FortAwesome/Font-Awesome/issues"
+ },
+ "author": {
+ "name": "Dave Gandy",
+ "email": "dave@fontawesome.io",
+ "web": "http://twitter.com/davegandy"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/FortAwesome/Font-Awesome.git"
+ },
+ "contributors": [
+ {
+ "name": "Rob Madole",
+ "web": "http://twitter.com/robmadole"
+ },
+ {
+ "name": "Geremia Taglialatela",
+ "web": "http://twitter.com/gtagliala"
+ },
+ {
+ "name": "Travis Chase",
+ "web": "http://twitter.com/supercodepoet"
+ }
+ ],
+ "licenses": [
+ {
+ "type": "OFL-1.1",
+ "url": "http://scripts.sil.org/OFL"
+ },
+ {
+ "type": "MIT",
+ "url": "http://opensource.org/licenses/mit-license.html"
+ }
+ ],
+ "dependencies": {
+ },
+ "engines" : {
+ "node" : ">=0.10.3"
+ }
+}
diff --git a/lib/functions/theme-functions.php b/lib/functions/theme-functions.php
deleted file mode 100644
index 1139f8e..0000000
--- a/lib/functions/theme-functions.php
+++ /dev/null
@@ -1,420 +0,0 @@
- genesis_get_option( 'trestle_equal_cols_breakpoint' ),
- );
- wp_localize_script( 'theme-jquery', 'php_vars', $php_vars );
-}
-
-
-/*===========================================
- * Body Classes
-===========================================*/
-
-/**
- * Adds custom classes to the element for styling purposes.
- *
- * @since 1.0.0
- *
- * @param array $classes Body classes.
- * @return array Updated body classes.
- */
-function trestle_body_classes( $classes ) {
- // Add 'no-jquery' class to be removed by jQuery if enabled
- $classes[] = 'no-jquery';
-
- // Add 'bubble' class
- if ( 'bubble' == genesis_get_option( 'trestle_layout' ) )
- $classes[] = 'bubble';
-
- // Add link icon classes
- if ( genesis_get_option( 'trestle_external_link_icons' ) )
- $classes[] = 'external-link-icons';
- if ( genesis_get_option( 'trestle_email_link_icons' ) )
- $classes[] = 'email-link-icons';
- if ( genesis_get_option( 'trestle_pdf_link_icons' ) )
- $classes[] = 'pdf-link-icons';
- if ( genesis_get_option( 'trestle_doc_link_icons' ) )
- $classes[] = 'doc-link-icons';
-
- // Add footer widget number class
- if ( genesis_get_option( 'trestle_footer_widgets_number' ) )
- $classes[] = 'footer-widgets-number-' . esc_attr( genesis_get_option( 'trestle_footer_widgets_number' ) );
-
- // Add class for equal height Genesis Extender columns
- if ( 1 == genesis_get_option( 'trestle_equal_height_cols' ) )
- $classes[] = 'equal-height-genesis-extender-cols';
-
- // Add logo class
- if ( genesis_get_option( 'trestle_logo_url' ) || genesis_get_option( 'trestle_logo_url_mobile' ) )
- $classes[] = 'has-logo';
-
- return $classes;
-}
-
-/*===========================================
- * Header
-===========================================*/
-
-/**
- * Output logos.
- *
- * @since 1.0.0
- */
-function trestle_do_logos( $title, $inside, $wrap ) {
- $logo_url = genesis_get_option( 'trestle_logo_url' );
- $logo_url_mobile = genesis_get_option( 'trestle_logo_url_mobile' );
- $logo_html = '';
-
- // Regular logo
- if ( $logo_url ) {
-
- // Default logo class
- $classes = array('logo-full');
-
- // If no mobile logo is specified, make regular logo act as mobile logo too
- if( ! $logo_url_mobile )
- $classes[] = 'show';
-
- $logo_html .= sprintf( ' ',
- implode(' ', $classes),
- esc_attr( get_bloginfo( 'name' ) ),
- $logo_url
- );
- }
-
- // Mobile logo
- if ( $logo_url_mobile ) {
-
- // Default mobile logo class
- $classes = array('logo-mobile');
-
- // If no regular logo is specified, make mobile logo act as regular logo too
- if( ! $logo_url )
- $classes[] = 'show';
-
- $logo_html .= sprintf( ' ',
- implode(' ', $classes),
- esc_attr( get_bloginfo( 'name' ) ),
- $logo_url_mobile
- );
- }
-
- if ( $logo_html ) {
- $inside .= sprintf( '%s ',
- trailingslashit( home_url() ),
- esc_attr( get_bloginfo( 'name' ) ),
- $logo_html
- );
- }
-
- //* Build the title
- $title = genesis_html5() ? sprintf( "<{$wrap} %s>", genesis_attr( 'site-title' ) ) : sprintf( '<%s id="title">%s%s>', $wrap, $inside, $wrap );
- $title .= genesis_html5() ? "{$inside}{$wrap}>" : '';
-
- //* Echo (filtered)
- return $title;
-}
-
-
-/*===========================================
- * Auto & Mobile Navigation
-===========================================*/
-
-/**
- * Performs modifications to the primary navigation menu
- *
- * @since 1.0.0
- *
- * @see trestle_add_mobile_nav()
- * @see trestle_auto_nav_items()
- * @see trestle_custom_nav_extras()
- * @see trestle_nav_placeholder()
- */
-function trestle_nav_modifications() {
- global $trestle_nav_title;
-
- // Set title for Trestle placeholder navigation menu
- $trestle_nav_title = __( 'Trestle Auto Nav Placeholder', 'trestle' );
-
- // Add mobile nav button
- add_action( 'genesis_after_header', 'trestle_add_mobile_nav', 0 );
-
- // Auto-generate nav if Genesis theme setting is checked
- if ( 1 == genesis_get_option( 'trestle_auto_nav' ) )
- add_filter( 'wp_nav_menu_items', 'trestle_auto_nav_items', 9, 2 );
-
- // Do custom nav extras
- if ( 1 == genesis_get_option( 'trestle_custom_nav_extras' ) ) {
- // Remove default nav extras
- remove_filter( 'wp_nav_menu_items', 'genesis_nav_right' );
-
- // Add custom nav extras
- add_filter( 'wp_nav_menu_items', 'trestle_custom_nav_extras', 10, 2 );
- }
-
- // Create placeholder navigation menu object if needed
- trestle_nav_placeholder();
-}
-
-/**
- * Adds button to open primary mobile navigation menu.
- *
- * @since 1.0.0
- */
-function trestle_add_mobile_nav() {
- // Only add the button if there is a primary menu
- if ( 1 == genesis_get_option( 'trestle_auto_nav' ) || has_nav_menu( 'primary' ) )
- echo '';
-}
-
-/**
- * Auto-generates list of pages for use in the primary navigation menu.
- *
- * @since 1.0.0
- *
- * @param string $nav_items list of navigation menu items.
- * @param stdClass $menu_args Arguments for the menu.
- * @return string list of (modified) navigation menu items.
- */
-function trestle_auto_nav_items( $nav_items, stdClass $menu_args ) {
- if ( 'primary' == $menu_args->theme_location ) {
- $args = array(
- 'depth' => genesis_get_option( 'trestle_auto_nav_depth' ) ? genesis_get_option( 'trestle_auto_nav_depth' ) : 0,
- 'echo' => false,
- 'show_home' => ( genesis_get_option( 'trestle_include_home_link' ) && genesis_get_option( 'trestle_home_link_text' ) ) ? do_shortcode( genesis_get_option( 'trestle_home_link_text' ) ): genesis_get_option( 'trestle_include_home_link' ),
- 'menu_class' => 'auto-menu'
- );
-
- $ul_class = 'menu genesis-nav-menu menu-primary';
-
- $menu_args = new stdClass();
-
- $menu_args->theme_location = 'primary';
-
- $nav_items = wp_page_menu( $args );
-
- // Remove opening