0.4.5 Pre-Release commit
This commit is contained in:
parent
ff55d74d9d
commit
5c54ed29f9
18
README.md
18
README.md
|
@ -21,6 +21,15 @@ http://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
- ** Prerelease 0.4.5 Jun. 18th 2016 **
|
||||||
|
- Adding right sanitizing function for customizer
|
||||||
|
- Fixing some escaping problems
|
||||||
|
- Removing "add script" customizer function
|
||||||
|
- Calling all sidebars with "get_sidebar"
|
||||||
|
- Load hero area on index.php conditionally
|
||||||
|
- Remove unused code, files and dependencies
|
||||||
|
- Adding credits for WP Bootstrap Navwalker by Edward McIntyre
|
||||||
|
|
||||||
- **0.4.4 Jun. 18th 2016 **
|
- **0.4.4 Jun. 18th 2016 **
|
||||||
- Adding the new empty.php page template. Comes just with header, footer and a content area without markup. Good for build up landingpages. An empty canvas for your Bootstrap markup.
|
- Adding the new empty.php page template. Comes just with header, footer and a content area without markup. Good for build up landingpages. An empty canvas for your Bootstrap markup.
|
||||||
- Update bower.json dependencies to latest versions
|
- Update bower.json dependencies to latest versions
|
||||||
|
@ -173,3 +182,12 @@ The front-page slider is widget driven. Simply add more than one widget to widge
|
||||||
- That’s it.
|
- That’s it.
|
||||||
|
|
||||||
[1] Visit [http://browsersync.io](http://browsersync.io) for more information on Browser Sync
|
[1] Visit [http://browsersync.io](http://browsersync.io) for more information on Browser Sync
|
||||||
|
|
||||||
|
Licenses & Credits
|
||||||
|
=
|
||||||
|
- Font Awesome: http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||||
|
- Bootstrap: http://getbootstrap.com | https://github.com/twbs/bootstrap/blob/master/LICENSE (Code licensed under MIT documentation under CC BY 3.0.)
|
||||||
|
- Owl Carousel 2: http://www.owlcarousel.owlgraphic.com/ | https://github.com/smashingboxes/OwlCarousel2/blob/develop/LICENSE (Code licensed under MIT)
|
||||||
|
and of course
|
||||||
|
- jQuery: https://jquery.org | (Code licensed under MIT)
|
||||||
|
- WP Bootstrap Navwalker by Edward McIntyre: https://github.com/twittem/wp-bootstrap-navwalker | GNU GPL
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
<?php if ( comments_open() ) : ?>
|
|
||||||
|
|
||||||
<!-- Kommentar eingeben -->
|
|
||||||
|
|
||||||
<h3><?php _e( 'Write Comment.', 'understrap' ); ?> <small class="text-danger"><?php _e( '*Mandatory', 'understrap' ); ?></small></h3>
|
|
||||||
|
|
||||||
<input type="hidden" name="redirect_to" value="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>" />
|
|
||||||
|
|
||||||
<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform" role="form">
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="author"><?php _e( 'Name', 'understrap' ); ?> <small class="text-danger">*</small></label>
|
|
||||||
<input class="form-control" type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="email"><?php _e( 'E-Mail', 'understrap' ); ?> <small>( <?php _e( 'Not public.', 'understrap' ); ?> )</small><small class="text-danger">*</small></label>
|
|
||||||
<input class="form-control" type="email" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2"/>
|
|
||||||
</div>
|
|
||||||
<hr/>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="url"><?php _e( 'Website', 'understrap' ); ?></label>
|
|
||||||
<input class="form-control" type="url" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
|
|
||||||
</div>
|
|
||||||
<hr/>
|
|
||||||
<div class="form-group">
|
|
||||||
<label><?php _e( 'Your Comment', 'understrap' ); ?> <small class="text-danger">*</small></label>
|
|
||||||
<textarea class="form-control" name="comment" id="comment" style="width: 100%;" rows="10" tabindex="4"></textarea>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="form-group text-center">
|
|
||||||
<input class="form-control btn btn-primary" name="submit" type="submit" id="submit" tabindex="5" value="<?php _e( 'Send comment.', 'understrap' ); ?>" />
|
|
||||||
<input class="form-control" type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php do_action('comment_form', $post->ID); ?>
|
|
||||||
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<?php endif ?>
|
|
|
@ -8,7 +8,7 @@
|
||||||
*/
|
*/
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<?php get_template_part('widget-templates/footerfull'); ?>
|
<?php get_sidebar('footerfull'); ?>
|
||||||
|
|
||||||
<div class="wrapper" id="wrapper-footer">
|
<div class="wrapper" id="wrapper-footer">
|
||||||
|
|
||||||
|
|
|
@ -27,11 +27,6 @@ require get_template_directory() . '/inc/security.php';
|
||||||
*/
|
*/
|
||||||
require get_template_directory() . '/inc/enqueue.php';
|
require get_template_directory() . '/inc/enqueue.php';
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement the Custom Header feature.
|
|
||||||
*/
|
|
||||||
//require get_template_directory() . '/inc/custom-header.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom template tags for this theme.
|
* Custom template tags for this theme.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Sample implementation of the Custom Header feature
|
|
||||||
* http://codex.wordpress.org/Custom_Headers
|
|
||||||
*
|
|
||||||
* You can add an optional custom header image to header.php like so ...
|
|
||||||
*
|
|
||||||
* <?php if ( get_header_image() ) : ?>
|
|
||||||
* <a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home">
|
|
||||||
* <img src="<?php header_image(); ?>" width="<?php echo esc_attr( get_custom_header()->width ); ?>" height="<?php echo esc_attr( get_custom_header()->height ); ?>" alt="">
|
|
||||||
* </a>
|
|
||||||
* <?php endif; // End header image check. ?>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @package understrap
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up the WordPress core custom header feature.
|
|
||||||
*
|
|
||||||
* @uses understrap_header_style()
|
|
||||||
* @uses understrap_admin_header_style()
|
|
||||||
* @uses understrap_admin_header_image()
|
|
||||||
*/
|
|
||||||
function understrap_custom_header_setup() {
|
|
||||||
add_theme_support( 'custom-header', apply_filters( 'understrap_custom_header_args', array(
|
|
||||||
'default-image' => '',
|
|
||||||
'default-text-color' => '000000',
|
|
||||||
'width' => 1000,
|
|
||||||
'height' => 250,
|
|
||||||
'flex-height' => true,
|
|
||||||
'wp-head-callback' => 'understrap_header_style',
|
|
||||||
'admin-head-callback' => 'understrap_admin_header_style',
|
|
||||||
'admin-preview-callback' => 'understrap_admin_header_image',
|
|
||||||
) ) );
|
|
||||||
}
|
|
||||||
add_action( 'after_setup_theme', 'understrap_custom_header_setup' );
|
|
||||||
|
|
||||||
if ( ! function_exists( 'understrap_header_style' ) ) :
|
|
||||||
/**
|
|
||||||
* Styles the header image and text displayed on the blog
|
|
||||||
*
|
|
||||||
* @see understrap_custom_header_setup().
|
|
||||||
*/
|
|
||||||
function understrap_header_style() {
|
|
||||||
$header_text_color = get_header_textcolor();
|
|
||||||
|
|
||||||
// If no custom options for text are set, let's bail
|
|
||||||
// get_header_textcolor() options: HEADER_TEXTCOLOR is default, hide text (returns 'blank') or any hex value
|
|
||||||
if ( HEADER_TEXTCOLOR == $header_text_color ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get this far, we have custom styles. Let's do this.
|
|
||||||
?>
|
|
||||||
<style type="text/css">
|
|
||||||
<?php
|
|
||||||
// Has the text been hidden?
|
|
||||||
if ( 'blank' == $header_text_color ) :
|
|
||||||
?>
|
|
||||||
.site-title,
|
|
||||||
.site-description {
|
|
||||||
position: absolute;
|
|
||||||
clip: rect(1px, 1px, 1px, 1px);
|
|
||||||
}
|
|
||||||
<?php
|
|
||||||
// If the user has set a custom color for the text use that
|
|
||||||
else :
|
|
||||||
?>
|
|
||||||
.site-title a,
|
|
||||||
.site-description {
|
|
||||||
color: #<?php echo esc_attr( $header_text_color ); ?>;
|
|
||||||
}
|
|
||||||
<?php endif; ?>
|
|
||||||
</style>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
endif; // understrap_header_style
|
|
||||||
|
|
||||||
if ( ! function_exists( 'understrap_admin_header_style' ) ) :
|
|
||||||
/**
|
|
||||||
* Styles the header image displayed on the Appearance > Header admin panel.
|
|
||||||
*
|
|
||||||
* @see understrap_custom_header_setup().
|
|
||||||
*/
|
|
||||||
function understrap_admin_header_style() {
|
|
||||||
?>
|
|
||||||
<style type="text/css">
|
|
||||||
.appearance_page_custom-header #headimg {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
#headimg h1,
|
|
||||||
#desc {
|
|
||||||
}
|
|
||||||
#headimg h1 {
|
|
||||||
}
|
|
||||||
#headimg h1 a {
|
|
||||||
}
|
|
||||||
#desc {
|
|
||||||
}
|
|
||||||
#headimg img {
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
endif; // understrap_admin_header_style
|
|
||||||
|
|
||||||
if ( ! function_exists( 'understrap_admin_header_image' ) ) :
|
|
||||||
/**
|
|
||||||
* Custom header image markup displayed on the Appearance > Header admin panel.
|
|
||||||
*
|
|
||||||
* @see understrap_custom_header_setup().
|
|
||||||
*/
|
|
||||||
function understrap_admin_header_image() {
|
|
||||||
$style = sprintf( ' style="color:#%s;"', get_header_textcolor() );
|
|
||||||
?>
|
|
||||||
<div id="headimg">
|
|
||||||
<h1 class="displaying-header-text"><a id="name"<?php echo $style; ?> onclick="return false;" href="<?php echo esc_url( home_url( '/' ) ); ?>"><?php bloginfo( 'name' ); ?></a></h1>
|
|
||||||
<div class="displaying-header-text" id="desc"<?php echo $style; ?>><?php bloginfo( 'description' ); ?></div>
|
|
||||||
<?php if ( get_header_image() ) : ?>
|
|
||||||
<img src="<?php header_image(); ?>" alt="">
|
|
||||||
<?php endif; ?>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
endif; // understrap_admin_header_image
|
|
|
@ -26,7 +26,7 @@ function understrap_theme_customize_register( $wp_customize ) {
|
||||||
|
|
||||||
$wp_customize->add_setting( 'understrap_theme_slider_count_setting', array(
|
$wp_customize->add_setting( 'understrap_theme_slider_count_setting', array(
|
||||||
'default' => '1',
|
'default' => '1',
|
||||||
'sanitize_callback' => 'esc_textarea'
|
'sanitize_callback' => 'absint'
|
||||||
) );
|
) );
|
||||||
|
|
||||||
$wp_customize->add_control( 'understrap_theme_slider_count', array(
|
$wp_customize->add_control( 'understrap_theme_slider_count', array(
|
||||||
|
@ -38,7 +38,7 @@ function understrap_theme_customize_register( $wp_customize ) {
|
||||||
|
|
||||||
$wp_customize->add_setting( 'understrap_theme_slider_time_setting', array(
|
$wp_customize->add_setting( 'understrap_theme_slider_time_setting', array(
|
||||||
'default' => '5000',
|
'default' => '5000',
|
||||||
'sanitize_callback' => 'esc_textarea'
|
'sanitize_callback' => 'absint'
|
||||||
) );
|
) );
|
||||||
|
|
||||||
$wp_customize->add_control( 'understrap_theme_slider_time', array(
|
$wp_customize->add_control( 'understrap_theme_slider_time', array(
|
||||||
|
|
|
@ -27,8 +27,8 @@ add_action("wp_enqueue_scripts","understrap_slider");
|
||||||
function understrap_slider(){
|
function understrap_slider(){
|
||||||
if ( is_front_page() ) {
|
if ( is_front_page() ) {
|
||||||
$data = array(
|
$data = array(
|
||||||
"timeout"=>get_theme_mod( 'understrap_theme_slider_time_setting', 5000 ),
|
"timeout"=> esc_attr( get_theme_mod( 'understrap_theme_slider_time_setting', 5000 )),
|
||||||
"items"=>get_theme_mod( 'understrap_theme_slider_count_setting', 1 )
|
"items"=> esc_attr( get_theme_mod( 'understrap_theme_slider_count_setting', 1 ))
|
||||||
);
|
);
|
||||||
|
|
||||||
wp_enqueue_script("understrap-slider-script", get_stylesheet_directory_uri() . '/js/slider_settings.js', array(), '0.4.4');
|
wp_enqueue_script("understrap-slider-script", get_stylesheet_directory_uri() . '/js/slider_settings.js', array(), '0.4.4');
|
||||||
|
|
|
@ -35,49 +35,6 @@ function understrap_body_classes( $classes ) {
|
||||||
}
|
}
|
||||||
add_filter( 'body_class', 'understrap_body_classes' );
|
add_filter( 'body_class', 'understrap_body_classes' );
|
||||||
|
|
||||||
if ( version_compare( $GLOBALS['wp_version'], '4.1', '<' ) ) :
|
|
||||||
/**
|
|
||||||
* Filters wp_title to print a neat <title> tag based on what is being viewed.
|
|
||||||
*
|
|
||||||
* @param string $title Default title text for current view.
|
|
||||||
* @param string $sep Optional separator.
|
|
||||||
* @return string The filtered title.
|
|
||||||
*/
|
|
||||||
function understrap_wp_title( $title, $sep ) {
|
|
||||||
if ( is_feed() ) {
|
|
||||||
return $title;
|
|
||||||
}
|
|
||||||
global $page, $paged;
|
|
||||||
// Add the blog name
|
|
||||||
$title .= get_bloginfo( 'name', 'display' );
|
|
||||||
// Add the blog description for the home/front page.
|
|
||||||
$site_description = get_bloginfo( 'description', 'display' );
|
|
||||||
if ( $site_description && ( is_home() || is_front_page() ) ) {
|
|
||||||
$title .= " $sep $site_description";
|
|
||||||
}
|
|
||||||
// Add a page number if necessary:
|
|
||||||
if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
|
|
||||||
$title .= " $sep " . sprintf( __( 'Page %s', 'understrap' ), max( $paged, $page ) );
|
|
||||||
}
|
|
||||||
return $title;
|
|
||||||
}
|
|
||||||
add_filter( 'wp_title', 'understrap_wp_title', 10, 2 );
|
|
||||||
/**
|
|
||||||
* Title shim for sites older than WordPress 4.1.
|
|
||||||
*
|
|
||||||
* @link https://make.wordpress.org/core/2014/10/29/title-tags-in-4-1/
|
|
||||||
* @todo Remove this function when WordPress 4.3 is released.
|
|
||||||
*/
|
|
||||||
function understrap_render_title() {
|
|
||||||
|
|
||||||
?>
|
|
||||||
<title><?php wp_title( '|', true, 'right' ); ?></title>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
add_action( 'wp_head', 'understrap_render_title' );
|
|
||||||
|
|
||||||
endif;
|
|
||||||
|
|
||||||
if ( ! function_exists( '_wp_render_title_tag' ) ) :
|
if ( ! function_exists( '_wp_render_title_tag' ) ) :
|
||||||
/**
|
/**
|
||||||
* Title shim for sites older than WordPress 4.1.
|
* Title shim for sites older than WordPress 4.1.
|
||||||
|
|
|
@ -123,98 +123,6 @@ function understrap_entry_footer() {
|
||||||
}
|
}
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
if ( ! function_exists( 'the_archive_title' ) ) :
|
|
||||||
/**
|
|
||||||
* Shim for `the_archive_title()`.
|
|
||||||
*
|
|
||||||
* Display the archive title based on the queried object.
|
|
||||||
*
|
|
||||||
* @todo Remove this function when WordPress 4.3 is released.
|
|
||||||
*
|
|
||||||
* @param string $before Optional. Content to prepend to the title. Default empty.
|
|
||||||
* @param string $after Optional. Content to append to the title. Default empty.
|
|
||||||
*/
|
|
||||||
function the_archive_title( $before = '', $after = '' ) {
|
|
||||||
if ( is_category() ) {
|
|
||||||
$title = sprintf( __( 'Category: %s', 'understrap' ), single_cat_title( '', false ) );
|
|
||||||
} elseif ( is_tag() ) {
|
|
||||||
$title = sprintf( __( 'Tag: %s', 'understrap' ), single_tag_title( '', false ) );
|
|
||||||
} elseif ( is_author() ) {
|
|
||||||
$title = sprintf( __( 'Author: %s', 'understrap' ), '<span class="vcard">' . get_the_author() . '</span>' );
|
|
||||||
} elseif ( is_year() ) {
|
|
||||||
$title = sprintf( __( 'Year: %s', 'understrap' ), get_the_date( _x( 'Y', 'yearly archives date format', 'understrap' ) ) );
|
|
||||||
} elseif ( is_month() ) {
|
|
||||||
$title = sprintf( __( 'Month: %s', 'understrap' ), get_the_date( _x( 'F Y', 'monthly archives date format', 'understrap' ) ) );
|
|
||||||
} elseif ( is_day() ) {
|
|
||||||
$title = sprintf( __( 'Day: %s', 'understrap' ), get_the_date( _x( 'F j, Y', 'daily archives date format', 'understrap' ) ) );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-aside' ) ) {
|
|
||||||
$title = _x( 'Asides', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) {
|
|
||||||
$title = _x( 'Galleries', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-image' ) ) {
|
|
||||||
$title = _x( 'Images', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-video' ) ) {
|
|
||||||
$title = _x( 'Videos', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-quote' ) ) {
|
|
||||||
$title = _x( 'Quotes', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-link' ) ) {
|
|
||||||
$title = _x( 'Links', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-status' ) ) {
|
|
||||||
$title = _x( 'Statuses', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-audio' ) ) {
|
|
||||||
$title = _x( 'Audio', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_tax( 'post_format', 'post-format-chat' ) ) {
|
|
||||||
$title = _x( 'Chats', 'post format archive title', 'understrap' );
|
|
||||||
} elseif ( is_post_type_archive() ) {
|
|
||||||
$title = sprintf( __( 'Archives: %s', 'understrap' ), post_type_archive_title( '', false ) );
|
|
||||||
} elseif ( is_tax() ) {
|
|
||||||
$tax = get_taxonomy( get_queried_object()->taxonomy );
|
|
||||||
/* translators: 1: Taxonomy singular name, 2: Current taxonomy term */
|
|
||||||
$title = sprintf( __( '%1$s: %2$s', 'understrap' ), $tax->labels->singular_name, single_term_title( '', false ) );
|
|
||||||
} else {
|
|
||||||
$title = __( 'Archives', 'understrap' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filter the archive title.
|
|
||||||
*
|
|
||||||
* @param string $title Archive title to be displayed.
|
|
||||||
*/
|
|
||||||
$title = apply_filters( 'get_the_archive_title', $title );
|
|
||||||
|
|
||||||
if ( ! empty( $title ) ) {
|
|
||||||
echo $before . $title . $after;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endif;
|
|
||||||
|
|
||||||
if ( ! function_exists( 'the_archive_description' ) ) :
|
|
||||||
/**
|
|
||||||
* Shim for `the_archive_description()`.
|
|
||||||
*
|
|
||||||
* Display category, tag, or term description.
|
|
||||||
*
|
|
||||||
* @todo Remove this function when WordPress 4.3 is released.
|
|
||||||
*
|
|
||||||
* @param string $before Optional. Content to prepend to the description. Default empty.
|
|
||||||
* @param string $after Optional. Content to append to the description. Default empty.
|
|
||||||
*/
|
|
||||||
function the_archive_description( $before = '', $after = '' ) {
|
|
||||||
$description = apply_filters( 'get_the_archive_description', term_description() );
|
|
||||||
|
|
||||||
if ( ! empty( $description ) ) {
|
|
||||||
/**
|
|
||||||
* Filter the archive description.
|
|
||||||
*
|
|
||||||
* @see term_description()
|
|
||||||
*
|
|
||||||
* @param string $description Archive description to be displayed.
|
|
||||||
*/
|
|
||||||
echo $before . $description . $after;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endif;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if a blog has more than 1 category.
|
* Returns true if a blog has more than 1 category.
|
||||||
*
|
*
|
||||||
|
|
14
index.php
14
index.php
|
@ -13,9 +13,17 @@
|
||||||
|
|
||||||
get_header(); ?>
|
get_header(); ?>
|
||||||
|
|
||||||
<?php get_template_part('widget-templates/hero'); ?>
|
<?php
|
||||||
|
if ( is_front_page() && is_home() ) {
|
||||||
|
|
||||||
<?php get_template_part('widget-templates/statichero'); ?>
|
get_sidebar('hero');
|
||||||
|
|
||||||
|
get_sidebar('statichero');
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Do nothing...or?
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
<div class="wrapper" id="wrapper-index">
|
<div class="wrapper" id="wrapper-index">
|
||||||
|
|
||||||
|
@ -43,7 +51,7 @@ get_header(); ?>
|
||||||
|
|
||||||
<?php endwhile; ?>
|
<?php endwhile; ?>
|
||||||
|
|
||||||
<?php understrap_paging_nav(); ?>
|
<?php the_posts_navigation(); ?>
|
||||||
|
|
||||||
<?php else : ?>
|
<?php else : ?>
|
||||||
|
|
||||||
|
|
18
readme.txt
18
readme.txt
|
@ -19,6 +19,15 @@ http://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
- ** Prerelease 0.4.5 Jun. 18th 2016 **
|
||||||
|
- Adding right sanitizing function for customizer
|
||||||
|
- Fixing some escaping problems
|
||||||
|
- Removing "add script" customizer function
|
||||||
|
- Calling all sidebars with "get_sidebar"
|
||||||
|
- Load hero area on index.php conditionally
|
||||||
|
- Remove unused code, files and dependencies
|
||||||
|
- Adding credits for WP Bootstrap Navwalker by Edward McIntyre
|
||||||
|
|
||||||
- **0.4.4 Jun. 18th 2016 **
|
- **0.4.4 Jun. 18th 2016 **
|
||||||
- Adding the new empty.php page template. Comes just with header, footer and a content area without markup. Good for build up landingpages. An empty canvas for your Bootstrap markup.
|
- Adding the new empty.php page template. Comes just with header, footer and a content area without markup. Good for build up landingpages. An empty canvas for your Bootstrap markup.
|
||||||
- Update bower.json dependencies to latest versions
|
- Update bower.json dependencies to latest versions
|
||||||
|
@ -171,3 +180,12 @@ The front-page slider is widget driven. Simply add more than one widget to widge
|
||||||
- That’s it.
|
- That’s it.
|
||||||
|
|
||||||
[1] Visit [http://browsersync.io](http://browsersync.io) for more information on Browser Sync
|
[1] Visit [http://browsersync.io](http://browsersync.io) for more information on Browser Sync
|
||||||
|
|
||||||
|
Licenses & Credits
|
||||||
|
=
|
||||||
|
- Font Awesome: http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||||
|
- Bootstrap: http://getbootstrap.com | https://github.com/twbs/bootstrap/blob/master/LICENSE (Code licensed under MIT documentation under CC BY 3.0.)
|
||||||
|
- Owl Carousel 2: http://www.owlcarousel.owlgraphic.com/ | https://github.com/smashingboxes/OwlCarousel2/blob/develop/LICENSE (Code licensed under MIT)
|
||||||
|
and of course
|
||||||
|
- jQuery: https://jquery.org | (Code licensed under MIT)
|
||||||
|
- WP Bootstrap Navwalker by Edward McIntyre: https://github.com/twittem/wp-bootstrap-navwalker | GNU GPL
|
||||||
|
|
|
@ -20,7 +20,7 @@ get_header(); ?>
|
||||||
|
|
||||||
<?php get_template_part( 'loop-templates/content', 'single' ); ?>
|
<?php get_template_part( 'loop-templates/content', 'single' ); ?>
|
||||||
|
|
||||||
<?php understrap_post_nav(); ?>
|
<?php the_post_navigation(); ?>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
// If comments are open or we have at least one comment, load up the comment template
|
// If comments are open or we have at least one comment, load up the comment template
|
||||||
|
@ -35,7 +35,7 @@ get_header(); ?>
|
||||||
|
|
||||||
</div><!-- #primary -->
|
</div><!-- #primary -->
|
||||||
|
|
||||||
<?php get_template_part('sidebar'); ?>
|
<?php get_sidebar('sidebar'); ?>
|
||||||
|
|
||||||
</div><!-- .row -->
|
</div><!-- .row -->
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,173 @@
|
||||||
|
/**
|
||||||
|
* Owl Carousel v2.1.1
|
||||||
|
* Copyright 2013-2016 David Deutsch
|
||||||
|
* Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Owl Carousel - Core
|
||||||
|
*/
|
||||||
|
.owl-carousel {
|
||||||
|
display: none;
|
||||||
|
width: 100%;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
/* position relative and z-index fix webkit rendering fonts issue */
|
||||||
|
position: relative;
|
||||||
|
z-index: 1; }
|
||||||
|
.owl-carousel .owl-stage {
|
||||||
|
position: relative;
|
||||||
|
-ms-touch-action: pan-Y; }
|
||||||
|
.owl-carousel .owl-stage:after {
|
||||||
|
content: ".";
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
visibility: hidden;
|
||||||
|
line-height: 0;
|
||||||
|
height: 0; }
|
||||||
|
.owl-carousel .owl-stage-outer {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
/* fix for flashing background */
|
||||||
|
-webkit-transform: translate3d(0px, 0px, 0px); }
|
||||||
|
.owl-carousel .owl-item {
|
||||||
|
position: relative;
|
||||||
|
min-height: 1px;
|
||||||
|
float: left;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
-webkit-touch-callout: none; }
|
||||||
|
.owl-carousel .owl-item img {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
-webkit-transform-style: preserve-3d; }
|
||||||
|
.owl-carousel .owl-nav.disabled,
|
||||||
|
.owl-carousel .owl-dots.disabled {
|
||||||
|
display: none; }
|
||||||
|
.owl-carousel .owl-nav .owl-prev,
|
||||||
|
.owl-carousel .owl-nav .owl-next,
|
||||||
|
.owl-carousel .owl-dot {
|
||||||
|
cursor: pointer;
|
||||||
|
cursor: hand;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none; }
|
||||||
|
.owl-carousel.owl-loaded {
|
||||||
|
display: block; }
|
||||||
|
.owl-carousel.owl-loading {
|
||||||
|
opacity: 0;
|
||||||
|
display: block; }
|
||||||
|
.owl-carousel.owl-hidden {
|
||||||
|
opacity: 0; }
|
||||||
|
.owl-carousel.owl-refresh .owl-item {
|
||||||
|
display: none; }
|
||||||
|
.owl-carousel.owl-drag .owl-item {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none; }
|
||||||
|
.owl-carousel.owl-grab {
|
||||||
|
cursor: move;
|
||||||
|
cursor: grab; }
|
||||||
|
.owl-carousel.owl-rtl {
|
||||||
|
direction: rtl; }
|
||||||
|
.owl-carousel.owl-rtl .owl-item {
|
||||||
|
float: right; }
|
||||||
|
|
||||||
|
/* No Js */
|
||||||
|
.no-js .owl-carousel {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Owl Carousel - Animate Plugin
|
||||||
|
*/
|
||||||
|
.owl-carousel .animated {
|
||||||
|
-webkit-animation-duration: 1000ms;
|
||||||
|
animation-duration: 1000ms;
|
||||||
|
-webkit-animation-fill-mode: both;
|
||||||
|
animation-fill-mode: both; }
|
||||||
|
|
||||||
|
.owl-carousel .owl-animated-in {
|
||||||
|
z-index: 0; }
|
||||||
|
|
||||||
|
.owl-carousel .owl-animated-out {
|
||||||
|
z-index: 1; }
|
||||||
|
|
||||||
|
.owl-carousel .fadeOut {
|
||||||
|
-webkit-animation-name: fadeOut;
|
||||||
|
animation-name: fadeOut; }
|
||||||
|
|
||||||
|
@-webkit-keyframes fadeOut {
|
||||||
|
0% {
|
||||||
|
opacity: 1; }
|
||||||
|
100% {
|
||||||
|
opacity: 0; } }
|
||||||
|
|
||||||
|
@keyframes fadeOut {
|
||||||
|
0% {
|
||||||
|
opacity: 1; }
|
||||||
|
100% {
|
||||||
|
opacity: 0; } }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Owl Carousel - Auto Height Plugin
|
||||||
|
*/
|
||||||
|
.owl-height {
|
||||||
|
transition: height 500ms ease-in-out; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Owl Carousel - Lazy Load Plugin
|
||||||
|
*/
|
||||||
|
.owl-carousel .owl-item .owl-lazy {
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 400ms ease; }
|
||||||
|
|
||||||
|
.owl-carousel .owl-item img.owl-lazy {
|
||||||
|
-webkit-transform-style: preserve-3d;
|
||||||
|
transform-style: preserve-3d; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Owl Carousel - Video Plugin
|
||||||
|
*/
|
||||||
|
.owl-carousel .owl-video-wrapper {
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
background: #000; }
|
||||||
|
|
||||||
|
.owl-carousel .owl-video-play-icon {
|
||||||
|
position: absolute;
|
||||||
|
height: 80px;
|
||||||
|
width: 80px;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
margin-left: -40px;
|
||||||
|
margin-top: -40px;
|
||||||
|
background: url("owl.video.play.png") no-repeat;
|
||||||
|
cursor: pointer;
|
||||||
|
z-index: 1;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
transition: -webkit-transform 100ms ease;
|
||||||
|
transition: transform 100ms ease; }
|
||||||
|
|
||||||
|
.owl-carousel .owl-video-play-icon:hover {
|
||||||
|
-webkit-transform: scale(1.3, 1.3);
|
||||||
|
-ms-transform: scale(1.3, 1.3);
|
||||||
|
transform: scale(1.3, 1.3); }
|
||||||
|
|
||||||
|
.owl-carousel .owl-video-playing .owl-video-tn,
|
||||||
|
.owl-carousel .owl-video-playing .owl-video-play-icon {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.owl-carousel .owl-video-tn {
|
||||||
|
opacity: 0;
|
||||||
|
height: 100%;
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: contain;
|
||||||
|
transition: opacity 400ms ease; }
|
||||||
|
|
||||||
|
.owl-carousel .owl-video-frame {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%; }
|
|
@ -0,0 +1,6 @@
|
||||||
|
/**
|
||||||
|
* Owl Carousel v2.1.1
|
||||||
|
* Copyright 2013-2016 David Deutsch
|
||||||
|
* Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%;-webkit-transform-style:preserve-3d}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loaded{display:block}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{display:none}.owl-carousel.owl-drag .owl-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.no-js .owl-carousel{display:block}.owl-carousel .animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item img.owl-lazy{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:-webkit-transform .1s ease;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-webkit-transform:scale(1.3,1.3);-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
|
|
@ -0,0 +1,5 @@
|
||||||
|
/**
|
||||||
|
* Owl Carousel v2.1.1
|
||||||
|
* Copyright 2013-2016 David Deutsch
|
||||||
|
* Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
|
||||||
|
*/
|
|
@ -0,0 +1,5 @@
|
||||||
|
/**
|
||||||
|
* Owl Carousel v2.1.1
|
||||||
|
* Copyright 2013-2016 David Deutsch
|
||||||
|
* Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
|
||||||
|
*/
|
|
@ -1,12 +0,0 @@
|
||||||
//= require ./bootstrap/affix
|
|
||||||
//= require ./bootstrap/alert
|
|
||||||
//= require ./bootstrap/button
|
|
||||||
//= require ./bootstrap/carousel
|
|
||||||
//= require ./bootstrap/collapse
|
|
||||||
//= require ./bootstrap/dropdown
|
|
||||||
//= require ./bootstrap/modal
|
|
||||||
//= require ./bootstrap/scrollspy
|
|
||||||
//= require ./bootstrap/tab
|
|
||||||
//= require ./bootstrap/transition
|
|
||||||
//= require ./bootstrap/tooltip
|
|
||||||
//= require ./bootstrap/popover
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -1,162 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: affix.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#affix
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// AFFIX CLASS DEFINITION
|
|
||||||
// ======================
|
|
||||||
|
|
||||||
var Affix = function (element, options) {
|
|
||||||
this.options = $.extend({}, Affix.DEFAULTS, options)
|
|
||||||
|
|
||||||
this.$target = $(this.options.target)
|
|
||||||
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
|
|
||||||
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
|
|
||||||
|
|
||||||
this.$element = $(element)
|
|
||||||
this.affixed = null
|
|
||||||
this.unpin = null
|
|
||||||
this.pinnedOffset = null
|
|
||||||
|
|
||||||
this.checkPosition()
|
|
||||||
}
|
|
||||||
|
|
||||||
Affix.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Affix.RESET = 'affix affix-top affix-bottom'
|
|
||||||
|
|
||||||
Affix.DEFAULTS = {
|
|
||||||
offset: 0,
|
|
||||||
target: window
|
|
||||||
}
|
|
||||||
|
|
||||||
Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
|
|
||||||
var scrollTop = this.$target.scrollTop()
|
|
||||||
var position = this.$element.offset()
|
|
||||||
var targetHeight = this.$target.height()
|
|
||||||
|
|
||||||
if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
|
|
||||||
|
|
||||||
if (this.affixed == 'bottom') {
|
|
||||||
if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
|
|
||||||
return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
|
|
||||||
}
|
|
||||||
|
|
||||||
var initializing = this.affixed == null
|
|
||||||
var colliderTop = initializing ? scrollTop : position.top
|
|
||||||
var colliderHeight = initializing ? targetHeight : height
|
|
||||||
|
|
||||||
if (offsetTop != null && scrollTop <= offsetTop) return 'top'
|
|
||||||
if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
Affix.prototype.getPinnedOffset = function () {
|
|
||||||
if (this.pinnedOffset) return this.pinnedOffset
|
|
||||||
this.$element.removeClass(Affix.RESET).addClass('affix')
|
|
||||||
var scrollTop = this.$target.scrollTop()
|
|
||||||
var position = this.$element.offset()
|
|
||||||
return (this.pinnedOffset = position.top - scrollTop)
|
|
||||||
}
|
|
||||||
|
|
||||||
Affix.prototype.checkPositionWithEventLoop = function () {
|
|
||||||
setTimeout($.proxy(this.checkPosition, this), 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
Affix.prototype.checkPosition = function () {
|
|
||||||
if (!this.$element.is(':visible')) return
|
|
||||||
|
|
||||||
var height = this.$element.height()
|
|
||||||
var offset = this.options.offset
|
|
||||||
var offsetTop = offset.top
|
|
||||||
var offsetBottom = offset.bottom
|
|
||||||
var scrollHeight = Math.max($(document).height(), $(document.body).height())
|
|
||||||
|
|
||||||
if (typeof offset != 'object') offsetBottom = offsetTop = offset
|
|
||||||
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
|
|
||||||
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
|
|
||||||
|
|
||||||
var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
|
|
||||||
|
|
||||||
if (this.affixed != affix) {
|
|
||||||
if (this.unpin != null) this.$element.css('top', '')
|
|
||||||
|
|
||||||
var affixType = 'affix' + (affix ? '-' + affix : '')
|
|
||||||
var e = $.Event(affixType + '.bs.affix')
|
|
||||||
|
|
||||||
this.$element.trigger(e)
|
|
||||||
|
|
||||||
if (e.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
this.affixed = affix
|
|
||||||
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
|
|
||||||
|
|
||||||
this.$element
|
|
||||||
.removeClass(Affix.RESET)
|
|
||||||
.addClass(affixType)
|
|
||||||
.trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (affix == 'bottom') {
|
|
||||||
this.$element.offset({
|
|
||||||
top: scrollHeight - height - offsetBottom
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// AFFIX PLUGIN DEFINITION
|
|
||||||
// =======================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.affix')
|
|
||||||
var options = typeof option == 'object' && option
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
|
|
||||||
if (typeof option == 'string') data[option]()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.affix
|
|
||||||
|
|
||||||
$.fn.affix = Plugin
|
|
||||||
$.fn.affix.Constructor = Affix
|
|
||||||
|
|
||||||
|
|
||||||
// AFFIX NO CONFLICT
|
|
||||||
// =================
|
|
||||||
|
|
||||||
$.fn.affix.noConflict = function () {
|
|
||||||
$.fn.affix = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// AFFIX DATA-API
|
|
||||||
// ==============
|
|
||||||
|
|
||||||
$(window).on('load', function () {
|
|
||||||
$('[data-spy="affix"]').each(function () {
|
|
||||||
var $spy = $(this)
|
|
||||||
var data = $spy.data()
|
|
||||||
|
|
||||||
data.offset = data.offset || {}
|
|
||||||
|
|
||||||
if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
|
|
||||||
if (data.offsetTop != null) data.offset.top = data.offsetTop
|
|
||||||
|
|
||||||
Plugin.call($spy, data)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,94 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: alert.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#alerts
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// ALERT CLASS DEFINITION
|
|
||||||
// ======================
|
|
||||||
|
|
||||||
var dismiss = '[data-dismiss="alert"]'
|
|
||||||
var Alert = function (el) {
|
|
||||||
$(el).on('click', dismiss, this.close)
|
|
||||||
}
|
|
||||||
|
|
||||||
Alert.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Alert.TRANSITION_DURATION = 150
|
|
||||||
|
|
||||||
Alert.prototype.close = function (e) {
|
|
||||||
var $this = $(this)
|
|
||||||
var selector = $this.attr('data-target')
|
|
||||||
|
|
||||||
if (!selector) {
|
|
||||||
selector = $this.attr('href')
|
|
||||||
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
|
|
||||||
}
|
|
||||||
|
|
||||||
var $parent = $(selector)
|
|
||||||
|
|
||||||
if (e) e.preventDefault()
|
|
||||||
|
|
||||||
if (!$parent.length) {
|
|
||||||
$parent = $this.closest('.alert')
|
|
||||||
}
|
|
||||||
|
|
||||||
$parent.trigger(e = $.Event('close.bs.alert'))
|
|
||||||
|
|
||||||
if (e.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
$parent.removeClass('in')
|
|
||||||
|
|
||||||
function removeElement() {
|
|
||||||
// detach from parent, fire event then clean up data
|
|
||||||
$parent.detach().trigger('closed.bs.alert').remove()
|
|
||||||
}
|
|
||||||
|
|
||||||
$.support.transition && $parent.hasClass('fade') ?
|
|
||||||
$parent
|
|
||||||
.one('bsTransitionEnd', removeElement)
|
|
||||||
.emulateTransitionEnd(Alert.TRANSITION_DURATION) :
|
|
||||||
removeElement()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ALERT PLUGIN DEFINITION
|
|
||||||
// =======================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.alert')
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.alert', (data = new Alert(this)))
|
|
||||||
if (typeof option == 'string') data[option].call($this)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.alert
|
|
||||||
|
|
||||||
$.fn.alert = Plugin
|
|
||||||
$.fn.alert.Constructor = Alert
|
|
||||||
|
|
||||||
|
|
||||||
// ALERT NO CONFLICT
|
|
||||||
// =================
|
|
||||||
|
|
||||||
$.fn.alert.noConflict = function () {
|
|
||||||
$.fn.alert = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ALERT DATA-API
|
|
||||||
// ==============
|
|
||||||
|
|
||||||
$(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,120 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: button.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#buttons
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// BUTTON PUBLIC CLASS DEFINITION
|
|
||||||
// ==============================
|
|
||||||
|
|
||||||
var Button = function (element, options) {
|
|
||||||
this.$element = $(element)
|
|
||||||
this.options = $.extend({}, Button.DEFAULTS, options)
|
|
||||||
this.isLoading = false
|
|
||||||
}
|
|
||||||
|
|
||||||
Button.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Button.DEFAULTS = {
|
|
||||||
loadingText: 'loading...'
|
|
||||||
}
|
|
||||||
|
|
||||||
Button.prototype.setState = function (state) {
|
|
||||||
var d = 'disabled'
|
|
||||||
var $el = this.$element
|
|
||||||
var val = $el.is('input') ? 'val' : 'html'
|
|
||||||
var data = $el.data()
|
|
||||||
|
|
||||||
state += 'Text'
|
|
||||||
|
|
||||||
if (data.resetText == null) $el.data('resetText', $el[val]())
|
|
||||||
|
|
||||||
// push to event loop to allow forms to submit
|
|
||||||
setTimeout($.proxy(function () {
|
|
||||||
$el[val](data[state] == null ? this.options[state] : data[state])
|
|
||||||
|
|
||||||
if (state == 'loadingText') {
|
|
||||||
this.isLoading = true
|
|
||||||
$el.addClass(d).attr(d, d)
|
|
||||||
} else if (this.isLoading) {
|
|
||||||
this.isLoading = false
|
|
||||||
$el.removeClass(d).removeAttr(d)
|
|
||||||
}
|
|
||||||
}, this), 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
Button.prototype.toggle = function () {
|
|
||||||
var changed = true
|
|
||||||
var $parent = this.$element.closest('[data-toggle="buttons"]')
|
|
||||||
|
|
||||||
if ($parent.length) {
|
|
||||||
var $input = this.$element.find('input')
|
|
||||||
if ($input.prop('type') == 'radio') {
|
|
||||||
if ($input.prop('checked')) changed = false
|
|
||||||
$parent.find('.active').removeClass('active')
|
|
||||||
this.$element.addClass('active')
|
|
||||||
} else if ($input.prop('type') == 'checkbox') {
|
|
||||||
if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
|
|
||||||
this.$element.toggleClass('active')
|
|
||||||
}
|
|
||||||
$input.prop('checked', this.$element.hasClass('active'))
|
|
||||||
if (changed) $input.trigger('change')
|
|
||||||
} else {
|
|
||||||
this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
|
|
||||||
this.$element.toggleClass('active')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// BUTTON PLUGIN DEFINITION
|
|
||||||
// ========================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.button')
|
|
||||||
var options = typeof option == 'object' && option
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.button', (data = new Button(this, options)))
|
|
||||||
|
|
||||||
if (option == 'toggle') data.toggle()
|
|
||||||
else if (option) data.setState(option)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.button
|
|
||||||
|
|
||||||
$.fn.button = Plugin
|
|
||||||
$.fn.button.Constructor = Button
|
|
||||||
|
|
||||||
|
|
||||||
// BUTTON NO CONFLICT
|
|
||||||
// ==================
|
|
||||||
|
|
||||||
$.fn.button.noConflict = function () {
|
|
||||||
$.fn.button = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// BUTTON DATA-API
|
|
||||||
// ===============
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
|
|
||||||
var $btn = $(e.target)
|
|
||||||
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
|
|
||||||
Plugin.call($btn, 'toggle')
|
|
||||||
if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
|
|
||||||
})
|
|
||||||
.on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
|
|
||||||
$(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
|
|
||||||
})
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,237 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: carousel.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#carousel
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// CAROUSEL CLASS DEFINITION
|
|
||||||
// =========================
|
|
||||||
|
|
||||||
var Carousel = function (element, options) {
|
|
||||||
this.$element = $(element)
|
|
||||||
this.$indicators = this.$element.find('.carousel-indicators')
|
|
||||||
this.options = options
|
|
||||||
this.paused = null
|
|
||||||
this.sliding = null
|
|
||||||
this.interval = null
|
|
||||||
this.$active = null
|
|
||||||
this.$items = null
|
|
||||||
|
|
||||||
this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
|
|
||||||
|
|
||||||
this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
|
|
||||||
.on('mouseenter.bs.carousel', $.proxy(this.pause, this))
|
|
||||||
.on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Carousel.TRANSITION_DURATION = 600
|
|
||||||
|
|
||||||
Carousel.DEFAULTS = {
|
|
||||||
interval: 5000,
|
|
||||||
pause: 'hover',
|
|
||||||
wrap: true,
|
|
||||||
keyboard: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.keydown = function (e) {
|
|
||||||
if (/input|textarea/i.test(e.target.tagName)) return
|
|
||||||
switch (e.which) {
|
|
||||||
case 37: this.prev(); break
|
|
||||||
case 39: this.next(); break
|
|
||||||
default: return
|
|
||||||
}
|
|
||||||
|
|
||||||
e.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.cycle = function (e) {
|
|
||||||
e || (this.paused = false)
|
|
||||||
|
|
||||||
this.interval && clearInterval(this.interval)
|
|
||||||
|
|
||||||
this.options.interval
|
|
||||||
&& !this.paused
|
|
||||||
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
|
|
||||||
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.getItemIndex = function (item) {
|
|
||||||
this.$items = item.parent().children('.item')
|
|
||||||
return this.$items.index(item || this.$active)
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.getItemForDirection = function (direction, active) {
|
|
||||||
var activeIndex = this.getItemIndex(active)
|
|
||||||
var willWrap = (direction == 'prev' && activeIndex === 0)
|
|
||||||
|| (direction == 'next' && activeIndex == (this.$items.length - 1))
|
|
||||||
if (willWrap && !this.options.wrap) return active
|
|
||||||
var delta = direction == 'prev' ? -1 : 1
|
|
||||||
var itemIndex = (activeIndex + delta) % this.$items.length
|
|
||||||
return this.$items.eq(itemIndex)
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.to = function (pos) {
|
|
||||||
var that = this
|
|
||||||
var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
|
|
||||||
|
|
||||||
if (pos > (this.$items.length - 1) || pos < 0) return
|
|
||||||
|
|
||||||
if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
|
|
||||||
if (activeIndex == pos) return this.pause().cycle()
|
|
||||||
|
|
||||||
return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.pause = function (e) {
|
|
||||||
e || (this.paused = true)
|
|
||||||
|
|
||||||
if (this.$element.find('.next, .prev').length && $.support.transition) {
|
|
||||||
this.$element.trigger($.support.transition.end)
|
|
||||||
this.cycle(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.interval = clearInterval(this.interval)
|
|
||||||
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.next = function () {
|
|
||||||
if (this.sliding) return
|
|
||||||
return this.slide('next')
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.prev = function () {
|
|
||||||
if (this.sliding) return
|
|
||||||
return this.slide('prev')
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.prototype.slide = function (type, next) {
|
|
||||||
var $active = this.$element.find('.item.active')
|
|
||||||
var $next = next || this.getItemForDirection(type, $active)
|
|
||||||
var isCycling = this.interval
|
|
||||||
var direction = type == 'next' ? 'left' : 'right'
|
|
||||||
var that = this
|
|
||||||
|
|
||||||
if ($next.hasClass('active')) return (this.sliding = false)
|
|
||||||
|
|
||||||
var relatedTarget = $next[0]
|
|
||||||
var slideEvent = $.Event('slide.bs.carousel', {
|
|
||||||
relatedTarget: relatedTarget,
|
|
||||||
direction: direction
|
|
||||||
})
|
|
||||||
this.$element.trigger(slideEvent)
|
|
||||||
if (slideEvent.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
this.sliding = true
|
|
||||||
|
|
||||||
isCycling && this.pause()
|
|
||||||
|
|
||||||
if (this.$indicators.length) {
|
|
||||||
this.$indicators.find('.active').removeClass('active')
|
|
||||||
var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
|
|
||||||
$nextIndicator && $nextIndicator.addClass('active')
|
|
||||||
}
|
|
||||||
|
|
||||||
var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
|
|
||||||
if ($.support.transition && this.$element.hasClass('slide')) {
|
|
||||||
$next.addClass(type)
|
|
||||||
$next[0].offsetWidth // force reflow
|
|
||||||
$active.addClass(direction)
|
|
||||||
$next.addClass(direction)
|
|
||||||
$active
|
|
||||||
.one('bsTransitionEnd', function () {
|
|
||||||
$next.removeClass([type, direction].join(' ')).addClass('active')
|
|
||||||
$active.removeClass(['active', direction].join(' '))
|
|
||||||
that.sliding = false
|
|
||||||
setTimeout(function () {
|
|
||||||
that.$element.trigger(slidEvent)
|
|
||||||
}, 0)
|
|
||||||
})
|
|
||||||
.emulateTransitionEnd(Carousel.TRANSITION_DURATION)
|
|
||||||
} else {
|
|
||||||
$active.removeClass('active')
|
|
||||||
$next.addClass('active')
|
|
||||||
this.sliding = false
|
|
||||||
this.$element.trigger(slidEvent)
|
|
||||||
}
|
|
||||||
|
|
||||||
isCycling && this.cycle()
|
|
||||||
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// CAROUSEL PLUGIN DEFINITION
|
|
||||||
// ==========================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.carousel')
|
|
||||||
var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
|
||||||
var action = typeof option == 'string' ? option : options.slide
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
|
|
||||||
if (typeof option == 'number') data.to(option)
|
|
||||||
else if (action) data[action]()
|
|
||||||
else if (options.interval) data.pause().cycle()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.carousel
|
|
||||||
|
|
||||||
$.fn.carousel = Plugin
|
|
||||||
$.fn.carousel.Constructor = Carousel
|
|
||||||
|
|
||||||
|
|
||||||
// CAROUSEL NO CONFLICT
|
|
||||||
// ====================
|
|
||||||
|
|
||||||
$.fn.carousel.noConflict = function () {
|
|
||||||
$.fn.carousel = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// CAROUSEL DATA-API
|
|
||||||
// =================
|
|
||||||
|
|
||||||
var clickHandler = function (e) {
|
|
||||||
var href
|
|
||||||
var $this = $(this)
|
|
||||||
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
|
|
||||||
if (!$target.hasClass('carousel')) return
|
|
||||||
var options = $.extend({}, $target.data(), $this.data())
|
|
||||||
var slideIndex = $this.attr('data-slide-to')
|
|
||||||
if (slideIndex) options.interval = false
|
|
||||||
|
|
||||||
Plugin.call($target, options)
|
|
||||||
|
|
||||||
if (slideIndex) {
|
|
||||||
$target.data('bs.carousel').to(slideIndex)
|
|
||||||
}
|
|
||||||
|
|
||||||
e.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
|
|
||||||
.on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
|
|
||||||
|
|
||||||
$(window).on('load', function () {
|
|
||||||
$('[data-ride="carousel"]').each(function () {
|
|
||||||
var $carousel = $(this)
|
|
||||||
Plugin.call($carousel, $carousel.data())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,211 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: collapse.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#collapse
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// COLLAPSE PUBLIC CLASS DEFINITION
|
|
||||||
// ================================
|
|
||||||
|
|
||||||
var Collapse = function (element, options) {
|
|
||||||
this.$element = $(element)
|
|
||||||
this.options = $.extend({}, Collapse.DEFAULTS, options)
|
|
||||||
this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
|
|
||||||
'[data-toggle="collapse"][data-target="#' + element.id + '"]')
|
|
||||||
this.transitioning = null
|
|
||||||
|
|
||||||
if (this.options.parent) {
|
|
||||||
this.$parent = this.getParent()
|
|
||||||
} else {
|
|
||||||
this.addAriaAndCollapsedClass(this.$element, this.$trigger)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.options.toggle) this.toggle()
|
|
||||||
}
|
|
||||||
|
|
||||||
Collapse.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Collapse.TRANSITION_DURATION = 350
|
|
||||||
|
|
||||||
Collapse.DEFAULTS = {
|
|
||||||
toggle: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Collapse.prototype.dimension = function () {
|
|
||||||
var hasWidth = this.$element.hasClass('width')
|
|
||||||
return hasWidth ? 'width' : 'height'
|
|
||||||
}
|
|
||||||
|
|
||||||
Collapse.prototype.show = function () {
|
|
||||||
if (this.transitioning || this.$element.hasClass('in')) return
|
|
||||||
|
|
||||||
var activesData
|
|
||||||
var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
|
|
||||||
|
|
||||||
if (actives && actives.length) {
|
|
||||||
activesData = actives.data('bs.collapse')
|
|
||||||
if (activesData && activesData.transitioning) return
|
|
||||||
}
|
|
||||||
|
|
||||||
var startEvent = $.Event('show.bs.collapse')
|
|
||||||
this.$element.trigger(startEvent)
|
|
||||||
if (startEvent.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
if (actives && actives.length) {
|
|
||||||
Plugin.call(actives, 'hide')
|
|
||||||
activesData || actives.data('bs.collapse', null)
|
|
||||||
}
|
|
||||||
|
|
||||||
var dimension = this.dimension()
|
|
||||||
|
|
||||||
this.$element
|
|
||||||
.removeClass('collapse')
|
|
||||||
.addClass('collapsing')[dimension](0)
|
|
||||||
.attr('aria-expanded', true)
|
|
||||||
|
|
||||||
this.$trigger
|
|
||||||
.removeClass('collapsed')
|
|
||||||
.attr('aria-expanded', true)
|
|
||||||
|
|
||||||
this.transitioning = 1
|
|
||||||
|
|
||||||
var complete = function () {
|
|
||||||
this.$element
|
|
||||||
.removeClass('collapsing')
|
|
||||||
.addClass('collapse in')[dimension]('')
|
|
||||||
this.transitioning = 0
|
|
||||||
this.$element
|
|
||||||
.trigger('shown.bs.collapse')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$.support.transition) return complete.call(this)
|
|
||||||
|
|
||||||
var scrollSize = $.camelCase(['scroll', dimension].join('-'))
|
|
||||||
|
|
||||||
this.$element
|
|
||||||
.one('bsTransitionEnd', $.proxy(complete, this))
|
|
||||||
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
|
|
||||||
}
|
|
||||||
|
|
||||||
Collapse.prototype.hide = function () {
|
|
||||||
if (this.transitioning || !this.$element.hasClass('in')) return
|
|
||||||
|
|
||||||
var startEvent = $.Event('hide.bs.collapse')
|
|
||||||
this.$element.trigger(startEvent)
|
|
||||||
if (startEvent.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
var dimension = this.dimension()
|
|
||||||
|
|
||||||
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
|
|
||||||
|
|
||||||
this.$element
|
|
||||||
.addClass('collapsing')
|
|
||||||
.removeClass('collapse in')
|
|
||||||
.attr('aria-expanded', false)
|
|
||||||
|
|
||||||
this.$trigger
|
|
||||||
.addClass('collapsed')
|
|
||||||
.attr('aria-expanded', false)
|
|
||||||
|
|
||||||
this.transitioning = 1
|
|
||||||
|
|
||||||
var complete = function () {
|
|
||||||
this.transitioning = 0
|
|
||||||
this.$element
|
|
||||||
.removeClass('collapsing')
|
|
||||||
.addClass('collapse')
|
|
||||||
.trigger('hidden.bs.collapse')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$.support.transition) return complete.call(this)
|
|
||||||
|
|
||||||
this.$element
|
|
||||||
[dimension](0)
|
|
||||||
.one('bsTransitionEnd', $.proxy(complete, this))
|
|
||||||
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)
|
|
||||||
}
|
|
||||||
|
|
||||||
Collapse.prototype.toggle = function () {
|
|
||||||
this[this.$element.hasClass('in') ? 'hide' : 'show']()
|
|
||||||
}
|
|
||||||
|
|
||||||
Collapse.prototype.getParent = function () {
|
|
||||||
return $(this.options.parent)
|
|
||||||
.find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
|
|
||||||
.each($.proxy(function (i, element) {
|
|
||||||
var $element = $(element)
|
|
||||||
this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
|
|
||||||
}, this))
|
|
||||||
.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
|
|
||||||
var isOpen = $element.hasClass('in')
|
|
||||||
|
|
||||||
$element.attr('aria-expanded', isOpen)
|
|
||||||
$trigger
|
|
||||||
.toggleClass('collapsed', !isOpen)
|
|
||||||
.attr('aria-expanded', isOpen)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTargetFromTrigger($trigger) {
|
|
||||||
var href
|
|
||||||
var target = $trigger.attr('data-target')
|
|
||||||
|| (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
|
|
||||||
|
|
||||||
return $(target)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// COLLAPSE PLUGIN DEFINITION
|
|
||||||
// ==========================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.collapse')
|
|
||||||
var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
|
||||||
|
|
||||||
if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
|
|
||||||
if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
|
|
||||||
if (typeof option == 'string') data[option]()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.collapse
|
|
||||||
|
|
||||||
$.fn.collapse = Plugin
|
|
||||||
$.fn.collapse.Constructor = Collapse
|
|
||||||
|
|
||||||
|
|
||||||
// COLLAPSE NO CONFLICT
|
|
||||||
// ====================
|
|
||||||
|
|
||||||
$.fn.collapse.noConflict = function () {
|
|
||||||
$.fn.collapse = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// COLLAPSE DATA-API
|
|
||||||
// =================
|
|
||||||
|
|
||||||
$(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
|
|
||||||
var $this = $(this)
|
|
||||||
|
|
||||||
if (!$this.attr('data-target')) e.preventDefault()
|
|
||||||
|
|
||||||
var $target = getTargetFromTrigger($this)
|
|
||||||
var data = $target.data('bs.collapse')
|
|
||||||
var option = data ? 'toggle' : $this.data()
|
|
||||||
|
|
||||||
Plugin.call($target, option)
|
|
||||||
})
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,165 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: dropdown.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#dropdowns
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// DROPDOWN CLASS DEFINITION
|
|
||||||
// =========================
|
|
||||||
|
|
||||||
var backdrop = '.dropdown-backdrop'
|
|
||||||
var toggle = '[data-toggle="dropdown"]'
|
|
||||||
var Dropdown = function (element) {
|
|
||||||
$(element).on('click.bs.dropdown', this.toggle)
|
|
||||||
}
|
|
||||||
|
|
||||||
Dropdown.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
function getParent($this) {
|
|
||||||
var selector = $this.attr('data-target')
|
|
||||||
|
|
||||||
if (!selector) {
|
|
||||||
selector = $this.attr('href')
|
|
||||||
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
|
|
||||||
}
|
|
||||||
|
|
||||||
var $parent = selector && $(selector)
|
|
||||||
|
|
||||||
return $parent && $parent.length ? $parent : $this.parent()
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearMenus(e) {
|
|
||||||
if (e && e.which === 3) return
|
|
||||||
$(backdrop).remove()
|
|
||||||
$(toggle).each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var $parent = getParent($this)
|
|
||||||
var relatedTarget = { relatedTarget: this }
|
|
||||||
|
|
||||||
if (!$parent.hasClass('open')) return
|
|
||||||
|
|
||||||
if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
|
|
||||||
|
|
||||||
$parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
|
|
||||||
|
|
||||||
if (e.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
$this.attr('aria-expanded', 'false')
|
|
||||||
$parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Dropdown.prototype.toggle = function (e) {
|
|
||||||
var $this = $(this)
|
|
||||||
|
|
||||||
if ($this.is('.disabled, :disabled')) return
|
|
||||||
|
|
||||||
var $parent = getParent($this)
|
|
||||||
var isActive = $parent.hasClass('open')
|
|
||||||
|
|
||||||
clearMenus()
|
|
||||||
|
|
||||||
if (!isActive) {
|
|
||||||
if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
|
|
||||||
// if mobile we use a backdrop because click events don't delegate
|
|
||||||
$(document.createElement('div'))
|
|
||||||
.addClass('dropdown-backdrop')
|
|
||||||
.insertAfter($(this))
|
|
||||||
.on('click', clearMenus)
|
|
||||||
}
|
|
||||||
|
|
||||||
var relatedTarget = { relatedTarget: this }
|
|
||||||
$parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
|
|
||||||
|
|
||||||
if (e.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
$this
|
|
||||||
.trigger('focus')
|
|
||||||
.attr('aria-expanded', 'true')
|
|
||||||
|
|
||||||
$parent
|
|
||||||
.toggleClass('open')
|
|
||||||
.trigger($.Event('shown.bs.dropdown', relatedTarget))
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
Dropdown.prototype.keydown = function (e) {
|
|
||||||
if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
|
|
||||||
|
|
||||||
var $this = $(this)
|
|
||||||
|
|
||||||
e.preventDefault()
|
|
||||||
e.stopPropagation()
|
|
||||||
|
|
||||||
if ($this.is('.disabled, :disabled')) return
|
|
||||||
|
|
||||||
var $parent = getParent($this)
|
|
||||||
var isActive = $parent.hasClass('open')
|
|
||||||
|
|
||||||
if (!isActive && e.which != 27 || isActive && e.which == 27) {
|
|
||||||
if (e.which == 27) $parent.find(toggle).trigger('focus')
|
|
||||||
return $this.trigger('click')
|
|
||||||
}
|
|
||||||
|
|
||||||
var desc = ' li:not(.disabled):visible a'
|
|
||||||
var $items = $parent.find('.dropdown-menu' + desc)
|
|
||||||
|
|
||||||
if (!$items.length) return
|
|
||||||
|
|
||||||
var index = $items.index(e.target)
|
|
||||||
|
|
||||||
if (e.which == 38 && index > 0) index-- // up
|
|
||||||
if (e.which == 40 && index < $items.length - 1) index++ // down
|
|
||||||
if (!~index) index = 0
|
|
||||||
|
|
||||||
$items.eq(index).trigger('focus')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// DROPDOWN PLUGIN DEFINITION
|
|
||||||
// ==========================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.dropdown')
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
|
|
||||||
if (typeof option == 'string') data[option].call($this)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.dropdown
|
|
||||||
|
|
||||||
$.fn.dropdown = Plugin
|
|
||||||
$.fn.dropdown.Constructor = Dropdown
|
|
||||||
|
|
||||||
|
|
||||||
// DROPDOWN NO CONFLICT
|
|
||||||
// ====================
|
|
||||||
|
|
||||||
$.fn.dropdown.noConflict = function () {
|
|
||||||
$.fn.dropdown = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// APPLY TO STANDARD DROPDOWN ELEMENTS
|
|
||||||
// ===================================
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on('click.bs.dropdown.data-api', clearMenus)
|
|
||||||
.on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
|
|
||||||
.on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
|
|
||||||
.on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
|
|
||||||
.on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,337 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: modal.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#modals
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// MODAL CLASS DEFINITION
|
|
||||||
// ======================
|
|
||||||
|
|
||||||
var Modal = function (element, options) {
|
|
||||||
this.options = options
|
|
||||||
this.$body = $(document.body)
|
|
||||||
this.$element = $(element)
|
|
||||||
this.$dialog = this.$element.find('.modal-dialog')
|
|
||||||
this.$backdrop = null
|
|
||||||
this.isShown = null
|
|
||||||
this.originalBodyPad = null
|
|
||||||
this.scrollbarWidth = 0
|
|
||||||
this.ignoreBackdropClick = false
|
|
||||||
|
|
||||||
if (this.options.remote) {
|
|
||||||
this.$element
|
|
||||||
.find('.modal-content')
|
|
||||||
.load(this.options.remote, $.proxy(function () {
|
|
||||||
this.$element.trigger('loaded.bs.modal')
|
|
||||||
}, this))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Modal.TRANSITION_DURATION = 300
|
|
||||||
Modal.BACKDROP_TRANSITION_DURATION = 150
|
|
||||||
|
|
||||||
Modal.DEFAULTS = {
|
|
||||||
backdrop: true,
|
|
||||||
keyboard: true,
|
|
||||||
show: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.toggle = function (_relatedTarget) {
|
|
||||||
return this.isShown ? this.hide() : this.show(_relatedTarget)
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.show = function (_relatedTarget) {
|
|
||||||
var that = this
|
|
||||||
var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
|
|
||||||
|
|
||||||
this.$element.trigger(e)
|
|
||||||
|
|
||||||
if (this.isShown || e.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
this.isShown = true
|
|
||||||
|
|
||||||
this.checkScrollbar()
|
|
||||||
this.setScrollbar()
|
|
||||||
this.$body.addClass('modal-open')
|
|
||||||
|
|
||||||
this.escape()
|
|
||||||
this.resize()
|
|
||||||
|
|
||||||
this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
|
|
||||||
|
|
||||||
this.$dialog.on('mousedown.dismiss.bs.modal', function () {
|
|
||||||
that.$element.one('mouseup.dismiss.bs.modal', function (e) {
|
|
||||||
if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
this.backdrop(function () {
|
|
||||||
var transition = $.support.transition && that.$element.hasClass('fade')
|
|
||||||
|
|
||||||
if (!that.$element.parent().length) {
|
|
||||||
that.$element.appendTo(that.$body) // don't move modals dom position
|
|
||||||
}
|
|
||||||
|
|
||||||
that.$element
|
|
||||||
.show()
|
|
||||||
.scrollTop(0)
|
|
||||||
|
|
||||||
that.adjustDialog()
|
|
||||||
|
|
||||||
if (transition) {
|
|
||||||
that.$element[0].offsetWidth // force reflow
|
|
||||||
}
|
|
||||||
|
|
||||||
that.$element.addClass('in')
|
|
||||||
|
|
||||||
that.enforceFocus()
|
|
||||||
|
|
||||||
var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
|
|
||||||
|
|
||||||
transition ?
|
|
||||||
that.$dialog // wait for modal to slide in
|
|
||||||
.one('bsTransitionEnd', function () {
|
|
||||||
that.$element.trigger('focus').trigger(e)
|
|
||||||
})
|
|
||||||
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
|
|
||||||
that.$element.trigger('focus').trigger(e)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.hide = function (e) {
|
|
||||||
if (e) e.preventDefault()
|
|
||||||
|
|
||||||
e = $.Event('hide.bs.modal')
|
|
||||||
|
|
||||||
this.$element.trigger(e)
|
|
||||||
|
|
||||||
if (!this.isShown || e.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
this.isShown = false
|
|
||||||
|
|
||||||
this.escape()
|
|
||||||
this.resize()
|
|
||||||
|
|
||||||
$(document).off('focusin.bs.modal')
|
|
||||||
|
|
||||||
this.$element
|
|
||||||
.removeClass('in')
|
|
||||||
.off('click.dismiss.bs.modal')
|
|
||||||
.off('mouseup.dismiss.bs.modal')
|
|
||||||
|
|
||||||
this.$dialog.off('mousedown.dismiss.bs.modal')
|
|
||||||
|
|
||||||
$.support.transition && this.$element.hasClass('fade') ?
|
|
||||||
this.$element
|
|
||||||
.one('bsTransitionEnd', $.proxy(this.hideModal, this))
|
|
||||||
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
|
|
||||||
this.hideModal()
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.enforceFocus = function () {
|
|
||||||
$(document)
|
|
||||||
.off('focusin.bs.modal') // guard against infinite focus loop
|
|
||||||
.on('focusin.bs.modal', $.proxy(function (e) {
|
|
||||||
if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
|
|
||||||
this.$element.trigger('focus')
|
|
||||||
}
|
|
||||||
}, this))
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.escape = function () {
|
|
||||||
if (this.isShown && this.options.keyboard) {
|
|
||||||
this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
|
|
||||||
e.which == 27 && this.hide()
|
|
||||||
}, this))
|
|
||||||
} else if (!this.isShown) {
|
|
||||||
this.$element.off('keydown.dismiss.bs.modal')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.resize = function () {
|
|
||||||
if (this.isShown) {
|
|
||||||
$(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
|
|
||||||
} else {
|
|
||||||
$(window).off('resize.bs.modal')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.hideModal = function () {
|
|
||||||
var that = this
|
|
||||||
this.$element.hide()
|
|
||||||
this.backdrop(function () {
|
|
||||||
that.$body.removeClass('modal-open')
|
|
||||||
that.resetAdjustments()
|
|
||||||
that.resetScrollbar()
|
|
||||||
that.$element.trigger('hidden.bs.modal')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.removeBackdrop = function () {
|
|
||||||
this.$backdrop && this.$backdrop.remove()
|
|
||||||
this.$backdrop = null
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.backdrop = function (callback) {
|
|
||||||
var that = this
|
|
||||||
var animate = this.$element.hasClass('fade') ? 'fade' : ''
|
|
||||||
|
|
||||||
if (this.isShown && this.options.backdrop) {
|
|
||||||
var doAnimate = $.support.transition && animate
|
|
||||||
|
|
||||||
this.$backdrop = $(document.createElement('div'))
|
|
||||||
.addClass('modal-backdrop ' + animate)
|
|
||||||
.appendTo(this.$body)
|
|
||||||
|
|
||||||
this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
|
|
||||||
if (this.ignoreBackdropClick) {
|
|
||||||
this.ignoreBackdropClick = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (e.target !== e.currentTarget) return
|
|
||||||
this.options.backdrop == 'static'
|
|
||||||
? this.$element[0].focus()
|
|
||||||
: this.hide()
|
|
||||||
}, this))
|
|
||||||
|
|
||||||
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
|
|
||||||
|
|
||||||
this.$backdrop.addClass('in')
|
|
||||||
|
|
||||||
if (!callback) return
|
|
||||||
|
|
||||||
doAnimate ?
|
|
||||||
this.$backdrop
|
|
||||||
.one('bsTransitionEnd', callback)
|
|
||||||
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
|
|
||||||
callback()
|
|
||||||
|
|
||||||
} else if (!this.isShown && this.$backdrop) {
|
|
||||||
this.$backdrop.removeClass('in')
|
|
||||||
|
|
||||||
var callbackRemove = function () {
|
|
||||||
that.removeBackdrop()
|
|
||||||
callback && callback()
|
|
||||||
}
|
|
||||||
$.support.transition && this.$element.hasClass('fade') ?
|
|
||||||
this.$backdrop
|
|
||||||
.one('bsTransitionEnd', callbackRemove)
|
|
||||||
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
|
|
||||||
callbackRemove()
|
|
||||||
|
|
||||||
} else if (callback) {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// these following methods are used to handle overflowing modals
|
|
||||||
|
|
||||||
Modal.prototype.handleUpdate = function () {
|
|
||||||
this.adjustDialog()
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.adjustDialog = function () {
|
|
||||||
var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
|
|
||||||
|
|
||||||
this.$element.css({
|
|
||||||
paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
|
|
||||||
paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.resetAdjustments = function () {
|
|
||||||
this.$element.css({
|
|
||||||
paddingLeft: '',
|
|
||||||
paddingRight: ''
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.checkScrollbar = function () {
|
|
||||||
var fullWindowWidth = window.innerWidth
|
|
||||||
if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
|
|
||||||
var documentElementRect = document.documentElement.getBoundingClientRect()
|
|
||||||
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
|
|
||||||
}
|
|
||||||
this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
|
|
||||||
this.scrollbarWidth = this.measureScrollbar()
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.setScrollbar = function () {
|
|
||||||
var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
|
|
||||||
this.originalBodyPad = document.body.style.paddingRight || ''
|
|
||||||
if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.resetScrollbar = function () {
|
|
||||||
this.$body.css('padding-right', this.originalBodyPad)
|
|
||||||
}
|
|
||||||
|
|
||||||
Modal.prototype.measureScrollbar = function () { // thx walsh
|
|
||||||
var scrollDiv = document.createElement('div')
|
|
||||||
scrollDiv.className = 'modal-scrollbar-measure'
|
|
||||||
this.$body.append(scrollDiv)
|
|
||||||
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
|
|
||||||
this.$body[0].removeChild(scrollDiv)
|
|
||||||
return scrollbarWidth
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MODAL PLUGIN DEFINITION
|
|
||||||
// =======================
|
|
||||||
|
|
||||||
function Plugin(option, _relatedTarget) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.modal')
|
|
||||||
var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
|
|
||||||
if (typeof option == 'string') data[option](_relatedTarget)
|
|
||||||
else if (options.show) data.show(_relatedTarget)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.modal
|
|
||||||
|
|
||||||
$.fn.modal = Plugin
|
|
||||||
$.fn.modal.Constructor = Modal
|
|
||||||
|
|
||||||
|
|
||||||
// MODAL NO CONFLICT
|
|
||||||
// =================
|
|
||||||
|
|
||||||
$.fn.modal.noConflict = function () {
|
|
||||||
$.fn.modal = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MODAL DATA-API
|
|
||||||
// ==============
|
|
||||||
|
|
||||||
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
|
|
||||||
var $this = $(this)
|
|
||||||
var href = $this.attr('href')
|
|
||||||
var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
|
|
||||||
var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
|
|
||||||
|
|
||||||
if ($this.is('a')) e.preventDefault()
|
|
||||||
|
|
||||||
$target.one('show.bs.modal', function (showEvent) {
|
|
||||||
if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
|
|
||||||
$target.one('hidden.bs.modal', function () {
|
|
||||||
$this.is(':visible') && $this.trigger('focus')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
Plugin.call($target, option, this)
|
|
||||||
})
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,108 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: popover.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#popovers
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// POPOVER PUBLIC CLASS DEFINITION
|
|
||||||
// ===============================
|
|
||||||
|
|
||||||
var Popover = function (element, options) {
|
|
||||||
this.init('popover', element, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
|
|
||||||
|
|
||||||
Popover.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
|
|
||||||
placement: 'right',
|
|
||||||
trigger: 'click',
|
|
||||||
content: '',
|
|
||||||
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// NOTE: POPOVER EXTENDS tooltip.js
|
|
||||||
// ================================
|
|
||||||
|
|
||||||
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
|
|
||||||
|
|
||||||
Popover.prototype.constructor = Popover
|
|
||||||
|
|
||||||
Popover.prototype.getDefaults = function () {
|
|
||||||
return Popover.DEFAULTS
|
|
||||||
}
|
|
||||||
|
|
||||||
Popover.prototype.setContent = function () {
|
|
||||||
var $tip = this.tip()
|
|
||||||
var title = this.getTitle()
|
|
||||||
var content = this.getContent()
|
|
||||||
|
|
||||||
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
|
|
||||||
$tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
|
|
||||||
this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
|
|
||||||
](content)
|
|
||||||
|
|
||||||
$tip.removeClass('fade top bottom left right in')
|
|
||||||
|
|
||||||
// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
|
|
||||||
// this manually by checking the contents.
|
|
||||||
if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
|
|
||||||
}
|
|
||||||
|
|
||||||
Popover.prototype.hasContent = function () {
|
|
||||||
return this.getTitle() || this.getContent()
|
|
||||||
}
|
|
||||||
|
|
||||||
Popover.prototype.getContent = function () {
|
|
||||||
var $e = this.$element
|
|
||||||
var o = this.options
|
|
||||||
|
|
||||||
return $e.attr('data-content')
|
|
||||||
|| (typeof o.content == 'function' ?
|
|
||||||
o.content.call($e[0]) :
|
|
||||||
o.content)
|
|
||||||
}
|
|
||||||
|
|
||||||
Popover.prototype.arrow = function () {
|
|
||||||
return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// POPOVER PLUGIN DEFINITION
|
|
||||||
// =========================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.popover')
|
|
||||||
var options = typeof option == 'object' && option
|
|
||||||
|
|
||||||
if (!data && /destroy|hide/.test(option)) return
|
|
||||||
if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
|
|
||||||
if (typeof option == 'string') data[option]()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.popover
|
|
||||||
|
|
||||||
$.fn.popover = Plugin
|
|
||||||
$.fn.popover.Constructor = Popover
|
|
||||||
|
|
||||||
|
|
||||||
// POPOVER NO CONFLICT
|
|
||||||
// ===================
|
|
||||||
|
|
||||||
$.fn.popover.noConflict = function () {
|
|
||||||
$.fn.popover = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,172 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: scrollspy.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#scrollspy
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// SCROLLSPY CLASS DEFINITION
|
|
||||||
// ==========================
|
|
||||||
|
|
||||||
function ScrollSpy(element, options) {
|
|
||||||
this.$body = $(document.body)
|
|
||||||
this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
|
|
||||||
this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
|
|
||||||
this.selector = (this.options.target || '') + ' .nav li > a'
|
|
||||||
this.offsets = []
|
|
||||||
this.targets = []
|
|
||||||
this.activeTarget = null
|
|
||||||
this.scrollHeight = 0
|
|
||||||
|
|
||||||
this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
|
|
||||||
this.refresh()
|
|
||||||
this.process()
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollSpy.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
ScrollSpy.DEFAULTS = {
|
|
||||||
offset: 10
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollSpy.prototype.getScrollHeight = function () {
|
|
||||||
return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollSpy.prototype.refresh = function () {
|
|
||||||
var that = this
|
|
||||||
var offsetMethod = 'offset'
|
|
||||||
var offsetBase = 0
|
|
||||||
|
|
||||||
this.offsets = []
|
|
||||||
this.targets = []
|
|
||||||
this.scrollHeight = this.getScrollHeight()
|
|
||||||
|
|
||||||
if (!$.isWindow(this.$scrollElement[0])) {
|
|
||||||
offsetMethod = 'position'
|
|
||||||
offsetBase = this.$scrollElement.scrollTop()
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$body
|
|
||||||
.find(this.selector)
|
|
||||||
.map(function () {
|
|
||||||
var $el = $(this)
|
|
||||||
var href = $el.data('target') || $el.attr('href')
|
|
||||||
var $href = /^#./.test(href) && $(href)
|
|
||||||
|
|
||||||
return ($href
|
|
||||||
&& $href.length
|
|
||||||
&& $href.is(':visible')
|
|
||||||
&& [[$href[offsetMethod]().top + offsetBase, href]]) || null
|
|
||||||
})
|
|
||||||
.sort(function (a, b) { return a[0] - b[0] })
|
|
||||||
.each(function () {
|
|
||||||
that.offsets.push(this[0])
|
|
||||||
that.targets.push(this[1])
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollSpy.prototype.process = function () {
|
|
||||||
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
|
|
||||||
var scrollHeight = this.getScrollHeight()
|
|
||||||
var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
|
|
||||||
var offsets = this.offsets
|
|
||||||
var targets = this.targets
|
|
||||||
var activeTarget = this.activeTarget
|
|
||||||
var i
|
|
||||||
|
|
||||||
if (this.scrollHeight != scrollHeight) {
|
|
||||||
this.refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scrollTop >= maxScroll) {
|
|
||||||
return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (activeTarget && scrollTop < offsets[0]) {
|
|
||||||
this.activeTarget = null
|
|
||||||
return this.clear()
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = offsets.length; i--;) {
|
|
||||||
activeTarget != targets[i]
|
|
||||||
&& scrollTop >= offsets[i]
|
|
||||||
&& (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
|
|
||||||
&& this.activate(targets[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollSpy.prototype.activate = function (target) {
|
|
||||||
this.activeTarget = target
|
|
||||||
|
|
||||||
this.clear()
|
|
||||||
|
|
||||||
var selector = this.selector +
|
|
||||||
'[data-target="' + target + '"],' +
|
|
||||||
this.selector + '[href="' + target + '"]'
|
|
||||||
|
|
||||||
var active = $(selector)
|
|
||||||
.parents('li')
|
|
||||||
.addClass('active')
|
|
||||||
|
|
||||||
if (active.parent('.dropdown-menu').length) {
|
|
||||||
active = active
|
|
||||||
.closest('li.dropdown')
|
|
||||||
.addClass('active')
|
|
||||||
}
|
|
||||||
|
|
||||||
active.trigger('activate.bs.scrollspy')
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollSpy.prototype.clear = function () {
|
|
||||||
$(this.selector)
|
|
||||||
.parentsUntil(this.options.target, '.active')
|
|
||||||
.removeClass('active')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// SCROLLSPY PLUGIN DEFINITION
|
|
||||||
// ===========================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.scrollspy')
|
|
||||||
var options = typeof option == 'object' && option
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
|
|
||||||
if (typeof option == 'string') data[option]()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.scrollspy
|
|
||||||
|
|
||||||
$.fn.scrollspy = Plugin
|
|
||||||
$.fn.scrollspy.Constructor = ScrollSpy
|
|
||||||
|
|
||||||
|
|
||||||
// SCROLLSPY NO CONFLICT
|
|
||||||
// =====================
|
|
||||||
|
|
||||||
$.fn.scrollspy.noConflict = function () {
|
|
||||||
$.fn.scrollspy = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// SCROLLSPY DATA-API
|
|
||||||
// ==================
|
|
||||||
|
|
||||||
$(window).on('load.bs.scrollspy.data-api', function () {
|
|
||||||
$('[data-spy="scroll"]').each(function () {
|
|
||||||
var $spy = $(this)
|
|
||||||
Plugin.call($spy, $spy.data())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,155 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: tab.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#tabs
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// TAB CLASS DEFINITION
|
|
||||||
// ====================
|
|
||||||
|
|
||||||
var Tab = function (element) {
|
|
||||||
// jscs:disable requireDollarBeforejQueryAssignment
|
|
||||||
this.element = $(element)
|
|
||||||
// jscs:enable requireDollarBeforejQueryAssignment
|
|
||||||
}
|
|
||||||
|
|
||||||
Tab.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Tab.TRANSITION_DURATION = 150
|
|
||||||
|
|
||||||
Tab.prototype.show = function () {
|
|
||||||
var $this = this.element
|
|
||||||
var $ul = $this.closest('ul:not(.dropdown-menu)')
|
|
||||||
var selector = $this.data('target')
|
|
||||||
|
|
||||||
if (!selector) {
|
|
||||||
selector = $this.attr('href')
|
|
||||||
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this.parent('li').hasClass('active')) return
|
|
||||||
|
|
||||||
var $previous = $ul.find('.active:last a')
|
|
||||||
var hideEvent = $.Event('hide.bs.tab', {
|
|
||||||
relatedTarget: $this[0]
|
|
||||||
})
|
|
||||||
var showEvent = $.Event('show.bs.tab', {
|
|
||||||
relatedTarget: $previous[0]
|
|
||||||
})
|
|
||||||
|
|
||||||
$previous.trigger(hideEvent)
|
|
||||||
$this.trigger(showEvent)
|
|
||||||
|
|
||||||
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
var $target = $(selector)
|
|
||||||
|
|
||||||
this.activate($this.closest('li'), $ul)
|
|
||||||
this.activate($target, $target.parent(), function () {
|
|
||||||
$previous.trigger({
|
|
||||||
type: 'hidden.bs.tab',
|
|
||||||
relatedTarget: $this[0]
|
|
||||||
})
|
|
||||||
$this.trigger({
|
|
||||||
type: 'shown.bs.tab',
|
|
||||||
relatedTarget: $previous[0]
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Tab.prototype.activate = function (element, container, callback) {
|
|
||||||
var $active = container.find('> .active')
|
|
||||||
var transition = callback
|
|
||||||
&& $.support.transition
|
|
||||||
&& ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
|
|
||||||
|
|
||||||
function next() {
|
|
||||||
$active
|
|
||||||
.removeClass('active')
|
|
||||||
.find('> .dropdown-menu > .active')
|
|
||||||
.removeClass('active')
|
|
||||||
.end()
|
|
||||||
.find('[data-toggle="tab"]')
|
|
||||||
.attr('aria-expanded', false)
|
|
||||||
|
|
||||||
element
|
|
||||||
.addClass('active')
|
|
||||||
.find('[data-toggle="tab"]')
|
|
||||||
.attr('aria-expanded', true)
|
|
||||||
|
|
||||||
if (transition) {
|
|
||||||
element[0].offsetWidth // reflow for transition
|
|
||||||
element.addClass('in')
|
|
||||||
} else {
|
|
||||||
element.removeClass('fade')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.parent('.dropdown-menu').length) {
|
|
||||||
element
|
|
||||||
.closest('li.dropdown')
|
|
||||||
.addClass('active')
|
|
||||||
.end()
|
|
||||||
.find('[data-toggle="tab"]')
|
|
||||||
.attr('aria-expanded', true)
|
|
||||||
}
|
|
||||||
|
|
||||||
callback && callback()
|
|
||||||
}
|
|
||||||
|
|
||||||
$active.length && transition ?
|
|
||||||
$active
|
|
||||||
.one('bsTransitionEnd', next)
|
|
||||||
.emulateTransitionEnd(Tab.TRANSITION_DURATION) :
|
|
||||||
next()
|
|
||||||
|
|
||||||
$active.removeClass('in')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// TAB PLUGIN DEFINITION
|
|
||||||
// =====================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.tab')
|
|
||||||
|
|
||||||
if (!data) $this.data('bs.tab', (data = new Tab(this)))
|
|
||||||
if (typeof option == 'string') data[option]()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.tab
|
|
||||||
|
|
||||||
$.fn.tab = Plugin
|
|
||||||
$.fn.tab.Constructor = Tab
|
|
||||||
|
|
||||||
|
|
||||||
// TAB NO CONFLICT
|
|
||||||
// ===============
|
|
||||||
|
|
||||||
$.fn.tab.noConflict = function () {
|
|
||||||
$.fn.tab = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// TAB DATA-API
|
|
||||||
// ============
|
|
||||||
|
|
||||||
var clickHandler = function (e) {
|
|
||||||
e.preventDefault()
|
|
||||||
Plugin.call($(this), 'show')
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
|
|
||||||
.on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,514 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: tooltip.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#tooltip
|
|
||||||
* Inspired by the original jQuery.tipsy by Jason Frame
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// TOOLTIP PUBLIC CLASS DEFINITION
|
|
||||||
// ===============================
|
|
||||||
|
|
||||||
var Tooltip = function (element, options) {
|
|
||||||
this.type = null
|
|
||||||
this.options = null
|
|
||||||
this.enabled = null
|
|
||||||
this.timeout = null
|
|
||||||
this.hoverState = null
|
|
||||||
this.$element = null
|
|
||||||
this.inState = null
|
|
||||||
|
|
||||||
this.init('tooltip', element, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.VERSION = '3.3.6'
|
|
||||||
|
|
||||||
Tooltip.TRANSITION_DURATION = 150
|
|
||||||
|
|
||||||
Tooltip.DEFAULTS = {
|
|
||||||
animation: true,
|
|
||||||
placement: 'top',
|
|
||||||
selector: false,
|
|
||||||
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
|
|
||||||
trigger: 'hover focus',
|
|
||||||
title: '',
|
|
||||||
delay: 0,
|
|
||||||
html: false,
|
|
||||||
container: false,
|
|
||||||
viewport: {
|
|
||||||
selector: 'body',
|
|
||||||
padding: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.init = function (type, element, options) {
|
|
||||||
this.enabled = true
|
|
||||||
this.type = type
|
|
||||||
this.$element = $(element)
|
|
||||||
this.options = this.getOptions(options)
|
|
||||||
this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
|
|
||||||
this.inState = { click: false, hover: false, focus: false }
|
|
||||||
|
|
||||||
if (this.$element[0] instanceof document.constructor && !this.options.selector) {
|
|
||||||
throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
|
|
||||||
}
|
|
||||||
|
|
||||||
var triggers = this.options.trigger.split(' ')
|
|
||||||
|
|
||||||
for (var i = triggers.length; i--;) {
|
|
||||||
var trigger = triggers[i]
|
|
||||||
|
|
||||||
if (trigger == 'click') {
|
|
||||||
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
|
|
||||||
} else if (trigger != 'manual') {
|
|
||||||
var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
|
|
||||||
var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
|
|
||||||
|
|
||||||
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
|
|
||||||
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.options.selector ?
|
|
||||||
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
|
|
||||||
this.fixTitle()
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getDefaults = function () {
|
|
||||||
return Tooltip.DEFAULTS
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getOptions = function (options) {
|
|
||||||
options = $.extend({}, this.getDefaults(), this.$element.data(), options)
|
|
||||||
|
|
||||||
if (options.delay && typeof options.delay == 'number') {
|
|
||||||
options.delay = {
|
|
||||||
show: options.delay,
|
|
||||||
hide: options.delay
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getDelegateOptions = function () {
|
|
||||||
var options = {}
|
|
||||||
var defaults = this.getDefaults()
|
|
||||||
|
|
||||||
this._options && $.each(this._options, function (key, value) {
|
|
||||||
if (defaults[key] != value) options[key] = value
|
|
||||||
})
|
|
||||||
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.enter = function (obj) {
|
|
||||||
var self = obj instanceof this.constructor ?
|
|
||||||
obj : $(obj.currentTarget).data('bs.' + this.type)
|
|
||||||
|
|
||||||
if (!self) {
|
|
||||||
self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
|
|
||||||
$(obj.currentTarget).data('bs.' + this.type, self)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj instanceof $.Event) {
|
|
||||||
self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.tip().hasClass('in') || self.hoverState == 'in') {
|
|
||||||
self.hoverState = 'in'
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
clearTimeout(self.timeout)
|
|
||||||
|
|
||||||
self.hoverState = 'in'
|
|
||||||
|
|
||||||
if (!self.options.delay || !self.options.delay.show) return self.show()
|
|
||||||
|
|
||||||
self.timeout = setTimeout(function () {
|
|
||||||
if (self.hoverState == 'in') self.show()
|
|
||||||
}, self.options.delay.show)
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.isInStateTrue = function () {
|
|
||||||
for (var key in this.inState) {
|
|
||||||
if (this.inState[key]) return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.leave = function (obj) {
|
|
||||||
var self = obj instanceof this.constructor ?
|
|
||||||
obj : $(obj.currentTarget).data('bs.' + this.type)
|
|
||||||
|
|
||||||
if (!self) {
|
|
||||||
self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
|
|
||||||
$(obj.currentTarget).data('bs.' + this.type, self)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj instanceof $.Event) {
|
|
||||||
self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.isInStateTrue()) return
|
|
||||||
|
|
||||||
clearTimeout(self.timeout)
|
|
||||||
|
|
||||||
self.hoverState = 'out'
|
|
||||||
|
|
||||||
if (!self.options.delay || !self.options.delay.hide) return self.hide()
|
|
||||||
|
|
||||||
self.timeout = setTimeout(function () {
|
|
||||||
if (self.hoverState == 'out') self.hide()
|
|
||||||
}, self.options.delay.hide)
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.show = function () {
|
|
||||||
var e = $.Event('show.bs.' + this.type)
|
|
||||||
|
|
||||||
if (this.hasContent() && this.enabled) {
|
|
||||||
this.$element.trigger(e)
|
|
||||||
|
|
||||||
var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
|
|
||||||
if (e.isDefaultPrevented() || !inDom) return
|
|
||||||
var that = this
|
|
||||||
|
|
||||||
var $tip = this.tip()
|
|
||||||
|
|
||||||
var tipId = this.getUID(this.type)
|
|
||||||
|
|
||||||
this.setContent()
|
|
||||||
$tip.attr('id', tipId)
|
|
||||||
this.$element.attr('aria-describedby', tipId)
|
|
||||||
|
|
||||||
if (this.options.animation) $tip.addClass('fade')
|
|
||||||
|
|
||||||
var placement = typeof this.options.placement == 'function' ?
|
|
||||||
this.options.placement.call(this, $tip[0], this.$element[0]) :
|
|
||||||
this.options.placement
|
|
||||||
|
|
||||||
var autoToken = /\s?auto?\s?/i
|
|
||||||
var autoPlace = autoToken.test(placement)
|
|
||||||
if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
|
|
||||||
|
|
||||||
$tip
|
|
||||||
.detach()
|
|
||||||
.css({ top: 0, left: 0, display: 'block' })
|
|
||||||
.addClass(placement)
|
|
||||||
.data('bs.' + this.type, this)
|
|
||||||
|
|
||||||
this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
|
|
||||||
this.$element.trigger('inserted.bs.' + this.type)
|
|
||||||
|
|
||||||
var pos = this.getPosition()
|
|
||||||
var actualWidth = $tip[0].offsetWidth
|
|
||||||
var actualHeight = $tip[0].offsetHeight
|
|
||||||
|
|
||||||
if (autoPlace) {
|
|
||||||
var orgPlacement = placement
|
|
||||||
var viewportDim = this.getPosition(this.$viewport)
|
|
||||||
|
|
||||||
placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
|
|
||||||
placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
|
|
||||||
placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
|
|
||||||
placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
|
|
||||||
placement
|
|
||||||
|
|
||||||
$tip
|
|
||||||
.removeClass(orgPlacement)
|
|
||||||
.addClass(placement)
|
|
||||||
}
|
|
||||||
|
|
||||||
var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
|
|
||||||
|
|
||||||
this.applyPlacement(calculatedOffset, placement)
|
|
||||||
|
|
||||||
var complete = function () {
|
|
||||||
var prevHoverState = that.hoverState
|
|
||||||
that.$element.trigger('shown.bs.' + that.type)
|
|
||||||
that.hoverState = null
|
|
||||||
|
|
||||||
if (prevHoverState == 'out') that.leave(that)
|
|
||||||
}
|
|
||||||
|
|
||||||
$.support.transition && this.$tip.hasClass('fade') ?
|
|
||||||
$tip
|
|
||||||
.one('bsTransitionEnd', complete)
|
|
||||||
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
|
|
||||||
complete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.applyPlacement = function (offset, placement) {
|
|
||||||
var $tip = this.tip()
|
|
||||||
var width = $tip[0].offsetWidth
|
|
||||||
var height = $tip[0].offsetHeight
|
|
||||||
|
|
||||||
// manually read margins because getBoundingClientRect includes difference
|
|
||||||
var marginTop = parseInt($tip.css('margin-top'), 10)
|
|
||||||
var marginLeft = parseInt($tip.css('margin-left'), 10)
|
|
||||||
|
|
||||||
// we must check for NaN for ie 8/9
|
|
||||||
if (isNaN(marginTop)) marginTop = 0
|
|
||||||
if (isNaN(marginLeft)) marginLeft = 0
|
|
||||||
|
|
||||||
offset.top += marginTop
|
|
||||||
offset.left += marginLeft
|
|
||||||
|
|
||||||
// $.fn.offset doesn't round pixel values
|
|
||||||
// so we use setOffset directly with our own function B-0
|
|
||||||
$.offset.setOffset($tip[0], $.extend({
|
|
||||||
using: function (props) {
|
|
||||||
$tip.css({
|
|
||||||
top: Math.round(props.top),
|
|
||||||
left: Math.round(props.left)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}, offset), 0)
|
|
||||||
|
|
||||||
$tip.addClass('in')
|
|
||||||
|
|
||||||
// check to see if placing tip in new offset caused the tip to resize itself
|
|
||||||
var actualWidth = $tip[0].offsetWidth
|
|
||||||
var actualHeight = $tip[0].offsetHeight
|
|
||||||
|
|
||||||
if (placement == 'top' && actualHeight != height) {
|
|
||||||
offset.top = offset.top + height - actualHeight
|
|
||||||
}
|
|
||||||
|
|
||||||
var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
|
|
||||||
|
|
||||||
if (delta.left) offset.left += delta.left
|
|
||||||
else offset.top += delta.top
|
|
||||||
|
|
||||||
var isVertical = /top|bottom/.test(placement)
|
|
||||||
var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
|
|
||||||
var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
|
|
||||||
|
|
||||||
$tip.offset(offset)
|
|
||||||
this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
|
|
||||||
this.arrow()
|
|
||||||
.css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
|
|
||||||
.css(isVertical ? 'top' : 'left', '')
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.setContent = function () {
|
|
||||||
var $tip = this.tip()
|
|
||||||
var title = this.getTitle()
|
|
||||||
|
|
||||||
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
|
|
||||||
$tip.removeClass('fade in top bottom left right')
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.hide = function (callback) {
|
|
||||||
var that = this
|
|
||||||
var $tip = $(this.$tip)
|
|
||||||
var e = $.Event('hide.bs.' + this.type)
|
|
||||||
|
|
||||||
function complete() {
|
|
||||||
if (that.hoverState != 'in') $tip.detach()
|
|
||||||
that.$element
|
|
||||||
.removeAttr('aria-describedby')
|
|
||||||
.trigger('hidden.bs.' + that.type)
|
|
||||||
callback && callback()
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$element.trigger(e)
|
|
||||||
|
|
||||||
if (e.isDefaultPrevented()) return
|
|
||||||
|
|
||||||
$tip.removeClass('in')
|
|
||||||
|
|
||||||
$.support.transition && $tip.hasClass('fade') ?
|
|
||||||
$tip
|
|
||||||
.one('bsTransitionEnd', complete)
|
|
||||||
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
|
|
||||||
complete()
|
|
||||||
|
|
||||||
this.hoverState = null
|
|
||||||
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.fixTitle = function () {
|
|
||||||
var $e = this.$element
|
|
||||||
if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
|
|
||||||
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.hasContent = function () {
|
|
||||||
return this.getTitle()
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getPosition = function ($element) {
|
|
||||||
$element = $element || this.$element
|
|
||||||
|
|
||||||
var el = $element[0]
|
|
||||||
var isBody = el.tagName == 'BODY'
|
|
||||||
|
|
||||||
var elRect = el.getBoundingClientRect()
|
|
||||||
if (elRect.width == null) {
|
|
||||||
// width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
|
|
||||||
elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
|
|
||||||
}
|
|
||||||
var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
|
|
||||||
var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
|
|
||||||
var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
|
|
||||||
|
|
||||||
return $.extend({}, elRect, scroll, outerDims, elOffset)
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
|
|
||||||
return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
|
|
||||||
placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
|
|
||||||
placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
|
|
||||||
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
|
|
||||||
var delta = { top: 0, left: 0 }
|
|
||||||
if (!this.$viewport) return delta
|
|
||||||
|
|
||||||
var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
|
|
||||||
var viewportDimensions = this.getPosition(this.$viewport)
|
|
||||||
|
|
||||||
if (/right|left/.test(placement)) {
|
|
||||||
var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
|
|
||||||
var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
|
|
||||||
if (topEdgeOffset < viewportDimensions.top) { // top overflow
|
|
||||||
delta.top = viewportDimensions.top - topEdgeOffset
|
|
||||||
} else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
|
|
||||||
delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var leftEdgeOffset = pos.left - viewportPadding
|
|
||||||
var rightEdgeOffset = pos.left + viewportPadding + actualWidth
|
|
||||||
if (leftEdgeOffset < viewportDimensions.left) { // left overflow
|
|
||||||
delta.left = viewportDimensions.left - leftEdgeOffset
|
|
||||||
} else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
|
|
||||||
delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return delta
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getTitle = function () {
|
|
||||||
var title
|
|
||||||
var $e = this.$element
|
|
||||||
var o = this.options
|
|
||||||
|
|
||||||
title = $e.attr('data-original-title')
|
|
||||||
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
|
|
||||||
|
|
||||||
return title
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.getUID = function (prefix) {
|
|
||||||
do prefix += ~~(Math.random() * 1000000)
|
|
||||||
while (document.getElementById(prefix))
|
|
||||||
return prefix
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.tip = function () {
|
|
||||||
if (!this.$tip) {
|
|
||||||
this.$tip = $(this.options.template)
|
|
||||||
if (this.$tip.length != 1) {
|
|
||||||
throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this.$tip
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.arrow = function () {
|
|
||||||
return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.enable = function () {
|
|
||||||
this.enabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.disable = function () {
|
|
||||||
this.enabled = false
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.toggleEnabled = function () {
|
|
||||||
this.enabled = !this.enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.toggle = function (e) {
|
|
||||||
var self = this
|
|
||||||
if (e) {
|
|
||||||
self = $(e.currentTarget).data('bs.' + this.type)
|
|
||||||
if (!self) {
|
|
||||||
self = new this.constructor(e.currentTarget, this.getDelegateOptions())
|
|
||||||
$(e.currentTarget).data('bs.' + this.type, self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e) {
|
|
||||||
self.inState.click = !self.inState.click
|
|
||||||
if (self.isInStateTrue()) self.enter(self)
|
|
||||||
else self.leave(self)
|
|
||||||
} else {
|
|
||||||
self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Tooltip.prototype.destroy = function () {
|
|
||||||
var that = this
|
|
||||||
clearTimeout(this.timeout)
|
|
||||||
this.hide(function () {
|
|
||||||
that.$element.off('.' + that.type).removeData('bs.' + that.type)
|
|
||||||
if (that.$tip) {
|
|
||||||
that.$tip.detach()
|
|
||||||
}
|
|
||||||
that.$tip = null
|
|
||||||
that.$arrow = null
|
|
||||||
that.$viewport = null
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// TOOLTIP PLUGIN DEFINITION
|
|
||||||
// =========================
|
|
||||||
|
|
||||||
function Plugin(option) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this)
|
|
||||||
var data = $this.data('bs.tooltip')
|
|
||||||
var options = typeof option == 'object' && option
|
|
||||||
|
|
||||||
if (!data && /destroy|hide/.test(option)) return
|
|
||||||
if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
|
|
||||||
if (typeof option == 'string') data[option]()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var old = $.fn.tooltip
|
|
||||||
|
|
||||||
$.fn.tooltip = Plugin
|
|
||||||
$.fn.tooltip.Constructor = Tooltip
|
|
||||||
|
|
||||||
|
|
||||||
// TOOLTIP NO CONFLICT
|
|
||||||
// ===================
|
|
||||||
|
|
||||||
$.fn.tooltip.noConflict = function () {
|
|
||||||
$.fn.tooltip = old
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,59 +0,0 @@
|
||||||
/* ========================================================================
|
|
||||||
* Bootstrap: transition.js v3.3.6
|
|
||||||
* http://getbootstrap.com/javascript/#transitions
|
|
||||||
* ========================================================================
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* ======================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
+function ($) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
|
|
||||||
// ============================================================
|
|
||||||
|
|
||||||
function transitionEnd() {
|
|
||||||
var el = document.createElement('bootstrap')
|
|
||||||
|
|
||||||
var transEndEventNames = {
|
|
||||||
WebkitTransition : 'webkitTransitionEnd',
|
|
||||||
MozTransition : 'transitionend',
|
|
||||||
OTransition : 'oTransitionEnd otransitionend',
|
|
||||||
transition : 'transitionend'
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var name in transEndEventNames) {
|
|
||||||
if (el.style[name] !== undefined) {
|
|
||||||
return { end: transEndEventNames[name] }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false // explicit for ie8 ( ._.)
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://blog.alexmaccaw.com/css-transitions
|
|
||||||
$.fn.emulateTransitionEnd = function (duration) {
|
|
||||||
var called = false
|
|
||||||
var $el = this
|
|
||||||
$(this).one('bsTransitionEnd', function () { called = true })
|
|
||||||
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
|
|
||||||
setTimeout(callback, duration)
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
$(function () {
|
|
||||||
$.support.transition = transitionEnd()
|
|
||||||
|
|
||||||
if (!$.support.transition) return
|
|
||||||
|
|
||||||
$.event.special.bsTransitionEnd = {
|
|
||||||
bindType: $.support.transition.end,
|
|
||||||
delegateType: $.support.transition.end,
|
|
||||||
handle: function (e) {
|
|
||||||
if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
}(jQuery);
|
|
|
@ -1,192 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): alert.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Alert = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'alert';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.alert';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
var TRANSITION_DURATION = 150;
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
DISMISS: '[data-dismiss="alert"]'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
CLOSE: 'close' + EVENT_KEY,
|
|
||||||
CLOSED: 'closed' + EVENT_KEY,
|
|
||||||
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
ALERT: 'alert',
|
|
||||||
FADE: 'fade',
|
|
||||||
IN: 'in'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Alert = (function () {
|
|
||||||
function Alert(element) {
|
|
||||||
_classCallCheck(this, Alert);
|
|
||||||
|
|
||||||
this._element = element;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Alert, [{
|
|
||||||
key: 'close',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function close(element) {
|
|
||||||
element = element || this._element;
|
|
||||||
|
|
||||||
var rootElement = this._getRootElement(element);
|
|
||||||
var customEvent = this._triggerCloseEvent(rootElement);
|
|
||||||
|
|
||||||
if (customEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._removeElement(rootElement);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY);
|
|
||||||
this._element = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_getRootElement',
|
|
||||||
value: function _getRootElement(element) {
|
|
||||||
var selector = Util.getSelectorFromElement(element);
|
|
||||||
var parent = false;
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
parent = $(selector)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!parent) {
|
|
||||||
parent = $(element).closest('.' + ClassName.ALERT)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_triggerCloseEvent',
|
|
||||||
value: function _triggerCloseEvent(element) {
|
|
||||||
var closeEvent = $.Event(Event.CLOSE);
|
|
||||||
|
|
||||||
$(element).trigger(closeEvent);
|
|
||||||
return closeEvent;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_removeElement',
|
|
||||||
value: function _removeElement(element) {
|
|
||||||
$(element).removeClass(ClassName.IN);
|
|
||||||
|
|
||||||
if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
|
|
||||||
this._destroyElement(element);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_destroyElement',
|
|
||||||
value: function _destroyElement(element) {
|
|
||||||
$(element).detach().trigger(Event.CLOSED).remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $element = $(this);
|
|
||||||
var data = $element.data(DATA_KEY);
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Alert(this);
|
|
||||||
$element.data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config === 'close') {
|
|
||||||
data[config](this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_handleDismiss',
|
|
||||||
value: function _handleDismiss(alertInstance) {
|
|
||||||
return function (event) {
|
|
||||||
if (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
alertInstance.close(this);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Alert;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Alert._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Alert;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Alert._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Alert;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=alert.js.map
|
|
|
@ -1,172 +0,0 @@
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): button.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
var Button = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'button';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.button';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
ACTIVE: 'active',
|
|
||||||
BUTTON: 'btn',
|
|
||||||
FOCUS: 'focus'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
|
|
||||||
DATA_TOGGLE: '[data-toggle="buttons"]',
|
|
||||||
INPUT: 'input',
|
|
||||||
ACTIVE: '.active',
|
|
||||||
BUTTON: '.btn'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
|
|
||||||
FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Button = (function () {
|
|
||||||
function Button(element) {
|
|
||||||
_classCallCheck(this, Button);
|
|
||||||
|
|
||||||
this._element = element;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Button, [{
|
|
||||||
key: 'toggle',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function toggle() {
|
|
||||||
var triggerChangeEvent = true;
|
|
||||||
var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
|
|
||||||
|
|
||||||
if (rootElement) {
|
|
||||||
var input = $(this._element).find(Selector.INPUT)[0];
|
|
||||||
|
|
||||||
if (input) {
|
|
||||||
if (input.type === 'radio') {
|
|
||||||
if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
|
|
||||||
triggerChangeEvent = false;
|
|
||||||
} else {
|
|
||||||
var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
|
|
||||||
|
|
||||||
if (activeElement) {
|
|
||||||
$(activeElement).removeClass(ClassName.ACTIVE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (triggerChangeEvent) {
|
|
||||||
input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
|
|
||||||
$(this._element).trigger('change');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (triggerChangeEvent) {
|
|
||||||
$(this._element).toggleClass(ClassName.ACTIVE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY);
|
|
||||||
this._element = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var data = $(this).data(DATA_KEY);
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Button(this);
|
|
||||||
$(this).data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config === 'toggle') {
|
|
||||||
data[config]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Button;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
var button = event.target;
|
|
||||||
|
|
||||||
if (!$(button).hasClass(ClassName.BUTTON)) {
|
|
||||||
button = $(button).closest(Selector.BUTTON);
|
|
||||||
}
|
|
||||||
|
|
||||||
Button._jQueryInterface.call($(button), 'toggle');
|
|
||||||
}).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
|
|
||||||
var button = $(event.target).closest(Selector.BUTTON)[0];
|
|
||||||
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Button._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Button;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Button._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Button;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=button.js.map
|
|
|
@ -1,478 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): carousel.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Carousel = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'carousel';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.carousel';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
var TRANSITION_DURATION = 600;
|
|
||||||
|
|
||||||
var Default = {
|
|
||||||
interval: 5000,
|
|
||||||
keyboard: true,
|
|
||||||
slide: false,
|
|
||||||
pause: 'hover',
|
|
||||||
wrap: true
|
|
||||||
};
|
|
||||||
|
|
||||||
var DefaultType = {
|
|
||||||
interval: '(number|boolean)',
|
|
||||||
keyboard: 'boolean',
|
|
||||||
slide: '(boolean|string)',
|
|
||||||
pause: '(string|boolean)',
|
|
||||||
wrap: 'boolean'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Direction = {
|
|
||||||
NEXT: 'next',
|
|
||||||
PREVIOUS: 'prev'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
SLIDE: 'slide' + EVENT_KEY,
|
|
||||||
SLID: 'slid' + EVENT_KEY,
|
|
||||||
KEYDOWN: 'keydown' + EVENT_KEY,
|
|
||||||
MOUSEENTER: 'mouseenter' + EVENT_KEY,
|
|
||||||
MOUSELEAVE: 'mouseleave' + EVENT_KEY,
|
|
||||||
LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,
|
|
||||||
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
CAROUSEL: 'carousel',
|
|
||||||
ACTIVE: 'active',
|
|
||||||
SLIDE: 'slide',
|
|
||||||
RIGHT: 'right',
|
|
||||||
LEFT: 'left',
|
|
||||||
ITEM: 'carousel-item'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
ACTIVE: '.active',
|
|
||||||
ACTIVE_ITEM: '.active.carousel-item',
|
|
||||||
ITEM: '.carousel-item',
|
|
||||||
NEXT_PREV: '.next, .prev',
|
|
||||||
INDICATORS: '.carousel-indicators',
|
|
||||||
DATA_SLIDE: '[data-slide], [data-slide-to]',
|
|
||||||
DATA_RIDE: '[data-ride="carousel"]'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Carousel = (function () {
|
|
||||||
function Carousel(element, config) {
|
|
||||||
_classCallCheck(this, Carousel);
|
|
||||||
|
|
||||||
this._items = null;
|
|
||||||
this._interval = null;
|
|
||||||
this._activeElement = null;
|
|
||||||
|
|
||||||
this._isPaused = false;
|
|
||||||
this._isSliding = false;
|
|
||||||
|
|
||||||
this._config = this._getConfig(config);
|
|
||||||
this._element = $(element)[0];
|
|
||||||
this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];
|
|
||||||
|
|
||||||
this._addEventListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Carousel, [{
|
|
||||||
key: 'next',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function next() {
|
|
||||||
if (!this._isSliding) {
|
|
||||||
this._slide(Direction.NEXT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'nextWhenVisible',
|
|
||||||
value: function nextWhenVisible() {
|
|
||||||
// Don't call next when the page isn't visible
|
|
||||||
if (!document.hidden) {
|
|
||||||
this.next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'prev',
|
|
||||||
value: function prev() {
|
|
||||||
if (!this._isSliding) {
|
|
||||||
this._slide(Direction.PREVIOUS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'pause',
|
|
||||||
value: function pause(event) {
|
|
||||||
if (!event) {
|
|
||||||
this._isPaused = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
|
|
||||||
Util.triggerTransitionEnd(this._element);
|
|
||||||
this.cycle(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
clearInterval(this._interval);
|
|
||||||
this._interval = null;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'cycle',
|
|
||||||
value: function cycle(event) {
|
|
||||||
if (!event) {
|
|
||||||
this._isPaused = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._interval) {
|
|
||||||
clearInterval(this._interval);
|
|
||||||
this._interval = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._config.interval && !this._isPaused) {
|
|
||||||
this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'to',
|
|
||||||
value: function to(index) {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
|
|
||||||
|
|
||||||
var activeIndex = this._getItemIndex(this._activeElement);
|
|
||||||
|
|
||||||
if (index > this._items.length - 1 || index < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._isSliding) {
|
|
||||||
$(this._element).one(Event.SLID, function () {
|
|
||||||
return _this.to(index);
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (activeIndex === index) {
|
|
||||||
this.pause();
|
|
||||||
this.cycle();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var direction = index > activeIndex ? Direction.NEXT : Direction.PREVIOUS;
|
|
||||||
|
|
||||||
this._slide(direction, this._items[index]);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$(this._element).off(EVENT_KEY);
|
|
||||||
$.removeData(this._element, DATA_KEY);
|
|
||||||
|
|
||||||
this._items = null;
|
|
||||||
this._config = null;
|
|
||||||
this._element = null;
|
|
||||||
this._interval = null;
|
|
||||||
this._isPaused = null;
|
|
||||||
this._isSliding = null;
|
|
||||||
this._activeElement = null;
|
|
||||||
this._indicatorsElement = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_getConfig',
|
|
||||||
value: function _getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config);
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType);
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_addEventListeners',
|
|
||||||
value: function _addEventListeners() {
|
|
||||||
if (this._config.keyboard) {
|
|
||||||
$(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {
|
|
||||||
$(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_keydown',
|
|
||||||
value: function _keydown(event) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
if (/input|textarea/i.test(event.target.tagName)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (event.which) {
|
|
||||||
case 37:
|
|
||||||
this.prev();break;
|
|
||||||
case 39:
|
|
||||||
this.next();break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getItemIndex',
|
|
||||||
value: function _getItemIndex(element) {
|
|
||||||
this._items = $.makeArray($(element).parent().find(Selector.ITEM));
|
|
||||||
return this._items.indexOf(element);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getItemByDirection',
|
|
||||||
value: function _getItemByDirection(direction, activeElement) {
|
|
||||||
var isNextDirection = direction === Direction.NEXT;
|
|
||||||
var isPrevDirection = direction === Direction.PREVIOUS;
|
|
||||||
var activeIndex = this._getItemIndex(activeElement);
|
|
||||||
var lastItemIndex = this._items.length - 1;
|
|
||||||
var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
|
|
||||||
|
|
||||||
if (isGoingToWrap && !this._config.wrap) {
|
|
||||||
return activeElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
var delta = direction === Direction.PREVIOUS ? -1 : 1;
|
|
||||||
var itemIndex = (activeIndex + delta) % this._items.length;
|
|
||||||
|
|
||||||
return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_triggerSlideEvent',
|
|
||||||
value: function _triggerSlideEvent(relatedTarget, directionalClassname) {
|
|
||||||
var slideEvent = $.Event(Event.SLIDE, {
|
|
||||||
relatedTarget: relatedTarget,
|
|
||||||
direction: directionalClassname
|
|
||||||
});
|
|
||||||
|
|
||||||
$(this._element).trigger(slideEvent);
|
|
||||||
|
|
||||||
return slideEvent;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_setActiveIndicatorElement',
|
|
||||||
value: function _setActiveIndicatorElement(element) {
|
|
||||||
if (this._indicatorsElement) {
|
|
||||||
$(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
|
|
||||||
|
|
||||||
var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
|
|
||||||
|
|
||||||
if (nextIndicator) {
|
|
||||||
$(nextIndicator).addClass(ClassName.ACTIVE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_slide',
|
|
||||||
value: function _slide(direction, element) {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
|
|
||||||
var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
|
|
||||||
|
|
||||||
var isCycling = Boolean(this._interval);
|
|
||||||
|
|
||||||
var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT;
|
|
||||||
|
|
||||||
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
|
|
||||||
this._isSliding = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);
|
|
||||||
if (slideEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!activeElement || !nextElement) {
|
|
||||||
// some weirdness is happening, so we bail
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isSliding = true;
|
|
||||||
|
|
||||||
if (isCycling) {
|
|
||||||
this.pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
this._setActiveIndicatorElement(nextElement);
|
|
||||||
|
|
||||||
var slidEvent = $.Event(Event.SLID, {
|
|
||||||
relatedTarget: nextElement,
|
|
||||||
direction: directionalClassName
|
|
||||||
});
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
|
|
||||||
|
|
||||||
$(nextElement).addClass(direction);
|
|
||||||
|
|
||||||
Util.reflow(nextElement);
|
|
||||||
|
|
||||||
$(activeElement).addClass(directionalClassName);
|
|
||||||
$(nextElement).addClass(directionalClassName);
|
|
||||||
|
|
||||||
$(activeElement).one(Util.TRANSITION_END, function () {
|
|
||||||
$(nextElement).removeClass(directionalClassName).removeClass(direction);
|
|
||||||
|
|
||||||
$(nextElement).addClass(ClassName.ACTIVE);
|
|
||||||
|
|
||||||
$(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);
|
|
||||||
|
|
||||||
_this2._isSliding = false;
|
|
||||||
|
|
||||||
setTimeout(function () {
|
|
||||||
return $(_this2._element).trigger(slidEvent);
|
|
||||||
}, 0);
|
|
||||||
}).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
} else {
|
|
||||||
$(activeElement).removeClass(ClassName.ACTIVE);
|
|
||||||
$(nextElement).addClass(ClassName.ACTIVE);
|
|
||||||
|
|
||||||
this._isSliding = false;
|
|
||||||
$(this._element).trigger(slidEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isCycling) {
|
|
||||||
this.cycle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var data = $(this).data(DATA_KEY);
|
|
||||||
var _config = $.extend({}, Default, $(this).data());
|
|
||||||
|
|
||||||
if (typeof config === 'object') {
|
|
||||||
$.extend(_config, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
var action = typeof config === 'string' ? config : _config.slide;
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Carousel(this, _config);
|
|
||||||
$(this).data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'number') {
|
|
||||||
data.to(config);
|
|
||||||
} else if (typeof action === 'string') {
|
|
||||||
if (data[action] === undefined) {
|
|
||||||
throw new Error('No method named "' + action + '"');
|
|
||||||
}
|
|
||||||
data[action]();
|
|
||||||
} else if (_config.interval) {
|
|
||||||
data.pause();
|
|
||||||
data.cycle();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_dataApiClickHandler',
|
|
||||||
value: function _dataApiClickHandler(event) {
|
|
||||||
var selector = Util.getSelectorFromElement(this);
|
|
||||||
|
|
||||||
if (!selector) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var target = $(selector)[0];
|
|
||||||
|
|
||||||
if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = $.extend({}, $(target).data(), $(this).data());
|
|
||||||
var slideIndex = this.getAttribute('data-slide-to');
|
|
||||||
|
|
||||||
if (slideIndex) {
|
|
||||||
config.interval = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel._jQueryInterface.call($(target), config);
|
|
||||||
|
|
||||||
if (slideIndex) {
|
|
||||||
$(target).data(DATA_KEY).to(slideIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Default',
|
|
||||||
get: function get() {
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Carousel;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
|
|
||||||
|
|
||||||
$(window).on(Event.LOAD_DATA_API, function () {
|
|
||||||
$(Selector.DATA_RIDE).each(function () {
|
|
||||||
var $carousel = $(this);
|
|
||||||
Carousel._jQueryInterface.call($carousel, $carousel.data());
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Carousel._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Carousel;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Carousel._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Carousel;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=carousel.js.map
|
|
|
@ -1,364 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): collapse.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Collapse = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'collapse';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.collapse';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
var TRANSITION_DURATION = 600;
|
|
||||||
|
|
||||||
var Default = {
|
|
||||||
toggle: true,
|
|
||||||
parent: ''
|
|
||||||
};
|
|
||||||
|
|
||||||
var DefaultType = {
|
|
||||||
toggle: 'boolean',
|
|
||||||
parent: 'string'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
SHOW: 'show' + EVENT_KEY,
|
|
||||||
SHOWN: 'shown' + EVENT_KEY,
|
|
||||||
HIDE: 'hide' + EVENT_KEY,
|
|
||||||
HIDDEN: 'hidden' + EVENT_KEY,
|
|
||||||
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
IN: 'in',
|
|
||||||
COLLAPSE: 'collapse',
|
|
||||||
COLLAPSING: 'collapsing',
|
|
||||||
COLLAPSED: 'collapsed'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Dimension = {
|
|
||||||
WIDTH: 'width',
|
|
||||||
HEIGHT: 'height'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
ACTIVES: '.panel > .in, .panel > .collapsing',
|
|
||||||
DATA_TOGGLE: '[data-toggle="collapse"]'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Collapse = (function () {
|
|
||||||
function Collapse(element, config) {
|
|
||||||
_classCallCheck(this, Collapse);
|
|
||||||
|
|
||||||
this._isTransitioning = false;
|
|
||||||
this._element = element;
|
|
||||||
this._config = this._getConfig(config);
|
|
||||||
this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
|
|
||||||
|
|
||||||
this._parent = this._config.parent ? this._getParent() : null;
|
|
||||||
|
|
||||||
if (!this._config.parent) {
|
|
||||||
this._addAriaAndCollapsedClass(this._element, this._triggerArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._config.toggle) {
|
|
||||||
this.toggle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Collapse, [{
|
|
||||||
key: 'toggle',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function toggle() {
|
|
||||||
if ($(this._element).hasClass(ClassName.IN)) {
|
|
||||||
this.hide();
|
|
||||||
} else {
|
|
||||||
this.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'show',
|
|
||||||
value: function show() {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var actives = undefined;
|
|
||||||
var activesData = undefined;
|
|
||||||
|
|
||||||
if (this._parent) {
|
|
||||||
actives = $.makeArray($(Selector.ACTIVES));
|
|
||||||
if (!actives.length) {
|
|
||||||
actives = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actives) {
|
|
||||||
activesData = $(actives).data(DATA_KEY);
|
|
||||||
if (activesData && activesData._isTransitioning) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var startEvent = $.Event(Event.SHOW);
|
|
||||||
$(this._element).trigger(startEvent);
|
|
||||||
if (startEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actives) {
|
|
||||||
Collapse._jQueryInterface.call($(actives), 'hide');
|
|
||||||
if (!activesData) {
|
|
||||||
$(actives).data(DATA_KEY, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dimension = this._getDimension();
|
|
||||||
|
|
||||||
$(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
|
|
||||||
|
|
||||||
this._element.style[dimension] = 0;
|
|
||||||
this._element.setAttribute('aria-expanded', true);
|
|
||||||
|
|
||||||
if (this._triggerArray.length) {
|
|
||||||
$(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setTransitioning(true);
|
|
||||||
|
|
||||||
var complete = function complete() {
|
|
||||||
$(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);
|
|
||||||
|
|
||||||
_this._element.style[dimension] = '';
|
|
||||||
|
|
||||||
_this.setTransitioning(false);
|
|
||||||
|
|
||||||
$(_this._element).trigger(Event.SHOWN);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!Util.supportsTransitionEnd()) {
|
|
||||||
complete();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
|
||||||
var scrollSize = 'scroll' + capitalizedDimension;
|
|
||||||
|
|
||||||
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
|
|
||||||
this._element.style[dimension] = this._element[scrollSize] + 'px';
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'hide',
|
|
||||||
value: function hide() {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var startEvent = $.Event(Event.HIDE);
|
|
||||||
$(this._element).trigger(startEvent);
|
|
||||||
if (startEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var dimension = this._getDimension();
|
|
||||||
var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';
|
|
||||||
|
|
||||||
this._element.style[dimension] = this._element[offsetDimension] + 'px';
|
|
||||||
|
|
||||||
Util.reflow(this._element);
|
|
||||||
|
|
||||||
$(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);
|
|
||||||
|
|
||||||
this._element.setAttribute('aria-expanded', false);
|
|
||||||
|
|
||||||
if (this._triggerArray.length) {
|
|
||||||
$(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setTransitioning(true);
|
|
||||||
|
|
||||||
var complete = function complete() {
|
|
||||||
_this2.setTransitioning(false);
|
|
||||||
$(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
|
|
||||||
};
|
|
||||||
|
|
||||||
this._element.style[dimension] = 0;
|
|
||||||
|
|
||||||
if (!Util.supportsTransitionEnd()) {
|
|
||||||
complete();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'setTransitioning',
|
|
||||||
value: function setTransitioning(isTransitioning) {
|
|
||||||
this._isTransitioning = isTransitioning;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY);
|
|
||||||
|
|
||||||
this._config = null;
|
|
||||||
this._parent = null;
|
|
||||||
this._element = null;
|
|
||||||
this._triggerArray = null;
|
|
||||||
this._isTransitioning = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_getConfig',
|
|
||||||
value: function _getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config);
|
|
||||||
config.toggle = Boolean(config.toggle); // coerce string values
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType);
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getDimension',
|
|
||||||
value: function _getDimension() {
|
|
||||||
var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
|
|
||||||
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getParent',
|
|
||||||
value: function _getParent() {
|
|
||||||
var _this3 = this;
|
|
||||||
|
|
||||||
var parent = $(this._config.parent)[0];
|
|
||||||
var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
|
|
||||||
|
|
||||||
$(parent).find(selector).each(function (i, element) {
|
|
||||||
_this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
|
|
||||||
});
|
|
||||||
|
|
||||||
return parent;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_addAriaAndCollapsedClass',
|
|
||||||
value: function _addAriaAndCollapsedClass(element, triggerArray) {
|
|
||||||
if (element) {
|
|
||||||
var isOpen = $(element).hasClass(ClassName.IN);
|
|
||||||
element.setAttribute('aria-expanded', isOpen);
|
|
||||||
|
|
||||||
if (triggerArray.length) {
|
|
||||||
$(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_getTargetFromElement',
|
|
||||||
value: function _getTargetFromElement(element) {
|
|
||||||
var selector = Util.getSelectorFromElement(element);
|
|
||||||
return selector ? $(selector)[0] : null;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this);
|
|
||||||
var data = $this.data(DATA_KEY);
|
|
||||||
var _config = $.extend({}, Default, $this.data(), typeof config === 'object' && config);
|
|
||||||
|
|
||||||
if (!data && _config.toggle && /show|hide/.test(config)) {
|
|
||||||
_config.toggle = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Collapse(this, _config);
|
|
||||||
$this.data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error('No method named "' + config + '"');
|
|
||||||
}
|
|
||||||
data[config]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Default',
|
|
||||||
get: function get() {
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Collapse;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
var target = Collapse._getTargetFromElement(this);
|
|
||||||
var data = $(target).data(DATA_KEY);
|
|
||||||
var config = data ? 'toggle' : $(this).data();
|
|
||||||
|
|
||||||
Collapse._jQueryInterface.call($(target), config);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Collapse._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Collapse;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Collapse._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Collapse;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=collapse.js.map
|
|
|
@ -1,293 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): dropdown.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Dropdown = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'dropdown';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.dropdown';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
HIDE: 'hide' + EVENT_KEY,
|
|
||||||
HIDDEN: 'hidden' + EVENT_KEY,
|
|
||||||
SHOW: 'show' + EVENT_KEY,
|
|
||||||
SHOWN: 'shown' + EVENT_KEY,
|
|
||||||
CLICK: 'click' + EVENT_KEY,
|
|
||||||
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
|
|
||||||
KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
BACKDROP: 'dropdown-backdrop',
|
|
||||||
DISABLED: 'disabled',
|
|
||||||
OPEN: 'open'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
BACKDROP: '.dropdown-backdrop',
|
|
||||||
DATA_TOGGLE: '[data-toggle="dropdown"]',
|
|
||||||
FORM_CHILD: '.dropdown form',
|
|
||||||
ROLE_MENU: '[role="menu"]',
|
|
||||||
ROLE_LISTBOX: '[role="listbox"]',
|
|
||||||
NAVBAR_NAV: '.navbar-nav',
|
|
||||||
VISIBLE_ITEMS: '[role="menu"] li:not(.disabled) a, ' + '[role="listbox"] li:not(.disabled) a'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Dropdown = (function () {
|
|
||||||
function Dropdown(element) {
|
|
||||||
_classCallCheck(this, Dropdown);
|
|
||||||
|
|
||||||
this._element = element;
|
|
||||||
|
|
||||||
this._addEventListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Dropdown, [{
|
|
||||||
key: 'toggle',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function toggle() {
|
|
||||||
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var parent = Dropdown._getParentFromElement(this);
|
|
||||||
var isActive = $(parent).hasClass(ClassName.OPEN);
|
|
||||||
|
|
||||||
Dropdown._clearMenus();
|
|
||||||
|
|
||||||
if (isActive) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
|
|
||||||
|
|
||||||
// if mobile we use a backdrop because click events don't delegate
|
|
||||||
var dropdown = document.createElement('div');
|
|
||||||
dropdown.className = ClassName.BACKDROP;
|
|
||||||
$(dropdown).insertBefore(this);
|
|
||||||
$(dropdown).on('click', Dropdown._clearMenus);
|
|
||||||
}
|
|
||||||
|
|
||||||
var relatedTarget = { relatedTarget: this };
|
|
||||||
var showEvent = $.Event(Event.SHOW, relatedTarget);
|
|
||||||
|
|
||||||
$(parent).trigger(showEvent);
|
|
||||||
|
|
||||||
if (showEvent.isDefaultPrevented()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.focus();
|
|
||||||
this.setAttribute('aria-expanded', 'true');
|
|
||||||
|
|
||||||
$(parent).toggleClass(ClassName.OPEN);
|
|
||||||
$(parent).trigger($.Event(Event.SHOWN, relatedTarget));
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY);
|
|
||||||
$(this._element).off(EVENT_KEY);
|
|
||||||
this._element = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_addEventListeners',
|
|
||||||
value: function _addEventListeners() {
|
|
||||||
$(this._element).on(Event.CLICK, this.toggle);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var data = $(this).data(DATA_KEY);
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
$(this).data(DATA_KEY, data = new Dropdown(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error('No method named "' + config + '"');
|
|
||||||
}
|
|
||||||
data[config].call(this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_clearMenus',
|
|
||||||
value: function _clearMenus(event) {
|
|
||||||
if (event && event.which === 3) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var backdrop = $(Selector.BACKDROP)[0];
|
|
||||||
if (backdrop) {
|
|
||||||
backdrop.parentNode.removeChild(backdrop);
|
|
||||||
}
|
|
||||||
|
|
||||||
var toggles = $.makeArray($(Selector.DATA_TOGGLE));
|
|
||||||
|
|
||||||
for (var i = 0; i < toggles.length; i++) {
|
|
||||||
var _parent = Dropdown._getParentFromElement(toggles[i]);
|
|
||||||
var relatedTarget = { relatedTarget: toggles[i] };
|
|
||||||
|
|
||||||
if (!$(_parent).hasClass(ClassName.OPEN)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(_parent, event.target)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var hideEvent = $.Event(Event.HIDE, relatedTarget);
|
|
||||||
$(_parent).trigger(hideEvent);
|
|
||||||
if (hideEvent.isDefaultPrevented()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
toggles[i].setAttribute('aria-expanded', 'false');
|
|
||||||
|
|
||||||
$(_parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getParentFromElement',
|
|
||||||
value: function _getParentFromElement(element) {
|
|
||||||
var parent = undefined;
|
|
||||||
var selector = Util.getSelectorFromElement(element);
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
parent = $(selector)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent || element.parentNode;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_dataApiKeydownHandler',
|
|
||||||
value: function _dataApiKeydownHandler(event) {
|
|
||||||
if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
event.stopPropagation();
|
|
||||||
|
|
||||||
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var parent = Dropdown._getParentFromElement(this);
|
|
||||||
var isActive = $(parent).hasClass(ClassName.OPEN);
|
|
||||||
|
|
||||||
if (!isActive && event.which !== 27 || isActive && event.which === 27) {
|
|
||||||
|
|
||||||
if (event.which === 27) {
|
|
||||||
var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
|
|
||||||
$(toggle).trigger('focus');
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this).trigger('click');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var items = $.makeArray($(Selector.VISIBLE_ITEMS));
|
|
||||||
|
|
||||||
items = items.filter(function (item) {
|
|
||||||
return item.offsetWidth || item.offsetHeight;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!items.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var index = items.indexOf(event.target);
|
|
||||||
|
|
||||||
if (event.which === 38 && index > 0) {
|
|
||||||
// up
|
|
||||||
index--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.which === 40 && index < items.length - 1) {
|
|
||||||
// down
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! ~index) {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
items[index].focus();
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Dropdown;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
|
|
||||||
e.stopPropagation();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Dropdown._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Dropdown;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Dropdown._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Dropdown;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=dropdown.js.map
|
|
|
@ -1,536 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): modal.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Modal = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'modal';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.modal';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
var TRANSITION_DURATION = 300;
|
|
||||||
var BACKDROP_TRANSITION_DURATION = 150;
|
|
||||||
|
|
||||||
var Default = {
|
|
||||||
backdrop: true,
|
|
||||||
keyboard: true,
|
|
||||||
focus: true,
|
|
||||||
show: true
|
|
||||||
};
|
|
||||||
|
|
||||||
var DefaultType = {
|
|
||||||
backdrop: '(boolean|string)',
|
|
||||||
keyboard: 'boolean',
|
|
||||||
focus: 'boolean',
|
|
||||||
show: 'boolean'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
HIDE: 'hide' + EVENT_KEY,
|
|
||||||
HIDDEN: 'hidden' + EVENT_KEY,
|
|
||||||
SHOW: 'show' + EVENT_KEY,
|
|
||||||
SHOWN: 'shown' + EVENT_KEY,
|
|
||||||
FOCUSIN: 'focusin' + EVENT_KEY,
|
|
||||||
RESIZE: 'resize' + EVENT_KEY,
|
|
||||||
CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
|
|
||||||
KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
|
|
||||||
MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
|
|
||||||
MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
|
|
||||||
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
|
|
||||||
BACKDROP: 'modal-backdrop',
|
|
||||||
OPEN: 'modal-open',
|
|
||||||
FADE: 'fade',
|
|
||||||
IN: 'in'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
DIALOG: '.modal-dialog',
|
|
||||||
DATA_TOGGLE: '[data-toggle="modal"]',
|
|
||||||
DATA_DISMISS: '[data-dismiss="modal"]',
|
|
||||||
FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Modal = (function () {
|
|
||||||
function Modal(element, config) {
|
|
||||||
_classCallCheck(this, Modal);
|
|
||||||
|
|
||||||
this._config = this._getConfig(config);
|
|
||||||
this._element = element;
|
|
||||||
this._dialog = $(element).find(Selector.DIALOG)[0];
|
|
||||||
this._backdrop = null;
|
|
||||||
this._isShown = false;
|
|
||||||
this._isBodyOverflowing = false;
|
|
||||||
this._ignoreBackdropClick = false;
|
|
||||||
this._originalBodyPadding = 0;
|
|
||||||
this._scrollbarWidth = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Modal, [{
|
|
||||||
key: 'toggle',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function toggle(relatedTarget) {
|
|
||||||
return this._isShown ? this.hide() : this.show(relatedTarget);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'show',
|
|
||||||
value: function show(relatedTarget) {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var showEvent = $.Event(Event.SHOW, {
|
|
||||||
relatedTarget: relatedTarget
|
|
||||||
});
|
|
||||||
|
|
||||||
$(this._element).trigger(showEvent);
|
|
||||||
|
|
||||||
if (this._isShown || showEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isShown = true;
|
|
||||||
|
|
||||||
this._checkScrollbar();
|
|
||||||
this._setScrollbar();
|
|
||||||
|
|
||||||
$(document.body).addClass(ClassName.OPEN);
|
|
||||||
|
|
||||||
this._setEscapeEvent();
|
|
||||||
this._setResizeEvent();
|
|
||||||
|
|
||||||
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
|
|
||||||
|
|
||||||
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
|
|
||||||
$(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
|
|
||||||
if ($(event.target).is(_this._element)) {
|
|
||||||
_this._ignoreBackdropClick = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this._showBackdrop($.proxy(this._showElement, this, relatedTarget));
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'hide',
|
|
||||||
value: function hide(event) {
|
|
||||||
if (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
var hideEvent = $.Event(Event.HIDE);
|
|
||||||
|
|
||||||
$(this._element).trigger(hideEvent);
|
|
||||||
|
|
||||||
if (!this._isShown || hideEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isShown = false;
|
|
||||||
|
|
||||||
this._setEscapeEvent();
|
|
||||||
this._setResizeEvent();
|
|
||||||
|
|
||||||
$(document).off(Event.FOCUSIN);
|
|
||||||
|
|
||||||
$(this._element).removeClass(ClassName.IN);
|
|
||||||
|
|
||||||
$(this._element).off(Event.CLICK_DISMISS);
|
|
||||||
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
|
|
||||||
|
|
||||||
$(this._element).one(Util.TRANSITION_END, $.proxy(this._hideModal, this)).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
} else {
|
|
||||||
this._hideModal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY);
|
|
||||||
|
|
||||||
$(window).off(EVENT_KEY);
|
|
||||||
$(document).off(EVENT_KEY);
|
|
||||||
$(this._element).off(EVENT_KEY);
|
|
||||||
$(this._backdrop).off(EVENT_KEY);
|
|
||||||
|
|
||||||
this._config = null;
|
|
||||||
this._element = null;
|
|
||||||
this._dialog = null;
|
|
||||||
this._backdrop = null;
|
|
||||||
this._isShown = null;
|
|
||||||
this._isBodyOverflowing = null;
|
|
||||||
this._ignoreBackdropClick = null;
|
|
||||||
this._originalBodyPadding = null;
|
|
||||||
this._scrollbarWidth = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_getConfig',
|
|
||||||
value: function _getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config);
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType);
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_showElement',
|
|
||||||
value: function _showElement(relatedTarget) {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
|
|
||||||
|
|
||||||
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
|
||||||
// don't move modals dom position
|
|
||||||
document.body.appendChild(this._element);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._element.style.display = 'block';
|
|
||||||
this._element.scrollTop = 0;
|
|
||||||
|
|
||||||
if (transition) {
|
|
||||||
Util.reflow(this._element);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._element).addClass(ClassName.IN);
|
|
||||||
|
|
||||||
if (this._config.focus) {
|
|
||||||
this._enforceFocus();
|
|
||||||
}
|
|
||||||
|
|
||||||
var shownEvent = $.Event(Event.SHOWN, {
|
|
||||||
relatedTarget: relatedTarget
|
|
||||||
});
|
|
||||||
|
|
||||||
var transitionComplete = function transitionComplete() {
|
|
||||||
if (_this2._config.focus) {
|
|
||||||
_this2._element.focus();
|
|
||||||
}
|
|
||||||
$(_this2._element).trigger(shownEvent);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (transition) {
|
|
||||||
$(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
} else {
|
|
||||||
transitionComplete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_enforceFocus',
|
|
||||||
value: function _enforceFocus() {
|
|
||||||
var _this3 = this;
|
|
||||||
|
|
||||||
$(document).off(Event.FOCUSIN) // guard against infinite focus loop
|
|
||||||
.on(Event.FOCUSIN, function (event) {
|
|
||||||
if (_this3._element !== event.target && !$(_this3._element).has(event.target).length) {
|
|
||||||
_this3._element.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_setEscapeEvent',
|
|
||||||
value: function _setEscapeEvent() {
|
|
||||||
var _this4 = this;
|
|
||||||
|
|
||||||
if (this._isShown && this._config.keyboard) {
|
|
||||||
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
|
|
||||||
if (event.which === 27) {
|
|
||||||
_this4.hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (!this._isShown) {
|
|
||||||
$(this._element).off(Event.KEYDOWN_DISMISS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_setResizeEvent',
|
|
||||||
value: function _setResizeEvent() {
|
|
||||||
if (this._isShown) {
|
|
||||||
$(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this));
|
|
||||||
} else {
|
|
||||||
$(window).off(Event.RESIZE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_hideModal',
|
|
||||||
value: function _hideModal() {
|
|
||||||
var _this5 = this;
|
|
||||||
|
|
||||||
this._element.style.display = 'none';
|
|
||||||
this._showBackdrop(function () {
|
|
||||||
$(document.body).removeClass(ClassName.OPEN);
|
|
||||||
_this5._resetAdjustments();
|
|
||||||
_this5._resetScrollbar();
|
|
||||||
$(_this5._element).trigger(Event.HIDDEN);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_removeBackdrop',
|
|
||||||
value: function _removeBackdrop() {
|
|
||||||
if (this._backdrop) {
|
|
||||||
$(this._backdrop).remove();
|
|
||||||
this._backdrop = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_showBackdrop',
|
|
||||||
value: function _showBackdrop(callback) {
|
|
||||||
var _this6 = this;
|
|
||||||
|
|
||||||
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
|
|
||||||
|
|
||||||
if (this._isShown && this._config.backdrop) {
|
|
||||||
var doAnimate = Util.supportsTransitionEnd() && animate;
|
|
||||||
|
|
||||||
this._backdrop = document.createElement('div');
|
|
||||||
this._backdrop.className = ClassName.BACKDROP;
|
|
||||||
|
|
||||||
if (animate) {
|
|
||||||
$(this._backdrop).addClass(animate);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._backdrop).appendTo(document.body);
|
|
||||||
|
|
||||||
$(this._element).on(Event.CLICK_DISMISS, function (event) {
|
|
||||||
if (_this6._ignoreBackdropClick) {
|
|
||||||
_this6._ignoreBackdropClick = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (event.target !== event.currentTarget) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (_this6._config.backdrop === 'static') {
|
|
||||||
_this6._element.focus();
|
|
||||||
} else {
|
|
||||||
_this6.hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (doAnimate) {
|
|
||||||
Util.reflow(this._backdrop);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._backdrop).addClass(ClassName.IN);
|
|
||||||
|
|
||||||
if (!callback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!doAnimate) {
|
|
||||||
callback();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
|
|
||||||
} else if (!this._isShown && this._backdrop) {
|
|
||||||
$(this._backdrop).removeClass(ClassName.IN);
|
|
||||||
|
|
||||||
var callbackRemove = function callbackRemove() {
|
|
||||||
_this6._removeBackdrop();
|
|
||||||
if (callback) {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
|
|
||||||
$(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
|
|
||||||
} else {
|
|
||||||
callbackRemove();
|
|
||||||
}
|
|
||||||
} else if (callback) {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
// the following methods are used to handle overflowing modals
|
|
||||||
// todo (fat): these should probably be refactored out of modal.js
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_handleUpdate',
|
|
||||||
value: function _handleUpdate() {
|
|
||||||
this._adjustDialog();
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_adjustDialog',
|
|
||||||
value: function _adjustDialog() {
|
|
||||||
var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
|
||||||
|
|
||||||
if (!this._isBodyOverflowing && isModalOverflowing) {
|
|
||||||
this._element.style.paddingLeft = this._scrollbarWidth + 'px';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._isBodyOverflowing && !isModalOverflowing) {
|
|
||||||
this._element.style.paddingRight = this._scrollbarWidth + 'px~';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_resetAdjustments',
|
|
||||||
value: function _resetAdjustments() {
|
|
||||||
this._element.style.paddingLeft = '';
|
|
||||||
this._element.style.paddingRight = '';
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_checkScrollbar',
|
|
||||||
value: function _checkScrollbar() {
|
|
||||||
var fullWindowWidth = window.innerWidth;
|
|
||||||
if (!fullWindowWidth) {
|
|
||||||
// workaround for missing window.innerWidth in IE8
|
|
||||||
var documentElementRect = document.documentElement.getBoundingClientRect();
|
|
||||||
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);
|
|
||||||
}
|
|
||||||
this._isBodyOverflowing = document.body.clientWidth < fullWindowWidth;
|
|
||||||
this._scrollbarWidth = this._getScrollbarWidth();
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_setScrollbar',
|
|
||||||
value: function _setScrollbar() {
|
|
||||||
var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);
|
|
||||||
|
|
||||||
this._originalBodyPadding = document.body.style.paddingRight || '';
|
|
||||||
|
|
||||||
if (this._isBodyOverflowing) {
|
|
||||||
document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_resetScrollbar',
|
|
||||||
value: function _resetScrollbar() {
|
|
||||||
document.body.style.paddingRight = this._originalBodyPadding;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getScrollbarWidth',
|
|
||||||
value: function _getScrollbarWidth() {
|
|
||||||
// thx d.walsh
|
|
||||||
var scrollDiv = document.createElement('div');
|
|
||||||
scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
|
|
||||||
document.body.appendChild(scrollDiv);
|
|
||||||
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
|
||||||
document.body.removeChild(scrollDiv);
|
|
||||||
return scrollbarWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config, relatedTarget) {
|
|
||||||
return this.each(function () {
|
|
||||||
var data = $(this).data(DATA_KEY);
|
|
||||||
var _config = $.extend({}, Modal.Default, $(this).data(), typeof config === 'object' && config);
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Modal(this, _config);
|
|
||||||
$(this).data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error('No method named "' + config + '"');
|
|
||||||
}
|
|
||||||
data[config](relatedTarget);
|
|
||||||
} else if (_config.show) {
|
|
||||||
data.show(relatedTarget);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Default',
|
|
||||||
get: function get() {
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Modal;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
|
||||||
var _this7 = this;
|
|
||||||
|
|
||||||
var target = undefined;
|
|
||||||
var selector = Util.getSelectorFromElement(this);
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
target = $(selector)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
|
|
||||||
|
|
||||||
if (this.tagName === 'A') {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
var $target = $(target).one(Event.SHOW, function (showEvent) {
|
|
||||||
if (showEvent.isDefaultPrevented()) {
|
|
||||||
// only register focus restorer if modal will actually get shown
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$target.one(Event.HIDDEN, function () {
|
|
||||||
if ($(_this7).is(':visible')) {
|
|
||||||
_this7.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Modal._jQueryInterface.call($(target), config, this);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Modal._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Modal;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Modal._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Modal;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=modal.js.map
|
|
|
@ -1,201 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): popover.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Popover = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'popover';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.popover';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
|
|
||||||
var Default = $.extend({}, Tooltip.Default, {
|
|
||||||
placement: 'right',
|
|
||||||
trigger: 'click',
|
|
||||||
content: '',
|
|
||||||
template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
|
|
||||||
});
|
|
||||||
|
|
||||||
var DefaultType = $.extend({}, Tooltip.DefaultType, {
|
|
||||||
content: '(string|element|function)'
|
|
||||||
});
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
FADE: 'fade',
|
|
||||||
IN: 'in'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
TITLE: '.popover-title',
|
|
||||||
CONTENT: '.popover-content',
|
|
||||||
ARROW: '.popover-arrow'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
HIDE: 'hide' + EVENT_KEY,
|
|
||||||
HIDDEN: 'hidden' + EVENT_KEY,
|
|
||||||
SHOW: 'show' + EVENT_KEY,
|
|
||||||
SHOWN: 'shown' + EVENT_KEY,
|
|
||||||
INSERTED: 'inserted' + EVENT_KEY,
|
|
||||||
CLICK: 'click' + EVENT_KEY,
|
|
||||||
FOCUSIN: 'focusin' + EVENT_KEY,
|
|
||||||
FOCUSOUT: 'focusout' + EVENT_KEY,
|
|
||||||
MOUSEENTER: 'mouseenter' + EVENT_KEY,
|
|
||||||
MOUSELEAVE: 'mouseleave' + EVENT_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Popover = (function (_Tooltip) {
|
|
||||||
_inherits(Popover, _Tooltip);
|
|
||||||
|
|
||||||
function Popover() {
|
|
||||||
_classCallCheck(this, Popover);
|
|
||||||
|
|
||||||
_get(Object.getPrototypeOf(Popover.prototype), 'constructor', this).apply(this, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
_createClass(Popover, [{
|
|
||||||
key: 'isWithContent',
|
|
||||||
|
|
||||||
// overrides
|
|
||||||
|
|
||||||
value: function isWithContent() {
|
|
||||||
return this.getTitle() || this._getContent();
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getTipElement',
|
|
||||||
value: function getTipElement() {
|
|
||||||
return this.tip = this.tip || $(this.config.template)[0];
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'setContent',
|
|
||||||
value: function setContent() {
|
|
||||||
var $tip = $(this.getTipElement());
|
|
||||||
|
|
||||||
// we use append for html objects to maintain js events
|
|
||||||
this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
|
|
||||||
this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
|
|
||||||
|
|
||||||
$tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
|
|
||||||
|
|
||||||
this.cleanupTether();
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_getContent',
|
|
||||||
value: function _getContent() {
|
|
||||||
return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var data = $(this).data(DATA_KEY);
|
|
||||||
var _config = typeof config === 'object' ? config : null;
|
|
||||||
|
|
||||||
if (!data && /destroy|hide/.test(config)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Popover(this, _config);
|
|
||||||
$(this).data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error('No method named "' + config + '"');
|
|
||||||
}
|
|
||||||
data[config]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Default',
|
|
||||||
get: function get() {
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'NAME',
|
|
||||||
get: function get() {
|
|
||||||
return NAME;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'DATA_KEY',
|
|
||||||
get: function get() {
|
|
||||||
return DATA_KEY;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Event',
|
|
||||||
get: function get() {
|
|
||||||
return Event;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'EVENT_KEY',
|
|
||||||
get: function get() {
|
|
||||||
return EVENT_KEY;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'DefaultType',
|
|
||||||
get: function get() {
|
|
||||||
return DefaultType;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Popover;
|
|
||||||
})(Tooltip);
|
|
||||||
|
|
||||||
$.fn[NAME] = Popover._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Popover;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Popover._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Popover;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=popover.js.map
|
|
|
@ -1,320 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): scrollspy.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var ScrollSpy = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'scrollspy';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.scrollspy';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
|
|
||||||
var Default = {
|
|
||||||
offset: 10,
|
|
||||||
method: 'auto',
|
|
||||||
target: ''
|
|
||||||
};
|
|
||||||
|
|
||||||
var DefaultType = {
|
|
||||||
offset: 'number',
|
|
||||||
method: 'string',
|
|
||||||
target: '(string|element)'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
ACTIVATE: 'activate' + EVENT_KEY,
|
|
||||||
SCROLL: 'scroll' + EVENT_KEY,
|
|
||||||
LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
DROPDOWN_ITEM: 'dropdown-item',
|
|
||||||
DROPDOWN_MENU: 'dropdown-menu',
|
|
||||||
NAV_LINK: 'nav-link',
|
|
||||||
NAV: 'nav',
|
|
||||||
ACTIVE: 'active'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
DATA_SPY: '[data-spy="scroll"]',
|
|
||||||
ACTIVE: '.active',
|
|
||||||
LIST_ITEM: '.list-item',
|
|
||||||
LI: 'li',
|
|
||||||
LI_DROPDOWN: 'li.dropdown',
|
|
||||||
NAV_LINKS: '.nav-link',
|
|
||||||
DROPDOWN: '.dropdown',
|
|
||||||
DROPDOWN_ITEMS: '.dropdown-item',
|
|
||||||
DROPDOWN_TOGGLE: '.dropdown-toggle'
|
|
||||||
};
|
|
||||||
|
|
||||||
var OffsetMethod = {
|
|
||||||
OFFSET: 'offset',
|
|
||||||
POSITION: 'position'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var ScrollSpy = (function () {
|
|
||||||
function ScrollSpy(element, config) {
|
|
||||||
_classCallCheck(this, ScrollSpy);
|
|
||||||
|
|
||||||
this._element = element;
|
|
||||||
this._scrollElement = element.tagName === 'BODY' ? window : element;
|
|
||||||
this._config = this._getConfig(config);
|
|
||||||
this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);
|
|
||||||
this._offsets = [];
|
|
||||||
this._targets = [];
|
|
||||||
this._activeTarget = null;
|
|
||||||
this._scrollHeight = 0;
|
|
||||||
|
|
||||||
$(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this));
|
|
||||||
|
|
||||||
this.refresh();
|
|
||||||
this._process();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(ScrollSpy, [{
|
|
||||||
key: 'refresh',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function refresh() {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
|
|
||||||
|
|
||||||
var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
|
|
||||||
|
|
||||||
var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
|
|
||||||
|
|
||||||
this._offsets = [];
|
|
||||||
this._targets = [];
|
|
||||||
|
|
||||||
this._scrollHeight = this._getScrollHeight();
|
|
||||||
|
|
||||||
var targets = $.makeArray($(this._selector));
|
|
||||||
|
|
||||||
targets.map(function (element) {
|
|
||||||
var target = undefined;
|
|
||||||
var targetSelector = Util.getSelectorFromElement(element);
|
|
||||||
|
|
||||||
if (targetSelector) {
|
|
||||||
target = $(targetSelector)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target && (target.offsetWidth || target.offsetHeight)) {
|
|
||||||
// todo (fat): remove sketch reliance on jQuery position/offset
|
|
||||||
return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
|
|
||||||
}
|
|
||||||
}).filter(function (item) {
|
|
||||||
return item;
|
|
||||||
}).sort(function (a, b) {
|
|
||||||
return a[0] - b[0];
|
|
||||||
}).forEach(function (item) {
|
|
||||||
_this._offsets.push(item[0]);
|
|
||||||
_this._targets.push(item[1]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY);
|
|
||||||
$(this._scrollElement).off(EVENT_KEY);
|
|
||||||
|
|
||||||
this._element = null;
|
|
||||||
this._scrollElement = null;
|
|
||||||
this._config = null;
|
|
||||||
this._selector = null;
|
|
||||||
this._offsets = null;
|
|
||||||
this._targets = null;
|
|
||||||
this._activeTarget = null;
|
|
||||||
this._scrollHeight = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_getConfig',
|
|
||||||
value: function _getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config);
|
|
||||||
|
|
||||||
if (typeof config.target !== 'string') {
|
|
||||||
var id = $(config.target).attr('id');
|
|
||||||
if (!id) {
|
|
||||||
id = Util.getUID(NAME);
|
|
||||||
$(config.target).attr('id', id);
|
|
||||||
}
|
|
||||||
config.target = '#' + id;
|
|
||||||
}
|
|
||||||
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType);
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getScrollTop',
|
|
||||||
value: function _getScrollTop() {
|
|
||||||
return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getScrollHeight',
|
|
||||||
value: function _getScrollHeight() {
|
|
||||||
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_process',
|
|
||||||
value: function _process() {
|
|
||||||
var scrollTop = this._getScrollTop() + this._config.offset;
|
|
||||||
var scrollHeight = this._getScrollHeight();
|
|
||||||
var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight;
|
|
||||||
|
|
||||||
if (this._scrollHeight !== scrollHeight) {
|
|
||||||
this.refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scrollTop >= maxScroll) {
|
|
||||||
var target = this._targets[this._targets.length - 1];
|
|
||||||
|
|
||||||
if (this._activeTarget !== target) {
|
|
||||||
this._activate(target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._activeTarget && scrollTop < this._offsets[0]) {
|
|
||||||
this._activeTarget = null;
|
|
||||||
this._clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = this._offsets.length; i--;) {
|
|
||||||
var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);
|
|
||||||
|
|
||||||
if (isActiveTarget) {
|
|
||||||
this._activate(this._targets[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_activate',
|
|
||||||
value: function _activate(target) {
|
|
||||||
this._activeTarget = target;
|
|
||||||
|
|
||||||
this._clear();
|
|
||||||
|
|
||||||
var queries = this._selector.split(',');
|
|
||||||
queries = queries.map(function (selector) {
|
|
||||||
return selector + '[data-target="' + target + '"],' + (selector + '[href="' + target + '"]');
|
|
||||||
});
|
|
||||||
|
|
||||||
var $link = $(queries.join(','));
|
|
||||||
|
|
||||||
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
|
|
||||||
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
|
|
||||||
$link.addClass(ClassName.ACTIVE);
|
|
||||||
} else {
|
|
||||||
// todo (fat) this is kinda sus…
|
|
||||||
// recursively add actives to tested nav-links
|
|
||||||
$link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._scrollElement).trigger(Event.ACTIVATE, {
|
|
||||||
relatedTarget: target
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_clear',
|
|
||||||
value: function _clear() {
|
|
||||||
$(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var data = $(this).data(DATA_KEY);
|
|
||||||
var _config = typeof config === 'object' && config || null;
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new ScrollSpy(this, _config);
|
|
||||||
$(this).data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error('No method named "' + config + '"');
|
|
||||||
}
|
|
||||||
data[config]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Default',
|
|
||||||
get: function get() {
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return ScrollSpy;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(window).on(Event.LOAD_DATA_API, function () {
|
|
||||||
var scrollSpys = $.makeArray($(Selector.DATA_SPY));
|
|
||||||
|
|
||||||
for (var i = scrollSpys.length; i--;) {
|
|
||||||
var $spy = $(scrollSpys[i]);
|
|
||||||
ScrollSpy._jQueryInterface.call($spy, $spy.data());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = ScrollSpy._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = ScrollSpy;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return ScrollSpy._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return ScrollSpy;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=scrollspy.js.map
|
|
|
@ -1,263 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): tab.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Tab = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'tab';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.tab';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var DATA_API_KEY = '.data-api';
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
var TRANSITION_DURATION = 150;
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
HIDE: 'hide' + EVENT_KEY,
|
|
||||||
HIDDEN: 'hidden' + EVENT_KEY,
|
|
||||||
SHOW: 'show' + EVENT_KEY,
|
|
||||||
SHOWN: 'shown' + EVENT_KEY,
|
|
||||||
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
DROPDOWN_MENU: 'dropdown-menu',
|
|
||||||
ACTIVE: 'active',
|
|
||||||
FADE: 'fade',
|
|
||||||
IN: 'in'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
A: 'a',
|
|
||||||
LI: 'li',
|
|
||||||
DROPDOWN: '.dropdown',
|
|
||||||
UL: 'ul:not(.dropdown-menu)',
|
|
||||||
FADE_CHILD: '> .nav-item .fade, > .fade',
|
|
||||||
ACTIVE: '.active',
|
|
||||||
ACTIVE_CHILD: '> .nav-item > .active, > .active',
|
|
||||||
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"]',
|
|
||||||
DROPDOWN_TOGGLE: '.dropdown-toggle',
|
|
||||||
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Tab = (function () {
|
|
||||||
function Tab(element) {
|
|
||||||
_classCallCheck(this, Tab);
|
|
||||||
|
|
||||||
this._element = element;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Tab, [{
|
|
||||||
key: 'show',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function show() {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var target = undefined;
|
|
||||||
var previous = undefined;
|
|
||||||
var ulElement = $(this._element).closest(Selector.UL)[0];
|
|
||||||
var selector = Util.getSelectorFromElement(this._element);
|
|
||||||
|
|
||||||
if (ulElement) {
|
|
||||||
previous = $.makeArray($(ulElement).find(Selector.ACTIVE));
|
|
||||||
previous = previous[previous.length - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
var hideEvent = $.Event(Event.HIDE, {
|
|
||||||
relatedTarget: this._element
|
|
||||||
});
|
|
||||||
|
|
||||||
var showEvent = $.Event(Event.SHOW, {
|
|
||||||
relatedTarget: previous
|
|
||||||
});
|
|
||||||
|
|
||||||
if (previous) {
|
|
||||||
$(previous).trigger(hideEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._element).trigger(showEvent);
|
|
||||||
|
|
||||||
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
target = $(selector)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
this._activate(this._element, ulElement);
|
|
||||||
|
|
||||||
var complete = function complete() {
|
|
||||||
var hiddenEvent = $.Event(Event.HIDDEN, {
|
|
||||||
relatedTarget: _this._element
|
|
||||||
});
|
|
||||||
|
|
||||||
var shownEvent = $.Event(Event.SHOWN, {
|
|
||||||
relatedTarget: previous
|
|
||||||
});
|
|
||||||
|
|
||||||
$(previous).trigger(hiddenEvent);
|
|
||||||
$(_this._element).trigger(shownEvent);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (target) {
|
|
||||||
this._activate(target, target.parentNode, complete);
|
|
||||||
} else {
|
|
||||||
complete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
$.removeClass(this._element, DATA_KEY);
|
|
||||||
this._element = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_activate',
|
|
||||||
value: function _activate(element, container, callback) {
|
|
||||||
var active = $(container).find(Selector.ACTIVE_CHILD)[0];
|
|
||||||
var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));
|
|
||||||
|
|
||||||
var complete = $.proxy(this._transitionComplete, this, element, active, isTransitioning, callback);
|
|
||||||
|
|
||||||
if (active && isTransitioning) {
|
|
||||||
$(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
} else {
|
|
||||||
complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (active) {
|
|
||||||
$(active).removeClass(ClassName.IN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_transitionComplete',
|
|
||||||
value: function _transitionComplete(element, active, isTransitioning, callback) {
|
|
||||||
if (active) {
|
|
||||||
$(active).removeClass(ClassName.ACTIVE);
|
|
||||||
|
|
||||||
var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
|
|
||||||
|
|
||||||
if (dropdownChild) {
|
|
||||||
$(dropdownChild).removeClass(ClassName.ACTIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
active.setAttribute('aria-expanded', false);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(element).addClass(ClassName.ACTIVE);
|
|
||||||
element.setAttribute('aria-expanded', true);
|
|
||||||
|
|
||||||
if (isTransitioning) {
|
|
||||||
Util.reflow(element);
|
|
||||||
$(element).addClass(ClassName.IN);
|
|
||||||
} else {
|
|
||||||
$(element).removeClass(ClassName.FADE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
|
|
||||||
|
|
||||||
var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
|
|
||||||
if (dropdownElement) {
|
|
||||||
$(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
element.setAttribute('aria-expanded', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (callback) {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var $this = $(this);
|
|
||||||
var data = $this.data(DATA_KEY);
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = data = new Tab(this);
|
|
||||||
$this.data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error('No method named "' + config + '"');
|
|
||||||
}
|
|
||||||
data[config]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Tab;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
Tab._jQueryInterface.call($(this), 'show');
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Tab._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Tab;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Tab._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Tab;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=tab.js.map
|
|
|
@ -1,619 +0,0 @@
|
||||||
/* global Tether */
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): tooltip.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Tooltip = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check for Tether dependency
|
|
||||||
* Tether - http://github.hubspot.com/tether/
|
|
||||||
*/
|
|
||||||
if (window.Tether === undefined) {
|
|
||||||
throw new Error('Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var NAME = 'tooltip';
|
|
||||||
var VERSION = '4.0.0-alpha';
|
|
||||||
var DATA_KEY = 'bs.tooltip';
|
|
||||||
var EVENT_KEY = '.' + DATA_KEY;
|
|
||||||
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
||||||
var TRANSITION_DURATION = 150;
|
|
||||||
var CLASS_PREFIX = 'bs-tether';
|
|
||||||
|
|
||||||
var Default = {
|
|
||||||
animation: true,
|
|
||||||
template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div></div>',
|
|
||||||
trigger: 'hover focus',
|
|
||||||
title: '',
|
|
||||||
delay: 0,
|
|
||||||
html: false,
|
|
||||||
selector: false,
|
|
||||||
placement: 'top',
|
|
||||||
offset: '0 0',
|
|
||||||
constraints: []
|
|
||||||
};
|
|
||||||
|
|
||||||
var DefaultType = {
|
|
||||||
animation: 'boolean',
|
|
||||||
template: 'string',
|
|
||||||
title: '(string|element|function)',
|
|
||||||
trigger: 'string',
|
|
||||||
delay: '(number|object)',
|
|
||||||
html: 'boolean',
|
|
||||||
selector: '(string|boolean)',
|
|
||||||
placement: '(string|function)',
|
|
||||||
offset: 'string',
|
|
||||||
constraints: 'array'
|
|
||||||
};
|
|
||||||
|
|
||||||
var AttachmentMap = {
|
|
||||||
TOP: 'bottom center',
|
|
||||||
RIGHT: 'middle left',
|
|
||||||
BOTTOM: 'top center',
|
|
||||||
LEFT: 'middle right'
|
|
||||||
};
|
|
||||||
|
|
||||||
var HoverState = {
|
|
||||||
IN: 'in',
|
|
||||||
OUT: 'out'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Event = {
|
|
||||||
HIDE: 'hide' + EVENT_KEY,
|
|
||||||
HIDDEN: 'hidden' + EVENT_KEY,
|
|
||||||
SHOW: 'show' + EVENT_KEY,
|
|
||||||
SHOWN: 'shown' + EVENT_KEY,
|
|
||||||
INSERTED: 'inserted' + EVENT_KEY,
|
|
||||||
CLICK: 'click' + EVENT_KEY,
|
|
||||||
FOCUSIN: 'focusin' + EVENT_KEY,
|
|
||||||
FOCUSOUT: 'focusout' + EVENT_KEY,
|
|
||||||
MOUSEENTER: 'mouseenter' + EVENT_KEY,
|
|
||||||
MOUSELEAVE: 'mouseleave' + EVENT_KEY
|
|
||||||
};
|
|
||||||
|
|
||||||
var ClassName = {
|
|
||||||
FADE: 'fade',
|
|
||||||
IN: 'in'
|
|
||||||
};
|
|
||||||
|
|
||||||
var Selector = {
|
|
||||||
TOOLTIP: '.tooltip',
|
|
||||||
TOOLTIP_INNER: '.tooltip-inner'
|
|
||||||
};
|
|
||||||
|
|
||||||
var TetherClass = {
|
|
||||||
element: false,
|
|
||||||
enabled: false
|
|
||||||
};
|
|
||||||
|
|
||||||
var Trigger = {
|
|
||||||
HOVER: 'hover',
|
|
||||||
FOCUS: 'focus',
|
|
||||||
CLICK: 'click',
|
|
||||||
MANUAL: 'manual'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Tooltip = (function () {
|
|
||||||
function Tooltip(element, config) {
|
|
||||||
_classCallCheck(this, Tooltip);
|
|
||||||
|
|
||||||
// private
|
|
||||||
this._isEnabled = true;
|
|
||||||
this._timeout = 0;
|
|
||||||
this._hoverState = '';
|
|
||||||
this._activeTrigger = {};
|
|
||||||
this._tether = null;
|
|
||||||
|
|
||||||
// protected
|
|
||||||
this.element = element;
|
|
||||||
this.config = this._getConfig(config);
|
|
||||||
this.tip = null;
|
|
||||||
|
|
||||||
this._setListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
_createClass(Tooltip, [{
|
|
||||||
key: 'enable',
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
value: function enable() {
|
|
||||||
this._isEnabled = true;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'disable',
|
|
||||||
value: function disable() {
|
|
||||||
this._isEnabled = false;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'toggleEnabled',
|
|
||||||
value: function toggleEnabled() {
|
|
||||||
this._isEnabled = !this._isEnabled;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'toggle',
|
|
||||||
value: function toggle(event) {
|
|
||||||
if (event) {
|
|
||||||
var dataKey = this.constructor.DATA_KEY;
|
|
||||||
var context = $(event.currentTarget).data(dataKey);
|
|
||||||
|
|
||||||
if (!context) {
|
|
||||||
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
|
|
||||||
$(event.currentTarget).data(dataKey, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
context._activeTrigger.click = !context._activeTrigger.click;
|
|
||||||
|
|
||||||
if (context._isWithActiveTrigger()) {
|
|
||||||
context._enter(null, context);
|
|
||||||
} else {
|
|
||||||
context._leave(null, context);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if ($(this.getTipElement()).hasClass(ClassName.IN)) {
|
|
||||||
this._leave(null, this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._enter(null, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'dispose',
|
|
||||||
value: function dispose() {
|
|
||||||
clearTimeout(this._timeout);
|
|
||||||
|
|
||||||
this.cleanupTether();
|
|
||||||
|
|
||||||
$.removeData(this.element, this.constructor.DATA_KEY);
|
|
||||||
|
|
||||||
$(this.element).off(this.constructor.EVENT_KEY);
|
|
||||||
|
|
||||||
if (this.tip) {
|
|
||||||
$(this.tip).remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isEnabled = null;
|
|
||||||
this._timeout = null;
|
|
||||||
this._hoverState = null;
|
|
||||||
this._activeTrigger = null;
|
|
||||||
this._tether = null;
|
|
||||||
|
|
||||||
this.element = null;
|
|
||||||
this.config = null;
|
|
||||||
this.tip = null;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'show',
|
|
||||||
value: function show() {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var showEvent = $.Event(this.constructor.Event.SHOW);
|
|
||||||
|
|
||||||
if (this.isWithContent() && this._isEnabled) {
|
|
||||||
$(this.element).trigger(showEvent);
|
|
||||||
|
|
||||||
var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
|
|
||||||
|
|
||||||
if (showEvent.isDefaultPrevented() || !isInTheDom) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var tip = this.getTipElement();
|
|
||||||
var tipId = Util.getUID(this.constructor.NAME);
|
|
||||||
|
|
||||||
tip.setAttribute('id', tipId);
|
|
||||||
this.element.setAttribute('aria-describedby', tipId);
|
|
||||||
|
|
||||||
this.setContent();
|
|
||||||
|
|
||||||
if (this.config.animation) {
|
|
||||||
$(tip).addClass(ClassName.FADE);
|
|
||||||
}
|
|
||||||
|
|
||||||
var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
|
|
||||||
|
|
||||||
var attachment = this._getAttachment(placement);
|
|
||||||
|
|
||||||
$(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body);
|
|
||||||
|
|
||||||
$(this.element).trigger(this.constructor.Event.INSERTED);
|
|
||||||
|
|
||||||
this._tether = new Tether({
|
|
||||||
attachment: attachment,
|
|
||||||
element: tip,
|
|
||||||
target: this.element,
|
|
||||||
classes: TetherClass,
|
|
||||||
classPrefix: CLASS_PREFIX,
|
|
||||||
offset: this.config.offset,
|
|
||||||
constraints: this.config.constraints,
|
|
||||||
addTargetClasses: false
|
|
||||||
});
|
|
||||||
|
|
||||||
Util.reflow(tip);
|
|
||||||
this._tether.position();
|
|
||||||
|
|
||||||
$(tip).addClass(ClassName.IN);
|
|
||||||
|
|
||||||
var complete = function complete() {
|
|
||||||
var prevHoverState = _this._hoverState;
|
|
||||||
_this._hoverState = null;
|
|
||||||
|
|
||||||
$(_this.element).trigger(_this.constructor.Event.SHOWN);
|
|
||||||
|
|
||||||
if (prevHoverState === HoverState.OUT) {
|
|
||||||
_this._leave(null, _this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
|
|
||||||
$(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
complete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'hide',
|
|
||||||
value: function hide(callback) {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
var tip = this.getTipElement();
|
|
||||||
var hideEvent = $.Event(this.constructor.Event.HIDE);
|
|
||||||
var complete = function complete() {
|
|
||||||
if (_this2._hoverState !== HoverState.IN && tip.parentNode) {
|
|
||||||
tip.parentNode.removeChild(tip);
|
|
||||||
}
|
|
||||||
|
|
||||||
_this2.element.removeAttribute('aria-describedby');
|
|
||||||
$(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
|
|
||||||
_this2.cleanupTether();
|
|
||||||
|
|
||||||
if (callback) {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$(this.element).trigger(hideEvent);
|
|
||||||
|
|
||||||
if (hideEvent.isDefaultPrevented()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$(tip).removeClass(ClassName.IN);
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
|
|
||||||
|
|
||||||
$(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
|
||||||
} else {
|
|
||||||
complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
this._hoverState = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
// protected
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: 'isWithContent',
|
|
||||||
value: function isWithContent() {
|
|
||||||
return Boolean(this.getTitle());
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getTipElement',
|
|
||||||
value: function getTipElement() {
|
|
||||||
return this.tip = this.tip || $(this.config.template)[0];
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'setContent',
|
|
||||||
value: function setContent() {
|
|
||||||
var $tip = $(this.getTipElement());
|
|
||||||
|
|
||||||
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
|
|
||||||
|
|
||||||
$tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
|
|
||||||
|
|
||||||
this.cleanupTether();
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'setElementContent',
|
|
||||||
value: function setElementContent($element, content) {
|
|
||||||
var html = this.config.html;
|
|
||||||
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
|
|
||||||
// content is a DOM node or a jQuery
|
|
||||||
if (html) {
|
|
||||||
if (!$(content).parent().is($element)) {
|
|
||||||
$element.empty().append(content);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$element.text($(content).text());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$element[html ? 'html' : 'text'](content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getTitle',
|
|
||||||
value: function getTitle() {
|
|
||||||
var title = this.element.getAttribute('data-original-title');
|
|
||||||
|
|
||||||
if (!title) {
|
|
||||||
title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
|
|
||||||
}
|
|
||||||
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'cleanupTether',
|
|
||||||
value: function cleanupTether() {
|
|
||||||
if (this._tether) {
|
|
||||||
this._tether.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_getAttachment',
|
|
||||||
value: function _getAttachment(placement) {
|
|
||||||
return AttachmentMap[placement.toUpperCase()];
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_setListeners',
|
|
||||||
value: function _setListeners() {
|
|
||||||
var _this3 = this;
|
|
||||||
|
|
||||||
var triggers = this.config.trigger.split(' ');
|
|
||||||
|
|
||||||
triggers.forEach(function (trigger) {
|
|
||||||
if (trigger === 'click') {
|
|
||||||
$(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, $.proxy(_this3.toggle, _this3));
|
|
||||||
} else if (trigger !== Trigger.MANUAL) {
|
|
||||||
var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
|
|
||||||
var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
|
|
||||||
|
|
||||||
$(_this3.element).on(eventIn, _this3.config.selector, $.proxy(_this3._enter, _this3)).on(eventOut, _this3.config.selector, $.proxy(_this3._leave, _this3));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this.config.selector) {
|
|
||||||
this.config = $.extend({}, this.config, {
|
|
||||||
trigger: 'manual',
|
|
||||||
selector: ''
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._fixTitle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_fixTitle',
|
|
||||||
value: function _fixTitle() {
|
|
||||||
var titleType = typeof this.element.getAttribute('data-original-title');
|
|
||||||
if (this.element.getAttribute('title') || titleType !== 'string') {
|
|
||||||
this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
|
|
||||||
this.element.setAttribute('title', '');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_enter',
|
|
||||||
value: function _enter(event, context) {
|
|
||||||
var dataKey = this.constructor.DATA_KEY;
|
|
||||||
|
|
||||||
context = context || $(event.currentTarget).data(dataKey);
|
|
||||||
|
|
||||||
if (!context) {
|
|
||||||
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
|
|
||||||
$(event.currentTarget).data(dataKey, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) {
|
|
||||||
context._hoverState = HoverState.IN;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
clearTimeout(context._timeout);
|
|
||||||
|
|
||||||
context._hoverState = HoverState.IN;
|
|
||||||
|
|
||||||
if (!context.config.delay || !context.config.delay.show) {
|
|
||||||
context.show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
context._timeout = setTimeout(function () {
|
|
||||||
if (context._hoverState === HoverState.IN) {
|
|
||||||
context.show();
|
|
||||||
}
|
|
||||||
}, context.config.delay.show);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_leave',
|
|
||||||
value: function _leave(event, context) {
|
|
||||||
var dataKey = this.constructor.DATA_KEY;
|
|
||||||
|
|
||||||
context = context || $(event.currentTarget).data(dataKey);
|
|
||||||
|
|
||||||
if (!context) {
|
|
||||||
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
|
|
||||||
$(event.currentTarget).data(dataKey, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (context._isWithActiveTrigger()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
clearTimeout(context._timeout);
|
|
||||||
|
|
||||||
context._hoverState = HoverState.OUT;
|
|
||||||
|
|
||||||
if (!context.config.delay || !context.config.delay.hide) {
|
|
||||||
context.hide();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
context._timeout = setTimeout(function () {
|
|
||||||
if (context._hoverState === HoverState.OUT) {
|
|
||||||
context.hide();
|
|
||||||
}
|
|
||||||
}, context.config.delay.hide);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_isWithActiveTrigger',
|
|
||||||
value: function _isWithActiveTrigger() {
|
|
||||||
for (var trigger in this._activeTrigger) {
|
|
||||||
if (this._activeTrigger[trigger]) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getConfig',
|
|
||||||
value: function _getConfig(config) {
|
|
||||||
config = $.extend({}, this.constructor.Default, $(this.element).data(), config);
|
|
||||||
|
|
||||||
if (config.delay && typeof config.delay === 'number') {
|
|
||||||
config.delay = {
|
|
||||||
show: config.delay,
|
|
||||||
hide: config.delay
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: '_getDelegateConfig',
|
|
||||||
value: function _getDelegateConfig() {
|
|
||||||
var config = {};
|
|
||||||
|
|
||||||
if (this.config) {
|
|
||||||
for (var key in this.config) {
|
|
||||||
if (this.constructor.Default[key] !== this.config[key]) {
|
|
||||||
config[key] = this.config[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
}], [{
|
|
||||||
key: '_jQueryInterface',
|
|
||||||
value: function _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
var data = $(this).data(DATA_KEY);
|
|
||||||
var _config = typeof config === 'object' ? config : null;
|
|
||||||
|
|
||||||
if (!data && /destroy|hide/.test(config)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Tooltip(this, _config);
|
|
||||||
$(this).data(DATA_KEY, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error('No method named "' + config + '"');
|
|
||||||
}
|
|
||||||
data[config]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'VERSION',
|
|
||||||
get: function get() {
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Default',
|
|
||||||
get: function get() {
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'NAME',
|
|
||||||
get: function get() {
|
|
||||||
return NAME;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'DATA_KEY',
|
|
||||||
get: function get() {
|
|
||||||
return DATA_KEY;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'Event',
|
|
||||||
get: function get() {
|
|
||||||
return Event;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'EVENT_KEY',
|
|
||||||
get: function get() {
|
|
||||||
return EVENT_KEY;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'DefaultType',
|
|
||||||
get: function get() {
|
|
||||||
return DefaultType;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return Tooltip;
|
|
||||||
})();
|
|
||||||
|
|
||||||
$.fn[NAME] = Tooltip._jQueryInterface;
|
|
||||||
$.fn[NAME].Constructor = Tooltip;
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
||||||
return Tooltip._jQueryInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Tooltip;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=tooltip.js.map
|
|
|
@ -1,157 +0,0 @@
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): util.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var Util = (function ($) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Private TransitionEnd Helpers
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var transition = false;
|
|
||||||
|
|
||||||
var TransitionEndEvent = {
|
|
||||||
WebkitTransition: 'webkitTransitionEnd',
|
|
||||||
MozTransition: 'transitionend',
|
|
||||||
OTransition: 'oTransitionEnd otransitionend',
|
|
||||||
transition: 'transitionend'
|
|
||||||
};
|
|
||||||
|
|
||||||
// shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
||||||
function toType(obj) {
|
|
||||||
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
function isElement(obj) {
|
|
||||||
return (obj[0] || obj).nodeType;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSpecialTransitionEndEvent() {
|
|
||||||
return {
|
|
||||||
bindType: transition.end,
|
|
||||||
delegateType: transition.end,
|
|
||||||
handle: function handle(event) {
|
|
||||||
if ($(event.target).is(this)) {
|
|
||||||
return event.handleObj.handler.apply(this, arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function transitionEndTest() {
|
|
||||||
if (window.QUnit) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var el = document.createElement('bootstrap');
|
|
||||||
|
|
||||||
for (var _name in TransitionEndEvent) {
|
|
||||||
if (el.style[_name] !== undefined) {
|
|
||||||
return { end: TransitionEndEvent[_name] };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function transitionEndEmulator(duration) {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var called = false;
|
|
||||||
|
|
||||||
$(this).one(Util.TRANSITION_END, function () {
|
|
||||||
called = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
setTimeout(function () {
|
|
||||||
if (!called) {
|
|
||||||
Util.triggerTransitionEnd(_this);
|
|
||||||
}
|
|
||||||
}, duration);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function setTransitionEndSupport() {
|
|
||||||
transition = transitionEndTest();
|
|
||||||
|
|
||||||
$.fn.emulateTransitionEnd = transitionEndEmulator;
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd()) {
|
|
||||||
$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Public Util Api
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Util = {
|
|
||||||
|
|
||||||
TRANSITION_END: 'bsTransitionEnd',
|
|
||||||
|
|
||||||
getUID: function getUID(prefix) {
|
|
||||||
do {
|
|
||||||
prefix += ~ ~(Math.random() * 1000000); // "~~" acts like a faster Math.floor() here
|
|
||||||
} while (document.getElementById(prefix));
|
|
||||||
return prefix;
|
|
||||||
},
|
|
||||||
|
|
||||||
getSelectorFromElement: function getSelectorFromElement(element) {
|
|
||||||
var selector = element.getAttribute('data-target');
|
|
||||||
|
|
||||||
if (!selector) {
|
|
||||||
selector = element.getAttribute('href') || '';
|
|
||||||
selector = /^#[a-z]/i.test(selector) ? selector : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return selector;
|
|
||||||
},
|
|
||||||
|
|
||||||
reflow: function reflow(element) {
|
|
||||||
new Function('bs', 'return bs')(element.offsetHeight);
|
|
||||||
},
|
|
||||||
|
|
||||||
triggerTransitionEnd: function triggerTransitionEnd(element) {
|
|
||||||
$(element).trigger(transition.end);
|
|
||||||
},
|
|
||||||
|
|
||||||
supportsTransitionEnd: function supportsTransitionEnd() {
|
|
||||||
return Boolean(transition);
|
|
||||||
},
|
|
||||||
|
|
||||||
typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
|
|
||||||
for (var property in configTypes) {
|
|
||||||
if (configTypes.hasOwnProperty(property)) {
|
|
||||||
var expectedTypes = configTypes[property];
|
|
||||||
var value = config[property];
|
|
||||||
var valueType = undefined;
|
|
||||||
|
|
||||||
if (value && isElement(value)) {
|
|
||||||
valueType = 'element';
|
|
||||||
} else {
|
|
||||||
valueType = toType(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
||||||
throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
setTransitionEndSupport();
|
|
||||||
|
|
||||||
return Util;
|
|
||||||
})(jQuery);
|
|
||||||
//# sourceMappingURL=util.js.map
|
|
|
@ -1,193 +0,0 @@
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): alert.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Alert = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'alert'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.alert'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
const TRANSITION_DURATION = 150
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
DISMISS : '[data-dismiss="alert"]'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
CLOSE : `close${EVENT_KEY}`,
|
|
||||||
CLOSED : `closed${EVENT_KEY}`,
|
|
||||||
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
ALERT : 'alert',
|
|
||||||
FADE : 'fade',
|
|
||||||
IN : 'in'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Alert {
|
|
||||||
|
|
||||||
constructor(element) {
|
|
||||||
this._element = element
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
close(element) {
|
|
||||||
element = element || this._element
|
|
||||||
|
|
||||||
let rootElement = this._getRootElement(element)
|
|
||||||
let customEvent = this._triggerCloseEvent(rootElement)
|
|
||||||
|
|
||||||
if (customEvent.isDefaultPrevented()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this._removeElement(rootElement)
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY)
|
|
||||||
this._element = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_getRootElement(element) {
|
|
||||||
let selector = Util.getSelectorFromElement(element)
|
|
||||||
let parent = false
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
parent = $(selector)[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!parent) {
|
|
||||||
parent = $(element).closest(`.${ClassName.ALERT}`)[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent
|
|
||||||
}
|
|
||||||
|
|
||||||
_triggerCloseEvent(element) {
|
|
||||||
let closeEvent = $.Event(Event.CLOSE)
|
|
||||||
|
|
||||||
$(element).trigger(closeEvent)
|
|
||||||
return closeEvent
|
|
||||||
}
|
|
||||||
|
|
||||||
_removeElement(element) {
|
|
||||||
$(element).removeClass(ClassName.IN)
|
|
||||||
|
|
||||||
if (!Util.supportsTransitionEnd() ||
|
|
||||||
!$(element).hasClass(ClassName.FADE)) {
|
|
||||||
this._destroyElement(element)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$(element)
|
|
||||||
.one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element))
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
}
|
|
||||||
|
|
||||||
_destroyElement(element) {
|
|
||||||
$(element)
|
|
||||||
.detach()
|
|
||||||
.trigger(Event.CLOSED)
|
|
||||||
.remove()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let $element = $(this)
|
|
||||||
let data = $element.data(DATA_KEY)
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Alert(this)
|
|
||||||
$element.data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config === 'close') {
|
|
||||||
data[config](this)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
static _handleDismiss(alertInstance) {
|
|
||||||
return function (event) {
|
|
||||||
if (event) {
|
|
||||||
event.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
alertInstance.close(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(document).on(
|
|
||||||
Event.CLICK_DATA_API,
|
|
||||||
Selector.DISMISS,
|
|
||||||
Alert._handleDismiss(new Alert())
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Alert._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Alert
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Alert._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Alert
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Alert
|
|
|
@ -1,173 +0,0 @@
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): button.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Button = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'button'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.button'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
ACTIVE : 'active',
|
|
||||||
BUTTON : 'btn',
|
|
||||||
FOCUS : 'focus'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
|
|
||||||
DATA_TOGGLE : '[data-toggle="buttons"]',
|
|
||||||
INPUT : 'input',
|
|
||||||
ACTIVE : '.active',
|
|
||||||
BUTTON : '.btn'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
|
|
||||||
FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} `
|
|
||||||
+ `blur${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Button {
|
|
||||||
|
|
||||||
constructor(element) {
|
|
||||||
this._element = element
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
toggle() {
|
|
||||||
let triggerChangeEvent = true
|
|
||||||
let rootElement = $(this._element).closest(
|
|
||||||
Selector.DATA_TOGGLE
|
|
||||||
)[0]
|
|
||||||
|
|
||||||
if (rootElement) {
|
|
||||||
let input = $(this._element).find(Selector.INPUT)[0]
|
|
||||||
|
|
||||||
if (input) {
|
|
||||||
if (input.type === 'radio') {
|
|
||||||
if (input.checked &&
|
|
||||||
$(this._element).hasClass(ClassName.ACTIVE)) {
|
|
||||||
triggerChangeEvent = false
|
|
||||||
|
|
||||||
} else {
|
|
||||||
let activeElement = $(rootElement).find(Selector.ACTIVE)[0]
|
|
||||||
|
|
||||||
if (activeElement) {
|
|
||||||
$(activeElement).removeClass(ClassName.ACTIVE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (triggerChangeEvent) {
|
|
||||||
input.checked = !$(this._element).hasClass(ClassName.ACTIVE)
|
|
||||||
$(this._element).trigger('change')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._element.setAttribute('aria-pressed',
|
|
||||||
!$(this._element).hasClass(ClassName.ACTIVE))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (triggerChangeEvent) {
|
|
||||||
$(this._element).toggleClass(ClassName.ACTIVE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY)
|
|
||||||
this._element = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let data = $(this).data(DATA_KEY)
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Button(this)
|
|
||||||
$(this).data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config === 'toggle') {
|
|
||||||
data[config]()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
|
|
||||||
event.preventDefault()
|
|
||||||
|
|
||||||
let button = event.target
|
|
||||||
|
|
||||||
if (!$(button).hasClass(ClassName.BUTTON)) {
|
|
||||||
button = $(button).closest(Selector.BUTTON)
|
|
||||||
}
|
|
||||||
|
|
||||||
Button._jQueryInterface.call($(button), 'toggle')
|
|
||||||
})
|
|
||||||
.on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
|
|
||||||
let button = $(event.target).closest(Selector.BUTTON)[0]
|
|
||||||
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Button._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Button
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Button._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Button
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Button
|
|
|
@ -1,478 +0,0 @@
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): carousel.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Carousel = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'carousel'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.carousel'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
const TRANSITION_DURATION = 600
|
|
||||||
|
|
||||||
const Default = {
|
|
||||||
interval : 5000,
|
|
||||||
keyboard : true,
|
|
||||||
slide : false,
|
|
||||||
pause : 'hover',
|
|
||||||
wrap : true
|
|
||||||
}
|
|
||||||
|
|
||||||
const DefaultType = {
|
|
||||||
interval : '(number|boolean)',
|
|
||||||
keyboard : 'boolean',
|
|
||||||
slide : '(boolean|string)',
|
|
||||||
pause : '(string|boolean)',
|
|
||||||
wrap : 'boolean'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Direction = {
|
|
||||||
NEXT : 'next',
|
|
||||||
PREVIOUS : 'prev'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
SLIDE : `slide${EVENT_KEY}`,
|
|
||||||
SLID : `slid${EVENT_KEY}`,
|
|
||||||
KEYDOWN : `keydown${EVENT_KEY}`,
|
|
||||||
MOUSEENTER : `mouseenter${EVENT_KEY}`,
|
|
||||||
MOUSELEAVE : `mouseleave${EVENT_KEY}`,
|
|
||||||
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,
|
|
||||||
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
CAROUSEL : 'carousel',
|
|
||||||
ACTIVE : 'active',
|
|
||||||
SLIDE : 'slide',
|
|
||||||
RIGHT : 'right',
|
|
||||||
LEFT : 'left',
|
|
||||||
ITEM : 'carousel-item'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
ACTIVE : '.active',
|
|
||||||
ACTIVE_ITEM : '.active.carousel-item',
|
|
||||||
ITEM : '.carousel-item',
|
|
||||||
NEXT_PREV : '.next, .prev',
|
|
||||||
INDICATORS : '.carousel-indicators',
|
|
||||||
DATA_SLIDE : '[data-slide], [data-slide-to]',
|
|
||||||
DATA_RIDE : '[data-ride="carousel"]'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Carousel {
|
|
||||||
|
|
||||||
constructor(element, config) {
|
|
||||||
this._items = null
|
|
||||||
this._interval = null
|
|
||||||
this._activeElement = null
|
|
||||||
|
|
||||||
this._isPaused = false
|
|
||||||
this._isSliding = false
|
|
||||||
|
|
||||||
this._config = this._getConfig(config)
|
|
||||||
this._element = $(element)[0]
|
|
||||||
this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0]
|
|
||||||
|
|
||||||
this._addEventListeners()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Default() {
|
|
||||||
return Default
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
next() {
|
|
||||||
if (!this._isSliding) {
|
|
||||||
this._slide(Direction.NEXT)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nextWhenVisible() {
|
|
||||||
// Don't call next when the page isn't visible
|
|
||||||
if (!document.hidden) {
|
|
||||||
this.next()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
prev() {
|
|
||||||
if (!this._isSliding) {
|
|
||||||
this._slide(Direction.PREVIOUS)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pause(event) {
|
|
||||||
if (!event) {
|
|
||||||
this._isPaused = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($(this._element).find(Selector.NEXT_PREV)[0] &&
|
|
||||||
Util.supportsTransitionEnd()) {
|
|
||||||
Util.triggerTransitionEnd(this._element)
|
|
||||||
this.cycle(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
clearInterval(this._interval)
|
|
||||||
this._interval = null
|
|
||||||
}
|
|
||||||
|
|
||||||
cycle(event) {
|
|
||||||
if (!event) {
|
|
||||||
this._isPaused = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._interval) {
|
|
||||||
clearInterval(this._interval)
|
|
||||||
this._interval = null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._config.interval && !this._isPaused) {
|
|
||||||
this._interval = setInterval(
|
|
||||||
$.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
to(index) {
|
|
||||||
this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
|
|
||||||
|
|
||||||
let activeIndex = this._getItemIndex(this._activeElement)
|
|
||||||
|
|
||||||
if (index > (this._items.length - 1) || index < 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._isSliding) {
|
|
||||||
$(this._element).one(Event.SLID, () => this.to(index))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (activeIndex === index) {
|
|
||||||
this.pause()
|
|
||||||
this.cycle()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let direction = index > activeIndex ?
|
|
||||||
Direction.NEXT :
|
|
||||||
Direction.PREVIOUS
|
|
||||||
|
|
||||||
this._slide(direction, this._items[index])
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$(this._element).off(EVENT_KEY)
|
|
||||||
$.removeData(this._element, DATA_KEY)
|
|
||||||
|
|
||||||
this._items = null
|
|
||||||
this._config = null
|
|
||||||
this._element = null
|
|
||||||
this._interval = null
|
|
||||||
this._isPaused = null
|
|
||||||
this._isSliding = null
|
|
||||||
this._activeElement = null
|
|
||||||
this._indicatorsElement = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config)
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType)
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
_addEventListeners() {
|
|
||||||
if (this._config.keyboard) {
|
|
||||||
$(this._element)
|
|
||||||
.on(Event.KEYDOWN, $.proxy(this._keydown, this))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._config.pause === 'hover' &&
|
|
||||||
!('ontouchstart' in document.documentElement)) {
|
|
||||||
$(this._element)
|
|
||||||
.on(Event.MOUSEENTER, $.proxy(this.pause, this))
|
|
||||||
.on(Event.MOUSELEAVE, $.proxy(this.cycle, this))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_keydown(event) {
|
|
||||||
event.preventDefault()
|
|
||||||
|
|
||||||
if (/input|textarea/i.test(event.target.tagName)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (event.which) {
|
|
||||||
case 37: this.prev(); break
|
|
||||||
case 39: this.next(); break
|
|
||||||
default: return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_getItemIndex(element) {
|
|
||||||
this._items = $.makeArray($(element).parent().find(Selector.ITEM))
|
|
||||||
return this._items.indexOf(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
_getItemByDirection(direction, activeElement) {
|
|
||||||
let isNextDirection = direction === Direction.NEXT
|
|
||||||
let isPrevDirection = direction === Direction.PREVIOUS
|
|
||||||
let activeIndex = this._getItemIndex(activeElement)
|
|
||||||
let lastItemIndex = (this._items.length - 1)
|
|
||||||
let isGoingToWrap = (isPrevDirection && activeIndex === 0) ||
|
|
||||||
(isNextDirection && activeIndex === lastItemIndex)
|
|
||||||
|
|
||||||
if (isGoingToWrap && !this._config.wrap) {
|
|
||||||
return activeElement
|
|
||||||
}
|
|
||||||
|
|
||||||
let delta = direction === Direction.PREVIOUS ? -1 : 1
|
|
||||||
let itemIndex = (activeIndex + delta) % this._items.length
|
|
||||||
|
|
||||||
return itemIndex === -1 ?
|
|
||||||
this._items[this._items.length - 1] : this._items[itemIndex]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
_triggerSlideEvent(relatedTarget, directionalClassname) {
|
|
||||||
let slideEvent = $.Event(Event.SLIDE, {
|
|
||||||
relatedTarget,
|
|
||||||
direction: directionalClassname
|
|
||||||
})
|
|
||||||
|
|
||||||
$(this._element).trigger(slideEvent)
|
|
||||||
|
|
||||||
return slideEvent
|
|
||||||
}
|
|
||||||
|
|
||||||
_setActiveIndicatorElement(element) {
|
|
||||||
if (this._indicatorsElement) {
|
|
||||||
$(this._indicatorsElement)
|
|
||||||
.find(Selector.ACTIVE)
|
|
||||||
.removeClass(ClassName.ACTIVE)
|
|
||||||
|
|
||||||
let nextIndicator = this._indicatorsElement.children[
|
|
||||||
this._getItemIndex(element)
|
|
||||||
]
|
|
||||||
|
|
||||||
if (nextIndicator) {
|
|
||||||
$(nextIndicator).addClass(ClassName.ACTIVE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_slide(direction, element) {
|
|
||||||
let activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
|
|
||||||
let nextElement = element || activeElement &&
|
|
||||||
this._getItemByDirection(direction, activeElement)
|
|
||||||
|
|
||||||
let isCycling = Boolean(this._interval)
|
|
||||||
|
|
||||||
let directionalClassName = direction === Direction.NEXT ?
|
|
||||||
ClassName.LEFT :
|
|
||||||
ClassName.RIGHT
|
|
||||||
|
|
||||||
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
|
|
||||||
this._isSliding = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let slideEvent = this._triggerSlideEvent(nextElement, directionalClassName)
|
|
||||||
if (slideEvent.isDefaultPrevented()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!activeElement || !nextElement) {
|
|
||||||
// some weirdness is happening, so we bail
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isSliding = true
|
|
||||||
|
|
||||||
if (isCycling) {
|
|
||||||
this.pause()
|
|
||||||
}
|
|
||||||
|
|
||||||
this._setActiveIndicatorElement(nextElement)
|
|
||||||
|
|
||||||
let slidEvent = $.Event(Event.SLID, {
|
|
||||||
relatedTarget: nextElement,
|
|
||||||
direction: directionalClassName
|
|
||||||
})
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() &&
|
|
||||||
$(this._element).hasClass(ClassName.SLIDE)) {
|
|
||||||
|
|
||||||
$(nextElement).addClass(direction)
|
|
||||||
|
|
||||||
Util.reflow(nextElement)
|
|
||||||
|
|
||||||
$(activeElement).addClass(directionalClassName)
|
|
||||||
$(nextElement).addClass(directionalClassName)
|
|
||||||
|
|
||||||
$(activeElement)
|
|
||||||
.one(Util.TRANSITION_END, () => {
|
|
||||||
$(nextElement)
|
|
||||||
.removeClass(directionalClassName)
|
|
||||||
.removeClass(direction)
|
|
||||||
|
|
||||||
$(nextElement).addClass(ClassName.ACTIVE)
|
|
||||||
|
|
||||||
$(activeElement)
|
|
||||||
.removeClass(ClassName.ACTIVE)
|
|
||||||
.removeClass(direction)
|
|
||||||
.removeClass(directionalClassName)
|
|
||||||
|
|
||||||
this._isSliding = false
|
|
||||||
|
|
||||||
setTimeout(() => $(this._element).trigger(slidEvent), 0)
|
|
||||||
|
|
||||||
})
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
$(activeElement).removeClass(ClassName.ACTIVE)
|
|
||||||
$(nextElement).addClass(ClassName.ACTIVE)
|
|
||||||
|
|
||||||
this._isSliding = false
|
|
||||||
$(this._element).trigger(slidEvent)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isCycling) {
|
|
||||||
this.cycle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let data = $(this).data(DATA_KEY)
|
|
||||||
let _config = $.extend({}, Default, $(this).data())
|
|
||||||
|
|
||||||
if (typeof config === 'object') {
|
|
||||||
$.extend(_config, config)
|
|
||||||
}
|
|
||||||
|
|
||||||
let action = typeof config === 'string' ? config : _config.slide
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Carousel(this, _config)
|
|
||||||
$(this).data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'number') {
|
|
||||||
data.to(config)
|
|
||||||
} else if (typeof action === 'string') {
|
|
||||||
if (data[action] === undefined) {
|
|
||||||
throw new Error(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
data[action]()
|
|
||||||
} else if (_config.interval) {
|
|
||||||
data.pause()
|
|
||||||
data.cycle()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
static _dataApiClickHandler(event) {
|
|
||||||
let selector = Util.getSelectorFromElement(this)
|
|
||||||
|
|
||||||
if (!selector) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let target = $(selector)[0]
|
|
||||||
|
|
||||||
if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let config = $.extend({}, $(target).data(), $(this).data())
|
|
||||||
let slideIndex = this.getAttribute('data-slide-to')
|
|
||||||
|
|
||||||
if (slideIndex) {
|
|
||||||
config.interval = false
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel._jQueryInterface.call($(target), config)
|
|
||||||
|
|
||||||
if (slideIndex) {
|
|
||||||
$(target).data(DATA_KEY).to(slideIndex)
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)
|
|
||||||
|
|
||||||
$(window).on(Event.LOAD_DATA_API, () => {
|
|
||||||
$(Selector.DATA_RIDE).each(function () {
|
|
||||||
let $carousel = $(this)
|
|
||||||
Carousel._jQueryInterface.call($carousel, $carousel.data())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Carousel._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Carousel
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Carousel._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Carousel
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Carousel
|
|
|
@ -1,381 +0,0 @@
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): collapse.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Collapse = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'collapse'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.collapse'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
const TRANSITION_DURATION = 600
|
|
||||||
|
|
||||||
const Default = {
|
|
||||||
toggle : true,
|
|
||||||
parent : ''
|
|
||||||
}
|
|
||||||
|
|
||||||
const DefaultType = {
|
|
||||||
toggle : 'boolean',
|
|
||||||
parent : 'string'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
SHOW : `show${EVENT_KEY}`,
|
|
||||||
SHOWN : `shown${EVENT_KEY}`,
|
|
||||||
HIDE : `hide${EVENT_KEY}`,
|
|
||||||
HIDDEN : `hidden${EVENT_KEY}`,
|
|
||||||
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
IN : 'in',
|
|
||||||
COLLAPSE : 'collapse',
|
|
||||||
COLLAPSING : 'collapsing',
|
|
||||||
COLLAPSED : 'collapsed'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Dimension = {
|
|
||||||
WIDTH : 'width',
|
|
||||||
HEIGHT : 'height'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
ACTIVES : '.panel > .in, .panel > .collapsing',
|
|
||||||
DATA_TOGGLE : '[data-toggle="collapse"]'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Collapse {
|
|
||||||
|
|
||||||
constructor(element, config) {
|
|
||||||
this._isTransitioning = false
|
|
||||||
this._element = element
|
|
||||||
this._config = this._getConfig(config)
|
|
||||||
this._triggerArray = $.makeArray($(
|
|
||||||
`[data-toggle="collapse"][href="#${element.id}"],` +
|
|
||||||
`[data-toggle="collapse"][data-target="#${element.id}"]`
|
|
||||||
))
|
|
||||||
|
|
||||||
this._parent = this._config.parent ? this._getParent() : null
|
|
||||||
|
|
||||||
if (!this._config.parent) {
|
|
||||||
this._addAriaAndCollapsedClass(this._element, this._triggerArray)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._config.toggle) {
|
|
||||||
this.toggle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Default() {
|
|
||||||
return Default
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
toggle() {
|
|
||||||
if ($(this._element).hasClass(ClassName.IN)) {
|
|
||||||
this.hide()
|
|
||||||
} else {
|
|
||||||
this.show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
show() {
|
|
||||||
if (this._isTransitioning ||
|
|
||||||
$(this._element).hasClass(ClassName.IN)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let actives
|
|
||||||
let activesData
|
|
||||||
|
|
||||||
if (this._parent) {
|
|
||||||
actives = $.makeArray($(Selector.ACTIVES))
|
|
||||||
if (!actives.length) {
|
|
||||||
actives = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actives) {
|
|
||||||
activesData = $(actives).data(DATA_KEY)
|
|
||||||
if (activesData && activesData._isTransitioning) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let startEvent = $.Event(Event.SHOW)
|
|
||||||
$(this._element).trigger(startEvent)
|
|
||||||
if (startEvent.isDefaultPrevented()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actives) {
|
|
||||||
Collapse._jQueryInterface.call($(actives), 'hide')
|
|
||||||
if (!activesData) {
|
|
||||||
$(actives).data(DATA_KEY, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let dimension = this._getDimension()
|
|
||||||
|
|
||||||
$(this._element)
|
|
||||||
.removeClass(ClassName.COLLAPSE)
|
|
||||||
.addClass(ClassName.COLLAPSING)
|
|
||||||
|
|
||||||
this._element.style[dimension] = 0
|
|
||||||
this._element.setAttribute('aria-expanded', true)
|
|
||||||
|
|
||||||
if (this._triggerArray.length) {
|
|
||||||
$(this._triggerArray)
|
|
||||||
.removeClass(ClassName.COLLAPSED)
|
|
||||||
.attr('aria-expanded', true)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setTransitioning(true)
|
|
||||||
|
|
||||||
let complete = () => {
|
|
||||||
$(this._element)
|
|
||||||
.removeClass(ClassName.COLLAPSING)
|
|
||||||
.addClass(ClassName.COLLAPSE)
|
|
||||||
.addClass(ClassName.IN)
|
|
||||||
|
|
||||||
this._element.style[dimension] = ''
|
|
||||||
|
|
||||||
this.setTransitioning(false)
|
|
||||||
|
|
||||||
$(this._element).trigger(Event.SHOWN)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Util.supportsTransitionEnd()) {
|
|
||||||
complete()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
|
|
||||||
let scrollSize = `scroll${capitalizedDimension}`
|
|
||||||
|
|
||||||
$(this._element)
|
|
||||||
.one(Util.TRANSITION_END, complete)
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
|
|
||||||
this._element.style[dimension] = `${this._element[scrollSize]}px`
|
|
||||||
}
|
|
||||||
|
|
||||||
hide() {
|
|
||||||
if (this._isTransitioning ||
|
|
||||||
!$(this._element).hasClass(ClassName.IN)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let startEvent = $.Event(Event.HIDE)
|
|
||||||
$(this._element).trigger(startEvent)
|
|
||||||
if (startEvent.isDefaultPrevented()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let dimension = this._getDimension()
|
|
||||||
let offsetDimension = dimension === Dimension.WIDTH ?
|
|
||||||
'offsetWidth' : 'offsetHeight'
|
|
||||||
|
|
||||||
this._element.style[dimension] = `${this._element[offsetDimension]}px`
|
|
||||||
|
|
||||||
Util.reflow(this._element)
|
|
||||||
|
|
||||||
$(this._element)
|
|
||||||
.addClass(ClassName.COLLAPSING)
|
|
||||||
.removeClass(ClassName.COLLAPSE)
|
|
||||||
.removeClass(ClassName.IN)
|
|
||||||
|
|
||||||
this._element.setAttribute('aria-expanded', false)
|
|
||||||
|
|
||||||
if (this._triggerArray.length) {
|
|
||||||
$(this._triggerArray)
|
|
||||||
.addClass(ClassName.COLLAPSED)
|
|
||||||
.attr('aria-expanded', false)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setTransitioning(true)
|
|
||||||
|
|
||||||
let complete = () => {
|
|
||||||
this.setTransitioning(false)
|
|
||||||
$(this._element)
|
|
||||||
.removeClass(ClassName.COLLAPSING)
|
|
||||||
.addClass(ClassName.COLLAPSE)
|
|
||||||
.trigger(Event.HIDDEN)
|
|
||||||
}
|
|
||||||
|
|
||||||
this._element.style[dimension] = 0
|
|
||||||
|
|
||||||
if (!Util.supportsTransitionEnd()) {
|
|
||||||
complete()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._element)
|
|
||||||
.one(Util.TRANSITION_END, complete)
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
}
|
|
||||||
|
|
||||||
setTransitioning(isTransitioning) {
|
|
||||||
this._isTransitioning = isTransitioning
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY)
|
|
||||||
|
|
||||||
this._config = null
|
|
||||||
this._parent = null
|
|
||||||
this._element = null
|
|
||||||
this._triggerArray = null
|
|
||||||
this._isTransitioning = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config)
|
|
||||||
config.toggle = Boolean(config.toggle) // coerce string values
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType)
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
_getDimension() {
|
|
||||||
let hasWidth = $(this._element).hasClass(Dimension.WIDTH)
|
|
||||||
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT
|
|
||||||
}
|
|
||||||
|
|
||||||
_getParent() {
|
|
||||||
let parent = $(this._config.parent)[0]
|
|
||||||
let selector =
|
|
||||||
`[data-toggle="collapse"][data-parent="${this._config.parent}"]`
|
|
||||||
|
|
||||||
$(parent).find(selector).each((i, element) => {
|
|
||||||
this._addAriaAndCollapsedClass(
|
|
||||||
Collapse._getTargetFromElement(element),
|
|
||||||
[element]
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
return parent
|
|
||||||
}
|
|
||||||
|
|
||||||
_addAriaAndCollapsedClass(element, triggerArray) {
|
|
||||||
if (element) {
|
|
||||||
let isOpen = $(element).hasClass(ClassName.IN)
|
|
||||||
element.setAttribute('aria-expanded', isOpen)
|
|
||||||
|
|
||||||
if (triggerArray.length) {
|
|
||||||
$(triggerArray)
|
|
||||||
.toggleClass(ClassName.COLLAPSED, !isOpen)
|
|
||||||
.attr('aria-expanded', isOpen)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _getTargetFromElement(element) {
|
|
||||||
let selector = Util.getSelectorFromElement(element)
|
|
||||||
return selector ? $(selector)[0] : null
|
|
||||||
}
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let $this = $(this)
|
|
||||||
let data = $this.data(DATA_KEY)
|
|
||||||
let _config = $.extend(
|
|
||||||
{},
|
|
||||||
Default,
|
|
||||||
$this.data(),
|
|
||||||
typeof config === 'object' && config
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!data && _config.toggle && /show|hide/.test(config)) {
|
|
||||||
_config.toggle = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Collapse(this, _config)
|
|
||||||
$this.data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error(`No method named "${config}"`)
|
|
||||||
}
|
|
||||||
data[config]()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
|
||||||
event.preventDefault()
|
|
||||||
|
|
||||||
let target = Collapse._getTargetFromElement(this)
|
|
||||||
let data = $(target).data(DATA_KEY)
|
|
||||||
let config = data ? 'toggle' : $(this).data()
|
|
||||||
|
|
||||||
Collapse._jQueryInterface.call($(target), config)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Collapse._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Collapse
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Collapse._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Collapse
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Collapse
|
|
|
@ -1,297 +0,0 @@
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): dropdown.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Dropdown = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'dropdown'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.dropdown'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
HIDE : `hide${EVENT_KEY}`,
|
|
||||||
HIDDEN : `hidden${EVENT_KEY}`,
|
|
||||||
SHOW : `show${EVENT_KEY}`,
|
|
||||||
SHOWN : `shown${EVENT_KEY}`,
|
|
||||||
CLICK : `click${EVENT_KEY}`,
|
|
||||||
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
|
|
||||||
KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
BACKDROP : 'dropdown-backdrop',
|
|
||||||
DISABLED : 'disabled',
|
|
||||||
OPEN : 'open'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
BACKDROP : '.dropdown-backdrop',
|
|
||||||
DATA_TOGGLE : '[data-toggle="dropdown"]',
|
|
||||||
FORM_CHILD : '.dropdown form',
|
|
||||||
ROLE_MENU : '[role="menu"]',
|
|
||||||
ROLE_LISTBOX : '[role="listbox"]',
|
|
||||||
NAVBAR_NAV : '.navbar-nav',
|
|
||||||
VISIBLE_ITEMS : '[role="menu"] li:not(.disabled) a, '
|
|
||||||
+ '[role="listbox"] li:not(.disabled) a'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Dropdown {
|
|
||||||
|
|
||||||
constructor(element) {
|
|
||||||
this._element = element
|
|
||||||
|
|
||||||
this._addEventListeners()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
toggle() {
|
|
||||||
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
let parent = Dropdown._getParentFromElement(this)
|
|
||||||
let isActive = $(parent).hasClass(ClassName.OPEN)
|
|
||||||
|
|
||||||
Dropdown._clearMenus()
|
|
||||||
|
|
||||||
if (isActive) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('ontouchstart' in document.documentElement &&
|
|
||||||
(!$(parent).closest(Selector.NAVBAR_NAV).length)) {
|
|
||||||
|
|
||||||
// if mobile we use a backdrop because click events don't delegate
|
|
||||||
let dropdown = document.createElement('div')
|
|
||||||
dropdown.className = ClassName.BACKDROP
|
|
||||||
$(dropdown).insertBefore(this)
|
|
||||||
$(dropdown).on('click', Dropdown._clearMenus)
|
|
||||||
}
|
|
||||||
|
|
||||||
let relatedTarget = { relatedTarget : this }
|
|
||||||
let showEvent = $.Event(Event.SHOW, relatedTarget)
|
|
||||||
|
|
||||||
$(parent).trigger(showEvent)
|
|
||||||
|
|
||||||
if (showEvent.isDefaultPrevented()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
this.focus()
|
|
||||||
this.setAttribute('aria-expanded', 'true')
|
|
||||||
|
|
||||||
$(parent).toggleClass(ClassName.OPEN)
|
|
||||||
$(parent).trigger($.Event(Event.SHOWN, relatedTarget))
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY)
|
|
||||||
$(this._element).off(EVENT_KEY)
|
|
||||||
this._element = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_addEventListeners() {
|
|
||||||
$(this._element).on(Event.CLICK, this.toggle)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let data = $(this).data(DATA_KEY)
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
$(this).data(DATA_KEY, (data = new Dropdown(this)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error(`No method named "${config}"`)
|
|
||||||
}
|
|
||||||
data[config].call(this)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
static _clearMenus(event) {
|
|
||||||
if (event && event.which === 3) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let backdrop = $(Selector.BACKDROP)[0]
|
|
||||||
if (backdrop) {
|
|
||||||
backdrop.parentNode.removeChild(backdrop)
|
|
||||||
}
|
|
||||||
|
|
||||||
let toggles = $.makeArray($(Selector.DATA_TOGGLE))
|
|
||||||
|
|
||||||
for (let i = 0; i < toggles.length; i++) {
|
|
||||||
let parent = Dropdown._getParentFromElement(toggles[i])
|
|
||||||
let relatedTarget = { relatedTarget : toggles[i] }
|
|
||||||
|
|
||||||
if (!$(parent).hasClass(ClassName.OPEN)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event && event.type === 'click' &&
|
|
||||||
(/input|textarea/i.test(event.target.tagName)) &&
|
|
||||||
($.contains(parent, event.target))) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
let hideEvent = $.Event(Event.HIDE, relatedTarget)
|
|
||||||
$(parent).trigger(hideEvent)
|
|
||||||
if (hideEvent.isDefaultPrevented()) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
toggles[i].setAttribute('aria-expanded', 'false')
|
|
||||||
|
|
||||||
$(parent)
|
|
||||||
.removeClass(ClassName.OPEN)
|
|
||||||
.trigger($.Event(Event.HIDDEN, relatedTarget))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static _getParentFromElement(element) {
|
|
||||||
let parent
|
|
||||||
let selector = Util.getSelectorFromElement(element)
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
parent = $(selector)[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent || element.parentNode
|
|
||||||
}
|
|
||||||
|
|
||||||
static _dataApiKeydownHandler(event) {
|
|
||||||
if (!/(38|40|27|32)/.test(event.which) ||
|
|
||||||
/input|textarea/i.test(event.target.tagName)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault()
|
|
||||||
event.stopPropagation()
|
|
||||||
|
|
||||||
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let parent = Dropdown._getParentFromElement(this)
|
|
||||||
let isActive = $(parent).hasClass(ClassName.OPEN)
|
|
||||||
|
|
||||||
if ((!isActive && event.which !== 27) ||
|
|
||||||
(isActive && event.which === 27)) {
|
|
||||||
|
|
||||||
if (event.which === 27) {
|
|
||||||
let toggle = $(parent).find(Selector.DATA_TOGGLE)[0]
|
|
||||||
$(toggle).trigger('focus')
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this).trigger('click')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let items = $.makeArray($(Selector.VISIBLE_ITEMS))
|
|
||||||
|
|
||||||
items = items.filter((item) => {
|
|
||||||
return item.offsetWidth || item.offsetHeight
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!items.length) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let index = items.indexOf(event.target)
|
|
||||||
|
|
||||||
if (event.which === 38 && index > 0) { // up
|
|
||||||
index--
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.which === 40 && index < items.length - 1) { // down
|
|
||||||
index++
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!~index) {
|
|
||||||
index = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
items[index].focus()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
|
|
||||||
.on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler)
|
|
||||||
.on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler)
|
|
||||||
.on(Event.CLICK_DATA_API, Dropdown._clearMenus)
|
|
||||||
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle)
|
|
||||||
.on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {
|
|
||||||
e.stopPropagation()
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Dropdown._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Dropdown
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Dropdown._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Dropdown
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Dropdown
|
|
|
@ -1,534 +0,0 @@
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): modal.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Modal = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'modal'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.modal'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
const TRANSITION_DURATION = 300
|
|
||||||
const BACKDROP_TRANSITION_DURATION = 150
|
|
||||||
|
|
||||||
const Default = {
|
|
||||||
backdrop : true,
|
|
||||||
keyboard : true,
|
|
||||||
focus : true,
|
|
||||||
show : true
|
|
||||||
}
|
|
||||||
|
|
||||||
const DefaultType = {
|
|
||||||
backdrop : '(boolean|string)',
|
|
||||||
keyboard : 'boolean',
|
|
||||||
focus : 'boolean',
|
|
||||||
show : 'boolean'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
HIDE : `hide${EVENT_KEY}`,
|
|
||||||
HIDDEN : `hidden${EVENT_KEY}`,
|
|
||||||
SHOW : `show${EVENT_KEY}`,
|
|
||||||
SHOWN : `shown${EVENT_KEY}`,
|
|
||||||
FOCUSIN : `focusin${EVENT_KEY}`,
|
|
||||||
RESIZE : `resize${EVENT_KEY}`,
|
|
||||||
CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,
|
|
||||||
KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,
|
|
||||||
MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,
|
|
||||||
MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,
|
|
||||||
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
SCROLLBAR_MEASURER : 'modal-scrollbar-measure',
|
|
||||||
BACKDROP : 'modal-backdrop',
|
|
||||||
OPEN : 'modal-open',
|
|
||||||
FADE : 'fade',
|
|
||||||
IN : 'in'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
DIALOG : '.modal-dialog',
|
|
||||||
DATA_TOGGLE : '[data-toggle="modal"]',
|
|
||||||
DATA_DISMISS : '[data-dismiss="modal"]',
|
|
||||||
FIXED_CONTENT : '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Modal {
|
|
||||||
|
|
||||||
constructor(element, config) {
|
|
||||||
this._config = this._getConfig(config)
|
|
||||||
this._element = element
|
|
||||||
this._dialog = $(element).find(Selector.DIALOG)[0]
|
|
||||||
this._backdrop = null
|
|
||||||
this._isShown = false
|
|
||||||
this._isBodyOverflowing = false
|
|
||||||
this._ignoreBackdropClick = false
|
|
||||||
this._originalBodyPadding = 0
|
|
||||||
this._scrollbarWidth = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Default() {
|
|
||||||
return Default
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
toggle(relatedTarget) {
|
|
||||||
return this._isShown ? this.hide() : this.show(relatedTarget)
|
|
||||||
}
|
|
||||||
|
|
||||||
show(relatedTarget) {
|
|
||||||
let showEvent = $.Event(Event.SHOW, {
|
|
||||||
relatedTarget
|
|
||||||
})
|
|
||||||
|
|
||||||
$(this._element).trigger(showEvent)
|
|
||||||
|
|
||||||
if (this._isShown || showEvent.isDefaultPrevented()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isShown = true
|
|
||||||
|
|
||||||
this._checkScrollbar()
|
|
||||||
this._setScrollbar()
|
|
||||||
|
|
||||||
$(document.body).addClass(ClassName.OPEN)
|
|
||||||
|
|
||||||
this._setEscapeEvent()
|
|
||||||
this._setResizeEvent()
|
|
||||||
|
|
||||||
$(this._element).on(
|
|
||||||
Event.CLICK_DISMISS,
|
|
||||||
Selector.DATA_DISMISS,
|
|
||||||
$.proxy(this.hide, this)
|
|
||||||
)
|
|
||||||
|
|
||||||
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {
|
|
||||||
$(this._element).one(Event.MOUSEUP_DISMISS, (event) => {
|
|
||||||
if ($(event.target).is(this._element)) {
|
|
||||||
this._ignoreBackdropClick = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
this._showBackdrop(
|
|
||||||
$.proxy(this._showElement, this, relatedTarget)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
hide(event) {
|
|
||||||
if (event) {
|
|
||||||
event.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
let hideEvent = $.Event(Event.HIDE)
|
|
||||||
|
|
||||||
$(this._element).trigger(hideEvent)
|
|
||||||
|
|
||||||
if (!this._isShown || hideEvent.isDefaultPrevented()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isShown = false
|
|
||||||
|
|
||||||
this._setEscapeEvent()
|
|
||||||
this._setResizeEvent()
|
|
||||||
|
|
||||||
$(document).off(Event.FOCUSIN)
|
|
||||||
|
|
||||||
$(this._element).removeClass(ClassName.IN)
|
|
||||||
|
|
||||||
$(this._element).off(Event.CLICK_DISMISS)
|
|
||||||
$(this._dialog).off(Event.MOUSEDOWN_DISMISS)
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() &&
|
|
||||||
($(this._element).hasClass(ClassName.FADE))) {
|
|
||||||
|
|
||||||
$(this._element)
|
|
||||||
.one(Util.TRANSITION_END, $.proxy(this._hideModal, this))
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
} else {
|
|
||||||
this._hideModal()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY)
|
|
||||||
|
|
||||||
$(window).off(EVENT_KEY)
|
|
||||||
$(document).off(EVENT_KEY)
|
|
||||||
$(this._element).off(EVENT_KEY)
|
|
||||||
$(this._backdrop).off(EVENT_KEY)
|
|
||||||
|
|
||||||
this._config = null
|
|
||||||
this._element = null
|
|
||||||
this._dialog = null
|
|
||||||
this._backdrop = null
|
|
||||||
this._isShown = null
|
|
||||||
this._isBodyOverflowing = null
|
|
||||||
this._ignoreBackdropClick = null
|
|
||||||
this._originalBodyPadding = null
|
|
||||||
this._scrollbarWidth = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config)
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType)
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
_showElement(relatedTarget) {
|
|
||||||
let transition = Util.supportsTransitionEnd() &&
|
|
||||||
$(this._element).hasClass(ClassName.FADE)
|
|
||||||
|
|
||||||
if (!this._element.parentNode ||
|
|
||||||
(this._element.parentNode.nodeType !== Node.ELEMENT_NODE)) {
|
|
||||||
// don't move modals dom position
|
|
||||||
document.body.appendChild(this._element)
|
|
||||||
}
|
|
||||||
|
|
||||||
this._element.style.display = 'block'
|
|
||||||
this._element.scrollTop = 0
|
|
||||||
|
|
||||||
if (transition) {
|
|
||||||
Util.reflow(this._element)
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._element).addClass(ClassName.IN)
|
|
||||||
|
|
||||||
if (this._config.focus) {
|
|
||||||
this._enforceFocus()
|
|
||||||
}
|
|
||||||
|
|
||||||
let shownEvent = $.Event(Event.SHOWN, {
|
|
||||||
relatedTarget
|
|
||||||
})
|
|
||||||
|
|
||||||
let transitionComplete = () => {
|
|
||||||
if (this._config.focus) {
|
|
||||||
this._element.focus()
|
|
||||||
}
|
|
||||||
$(this._element).trigger(shownEvent)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (transition) {
|
|
||||||
$(this._dialog)
|
|
||||||
.one(Util.TRANSITION_END, transitionComplete)
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
} else {
|
|
||||||
transitionComplete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_enforceFocus() {
|
|
||||||
$(document)
|
|
||||||
.off(Event.FOCUSIN) // guard against infinite focus loop
|
|
||||||
.on(Event.FOCUSIN, (event) => {
|
|
||||||
if (this._element !== event.target &&
|
|
||||||
(!$(this._element).has(event.target).length)) {
|
|
||||||
this._element.focus()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
_setEscapeEvent() {
|
|
||||||
if (this._isShown && this._config.keyboard) {
|
|
||||||
$(this._element).on(Event.KEYDOWN_DISMISS, (event) => {
|
|
||||||
if (event.which === 27) {
|
|
||||||
this.hide()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
} else if (!this._isShown) {
|
|
||||||
$(this._element).off(Event.KEYDOWN_DISMISS)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_setResizeEvent() {
|
|
||||||
if (this._isShown) {
|
|
||||||
$(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this))
|
|
||||||
} else {
|
|
||||||
$(window).off(Event.RESIZE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_hideModal() {
|
|
||||||
this._element.style.display = 'none'
|
|
||||||
this._showBackdrop(() => {
|
|
||||||
$(document.body).removeClass(ClassName.OPEN)
|
|
||||||
this._resetAdjustments()
|
|
||||||
this._resetScrollbar()
|
|
||||||
$(this._element).trigger(Event.HIDDEN)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
_removeBackdrop() {
|
|
||||||
if (this._backdrop) {
|
|
||||||
$(this._backdrop).remove()
|
|
||||||
this._backdrop = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_showBackdrop(callback) {
|
|
||||||
let animate = $(this._element).hasClass(ClassName.FADE) ?
|
|
||||||
ClassName.FADE : ''
|
|
||||||
|
|
||||||
if (this._isShown && this._config.backdrop) {
|
|
||||||
let doAnimate = Util.supportsTransitionEnd() && animate
|
|
||||||
|
|
||||||
this._backdrop = document.createElement('div')
|
|
||||||
this._backdrop.className = ClassName.BACKDROP
|
|
||||||
|
|
||||||
if (animate) {
|
|
||||||
$(this._backdrop).addClass(animate)
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._backdrop).appendTo(document.body)
|
|
||||||
|
|
||||||
$(this._element).on(Event.CLICK_DISMISS, (event) => {
|
|
||||||
if (this._ignoreBackdropClick) {
|
|
||||||
this._ignoreBackdropClick = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (event.target !== event.currentTarget) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (this._config.backdrop === 'static') {
|
|
||||||
this._element.focus()
|
|
||||||
} else {
|
|
||||||
this.hide()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (doAnimate) {
|
|
||||||
Util.reflow(this._backdrop)
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._backdrop).addClass(ClassName.IN)
|
|
||||||
|
|
||||||
if (!callback) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!doAnimate) {
|
|
||||||
callback()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._backdrop)
|
|
||||||
.one(Util.TRANSITION_END, callback)
|
|
||||||
.emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
|
|
||||||
|
|
||||||
} else if (!this._isShown && this._backdrop) {
|
|
||||||
$(this._backdrop).removeClass(ClassName.IN)
|
|
||||||
|
|
||||||
let callbackRemove = () => {
|
|
||||||
this._removeBackdrop()
|
|
||||||
if (callback) {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() &&
|
|
||||||
($(this._element).hasClass(ClassName.FADE))) {
|
|
||||||
$(this._backdrop)
|
|
||||||
.one(Util.TRANSITION_END, callbackRemove)
|
|
||||||
.emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
|
|
||||||
} else {
|
|
||||||
callbackRemove()
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (callback) {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
// the following methods are used to handle overflowing modals
|
|
||||||
// todo (fat): these should probably be refactored out of modal.js
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
_handleUpdate() {
|
|
||||||
this._adjustDialog()
|
|
||||||
}
|
|
||||||
|
|
||||||
_adjustDialog() {
|
|
||||||
let isModalOverflowing =
|
|
||||||
this._element.scrollHeight > document.documentElement.clientHeight
|
|
||||||
|
|
||||||
if (!this._isBodyOverflowing && isModalOverflowing) {
|
|
||||||
this._element.style.paddingLeft = `${this._scrollbarWidth}px`
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._isBodyOverflowing && !isModalOverflowing) {
|
|
||||||
this._element.style.paddingRight = `${this._scrollbarWidth}px~`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_resetAdjustments() {
|
|
||||||
this._element.style.paddingLeft = ''
|
|
||||||
this._element.style.paddingRight = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
_checkScrollbar() {
|
|
||||||
let fullWindowWidth = window.innerWidth
|
|
||||||
if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
|
|
||||||
let documentElementRect = document.documentElement.getBoundingClientRect()
|
|
||||||
fullWindowWidth =
|
|
||||||
documentElementRect.right - Math.abs(documentElementRect.left)
|
|
||||||
}
|
|
||||||
this._isBodyOverflowing = document.body.clientWidth < fullWindowWidth
|
|
||||||
this._scrollbarWidth = this._getScrollbarWidth()
|
|
||||||
}
|
|
||||||
|
|
||||||
_setScrollbar() {
|
|
||||||
let bodyPadding = parseInt(
|
|
||||||
$(Selector.FIXED_CONTENT).css('padding-right') || 0,
|
|
||||||
10
|
|
||||||
)
|
|
||||||
|
|
||||||
this._originalBodyPadding = document.body.style.paddingRight || ''
|
|
||||||
|
|
||||||
if (this._isBodyOverflowing) {
|
|
||||||
document.body.style.paddingRight =
|
|
||||||
`${bodyPadding + this._scrollbarWidth}px`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_resetScrollbar() {
|
|
||||||
document.body.style.paddingRight = this._originalBodyPadding
|
|
||||||
}
|
|
||||||
|
|
||||||
_getScrollbarWidth() { // thx d.walsh
|
|
||||||
let scrollDiv = document.createElement('div')
|
|
||||||
scrollDiv.className = ClassName.SCROLLBAR_MEASURER
|
|
||||||
document.body.appendChild(scrollDiv)
|
|
||||||
let scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
|
|
||||||
document.body.removeChild(scrollDiv)
|
|
||||||
return scrollbarWidth
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config, relatedTarget) {
|
|
||||||
return this.each(function () {
|
|
||||||
let data = $(this).data(DATA_KEY)
|
|
||||||
let _config = $.extend(
|
|
||||||
{},
|
|
||||||
Modal.Default,
|
|
||||||
$(this).data(),
|
|
||||||
typeof config === 'object' && config
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Modal(this, _config)
|
|
||||||
$(this).data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error(`No method named "${config}"`)
|
|
||||||
}
|
|
||||||
data[config](relatedTarget)
|
|
||||||
} else if (_config.show) {
|
|
||||||
data.show(relatedTarget)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
|
||||||
let target
|
|
||||||
let selector = Util.getSelectorFromElement(this)
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
target = $(selector)[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
let config = $(target).data(DATA_KEY) ?
|
|
||||||
'toggle' : $.extend({}, $(target).data(), $(this).data())
|
|
||||||
|
|
||||||
if (this.tagName === 'A') {
|
|
||||||
event.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
let $target = $(target).one(Event.SHOW, (showEvent) => {
|
|
||||||
if (showEvent.isDefaultPrevented()) {
|
|
||||||
// only register focus restorer if modal will actually get shown
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$target.one(Event.HIDDEN, () => {
|
|
||||||
if ($(this).is(':visible')) {
|
|
||||||
this.focus()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Modal._jQueryInterface.call($(target), config, this)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Modal._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Modal
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Modal._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Modal
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Modal
|
|
|
@ -1,183 +0,0 @@
|
||||||
import Tooltip from './tooltip'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): popover.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Popover = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'popover'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.popover'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
|
|
||||||
const Default = $.extend({}, Tooltip.Default, {
|
|
||||||
placement : 'right',
|
|
||||||
trigger : 'click',
|
|
||||||
content : '',
|
|
||||||
template : '<div class="popover" role="tooltip">'
|
|
||||||
+ '<div class="popover-arrow"></div>'
|
|
||||||
+ '<h3 class="popover-title"></h3>'
|
|
||||||
+ '<div class="popover-content"></div></div>'
|
|
||||||
})
|
|
||||||
|
|
||||||
const DefaultType = $.extend({}, Tooltip.DefaultType, {
|
|
||||||
content : '(string|element|function)'
|
|
||||||
})
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
FADE : 'fade',
|
|
||||||
IN : 'in'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
TITLE : '.popover-title',
|
|
||||||
CONTENT : '.popover-content',
|
|
||||||
ARROW : '.popover-arrow'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
HIDE : `hide${EVENT_KEY}`,
|
|
||||||
HIDDEN : `hidden${EVENT_KEY}`,
|
|
||||||
SHOW : `show${EVENT_KEY}`,
|
|
||||||
SHOWN : `shown${EVENT_KEY}`,
|
|
||||||
INSERTED : `inserted${EVENT_KEY}`,
|
|
||||||
CLICK : `click${EVENT_KEY}`,
|
|
||||||
FOCUSIN : `focusin${EVENT_KEY}`,
|
|
||||||
FOCUSOUT : `focusout${EVENT_KEY}`,
|
|
||||||
MOUSEENTER : `mouseenter${EVENT_KEY}`,
|
|
||||||
MOUSELEAVE : `mouseleave${EVENT_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Popover extends Tooltip {
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Default() {
|
|
||||||
return Default
|
|
||||||
}
|
|
||||||
|
|
||||||
static get NAME() {
|
|
||||||
return NAME
|
|
||||||
}
|
|
||||||
|
|
||||||
static get DATA_KEY() {
|
|
||||||
return DATA_KEY
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Event() {
|
|
||||||
return Event
|
|
||||||
}
|
|
||||||
|
|
||||||
static get EVENT_KEY() {
|
|
||||||
return EVENT_KEY
|
|
||||||
}
|
|
||||||
|
|
||||||
static get DefaultType() {
|
|
||||||
return DefaultType
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// overrides
|
|
||||||
|
|
||||||
isWithContent() {
|
|
||||||
return this.getTitle() || this._getContent()
|
|
||||||
}
|
|
||||||
|
|
||||||
getTipElement() {
|
|
||||||
return (this.tip = this.tip || $(this.config.template)[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
setContent() {
|
|
||||||
let $tip = $(this.getTipElement())
|
|
||||||
|
|
||||||
// we use append for html objects to maintain js events
|
|
||||||
this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
|
|
||||||
this.setElementContent($tip.find(Selector.CONTENT), this._getContent())
|
|
||||||
|
|
||||||
$tip
|
|
||||||
.removeClass(ClassName.FADE)
|
|
||||||
.removeClass(ClassName.IN)
|
|
||||||
|
|
||||||
this.cleanupTether()
|
|
||||||
}
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_getContent() {
|
|
||||||
return this.element.getAttribute('data-content')
|
|
||||||
|| (typeof this.config.content === 'function' ?
|
|
||||||
this.config.content.call(this.element) :
|
|
||||||
this.config.content)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let data = $(this).data(DATA_KEY)
|
|
||||||
let _config = typeof config === 'object' ? config : null
|
|
||||||
|
|
||||||
if (!data && /destroy|hide/.test(config)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Popover(this, _config)
|
|
||||||
$(this).data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error(`No method named "${config}"`)
|
|
||||||
}
|
|
||||||
data[config]()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Popover._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Popover
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Popover._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Popover
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Popover
|
|
|
@ -1,325 +0,0 @@
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): scrollspy.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const ScrollSpy = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'scrollspy'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.scrollspy'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
|
|
||||||
const Default = {
|
|
||||||
offset : 10,
|
|
||||||
method : 'auto',
|
|
||||||
target : ''
|
|
||||||
}
|
|
||||||
|
|
||||||
const DefaultType = {
|
|
||||||
offset : 'number',
|
|
||||||
method : 'string',
|
|
||||||
target : '(string|element)'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
ACTIVATE : `activate${EVENT_KEY}`,
|
|
||||||
SCROLL : `scroll${EVENT_KEY}`,
|
|
||||||
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
DROPDOWN_ITEM : 'dropdown-item',
|
|
||||||
DROPDOWN_MENU : 'dropdown-menu',
|
|
||||||
NAV_LINK : 'nav-link',
|
|
||||||
NAV : 'nav',
|
|
||||||
ACTIVE : 'active'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
DATA_SPY : '[data-spy="scroll"]',
|
|
||||||
ACTIVE : '.active',
|
|
||||||
LIST_ITEM : '.list-item',
|
|
||||||
LI : 'li',
|
|
||||||
LI_DROPDOWN : 'li.dropdown',
|
|
||||||
NAV_LINKS : '.nav-link',
|
|
||||||
DROPDOWN : '.dropdown',
|
|
||||||
DROPDOWN_ITEMS : '.dropdown-item',
|
|
||||||
DROPDOWN_TOGGLE : '.dropdown-toggle'
|
|
||||||
}
|
|
||||||
|
|
||||||
const OffsetMethod = {
|
|
||||||
OFFSET : 'offset',
|
|
||||||
POSITION : 'position'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ScrollSpy {
|
|
||||||
|
|
||||||
constructor(element, config) {
|
|
||||||
this._element = element
|
|
||||||
this._scrollElement = element.tagName === 'BODY' ? window : element
|
|
||||||
this._config = this._getConfig(config)
|
|
||||||
this._selector = `${this._config.target} ${Selector.NAV_LINKS},`
|
|
||||||
+ `${this._config.target} ${Selector.DROPDOWN_ITEMS}`
|
|
||||||
this._offsets = []
|
|
||||||
this._targets = []
|
|
||||||
this._activeTarget = null
|
|
||||||
this._scrollHeight = 0
|
|
||||||
|
|
||||||
$(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this))
|
|
||||||
|
|
||||||
this.refresh()
|
|
||||||
this._process()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Default() {
|
|
||||||
return Default
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
refresh() {
|
|
||||||
let autoMethod = this._scrollElement !== this._scrollElement.window ?
|
|
||||||
OffsetMethod.POSITION : OffsetMethod.OFFSET
|
|
||||||
|
|
||||||
let offsetMethod = this._config.method === 'auto' ?
|
|
||||||
autoMethod : this._config.method
|
|
||||||
|
|
||||||
let offsetBase = offsetMethod === OffsetMethod.POSITION ?
|
|
||||||
this._getScrollTop() : 0
|
|
||||||
|
|
||||||
this._offsets = []
|
|
||||||
this._targets = []
|
|
||||||
|
|
||||||
this._scrollHeight = this._getScrollHeight()
|
|
||||||
|
|
||||||
let targets = $.makeArray($(this._selector))
|
|
||||||
|
|
||||||
targets
|
|
||||||
.map((element) => {
|
|
||||||
let target
|
|
||||||
let targetSelector = Util.getSelectorFromElement(element)
|
|
||||||
|
|
||||||
if (targetSelector) {
|
|
||||||
target = $(targetSelector)[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target && (target.offsetWidth || target.offsetHeight)) {
|
|
||||||
// todo (fat): remove sketch reliance on jQuery position/offset
|
|
||||||
return [
|
|
||||||
$(target)[offsetMethod]().top + offsetBase,
|
|
||||||
targetSelector
|
|
||||||
]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.filter((item) => item)
|
|
||||||
.sort((a, b) => a[0] - b[0])
|
|
||||||
.forEach((item) => {
|
|
||||||
this._offsets.push(item[0])
|
|
||||||
this._targets.push(item[1])
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$.removeData(this._element, DATA_KEY)
|
|
||||||
$(this._scrollElement).off(EVENT_KEY)
|
|
||||||
|
|
||||||
this._element = null
|
|
||||||
this._scrollElement = null
|
|
||||||
this._config = null
|
|
||||||
this._selector = null
|
|
||||||
this._offsets = null
|
|
||||||
this._targets = null
|
|
||||||
this._activeTarget = null
|
|
||||||
this._scrollHeight = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_getConfig(config) {
|
|
||||||
config = $.extend({}, Default, config)
|
|
||||||
|
|
||||||
if (typeof config.target !== 'string') {
|
|
||||||
let id = $(config.target).attr('id')
|
|
||||||
if (!id) {
|
|
||||||
id = Util.getUID(NAME)
|
|
||||||
$(config.target).attr('id', id)
|
|
||||||
}
|
|
||||||
config.target = `#${id}`
|
|
||||||
}
|
|
||||||
|
|
||||||
Util.typeCheckConfig(NAME, config, DefaultType)
|
|
||||||
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
_getScrollTop() {
|
|
||||||
return this._scrollElement === window ?
|
|
||||||
this._scrollElement.scrollY : this._scrollElement.scrollTop
|
|
||||||
}
|
|
||||||
|
|
||||||
_getScrollHeight() {
|
|
||||||
return this._scrollElement.scrollHeight || Math.max(
|
|
||||||
document.body.scrollHeight,
|
|
||||||
document.documentElement.scrollHeight
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
_process() {
|
|
||||||
let scrollTop = this._getScrollTop() + this._config.offset
|
|
||||||
let scrollHeight = this._getScrollHeight()
|
|
||||||
let maxScroll = this._config.offset
|
|
||||||
+ scrollHeight
|
|
||||||
- this._scrollElement.offsetHeight
|
|
||||||
|
|
||||||
if (this._scrollHeight !== scrollHeight) {
|
|
||||||
this.refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scrollTop >= maxScroll) {
|
|
||||||
let target = this._targets[this._targets.length - 1]
|
|
||||||
|
|
||||||
if (this._activeTarget !== target) {
|
|
||||||
this._activate(target)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._activeTarget && scrollTop < this._offsets[0]) {
|
|
||||||
this._activeTarget = null
|
|
||||||
this._clear()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = this._offsets.length; i--;) {
|
|
||||||
let isActiveTarget = this._activeTarget !== this._targets[i]
|
|
||||||
&& scrollTop >= this._offsets[i]
|
|
||||||
&& (this._offsets[i + 1] === undefined ||
|
|
||||||
scrollTop < this._offsets[i + 1])
|
|
||||||
|
|
||||||
if (isActiveTarget) {
|
|
||||||
this._activate(this._targets[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_activate(target) {
|
|
||||||
this._activeTarget = target
|
|
||||||
|
|
||||||
this._clear()
|
|
||||||
|
|
||||||
let queries = this._selector.split(',')
|
|
||||||
queries = queries.map((selector) => {
|
|
||||||
return `${selector}[data-target="${target}"],` +
|
|
||||||
`${selector}[href="${target}"]`
|
|
||||||
})
|
|
||||||
|
|
||||||
let $link = $(queries.join(','))
|
|
||||||
|
|
||||||
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
|
|
||||||
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
|
|
||||||
$link.addClass(ClassName.ACTIVE)
|
|
||||||
} else {
|
|
||||||
// todo (fat) this is kinda sus…
|
|
||||||
// recursively add actives to tested nav-links
|
|
||||||
$link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._scrollElement).trigger(Event.ACTIVATE, {
|
|
||||||
relatedTarget: target
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
_clear() {
|
|
||||||
$(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let data = $(this).data(DATA_KEY)
|
|
||||||
let _config = typeof config === 'object' && config || null
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new ScrollSpy(this, _config)
|
|
||||||
$(this).data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error(`No method named "${config}"`)
|
|
||||||
}
|
|
||||||
data[config]()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(window).on(Event.LOAD_DATA_API, () => {
|
|
||||||
let scrollSpys = $.makeArray($(Selector.DATA_SPY))
|
|
||||||
|
|
||||||
for (let i = scrollSpys.length; i--;) {
|
|
||||||
let $spy = $(scrollSpys[i])
|
|
||||||
ScrollSpy._jQueryInterface.call($spy, $spy.data())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = ScrollSpy._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = ScrollSpy
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return ScrollSpy._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return ScrollSpy
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default ScrollSpy
|
|
|
@ -1,278 +0,0 @@
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): tab.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Tab = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'tab'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.tab'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const DATA_API_KEY = '.data-api'
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
const TRANSITION_DURATION = 150
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
HIDE : `hide${EVENT_KEY}`,
|
|
||||||
HIDDEN : `hidden${EVENT_KEY}`,
|
|
||||||
SHOW : `show${EVENT_KEY}`,
|
|
||||||
SHOWN : `shown${EVENT_KEY}`,
|
|
||||||
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
DROPDOWN_MENU : 'dropdown-menu',
|
|
||||||
ACTIVE : 'active',
|
|
||||||
FADE : 'fade',
|
|
||||||
IN : 'in'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
A : 'a',
|
|
||||||
LI : 'li',
|
|
||||||
DROPDOWN : '.dropdown',
|
|
||||||
UL : 'ul:not(.dropdown-menu)',
|
|
||||||
FADE_CHILD : '> .nav-item .fade, > .fade',
|
|
||||||
ACTIVE : '.active',
|
|
||||||
ACTIVE_CHILD : '> .nav-item > .active, > .active',
|
|
||||||
DATA_TOGGLE : '[data-toggle="tab"], [data-toggle="pill"]',
|
|
||||||
DROPDOWN_TOGGLE : '.dropdown-toggle',
|
|
||||||
DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Tab {
|
|
||||||
|
|
||||||
constructor(element) {
|
|
||||||
this._element = element
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
show() {
|
|
||||||
if (this._element.parentNode &&
|
|
||||||
(this._element.parentNode.nodeType === Node.ELEMENT_NODE) &&
|
|
||||||
($(this._element).hasClass(ClassName.ACTIVE))) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let target
|
|
||||||
let previous
|
|
||||||
let ulElement = $(this._element).closest(Selector.UL)[0]
|
|
||||||
let selector = Util.getSelectorFromElement(this._element)
|
|
||||||
|
|
||||||
if (ulElement) {
|
|
||||||
previous = $.makeArray($(ulElement).find(Selector.ACTIVE))
|
|
||||||
previous = previous[previous.length - 1]
|
|
||||||
}
|
|
||||||
|
|
||||||
let hideEvent = $.Event(Event.HIDE, {
|
|
||||||
relatedTarget: this._element
|
|
||||||
})
|
|
||||||
|
|
||||||
let showEvent = $.Event(Event.SHOW, {
|
|
||||||
relatedTarget: previous
|
|
||||||
})
|
|
||||||
|
|
||||||
if (previous) {
|
|
||||||
$(previous).trigger(hideEvent)
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this._element).trigger(showEvent)
|
|
||||||
|
|
||||||
if (showEvent.isDefaultPrevented() ||
|
|
||||||
(hideEvent.isDefaultPrevented())) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
target = $(selector)[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
this._activate(
|
|
||||||
this._element,
|
|
||||||
ulElement
|
|
||||||
)
|
|
||||||
|
|
||||||
let complete = () => {
|
|
||||||
let hiddenEvent = $.Event(Event.HIDDEN, {
|
|
||||||
relatedTarget: this._element
|
|
||||||
})
|
|
||||||
|
|
||||||
let shownEvent = $.Event(Event.SHOWN, {
|
|
||||||
relatedTarget: previous
|
|
||||||
})
|
|
||||||
|
|
||||||
$(previous).trigger(hiddenEvent)
|
|
||||||
$(this._element).trigger(shownEvent)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target) {
|
|
||||||
this._activate(target, target.parentNode, complete)
|
|
||||||
} else {
|
|
||||||
complete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
$.removeClass(this._element, DATA_KEY)
|
|
||||||
this._element = null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_activate(element, container, callback) {
|
|
||||||
let active = $(container).find(Selector.ACTIVE_CHILD)[0]
|
|
||||||
let isTransitioning = callback
|
|
||||||
&& Util.supportsTransitionEnd()
|
|
||||||
&& ((active && $(active).hasClass(ClassName.FADE))
|
|
||||||
|| Boolean($(container).find(Selector.FADE_CHILD)[0]))
|
|
||||||
|
|
||||||
let complete = $.proxy(
|
|
||||||
this._transitionComplete,
|
|
||||||
this,
|
|
||||||
element,
|
|
||||||
active,
|
|
||||||
isTransitioning,
|
|
||||||
callback
|
|
||||||
)
|
|
||||||
|
|
||||||
if (active && isTransitioning) {
|
|
||||||
$(active)
|
|
||||||
.one(Util.TRANSITION_END, complete)
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (active) {
|
|
||||||
$(active).removeClass(ClassName.IN)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_transitionComplete(element, active, isTransitioning, callback) {
|
|
||||||
if (active) {
|
|
||||||
$(active).removeClass(ClassName.ACTIVE)
|
|
||||||
|
|
||||||
let dropdownChild = $(active).find(
|
|
||||||
Selector.DROPDOWN_ACTIVE_CHILD
|
|
||||||
)[0]
|
|
||||||
|
|
||||||
if (dropdownChild) {
|
|
||||||
$(dropdownChild).removeClass(ClassName.ACTIVE)
|
|
||||||
}
|
|
||||||
|
|
||||||
active.setAttribute('aria-expanded', false)
|
|
||||||
}
|
|
||||||
|
|
||||||
$(element).addClass(ClassName.ACTIVE)
|
|
||||||
element.setAttribute('aria-expanded', true)
|
|
||||||
|
|
||||||
if (isTransitioning) {
|
|
||||||
Util.reflow(element)
|
|
||||||
$(element).addClass(ClassName.IN)
|
|
||||||
} else {
|
|
||||||
$(element).removeClass(ClassName.FADE)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.parentNode &&
|
|
||||||
($(element.parentNode).hasClass(ClassName.DROPDOWN_MENU))) {
|
|
||||||
|
|
||||||
let dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
|
|
||||||
if (dropdownElement) {
|
|
||||||
$(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
|
|
||||||
}
|
|
||||||
|
|
||||||
element.setAttribute('aria-expanded', true)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (callback) {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let $this = $(this)
|
|
||||||
let data = $this.data(DATA_KEY)
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = data = new Tab(this)
|
|
||||||
$this.data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error(`No method named "${config}"`)
|
|
||||||
}
|
|
||||||
data[config]()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Data Api implementation
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$(document)
|
|
||||||
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
|
||||||
event.preventDefault()
|
|
||||||
Tab._jQueryInterface.call($(this), 'show')
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Tab._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Tab
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Tab._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Tab
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Tab
|
|
|
@ -1,652 +0,0 @@
|
||||||
/* global Tether */
|
|
||||||
|
|
||||||
import Util from './util'
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): tooltip.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Tooltip = (($) => {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check for Tether dependency
|
|
||||||
* Tether - http://github.hubspot.com/tether/
|
|
||||||
*/
|
|
||||||
if (window.Tether === undefined) {
|
|
||||||
throw new Error('Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Constants
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const NAME = 'tooltip'
|
|
||||||
const VERSION = '4.0.0-alpha'
|
|
||||||
const DATA_KEY = 'bs.tooltip'
|
|
||||||
const EVENT_KEY = `.${DATA_KEY}`
|
|
||||||
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
||||||
const TRANSITION_DURATION = 150
|
|
||||||
const CLASS_PREFIX = 'bs-tether'
|
|
||||||
|
|
||||||
const Default = {
|
|
||||||
animation : true,
|
|
||||||
template : '<div class="tooltip" role="tooltip">'
|
|
||||||
+ '<div class="tooltip-arrow"></div>'
|
|
||||||
+ '<div class="tooltip-inner"></div></div>',
|
|
||||||
trigger : 'hover focus',
|
|
||||||
title : '',
|
|
||||||
delay : 0,
|
|
||||||
html : false,
|
|
||||||
selector : false,
|
|
||||||
placement : 'top',
|
|
||||||
offset : '0 0',
|
|
||||||
constraints : []
|
|
||||||
}
|
|
||||||
|
|
||||||
const DefaultType = {
|
|
||||||
animation : 'boolean',
|
|
||||||
template : 'string',
|
|
||||||
title : '(string|element|function)',
|
|
||||||
trigger : 'string',
|
|
||||||
delay : '(number|object)',
|
|
||||||
html : 'boolean',
|
|
||||||
selector : '(string|boolean)',
|
|
||||||
placement : '(string|function)',
|
|
||||||
offset : 'string',
|
|
||||||
constraints : 'array'
|
|
||||||
}
|
|
||||||
|
|
||||||
const AttachmentMap = {
|
|
||||||
TOP : 'bottom center',
|
|
||||||
RIGHT : 'middle left',
|
|
||||||
BOTTOM : 'top center',
|
|
||||||
LEFT : 'middle right'
|
|
||||||
}
|
|
||||||
|
|
||||||
const HoverState = {
|
|
||||||
IN : 'in',
|
|
||||||
OUT : 'out'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Event = {
|
|
||||||
HIDE : `hide${EVENT_KEY}`,
|
|
||||||
HIDDEN : `hidden${EVENT_KEY}`,
|
|
||||||
SHOW : `show${EVENT_KEY}`,
|
|
||||||
SHOWN : `shown${EVENT_KEY}`,
|
|
||||||
INSERTED : `inserted${EVENT_KEY}`,
|
|
||||||
CLICK : `click${EVENT_KEY}`,
|
|
||||||
FOCUSIN : `focusin${EVENT_KEY}`,
|
|
||||||
FOCUSOUT : `focusout${EVENT_KEY}`,
|
|
||||||
MOUSEENTER : `mouseenter${EVENT_KEY}`,
|
|
||||||
MOUSELEAVE : `mouseleave${EVENT_KEY}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const ClassName = {
|
|
||||||
FADE : 'fade',
|
|
||||||
IN : 'in'
|
|
||||||
}
|
|
||||||
|
|
||||||
const Selector = {
|
|
||||||
TOOLTIP : '.tooltip',
|
|
||||||
TOOLTIP_INNER : '.tooltip-inner'
|
|
||||||
}
|
|
||||||
|
|
||||||
const TetherClass = {
|
|
||||||
element : false,
|
|
||||||
enabled : false
|
|
||||||
}
|
|
||||||
|
|
||||||
const Trigger = {
|
|
||||||
HOVER : 'hover',
|
|
||||||
FOCUS : 'focus',
|
|
||||||
CLICK : 'click',
|
|
||||||
MANUAL : 'manual'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Class Definition
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Tooltip {
|
|
||||||
|
|
||||||
constructor(element, config) {
|
|
||||||
|
|
||||||
// private
|
|
||||||
this._isEnabled = true
|
|
||||||
this._timeout = 0
|
|
||||||
this._hoverState = ''
|
|
||||||
this._activeTrigger = {}
|
|
||||||
this._tether = null
|
|
||||||
|
|
||||||
// protected
|
|
||||||
this.element = element
|
|
||||||
this.config = this._getConfig(config)
|
|
||||||
this.tip = null
|
|
||||||
|
|
||||||
this._setListeners()
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// getters
|
|
||||||
|
|
||||||
static get VERSION() {
|
|
||||||
return VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Default() {
|
|
||||||
return Default
|
|
||||||
}
|
|
||||||
|
|
||||||
static get NAME() {
|
|
||||||
return NAME
|
|
||||||
}
|
|
||||||
|
|
||||||
static get DATA_KEY() {
|
|
||||||
return DATA_KEY
|
|
||||||
}
|
|
||||||
|
|
||||||
static get Event() {
|
|
||||||
return Event
|
|
||||||
}
|
|
||||||
|
|
||||||
static get EVENT_KEY() {
|
|
||||||
return EVENT_KEY
|
|
||||||
}
|
|
||||||
|
|
||||||
static get DefaultType() {
|
|
||||||
return DefaultType
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
enable() {
|
|
||||||
this._isEnabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
disable() {
|
|
||||||
this._isEnabled = false
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleEnabled() {
|
|
||||||
this._isEnabled = !this._isEnabled
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle(event) {
|
|
||||||
if (event) {
|
|
||||||
let dataKey = this.constructor.DATA_KEY
|
|
||||||
let context = $(event.currentTarget).data(dataKey)
|
|
||||||
|
|
||||||
if (!context) {
|
|
||||||
context = new this.constructor(
|
|
||||||
event.currentTarget,
|
|
||||||
this._getDelegateConfig()
|
|
||||||
)
|
|
||||||
$(event.currentTarget).data(dataKey, context)
|
|
||||||
}
|
|
||||||
|
|
||||||
context._activeTrigger.click = !context._activeTrigger.click
|
|
||||||
|
|
||||||
if (context._isWithActiveTrigger()) {
|
|
||||||
context._enter(null, context)
|
|
||||||
} else {
|
|
||||||
context._leave(null, context)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if ($(this.getTipElement()).hasClass(ClassName.IN)) {
|
|
||||||
this._leave(null, this)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this._enter(null, this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dispose() {
|
|
||||||
clearTimeout(this._timeout)
|
|
||||||
|
|
||||||
this.cleanupTether()
|
|
||||||
|
|
||||||
$.removeData(this.element, this.constructor.DATA_KEY)
|
|
||||||
|
|
||||||
$(this.element).off(this.constructor.EVENT_KEY)
|
|
||||||
|
|
||||||
if (this.tip) {
|
|
||||||
$(this.tip).remove()
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isEnabled = null
|
|
||||||
this._timeout = null
|
|
||||||
this._hoverState = null
|
|
||||||
this._activeTrigger = null
|
|
||||||
this._tether = null
|
|
||||||
|
|
||||||
this.element = null
|
|
||||||
this.config = null
|
|
||||||
this.tip = null
|
|
||||||
}
|
|
||||||
|
|
||||||
show() {
|
|
||||||
let showEvent = $.Event(this.constructor.Event.SHOW)
|
|
||||||
|
|
||||||
if (this.isWithContent() && this._isEnabled) {
|
|
||||||
$(this.element).trigger(showEvent)
|
|
||||||
|
|
||||||
let isInTheDom = $.contains(
|
|
||||||
this.element.ownerDocument.documentElement,
|
|
||||||
this.element
|
|
||||||
)
|
|
||||||
|
|
||||||
if (showEvent.isDefaultPrevented() || !isInTheDom) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let tip = this.getTipElement()
|
|
||||||
let tipId = Util.getUID(this.constructor.NAME)
|
|
||||||
|
|
||||||
tip.setAttribute('id', tipId)
|
|
||||||
this.element.setAttribute('aria-describedby', tipId)
|
|
||||||
|
|
||||||
this.setContent()
|
|
||||||
|
|
||||||
if (this.config.animation) {
|
|
||||||
$(tip).addClass(ClassName.FADE)
|
|
||||||
}
|
|
||||||
|
|
||||||
let placement = typeof this.config.placement === 'function' ?
|
|
||||||
this.config.placement.call(this, tip, this.element) :
|
|
||||||
this.config.placement
|
|
||||||
|
|
||||||
let attachment = this._getAttachment(placement)
|
|
||||||
|
|
||||||
$(tip)
|
|
||||||
.data(this.constructor.DATA_KEY, this)
|
|
||||||
.appendTo(document.body)
|
|
||||||
|
|
||||||
$(this.element).trigger(this.constructor.Event.INSERTED)
|
|
||||||
|
|
||||||
this._tether = new Tether({
|
|
||||||
attachment,
|
|
||||||
element : tip,
|
|
||||||
target : this.element,
|
|
||||||
classes : TetherClass,
|
|
||||||
classPrefix : CLASS_PREFIX,
|
|
||||||
offset : this.config.offset,
|
|
||||||
constraints : this.config.constraints,
|
|
||||||
addTargetClasses: false
|
|
||||||
})
|
|
||||||
|
|
||||||
Util.reflow(tip)
|
|
||||||
this._tether.position()
|
|
||||||
|
|
||||||
$(tip).addClass(ClassName.IN)
|
|
||||||
|
|
||||||
let complete = () => {
|
|
||||||
let prevHoverState = this._hoverState
|
|
||||||
this._hoverState = null
|
|
||||||
|
|
||||||
$(this.element).trigger(this.constructor.Event.SHOWN)
|
|
||||||
|
|
||||||
if (prevHoverState === HoverState.OUT) {
|
|
||||||
this._leave(null, this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
|
|
||||||
$(this.tip)
|
|
||||||
.one(Util.TRANSITION_END, complete)
|
|
||||||
.emulateTransitionEnd(Tooltip._TRANSITION_DURATION)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
complete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hide(callback) {
|
|
||||||
let tip = this.getTipElement()
|
|
||||||
let hideEvent = $.Event(this.constructor.Event.HIDE)
|
|
||||||
let complete = () => {
|
|
||||||
if (this._hoverState !== HoverState.IN && tip.parentNode) {
|
|
||||||
tip.parentNode.removeChild(tip)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.element.removeAttribute('aria-describedby')
|
|
||||||
$(this.element).trigger(this.constructor.Event.HIDDEN)
|
|
||||||
this.cleanupTether()
|
|
||||||
|
|
||||||
if (callback) {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this.element).trigger(hideEvent)
|
|
||||||
|
|
||||||
if (hideEvent.isDefaultPrevented()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$(tip).removeClass(ClassName.IN)
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd() &&
|
|
||||||
($(this.tip).hasClass(ClassName.FADE))) {
|
|
||||||
|
|
||||||
$(tip)
|
|
||||||
.one(Util.TRANSITION_END, complete)
|
|
||||||
.emulateTransitionEnd(TRANSITION_DURATION)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
this._hoverState = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// protected
|
|
||||||
|
|
||||||
isWithContent() {
|
|
||||||
return Boolean(this.getTitle())
|
|
||||||
}
|
|
||||||
|
|
||||||
getTipElement() {
|
|
||||||
return (this.tip = this.tip || $(this.config.template)[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
setContent() {
|
|
||||||
let $tip = $(this.getTipElement())
|
|
||||||
|
|
||||||
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle())
|
|
||||||
|
|
||||||
$tip
|
|
||||||
.removeClass(ClassName.FADE)
|
|
||||||
.removeClass(ClassName.IN)
|
|
||||||
|
|
||||||
this.cleanupTether()
|
|
||||||
}
|
|
||||||
|
|
||||||
setElementContent($element, content) {
|
|
||||||
let html = this.config.html
|
|
||||||
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
|
|
||||||
// content is a DOM node or a jQuery
|
|
||||||
if (html) {
|
|
||||||
if (!$(content).parent().is($element)) {
|
|
||||||
$element.empty().append(content)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$element.text($(content).text())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$element[html ? 'html' : 'text'](content)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getTitle() {
|
|
||||||
let title = this.element.getAttribute('data-original-title')
|
|
||||||
|
|
||||||
if (!title) {
|
|
||||||
title = typeof this.config.title === 'function' ?
|
|
||||||
this.config.title.call(this.element) :
|
|
||||||
this.config.title
|
|
||||||
}
|
|
||||||
|
|
||||||
return title
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanupTether() {
|
|
||||||
if (this._tether) {
|
|
||||||
this._tether.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
_getAttachment(placement) {
|
|
||||||
return AttachmentMap[placement.toUpperCase()]
|
|
||||||
}
|
|
||||||
|
|
||||||
_setListeners() {
|
|
||||||
let triggers = this.config.trigger.split(' ')
|
|
||||||
|
|
||||||
triggers.forEach((trigger) => {
|
|
||||||
if (trigger === 'click') {
|
|
||||||
$(this.element).on(
|
|
||||||
this.constructor.Event.CLICK,
|
|
||||||
this.config.selector,
|
|
||||||
$.proxy(this.toggle, this)
|
|
||||||
)
|
|
||||||
|
|
||||||
} else if (trigger !== Trigger.MANUAL) {
|
|
||||||
let eventIn = trigger === Trigger.HOVER ?
|
|
||||||
this.constructor.Event.MOUSEENTER :
|
|
||||||
this.constructor.Event.FOCUSIN
|
|
||||||
let eventOut = trigger === Trigger.HOVER ?
|
|
||||||
this.constructor.Event.MOUSELEAVE :
|
|
||||||
this.constructor.Event.FOCUSOUT
|
|
||||||
|
|
||||||
$(this.element)
|
|
||||||
.on(
|
|
||||||
eventIn,
|
|
||||||
this.config.selector,
|
|
||||||
$.proxy(this._enter, this)
|
|
||||||
)
|
|
||||||
.on(
|
|
||||||
eventOut,
|
|
||||||
this.config.selector,
|
|
||||||
$.proxy(this._leave, this)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (this.config.selector) {
|
|
||||||
this.config = $.extend({}, this.config, {
|
|
||||||
trigger : 'manual',
|
|
||||||
selector : ''
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
this._fixTitle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_fixTitle() {
|
|
||||||
let titleType = typeof this.element.getAttribute('data-original-title')
|
|
||||||
if (this.element.getAttribute('title') ||
|
|
||||||
(titleType !== 'string')) {
|
|
||||||
this.element.setAttribute(
|
|
||||||
'data-original-title',
|
|
||||||
this.element.getAttribute('title') || ''
|
|
||||||
)
|
|
||||||
this.element.setAttribute('title', '')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_enter(event, context) {
|
|
||||||
let dataKey = this.constructor.DATA_KEY
|
|
||||||
|
|
||||||
context = context || $(event.currentTarget).data(dataKey)
|
|
||||||
|
|
||||||
if (!context) {
|
|
||||||
context = new this.constructor(
|
|
||||||
event.currentTarget,
|
|
||||||
this._getDelegateConfig()
|
|
||||||
)
|
|
||||||
$(event.currentTarget).data(dataKey, context)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
context._activeTrigger[
|
|
||||||
event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER
|
|
||||||
] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($(context.getTipElement()).hasClass(ClassName.IN) ||
|
|
||||||
(context._hoverState === HoverState.IN)) {
|
|
||||||
context._hoverState = HoverState.IN
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
clearTimeout(context._timeout)
|
|
||||||
|
|
||||||
context._hoverState = HoverState.IN
|
|
||||||
|
|
||||||
if (!context.config.delay || !context.config.delay.show) {
|
|
||||||
context.show()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
context._timeout = setTimeout(() => {
|
|
||||||
if (context._hoverState === HoverState.IN) {
|
|
||||||
context.show()
|
|
||||||
}
|
|
||||||
}, context.config.delay.show)
|
|
||||||
}
|
|
||||||
|
|
||||||
_leave(event, context) {
|
|
||||||
let dataKey = this.constructor.DATA_KEY
|
|
||||||
|
|
||||||
context = context || $(event.currentTarget).data(dataKey)
|
|
||||||
|
|
||||||
if (!context) {
|
|
||||||
context = new this.constructor(
|
|
||||||
event.currentTarget,
|
|
||||||
this._getDelegateConfig()
|
|
||||||
)
|
|
||||||
$(event.currentTarget).data(dataKey, context)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
context._activeTrigger[
|
|
||||||
event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER
|
|
||||||
] = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (context._isWithActiveTrigger()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
clearTimeout(context._timeout)
|
|
||||||
|
|
||||||
context._hoverState = HoverState.OUT
|
|
||||||
|
|
||||||
if (!context.config.delay || !context.config.delay.hide) {
|
|
||||||
context.hide()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
context._timeout = setTimeout(() => {
|
|
||||||
if (context._hoverState === HoverState.OUT) {
|
|
||||||
context.hide()
|
|
||||||
}
|
|
||||||
}, context.config.delay.hide)
|
|
||||||
}
|
|
||||||
|
|
||||||
_isWithActiveTrigger() {
|
|
||||||
for (let trigger in this._activeTrigger) {
|
|
||||||
if (this._activeTrigger[trigger]) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
_getConfig(config) {
|
|
||||||
config = $.extend(
|
|
||||||
{},
|
|
||||||
this.constructor.Default,
|
|
||||||
$(this.element).data(),
|
|
||||||
config
|
|
||||||
)
|
|
||||||
|
|
||||||
if (config.delay && typeof config.delay === 'number') {
|
|
||||||
config.delay = {
|
|
||||||
show : config.delay,
|
|
||||||
hide : config.delay
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Util.typeCheckConfig(
|
|
||||||
NAME,
|
|
||||||
config,
|
|
||||||
this.constructor.DefaultType
|
|
||||||
)
|
|
||||||
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
_getDelegateConfig() {
|
|
||||||
let config = {}
|
|
||||||
|
|
||||||
if (this.config) {
|
|
||||||
for (let key in this.config) {
|
|
||||||
if (this.constructor.Default[key] !== this.config[key]) {
|
|
||||||
config[key] = this.config[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
|
|
||||||
static _jQueryInterface(config) {
|
|
||||||
return this.each(function () {
|
|
||||||
let data = $(this).data(DATA_KEY)
|
|
||||||
let _config = typeof config === 'object' ?
|
|
||||||
config : null
|
|
||||||
|
|
||||||
if (!data && /destroy|hide/.test(config)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
data = new Tooltip(this, _config)
|
|
||||||
$(this).data(DATA_KEY, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof config === 'string') {
|
|
||||||
if (data[config] === undefined) {
|
|
||||||
throw new Error(`No method named "${config}"`)
|
|
||||||
}
|
|
||||||
data[config]()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* jQuery
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
$.fn[NAME] = Tooltip._jQueryInterface
|
|
||||||
$.fn[NAME].Constructor = Tooltip
|
|
||||||
$.fn[NAME].noConflict = function () {
|
|
||||||
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
||||||
return Tooltip._jQueryInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
return Tooltip
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Tooltip
|
|
|
@ -1,160 +0,0 @@
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Bootstrap (v4.0.0-alpha.2): util.js
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Util = (($) => {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
* Private TransitionEnd Helpers
|
|
||||||
* ------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
let transition = false
|
|
||||||
|
|
||||||
const TransitionEndEvent = {
|
|
||||||
WebkitTransition : 'webkitTransitionEnd',
|
|
||||||
MozTransition : 'transitionend',
|
|
||||||
OTransition : 'oTransitionEnd otransitionend',
|
|
||||||
transition : 'transitionend'
|
|
||||||
}
|
|
||||||
|
|
||||||
// shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
||||||
function toType(obj) {
|
|
||||||
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
|
|
||||||
}
|
|
||||||
|
|
||||||
function isElement(obj) {
|
|
||||||
return (obj[0] || obj).nodeType
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSpecialTransitionEndEvent() {
|
|
||||||
return {
|
|
||||||
bindType: transition.end,
|
|
||||||
delegateType: transition.end,
|
|
||||||
handle(event) {
|
|
||||||
if ($(event.target).is(this)) {
|
|
||||||
return event.handleObj.handler.apply(this, arguments)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function transitionEndTest() {
|
|
||||||
if (window.QUnit) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
let el = document.createElement('bootstrap')
|
|
||||||
|
|
||||||
for (let name in TransitionEndEvent) {
|
|
||||||
if (el.style[name] !== undefined) {
|
|
||||||
return { end: TransitionEndEvent[name] }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
function transitionEndEmulator(duration) {
|
|
||||||
let called = false
|
|
||||||
|
|
||||||
$(this).one(Util.TRANSITION_END, () => {
|
|
||||||
called = true
|
|
||||||
})
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
if (!called) {
|
|
||||||
Util.triggerTransitionEnd(this)
|
|
||||||
}
|
|
||||||
}, duration)
|
|
||||||
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
function setTransitionEndSupport() {
|
|
||||||
transition = transitionEndTest()
|
|
||||||
|
|
||||||
$.fn.emulateTransitionEnd = transitionEndEmulator
|
|
||||||
|
|
||||||
if (Util.supportsTransitionEnd()) {
|
|
||||||
$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
* Public Util Api
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
let Util = {
|
|
||||||
|
|
||||||
TRANSITION_END: 'bsTransitionEnd',
|
|
||||||
|
|
||||||
getUID(prefix) {
|
|
||||||
do {
|
|
||||||
prefix += ~~(Math.random() * 1000000) // "~~" acts like a faster Math.floor() here
|
|
||||||
} while (document.getElementById(prefix))
|
|
||||||
return prefix
|
|
||||||
},
|
|
||||||
|
|
||||||
getSelectorFromElement(element) {
|
|
||||||
let selector = element.getAttribute('data-target')
|
|
||||||
|
|
||||||
if (!selector) {
|
|
||||||
selector = element.getAttribute('href') || ''
|
|
||||||
selector = /^#[a-z]/i.test(selector) ? selector : null
|
|
||||||
}
|
|
||||||
|
|
||||||
return selector
|
|
||||||
},
|
|
||||||
|
|
||||||
reflow(element) {
|
|
||||||
new Function('bs', 'return bs')(element.offsetHeight)
|
|
||||||
},
|
|
||||||
|
|
||||||
triggerTransitionEnd(element) {
|
|
||||||
$(element).trigger(transition.end)
|
|
||||||
},
|
|
||||||
|
|
||||||
supportsTransitionEnd() {
|
|
||||||
return Boolean(transition)
|
|
||||||
},
|
|
||||||
|
|
||||||
typeCheckConfig(componentName, config, configTypes) {
|
|
||||||
for (let property in configTypes) {
|
|
||||||
if (configTypes.hasOwnProperty(property)) {
|
|
||||||
let expectedTypes = configTypes[property]
|
|
||||||
let value = config[property]
|
|
||||||
let valueType
|
|
||||||
|
|
||||||
if (value && isElement(value)) {
|
|
||||||
valueType = 'element'
|
|
||||||
} else {
|
|
||||||
valueType = toType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
||||||
throw new Error(
|
|
||||||
`${componentName.toUpperCase()}: ` +
|
|
||||||
`Option "${property}" provided type "${valueType}" ` +
|
|
||||||
`but expected type "${expectedTypes}".`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setTransitionEndSupport()
|
|
||||||
|
|
||||||
return Util
|
|
||||||
|
|
||||||
})(jQuery)
|
|
||||||
|
|
||||||
export default Util
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -1,9 +0,0 @@
|
||||||
@function twbs-font-path($path) {
|
|
||||||
@return font-url($path, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@function twbs-image-path($path) {
|
|
||||||
@return image-url($path, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
$bootstrap-sass-asset-helper: true;
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Mincer asset helper functions
|
|
||||||
//
|
|
||||||
// This must be imported into a .css.ejs.scss file.
|
|
||||||
// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
|
|
||||||
|
|
||||||
|
|
||||||
@function twbs-font-path($path) {
|
|
||||||
// do something like following
|
|
||||||
// from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
|
|
||||||
// from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
|
|
||||||
// or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
|
|
||||||
@return "<%- asset_path("#{$path}".replace(/[#?].*$/, '')) + "#{$path}".replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
|
|
||||||
}
|
|
||||||
|
|
||||||
@function twbs-image-path($file) {
|
|
||||||
@return "<%- asset_path("#{$file}") %>";
|
|
||||||
}
|
|
||||||
|
|
||||||
$bootstrap-sass-asset-helper: true;
|
|
|
@ -1,9 +0,0 @@
|
||||||
@function twbs-font-path($path) {
|
|
||||||
@return font-path($path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@function twbs-image-path($path) {
|
|
||||||
@return image-path($path);
|
|
||||||
}
|
|
||||||
|
|
||||||
$bootstrap-sass-asset-helper: true;
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*!
|
|
||||||
* Bootstrap v3.3.6 (http://getbootstrap.com)
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Core variables and mixins
|
|
||||||
@import "bootstrap/variables";
|
|
||||||
@import "bootstrap/mixins";
|
|
||||||
|
|
||||||
// Reset and dependencies
|
|
||||||
@import "bootstrap/normalize";
|
|
||||||
@import "bootstrap/print";
|
|
||||||
@import "bootstrap/glyphicons";
|
|
||||||
|
|
||||||
// Core CSS
|
|
||||||
@import "bootstrap/scaffolding";
|
|
||||||
@import "bootstrap/type";
|
|
||||||
@import "bootstrap/code";
|
|
||||||
@import "bootstrap/grid";
|
|
||||||
@import "bootstrap/tables";
|
|
||||||
@import "bootstrap/forms";
|
|
||||||
@import "bootstrap/buttons";
|
|
||||||
|
|
||||||
// Components
|
|
||||||
@import "bootstrap/component-animations";
|
|
||||||
@import "bootstrap/dropdowns";
|
|
||||||
@import "bootstrap/button-groups";
|
|
||||||
@import "bootstrap/input-groups";
|
|
||||||
@import "bootstrap/navs";
|
|
||||||
@import "bootstrap/navbar";
|
|
||||||
@import "bootstrap/breadcrumbs";
|
|
||||||
@import "bootstrap/pagination";
|
|
||||||
@import "bootstrap/pager";
|
|
||||||
@import "bootstrap/labels";
|
|
||||||
@import "bootstrap/badges";
|
|
||||||
@import "bootstrap/jumbotron";
|
|
||||||
@import "bootstrap/thumbnails";
|
|
||||||
@import "bootstrap/alerts";
|
|
||||||
@import "bootstrap/progress-bars";
|
|
||||||
@import "bootstrap/media";
|
|
||||||
@import "bootstrap/list-group";
|
|
||||||
@import "bootstrap/panels";
|
|
||||||
@import "bootstrap/responsive-embed";
|
|
||||||
@import "bootstrap/wells";
|
|
||||||
@import "bootstrap/close";
|
|
||||||
|
|
||||||
// Components w/ JavaScript
|
|
||||||
@import "bootstrap/modals";
|
|
||||||
@import "bootstrap/tooltip";
|
|
||||||
@import "bootstrap/popovers";
|
|
||||||
@import "bootstrap/carousel";
|
|
||||||
|
|
||||||
// Utility classes
|
|
||||||
@import "bootstrap/utilities";
|
|
||||||
@import "bootstrap/responsive-utilities";
|
|
|
@ -1,73 +0,0 @@
|
||||||
//
|
|
||||||
// Alerts
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base styles
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.alert {
|
|
||||||
padding: $alert-padding;
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: $alert-border-radius;
|
|
||||||
|
|
||||||
// Headings for larger alerts
|
|
||||||
h4 {
|
|
||||||
margin-top: 0;
|
|
||||||
// Specified for the h4 to prevent conflicts of changing $headings-color
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Provide class for links that match alerts
|
|
||||||
.alert-link {
|
|
||||||
font-weight: $alert-link-font-weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Improve alignment and spacing of inner content
|
|
||||||
> p,
|
|
||||||
> ul {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> p + p {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dismissible alerts
|
|
||||||
//
|
|
||||||
// Expand the right padding and account for the close button's positioning.
|
|
||||||
|
|
||||||
.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
|
|
||||||
.alert-dismissible {
|
|
||||||
padding-right: ($alert-padding + 20);
|
|
||||||
|
|
||||||
// Adjust close link position
|
|
||||||
.close {
|
|
||||||
position: relative;
|
|
||||||
top: -2px;
|
|
||||||
right: -21px;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alternate styles
|
|
||||||
//
|
|
||||||
// Generate contextual modifier classes for colorizing the alert.
|
|
||||||
|
|
||||||
.alert-success {
|
|
||||||
@include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-info {
|
|
||||||
@include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-warning {
|
|
||||||
@include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-danger {
|
|
||||||
@include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
//
|
|
||||||
// Badges
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
.badge {
|
|
||||||
display: inline-block;
|
|
||||||
min-width: 10px;
|
|
||||||
padding: 3px 7px;
|
|
||||||
font-size: $font-size-small;
|
|
||||||
font-weight: $badge-font-weight;
|
|
||||||
color: $badge-color;
|
|
||||||
line-height: $badge-line-height;
|
|
||||||
vertical-align: middle;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-align: center;
|
|
||||||
background-color: $badge-bg;
|
|
||||||
border-radius: $badge-border-radius;
|
|
||||||
|
|
||||||
// Empty badges collapse automatically (not available in IE8)
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quick fix for badges in buttons
|
|
||||||
.btn & {
|
|
||||||
position: relative;
|
|
||||||
top: -1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-xs &,
|
|
||||||
.btn-group-xs > .btn & {
|
|
||||||
top: 0;
|
|
||||||
padding: 1px 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// [converter] extracted a& to a.badge
|
|
||||||
|
|
||||||
// Account for badges in navs
|
|
||||||
.list-group-item.active > &,
|
|
||||||
.nav-pills > .active > a > & {
|
|
||||||
color: $badge-active-color;
|
|
||||||
background-color: $badge-active-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-group-item > & {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-group-item > & + & {
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-pills > li > a > & {
|
|
||||||
margin-left: 3px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover state, but only for links
|
|
||||||
a.badge {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $badge-link-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
//
|
|
||||||
// Breadcrumbs
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.breadcrumb {
|
|
||||||
padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
list-style: none;
|
|
||||||
background-color: $breadcrumb-bg;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
+ li:before {
|
|
||||||
// [converter] Workaround for https://github.com/sass/libsass/issues/1115
|
|
||||||
$nbsp: "\00a0";
|
|
||||||
content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space
|
|
||||||
padding: 0 5px;
|
|
||||||
color: $breadcrumb-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active {
|
|
||||||
color: $breadcrumb-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,244 +0,0 @@
|
||||||
//
|
|
||||||
// Button groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Make the div behave like a button
|
|
||||||
.btn-group,
|
|
||||||
.btn-group-vertical {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle; // match .btn alignment given font-size hack above
|
|
||||||
> .btn {
|
|
||||||
position: relative;
|
|
||||||
float: left;
|
|
||||||
// Bring the "active" button to the front
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent double borders when buttons are next to each other
|
|
||||||
.btn-group {
|
|
||||||
.btn + .btn,
|
|
||||||
.btn + .btn-group,
|
|
||||||
.btn-group + .btn,
|
|
||||||
.btn-group + .btn-group {
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional: Group multiple button groups together for a toolbar
|
|
||||||
.btn-toolbar {
|
|
||||||
margin-left: -5px; // Offset the first child's margin
|
|
||||||
@include clearfix;
|
|
||||||
|
|
||||||
.btn,
|
|
||||||
.btn-group,
|
|
||||||
.input-group {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
> .btn,
|
|
||||||
> .btn-group,
|
|
||||||
> .input-group {
|
|
||||||
margin-left: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
|
|
||||||
.btn-group > .btn:first-child {
|
|
||||||
margin-left: 0;
|
|
||||||
&:not(:last-child):not(.dropdown-toggle) {
|
|
||||||
@include border-right-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
|
|
||||||
.btn-group > .btn:last-child:not(:first-child),
|
|
||||||
.btn-group > .dropdown-toggle:not(:first-child) {
|
|
||||||
@include border-left-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
|
|
||||||
.btn-group > .btn-group {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
.btn-group > .btn-group:first-child:not(:last-child) {
|
|
||||||
> .btn:last-child,
|
|
||||||
> .dropdown-toggle {
|
|
||||||
@include border-right-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
|
|
||||||
@include border-left-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// On active and open, don't show outline
|
|
||||||
.btn-group .dropdown-toggle:active,
|
|
||||||
.btn-group.open .dropdown-toggle {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
//
|
|
||||||
// Remix the default button sizing classes into new ones for easier manipulation.
|
|
||||||
|
|
||||||
.btn-group-xs > .btn { @extend .btn-xs; }
|
|
||||||
.btn-group-sm > .btn { @extend .btn-sm; }
|
|
||||||
.btn-group-lg > .btn { @extend .btn-lg; }
|
|
||||||
|
|
||||||
|
|
||||||
// Split button dropdowns
|
|
||||||
// ----------------------
|
|
||||||
|
|
||||||
// Give the line between buttons some depth
|
|
||||||
.btn-group > .btn + .dropdown-toggle {
|
|
||||||
padding-left: 8px;
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
.btn-group > .btn-lg + .dropdown-toggle {
|
|
||||||
padding-left: 12px;
|
|
||||||
padding-right: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The clickable button for toggling the menu
|
|
||||||
// Remove the gradient and set the same inset shadow as the :active state
|
|
||||||
.btn-group.open .dropdown-toggle {
|
|
||||||
@include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
|
||||||
|
|
||||||
// Show no shadow for `.btn-link` since it has no other button styles.
|
|
||||||
&.btn-link {
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Reposition the caret
|
|
||||||
.btn .caret {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
// Carets in other button sizes
|
|
||||||
.btn-lg .caret {
|
|
||||||
border-width: $caret-width-large $caret-width-large 0;
|
|
||||||
border-bottom-width: 0;
|
|
||||||
}
|
|
||||||
// Upside down carets for .dropup
|
|
||||||
.dropup .btn-lg .caret {
|
|
||||||
border-width: 0 $caret-width-large $caret-width-large;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Vertical button groups
|
|
||||||
// ----------------------
|
|
||||||
|
|
||||||
.btn-group-vertical {
|
|
||||||
> .btn,
|
|
||||||
> .btn-group,
|
|
||||||
> .btn-group > .btn {
|
|
||||||
display: block;
|
|
||||||
float: none;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear floats so dropdown menus can be properly placed
|
|
||||||
> .btn-group {
|
|
||||||
@include clearfix;
|
|
||||||
> .btn {
|
|
||||||
float: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .btn + .btn,
|
|
||||||
> .btn + .btn-group,
|
|
||||||
> .btn-group + .btn,
|
|
||||||
> .btn-group + .btn-group {
|
|
||||||
margin-top: -1px;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-group-vertical > .btn {
|
|
||||||
&:not(:first-child):not(:last-child) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
&:first-child:not(:last-child) {
|
|
||||||
@include border-top-radius($btn-border-radius-base);
|
|
||||||
@include border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
&:last-child:not(:first-child) {
|
|
||||||
@include border-top-radius(0);
|
|
||||||
@include border-bottom-radius($btn-border-radius-base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
.btn-group-vertical > .btn-group:first-child:not(:last-child) {
|
|
||||||
> .btn:last-child,
|
|
||||||
> .dropdown-toggle {
|
|
||||||
@include border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
|
|
||||||
@include border-top-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Justified button groups
|
|
||||||
// ----------------------
|
|
||||||
|
|
||||||
.btn-group-justified {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
border-collapse: separate;
|
|
||||||
> .btn,
|
|
||||||
> .btn-group {
|
|
||||||
float: none;
|
|
||||||
display: table-cell;
|
|
||||||
width: 1%;
|
|
||||||
}
|
|
||||||
> .btn-group .btn {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .btn-group .dropdown-menu {
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checkbox and radio options
|
|
||||||
//
|
|
||||||
// In order to support the browser's form validation feedback, powered by the
|
|
||||||
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
|
|
||||||
// `display: none;` or `visibility: hidden;` as that also hides the popover.
|
|
||||||
// Simply visually hiding the inputs via `opacity` would leave them clickable in
|
|
||||||
// certain cases which is prevented by using `clip` and `pointer-events`.
|
|
||||||
// This way, we ensure a DOM element is visible to position the popover from.
|
|
||||||
//
|
|
||||||
// See https://github.com/twbs/bootstrap/pull/12794 and
|
|
||||||
// https://github.com/twbs/bootstrap/pull/14559 for more information.
|
|
||||||
|
|
||||||
[data-toggle="buttons"] {
|
|
||||||
> .btn,
|
|
||||||
> .btn-group > .btn {
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
position: absolute;
|
|
||||||
clip: rect(0,0,0,0);
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,168 +0,0 @@
|
||||||
//
|
|
||||||
// Buttons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base styles
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.btn {
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: 0; // For input.btn
|
|
||||||
font-weight: $btn-font-weight;
|
|
||||||
text-align: center;
|
|
||||||
vertical-align: middle;
|
|
||||||
touch-action: manipulation;
|
|
||||||
cursor: pointer;
|
|
||||||
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
|
|
||||||
border: 1px solid transparent;
|
|
||||||
white-space: nowrap;
|
|
||||||
@include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);
|
|
||||||
@include user-select(none);
|
|
||||||
|
|
||||||
&,
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
&:focus,
|
|
||||||
&.focus {
|
|
||||||
@include tab-focus;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&.focus {
|
|
||||||
color: $btn-default-color;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
outline: 0;
|
|
||||||
background-image: none;
|
|
||||||
@include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled,
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
@include opacity(.65);
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
|
|
||||||
// [converter] extracted a& to a.btn
|
|
||||||
}
|
|
||||||
|
|
||||||
a.btn {
|
|
||||||
&.disabled,
|
|
||||||
fieldset[disabled] & {
|
|
||||||
pointer-events: none; // Future-proof disabling of clicks on `<a>` elements
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Alternate buttons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.btn-default {
|
|
||||||
@include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
|
|
||||||
}
|
|
||||||
.btn-primary {
|
|
||||||
@include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
|
|
||||||
}
|
|
||||||
// Success appears as green
|
|
||||||
.btn-success {
|
|
||||||
@include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
|
|
||||||
}
|
|
||||||
// Info appears as blue-green
|
|
||||||
.btn-info {
|
|
||||||
@include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
|
|
||||||
}
|
|
||||||
// Warning appears as orange
|
|
||||||
.btn-warning {
|
|
||||||
@include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
|
|
||||||
}
|
|
||||||
// Danger and error appear as red
|
|
||||||
.btn-danger {
|
|
||||||
@include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Link buttons
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Make a button look and behave like a link
|
|
||||||
.btn-link {
|
|
||||||
color: $link-color;
|
|
||||||
font-weight: normal;
|
|
||||||
border-radius: 0;
|
|
||||||
|
|
||||||
&,
|
|
||||||
&:active,
|
|
||||||
&.active,
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
background-color: transparent;
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active {
|
|
||||||
border-color: transparent;
|
|
||||||
}
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $link-hover-color;
|
|
||||||
text-decoration: $link-hover-decoration;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $btn-link-disabled-color;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Button Sizes
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.btn-lg {
|
|
||||||
// line-height: ensure even-numbered height of button next to large input
|
|
||||||
@include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);
|
|
||||||
}
|
|
||||||
.btn-sm {
|
|
||||||
// line-height: ensure proper height of button next to small input
|
|
||||||
@include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
|
|
||||||
}
|
|
||||||
.btn-xs {
|
|
||||||
@include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Block button
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.btn-block {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vertically space out multiple block buttons
|
|
||||||
.btn-block + .btn-block {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specificity overrides
|
|
||||||
input[type="submit"],
|
|
||||||
input[type="reset"],
|
|
||||||
input[type="button"] {
|
|
||||||
&.btn-block {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,270 +0,0 @@
|
||||||
//
|
|
||||||
// Carousel
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Wrapper for the slide container and indicators
|
|
||||||
.carousel {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-inner {
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
> .item {
|
|
||||||
display: none;
|
|
||||||
position: relative;
|
|
||||||
@include transition(.6s ease-in-out left);
|
|
||||||
|
|
||||||
// Account for jankitude on images
|
|
||||||
> img,
|
|
||||||
> a > img {
|
|
||||||
@include img-responsive;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// WebKit CSS3 transforms for supported devices
|
|
||||||
@media all and (transform-3d), (-webkit-transform-3d) {
|
|
||||||
@include transition-transform(0.6s ease-in-out);
|
|
||||||
@include backface-visibility(hidden);
|
|
||||||
@include perspective(1000px);
|
|
||||||
|
|
||||||
&.next,
|
|
||||||
&.active.right {
|
|
||||||
@include translate3d(100%, 0, 0);
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
&.prev,
|
|
||||||
&.active.left {
|
|
||||||
@include translate3d(-100%, 0, 0);
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
&.next.left,
|
|
||||||
&.prev.right,
|
|
||||||
&.active {
|
|
||||||
@include translate3d(0, 0, 0);
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active,
|
|
||||||
> .next,
|
|
||||||
> .prev {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .next,
|
|
||||||
> .prev {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .next {
|
|
||||||
left: 100%;
|
|
||||||
}
|
|
||||||
> .prev {
|
|
||||||
left: -100%;
|
|
||||||
}
|
|
||||||
> .next.left,
|
|
||||||
> .prev.right {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active.left {
|
|
||||||
left: -100%;
|
|
||||||
}
|
|
||||||
> .active.right {
|
|
||||||
left: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Left/right controls for nav
|
|
||||||
// ---------------------------
|
|
||||||
|
|
||||||
.carousel-control {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: $carousel-control-width;
|
|
||||||
@include opacity($carousel-control-opacity);
|
|
||||||
font-size: $carousel-control-font-size;
|
|
||||||
color: $carousel-control-color;
|
|
||||||
text-align: center;
|
|
||||||
text-shadow: $carousel-text-shadow;
|
|
||||||
background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug
|
|
||||||
// We can't have this transition here because WebKit cancels the carousel
|
|
||||||
// animation if you trip this while in the middle of another animation.
|
|
||||||
|
|
||||||
// Set gradients for backgrounds
|
|
||||||
&.left {
|
|
||||||
@include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
|
|
||||||
}
|
|
||||||
&.right {
|
|
||||||
left: auto;
|
|
||||||
right: 0;
|
|
||||||
@include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover/focus state
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
outline: 0;
|
|
||||||
color: $carousel-control-color;
|
|
||||||
text-decoration: none;
|
|
||||||
@include opacity(.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Toggles
|
|
||||||
.icon-prev,
|
|
||||||
.icon-next,
|
|
||||||
.glyphicon-chevron-left,
|
|
||||||
.glyphicon-chevron-right {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
margin-top: -10px;
|
|
||||||
z-index: 5;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.icon-prev,
|
|
||||||
.glyphicon-chevron-left {
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -10px;
|
|
||||||
}
|
|
||||||
.icon-next,
|
|
||||||
.glyphicon-chevron-right {
|
|
||||||
right: 50%;
|
|
||||||
margin-right: -10px;
|
|
||||||
}
|
|
||||||
.icon-prev,
|
|
||||||
.icon-next {
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 1;
|
|
||||||
font-family: serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.icon-prev {
|
|
||||||
&:before {
|
|
||||||
content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.icon-next {
|
|
||||||
&:before {
|
|
||||||
content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional indicator pips
|
|
||||||
//
|
|
||||||
// Add an unordered list with the following class and add a list item for each
|
|
||||||
// slide your carousel holds.
|
|
||||||
|
|
||||||
.carousel-indicators {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 10px;
|
|
||||||
left: 50%;
|
|
||||||
z-index: 15;
|
|
||||||
width: 60%;
|
|
||||||
margin-left: -30%;
|
|
||||||
padding-left: 0;
|
|
||||||
list-style: none;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
li {
|
|
||||||
display: inline-block;
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
margin: 1px;
|
|
||||||
text-indent: -999px;
|
|
||||||
border: 1px solid $carousel-indicator-border-color;
|
|
||||||
border-radius: 10px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
// IE8-9 hack for event handling
|
|
||||||
//
|
|
||||||
// Internet Explorer 8-9 does not support clicks on elements without a set
|
|
||||||
// `background-color`. We cannot use `filter` since that's not viewed as a
|
|
||||||
// background color by the browser. Thus, a hack is needed.
|
|
||||||
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
|
|
||||||
//
|
|
||||||
// For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
|
|
||||||
// set alpha transparency for the best results possible.
|
|
||||||
background-color: #000 \9; // IE8
|
|
||||||
background-color: rgba(0,0,0,0); // IE9
|
|
||||||
}
|
|
||||||
.active {
|
|
||||||
margin: 0;
|
|
||||||
width: 12px;
|
|
||||||
height: 12px;
|
|
||||||
background-color: $carousel-indicator-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional captions
|
|
||||||
// -----------------------------
|
|
||||||
// Hidden by default for smaller viewports
|
|
||||||
.carousel-caption {
|
|
||||||
position: absolute;
|
|
||||||
left: 15%;
|
|
||||||
right: 15%;
|
|
||||||
bottom: 20px;
|
|
||||||
z-index: 10;
|
|
||||||
padding-top: 20px;
|
|
||||||
padding-bottom: 20px;
|
|
||||||
color: $carousel-caption-color;
|
|
||||||
text-align: center;
|
|
||||||
text-shadow: $carousel-text-shadow;
|
|
||||||
& .btn {
|
|
||||||
text-shadow: none; // No shadow for button elements in carousel-caption
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Scale up controls for tablets and up
|
|
||||||
@media screen and (min-width: $screen-sm-min) {
|
|
||||||
|
|
||||||
// Scale up the controls a smidge
|
|
||||||
.carousel-control {
|
|
||||||
.glyphicon-chevron-left,
|
|
||||||
.glyphicon-chevron-right,
|
|
||||||
.icon-prev,
|
|
||||||
.icon-next {
|
|
||||||
width: ($carousel-control-font-size * 1.5);
|
|
||||||
height: ($carousel-control-font-size * 1.5);
|
|
||||||
margin-top: ($carousel-control-font-size / -2);
|
|
||||||
font-size: ($carousel-control-font-size * 1.5);
|
|
||||||
}
|
|
||||||
.glyphicon-chevron-left,
|
|
||||||
.icon-prev {
|
|
||||||
margin-left: ($carousel-control-font-size / -2);
|
|
||||||
}
|
|
||||||
.glyphicon-chevron-right,
|
|
||||||
.icon-next {
|
|
||||||
margin-right: ($carousel-control-font-size / -2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show and left align the captions
|
|
||||||
.carousel-caption {
|
|
||||||
left: 20%;
|
|
||||||
right: 20%;
|
|
||||||
padding-bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move up the indicators
|
|
||||||
.carousel-indicators {
|
|
||||||
bottom: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
//
|
|
||||||
// Close icons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.close {
|
|
||||||
float: right;
|
|
||||||
font-size: ($font-size-base * 1.5);
|
|
||||||
font-weight: $close-font-weight;
|
|
||||||
line-height: 1;
|
|
||||||
color: $close-color;
|
|
||||||
text-shadow: $close-text-shadow;
|
|
||||||
@include opacity(.2);
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $close-color;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
@include opacity(.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
// [converter] extracted button& to button.close
|
|
||||||
}
|
|
||||||
|
|
||||||
// Additional properties for button version
|
|
||||||
// iOS requires the button element instead of an anchor tag.
|
|
||||||
// If you want the anchor version, it requires `href="#"`.
|
|
||||||
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
|
|
||||||
button.close {
|
|
||||||
padding: 0;
|
|
||||||
cursor: pointer;
|
|
||||||
background: transparent;
|
|
||||||
border: 0;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
//
|
|
||||||
// Code (inline and block)
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Inline and block code styles
|
|
||||||
code,
|
|
||||||
kbd,
|
|
||||||
pre,
|
|
||||||
samp {
|
|
||||||
font-family: $font-family-monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inline code
|
|
||||||
code {
|
|
||||||
padding: 2px 4px;
|
|
||||||
font-size: 90%;
|
|
||||||
color: $code-color;
|
|
||||||
background-color: $code-bg;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
// User input typically entered via keyboard
|
|
||||||
kbd {
|
|
||||||
padding: 2px 4px;
|
|
||||||
font-size: 90%;
|
|
||||||
color: $kbd-color;
|
|
||||||
background-color: $kbd-bg;
|
|
||||||
border-radius: $border-radius-small;
|
|
||||||
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
|
|
||||||
|
|
||||||
kbd {
|
|
||||||
padding: 0;
|
|
||||||
font-size: 100%;
|
|
||||||
font-weight: bold;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blocks of code
|
|
||||||
pre {
|
|
||||||
display: block;
|
|
||||||
padding: (($line-height-computed - 1) / 2);
|
|
||||||
margin: 0 0 ($line-height-computed / 2);
|
|
||||||
font-size: ($font-size-base - 1); // 14px to 13px
|
|
||||||
line-height: $line-height-base;
|
|
||||||
word-break: break-all;
|
|
||||||
word-wrap: break-word;
|
|
||||||
color: $pre-color;
|
|
||||||
background-color: $pre-bg;
|
|
||||||
border: 1px solid $pre-border-color;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
|
|
||||||
// Account for some code outputs that place code tags in pre tags
|
|
||||||
code {
|
|
||||||
padding: 0;
|
|
||||||
font-size: inherit;
|
|
||||||
color: inherit;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
background-color: transparent;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable scrollable blocks of code
|
|
||||||
.pre-scrollable {
|
|
||||||
max-height: $pre-scrollable-max-height;
|
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
//
|
|
||||||
// Component animations
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Heads up!
|
|
||||||
//
|
|
||||||
// We don't use the `.opacity()` mixin here since it causes a bug with text
|
|
||||||
// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
|
|
||||||
|
|
||||||
.fade {
|
|
||||||
opacity: 0;
|
|
||||||
@include transition(opacity .15s linear);
|
|
||||||
&.in {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse {
|
|
||||||
display: none;
|
|
||||||
|
|
||||||
&.in { display: block; }
|
|
||||||
// [converter] extracted tr&.in to tr.collapse.in
|
|
||||||
// [converter] extracted tbody&.in to tbody.collapse.in
|
|
||||||
}
|
|
||||||
|
|
||||||
tr.collapse.in { display: table-row; }
|
|
||||||
|
|
||||||
tbody.collapse.in { display: table-row-group; }
|
|
||||||
|
|
||||||
.collapsing {
|
|
||||||
position: relative;
|
|
||||||
height: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
@include transition-property(height, visibility);
|
|
||||||
@include transition-duration(.35s);
|
|
||||||
@include transition-timing-function(ease);
|
|
||||||
}
|
|
|
@ -1,216 +0,0 @@
|
||||||
//
|
|
||||||
// Dropdown menus
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Dropdown arrow/caret
|
|
||||||
.caret {
|
|
||||||
display: inline-block;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
margin-left: 2px;
|
|
||||||
vertical-align: middle;
|
|
||||||
border-top: $caret-width-base dashed;
|
|
||||||
border-top: $caret-width-base solid \9; // IE8
|
|
||||||
border-right: $caret-width-base solid transparent;
|
|
||||||
border-left: $caret-width-base solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The dropdown wrapper (div)
|
|
||||||
.dropup,
|
|
||||||
.dropdown {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent the focus on the dropdown toggle when closing dropdowns
|
|
||||||
.dropdown-toggle:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The dropdown menu (ul)
|
|
||||||
.dropdown-menu {
|
|
||||||
position: absolute;
|
|
||||||
top: 100%;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-dropdown;
|
|
||||||
display: none; // none by default, but block on "open" of the menu
|
|
||||||
float: left;
|
|
||||||
min-width: 160px;
|
|
||||||
padding: 5px 0;
|
|
||||||
margin: 2px 0 0; // override default ul
|
|
||||||
list-style: none;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
|
|
||||||
background-color: $dropdown-bg;
|
|
||||||
border: 1px solid $dropdown-fallback-border; // IE8 fallback
|
|
||||||
border: 1px solid $dropdown-border;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
@include box-shadow(0 6px 12px rgba(0,0,0,.175));
|
|
||||||
background-clip: padding-box;
|
|
||||||
|
|
||||||
// Aligns the dropdown menu to right
|
|
||||||
//
|
|
||||||
// Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
|
|
||||||
&.pull-right {
|
|
||||||
right: 0;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dividers (basically an hr) within the dropdown
|
|
||||||
.divider {
|
|
||||||
@include nav-divider($dropdown-divider-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Links within the dropdown menu
|
|
||||||
> li > a {
|
|
||||||
display: block;
|
|
||||||
padding: 3px 20px;
|
|
||||||
clear: both;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
color: $dropdown-link-color;
|
|
||||||
white-space: nowrap; // prevent links from randomly breaking onto new lines
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover/Focus state
|
|
||||||
.dropdown-menu > li > a {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
color: $dropdown-link-hover-color;
|
|
||||||
background-color: $dropdown-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active state
|
|
||||||
.dropdown-menu > .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $dropdown-link-active-color;
|
|
||||||
text-decoration: none;
|
|
||||||
outline: 0;
|
|
||||||
background-color: $dropdown-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disabled state
|
|
||||||
//
|
|
||||||
// Gray out text and ensure the hover/focus state remains gray
|
|
||||||
|
|
||||||
.dropdown-menu > .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $dropdown-link-disabled-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nuke hover/focus effects
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: transparent;
|
|
||||||
background-image: none; // Remove CSS gradient
|
|
||||||
@include reset-filter;
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open state for the dropdown
|
|
||||||
.open {
|
|
||||||
// Show the menu
|
|
||||||
> .dropdown-menu {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the outline when :focus is triggered
|
|
||||||
> a {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Menu positioning
|
|
||||||
//
|
|
||||||
// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
|
|
||||||
// menu with the parent.
|
|
||||||
.dropdown-menu-right {
|
|
||||||
left: auto; // Reset the default from `.dropdown-menu`
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
// With v3, we enabled auto-flipping if you have a dropdown within a right
|
|
||||||
// aligned nav component. To enable the undoing of that, we provide an override
|
|
||||||
// to restore the default dropdown menu alignment.
|
|
||||||
//
|
|
||||||
// This is only for left-aligning a dropdown menu within a `.navbar-right` or
|
|
||||||
// `.pull-right` nav component.
|
|
||||||
.dropdown-menu-left {
|
|
||||||
left: 0;
|
|
||||||
right: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdown section headers
|
|
||||||
.dropdown-header {
|
|
||||||
display: block;
|
|
||||||
padding: 3px 20px;
|
|
||||||
font-size: $font-size-small;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
color: $dropdown-header-color;
|
|
||||||
white-space: nowrap; // as with > li > a
|
|
||||||
}
|
|
||||||
|
|
||||||
// Backdrop to catch body clicks on mobile, etc.
|
|
||||||
.dropdown-backdrop {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: ($zindex-dropdown - 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Right aligned dropdowns
|
|
||||||
.pull-right > .dropdown-menu {
|
|
||||||
right: 0;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow for dropdowns to go bottom up (aka, dropup-menu)
|
|
||||||
//
|
|
||||||
// Just add .dropup after the standard .dropdown class and you're set, bro.
|
|
||||||
// TODO: abstract this so that the navbar fixed styles are not placed here?
|
|
||||||
|
|
||||||
.dropup,
|
|
||||||
.navbar-fixed-bottom .dropdown {
|
|
||||||
// Reverse the caret
|
|
||||||
.caret {
|
|
||||||
border-top: 0;
|
|
||||||
border-bottom: $caret-width-base dashed;
|
|
||||||
border-bottom: $caret-width-base solid \9; // IE8
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
// Different positioning for bottom up menu
|
|
||||||
.dropdown-menu {
|
|
||||||
top: auto;
|
|
||||||
bottom: 100%;
|
|
||||||
margin-bottom: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Component alignment
|
|
||||||
//
|
|
||||||
// Reiterate per navbar.less and the modified component alignment there.
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
.navbar-right {
|
|
||||||
.dropdown-menu {
|
|
||||||
right: 0; left: auto;
|
|
||||||
}
|
|
||||||
// Necessary for overrides of the default right aligned menu.
|
|
||||||
// Will remove come v4 in all likelihood.
|
|
||||||
.dropdown-menu-left {
|
|
||||||
left: 0; right: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,617 +0,0 @@
|
||||||
//
|
|
||||||
// Forms
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Normalize non-controls
|
|
||||||
//
|
|
||||||
// Restyle and baseline non-control form elements.
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
// Chrome and Firefox set a `min-width: min-content;` on fieldsets,
|
|
||||||
// so we reset that to ensure it behaves more like a standard block element.
|
|
||||||
// See https://github.com/twbs/bootstrap/issues/12359.
|
|
||||||
min-width: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
legend {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
padding: 0;
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
font-size: ($font-size-base * 1.5);
|
|
||||||
line-height: inherit;
|
|
||||||
color: $legend-color;
|
|
||||||
border: 0;
|
|
||||||
border-bottom: 1px solid $legend-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
|
|
||||||
margin-bottom: 5px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Normalize form controls
|
|
||||||
//
|
|
||||||
// While most of our form styles require extra classes, some basic normalization
|
|
||||||
// is required to ensure optimum display with or without those classes to better
|
|
||||||
// address browser inconsistencies.
|
|
||||||
|
|
||||||
// Override content-box in Normalize (* isn't specific enough)
|
|
||||||
input[type="search"] {
|
|
||||||
@include box-sizing(border-box);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Position radios and checkboxes better
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
margin: 4px 0 0;
|
|
||||||
margin-top: 1px \9; // IE8-9
|
|
||||||
line-height: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type="file"] {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make range inputs behave like textual form controls
|
|
||||||
input[type="range"] {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make multiple select elements height not fixed
|
|
||||||
select[multiple],
|
|
||||||
select[size] {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Focus for file, radio, and checkbox
|
|
||||||
input[type="file"]:focus,
|
|
||||||
input[type="radio"]:focus,
|
|
||||||
input[type="checkbox"]:focus {
|
|
||||||
@include tab-focus;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adjust output element
|
|
||||||
output {
|
|
||||||
display: block;
|
|
||||||
padding-top: ($padding-base-vertical + 1);
|
|
||||||
font-size: $font-size-base;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
color: $input-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Common form controls
|
|
||||||
//
|
|
||||||
// Shared size and type resets for form controls. Apply `.form-control` to any
|
|
||||||
// of the following form controls:
|
|
||||||
//
|
|
||||||
// select
|
|
||||||
// textarea
|
|
||||||
// input[type="text"]
|
|
||||||
// input[type="password"]
|
|
||||||
// input[type="datetime"]
|
|
||||||
// input[type="datetime-local"]
|
|
||||||
// input[type="date"]
|
|
||||||
// input[type="month"]
|
|
||||||
// input[type="time"]
|
|
||||||
// input[type="week"]
|
|
||||||
// input[type="number"]
|
|
||||||
// input[type="email"]
|
|
||||||
// input[type="url"]
|
|
||||||
// input[type="search"]
|
|
||||||
// input[type="tel"]
|
|
||||||
// input[type="color"]
|
|
||||||
|
|
||||||
.form-control {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
|
|
||||||
padding: $padding-base-vertical $padding-base-horizontal;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
color: $input-color;
|
|
||||||
background-color: $input-bg;
|
|
||||||
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
|
|
||||||
border: 1px solid $input-border;
|
|
||||||
border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
|
|
||||||
@include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
|
|
||||||
@include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
|
|
||||||
|
|
||||||
// Customize the `:focus` state to imitate native WebKit styles.
|
|
||||||
@include form-control-focus;
|
|
||||||
|
|
||||||
// Placeholder
|
|
||||||
@include placeholder;
|
|
||||||
|
|
||||||
// Unstyle the caret on `<select>`s in IE10+.
|
|
||||||
&::-ms-expand {
|
|
||||||
border: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disabled and read-only inputs
|
|
||||||
//
|
|
||||||
// HTML5 says that controls under a fieldset > legend:first-child won't be
|
|
||||||
// disabled if the fieldset is disabled. Due to implementation difficulty, we
|
|
||||||
// don't honor that edge case; we style them as disabled anyway.
|
|
||||||
&[disabled],
|
|
||||||
&[readonly],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
background-color: $input-bg-disabled;
|
|
||||||
opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655
|
|
||||||
}
|
|
||||||
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
// [converter] extracted textarea& to textarea.form-control
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset height for `textarea`s
|
|
||||||
textarea.form-control {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Search inputs in iOS
|
|
||||||
//
|
|
||||||
// This overrides the extra rounded corners on search inputs in iOS so that our
|
|
||||||
// `.form-control` class can properly style them. Note that this cannot simply
|
|
||||||
// be added to `.form-control` as it's not specific enough. For details, see
|
|
||||||
// https://github.com/twbs/bootstrap/issues/11586.
|
|
||||||
|
|
||||||
input[type="search"] {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Special styles for iOS temporal inputs
|
|
||||||
//
|
|
||||||
// In Mobile Safari, setting `display: block` on temporal inputs causes the
|
|
||||||
// text within the input to become vertically misaligned. As a workaround, we
|
|
||||||
// set a pixel line-height that matches the given height of the input, but only
|
|
||||||
// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
|
|
||||||
//
|
|
||||||
// Note that as of 8.3, iOS doesn't support `datetime` or `week`.
|
|
||||||
|
|
||||||
@media screen and (-webkit-min-device-pixel-ratio: 0) {
|
|
||||||
input[type="date"],
|
|
||||||
input[type="time"],
|
|
||||||
input[type="datetime-local"],
|
|
||||||
input[type="month"] {
|
|
||||||
&.form-control {
|
|
||||||
line-height: $input-height-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.input-sm,
|
|
||||||
.input-group-sm & {
|
|
||||||
line-height: $input-height-small;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.input-lg,
|
|
||||||
.input-group-lg & {
|
|
||||||
line-height: $input-height-large;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Form groups
|
|
||||||
//
|
|
||||||
// Designed to help with the organization and spacing of vertical forms. For
|
|
||||||
// horizontal forms, use the predefined grid classes.
|
|
||||||
|
|
||||||
.form-group {
|
|
||||||
margin-bottom: $form-group-margin-bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checkboxes and radios
|
|
||||||
//
|
|
||||||
// Indent the labels to position radios/checkboxes as hanging controls.
|
|
||||||
|
|
||||||
.radio,
|
|
||||||
.checkbox {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
|
|
||||||
label {
|
|
||||||
min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text
|
|
||||||
padding-left: 20px;
|
|
||||||
margin-bottom: 0;
|
|
||||||
font-weight: normal;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.radio input[type="radio"],
|
|
||||||
.radio-inline input[type="radio"],
|
|
||||||
.checkbox input[type="checkbox"],
|
|
||||||
.checkbox-inline input[type="checkbox"] {
|
|
||||||
position: absolute;
|
|
||||||
margin-left: -20px;
|
|
||||||
margin-top: 4px \9;
|
|
||||||
}
|
|
||||||
|
|
||||||
.radio + .radio,
|
|
||||||
.checkbox + .checkbox {
|
|
||||||
margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
|
|
||||||
}
|
|
||||||
|
|
||||||
// Radios and checkboxes on same line
|
|
||||||
.radio-inline,
|
|
||||||
.checkbox-inline {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 20px;
|
|
||||||
margin-bottom: 0;
|
|
||||||
vertical-align: middle;
|
|
||||||
font-weight: normal;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.radio-inline + .radio-inline,
|
|
||||||
.checkbox-inline + .checkbox-inline {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-left: 10px; // space out consecutive inline controls
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply same disabled cursor tweak as for inputs
|
|
||||||
// Some special care is needed because <label>s don't inherit their parent's `cursor`.
|
|
||||||
//
|
|
||||||
// Note: Neither radios nor checkboxes can be readonly.
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
&[disabled],
|
|
||||||
&.disabled,
|
|
||||||
fieldset[disabled] & {
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// These classes are used directly on <label>s
|
|
||||||
.radio-inline,
|
|
||||||
.checkbox-inline {
|
|
||||||
&.disabled,
|
|
||||||
fieldset[disabled] & {
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// These classes are used on elements with <label> descendants
|
|
||||||
.radio,
|
|
||||||
.checkbox {
|
|
||||||
&.disabled,
|
|
||||||
fieldset[disabled] & {
|
|
||||||
label {
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Static form control text
|
|
||||||
//
|
|
||||||
// Apply class to a `p` element to make any string of text align with labels in
|
|
||||||
// a horizontal form layout.
|
|
||||||
|
|
||||||
.form-control-static {
|
|
||||||
// Size it appropriately next to real form controls
|
|
||||||
padding-top: ($padding-base-vertical + 1);
|
|
||||||
padding-bottom: ($padding-base-vertical + 1);
|
|
||||||
// Remove default margin from `p`
|
|
||||||
margin-bottom: 0;
|
|
||||||
min-height: ($line-height-computed + $font-size-base);
|
|
||||||
|
|
||||||
&.input-lg,
|
|
||||||
&.input-sm {
|
|
||||||
padding-left: 0;
|
|
||||||
padding-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Form control sizing
|
|
||||||
//
|
|
||||||
// Build on `.form-control` with modifier classes to decrease or increase the
|
|
||||||
// height and font-size of form controls.
|
|
||||||
//
|
|
||||||
// The `.form-group-* form-control` variations are sadly duplicated to avoid the
|
|
||||||
// issue documented in https://github.com/twbs/bootstrap/issues/15074.
|
|
||||||
|
|
||||||
@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);
|
|
||||||
.form-group-sm {
|
|
||||||
.form-control {
|
|
||||||
height: $input-height-small;
|
|
||||||
padding: $padding-small-vertical $padding-small-horizontal;
|
|
||||||
font-size: $font-size-small;
|
|
||||||
line-height: $line-height-small;
|
|
||||||
border-radius: $input-border-radius-small;
|
|
||||||
}
|
|
||||||
select.form-control {
|
|
||||||
height: $input-height-small;
|
|
||||||
line-height: $input-height-small;
|
|
||||||
}
|
|
||||||
textarea.form-control,
|
|
||||||
select[multiple].form-control {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
.form-control-static {
|
|
||||||
height: $input-height-small;
|
|
||||||
min-height: ($line-height-computed + $font-size-small);
|
|
||||||
padding: ($padding-small-vertical + 1) $padding-small-horizontal;
|
|
||||||
font-size: $font-size-small;
|
|
||||||
line-height: $line-height-small;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);
|
|
||||||
.form-group-lg {
|
|
||||||
.form-control {
|
|
||||||
height: $input-height-large;
|
|
||||||
padding: $padding-large-vertical $padding-large-horizontal;
|
|
||||||
font-size: $font-size-large;
|
|
||||||
line-height: $line-height-large;
|
|
||||||
border-radius: $input-border-radius-large;
|
|
||||||
}
|
|
||||||
select.form-control {
|
|
||||||
height: $input-height-large;
|
|
||||||
line-height: $input-height-large;
|
|
||||||
}
|
|
||||||
textarea.form-control,
|
|
||||||
select[multiple].form-control {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
.form-control-static {
|
|
||||||
height: $input-height-large;
|
|
||||||
min-height: ($line-height-computed + $font-size-large);
|
|
||||||
padding: ($padding-large-vertical + 1) $padding-large-horizontal;
|
|
||||||
font-size: $font-size-large;
|
|
||||||
line-height: $line-height-large;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Form control feedback states
|
|
||||||
//
|
|
||||||
// Apply contextual and semantic states to individual form controls.
|
|
||||||
|
|
||||||
.has-feedback {
|
|
||||||
// Enable absolute positioning
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
// Ensure icons don't overlap text
|
|
||||||
.form-control {
|
|
||||||
padding-right: ($input-height-base * 1.25);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Feedback icon (requires .glyphicon classes)
|
|
||||||
.form-control-feedback {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
z-index: 2; // Ensure icon is above input groups
|
|
||||||
display: block;
|
|
||||||
width: $input-height-base;
|
|
||||||
height: $input-height-base;
|
|
||||||
line-height: $input-height-base;
|
|
||||||
text-align: center;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.input-lg + .form-control-feedback,
|
|
||||||
.input-group-lg + .form-control-feedback,
|
|
||||||
.form-group-lg .form-control + .form-control-feedback {
|
|
||||||
width: $input-height-large;
|
|
||||||
height: $input-height-large;
|
|
||||||
line-height: $input-height-large;
|
|
||||||
}
|
|
||||||
.input-sm + .form-control-feedback,
|
|
||||||
.input-group-sm + .form-control-feedback,
|
|
||||||
.form-group-sm .form-control + .form-control-feedback {
|
|
||||||
width: $input-height-small;
|
|
||||||
height: $input-height-small;
|
|
||||||
line-height: $input-height-small;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Feedback states
|
|
||||||
.has-success {
|
|
||||||
@include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
|
|
||||||
}
|
|
||||||
.has-warning {
|
|
||||||
@include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
|
|
||||||
}
|
|
||||||
.has-error {
|
|
||||||
@include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reposition feedback icon if input has visible label above
|
|
||||||
.has-feedback label {
|
|
||||||
|
|
||||||
& ~ .form-control-feedback {
|
|
||||||
top: ($line-height-computed + 5); // Height of the `label` and its margin
|
|
||||||
}
|
|
||||||
&.sr-only ~ .form-control-feedback {
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Help text
|
|
||||||
//
|
|
||||||
// Apply to any element you wish to create light text for placement immediately
|
|
||||||
// below a form control. Use for general help, formatting, or instructional text.
|
|
||||||
|
|
||||||
.help-block {
|
|
||||||
display: block; // account for any element using help-block
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
color: lighten($text-color, 25%); // lighten the text some for contrast
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Inline forms
|
|
||||||
//
|
|
||||||
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
|
|
||||||
// forms begin stacked on extra small (mobile) devices and then go inline when
|
|
||||||
// viewports reach <768px.
|
|
||||||
//
|
|
||||||
// Requires wrapping inputs and labels with `.form-group` for proper display of
|
|
||||||
// default HTML form controls and our custom form controls (e.g., input groups).
|
|
||||||
//
|
|
||||||
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
|
|
||||||
|
|
||||||
// [converter] extracted from `.form-inline` for libsass compatibility
|
|
||||||
@mixin form-inline {
|
|
||||||
|
|
||||||
// Kick in the inline
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
// Inline-block all the things for "inline"
|
|
||||||
.form-group {
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: 0;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// In navbar-form, allow folks to *not* use `.form-group`
|
|
||||||
.form-control {
|
|
||||||
display: inline-block;
|
|
||||||
width: auto; // Prevent labels from stacking above inputs in `.form-group`
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make static controls behave like regular ones
|
|
||||||
.form-control-static {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group {
|
|
||||||
display: inline-table;
|
|
||||||
vertical-align: middle;
|
|
||||||
|
|
||||||
.input-group-addon,
|
|
||||||
.input-group-btn,
|
|
||||||
.form-control {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Input groups need that 100% width though
|
|
||||||
.input-group > .form-control {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.control-label {
|
|
||||||
margin-bottom: 0;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove default margin on radios/checkboxes that were used for stacking, and
|
|
||||||
// then undo the floating of radios and checkboxes to match.
|
|
||||||
.radio,
|
|
||||||
.checkbox {
|
|
||||||
display: inline-block;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
vertical-align: middle;
|
|
||||||
|
|
||||||
label {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.radio input[type="radio"],
|
|
||||||
.checkbox input[type="checkbox"] {
|
|
||||||
position: relative;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Re-override the feedback icon.
|
|
||||||
.has-feedback .form-control-feedback {
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// [converter] extracted as `@mixin form-inline` for libsass compatibility
|
|
||||||
.form-inline {
|
|
||||||
@include form-inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Horizontal forms
|
|
||||||
//
|
|
||||||
// Horizontal forms are built on grid classes and allow you to create forms with
|
|
||||||
// labels on the left and inputs on the right.
|
|
||||||
|
|
||||||
.form-horizontal {
|
|
||||||
|
|
||||||
// Consistent vertical alignment of radios and checkboxes
|
|
||||||
//
|
|
||||||
// Labels also get some reset styles, but that is scoped to a media query below.
|
|
||||||
.radio,
|
|
||||||
.checkbox,
|
|
||||||
.radio-inline,
|
|
||||||
.checkbox-inline {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding-top: ($padding-base-vertical + 1); // Default padding plus a border
|
|
||||||
}
|
|
||||||
// Account for padding we're adding to ensure the alignment and of help text
|
|
||||||
// and other content below items
|
|
||||||
.radio,
|
|
||||||
.checkbox {
|
|
||||||
min-height: ($line-height-computed + ($padding-base-vertical + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make form groups behave like rows
|
|
||||||
.form-group {
|
|
||||||
@include make-row;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset spacing and right align labels, but scope to media queries so that
|
|
||||||
// labels on narrow viewports stack the same as a default form example.
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
.control-label {
|
|
||||||
text-align: right;
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding-top: ($padding-base-vertical + 1); // Default padding plus a border
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validation states
|
|
||||||
//
|
|
||||||
// Reposition the icon because it's now within a grid column and columns have
|
|
||||||
// `position: relative;` on them. Also accounts for the grid gutter padding.
|
|
||||||
.has-feedback .form-control-feedback {
|
|
||||||
right: floor(($grid-gutter-width / 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Form group sizes
|
|
||||||
//
|
|
||||||
// Quick utility class for applying `.input-lg` and `.input-sm` styles to the
|
|
||||||
// inputs and labels within a `.form-group`.
|
|
||||||
.form-group-lg {
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
.control-label {
|
|
||||||
padding-top: ($padding-large-vertical + 1);
|
|
||||||
font-size: $font-size-large;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.form-group-sm {
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
.control-label {
|
|
||||||
padding-top: ($padding-small-vertical + 1);
|
|
||||||
font-size: $font-size-small;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,307 +0,0 @@
|
||||||
//
|
|
||||||
// Glyphicons for Bootstrap
|
|
||||||
//
|
|
||||||
// Since icons are fonts, they can be placed anywhere text is placed and are
|
|
||||||
// thus automatically sized to match the surrounding child. To use, create an
|
|
||||||
// inline element with the appropriate classes, like so:
|
|
||||||
//
|
|
||||||
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
|
|
||||||
|
|
||||||
@at-root {
|
|
||||||
// Import the fonts
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Glyphicons Halflings';
|
|
||||||
src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
|
|
||||||
src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
|
|
||||||
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),
|
|
||||||
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
|
|
||||||
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
|
|
||||||
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Catchall baseclass
|
|
||||||
.glyphicon {
|
|
||||||
position: relative;
|
|
||||||
top: 1px;
|
|
||||||
display: inline-block;
|
|
||||||
font-family: 'Glyphicons Halflings';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Individual icons
|
|
||||||
.glyphicon-asterisk { &:before { content: "\002a"; } }
|
|
||||||
.glyphicon-plus { &:before { content: "\002b"; } }
|
|
||||||
.glyphicon-euro,
|
|
||||||
.glyphicon-eur { &:before { content: "\20ac"; } }
|
|
||||||
.glyphicon-minus { &:before { content: "\2212"; } }
|
|
||||||
.glyphicon-cloud { &:before { content: "\2601"; } }
|
|
||||||
.glyphicon-envelope { &:before { content: "\2709"; } }
|
|
||||||
.glyphicon-pencil { &:before { content: "\270f"; } }
|
|
||||||
.glyphicon-glass { &:before { content: "\e001"; } }
|
|
||||||
.glyphicon-music { &:before { content: "\e002"; } }
|
|
||||||
.glyphicon-search { &:before { content: "\e003"; } }
|
|
||||||
.glyphicon-heart { &:before { content: "\e005"; } }
|
|
||||||
.glyphicon-star { &:before { content: "\e006"; } }
|
|
||||||
.glyphicon-star-empty { &:before { content: "\e007"; } }
|
|
||||||
.glyphicon-user { &:before { content: "\e008"; } }
|
|
||||||
.glyphicon-film { &:before { content: "\e009"; } }
|
|
||||||
.glyphicon-th-large { &:before { content: "\e010"; } }
|
|
||||||
.glyphicon-th { &:before { content: "\e011"; } }
|
|
||||||
.glyphicon-th-list { &:before { content: "\e012"; } }
|
|
||||||
.glyphicon-ok { &:before { content: "\e013"; } }
|
|
||||||
.glyphicon-remove { &:before { content: "\e014"; } }
|
|
||||||
.glyphicon-zoom-in { &:before { content: "\e015"; } }
|
|
||||||
.glyphicon-zoom-out { &:before { content: "\e016"; } }
|
|
||||||
.glyphicon-off { &:before { content: "\e017"; } }
|
|
||||||
.glyphicon-signal { &:before { content: "\e018"; } }
|
|
||||||
.glyphicon-cog { &:before { content: "\e019"; } }
|
|
||||||
.glyphicon-trash { &:before { content: "\e020"; } }
|
|
||||||
.glyphicon-home { &:before { content: "\e021"; } }
|
|
||||||
.glyphicon-file { &:before { content: "\e022"; } }
|
|
||||||
.glyphicon-time { &:before { content: "\e023"; } }
|
|
||||||
.glyphicon-road { &:before { content: "\e024"; } }
|
|
||||||
.glyphicon-download-alt { &:before { content: "\e025"; } }
|
|
||||||
.glyphicon-download { &:before { content: "\e026"; } }
|
|
||||||
.glyphicon-upload { &:before { content: "\e027"; } }
|
|
||||||
.glyphicon-inbox { &:before { content: "\e028"; } }
|
|
||||||
.glyphicon-play-circle { &:before { content: "\e029"; } }
|
|
||||||
.glyphicon-repeat { &:before { content: "\e030"; } }
|
|
||||||
.glyphicon-refresh { &:before { content: "\e031"; } }
|
|
||||||
.glyphicon-list-alt { &:before { content: "\e032"; } }
|
|
||||||
.glyphicon-lock { &:before { content: "\e033"; } }
|
|
||||||
.glyphicon-flag { &:before { content: "\e034"; } }
|
|
||||||
.glyphicon-headphones { &:before { content: "\e035"; } }
|
|
||||||
.glyphicon-volume-off { &:before { content: "\e036"; } }
|
|
||||||
.glyphicon-volume-down { &:before { content: "\e037"; } }
|
|
||||||
.glyphicon-volume-up { &:before { content: "\e038"; } }
|
|
||||||
.glyphicon-qrcode { &:before { content: "\e039"; } }
|
|
||||||
.glyphicon-barcode { &:before { content: "\e040"; } }
|
|
||||||
.glyphicon-tag { &:before { content: "\e041"; } }
|
|
||||||
.glyphicon-tags { &:before { content: "\e042"; } }
|
|
||||||
.glyphicon-book { &:before { content: "\e043"; } }
|
|
||||||
.glyphicon-bookmark { &:before { content: "\e044"; } }
|
|
||||||
.glyphicon-print { &:before { content: "\e045"; } }
|
|
||||||
.glyphicon-camera { &:before { content: "\e046"; } }
|
|
||||||
.glyphicon-font { &:before { content: "\e047"; } }
|
|
||||||
.glyphicon-bold { &:before { content: "\e048"; } }
|
|
||||||
.glyphicon-italic { &:before { content: "\e049"; } }
|
|
||||||
.glyphicon-text-height { &:before { content: "\e050"; } }
|
|
||||||
.glyphicon-text-width { &:before { content: "\e051"; } }
|
|
||||||
.glyphicon-align-left { &:before { content: "\e052"; } }
|
|
||||||
.glyphicon-align-center { &:before { content: "\e053"; } }
|
|
||||||
.glyphicon-align-right { &:before { content: "\e054"; } }
|
|
||||||
.glyphicon-align-justify { &:before { content: "\e055"; } }
|
|
||||||
.glyphicon-list { &:before { content: "\e056"; } }
|
|
||||||
.glyphicon-indent-left { &:before { content: "\e057"; } }
|
|
||||||
.glyphicon-indent-right { &:before { content: "\e058"; } }
|
|
||||||
.glyphicon-facetime-video { &:before { content: "\e059"; } }
|
|
||||||
.glyphicon-picture { &:before { content: "\e060"; } }
|
|
||||||
.glyphicon-map-marker { &:before { content: "\e062"; } }
|
|
||||||
.glyphicon-adjust { &:before { content: "\e063"; } }
|
|
||||||
.glyphicon-tint { &:before { content: "\e064"; } }
|
|
||||||
.glyphicon-edit { &:before { content: "\e065"; } }
|
|
||||||
.glyphicon-share { &:before { content: "\e066"; } }
|
|
||||||
.glyphicon-check { &:before { content: "\e067"; } }
|
|
||||||
.glyphicon-move { &:before { content: "\e068"; } }
|
|
||||||
.glyphicon-step-backward { &:before { content: "\e069"; } }
|
|
||||||
.glyphicon-fast-backward { &:before { content: "\e070"; } }
|
|
||||||
.glyphicon-backward { &:before { content: "\e071"; } }
|
|
||||||
.glyphicon-play { &:before { content: "\e072"; } }
|
|
||||||
.glyphicon-pause { &:before { content: "\e073"; } }
|
|
||||||
.glyphicon-stop { &:before { content: "\e074"; } }
|
|
||||||
.glyphicon-forward { &:before { content: "\e075"; } }
|
|
||||||
.glyphicon-fast-forward { &:before { content: "\e076"; } }
|
|
||||||
.glyphicon-step-forward { &:before { content: "\e077"; } }
|
|
||||||
.glyphicon-eject { &:before { content: "\e078"; } }
|
|
||||||
.glyphicon-chevron-left { &:before { content: "\e079"; } }
|
|
||||||
.glyphicon-chevron-right { &:before { content: "\e080"; } }
|
|
||||||
.glyphicon-plus-sign { &:before { content: "\e081"; } }
|
|
||||||
.glyphicon-minus-sign { &:before { content: "\e082"; } }
|
|
||||||
.glyphicon-remove-sign { &:before { content: "\e083"; } }
|
|
||||||
.glyphicon-ok-sign { &:before { content: "\e084"; } }
|
|
||||||
.glyphicon-question-sign { &:before { content: "\e085"; } }
|
|
||||||
.glyphicon-info-sign { &:before { content: "\e086"; } }
|
|
||||||
.glyphicon-screenshot { &:before { content: "\e087"; } }
|
|
||||||
.glyphicon-remove-circle { &:before { content: "\e088"; } }
|
|
||||||
.glyphicon-ok-circle { &:before { content: "\e089"; } }
|
|
||||||
.glyphicon-ban-circle { &:before { content: "\e090"; } }
|
|
||||||
.glyphicon-arrow-left { &:before { content: "\e091"; } }
|
|
||||||
.glyphicon-arrow-right { &:before { content: "\e092"; } }
|
|
||||||
.glyphicon-arrow-up { &:before { content: "\e093"; } }
|
|
||||||
.glyphicon-arrow-down { &:before { content: "\e094"; } }
|
|
||||||
.glyphicon-share-alt { &:before { content: "\e095"; } }
|
|
||||||
.glyphicon-resize-full { &:before { content: "\e096"; } }
|
|
||||||
.glyphicon-resize-small { &:before { content: "\e097"; } }
|
|
||||||
.glyphicon-exclamation-sign { &:before { content: "\e101"; } }
|
|
||||||
.glyphicon-gift { &:before { content: "\e102"; } }
|
|
||||||
.glyphicon-leaf { &:before { content: "\e103"; } }
|
|
||||||
.glyphicon-fire { &:before { content: "\e104"; } }
|
|
||||||
.glyphicon-eye-open { &:before { content: "\e105"; } }
|
|
||||||
.glyphicon-eye-close { &:before { content: "\e106"; } }
|
|
||||||
.glyphicon-warning-sign { &:before { content: "\e107"; } }
|
|
||||||
.glyphicon-plane { &:before { content: "\e108"; } }
|
|
||||||
.glyphicon-calendar { &:before { content: "\e109"; } }
|
|
||||||
.glyphicon-random { &:before { content: "\e110"; } }
|
|
||||||
.glyphicon-comment { &:before { content: "\e111"; } }
|
|
||||||
.glyphicon-magnet { &:before { content: "\e112"; } }
|
|
||||||
.glyphicon-chevron-up { &:before { content: "\e113"; } }
|
|
||||||
.glyphicon-chevron-down { &:before { content: "\e114"; } }
|
|
||||||
.glyphicon-retweet { &:before { content: "\e115"; } }
|
|
||||||
.glyphicon-shopping-cart { &:before { content: "\e116"; } }
|
|
||||||
.glyphicon-folder-close { &:before { content: "\e117"; } }
|
|
||||||
.glyphicon-folder-open { &:before { content: "\e118"; } }
|
|
||||||
.glyphicon-resize-vertical { &:before { content: "\e119"; } }
|
|
||||||
.glyphicon-resize-horizontal { &:before { content: "\e120"; } }
|
|
||||||
.glyphicon-hdd { &:before { content: "\e121"; } }
|
|
||||||
.glyphicon-bullhorn { &:before { content: "\e122"; } }
|
|
||||||
.glyphicon-bell { &:before { content: "\e123"; } }
|
|
||||||
.glyphicon-certificate { &:before { content: "\e124"; } }
|
|
||||||
.glyphicon-thumbs-up { &:before { content: "\e125"; } }
|
|
||||||
.glyphicon-thumbs-down { &:before { content: "\e126"; } }
|
|
||||||
.glyphicon-hand-right { &:before { content: "\e127"; } }
|
|
||||||
.glyphicon-hand-left { &:before { content: "\e128"; } }
|
|
||||||
.glyphicon-hand-up { &:before { content: "\e129"; } }
|
|
||||||
.glyphicon-hand-down { &:before { content: "\e130"; } }
|
|
||||||
.glyphicon-circle-arrow-right { &:before { content: "\e131"; } }
|
|
||||||
.glyphicon-circle-arrow-left { &:before { content: "\e132"; } }
|
|
||||||
.glyphicon-circle-arrow-up { &:before { content: "\e133"; } }
|
|
||||||
.glyphicon-circle-arrow-down { &:before { content: "\e134"; } }
|
|
||||||
.glyphicon-globe { &:before { content: "\e135"; } }
|
|
||||||
.glyphicon-wrench { &:before { content: "\e136"; } }
|
|
||||||
.glyphicon-tasks { &:before { content: "\e137"; } }
|
|
||||||
.glyphicon-filter { &:before { content: "\e138"; } }
|
|
||||||
.glyphicon-briefcase { &:before { content: "\e139"; } }
|
|
||||||
.glyphicon-fullscreen { &:before { content: "\e140"; } }
|
|
||||||
.glyphicon-dashboard { &:before { content: "\e141"; } }
|
|
||||||
.glyphicon-paperclip { &:before { content: "\e142"; } }
|
|
||||||
.glyphicon-heart-empty { &:before { content: "\e143"; } }
|
|
||||||
.glyphicon-link { &:before { content: "\e144"; } }
|
|
||||||
.glyphicon-phone { &:before { content: "\e145"; } }
|
|
||||||
.glyphicon-pushpin { &:before { content: "\e146"; } }
|
|
||||||
.glyphicon-usd { &:before { content: "\e148"; } }
|
|
||||||
.glyphicon-gbp { &:before { content: "\e149"; } }
|
|
||||||
.glyphicon-sort { &:before { content: "\e150"; } }
|
|
||||||
.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } }
|
|
||||||
.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } }
|
|
||||||
.glyphicon-sort-by-order { &:before { content: "\e153"; } }
|
|
||||||
.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } }
|
|
||||||
.glyphicon-sort-by-attributes { &:before { content: "\e155"; } }
|
|
||||||
.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
|
|
||||||
.glyphicon-unchecked { &:before { content: "\e157"; } }
|
|
||||||
.glyphicon-expand { &:before { content: "\e158"; } }
|
|
||||||
.glyphicon-collapse-down { &:before { content: "\e159"; } }
|
|
||||||
.glyphicon-collapse-up { &:before { content: "\e160"; } }
|
|
||||||
.glyphicon-log-in { &:before { content: "\e161"; } }
|
|
||||||
.glyphicon-flash { &:before { content: "\e162"; } }
|
|
||||||
.glyphicon-log-out { &:before { content: "\e163"; } }
|
|
||||||
.glyphicon-new-window { &:before { content: "\e164"; } }
|
|
||||||
.glyphicon-record { &:before { content: "\e165"; } }
|
|
||||||
.glyphicon-save { &:before { content: "\e166"; } }
|
|
||||||
.glyphicon-open { &:before { content: "\e167"; } }
|
|
||||||
.glyphicon-saved { &:before { content: "\e168"; } }
|
|
||||||
.glyphicon-import { &:before { content: "\e169"; } }
|
|
||||||
.glyphicon-export { &:before { content: "\e170"; } }
|
|
||||||
.glyphicon-send { &:before { content: "\e171"; } }
|
|
||||||
.glyphicon-floppy-disk { &:before { content: "\e172"; } }
|
|
||||||
.glyphicon-floppy-saved { &:before { content: "\e173"; } }
|
|
||||||
.glyphicon-floppy-remove { &:before { content: "\e174"; } }
|
|
||||||
.glyphicon-floppy-save { &:before { content: "\e175"; } }
|
|
||||||
.glyphicon-floppy-open { &:before { content: "\e176"; } }
|
|
||||||
.glyphicon-credit-card { &:before { content: "\e177"; } }
|
|
||||||
.glyphicon-transfer { &:before { content: "\e178"; } }
|
|
||||||
.glyphicon-cutlery { &:before { content: "\e179"; } }
|
|
||||||
.glyphicon-header { &:before { content: "\e180"; } }
|
|
||||||
.glyphicon-compressed { &:before { content: "\e181"; } }
|
|
||||||
.glyphicon-earphone { &:before { content: "\e182"; } }
|
|
||||||
.glyphicon-phone-alt { &:before { content: "\e183"; } }
|
|
||||||
.glyphicon-tower { &:before { content: "\e184"; } }
|
|
||||||
.glyphicon-stats { &:before { content: "\e185"; } }
|
|
||||||
.glyphicon-sd-video { &:before { content: "\e186"; } }
|
|
||||||
.glyphicon-hd-video { &:before { content: "\e187"; } }
|
|
||||||
.glyphicon-subtitles { &:before { content: "\e188"; } }
|
|
||||||
.glyphicon-sound-stereo { &:before { content: "\e189"; } }
|
|
||||||
.glyphicon-sound-dolby { &:before { content: "\e190"; } }
|
|
||||||
.glyphicon-sound-5-1 { &:before { content: "\e191"; } }
|
|
||||||
.glyphicon-sound-6-1 { &:before { content: "\e192"; } }
|
|
||||||
.glyphicon-sound-7-1 { &:before { content: "\e193"; } }
|
|
||||||
.glyphicon-copyright-mark { &:before { content: "\e194"; } }
|
|
||||||
.glyphicon-registration-mark { &:before { content: "\e195"; } }
|
|
||||||
.glyphicon-cloud-download { &:before { content: "\e197"; } }
|
|
||||||
.glyphicon-cloud-upload { &:before { content: "\e198"; } }
|
|
||||||
.glyphicon-tree-conifer { &:before { content: "\e199"; } }
|
|
||||||
.glyphicon-tree-deciduous { &:before { content: "\e200"; } }
|
|
||||||
.glyphicon-cd { &:before { content: "\e201"; } }
|
|
||||||
.glyphicon-save-file { &:before { content: "\e202"; } }
|
|
||||||
.glyphicon-open-file { &:before { content: "\e203"; } }
|
|
||||||
.glyphicon-level-up { &:before { content: "\e204"; } }
|
|
||||||
.glyphicon-copy { &:before { content: "\e205"; } }
|
|
||||||
.glyphicon-paste { &:before { content: "\e206"; } }
|
|
||||||
// The following 2 Glyphicons are omitted for the time being because
|
|
||||||
// they currently use Unicode codepoints that are outside the
|
|
||||||
// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
|
|
||||||
// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
|
|
||||||
// Notably, the bug affects some older versions of the Android Browser.
|
|
||||||
// More info: https://github.com/twbs/bootstrap/issues/10106
|
|
||||||
// .glyphicon-door { &:before { content: "\1f6aa"; } }
|
|
||||||
// .glyphicon-key { &:before { content: "\1f511"; } }
|
|
||||||
.glyphicon-alert { &:before { content: "\e209"; } }
|
|
||||||
.glyphicon-equalizer { &:before { content: "\e210"; } }
|
|
||||||
.glyphicon-king { &:before { content: "\e211"; } }
|
|
||||||
.glyphicon-queen { &:before { content: "\e212"; } }
|
|
||||||
.glyphicon-pawn { &:before { content: "\e213"; } }
|
|
||||||
.glyphicon-bishop { &:before { content: "\e214"; } }
|
|
||||||
.glyphicon-knight { &:before { content: "\e215"; } }
|
|
||||||
.glyphicon-baby-formula { &:before { content: "\e216"; } }
|
|
||||||
.glyphicon-tent { &:before { content: "\26fa"; } }
|
|
||||||
.glyphicon-blackboard { &:before { content: "\e218"; } }
|
|
||||||
.glyphicon-bed { &:before { content: "\e219"; } }
|
|
||||||
.glyphicon-apple { &:before { content: "\f8ff"; } }
|
|
||||||
.glyphicon-erase { &:before { content: "\e221"; } }
|
|
||||||
.glyphicon-hourglass { &:before { content: "\231b"; } }
|
|
||||||
.glyphicon-lamp { &:before { content: "\e223"; } }
|
|
||||||
.glyphicon-duplicate { &:before { content: "\e224"; } }
|
|
||||||
.glyphicon-piggy-bank { &:before { content: "\e225"; } }
|
|
||||||
.glyphicon-scissors { &:before { content: "\e226"; } }
|
|
||||||
.glyphicon-bitcoin { &:before { content: "\e227"; } }
|
|
||||||
.glyphicon-btc { &:before { content: "\e227"; } }
|
|
||||||
.glyphicon-xbt { &:before { content: "\e227"; } }
|
|
||||||
.glyphicon-yen { &:before { content: "\00a5"; } }
|
|
||||||
.glyphicon-jpy { &:before { content: "\00a5"; } }
|
|
||||||
.glyphicon-ruble { &:before { content: "\20bd"; } }
|
|
||||||
.glyphicon-rub { &:before { content: "\20bd"; } }
|
|
||||||
.glyphicon-scale { &:before { content: "\e230"; } }
|
|
||||||
.glyphicon-ice-lolly { &:before { content: "\e231"; } }
|
|
||||||
.glyphicon-ice-lolly-tasted { &:before { content: "\e232"; } }
|
|
||||||
.glyphicon-education { &:before { content: "\e233"; } }
|
|
||||||
.glyphicon-option-horizontal { &:before { content: "\e234"; } }
|
|
||||||
.glyphicon-option-vertical { &:before { content: "\e235"; } }
|
|
||||||
.glyphicon-menu-hamburger { &:before { content: "\e236"; } }
|
|
||||||
.glyphicon-modal-window { &:before { content: "\e237"; } }
|
|
||||||
.glyphicon-oil { &:before { content: "\e238"; } }
|
|
||||||
.glyphicon-grain { &:before { content: "\e239"; } }
|
|
||||||
.glyphicon-sunglasses { &:before { content: "\e240"; } }
|
|
||||||
.glyphicon-text-size { &:before { content: "\e241"; } }
|
|
||||||
.glyphicon-text-color { &:before { content: "\e242"; } }
|
|
||||||
.glyphicon-text-background { &:before { content: "\e243"; } }
|
|
||||||
.glyphicon-object-align-top { &:before { content: "\e244"; } }
|
|
||||||
.glyphicon-object-align-bottom { &:before { content: "\e245"; } }
|
|
||||||
.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
|
|
||||||
.glyphicon-object-align-left { &:before { content: "\e247"; } }
|
|
||||||
.glyphicon-object-align-vertical { &:before { content: "\e248"; } }
|
|
||||||
.glyphicon-object-align-right { &:before { content: "\e249"; } }
|
|
||||||
.glyphicon-triangle-right { &:before { content: "\e250"; } }
|
|
||||||
.glyphicon-triangle-left { &:before { content: "\e251"; } }
|
|
||||||
.glyphicon-triangle-bottom { &:before { content: "\e252"; } }
|
|
||||||
.glyphicon-triangle-top { &:before { content: "\e253"; } }
|
|
||||||
.glyphicon-console { &:before { content: "\e254"; } }
|
|
||||||
.glyphicon-superscript { &:before { content: "\e255"; } }
|
|
||||||
.glyphicon-subscript { &:before { content: "\e256"; } }
|
|
||||||
.glyphicon-menu-left { &:before { content: "\e257"; } }
|
|
||||||
.glyphicon-menu-right { &:before { content: "\e258"; } }
|
|
||||||
.glyphicon-menu-down { &:before { content: "\e259"; } }
|
|
||||||
.glyphicon-menu-up { &:before { content: "\e260"; } }
|
|
|
@ -1,84 +0,0 @@
|
||||||
//
|
|
||||||
// Grid system
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Container widths
|
|
||||||
//
|
|
||||||
// Set the container width, and override it for fixed navbars in media queries.
|
|
||||||
|
|
||||||
.container {
|
|
||||||
@include container-fixed;
|
|
||||||
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
width: $container-sm;
|
|
||||||
}
|
|
||||||
@media (min-width: $screen-md-min) {
|
|
||||||
width: $container-md;
|
|
||||||
}
|
|
||||||
@media (min-width: $screen-lg-min) {
|
|
||||||
width: $container-lg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Fluid container
|
|
||||||
//
|
|
||||||
// Utilizes the mixin meant for fixed width containers, but without any defined
|
|
||||||
// width for fluid, full width layouts.
|
|
||||||
|
|
||||||
.container-fluid {
|
|
||||||
@include container-fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Row
|
|
||||||
//
|
|
||||||
// Rows contain and clear the floats of your columns.
|
|
||||||
|
|
||||||
.row {
|
|
||||||
@include make-row;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Columns
|
|
||||||
//
|
|
||||||
// Common styles for small and large grid columns
|
|
||||||
|
|
||||||
@include make-grid-columns;
|
|
||||||
|
|
||||||
|
|
||||||
// Extra small grid
|
|
||||||
//
|
|
||||||
// Columns, offsets, pushes, and pulls for extra small devices like
|
|
||||||
// smartphones.
|
|
||||||
|
|
||||||
@include make-grid(xs);
|
|
||||||
|
|
||||||
|
|
||||||
// Small grid
|
|
||||||
//
|
|
||||||
// Columns, offsets, pushes, and pulls for the small device range, from phones
|
|
||||||
// to tablets.
|
|
||||||
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
@include make-grid(sm);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Medium grid
|
|
||||||
//
|
|
||||||
// Columns, offsets, pushes, and pulls for the desktop device range.
|
|
||||||
|
|
||||||
@media (min-width: $screen-md-min) {
|
|
||||||
@include make-grid(md);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Large grid
|
|
||||||
//
|
|
||||||
// Columns, offsets, pushes, and pulls for the large desktop device range.
|
|
||||||
|
|
||||||
@media (min-width: $screen-lg-min) {
|
|
||||||
@include make-grid(lg);
|
|
||||||
}
|
|
|
@ -1,171 +0,0 @@
|
||||||
//
|
|
||||||
// Input groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Base styles
|
|
||||||
// -------------------------
|
|
||||||
.input-group {
|
|
||||||
position: relative; // For dropdowns
|
|
||||||
display: table;
|
|
||||||
border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
|
|
||||||
|
|
||||||
// Undo padding and float of grid classes
|
|
||||||
&[class*="col-"] {
|
|
||||||
float: none;
|
|
||||||
padding-left: 0;
|
|
||||||
padding-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-control {
|
|
||||||
// Ensure that the input is always above the *appended* addon button for
|
|
||||||
// proper border colors.
|
|
||||||
position: relative;
|
|
||||||
z-index: 2;
|
|
||||||
|
|
||||||
// IE9 fubars the placeholder attribute in text inputs and the arrows on
|
|
||||||
// select elements in input groups. To fix it, we float the input. Details:
|
|
||||||
// https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
|
|
||||||
float: left;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
margin-bottom: 0;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sizing options
|
|
||||||
//
|
|
||||||
// Remix the default form control sizing classes into new ones for easier
|
|
||||||
// manipulation.
|
|
||||||
|
|
||||||
.input-group-lg > .form-control,
|
|
||||||
.input-group-lg > .input-group-addon,
|
|
||||||
.input-group-lg > .input-group-btn > .btn {
|
|
||||||
@extend .input-lg;
|
|
||||||
}
|
|
||||||
.input-group-sm > .form-control,
|
|
||||||
.input-group-sm > .input-group-addon,
|
|
||||||
.input-group-sm > .input-group-btn > .btn {
|
|
||||||
@extend .input-sm;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Display as table-cell
|
|
||||||
// -------------------------
|
|
||||||
.input-group-addon,
|
|
||||||
.input-group-btn,
|
|
||||||
.input-group .form-control {
|
|
||||||
display: table-cell;
|
|
||||||
|
|
||||||
&:not(:first-child):not(:last-child) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Addon and addon wrapper for buttons
|
|
||||||
.input-group-addon,
|
|
||||||
.input-group-btn {
|
|
||||||
width: 1%;
|
|
||||||
white-space: nowrap;
|
|
||||||
vertical-align: middle; // Match the inputs
|
|
||||||
}
|
|
||||||
|
|
||||||
// Text input groups
|
|
||||||
// -------------------------
|
|
||||||
.input-group-addon {
|
|
||||||
padding: $padding-base-vertical $padding-base-horizontal;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1;
|
|
||||||
color: $input-color;
|
|
||||||
text-align: center;
|
|
||||||
background-color: $input-group-addon-bg;
|
|
||||||
border: 1px solid $input-group-addon-border-color;
|
|
||||||
border-radius: $input-border-radius;
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
&.input-sm {
|
|
||||||
padding: $padding-small-vertical $padding-small-horizontal;
|
|
||||||
font-size: $font-size-small;
|
|
||||||
border-radius: $input-border-radius-small;
|
|
||||||
}
|
|
||||||
&.input-lg {
|
|
||||||
padding: $padding-large-vertical $padding-large-horizontal;
|
|
||||||
font-size: $font-size-large;
|
|
||||||
border-radius: $input-border-radius-large;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nuke default margins from checkboxes and radios to vertically center within.
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset rounded corners
|
|
||||||
.input-group .form-control:first-child,
|
|
||||||
.input-group-addon:first-child,
|
|
||||||
.input-group-btn:first-child > .btn,
|
|
||||||
.input-group-btn:first-child > .btn-group > .btn,
|
|
||||||
.input-group-btn:first-child > .dropdown-toggle,
|
|
||||||
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
|
||||||
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
|
|
||||||
@include border-right-radius(0);
|
|
||||||
}
|
|
||||||
.input-group-addon:first-child {
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
||||||
.input-group .form-control:last-child,
|
|
||||||
.input-group-addon:last-child,
|
|
||||||
.input-group-btn:last-child > .btn,
|
|
||||||
.input-group-btn:last-child > .btn-group > .btn,
|
|
||||||
.input-group-btn:last-child > .dropdown-toggle,
|
|
||||||
.input-group-btn:first-child > .btn:not(:first-child),
|
|
||||||
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
|
|
||||||
@include border-left-radius(0);
|
|
||||||
}
|
|
||||||
.input-group-addon:last-child {
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Button input groups
|
|
||||||
// -------------------------
|
|
||||||
.input-group-btn {
|
|
||||||
position: relative;
|
|
||||||
// Jankily prevent input button groups from wrapping with `white-space` and
|
|
||||||
// `font-size` in combination with `inline-block` on buttons.
|
|
||||||
font-size: 0;
|
|
||||||
white-space: nowrap;
|
|
||||||
|
|
||||||
// Negative margin for spacing, position for bringing hovered/focused/actived
|
|
||||||
// element above the siblings.
|
|
||||||
> .btn {
|
|
||||||
position: relative;
|
|
||||||
+ .btn {
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
// Bring the "active" button to the front
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active {
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Negative margin to only have a 1px border between the two
|
|
||||||
&:first-child {
|
|
||||||
> .btn,
|
|
||||||
> .btn-group {
|
|
||||||
margin-right: -1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
> .btn,
|
|
||||||
> .btn-group {
|
|
||||||
z-index: 2;
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
//
|
|
||||||
// Jumbotron
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.jumbotron {
|
|
||||||
padding-top: $jumbotron-padding;
|
|
||||||
padding-bottom: $jumbotron-padding;
|
|
||||||
margin-bottom: $jumbotron-padding;
|
|
||||||
color: $jumbotron-color;
|
|
||||||
background-color: $jumbotron-bg;
|
|
||||||
|
|
||||||
h1,
|
|
||||||
.h1 {
|
|
||||||
color: $jumbotron-heading-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-bottom: ($jumbotron-padding / 2);
|
|
||||||
font-size: $jumbotron-font-size;
|
|
||||||
font-weight: 200;
|
|
||||||
}
|
|
||||||
|
|
||||||
> hr {
|
|
||||||
border-top-color: darken($jumbotron-bg, 10%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.container &,
|
|
||||||
.container-fluid & {
|
|
||||||
border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
|
|
||||||
padding-left: ($grid-gutter-width / 2);
|
|
||||||
padding-right: ($grid-gutter-width / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: $screen-sm-min) {
|
|
||||||
padding-top: ($jumbotron-padding * 1.6);
|
|
||||||
padding-bottom: ($jumbotron-padding * 1.6);
|
|
||||||
|
|
||||||
.container &,
|
|
||||||
.container-fluid & {
|
|
||||||
padding-left: ($jumbotron-padding * 2);
|
|
||||||
padding-right: ($jumbotron-padding * 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,
|
|
||||||
.h1 {
|
|
||||||
font-size: $jumbotron-heading-font-size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,66 +0,0 @@
|
||||||
//
|
|
||||||
// Labels
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.label {
|
|
||||||
display: inline;
|
|
||||||
padding: .2em .6em .3em;
|
|
||||||
font-size: 75%;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 1;
|
|
||||||
color: $label-color;
|
|
||||||
text-align: center;
|
|
||||||
white-space: nowrap;
|
|
||||||
vertical-align: baseline;
|
|
||||||
border-radius: .25em;
|
|
||||||
|
|
||||||
// [converter] extracted a& to a.label
|
|
||||||
|
|
||||||
// Empty labels collapse automatically (not available in IE8)
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quick fix for labels in buttons
|
|
||||||
.btn & {
|
|
||||||
position: relative;
|
|
||||||
top: -1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add hover effects, but only for links
|
|
||||||
a.label {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $label-link-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Colors
|
|
||||||
// Contextual variations (linked labels get darker on :hover)
|
|
||||||
|
|
||||||
.label-default {
|
|
||||||
@include label-variant($label-default-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-primary {
|
|
||||||
@include label-variant($label-primary-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-success {
|
|
||||||
@include label-variant($label-success-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-info {
|
|
||||||
@include label-variant($label-info-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-warning {
|
|
||||||
@include label-variant($label-warning-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-danger {
|
|
||||||
@include label-variant($label-danger-bg);
|
|
||||||
}
|
|
|
@ -1,130 +0,0 @@
|
||||||
//
|
|
||||||
// List groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
//
|
|
||||||
// Easily usable on <ul>, <ol>, or <div>.
|
|
||||||
|
|
||||||
.list-group {
|
|
||||||
// No need to set list-style: none; since .list-group-item is block level
|
|
||||||
margin-bottom: 20px;
|
|
||||||
padding-left: 0; // reset padding because ul and ol
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Individual list items
|
|
||||||
//
|
|
||||||
// Use on `li`s or `div`s within the `.list-group` parent.
|
|
||||||
|
|
||||||
.list-group-item {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
padding: 10px 15px;
|
|
||||||
// Place the border on the list items and negative margin up for better styling
|
|
||||||
margin-bottom: -1px;
|
|
||||||
background-color: $list-group-bg;
|
|
||||||
border: 1px solid $list-group-border;
|
|
||||||
|
|
||||||
// Round the first and last items
|
|
||||||
&:first-child {
|
|
||||||
@include border-top-radius($list-group-border-radius);
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
@include border-bottom-radius($list-group-border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Interactive list items
|
|
||||||
//
|
|
||||||
// Use anchor or button elements instead of `li`s or `div`s to create interactive items.
|
|
||||||
// Includes an extra `.active` modifier class for showing selected items.
|
|
||||||
|
|
||||||
a.list-group-item,
|
|
||||||
button.list-group-item {
|
|
||||||
color: $list-group-link-color;
|
|
||||||
|
|
||||||
.list-group-item-heading {
|
|
||||||
color: $list-group-link-heading-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover state
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
color: $list-group-link-hover-color;
|
|
||||||
background-color: $list-group-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button.list-group-item {
|
|
||||||
width: 100%;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-group-item {
|
|
||||||
// Disabled state
|
|
||||||
&.disabled,
|
|
||||||
&.disabled:hover,
|
|
||||||
&.disabled:focus {
|
|
||||||
background-color: $list-group-disabled-bg;
|
|
||||||
color: $list-group-disabled-color;
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
|
|
||||||
// Force color to inherit for custom content
|
|
||||||
.list-group-item-heading {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
.list-group-item-text {
|
|
||||||
color: $list-group-disabled-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active class on item itself, not parent
|
|
||||||
&.active,
|
|
||||||
&.active:hover,
|
|
||||||
&.active:focus {
|
|
||||||
z-index: 2; // Place active items above their siblings for proper border styling
|
|
||||||
color: $list-group-active-color;
|
|
||||||
background-color: $list-group-active-bg;
|
|
||||||
border-color: $list-group-active-border;
|
|
||||||
|
|
||||||
// Force color to inherit for custom content
|
|
||||||
.list-group-item-heading,
|
|
||||||
.list-group-item-heading > small,
|
|
||||||
.list-group-item-heading > .small {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
.list-group-item-text {
|
|
||||||
color: $list-group-active-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Contextual variants
|
|
||||||
//
|
|
||||||
// Add modifier classes to change text and background color on individual items.
|
|
||||||
// Organizationally, this must come after the `:hover` states.
|
|
||||||
|
|
||||||
@include list-group-item-variant(success, $state-success-bg, $state-success-text);
|
|
||||||
@include list-group-item-variant(info, $state-info-bg, $state-info-text);
|
|
||||||
@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
|
|
||||||
@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
|
|
||||||
|
|
||||||
|
|
||||||
// Custom content options
|
|
||||||
//
|
|
||||||
// Extra classes for creating well-formatted content within `.list-group-item`s.
|
|
||||||
|
|
||||||
.list-group-item-heading {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.list-group-item-text {
|
|
||||||
margin-bottom: 0;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
|
@ -1,66 +0,0 @@
|
||||||
.media {
|
|
||||||
// Proper spacing between instances of .media
|
|
||||||
margin-top: 15px;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.media,
|
|
||||||
.media-body {
|
|
||||||
zoom: 1;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-body {
|
|
||||||
width: 10000px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-object {
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
// Fix collapse in webkit from max-width: 100% and display: table-cell.
|
|
||||||
&.img-thumbnail {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-right,
|
|
||||||
.media > .pull-right {
|
|
||||||
padding-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-left,
|
|
||||||
.media > .pull-left {
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-left,
|
|
||||||
.media-right,
|
|
||||||
.media-body {
|
|
||||||
display: table-cell;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-middle {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-bottom {
|
|
||||||
vertical-align: bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset margins on headings for tighter default spacing
|
|
||||||
.media-heading {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Media list variation
|
|
||||||
//
|
|
||||||
// Undo default ul/ol styles
|
|
||||||
.media-list {
|
|
||||||
padding-left: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
// Mixins
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Utilities
|
|
||||||
@import "mixins/hide-text";
|
|
||||||
@import "mixins/opacity";
|
|
||||||
@import "mixins/image";
|
|
||||||
@import "mixins/labels";
|
|
||||||
@import "mixins/reset-filter";
|
|
||||||
@import "mixins/resize";
|
|
||||||
@import "mixins/responsive-visibility";
|
|
||||||
@import "mixins/size";
|
|
||||||
@import "mixins/tab-focus";
|
|
||||||
@import "mixins/reset-text";
|
|
||||||
@import "mixins/text-emphasis";
|
|
||||||
@import "mixins/text-overflow";
|
|
||||||
@import "mixins/vendor-prefixes";
|
|
||||||
|
|
||||||
// Components
|
|
||||||
@import "mixins/alerts";
|
|
||||||
@import "mixins/buttons";
|
|
||||||
@import "mixins/panels";
|
|
||||||
@import "mixins/pagination";
|
|
||||||
@import "mixins/list-group";
|
|
||||||
@import "mixins/nav-divider";
|
|
||||||
@import "mixins/forms";
|
|
||||||
@import "mixins/progress-bar";
|
|
||||||
@import "mixins/table-row";
|
|
||||||
|
|
||||||
// Skins
|
|
||||||
@import "mixins/background-variant";
|
|
||||||
@import "mixins/border-radius";
|
|
||||||
@import "mixins/gradients";
|
|
||||||
|
|
||||||
// Layout
|
|
||||||
@import "mixins/clearfix";
|
|
||||||
@import "mixins/center-block";
|
|
||||||
@import "mixins/nav-vertical-align";
|
|
||||||
@import "mixins/grid-framework";
|
|
||||||
@import "mixins/grid";
|
|
|
@ -1,150 +0,0 @@
|
||||||
//
|
|
||||||
// Modals
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// .modal-open - body class for killing the scroll
|
|
||||||
// .modal - container to scroll within
|
|
||||||
// .modal-dialog - positioning shell for the actual modal
|
|
||||||
// .modal-content - actual modal w/ bg and corners and shit
|
|
||||||
|
|
||||||
// Kill the scroll on the body
|
|
||||||
.modal-open {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container that the modal scrolls within
|
|
||||||
.modal {
|
|
||||||
display: none;
|
|
||||||
overflow: hidden;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-modal;
|
|
||||||
-webkit-overflow-scrolling: touch;
|
|
||||||
|
|
||||||
// Prevent Chrome on Windows from adding a focus outline. For details, see
|
|
||||||
// https://github.com/twbs/bootstrap/pull/10951.
|
|
||||||
outline: 0;
|
|
||||||
|
|
||||||
// When fading in the modal, animate it to slide down
|
|
||||||
&.fade .modal-dialog {
|
|
||||||
@include translate(0, -25%);
|
|
||||||
@include transition-transform(0.3s ease-out);
|
|
||||||
}
|
|
||||||
&.in .modal-dialog { @include translate(0, 0) }
|
|
||||||
}
|
|
||||||
.modal-open .modal {
|
|
||||||
overflow-x: hidden;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shell div to position the modal with bottom padding
|
|
||||||
.modal-dialog {
|
|
||||||
position: relative;
|
|
||||||
width: auto;
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual modal
|
|
||||||
.modal-content {
|
|
||||||
position: relative;
|
|
||||||
background-color: $modal-content-bg;
|
|
||||||
border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
|
|
||||||
border: 1px solid $modal-content-border-color;
|
|
||||||
border-radius: $border-radius-large;
|
|
||||||
@include box-shadow(0 3px 9px rgba(0,0,0,.5));
|
|
||||||
background-clip: padding-box;
|
|
||||||
// Remove focus outline from opened modal
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal background
|
|
||||||
.modal-backdrop {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-modal-background;
|
|
||||||
background-color: $modal-backdrop-bg;
|
|
||||||
// Fade for backdrop
|
|
||||||
&.fade { @include opacity(0); }
|
|
||||||
&.in { @include opacity($modal-backdrop-opacity); }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal header
|
|
||||||
// Top section of the modal w/ title and dismiss
|
|
||||||
.modal-header {
|
|
||||||
padding: $modal-title-padding;
|
|
||||||
border-bottom: 1px solid $modal-header-border-color;
|
|
||||||
@include clearfix;
|
|
||||||
}
|
|
||||||
// Close icon
|
|
||||||
.modal-header .close {
|
|
||||||
margin-top: -2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Title text within header
|
|
||||||
.modal-title {
|
|
||||||
margin: 0;
|
|
||||||
line-height: $modal-title-line-height;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal body
|
|
||||||
// Where all modal content resides (sibling of .modal-header and .modal-footer)
|
|
||||||
.modal-body {
|
|
||||||
position: relative;
|
|
||||||
padding: $modal-inner-padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Footer (for actions)
|
|
||||||
.modal-footer {
|
|
||||||
padding: $modal-inner-padding;
|
|
||||||
text-align: right; // right align buttons
|
|
||||||
border-top: 1px solid $modal-footer-border-color;
|
|
||||||
@include clearfix; // clear it in case folks use .pull-* classes on buttons
|
|
||||||
|
|
||||||
// Properly space out buttons
|
|
||||||
.btn + .btn {
|
|
||||||
margin-left: 5px;
|
|
||||||
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
|
|
||||||
}
|
|
||||||
// but override that for button groups
|
|
||||||
.btn-group .btn + .btn {
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
// and override it for block buttons as well
|
|
||||||
.btn-block + .btn-block {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measure scrollbar width for padding body during modal show/hide
|
|
||||||
.modal-scrollbar-measure {
|
|
||||||
position: absolute;
|
|
||||||
top: -9999px;
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
overflow: scroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scale up the modal
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
// Automatically set modal's width for larger viewports
|
|
||||||
.modal-dialog {
|
|
||||||
width: $modal-md;
|
|
||||||
margin: 30px auto;
|
|
||||||
}
|
|
||||||
.modal-content {
|
|
||||||
@include box-shadow(0 5px 15px rgba(0,0,0,.5));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal sizes
|
|
||||||
.modal-sm { width: $modal-sm; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-md-min) {
|
|
||||||
.modal-lg { width: $modal-lg; }
|
|
||||||
}
|
|
|
@ -1,662 +0,0 @@
|
||||||
//
|
|
||||||
// Navbars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Wrapper and base class
|
|
||||||
//
|
|
||||||
// Provide a static navbar from which we expand to create full-width, fixed, and
|
|
||||||
// other navbar variations.
|
|
||||||
|
|
||||||
.navbar {
|
|
||||||
position: relative;
|
|
||||||
min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
|
|
||||||
margin-bottom: $navbar-margin-bottom;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
|
|
||||||
// Prevent floats from breaking the navbar
|
|
||||||
@include clearfix;
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
border-radius: $navbar-border-radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar heading
|
|
||||||
//
|
|
||||||
// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
|
|
||||||
// styling of responsive aspects.
|
|
||||||
|
|
||||||
.navbar-header {
|
|
||||||
@include clearfix;
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar collapse (body)
|
|
||||||
//
|
|
||||||
// Group your navbar content into this for easy collapsing and expanding across
|
|
||||||
// various device sizes. By default, this content is collapsed when <768px, but
|
|
||||||
// will expand past that for a horizontal display.
|
|
||||||
//
|
|
||||||
// To start (on mobile devices) the navbar links, forms, and buttons are stacked
|
|
||||||
// vertically and include a `max-height` to overflow in case you have too much
|
|
||||||
// content for the user's viewport.
|
|
||||||
|
|
||||||
.navbar-collapse {
|
|
||||||
overflow-x: visible;
|
|
||||||
padding-right: $navbar-padding-horizontal;
|
|
||||||
padding-left: $navbar-padding-horizontal;
|
|
||||||
border-top: 1px solid transparent;
|
|
||||||
box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
|
|
||||||
@include clearfix;
|
|
||||||
-webkit-overflow-scrolling: touch;
|
|
||||||
|
|
||||||
&.in {
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
width: auto;
|
|
||||||
border-top: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
&.collapse {
|
|
||||||
display: block !important;
|
|
||||||
height: auto !important;
|
|
||||||
padding-bottom: 0; // Override default setting
|
|
||||||
overflow: visible !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.in {
|
|
||||||
overflow-y: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Undo the collapse side padding for navbars with containers to ensure
|
|
||||||
// alignment of right-aligned contents.
|
|
||||||
.navbar-fixed-top &,
|
|
||||||
.navbar-static-top &,
|
|
||||||
.navbar-fixed-bottom & {
|
|
||||||
padding-left: 0;
|
|
||||||
padding-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-fixed-top,
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
.navbar-collapse {
|
|
||||||
max-height: $navbar-collapse-max-height;
|
|
||||||
|
|
||||||
@media (max-device-width: $screen-xs-min) and (orientation: landscape) {
|
|
||||||
max-height: 200px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Both navbar header and collapse
|
|
||||||
//
|
|
||||||
// When a container is present, change the behavior of the header and collapse.
|
|
||||||
|
|
||||||
.container,
|
|
||||||
.container-fluid {
|
|
||||||
> .navbar-header,
|
|
||||||
> .navbar-collapse {
|
|
||||||
margin-right: -$navbar-padding-horizontal;
|
|
||||||
margin-left: -$navbar-padding-horizontal;
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
margin-right: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Navbar alignment options
|
|
||||||
//
|
|
||||||
// Display the navbar across the entirety of the page or fixed it to the top or
|
|
||||||
// bottom of the page.
|
|
||||||
|
|
||||||
// Static top (unfixed, but 100% wide) navbar
|
|
||||||
.navbar-static-top {
|
|
||||||
z-index: $zindex-navbar;
|
|
||||||
border-width: 0 0 1px;
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix the top/bottom navbars when screen real estate supports it
|
|
||||||
.navbar-fixed-top,
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
position: fixed;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-navbar-fixed;
|
|
||||||
|
|
||||||
// Undo the rounded corners
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navbar-fixed-top {
|
|
||||||
top: 0;
|
|
||||||
border-width: 0 0 1px;
|
|
||||||
}
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
bottom: 0;
|
|
||||||
margin-bottom: 0; // override .navbar defaults
|
|
||||||
border-width: 1px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Brand/project name
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
float: left;
|
|
||||||
padding: $navbar-padding-vertical $navbar-padding-horizontal;
|
|
||||||
font-size: $font-size-large;
|
|
||||||
line-height: $line-height-computed;
|
|
||||||
height: $navbar-height;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
> img {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
.navbar > .container &,
|
|
||||||
.navbar > .container-fluid & {
|
|
||||||
margin-left: -$navbar-padding-horizontal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar toggle
|
|
||||||
//
|
|
||||||
// Custom button for toggling the `.navbar-collapse`, powered by the collapse
|
|
||||||
// JavaScript plugin.
|
|
||||||
|
|
||||||
.navbar-toggle {
|
|
||||||
position: relative;
|
|
||||||
float: right;
|
|
||||||
margin-right: $navbar-padding-horizontal;
|
|
||||||
padding: 9px 10px;
|
|
||||||
@include navbar-vertical-align(34px);
|
|
||||||
background-color: transparent;
|
|
||||||
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
|
|
||||||
// We remove the `outline` here, but later compensate by attaching `:hover`
|
|
||||||
// styles to `:focus`.
|
|
||||||
&:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bars
|
|
||||||
.icon-bar {
|
|
||||||
display: block;
|
|
||||||
width: 22px;
|
|
||||||
height: 2px;
|
|
||||||
border-radius: 1px;
|
|
||||||
}
|
|
||||||
.icon-bar + .icon-bar {
|
|
||||||
margin-top: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar nav links
|
|
||||||
//
|
|
||||||
// Builds on top of the `.nav` components with its own modifier class to make
|
|
||||||
// the nav the full height of the horizontal nav (above 768px).
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
|
|
||||||
|
|
||||||
> li > a {
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
line-height: $line-height-computed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $grid-float-breakpoint-max) {
|
|
||||||
// Dropdowns get custom display when collapsed
|
|
||||||
.open .dropdown-menu {
|
|
||||||
position: static;
|
|
||||||
float: none;
|
|
||||||
width: auto;
|
|
||||||
margin-top: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
border: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
> li > a,
|
|
||||||
.dropdown-header {
|
|
||||||
padding: 5px 15px 5px 25px;
|
|
||||||
}
|
|
||||||
> li > a {
|
|
||||||
line-height: $line-height-computed;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uncollapse the nav
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
float: left;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
float: left;
|
|
||||||
> a {
|
|
||||||
padding-top: $navbar-padding-vertical;
|
|
||||||
padding-bottom: $navbar-padding-vertical;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar form
|
|
||||||
//
|
|
||||||
// Extension of the `.form-inline` with some extra flavor for optimum display in
|
|
||||||
// our navbars.
|
|
||||||
|
|
||||||
.navbar-form {
|
|
||||||
margin-left: -$navbar-padding-horizontal;
|
|
||||||
margin-right: -$navbar-padding-horizontal;
|
|
||||||
padding: 10px $navbar-padding-horizontal;
|
|
||||||
border-top: 1px solid transparent;
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
$shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
|
|
||||||
@include box-shadow($shadow);
|
|
||||||
|
|
||||||
// Mixin behavior for optimum display
|
|
||||||
@include form-inline;
|
|
||||||
|
|
||||||
.form-group {
|
|
||||||
@media (max-width: $grid-float-breakpoint-max) {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vertically center in expanded, horizontal navbar
|
|
||||||
@include navbar-vertical-align($input-height-base);
|
|
||||||
|
|
||||||
// Undo 100% width for pull classes
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
width: auto;
|
|
||||||
border: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
margin-right: 0;
|
|
||||||
padding-top: 0;
|
|
||||||
padding-bottom: 0;
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Dropdown menus
|
|
||||||
|
|
||||||
// Menu position and menu carets
|
|
||||||
.navbar-nav > li > .dropdown-menu {
|
|
||||||
margin-top: 0;
|
|
||||||
@include border-top-radius(0);
|
|
||||||
}
|
|
||||||
// Menu position and menu caret support for dropups via extra dropup class
|
|
||||||
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
|
|
||||||
margin-bottom: 0;
|
|
||||||
@include border-top-radius($navbar-border-radius);
|
|
||||||
@include border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Buttons in navbars
|
|
||||||
//
|
|
||||||
// Vertically center a button within a navbar (when *not* in a form).
|
|
||||||
|
|
||||||
.navbar-btn {
|
|
||||||
@include navbar-vertical-align($input-height-base);
|
|
||||||
|
|
||||||
&.btn-sm {
|
|
||||||
@include navbar-vertical-align($input-height-small);
|
|
||||||
}
|
|
||||||
&.btn-xs {
|
|
||||||
@include navbar-vertical-align(22);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Text in navbars
|
|
||||||
//
|
|
||||||
// Add a class to make any element properly align itself vertically within the navbars.
|
|
||||||
|
|
||||||
.navbar-text {
|
|
||||||
@include navbar-vertical-align($line-height-computed);
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
float: left;
|
|
||||||
margin-left: $navbar-padding-horizontal;
|
|
||||||
margin-right: $navbar-padding-horizontal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Component alignment
|
|
||||||
//
|
|
||||||
// Repurpose the pull utilities as their own navbar utilities to avoid specificity
|
|
||||||
// issues with parents and chaining. Only do this when the navbar is uncollapsed
|
|
||||||
// though so that navbar contents properly stack and align in mobile.
|
|
||||||
//
|
|
||||||
// Declared after the navbar components to ensure more specificity on the margins.
|
|
||||||
|
|
||||||
@media (min-width: $grid-float-breakpoint) {
|
|
||||||
.navbar-left {
|
|
||||||
float: left !important;
|
|
||||||
}
|
|
||||||
.navbar-right {
|
|
||||||
float: right !important;
|
|
||||||
margin-right: -$navbar-padding-horizontal;
|
|
||||||
|
|
||||||
~ .navbar-right {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Alternate navbars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Default navbar
|
|
||||||
.navbar-default {
|
|
||||||
background-color: $navbar-default-bg;
|
|
||||||
border-color: $navbar-default-border;
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
color: $navbar-default-brand-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-brand-hover-color;
|
|
||||||
background-color: $navbar-default-brand-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-text {
|
|
||||||
color: $navbar-default-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
> li > a {
|
|
||||||
color: $navbar-default-link-color;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-hover-color;
|
|
||||||
background-color: $navbar-default-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-active-color;
|
|
||||||
background-color: $navbar-default-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-disabled-color;
|
|
||||||
background-color: $navbar-default-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-toggle {
|
|
||||||
border-color: $navbar-default-toggle-border-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: $navbar-default-toggle-hover-bg;
|
|
||||||
}
|
|
||||||
.icon-bar {
|
|
||||||
background-color: $navbar-default-toggle-icon-bar-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-collapse,
|
|
||||||
.navbar-form {
|
|
||||||
border-color: $navbar-default-border;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdown menu items
|
|
||||||
.navbar-nav {
|
|
||||||
// Remove background color from open dropdown
|
|
||||||
> .open > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: $navbar-default-link-active-bg;
|
|
||||||
color: $navbar-default-link-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $grid-float-breakpoint-max) {
|
|
||||||
// Dropdowns get custom display when collapsed
|
|
||||||
.open .dropdown-menu {
|
|
||||||
> li > a {
|
|
||||||
color: $navbar-default-link-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-hover-color;
|
|
||||||
background-color: $navbar-default-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-active-color;
|
|
||||||
background-color: $navbar-default-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-disabled-color;
|
|
||||||
background-color: $navbar-default-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Links in navbars
|
|
||||||
//
|
|
||||||
// Add a class to ensure links outside the navbar nav are colored correctly.
|
|
||||||
|
|
||||||
.navbar-link {
|
|
||||||
color: $navbar-default-link-color;
|
|
||||||
&:hover {
|
|
||||||
color: $navbar-default-link-hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-link {
|
|
||||||
color: $navbar-default-link-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-hover-color;
|
|
||||||
}
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-default-link-disabled-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inverse navbar
|
|
||||||
|
|
||||||
.navbar-inverse {
|
|
||||||
background-color: $navbar-inverse-bg;
|
|
||||||
border-color: $navbar-inverse-border;
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
color: $navbar-inverse-brand-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-brand-hover-color;
|
|
||||||
background-color: $navbar-inverse-brand-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-text {
|
|
||||||
color: $navbar-inverse-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
> li > a {
|
|
||||||
color: $navbar-inverse-link-color;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-hover-color;
|
|
||||||
background-color: $navbar-inverse-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-active-color;
|
|
||||||
background-color: $navbar-inverse-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-disabled-color;
|
|
||||||
background-color: $navbar-inverse-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Darken the responsive nav toggle
|
|
||||||
.navbar-toggle {
|
|
||||||
border-color: $navbar-inverse-toggle-border-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: $navbar-inverse-toggle-hover-bg;
|
|
||||||
}
|
|
||||||
.icon-bar {
|
|
||||||
background-color: $navbar-inverse-toggle-icon-bar-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-collapse,
|
|
||||||
.navbar-form {
|
|
||||||
border-color: darken($navbar-inverse-bg, 7%);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdowns
|
|
||||||
.navbar-nav {
|
|
||||||
> .open > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: $navbar-inverse-link-active-bg;
|
|
||||||
color: $navbar-inverse-link-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $grid-float-breakpoint-max) {
|
|
||||||
// Dropdowns get custom display
|
|
||||||
.open .dropdown-menu {
|
|
||||||
> .dropdown-header {
|
|
||||||
border-color: $navbar-inverse-border;
|
|
||||||
}
|
|
||||||
.divider {
|
|
||||||
background-color: $navbar-inverse-border;
|
|
||||||
}
|
|
||||||
> li > a {
|
|
||||||
color: $navbar-inverse-link-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-hover-color;
|
|
||||||
background-color: $navbar-inverse-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-active-color;
|
|
||||||
background-color: $navbar-inverse-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-disabled-color;
|
|
||||||
background-color: $navbar-inverse-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-link {
|
|
||||||
color: $navbar-inverse-link-color;
|
|
||||||
&:hover {
|
|
||||||
color: $navbar-inverse-link-hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-link {
|
|
||||||
color: $navbar-inverse-link-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-hover-color;
|
|
||||||
}
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $navbar-inverse-link-disabled-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,242 +0,0 @@
|
||||||
//
|
|
||||||
// Navs
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.nav {
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding-left: 0; // Override default ul/ol
|
|
||||||
list-style: none;
|
|
||||||
@include clearfix;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
> a {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
padding: $nav-link-padding;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: $nav-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disabled state sets text to gray and nukes hover/tab effects
|
|
||||||
&.disabled > a {
|
|
||||||
color: $nav-disabled-link-color;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $nav-disabled-link-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: transparent;
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open dropdowns
|
|
||||||
.open > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: $nav-link-hover-bg;
|
|
||||||
border-color: $link-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nav dividers (deprecated with v3.0.1)
|
|
||||||
//
|
|
||||||
// This should have been removed in v3 with the dropping of `.nav-list`, but
|
|
||||||
// we missed it. We don't currently support this anywhere, but in the interest
|
|
||||||
// of maintaining backward compatibility in case you use it, it's deprecated.
|
|
||||||
.nav-divider {
|
|
||||||
@include nav-divider;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent IE8 from misplacing imgs
|
|
||||||
//
|
|
||||||
// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
|
|
||||||
> li > a > img {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tabs
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Give the tabs something to sit on
|
|
||||||
.nav-tabs {
|
|
||||||
border-bottom: 1px solid $nav-tabs-border-color;
|
|
||||||
> li {
|
|
||||||
float: left;
|
|
||||||
// Make the list-items overlay the bottom border
|
|
||||||
margin-bottom: -1px;
|
|
||||||
|
|
||||||
// Actual tabs (as links)
|
|
||||||
> a {
|
|
||||||
margin-right: 2px;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: $border-radius-base $border-radius-base 0 0;
|
|
||||||
&:hover {
|
|
||||||
border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active state, and its :hover to override normal :hover
|
|
||||||
&.active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $nav-tabs-active-link-hover-color;
|
|
||||||
background-color: $nav-tabs-active-link-hover-bg;
|
|
||||||
border: 1px solid $nav-tabs-active-link-hover-border-color;
|
|
||||||
border-bottom-color: transparent;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// pulling this in mainly for less shorthand
|
|
||||||
&.nav-justified {
|
|
||||||
@extend .nav-justified;
|
|
||||||
@extend .nav-tabs-justified;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Pills
|
|
||||||
// -------------------------
|
|
||||||
.nav-pills {
|
|
||||||
> li {
|
|
||||||
float: left;
|
|
||||||
|
|
||||||
// Links rendered as pills
|
|
||||||
> a {
|
|
||||||
border-radius: $nav-pills-border-radius;
|
|
||||||
}
|
|
||||||
+ li {
|
|
||||||
margin-left: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active state
|
|
||||||
&.active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $nav-pills-active-link-hover-color;
|
|
||||||
background-color: $nav-pills-active-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Stacked pills
|
|
||||||
.nav-stacked {
|
|
||||||
> li {
|
|
||||||
float: none;
|
|
||||||
+ li {
|
|
||||||
margin-top: 2px;
|
|
||||||
margin-left: 0; // no need for this gap between nav items
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Nav variations
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Justified nav links
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.nav-justified {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
float: none;
|
|
||||||
> a {
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .dropdown .dropdown-menu {
|
|
||||||
top: auto;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
> li {
|
|
||||||
display: table-cell;
|
|
||||||
width: 1%;
|
|
||||||
> a {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move borders to anchors instead of bottom of list
|
|
||||||
//
|
|
||||||
// Mixin for adding on top the shared `.nav-justified` styles for our tabs
|
|
||||||
.nav-tabs-justified {
|
|
||||||
border-bottom: 0;
|
|
||||||
|
|
||||||
> li > a {
|
|
||||||
// Override margin from .nav-tabs
|
|
||||||
margin-right: 0;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active > a,
|
|
||||||
> .active > a:hover,
|
|
||||||
> .active > a:focus {
|
|
||||||
border: 1px solid $nav-tabs-justified-link-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
> li > a {
|
|
||||||
border-bottom: 1px solid $nav-tabs-justified-link-border-color;
|
|
||||||
border-radius: $border-radius-base $border-radius-base 0 0;
|
|
||||||
}
|
|
||||||
> .active > a,
|
|
||||||
> .active > a:hover,
|
|
||||||
> .active > a:focus {
|
|
||||||
border-bottom-color: $nav-tabs-justified-active-link-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tabbable tabs
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Hide tabbable panes to start, show them when `.active`
|
|
||||||
.tab-content {
|
|
||||||
> .tab-pane {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
> .active {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Dropdowns
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Specific dropdowns
|
|
||||||
.nav-tabs .dropdown-menu {
|
|
||||||
// make dropdown border overlap tab border
|
|
||||||
margin-top: -1px;
|
|
||||||
// Remove the top rounded corners here since there is a hard edge above the menu
|
|
||||||
@include border-top-radius(0);
|
|
||||||
}
|
|
|
@ -1,424 +0,0 @@
|
||||||
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Set default font family to sans-serif.
|
|
||||||
// 2. Prevent iOS and IE text size adjust after device orientation change,
|
|
||||||
// without disabling user zoom.
|
|
||||||
//
|
|
||||||
|
|
||||||
html {
|
|
||||||
font-family: sans-serif; // 1
|
|
||||||
-ms-text-size-adjust: 100%; // 2
|
|
||||||
-webkit-text-size-adjust: 100%; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove default margin.
|
|
||||||
//
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTML5 display definitions
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Correct `block` display not defined for any HTML5 element in IE 8/9.
|
|
||||||
// Correct `block` display not defined for `details` or `summary` in IE 10/11
|
|
||||||
// and Firefox.
|
|
||||||
// Correct `block` display not defined for `main` in IE 11.
|
|
||||||
//
|
|
||||||
|
|
||||||
article,
|
|
||||||
aside,
|
|
||||||
details,
|
|
||||||
figcaption,
|
|
||||||
figure,
|
|
||||||
footer,
|
|
||||||
header,
|
|
||||||
hgroup,
|
|
||||||
main,
|
|
||||||
menu,
|
|
||||||
nav,
|
|
||||||
section,
|
|
||||||
summary {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Correct `inline-block` display not defined in IE 8/9.
|
|
||||||
// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
|
|
||||||
//
|
|
||||||
|
|
||||||
audio,
|
|
||||||
canvas,
|
|
||||||
progress,
|
|
||||||
video {
|
|
||||||
display: inline-block; // 1
|
|
||||||
vertical-align: baseline; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Prevent modern browsers from displaying `audio` without controls.
|
|
||||||
// Remove excess height in iOS 5 devices.
|
|
||||||
//
|
|
||||||
|
|
||||||
audio:not([controls]) {
|
|
||||||
display: none;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address `[hidden]` styling not present in IE 8/9/10.
|
|
||||||
// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
|
|
||||||
//
|
|
||||||
|
|
||||||
[hidden],
|
|
||||||
template {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Links
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove the gray background color from active links in IE 10.
|
|
||||||
//
|
|
||||||
|
|
||||||
a {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Improve readability of focused elements when they are also in an
|
|
||||||
// active/hover state.
|
|
||||||
//
|
|
||||||
|
|
||||||
a:active,
|
|
||||||
a:hover {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Text-level semantics
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
abbr[title] {
|
|
||||||
border-bottom: 1px dotted;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
b,
|
|
||||||
strong {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address styling not present in Safari and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
dfn {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address variable `h1` font-size and margin within `section` and `article`
|
|
||||||
// contexts in Firefox 4+, Safari, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 2em;
|
|
||||||
margin: 0.67em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address styling not present in IE 8/9.
|
|
||||||
//
|
|
||||||
|
|
||||||
mark {
|
|
||||||
background: #ff0;
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address inconsistent and variable font size in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
small {
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
sub,
|
|
||||||
sup {
|
|
||||||
font-size: 75%;
|
|
||||||
line-height: 0;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
sup {
|
|
||||||
top: -0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub {
|
|
||||||
bottom: -0.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Embedded content
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove border when inside `a` element in IE 8/9/10.
|
|
||||||
//
|
|
||||||
|
|
||||||
img {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Correct overflow not hidden in IE 9/10/11.
|
|
||||||
//
|
|
||||||
|
|
||||||
svg:not(:root) {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Grouping content
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address margin not present in IE 8/9 and Safari.
|
|
||||||
//
|
|
||||||
|
|
||||||
figure {
|
|
||||||
margin: 1em 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address differences between Firefox and other browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
hr {
|
|
||||||
box-sizing: content-box;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Contain overflow in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
pre {
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address odd `em`-unit font size rendering in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
code,
|
|
||||||
kbd,
|
|
||||||
pre,
|
|
||||||
samp {
|
|
||||||
font-family: monospace, monospace;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forms
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Known limitation: by default, Chrome and Safari on OS X allow very limited
|
|
||||||
// styling of `select`, unless a `border` property is set.
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Correct color not being inherited.
|
|
||||||
// Known issue: affects color of disabled elements.
|
|
||||||
// 2. Correct font properties not being inherited.
|
|
||||||
// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
button,
|
|
||||||
input,
|
|
||||||
optgroup,
|
|
||||||
select,
|
|
||||||
textarea {
|
|
||||||
color: inherit; // 1
|
|
||||||
font: inherit; // 2
|
|
||||||
margin: 0; // 3
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address `overflow` set to `hidden` in IE 8/9/10/11.
|
|
||||||
//
|
|
||||||
|
|
||||||
button {
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address inconsistent `text-transform` inheritance for `button` and `select`.
|
|
||||||
// All other form control elements do not inherit `text-transform` values.
|
|
||||||
// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
|
|
||||||
// Correct `select` style inheritance in Firefox.
|
|
||||||
//
|
|
||||||
|
|
||||||
button,
|
|
||||||
select {
|
|
||||||
text-transform: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
|
||||||
// and `video` controls.
|
|
||||||
// 2. Correct inability to style clickable `input` types in iOS.
|
|
||||||
// 3. Improve usability and consistency of cursor style between image-type
|
|
||||||
// `input` and others.
|
|
||||||
//
|
|
||||||
|
|
||||||
button,
|
|
||||||
html input[type="button"], // 1
|
|
||||||
input[type="reset"],
|
|
||||||
input[type="submit"] {
|
|
||||||
-webkit-appearance: button; // 2
|
|
||||||
cursor: pointer; // 3
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Re-set default cursor for disabled elements.
|
|
||||||
//
|
|
||||||
|
|
||||||
button[disabled],
|
|
||||||
html input[disabled] {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove inner padding and border in Firefox 4+.
|
|
||||||
//
|
|
||||||
|
|
||||||
button::-moz-focus-inner,
|
|
||||||
input::-moz-focus-inner {
|
|
||||||
border: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
|
||||||
// the UA stylesheet.
|
|
||||||
//
|
|
||||||
|
|
||||||
input {
|
|
||||||
line-height: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// It's recommended that you don't attempt to style these elements.
|
|
||||||
// Firefox's implementation doesn't respect box-sizing, padding, or width.
|
|
||||||
//
|
|
||||||
// 1. Address box sizing set to `content-box` in IE 8/9/10.
|
|
||||||
// 2. Remove excess padding in IE 8/9/10.
|
|
||||||
//
|
|
||||||
|
|
||||||
input[type="checkbox"],
|
|
||||||
input[type="radio"] {
|
|
||||||
box-sizing: border-box; // 1
|
|
||||||
padding: 0; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Fix the cursor style for Chrome's increment/decrement buttons. For certain
|
|
||||||
// `font-size` values of the `input`, it causes the cursor style of the
|
|
||||||
// decrement button to change from `default` to `text`.
|
|
||||||
//
|
|
||||||
|
|
||||||
input[type="number"]::-webkit-inner-spin-button,
|
|
||||||
input[type="number"]::-webkit-outer-spin-button {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
|
|
||||||
// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
input[type="search"] {
|
|
||||||
-webkit-appearance: textfield; // 1
|
|
||||||
box-sizing: content-box; //2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove inner padding and search cancel button in Safari and Chrome on OS X.
|
|
||||||
// Safari (but not Chrome) clips the cancel button when the search input has
|
|
||||||
// padding (and `textfield` appearance).
|
|
||||||
//
|
|
||||||
|
|
||||||
input[type="search"]::-webkit-search-cancel-button,
|
|
||||||
input[type="search"]::-webkit-search-decoration {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Define consistent border, margin, and padding.
|
|
||||||
//
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
border: 1px solid #c0c0c0;
|
|
||||||
margin: 0 2px;
|
|
||||||
padding: 0.35em 0.625em 0.75em;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Correct `color` not being inherited in IE 8/9/10/11.
|
|
||||||
// 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
|
||||||
//
|
|
||||||
|
|
||||||
legend {
|
|
||||||
border: 0; // 1
|
|
||||||
padding: 0; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove default vertical scrollbar in IE 8/9/10/11.
|
|
||||||
//
|
|
||||||
|
|
||||||
textarea {
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Don't inherit the `font-weight` (applied by a rule above).
|
|
||||||
// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
|
|
||||||
//
|
|
||||||
|
|
||||||
optgroup {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tables
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove most spacing between table cells.
|
|
||||||
//
|
|
||||||
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
border-spacing: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
//
|
|
||||||
// Pager pagination
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.pager {
|
|
||||||
padding-left: 0;
|
|
||||||
margin: $line-height-computed 0;
|
|
||||||
list-style: none;
|
|
||||||
text-align: center;
|
|
||||||
@include clearfix;
|
|
||||||
li {
|
|
||||||
display: inline;
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 5px 14px;
|
|
||||||
background-color: $pager-bg;
|
|
||||||
border: 1px solid $pager-border;
|
|
||||||
border-radius: $pager-border-radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
> a:hover,
|
|
||||||
> a:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: $pager-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.next {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.previous {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.disabled {
|
|
||||||
> a,
|
|
||||||
> a:hover,
|
|
||||||
> a:focus,
|
|
||||||
> span {
|
|
||||||
color: $pager-disabled-color;
|
|
||||||
background-color: $pager-bg;
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,89 +0,0 @@
|
||||||
//
|
|
||||||
// Pagination (multiple pages)
|
|
||||||
// --------------------------------------------------
|
|
||||||
.pagination {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0;
|
|
||||||
margin: $line-height-computed 0;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
display: inline; // Remove list-style and block-level defaults
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
position: relative;
|
|
||||||
float: left; // Collapse white-space
|
|
||||||
padding: $padding-base-vertical $padding-base-horizontal;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
text-decoration: none;
|
|
||||||
color: $pagination-color;
|
|
||||||
background-color: $pagination-bg;
|
|
||||||
border: 1px solid $pagination-border;
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
&:first-child {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
margin-left: 0;
|
|
||||||
@include border-left-radius($border-radius-base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
@include border-right-radius($border-radius-base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> li > a,
|
|
||||||
> li > span {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
z-index: 2;
|
|
||||||
color: $pagination-hover-color;
|
|
||||||
background-color: $pagination-hover-bg;
|
|
||||||
border-color: $pagination-hover-border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active > a,
|
|
||||||
> .active > span {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
z-index: 3;
|
|
||||||
color: $pagination-active-color;
|
|
||||||
background-color: $pagination-active-bg;
|
|
||||||
border-color: $pagination-active-border;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .disabled {
|
|
||||||
> span,
|
|
||||||
> span:hover,
|
|
||||||
> span:focus,
|
|
||||||
> a,
|
|
||||||
> a:hover,
|
|
||||||
> a:focus {
|
|
||||||
color: $pagination-disabled-color;
|
|
||||||
background-color: $pagination-disabled-bg;
|
|
||||||
border-color: $pagination-disabled-border;
|
|
||||||
cursor: $cursor-disabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Large
|
|
||||||
.pagination-lg {
|
|
||||||
@include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Small
|
|
||||||
.pagination-sm {
|
|
||||||
@include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
|
|
||||||
}
|
|
|
@ -1,271 +0,0 @@
|
||||||
//
|
|
||||||
// Panels
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
.panel {
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
background-color: $panel-bg;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: $panel-border-radius;
|
|
||||||
@include box-shadow(0 1px 1px rgba(0,0,0,.05));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panel contents
|
|
||||||
.panel-body {
|
|
||||||
padding: $panel-body-padding;
|
|
||||||
@include clearfix;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional heading
|
|
||||||
.panel-heading {
|
|
||||||
padding: $panel-heading-padding;
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
@include border-top-radius(($panel-border-radius - 1));
|
|
||||||
|
|
||||||
> .dropdown .dropdown-toggle {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Within heading, strip any `h*` tag of its default margins for spacing.
|
|
||||||
.panel-title {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
font-size: ceil(($font-size-base * 1.125));
|
|
||||||
color: inherit;
|
|
||||||
|
|
||||||
> a,
|
|
||||||
> small,
|
|
||||||
> .small,
|
|
||||||
> small > a,
|
|
||||||
> .small > a {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional footer (stays gray in every modifier class)
|
|
||||||
.panel-footer {
|
|
||||||
padding: $panel-footer-padding;
|
|
||||||
background-color: $panel-footer-bg;
|
|
||||||
border-top: 1px solid $panel-inner-border;
|
|
||||||
@include border-bottom-radius(($panel-border-radius - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// List groups in panels
|
|
||||||
//
|
|
||||||
// By default, space out list group content from panel headings to account for
|
|
||||||
// any kind of custom content between the two.
|
|
||||||
|
|
||||||
.panel {
|
|
||||||
> .list-group,
|
|
||||||
> .panel-collapse > .list-group {
|
|
||||||
margin-bottom: 0;
|
|
||||||
|
|
||||||
.list-group-item {
|
|
||||||
border-width: 1px 0;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add border top radius for first one
|
|
||||||
&:first-child {
|
|
||||||
.list-group-item:first-child {
|
|
||||||
border-top: 0;
|
|
||||||
@include border-top-radius(($panel-border-radius - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add border bottom radius for last one
|
|
||||||
&:last-child {
|
|
||||||
.list-group-item:last-child {
|
|
||||||
border-bottom: 0;
|
|
||||||
@include border-bottom-radius(($panel-border-radius - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .panel-heading + .panel-collapse > .list-group {
|
|
||||||
.list-group-item:first-child {
|
|
||||||
@include border-top-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Collapse space between when there's no additional content.
|
|
||||||
.panel-heading + .list-group {
|
|
||||||
.list-group-item:first-child {
|
|
||||||
border-top-width: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.list-group + .panel-footer {
|
|
||||||
border-top-width: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tables in panels
|
|
||||||
//
|
|
||||||
// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
|
|
||||||
// watch it go full width.
|
|
||||||
|
|
||||||
.panel {
|
|
||||||
> .table,
|
|
||||||
> .table-responsive > .table,
|
|
||||||
> .panel-collapse > .table {
|
|
||||||
margin-bottom: 0;
|
|
||||||
|
|
||||||
caption {
|
|
||||||
padding-left: $panel-body-padding;
|
|
||||||
padding-right: $panel-body-padding;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Add border top radius for first one
|
|
||||||
> .table:first-child,
|
|
||||||
> .table-responsive:first-child > .table:first-child {
|
|
||||||
@include border-top-radius(($panel-border-radius - 1));
|
|
||||||
|
|
||||||
> thead:first-child,
|
|
||||||
> tbody:first-child {
|
|
||||||
> tr:first-child {
|
|
||||||
border-top-left-radius: ($panel-border-radius - 1);
|
|
||||||
border-top-right-radius: ($panel-border-radius - 1);
|
|
||||||
|
|
||||||
td:first-child,
|
|
||||||
th:first-child {
|
|
||||||
border-top-left-radius: ($panel-border-radius - 1);
|
|
||||||
}
|
|
||||||
td:last-child,
|
|
||||||
th:last-child {
|
|
||||||
border-top-right-radius: ($panel-border-radius - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Add border bottom radius for last one
|
|
||||||
> .table:last-child,
|
|
||||||
> .table-responsive:last-child > .table:last-child {
|
|
||||||
@include border-bottom-radius(($panel-border-radius - 1));
|
|
||||||
|
|
||||||
> tbody:last-child,
|
|
||||||
> tfoot:last-child {
|
|
||||||
> tr:last-child {
|
|
||||||
border-bottom-left-radius: ($panel-border-radius - 1);
|
|
||||||
border-bottom-right-radius: ($panel-border-radius - 1);
|
|
||||||
|
|
||||||
td:first-child,
|
|
||||||
th:first-child {
|
|
||||||
border-bottom-left-radius: ($panel-border-radius - 1);
|
|
||||||
}
|
|
||||||
td:last-child,
|
|
||||||
th:last-child {
|
|
||||||
border-bottom-right-radius: ($panel-border-radius - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .panel-body + .table,
|
|
||||||
> .panel-body + .table-responsive,
|
|
||||||
> .table + .panel-body,
|
|
||||||
> .table-responsive + .panel-body {
|
|
||||||
border-top: 1px solid $table-border-color;
|
|
||||||
}
|
|
||||||
> .table > tbody:first-child > tr:first-child th,
|
|
||||||
> .table > tbody:first-child > tr:first-child td {
|
|
||||||
border-top: 0;
|
|
||||||
}
|
|
||||||
> .table-bordered,
|
|
||||||
> .table-responsive > .table-bordered {
|
|
||||||
border: 0;
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th:first-child,
|
|
||||||
> td:first-child {
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
> th:last-child,
|
|
||||||
> td:last-child {
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> thead,
|
|
||||||
> tbody {
|
|
||||||
> tr:first-child {
|
|
||||||
> td,
|
|
||||||
> th {
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr:last-child {
|
|
||||||
> td,
|
|
||||||
> th {
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .table-responsive {
|
|
||||||
border: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Collapsable panels (aka, accordion)
|
|
||||||
//
|
|
||||||
// Wrap a series of panels in `.panel-group` to turn them into an accordion with
|
|
||||||
// the help of our collapse JavaScript plugin.
|
|
||||||
|
|
||||||
.panel-group {
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
|
|
||||||
// Tighten up margin so it's only between panels
|
|
||||||
.panel {
|
|
||||||
margin-bottom: 0;
|
|
||||||
border-radius: $panel-border-radius;
|
|
||||||
|
|
||||||
+ .panel {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-heading {
|
|
||||||
border-bottom: 0;
|
|
||||||
|
|
||||||
+ .panel-collapse > .panel-body,
|
|
||||||
+ .panel-collapse > .list-group {
|
|
||||||
border-top: 1px solid $panel-inner-border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-footer {
|
|
||||||
border-top: 0;
|
|
||||||
+ .panel-collapse .panel-body {
|
|
||||||
border-bottom: 1px solid $panel-inner-border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Contextual variations
|
|
||||||
.panel-default {
|
|
||||||
@include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
|
|
||||||
}
|
|
||||||
.panel-primary {
|
|
||||||
@include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
|
|
||||||
}
|
|
||||||
.panel-success {
|
|
||||||
@include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
|
|
||||||
}
|
|
||||||
.panel-info {
|
|
||||||
@include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
|
|
||||||
}
|
|
||||||
.panel-warning {
|
|
||||||
@include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
|
|
||||||
}
|
|
||||||
.panel-danger {
|
|
||||||
@include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
|
|
||||||
}
|
|
|
@ -1,131 +0,0 @@
|
||||||
//
|
|
||||||
// Popovers
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.popover {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-popover;
|
|
||||||
display: none;
|
|
||||||
max-width: $popover-max-width;
|
|
||||||
padding: 1px;
|
|
||||||
// Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.
|
|
||||||
// So reset our font and text properties to avoid inheriting weird values.
|
|
||||||
@include reset-text;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
|
|
||||||
background-color: $popover-bg;
|
|
||||||
background-clip: padding-box;
|
|
||||||
border: 1px solid $popover-fallback-border-color;
|
|
||||||
border: 1px solid $popover-border-color;
|
|
||||||
border-radius: $border-radius-large;
|
|
||||||
@include box-shadow(0 5px 10px rgba(0,0,0,.2));
|
|
||||||
|
|
||||||
// Offset the popover to account for the popover arrow
|
|
||||||
&.top { margin-top: -$popover-arrow-width; }
|
|
||||||
&.right { margin-left: $popover-arrow-width; }
|
|
||||||
&.bottom { margin-top: $popover-arrow-width; }
|
|
||||||
&.left { margin-left: -$popover-arrow-width; }
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-title {
|
|
||||||
margin: 0; // reset heading margin
|
|
||||||
padding: 8px 14px;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
background-color: $popover-title-bg;
|
|
||||||
border-bottom: 1px solid darken($popover-title-bg, 5%);
|
|
||||||
border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-content {
|
|
||||||
padding: 9px 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arrows
|
|
||||||
//
|
|
||||||
// .arrow is outer, .arrow:after is inner
|
|
||||||
|
|
||||||
.popover > .arrow {
|
|
||||||
&,
|
|
||||||
&:after {
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
border-color: transparent;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.popover > .arrow {
|
|
||||||
border-width: $popover-arrow-outer-width;
|
|
||||||
}
|
|
||||||
.popover > .arrow:after {
|
|
||||||
border-width: $popover-arrow-width;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover {
|
|
||||||
&.top > .arrow {
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -$popover-arrow-outer-width;
|
|
||||||
border-bottom-width: 0;
|
|
||||||
border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-top-color: $popover-arrow-outer-color;
|
|
||||||
bottom: -$popover-arrow-outer-width;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
bottom: 1px;
|
|
||||||
margin-left: -$popover-arrow-width;
|
|
||||||
border-bottom-width: 0;
|
|
||||||
border-top-color: $popover-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.right > .arrow {
|
|
||||||
top: 50%;
|
|
||||||
left: -$popover-arrow-outer-width;
|
|
||||||
margin-top: -$popover-arrow-outer-width;
|
|
||||||
border-left-width: 0;
|
|
||||||
border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-right-color: $popover-arrow-outer-color;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
left: 1px;
|
|
||||||
bottom: -$popover-arrow-width;
|
|
||||||
border-left-width: 0;
|
|
||||||
border-right-color: $popover-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.bottom > .arrow {
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -$popover-arrow-outer-width;
|
|
||||||
border-top-width: 0;
|
|
||||||
border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-bottom-color: $popover-arrow-outer-color;
|
|
||||||
top: -$popover-arrow-outer-width;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
top: 1px;
|
|
||||||
margin-left: -$popover-arrow-width;
|
|
||||||
border-top-width: 0;
|
|
||||||
border-bottom-color: $popover-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.left > .arrow {
|
|
||||||
top: 50%;
|
|
||||||
right: -$popover-arrow-outer-width;
|
|
||||||
margin-top: -$popover-arrow-outer-width;
|
|
||||||
border-right-width: 0;
|
|
||||||
border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-left-color: $popover-arrow-outer-color;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
right: 1px;
|
|
||||||
border-right-width: 0;
|
|
||||||
border-left-color: $popover-arrow-color;
|
|
||||||
bottom: -$popover-arrow-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Print styles.
|
|
||||||
// Inlined to avoid the additional HTTP request: h5bp.com/r
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
*,
|
|
||||||
*:before,
|
|
||||||
*:after {
|
|
||||||
background: transparent !important;
|
|
||||||
color: #000 !important; // Black prints faster: h5bp.com/s
|
|
||||||
box-shadow: none !important;
|
|
||||||
text-shadow: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,
|
|
||||||
a:visited {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
a[href]:after {
|
|
||||||
content: " (" attr(href) ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
abbr[title]:after {
|
|
||||||
content: " (" attr(title) ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't show links that are fragment identifiers,
|
|
||||||
// or use the `javascript:` pseudo protocol
|
|
||||||
a[href^="#"]:after,
|
|
||||||
a[href^="javascript:"]:after {
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
pre,
|
|
||||||
blockquote {
|
|
||||||
border: 1px solid #999;
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead {
|
|
||||||
display: table-header-group; // h5bp.com/t
|
|
||||||
}
|
|
||||||
|
|
||||||
tr,
|
|
||||||
img {
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
max-width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap specific changes start
|
|
||||||
|
|
||||||
// Bootstrap components
|
|
||||||
.navbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.btn,
|
|
||||||
.dropup > .btn {
|
|
||||||
> .caret {
|
|
||||||
border-top-color: #000 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.label {
|
|
||||||
border: 1px solid #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table {
|
|
||||||
border-collapse: collapse !important;
|
|
||||||
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
background-color: #fff !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.table-bordered {
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
border: 1px solid #ddd !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap specific changes end
|
|
||||||
}
|
|
|
@ -1,87 +0,0 @@
|
||||||
//
|
|
||||||
// Progress bars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Bar animations
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// WebKit
|
|
||||||
@-webkit-keyframes progress-bar-stripes {
|
|
||||||
from { background-position: 40px 0; }
|
|
||||||
to { background-position: 0 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Spec and IE10+
|
|
||||||
@keyframes progress-bar-stripes {
|
|
||||||
from { background-position: 40px 0; }
|
|
||||||
to { background-position: 0 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Bar itself
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Outer container
|
|
||||||
.progress {
|
|
||||||
overflow: hidden;
|
|
||||||
height: $line-height-computed;
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
background-color: $progress-bg;
|
|
||||||
border-radius: $progress-border-radius;
|
|
||||||
@include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bar of progress
|
|
||||||
.progress-bar {
|
|
||||||
float: left;
|
|
||||||
width: 0%;
|
|
||||||
height: 100%;
|
|
||||||
font-size: $font-size-small;
|
|
||||||
line-height: $line-height-computed;
|
|
||||||
color: $progress-bar-color;
|
|
||||||
text-align: center;
|
|
||||||
background-color: $progress-bar-bg;
|
|
||||||
@include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
|
|
||||||
@include transition(width .6s ease);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Striped bars
|
|
||||||
//
|
|
||||||
// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
|
|
||||||
// `.progress-bar-striped` class, which you just add to an existing
|
|
||||||
// `.progress-bar`.
|
|
||||||
.progress-striped .progress-bar,
|
|
||||||
.progress-bar-striped {
|
|
||||||
@include gradient-striped;
|
|
||||||
background-size: 40px 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call animation for the active one
|
|
||||||
//
|
|
||||||
// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
|
|
||||||
// `.progress-bar.active` approach.
|
|
||||||
.progress.active .progress-bar,
|
|
||||||
.progress-bar.active {
|
|
||||||
@include animation(progress-bar-stripes 2s linear infinite);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Variations
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.progress-bar-success {
|
|
||||||
@include progress-bar-variant($progress-bar-success-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar-info {
|
|
||||||
@include progress-bar-variant($progress-bar-info-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar-warning {
|
|
||||||
@include progress-bar-variant($progress-bar-warning-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar-danger {
|
|
||||||
@include progress-bar-variant($progress-bar-danger-bg);
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
// Embeds responsive
|
|
||||||
//
|
|
||||||
// Credit: Nicolas Gallagher and SUIT CSS.
|
|
||||||
|
|
||||||
.embed-responsive {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
height: 0;
|
|
||||||
padding: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.embed-responsive-item,
|
|
||||||
iframe,
|
|
||||||
embed,
|
|
||||||
object,
|
|
||||||
video {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modifier class for 16:9 aspect ratio
|
|
||||||
.embed-responsive-16by9 {
|
|
||||||
padding-bottom: 56.25%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modifier class for 4:3 aspect ratio
|
|
||||||
.embed-responsive-4by3 {
|
|
||||||
padding-bottom: 75%;
|
|
||||||
}
|
|
|
@ -1,179 +0,0 @@
|
||||||
//
|
|
||||||
// Responsive: Utility classes
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// IE10 in Windows (Phone) 8
|
|
||||||
//
|
|
||||||
// Support for responsive views via media queries is kind of borked in IE10, for
|
|
||||||
// Surface/desktop in split view and for Windows Phone 8. This particular fix
|
|
||||||
// must be accompanied by a snippet of JavaScript to sniff the user agent and
|
|
||||||
// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
|
|
||||||
// our Getting Started page for more information on this bug.
|
|
||||||
//
|
|
||||||
// For more information, see the following:
|
|
||||||
//
|
|
||||||
// Issue: https://github.com/twbs/bootstrap/issues/10497
|
|
||||||
// Docs: http://getbootstrap.com/getting-started/#support-ie10-width
|
|
||||||
// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
|
|
||||||
// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
|
|
||||||
|
|
||||||
@at-root {
|
|
||||||
@-ms-viewport {
|
|
||||||
width: device-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Visibility utilities
|
|
||||||
// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
|
|
||||||
|
|
||||||
@include responsive-invisibility('.visible-xs');
|
|
||||||
@include responsive-invisibility('.visible-sm');
|
|
||||||
@include responsive-invisibility('.visible-md');
|
|
||||||
@include responsive-invisibility('.visible-lg');
|
|
||||||
|
|
||||||
.visible-xs-block,
|
|
||||||
.visible-xs-inline,
|
|
||||||
.visible-xs-inline-block,
|
|
||||||
.visible-sm-block,
|
|
||||||
.visible-sm-inline,
|
|
||||||
.visible-sm-inline-block,
|
|
||||||
.visible-md-block,
|
|
||||||
.visible-md-inline,
|
|
||||||
.visible-md-inline-block,
|
|
||||||
.visible-lg-block,
|
|
||||||
.visible-lg-inline,
|
|
||||||
.visible-lg-inline-block {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $screen-xs-max) {
|
|
||||||
@include responsive-visibility('.visible-xs');
|
|
||||||
}
|
|
||||||
.visible-xs-block {
|
|
||||||
@media (max-width: $screen-xs-max) {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-xs-inline {
|
|
||||||
@media (max-width: $screen-xs-max) {
|
|
||||||
display: inline !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-xs-inline-block {
|
|
||||||
@media (max-width: $screen-xs-max) {
|
|
||||||
display: inline-block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
|
||||||
@include responsive-visibility('.visible-sm');
|
|
||||||
}
|
|
||||||
.visible-sm-block {
|
|
||||||
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-sm-inline {
|
|
||||||
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
|
||||||
display: inline !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-sm-inline-block {
|
|
||||||
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
|
||||||
display: inline-block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
|
||||||
@include responsive-visibility('.visible-md');
|
|
||||||
}
|
|
||||||
.visible-md-block {
|
|
||||||
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-md-inline {
|
|
||||||
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
|
||||||
display: inline !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-md-inline-block {
|
|
||||||
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
|
||||||
display: inline-block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-lg-min) {
|
|
||||||
@include responsive-visibility('.visible-lg');
|
|
||||||
}
|
|
||||||
.visible-lg-block {
|
|
||||||
@media (min-width: $screen-lg-min) {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-lg-inline {
|
|
||||||
@media (min-width: $screen-lg-min) {
|
|
||||||
display: inline !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-lg-inline-block {
|
|
||||||
@media (min-width: $screen-lg-min) {
|
|
||||||
display: inline-block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $screen-xs-max) {
|
|
||||||
@include responsive-invisibility('.hidden-xs');
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
|
||||||
@include responsive-invisibility('.hidden-sm');
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
|
||||||
@include responsive-invisibility('.hidden-md');
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $screen-lg-min) {
|
|
||||||
@include responsive-invisibility('.hidden-lg');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Print utilities
|
|
||||||
//
|
|
||||||
// Media queries are placed on the inside to be mixin-friendly.
|
|
||||||
|
|
||||||
// Note: Deprecated .visible-print as of v3.2.0
|
|
||||||
|
|
||||||
@include responsive-invisibility('.visible-print');
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
@include responsive-visibility('.visible-print');
|
|
||||||
}
|
|
||||||
.visible-print-block {
|
|
||||||
display: none !important;
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-print-inline {
|
|
||||||
display: none !important;
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
display: inline !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-print-inline-block {
|
|
||||||
display: none !important;
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
display: inline-block !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
@include responsive-invisibility('.hidden-print');
|
|
||||||
}
|
|
|
@ -1,161 +0,0 @@
|
||||||
//
|
|
||||||
// Scaffolding
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Reset the box-sizing
|
|
||||||
//
|
|
||||||
// Heads up! This reset may cause conflicts with some third-party widgets.
|
|
||||||
// For recommendations on resolving such conflicts, see
|
|
||||||
// http://getbootstrap.com/getting-started/#third-box-sizing
|
|
||||||
* {
|
|
||||||
@include box-sizing(border-box);
|
|
||||||
}
|
|
||||||
*:before,
|
|
||||||
*:after {
|
|
||||||
@include box-sizing(border-box);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Body reset
|
|
||||||
|
|
||||||
html {
|
|
||||||
font-size: 10px;
|
|
||||||
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: $font-family-base;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
color: $text-color;
|
|
||||||
background-color: $body-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset fonts for relevant elements
|
|
||||||
input,
|
|
||||||
button,
|
|
||||||
select,
|
|
||||||
textarea {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Links
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: $link-color;
|
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: $link-hover-color;
|
|
||||||
text-decoration: $link-hover-decoration;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
@include tab-focus;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Figures
|
|
||||||
//
|
|
||||||
// We reset this here because previously Normalize had no `figure` margins. This
|
|
||||||
// ensures we don't break anyone's use of the element.
|
|
||||||
|
|
||||||
figure {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Images
|
|
||||||
|
|
||||||
img {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Responsive images (ensure images don't scale beyond their parents)
|
|
||||||
.img-responsive {
|
|
||||||
@include img-responsive;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rounded corners
|
|
||||||
.img-rounded {
|
|
||||||
border-radius: $border-radius-large;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Image thumbnails
|
|
||||||
//
|
|
||||||
// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
|
|
||||||
.img-thumbnail {
|
|
||||||
padding: $thumbnail-padding;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
background-color: $thumbnail-bg;
|
|
||||||
border: 1px solid $thumbnail-border;
|
|
||||||
border-radius: $thumbnail-border-radius;
|
|
||||||
@include transition(all .2s ease-in-out);
|
|
||||||
|
|
||||||
// Keep them at most 100% wide
|
|
||||||
@include img-responsive(inline-block);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perfect circle
|
|
||||||
.img-circle {
|
|
||||||
border-radius: 50%; // set radius in percents
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Horizontal rules
|
|
||||||
|
|
||||||
hr {
|
|
||||||
margin-top: $line-height-computed;
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
border: 0;
|
|
||||||
border-top: 1px solid $hr-border;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Only display content to screen readers
|
|
||||||
//
|
|
||||||
// See: http://a11yproject.com/posts/how-to-hide-content/
|
|
||||||
|
|
||||||
.sr-only {
|
|
||||||
position: absolute;
|
|
||||||
width: 1px;
|
|
||||||
height: 1px;
|
|
||||||
margin: -1px;
|
|
||||||
padding: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
clip: rect(0,0,0,0);
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use in conjunction with .sr-only to only display content when it's focused.
|
|
||||||
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
|
|
||||||
// Credit: HTML5 Boilerplate
|
|
||||||
|
|
||||||
.sr-only-focusable {
|
|
||||||
&:active,
|
|
||||||
&:focus {
|
|
||||||
position: static;
|
|
||||||
width: auto;
|
|
||||||
height: auto;
|
|
||||||
margin: 0;
|
|
||||||
overflow: visible;
|
|
||||||
clip: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// iOS "clickable elements" fix for role="button"
|
|
||||||
//
|
|
||||||
// Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
|
|
||||||
// for traditionally non-focusable elements with role="button"
|
|
||||||
// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
|
|
||||||
|
|
||||||
[role="button"] {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
|
@ -1,234 +0,0 @@
|
||||||
//
|
|
||||||
// Tables
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
table {
|
|
||||||
background-color: $table-bg;
|
|
||||||
}
|
|
||||||
caption {
|
|
||||||
padding-top: $table-cell-padding;
|
|
||||||
padding-bottom: $table-cell-padding;
|
|
||||||
color: $text-muted;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Baseline styles
|
|
||||||
|
|
||||||
.table {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
// Cells
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
padding: $table-cell-padding;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
vertical-align: top;
|
|
||||||
border-top: 1px solid $table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Bottom align for column headings
|
|
||||||
> thead > tr > th {
|
|
||||||
vertical-align: bottom;
|
|
||||||
border-bottom: 2px solid $table-border-color;
|
|
||||||
}
|
|
||||||
// Remove top border from thead by default
|
|
||||||
> caption + thead,
|
|
||||||
> colgroup + thead,
|
|
||||||
> thead:first-child {
|
|
||||||
> tr:first-child {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
border-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Account for multiple tbody instances
|
|
||||||
> tbody + tbody {
|
|
||||||
border-top: 2px solid $table-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nesting
|
|
||||||
.table {
|
|
||||||
background-color: $body-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Condensed table w/ half padding
|
|
||||||
|
|
||||||
.table-condensed {
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
padding: $table-condensed-cell-padding;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Bordered version
|
|
||||||
//
|
|
||||||
// Add borders all around the table and between all the columns.
|
|
||||||
|
|
||||||
.table-bordered {
|
|
||||||
border: 1px solid $table-border-color;
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
border: 1px solid $table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> thead > tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
border-bottom-width: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Zebra-striping
|
|
||||||
//
|
|
||||||
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
|
|
||||||
|
|
||||||
.table-striped {
|
|
||||||
> tbody > tr:nth-of-type(odd) {
|
|
||||||
background-color: $table-bg-accent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Hover effect
|
|
||||||
//
|
|
||||||
// Placed here since it has to come after the potential zebra striping
|
|
||||||
|
|
||||||
.table-hover {
|
|
||||||
> tbody > tr:hover {
|
|
||||||
background-color: $table-bg-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Table cell sizing
|
|
||||||
//
|
|
||||||
// Reset default table behavior
|
|
||||||
|
|
||||||
table col[class*="col-"] {
|
|
||||||
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
|
|
||||||
float: none;
|
|
||||||
display: table-column;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
&[class*="col-"] {
|
|
||||||
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
|
|
||||||
float: none;
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Table backgrounds
|
|
||||||
//
|
|
||||||
// Exact selectors below required to override `.table-striped` and prevent
|
|
||||||
// inheritance to nested tables.
|
|
||||||
|
|
||||||
// Generate the contextual variants
|
|
||||||
@include table-row-variant('active', $table-bg-active);
|
|
||||||
@include table-row-variant('success', $state-success-bg);
|
|
||||||
@include table-row-variant('info', $state-info-bg);
|
|
||||||
@include table-row-variant('warning', $state-warning-bg);
|
|
||||||
@include table-row-variant('danger', $state-danger-bg);
|
|
||||||
|
|
||||||
|
|
||||||
// Responsive tables
|
|
||||||
//
|
|
||||||
// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
|
|
||||||
// by enabling horizontal scrolling. Only applies <768px. Everything above that
|
|
||||||
// will display normally.
|
|
||||||
|
|
||||||
.table-responsive {
|
|
||||||
overflow-x: auto;
|
|
||||||
min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
|
|
||||||
|
|
||||||
@media screen and (max-width: $screen-xs-max) {
|
|
||||||
width: 100%;
|
|
||||||
margin-bottom: ($line-height-computed * 0.75);
|
|
||||||
overflow-y: hidden;
|
|
||||||
-ms-overflow-style: -ms-autohiding-scrollbar;
|
|
||||||
border: 1px solid $table-border-color;
|
|
||||||
|
|
||||||
// Tighten up spacing
|
|
||||||
> .table {
|
|
||||||
margin-bottom: 0;
|
|
||||||
|
|
||||||
// Ensure the content doesn't wrap
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special overrides for the bordered tables
|
|
||||||
> .table-bordered {
|
|
||||||
border: 0;
|
|
||||||
|
|
||||||
// Nuke the appropriate borders so that the parent can handle them
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th:first-child,
|
|
||||||
> td:first-child {
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
> th:last-child,
|
|
||||||
> td:last-child {
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only nuke the last row's bottom-border in `tbody` and `tfoot` since
|
|
||||||
// chances are there will be only one `tr` in a `thead` and that would
|
|
||||||
// remove the border altogether.
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr:last-child {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,291 +0,0 @@
|
||||||
/*!
|
|
||||||
* Bootstrap v3.3.6 (http://getbootstrap.com)
|
|
||||||
* Copyright 2011-2015 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
//
|
|
||||||
// Load core variables and mixins
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
@import "variables";
|
|
||||||
@import "mixins";
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Buttons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.btn-default,
|
|
||||||
.btn-primary,
|
|
||||||
.btn-success,
|
|
||||||
.btn-info,
|
|
||||||
.btn-warning,
|
|
||||||
.btn-danger {
|
|
||||||
text-shadow: 0 -1px 0 rgba(0,0,0,.2);
|
|
||||||
$shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
|
|
||||||
@include box-shadow($shadow);
|
|
||||||
|
|
||||||
// Reset the shadow
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
@include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled,
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
|
|
||||||
.badge {
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
@mixin btn-styles($btn-color: #555) {
|
|
||||||
@include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%));
|
|
||||||
@include reset-filter; // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
border-color: darken($btn-color, 14%);
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: darken($btn-color, 12%);
|
|
||||||
background-position: 0 -15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
background-color: darken($btn-color, 12%);
|
|
||||||
border-color: darken($btn-color, 14%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled,
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&.focus,
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
background-color: darken($btn-color, 12%);
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.btn {
|
|
||||||
// Remove the gradient for the pressed/active state
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the buttons
|
|
||||||
.btn-default { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
|
|
||||||
.btn-primary { @include btn-styles($btn-primary-bg); }
|
|
||||||
.btn-success { @include btn-styles($btn-success-bg); }
|
|
||||||
.btn-info { @include btn-styles($btn-info-bg); }
|
|
||||||
.btn-warning { @include btn-styles($btn-warning-bg); }
|
|
||||||
.btn-danger { @include btn-styles($btn-danger-bg); }
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Images
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.thumbnail,
|
|
||||||
.img-thumbnail {
|
|
||||||
@include box-shadow(0 1px 2px rgba(0,0,0,.075));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Dropdowns
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.dropdown-menu > li > a:hover,
|
|
||||||
.dropdown-menu > li > a:focus {
|
|
||||||
@include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%));
|
|
||||||
background-color: darken($dropdown-link-hover-bg, 5%);
|
|
||||||
}
|
|
||||||
.dropdown-menu > .active > a,
|
|
||||||
.dropdown-menu > .active > a:hover,
|
|
||||||
.dropdown-menu > .active > a:focus {
|
|
||||||
@include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
|
|
||||||
background-color: darken($dropdown-link-active-bg, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Navbar
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Default navbar
|
|
||||||
.navbar-default {
|
|
||||||
@include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg);
|
|
||||||
@include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
|
|
||||||
border-radius: $navbar-border-radius;
|
|
||||||
$shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
|
|
||||||
@include box-shadow($shadow);
|
|
||||||
|
|
||||||
.navbar-nav > .open > a,
|
|
||||||
.navbar-nav > .active > a {
|
|
||||||
@include gradient-vertical($start-color: darken($navbar-default-link-active-bg, 5%), $end-color: darken($navbar-default-link-active-bg, 2%));
|
|
||||||
@include box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navbar-brand,
|
|
||||||
.navbar-nav > li > a {
|
|
||||||
text-shadow: 0 1px 0 rgba(255,255,255,.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inverted navbar
|
|
||||||
.navbar-inverse {
|
|
||||||
@include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg);
|
|
||||||
@include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
|
|
||||||
border-radius: $navbar-border-radius;
|
|
||||||
.navbar-nav > .open > a,
|
|
||||||
.navbar-nav > .active > a {
|
|
||||||
@include gradient-vertical($start-color: $navbar-inverse-link-active-bg, $end-color: lighten($navbar-inverse-link-active-bg, 2.5%));
|
|
||||||
@include box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-brand,
|
|
||||||
.navbar-nav > li > a {
|
|
||||||
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Undo rounded corners in static and fixed navbars
|
|
||||||
.navbar-static-top,
|
|
||||||
.navbar-fixed-top,
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix active state of dropdown items in collapsed mode
|
|
||||||
@media (max-width: $grid-float-breakpoint-max) {
|
|
||||||
.navbar .navbar-nav .open .dropdown-menu > .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: #fff;
|
|
||||||
@include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Alerts
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.alert {
|
|
||||||
text-shadow: 0 1px 0 rgba(255,255,255,.2);
|
|
||||||
$shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
|
|
||||||
@include box-shadow($shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
@mixin alert-styles($color) {
|
|
||||||
@include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%));
|
|
||||||
border-color: darken($color, 15%);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the alerts
|
|
||||||
.alert-success { @include alert-styles($alert-success-bg); }
|
|
||||||
.alert-info { @include alert-styles($alert-info-bg); }
|
|
||||||
.alert-warning { @include alert-styles($alert-warning-bg); }
|
|
||||||
.alert-danger { @include alert-styles($alert-danger-bg); }
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Progress bars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Give the progress background some depth
|
|
||||||
.progress {
|
|
||||||
@include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
@mixin progress-bar-styles($color) {
|
|
||||||
@include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the progress bars
|
|
||||||
.progress-bar { @include progress-bar-styles($progress-bar-bg); }
|
|
||||||
.progress-bar-success { @include progress-bar-styles($progress-bar-success-bg); }
|
|
||||||
.progress-bar-info { @include progress-bar-styles($progress-bar-info-bg); }
|
|
||||||
.progress-bar-warning { @include progress-bar-styles($progress-bar-warning-bg); }
|
|
||||||
.progress-bar-danger { @include progress-bar-styles($progress-bar-danger-bg); }
|
|
||||||
|
|
||||||
// Reset the striped class because our mixins don't do multiple gradients and
|
|
||||||
// the above custom styles override the new `.progress-bar-striped` in v3.2.0.
|
|
||||||
.progress-bar-striped {
|
|
||||||
@include gradient-striped;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// List groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.list-group {
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
@include box-shadow(0 1px 2px rgba(0,0,0,.075));
|
|
||||||
}
|
|
||||||
.list-group-item.active,
|
|
||||||
.list-group-item.active:hover,
|
|
||||||
.list-group-item.active:focus {
|
|
||||||
text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%);
|
|
||||||
@include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%));
|
|
||||||
border-color: darken($list-group-active-border, 7.5%);
|
|
||||||
|
|
||||||
.badge {
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Panels
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.panel {
|
|
||||||
@include box-shadow(0 1px 2px rgba(0,0,0,.05));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
@mixin panel-heading-styles($color) {
|
|
||||||
@include gradient-vertical($start-color: $color, $end-color: darken($color, 5%));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the panel headings only
|
|
||||||
.panel-default > .panel-heading { @include panel-heading-styles($panel-default-heading-bg); }
|
|
||||||
.panel-primary > .panel-heading { @include panel-heading-styles($panel-primary-heading-bg); }
|
|
||||||
.panel-success > .panel-heading { @include panel-heading-styles($panel-success-heading-bg); }
|
|
||||||
.panel-info > .panel-heading { @include panel-heading-styles($panel-info-heading-bg); }
|
|
||||||
.panel-warning > .panel-heading { @include panel-heading-styles($panel-warning-heading-bg); }
|
|
||||||
.panel-danger > .panel-heading { @include panel-heading-styles($panel-danger-heading-bg); }
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Wells
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.well {
|
|
||||||
@include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg);
|
|
||||||
border-color: darken($well-bg, 10%);
|
|
||||||
$shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
|
|
||||||
@include box-shadow($shadow);
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
//
|
|
||||||
// Thumbnails
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Mixin and adjust the regular image class
|
|
||||||
.thumbnail {
|
|
||||||
display: block;
|
|
||||||
padding: $thumbnail-padding;
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
background-color: $thumbnail-bg;
|
|
||||||
border: 1px solid $thumbnail-border;
|
|
||||||
border-radius: $thumbnail-border-radius;
|
|
||||||
@include transition(border .2s ease-in-out);
|
|
||||||
|
|
||||||
> img,
|
|
||||||
a > img {
|
|
||||||
@include img-responsive;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
|
|
||||||
|
|
||||||
// Image captions
|
|
||||||
.caption {
|
|
||||||
padding: $thumbnail-caption-padding;
|
|
||||||
color: $thumbnail-caption-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a hover state for linked versions only
|
|
||||||
a.thumbnail:hover,
|
|
||||||
a.thumbnail:focus,
|
|
||||||
a.thumbnail.active {
|
|
||||||
border-color: $link-color;
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
//
|
|
||||||
// Tooltips
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
.tooltip {
|
|
||||||
position: absolute;
|
|
||||||
z-index: $zindex-tooltip;
|
|
||||||
display: block;
|
|
||||||
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
|
|
||||||
// So reset our font and text properties to avoid inheriting weird values.
|
|
||||||
@include reset-text;
|
|
||||||
font-size: $font-size-small;
|
|
||||||
|
|
||||||
@include opacity(0);
|
|
||||||
|
|
||||||
&.in { @include opacity($tooltip-opacity); }
|
|
||||||
&.top { margin-top: -3px; padding: $tooltip-arrow-width 0; }
|
|
||||||
&.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; }
|
|
||||||
&.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; }
|
|
||||||
&.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrapper for the tooltip content
|
|
||||||
.tooltip-inner {
|
|
||||||
max-width: $tooltip-max-width;
|
|
||||||
padding: 3px 8px;
|
|
||||||
color: $tooltip-color;
|
|
||||||
text-align: center;
|
|
||||||
background-color: $tooltip-bg;
|
|
||||||
border-radius: $border-radius-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arrows
|
|
||||||
.tooltip-arrow {
|
|
||||||
position: absolute;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
border-color: transparent;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
|
|
||||||
.tooltip {
|
|
||||||
&.top .tooltip-arrow {
|
|
||||||
bottom: 0;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -$tooltip-arrow-width;
|
|
||||||
border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
|
|
||||||
border-top-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.top-left .tooltip-arrow {
|
|
||||||
bottom: 0;
|
|
||||||
right: $tooltip-arrow-width;
|
|
||||||
margin-bottom: -$tooltip-arrow-width;
|
|
||||||
border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
|
|
||||||
border-top-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.top-right .tooltip-arrow {
|
|
||||||
bottom: 0;
|
|
||||||
left: $tooltip-arrow-width;
|
|
||||||
margin-bottom: -$tooltip-arrow-width;
|
|
||||||
border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
|
|
||||||
border-top-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.right .tooltip-arrow {
|
|
||||||
top: 50%;
|
|
||||||
left: 0;
|
|
||||||
margin-top: -$tooltip-arrow-width;
|
|
||||||
border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
|
|
||||||
border-right-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.left .tooltip-arrow {
|
|
||||||
top: 50%;
|
|
||||||
right: 0;
|
|
||||||
margin-top: -$tooltip-arrow-width;
|
|
||||||
border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
|
|
||||||
border-left-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.bottom .tooltip-arrow {
|
|
||||||
top: 0;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -$tooltip-arrow-width;
|
|
||||||
border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
|
|
||||||
border-bottom-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.bottom-left .tooltip-arrow {
|
|
||||||
top: 0;
|
|
||||||
right: $tooltip-arrow-width;
|
|
||||||
margin-top: -$tooltip-arrow-width;
|
|
||||||
border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
|
|
||||||
border-bottom-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.bottom-right .tooltip-arrow {
|
|
||||||
top: 0;
|
|
||||||
left: $tooltip-arrow-width;
|
|
||||||
margin-top: -$tooltip-arrow-width;
|
|
||||||
border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
|
|
||||||
border-bottom-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,298 +0,0 @@
|
||||||
//
|
|
||||||
// Typography
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Headings
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6,
|
|
||||||
.h1, .h2, .h3, .h4, .h5, .h6 {
|
|
||||||
font-family: $headings-font-family;
|
|
||||||
font-weight: $headings-font-weight;
|
|
||||||
line-height: $headings-line-height;
|
|
||||||
color: $headings-color;
|
|
||||||
|
|
||||||
small,
|
|
||||||
.small {
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1;
|
|
||||||
color: $headings-small-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, .h1,
|
|
||||||
h2, .h2,
|
|
||||||
h3, .h3 {
|
|
||||||
margin-top: $line-height-computed;
|
|
||||||
margin-bottom: ($line-height-computed / 2);
|
|
||||||
|
|
||||||
small,
|
|
||||||
.small {
|
|
||||||
font-size: 65%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
h4, .h4,
|
|
||||||
h5, .h5,
|
|
||||||
h6, .h6 {
|
|
||||||
margin-top: ($line-height-computed / 2);
|
|
||||||
margin-bottom: ($line-height-computed / 2);
|
|
||||||
|
|
||||||
small,
|
|
||||||
.small {
|
|
||||||
font-size: 75%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, .h1 { font-size: $font-size-h1; }
|
|
||||||
h2, .h2 { font-size: $font-size-h2; }
|
|
||||||
h3, .h3 { font-size: $font-size-h3; }
|
|
||||||
h4, .h4 { font-size: $font-size-h4; }
|
|
||||||
h5, .h5 { font-size: $font-size-h5; }
|
|
||||||
h6, .h6 { font-size: $font-size-h6; }
|
|
||||||
|
|
||||||
|
|
||||||
// Body text
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0 0 ($line-height-computed / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.lead {
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
font-size: floor(($font-size-base * 1.15));
|
|
||||||
font-weight: 300;
|
|
||||||
line-height: 1.4;
|
|
||||||
|
|
||||||
@media (min-width: $screen-sm-min) {
|
|
||||||
font-size: ($font-size-base * 1.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Emphasis & misc
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Ex: (12px small font / 14px base font) * 100% = about 85%
|
|
||||||
small,
|
|
||||||
.small {
|
|
||||||
font-size: floor((100% * $font-size-small / $font-size-base));
|
|
||||||
}
|
|
||||||
|
|
||||||
mark,
|
|
||||||
.mark {
|
|
||||||
background-color: $state-warning-bg;
|
|
||||||
padding: .2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alignment
|
|
||||||
.text-left { text-align: left; }
|
|
||||||
.text-right { text-align: right; }
|
|
||||||
.text-center { text-align: center; }
|
|
||||||
.text-justify { text-align: justify; }
|
|
||||||
.text-nowrap { white-space: nowrap; }
|
|
||||||
|
|
||||||
// Transformation
|
|
||||||
.text-lowercase { text-transform: lowercase; }
|
|
||||||
.text-uppercase { text-transform: uppercase; }
|
|
||||||
.text-capitalize { text-transform: capitalize; }
|
|
||||||
|
|
||||||
// Contextual colors
|
|
||||||
.text-muted {
|
|
||||||
color: $text-muted;
|
|
||||||
}
|
|
||||||
|
|
||||||
@include text-emphasis-variant('.text-primary', $brand-primary);
|
|
||||||
|
|
||||||
@include text-emphasis-variant('.text-success', $state-success-text);
|
|
||||||
|
|
||||||
@include text-emphasis-variant('.text-info', $state-info-text);
|
|
||||||
|
|
||||||
@include text-emphasis-variant('.text-warning', $state-warning-text);
|
|
||||||
|
|
||||||
@include text-emphasis-variant('.text-danger', $state-danger-text);
|
|
||||||
|
|
||||||
// Contextual backgrounds
|
|
||||||
// For now we'll leave these alongside the text classes until v4 when we can
|
|
||||||
// safely shift things around (per SemVer rules).
|
|
||||||
.bg-primary {
|
|
||||||
// Given the contrast here, this is the only class to have its color inverted
|
|
||||||
// automatically.
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
@include bg-variant('.bg-primary', $brand-primary);
|
|
||||||
|
|
||||||
@include bg-variant('.bg-success', $state-success-bg);
|
|
||||||
|
|
||||||
@include bg-variant('.bg-info', $state-info-bg);
|
|
||||||
|
|
||||||
@include bg-variant('.bg-warning', $state-warning-bg);
|
|
||||||
|
|
||||||
@include bg-variant('.bg-danger', $state-danger-bg);
|
|
||||||
|
|
||||||
|
|
||||||
// Page header
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.page-header {
|
|
||||||
padding-bottom: (($line-height-computed / 2) - 1);
|
|
||||||
margin: ($line-height-computed * 2) 0 $line-height-computed;
|
|
||||||
border-bottom: 1px solid $page-header-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Lists
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Unordered and Ordered lists
|
|
||||||
ul,
|
|
||||||
ol {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: ($line-height-computed / 2);
|
|
||||||
ul,
|
|
||||||
ol {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// List options
|
|
||||||
|
|
||||||
// [converter] extracted from `.list-unstyled` for libsass compatibility
|
|
||||||
@mixin list-unstyled {
|
|
||||||
padding-left: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
// [converter] extracted as `@mixin list-unstyled` for libsass compatibility
|
|
||||||
.list-unstyled {
|
|
||||||
@include list-unstyled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Inline turns list items into inline-block
|
|
||||||
.list-inline {
|
|
||||||
@include list-unstyled;
|
|
||||||
margin-left: -5px;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 5px;
|
|
||||||
padding-right: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description Lists
|
|
||||||
dl {
|
|
||||||
margin-top: 0; // Remove browser default
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
}
|
|
||||||
dt,
|
|
||||||
dd {
|
|
||||||
line-height: $line-height-base;
|
|
||||||
}
|
|
||||||
dt {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
dd {
|
|
||||||
margin-left: 0; // Undo browser default
|
|
||||||
}
|
|
||||||
|
|
||||||
// Horizontal description lists
|
|
||||||
//
|
|
||||||
// Defaults to being stacked without any of the below styles applied, until the
|
|
||||||
// grid breakpoint is reached (default of ~768px).
|
|
||||||
|
|
||||||
.dl-horizontal {
|
|
||||||
dd {
|
|
||||||
@include clearfix; // Clear the floated `dt` if an empty `dd` is present
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $dl-horizontal-breakpoint) {
|
|
||||||
dt {
|
|
||||||
float: left;
|
|
||||||
width: ($dl-horizontal-offset - 20);
|
|
||||||
clear: left;
|
|
||||||
text-align: right;
|
|
||||||
@include text-overflow;
|
|
||||||
}
|
|
||||||
dd {
|
|
||||||
margin-left: $dl-horizontal-offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Misc
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Abbreviations and acronyms
|
|
||||||
abbr[title],
|
|
||||||
// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
|
|
||||||
abbr[data-original-title] {
|
|
||||||
cursor: help;
|
|
||||||
border-bottom: 1px dotted $abbr-border-color;
|
|
||||||
}
|
|
||||||
.initialism {
|
|
||||||
font-size: 90%;
|
|
||||||
@extend .text-uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blockquotes
|
|
||||||
blockquote {
|
|
||||||
padding: ($line-height-computed / 2) $line-height-computed;
|
|
||||||
margin: 0 0 $line-height-computed;
|
|
||||||
font-size: $blockquote-font-size;
|
|
||||||
border-left: 5px solid $blockquote-border-color;
|
|
||||||
|
|
||||||
p,
|
|
||||||
ul,
|
|
||||||
ol {
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: Deprecated small and .small as of v3.1.0
|
|
||||||
// Context: https://github.com/twbs/bootstrap/issues/11660
|
|
||||||
footer,
|
|
||||||
small,
|
|
||||||
.small {
|
|
||||||
display: block;
|
|
||||||
font-size: 80%; // back to default font-size
|
|
||||||
line-height: $line-height-base;
|
|
||||||
color: $blockquote-small-color;
|
|
||||||
|
|
||||||
&:before {
|
|
||||||
content: '\2014 \00A0'; // em dash, nbsp
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opposite alignment of blockquote
|
|
||||||
//
|
|
||||||
// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
|
|
||||||
.blockquote-reverse,
|
|
||||||
blockquote.pull-right {
|
|
||||||
padding-right: 15px;
|
|
||||||
padding-left: 0;
|
|
||||||
border-right: 5px solid $blockquote-border-color;
|
|
||||||
border-left: 0;
|
|
||||||
text-align: right;
|
|
||||||
|
|
||||||
// Account for citation
|
|
||||||
footer,
|
|
||||||
small,
|
|
||||||
.small {
|
|
||||||
&:before { content: ''; }
|
|
||||||
&:after {
|
|
||||||
content: '\00A0 \2014'; // nbsp, em dash
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addresses
|
|
||||||
address {
|
|
||||||
margin-bottom: $line-height-computed;
|
|
||||||
font-style: normal;
|
|
||||||
line-height: $line-height-base;
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
//
|
|
||||||
// Utility classes
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Floats
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.clearfix {
|
|
||||||
@include clearfix;
|
|
||||||
}
|
|
||||||
.center-block {
|
|
||||||
@include center-block;
|
|
||||||
}
|
|
||||||
.pull-right {
|
|
||||||
float: right !important;
|
|
||||||
}
|
|
||||||
.pull-left {
|
|
||||||
float: left !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Toggling content
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
|
|
||||||
.hide {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
.show {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
.invisible {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
.text-hide {
|
|
||||||
@include text-hide;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Hide from screenreaders and browsers
|
|
||||||
//
|
|
||||||
// Credit: HTML5 Boilerplate
|
|
||||||
|
|
||||||
.hidden {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// For Affix plugin
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.affix {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue