adding web page rendering this doc as HTML+Bootstrap \o/
This commit is contained in:
parent
5f80d2b191
commit
a8fcbcaacb
doc
MakefileREADME.md
www
alternc.pngbandeau.htmlbootstrap.min.jscompass.pngfoot.phphead.phpindex.phpnavbar
assets
brand
css
flash
img
js
|
@ -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
|
||||||
|
|
Binary file not shown.
After ![]() (image error) 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 (image error) 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 (image error) 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 (image error) Size: 1.6 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
@ -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; }
|
Binary file not shown.
Binary file not shown.
After ![]() (image error) Size: 3.0 KiB |
Binary file not shown.
After ![]() (image error) Size: 6.5 KiB |
Binary file not shown.
After ![]() (image error) Size: 14 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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.')
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
|
@ -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;
|
||||||
|
});
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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>
|
File diff suppressed because one or more lines are too long
Binary file not shown.
After ![]() (image error) 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>
|
Loading…
Reference in New Issue