adding web page rendering this doc as HTML+Bootstrap \o/
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
all: install.php
|
||||||
|
|
||||||
|
install.php: install_fr.md
|
||||||
|
github-markup install_fr.md >install.php
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
Dependencies:
|
||||||
|
|
||||||
|
- bootstrap (included)
|
||||||
|
- github-markup https://github.com/github/markup (to be installed)
|
||||||
|
- make
|
||||||
|
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 180 612 612" enable-background="new 0 180 612 612" xml:space="preserve">
|
||||||
|
<g id="outline" sodipodi:docname="twitter_bootstrap_logo.svg" inkscape:version="0.48.1 r9760" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
|
||||||
|
<g id="bg_1_">
|
||||||
|
<path fill="#FFFFFF" d="M510,186c25.5,0,49.6,10,67.8,28.2S606,256.5,606,282v408c0,25.5-10,49.6-28.2,67.8S535.5,786,510,786H102
|
||||||
|
c-25.5,0-49.6-10-67.8-28.2S6,715.5,6,690V282c0-25.5,10-49.6,28.2-67.8S76.5,186,102,186H510 M510,180H102
|
||||||
|
C45.9,180,0,225.9,0,282v408c0,56.1,45.9,102,102,102h408c56.1,0,102-45.9,102-102V282C612,225.9,566.1,180,510,180L510,180z"/>
|
||||||
|
</g>
|
||||||
|
<g id="B_2_" enable-background="new ">
|
||||||
|
<path fill="#FFFFFF" d="M166.3,313h173.5c32,0,57.7,7.3,77,22s29,36.8,29,66.5c0,18-4.4,33.4-13.2,46.2
|
||||||
|
c-8.8,12.8-21.4,22.8-37.8,29.8v1c22,4.7,38.7,15.1,50,31.2c11.3,16.2,17,36.4,17,60.8c0,14-2.5,27.1-7.5,39.2
|
||||||
|
c-5,12.2-12.8,22.7-23.5,31.5s-24.3,15.8-41,21s-36.5,7.8-59.5,7.8h-164L166.3,313L166.3,313z M228.8,462.5h102
|
||||||
|
c15,0,27.5-4.2,37.5-12.8s15-20.8,15-36.8c0-18-4.5-30.7-13.5-38s-22-11-39-11h-102L228.8,462.5L228.8,462.5z M228.8,619h110.5
|
||||||
|
c19,0,33.8-4.9,44.2-14.8c10.5-9.8,15.8-23.8,15.8-41.8c0-17.7-5.2-31.2-15.8-40.8s-25.2-14.2-44.2-14.2H228.8V619z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 180 612 612" enable-background="new 0 180 612 612" xml:space="preserve">
|
||||||
|
<g id="punchout" sodipodi:docname="twitter_bootstrap_logo.svg" inkscape:version="0.48.1 r9760" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M383.5,521.8c-10.5-9.5-25.2-14.2-44.2-14.2H228.8V619h110.5c19,0,33.8-4.9,44.2-14.8
|
||||||
|
c10.5-9.8,15.8-23.8,15.8-41.8C399.2,544.8,394,531.2,383.5,521.8z"/>
|
||||||
|
<path fill="#FFFFFF" d="M368.2,449.8c10-8.5,15-20.8,15-36.8c0-18-4.5-30.7-13.5-38s-22-11-39-11h-102v98.5h102
|
||||||
|
C345.7,462.5,358.2,458.2,368.2,449.8z"/>
|
||||||
|
<path fill="#FFFFFF" d="M510,180H102C45.9,180,0,225.9,0,282v408c0,56.1,45.9,102,102,102h408c56.1,0,102-45.9,102-102V282
|
||||||
|
C612,225.9,566.1,180,510,180z M454.2,609.8c-5,12.2-12.8,22.7-23.5,31.5s-24.3,15.8-41,21s-36.5,7.8-59.5,7.8h-164V313h173.5
|
||||||
|
c32,0,57.7,7.3,77,22s29,36.8,29,66.5c0,18-4.4,33.4-13.2,46.2c-8.8,12.8-21.4,22.8-37.8,29.8v1c22,4.7,38.7,15.1,50,31.2
|
||||||
|
c11.3,16.2,17,36.4,17,60.8C461.7,584.5,459.2,597.6,454.2,609.8z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 612 612" enable-background="new 0 0 612 612" xml:space="preserve">
|
||||||
|
<g id="solid" sodipodi:docname="twitter_bootstrap_logo.svg" inkscape:version="0.48.1 r9760" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
|
||||||
|
<path id="bg" fill="#563D7C" d="M612,510c0,56.1-45.9,102-102,102H102C45.9,612,0,566.1,0,510V102C0,45.9,45.9,0,102,0h408
|
||||||
|
c56.1,0,102,45.9,102,102V510z"/>
|
||||||
|
<g id="B" enable-background="new ">
|
||||||
|
<path fill="#FFFFFF" d="M166.3,133h173.5c32,0,57.7,7.3,77,22s29,36.8,29,66.5c0,18-4.4,33.4-13.2,46.2
|
||||||
|
c-8.8,12.8-21.4,22.8-37.8,29.8v1c22,4.7,38.7,15.1,50,31.2c11.3,16.2,17,36.4,17,60.8c0,14-2.5,27.1-7.5,39.2
|
||||||
|
c-5,12.2-12.8,22.7-23.5,31.5s-24.3,15.8-41,21s-36.5,7.8-59.5,7.8h-164L166.3,133L166.3,133z M228.8,282.5h102
|
||||||
|
c15,0,27.5-4.2,37.5-12.8s15-20.8,15-36.8c0-18-4.5-30.7-13.5-38s-22-11-39-11h-102L228.8,282.5L228.8,282.5z M228.8,439h110.5
|
||||||
|
c19,0,33.8-4.9,44.2-14.8c10.5-9.8,15.8-23.8,15.8-41.8c0-17.7-5.2-31.2-15.8-40.8s-25.2-14.2-44.2-14.2H228.8V439z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1,66 @@
|
||||||
|
.hll { background-color: #ffffcc }
|
||||||
|
/*{ background: #f0f3f3; }*/
|
||||||
|
.c { color: #999; } /* Comment */
|
||||||
|
.err { color: #AA0000; background-color: #FFAAAA } /* Error */
|
||||||
|
.k { color: #006699; } /* Keyword */
|
||||||
|
.o { color: #555555 } /* Operator */
|
||||||
|
.cm { color: #999; } /* Comment.Multiline */ /* Edited to remove italics and make into comment */
|
||||||
|
.cp { color: #009999 } /* Comment.Preproc */
|
||||||
|
.c1 { color: #999; } /* Comment.Single */
|
||||||
|
.cs { color: #999; } /* Comment.Special */
|
||||||
|
.gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */
|
||||||
|
.ge { font-style: italic } /* Generic.Emph */
|
||||||
|
.gr { color: #FF0000 } /* Generic.Error */
|
||||||
|
.gh { color: #003300; } /* Generic.Heading */
|
||||||
|
.gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */
|
||||||
|
.go { color: #AAAAAA } /* Generic.Output */
|
||||||
|
.gp { color: #000099; } /* Generic.Prompt */
|
||||||
|
.gs { } /* Generic.Strong */
|
||||||
|
.gu { color: #003300; } /* Generic.Subheading */
|
||||||
|
.gt { color: #99CC66 } /* Generic.Traceback */
|
||||||
|
.kc { color: #006699; } /* Keyword.Constant */
|
||||||
|
.kd { color: #006699; } /* Keyword.Declaration */
|
||||||
|
.kn { color: #006699; } /* Keyword.Namespace */
|
||||||
|
.kp { color: #006699 } /* Keyword.Pseudo */
|
||||||
|
.kr { color: #006699; } /* Keyword.Reserved */
|
||||||
|
.kt { color: #007788; } /* Keyword.Type */
|
||||||
|
.m { color: #FF6600 } /* Literal.Number */
|
||||||
|
.s { color: #d44950 } /* Literal.String */
|
||||||
|
.na { color: #4f9fcf } /* Name.Attribute */
|
||||||
|
.nb { color: #336666 } /* Name.Builtin */
|
||||||
|
.nc { color: #00AA88; } /* Name.Class */
|
||||||
|
.no { color: #336600 } /* Name.Constant */
|
||||||
|
.nd { color: #9999FF } /* Name.Decorator */
|
||||||
|
.ni { color: #999999; } /* Name.Entity */
|
||||||
|
.ne { color: #CC0000; } /* Name.Exception */
|
||||||
|
.nf { color: #CC00FF } /* Name.Function */
|
||||||
|
.nl { color: #9999FF } /* Name.Label */
|
||||||
|
.nn { color: #00CCFF; } /* Name.Namespace */
|
||||||
|
.nt { color: #2f6f9f; } /* Name.Tag */
|
||||||
|
.nv { color: #003333 } /* Name.Variable */
|
||||||
|
.ow { color: #000000; } /* Operator.Word */
|
||||||
|
.w { color: #bbbbbb } /* Text.Whitespace */
|
||||||
|
.mf { color: #FF6600 } /* Literal.Number.Float */
|
||||||
|
.mh { color: #FF6600 } /* Literal.Number.Hex */
|
||||||
|
.mi { color: #FF6600 } /* Literal.Number.Integer */
|
||||||
|
.mo { color: #FF6600 } /* Literal.Number.Oct */
|
||||||
|
.sb { color: #CC3300 } /* Literal.String.Backtick */
|
||||||
|
.sc { color: #CC3300 } /* Literal.String.Char */
|
||||||
|
.sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */
|
||||||
|
.s2 { color: #CC3300 } /* Literal.String.Double */
|
||||||
|
.se { color: #CC3300; } /* Literal.String.Escape */
|
||||||
|
.sh { color: #CC3300 } /* Literal.String.Heredoc */
|
||||||
|
.si { color: #AA0000 } /* Literal.String.Interpol */
|
||||||
|
.sx { color: #CC3300 } /* Literal.String.Other */
|
||||||
|
.sr { color: #33AAAA } /* Literal.String.Regex */
|
||||||
|
.s1 { color: #CC3300 } /* Literal.String.Single */
|
||||||
|
.ss { color: #FFCC33 } /* Literal.String.Symbol */
|
||||||
|
.bp { color: #336666 } /* Name.Builtin.Pseudo */
|
||||||
|
.vc { color: #003333 } /* Name.Variable.Class */
|
||||||
|
.vg { color: #003333 } /* Name.Variable.Global */
|
||||||
|
.vi { color: #003333 } /* Name.Variable.Instance */
|
||||||
|
.il { color: #FF6600 } /* Literal.Number.Integer.Long */
|
||||||
|
|
||||||
|
.css .o,
|
||||||
|
.css .o + .nt,
|
||||||
|
.css .nt + .nt { color: #999; }
|
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 6.5 KiB |
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,51 @@
|
||||||
|
// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
|
||||||
|
// IT'S JUST JUNK FOR OUR DOCS!
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
/*!
|
||||||
|
* Copyright 2014 Twitter, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Creative Commons Attribution 3.0 Unported License. For
|
||||||
|
* details, see http://creativecommons.org/licenses/by/3.0/.
|
||||||
|
*/
|
||||||
|
// Intended to prevent false-positive bug reports about Bootstrap not working properly in old versions of IE due to folks testing using IE's unreliable emulation modes.
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
function emulatedIEMajorVersion() {
|
||||||
|
var groups = /MSIE ([0-9.]+)/.exec(window.navigator.userAgent)
|
||||||
|
if (groups === null) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
var ieVersionNum = parseInt(groups[1], 10)
|
||||||
|
var ieMajorVersion = Math.floor(ieVersionNum)
|
||||||
|
return ieMajorVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
function actualNonEmulatedIEMajorVersion() {
|
||||||
|
// Detects the actual version of IE in use, even if it's in an older-IE emulation mode.
|
||||||
|
// IE JavaScript conditional compilation docs: http://msdn.microsoft.com/en-us/library/ie/121hztk3(v=vs.94).aspx
|
||||||
|
// @cc_on docs: http://msdn.microsoft.com/en-us/library/ie/8ka90k2e(v=vs.94).aspx
|
||||||
|
var jscriptVersion = new Function('/*@cc_on return @_jscript_version; @*/')() // jshint ignore:line
|
||||||
|
if (jscriptVersion === undefined) {
|
||||||
|
return 11 // IE11+ not in emulation mode
|
||||||
|
}
|
||||||
|
if (jscriptVersion < 9) {
|
||||||
|
return 8 // IE8 (or lower; haven't tested on IE<8)
|
||||||
|
}
|
||||||
|
return jscriptVersion // IE9 or IE10 in any mode, or IE11 in non-IE11 mode
|
||||||
|
}
|
||||||
|
|
||||||
|
var ua = window.navigator.userAgent
|
||||||
|
if (ua.indexOf('Opera') > -1 || ua.indexOf('Presto') > -1) {
|
||||||
|
return // Opera, which might pretend to be IE
|
||||||
|
}
|
||||||
|
var emulated = emulatedIEMajorVersion()
|
||||||
|
if (emulated === null) {
|
||||||
|
return // Not IE
|
||||||
|
}
|
||||||
|
var nonEmulated = actualNonEmulatedIEMajorVersion()
|
||||||
|
|
||||||
|
if (emulated !== nonEmulated) {
|
||||||
|
window.alert('WARNING: You appear to be using IE' + nonEmulated + ' in IE' + emulated + ' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!')
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*!
|
||||||
|
* IE10 viewport hack for Surface/desktop Windows 8 bug
|
||||||
|
* Copyright 2014 Twitter, Inc.
|
||||||
|
* Licensed under the Creative Commons Attribution 3.0 Unported License. For
|
||||||
|
* details, see http://creativecommons.org/licenses/by/3.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// See the Getting Started docs for more information:
|
||||||
|
// http://getbootstrap.com/getting-started/#support-ie10-width
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
|
||||||
|
var msViewportStyle = document.createElement('style')
|
||||||
|
msViewportStyle.appendChild(
|
||||||
|
document.createTextNode(
|
||||||
|
'@-ms-viewport{width:auto!important}'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
document.querySelector('head').appendChild(msViewportStyle)
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,13 @@
|
||||||
|
// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
|
||||||
|
// IT'S JUST JUNK FOR OUR DOCS!
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
/*!
|
||||||
|
* Copyright 2011-2014 Twitter, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Creative Commons Attribution 3.0 Unported License. For
|
||||||
|
* details, see http://creativecommons.org/licenses/by/3.0/.
|
||||||
|
*/
|
||||||
|
// Intended to prevent false-positive bug reports about responsive styling supposedly not working in IE8.
|
||||||
|
if (window.location.protocol == 'file:') {
|
||||||
|
window.alert('ERROR: Bootstrap\'s responsive CSS is disabled!\nSee getbootstrap.com/getting-started/#respond-file-proto for details.')
|
||||||
|
}
|
|
@ -0,0 +1,176 @@
|
||||||
|
// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
|
||||||
|
// IT'S ALL JUST JUNK FOR OUR DOCS!
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* JavaScript for Bootstrap's docs (http://getbootstrap.com)
|
||||||
|
* Copyright 2011-2014 Twitter, Inc.
|
||||||
|
* Licensed under the Creative Commons Attribution 3.0 Unported License. For
|
||||||
|
* details, see http://creativecommons.org/licenses/by/3.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global ZeroClipboard */
|
||||||
|
|
||||||
|
!function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
|
||||||
|
// Scrollspy
|
||||||
|
var $window = $(window)
|
||||||
|
var $body = $(document.body)
|
||||||
|
|
||||||
|
$body.scrollspy({
|
||||||
|
target: '.bs-docs-sidebar'
|
||||||
|
})
|
||||||
|
$window.on('load', function () {
|
||||||
|
$body.scrollspy('refresh')
|
||||||
|
})
|
||||||
|
|
||||||
|
// Kill links
|
||||||
|
$('.bs-docs-container [href=#]').click(function (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Sidenav affixing
|
||||||
|
setTimeout(function () {
|
||||||
|
var $sideBar = $('.bs-docs-sidebar')
|
||||||
|
|
||||||
|
$sideBar.affix({
|
||||||
|
offset: {
|
||||||
|
top: function () {
|
||||||
|
var offsetTop = $sideBar.offset().top
|
||||||
|
var sideBarMargin = parseInt($sideBar.children(0).css('margin-top'), 10)
|
||||||
|
var navOuterHeight = $('.bs-docs-nav').height()
|
||||||
|
|
||||||
|
return (this.top = offsetTop - navOuterHeight - sideBarMargin)
|
||||||
|
},
|
||||||
|
bottom: function () {
|
||||||
|
return (this.bottom = $('.bs-docs-footer').outerHeight(true))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 100)
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
$('.bs-top').affix()
|
||||||
|
}, 100)
|
||||||
|
|
||||||
|
// theme toggler
|
||||||
|
;(function () {
|
||||||
|
var stylesheetLink = $('#bs-theme-stylesheet')
|
||||||
|
var themeBtn = $('.bs-docs-theme-toggle')
|
||||||
|
|
||||||
|
var activateTheme = function () {
|
||||||
|
stylesheetLink.attr('href', stylesheetLink.attr('data-href'))
|
||||||
|
themeBtn.text('Disable theme preview')
|
||||||
|
localStorage.setItem('previewTheme', true)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (localStorage.getItem('previewTheme')) {
|
||||||
|
activateTheme()
|
||||||
|
}
|
||||||
|
|
||||||
|
themeBtn.click(function () {
|
||||||
|
var href = stylesheetLink.attr('href')
|
||||||
|
if (!href || href.indexOf('data') === 0) {
|
||||||
|
activateTheme()
|
||||||
|
} else {
|
||||||
|
stylesheetLink.attr('href', '')
|
||||||
|
themeBtn.text('Preview theme')
|
||||||
|
localStorage.removeItem('previewTheme')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})();
|
||||||
|
|
||||||
|
// Tooltip and popover demos
|
||||||
|
$('.tooltip-demo').tooltip({
|
||||||
|
selector: '[data-toggle="tooltip"]',
|
||||||
|
container: 'body'
|
||||||
|
})
|
||||||
|
$('.popover-demo').popover({
|
||||||
|
selector: '[data-toggle="popover"]',
|
||||||
|
container: 'body'
|
||||||
|
})
|
||||||
|
|
||||||
|
// Demos within modals
|
||||||
|
$('.tooltip-test').tooltip()
|
||||||
|
$('.popover-test').popover()
|
||||||
|
|
||||||
|
// Popover demos
|
||||||
|
$('.bs-docs-popover').popover()
|
||||||
|
|
||||||
|
// Button state demo
|
||||||
|
$('#loading-example-btn').on('click', function () {
|
||||||
|
var btn = $(this)
|
||||||
|
btn.button('loading')
|
||||||
|
setTimeout(function () {
|
||||||
|
btn.button('reset')
|
||||||
|
}, 3000)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Modal relatedTarget demo
|
||||||
|
$('#exampleModal').on('show.bs.modal', function (event) {
|
||||||
|
var button = $(event.relatedTarget) // Button that triggered the modal
|
||||||
|
var recipient = button.data('whatever') // Extract info from data-* attributes
|
||||||
|
// If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
|
||||||
|
// Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
|
||||||
|
var modal = $(this)
|
||||||
|
modal.find('.modal-title').text('New message to ' + recipient)
|
||||||
|
modal.find('.modal-body input').val(recipient)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Activate animated progress bar
|
||||||
|
$('.bs-docs-activate-animated-progressbar').on('click', function () {
|
||||||
|
$(this).siblings('.progress').find('.progress-bar-striped').toggleClass('active')
|
||||||
|
})
|
||||||
|
|
||||||
|
// Config ZeroClipboard
|
||||||
|
ZeroClipboard.config({
|
||||||
|
moviePath: '/assets/flash/ZeroClipboard.swf',
|
||||||
|
hoverClass: 'btn-clipboard-hover'
|
||||||
|
})
|
||||||
|
|
||||||
|
// Insert copy to clipboard button before .highlight
|
||||||
|
$('.highlight').each(function () {
|
||||||
|
var btnHtml = '<div class="zero-clipboard"><span class="btn-clipboard">Copy</span></div>'
|
||||||
|
$(this).before(btnHtml)
|
||||||
|
})
|
||||||
|
var zeroClipboard = new ZeroClipboard($('.btn-clipboard'))
|
||||||
|
var htmlBridge = $('#global-zeroclipboard-html-bridge')
|
||||||
|
|
||||||
|
// Handlers for ZeroClipboard
|
||||||
|
zeroClipboard.on('load', function () {
|
||||||
|
htmlBridge
|
||||||
|
.data('placement', 'top')
|
||||||
|
.attr('title', 'Copy to clipboard')
|
||||||
|
.tooltip()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Copy to clipboard
|
||||||
|
zeroClipboard.on('dataRequested', function (client) {
|
||||||
|
var highlight = $(this).parent().nextAll('.highlight').first()
|
||||||
|
client.setText(highlight.text())
|
||||||
|
})
|
||||||
|
|
||||||
|
// Notify copy success and reset tooltip title
|
||||||
|
zeroClipboard.on('complete', function () {
|
||||||
|
htmlBridge
|
||||||
|
.attr('title', 'Copied!')
|
||||||
|
.tooltip('fixTitle')
|
||||||
|
.tooltip('show')
|
||||||
|
.attr('title', 'Copy to clipboard')
|
||||||
|
.tooltip('fixTitle')
|
||||||
|
})
|
||||||
|
|
||||||
|
// Notify copy failure
|
||||||
|
zeroClipboard.on('noflash wrongflash', function () {
|
||||||
|
htmlBridge
|
||||||
|
.attr('title', 'Flash required')
|
||||||
|
.tooltip('fixTitle')
|
||||||
|
.tooltip('show')
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery)
|
|
@ -0,0 +1,512 @@
|
||||||
|
/*!
|
||||||
|
* Bootstrap Customizer (http://getbootstrap.com/customize/)
|
||||||
|
* Copyright 2011-2014 Twitter, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Creative Commons Attribution 3.0 Unported License. For
|
||||||
|
* details, see http://creativecommons.org/licenses/by/3.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global JSZip, less, autoprefixer, saveAs, UglifyJS, __configBridge, __js, __less, __fonts */
|
||||||
|
|
||||||
|
window.onload = function () { // wait for load in a dumb way because B-0
|
||||||
|
'use strict';
|
||||||
|
var cw = '/*!\n' +
|
||||||
|
' * Bootstrap v3.3.1 (http://getbootstrap.com)\n' +
|
||||||
|
' * Copyright 2011-' + new Date().getFullYear() + ' Twitter, Inc.\n' +
|
||||||
|
' * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n' +
|
||||||
|
' */\n\n'
|
||||||
|
|
||||||
|
var supportsFile = (window.File && window.FileReader && window.FileList && window.Blob)
|
||||||
|
var importDropTarget = $('#import-drop-target')
|
||||||
|
|
||||||
|
function showError(msg, err) {
|
||||||
|
$('<div id="bsCustomizerAlert" class="bs-customizer-alert">' +
|
||||||
|
'<div class="container">' +
|
||||||
|
'<a href="#bsCustomizerAlert" data-dismiss="alert" class="close pull-right" aria-label="Close" role="button"><span aria-hidden="true">×</span></a>' +
|
||||||
|
'<p class="bs-customizer-alert-text"><span class="glyphicon glyphicon-warning-sign" aria-hidden="true"></span><span class="sr-only">Warning:</span>' + msg + '</p>' +
|
||||||
|
(err.extract ? '<pre class="bs-customizer-alert-extract">' + err.extract.join('\n') + '</pre>' : '') +
|
||||||
|
'</div>' +
|
||||||
|
'</div>').appendTo('body').alert()
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSuccess(msg) {
|
||||||
|
$('<div class="bs-callout bs-callout-info">' +
|
||||||
|
'<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>' + msg +
|
||||||
|
'</div>').insertAfter('.bs-customize-download')
|
||||||
|
}
|
||||||
|
|
||||||
|
function showCallout(msg, showUpTop) {
|
||||||
|
var callout = $('<div class="bs-callout bs-callout-danger">' +
|
||||||
|
'<h4>Attention!</h4>' +
|
||||||
|
'<p>' + msg + '</p>' +
|
||||||
|
'</div>')
|
||||||
|
|
||||||
|
if (showUpTop) {
|
||||||
|
callout.appendTo('.bs-docs-container')
|
||||||
|
} else {
|
||||||
|
callout.insertAfter('.bs-customize-download')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showAlert(type, msg, insertAfter) {
|
||||||
|
$('<div class="alert alert-' + type + '">' + msg + '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button></div>')
|
||||||
|
.insertAfter(insertAfter)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getQueryParam(key) {
|
||||||
|
key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, '\\$&') // escape RegEx meta chars
|
||||||
|
var match = location.search.match(new RegExp('[?&]' + key + '=([^&]+)(&|$)'))
|
||||||
|
return match && decodeURIComponent(match[1].replace(/\+/g, ' '))
|
||||||
|
}
|
||||||
|
|
||||||
|
function createGist(configJson, callback) {
|
||||||
|
var data = {
|
||||||
|
description: 'Bootstrap Customizer Config',
|
||||||
|
'public': true,
|
||||||
|
files: {
|
||||||
|
'config.json': {
|
||||||
|
content: configJson
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url: 'https://api.github.com/gists',
|
||||||
|
type: 'POST',
|
||||||
|
contentType: 'application/json; charset=UTF-8',
|
||||||
|
dataType: 'json',
|
||||||
|
data: JSON.stringify(data)
|
||||||
|
})
|
||||||
|
.success(function (result) {
|
||||||
|
var gistUrl = result.html_url;
|
||||||
|
var origin = window.location.protocol + '//' + window.location.host
|
||||||
|
var customizerUrl = origin + window.location.pathname + '?id=' + result.id
|
||||||
|
showSuccess('<strong>Success!</strong> Your configuration has been saved to <a href="' + gistUrl + '">' + gistUrl + '</a> ' +
|
||||||
|
'and can be revisited here at <a href="' + customizerUrl + '">' + customizerUrl + '</a> for further customization.')
|
||||||
|
history.replaceState(false, document.title, customizerUrl)
|
||||||
|
callback(gistUrl, customizerUrl)
|
||||||
|
})
|
||||||
|
.error(function (err) {
|
||||||
|
try {
|
||||||
|
showError('<strong>Ruh roh!</strong> Could not save gist file, configuration not saved.', err)
|
||||||
|
} catch (sameErr) {
|
||||||
|
// deliberately ignore the error
|
||||||
|
}
|
||||||
|
callback('<none>', '<none>')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCustomizerData() {
|
||||||
|
var vars = {}
|
||||||
|
|
||||||
|
$('#less-variables-section input')
|
||||||
|
.each(function () {
|
||||||
|
$(this).val() && (vars[$(this).prev().text()] = $(this).val())
|
||||||
|
})
|
||||||
|
|
||||||
|
var data = {
|
||||||
|
vars: vars,
|
||||||
|
css: $('#less-section input:checked') .map(function () { return this.value }).toArray(),
|
||||||
|
js: $('#plugin-section input:checked').map(function () { return this.value }).toArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($.isEmptyObject(data.vars) && !data.css.length && !data.js.length) return
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateCustomizerFromJson(data) {
|
||||||
|
if (data.js) {
|
||||||
|
$('#plugin-section input').each(function () {
|
||||||
|
$(this).prop('checked', ~$.inArray(this.value, data.js))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (data.css) {
|
||||||
|
$('#less-section input').each(function () {
|
||||||
|
$(this).prop('checked', ~$.inArray(this.value, data.css))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (data.vars) {
|
||||||
|
for (var i in data.vars) {
|
||||||
|
$('input[data-var="' + i + '"]').val(data.vars[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseUrl() {
|
||||||
|
var id = getQueryParam('id')
|
||||||
|
|
||||||
|
if (!id) return
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: 'https://api.github.com/gists/' + id,
|
||||||
|
type: 'GET',
|
||||||
|
dataType: 'json'
|
||||||
|
})
|
||||||
|
.success(function (result) {
|
||||||
|
var data = JSON.parse(result.files['config.json'].content)
|
||||||
|
updateCustomizerFromJson(data)
|
||||||
|
})
|
||||||
|
.error(function (err) {
|
||||||
|
showError('Error fetching bootstrap config file', err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateZip(css, js, fonts, config, complete) {
|
||||||
|
if (!css && !js) return showError('<strong>Ruh roh!</strong> No Bootstrap files selected.', new Error('no Bootstrap'))
|
||||||
|
|
||||||
|
var zip = new JSZip()
|
||||||
|
|
||||||
|
if (css) {
|
||||||
|
var cssFolder = zip.folder('css')
|
||||||
|
for (var fileName in css) {
|
||||||
|
cssFolder.file(fileName, css[fileName])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (js) {
|
||||||
|
var jsFolder = zip.folder('js')
|
||||||
|
for (var jsFileName in js) {
|
||||||
|
jsFolder.file(jsFileName, js[jsFileName])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fonts) {
|
||||||
|
var fontsFolder = zip.folder('fonts')
|
||||||
|
for (var fontsFileName in fonts) {
|
||||||
|
fontsFolder.file(fontsFileName, fonts[fontsFileName], { base64: true })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config) {
|
||||||
|
zip.file('config.json', config)
|
||||||
|
}
|
||||||
|
|
||||||
|
var content = zip.generate({ type: 'blob' })
|
||||||
|
|
||||||
|
complete(content)
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateCustomLess(vars) {
|
||||||
|
var result = ''
|
||||||
|
|
||||||
|
for (var key in vars) {
|
||||||
|
result += key + ': ' + vars[key] + ';\n'
|
||||||
|
}
|
||||||
|
|
||||||
|
return result + '\n\n'
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateFonts() {
|
||||||
|
var glyphicons = $('#less-section [value="glyphicons.less"]:checked')
|
||||||
|
if (glyphicons.length) {
|
||||||
|
return __fonts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns an Array of @import'd filenames in the order
|
||||||
|
// in which they appear in the file.
|
||||||
|
function includedLessFilenames(lessFilename) {
|
||||||
|
var IMPORT_REGEX = /^@import \"(.*?)\";$/
|
||||||
|
var lessLines = __less[lessFilename].split('\n')
|
||||||
|
|
||||||
|
var imports = []
|
||||||
|
$.each(lessLines, function (index, lessLine) {
|
||||||
|
var match = IMPORT_REGEX.exec(lessLine)
|
||||||
|
if (match) {
|
||||||
|
var importee = match[1]
|
||||||
|
var transitiveImports = includedLessFilenames(importee)
|
||||||
|
$.each(transitiveImports, function (index, transitiveImportee) {
|
||||||
|
if ($.inArray(transitiveImportee, imports) === -1) {
|
||||||
|
imports.push(transitiveImportee)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
imports.push(importee)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return imports
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateLESS(lessFilename, lessFileIncludes, vars) {
|
||||||
|
var lessSource = __less[lessFilename]
|
||||||
|
|
||||||
|
var lessFilenames = includedLessFilenames(lessFilename)
|
||||||
|
$.each(lessFilenames, function (index, filename) {
|
||||||
|
var fileInclude = lessFileIncludes[filename]
|
||||||
|
|
||||||
|
// Files not explicitly unchecked are compiled into the final stylesheet.
|
||||||
|
// Core stylesheets like 'normalize.less' are not included in the form
|
||||||
|
// since disabling them would wreck everything, and so their 'fileInclude'
|
||||||
|
// will be 'undefined'.
|
||||||
|
if (fileInclude || (fileInclude == null)) lessSource += __less[filename]
|
||||||
|
|
||||||
|
// Custom variables are added after Bootstrap variables so the custom
|
||||||
|
// ones take precedence.
|
||||||
|
if (('variables.less' === filename) && vars) lessSource += generateCustomLess(vars)
|
||||||
|
})
|
||||||
|
|
||||||
|
lessSource = lessSource.replace(/@import[^\n]*/gi, '') // strip any imports
|
||||||
|
return lessSource
|
||||||
|
}
|
||||||
|
|
||||||
|
function compileLESS(lessSource, baseFilename, intoResult) {
|
||||||
|
var promise = $.Deferred()
|
||||||
|
var parser = new less.Parser({
|
||||||
|
paths: ['variables.less', 'mixins.less'],
|
||||||
|
optimization: 0,
|
||||||
|
filename: baseFilename + '.css'
|
||||||
|
})
|
||||||
|
|
||||||
|
parser.parse(lessSource, function (err, tree) {
|
||||||
|
if (err) {
|
||||||
|
return promise.reject(err)
|
||||||
|
}
|
||||||
|
intoResult[baseFilename + '.css'] = cw + tree.toCSS()
|
||||||
|
intoResult[baseFilename + '.min.css'] = cw + tree.toCSS({ compress: true })
|
||||||
|
promise.resolve()
|
||||||
|
})
|
||||||
|
|
||||||
|
return promise.promise()
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateCSS(preamble) {
|
||||||
|
var promise = $.Deferred()
|
||||||
|
var oneChecked = false
|
||||||
|
var lessFileIncludes = {}
|
||||||
|
$('#less-section input').each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var checked = $this.is(':checked')
|
||||||
|
lessFileIncludes[$this.val()] = checked
|
||||||
|
|
||||||
|
oneChecked = oneChecked || checked
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!oneChecked) return false
|
||||||
|
|
||||||
|
var result = {}
|
||||||
|
var vars = {}
|
||||||
|
|
||||||
|
$('#less-variables-section input')
|
||||||
|
.each(function () {
|
||||||
|
$(this).val() && (vars[$(this).prev().text()] = $(this).val())
|
||||||
|
})
|
||||||
|
|
||||||
|
var bsLessSource = preamble + generateLESS('bootstrap.less', lessFileIncludes, vars)
|
||||||
|
var themeLessSource = preamble + generateLESS('theme.less', lessFileIncludes, vars)
|
||||||
|
|
||||||
|
var prefixer = autoprefixer({ browsers: __configBridge.autoprefixerBrowsers })
|
||||||
|
|
||||||
|
$.when(
|
||||||
|
compileLESS(bsLessSource, 'bootstrap', result),
|
||||||
|
compileLESS(themeLessSource, 'bootstrap-theme', result)
|
||||||
|
).done(function () {
|
||||||
|
for (var key in result) {
|
||||||
|
result[key] = prefixer.process(result[key]).css
|
||||||
|
}
|
||||||
|
promise.resolve(result)
|
||||||
|
}).fail(function (err) {
|
||||||
|
showError('<strong>Ruh roh!</strong> Could not parse less files.', err)
|
||||||
|
promise.reject()
|
||||||
|
})
|
||||||
|
|
||||||
|
return promise.promise()
|
||||||
|
}
|
||||||
|
|
||||||
|
function uglify(js) {
|
||||||
|
var ast = UglifyJS.parse(js)
|
||||||
|
ast.figure_out_scope()
|
||||||
|
|
||||||
|
var compressor = UglifyJS.Compressor()
|
||||||
|
var compressedAst = ast.transform(compressor)
|
||||||
|
|
||||||
|
compressedAst.figure_out_scope()
|
||||||
|
compressedAst.compute_char_frequency()
|
||||||
|
compressedAst.mangle_names()
|
||||||
|
|
||||||
|
var stream = UglifyJS.OutputStream()
|
||||||
|
compressedAst.print(stream)
|
||||||
|
|
||||||
|
return stream.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateJS(preamble) {
|
||||||
|
var $checked = $('#plugin-section input:checked')
|
||||||
|
var jqueryCheck = __configBridge.jqueryCheck.join('\n')
|
||||||
|
var jqueryVersionCheck = __configBridge.jqueryVersionCheck.join('\n')
|
||||||
|
|
||||||
|
if (!$checked.length) return false
|
||||||
|
|
||||||
|
var js = $checked
|
||||||
|
.map(function () { return __js[this.value] })
|
||||||
|
.toArray()
|
||||||
|
.join('\n')
|
||||||
|
|
||||||
|
preamble = cw + preamble
|
||||||
|
js = jqueryCheck + jqueryVersionCheck + js
|
||||||
|
|
||||||
|
return {
|
||||||
|
'bootstrap.js': preamble + js,
|
||||||
|
'bootstrap.min.js': preamble + uglify(js)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeImportAlerts() {
|
||||||
|
importDropTarget.nextAll('.alert').remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleConfigFileSelect(e) {
|
||||||
|
e.stopPropagation()
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
var file = (e.originalEvent.hasOwnProperty('dataTransfer')) ? e.originalEvent.dataTransfer.files[0] : e.originalEvent.target.files[0]
|
||||||
|
|
||||||
|
var reader = new FileReader()
|
||||||
|
|
||||||
|
reader.onload = function (e) {
|
||||||
|
var text = e.target.result
|
||||||
|
|
||||||
|
try {
|
||||||
|
var json = JSON.parse(text)
|
||||||
|
|
||||||
|
if (!$.isPlainObject(json)) {
|
||||||
|
throw new Error('JSON data from config file is not an object.')
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCustomizerFromJson(json)
|
||||||
|
showAlert('success', '<strong>Woohoo!</strong> Your configuration was successfully uploaded. Tweak your settings, then hit Download.', importDropTarget)
|
||||||
|
} catch (err) {
|
||||||
|
return showAlert('danger', '<strong>Shucks.</strong> We can only read valid <code>.json</code> files. Please try again.', importDropTarget)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.readAsText(file, 'utf-8')
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleConfigDragOver(e) {
|
||||||
|
e.stopPropagation()
|
||||||
|
e.preventDefault()
|
||||||
|
e.originalEvent.dataTransfer.dropEffect = 'copy'
|
||||||
|
|
||||||
|
removeImportAlerts()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (supportsFile) {
|
||||||
|
importDropTarget
|
||||||
|
.on('dragover', handleConfigDragOver)
|
||||||
|
.on('drop', handleConfigFileSelect)
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#import-file-select').on('change', handleConfigFileSelect)
|
||||||
|
$('#import-manual-trigger').on('click', removeImportAlerts)
|
||||||
|
|
||||||
|
var inputsComponent = $('#less-section input')
|
||||||
|
var inputsPlugin = $('#plugin-section input')
|
||||||
|
var inputsVariables = $('#less-variables-section input')
|
||||||
|
|
||||||
|
$('#less-section .toggle').on('click', function (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
inputsComponent.prop('checked', !inputsComponent.is(':checked'))
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#plugin-section .toggle').on('click', function (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
inputsPlugin.prop('checked', !inputsPlugin.is(':checked'))
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#less-variables-section .toggle').on('click', function (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
inputsVariables.val('')
|
||||||
|
})
|
||||||
|
|
||||||
|
$('[data-dependencies]').on('click', function () {
|
||||||
|
if (!$(this).is(':checked')) return
|
||||||
|
var dependencies = this.getAttribute('data-dependencies')
|
||||||
|
if (!dependencies) return
|
||||||
|
dependencies = dependencies.split(',')
|
||||||
|
for (var i = 0; i < dependencies.length; i++) {
|
||||||
|
var dependency = $('[value="' + dependencies[i] + '"]')
|
||||||
|
dependency && dependency.prop('checked', true)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
$('[data-dependents]').on('click', function () {
|
||||||
|
if ($(this).is(':checked')) return
|
||||||
|
var dependents = this.getAttribute('data-dependents')
|
||||||
|
if (!dependents) return
|
||||||
|
dependents = dependents.split(',')
|
||||||
|
for (var i = 0; i < dependents.length; i++) {
|
||||||
|
var dependent = $('[value="' + dependents[i] + '"]')
|
||||||
|
dependent && dependent.prop('checked', false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
var $compileBtn = $('#btn-compile')
|
||||||
|
|
||||||
|
$compileBtn.on('click', function (e) {
|
||||||
|
var configData = getCustomizerData()
|
||||||
|
var configJson = JSON.stringify(configData, null, 2)
|
||||||
|
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
$compileBtn.attr('disabled', 'disabled')
|
||||||
|
|
||||||
|
createGist(configJson, function (gistUrl, customizerUrl) {
|
||||||
|
configData.customizerUrl = customizerUrl
|
||||||
|
configJson = JSON.stringify(configData, null, 2)
|
||||||
|
|
||||||
|
var preamble = '/*!\n' +
|
||||||
|
' * Generated using the Bootstrap Customizer (' + customizerUrl + ')\n' +
|
||||||
|
' * Config saved to config.json and ' + gistUrl + '\n' +
|
||||||
|
' */\n'
|
||||||
|
|
||||||
|
$.when(
|
||||||
|
generateCSS(preamble),
|
||||||
|
generateJS(preamble),
|
||||||
|
generateFonts()
|
||||||
|
).done(function (css, js, fonts) {
|
||||||
|
generateZip(css, js, fonts, configJson, function (blob) {
|
||||||
|
$compileBtn.removeAttr('disabled')
|
||||||
|
setTimeout(function () { saveAs(blob, 'bootstrap.zip') }, 0)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// browser support alert
|
||||||
|
(function () {
|
||||||
|
function failback() {
|
||||||
|
$('.bs-docs-section, .bs-docs-sidebar').css('display', 'none')
|
||||||
|
showCallout('Looks like your current browser doesn\'t support the Bootstrap Customizer. Please take a second ' +
|
||||||
|
'to <a href="http://browsehappy.com/">upgrade to a more modern browser</a> (other than Safari).', true)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Based on:
|
||||||
|
* Blob Feature Check v1.1.0
|
||||||
|
* https://github.com/ssorallen/blob-feature-check/
|
||||||
|
* License: Public domain (http://unlicense.org)
|
||||||
|
*/
|
||||||
|
var url = window.webkitURL || window.URL // Safari 6 uses "webkitURL".
|
||||||
|
var svg = new Blob(
|
||||||
|
['<svg xmlns=\'http://www.w3.org/2000/svg\'></svg>'],
|
||||||
|
{ type: 'image/svg+xml;charset=utf-8' }
|
||||||
|
)
|
||||||
|
var objectUrl = url.createObjectURL(svg);
|
||||||
|
|
||||||
|
if (/^blob:/.exec(objectUrl) === null || !supportsFile) {
|
||||||
|
// `URL.createObjectURL` created a URL that started with something other
|
||||||
|
// than "blob:", which means it has been polyfilled and is not supported by
|
||||||
|
// this browser.
|
||||||
|
failback()
|
||||||
|
} else {
|
||||||
|
$('<img>')
|
||||||
|
.on('load', function () {
|
||||||
|
$compileBtn.prop('disabled', false)
|
||||||
|
})
|
||||||
|
.on('error', failback)
|
||||||
|
.attr('src', objectUrl)
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
parseUrl()
|
||||||
|
}
|
|
@ -0,0 +1,197 @@
|
||||||
|
/* Blob.js
|
||||||
|
* A Blob implementation.
|
||||||
|
* 2014-07-24
|
||||||
|
*
|
||||||
|
* By Eli Grey, http://eligrey.com
|
||||||
|
* By Devin Samarin, https://github.com/dsamarin
|
||||||
|
* License: X11/MIT
|
||||||
|
* See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*global self, unescape */
|
||||||
|
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
|
||||||
|
plusplus: true */
|
||||||
|
|
||||||
|
/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
|
||||||
|
|
||||||
|
(function (view) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
view.URL = view.URL || view.webkitURL;
|
||||||
|
|
||||||
|
if (view.Blob && view.URL) {
|
||||||
|
try {
|
||||||
|
new Blob;
|
||||||
|
return;
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Internally we use a BlobBuilder implementation to base Blob off of
|
||||||
|
// in order to support older browsers that only have BlobBuilder
|
||||||
|
var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
|
||||||
|
var
|
||||||
|
get_class = function(object) {
|
||||||
|
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
|
||||||
|
}
|
||||||
|
, FakeBlobBuilder = function BlobBuilder() {
|
||||||
|
this.data = [];
|
||||||
|
}
|
||||||
|
, FakeBlob = function Blob(data, type, encoding) {
|
||||||
|
this.data = data;
|
||||||
|
this.size = data.length;
|
||||||
|
this.type = type;
|
||||||
|
this.encoding = encoding;
|
||||||
|
}
|
||||||
|
, FBB_proto = FakeBlobBuilder.prototype
|
||||||
|
, FB_proto = FakeBlob.prototype
|
||||||
|
, FileReaderSync = view.FileReaderSync
|
||||||
|
, FileException = function(type) {
|
||||||
|
this.code = this[this.name = type];
|
||||||
|
}
|
||||||
|
, file_ex_codes = (
|
||||||
|
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
|
||||||
|
+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
|
||||||
|
).split(" ")
|
||||||
|
, file_ex_code = file_ex_codes.length
|
||||||
|
, real_URL = view.URL || view.webkitURL || view
|
||||||
|
, real_create_object_URL = real_URL.createObjectURL
|
||||||
|
, real_revoke_object_URL = real_URL.revokeObjectURL
|
||||||
|
, URL = real_URL
|
||||||
|
, btoa = view.btoa
|
||||||
|
, atob = view.atob
|
||||||
|
|
||||||
|
, ArrayBuffer = view.ArrayBuffer
|
||||||
|
, Uint8Array = view.Uint8Array
|
||||||
|
|
||||||
|
, origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/
|
||||||
|
;
|
||||||
|
FakeBlob.fake = FB_proto.fake = true;
|
||||||
|
while (file_ex_code--) {
|
||||||
|
FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
|
||||||
|
}
|
||||||
|
// Polyfill URL
|
||||||
|
if (!real_URL.createObjectURL) {
|
||||||
|
URL = view.URL = function(uri) {
|
||||||
|
var
|
||||||
|
uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
|
||||||
|
, uri_origin
|
||||||
|
;
|
||||||
|
uri_info.href = uri;
|
||||||
|
if (!("origin" in uri_info)) {
|
||||||
|
if (uri_info.protocol.toLowerCase() === "data:") {
|
||||||
|
uri_info.origin = null;
|
||||||
|
} else {
|
||||||
|
uri_origin = uri.match(origin);
|
||||||
|
uri_info.origin = uri_origin && uri_origin[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return uri_info;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
URL.createObjectURL = function(blob) {
|
||||||
|
var
|
||||||
|
type = blob.type
|
||||||
|
, data_URI_header
|
||||||
|
;
|
||||||
|
if (type === null) {
|
||||||
|
type = "application/octet-stream";
|
||||||
|
}
|
||||||
|
if (blob instanceof FakeBlob) {
|
||||||
|
data_URI_header = "data:" + type;
|
||||||
|
if (blob.encoding === "base64") {
|
||||||
|
return data_URI_header + ";base64," + blob.data;
|
||||||
|
} else if (blob.encoding === "URI") {
|
||||||
|
return data_URI_header + "," + decodeURIComponent(blob.data);
|
||||||
|
} if (btoa) {
|
||||||
|
return data_URI_header + ";base64," + btoa(blob.data);
|
||||||
|
} else {
|
||||||
|
return data_URI_header + "," + encodeURIComponent(blob.data);
|
||||||
|
}
|
||||||
|
} else if (real_create_object_URL) {
|
||||||
|
return real_create_object_URL.call(real_URL, blob);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
URL.revokeObjectURL = function(object_URL) {
|
||||||
|
if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
|
||||||
|
real_revoke_object_URL.call(real_URL, object_URL);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
FBB_proto.append = function(data/*, endings*/) {
|
||||||
|
var bb = this.data;
|
||||||
|
// decode data to a binary string
|
||||||
|
if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
|
||||||
|
var
|
||||||
|
str = ""
|
||||||
|
, buf = new Uint8Array(data)
|
||||||
|
, i = 0
|
||||||
|
, buf_len = buf.length
|
||||||
|
;
|
||||||
|
for (; i < buf_len; i++) {
|
||||||
|
str += String.fromCharCode(buf[i]);
|
||||||
|
}
|
||||||
|
bb.push(str);
|
||||||
|
} else if (get_class(data) === "Blob" || get_class(data) === "File") {
|
||||||
|
if (FileReaderSync) {
|
||||||
|
var fr = new FileReaderSync;
|
||||||
|
bb.push(fr.readAsBinaryString(data));
|
||||||
|
} else {
|
||||||
|
// async FileReader won't work as BlobBuilder is sync
|
||||||
|
throw new FileException("NOT_READABLE_ERR");
|
||||||
|
}
|
||||||
|
} else if (data instanceof FakeBlob) {
|
||||||
|
if (data.encoding === "base64" && atob) {
|
||||||
|
bb.push(atob(data.data));
|
||||||
|
} else if (data.encoding === "URI") {
|
||||||
|
bb.push(decodeURIComponent(data.data));
|
||||||
|
} else if (data.encoding === "raw") {
|
||||||
|
bb.push(data.data);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (typeof data !== "string") {
|
||||||
|
data += ""; // convert unsupported types to strings
|
||||||
|
}
|
||||||
|
// decode UTF-16 to binary string
|
||||||
|
bb.push(unescape(encodeURIComponent(data)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
FBB_proto.getBlob = function(type) {
|
||||||
|
if (!arguments.length) {
|
||||||
|
type = null;
|
||||||
|
}
|
||||||
|
return new FakeBlob(this.data.join(""), type, "raw");
|
||||||
|
};
|
||||||
|
FBB_proto.toString = function() {
|
||||||
|
return "[object BlobBuilder]";
|
||||||
|
};
|
||||||
|
FB_proto.slice = function(start, end, type) {
|
||||||
|
var args = arguments.length;
|
||||||
|
if (args < 3) {
|
||||||
|
type = null;
|
||||||
|
}
|
||||||
|
return new FakeBlob(
|
||||||
|
this.data.slice(start, args > 1 ? end : this.data.length)
|
||||||
|
, type
|
||||||
|
, this.encoding
|
||||||
|
);
|
||||||
|
};
|
||||||
|
FB_proto.toString = function() {
|
||||||
|
return "[object Blob]";
|
||||||
|
};
|
||||||
|
FB_proto.close = function() {
|
||||||
|
this.size = 0;
|
||||||
|
delete this.data;
|
||||||
|
};
|
||||||
|
return FakeBlobBuilder;
|
||||||
|
}(view));
|
||||||
|
|
||||||
|
view.Blob = function(blobParts, options) {
|
||||||
|
var type = options ? (options.type || "") : "";
|
||||||
|
var builder = new BlobBuilder();
|
||||||
|
if (blobParts) {
|
||||||
|
for (var i = 0, len = blobParts.length; i < len; i++) {
|
||||||
|
builder.append(blobParts[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return builder.getBlob(type);
|
||||||
|
};
|
||||||
|
}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
|
|
@ -0,0 +1,243 @@
|
||||||
|
/* FileSaver.js
|
||||||
|
* A saveAs() FileSaver implementation.
|
||||||
|
* 2014-08-29
|
||||||
|
*
|
||||||
|
* By Eli Grey, http://eligrey.com
|
||||||
|
* License: X11/MIT
|
||||||
|
* See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*global self */
|
||||||
|
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
|
||||||
|
|
||||||
|
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
|
||||||
|
|
||||||
|
var saveAs = saveAs
|
||||||
|
// IE 10+ (native saveAs)
|
||||||
|
|| (typeof navigator !== "undefined" &&
|
||||||
|
navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
|
||||||
|
// Everyone else
|
||||||
|
|| (function(view) {
|
||||||
|
"use strict";
|
||||||
|
// IE <10 is explicitly unsupported
|
||||||
|
if (typeof navigator !== "undefined" &&
|
||||||
|
/MSIE [1-9]\./.test(navigator.userAgent)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var
|
||||||
|
doc = view.document
|
||||||
|
// only get URL when necessary in case Blob.js hasn't overridden it yet
|
||||||
|
, get_URL = function() {
|
||||||
|
return view.URL || view.webkitURL || view;
|
||||||
|
}
|
||||||
|
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
|
||||||
|
, can_use_save_link = "download" in save_link
|
||||||
|
, click = function(node) {
|
||||||
|
var event = doc.createEvent("MouseEvents");
|
||||||
|
event.initMouseEvent(
|
||||||
|
"click", true, false, view, 0, 0, 0, 0, 0
|
||||||
|
, false, false, false, false, 0, null
|
||||||
|
);
|
||||||
|
node.dispatchEvent(event);
|
||||||
|
}
|
||||||
|
, webkit_req_fs = view.webkitRequestFileSystem
|
||||||
|
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
|
||||||
|
, throw_outside = function(ex) {
|
||||||
|
(view.setImmediate || view.setTimeout)(function() {
|
||||||
|
throw ex;
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
, force_saveable_type = "application/octet-stream"
|
||||||
|
, fs_min_size = 0
|
||||||
|
// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 for
|
||||||
|
// the reasoning behind the timeout and revocation flow
|
||||||
|
, arbitrary_revoke_timeout = 10
|
||||||
|
, revoke = function(file) {
|
||||||
|
var revoker = function() {
|
||||||
|
if (typeof file === "string") { // file is an object URL
|
||||||
|
get_URL().revokeObjectURL(file);
|
||||||
|
} else { // file is a File
|
||||||
|
file.remove();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (view.chrome) {
|
||||||
|
revoker();
|
||||||
|
} else {
|
||||||
|
setTimeout(revoker, arbitrary_revoke_timeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, dispatch = function(filesaver, event_types, event) {
|
||||||
|
event_types = [].concat(event_types);
|
||||||
|
var i = event_types.length;
|
||||||
|
while (i--) {
|
||||||
|
var listener = filesaver["on" + event_types[i]];
|
||||||
|
if (typeof listener === "function") {
|
||||||
|
try {
|
||||||
|
listener.call(filesaver, event || filesaver);
|
||||||
|
} catch (ex) {
|
||||||
|
throw_outside(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, FileSaver = function(blob, name) {
|
||||||
|
// First try a.download, then web filesystem, then object URLs
|
||||||
|
var
|
||||||
|
filesaver = this
|
||||||
|
, type = blob.type
|
||||||
|
, blob_changed = false
|
||||||
|
, object_url
|
||||||
|
, target_view
|
||||||
|
, dispatch_all = function() {
|
||||||
|
dispatch(filesaver, "writestart progress write writeend".split(" "));
|
||||||
|
}
|
||||||
|
// on any filesys errors revert to saving with object URLs
|
||||||
|
, fs_error = function() {
|
||||||
|
// don't create more object URLs than needed
|
||||||
|
if (blob_changed || !object_url) {
|
||||||
|
object_url = get_URL().createObjectURL(blob);
|
||||||
|
}
|
||||||
|
if (target_view) {
|
||||||
|
target_view.location.href = object_url;
|
||||||
|
} else {
|
||||||
|
var new_tab = view.open(object_url, "_blank");
|
||||||
|
if (new_tab == undefined && typeof safari !== "undefined") {
|
||||||
|
//Apple do not allow window.open, see http://bit.ly/1kZffRI
|
||||||
|
view.location.href = object_url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch_all();
|
||||||
|
revoke(object_url);
|
||||||
|
}
|
||||||
|
, abortable = function(func) {
|
||||||
|
return function() {
|
||||||
|
if (filesaver.readyState !== filesaver.DONE) {
|
||||||
|
return func.apply(this, arguments);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
, create_if_not_found = {create: true, exclusive: false}
|
||||||
|
, slice
|
||||||
|
;
|
||||||
|
filesaver.readyState = filesaver.INIT;
|
||||||
|
if (!name) {
|
||||||
|
name = "download";
|
||||||
|
}
|
||||||
|
if (can_use_save_link) {
|
||||||
|
object_url = get_URL().createObjectURL(blob);
|
||||||
|
save_link.href = object_url;
|
||||||
|
save_link.download = name;
|
||||||
|
click(save_link);
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch_all();
|
||||||
|
revoke(object_url);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Object and web filesystem URLs have a problem saving in Google Chrome when
|
||||||
|
// viewed in a tab, so I force save with application/octet-stream
|
||||||
|
// http://code.google.com/p/chromium/issues/detail?id=91158
|
||||||
|
// Update: Google errantly closed 91158, I submitted it again:
|
||||||
|
// https://code.google.com/p/chromium/issues/detail?id=389642
|
||||||
|
if (view.chrome && type && type !== force_saveable_type) {
|
||||||
|
slice = blob.slice || blob.webkitSlice;
|
||||||
|
blob = slice.call(blob, 0, blob.size, force_saveable_type);
|
||||||
|
blob_changed = true;
|
||||||
|
}
|
||||||
|
// Since I can't be sure that the guessed media type will trigger a download
|
||||||
|
// in WebKit, I append .download to the filename.
|
||||||
|
// https://bugs.webkit.org/show_bug.cgi?id=65440
|
||||||
|
if (webkit_req_fs && name !== "download") {
|
||||||
|
name += ".download";
|
||||||
|
}
|
||||||
|
if (type === force_saveable_type || webkit_req_fs) {
|
||||||
|
target_view = view;
|
||||||
|
}
|
||||||
|
if (!req_fs) {
|
||||||
|
fs_error();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fs_min_size += blob.size;
|
||||||
|
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
|
||||||
|
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
|
||||||
|
var save = function() {
|
||||||
|
dir.getFile(name, create_if_not_found, abortable(function(file) {
|
||||||
|
file.createWriter(abortable(function(writer) {
|
||||||
|
writer.onwriteend = function(event) {
|
||||||
|
target_view.location.href = file.toURL();
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch(filesaver, "writeend", event);
|
||||||
|
revoke(file);
|
||||||
|
};
|
||||||
|
writer.onerror = function() {
|
||||||
|
var error = writer.error;
|
||||||
|
if (error.code !== error.ABORT_ERR) {
|
||||||
|
fs_error();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
"writestart progress write abort".split(" ").forEach(function(event) {
|
||||||
|
writer["on" + event] = filesaver["on" + event];
|
||||||
|
});
|
||||||
|
writer.write(blob);
|
||||||
|
filesaver.abort = function() {
|
||||||
|
writer.abort();
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
};
|
||||||
|
filesaver.readyState = filesaver.WRITING;
|
||||||
|
}), fs_error);
|
||||||
|
}), fs_error);
|
||||||
|
};
|
||||||
|
dir.getFile(name, {create: false}, abortable(function(file) {
|
||||||
|
// delete file if it already exists
|
||||||
|
file.remove();
|
||||||
|
save();
|
||||||
|
}), abortable(function(ex) {
|
||||||
|
if (ex.code === ex.NOT_FOUND_ERR) {
|
||||||
|
save();
|
||||||
|
} else {
|
||||||
|
fs_error();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}), fs_error);
|
||||||
|
}), fs_error);
|
||||||
|
}
|
||||||
|
, FS_proto = FileSaver.prototype
|
||||||
|
, saveAs = function(blob, name) {
|
||||||
|
return new FileSaver(blob, name);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
FS_proto.abort = function() {
|
||||||
|
var filesaver = this;
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch(filesaver, "abort");
|
||||||
|
};
|
||||||
|
FS_proto.readyState = FS_proto.INIT = 0;
|
||||||
|
FS_proto.WRITING = 1;
|
||||||
|
FS_proto.DONE = 2;
|
||||||
|
|
||||||
|
FS_proto.error =
|
||||||
|
FS_proto.onwritestart =
|
||||||
|
FS_proto.onprogress =
|
||||||
|
FS_proto.onwrite =
|
||||||
|
FS_proto.onabort =
|
||||||
|
FS_proto.onerror =
|
||||||
|
FS_proto.onwriteend =
|
||||||
|
null;
|
||||||
|
|
||||||
|
return saveAs;
|
||||||
|
}(
|
||||||
|
typeof self !== "undefined" && self
|
||||||
|
|| typeof window !== "undefined" && window
|
||||||
|
|| this.content
|
||||||
|
));
|
||||||
|
// `self` is undefined in Firefox for Android content script context
|
||||||
|
// while `this` is nsIContentFrameMessageManager
|
||||||
|
// with an attribute `content` that corresponds to the window
|
||||||
|
|
||||||
|
if (typeof module !== "undefined" && module !== null) {
|
||||||
|
module.exports = saveAs;
|
||||||
|
} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
|
||||||
|
define([], function() {
|
||||||
|
return saveAs;
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
<style type="text/css">
|
||||||
|
#bandeaulautre {
|
||||||
|
width:100%;
|
||||||
|
height:13px;
|
||||||
|
background:#111 url('/admin/images/lautre_ultra_mini_black.png') no-repeat 2px center;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 9px !important;
|
||||||
|
color:#FFF;
|
||||||
|
padding-top: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre .home {
|
||||||
|
float:left;
|
||||||
|
text-align:left;
|
||||||
|
display:block;
|
||||||
|
padding:0px 0px 0px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre .links {
|
||||||
|
float:right;
|
||||||
|
text-align:right;
|
||||||
|
display:block;
|
||||||
|
padding:0px 3px 0px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre a,
|
||||||
|
#bandeaulautre a:link,
|
||||||
|
#bandeaulautre a:active,
|
||||||
|
#bandeaulautre a:visited {
|
||||||
|
color:#FFF;
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre a:hover {
|
||||||
|
color:#F4520A;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="bandeaulautre">
|
||||||
|
<span class="home">
|
||||||
|
<a href="http://lautre.net">L'Autre Net</a>
|
||||||
|
</span>
|
||||||
|
<span class="links">
|
||||||
|
<a href="https://admin.lautre.net">Bureau</a> ·
|
||||||
|
<a href="https://admin.lautre.net/webmail">Webmail</a> ·
|
||||||
|
<a href="http://aide.lautre.net">Aide</a> ·
|
||||||
|
<a href="http://wiki.lautre.net">Wiki</a> ·
|
||||||
|
<a href="http://blog.lautre.net">Interventions</a> ·
|
||||||
|
<a href="http://lautre.net/irc">Irc</a> ·
|
||||||
|
<a href="http://mon.lautre.net">Mon</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1,81 @@
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="bs-docs-sidebar hidden-print hidden-xs hidden-sm" role="complementary">
|
||||||
|
<ul class="nav bs-docs-sidenav">
|
||||||
|
<?php echo $index; ?>
|
||||||
|
</ul>
|
||||||
|
<a class="back-to-top" href="#top">
|
||||||
|
Back to top
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Footer
|
||||||
|
================================================== -->
|
||||||
|
<footer class="bs-docs-footer" role="contentinfo">
|
||||||
|
<div class="container">
|
||||||
|
<div class="bs-docs-social">
|
||||||
|
<ul class="bs-docs-social-buttons">
|
||||||
|
<li>
|
||||||
|
<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=twbs&repo=bootstrap&type=watch&count=true" width="100" height="20" title="Star on GitHub"></iframe>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=twbs&repo=bootstrap&type=fork&count=true" width="102" height="20" title="Fork on GitHub"></iframe>
|
||||||
|
</li>
|
||||||
|
<li class="follow-btn">
|
||||||
|
<a href="https://twitter.com/twbootstrap" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="true">Follow @twbootstrap</a>
|
||||||
|
</li>
|
||||||
|
<li class="tweet-btn">
|
||||||
|
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://getbootstrap.com/" data-count="horizontal" data-via="twbootstrap" data-related="mdo:Creator of Bootstrap">Tweet</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Designed and built with all the love in the world by <a href="https://twitter.com/mdo" target="_blank">@mdo</a> and <a href="https://twitter.com/fat" target="_blank">@fat</a>.</p>
|
||||||
|
<p>Maintained by the <a href="https://github.com/orgs/twbs/people">core team</a> with the help of <a href="https://github.com/twbs/bootstrap/graphs/contributors">our contributors</a>.</p>
|
||||||
|
<p>Code licensed under <a href="https://github.com/twbs/bootstrap/blob/master/LICENSE" target="_blank">MIT</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
|
||||||
|
<ul class="bs-docs-footer-links muted">
|
||||||
|
<li>Currently v3.3.1</li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="https://github.com/twbs/bootstrap">GitHub</a></li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="../getting-started/#examples">Examples</a></li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="../2.3.2/">v2.3.2 docs</a></li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="../about/">About</a></li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="http://expo.getbootstrap.com">Expo</a></li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="http://blog.getbootstrap.com">Blog</a></li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="https://github.com/twbs/bootstrap/issues">Issues</a></li>
|
||||||
|
<li>·</li>
|
||||||
|
<li><a href="https://github.com/twbs/bootstrap/releases">Releases</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Bootstrap core JavaScript
|
||||||
|
================================================== -->
|
||||||
|
<!-- Placed at the end of the document so the pages load faster -->
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
|
||||||
|
|
||||||
|
<script src="bootstrap.min.js"></script>
|
||||||
|
<script src="assets/js/docs.min.js"></script>
|
||||||
|
|
||||||
|
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
|
||||||
|
<script src="assets/js/ie10-viewport-bug-workaround.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,102 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<!-- Meta, title, CSS, favicons, etc. -->
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta name="description" content="Bootstrap, a sleek, intuitive, and powerful mobile first front-end framework for faster and easier web development.">
|
||||||
|
<meta name="keywords" content="HTML, CSS, JS, JavaScript, framework, bootstrap, front-end, frontend, web development">
|
||||||
|
<meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
|
||||||
|
|
||||||
|
<title>
|
||||||
|
|
||||||
|
Components · Bootstrap
|
||||||
|
|
||||||
|
</title>
|
||||||
|
|
||||||
|
<!-- Bootstrap core CSS -->
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
|
||||||
|
|
||||||
|
<!--[if lt IE 9]><script src="assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
|
||||||
|
<script src="assets/js/ie-emulation-modes-warning.js"></script>
|
||||||
|
|
||||||
|
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||||
|
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||||
|
<![endif]-->
|
||||||
|
|
||||||
|
<!-- Favicons -->
|
||||||
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||||
|
<link rel="icon" href="/favicon.ico">
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
#bandeauzero {
|
||||||
|
width:100%; height:44px;
|
||||||
|
}
|
||||||
|
#bandeaulautre {
|
||||||
|
position: fixed; left: 0; width:100%; min-height:32px; background:#eee; border-bottom: 1px solid #ccc; font-family: sans-serif;
|
||||||
|
font-size: 14px !important; color:black; padding-top: 4px; margin-bottom: 6px; z-index: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre .home {
|
||||||
|
float:left; text-align:left; display:block; padding:0px 0px 0px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre .links {
|
||||||
|
float:right; text-align:right; display:block; padding:0px 6px 0px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre a,
|
||||||
|
#bandeaulautre a:link,
|
||||||
|
#bandeaulautre a:active,
|
||||||
|
#bandeaulautre a:visited {
|
||||||
|
color: black; text-decoration:none; margin: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bandeaulautre a:hover {
|
||||||
|
color:#F4520A;
|
||||||
|
}
|
||||||
|
#bandeaulautre img {
|
||||||
|
margin: 0; padding: 0 8px; vertical-align: middle;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="bandeaulautre">
|
||||||
|
<span class="home">
|
||||||
|
<a href="http://www.alternc.com"> <img src="alternc.png">
|
||||||
|
AlternC panel d'hébergement</a>
|
||||||
|
<a href="http://www.alternc.com/install">Installation & Mise à jour</a>
|
||||||
|
<a href="http://www.aide-alternc.org/">Documentation</a>
|
||||||
|
<a href="http://www.alternc.org/">Site des développeurs</a>
|
||||||
|
</span>
|
||||||
|
<span class="links">
|
||||||
|
<a href="http://demo.alternc.org">Démonstration</multi></a>
|
||||||
|
<a href="http://www.alternc.net/">Service DNS</a>
|
||||||
|
<a href="irc://irc.freenode.net/#alternc">Chat IRC</a>
|
||||||
|
<a href="https://www.github.com/alternc">Code source</a>
|
||||||
|
<img src="compass.png">
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div id="bandeauzero">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Docs page layout -->
|
||||||
|
<div class="bs-docs-header" id="content">
|
||||||
|
<div class="container">
|
||||||
|
<h1>Components</h1>
|
||||||
|
<p>Over a dozen reusable components built to provide iconography, dropdowns, input groups, navigation, alerts, and much more.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container bs-docs-container">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-9" role="main">
|
||||||
|
<div class="bs-docs-section">
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
<?php
|
||||||
|
header("Content-Type: text/html; charset=UTF-8");
|
||||||
|
|
||||||
|
require_once("head.php");
|
||||||
|
|
||||||
|
$f=fopen("../install.php","rb");
|
||||||
|
$headings=array();
|
||||||
|
$cur=array(); $id=""; $name="";
|
||||||
|
while ($s=fgets($f,1024)) {
|
||||||
|
echo $s;
|
||||||
|
if (preg_match('#<h1 id="([^"]*)">([^<]*)</h1>#',$s,$mat)) {
|
||||||
|
if ($id) $headings[]=array("id"=>$id, "name"=>$name, "cur"=>$cur);
|
||||||
|
$id=$mat[1]; $name=$mat[2];
|
||||||
|
$cur=array();
|
||||||
|
}
|
||||||
|
if (preg_match('#<h2 id="([^"]*)">([^<]*)</h2>#',$s,$mat)) {
|
||||||
|
$cur[]=array("id"=>$mat[1], "name"=>$mat[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($id) $headings[]=array("id"=>$id, "name"=>$name, "cur"=>$cur);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
foreach($headings as $v) {
|
||||||
|
?>
|
||||||
|
<li>
|
||||||
|
<a href="#<?php echo $v["id"]; ?>"><?php echo $v["name"]; ?></a>
|
||||||
|
<?php if (count($v["cur"])) { ?>
|
||||||
|
<ul class="nav">
|
||||||
|
<?php foreach($v["cur"] as $vv) { ?>
|
||||||
|
<li><a href="#<?php echo $vv["id"]; ?>"><?php echo $vv["name"]; ?></a></li>
|
||||||
|
<?php } ?>
|
||||||
|
</ul>
|
||||||
|
<?php } ?>
|
||||||
|
</li>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
$index=ob_get_clean();
|
||||||
|
require_once("foot.php");
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
<nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
|
||||||
|
<ul class="nav navbar-nav">
|
||||||
|
<li>
|
||||||
|
<a href="../getting-started/">Getting started</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="../css/">CSS</a>
|
||||||
|
</li>
|
||||||
|
<li class="active">
|
||||||
|
<a href="../components/">Components</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="../javascript/">JavaScript</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="../customize/">Customize</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="nav navbar-nav navbar-right">
|
||||||
|
<li><a href="http://expo.getbootstrap.com" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Expo');">Expo</a></li>
|
||||||
|
<li><a href="http://blog.getbootstrap.com" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Blog');">Blog</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|