From e83e2c9bdeb259fcb7b12ae21da8f6eac8ff34a4 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sun, 14 Jul 2013 07:13:41 -0400 Subject: [PATCH 0001/1182] Initializing template for Software Carpentry bootcamp home pages. --- bootstrap/bootstrap-responsive.css | 1092 ++++ bootstrap/bootstrap.css | 6039 ++++++++++++++++++ bootstrap/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes bootstrap/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes lesson.css | 47 + swc-bootstrap.css | 61 + swc.css | 315 + 7 files changed, 7554 insertions(+) create mode 100644 bootstrap/bootstrap-responsive.css create mode 100644 bootstrap/bootstrap.css create mode 100644 bootstrap/img/glyphicons-halflings-white.png create mode 100644 bootstrap/img/glyphicons-halflings.png create mode 100644 lesson.css create mode 100644 swc-bootstrap.css create mode 100644 swc.css diff --git a/bootstrap/bootstrap-responsive.css b/bootstrap/bootstrap-responsive.css new file mode 100644 index 000000000..a3352d774 --- /dev/null +++ b/bootstrap/bootstrap-responsive.css @@ -0,0 +1,1092 @@ +/*! + * Bootstrap Responsive v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +@-ms-viewport { + width: device-width; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/bootstrap/bootstrap.css b/bootstrap/bootstrap.css new file mode 100644 index 000000000..8e4b38334 --- /dev/null +++ b/bootstrap/bootstrap.css @@ -0,0 +1,6039 @@ +/*! + * Bootstrap v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover { + color: #356635; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 25px; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover td, +.table-hover tbody tr:hover th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success td { + background-color: #dff0d8; +} + +.table tbody tr.error td { + background-color: #f2dede; +} + +.table tbody tr.warning td { + background-color: #fcf8e3; +} + +.table tbody tr.info td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("./img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: url("./img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: #999999; +} + +.dropdown-menu .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #bbbbbb; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #a2a2a2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -3px; +} + +.tooltip.right { + margin-left: 3px; +} + +.tooltip.bottom { + margin-top: 3px; +} + +.tooltip.left { + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media .pull-left { + margin-right: 10px; +} + +.media .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/bootstrap/img/glyphicons-halflings-white.png b/bootstrap/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/bootstrap/img/glyphicons-halflings.png b/bootstrap/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$SdAkd9FAvlc$ zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@ zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9 zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~ z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$ZcXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j;NzWoEVWRD-~H$=f>j9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4 z_g9(-R;qyH&6I$`b42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz zmX=ZWtt4QZKx**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5Ed^G|SD7IG+kvgyVksU) z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+ z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N= zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8 z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL zJc{fv(&qA7UUJ|AXLc5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b# zg4p<Ou`ME|Kd1WHK@8 zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_ z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph zW*uuu*(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b> z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O zBpNihl3S0_IGVE)^`#94#j~$;7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0 zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s z5_=8%i0H^fEAOQbHXf0;?DN5z-5+1 zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b zcus3bh1w~L804EZ*s96?GB&F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c; z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_ zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~ z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF z#$HLTqGT^@F#A29b0HqiJsRJAlh8kngU`BDI6 zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaUz$@0z4rl+TW zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!eLsCVQ`TTjn3JRXZD~>GM z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L! z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{SN8m6`9pp+ zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@ zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A zO7b3HGOUG`vgH{}&&AgrFy%K^>? z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6 z*ygceDOrldsL30w`H;rNu+IjlS+G~p&0SawXCA1+D zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN- zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50 z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq| zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$PX|5)$_ z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h& zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5PrZNVyKWR7hm zWjoy^p7v8m#$qN0K#8jT- zq`mSirDZDa1Jxm;Rg3rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@ zY)f7pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus& z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-! zpo2p-_h^b$DNBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q} z3ekM?iOKkCzQHkBkhg=hD!@&(L}FcHKoa zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z2;N=no)`IGm#y%aGE>-FN zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9; z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4 zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE zZCVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH z%O*pOv(77?ZiT{W zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@1WKg5Fz_Rjl4wlJQj)rtp8yL3r!Shy zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$pUN`(S)|*c^CgdwY>Fa>> zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBNM)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f zrY&8SWmesiba0|3X-jmlMT3 z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*n!PiT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk% zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~ zXC~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRbc~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|! zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA? zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF zAC6jW4>fa~!Vp5+$Z{<)Qxb|{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@ zfE-OTvEreoz1+p`9sUI%Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~) zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy zCARmaA@^Yo2sS%2$`031-+h9KMZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB zh?v+r^cp@jQ4EspC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg zd0EJ^=tdW~7fbcLFsqryFEcy*-8!?;n%;F+8i{eZyCDaiYxghr z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3gdmQbqF1=aBtRM7)c_Ae?$b8 zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IHPjkn0!=;JdhMXqzMLeh`yOylXROP- zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#? zdKVBCPt`eU@IzL)OXA`Ebu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}` zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb z{K78Ci&Twup zTKm)ioN|wcYy%Qnwb)IzbH>W!;Ah5Zdm_jRY`+VRJ2 zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP2kNgqEG z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI) zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~ z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)Jl=e1it!XzY($S3V zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9+i*>w z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J z;#G{EdoY+O;REEjQ}X7_YzWLO+Ey3>a_KDe1CjSe| z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ`r2;@SaZ z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2 zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO4V=s4Qug{M|iDV@s zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX ze1}r{jy;G?&}Da}a7>SCDsFDuzuseeCKof|Dz2BPsP8? zY;a)Tkr2P~0^2BeO?wnzF_Ul-ekY=-w26VnU%U3f19Z-pj&2 z4J_a|o4Dci+MO)mPQIM>kdPG1xydiR9@#8m zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3 trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so# literal 0 HcmV?d00001 diff --git a/lesson.css b/lesson.css new file mode 100644 index 000000000..12ba83a2a --- /dev/null +++ b/lesson.css @@ -0,0 +1,47 @@ +/* Comments in code. */ +.comment { + color: purple; +} + +/* Highlighted changes in code. */ +.highlight { + background-color: mistyrose; +} + +/* Manual input. */ +.in { + color: darkgreen; +} + +/* Program output. */ +.out { + color: darkblue; + font-style: italic; +} + +/* Error output. */ +.err { + color: darkred; + font-style: italic; + font-weight: bold; +} + +/* Explanatory call-out boxes. */ +div.box { + background-color: lightgray; +} + +/* Challenge questions. */ +div.challenges {} + +/* Key points in summary. */ +div.keypoints {} + +/* Main lesson. */ +div.lesson {} + +/* Learning objectives. */ +div.objectives {} + +/* Continuation paragraph. */ +p.continue {} diff --git a/swc-bootstrap.css b/swc-bootstrap.css new file mode 100644 index 000000000..6df6d1595 --- /dev/null +++ b/swc-bootstrap.css @@ -0,0 +1,61 @@ +/* Customizations to Bootstrap's default styles */ + +/* readability: darken the alert colour for contrast with background */ +.alert { + color: rgb(0,0,0); +} + +/* Container for page contents. */ +.container { + background-color: white; +} + +.navbar .container { + background-color: inherit; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #F4F4F4; + background-image: none; + border: 1px solid #d4d4d4; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +code { + color: #333333; +} + +.navbar-inverse .navbar-inner { + background-color: #20267D; + background-image: none; + border-color: #20267D; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #20267D; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #20267D; +} + +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} diff --git a/swc.css b/swc.css new file mode 100644 index 000000000..fc9866e9b --- /dev/null +++ b/swc.css @@ -0,0 +1,315 @@ +/* Headings */ +h1, h2, h3, h4, h5, h6 { + color: rgb(03,03,03); +} + +h1, h2 { + margin-top: 40px; + margin-bottom: 10px; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; +} + +/* Comments in code. */ +.comment { + color: purple; +} + +/* Error messages. */ +.err { + color: darkred; + font-style: italic; +} + +/* Things to fix. */ +.fixme { + text-decoration: underline; + color: darkred; + background-color: lightgray; +} + +/* Highlighted changes in code. */ +.highlight { + background-color: mistyrose; +} + +/* Manual input. */ +.in { + color: darkgreen; +} + +/* Program output. */ +.out { + color: darkblue; + font-style: italic; +} + +/* Putting shadows around things. */ +.shadow { + -moz-box-shadow: 0 0 30px 5px #999; + -webkit-box-shadow: 0 0 30px 5px #999; + box-shadow: 0 0 30px 5px #999; +} + +/* Things to understand (lead-in to sections in book). */ +.understand { + background-color: lightyellow; +} + +/* Block quotations. */ +blockquote { + margin: 1em; + padding: 1em 1em .5em 1em; + width: 90%; +} + +/* Citation for testimonial quote. */ +blockquote.testimonial cite { + font-style: italic; +} + +/* Main body of pages. */ +body { + background: #BEC3C6; + margin: 20px 0; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + color: rgb(03, 03, 03); +} + +/* Styling for editorial stylesheet */ +body.stylesheet { + background: #ffffff; + width: 60em; + margin: 20 auto; +} + +/* Top banner of every page. */ +div.banner { + background-color: #FFFFFF; + width: 100%; + height: 90px; + margin: 0px; + padding: 0; + border-bottom: 1px solid #A6A6A6; +} + +/* Padding around image in top banner. */ +div.banner a img { + padding: 20px 25px; +} + +/* Explanatory call-out boxes. */ +div.box { + width: 54em; + background-color: mistyrose; + display: block; + margin-left: auto; + margin-right: auto; + padding-top: 1px; + padding-bottom: 1px; + padding-left: 10px; + padding-right: 10px; + outline-color: gray; + outline-width: 1px; + outline-style: solid; +} + +/* Level 2 headings inside pages. */ +div.content div h3 { + border-bottom: 1px solid #CCCCCC; + display: block; + font-family: Verdana,"BitStream vera Sans"; + margin-top: 10px; + padding: 0 5px 3px; +} + +/* PDF and slide files referenced from lectures. */ +div.files { + padding: 10px; +} + +/* Footer of every page. */ +div.footer { + clear: both; + background: url("/img/main_shadow.png") repeat-x scroll center top #FFFFFF; + padding: 4px 10px 7px 10px; + border-top: 1px solid #A6A6A6; + text-align: right; +} + +.swc-blue-bg { + background-color: #20267D; +} + +/* Main menu at the top of every page. */ +div.mainmenu { + clear: both; + background-color: #F4F4F4; + margin: 0px; + padding: 3px 0px 3px 25px; + border-bottom: 1px solid #A6A6A6; + height:30px +} + +#menubar { + float:left; + margin-top:4px; +} + +#searchbar { + float:right; + margin-right:20px; +} + +/* Narration for audio-only lectures. */ +div.narration { + text-align: center; + font-size: 2em; +} + +/* Table of contents. */ +div.toc { + /* No special styling yet. */ +} + +.transcript { + display: table; +} + +.transcript .media img { + border: 1px solid grey; +} + + +/* Title styling */ +h1.title { + margin:40px 0px; + border-bottom:1px solid #515151; +} + +/* YouTube video embed. */ +div.youtube { + text-align: center; + padding: 10px; +} + +/* Glossary description lists. */ +dl.gloss { + /* Empty for now. */ +} + +/* FIXME: shouldn't be using iframe's directly (EventBrite and YouTube should be via macro expansion). */ +iframe.youtube_player { + border : 0; + text-align : center; + width : 640px; + height : 500px; +} + +/* Amy Brown's logo in book/stylesheet.html. */ +img.logoARB { + float: right; +} + +/* Sections in book chapters. */ +section { + clear: both; +} + +/* Person's name in team.html. */ +span.person { + font-weight: bold; + font-style: italic; +} + +/* Short review of book in bibliography. */ +span.review { + font-style: italic; +} + +/* Bibliography book covers. */ +img.book-cover { + width: 80px; +} + +/* Blog calendar table in blog/index.html. */ +table.blogcalendar th { + text-align : right; + font-weight : bold; +} + +/* See above. */ +table.blogcalendar th.left { + text-align : left; +} + +/* See above. */ +table.blogcalendar tr td { + text-align : right; +} + +/* Blog index tables in blog/index.html. */ +table.blogindex td.date { + text-align: left ; + width:10em; +} + +/* Tables used for displaying choices in challenges. */ +table.choices tr td { + vertical-align : top; +} + +/* Database tables do _not_ have double borders */ +table.outlined { + border-collapse: collapse; +} + +/* Container for content in the bootcamp index page */ +div.bootcamps { + text-align: center; +} + +/* Link items (to bootcamp pages) in the bootcamps tables */ +table.bootcamps td.link { + width: 50%; + text-align: left; +} + +/* Spacer items (i.e. ellipsis) on the bootcamps tables */ +table.bootcamps td.spacer { + max-width: 100%; + text-align: center; +} + +/* Date columns on the bootcamps tables */ +table.bootcamps td.date { + width: 50%; + text-align: right; +} + +/* Badge modal dialog */ +#assertion-modal { + width:700px; + margin-left:-350px; +} +#assertion-modal iframe { + background-color: transparent; + border: 0px none transparent; + padding: 0px; + width: 100%; + height: 20em; +} + +#assertion-model img.badge { + position: absolute; + right: 15px; + bottom: 35px; + opacity: 0.5; +} + +/* list with checkbox as bullet */ +ul.checklist { + list-style-image: url('/img/checkbox.png'); +} From 91446676f8d1011d17a47308feddaf5bbd75b694 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sun, 14 Jul 2013 09:40:45 -0400 Subject: [PATCH 0002/1182] Initializing new repository for Software Carpentry web site. --- bootstrap/bootstrap-responsive.css | 1092 ++++ bootstrap/bootstrap.css | 6039 ++++++++++++++++++ bootstrap/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes bootstrap/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes lesson.css | 47 + swc-bootstrap.css | 61 + swc.css | 315 + 7 files changed, 7554 insertions(+) create mode 100644 bootstrap/bootstrap-responsive.css create mode 100644 bootstrap/bootstrap.css create mode 100644 bootstrap/img/glyphicons-halflings-white.png create mode 100644 bootstrap/img/glyphicons-halflings.png create mode 100644 lesson.css create mode 100644 swc-bootstrap.css create mode 100644 swc.css diff --git a/bootstrap/bootstrap-responsive.css b/bootstrap/bootstrap-responsive.css new file mode 100644 index 000000000..a3352d774 --- /dev/null +++ b/bootstrap/bootstrap-responsive.css @@ -0,0 +1,1092 @@ +/*! + * Bootstrap Responsive v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +@-ms-viewport { + width: device-width; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/bootstrap/bootstrap.css b/bootstrap/bootstrap.css new file mode 100644 index 000000000..8e4b38334 --- /dev/null +++ b/bootstrap/bootstrap.css @@ -0,0 +1,6039 @@ +/*! + * Bootstrap v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover { + color: #356635; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 25px; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover td, +.table-hover tbody tr:hover th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success td { + background-color: #dff0d8; +} + +.table tbody tr.error td { + background-color: #f2dede; +} + +.table tbody tr.warning td { + background-color: #fcf8e3; +} + +.table tbody tr.info td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("./img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: url("./img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: #999999; +} + +.dropdown-menu .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #bbbbbb; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #a2a2a2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -3px; +} + +.tooltip.right { + margin-left: 3px; +} + +.tooltip.bottom { + margin-top: 3px; +} + +.tooltip.left { + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media .pull-left { + margin-right: 10px; +} + +.media .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/bootstrap/img/glyphicons-halflings-white.png b/bootstrap/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/bootstrap/img/glyphicons-halflings.png b/bootstrap/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/lesson.css b/lesson.css new file mode 100644 index 000000000..12ba83a2a --- /dev/null +++ b/lesson.css @@ -0,0 +1,47 @@ +/* Comments in code. */ +.comment { + color: purple; +} + +/* Highlighted changes in code. */ +.highlight { + background-color: mistyrose; +} + +/* Manual input. */ +.in { + color: darkgreen; +} + +/* Program output. */ +.out { + color: darkblue; + font-style: italic; +} + +/* Error output. */ +.err { + color: darkred; + font-style: italic; + font-weight: bold; +} + +/* Explanatory call-out boxes. */ +div.box { + background-color: lightgray; +} + +/* Challenge questions. */ +div.challenges {} + +/* Key points in summary. */ +div.keypoints {} + +/* Main lesson. */ +div.lesson {} + +/* Learning objectives. */ +div.objectives {} + +/* Continuation paragraph. */ +p.continue {} diff --git a/swc-bootstrap.css b/swc-bootstrap.css new file mode 100644 index 000000000..6df6d1595 --- /dev/null +++ b/swc-bootstrap.css @@ -0,0 +1,61 @@ +/* Customizations to Bootstrap's default styles */ + +/* readability: darken the alert colour for contrast with background */ +.alert { + color: rgb(0,0,0); +} + +/* Container for page contents. */ +.container { + background-color: white; +} + +.navbar .container { + background-color: inherit; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #F4F4F4; + background-image: none; + border: 1px solid #d4d4d4; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +code { + color: #333333; +} + +.navbar-inverse .navbar-inner { + background-color: #20267D; + background-image: none; + border-color: #20267D; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #20267D; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #20267D; +} + +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} diff --git a/swc.css b/swc.css new file mode 100644 index 000000000..fc9866e9b --- /dev/null +++ b/swc.css @@ -0,0 +1,315 @@ +/* Headings */ +h1, h2, h3, h4, h5, h6 { + color: rgb(03,03,03); +} + +h1, h2 { + margin-top: 40px; + margin-bottom: 10px; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; +} + +/* Comments in code. */ +.comment { + color: purple; +} + +/* Error messages. */ +.err { + color: darkred; + font-style: italic; +} + +/* Things to fix. */ +.fixme { + text-decoration: underline; + color: darkred; + background-color: lightgray; +} + +/* Highlighted changes in code. */ +.highlight { + background-color: mistyrose; +} + +/* Manual input. */ +.in { + color: darkgreen; +} + +/* Program output. */ +.out { + color: darkblue; + font-style: italic; +} + +/* Putting shadows around things. */ +.shadow { + -moz-box-shadow: 0 0 30px 5px #999; + -webkit-box-shadow: 0 0 30px 5px #999; + box-shadow: 0 0 30px 5px #999; +} + +/* Things to understand (lead-in to sections in book). */ +.understand { + background-color: lightyellow; +} + +/* Block quotations. */ +blockquote { + margin: 1em; + padding: 1em 1em .5em 1em; + width: 90%; +} + +/* Citation for testimonial quote. */ +blockquote.testimonial cite { + font-style: italic; +} + +/* Main body of pages. */ +body { + background: #BEC3C6; + margin: 20px 0; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + color: rgb(03, 03, 03); +} + +/* Styling for editorial stylesheet */ +body.stylesheet { + background: #ffffff; + width: 60em; + margin: 20 auto; +} + +/* Top banner of every page. */ +div.banner { + background-color: #FFFFFF; + width: 100%; + height: 90px; + margin: 0px; + padding: 0; + border-bottom: 1px solid #A6A6A6; +} + +/* Padding around image in top banner. */ +div.banner a img { + padding: 20px 25px; +} + +/* Explanatory call-out boxes. */ +div.box { + width: 54em; + background-color: mistyrose; + display: block; + margin-left: auto; + margin-right: auto; + padding-top: 1px; + padding-bottom: 1px; + padding-left: 10px; + padding-right: 10px; + outline-color: gray; + outline-width: 1px; + outline-style: solid; +} + +/* Level 2 headings inside pages. */ +div.content div h3 { + border-bottom: 1px solid #CCCCCC; + display: block; + font-family: Verdana,"BitStream vera Sans"; + margin-top: 10px; + padding: 0 5px 3px; +} + +/* PDF and slide files referenced from lectures. */ +div.files { + padding: 10px; +} + +/* Footer of every page. */ +div.footer { + clear: both; + background: url("/img/main_shadow.png") repeat-x scroll center top #FFFFFF; + padding: 4px 10px 7px 10px; + border-top: 1px solid #A6A6A6; + text-align: right; +} + +.swc-blue-bg { + background-color: #20267D; +} + +/* Main menu at the top of every page. */ +div.mainmenu { + clear: both; + background-color: #F4F4F4; + margin: 0px; + padding: 3px 0px 3px 25px; + border-bottom: 1px solid #A6A6A6; + height:30px +} + +#menubar { + float:left; + margin-top:4px; +} + +#searchbar { + float:right; + margin-right:20px; +} + +/* Narration for audio-only lectures. */ +div.narration { + text-align: center; + font-size: 2em; +} + +/* Table of contents. */ +div.toc { + /* No special styling yet. */ +} + +.transcript { + display: table; +} + +.transcript .media img { + border: 1px solid grey; +} + + +/* Title styling */ +h1.title { + margin:40px 0px; + border-bottom:1px solid #515151; +} + +/* YouTube video embed. */ +div.youtube { + text-align: center; + padding: 10px; +} + +/* Glossary description lists. */ +dl.gloss { + /* Empty for now. */ +} + +/* FIXME: shouldn't be using iframe's directly (EventBrite and YouTube should be via macro expansion). */ +iframe.youtube_player { + border : 0; + text-align : center; + width : 640px; + height : 500px; +} + +/* Amy Brown's logo in book/stylesheet.html. */ +img.logoARB { + float: right; +} + +/* Sections in book chapters. */ +section { + clear: both; +} + +/* Person's name in team.html. */ +span.person { + font-weight: bold; + font-style: italic; +} + +/* Short review of book in bibliography. */ +span.review { + font-style: italic; +} + +/* Bibliography book covers. */ +img.book-cover { + width: 80px; +} + +/* Blog calendar table in blog/index.html. */ +table.blogcalendar th { + text-align : right; + font-weight : bold; +} + +/* See above. */ +table.blogcalendar th.left { + text-align : left; +} + +/* See above. */ +table.blogcalendar tr td { + text-align : right; +} + +/* Blog index tables in blog/index.html. */ +table.blogindex td.date { + text-align: left ; + width:10em; +} + +/* Tables used for displaying choices in challenges. */ +table.choices tr td { + vertical-align : top; +} + +/* Database tables do _not_ have double borders */ +table.outlined { + border-collapse: collapse; +} + +/* Container for content in the bootcamp index page */ +div.bootcamps { + text-align: center; +} + +/* Link items (to bootcamp pages) in the bootcamps tables */ +table.bootcamps td.link { + width: 50%; + text-align: left; +} + +/* Spacer items (i.e. ellipsis) on the bootcamps tables */ +table.bootcamps td.spacer { + max-width: 100%; + text-align: center; +} + +/* Date columns on the bootcamps tables */ +table.bootcamps td.date { + width: 50%; + text-align: right; +} + +/* Badge modal dialog */ +#assertion-modal { + width:700px; + margin-left:-350px; +} +#assertion-modal iframe { + background-color: transparent; + border: 0px none transparent; + padding: 0px; + width: 100%; + height: 20em; +} + +#assertion-model img.badge { + position: absolute; + right: 15px; + bottom: 35px; + opacity: 0.5; +} + +/* list with checkbox as bullet */ +ul.checklist { + list-style-image: url('/img/checkbox.png'); +} From d7e1c60dcef779efb6d2d73ac6d46815fd162e65 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 15 Jul 2013 14:57:59 -0400 Subject: [PATCH 0003/1182] Adding more questions to FAQ based on suggestions from current instructors. --- swc.css | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/swc.css b/swc.css index fc9866e9b..b67e1b2f2 100644 --- a/swc.css +++ b/swc.css @@ -200,7 +200,7 @@ dl.gloss { /* Empty for now. */ } -/* FIXME: shouldn't be using iframe's directly (EventBrite and YouTube should be via macro expansion). */ +/* Displaying YouTube videos. */ iframe.youtube_player { border : 0; text-align : center; @@ -208,11 +208,6 @@ iframe.youtube_player { height : 500px; } -/* Amy Brown's logo in book/stylesheet.html. */ -img.logoARB { - float: right; -} - /* Sections in book chapters. */ section { clear: both; @@ -313,3 +308,9 @@ table.bootcamps td.date { ul.checklist { list-style-image: url('/img/checkbox.png'); } + +/* FAQ */ +dl.faq dt { + font-style: italic; + font-weight: bold; +} From f6b1cd5bb8036b5260b814f8286e6af21830db60 Mon Sep 17 00:00:00 2001 From: Jon Pipitone Date: Fri, 26 Jul 2013 23:04:21 -0400 Subject: [PATCH 0004/1182] Lightened font and search background for readability --- swc-bootstrap.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 6df6d1595..f74fc1b32 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -30,6 +30,10 @@ code { color: #333333; } +.navbar-inverse .nav > li > a { + color: #f0f0f0; +} + .navbar-inverse .navbar-inner { background-color: #20267D; background-image: none; @@ -59,3 +63,8 @@ code { border-top-color: #ffffff; border-bottom-color: #ffffff; } + +.navbar-inverse .navbar-search .search-query { + background-color: #ffffff; + color: #666666; +} From d8c65c63729524f726915a4e998921c19ff92556 Mon Sep 17 00:00:00 2001 From: Jon Pipitone Date: Fri, 26 Jul 2013 22:41:26 -0400 Subject: [PATCH 0005/1182] Full-width page layout, and logo in navbar --- swc-bootstrap.css | 4 ++++ swc.css | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 6df6d1595..9df5c84d5 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -10,6 +10,10 @@ background-color: white; } +.navbar .brand { + padding-top: 9px; /* align the logo */ +} + .navbar .container { background-color: inherit; } diff --git a/swc.css b/swc.css index b67e1b2f2..7aa17b16f 100644 --- a/swc.css +++ b/swc.css @@ -72,8 +72,6 @@ blockquote.testimonial cite { /* Main body of pages. */ body { - background: #BEC3C6; - margin: 20px 0; font-family: "Open Sans", Helvetica, Arial, sans-serif; color: rgb(03, 03, 03); } From 1ad953ee1ecae8573da2d3edcfddda87f9cf6ff1 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Tue, 1 Oct 2013 10:00:43 -0300 Subject: [PATCH 0006/1182] Solve issue #44 The 'box' class overflow the window width for some screen size. This patch fix it using CSS media query. --- swc.css | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/swc.css b/swc.css index fc9866e9b..59bab5a6f 100644 --- a/swc.css +++ b/swc.css @@ -102,7 +102,6 @@ div.banner a img { /* Explanatory call-out boxes. */ div.box { - width: 54em; background-color: mistyrose; display: block; margin-left: auto; @@ -115,6 +114,16 @@ div.box { outline-width: 1px; outline-style: solid; } +@media (max-width: 700px) { + div.box { + width: 80%; + } +} +@media (min-width: 700px) { + div.box { + width: 54em; + } +} /* Level 2 headings inside pages. */ div.content div h3 { From 429de1954fe230b30f5869b91b6f0caf697a99e4 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Tue, 1 Oct 2013 12:00:47 -0300 Subject: [PATCH 0007/1182] Fix for issue #44 with large font size When using large font it will overflow the width so I add max-width in the css. --- swc.css | 1 + 1 file changed, 1 insertion(+) diff --git a/swc.css b/swc.css index 59bab5a6f..cd7acb505 100644 --- a/swc.css +++ b/swc.css @@ -122,6 +122,7 @@ div.box { @media (min-width: 700px) { div.box { width: 54em; + max-width: 80%; } } From 42c714fa39ba580c7e152d01ca2e85278ff21a4f Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Tue, 22 Oct 2013 16:52:29 -0400 Subject: [PATCH 0008/1182] First draft of skimage novice blog post --- styles/default.css | 135 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 styles/default.css diff --git a/styles/default.css b/styles/default.css new file mode 100644 index 000000000..e417fc179 --- /dev/null +++ b/styles/default.css @@ -0,0 +1,135 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +pre code { + display: block; padding: 0.5em; + background: #F0F0F0; +} + +pre code, +pre .subst, +pre .tag .title, +pre .lisp .title, +pre .clojure .built_in, +pre .nginx .title { + color: black; +} + +pre .string, +pre .title, +pre .constant, +pre .parent, +pre .tag .value, +pre .rules .value, +pre .rules .value .number, +pre .preprocessor, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .aggregate, +pre .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .addition, +pre .flow, +pre .stream, +pre .bash .variable, +pre .apache .tag, +pre .apache .cbracket, +pre .tex .command, +pre .tex .special, +pre .erlang_repl .function_or_atom, +pre .markdown .header { + color: #800; +} + +pre .comment, +pre .annotation, +pre .template_comment, +pre .diff .header, +pre .chunk, +pre .markdown .blockquote { + color: #888; +} + +pre .number, +pre .date, +pre .regexp, +pre .literal, +pre .smalltalk .symbol, +pre .smalltalk .char, +pre .go .constant, +pre .change, +pre .markdown .bullet, +pre .markdown .link_url { + color: #080; +} + +pre .label, +pre .javadoc, +pre .ruby .string, +pre .decorator, +pre .filter .argument, +pre .localvars, +pre .array, +pre .attr_selector, +pre .important, +pre .pseudo, +pre .pi, +pre .doctype, +pre .deletion, +pre .envvar, +pre .shebang, +pre .apache .sqbracket, +pre .nginx .built_in, +pre .tex .formula, +pre .erlang_repl .reserved, +pre .prompt, +pre .markdown .link_label, +pre .vhdl .attribute, +pre .clojure .attribute, +pre .coffeescript .property { + color: #88F +} + +pre .keyword, +pre .id, +pre .phpdoc, +pre .title, +pre .built_in, +pre .aggregate, +pre .css .tag, +pre .javadoctag, +pre .phpdoc, +pre .yardoctag, +pre .smalltalk .class, +pre .winutils, +pre .bash .variable, +pre .apache .tag, +pre .go .typename, +pre .tex .command, +pre .markdown .strong, +pre .request, +pre .status { + font-weight: bold; +} + +pre .markdown .emphasis { + font-style: italic; +} + +pre .nginx .built_in { + font-weight: normal; +} + +pre .coffeescript .javascript, +pre .javascript .xml, +pre .tex .formula, +pre .xml .javascript, +pre .xml .vbscript, +pre .xml .css, +pre .xml .cdata { + opacity: 0.5; +} From 914cd4edd6109fa504e84ca2ff5583a8694c41b3 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Tue, 19 Nov 2013 18:14:10 -0500 Subject: [PATCH 0009/1182] Beginning redesign * very much a work in progress * experimenting with header/banner/home page --- swc-bootstrap.css | 16 ++++++++++++++-- swc.css | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index e8ffd6776..700ebb432 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -7,7 +7,7 @@ /* Container for page contents. */ .container { - background-color: white; + /*background-color: white;*/ } .navbar .brand { @@ -22,6 +22,7 @@ min-height: 40px; padding-right: 20px; padding-left: 20px; + padding:20px; background-color: #F4F4F4; background-image: none; border: 1px solid #d4d4d4; @@ -36,6 +37,7 @@ code { .navbar-inverse .nav > li > a { color: #f0f0f0; + /*color: #2b3990;*/ } .navbar-inverse .navbar-inner { @@ -47,7 +49,7 @@ code { .navbar-inverse .nav .active > a, .navbar-inverse .nav .active > a:hover, .navbar-inverse .nav .active > a:focus { - color: #ffffff; + color: #2b3990; background-color: #20267D; } @@ -72,3 +74,13 @@ code { background-color: #ffffff; color: #666666; } + +.navbar.transparent.navbar-inverse .navbar-inner { + border-width: 0px; + -webkit-box-shadow: 0px 0px; + box-shadow: 0px 0px; + background-color: rgba(0,0,0,0.0); + background-image: -webkit-gradient(linear, 50.00% 0.00%, 50.00% 100.00%, color-stop( 0% , rgba(0,0,0,0.00)),color-stop( 100% , rgba(0,0,0,0.00))); + background-image: -webkit-linear-gradient(270deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); + background-image: linear-gradient(180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); +} \ No newline at end of file diff --git a/swc.css b/swc.css index 7aa17b16f..b2692dd44 100644 --- a/swc.css +++ b/swc.css @@ -1,6 +1,7 @@ /* Headings */ h1, h2, h3, h4, h5, h6 { color: rgb(03,03,03); + font-family: "Montserrat", "Helvetica", "Arial"; } h1, h2 { @@ -74,6 +75,8 @@ blockquote.testimonial cite { body { font-family: "Open Sans", Helvetica, Arial, sans-serif; color: rgb(03, 03, 03); + /* TODO: fix this */ + padding:0 !important; } /* Styling for editorial stylesheet */ @@ -138,7 +141,9 @@ div.footer { } .swc-blue-bg { - background-color: #20267D; + /*background-color: #20267D;*/ + /* svg colour is slightly different? */ + background: #2b3990; } /* Main menu at the top of every page. */ @@ -312,3 +317,44 @@ dl.faq dt { font-style: italic; font-weight: bold; } + +section.content { + width:100%; + background: white; + /*padding-top:50px;*/ +} + +.header { + height:370px; + background: url(/img/header.png) no-repeat center center; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + text-align: center; +} + +.header h1 { + color:#FFF; + line-height: 1.2; + /*font-weight:normal;*/ +} + +#logo { + position: relative; + top: 20px; +} + +#home-options { + background:#F6F6F6; + border-top:1px solid #DDDDDD; + border-bottom:1px solid #DDDDDD; + padding:50px 0 50px 0; + margin-bottom:20px; +} + +section.footer { + background:#2b3990; + padding:20px; +} From 3feb203726d297648e172fdbe43868bb91733fb8 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Tue, 19 Nov 2013 18:45:42 -0500 Subject: [PATCH 0010/1182] updating gh-pages --- swc.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/swc.css b/swc.css index b2692dd44..0aeca48c8 100644 --- a/swc.css +++ b/swc.css @@ -309,7 +309,7 @@ table.bootcamps td.date { /* list with checkbox as bullet */ ul.checklist { - list-style-image: url('/img/checkbox.png'); + list-style-image: url('../img/checkbox.png'); } /* FAQ */ @@ -326,7 +326,7 @@ section.content { .header { height:370px; - background: url(/img/header.png) no-repeat center center; + background: url(../img/header.png) no-repeat center center; background-attachment: fixed; -webkit-background-size: cover; -moz-background-size: cover; @@ -354,6 +354,10 @@ section.content { margin-bottom:20px; } +#home-options h4{ + color:#2b3990; +} + section.footer { background:#2b3990; padding:20px; From 85b74e1269ee36fac1a981b2401bc0e571e392d7 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 1 Dec 2013 14:59:04 -0500 Subject: [PATCH 0011/1182] layout changes --- swc.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/swc.css b/swc.css index 0aeca48c8..cbb2f5feb 100644 --- a/swc.css +++ b/swc.css @@ -75,8 +75,6 @@ blockquote.testimonial cite { body { font-family: "Open Sans", Helvetica, Arial, sans-serif; color: rgb(03, 03, 03); - /* TODO: fix this */ - padding:0 !important; } /* Styling for editorial stylesheet */ @@ -358,7 +356,10 @@ section.content { color:#2b3990; } +h4 a:link, h4 a:visited, a { + color:#2b3990; +} section.footer { background:#2b3990; - padding:20px; + padding:20px 0; } From 9a40f91d95fd8568f387abafc27d49731ebc7664 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Thu, 5 Dec 2013 09:24:21 -0500 Subject: [PATCH 0012/1182] Add hammer, updates templates for new layout * footer still needs work * not sure if I got all the pages --- swc-bootstrap.css | 31 ++++++++++++++----------------- swc.css | 32 ++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 700ebb432..a2cc8070f 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -5,30 +5,22 @@ color: rgb(0,0,0); } -/* Container for page contents. */ -.container { - /*background-color: white;*/ -} - .navbar .brand { - padding-top: 9px; /* align the logo */ + padding-top: 0px; /* align the logo */ } .navbar .container { background-color: inherit; + font-size:12pt; + padding:25px 10px 10px 10px; + background:url('../img/logo-banner-hammer.png') no-repeat; + background-size: 250px; + background-position: 0px 10px; + height:40px; } .navbar-inner { min-height: 40px; - padding-right: 20px; - padding-left: 20px; - padding:20px; - background-color: #F4F4F4; - background-image: none; - border: 1px solid #d4d4d4; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; } code { @@ -49,8 +41,9 @@ code { .navbar-inverse .nav .active > a, .navbar-inverse .nav .active > a:hover, .navbar-inverse .nav .active > a:focus { - color: #2b3990; - background-color: #20267D; + /*color: #2b3990;*/ + color:#fff; + /*background-color: #20267D;*/ } .navbar-inverse .nav li.dropdown.open > .dropdown-toggle, @@ -75,6 +68,10 @@ code { color: #666666; } +.navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a { + color: #fff; +} + .navbar.transparent.navbar-inverse .navbar-inner { border-width: 0px; -webkit-box-shadow: 0px 0px; diff --git a/swc.css b/swc.css index cbb2f5feb..d312fbe89 100644 --- a/swc.css +++ b/swc.css @@ -75,6 +75,7 @@ blockquote.testimonial cite { body { font-family: "Open Sans", Helvetica, Arial, sans-serif; color: rgb(03, 03, 03); + min-width: 350px; } /* Styling for editorial stylesheet */ @@ -319,11 +320,10 @@ dl.faq dt { section.content { width:100%; background: white; - /*padding-top:50px;*/ } -.header { - height:370px; +.header.home { + min-height:430px; background: url(../img/header.png) no-repeat center center; background-attachment: fixed; -webkit-background-size: cover; @@ -331,19 +331,31 @@ section.content { -o-background-size: cover; background-size: cover; text-align: center; + color:#FFF; + font-size:14pt; +} + +.header { + background:#2b3990; } .header h1 { color:#FFF; line-height: 1.2; - /*font-weight:normal;*/ } #logo { position: relative; - top: 20px; + top: 40px; } +#nav-logo { + width:270px; + height:60px; + position:fixed; + top:0; + left:0; +} #home-options { background:#F6F6F6; border-top:1px solid #DDDDDD; @@ -356,10 +368,18 @@ section.content { color:#2b3990; } +/*#nav-logo { + background:url('../img/logo-banner-hammer.png') no-repeat; + background-size: 250px; + width:250px; + height:50px; +} +*/ h4 a:link, h4 a:visited, a { color:#2b3990; } -section.footer { + +footer { background:#2b3990; padding:20px 0; } From 9a6cd842145da9422580f01d58bb523b3db6b0b0 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Mon, 9 Dec 2013 23:02:21 -0500 Subject: [PATCH 0013/1182] Redesign work * add hammer to header * add twitter to home page * adjust styles * adjust branding on all pages --- swc-bootstrap.css | 16 ++++++++++++++++ swc.css | 22 +++++++++++----------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index a2cc8070f..2546bb193 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -80,4 +80,20 @@ code { background-image: -webkit-gradient(linear, 50.00% 0.00%, 50.00% 100.00%, color-stop( 0% , rgba(0,0,0,0.00)),color-stop( 100% , rgba(0,0,0,0.00))); background-image: -webkit-linear-gradient(270deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); background-image: linear-gradient(180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); +} + +@media (max-width: 767px) { + .container { + padding:0 20px; + } + + body { + padding:0; + } + + .navbar-fixed-top, .navbar-fixed-bottom, .navbar-static-top { + margin-left: 0; + margin-right: 0; + margin-bottom:0; + } } \ No newline at end of file diff --git a/swc.css b/swc.css index d312fbe89..e270da8b4 100644 --- a/swc.css +++ b/swc.css @@ -75,7 +75,7 @@ blockquote.testimonial cite { body { font-family: "Open Sans", Helvetica, Arial, sans-serif; color: rgb(03, 03, 03); - min-width: 350px; + min-width: 400px; } /* Styling for editorial stylesheet */ @@ -330,9 +330,8 @@ section.content { -moz-background-size: cover; -o-background-size: cover; background-size: cover; - text-align: center; + text-align: left; color:#FFF; - font-size:14pt; } .header { @@ -341,12 +340,20 @@ section.content { .header h1 { color:#FFF; - line-height: 1.2; + line-height: 1.1; + margin: 0; + font-size: 45pt; +} + +#header-text { + font-size:17pt; + white-space: nowrap; } #logo { position: relative; top: 40px; + text-align: center; } #nav-logo { @@ -368,13 +375,6 @@ section.content { color:#2b3990; } -/*#nav-logo { - background:url('../img/logo-banner-hammer.png') no-repeat; - background-size: 250px; - width:250px; - height:50px; -} -*/ h4 a:link, h4 a:visited, a { color:#2b3990; } From a377360ae98c4e5a5db12f605cf3c864e31cfa19 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Tue, 10 Dec 2013 07:57:15 -0500 Subject: [PATCH 0014/1182] Reworking the home page --- swc.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swc.css b/swc.css index e270da8b4..5ca86daac 100644 --- a/swc.css +++ b/swc.css @@ -323,7 +323,7 @@ section.content { } .header.home { - min-height:430px; + min-height:130px; background: url(../img/header.png) no-repeat center center; background-attachment: fixed; -webkit-background-size: cover; From 435bd1671485378728ccface437a2b6bdee09e90 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Wed, 11 Dec 2013 10:24:31 -0200 Subject: [PATCH 0015/1182] Changes base on @gvwilson comments * Avoid duplicate lines in HTML pages with layout and CSS * Avoid import inside functions * Warning user that the badge already in version 1.0.0 * Fix typo: backing => baking * Avoid dict.key() * Add words about Anaconda --- badge.css | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 badge.css diff --git a/badge.css b/badge.css new file mode 100644 index 000000000..3e1a7623b --- /dev/null +++ b/badge.css @@ -0,0 +1,18 @@ +.badges-section { + margin-bottom:30px; +} +.badges-section .media { + margin-top: 30px; +} +h1.badge-title{ + margin-top: 10px; +} +#modal-badge-img { + position:absolute; + right: 25px; + bottom: 25px; + opacity: 0.5; +} +#assertion-modal.in { + color: black; +} From 7a626fd4ac96a3f8f3fdced47bc00cb113cf6af2 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sat, 14 Dec 2013 18:56:44 -0500 Subject: [PATCH 0016/1182] redesign updates * simplifying design * use header more on each page --- swc-bootstrap.css | 29 +++++++++++++----------- swc.css | 57 ++++++++++++++++++++++++----------------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 2546bb193..538ab220f 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -9,11 +9,17 @@ padding-top: 0px; /* align the logo */ } +.navbar { + margin:0; + border-top:5px solid #2b3990; + border-bottom:1px solid #CCC; +} + .navbar .container { background-color: inherit; - font-size:12pt; - padding:25px 10px 10px 10px; - background:url('../img/logo-banner-hammer.png') no-repeat; + font-size:11pt; + padding:27px 10px 10px 10px; + background:url('../img/software-carpentry-banner.png') no-repeat; background-size: 250px; background-position: 0px 10px; height:40px; @@ -29,28 +35,23 @@ code { .navbar-inverse .nav > li > a { color: #f0f0f0; - /*color: #2b3990;*/ } .navbar-inverse .navbar-inner { - background-color: #20267D; - background-image: none; - border-color: #20267D; + background:#D6D6D6; } .navbar-inverse .nav .active > a, .navbar-inverse .nav .active > a:hover, .navbar-inverse .nav .active > a:focus { - /*color: #2b3990;*/ - color:#fff; - /*background-color: #20267D;*/ + color: #2b3990; } .navbar-inverse .nav li.dropdown.open > .dropdown-toggle, .navbar-inverse .nav li.dropdown.active > .dropdown-toggle, .navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { color: #ffffff; - background-color: #20267D; + background-color: #B9B9C4; } .navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret { @@ -69,14 +70,16 @@ code { } .navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a { - color: #fff; + color: #2b3990; } .navbar.transparent.navbar-inverse .navbar-inner { border-width: 0px; -webkit-box-shadow: 0px 0px; box-shadow: 0px 0px; - background-color: rgba(0,0,0,0.0); + border-radius:0; + -webkit-border-radius:0; + /*background-color: rgba(0,0,0,0.0);*/ background-image: -webkit-gradient(linear, 50.00% 0.00%, 50.00% 100.00%, color-stop( 0% , rgba(0,0,0,0.00)),color-stop( 100% , rgba(0,0,0,0.00))); background-image: -webkit-linear-gradient(270deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); background-image: linear-gradient(180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); diff --git a/swc.css b/swc.css index 5ca86daac..ac6e3a32a 100644 --- a/swc.css +++ b/swc.css @@ -1,10 +1,11 @@ + /* Headings */ -h1, h2, h3, h4, h5, h6 { +h1, h2, h3, h4, h5, h6 { color: rgb(03,03,03); font-family: "Montserrat", "Helvetica", "Arial"; } -h1, h2 { +h1, h2 { margin-top: 40px; margin-bottom: 10px; } @@ -142,7 +143,7 @@ div.footer { .swc-blue-bg { /*background-color: #20267D;*/ /* svg colour is slightly different? */ - background: #2b3990; + background: #2b3990; } /* Main menu at the top of every page. */ @@ -152,17 +153,17 @@ div.mainmenu { margin: 0px; padding: 3px 0px 3px 25px; border-bottom: 1px solid #A6A6A6; - height:30px + height: 30px } #menubar { - float:left; - margin-top:4px; + float: left; + margin-top: 4px; } #searchbar { - float:right; - margin-right:20px; + float: right; + margin-right: 20px; } /* Narration for audio-only lectures. */ @@ -187,8 +188,8 @@ div.toc { /* Title styling */ h1.title { - margin:40px 0px; - border-bottom:1px solid #515151; + margin: 40px 0px; + border-bottom: 1px solid #515151; } /* YouTube video embed. */ @@ -204,10 +205,10 @@ dl.gloss { /* Displaying YouTube videos. */ iframe.youtube_player { - border : 0; - text-align : center; - width : 640px; - height : 500px; + border: 0; + text-align: center; + width: 640px; + height: 500px; } /* Sections in book chapters. */ @@ -323,14 +324,12 @@ section.content { } .header.home { - min-height:130px; background: url(../img/header.png) no-repeat center center; background-attachment: fixed; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; - text-align: left; color:#FFF; } @@ -339,38 +338,39 @@ section.content { } .header h1 { - color:#FFF; line-height: 1.1; - margin: 0; - font-size: 45pt; + margin: 60px 0px 80px; + font-size: 40pt; } #header-text { - font-size:17pt; + font-size:20pt; white-space: nowrap; } -#logo { - position: relative; - top: 40px; - text-align: center; -} - #nav-logo { width:270px; height:60px; - position:fixed; + position:absolute; top:0; left:0; } + #home-options { background:#F6F6F6; border-top:1px solid #DDDDDD; border-bottom:1px solid #DDDDDD; - padding:50px 0 50px 0; + padding:20px 0; margin-bottom:20px; } +#title { + background:#F6F6F6; + border-top:1px solid #DDDDDD; + border-bottom:1px solid #DDDDDD; + padding:0 0 20px; + margin-bottom:20px; +} #home-options h4{ color:#2b3990; } @@ -383,3 +383,4 @@ footer { background:#2b3990; padding:20px 0; } + \ No newline at end of file From 435465998dd46836a6208f73ee5b5e0aea4473eb Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Fri, 20 Dec 2013 22:44:03 -0500 Subject: [PATCH 0017/1182] Redesign work - update header * cleaner design --- swc-bootstrap.css | 15 +++++++++++++-- swc.css | 4 +--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 538ab220f..68edd17be 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -21,7 +21,7 @@ padding:27px 10px 10px 10px; background:url('../img/software-carpentry-banner.png') no-repeat; background-size: 250px; - background-position: 0px 10px; + background-position: 10px 10px; height:40px; } @@ -85,9 +85,13 @@ code { background-image: linear-gradient(180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); } +.container { + max-width:900px; +} + @media (max-width: 767px) { .container { - padding:0 20px; + padding:0 40px; } body { @@ -99,4 +103,11 @@ code { margin-right: 0; margin-bottom:0; } +} + +@media (max-width: 979px) and (min-width: 768px) { + .container { + max-width: 700px; + } + } \ No newline at end of file diff --git a/swc.css b/swc.css index ac6e3a32a..c02a7ac1a 100644 --- a/swc.css +++ b/swc.css @@ -330,7 +330,6 @@ section.content { -moz-background-size: cover; -o-background-size: cover; background-size: cover; - color:#FFF; } .header { @@ -350,8 +349,7 @@ section.content { #nav-logo { width:270px; - height:60px; - position:absolute; + height:40px; top:0; left:0; } From c5db8d8211eee59cb5b0b56e08b599c440b2d874 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sat, 21 Dec 2013 09:06:19 -0500 Subject: [PATCH 0018/1182] Footer work --- swc.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/swc.css b/swc.css index c02a7ac1a..493ef1bd5 100644 --- a/swc.css +++ b/swc.css @@ -380,5 +380,16 @@ h4 a:link, h4 a:visited, a { footer { background:#2b3990; padding:20px 0; + font-size: 10pt; +} + +footer a, footer a:hover{ + color:#FFF; +} + +footer ul { + float:left; + list-style-type: none; + padding-right: 20px; } \ No newline at end of file From 3f858bdfd5ade1c23a91737ac2ffd3d891999423 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sat, 21 Dec 2013 09:44:25 -0500 Subject: [PATCH 0019/1182] Simplifying layout of bootcamps home page --- swc.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/swc.css b/swc.css index 493ef1bd5..e3918ed09 100644 --- a/swc.css +++ b/swc.css @@ -264,11 +264,6 @@ table.outlined { border-collapse: collapse; } -/* Container for content in the bootcamp index page */ -div.bootcamps { - text-align: center; -} - /* Link items (to bootcamp pages) in the bootcamps tables */ table.bootcamps td.link { width: 50%; From 67c1cb68d77958e8e81f0636a7630ed0d9da4d0a Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sat, 21 Dec 2013 21:48:44 -0500 Subject: [PATCH 0020/1182] Footer/home page work --- swc-bootstrap.css | 2 +- swc.css | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 68edd17be..709b9a18f 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -86,7 +86,7 @@ code { } .container { - max-width:900px; + max-width:920px; } @media (max-width: 767px) { diff --git a/swc.css b/swc.css index e3918ed09..07b01359a 100644 --- a/swc.css +++ b/swc.css @@ -368,7 +368,9 @@ section.content { color:#2b3990; } -h4 a:link, h4 a:visited, a { +h5 a:link, h5 a:visited, a, +h4 a:link, h4 a:visited, a, +h3 a:link, h3 a:visited, a { color:#2b3990; } @@ -380,11 +382,13 @@ footer { footer a, footer a:hover{ color:#FFF; + padding-left: 10px; } -footer ul { - float:left; - list-style-type: none; - padding-right: 20px; +footer .container .links{ + background:url('../img/software-carpentry-banner-white.png') no-repeat; + background-size: 200px; + background-position: 0; + height:40px; + padding:40px 0 0 200px; } - \ No newline at end of file From eed1346dc2bdf1fc93631904ba501068b15035f7 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sun, 22 Dec 2013 06:07:29 -0500 Subject: [PATCH 0021/1182] Removing trailing whitespace --- swc.css | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/swc.css b/swc.css index 07b01359a..96cc12b8d 100644 --- a/swc.css +++ b/swc.css @@ -12,7 +12,7 @@ h1, h2 { h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { color: inherit; -} +} /* Comments in code. */ .comment { @@ -284,14 +284,14 @@ table.bootcamps td.date { /* Badge modal dialog */ #assertion-modal { - width:700px; + width:700px; margin-left:-350px; } #assertion-modal iframe { background-color: transparent; border: 0px none transparent; padding: 0px; - width: 100%; + width: 100%; height: 20em; } @@ -304,7 +304,7 @@ table.bootcamps td.date { /* list with checkbox as bullet */ ul.checklist { - list-style-image: url('../img/checkbox.png'); + list-style-image: url('../img/checkbox.png'); } /* FAQ */ @@ -368,10 +368,10 @@ section.content { color:#2b3990; } -h5 a:link, h5 a:visited, a, -h4 a:link, h4 a:visited, a, +h5 a:link, h5 a:visited, a, +h4 a:link, h4 a:visited, a, h3 a:link, h3 a:visited, a { - color:#2b3990; + color:#2b3990; } footer { From e67e43492a9c6f735c26db7e405ad26ff9860c90 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 22 Dec 2013 11:58:31 -0500 Subject: [PATCH 0022/1182] add media queries - small screen support --- swc-bootstrap.css | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 709b9a18f..e2b39c91e 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -110,4 +110,35 @@ code { max-width: 700px; } -} \ No newline at end of file +} + +@media (max-width: 400px) { + .header h1 { + font-size: 24pt; + } + + #header-text { + font-size:16pt; + } + + .navbar .container { + background-size: 200px; + background-position: 10px 20px; + height:40px; + } + + #nav-logo { + width:190px; + height:40px; + } +} + +@media (max-width: 319px) { + .header h1 { + font-size: 20pt; + } + + #header-text { + font-size:16pt; + } +} From bb5492d556af420fd034b3beede0896f981afb96 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 22 Dec 2013 11:59:13 -0500 Subject: [PATCH 0023/1182] allow smaller screens --- swc.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/swc.css b/swc.css index 96cc12b8d..8d743187c 100644 --- a/swc.css +++ b/swc.css @@ -76,7 +76,6 @@ blockquote.testimonial cite { body { font-family: "Open Sans", Helvetica, Arial, sans-serif; color: rgb(03, 03, 03); - min-width: 400px; } /* Styling for editorial stylesheet */ @@ -339,7 +338,7 @@ section.content { #header-text { font-size:20pt; - white-space: nowrap; + margin:0; } #nav-logo { From bf6a0d7f0a807a358f6f5b2c7c7457e31c5d5fc4 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 5 Jan 2014 15:12:42 -0500 Subject: [PATCH 0024/1182] search bar - change black line to blue * issue #263 --- swc-bootstrap.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index e2b39c91e..d24d341a2 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -67,6 +67,7 @@ code { .navbar-inverse .navbar-search .search-query { background-color: #ffffff; color: #666666; + border-color:#2b3990; } .navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a { @@ -79,7 +80,6 @@ code { box-shadow: 0px 0px; border-radius:0; -webkit-border-radius:0; - /*background-color: rgba(0,0,0,0.0);*/ background-image: -webkit-gradient(linear, 50.00% 0.00%, 50.00% 100.00%, color-stop( 0% , rgba(0,0,0,0.00)),color-stop( 100% , rgba(0,0,0,0.00))); background-image: -webkit-linear-gradient(270deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); background-image: linear-gradient(180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); @@ -141,4 +141,4 @@ code { #header-text { font-size:16pt; } -} +} \ No newline at end of file From cf6d62356457b378c067c624194d59dec4d766ae Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 5 Jan 2014 15:19:42 -0500 Subject: [PATCH 0025/1182] remove text-shadow in header * issue #264 --- swc-bootstrap.css | 1 + 1 file changed, 1 insertion(+) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index d24d341a2..ae1c664d6 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -35,6 +35,7 @@ code { .navbar-inverse .nav > li > a { color: #f0f0f0; + text-shadow:none; } .navbar-inverse .navbar-inner { From f5464bcdd63a1650328829e74308c72296dac259 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 5 Jan 2014 15:23:13 -0500 Subject: [PATCH 0026/1182] remove text-shadow in header again * issue #264 --- swc-bootstrap.css | 1 + 1 file changed, 1 insertion(+) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index ae1c664d6..dd163532e 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -7,6 +7,7 @@ .navbar .brand { padding-top: 0px; /* align the logo */ + text-shadow:none; } .navbar { From aa57f23650f5da32f210b2d5247c64540c28ee50 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 5 Jan 2014 15:33:56 -0500 Subject: [PATCH 0027/1182] Brighter link colour * #278 --- swc.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swc.css b/swc.css index 8d743187c..eb120f229 100644 --- a/swc.css +++ b/swc.css @@ -370,7 +370,7 @@ section.content { h5 a:link, h5 a:visited, a, h4 a:link, h4 a:visited, a, h3 a:link, h3 a:visited, a { - color:#2b3990; + color:#3E51CF; } footer { From ee5c62fd0cef3e7c00cc5db59673d0e0b34aba28 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 5 Jan 2014 15:37:13 -0500 Subject: [PATCH 0028/1182] Trying to keep all clickable item blue * helps with learning a new ui * 3 sub-headings on home page are no longer links --- swc.css | 3 --- 1 file changed, 3 deletions(-) diff --git a/swc.css b/swc.css index eb120f229..cc0d7a8aa 100644 --- a/swc.css +++ b/swc.css @@ -363,9 +363,6 @@ section.content { padding:0 0 20px; margin-bottom:20px; } -#home-options h4{ - color:#2b3990; -} h5 a:link, h5 a:visited, a, h4 a:link, h4 a:visited, a, From 920ede7dcdce4007fc599af21b1b1fd7094c056f Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 5 Jan 2014 15:39:53 -0500 Subject: [PATCH 0029/1182] Keep headers the darker blue * related to #278 --- swc.css | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/swc.css b/swc.css index cc0d7a8aa..61d9ec168 100644 --- a/swc.css +++ b/swc.css @@ -364,10 +364,14 @@ section.content { margin-bottom:20px; } -h5 a:link, h5 a:visited, a, -h4 a:link, h4 a:visited, a, -h3 a:link, h3 a:visited, a { - color:#3E51CF; +h5 a:link, h5 a:visited, +h4 a:link, h4 a:visited, +h3 a:link, h3 a:visited { + color:#2b3990; +} + +a { + color:#3E51CF; } footer { From a166092162fc5241aef438dcbb0742f540201cdc Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 5 Jan 2014 15:42:14 -0500 Subject: [PATCH 0030/1182] override blockquote font size change * issue #277 --- swc-bootstrap.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index dd163532e..e1268e23e 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -91,6 +91,10 @@ code { max-width:920px; } +blockquote p { + font-size:14px; +} + @media (max-width: 767px) { .container { padding:0 40px; From c1160f77c78dc645f95a2e3090dc11ab266f32c4 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Wed, 15 Jan 2014 19:41:33 -0500 Subject: [PATCH 0031/1182] Changing default mailing address and putting contact email in footer --- swc.css | 1 + 1 file changed, 1 insertion(+) diff --git a/swc.css b/swc.css index 61d9ec168..207aea160 100644 --- a/swc.css +++ b/swc.css @@ -391,4 +391,5 @@ footer .container .links{ background-position: 0; height:40px; padding:40px 0 0 200px; + text-align: right; } From 7789b538547b2ec46594ed6ad1e6b46d88542d31 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 16 Jan 2014 05:45:05 -0500 Subject: [PATCH 0032/1182] Editing out the notebook-specific stuff in Mike Hansen's post --- styles/default.css | 135 --------------------------------------------- 1 file changed, 135 deletions(-) delete mode 100644 styles/default.css diff --git a/styles/default.css b/styles/default.css deleted file mode 100644 index e417fc179..000000000 --- a/styles/default.css +++ /dev/null @@ -1,135 +0,0 @@ -/* - -Original style from softwaremaniacs.org (c) Ivan Sagalaev - -*/ - -pre code { - display: block; padding: 0.5em; - background: #F0F0F0; -} - -pre code, -pre .subst, -pre .tag .title, -pre .lisp .title, -pre .clojure .built_in, -pre .nginx .title { - color: black; -} - -pre .string, -pre .title, -pre .constant, -pre .parent, -pre .tag .value, -pre .rules .value, -pre .rules .value .number, -pre .preprocessor, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .aggregate, -pre .template_tag, -pre .django .variable, -pre .smalltalk .class, -pre .addition, -pre .flow, -pre .stream, -pre .bash .variable, -pre .apache .tag, -pre .apache .cbracket, -pre .tex .command, -pre .tex .special, -pre .erlang_repl .function_or_atom, -pre .markdown .header { - color: #800; -} - -pre .comment, -pre .annotation, -pre .template_comment, -pre .diff .header, -pre .chunk, -pre .markdown .blockquote { - color: #888; -} - -pre .number, -pre .date, -pre .regexp, -pre .literal, -pre .smalltalk .symbol, -pre .smalltalk .char, -pre .go .constant, -pre .change, -pre .markdown .bullet, -pre .markdown .link_url { - color: #080; -} - -pre .label, -pre .javadoc, -pre .ruby .string, -pre .decorator, -pre .filter .argument, -pre .localvars, -pre .array, -pre .attr_selector, -pre .important, -pre .pseudo, -pre .pi, -pre .doctype, -pre .deletion, -pre .envvar, -pre .shebang, -pre .apache .sqbracket, -pre .nginx .built_in, -pre .tex .formula, -pre .erlang_repl .reserved, -pre .prompt, -pre .markdown .link_label, -pre .vhdl .attribute, -pre .clojure .attribute, -pre .coffeescript .property { - color: #88F -} - -pre .keyword, -pre .id, -pre .phpdoc, -pre .title, -pre .built_in, -pre .aggregate, -pre .css .tag, -pre .javadoctag, -pre .phpdoc, -pre .yardoctag, -pre .smalltalk .class, -pre .winutils, -pre .bash .variable, -pre .apache .tag, -pre .go .typename, -pre .tex .command, -pre .markdown .strong, -pre .request, -pre .status { - font-weight: bold; -} - -pre .markdown .emphasis { - font-style: italic; -} - -pre .nginx .built_in { - font-weight: normal; -} - -pre .coffeescript .javascript, -pre .javascript .xml, -pre .tex .formula, -pre .xml .javascript, -pre .xml .vbscript, -pre .xml .css, -pre .xml .cdata { - opacity: 0.5; -} From fcc64ac5b19e6a669744fb163230af743b9b3ddc Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sat, 18 Jan 2014 17:29:58 -0500 Subject: [PATCH 0033/1182] Navbar work * mostly the collapsed the bar, make less awkward * some link colour changes --- swc-bootstrap.css | 36 ++++++++++++++++++++++++++++++++++++ swc.css | 18 ++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index e1268e23e..78f108470 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -72,8 +72,22 @@ code { border-color:#2b3990; } +.navbar-inverse .navbar-search { + border: none; +} + +.navbar-inverse .nav-collapse .nav > li > a:hover, +.navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: transparent; +} + .navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a { color: #2b3990; + text-align: center; +} + +.navbar-inverse .nav-collapse .nav > li:hover > a { + color: #935212; } .navbar.transparent.navbar-inverse .navbar-inner { @@ -95,6 +109,28 @@ blockquote p { font-size:14px; } +@media (max-width: 979px){ + .navbar-inverse .nav-collapse .nav > li > a { + text-transform: uppercase; + font-size: 12pt; + } + + .navbar-inverse .nav-collapse .navbar-search { + text-align: center; + border-top:1px solid #AAA; + } + + .navbar-inverse .nav-collapse .navbar-search .search-query { + margin:10px 0 0; + } + + .navbar-inverse .nav-collapse .nav > li { + border-top:1px solid #AAA; + padding:10px 0; + } + +} + @media (max-width: 767px) { .container { padding:0 40px; diff --git a/swc.css b/swc.css index 207aea160..625a8e01e 100644 --- a/swc.css +++ b/swc.css @@ -344,8 +344,10 @@ section.content { #nav-logo { width:270px; height:40px; - top:0; - left:0; + top:5; + left:10; + position:absolute; + z-index: 10; } #home-options { @@ -370,14 +372,26 @@ h3 a:link, h3 a:visited { color:#2b3990; } +h5 a:hover, +h4 a:hover, +h3 a:hover { + color:#C26D17; +} + a { color:#3E51CF; } +a:hover { + color:#C26D17; + text-decoration: none; +} + footer { background:#2b3990; padding:20px 0; font-size: 10pt; + margin-top:10px; } footer a, footer a:hover{ From 72a9a32515c2a728e05e1a3c92c971b1d6c8fc76 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sat, 18 Jan 2014 20:24:01 -0500 Subject: [PATCH 0034/1182] navbar & links * input from @r-gaia-cs * links on hover: darker & underline * move search bar to bottom on collapse --- swc-bootstrap.css | 12 ++++++++---- swc.css | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 78f108470..5423d5d1d 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -19,11 +19,11 @@ .navbar .container { background-color: inherit; font-size:11pt; - padding:27px 10px 10px 10px; + padding:27px 10px 0px 10px; background:url('../img/software-carpentry-banner.png') no-repeat; background-size: 250px; background-position: 10px 10px; - height:40px; + height:50px; } .navbar-inner { @@ -110,6 +110,10 @@ blockquote p { } @media (max-width: 979px){ + .navbar-inverse .nav-collapse ul{ + margin:20px 0 0; + } + .navbar-inverse .nav-collapse .nav > li > a { text-transform: uppercase; font-size: 12pt; @@ -118,10 +122,11 @@ blockquote p { .navbar-inverse .nav-collapse .navbar-search { text-align: center; border-top:1px solid #AAA; + margin:0; } .navbar-inverse .nav-collapse .navbar-search .search-query { - margin:10px 0 0; + margin:10px 0; } .navbar-inverse .nav-collapse .nav > li { @@ -166,7 +171,6 @@ blockquote p { .navbar .container { background-size: 200px; background-position: 10px 20px; - height:40px; } #nav-logo { diff --git a/swc.css b/swc.css index 625a8e01e..5d13503ad 100644 --- a/swc.css +++ b/swc.css @@ -376,15 +376,19 @@ h5 a:hover, h4 a:hover, h3 a:hover { color:#C26D17; + text-decoration: none; } a { color:#3E51CF; + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + transition: all 0.2s ease; } a:hover { - color:#C26D17; - text-decoration: none; + color:#965412; } footer { From e2ecd8eff99b7f53bbfc90495a31fa71fc3e68d0 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sat, 18 Jan 2014 22:43:21 -0500 Subject: [PATCH 0035/1182] Change header case for @r-gaia-cs --- swc-bootstrap.css | 1 - 1 file changed, 1 deletion(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 5423d5d1d..9cc058268 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -115,7 +115,6 @@ blockquote p { } .navbar-inverse .nav-collapse .nav > li > a { - text-transform: uppercase; font-size: 12pt; } From 7ddda0e1b0d4759ea11b8f64ec642fd94dcb823f Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Fri, 7 Feb 2014 12:05:02 -0500 Subject: [PATCH 0036/1182] Preparing material for Version 5 novice release --- swc-bootstrap.css | 6 ++++++ swc.css | 31 ++++++++++++++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 6df6d1595..e86e8648a 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -1,5 +1,11 @@ /* Customizations to Bootstrap's default styles */ +blockquote p { + font-size: inherit; + font-weight: inherit; + line-height: inherit; +} + /* readability: darken the alert colour for contrast with background */ .alert { color: rgb(0,0,0); diff --git a/swc.css b/swc.css index cd7acb505..12ddde7a8 100644 --- a/swc.css +++ b/swc.css @@ -3,14 +3,25 @@ h1, h2, h3, h4, h5, h6 { color: rgb(03,03,03); } -h1, h2 { +h1, h2 { margin-top: 40px; margin-bottom: 10px; } h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { color: inherit; -} +} + +/* Chapter titles. */ +div.chapter h2 { + text-align: center; + font-style: italic; +} + +/* Objectives and key points */ +.objectives, .keypoints { + background-color: azure; +} /* Comments in code. */ .comment { @@ -223,22 +234,12 @@ img.logoARB { float: right; } -/* Sections in book chapters. */ -section { - clear: both; -} - /* Person's name in team.html. */ span.person { font-weight: bold; font-style: italic; } -/* Short review of book in bibliography. */ -span.review { - font-style: italic; -} - /* Bibliography book covers. */ img.book-cover { width: 80px; @@ -301,14 +302,14 @@ table.bootcamps td.date { /* Badge modal dialog */ #assertion-modal { - width:700px; + width:700px; margin-left:-350px; } #assertion-modal iframe { background-color: transparent; border: 0px none transparent; padding: 0px; - width: 100%; + width: 100%; height: 20em; } @@ -321,5 +322,5 @@ table.bootcamps td.date { /* list with checkbox as bullet */ ul.checklist { - list-style-image: url('/img/checkbox.png'); + list-style-image: url('/img/checkbox.png'); } From 7a5c77df6fae4865ac3ee4b7320dd254a43686fe Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sun, 9 Feb 2014 14:15:51 -0500 Subject: [PATCH 0037/1182] 1. Moving general information about bootcamps and setup instruction into `index.html` (instead of using %include directives). 2. Deleting unused include files containing general bootcamp information. 3. Leaving the setup instruction snippets in place for now. 4. Modifying CSS to format things more cleanly now that they're inlined. --- swc-bootstrap.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 6df6d1595..acd6e7755 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -10,6 +10,10 @@ background-color: white; } +.hero-unit { + padding: 20px; +} + .navbar .container { background-color: inherit; } From 6eed205e2c30c973f9e6e873003227bbeb2bf2a3 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Mon, 17 Feb 2014 22:57:50 -0300 Subject: [PATCH 0038/1182] CSS arrow to mark input and output **Note**: This is a prototype. Instead of "In" and "Out" use arrow to mark the input and output of IPython lessons. To construct the arrows we only use CSS. --- lesson.css | 31 ++++++++++++++++++++++++++++++- swc.css | 27 --------------------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/lesson.css b/lesson.css index 12ba83a2a..b97b17a25 100644 --- a/lesson.css +++ b/lesson.css @@ -11,12 +11,41 @@ /* Manual input. */ .in { color: darkgreen; + margin-left: 20px; +} + +div.in:before { + content: ""; + display: block; + width: 0; + height: 0; + border-top: 12px solid transparent; + border-bottom: 12px solid transparent; + border-left: 12px solid #727272; + position: relative; + left:-16px; + top:10px; + float:left; } /* Program output. */ .out { color: darkblue; - font-style: italic; + margin-left: 20px; +} + +div.out:before { + content: ""; + display: block; + width: 0; + height: 0; + border-top: 12px solid transparent; + border-bottom: 12px solid transparent; + border-right: 12px solid #727272; + position: relative; + left:-16px; + top:10px; + float:left; } /* Error output. */ diff --git a/swc.css b/swc.css index 12ddde7a8..3bb49a368 100644 --- a/swc.css +++ b/swc.css @@ -23,17 +23,6 @@ div.chapter h2 { background-color: azure; } -/* Comments in code. */ -.comment { - color: purple; -} - -/* Error messages. */ -.err { - color: darkred; - font-style: italic; -} - /* Things to fix. */ .fixme { text-decoration: underline; @@ -41,22 +30,6 @@ div.chapter h2 { background-color: lightgray; } -/* Highlighted changes in code. */ -.highlight { - background-color: mistyrose; -} - -/* Manual input. */ -.in { - color: darkgreen; -} - -/* Program output. */ -.out { - color: darkblue; - font-style: italic; -} - /* Putting shadows around things. */ .shadow { -moz-box-shadow: 0 0 30px 5px #999; From 1f0042ceb02ccad0124cfb0d443b8002ff51b98f Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Thu, 20 Feb 2014 23:04:25 -0500 Subject: [PATCH 0039/1182] Cleaning up css * remove unused classes copied from google form * moved styles to swc.css * #361 --- swc.css | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/swc.css b/swc.css index 5d13503ad..82e16c07e 100644 --- a/swc.css +++ b/swc.css @@ -411,3 +411,40 @@ footer .container .links{ padding:40px 0 0 200px; text-align: right; } + + +/* For the Request a Bootcamp form */ +#ss-form .ss-q-title { + display: block; + font-weight: bold; +} +#ss-form .ss-required-asterisk { + color: #c43b1d; +} +#ss-form label { + display:inline; +} +#ss-form .ss-secondary-text { + color: #666; +} +#ss-form .ss-form-entry { + margin-bottom: 1.5em; +} +#ss-form ul { + margin:0; + padding:0; + list-style: none; +} +#ss-form ol { + margin:0; +} +#ss-form .ss-choice-item { + line-height: 1.3em; +} +#ss-form .ss-q-long { + resize: vertical; + width: 70%; +} +#ss-form .error-message, .required-message { + display: none; +} \ No newline at end of file From 66b39d0758c6f37cc816cf3f2c6b688eba4e4ebf Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 27 Feb 2014 10:38:04 -0500 Subject: [PATCH 0040/1182] Indenting error output cells --- lesson.css | 1 + 1 file changed, 1 insertion(+) diff --git a/lesson.css b/lesson.css index b97b17a25..0b914df84 100644 --- a/lesson.css +++ b/lesson.css @@ -51,6 +51,7 @@ div.out:before { /* Error output. */ .err { color: darkred; + margin-left: 20px; font-style: italic; font-weight: bold; } From 0bf6be126f1a7dda90e0c8b594b23bee56d6051e Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 27 Feb 2014 10:15:46 -0500 Subject: [PATCH 0041/1182] * Getting rid of old cheat sheets * Indenting error output cells * Removing explicit 'level' keys from Markdown files * Storing the generated files so that people who don't use those tools won't have to regenerate them. * Modifying .gitignore to reflect this. * Updating the Makefile to run Jekyll exactly once. * Command to install on the server * No longer worrying about making a page of images * Better (more guessable) name for the target that builds the website * Fixing image paths * Fixing up glossary entries --- lesson.css | 1 + 1 file changed, 1 insertion(+) diff --git a/lesson.css b/lesson.css index b97b17a25..0b914df84 100644 --- a/lesson.css +++ b/lesson.css @@ -51,6 +51,7 @@ div.out:before { /* Error output. */ .err { color: darkred; + margin-left: 20px; font-style: italic; font-weight: bold; } From 99a7cd43b0a01b89dd56cd17fd8579a7d9673b5c Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 3 Mar 2014 11:12:54 -0500 Subject: [PATCH 0042/1182] Getting the pre-formatted code's color right --- lesson.css | 39 +++++---------------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/lesson.css b/lesson.css index 0b914df84..fcef217e9 100644 --- a/lesson.css +++ b/lesson.css @@ -1,3 +1,8 @@ +/* pre blocks inherit color from parent */ +pre { + color: inherit; +} + /* Comments in code. */ .comment { color: purple; @@ -14,40 +19,12 @@ margin-left: 20px; } -div.in:before { - content: ""; - display: block; - width: 0; - height: 0; - border-top: 12px solid transparent; - border-bottom: 12px solid transparent; - border-left: 12px solid #727272; - position: relative; - left:-16px; - top:10px; - float:left; -} - /* Program output. */ .out { color: darkblue; margin-left: 20px; } -div.out:before { - content: ""; - display: block; - width: 0; - height: 0; - border-top: 12px solid transparent; - border-bottom: 12px solid transparent; - border-right: 12px solid #727272; - position: relative; - left:-16px; - top:10px; - float:left; -} - /* Error output. */ .err { color: darkred; @@ -67,11 +44,5 @@ div.challenges {} /* Key points in summary. */ div.keypoints {} -/* Main lesson. */ -div.lesson {} - /* Learning objectives. */ div.objectives {} - -/* Continuation paragraph. */ -p.continue {} From a57354a490a37c22d60b0c91af56b7ecdff2ff8a Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Mon, 17 Mar 2014 13:52:50 -0300 Subject: [PATCH 0043/1182] Add CSS media query to improve logo --- swc.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/swc.css b/swc.css index 3bb49a368..1f637923f 100644 --- a/swc.css +++ b/swc.css @@ -84,6 +84,12 @@ div.banner a img { padding: 20px 25px; } +@media (max-width: 700px) { + div.banner a img { + padding: 20px 0px; + } +} + /* Explanatory call-out boxes. */ div.box { background-color: mistyrose; From 94191180305dc983158d2cd79e39a9c1829a14ff Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Tue, 25 Mar 2014 14:06:49 -0400 Subject: [PATCH 0044/1182] Cleaning up novice extras --- lesson.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lesson.css b/lesson.css index fcef217e9..3bdf67bf0 100644 --- a/lesson.css +++ b/lesson.css @@ -33,6 +33,11 @@ pre { font-weight: bold; } +/* Files. */ +.file { + margin-left: 20px; +} + /* Explanatory call-out boxes. */ div.box { background-color: lightgray; From 45a05fff1a3599f77fbf195040606b0b55affaa5 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 26 May 2014 12:44:43 -0400 Subject: [PATCH 0045/1182] Converting to individual challenge div's in the novice shell lessons --- lesson.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lesson.css b/lesson.css index 3bdf67bf0..2c07db8ba 100644 --- a/lesson.css +++ b/lesson.css @@ -44,7 +44,9 @@ div.box { } /* Challenge questions. */ -div.challenges {} +div.challenge { + background-color: lightblue; +} /* Key points in summary. */ div.keypoints {} From debaf9edf4511d11667defd67ab1aad8c7e511a0 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 18 Apr 2014 11:31:06 -0300 Subject: [PATCH 0046/1182] Fix btn-nav position due GitHub Ribbon --- bootstrap/bootstrap.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap/bootstrap.css b/bootstrap/bootstrap.css index 8e4b38334..1d9e5d2dd 100644 --- a/bootstrap/bootstrap.css +++ b/bootstrap/bootstrap.css @@ -4565,7 +4565,7 @@ input[type="submit"].btn.btn-mini { display: none; float: right; padding: 7px 10px; - margin-right: 5px; + margin-right: 100px; margin-left: 5px; color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); From bf7c60e7ca083f85a0113cd28cb9311f1a20a225 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Sun, 1 Jun 2014 22:09:54 -0400 Subject: [PATCH 0047/1182] Change to a css github ribbon * responsive for smaller screens * move menu over more - click will always open menu * #462 --- bootstrap/bootstrap.css | 2 +- swc-bootstrap.css | 70 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/bootstrap/bootstrap.css b/bootstrap/bootstrap.css index 1d9e5d2dd..8e4b38334 100644 --- a/bootstrap/bootstrap.css +++ b/bootstrap/bootstrap.css @@ -4565,7 +4565,7 @@ input[type="submit"].btn.btn-mini { display: none; float: right; padding: 7px 10px; - margin-right: 100px; + margin-right: 5px; margin-left: 5px; color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 9cc058268..2190a4ff5 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -70,6 +70,7 @@ code { background-color: #ffffff; color: #666666; border-color:#2b3990; + width:150px; } .navbar-inverse .navbar-search { @@ -109,6 +110,49 @@ blockquote p { font-size:14px; } + +/* GitHub Ribbon */ + +#github-ribbon a { + background:#000; + color:#fff; + text-decoration:none; + font-family:arial, sans-serif; + text-align:center; + font-weight:bold; + padding:5px 40%; + font-size:0.8rem; + line-height:1.6rem; + position:relative; + transition:0.5s; + width:100%; + margin: 0 auto; +} + +#github-ribbon a:hover { + background:#600; + color:#fff; +} + +#github-ribbon a::before, #github-ribbon a::after { + content:""; + width:100%; + display:block; + position:absolute; + top:1px; + left:0; + height:1px; + background:#fff; +} + +#github-ribbon a::after{ + bottom:1px; + top:auto; +} + + +/* Media Queries */ + @media (max-width: 979px){ .navbar-inverse .nav-collapse ul{ margin:20px 0 0; @@ -178,6 +222,32 @@ blockquote p { } } +/* github ribbon breaking point */ +@media screen and (min-width:600px){ + #github-ribbon{ + position:absolute; + display:block; + top:0; + right:0; + width:150px; + overflow:hidden; + height:150px; + } + #github-ribbon a{ + width:200px; + position:absolute; + padding:5px 40px; + top:40px; + right:-80px; + transform:rotate(45deg); + -webkit-transform:rotate(45deg); + box-shadow:1px 1px 10px rgba(0,0,0,0.8); + } + .navbar .btn-navbar { + margin-right: 150px; + } +} + @media (max-width: 319px) { .header h1 { font-size: 20pt; From 0870a7d4188086dc2bb51648f4e090eb008f6fa5 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Mon, 2 Jun 2014 09:24:52 -0400 Subject: [PATCH 0048/1182] Cross browser - stop text wrap in ff * #462 --- swc-bootstrap.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 2190a4ff5..9ffe36897 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -127,6 +127,8 @@ blockquote p { transition:0.5s; width:100%; margin: 0 auto; + white-space: nowrap; + z-index:10; } #github-ribbon a:hover { From 96b0a57f2473739c026200fdc675eea90ba21613 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 18 Apr 2014 10:52:12 -0300 Subject: [PATCH 0049/1182] Add GitHub Ribbon to our lessons Backport of 9a19e91 from swcarpentry/site. All credits to Abigail Cabunoc for the awesome work with CSS. --- swc-bootstrap.css | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 5f52b7900..b43d75e5b 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -69,3 +69,80 @@ code { border-top-color: #ffffff; border-bottom-color: #ffffff; } + +/* GitHub Ribbon */ + +#github-ribbon a { + background:#000; + color:#fff; + text-decoration:none; + font-family:arial, sans-serif; + text-align:center; + font-weight:bold; + padding:5px 40%; + font-size:0.8rem; + line-height:1.6rem; + position:relative; + transition:0.5s; + width:100%; + margin: 0 auto; + white-space: nowrap; + z-index:10; +} + +#github-ribbon a:hover { + background:#600; + color:#fff; +} + +#github-ribbon a::before, #github-ribbon a::after { + content:""; + width:100%; + display:block; + position:absolute; + top:1px; + left:0; + height:1px; + background:#fff; +} + +#github-ribbon a::after{ + bottom:1px; + top:auto; +} + +/* github ribbon breaking point */ +@media screen and (min-width:600px){ + #github-ribbon{ + position:absolute; + display:block; + top:0; + right:0; + width:150px; + overflow:hidden; + height:150px; + } + #github-ribbon a{ + width:200px; + position:absolute; + padding:5px 40px; + top:40px; + right:-80px; + transform:rotate(45deg); + -webkit-transform:rotate(45deg); + box-shadow:1px 1px 10px rgba(0,0,0,0.8); + } + .navbar .btn-navbar { + margin-right: 150px; + } +} + +@media (max-width: 319px) { + .header h1 { + font-size: 20pt; + } + + #header-text { + font-size:16pt; + } +} From 595873c8b50dece182b7f96a4cf63997a844a4b9 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sat, 7 Jun 2014 13:43:05 -0300 Subject: [PATCH 0050/1182] Improve CSS for GitHub ribbon - For small screen, preserve margin. - Use css-beautify --- swc-bootstrap.css | 202 ++++++++++++++++++++++------------------------ 1 file changed, 97 insertions(+), 105 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index b43d75e5b..b8b8e6545 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -1,148 +1,140 @@ /* Customizations to Bootstrap's default styles */ blockquote p { - font-size: inherit; - font-weight: inherit; - line-height: inherit; + font-size: inherit; + font-weight: inherit; + line-height: inherit; } - /* readability: darken the alert colour for contrast with background */ + .alert { - color: rgb(0,0,0); + color: rgb(0, 0, 0); } - /* Container for page contents. */ + .container { background-color: white; } - .hero-unit { - padding: 20px; + padding: 20px; } - .navbar .container { background-color: inherit; } - .navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #F4F4F4; - background-image: none; - border: 1px solid #d4d4d4; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #F4F4F4; + background-image: none; + border: 1px solid #d4d4d4; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; } - code { - color: #333333; + color: #333333; } - .navbar-inverse .navbar-inner { - background-color: #20267D; - background-image: none; - border-color: #20267D; + background-color: #20267D; + background-image: none; + border-color: #20267D; } - .navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #20267D; +.navbar-inverse .nav .active > a:hover, .navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #20267D; } - .navbar-inverse .nav li.dropdown.open > .dropdown-toggle, .navbar-inverse .nav li.dropdown.active > .dropdown-toggle, .navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #20267D; + color: #ffffff; + background-color: #20267D; } - .navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; + border-top-color: #999999; + border-bottom-color: #999999; } - .navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; + border-top-color: #ffffff; + border-bottom-color: #ffffff; } - /* GitHub Ribbon */ #github-ribbon a { - background:#000; - color:#fff; - text-decoration:none; - font-family:arial, sans-serif; - text-align:center; - font-weight:bold; - padding:5px 40%; - font-size:0.8rem; - line-height:1.6rem; - position:relative; - transition:0.5s; - width:100%; - margin: 0 auto; - white-space: nowrap; - z-index:10; + background: #000; + color: #fff; + text-decoration: none; + font-family: arial, sans-serif; + text-align: center; + font-weight: bold; + padding: 5px 40%; + font-size: 0.8rem; + line-height: 1.6rem; + position: relative; + transition: 0.5s; + width: 100%; + margin: 0 auto; + white-space: nowrap; + z-index: 10; } - #github-ribbon a:hover { - background:#600; - color:#fff; + background: #600; + color: #fff; } - #github-ribbon a::before, #github-ribbon a::after { - content:""; - width:100%; - display:block; - position:absolute; - top:1px; - left:0; - height:1px; - background:#fff; + content: ""; + width: 100%; + display: block; + position: absolute; + top: 1px; + left: 0; + height: 1px; + background: #fff; +} +#github-ribbon a::after { + bottom: 1px; + top: auto; } - -#github-ribbon a::after{ - bottom:1px; - top:auto; -} - /* github ribbon breaking point */ -@media screen and (min-width:600px){ - #github-ribbon{ - position:absolute; - display:block; - top:0; - right:0; - width:150px; - overflow:hidden; - height:150px; - } - #github-ribbon a{ - width:200px; - position:absolute; - padding:5px 40px; - top:40px; - right:-80px; - transform:rotate(45deg); - -webkit-transform:rotate(45deg); - box-shadow:1px 1px 10px rgba(0,0,0,0.8); - } - .navbar .btn-navbar { - margin-right: 150px; - } -} - -@media (max-width: 319px) { - .header h1 { - font-size: 20pt; - } - #header-text { - font-size:16pt; - } +@media screen and (min-width: 600px) { + .navbar .btn-navbar { + margin-right: 150px; + } + #github-ribbon { + position: absolute; + display: block; + top: 0; + right: 0; + width: 150px; + overflow: hidden; + height: 150px; + } + #github-ribbon a { + width: 200px; + position: absolute; + padding: 5px 40px; + top: 40px; + right: -80px; + transform: rotate(45deg); + -webkit-transform: rotate(45deg); + box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.8); + } +} +@media (max-width: 599px) { + .header h1 { + font-size: 20pt; + } + #header-text { + font-size: 16pt; + } + #github-ribbon { + width: 100%; + } + #github-ribbon a { + display: block; + padding: 0px 0px; + margin: 0px 0px; + } } From 4c15b9dcf7725d6157a3de3c2749d34d3483b863 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 9 Jun 2014 13:29:58 -0400 Subject: [PATCH 0051/1182] Novice shell lesson is now written in terms of Nelle instead of Vlad. --- lesson.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lesson.css b/lesson.css index 2c07db8ba..794c07e41 100644 --- a/lesson.css +++ b/lesson.css @@ -45,7 +45,9 @@ div.box { /* Challenge questions. */ div.challenge { - background-color: lightblue; + border-style: solid; + border-width: thin; + border-color: gray; } /* Key points in summary. */ From f3fe5acad9ad4c3d70b5b8a896ef4d43925ac74d Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 13 Jun 2014 14:15:42 -0300 Subject: [PATCH 0052/1182] Update template for book to rely on CSS Use h2 tag for "subtitle" will break any tool used to convert HTML for another format. This commit replace h2 with span and rely on CSS for have the same look. --- book.css | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 book.css diff --git a/book.css b/book.css new file mode 100644 index 000000000..a291e0209 --- /dev/null +++ b/book.css @@ -0,0 +1,10 @@ +span.subtitle { + color: #030303; + display: block; + font-family: inherit; + font-size: 31.5px; + font-weight: bold; + line-height: 40px; + margin: 40px 0px 10px 0px; + text-rendering: optimizelegibility; +} From d97de7efdb110003d98094b870f1bf4d1e3e7dd3 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 22 Jun 2014 11:51:55 -0300 Subject: [PATCH 0053/1182] Add CSS for printing The CSS was add at our main CSS and remove from printing: - Logo at header - GitHub ribbon - Footnote Close #561. --- swc.css | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/swc.css b/swc.css index 1f637923f..bcb77c2ed 100644 --- a/swc.css +++ b/swc.css @@ -303,3 +303,18 @@ table.bootcamps td.date { ul.checklist { list-style-image: url('/img/checkbox.png'); } + +/* Printing */ +@media print { + #github-ribbon { + display: none; + } + + .banner { + display: none; + } + + .footer { + display: none; + } +} From c30aecb9aa46aa04bb18dfac7ef2da30d1b0a05b Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Mon, 23 Jun 2014 18:09:47 -0300 Subject: [PATCH 0054/1182] Shrink the font size for print version --- swc.css | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/swc.css b/swc.css index bcb77c2ed..2100161f3 100644 --- a/swc.css +++ b/swc.css @@ -306,6 +306,27 @@ ul.checklist { /* Printing */ @media print { + h1 { + font-size: 16pt; + line-height: 18pt; + } + + h2,h3,h4,h5,h6 { + font-size: 12pt; + line-height: 13pt; + } + + p,ul,ol,li,pre,code { + font-size: 8pt; + line-height: 9pt; + } + + code { + padding: 0px; + border: 0px; + background: none; + } + #github-ribbon { display: none; } From 7a498a2c54e0bd1b1f7cdb5ff59fb547566f44ea Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sat, 14 Jun 2014 00:10:02 -0300 Subject: [PATCH 0055/1182] Update IPython Notebook template - Improve to handle err class - Improve pandoc support --- lesson.css | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lesson.css b/lesson.css index 2c07db8ba..64ee9523c 100644 --- a/lesson.css +++ b/lesson.css @@ -3,6 +3,31 @@ pre { color: inherit; } +/* Work around to issue when create EPUB with pandoc for IPython Notebook + * template. + */ +div.out { + display: block; + padding: 9.5px; + margin-bottom: 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +div.out pre { + padding: 0px; + margin: 0px; + border: 0px; +} + /* Comments in code. */ .comment { color: purple; From eb7c382cfb181e44629b892e6d5499077ae9e19b Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 29 Sep 2014 12:52:33 -0400 Subject: [PATCH 0056/1182] Changing wording in everything except blog posts --- swc.css | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/swc.css b/swc.css index 82e16c07e..0ab4e0c18 100644 --- a/swc.css +++ b/swc.css @@ -263,20 +263,20 @@ table.outlined { border-collapse: collapse; } -/* Link items (to bootcamp pages) in the bootcamps tables */ -table.bootcamps td.link { +/* Link items (to workshop pages) in the workshops tables */ +table.workshops td.link { width: 50%; text-align: left; } -/* Spacer items (i.e. ellipsis) on the bootcamps tables */ -table.bootcamps td.spacer { +/* Spacer items (i.e. ellipsis) on the workshops tables */ +table.workshops td.spacer { max-width: 100%; text-align: center; } -/* Date columns on the bootcamps tables */ -table.bootcamps td.date { +/* Date columns on the workshops tables */ +table.workshops td.date { width: 50%; text-align: right; } @@ -413,7 +413,7 @@ footer .container .links{ } -/* For the Request a Bootcamp form */ +/* For the Request a Workshop form */ #ss-form .ss-q-title { display: block; font-weight: bold; From 5694341bc44213a8a354a292ef0521cb21dea67b Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Thu, 25 Sep 2014 12:59:59 -0300 Subject: [PATCH 0057/1182] Replace bootcamp with workshop ~~~ $ for file in $(grep -r -l 'bootcamp' .); do sed -i 's/bootcamp/workshop/g' $file; done $ for file in $(grep -r -l 'boot camp' .); do sed -i 's/boot camp/workshop/g' $file; done ~~~ and others minors changes. Close #240. --- swc.css | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/swc.css b/swc.css index 2100161f3..79ec3c0a2 100644 --- a/swc.css +++ b/swc.css @@ -256,25 +256,25 @@ table.outlined { border-collapse: collapse; } -/* Container for content in the bootcamp index page */ -div.bootcamps { +/* Container for content in the workshop index page */ +div.workshops { text-align: center; } -/* Link items (to bootcamp pages) in the bootcamps tables */ -table.bootcamps td.link { +/* Link items (to workshop pages) in the workshops tables */ +table.workshops td.link { width: 50%; text-align: left; } -/* Spacer items (i.e. ellipsis) on the bootcamps tables */ -table.bootcamps td.spacer { +/* Spacer items (i.e. ellipsis) on the workshops tables */ +table.workshops td.spacer { max-width: 100%; text-align: center; } -/* Date columns on the bootcamps tables */ -table.bootcamps td.date { +/* Date columns on the workshops tables */ +table.workshops td.date { width: 50%; text-align: right; } From e0b6f49ecd70bccca0c090ec004401a185151241 Mon Sep 17 00:00:00 2001 From: Trevor Bekolay Date: Tue, 21 Oct 2014 11:59:14 -0400 Subject: [PATCH 0058/1182] Implementation of Greg Wilson's template This is up for discussion, but at the moment is the minimal set of files needed to be a Software Carpentry lesson. --- .gitignore | 2 + 01-one.md | 35 +++++ 02-two.md | 35 +++++ LICENSE.md | 73 +++++++++++ _config.yml | 11 ++ _includes/banner.html | 6 + _includes/footer.html | 9 ++ _includes/header.html | 13 ++ _includes/javascript.html | 5 + _layouts/lesson.html | 31 +++++ _layouts/reference.html | 31 +++++ _layouts/slides.html | 260 ++++++++++++++++++++++++++++++++++++++ _layouts/topic.html | 31 +++++ code/script.sh | 3 + data/data.csv | 2 + index.md | 22 ++++ instructors.md | 22 ++++ motivation.md | 19 +++ reference.md | 12 ++ tools/build | 12 ++ tools/check | 5 + 21 files changed, 639 insertions(+) create mode 100644 .gitignore create mode 100644 01-one.md create mode 100644 02-two.md create mode 100644 LICENSE.md create mode 100644 _config.yml create mode 100644 _includes/banner.html create mode 100644 _includes/footer.html create mode 100644 _includes/header.html create mode 100644 _includes/javascript.html create mode 100644 _layouts/lesson.html create mode 100644 _layouts/reference.html create mode 100644 _layouts/slides.html create mode 100644 _layouts/topic.html create mode 100755 code/script.sh create mode 100644 data/data.csv create mode 100644 index.md create mode 100644 instructors.md create mode 100644 motivation.md create mode 100644 reference.md create mode 100755 tools/build create mode 100755 tools/check diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..4a035824f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +_site/ \ No newline at end of file diff --git a/01-one.md b/01-one.md new file mode 100644 index 000000000..5bceb7801 --- /dev/null +++ b/01-one.md @@ -0,0 +1,35 @@ +--- +layout: topic +title: Topic One +minutes: 30 +--- +> ## Learning Objectives {.objectives} +> +> * Learning objective 1 +> * Learning objective 2 + +Paragraphs of text mixed with: + +~~~ {.python} +some code: + to be displayed +~~~ +~~~ {.output} +output +from +program +~~~ +~~~ {.error} +error reports from program (if any) +~~~ + +and possibly including: + +> ## Callout Box {.callout} +> +> An aside of some kind. + +> ## Challenge Title {.challenge} +> +> Description of a single challenge. +> There may be several challenges. diff --git a/02-two.md b/02-two.md new file mode 100644 index 000000000..b5097ac25 --- /dev/null +++ b/02-two.md @@ -0,0 +1,35 @@ +--- +layout: topic +title: Topic Two +minutes: 45 +--- +> ## Learning Objectives {.objectives} +> +> * Learning objective 1 +> * Learning objective 2 + +Paragraphs of text mixed with: + +~~~ {.python} +some code: + to be displayed +~~~ +~~~ {.output} +output +from +program +~~~ +~~~ {.error} +error reports from program (if any) +~~~ + +and possibly including: + +> ## Callout Box {.callout} +> +> An aside of some kind. + +> ## Challenge Title {.challenge} +> +> Description of a single challenge. +> There may be several challenges. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..e2390c209 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,73 @@ +--- +layout: lesson +title: Licenses +--- +### Instructional Material + +All Software Carpentry instructional material is made available under +the Creative Commons Attribution license. You are free: + +* to **Share**---to copy, distribute and transmit the work +* to **Remix**---to adapt the work + +Under the following conditions: + +* **Attribution**---You must attribute the work using "Copyright (c) + Software Carpentry" (but not in any way that suggests that we + endorse you or your use of the work). Where practical, you must + also include a hyperlink to http://software-carpentry.org. + +With the understanding that: + +* **Waiver**---Any of the above conditions can be waived if you get + permission from the copyright holder. +* **Other Rights**---In no way are any of the following rights + affected by the license: + * Your fair dealing or fair use rights; + * The author's moral rights; + * Rights other persons may have either in the work itself or in + how the work is used, such as publicity or privacy rights. * +* **Notice**---For any reuse or distribution, you must make clear to + others the license terms of this work. The best way to do this is + with a link to + [http://creativecommons.org/licenses/by/3.0/](http://creativecommons.org/licenses/by/3.0/). + +For the full legal text of this license, please see +[http://creativecommons.org/licenses/by/3.0/legalcode](http://creativecommons.org/licenses/by/3.0/legalcode). + +### Software + +Except where otherwise noted, the example programs and other software +provided by Software Carpentry are made available under the +[OSI](http://opensource.org)-approved +[MIT license](http://opensource.org/licenses/mit-license.html). + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### Other Material + +Our [code of conduct](CODE_OF_CONDUCT.html) is taken from +[this site](https://github.com/Bantik/contributor_covenant/blob/master/LICENSE), +and is made available under the same MIT License as our software. + +### Trademark + +"Software Carpentry" and the Software Carpentry logo are registered +trademarks of Software Carpentry, Ltd. diff --git a/_config.yml b/_config.yml new file mode 100644 index 000000000..98eee5be4 --- /dev/null +++ b/_config.yml @@ -0,0 +1,11 @@ +markdown : kramdown +kramdown : + entity_output : as_input # — is output as — + smart_quotes : [39, 39, 34, 34] # decimal for left/right single/double quotes +contact : "admin@software-carpentry.org" +github_url : "https://github.com/swcarpentry" +irc_url : "irc://moznet/sciencelab" +rss_url : "http://software-carpentry.org/feed.xml" +swc_prefix : "http://software-carpentry.org" +twitter_name : "@swcarpentry" +twitter_url : "https://twitter.com/swcarpentry" diff --git a/_includes/banner.html b/_includes/banner.html new file mode 100644 index 000000000..3f85686db --- /dev/null +++ b/_includes/banner.html @@ -0,0 +1,6 @@ +Fork me on GitHub + diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 000000000..cf4024195 --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,9 @@ + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 000000000..f71d076fa --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/_includes/javascript.html b/_includes/javascript.html new file mode 100644 index 000000000..5eccf86c9 --- /dev/null +++ b/_includes/javascript.html @@ -0,0 +1,5 @@ + + + + diff --git a/_layouts/lesson.html b/_layouts/lesson.html new file mode 100644 index 000000000..d50f64007 --- /dev/null +++ b/_layouts/lesson.html @@ -0,0 +1,31 @@ +--- +--- + + + + {% if page.title %} + {{ page.title }} + {% endif %} + {% include header.html %} + + + +
+ {% include banner.html %} + +
+
+ + {% if page.title %} +

{{page.title}}

+ {% endif %} + {{content}} + +
+
+ + {% include footer.html %} +
+ {% include javascript.html %} + + diff --git a/_layouts/reference.html b/_layouts/reference.html new file mode 100644 index 000000000..d50f64007 --- /dev/null +++ b/_layouts/reference.html @@ -0,0 +1,31 @@ +--- +--- + + + + {% if page.title %} + {{ page.title }} + {% endif %} + {% include header.html %} + + + +
+ {% include banner.html %} + +
+
+ + {% if page.title %} +

{{page.title}}

+ {% endif %} + {{content}} + +
+
+ + {% include footer.html %} +
+ {% include javascript.html %} + + diff --git a/_layouts/slides.html b/_layouts/slides.html new file mode 100644 index 000000000..6ef882e57 --- /dev/null +++ b/_layouts/slides.html @@ -0,0 +1,260 @@ +--- +--- + + + + + {{page.title}} + + + + + + + + + + + + +
+
+ +{{content}} + +
+
+ + + + + + + + + diff --git a/_layouts/topic.html b/_layouts/topic.html new file mode 100644 index 000000000..d50f64007 --- /dev/null +++ b/_layouts/topic.html @@ -0,0 +1,31 @@ +--- +--- + + + + {% if page.title %} + {{ page.title }} + {% endif %} + {% include header.html %} + + + +
+ {% include banner.html %} + +
+
+ + {% if page.title %} +

{{page.title}}

+ {% endif %} + {{content}} + +
+
+ + {% include footer.html %} +
+ {% include javascript.html %} + + diff --git a/code/script.sh b/code/script.sh new file mode 100755 index 000000000..72787bdfe --- /dev/null +++ b/code/script.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# script.sh: A shell script +echo "Hello world!" diff --git a/data/data.csv b/data/data.csv new file mode 100644 index 000000000..53b80f6b0 --- /dev/null +++ b/data/data.csv @@ -0,0 +1,2 @@ +header1, header2 +0, 0 \ No newline at end of file diff --git a/index.md b/index.md new file mode 100644 index 000000000..e1929b2df --- /dev/null +++ b/index.md @@ -0,0 +1,22 @@ +--- +layout: lesson +title: Lesson Title +keywords: ["some", "key terms", "in a list"] +--- +Paragraph of introductory material. + +> ## Prerequisites {.prereq} +> +> A short paragraph describing what learners need to know +> before tackling this lesson. + +## Topics + +* [Topic Title 1](01-one.html) +* [Topic Title 2](02-two.html) + +## Other Resources + +* [Motivation](motivation.html) +* [Reference Guide](reference.html) +* [Instructor's Guide](instructors.html) diff --git a/instructors.md b/instructors.md new file mode 100644 index 000000000..2ebb36821 --- /dev/null +++ b/instructors.md @@ -0,0 +1,22 @@ +--- +layout: lesson +title: Instructor's Guide +--- +## Overall + +One or more paragraphs laying out the lesson's legend. + +## General Points + +* Point +* Point + +## Topic One + +* Point +* Point + +## Topic Two + +* Point +* Point diff --git a/motivation.md b/motivation.md new file mode 100644 index 000000000..7b54e756c --- /dev/null +++ b/motivation.md @@ -0,0 +1,19 @@ +--- +layout: slides +title: Why Topic? +--- +
+ +
+
+ +
+
+ +
diff --git a/reference.md b/reference.md new file mode 100644 index 000000000..5669b1813 --- /dev/null +++ b/reference.md @@ -0,0 +1,12 @@ +--- +layout: reference +--- +...commands and examples... + +## Glossary + +> **Key Word 1**: the definition +> relevant to the lesson. + +> **Key Word 2**: the definition +> relevant to the lesson. diff --git a/tools/build b/tools/build new file mode 100755 index 000000000..e3174ec46 --- /dev/null +++ b/tools/build @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# build: Build the lesson site. + +# Ensure we run from the lesson directory +cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. + +# Run our checks first +tools/check + +SITE="_site" + +jekyll build -t -d $SITE diff --git a/tools/check b/tools/check new file mode 100755 index 000000000..954c43ca3 --- /dev/null +++ b/tools/check @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +# check: Ensure that proper formatting has been used. + +# Show all of the FIXMEs in the lessons content +grep -i -n FIXME ??-*.md From b4fbb1fcd0f6850d57dfb6f0a136bc255ac1e900 Mon Sep 17 00:00:00 2001 From: Trevor Bekolay Date: Tue, 21 Oct 2014 12:05:15 -0400 Subject: [PATCH 0059/1182] Ensure that checks are run from repo root --- tools/check | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/check b/tools/check index 954c43ca3..d0e8545e8 100755 --- a/tools/check +++ b/tools/check @@ -1,5 +1,8 @@ #!/usr/bin/env bash # check: Ensure that proper formatting has been used. +# Ensure we run from the lesson directory +cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. + # Show all of the FIXMEs in the lessons content grep -i -n FIXME ??-*.md From 5256b2833b62250a12bd3e3a674629094d6bc264 Mon Sep 17 00:00:00 2001 From: Trevor Bekolay Date: Tue, 21 Oct 2014 14:58:42 -0400 Subject: [PATCH 0060/1182] Initial version of shared files --- _config.yml | 11 ++ _includes/banner.html | 6 + _includes/footer.html | 9 ++ _includes/header.html | 13 ++ _includes/javascript.html | 5 + _layouts/lesson.html | 31 +++++ _layouts/reference.html | 31 +++++ _layouts/slides.html | 260 ++++++++++++++++++++++++++++++++++++++ _layouts/topic.html | 31 +++++ tools/build | 12 ++ tools/check | 8 ++ tools/update | 7 + 12 files changed, 424 insertions(+) create mode 100644 _config.yml create mode 100644 _includes/banner.html create mode 100644 _includes/footer.html create mode 100644 _includes/header.html create mode 100644 _includes/javascript.html create mode 100644 _layouts/lesson.html create mode 100644 _layouts/reference.html create mode 100644 _layouts/slides.html create mode 100644 _layouts/topic.html create mode 100755 tools/build create mode 100755 tools/check create mode 100755 tools/update diff --git a/_config.yml b/_config.yml new file mode 100644 index 000000000..98eee5be4 --- /dev/null +++ b/_config.yml @@ -0,0 +1,11 @@ +markdown : kramdown +kramdown : + entity_output : as_input # — is output as — + smart_quotes : [39, 39, 34, 34] # decimal for left/right single/double quotes +contact : "admin@software-carpentry.org" +github_url : "https://github.com/swcarpentry" +irc_url : "irc://moznet/sciencelab" +rss_url : "http://software-carpentry.org/feed.xml" +swc_prefix : "http://software-carpentry.org" +twitter_name : "@swcarpentry" +twitter_url : "https://twitter.com/swcarpentry" diff --git a/_includes/banner.html b/_includes/banner.html new file mode 100644 index 000000000..3f85686db --- /dev/null +++ b/_includes/banner.html @@ -0,0 +1,6 @@ +Fork me on GitHub + diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 000000000..cf4024195 --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,9 @@ + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 000000000..f71d076fa --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/_includes/javascript.html b/_includes/javascript.html new file mode 100644 index 000000000..5eccf86c9 --- /dev/null +++ b/_includes/javascript.html @@ -0,0 +1,5 @@ + + + + diff --git a/_layouts/lesson.html b/_layouts/lesson.html new file mode 100644 index 000000000..d50f64007 --- /dev/null +++ b/_layouts/lesson.html @@ -0,0 +1,31 @@ +--- +--- + + + + {% if page.title %} + {{ page.title }} + {% endif %} + {% include header.html %} + + + +
+ {% include banner.html %} + +
+
+ + {% if page.title %} +

{{page.title}}

+ {% endif %} + {{content}} + +
+
+ + {% include footer.html %} +
+ {% include javascript.html %} + + diff --git a/_layouts/reference.html b/_layouts/reference.html new file mode 100644 index 000000000..d50f64007 --- /dev/null +++ b/_layouts/reference.html @@ -0,0 +1,31 @@ +--- +--- + + + + {% if page.title %} + {{ page.title }} + {% endif %} + {% include header.html %} + + + +
+ {% include banner.html %} + +
+
+ + {% if page.title %} +

{{page.title}}

+ {% endif %} + {{content}} + +
+
+ + {% include footer.html %} +
+ {% include javascript.html %} + + diff --git a/_layouts/slides.html b/_layouts/slides.html new file mode 100644 index 000000000..6ef882e57 --- /dev/null +++ b/_layouts/slides.html @@ -0,0 +1,260 @@ +--- +--- + + + + + {{page.title}} + + + + + + + + + + + + +
+
+ +{{content}} + +
+
+ + + + + + + + + diff --git a/_layouts/topic.html b/_layouts/topic.html new file mode 100644 index 000000000..d50f64007 --- /dev/null +++ b/_layouts/topic.html @@ -0,0 +1,31 @@ +--- +--- + + + + {% if page.title %} + {{ page.title }} + {% endif %} + {% include header.html %} + + + +
+ {% include banner.html %} + +
+
+ + {% if page.title %} +

{{page.title}}

+ {% endif %} + {{content}} + +
+
+ + {% include footer.html %} +
+ {% include javascript.html %} + + diff --git a/tools/build b/tools/build new file mode 100755 index 000000000..e3174ec46 --- /dev/null +++ b/tools/build @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# build: Build the lesson site. + +# Ensure we run from the lesson directory +cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. + +# Run our checks first +tools/check + +SITE="_site" + +jekyll build -t -d $SITE diff --git a/tools/check b/tools/check new file mode 100755 index 000000000..d0e8545e8 --- /dev/null +++ b/tools/check @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# check: Ensure that proper formatting has been used. + +# Ensure we run from the lesson directory +cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. + +# Show all of the FIXMEs in the lessons content +grep -i -n FIXME ??-*.md diff --git a/tools/update b/tools/update new file mode 100755 index 000000000..3237442a6 --- /dev/null +++ b/tools/update @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# update: Get the latest versions of shared files + +# Ensure we run from the lesson directory +cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. + +git pull --rebase=false https://github.com/tbekolay/swc-shared.git master From fbd66b286feea5746f9da369d81026b43648e2c7 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Wed, 22 Oct 2014 09:17:44 -0400 Subject: [PATCH 0061/1182] Using template variables everywhere --- _config.yml | 6 ++---- _includes/banner.html | 6 +++--- _includes/footer.html | 2 -- _includes/header.html | 10 +++++----- _includes/javascript.html | 4 +--- _layouts/lesson.html | 2 +- _layouts/reference.html | 2 +- _layouts/slides.html | 24 ++++++++++++------------ _layouts/topic.html | 2 +- index.md | 2 +- 10 files changed, 27 insertions(+), 33 deletions(-) diff --git a/_config.yml b/_config.yml index 98eee5be4..2f722b7cc 100644 --- a/_config.yml +++ b/_config.yml @@ -1,11 +1,9 @@ markdown : kramdown kramdown : - entity_output : as_input # — is output as — + entity_output : as_input # so that — is output as — smart_quotes : [39, 39, 34, 34] # decimal for left/right single/double quotes contact : "admin@software-carpentry.org" github_url : "https://github.com/swcarpentry" -irc_url : "irc://moznet/sciencelab" -rss_url : "http://software-carpentry.org/feed.xml" -swc_prefix : "http://software-carpentry.org" +swc_url : "http://software-carpentry.org" twitter_name : "@swcarpentry" twitter_url : "https://twitter.com/swcarpentry" diff --git a/_includes/banner.html b/_includes/banner.html index 3f85686db..d88a24887 100644 --- a/_includes/banner.html +++ b/_includes/banner.html @@ -1,6 +1,6 @@ -Fork me on GitHub +Fork me on GitHub diff --git a/_includes/footer.html b/_includes/footer.html index cf4024195..646b5f49b 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,9 +1,7 @@ diff --git a/_includes/header.html b/_includes/header.html index f71d076fa..603626462 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,10 +1,10 @@ - + - - - - + + + + diff --git a/_includes/javascript.html b/_includes/javascript.html index 5eccf86c9..780f26ba3 100644 --- a/_includes/javascript.html +++ b/_includes/javascript.html @@ -1,5 +1,3 @@ - - + diff --git a/_layouts/lesson.html b/_layouts/lesson.html index d50f64007..87e1d739c 100644 --- a/_layouts/lesson.html +++ b/_layouts/lesson.html @@ -7,7 +7,7 @@ {{ page.title }} {% endif %} {% include header.html %} - +
diff --git a/_layouts/reference.html b/_layouts/reference.html index d50f64007..87e1d739c 100644 --- a/_layouts/reference.html +++ b/_layouts/reference.html @@ -7,7 +7,7 @@ {{ page.title }} {% endif %} {% include header.html %} - +
diff --git a/_layouts/slides.html b/_layouts/slides.html index 6ef882e57..faac2c02f 100644 --- a/_layouts/slides.html +++ b/_layouts/slides.html @@ -10,10 +10,10 @@ - - - - + + + + @@ -227,8 +227,8 @@

{{page.datetime}}

{{page.website}}

- - + + - + + - - - - - diff --git a/pages/_layouts/topic.html b/pages/_layouts/topic.html deleted file mode 100644 index 4489725fa..000000000 --- a/pages/_layouts/topic.html +++ /dev/null @@ -1,31 +0,0 @@ ---- ---- - - - - {% if page.title %} - {{ page.title }} - {% endif %} - {% include header.html %} - - - -
- {% include banner.html %} - -
-
- - {% if page.title %} -

{{page.title}}

- {% endif %} - {{content}} - -
-
- - {% include footer.html %} -
- {% include javascript.html %} - - diff --git a/pages/tools/check b/pages/tools/check index d0e8545e8..e750ec763 100755 --- a/pages/tools/check +++ b/pages/tools/check @@ -1,8 +1,6 @@ #!/usr/bin/env bash -# check: Ensure that proper formatting has been used. -# Ensure we run from the lesson directory -cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. +# Placeholder for actual conformance checking script (which will +# probably be Python, not Bash). -# Show all of the FIXMEs in the lessons content -grep -i -n FIXME ??-*.md +grep -i -n 'FIX''ME' $* diff --git a/pages/tools/clean b/pages/tools/clean deleted file mode 100755 index 646f84bd0..000000000 --- a/pages/tools/clean +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -# Delete junk files. -rm -rf $(find . -name '*~' -print) -rm -rf $(find . -name '*.pyc' -print) -rm -rf $(find . -name '.DS_Store' -print) -rm -rf _site diff --git a/pages/tools/preview b/pages/tools/preview deleted file mode 100755 index e3174ec46..000000000 --- a/pages/tools/preview +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -# build: Build the lesson site. - -# Ensure we run from the lesson directory -cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. - -# Run our checks first -tools/check - -SITE="_site" - -jekyll build -t -d $SITE diff --git a/pages/tools/update b/pages/tools/update deleted file mode 100755 index 3237442a6..000000000 --- a/pages/tools/update +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -# update: Get the latest versions of shared files - -# Ensure we run from the lesson directory -cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. - -git pull --rebase=false https://github.com/tbekolay/swc-shared.git master From f870b0631462a329c0257bc9890c3468819a2c9c Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sun, 9 Nov 2014 14:29:29 -0500 Subject: [PATCH 0070/1182] Bringing in description of lesson structure --- README.md | 433 +++++++++++++++++- {pages/_includes => _includes}/banner.html | 0 {pages/_includes => _includes}/footer.html | 0 {pages/_includes => _includes}/header.html | 0 .../_includes => _includes}/javascript.html | 0 fig/example.svg | 31 ++ {pages/tools => tools}/check | 0 7 files changed, 463 insertions(+), 1 deletion(-) rename {pages/_includes => _includes}/banner.html (100%) rename {pages/_includes => _includes}/footer.html (100%) rename {pages/_includes => _includes}/header.html (100%) rename {pages/_includes => _includes}/javascript.html (100%) create mode 100644 fig/example.svg rename {pages/tools => tools}/check (100%) diff --git a/README.md b/README.md index ebd4d53b4..61dfb7ca6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,435 @@ lesson-template =============== -Template for remixable lessons. +This repository is the template for +[Software Carpentry](http://software-carpentry.org) lessons. To +create a new lesson: + +1. Create a new empty repository on GitHub. (You must create a + new repository, rather than forking this repository, because + GitHub only allows a user to have one fork of a particular + repository, and you may wish to create several lessons.) +2. Clone that empty repository to your desktop. +3. Create a branch in that repository called `gh-pages`. +4. Add this repository as a remote called `template`. +5. `git pull template gh-pages` to copy the content of this + repository into your repository. +6. Create and edit files as explained below. +7. `git push origin gh-pages` to send your changes to GitHub for + viewing. + +## Terms + +* A *lesson* is a complete story about some subject, typically taught + in 2-4 hours. +* A *topic* is a single scene in that story, typically 5-15 minutes + long. +* A *slug* is a short identifier for something, such as `filesys` (for + "file system"). + +## Why Use a Template? + +We have chosen to organize our lessons in a standard way so that: + +1. They will have the same look and feel, and can be navigated in + predictable ways, even when they are written by different (and + multiple) people. + +2. Contributors know where to put things when they are extending or + modifying lessons. + +3. Content can more easily be checked. For example, we want to make + sure that every learning objective is matched by a challenge, + and that every challenge corresponds to one or more learning + objectives. + +In the longer term, a standard format will also help us build tools to +remix lessons, but the formatting rules must always be justifiable in +terms of short-term gains for instructors and learners. + +Instead of putting the whole lesson in one page, we expect authors to +use one short page per topic. This division shows each learning +sprint explicitly, and the small chunks will make it easier for us to +keep track of how long each piece takes. The cycle we expect in each +topic within a lesson is: + +1. Explain the topic's objectives. +2. Teach it. +3. Do one or more challenges (depending on time). + +We also require the following for each lesson: + +* *Introductory slides* to give learners a sense of where the next + two or three hours are going to take them. + +* A *reference guide* learners can use during the lesson, and look + back at afterward. This should includes a glossary of terms to + help lesson authors think through what they expect learners to be + unfamiliar with, and to make searching through lessons easier. + +* An *instructor's guide* containing our collected wisdom about this + lesson and solutions to the challenge exercises. We ask everyone + who teaches for us to review and update the instructor's guide for + each lesson they taught after each workshop. + + Note that the this means the solutions to the lesson's challenge + exercises will be up on the web. We have chosen to do this + because we believe in openness, and because there's no point + trying to hide something that's in a publicly-readable repository. + +## Background + +There are a few things you need to know in order to understand why we +do things the way we do. + +1. Git uses the term *clone* to mean "a copy of a repository". + GitHub uses the term *fork* to mean, "a copy of a GitHub-hosted + repo that is also hosted on GitHub", and the term *clone* to mean + "a copy of a GitHub-hosted repo that's located on someone else's + machine". In both cases, the duplicate has a remote called + `origin` that points to the original repo; other remotes can be + added manually. + +2. A user on GitHub can only have one fork of a particular repo. + This is a problem for us because an author may be involved in + writing several lessons, each of which has its own website repo. + Those website repositories ought to be forks of this one, but + since GitHub doesn't allow that, we've had to find a workaround. + +3. If a repository has a branch called `gh-pages` (which stands for + "GitHub pages"), then GitHub uses the HTML and Markdown files in + that branch to create a website for the repository. If the + repository's URL is `http://github.com/darwin/finches`, the URL + for the website is `http://darwin.github.io/finches`. + +4. We have chosen to use Markdown for writing pages because it's + simple to learn, and isn't tied to any specific language (the + ReStructured Text format popular in the Python world, for example, + is a complete unknown to R programmers). If authors want to use + something else for their lessons (e.g., IPython Notebooks), it's + up to them to generate and commit Markdown formatted according to + the rules below. + +5. We have chosen to use Pandoc to process pages instead of Jekyll + (GitHub's default conversion tool) because Pandoc supports a much + richer dialect of Markdown than Jekyll. Like Jekyll, Pandoc looks + for a header at the top of each page formatted like this: + + ~~~ + --- + key: value + other_key: other_value + --- + ...stuff in the page... + ~~~ + + and uses that data when formatting the page. + +6. Using Pandoc instead of Jekyll means that we have to compile our + Markdown into HTML on our own machines and commit it to the + `gh-pages` branch of the lesson's GitHub repository. In order to + keep our source files and generated files separate, we put our + source files in a sub-directory called `pages`, and compile them + "upward" into the root directory of the lesson's repository. + +7. In order to display properly, our generated HTML pages need + artwork, CSS style files, and a few bits of Javascript. We could + always load these from the web, but that would make offline + authoring difficult. Instead, each lesson's repository has a copy + of these files, and a way of updating them (and only them) on + demand. + +One final note: we try not to put HTML inside Markdown because it's +ugly to read and write, and error-prone to process. Instead, we put +things that ought to be in `
` blocks, like the learning +objectives and challenge exercises, in blocks indented with `>`, and +do a bit of post-processing to attach the right CSS classes to these +blocks. + +## Overall Layout + +Each lesson is stored in a directory laid out as described below. That +directory is a self-contained Git repository (i.e., there are no +submodules or clever tricks with symbolic links). + +1. `README.md`: initially a copy of this file. It should be + overwritten with short description of the lesson. + +2. `pages/`: a sub-directory containing the source of the lesson's + website. See "Pages" below. + +3. `code/`: a sub-directory containing all sample code. See "Code, + Data, and Figures" below. + +4. `data/`: a sub-directory containing all data files for this lesson. + See "Code, Data, and Figures" below. + +5. `fig/`: figures, plots, and diagrams used in the lesson. See + "Code, Data, and Figures" below. + +6. `_layouts/`: page layout templates. See "Support Files" below. + +7. `_includes/`: page inclusions. See "Support Files" below. + +8. `css/`: style sheets used in the lesson's web site. See "Support + Files" below. + +9. `img/`: artwork used in the lesson's web site. See "Support + Files" below. + +10. `js/`: Javascript used in the lesson's website. See "Support + Files" below. + +11. `tools/`: tools for managing lessons. See "Tools" below. + +## Code, Data, and Figures + +All of the software samples used in the lesson must go in a directory +called `code/`. Stand-alone data files must go in a directory called +`data/`. Groups of related data files must be put together in a +sub-directory of `data/` with a meaningful (short) name. + +Figures, plots, and diagrams used in the lessons must go in a `fig/` +directory. We strongly prefer SVG for line drawings, since they are +smaller, scale better, and are easier to edit. Screenshots and other +raster images must be PNG or JPEG format. + +**Notes:** + +1. This mirrors the layout a scientist would use for actual work. + +2. However, it may cause novice learners problems. If `code/program.py` + includes a hard-wired path to a data file, that path must be either + `datafile.ext` or `data/datafile.ext`. The first will only work if + the program is run with the lesson's root directory as the current + working directory, while the second will only work if the program is + run from within the `code/` directory. This is a learning + opportunity for students working from the command line, but a + confusing annoyance inside IDEs and the IPython Notebook (where the + tool's current working directory is less obvious). And yes, the + right answer is to pass filenames on the command line, but that + requires learners to understand how to get command line arguments, + which isn't something they'll be ready for in the first hour or two. + +## Support Files + +Files used to display the lesson, such as artwork, CSS, and +Javascript, are stored in directories of their own. We keep website +artwork separate from graphics used in the lesson's to make it simple +to update the former automatically. Most authors should not need to +modify any of the support files themselves. + +The `_layouts/` directory holds the page templates used to translate +Markdown to HTML, while the `_includes/` directory holds snippets of +HTML that are used in several page layouts. These directories have +underscores at the start of their names to be consistent with Jekyll's +naming conventions, but the files they contain are for Pandoc. + +## Tools + +The `tools/` directory contains tools to help create and maintain +lessons: + +* `tools/check`: make sure that everything is formatted properly, and + print error messages identifying problems if it's not. + +## Pages + +The `pages/` directory holds the content of the lesson. + +1. `index.md`: the home page for the lesson. (See "Home Page" below.) + +2. `dd-slug.md`: the topics in the lesson. `dd` is a sequence number + such as `01`, `02`, etc., and `slug` is an abbreviated single-word + mnemonic for the topic. Thus, `03-filesys.md` is the third topic in + this lesson, and is about the filesystem. (Note that we use hyphens + rather than underscores in filenames.) See "Topics" below. + +3. `motivation.md`: slides for a short introductory presentation (three + minutes or less) explaining what the lesson is about and why people + would want to learn it. See "Introductory Slides" below. + +4. `reference.md`: a cheat sheet summarizing key terms and commands, + syntax, etc., that can be printed and given to learners. See + "Reference Guide" below. + +5. `instructors.md`: the instructor's guide for the lesson. See + "Instructor's Guide" below. + +### Home Page + +`index.md` must be structured as follows: + + --- + layout: lesson + title: Lesson Title + keywords: ["some", "key terms", "in a list"] + --- + Paragraph of introductory material. + + > ## Prerequisites + > + > A short paragraph describing what learners need to know + > before tackling this lesson. + + ## Topics + + * [Topic Title 1](01-slug.html) + * [Topic Title 2](02-slug.html) + + ## Other Resources + + * [Introduction](intro.html) + * [Reference Guide](reference.html) + * [Instructor's Guide](guide.html) + +**Notes:** + +1. The description of prerequisites is prose for human consumption, not + a machine-comprehensible list of dependencies. We may supplement + the former with the latter once we have more experience with this + lesson format and know what we actually want to do. The block must + be titled "Prerequisites" so we can detect it and style it + properly. + +2. Software installation and configuration instructions *aren't* in the + lesson, since they may be shared with other lessons. They will be + stored centrally on the Software Carpentry web site and linked + from the lessons that need them. + +### Topics + +Each topic page must be structured as follows: + + --- + layout: topic + title: Topic Title + minutes: MM + --- + > ## Learning Objectives {.objectives} + > + > * Learning objective 1 + > * Learning objective 2 + + Paragraphs of text mixed with: + + ~~~ {.python} + some code: + to be displayed + ~~~ + ~~~ {.output} + output + from + program + ~~~ + ~~~ {.error} + error reports from program (if any) + ~~~ + + and possibly including: + + > ## Callout Box {.callout} + > + > An aside of some kind. + + > ## Challenge Title {.challenge} + > + > Description of a single challenge. + > There may be several challenges. + +**Notes:** + +1. The "expected time" heading is called minutes to encourage people to + create topics that are short (10-15 minutes at most). + +2. There are no sub-headings inside a topic other than the ones shown: + if a topic needs sub-headings, it should be broken into two or more + topics. + +3. Every challenge should relate directly back to a learning objective. + +### Motivational Slides + +Every lesson must include a short slide deck suitable for a short +presentation (3 minutes or less) that the instructor can use to explain +to learners how knowing the subject will help them. + +**Notes:** + +1. *Flesh this out and provide an example.* + +### Reference Guide + +The reference guide is a cheat sheet for learners to print, doodle on, +and take away. Its format is deliberately unconstrained for now, +since we'll need to see a few before we can decide how they ought to +be laid out (or whether they need to be laid out the same way at all). + +The last section of the reference guide must be a glossary laid out as +a definition list: + + --- + layout: reference + --- + ...commands and examples... + + ## Glossary + + Key Word 1 + : Definition of first term + + Key Word 2 + : Definition of second term + +### Instructor's Guide + +Many learners will go through the lessons outside of class, so it +seems best to keep material for instructors in a separate document, +rather than interleaved in the lesson itself. Its structure is: + + --- + title: Instructor's Guide + --- + ## Overall + + One or more paragraphs laying out the lesson's legend. + + ## General Points + + * Point + * Point + + ## [Topic Title 1](01-slug.html) + + * Point + * Point + + 1. Discussion of first challenge. + + 2. Discussion of second challenge. + + ## [Topic Title 2](02-slug.html) + + * Point + * Point + + 1. Discussion of first challenge. + + 2. Discussion of second challenge. + +**Notes:** + +1. The topic headings must match the topic titles. (Yes, we could + define these as variables in a configuration file and refer to those + variables everywhere, but in this case, repetition will be a lot + easier to read, and our validator can check that the titles line + up.) + +2. The points can be anything: specific ways to introduce ideas, common + mistakes learners make and how to get out of them, or anything else. + +3. Full solutions to the challenges do not have to be presented, but + every challenge should be discussed, and that discussion should + mention how long it typically takes to do. (Those estimates do + not go in the challenge itself, since they can increase learners' + stress levels.) diff --git a/pages/_includes/banner.html b/_includes/banner.html similarity index 100% rename from pages/_includes/banner.html rename to _includes/banner.html diff --git a/pages/_includes/footer.html b/_includes/footer.html similarity index 100% rename from pages/_includes/footer.html rename to _includes/footer.html diff --git a/pages/_includes/header.html b/_includes/header.html similarity index 100% rename from pages/_includes/header.html rename to _includes/header.html diff --git a/pages/_includes/javascript.html b/_includes/javascript.html similarity index 100% rename from pages/_includes/javascript.html rename to _includes/javascript.html diff --git a/fig/example.svg b/fig/example.svg new file mode 100644 index 000000000..746e5eb9e --- /dev/null +++ b/fig/example.svg @@ -0,0 +1,31 @@ + + + + + + + + + + +Working +Directory +Stage +(Index) +files that +that you “see” +files to go +in next +commit +files that have +been +committed +LocalRepository + diff --git a/pages/tools/check b/tools/check similarity index 100% rename from pages/tools/check rename to tools/check From e421be0bd271da59dda8dd23b79fc27cfbaf076c Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sun, 9 Nov 2014 19:21:27 -0500 Subject: [PATCH 0071/1182] Including things in templates --- _includes/banner.html | 5 ++--- _includes/footer.html | 9 ++++----- _includes/header.html | 11 +++++------ pages/Makefile | 13 ++++++++++++- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/_includes/banner.html b/_includes/banner.html index d0021cfb3..541ea7e45 100644 --- a/_includes/banner.html +++ b/_includes/banner.html @@ -1,6 +1,5 @@ -Fork me on GitHub diff --git a/_includes/footer.html b/_includes/footer.html index c6f7e1a36..db00b1b05 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,7 +1,6 @@ diff --git a/_includes/header.html b/_includes/header.html index 437119a66..d9d02f314 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,12 +1,11 @@ - + - - - - + + + + - + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+

Slide

+
+ +
+

Content

+
+ +
+

Here

+
+ + + + + + +
+ + +
+ + +

+ + / + +

+ + +
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + From 5c15f8cfb20816e5f6f4938980a86f0af233124f Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Tue, 11 Nov 2014 10:19:41 -0600 Subject: [PATCH 0078/1182] Converting `motivation.md` to use slides template. Also modifed the Makefile to use the slides template for this file instead of the generic template. Note that we do not need a Markdown extension for deck.js because Pandoc is doing Markdown-to-HTML conversion for us. --- motivation.html => _layouts/slides.html | 22 +++++----------------- pages/Makefile | 8 +++++++- pages/motivation.md | 24 +++++++++++++----------- 3 files changed, 25 insertions(+), 29 deletions(-) rename motivation.html => _layouts/slides.html (88%) diff --git a/motivation.html b/_layouts/slides.html similarity index 88% rename from motivation.html rename to _layouts/slides.html index d11c7685f..581bc990d 100644 --- a/motivation.html +++ b/_layouts/slides.html @@ -5,7 +5,7 @@ - Your deck.js Presentation + Software Carpentry @@ -33,19 +33,7 @@
- -
-

Slide

-
- -
-

Content

-
- -
-

Here

-
- + $body$ @@ -85,10 +73,10 @@

Here

- + diff --git a/pages/Makefile b/pages/Makefile index fae66bd20..ce3694724 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -19,7 +19,13 @@ all : commands ## preview : Build website locally for checking. preview : $(DST_PAGES) -# Pattern to build a page with Pandoc. +# Pattern to build slides. +$(DST_DIR)/motivation.html : $(SRC_DIR)/motivation.md + pandoc -s -t html \ + --template=../_layouts/slides \ + -o $@ $< + +# Pattern to build a generic page. $(DST_DIR)/%.html : $(SRC_DIR)/%.md pandoc -s -t html \ --title-prefix='Software Carpentry' \ diff --git a/pages/motivation.md b/pages/motivation.md index 7b54e756c..e1d51986f 100644 --- a/pages/motivation.md +++ b/pages/motivation.md @@ -2,18 +2,20 @@ layout: slides title: Why Topic? --- -
-
-
- + +
+## More Explanation + +* With +* Bullet +* Points
-
- + +
+## Next Steps + +Here we go!
From 633aaab3bbf3b4b5408fd64d28b1773462a5c8d5 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Tue, 11 Nov 2014 19:38:21 -0200 Subject: [PATCH 0079/1182] Fix layout to follow bc CSS --- _layouts/page.html | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/_layouts/page.html b/_layouts/page.html index 2101ea950..fade22fda 100644 --- a/_layouts/page.html +++ b/_layouts/page.html @@ -2,14 +2,21 @@ + $if(title-prefix)$$title-prefix$ - $endif$$pagetitle$ $header$ - $banner$ - $if(title)$

$title$

$endif$ - $body$ - $footer$ +
+ $banner$ +
+
+ $if(title)$

$title$

$endif$ + $body$ +
+
+ $footer$ +
$javascript$ From 6affd9a9af26a1ced49fcc6ec22643330562d4fb Mon Sep 17 00:00:00 2001 From: Aaron O'Leary Date: Mon, 10 Nov 2014 19:01:43 +0000 Subject: [PATCH 0080/1182] pandoc filter to convert blockquotes to divs This filter converts all blockquote-with-attributes to div-with-attributes. A blockquote-with-attributes is defined as a blockquote that has a header with attributes defined on it as it's first element, e.g. > # valid blockquote {.class} > text This example would be converted into this markdown:
# valid blockquote text
And the equivalent html. The class must be one of the allowed classes defined in the filter (i.e. one of 'callout', 'objectives' or 'challenge'). --- pages/Makefile | 1 + tools/blockquote2div.py | 106 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 tools/blockquote2div.py diff --git a/pages/Makefile b/pages/Makefile index fae66bd20..ae8e8d1ae 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -24,6 +24,7 @@ $(DST_DIR)/%.html : $(SRC_DIR)/%.md pandoc -s -t html \ --title-prefix='Software Carpentry' \ --template=../_layouts/page \ + --filter=../tools/blockquote2div.py \ $(INCLUDES) \ -o $@ $< diff --git a/tools/blockquote2div.py b/tools/blockquote2div.py new file mode 100644 index 000000000..a23109f07 --- /dev/null +++ b/tools/blockquote2div.py @@ -0,0 +1,106 @@ +"""Pandoc filter to convert Blockquotes with attributes into Div +with attributes. + +Usage: + + pandoc source.md --filter=blockquote2div.py --output=output.html + +A blockquote will be converted if + +1. it begins with a header +2. that header has attributes +3. those attributes contain a single class +4. that class is one of ['objectives', 'callout', 'challenge'] + +For example, this is a valid blockquote: + + > ## Callout time! {.callout} + > Let's do something + +and it will be converted into this markdown: + +
+ ## Callout time! + Let's do something. +
+ + +For debugging purposes you may find it useful to test the filter +like this: + + pandoc source.md --to json | python blockquote2div.py | pandoc --from json +""" +import pandocfilters as pf + + +valid_classes = ['objectives', 'callout', 'challenge'] + + +def find_attributes(blockquote): + """Find attributes in a blockquote if they are defined on a + header that is the first thing in the block quote. + + Returns the attributes, a list [id, classes, kvs] + where id = str, classes = list, kvs = list of key, value pairs + """ + if blockquote[0]['t'] == 'Header': + level, attr, inline = blockquote[0]['c'] + return attr + + +def remove_attributes(blockquote): + """Remove attributes from a blockquote if they are defined on a + header that is the first thing in the blockquote. + + Modifies the blockquote inplace. + """ + if blockquote[0]['t'] == 'Header': + level, attr, inlines = blockquote[0]['c'] + attr = pf.attributes({}) + blockquote[0] = pf.Header(level, attr, inlines) + + +def blockquote2div(key, value, format, meta): + """Convert a blockquote into a div if it begins with a header + that has attributes containing a single class that is in the + allowed classes. + + This function can be passed directly to toJSONFilter + from pandocfilters. + """ + if key == 'BlockQuote': + blockquote = value + attr = find_attributes(blockquote) + if not attr: + return + elif len(attr[1]) == 1 and attr[1][0] in valid_classes: + remove_attributes(blockquote) + # a blockquote is just a list of blocks, so it can be + # passed directly to Div, which expects Div(attr, blocks) + return pf.Div(attr, blockquote) + + +if __name__ == '__main__': + # pandocfilters.toJSONFilter is a convenience method that + # makes a command line json filter from a given function. + # JSON emitted from pandoc is read from stdin. The JSON tree is + # walked, with the function being applied to each element in the + # tree. + # + # The function passed to to JSONFilter must accept (key, value, + # format, metadata) as arguments: + # + # key - element type (e.g. 'Str', 'Header') + # value - element contents + # format - destination format + # metadata - document metadata + # + # The function return values determine what happens to the + # element: + # returns None: the element is unmodified; + # returns []: delete the element + # otherwise: replace the element with the return value + # + # The JSON is then output to stdout, where it can be consumed by + # pandoc. + pf.toJSONFilter(blockquote2div) From b9dd6c9df270459560c4ff3fb2c9414009bb3a4a Mon Sep 17 00:00:00 2001 From: Aaron O'Leary Date: Wed, 12 Nov 2014 12:39:57 +0000 Subject: [PATCH 0081/1182] add pandoc dependencies to README --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 6839737c9..dc703f004 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,17 @@ create a new lesson: 8. Push your changes to GitHub for viewing. 9. Tell us where your lesson is so that we can use it and help you improve it. +### Dependencies + +1. [Install Pandoc]http://www.johnmacfarlane.net/pandoc/installing.html) + +2. Install pandocfilters, a python module that helps with writing + filters for pandoc: + + ~~~ + pip install pandocfilters + ~~~ + ## Why Use a Template? We organize our lessons in a standard way so that: From af9bc5fe8ec4f41e7293482fbd6e927a42e972e1 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 13 Nov 2014 06:11:41 -0800 Subject: [PATCH 0082/1182] Bringing README and example files into line, and updating Makefile to match templates --- README.md | 112 +++++++++++++++++++++++++++++++++---------- pages/01-one.md | 10 ++-- pages/02-two.md | 10 ++-- pages/Makefile | 13 +++-- pages/index.md | 14 +++--- pages/instructors.md | 34 ++++++++----- pages/reference.md | 4 +- 7 files changed, 139 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index dc703f004..167aed003 100644 --- a/README.md +++ b/README.md @@ -30,20 +30,19 @@ create a new lesson: We organize our lessons in a standard way so that: -1. It's easy to find things in lessons written by different people. +1. To give guidance to people who aren't experienced instructional + designers. Requiring learning objectives, challenges, and a short + glossary tells people what they ought to create. -2. People using lessons written by different people can easily given +2. It's easy to find things in lessons written by different people. + +3. People using lessons written by different people can easily given them the same look and feel. -3. Contributors know where to put things when they are extending or +4. Contributors know where to put things when they are extending or modifying lessons. -4. Content can be checked mechanically. - -Most importantly, this template gives guidance to people who aren't -experienced instructional designers. Requiring learning objectives, -challenges, and a short glossary tells people what they ought to -create. +5. Content can be checked mechanically. Instead of putting the whole lesson in one page, authors should create one short page per topic. Each topic should take 10-15 minutes to @@ -66,6 +65,9 @@ Along with the lesson materials themselves, each lesson must contain: help learners, but also to help lesson authors summarize what the lesson actually covers. +* A *discussion page* that mentions more advanced ideas and tells + learners where to go next. + * An *instructor's guide* that presents the lesson's legend (or back story), summarizes our experiences with the lesson, and discusses solutions to the challenge exercises. We ask everyone who teaches @@ -255,9 +257,19 @@ contain: syntax, etc., that can be printed and given to learners. See "Reference Guide" below. -6. `instructors.md`: the instructor's guide for the lesson. See +6. `discussion.md`: notes about more advanced ideas that would + distract from the main lesson, and pointers to where to go next. + See "Discussion Page" below. + +7. `instructors.md`: the instructor's guide for the lesson. See "Instructor's Guide" below. +Note that the lesson's title is repeated in several files. We could +put this in the Makefile, and insert it into pages when compiling, but +then authors would have to edit the Makefile (which we're trying to +avoid requiring). We could also put it in some sort of configuration +file, but again, we're trying to avoid those. + ### Home Page `index.md` must be structured as follows: @@ -265,7 +277,6 @@ contain: --- layout: lesson title: Lesson Title - keywords: ["some", "key terms", "in a list"] --- Paragraph(s) of introductory material. @@ -275,13 +286,15 @@ contain: ## Topics - * [Topic Title 1](01-slug.html) - * [Topic Title 2](02-slug.html) + 1. [Topic Title 1](01-slug.html) + 2. [Topic Title 2](02-slug.html) ## Other Resources - * [Reference Guide](reference.html) - * [Instructor's Guide](guide.html) + * [Motivation](motivation.html) + * [Reference Guide](reference.html) + * [Next Steps](discussion.html) + * [Instructor's Guide](instructors.html) **Notes:** @@ -300,16 +313,18 @@ contain: Each topic page must be structured as follows: --- - layout: topic - title: Topic Title - minutes: MM + layout: page + title: Lesson Title + subtitle: Topic Title + minutes: 10 --- > ## Learning Objectives {.objectives} > > * Learning objective 1 > * Learning objective 2 - Paragraphs of text mixed with: + Paragraphs of text --- possibly including **definitions** --- + mixed with: ~~~ {.python} some code: @@ -355,15 +370,37 @@ Each topic page must be structured as follows: 3. Every challenge should relate explicitly back to a learning objective. +4. Definitions of terms are marked in **bold** (like `**this**`). + ### Motivational Slides Every lesson must include a short slide deck suitable for a short presentation (3 minutes or less) that the instructor can use to explain -to learners how knowing the subject will help them. +to learners how knowing the subject will help them. The slides must +be laid out like this: + + --- + layout: slides + title: Why Make? + --- +
+ ## Why This Topic? +
+ +
+ ## Some Other Point +
+ **Notes:** -1. *We will flesh this out and provide an example.* +1. This is the one place where we *must* use HTML tags in our Markdown + (to delimit slides). Everything inside the section markers should + be Markdown if possible. + +2. We use [deck.js](http://imakewebthings.com/deck.js/) for our slides + as it is simpler and prettier than alternatives like + [reveal.js](http://lab.hakim.se/reveal-js/). ### Reference Guide @@ -376,7 +413,9 @@ The last section of the reference guide must be a glossary laid out as a definition list: --- - layout: reference + layout: page + title: Lesson Title + subtitle: Reference --- ...commands and examples... @@ -388,6 +427,21 @@ a definition list: Key Word 2 : Definition of second term +### Discussion Page + +The discussion page + + --- + layout: page + title: Lesson Title + subtitle: Discussion + --- + * First point of general discussion. + + This may span several paragraphs. + + * Second point of general discussion. + ### Instructor's Guide Learners may go through lessons outside of class, so it seems best to @@ -395,20 +449,25 @@ keep material for instructors in a separate document, rather than interleaved in the lesson itself. Its structure is: --- - layout: guide + layout: page + title: Automating Tasks with Make + subtitle: Instructor's Guide --- - ## Overall + ## Legend - One or more paragraphs laying out the lesson's legend. + One or more paragraphs laying out the lesson's legend (i.e., the story + behind its running example). - ## General Points + ## Overall * Point + * Point ## [Topic Title 1](01-slug.html) * Point + * Point 1. Discussion of first challenge. @@ -418,6 +477,7 @@ interleaved in the lesson itself. Its structure is: ## [Topic Title 2](02-slug.html) * Point + * Point 1. Discussion of first challenge. diff --git a/pages/01-one.md b/pages/01-one.md index 2e43c2fb7..9857e5061 100644 --- a/pages/01-one.md +++ b/pages/01-one.md @@ -1,14 +1,16 @@ --- -layout: topic -title: Topic One -minutes: 30 +layout: page +title: Lesson Title +subtitle: Topic Title One +minutes: 10 --- > ## Learning Objectives {.objectives} > > * Learning objective 1 > * Learning objective 2 -Paragraphs of text mixed with: +Paragraphs of text --- possibly including **definitions** --- +mixed with: ~~~ {.python} some code: diff --git a/pages/02-two.md b/pages/02-two.md index b5097ac25..b3fdb641a 100644 --- a/pages/02-two.md +++ b/pages/02-two.md @@ -1,14 +1,16 @@ --- -layout: topic -title: Topic Two -minutes: 45 +layout: page +title: Lesson Title +subtitle: Topic Title Two +minutes: 10 --- > ## Learning Objectives {.objectives} > > * Learning objective 1 > * Learning objective 2 -Paragraphs of text mixed with: +Paragraphs of text --- possibly including **definitions** --- +mixed with: ~~~ {.python} some code: diff --git a/pages/Makefile b/pages/Makefile index a2f884b6c..0d998f4eb 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -13,22 +13,21 @@ INCLUDES = \ -Vfooter="$$(cat ../_includes/footer.html)" \ -Vjavascript="$$(cat ../_includes/javascript.html)" -# Make sure everything is built. +# Default action is to show what commands are available. all : commands ## preview : Build website locally for checking. preview : $(DST_PAGES) -# Pattern to build slides. -$(DST_DIR)/motivation.html : $(SRC_DIR)/motivation.md +# Pattern for slides (different parameters and template). +$(DST_DIR)/motivation.html : $(SRC_DIR)/motivation.md ../_layouts/slides.html pandoc -s -t html \ --template=../_layouts/slides \ -o $@ $< # Pattern to build a generic page. -$(DST_DIR)/%.html : $(SRC_DIR)/%.md +$(DST_DIR)/%.html : $(SRC_DIR)/%.md ../_layouts/page.html pandoc -s -t html \ - --title-prefix='Software Carpentry' \ --template=../_layouts/page \ --filter=../tools/blockquote2div.py \ $(INCLUDES) \ @@ -59,3 +58,7 @@ settings : ## clean : Clean up temporary and intermediate files. clean : @rm -rf $$(find .. -name '*~' -print) + +## sterile : Remove generated HTML. +sterile : + @rm -f $(DST_PAGES) diff --git a/pages/index.md b/pages/index.md index 96debbb68..2de2dce6e 100644 --- a/pages/index.md +++ b/pages/index.md @@ -1,7 +1,6 @@ --- -layout: lesson +layout: page title: Lesson Title -keywords: ["some", "key terms", "in a list"] --- Paragraph of introductory material. @@ -12,11 +11,12 @@ Paragraph of introductory material. ## Topics -* [Topic Title 1](01-one.html) -* [Topic Title 2](02-two.html) +* [Topic Title 1](01-one.html) +* [Topic Title 2](02-two.html) ## Other Resources -* [Motivation](motivation.html) -* [Reference Guide](reference.html) -* [Instructor's Guide](instructors.html) +* [Motivation](motivation.html) +* [Reference Guide](reference.html) +* [Next Steps](discussion.html) +* [Instructor's Guide](instructors.html) diff --git a/pages/instructors.md b/pages/instructors.md index 5b142f2c0..739f572a0 100644 --- a/pages/instructors.md +++ b/pages/instructors.md @@ -1,26 +1,38 @@ --- -layout: lesson -title: Instructor's Guide +layout: page +title: Lesson Title +subtitle: Instructor's Guide --- -## Overall +## Legend -One or more paragraphs laying out the lesson's legend. +One or more paragraphs laying out the lesson's legend (i.e., the story +behind its running example). -## General Points +## Overall -* Point -* Point +* FIXME -## Topic One +* FIXME + +## [Topic Title One](01-one.html) * Point + * Point + * Be sure to describe what learners are expected to do during the topic (watch, type along, pair program, etc.) -## Topic Two +1. Discussion of first challenge. + +2. Discussion of second challenge. + +## [Topic Title Two](02-two.html) * Point + * Point -* Be sure to describe what learners are expected to do during the - topic (watch, type along, pair program, etc.) + +1. Discussion of first challenge. + +2. Discussion of second challenge. diff --git a/pages/reference.md b/pages/reference.md index 5669b1813..abd8dc089 100644 --- a/pages/reference.md +++ b/pages/reference.md @@ -1,5 +1,7 @@ --- -layout: reference +layout: page +title: Lesson Title +subtitle: Reference --- ...commands and examples... From 3129d24c2a0b8615023085e276e43b7ff716ad76 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 13 Nov 2014 06:12:16 -0800 Subject: [PATCH 0083/1182] Subtitling page layout --- _layouts/page.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_layouts/page.html b/_layouts/page.html index fade22fda..0035fb4a7 100644 --- a/_layouts/page.html +++ b/_layouts/page.html @@ -3,7 +3,7 @@ - $if(title-prefix)$$title-prefix$ - $endif$$pagetitle$ + Software Carpentry: $pagetitle$ $header$ @@ -11,7 +11,8 @@ $banner$
- $if(title)$

$title$

$endif$ +

$title$

+ $if(subtitle)$

$subtitle$

$endif$ $body$
From 6a0824e51c906fbb84b6f47757840905293ca3e0 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 13 Nov 2014 06:13:52 -0800 Subject: [PATCH 0084/1182] Adding discussion page --- pages/discussion.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 pages/discussion.md diff --git a/pages/discussion.md b/pages/discussion.md new file mode 100644 index 000000000..b0e8c331f --- /dev/null +++ b/pages/discussion.md @@ -0,0 +1,10 @@ +--- +layout: page +title: Lesson Title +subtitle: Discussion +--- +* First point of general discussion. + + This may span several paragraphs. + +* Second point of general discussion. From 33d223b613c90b0378ecf766313c7bca17e62aff Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 13 Nov 2014 06:46:57 -0800 Subject: [PATCH 0085/1182] Renaming `sterile` target in Makefile to `very-clean`. And taking it out of the auto-displayed list of available commands. --- pages/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Makefile b/pages/Makefile index 0d998f4eb..640e80264 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -59,6 +59,6 @@ settings : clean : @rm -rf $$(find .. -name '*~' -print) -## sterile : Remove generated HTML. -sterile : +# very-clean : Remove generated HTML. +very-clean : @rm -f $(DST_PAGES) From cf51ae01946ec753d63ff5bc9df95579e662d293 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 13 Nov 2014 12:14:19 -0800 Subject: [PATCH 0086/1182] Adding more detail to the setup instructions based on instructor feedback. 1. Moving the build steps up to the top of `README.md`. 2. Removed the misleading target to run the checking tool (since the tool doesn't actually work). --- README.md | 98 +++++++++++++++++++++++++++++++++++++++++--------- pages/Makefile | 6 ---- 2 files changed, 82 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 167aed003..cfe31d644 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,97 @@ lesson-template =============== -This repository is the template for -[Software Carpentry](http://software-carpentry.org) lessons. To -create a new lesson: +This repository is the template for creating +[Software Carpentry](http://software-carpentry.org) lessons. Do *not* +fork this repository directly on GitHub. Instead, follow the +instructions below. -1. Create a new (empty) repository on GitHub. -2. Clone that empty repository to your desktop. -3. Create a `gh-pages` branch in that repository. -4. Add this repository as a remote called `template`. -5. Pull the content of this repository into your repository. -6. Create and edit files (explained below). -7. Run the validator to make sure everything is formatted correctly. -8. Push your changes to GitHub for viewing. -9. Tell us where your lesson is so that we can use it and help you improve it. +## Manual Setup -### Dependencies +We will assume that your user ID is `mcurie` and the name of your +lesson is `data-cleanup`. -1. [Install Pandoc]http://www.johnmacfarlane.net/pandoc/installing.html) +1. Create an empty repository on GitHub called `data-cleanup`. -2. Install pandocfilters, a python module that helps with writing - filters for pandoc: +2. Clone the template repository to your computer in a directory with + the same name as your lesson identifier: + + ~~~ + $ git clone -b gh-pages -o upstream https://github.com/swcarpentry/lesson-template.git data-cleanup + ~~~ + +3. Go into that directory using + + ~~~ + $ cd data-cleanup + ~~~ + +4. Add your GitHub repository as a remote called `origin` using + + ~~~ + $ git remote add origin https://github.com/mcurie/data-cleanup + ~~~ + +5. Create and edit files (explained below). + +6. Build the HTML pages for your lesson: + + ~~~ + $ cd data-cleanup/pages # or just 'cd pages' if you are already in data-cleanup + $ make preview + ~~~ + + Note that this step requires you to have installed Pandoc + (described below). Note also that it is *not* optional: you + *must* build the web pages for your lesson yourself and push + them to GitHub, rather than relying on GitHub to build them + for you. + +7. Commit your changes *and the HTML pages in the root directory of + your lesson repository* and push to the `gh-pages` branch of your + repository: + + ~~~ + $ cd data-cleanup # or 'cd ..' if you are in the 'pages' directory + $ git add pages/changed-files.md + $ git add *.html + $ git commit -m "Explanatory message" + $ git push origin gh-pages + ~~~ + +8. Tell us where your lesson is so that we can use it and help you improve it. + +Note that SSH cloning (as opposed to the HTTPS cloning used above) +will also work for those who have set up SSH keys with GitHub. + +## Dependencies + +Because people may choose to use the IPython Notebook, R Markdown, or +some other format for parts of their lessons, and because Jekyll (the +tool GitHub uses to build HTML pages) only supports an impoverished +form of Markdown, we require lesson authors to build the HTML pages +for their lessons on their machines with Pandoc and commit those to +the `gh-pages` branch of their lesson website. To do this: + +1. [Install Pandoc](http://www.johnmacfarlane.net/pandoc/installing.html) + +2. Install pandocfilters, a Python module that helps with writing + filters for Pandoc: ~~~ pip install pandocfilters ~~~ +3. To convert Markdown pages in the `pages` directory into HTML pages + in the root directory, go into the `pages` directory and run: + + ~~~ + $ make preview + ~~~ + + You can run `make` on its own to get a list of other things it will + do for you. + ## Why Use a Template? We organize our lessons in a standard way so that: diff --git a/pages/Makefile b/pages/Makefile index 640e80264..8e5057337 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -37,12 +37,6 @@ $(DST_DIR)/%.html : $(SRC_DIR)/%.md ../_layouts/page.html commands : Makefile @sed -n 's/^## //p' $< -## check : Check consistency. -# FIXME: should run a Python script to do the checking. -# Note: the line below breaks the keyword into two strings to avoid a false match on the command. -check : - @tools/check Makefile $(SRC_PAGES) - ## update : Update the shared files from the GitHub repo holding them. # FIXME: need to create that repo. update : From 6cd544e1f31e3a77ad40e8c98e2fee0205af5e3b Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 13 Nov 2014 13:14:48 -0800 Subject: [PATCH 0087/1182] Fixing typo in example file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 167aed003..11e8a4faa 100644 --- a/README.md +++ b/README.md @@ -450,7 +450,7 @@ interleaved in the lesson itself. Its structure is: --- layout: page - title: Automating Tasks with Make + title: Lesson Title subtitle: Instructor's Guide --- ## Legend From d79a278d8256532b8f3a0b1821e511d4e1ce0760 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Thu, 13 Nov 2014 19:28:48 -0200 Subject: [PATCH 0088/1182] Clean CSS file --- css/swc.css | 263 ++++++---------------------------------------------- 1 file changed, 27 insertions(+), 236 deletions(-) diff --git a/css/swc.css b/css/swc.css index 58d3702ce..e5e769c27 100644 --- a/css/swc.css +++ b/css/swc.css @@ -1,59 +1,3 @@ -/* Headings */ -h1, h2, h3, h4, h5, h6 { - color: rgb(03,03,03); -} - -h1, h2 { - margin-top: 40px; - margin-bottom: 10px; -} - -h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { - color: inherit; -} - -/* Chapter titles. */ -div.chapter h2 { - text-align: center; - font-style: italic; -} - -/* Objectives and key points */ -.objectives, .keypoints { - background-color: azure; -} - -/* Things to fix. */ -.fixme { - text-decoration: underline; - color: darkred; - background-color: lightgray; -} - -/* Putting shadows around things. */ -.shadow { - -moz-box-shadow: 0 0 30px 5px #999; - -webkit-box-shadow: 0 0 30px 5px #999; - box-shadow: 0 0 30px 5px #999; -} - -/* Things to understand (lead-in to sections in book). */ -.understand { - background-color: lightyellow; -} - -/* Block quotations. */ -blockquote { - margin: 1em; - padding: 1em 1em .5em 1em; - width: 90%; -} - -/* Citation for testimonial quote. */ -blockquote.testimonial cite { - font-style: italic; -} - /* Main body of pages. */ body { background: #BEC3C6; @@ -79,6 +23,10 @@ div.banner { border-bottom: 1px solid #A6A6A6; } +.swc-blue-bg { + background-color: #20267D; +} + /* Padding around image in top banner. */ div.banner a img { padding: 20px 25px; @@ -90,46 +38,6 @@ div.banner a img { } } -/* Explanatory call-out boxes. */ -div.box { - background-color: mistyrose; - display: block; - margin-left: auto; - margin-right: auto; - padding-top: 1px; - padding-bottom: 1px; - padding-left: 10px; - padding-right: 10px; - outline-color: gray; - outline-width: 1px; - outline-style: solid; -} -@media (max-width: 700px) { - div.box { - width: 80%; - } -} -@media (min-width: 700px) { - div.box { - width: 54em; - max-width: 80%; - } -} - -/* Level 2 headings inside pages. */ -div.content div h3 { - border-bottom: 1px solid #CCCCCC; - display: block; - font-family: Verdana,"BitStream vera Sans"; - margin-top: 10px; - padding: 0 5px 3px; -} - -/* PDF and slide files referenced from lectures. */ -div.files { - padding: 10px; -} - /* Footer of every page. */ div.footer { clear: both; @@ -139,111 +47,42 @@ div.footer { text-align: right; } -.swc-blue-bg { - background-color: #20267D; -} - -/* Main menu at the top of every page. */ -div.mainmenu { - clear: both; - background-color: #F4F4F4; - margin: 0px; - padding: 3px 0px 3px 25px; - border-bottom: 1px solid #A6A6A6; - height:30px -} - -#menubar { - float:left; - margin-top:4px; -} - -#searchbar { - float:right; - margin-right:20px; -} - -/* Narration for audio-only lectures. */ -div.narration { - text-align: center; - font-size: 2em; -} - -/* Table of contents. */ -div.toc { - /* No special styling yet. */ -} - -.transcript { - display: table; -} - -.transcript .media img { - border: 1px solid grey; +/* Headings */ +h1, h2, h3, h4, h5, h6 { + color: rgb(03,03,03); } - -/* Title styling */ h1.title { margin:40px 0px; border-bottom:1px solid #515151; } -/* YouTube video embed. */ -div.youtube { - text-align: center; - padding: 10px; -} - -/* Glossary description lists. */ -dl.gloss { - /* Empty for now. */ -} - -/* FIXME: shouldn't be using iframe's directly (EventBrite and YouTube should be via macro expansion). */ -iframe.youtube_player { - border : 0; - text-align : center; - width : 640px; - height : 500px; -} - -/* Amy Brown's logo in book/stylesheet.html. */ -img.logoARB { - float: right; -} - -/* Person's name in team.html. */ -span.person { - font-weight: bold; - font-style: italic; -} - -/* Bibliography book covers. */ -img.book-cover { - width: 80px; +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; } -/* Blog calendar table in blog/index.html. */ -table.blogcalendar th { - text-align : right; - font-weight : bold; +/* Objectives and key points */ +.objectives, .keypoints { + background-color: azure; } -/* See above. */ -table.blogcalendar th.left { - text-align : left; +/* Things to fix. */ +.fixme { + text-decoration: underline; + color: darkred; + background-color: lightgray; } -/* See above. */ -table.blogcalendar tr td { - text-align : right; +/* Things to understand (lead-in to sections in book). */ +.understand { + background-color: lightyellow; } -/* Blog index tables in blog/index.html. */ -table.blogindex td.date { - text-align: left ; - width:10em; +/* Block quotations. */ +blockquote { + margin: 1em; + padding: 1em 1em .5em 1em; + width: 90%; } /* Tables used for displaying choices in challenges. */ @@ -256,54 +95,6 @@ table.outlined { border-collapse: collapse; } -/* Container for content in the workshop index page */ -div.workshops { - text-align: center; -} - -/* Link items (to workshop pages) in the workshops tables */ -table.workshops td.link { - width: 50%; - text-align: left; -} - -/* Spacer items (i.e. ellipsis) on the workshops tables */ -table.workshops td.spacer { - max-width: 100%; - text-align: center; -} - -/* Date columns on the workshops tables */ -table.workshops td.date { - width: 50%; - text-align: right; -} - -/* Badge modal dialog */ -#assertion-modal { - width:700px; - margin-left:-350px; -} -#assertion-modal iframe { - background-color: transparent; - border: 0px none transparent; - padding: 0px; - width: 100%; - height: 20em; -} - -#assertion-model img.badge { - position: absolute; - right: 15px; - bottom: 35px; - opacity: 0.5; -} - -/* list with checkbox as bullet */ -ul.checklist { - list-style-image: url('/img/checkbox.png'); -} - /* Printing */ @media print { h1 { @@ -403,8 +194,8 @@ code { border-top-color: #ffffff; border-bottom-color: #ffffff; } -/* GitHub Ribbon */ +/* GitHub Ribbon */ #github-ribbon a { background: #000; color: #fff; @@ -440,8 +231,8 @@ code { bottom: 1px; top: auto; } -/* github ribbon breaking point */ +/* GitHub ribbon breaking point */ @media screen and (min-width: 600px) { .navbar .btn-navbar { margin-right: 150px; From 4b841b342ec20c528b08c4e7c57b20ada4b20be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Fri, 14 Nov 2014 13:38:43 +1300 Subject: [PATCH 0089/1182] Blockquote margins --- css/swc.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/css/swc.css b/css/swc.css index 58d3702ce..f6cdc874f 100644 --- a/css/swc.css +++ b/css/swc.css @@ -45,7 +45,7 @@ div.chapter h2 { /* Block quotations. */ blockquote { margin: 1em; - padding: 1em 1em .5em 1em; + padding: .7em; width: 90%; } @@ -349,6 +349,11 @@ blockquote p { font-weight: inherit; line-height: inherit; } + +blockquote h2{ + margin-top: 0px; +} + /* readability: darken the alert colour for contrast with background */ .alert { From c00387fdda4a28089b6b0d6273fadf4874491e0a Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Fri, 14 Nov 2014 03:30:41 -0800 Subject: [PATCH 0090/1182] Using an enumerated list for the table of contents --- pages/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/index.md b/pages/index.md index 2de2dce6e..55a249a16 100644 --- a/pages/index.md +++ b/pages/index.md @@ -11,8 +11,8 @@ Paragraph of introductory material. ## Topics -* [Topic Title 1](01-one.html) -* [Topic Title 2](02-two.html) +1. [Topic Title 1](01-one.html) +2. [Topic Title 2](02-two.html) ## Other Resources From 4ab43b32f920e5f9d04a3eda6061be384bcf373f Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Fri, 14 Nov 2014 04:06:35 -0800 Subject: [PATCH 0091/1182] Bringing example file containing glossary in line with README --- pages/reference.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/reference.md b/pages/reference.md index abd8dc089..fe72b8d9e 100644 --- a/pages/reference.md +++ b/pages/reference.md @@ -7,8 +7,8 @@ subtitle: Reference ## Glossary -> **Key Word 1**: the definition -> relevant to the lesson. +Key Word 1 +: Definition of first term -> **Key Word 2**: the definition -> relevant to the lesson. +Key Word 2 +: Definition of second term From b90e916df4e87b0a8ceba14474d2d6f821a7e8db Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Thu, 13 Nov 2014 12:20:24 -0200 Subject: [PATCH 0092/1182] Add small script to setup label in lesson repo The script make easy to create the labels and keep it compatible across repositories. --- tools/setup-labels | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 tools/setup-labels diff --git a/tools/setup-labels b/tools/setup-labels new file mode 100755 index 000000000..f0b5af747 --- /dev/null +++ b/tools/setup-labels @@ -0,0 +1,26 @@ +#!/bin/bash +# +# This script setup the labels of your GitHub repository. +# +# Syntax: +# +# $ tools/setup-label owner repo + +owner=$1 +repo=$2 +labels_and_colors="{\"name\":\"getting-started\",\"color\":\"fbca04\"} {\"name\":\"work-in-progress\",\"color\":\"f7c6c7\"} {\"name\":\"discussion\",\"color\":\"5319e7\"}" + +echo "Before setup the labels for http://github.com/${owner}/${repo}" +echo "you must provide some informations." +echo "Your GitHub username:" +read username +echo "Your GitHub password:" +read -s password + +for tuple in ${labels_and_colors} +do + curl -X POST \ + -u ${username}:${password} \ + -d "${tuple}" \ + "https://api.github.com/repos/${owner}/${repo}/labels" +done From f3c7873dd8e3b9fb4eebefe3f5ea9187c25943bf Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Thu, 13 Nov 2014 18:44:04 -0200 Subject: [PATCH 0093/1182] Improve script to setup labels Address @gvwilson comments: - add an example - variables in the shell are UPPER_CASED - Check that repository exists using a HEAD --- tools/setup-labels | 58 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/tools/setup-labels b/tools/setup-labels index f0b5af747..ae76cb183 100755 --- a/tools/setup-labels +++ b/tools/setup-labels @@ -1,26 +1,54 @@ #!/bin/bash # -# This script setup the labels of your GitHub repository. -# -# Syntax: -# -# $ tools/setup-label owner repo +## This script sets up labels for issues in your GitHub repository. +## +## Syntax: +## +## $ tools/setup-label OWNER REPO +## +## Parameters: +## +## - OWNER: GitHub username of the owner of the repository +## - REPO: the name of the repository +## +## Example: +## +## For set up the labels at https://github.com/wking/swc-modular-shell use +## +## $ tools/setup-label wking swc-modular-shell + +if test $# -lt 2 +then + echo "Missing parameters." + echo + grep '^##' tools/setup-labels | sed 's/## //' | sed 's/##//' + exit 1 +fi + +OWNER=$1 +REPO=$2 +LABELS_AND_COLORS="{\"name\":\"getting-started\",\"color\":\"fbca04\"} {\"name\":\"work-in-progress\",\"color\":\"f7c6c7\"} {\"name\":\"discussion\",\"color\":\"5319e7\"}" -owner=$1 -repo=$2 -labels_and_colors="{\"name\":\"getting-started\",\"color\":\"fbca04\"} {\"name\":\"work-in-progress\",\"color\":\"f7c6c7\"} {\"name\":\"discussion\",\"color\":\"5319e7\"}" +# Test if repository exists +curl -s --head https://github.com/${OWNER}/${REPO} | head -n 1 | grep -q "HTTP/1.[01] [23].." +if test $? -ne 0 +then + echo "ERROR: this repository doesn't exist" + exit $? +fi -echo "Before setup the labels for http://github.com/${owner}/${repo}" +echo "Before setup the labels for http://github.com/${OWNER}/${REPO}" echo "you must provide some informations." echo "Your GitHub username:" -read username +read USERNAME echo "Your GitHub password:" -read -s password +read -s PASSWORD -for tuple in ${labels_and_colors} +# Create labels +for TUPLE in ${LABELS_AND_COLORS} do curl -X POST \ - -u ${username}:${password} \ - -d "${tuple}" \ - "https://api.github.com/repos/${owner}/${repo}/labels" + -u ${USERNAME}:${PASSWORD} \ + -d "${TUPLE}" \ + "https://api.github.com/repos/${OWNER}/${REPO}/labels" done From d872877abc9dd2619d8e4b7dc9424b5ca26e7b51 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 14 Nov 2014 11:25:45 -0200 Subject: [PATCH 0094/1182] Avoid JSON outup from setup-labels As requested by @gvwilson, don't print the JSON response from GitHub. Others changes: - Use arrays to store the label and its color - Print message if fail --- tools/setup-labels | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/tools/setup-labels b/tools/setup-labels index ae76cb183..0f4ca6b1e 100755 --- a/tools/setup-labels +++ b/tools/setup-labels @@ -27,17 +27,19 @@ fi OWNER=$1 REPO=$2 -LABELS_AND_COLORS="{\"name\":\"getting-started\",\"color\":\"fbca04\"} {\"name\":\"work-in-progress\",\"color\":\"f7c6c7\"} {\"name\":\"discussion\",\"color\":\"5319e7\"}" +GITHUB_URL=https://github.com/${OWNER}/${REPO} +LABELS=(getting-started working-in-progress discussion) +COLORS=(fbca04 f7c6c7 5319e7) # Test if repository exists -curl -s --head https://github.com/${OWNER}/${REPO} | head -n 1 | grep -q "HTTP/1.[01] [23].." +curl -s --head ${GITHUB_URL} | head -n 1 | grep -q "HTTP/1.[01] [23].." if test $? -ne 0 then echo "ERROR: this repository doesn't exist" exit $? fi -echo "Before setup the labels for http://github.com/${OWNER}/${REPO}" +echo "Before setup the labels for ${GITHUB_URL}" echo "you must provide some informations." echo "Your GitHub username:" read USERNAME @@ -45,10 +47,21 @@ echo "Your GitHub password:" read -s PASSWORD # Create labels -for TUPLE in ${LABELS_AND_COLORS} +for INDEX in $(seq 1 ${#LABELS[*]}) do - curl -X POST \ + curl -s -f -X POST \ -u ${USERNAME}:${PASSWORD} \ - -d "${TUPLE}" \ - "https://api.github.com/repos/${OWNER}/${REPO}/labels" + -d "{\"name\":\"${LABELS[${INDEX}]}\",\"color\":\"${COLORS[${INDEX}]}\"}" \ + "https://api.github.com/repos/${OWNER}/${REPO}/labels" > /dev/null + if test $? -ne 0 + then + echo "Failed when trying to create the label ${LABELS[${INDEX}]}." + echo "Probably the label ${LABELS[${INDEX}]} already exists." + echo "Please check at ${GITHUB_URL}/labels or run" + echo + echo " $ curl -X POST -u ${USERNAME} -d \"{\"name\":\"${LABELS[${INDEX}]}\",\"color\":\"${COLORS[${INDEX}]}\"}\" \"https://api.github.com/repos/${OWNER}/${REPO}/labels\"" + echo + echo "to get more information of the error. If you find a bug" + echo "report it at https://github.com/swcarpentry/lesson-template/." + fi done From f0cfabbe80dceb73a8ad1afa5051e425d05d54ce Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 14 Nov 2014 19:13:16 -0200 Subject: [PATCH 0095/1182] Add prototype of check --- tools/check | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/tools/check b/tools/check index e750ec763..cc41c39a4 100755 --- a/tools/check +++ b/tools/check @@ -1,6 +1,122 @@ -#!/usr/bin/env bash +#!/usr/bin/python +# +# Software Carpentry Lesson Validator +# +# Check for errors at Software Carpentry lessons. +# +# Usage: +# +# $ tools/check -# Placeholder for actual conformance checking script (which will -# probably be Python, not Bash). +import os +import os.path +import re -grep -i -n 'FIX''ME' $* +import yaml + +def report_error(file_path, line_number, line, error_message): + print("Error at line {} of {}:\n\t{}\n{}".format(line_number, + file_path, line, error_message)) + +def report_missing(file_path, missing_element): + print("Error on {}: missing {}".format(file_path, missing_element)) + +def report_missing_metadata(missing_element): + print("Error on YAML header: missing {}".format(missing_element)) + +def report_broken_link(file_path, line_number, link): + print("Broken link at line {} of {}:\n\tCan't find {}.".format(line_number, + file_path, link)) + +def check_yaml(metadata, skip=[]): + """ + Check if all metadata are present at YAML header. + + :param skip: list of keys to skip check + """ + metadata_required = ["layout", "title", "minutes"] + for key in metadata_required: + if key not in skip and key not in metadata: + report_missing_metadata(key) + +def check_lesson(file_path): + pass + +def check_discussion(file_path): + pass + +def check_index(file_path): + # State variables + in_yaml = False + yaml_metadata = [] + has_prerequisites = False + has_topics = False + has_other_resources = False + + # Load file and process it + with open(file_path, 'r') as lines: + for line_number, line in enumerate(lines): + if re.match('---', line): + in_yaml = not in_yaml + elif in_yaml: + yaml_metadata.append(line) + elif re.match('> ## Prerequisites', line): + has_prerequisites = True + elif re.match('## Topics', line): + has_topics = True + elif re.match('## Other Resources', line): + has_other_resources = True + else: + # Check if local links are valid + matches = re.search('\[.*\]\((?P.*)\)', line) + if matches and not matches.group("link").startswith("http"): + link = os.path.join(os.path.dirname(file_path), + matches.group("link")) + if link.endswith(".html"): + link = link.replace("html", "md") + if not os.path.exists(link): + report_broken_link(file_path, line_number, link) + + # Check YAML + yaml_metadata = yaml.load('\n'.join(yaml_metadata)) + check_yaml(yaml_metadata, ["minutes"]) + + # Check sections + if not has_prerequisites: + report_missing(file_path, "Prerequisites") + if not has_topics: + report_missing(file_path, "Topics") + if not has_other_resources: + report_missing(file_path, "Other Resources") + +def check_intructors(file_path): + pass + +def check_motivation(file_path): + pass + +def check_reference(file_path): + pass + +def check_file(file_path): + if re.search('[0-9]{2}-.*', file_path): + check_lesson(file_path) + elif re.search('discussion', file_path): + check_discussion(file_path) + elif re.search('index', file_path): + check_index(file_path) + elif re.search('instructors', file_path): + check_intructors(file_path) + elif re.search("motivation", file_path): + check_motivation(file_path) + elif re.search("reference", file_path): + check_reference(file_path) + +def main(): + lessons_file = os.listdir("pages") + for lesson in lessons_file: + if lesson.endswith('.md'): + check_file('pages/{}'.format(lesson)) + +if __name__ == "__main__": + main() From 80b443472a6eb12a761ff57d5e788661a230977c Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sat, 15 Nov 2014 06:33:34 -0600 Subject: [PATCH 0096/1182] Fixes and suggestions --- tools/check | 130 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 86 insertions(+), 44 deletions(-) diff --git a/tools/check b/tools/check index cc41c39a4..8f3241cf7 100755 --- a/tools/check +++ b/tools/check @@ -9,43 +9,69 @@ # $ tools/check import os -import os.path import re - import yaml -def report_error(file_path, line_number, line, error_message): - print("Error at line {} of {}:\n\t{}\n{}".format(line_number, - file_path, line, error_message)) +#---------------------------------------- +# Error reporting. -def report_missing(file_path, missing_element): - print("Error on {}: missing {}".format(file_path, missing_element)) +def report_error(file_path, line_number, line, error_message): + ''' + FIXME: docstring. + ''' + ERR_MSG = "Error at line {} of {}:\n\t{}\n{}" + print(ERR_MSG.format(line_number, file_path, line, error_message)) + +def report_missing(present, file_path, missing_element): + ''' + FIXME: docstring. + ''' + ERR_MSG = "Error on {}: missing {}" + if not present: + print(ERR_MSG.format(file_path, missing_element)) def report_missing_metadata(missing_element): - print("Error on YAML header: missing {}".format(missing_element)) + ''' + FIXME: docstring. + ''' + ERR_MSG = "Error on YAML header: missing {}" + print(ERR_MSG.format(missing_element)) def report_broken_link(file_path, line_number, link): - print("Broken link at line {} of {}:\n\tCan't find {}.".format(line_number, - file_path, link)) + ''' + FIXME: docstring. + ''' + ERR_MSG = "Broken link at line {} of {}:\n\tCan't find {}." + print(ERR_MSG.format(line_number, file_path, link)) -def check_yaml(metadata, skip=[]): +#---------------------------------------- +# Checking. + +def check_yaml(metadata): """ Check if all metadata are present at YAML header. - - :param skip: list of keys to skip check """ - metadata_required = ["layout", "title", "minutes"] - for key in metadata_required: - if key not in skip and key not in metadata: - report_missing_metadata(key) + METADATA_REQUIRED = {"layout", "title", "minutes"} + for key in METADATA_REQUIRED - set(metadata.keys()): + report_missing_metadata(key) def check_lesson(file_path): + ''' + FIXME: docstring telling people what you want them to write here. + ''' pass def check_discussion(file_path): + ''' + FIXME: docstring telling people what you want them to write here. + ''' pass def check_index(file_path): + ''' + FIXME: docstring. + And break this up into pieces -- it's too long. + ''' # State variables in_yaml = False yaml_metadata = [] @@ -56,66 +82,82 @@ def check_index(file_path): # Load file and process it with open(file_path, 'r') as lines: for line_number, line in enumerate(lines): - if re.match('---', line): + if re.match('---', line): # what if there are multiple YAML blocks?? in_yaml = not in_yaml elif in_yaml: yaml_metadata.append(line) - elif re.match('> ## Prerequisites', line): + elif re.match('> ## Prerequisites', line): # check this in the Markdown or in the generated HTML? has_prerequisites = True - elif re.match('## Topics', line): + elif re.match('## Topics', line): # as above? has_topics = True - elif re.match('## Other Resources', line): + elif re.match('## Other Resources', line): # as above has_other_resources = True else: + ## Push this check into another function - this one is getting too long. # Check if local links are valid matches = re.search('\[.*\]\((?P.*)\)', line) if matches and not matches.group("link").startswith("http"): - link = os.path.join(os.path.dirname(file_path), - matches.group("link")) + link = os.path.join(os.path.dirname(file_path), matches.group("link")) if link.endswith(".html"): - link = link.replace("html", "md") + link = link.replace("html", "md") # NO: what about '03-html-editing.html' ? if not os.path.exists(link): report_broken_link(file_path, line_number, link) + ## Again, this function is too long - break it into sub-functions. # Check YAML yaml_metadata = yaml.load('\n'.join(yaml_metadata)) - check_yaml(yaml_metadata, ["minutes"]) + check_yaml(yaml_metadata, {"minutes"}) # Check sections - if not has_prerequisites: - report_missing(file_path, "Prerequisites") - if not has_topics: - report_missing(file_path, "Topics") - if not has_other_resources: - report_missing(file_path, "Other Resources") + ## Note the refactoring: replaces three conditionals with one. + report_missing(has_prerequisites, file_path, "Prerequisites") + report_missing(has_topics, file_path, "Topics") + report_missing(has_other_resources, file_path, "Other Resources") def check_intructors(file_path): + ''' + FIXME: docstring telling people what you want them to write here. + ''' pass def check_motivation(file_path): + ''' + FIXME: docstring telling people what you want them to write here. + ''' pass def check_reference(file_path): + ''' + FIXME: docstring telling people what you want them to write here. + ''' pass def check_file(file_path): - if re.search('[0-9]{2}-.*', file_path): - check_lesson(file_path) - elif re.search('discussion', file_path): - check_discussion(file_path) - elif re.search('index', file_path): - check_index(file_path) - elif re.search('instructors', file_path): - check_intructors(file_path) - elif re.search("motivation", file_path): - check_motivation(file_path) - elif re.search("reference", file_path): - check_reference(file_path) - + ''' + FIXME: docstring telling people what you want them to write here. + ''' + ## Functions are objects, and so can be put in tables like the one below. + CONTROL = ( + ('[0-9]{2}-.*', check_lesson), + ('discussion', check_discussion), + ('index', check_index), + ('instructors', check_intructors), + ("motivation", check_motivation), + ("reference", check_reference) + ) + for (pattern, checker) in CONTROL: + if re.search(pattern, file_path): + checker(file_path) + +## main doesn't take sys.argv[1:] or the like? Will help with testing... def main(): + ''' + FIXME: docstring telling people what you want them to write here. + ''' lessons_file = os.listdir("pages") for lesson in lessons_file: if lesson.endswith('.md'): + ## Why not os.path.join('pages', lesson) ? check_file('pages/{}'.format(lesson)) if __name__ == "__main__": From 8a83160872dc2ddf2eec58bf9b51bcd2a124335f Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sat, 15 Nov 2014 14:22:49 -0600 Subject: [PATCH 0097/1182] Changing sed command used to display help from Makefile. As per https://github.com/swcarpentry/workshop-template/pull/53, this PR is more selective about what it does and doesn't print. --- pages/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Makefile b/pages/Makefile index 8e5057337..8939a6497 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -35,7 +35,7 @@ $(DST_DIR)/%.html : $(SRC_DIR)/%.md ../_layouts/page.html ## commands : Display available commands. commands : Makefile - @sed -n 's/^## //p' $< + @sed -n 's/^##//p' $< ## update : Update the shared files from the GitHub repo holding them. # FIXME: need to create that repo. From d03425bafac8cb6ebbcb008a46bd6e9d15742999 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 16 Nov 2014 09:51:03 -0200 Subject: [PATCH 0098/1182] Remove border bottom from title --- css/swc.css | 1 - 1 file changed, 1 deletion(-) diff --git a/css/swc.css b/css/swc.css index e5e769c27..27ca4ff63 100644 --- a/css/swc.css +++ b/css/swc.css @@ -54,7 +54,6 @@ h1, h2, h3, h4, h5, h6 { h1.title { margin:40px 0px; - border-bottom:1px solid #515151; } h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { From 4744316a29e0d747d01fafa4049e4fbb2984262f Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 16 Nov 2014 11:03:14 -0200 Subject: [PATCH 0099/1182] Set up code color --- css/swc.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/css/swc.css b/css/swc.css index e5e769c27..10477278e 100644 --- a/css/swc.css +++ b/css/swc.css @@ -95,6 +95,17 @@ table.outlined { border-collapse: collapse; } +/* Code sample */ +pre.sourceCode{ + color: ForestGreen; +} +pre.output { + color: MediumBlue; +} +pre.error { + color: Red; +} + /* Printing */ @media print { h1 { From e386ccd9739188f5fef00a663d28f7fd6a401a9b Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 16 Nov 2014 11:53:38 -0200 Subject: [PATCH 0100/1182] Improve callout box and "learning objectives" box. --- css/swc.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/css/swc.css b/css/swc.css index e5e769c27..61b419eac 100644 --- a/css/swc.css +++ b/css/swc.css @@ -64,6 +64,9 @@ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { /* Objectives and key points */ .objectives, .keypoints { background-color: azure; + border: 5px solid azure; + margin: 1em 0; + padding: 0em 1em; } /* Things to fix. */ @@ -85,6 +88,14 @@ blockquote { width: 90%; } +/* Callout Box */ +.callout { + background-color: #EEE; + border: 5px solid #EEE; + margin: 1em 0; + padding: 0em 1em; +} + /* Tables used for displaying choices in challenges. */ table.choices tr td { vertical-align : top; From df30e97ca64ff9f1acd7a6410d679847b35e73fb Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 16 Nov 2014 12:58:25 -0200 Subject: [PATCH 0101/1182] Fix template layout The body variable at Pandoc template **must** not be indented because the indentation will propagate into the HTML. Example: $ cat page.html $body$ $ pandoc -s -t html --template=page -o sample.html sample.md $ cat sample.html
def foo():
            return None
Solution: $ cat fix.html $body$ $ pandoc -s -t html --template=fix -o sample-fix.html sample.md $ cat sample-fix.html
def foo():
        return None
--- _layouts/page.html | 2 +- _layouts/slides.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/page.html b/_layouts/page.html index 0035fb4a7..6607cab01 100644 --- a/_layouts/page.html +++ b/_layouts/page.html @@ -13,7 +13,7 @@

$title$

$if(subtitle)$

$subtitle$

$endif$ - $body$ +$body$
$footer$ diff --git a/_layouts/slides.html b/_layouts/slides.html index 581bc990d..61718627f 100644 --- a/_layouts/slides.html +++ b/_layouts/slides.html @@ -33,7 +33,7 @@
- $body$ +$body$ From 9f8d3e5e2ff11501cb5c50a9f110f134baac9d0d Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 16 Nov 2014 16:04:25 -0200 Subject: [PATCH 0102/1182] Add docstrings and others small fixes. --- tools/check | 167 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 108 insertions(+), 59 deletions(-) diff --git a/tools/check b/tools/check index 8f3241cf7..cef91e443 100755 --- a/tools/check +++ b/tools/check @@ -10,37 +10,39 @@ import os import re +import sys + import yaml #---------------------------------------- # Error reporting. def report_error(file_path, line_number, line, error_message): - ''' - FIXME: docstring. - ''' + """ + Print information about general error. + """ ERR_MSG = "Error at line {} of {}:\n\t{}\n{}" print(ERR_MSG.format(line_number, file_path, line, error_message)) def report_missing(present, file_path, missing_element): - ''' - FIXME: docstring. - ''' + """ + Print information about missing element. + """ ERR_MSG = "Error on {}: missing {}" if not present: print(ERR_MSG.format(file_path, missing_element)) def report_missing_metadata(missing_element): - ''' - FIXME: docstring. - ''' + """ + Print information about missing metadata at YAML header. + """ ERR_MSG = "Error on YAML header: missing {}" print(ERR_MSG.format(missing_element)) def report_broken_link(file_path, line_number, link): - ''' - FIXME: docstring. - ''' + """ + Print information about broken link. + """ ERR_MSG = "Broken link at line {} of {}:\n\tCan't find {}." print(ERR_MSG.format(line_number, file_path, link)) @@ -55,23 +57,50 @@ def check_yaml(metadata): for key in METADATA_REQUIRED - set(metadata.keys()): report_missing_metadata(key) +# TODO: Implement check_lesson def check_lesson(file_path): - ''' - FIXME: docstring telling people what you want them to write here. - ''' + """ + Checks the file ``pages/[0-9]{2}-.*.md`` for: + + - "layout: topic" at YAML header + - "title" as keyword at YAML header + - line "> ## Learning Objectives {.objectives}" after YAML header + - items at learning objectives begin with "*" + - items at learning objective following four space rule + - code samples be of type error, output, python, shell, r, matlab, sql + - callout box style + - line with "> ## Key Points {.keypoints}" + - challenge box style + """ pass +# TODO: Implement check_discussion def check_discussion(file_path): - ''' - FIXME: docstring telling people what you want them to write here. - ''' + """ + Checks the file ``pages/discussion.md`` for: + + FIXME: tell what need to check. + """ pass +# TODO: Complete implementation of check_index +# TODO: break check_index into pieces -- it's too long. def check_index(file_path): - ''' - FIXME: docstring. - And break this up into pieces -- it's too long. - ''' + """ + Checks the file ``pages/index.md`` for: + + - "layout: lesson" in YAML header + - "title" as keyword in YAML header + - introductory paragraph right after YAML header + - line with "> ## Prerequisites" + - non empty prerequisites + - line with "## Topics" + - items at topic list begin with "*" + - links at topic list are valid + - line with "## Other Resources" + - items at other resources list begin with "*" + - link at other resources list are valid + """ # State variables in_yaml = False yaml_metadata = [] @@ -80,33 +109,33 @@ def check_index(file_path): has_other_resources = False # Load file and process it - with open(file_path, 'r') as lines: + with open(file_path, "r") as lines: for line_number, line in enumerate(lines): - if re.match('---', line): # what if there are multiple YAML blocks?? + if re.match("---", line): # what if there are multiple YAML blocks?? in_yaml = not in_yaml elif in_yaml: yaml_metadata.append(line) - elif re.match('> ## Prerequisites', line): # check this in the Markdown or in the generated HTML? + elif re.match("> ## Prerequisites", line): # check this in the Markdown or in the generated HTML? has_prerequisites = True - elif re.match('## Topics', line): # as above? + elif re.match("## Topics", line): # as above? has_topics = True - elif re.match('## Other Resources', line): # as above + elif re.match("## Other Resources", line): # as above has_other_resources = True else: ## Push this check into another function - this one is getting too long. # Check if local links are valid - matches = re.search('\[.*\]\((?P.*)\)', line) + matches = re.search("\[.*\]\((?P.*)\)", line) if matches and not matches.group("link").startswith("http"): link = os.path.join(os.path.dirname(file_path), matches.group("link")) if link.endswith(".html"): - link = link.replace("html", "md") # NO: what about '03-html-editing.html' ? + link = link.replace("html", "md") # NO: what about "03-html-editing.html" ? if not os.path.exists(link): report_broken_link(file_path, line_number, link) ## Again, this function is too long - break it into sub-functions. # Check YAML - yaml_metadata = yaml.load('\n'.join(yaml_metadata)) - check_yaml(yaml_metadata, {"minutes"}) + yaml_metadata = yaml.load("\n".join(yaml_metadata)) + check_yaml(yaml_metadata) # Check sections ## Note the refactoring: replaces three conditionals with one. @@ -114,34 +143,52 @@ def check_index(file_path): report_missing(has_topics, file_path, "Topics") report_missing(has_other_resources, file_path, "Other Resources") +# TODO Implement check_intructors def check_intructors(file_path): - ''' - FIXME: docstring telling people what you want them to write here. - ''' + """ + Checks the file ``pages/instructors.md`` for: + + - "title: Instructor"s Guide" in YAML header + - line with "## Overall" + - line with "## General Points" + - lines with topics titles begin with "## " + - points begin with "*" and following four space rules. + """ pass +# TODO Implement check_motivation def check_motivation(file_path): - ''' - FIXME: docstring telling people what you want them to write here. - ''' + """ + Checks the file ``pages/motivation.md``. + + FIXME: tell what need to check. + """ pass +# TODO Implement check_reference def check_reference(file_path): - ''' - FIXME: docstring telling people what you want them to write here. - ''' + """ + Checks the file ``pages/reference.md`` for: + + - ``layout: reference`` in YAML header + - line with "## Glossary" + - words definitions after at the "Glossary" as:: + + > **Key Word 1**: the definition + > relevant to the lesson. + """ pass def check_file(file_path): - ''' - FIXME: docstring telling people what you want them to write here. - ''' - ## Functions are objects, and so can be put in tables like the one below. + """ + Call the correctly check function based on the name of the file. + """ + # Pair of regex and function to call CONTROL = ( - ('[0-9]{2}-.*', check_lesson), - ('discussion', check_discussion), - ('index', check_index), - ('instructors', check_intructors), + ("[0-9]{2}-.*", check_lesson), + ("discussion", check_discussion), + ("index", check_index), + ("instructors", check_intructors), ("motivation", check_motivation), ("reference", check_reference) ) @@ -149,16 +196,18 @@ def check_file(file_path): if re.search(pattern, file_path): checker(file_path) -## main doesn't take sys.argv[1:] or the like? Will help with testing... -def main(): - ''' - FIXME: docstring telling people what you want them to write here. - ''' - lessons_file = os.listdir("pages") - for lesson in lessons_file: - if lesson.endswith('.md'): - ## Why not os.path.join('pages', lesson) ? - check_file('pages/{}'.format(lesson)) +def main(list_of_files): + """ + Call the check function for every file in ``list_of_files``. + + If ``list_of_files`` is empty load all the files from ``pages`` directory. + """ + if not list_of_files: + list_of_files = [os.path.join("pages", filename) for filename in os.listdir("pages")] + + for filename in list_of_files: + if filename.endswith(".md"): + check_file(filename) if __name__ == "__main__": - main() + main(sys.argv[1:]) From 0413b182aa65c815de62672f14c1dad8b44bb4c5 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 17 Nov 2014 05:07:27 -0600 Subject: [PATCH 0103/1182] Breaking instructions into pieces and explaining labels --- DESIGN.md | 81 +++++++++++ FAQ.md | 39 +++++ LAYOUT.md | 335 ++++++++++++++++++++++++++++++++++++++++++ README.md | 426 ++---------------------------------------------------- 4 files changed, 470 insertions(+), 411 deletions(-) create mode 100644 DESIGN.md create mode 100644 FAQ.md create mode 100644 LAYOUT.md diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 000000000..b5fd710e6 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,81 @@ +## Background and Design + +There are a few things you need to know in order to understand why +this template is organized the way it is: + +1. Git uses the term *clone* to mean "a copy of a repository". + GitHub uses the term *fork* to mean, "a copy of a GitHub-hosted + repo that is also hosted on GitHub", and the term *clone* to mean + "a copy of a GitHub-hosted repo that's located on someone else's + machine". In both cases, the duplicate has a remote called + `origin` that points to the original repo; other remotes can be + added manually. + +2. A user on GitHub can only have one fork of a particular repo. + This is a problem for us because an author may be involved in + writing several lessons, each of which has its own website repo. + Those website repositories ought to be forks of this one, but + since GitHub doesn't allow that, we've had to find a workaround. + +3. If a repository has a branch called `gh-pages` (which stands for + "GitHub pages"), then GitHub uses the HTML and Markdown files in + that branch to create a website for the repository. If the + repository's URL is `http://github.com/darwin/finches`, the URL + for the website is `http://darwin.github.io/finches`. + +4. We use Markdown for writing pages because it's simple to learn, + and isn't tied to any specific language (the ReStructured Text + format popular in the Python world, for example, is a complete + unknown to R programmers). If authors want to use something else + to author their lessons (e.g., IPython Notebooks), it's up to them + to generate and commit Markdown formatted according to the rules + below. + + **Note:** we do *not* prescribe what tools instructors should use + when actually teaching. The IPython Notebook, Python IDEs like + Spyder, and the GOCLI (Good Ol' Command Line Interpreter) are all + equally welcome up on stage --- all we specify is the format of + the lesson notes. + +5. We use Pandoc to process pages instead of Jekyll (GitHub's default + conversion tool) because Pandoc supports a much richer dialect of + Markdown than Jekyll. Like Jekyll, Pandoc looks for a header at + the top of each page formatted like this: + + ~~~ + --- + variable: value + other_variable: other_value + --- + ...stuff in the page... + ~~~ + + and inserts the values of those variables into the page when + formatting this. Lesson authors will usually not have to worry + about this. + +6. Using Pandoc instead of Jekyll means that we have to compile our + Markdown into HTML on our own machines and commit it to the + `gh-pages` branch of the lesson's GitHub repository. In order to + keep our source files and generated files separate, we put our + source files in a sub-directory called `pages`, and compile them + "upward" into the root directory of the lesson's repository. + + **Note:** while it's usually considered bad practice to put + computer-generated files under version control, the HTML pages put + into the lesson's root directory by Pandoc *must* be committed to + version control in order for the lesson to be displayed properly + on GitHub. + +7. In order to display properly, our generated HTML pages need + artwork, CSS style files, and a few bits of Javascript. We could + load these from the web, but that would make offline authoring + difficult. Instead, each lesson's repository has a copy of these + files, and a way of updating them (and only them) on demand. + +One final note: we try not to put HTML inside Markdown because it's +ugly to read and write, and error-prone to process. Instead, we put +things that ought to be in `
` blocks, like the learning +objectives and challenge exercises, in blocks indented with `>`, and +do a bit of post-processing to attach the right CSS classes to these +blocks. diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 000000000..838ce90db --- /dev/null +++ b/FAQ.md @@ -0,0 +1,39 @@ +## FAQ + +* *Where can I get help?* + + Mail us at [admin@software-carpentry.org](mailto:admin@software-carpentry.org), + or join our [discussion list](http://lists.software-carpentry.org/mailman/listinfo/discuss_lists.software-carpentry.org) + and ask for help there. + +* *Where can I report problems or suggest improvements?* + + Please + [file an issue](https://github.com/swcarpentry/lesson-template/issues?q=is%3Aopen+is%3Aissue) + or [mail us](mailto:admin@software-carpentry.org). + +* *Why does the lesson repository have to be created from scratch? Why not fork `lesson-template` on GitHub?* + + Because any particular user can only have one fork of a repository, + but instructors frequently need to work on several workshops at once. + +* *Why use Pandoc? Why not some other markup language and some other converter?* + + Because it supports a richer dialect of Markdown than Jekyll + (the converter that GitHub uses by default). + +* *What do the [labels](https://github.com/swcarpentry/lesson-template/issues?q=is%3Aopen+is%3Aissue) mean?* + + * `bug`: something is wrong in our tools or documentation + * `discussion`: marks issues used for conversations about specific problems and questions + * `duplicate`: marks an issue that was closed as redundant (include the number of the original issue in the closing comment) + * `enhancement`: asks for, or adds, a new feature or new information + * `filed-by-newcomer`: issue or pull request was filed by someone new to GitHub and/or this project + * `getting-started`: issue or pull request is suitable for someone new to GitHub and/or this project + * `help-wanted`: a question or request for assistance + * `wont-fix`: marks an issue that isn't going to be addressed + * `work-in-progress`: a pull request that is not yet ready for review + +## Debugging + +Please add notes about problems and solutions below. diff --git a/LAYOUT.md b/LAYOUT.md new file mode 100644 index 000000000..5b87c14a9 --- /dev/null +++ b/LAYOUT.md @@ -0,0 +1,335 @@ +# Lesson Layout + +Each lesson is stored in a directory laid out as described below. That +directory is a self-contained Git repository (i.e., there are no +submodules or clever tricks with symbolic links). + +1. `README.md`: initially a copy of this file. It should be + overwritten with short description of the lesson. + +2. `pages/`: a sub-directory containing the source of the lesson's + website. See "Pages" below. + +3. `code/`, `data/`, and `fig/`: sub-directories containing sample + code, data files, and figures. See "Code, Data, and Figures" + below. + +4. `css/`, `img/`, and `js/`: style sheets, artwork, and Javascript + used in the lesson's web site. See "Support Files" below. + +5. `_layouts/` and `_includes/`: page templates and inclusions. See + "Support Files" below. + +6. `tools/`: tools for managing lessons. See "Tools" below. + +# Code, Data, and Figures + +All of the software samples used in the lesson must go in a directory +called `code/`. Stand-alone data files must go in a directory called +`data/`. Groups of related data files must be put together in a +sub-directory of `data/` with a meaningful (short) name. Figures, +plots, and diagrams used in the lessons must go in a `fig/` directory. + +**Notes:** + +1. This mirrors the layout a scientist would use for actual work. + However, it may cause novice learners problems. If a program is + in `code/a.py`, and contains a reference to a data file + `../data/b.csv`, then if the user runs the program from the root + directory using `python code/a.py`, it will be unable to find the + data file (since the program's working directory will be the root + directory, not the `data` directory). + +2. We strongly prefer SVG for line drawings, since they are smaller, + scale better, and are easier to edit. Screenshots and other raster + images must be PNG or JPEG format. + +# Support Files + +Files used to display the lesson, such as artwork, CSS, and +Javascript, are stored in directories of their own. We keep website +artwork separate from graphics used in the lesson's to make it simple +to update the former automatically. Most authors should not need to +modify any of the support files themselves. + +The `_layouts/` directory holds the page templates used to translate +Markdown to HTML, while the `_includes/` directory holds snippets of +HTML that are used in several page layouts. These directories have +underscores at the start of their names to be consistent with Jekyll's +naming conventions, but the files they contain are for Pandoc. + +# Tools + +The `tools/` directory contains tools to help create and maintain +lessons: + +* `tools/check`: make sure that everything is formatted properly, and + print error messages identifying problems if it's not. + +# Pages + +The `pages/` directory holds the content of the lesson, and must +contain: + +1. `Makefile`: contains commands to check, preview, and update the + repository. Authors should not need to modify this file. + +2. `index.md`: the home page for the lesson. (See "Home Page" below.) + +3. `dd-slug.md`: the topics in the lesson. `dd` is a sequence number + such as `01`, `02`, etc., and `slug` is an abbreviated single-word + mnemonic for the topic. Thus, `03-filesys.md` is the third topic in + this lesson, and is about the filesystem. (Note that we use hyphens + rather than underscores in filenames.) See "Topics" below. + +4. `motivation.md`: slides for a short introductory presentation (three + minutes or less) explaining what the lesson is about and why people + would want to learn it. See "Introductory Slides" below. + +5. `reference.md`: a cheat sheet summarizing key terms and commands, + syntax, etc., that can be printed and given to learners. See + "Reference Guide" below. + +6. `discussion.md`: notes about more advanced ideas that would + distract from the main lesson, and pointers to where to go next. + See "Discussion Page" below. + +7. `instructors.md`: the instructor's guide for the lesson. See + "Instructor's Guide" below. + +Note that the lesson's title is repeated in several files. We could +put this in the Makefile, and insert it into pages when compiling, but +then authors would have to edit the Makefile (which we're trying to +avoid requiring). We could also put it in some sort of configuration +file, but again, we're trying to avoid those. + +## Home Page + +`index.md` must be structured as follows: + + --- + layout: lesson + title: Lesson Title + --- + Paragraph(s) of introductory material. + + > ## Prerequisites {.prereq} + > + > What learners need to know before tackling this lesson. + + ## Topics + + 1. [Topic Title 1](01-slug.html) + 2. [Topic Title 2](02-slug.html) + + ## Other Resources + + * [Motivation](motivation.html) + * [Reference Guide](reference.html) + * [Next Steps](discussion.html) + * [Instructor's Guide](instructors.html) + +**Notes:** + +1. The description of prerequisites is prose for human consumption, + not a machine-comprehensible list of dependencies. We may + supplement the former with the latter once we have more experience + with this lesson format and know what we actually want to do. + +2. Software installation and configuration instructions *aren't* in + the lesson, since they may be shared with other lessons. They will + be stored centrally on the Software Carpentry web site and linked + from the lessons that need them. + +## Topics + +Each topic page must be structured as follows: + + --- + layout: page + title: Lesson Title + subtitle: Topic Title + minutes: 10 + --- + > ## Learning Objectives {.objectives} + > + > * Learning objective 1 + > * Learning objective 2 + + Paragraphs of text --- possibly including **definitions** --- + mixed with: + + ~~~ {.python} + some code: + to be displayed + ~~~ + + and: + + ~~~ {.output} + output + from + program + ~~~ + + and: + + ~~~ {.error} + error reports from programs (if any) + ~~~ + + and possibly including some of these: + + > ## Callout Box {.callout} + > + > An aside of some kind. + + and one or more of these: + + > ## Challenge Title {.challenge} + > + > Description of a single challenge. + > There may be several challenges. + +**Notes:** + +1. The "expected time" heading is called minutes to encourage people + to create topics that are short (10-15 minutes at most). + +2. There are no sub-headings inside a topic other than the ones + shown. (If a topic needs sub-headings, it should be broken into + two or more topics.) + +3. Every challenge should relate explicitly back to a learning + objective. + +4. Definitions of terms are marked in **bold** (like `**this**`). + +## Motivational Slides + +Every lesson must include a short slide deck suitable for a short +presentation (3 minutes or less) that the instructor can use to explain +to learners how knowing the subject will help them. The slides must +be laid out like this: + + --- + layout: slides + title: Why Make? + --- +
+ ## Why This Topic? +
+ +
+ ## Some Other Point +
+ + +**Notes:** + +1. This is the one place where we *must* use HTML tags in our Markdown + (to delimit slides). Everything inside the section markers should + be Markdown if possible. + +2. We use [deck.js](http://imakewebthings.com/deck.js/) for our slides + as it is simpler and prettier than alternatives like + [reveal.js](http://lab.hakim.se/reveal-js/). + +## Reference Guide + +The reference guide is a cheat sheet for learners to print, doodle on, +and take away. Its format is deliberately unconstrained for now, +since we'll need to see a few before we can decide how they ought to +be laid out (or whether they need to be laid out the same way at all). + +The last section of the reference guide must be a glossary laid out as +a definition list: + + --- + layout: page + title: Lesson Title + subtitle: Reference + --- + ...commands and examples... + + ## Glossary + + Key Word 1 + : Definition of first term + + Key Word 2 + : Definition of second term + +## Discussion Page + +The discussion page + + --- + layout: page + title: Lesson Title + subtitle: Discussion + --- + * First point of general discussion. + + This may span several paragraphs. + + * Second point of general discussion. + +## Instructor's Guide + +Learners may go through lessons outside of class, so it seems best to +keep material for instructors in a separate document, rather than +interleaved in the lesson itself. Its structure is: + + --- + layout: page + title: Lesson Title + subtitle: Instructor's Guide + --- + ## Legend + + One or more paragraphs laying out the lesson's legend (i.e., the story + behind its running example). + + ## Overall + + * Point + + * Point + + ## [Topic Title 1](01-slug.html) + + * Point + + * Point + + 1. Discussion of first challenge. + + 2. Discussion of second challenge. + + ## [Topic Title 2](02-slug.html) + + * Point + + * Point + + 1. Discussion of first challenge. + + 2. Discussion of second challenge. + +**Notes:** + +1. The topic headings must match the topic titles. (Yes, we could + define these as variables in a configuration file and refer to those + variables everywhere, but in this case, repetition will be a lot + easier to read, and our validator can check that the titles line + up.) + +2. The points can be anything: specific ways to introduce ideas, common + mistakes learners make and how to get out of them, or anything else. + +3. Full solutions to the challenges do not have to be presented, but + every challenge should be discussed, and that discussion should + mention how long it typically takes to do. (Those estimates do + not go in the challenge itself, since they can increase learners' + stress levels.) diff --git a/README.md b/README.md index 9dcef10c6..4999b5b6b 100644 --- a/README.md +++ b/README.md @@ -149,420 +149,24 @@ Authors may retain copyright on their lessons, but we ask that all lessons be published under the Creative Commons - Attribution (CC-BY) license, or put in the public domain (CC-0), to permit remixing. -## Background - -There are a few things you need to know in order to understand why -this template is organized the way it is: - -1. Git uses the term *clone* to mean "a copy of a repository". - GitHub uses the term *fork* to mean, "a copy of a GitHub-hosted - repo that is also hosted on GitHub", and the term *clone* to mean - "a copy of a GitHub-hosted repo that's located on someone else's - machine". In both cases, the duplicate has a remote called - `origin` that points to the original repo; other remotes can be - added manually. - -2. A user on GitHub can only have one fork of a particular repo. - This is a problem for us because an author may be involved in - writing several lessons, each of which has its own website repo. - Those website repositories ought to be forks of this one, but - since GitHub doesn't allow that, we've had to find a workaround. - -3. If a repository has a branch called `gh-pages` (which stands for - "GitHub pages"), then GitHub uses the HTML and Markdown files in - that branch to create a website for the repository. If the - repository's URL is `http://github.com/darwin/finches`, the URL - for the website is `http://darwin.github.io/finches`. - -4. We use Markdown for writing pages because it's simple to learn, - and isn't tied to any specific language (the ReStructured Text - format popular in the Python world, for example, is a complete - unknown to R programmers). If authors want to use something else - to author their lessons (e.g., IPython Notebooks), it's up to them - to generate and commit Markdown formatted according to the rules - below. - - **Note:** we do *not* prescribe what tools instructors should use - when actually teaching. The IPython Notebook, Python IDEs like - Spyder, and the GOCLI (Good Ol' Command Line Interpreter) are all - equally welcome up on stage --- all we specify is the format of - the lesson notes. - -5. We use Pandoc to process pages instead of Jekyll (GitHub's default - conversion tool) because Pandoc supports a much richer dialect of - Markdown than Jekyll. Like Jekyll, Pandoc looks for a header at - the top of each page formatted like this: +## For More Information - ~~~ - --- - variable: value - other_variable: other_value - --- - ...stuff in the page... - ~~~ - - and inserts the values of those variables into the page when - formatting this. Lesson authors will usually not have to worry - about this. - -6. Using Pandoc instead of Jekyll means that we have to compile our - Markdown into HTML on our own machines and commit it to the - `gh-pages` branch of the lesson's GitHub repository. In order to - keep our source files and generated files separate, we put our - source files in a sub-directory called `pages`, and compile them - "upward" into the root directory of the lesson's repository. - - **Note:** while it's usually considered bad practice to put - computer-generated files under version control, the HTML pages put - into the lesson's root directory by Pandoc *must* be committed to - version control in order for the lesson to be displayed properly - on GitHub. - -7. In order to display properly, our generated HTML pages need - artwork, CSS style files, and a few bits of Javascript. We could - load these from the web, but that would make offline authoring - difficult. Instead, each lesson's repository has a copy of these - files, and a way of updating them (and only them) on demand. - -One final note: we try not to put HTML inside Markdown because it's -ugly to read and write, and error-prone to process. Instead, we put -things that ought to be in `
` blocks, like the learning -objectives and challenge exercises, in blocks indented with `>`, and -do a bit of post-processing to attach the right CSS classes to these -blocks. - -## Overall Layout - -Each lesson is stored in a directory laid out as described below. That -directory is a self-contained Git repository (i.e., there are no -submodules or clever tricks with symbolic links). - -1. `README.md`: initially a copy of this file. It should be - overwritten with short description of the lesson. - -2. `pages/`: a sub-directory containing the source of the lesson's - website. See "Pages" below. - -3. `code/`, `data/`, and `fig/`: sub-directories containing sample - code, data files, and figures. See "Code, Data, and Figures" - below. - -4. `css/`, `img/`, and `js/`: style sheets, artwork, and Javascript - used in the lesson's web site. See "Support Files" below. - -5. `_layouts/` and `_includes/`: page templates and inclusions. See - "Support Files" below. - -6. `tools/`: tools for managing lessons. See "Tools" below. - -## Code, Data, and Figures - -All of the software samples used in the lesson must go in a directory -called `code/`. Stand-alone data files must go in a directory called -`data/`. Groups of related data files must be put together in a -sub-directory of `data/` with a meaningful (short) name. Figures, -plots, and diagrams used in the lessons must go in a `fig/` directory. - -**Notes:** - -1. This mirrors the layout a scientist would use for actual work. - However, it may cause novice learners problems. If a program is - in `code/a.py`, and contains a reference to a data file - `../data/b.csv`, then if the user runs the program from the root - directory using `python code/a.py`, it will be unable to find the - data file (since the program's working directory will be the root - directory, not the `data` directory). - -2. We strongly prefer SVG for line drawings, since they are smaller, - scale better, and are easier to edit. Screenshots and other raster - images must be PNG or JPEG format. - -## Support Files - -Files used to display the lesson, such as artwork, CSS, and -Javascript, are stored in directories of their own. We keep website -artwork separate from graphics used in the lesson's to make it simple -to update the former automatically. Most authors should not need to -modify any of the support files themselves. - -The `_layouts/` directory holds the page templates used to translate -Markdown to HTML, while the `_includes/` directory holds snippets of -HTML that are used in several page layouts. These directories have -underscores at the start of their names to be consistent with Jekyll's -naming conventions, but the files they contain are for Pandoc. - -## Tools - -The `tools/` directory contains tools to help create and maintain -lessons: - -* `tools/check`: make sure that everything is formatted properly, and - print error messages identifying problems if it's not. - -## Pages - -The `pages/` directory holds the content of the lesson, and must -contain: - -1. `Makefile`: contains commands to check, preview, and update the - repository. Authors should not need to modify this file. - -2. `index.md`: the home page for the lesson. (See "Home Page" below.) - -3. `dd-slug.md`: the topics in the lesson. `dd` is a sequence number - such as `01`, `02`, etc., and `slug` is an abbreviated single-word - mnemonic for the topic. Thus, `03-filesys.md` is the third topic in - this lesson, and is about the filesystem. (Note that we use hyphens - rather than underscores in filenames.) See "Topics" below. - -4. `motivation.md`: slides for a short introductory presentation (three - minutes or less) explaining what the lesson is about and why people - would want to learn it. See "Introductory Slides" below. - -5. `reference.md`: a cheat sheet summarizing key terms and commands, - syntax, etc., that can be printed and given to learners. See - "Reference Guide" below. - -6. `discussion.md`: notes about more advanced ideas that would - distract from the main lesson, and pointers to where to go next. - See "Discussion Page" below. - -7. `instructors.md`: the instructor's guide for the lesson. See - "Instructor's Guide" below. - -Note that the lesson's title is repeated in several files. We could -put this in the Makefile, and insert it into pages when compiling, but -then authors would have to edit the Makefile (which we're trying to -avoid requiring). We could also put it in some sort of configuration -file, but again, we're trying to avoid those. - -### Home Page - -`index.md` must be structured as follows: - - --- - layout: lesson - title: Lesson Title - --- - Paragraph(s) of introductory material. - - > ## Prerequisites {.prereq} - > - > What learners need to know before tackling this lesson. - - ## Topics - - 1. [Topic Title 1](01-slug.html) - 2. [Topic Title 2](02-slug.html) - - ## Other Resources - - * [Motivation](motivation.html) - * [Reference Guide](reference.html) - * [Next Steps](discussion.html) - * [Instructor's Guide](instructors.html) - -**Notes:** - -1. The description of prerequisites is prose for human consumption, - not a machine-comprehensible list of dependencies. We may - supplement the former with the latter once we have more experience - with this lesson format and know what we actually want to do. - -2. Software installation and configuration instructions *aren't* in - the lesson, since they may be shared with other lessons. They will - be stored centrally on the Software Carpentry web site and linked - from the lessons that need them. - -### Topics - -Each topic page must be structured as follows: - - --- - layout: page - title: Lesson Title - subtitle: Topic Title - minutes: 10 - --- - > ## Learning Objectives {.objectives} - > - > * Learning objective 1 - > * Learning objective 2 - - Paragraphs of text --- possibly including **definitions** --- - mixed with: - - ~~~ {.python} - some code: - to be displayed - ~~~ - - and: - - ~~~ {.output} - output - from - program - ~~~ - - and: - - ~~~ {.error} - error reports from programs (if any) - ~~~ - - and possibly including some of these: - - > ## Callout Box {.callout} - > - > An aside of some kind. - - and one or more of these: - - > ## Challenge Title {.challenge} - > - > Description of a single challenge. - > There may be several challenges. - -**Notes:** - -1. The "expected time" heading is called minutes to encourage people - to create topics that are short (10-15 minutes at most). - -2. There are no sub-headings inside a topic other than the ones - shown. (If a topic needs sub-headings, it should be broken into - two or more topics.) - -3. Every challenge should relate explicitly back to a learning - objective. - -4. Definitions of terms are marked in **bold** (like `**this**`). - -### Motivational Slides - -Every lesson must include a short slide deck suitable for a short -presentation (3 minutes or less) that the instructor can use to explain -to learners how knowing the subject will help them. The slides must -be laid out like this: - - --- - layout: slides - title: Why Make? - --- -
- ## Why This Topic? -
- -
- ## Some Other Point -
- - -**Notes:** - -1. This is the one place where we *must* use HTML tags in our Markdown - (to delimit slides). Everything inside the section markers should - be Markdown if possible. - -2. We use [deck.js](http://imakewebthings.com/deck.js/) for our slides - as it is simpler and prettier than alternatives like - [reveal.js](http://lab.hakim.se/reveal-js/). - -### Reference Guide - -The reference guide is a cheat sheet for learners to print, doodle on, -and take away. Its format is deliberately unconstrained for now, -since we'll need to see a few before we can decide how they ought to -be laid out (or whether they need to be laid out the same way at all). - -The last section of the reference guide must be a glossary laid out as -a definition list: - - --- - layout: page - title: Lesson Title - subtitle: Reference - --- - ...commands and examples... - - ## Glossary - - Key Word 1 - : Definition of first term - - Key Word 2 - : Definition of second term - -### Discussion Page - -The discussion page - - --- - layout: page - title: Lesson Title - subtitle: Discussion - --- - * First point of general discussion. - - This may span several paragraphs. - - * Second point of general discussion. - -### Instructor's Guide - -Learners may go through lessons outside of class, so it seems best to -keep material for instructors in a separate document, rather than -interleaved in the lesson itself. Its structure is: - - --- - layout: page - title: Lesson Title - subtitle: Instructor's Guide - --- - ## Legend - - One or more paragraphs laying out the lesson's legend (i.e., the story - behind its running example). - - ## Overall - - * Point - - * Point - - ## [Topic Title 1](01-slug.html) - - * Point - - * Point - - 1. Discussion of first challenge. - - 2. Discussion of second challenge. - - ## [Topic Title 2](02-slug.html) - - * Point - - * Point - - 1. Discussion of first challenge. +Please see the following for more information on: - 2. Discussion of second challenge. +* [layout out your lesson](LAYOUT.md) +* [background and design](DESIGN.md) +* [FAQ](FAQ.md) -**Notes:** +## Getting Help -1. The topic headings must match the topic titles. (Yes, we could - define these as variables in a configuration file and refer to those - variables everywhere, but in this case, repetition will be a lot - easier to read, and our validator can check that the titles line - up.) +Mail us at [admin@software-carpentry.org](mailto:admin@software-carpentry.org), +or join our [discussion list](http://lists.software-carpentry.org/mailman/listinfo/discuss_lists.software-carpentry.org) +and ask for help there. -2. The points can be anything: specific ways to introduce ideas, common - mistakes learners make and how to get out of them, or anything else. +## Giving Help -3. Full solutions to the challenges do not have to be presented, but - every challenge should be discussed, and that discussion should - mention how long it typically takes to do. (Those estimates do - not go in the challenge itself, since they can increase learners' - stress levels.) +We are committed to offering a pleasant setup experience for our +learners and organizers. If you find bugs in our instructions, or +would like to suggest improvements, please +[file an issue](https://github.com/swcarpentry/lesson-template/issues?q=is%3Aopen+is%3Aissue) +or [mail us](mailto:admin@software-carpentry.org). From ac75c98acd5f1a758d6923eb1775f64809830f0f Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 17 Nov 2014 05:08:42 -0600 Subject: [PATCH 0104/1182] Putting link to layout instructions in the first paragraph --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4999b5b6b..bc178cb77 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ lesson-template This repository is the template for creating [Software Carpentry](http://software-carpentry.org) lessons. Do *not* fork this repository directly on GitHub. Instead, follow the -instructions below. +instructions below to create a lesson repository, and +[the layout instructions](LAYOUT.md) to create a lesson. ## Manual Setup From 875a7963c838c357a5299dc704e498a02f0e4319 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 17 Nov 2014 11:54:48 -0500 Subject: [PATCH 0105/1182] A few more comments --- tools/check | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/check b/tools/check index cef91e443..5457d7391 100755 --- a/tools/check +++ b/tools/check @@ -2,16 +2,16 @@ # # Software Carpentry Lesson Validator # -# Check for errors at Software Carpentry lessons. +# Check for errors in lessons built using the Software Carpentry template +# found at http://github.com/swcarpentry/lesson-template. # # Usage: # # $ tools/check +import sys import os import re -import sys - import yaml #---------------------------------------- @@ -62,14 +62,13 @@ def check_lesson(file_path): """ Checks the file ``pages/[0-9]{2}-.*.md`` for: - - "layout: topic" at YAML header - - "title" as keyword at YAML header + - "layout: topic" in YAML header + - "title" as keyword in YAML header - line "> ## Learning Objectives {.objectives}" after YAML header - - items at learning objectives begin with "*" - - items at learning objective following four space rule - - code samples be of type error, output, python, shell, r, matlab, sql + - items in learning objectives begin with "*" + - items in learning objective following four-space indentation rule + - code samples be of type input, error, output, python, shell, r, matlab, or sql - callout box style - - line with "> ## Key Points {.keypoints}" - challenge box style """ pass @@ -91,11 +90,12 @@ def check_index(file_path): - "layout: lesson" in YAML header - "title" as keyword in YAML header - - introductory paragraph right after YAML header + - introductory paragraph(s) right after YAML header - line with "> ## Prerequisites" - - non empty prerequisites - - line with "## Topics" + - non-empty prerequisites + - title line with "## Topics" - items at topic list begin with "*" + - items in topic list follow four-space indentation rule - links at topic list are valid - line with "## Other Resources" - items at other resources list begin with "*" From f8fcac487d87e89a151b0a7b5ac292b51b4c2319 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 17 Nov 2014 13:18:45 -0500 Subject: [PATCH 0106/1182] Changing names based on feedback from @willingc --- FAQ.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index 838ce90db..9c1328402 100644 --- a/FAQ.md +++ b/FAQ.md @@ -28,10 +28,11 @@ * `discussion`: marks issues used for conversations about specific problems and questions * `duplicate`: marks an issue that was closed as redundant (include the number of the original issue in the closing comment) * `enhancement`: asks for, or adds, a new feature or new information - * `filed-by-newcomer`: issue or pull request was filed by someone new to GitHub and/or this project + * `filed-by-newcomer`: issue or pull request was filed by someone who is relatively new to GitHub and/or this project, and would appreciate guidance as well as feedback * `getting-started`: issue or pull request is suitable for someone new to GitHub and/or this project * `help-wanted`: a question or request for assistance - * `wont-fix`: marks an issue that isn't going to be addressed + * `left-as-was`: marks an issue closed because the item in question will be left as it was + * `suitable-for-newcomer`: issue or pull request is a good starting point for someone who is relatively new to GitHub and/or this project * `work-in-progress`: a pull request that is not yet ready for review ## Debugging From a15eee131104a80f3b3594af1494d439fe604bb8 Mon Sep 17 00:00:00 2001 From: Abigail Cabunoc Date: Mon, 24 Nov 2014 15:23:52 -0500 Subject: [PATCH 0107/1182] Instructor training registration form * add Country drop down select * add Gender --- swc.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/swc.css b/swc.css index 0ab4e0c18..bc8a7c4c4 100644 --- a/swc.css +++ b/swc.css @@ -417,12 +417,14 @@ footer .container .links{ #ss-form .ss-q-title { display: block; font-weight: bold; + padding-bottom: 0.5em; } #ss-form .ss-required-asterisk { color: #c43b1d; } #ss-form label { display:inline; + cursor: default; } #ss-form .ss-secondary-text { color: #666; @@ -440,6 +442,7 @@ footer .container .links{ } #ss-form .ss-choice-item { line-height: 1.3em; + padding-bottom: .5em; } #ss-form .ss-q-long { resize: vertical; @@ -447,4 +450,12 @@ footer .container .links{ } #ss-form .error-message, .required-message { display: none; +} +#ss-form .ss-form-entry input { + vertical-align: middle; + margin: 0; + padding:0 4px; +} +#ss-form .ss-choice-item-control { + padding-right: 4px; } \ No newline at end of file From 7fcb833492cfae43f53cd1c07ceef11527a621c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Emonet?= Date: Tue, 25 Nov 2014 23:14:05 +0100 Subject: [PATCH 0108/1182] making python script runnable for pandoc --- tools/blockquote2div.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/blockquote2div.py diff --git a/tools/blockquote2div.py b/tools/blockquote2div.py old mode 100644 new mode 100755 From 81b6e29bc9af80f255a9fd7424a23317cdf3ce44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Emonet?= Date: Tue, 25 Nov 2014 23:24:55 +0100 Subject: [PATCH 0109/1182] added shebang to the python pandoc script --- tools/blockquote2div.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/blockquote2div.py b/tools/blockquote2div.py index a23109f07..bd3b52ba8 100755 --- a/tools/blockquote2div.py +++ b/tools/blockquote2div.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python """Pandoc filter to convert Blockquotes with attributes into Div with attributes. From a2add95d69e4838161184620485f5c5312822e91 Mon Sep 17 00:00:00 2001 From: Aaron O'Leary Date: Wed, 26 Nov 2014 09:50:14 +0000 Subject: [PATCH 0110/1182] remove .prereq from readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9dcef10c6..88cdffbfe 100644 --- a/README.md +++ b/README.md @@ -346,7 +346,7 @@ file, but again, we're trying to avoid those. --- Paragraph(s) of introductory material. - > ## Prerequisites {.prereq} + > ## Prerequisites > > What learners need to know before tackling this lesson. From 103322767826ade64f7a11f0db0a69f4f73c4ef6 Mon Sep 17 00:00:00 2001 From: Aaron O'Leary Date: Wed, 26 Nov 2014 10:11:28 +0000 Subject: [PATCH 0111/1182] trigger prereqs class with title Previously, Div creation was triggered by a Blockquote that began with a header that contained a single class that was in a list of special classes. Now, Div creation is *also* triggered by a Blockquote that begins with a header that has it's text contained in a list of special titles. The title is used to lookup an appropriate class to give the Div. In particular, 'prerequesites' is a special title, giving the class 'prereq'. This input: > ## Prerequesites > > A short paragraph describing what learners need to know before > tackling this lesson. will trigger this output:

Prerequisites

A short paragraph describing what learners need to know before tackling this lesson.

--- tools/blockquote2div.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/tools/blockquote2div.py b/tools/blockquote2div.py index bd3b52ba8..6e20af0de 100755 --- a/tools/blockquote2div.py +++ b/tools/blockquote2div.py @@ -34,10 +34,17 @@ import pandocfilters as pf -valid_classes = ['objectives', 'callout', 'challenge'] +# These are classes that, if set on the title of a blockquote, will +# trigger the blockquote to be converted to a div. +special_classes = ['objectives', 'callout', 'challenge'] +# These are titles of blockquotes that will cause the blockquote to +# be converted into a div. They are 'title': 'class' pairs, where the +# 'title' will create a blockquote with the corresponding 'class'. +special_titles = {'prerequisites': 'prereq'} -def find_attributes(blockquote): + +def find_header(blockquote): """Find attributes in a blockquote if they are defined on a header that is the first thing in the block quote. @@ -46,7 +53,7 @@ def find_attributes(blockquote): """ if blockquote[0]['t'] == 'Header': level, attr, inline = blockquote[0]['c'] - return attr + return level, attr, inline def remove_attributes(blockquote): @@ -71,10 +78,21 @@ def blockquote2div(key, value, format, meta): """ if key == 'BlockQuote': blockquote = value - attr = find_attributes(blockquote) - if not attr: + + header = find_header(blockquote) + if not header: return - elif len(attr[1]) == 1 and attr[1][0] in valid_classes: + else: + level, attr, inlines = header + + id, classes, kvs = attr + + ltitle = pf.stringify(inlines).lower() + if ltitle in special_titles: + classes.append(special_titles[ltitle]) + return pf.Div(attr, blockquote) + + elif len(classes) == 1 and classes[0] in special_classes: remove_attributes(blockquote) # a blockquote is just a list of blocks, so it can be # passed directly to Div, which expects Div(attr, blocks) From 71623dcc491a226d4a4329566dc847088b218c95 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Wed, 26 Nov 2014 17:28:15 -0200 Subject: [PATCH 0112/1182] Small improve at tools/blockquote2div.py - Use UPPERCASE for global constants - Add Learning Objectives to SPECIAL_TITLES - Fix samples --- pages/01-one.md | 2 +- pages/02-two.md | 2 +- tools/blockquote2div.py | 20 +++++++++++--------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/pages/01-one.md b/pages/01-one.md index 9857e5061..ca4dc268d 100644 --- a/pages/01-one.md +++ b/pages/01-one.md @@ -4,7 +4,7 @@ title: Lesson Title subtitle: Topic Title One minutes: 10 --- -> ## Learning Objectives {.objectives} +> ## Learning Objectives > > * Learning objective 1 > * Learning objective 2 diff --git a/pages/02-two.md b/pages/02-two.md index b3fdb641a..0412d1bb1 100644 --- a/pages/02-two.md +++ b/pages/02-two.md @@ -4,7 +4,7 @@ title: Lesson Title subtitle: Topic Title Two minutes: 10 --- -> ## Learning Objectives {.objectives} +> ## Learning Objectives > > * Learning objective 1 > * Learning objective 2 diff --git a/tools/blockquote2div.py b/tools/blockquote2div.py index 6e20af0de..5212c568b 100755 --- a/tools/blockquote2div.py +++ b/tools/blockquote2div.py @@ -8,10 +8,11 @@ A blockquote will be converted if -1. it begins with a header -2. that header has attributes -3. those attributes contain a single class -4. that class is one of ['objectives', 'callout', 'challenge'] +1. it begins with a header +2. that + 1. match "Prerequisites", "Objectives" or + 2. has attributes containing a single class matching + one of ['callout', 'challenge'] For example, this is a valid blockquote: @@ -36,12 +37,13 @@ # These are classes that, if set on the title of a blockquote, will # trigger the blockquote to be converted to a div. -special_classes = ['objectives', 'callout', 'challenge'] +SPECIAL_CLASSES = ['callout', 'challenge'] # These are titles of blockquotes that will cause the blockquote to # be converted into a div. They are 'title': 'class' pairs, where the # 'title' will create a blockquote with the corresponding 'class'. -special_titles = {'prerequisites': 'prereq'} +SPECIAL_TITLES = {'prerequisites': 'prereq', + 'learning objectives': 'objectives'} def find_header(blockquote): @@ -88,11 +90,11 @@ def blockquote2div(key, value, format, meta): id, classes, kvs = attr ltitle = pf.stringify(inlines).lower() - if ltitle in special_titles: - classes.append(special_titles[ltitle]) + if ltitle in SPECIAL_TITLES: + classes.append(SPECIAL_TITLES[ltitle]) return pf.Div(attr, blockquote) - elif len(classes) == 1 and classes[0] in special_classes: + elif len(classes) == 1 and classes[0] in SPECIAL_CLASSES: remove_attributes(blockquote) # a blockquote is just a list of blocks, so it can be # passed directly to Div, which expects Div(attr, blocks) From 2da5e1c6a8dee0df38cf1f4f75632dc80c2d49f3 Mon Sep 17 00:00:00 2001 From: Aaron O'Leary Date: Thu, 27 Nov 2014 12:24:18 +0000 Subject: [PATCH 0113/1182] clarify documentation, make all classes special This means that you can trigger div creation by 1. Using a special title 2. Using a special class on an arbitrary title --- tools/blockquote2div.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/tools/blockquote2div.py b/tools/blockquote2div.py index 5212c568b..6797c8647 100755 --- a/tools/blockquote2div.py +++ b/tools/blockquote2div.py @@ -9,10 +9,10 @@ A blockquote will be converted if 1. it begins with a header -2. that - 1. match "Prerequisites", "Objectives" or +2. that either + 1. matches "Prerequisites", "Objectives", "Callout" or "Challenge" OR 2. has attributes containing a single class matching - one of ['callout', 'challenge'] + one of ['prereq', 'objectives', 'callout', 'challenge'] For example, this is a valid blockquote: @@ -26,6 +26,18 @@ Let's do something.
+This is also a valid blockquote: + + > ## Prerequisites + > Breakfast! + +and it will be converted into this markdown: + +
+ ## Prerequisites + Breakfast! +
+ For debugging purposes you may find it useful to test the filter like this: @@ -37,13 +49,16 @@ # These are classes that, if set on the title of a blockquote, will # trigger the blockquote to be converted to a div. -SPECIAL_CLASSES = ['callout', 'challenge'] +SPECIAL_CLASSES = ['callout', 'challenge', 'prereq', 'objectives'] # These are titles of blockquotes that will cause the blockquote to # be converted into a div. They are 'title': 'class' pairs, where the # 'title' will create a blockquote with the corresponding 'class'. SPECIAL_TITLES = {'prerequisites': 'prereq', - 'learning objectives': 'objectives'} + 'learning objectives': 'objectives', + 'objectives': 'objectives', + 'challenge': 'challenge', + 'callout': 'callout'} def find_header(blockquote): From 767a47a4874282a5cb9929b6f96df9256295af54 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Fri, 28 Nov 2014 07:25:58 -0500 Subject: [PATCH 0114/1182] Reformatting instructor bios --- swc.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swc.css b/swc.css index bc8a7c4c4..a2463d2bd 100644 --- a/swc.css +++ b/swc.css @@ -216,7 +216,7 @@ section { } /* Person's name in team.html. */ -span.person { +.person { font-weight: bold; font-style: italic; } From 0d5c61e0ff0db9caed278f2378b38ebb8f37c859 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Sun, 9 Nov 2014 21:54:01 -0500 Subject: [PATCH 0115/1182] Initial commit of template validator skeleton (from local repo) Add validation methods and refactor ast helpers to separate class Add tiny logging message; prep for first push to github fork Start adding tests Fix errors revealed by unit tests Update validator to check heading order; tests passing Validation of links and changes to heading validation Tiny comment cleanup; push to share version with swc Add some descriptive comments and create minimal validator example (for instructors.md) to demonstrate subclassing Split helpers to separate file and update for newest index.md template Grooming Bring up to spec with newest versions of lesson templates. Add tests to ensure all templates pass validation. Saner default assumption about markdown file locations Add skeletons for remaining validators. Incorporate ranier's code for batch validation. Code changes for single-file python 2 and 3 compatibility. Refactor out template validation logic in prep for cmd line rework Proof of concept refactor to command line sig for @rgaia-cs (issue #34) With no path provided, default to curdir, not a hard-coded default Implement license and discussion validators. Some test cleanup. Validate file links against page titles. Add line length check. Fix python3 hash error Rename validator to check Conflicts: tools/validate_markdown_template.py Enforce section heading levels + pep8 cleanup Improved link validation for non-html files Validate images as well as links Verify that all headings are exactly level 2 Link text validation based on document header "subtitle" instead of "title". Adjustments based on run against the SQL repo. Fix links to topics By default only show erros and warnings to user - Add another argument for CLI to enable debug log level - Change some log message to debug instead of info - Add file information for errors and warnings Fix import at check From [PEP8](https://www.python.org/dev/peps/pep-0008/#imports) > Imports should usually be on separate lines, e.g.: > > Yes: import os > import sys > > No: import sys, os Heading bugfixes, update failing tests, and cleanup. fix swcarpentry/lesson-template#39, swcarpentry/lesson-template#42 . Add validation of glossary Slight clarification to log messages. Skip validate some links in index Fix super() call for python2; avoid mutable default argument. Lesson template validator. --- pages/index.md | 4 +- tools/check | 813 ++++++++++++++++++++++++++++-------- tools/test_check.py | 366 ++++++++++++++++ tools/validation_helpers.py | 202 +++++++++ 4 files changed, 1198 insertions(+), 187 deletions(-) create mode 100644 tools/test_check.py create mode 100644 tools/validation_helpers.py diff --git a/pages/index.md b/pages/index.md index 55a249a16..f113f1af0 100644 --- a/pages/index.md +++ b/pages/index.md @@ -11,8 +11,8 @@ Paragraph of introductory material. ## Topics -1. [Topic Title 1](01-one.html) -2. [Topic Title 2](02-two.html) +1. [Topic Title One](01-one.html) +2. [Topic Title Two](02-two.html) ## Other Resources diff --git a/tools/check b/tools/check index 5457d7391..12a402cfd 100755 --- a/tools/check +++ b/tools/check @@ -1,213 +1,656 @@ -#!/usr/bin/python -# -# Software Carpentry Lesson Validator -# -# Check for errors in lessons built using the Software Carpentry template -# found at http://github.com/swcarpentry/lesson-template. -# -# Usage: -# -# $ tools/check +#! /usr/bin/env python -import sys +""" +Validate Software Carpentry lessons +according to the Markdown template specification described here: +http://software-carpentry.org/blog/2014/10/new-lesson-template-v2.html + +Validates the presence of headings, as well as specific sub-nodes. +Contains validators for several kinds of template. + +Call at command line with flag -h to see options and usage instructions. +""" +from __future__ import print_function + +import argparse +import glob +import hashlib +import logging import os import re -import yaml +import sys -#---------------------------------------- -# Error reporting. +try: + # Code tested with CommonMark version 0.5.4; API may change + import CommonMark +except ImportError: + ERROR_MESSAGE = """This program requires the CommonMark python package. +Install using -def report_error(file_path, line_number, line, error_message): - """ - Print information about general error. - """ - ERR_MSG = "Error at line {} of {}:\n\t{}\n{}" - print(ERR_MSG.format(line_number, file_path, line, error_message)) + # pip install commonmark -def report_missing(present, file_path, missing_element): - """ - Print information about missing element. - """ - ERR_MSG = "Error on {}: missing {}" - if not present: - print(ERR_MSG.format(file_path, missing_element)) +or -def report_missing_metadata(missing_element): - """ - Print information about missing metadata at YAML header. - """ - ERR_MSG = "Error on YAML header: missing {}" - print(ERR_MSG.format(missing_element)) + # easy_install commonmark +""" + print(ERROR_MESSAGE) + sys.exit(1) -def report_broken_link(file_path, line_number, link): - """ - Print information about broken link. - """ - ERR_MSG = "Broken link at line {} of {}:\n\tCan't find {}." - print(ERR_MSG.format(line_number, file_path, link)) +import validation_helpers as vh -#---------------------------------------- -# Checking. -def check_yaml(metadata): - """ - Check if all metadata are present at YAML header. - """ - METADATA_REQUIRED = {"layout", "title", "minutes"} - for key in METADATA_REQUIRED - set(metadata.keys()): - report_missing_metadata(key) +class MarkdownValidator(object): + """Base class for Markdown validation -# TODO: Implement check_lesson -def check_lesson(file_path): + Contains basic validation skeleton to be extended for specific page types """ - Checks the file ``pages/[0-9]{2}-.*.md`` for: - - - "layout: topic" in YAML header - - "title" as keyword in YAML header - - line "> ## Learning Objectives {.objectives}" after YAML header - - items in learning objectives begin with "*" - - items in learning objective following four-space indentation rule - - code samples be of type input, error, output, python, shell, r, matlab, or sql - - callout box style - - challenge box style - """ - pass + HEADINGS = [] # List of strings containing expected heading text + WARN_ON_EXTRA_HEADINGS = True # Warn when other headings are present? -# TODO: Implement check_discussion -def check_discussion(file_path): - """ - Checks the file ``pages/discussion.md`` for: + DOC_HEADERS = {} # Rows in header section (first few lines of document). - FIXME: tell what need to check. - """ - pass + def __init__(self, filename=None, markdown=None): + """Perform validation on a Markdown document. -# TODO: Complete implementation of check_index -# TODO: break check_index into pieces -- it's too long. -def check_index(file_path): - """ - Checks the file ``pages/index.md`` for: - - - "layout: lesson" in YAML header - - "title" as keyword in YAML header - - introductory paragraph(s) right after YAML header - - line with "> ## Prerequisites" - - non-empty prerequisites - - title line with "## Topics" - - items at topic list begin with "*" - - items in topic list follow four-space indentation rule - - links at topic list are valid - - line with "## Other Resources" - - items at other resources list begin with "*" - - link at other resources list are valid - """ - # State variables - in_yaml = False - yaml_metadata = [] - has_prerequisites = False - has_topics = False - has_other_resources = False - - # Load file and process it - with open(file_path, "r") as lines: - for line_number, line in enumerate(lines): - if re.match("---", line): # what if there are multiple YAML blocks?? - in_yaml = not in_yaml - elif in_yaml: - yaml_metadata.append(line) - elif re.match("> ## Prerequisites", line): # check this in the Markdown or in the generated HTML? - has_prerequisites = True - elif re.match("## Topics", line): # as above? - has_topics = True - elif re.match("## Other Resources", line): # as above - has_other_resources = True - else: - ## Push this check into another function - this one is getting too long. - # Check if local links are valid - matches = re.search("\[.*\]\((?P.*)\)", line) - if matches and not matches.group("link").startswith("http"): - link = os.path.join(os.path.dirname(file_path), matches.group("link")) - if link.endswith(".html"): - link = link.replace("html", "md") # NO: what about "03-html-editing.html" ? - if not os.path.exists(link): - report_broken_link(file_path, line_number, link) - - ## Again, this function is too long - break it into sub-functions. - # Check YAML - yaml_metadata = yaml.load("\n".join(yaml_metadata)) - check_yaml(yaml_metadata) - - # Check sections - ## Note the refactoring: replaces three conditionals with one. - report_missing(has_prerequisites, file_path, "Prerequisites") - report_missing(has_topics, file_path, "Topics") - report_missing(has_other_resources, file_path, "Other Resources") - -# TODO Implement check_intructors -def check_intructors(file_path): - """ - Checks the file ``pages/instructors.md`` for: + Validator accepts either the path to a file containing Markdown, + OR a valid Markdown string. The latter is useful for unit testing.""" + self.filename = filename - - "title: Instructor"s Guide" in YAML header - - line with "## Overall" - - line with "## General Points" - - lines with topics titles begin with "## " - - points begin with "*" and following four space rules. - """ - pass + if filename: + # Expect Markdown files to be in same directory as the input file + self.markdown_dir = os.path.dirname(filename) + self.lesson_dir = os.path.abspath( # Parent directory of lesson + os.path.join(self.markdown_dir, os.pardir)) + with open(filename, 'rU') as f: + self.markdown = f.read() + else: + # Look for linked content in ../pages (relative to this file) + self.lesson_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), os.pardir)) -# TODO Implement check_motivation -def check_motivation(file_path): - """ - Checks the file ``pages/motivation.md``. + self.markdown_dir = os.path.join(self.lesson_dir, "pages") + self.markdown = markdown - FIXME: tell what need to check. - """ - pass + ast = self._parse_markdown(self.markdown) + self.ast = vh.CommonMarkHelper(ast) -# TODO Implement check_reference -def check_reference(file_path): - """ - Checks the file ``pages/reference.md`` for: + def _parse_markdown(self, markdown): + parser = CommonMark.DocParser() + ast = parser.parse(markdown) + return ast - - ``layout: reference`` in YAML header - - line with "## Glossary" - - words definitions after at the "Glossary" as:: + def _validate_hrs(self): + """Validate header - > **Key Word 1**: the definition - > relevant to the lesson. - """ - pass + Verify that the header section at top of document + is bracketed by two horizontal rules""" + valid = True + try: + hr_nodes = [self.ast.children[0], self.ast.children[2]] + except IndexError: + logging.error( + "In {0}: " + "Document must include header sections".format(self.filename)) + return False -def check_file(file_path): - """ - Call the correctly check function based on the name of the file. + for hr in hr_nodes: + if not self.ast.is_hr(hr): + logging.error( + "In {0}: " + "Expected --- at line: {1}".format( + self.filename, hr.start_line)) + valid = False + return valid + + def _validate_one_doc_header_row(self, text): + """Validate a single row of the document header section""" + label, content = text.split(":", 1) + if label not in self.DOC_HEADERS: + logging.warning( + "In {0}: " + "Unrecognized label in header section: {1}".format( + self.filename, label)) + return False + + validation_function = self.DOC_HEADERS[label] + validate_header = validation_function(content) + if not validate_header: + logging.error( + "In {0}: " + "Document header field for label {1} " + "does not follow expected format".format(self.filename, label)) + return validate_header + + # Methods related to specific validation. Can override specific tests. + def _validate_doc_headers(self): + """Validate the document header section. + + Pass only if the header of the document contains the specified + sections with the expected contents""" + + # Header section should be wrapped in hrs + has_hrs = self._validate_hrs() + + # Labeled sections in the actual headers should match expected format + header_node = self.ast.children[1] + test_headers = [self._validate_one_doc_header_row(s) + for s in header_node.strings] + + # Must have all expected header lines, and no others. + only_headers = (len(header_node.strings) == len(self.DOC_HEADERS)) + + # Headings must appear in the order expected + valid_order = self._validate_section_heading_order() + + return has_hrs and all(test_headers) and only_headers and valid_order + + def _validate_section_heading_order(self, ast_node=None, headings=None): + """Verify that section headings appear, and in the order expected""" + # TODO: Refactor into individual tests in the future + if ast_node is None: + ast_node = self.ast.data + headings = self.HEADINGS + + heading_nodes = self.ast.get_section_headings(ast_node) + # All headings should be exactly level 2 + correct_level = True + for n in heading_nodes: + if n.level != 2: + logging.error( + "In {0}: " + "Heading at line {1} should be level 2".format( + self.filename, n.start_line)) + correct_level = False + + heading_labels = [vh.strip_attrs(n.strings[0]) for n in heading_nodes] + + # Check for missing and extra headings + missing_headings = [expected_heading for expected_heading in headings + if expected_heading not in heading_labels] + + extra_headings = [found_heading for found_heading in heading_labels + if found_heading not in headings] + + for h in missing_headings: + logging.error( + "In {0}: " + "Document is missing expected heading: {1}".format( + self.filename, h)) + + if self.WARN_ON_EXTRA_HEADINGS is True: + for h in extra_headings: + logging.error( + "In {0}: " + "Document contains heading " + "not specified in the template: {1}".format( + self.filename, h)) + no_extra = (len(extra_headings) == 0) + else: + no_extra = True + + # Check that the subset of headings + # in the template spec matches order in the document + valid_order = True + headings_overlap = [h for h in heading_labels if h in headings] + if len(missing_headings) == 0 and headings_overlap != headings: + valid_order = False + logging.error( + "In {0}: " + "Document headings do not match " + "the order specified by the template".format(self.filename)) + + return (len(missing_headings) == 0) and \ + valid_order and no_extra and correct_level + + def _validate_one_link(self, link_node): + """Logic to validate a single external asset (image or link) + + Any local html file being linked was generated as part of the lesson. + Therefore, file links (.html) must have a Markdown file + in the expected folder. + + The title of the linked Markdown document should match the link text. + + For other assets (links or images), just verify that a file exists + """ + dest, link_text = self.ast.get_link_info(link_node) + + if re.match(r"^[\w,\s-]+\.(html?)", dest, re.IGNORECASE): + # HTML files in same folder are made from Markdown; special tests + expected_md_fn = os.path.splitext(dest)[0] + os.extsep + "md" + expected_md_path = os.path.join(self.markdown_dir, + expected_md_fn) + if not os.path.isfile(expected_md_path): + logging.error( + "In {0}: " + "The document links to {1}, but could not find " + "the expected markdown file {2}".format( + self.filename, dest, expected_md_path)) + return False + + # If file exists, parse and validate link text = node title + with open(expected_md_path, 'rU') as link_dest_file: + dest_contents = link_dest_file.read() + + dest_ast = self._parse_markdown(dest_contents) + dest_ast = vh.CommonMarkHelper(dest_ast) + dest_page_title = dest_ast.get_doc_header_subtitle() + + if dest_page_title != link_text: + logging.error( + "In {0}: " + "The linked page {1} exists, but " + "the link text '{2}' does not match the " + "(sub)title of that page, '{3}'.".format( + self.filename, dest, + link_text, dest_page_title)) + return False + elif not re.match(r"^((https?|ftp)://)", dest, re.IGNORECASE)\ + and not re.match(r"^#.*", dest): + # If not web URL, and not anchor on same page, then + # verify that local file exists + dest_path = os.path.join(self.lesson_dir, dest) + if not os.path.isfile(dest_path): + logging.error( + "In {0}: " + "Could not find the linked asset file " + "{1} in {2}. If this is a URL, it must be " + "prefixed with http(s):// or ftp://.".format( + self.filename, dest, dest_path)) + return False + else: + logging.warning( + "In {0}: " + "Skipped validation of link {1}".format(self.filename, dest)) + return True + + def _validate_links(self, links_to_skip=()): + """Validate all references to external content + + This includes links AND images: these are the two types of node that + CommonMark assigns a .destination property""" + links = self.ast.find_external_links() + + valid = True + for link_node in links: + if link_node.destination not in links_to_skip: + res = self._validate_one_link(link_node) + valid = valid and res + return valid + + def _run_tests(self): + """ + Let user override the list of tests to be performed. + + Error trapping is handled by the validate() wrapper method. + """ + tests = [self._validate_doc_headers(), + self._validate_section_heading_order(), + self._validate_links()] + + return all(tests) + + def validate(self): + """Perform all required validations. Wrap in exception handler""" + try: + return self._run_tests() + except IndexError: + logging.error("Document is missing critical sections") + return False + + +class IndexPageValidator(MarkdownValidator): + """Validate the contents of the homepage (index.md)""" + HEADINGS = ['Topics', + 'Other Resources'] + + DOC_HEADERS = {'layout': vh.is_str, + 'title': vh.is_str} + + def _validate_intro_section(self): + """Validate the intro section + + It must be a paragraph, followed by blockquoted list of prereqs""" + intro_block = self.ast.children[3] + intro_section = self.ast.is_paragraph(intro_block) + if not intro_section: + logging.error( + "In {0}: " + "Expected paragraph of introductory text at {1}".format( + self.filename, intro_block.start_line)) + + # Validate the prerequisites block + prereqs_block = self.ast.get_block_titled("Prerequisites", + heading_level=2) + if prereqs_block: + # Found the expected block; now check contents + prereqs_tests = self.ast.has_number_children(prereqs_block[0], + minc=2) + else: + prereqs_tests = False + + if prereqs_tests is False: + logging.error( + "In {0}: " + "Intro should contain a blockquoted section with level 2 " + "title 'Prerequisites'. Section should not be empty.".format( + self.filename)) + return intro_section and prereqs_tests + + def _validate_links(self, links_to_skip=('motivation.html', + 'reference.html', + 'discussion.html', + 'instructors.html')): + return super(IndexPageValidator, self)._validate_links(links_to_skip) + + def _run_tests(self): + tests = [self._validate_intro_section()] + parent_tests = super(IndexPageValidator, self)._run_tests() + return all(tests) and parent_tests + + +class TopicPageValidator(MarkdownValidator): + """Validate the Markdown contents of a topic page, eg 01-topicname.md""" + DOC_HEADERS = {"layout": vh.is_str, + "title": vh.is_str, + "subtitle": vh.is_str, + "minutes": vh.is_numeric} + + # TODO: Write validator for, eg, challenge section + def _validate_learning_objective(self): + learn_node = self.ast.get_block_titled("Learning Objectives", + heading_level=2) + if learn_node: + # In addition to title, the node must have some content + node_tests = self.ast.has_number_children(learn_node[0], minc=2) + else: + node_tests = False + + if node_tests is False: + logging.error( + "In {0}: " + "Learning Objectives should not be empty.".format( + self.filename)) + + return node_tests + + def _validate_has_no_headings(self): + """Check headings + + The top-level document has no headings indicating subtopics. + The only valid subheadings are nested in blockquote elements""" + heading_nodes = self.ast.get_section_headings() + if len(heading_nodes) == 0: + return True + + logging.error( + "In {0}: " + "The topic page should not have sub-headings " + "outside of special blocks. " + "If a topic needs sub-headings, " + "it should be broken into multiple topics.".format(self.filename)) + for n in heading_nodes: + logging.warning( + "In {0}: " + "The following sub-heading should be removed: {1}".format( + self.filename, n.strings[0])) + return False + + def _run_tests(self): + tests = [self._validate_has_no_headings(), + self._validate_learning_objective()] + parent_tests = super(TopicPageValidator, self)._run_tests() + return all(tests) and parent_tests + + +class MotivationPageValidator(MarkdownValidator): + """Validate motivation.md""" + DOC_HEADERS = {"layout": vh.is_str, + "title": vh.is_str} + # TODO: How to validate? May be a mix of reveal.js (HTML) + markdown. + + +class ReferencePageValidator(MarkdownValidator): + """Validate reference.md""" + HEADINGS = ["Glossary"] + WARN_ON_EXTRA_HEADINGS = False + + DOC_HEADERS = {"layout": vh.is_str, + "title": vh.is_str, + "subtitle": vh.is_str} + + def _validate_glossary_entry(self, glossary_entry): + """Validate glossary entry + + Glossary entry must be formatted in conformance with Pandoc's + ```definition_lists``` extension. + + That syntax isn't supported by the CommonMark parser, so we identify + terms manually.""" + if len(glossary_entry) < 2: + logging.error( + "In {0}:" + "Glossary entry must have at least two lines- " + "a term and a definition.".format( + self.filename)) + return False + + entry_is_valid = True + for line_index, line in enumerate(glossary_entry): + if line_index == 1: + if not re.match("^: ", line): + logging.error( + "In {0}:" + "First line of definition must " + "start with ': '.".format( + self.filename)) + entry_is_valid = False + elif line_index > 1: + if not re.match("^ ", line): + logging.error( + "In {0}:" + "Subsequent lines of definition must " + "start with ' '.".format( + self.filename)) + entry_is_valid = False + return entry_is_valid + + def _validate_glossary(self): + """Validate the glossary section. + + Assumes that the glossary is at the end of the file: + everything after the header. (and there must be a glossary section) + + Verifies that the only things in the glossary are definition items. + """ + is_glossary_valid = True + in_glossary = False + for node in self.ast.children: + if in_glossary: + is_glossary_valid = is_glossary_valid and \ + self._validate_glossary_entry(node.strings) + elif self.ast.is_heading(node) and "Glossary" in node.strings: + in_glossary = True + + return is_glossary_valid + + def _run_tests(self): + tests = [self._validate_glossary()] + parent_tests = super(ReferencePageValidator, self)._run_tests() + return all(tests) and parent_tests + + +class InstructorPageValidator(MarkdownValidator): + """Simple validator for Instructor's Guide- instructors.md""" + HEADINGS = ["Legend", "Overall"] + WARN_ON_EXTRA_HEADINGS = False + + DOC_HEADERS = {"layout": vh.is_str, + "title": vh.is_str, + "subtitle": vh.is_str} + + +class LicensePageValidator(MarkdownValidator): + """Validate LICENSE.md: user should not edit this file""" + def _run_tests(self): + """Skip the base tests; just check md5 hash""" + # TODO: This hash is specific to the license for english-language repo + expected_hash = '258aa6822fa77f7c49c37c3759017891' + m = hashlib.md5() + try: + m.update(self.markdown) + except TypeError: + # Workaround for hashing in python3 + m.update(self.markdown.encode('utf-8')) + + if m.hexdigest() == expected_hash: + return True + else: + logging.error("The provided license file should not be modified.") + return False + + +class DiscussionPageValidator(MarkdownValidator): """ - # Pair of regex and function to call - CONTROL = ( - ("[0-9]{2}-.*", check_lesson), - ("discussion", check_discussion), - ("index", check_index), - ("instructors", check_intructors), - ("motivation", check_motivation), - ("reference", check_reference) - ) - for (pattern, checker) in CONTROL: - if re.search(pattern, file_path): - checker(file_path) - -def main(list_of_files): + Validate the discussion page (discussion.md). + Most of the content is free-form. """ - Call the check function for every file in ``list_of_files``. + WARN_ON_EXTRA_HEADINGS = False + DOC_HEADERS = {"layout": vh.is_str, + "title": vh.is_str, + "subtitle": vh.is_str} - If ``list_of_files`` is empty load all the files from ``pages`` directory. - """ - if not list_of_files: - list_of_files = [os.path.join("pages", filename) for filename in os.listdir("pages")] - for filename in list_of_files: - if filename.endswith(".md"): - check_file(filename) +# Associate lesson template names with validators. This list used by CLI. +# Dict of {name: (Validator, filename_pattern)} +LESSON_TEMPLATES = {"index": (IndexPageValidator, "^index"), + "topic": (TopicPageValidator, "^[0-9]{2}-.*"), + "motivation": (MotivationPageValidator, "^motivation"), + "reference": (ReferencePageValidator, "^reference"), + "instructor": (InstructorPageValidator, "^instructors"), + "license": (LicensePageValidator, "^LICENSE"), + "discussion": (DiscussionPageValidator, "^discussion")} + + +def identify_template(filepath): + """Identify template + + Given the path to a single file, + identify the appropriate template to use""" + for template_name, (validator, pattern) in LESSON_TEMPLATES.items(): + if re.search(pattern, os.path.basename(filepath)): + return template_name + + return None + + +def validate_single(filepath, template=None): + """Validate a single Markdown file based on a specified template""" + template = template or identify_template(filepath) + if template is None: + logging.error( + "Validation failed for {0}: " + "Could not automatically identify correct template.".format( + filepath)) + return False + + logging.debug( + "Beginning validation of {0} using template {1}".format( + filepath, template)) + validator = LESSON_TEMPLATES[template][0] + validate_file = validator(filepath) + + res = validate_file.validate() + if res is True: + logging.debug("File {0} successfully passed validation".format( + filepath)) + else: + logging.debug("File {0} failed validation: " + "see error log for details".format(filepath)) + + return res + + +def validate_folder(path, template=None): + """Validate an entire folder of files""" + search_str = os.path.join(path, "*.md") # Find files based on extension + filename_list = glob.glob(search_str) + + if not filename_list: + logging.error( + "No Markdown files were found " + "in specified directory {0}".format(path)) + return False + + all_valid = True + for fn in filename_list: + res = validate_single(fn, template=template) + all_valid = all_valid and res + return all_valid + + +def start_logging(level=logging.INFO): + """Initialize logging and print messages to console.""" + logging.basicConfig(stream=sys.stdout, level=level) + + +def command_line(): + """Handle arguments passed in via the command line""" + parser = argparse.ArgumentParser() + parser.add_argument("file_or_path", + nargs="*", + default=[os.getcwd()], + help="The individual pathname") + + parser.add_argument('-t', '--template', + choices=LESSON_TEMPLATES.keys(), + help="The type of template to apply to all file(s). " + "If not specified, will auto-identify template.") + + parser.add_argument('-d', '--debug', + action='store_true', + help="Enable debug information.") + + return parser.parse_args() + + +def main(parsed_args_obj): + if parsed_args_obj.debug: + log_level = "DEBUG" + else: + log_level = "WARNING" + start_logging(log_level) + + template = parsed_args_obj.template + + all_valid = True + for fn in parsed_args_obj.file_or_path: + if os.path.isdir(fn): + res = validate_folder(fn, template=template) + elif os.path.isfile(fn): + res = validate_single(fn, template=template) + else: + res = False + logging.error( + "The specified file or folder {0} does not exist; " + "could not perform validation".format(fn)) + + all_valid = all_valid and res + + if all_valid is True: + logging.debug("All Markdown files successfully passed validation.") + sys.exit(0) + else: + logging.warning( + "Some errors were encountered during validation. " + "See log for details.") + sys.exit(1) + if __name__ == "__main__": - main(sys.argv[1:]) + parsed_args = command_line() + main(parsed_args) + + #### Sample of how validator is used directly + # validator = HomePageValidator('../index.md') + # print validator.validate() diff --git a/tools/test_check.py b/tools/test_check.py new file mode 100644 index 000000000..451cf78c4 --- /dev/null +++ b/tools/test_check.py @@ -0,0 +1,366 @@ +#! /usr/bin/env python + +import imp, logging, os, unittest +check = imp.load_source("check", # Import non-.py file + os.path.join(os.path.dirname(__file__), "check")) + +# Make log messages visible to help audit test failures +check.start_logging(level=logging.DEBUG) + + +class BaseTemplateTest(unittest.TestCase): + """Common methods for testing template validators""" + SAMPLE_FILE = "" # Path to a file that should pass all tests + VALIDATOR = check.MarkdownValidator + + def setUp(self): + self.sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + + def _create_validator(self, markdown): + """Create validator object from markdown string; useful for failures""" + return self.VALIDATOR(markdown=markdown) + + +class TestAstHelpers(BaseTemplateTest): + SAMPLE_FILE = '../pages/index.md' + VALIDATOR = check.MarkdownValidator + + def test_link_text_extracted(self): + """Verify that link text and destination are extracted correctly""" + validator = self._create_validator("""[This is a link](discussion.html)""") + links = validator.ast.find_external_links(validator.ast.children[0]) + + dest, link_text = validator.ast.get_link_info(links[0]) + self.assertEqual(dest, "discussion.html") + self.assertEqual(link_text, "This is a link") + + +class TestIndexPage(BaseTemplateTest): + """Test the ability to correctly identify and validate specific sections + of a markdown file""" + SAMPLE_FILE = "../pages/index.md" + VALIDATOR = check.IndexPageValidator + + def test_sample_file_passes_validation(self): + res = self.sample_validator.validate() + self.assertTrue(res) + + def test_headers_missing_hrs(self): + validator = self._create_validator("""Blank row + +layout: lesson +title: Lesson Title +keywords: ["some", "key terms", "in a list"] + +Another section that isn't an HR +""") + + self.assertFalse(validator._validate_doc_headers()) + + def test_headers_missing_a_line(self): + """One of the required headers is missing""" + validator = self._create_validator("""--- +layout: lesson +keywords: ["some", "key terms", "in a list"] +---""") + self.assertFalse(validator._validate_doc_headers()) + + # TESTS INVOLVING DOCUMENT HEADER SECTION + def test_headers_fail_with_other_content(self): + validator = self._create_validator("""--- +layout: lesson +title: Lesson Title +keywords: ["some", "key terms", "in a list"] +otherline: Nothing +---""") + self.assertFalse(validator._validate_doc_headers()) + + def test_headers_fail_because_invalid_content(self): + validator = self._create_validator("""--- +layout: lesson +title: Lesson Title +keywords: this is not a list +---""") + self.assertFalse(validator._validate_doc_headers()) + + # TESTS INVOLVING SECTION TITLES/HEADINGS + def test_index_has_valid_section_headings(self): + """The provided index page""" + res = self.sample_validator._validate_section_heading_order() + self.assertTrue(res) + + def test_index_fail_when_section_heading_absent(self): + res = self.sample_validator.ast.has_section_heading("Fake heading") + self.assertFalse(res) + + def test_fail_when_section_heading_is_wrong_level(self): + """All headings must be exactly level 2""" + validator = self._create_validator("""--- +layout: page +title: Lesson Title +--- +Paragraph of introductory material. + +> ## Prerequisites +> +> A short paragraph describing what learners need to know +> before tackling this lesson. + +### Topics + +1. [Topic Title 1](01-one.html) +2. [Topic Title 2](02-two.html) + +## Other Resources + +* [Motivation](motivation.html) +* [Reference Guide](reference.html) +* [Next Steps](discussion.html) +* [Instructor's Guide](instructors.html)""") + self.assertFalse(validator._validate_section_heading_order()) + + + def test_fail_when_section_headings_in_wrong_order(self): + validator = self._create_validator("""--- +layout: lesson +title: Lesson Title +keywords: ["some", "key terms", "in a list"] +--- +Paragraph of introductory material. + +> ## Prerequisites +> +> A short paragraph describing what learners need to know +> before tackling this lesson. + +## Other Resources + +* [Motivation](motivation.html) +* [Reference Guide](reference.html) +* [Instructor's Guide](instructors.html) + + +## Topics + +* [Topic Title 1](01-one.html) +* [Topic Title 2](02-two.html)""") + + self.assertFalse(validator._validate_section_heading_order()) + + def test_pass_when_prereq_section_has_correct_heading_level(self): + validator = self._create_validator("""--- +layout: lesson +title: Lesson Title +keywords: ["some", "key terms", "in a list"] +--- +Paragraph of introductory material. + +> ## Prerequisites +> +> A short paragraph describing what learners need to know +> before tackling this lesson. +""") + self.assertTrue(validator._validate_intro_section()) + + def test_fail_when_prereq_section_has_incorrect_heading_level(self): + validator = self._create_validator("""--- +layout: lesson +title: Lesson Title +keywords: ["some", "key terms", "in a list"] +--- +Paragraph of introductory material. + +> # Prerequisites +> +> A short paragraph describing what learners need to know +> before tackling this lesson. +""") + self.assertFalse(validator._validate_intro_section()) + + # TESTS INVOLVING LINKS TO OTHER CONTENT + def test_file_links_validate(self): + res = self.sample_validator._validate_links() + self.assertTrue(res) + + def test_html_link_to_extant_md_file_passes(self): + """Verify that an HTML link with corresponding MD file will pass""" + validator = self._create_validator("""[Topic Title One](01-one.html)""") + self.assertTrue(validator._validate_links()) + + def test_html_link_with_anchor_to_extant_md_passes(self): + """Verify that link is identified correctly even if to page anchor + + For now this just tests that the regex handles #anchors. + It doesn't validate that the named anchor exists in the md file + """ + validator = self._create_validator("""[Topic Title One](01-one.html#anchor)""") + self.assertTrue(validator._validate_links()) + + def test_inpage_anchor_passes_validation(self): + """Links that reference anchors within the page should be ignored""" + # TODO: Revisit once anchor rules are available + validator = self._create_validator("""Most databases also support Booleans and date/time values; +SQLite uses the integers 0 and 1 for the former, and represents the latter as discussed [earlier](#a:dates).""") + self.assertTrue(validator._validate_links()) + + + def test_missing_markdown_file_fails_validation(self): + """Fail validation when an html file is linked without corresponding + markdown file""" + validator = self._create_validator("""[Broken link](nonexistent.html)""") + self.assertFalse(validator._validate_links()) + + def test_website_link_ignored_by_validator(self): + """Don't look for markdown if the file linked isn't local- + remote website links are ignored""" + validator = self._create_validator("""[Broken link](http://website.com/filename.html)""") + self.assertTrue(validator._validate_links()) + + def test_malformed_website_link_fails_validator(self): + """If the link isn't prefixed by http(s):// or ftp://, fail. + This is because there are a lot of edge cases in distinguishing + between filenames and URLs: err on the side of certainty.""" + validator = self._create_validator("""[Broken link](www.website.com/filename.html)""") + self.assertFalse(validator._validate_links()) + + def test_finds_image_asset(self): + """Image asset is found""" + validator = self._create_validator( + """![this is the image's title](fig/example.svg "this is the image's alt text")""") + self.assertTrue(validator._validate_links()) + + def test_image_asset_not_found(self): + """Image asset can't be found if path is invalid""" + validator = self._create_validator( + """![this is the image's title](fig/exemple.svg "this is the image's alt text")""") + self.assertFalse(validator._validate_links()) + + def test_non_html_link_finds_csv(self): + """Look for CSV file in appropriate folder""" + validator = self._create_validator( + """Use [this CSV](data/data.csv) for the exercise.""") + self.assertTrue(validator._validate_links()) + + def test_non_html_links_are_path_sensitive(self): + """Fails to find CSV file with wrong path.""" + validator = self._create_validator( + """Use [this CSV](data.csv) for the exercise.""") + self.assertFalse(validator._validate_links()) + + +class TestTopicPage(BaseTemplateTest): + """Verifies that the topic page validator works as expected""" + SAMPLE_FILE = "../pages/01-one.md" + VALIDATOR = check.TopicPageValidator + + def test_sample_file_passes_validation(self): + res = self.sample_validator.validate() + self.assertTrue(res) + + +class TestMotivationPage(BaseTemplateTest): + """Verifies that the instructors page validator works as expected""" + SAMPLE_FILE = "../pages/motivation.md" + VALIDATOR = check.MotivationPageValidator + + def test_sample_file_passes_validation(self): + res = self.sample_validator.validate() + self.assertTrue(res) + + +class TestReferencePage(BaseTemplateTest): + """Verifies that the reference page validator works as expected""" + SAMPLE_FILE = "../pages/reference.md" + VALIDATOR = check.ReferencePageValidator + + def test_missing_glossary_definition(self): + validator = self._create_validator("") + self.assertFalse(validator._validate_glossary_entry( + ["Key word"])) + + def test_missing_colon_at_glossary_definition(self): + validator = self._create_validator("") + self.assertFalse(validator._validate_glossary_entry( + ["Key word", "Definition of term"])) + + def test_wrong_indentation_at_glossary_definition(self): + validator = self._create_validator("") + self.assertFalse(validator._validate_glossary_entry( + ["Key word", ": Definition of term"])) + + def test_wrong_continuation_at_glossary_definition(self): + validator = self._create_validator("") + self.assertFalse(validator._validate_glossary_entry( + ["Key word", ": Definition of term", "continuation"])) + + def test_valid_glossary_definition(self): + validator = self._create_validator("") + self.assertTrue(validator._validate_glossary_entry( + ["Key word", ": Definition of term", " continuation"])) + + def test_only_definitions_can_appear_after_glossary_heading(self): + validator = self._create_validator("""## Glossary + +Key Word 1 +: Definition of first term + +Paragraph + +Key Word 2 +: Definition of second term +""") + self.assertFalse(validator._validate_glossary()) + + def test_glossary(self): + validator = self._create_validator("""## Glossary + +Key Word 1 +: Definition of first term + +Key Word 2 +: Definition of second term +""") + self.assertTrue(validator._validate_glossary()) + + def test_sample_file_passes_validation(self): + res = self.sample_validator.validate() + self.assertTrue(res) + + +class TestInstructorPage(BaseTemplateTest): + """Verifies that the instructors page validator works as expected""" + SAMPLE_FILE = "../pages/instructors.md" + VALIDATOR = check.InstructorPageValidator + + def test_sample_file_passes_validation(self): + res = self.sample_validator.validate() + self.assertTrue(res) + + +class TestLicensePage(BaseTemplateTest): + SAMPLE_FILE = '../pages/LICENSE.md' + VALIDATOR = check.LicensePageValidator + + def test_sample_file_passes_validation(self): + res = self.sample_validator.validate() + self.assertTrue(res) + + def test_modified_file_fails_validation(self): + with open(self.SAMPLE_FILE, 'rU') as f: + orig_text = f.read() + mod_text = orig_text.replace("The", "the") + validator = self._create_validator(mod_text) + self.assertFalse(validator.validate()) + + +class TestDiscussionPage(BaseTemplateTest): + SAMPLE_FILE = '../pages/discussion.md' + VALIDATOR = check.DiscussionPageValidator + + def test_sample_file_passes_validation(self): + res = self.sample_validator.validate() + self.assertTrue(res) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/validation_helpers.py b/tools/validation_helpers.py new file mode 100644 index 000000000..6acc11c3d --- /dev/null +++ b/tools/validation_helpers.py @@ -0,0 +1,202 @@ +#! /usr/bin/env python + +import json +import logging +import re +import sys + +try: # Hack to make codebase compatible with python 2 and 3 + basestring +except NameError: + basestring = str + + +# Common validation functions +def is_list(text): + """Validate whether the provided string can be converted to python list""" + text = text.strip() + try: + text_as_list = json.loads(text) + except ValueError: + logging.debug("Could not convert string to python object: {0}".format(text)) + return False + + return isinstance(text_as_list, list) + + +def is_str(text): + """Validate whether the input is a non-blank python string""" + return isinstance(text, basestring) and len(text) > 0 + + +def is_numeric(text): + """Validate whether the string represents a number (including unicode)""" + try: + float(text) + return True + except ValueError: + return False + + +#### Text cleanup functions, pre-validation +def strip_attrs(s): + """Strip attributes of the form {.name} from a markdown title string""" + return re.sub(r"\s\{\..*?\}", "", s) + + +def get_css_class(s): + """Return any and all CSS classes (when a line is suffixed by {.classname}) + Returns empty list when """ + return re.findall("\{\.(.*?)\}", s) + + +### Helper objects +class CommonMarkHelper(object): + """Basic helper functions for working with the internal abstract syntax + tree produced by CommonMark parser""" + def __init__(self, ast): + self.data = ast + self.children = self.data.children + + def get_doc_header_title(self): + """Helper method for SWC templates: get the document title from + the YAML headers""" + doc_headers = self.data.children[1] # Throw index error if none found + + for s in doc_headers.strings: + label, contents = s.split(":", 1) + if label.lower() == "title": + return contents.strip() + + # If title not found, return an empty string for display purposes + return '' + + def get_doc_header_subtitle(self): + """Helper method for SWC templates: get the document title from + the YAML headers""" + doc_headers = self.data.children[1] # Throw index error if none found + + for s in doc_headers.strings: + label, contents = s.split(":", 1) + if label.lower() == "subtitle": + return contents.strip() + + # If title not found, return an empty string for display purposes + return '' + + def get_block_titled(self, title, heading_level=2, ast_node=None): + """Examine children. Return all children of the given node that: + a) are blockquoted elements, and + b) contain a heading with the specified text, at the specified level. + For example, this can be used to find the "Prerequisites" section + in index.md + + Returns empty list if no appropriate node is found""" + if ast_node is None: + ast_node = self.data + return [n for n in ast_node.children + if self.is_block(n) and + self.has_section_heading( + title, + ast_node=n, + heading_level=heading_level, + show_msg=False)] + + def get_section_headings(self, ast_node=None): + """Returns a list of ast nodes that are headings""" + if ast_node is None: + ast_node = self.data + return [n for n in ast_node.children if self.is_heading(n)] + + def get_link_info(self, link_node): + """Given a link node, return the link title and destination""" + if not self.is_external(link_node): + raise TypeError("Cannot apply this method to something that is not a link") + + dest = link_node.destination + try: + link_text = link_node.label[0].c + except: + link_text = None + + return dest, link_text + + def find_external_links(self, ast_node=None): + """Recursive function that locates all references to external content + under specified node. (links or images)""" + ast_node = ast_node or self.data + + # Link can be node itself, or hiding in inline content + links = [n for n in ast_node.inline_content + if self.is_external(n)] + + if self.is_external(ast_node): + links.append(ast_node) + + # Also look for links in sub-nodes + for n in ast_node.children: + links.extend(self.find_external_links(n)) + + return links + + def has_section_heading(self, section_title, ast_node=None, + heading_level=2, limit=sys.maxsize, show_msg=True): + """Does the file contain (<= x copies of) specified heading text? + Will strip off any CSS attributes when looking for the section title""" + if ast_node is None: + ast_node = self.data + + num_nodes = len([n for n in self.get_section_headings(ast_node) + if (strip_attrs(n.strings[0]) == section_title) + and (n.level == heading_level)]) + + # Suppress error msg if used as a helper method + if show_msg and num_nodes == 0: + logging.error("Document does not contain the specified " + "heading: {0}".format(section_title)) + elif show_msg and num_nodes > limit: + logging.error("Document must not contain more than {0} copies of" + " the heading {1}".format(limit, section_title or 0)) + elif show_msg: + logging.info("Verified that document contains the specified" + " heading: {0}".format(section_title)) + return (0 < num_nodes <= limit) + + def has_number_children(self, ast_node, + exact=None, minc=0, maxc=sys.maxsize): + """Does the specified node (such as a bulleted list) have the expected + number of children?""" + + if exact: # If specified, must have exactly this number of children + minc = maxc = exact + + return (minc <= len(ast_node.children) <= maxc) + + # Helpers, in case the evolving CommonMark spec changes the names of nodes + def is_hr(self, ast_node): + """Is the node a horizontal rule (hr)?""" + return ast_node.t == 'HorizontalRule' + + def is_heading(self, ast_node): + """Is the node a heading/ title?""" + return ast_node.t == "ATXHeader" + + def is_paragraph(self, ast_node): + """Is the node a paragraph?""" + return ast_node.t == "Paragraph" + + def is_list(self, ast_node): + """Is the node a list? (ordered or unordered)""" + return ast_node.t == "List" + + def is_link(self, ast_node): + """Is the node a link?""" + return ast_node.t == "Link" + + def is_external(self, ast_node): + """Does the node reference content outside the file? (image or link)""" + return ast_node.t in ("Link", "Image") + + def is_block(self, ast_node): + """Is the node a BlockQuoted element?""" + return ast_node.t == "BlockQuote" From 9f05f7f9367c89d5fd2073adb3969f2b010bdf1f Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 5 Dec 2014 19:05:20 -0200 Subject: [PATCH 0116/1182] Add id to glossary entry This is needed to enable users jump to glossary entries. --- tools/id4glossary.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 tools/id4glossary.py diff --git a/tools/id4glossary.py b/tools/id4glossary.py new file mode 100755 index 000000000..d77f52b3d --- /dev/null +++ b/tools/id4glossary.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +"""Pandoc filter to convert add ids to glossary entries. + +Usage: + + pandoc source.md --filter=id4glossary.py --output=output.html +""" +import pandocfilters as pf + +def normalize_keyword(keyword): + """Normalize keyword for became id + + - Replace white space with '-' + - Convert to lowercase""" + return keyword.lower().replace(' ', '-') + +def keyword2html(keyword_node): + """Return HTML version of keyword with id.""" + keyword = ' '.join([word['c'] for word in keyword_node if word['t'] == 'Str']) + id = normalize_keyword(keyword) + return [{"t": "Span", + "c": [[id, [],[]], + keyword_node]}] + +def id4glossary(key, value, format, meta): + """Add id to keywords at glossary.""" + if "subtitle" in meta and \ + ''.join([string['c'] for string in meta["subtitle"]['c']]) == 'Reference': + if key == "DefinitionList": + for definition in value: + definition[0] = keyword2html(definition[0]) + return {"t": key, + "c": value} + +if __name__ == '__main__': + pf.toJSONFilter(id4glossary) From b1a8ca56099f75f2ffbb9afe74055e5b44931d69 Mon Sep 17 00:00:00 2001 From: Aaron O'Leary Date: Sat, 6 Dec 2014 00:49:55 +0000 Subject: [PATCH 0117/1182] use pandocfilters.stringify --- tools/id4glossary.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/id4glossary.py b/tools/id4glossary.py index d77f52b3d..686cfa1d9 100755 --- a/tools/id4glossary.py +++ b/tools/id4glossary.py @@ -16,7 +16,7 @@ def normalize_keyword(keyword): def keyword2html(keyword_node): """Return HTML version of keyword with id.""" - keyword = ' '.join([word['c'] for word in keyword_node if word['t'] == 'Str']) + keyword = pf.stringify(keyword_node) id = normalize_keyword(keyword) return [{"t": "Span", "c": [[id, [],[]], @@ -24,8 +24,7 @@ def keyword2html(keyword_node): def id4glossary(key, value, format, meta): """Add id to keywords at glossary.""" - if "subtitle" in meta and \ - ''.join([string['c'] for string in meta["subtitle"]['c']]) == 'Reference': + if "subtitle" in meta and pf.stringify(meta['subtitle']) == 'Reference': if key == "DefinitionList": for definition in value: definition[0] = keyword2html(definition[0]) From 8354fc65635bf85b8e8b5ef8e5f7bc87e22f91b9 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 8 Dec 2014 18:41:43 -0500 Subject: [PATCH 0118/1182] Updating files to move into root directory --- pages/01-one.md => 01-one.md | 0 pages/02-two.md => 02-two.md | 0 DESIGN.md | 28 +++++++------ FAQ.md | 3 +- LAYOUT.md | 38 ++++++++++------- pages/LICENSE.md => LICENSE.md | 0 Makefile | 47 +++++++++++++++++++++ README.md | 19 ++++----- pages/discussion.md => discussion.md | 0 pages/index.md => index.md | 0 pages/instructors.md => instructors.md | 0 pages/motivation.md => motivation.md | 0 pages/Makefile | 58 -------------------------- pages/reference.md => reference.md | 0 14 files changed, 96 insertions(+), 97 deletions(-) rename pages/01-one.md => 01-one.md (100%) rename pages/02-two.md => 02-two.md (100%) rename pages/LICENSE.md => LICENSE.md (100%) create mode 100644 Makefile rename pages/discussion.md => discussion.md (100%) rename pages/index.md => index.md (100%) rename pages/instructors.md => instructors.md (100%) rename pages/motivation.md => motivation.md (100%) delete mode 100644 pages/Makefile rename pages/reference.md => reference.md (100%) diff --git a/pages/01-one.md b/01-one.md similarity index 100% rename from pages/01-one.md rename to 01-one.md diff --git a/pages/02-two.md b/02-two.md similarity index 100% rename from pages/02-two.md rename to 02-two.md diff --git a/DESIGN.md b/DESIGN.md index b5fd710e6..cde70fe8b 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -56,16 +56,20 @@ this template is organized the way it is: 6. Using Pandoc instead of Jekyll means that we have to compile our Markdown into HTML on our own machines and commit it to the - `gh-pages` branch of the lesson's GitHub repository. In order to - keep our source files and generated files separate, we put our - source files in a sub-directory called `pages`, and compile them - "upward" into the root directory of the lesson's repository. + `gh-pages` branch of the lesson's GitHub repository. - **Note:** while it's usually considered bad practice to put - computer-generated files under version control, the HTML pages put - into the lesson's root directory by Pandoc *must* be committed to - version control in order for the lesson to be displayed properly - on GitHub. + It's considered bad practice to put computer-generated files under + version control, but the HTML pages put into the lesson's root + directory by Pandoc *must* be committed to version control in + order for the lesson to be displayed properly on GitHub. + + It's also considered bad practice to put generated files in the + same directory as source files. We do it because some source + files, such as R Markdown and IPython Notebook files, are + executable, and contain paths to things like images and data + files. If we put our source files in a sub-directory, those paths + won't work (or conversely, if we put our generated files in a + different directory, the paths won't work there). 7. In order to display properly, our generated HTML pages need artwork, CSS style files, and a few bits of Javascript. We could @@ -76,6 +80,6 @@ this template is organized the way it is: One final note: we try not to put HTML inside Markdown because it's ugly to read and write, and error-prone to process. Instead, we put things that ought to be in `
` blocks, like the learning -objectives and challenge exercises, in blocks indented with `>`, and -do a bit of post-processing to attach the right CSS classes to these -blocks. +objectives and challenge exercises, in blockquotes indented with `>`, +and do a bit of post-processing to attach the right CSS classes to +these blocks. diff --git a/FAQ.md b/FAQ.md index 9c1328402..c8639f558 100644 --- a/FAQ.md +++ b/FAQ.md @@ -2,7 +2,7 @@ * *Where can I get help?* - Mail us at [admin@software-carpentry.org](mailto:admin@software-carpentry.org), + Mail [admin@software-carpentry.org](mailto:admin@software-carpentry.org), or join our [discussion list](http://lists.software-carpentry.org/mailman/listinfo/discuss_lists.software-carpentry.org) and ask for help there. @@ -21,6 +21,7 @@ Because it supports a richer dialect of Markdown than Jekyll (the converter that GitHub uses by default). + In particular, Pandoc can do tables and allows us to add styles to headings. * *What do the [labels](https://github.com/swcarpentry/lesson-template/issues?q=is%3Aopen+is%3Aissue) mean?* diff --git a/LAYOUT.md b/LAYOUT.md index 5b87c14a9..b3353bafd 100644 --- a/LAYOUT.md +++ b/LAYOUT.md @@ -7,15 +7,17 @@ submodules or clever tricks with symbolic links). 1. `README.md`: initially a copy of this file. It should be overwritten with short description of the lesson. -2. `pages/`: a sub-directory containing the source of the lesson's - website. See "Pages" below. +2. Other files in the root directory: the source of the lesson's + web pages (and possibly also things like IPython Notebooks and + R Markdown files that those pages are generated from). 3. `code/`, `data/`, and `fig/`: sub-directories containing sample code, data files, and figures. See "Code, Data, and Figures" below. -4. `css/`, `img/`, and `js/`: style sheets, artwork, and Javascript - used in the lesson's web site. See "Support Files" below. +4. `css/`, `img/`, `js/`, and `deck.js/`: style sheets, artwork, and + Javascript used in the lesson's web site. See "Support Files" + below. 5. `_layouts/` and `_includes/`: page templates and inclusions. See "Support Files" below. @@ -40,17 +42,22 @@ plots, and diagrams used in the lessons must go in a `fig/` directory. data file (since the program's working directory will be the root directory, not the `data` directory). -2. We strongly prefer SVG for line drawings, since they are smaller, +2. IPython Notebooks and R Markdown files, which are both code and + the source for web pages, should go in the root directory. + +3. We strongly prefer SVG for line drawings, since they are smaller, scale better, and are easier to edit. Screenshots and other raster images must be PNG or JPEG format. # Support Files Files used to display the lesson, such as artwork, CSS, and -Javascript, are stored in directories of their own. We keep website -artwork separate from graphics used in the lesson's to make it simple -to update the former automatically. Most authors should not need to -modify any of the support files themselves. +Javascript, are stored in `img/`, `css/`, and `js/` directories of +their own, while the `deck.js/` directory contains files used to make +HTML slideshows. We keep website artwork in the `img/` directory +separate from figures used in the lesson (which are stored in `fig/`) +to make it simple to update the former automatically. Most authors +should not need to modify any of the support files themselves. The `_layouts/` directory holds the page templates used to translate Markdown to HTML, while the `_includes/` directory holds snippets of @@ -68,8 +75,7 @@ lessons: # Pages -The `pages/` directory holds the content of the lesson, and must -contain: +The root directory holds the content of the lesson, and must contain: 1. `Makefile`: contains commands to check, preview, and update the repository. Authors should not need to modify this file. @@ -99,9 +105,9 @@ contain: Note that the lesson's title is repeated in several files. We could put this in the Makefile, and insert it into pages when compiling, but -then authors would have to edit the Makefile (which we're trying to -avoid requiring). We could also put it in some sort of configuration -file, but again, we're trying to avoid those. +then authors would have to edit the Makefile (which we want to avoid). +We could also put it in some sort of configuration file, but again, +we're trying to avoid those. ## Home Page @@ -151,7 +157,7 @@ Each topic page must be structured as follows: subtitle: Topic Title minutes: 10 --- - > ## Learning Objectives {.objectives} + > ## Learning Objectives > > * Learning objective 1 > * Learning objective 2 @@ -204,6 +210,8 @@ Each topic page must be structured as follows: objective. 4. Definitions of terms are marked in **bold** (like `**this**`). + Nothing else should be marked as bold text --- use *italics* for + for all other emphasis. ## Motivational Slides diff --git a/pages/LICENSE.md b/LICENSE.md similarity index 100% rename from pages/LICENSE.md rename to LICENSE.md diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..f16100190 --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +# Files. +SRC_PAGES = $(wildcard *.md) +DST_PAGES = $(patsubst %.md,%.html,$(SRC_PAGES)) + +# Inclusions. +INCLUDES = \ + -Vheader="$$(cat _includes/header.html)" \ + -Vbanner="$$(cat _includes/banner.html)" \ + -Vfooter="$$(cat _includes/footer.html)" \ + -Vjavascript="$$(cat _includes/javascript.html)" + +# Default action is to show what commands are available. +all : commands + +## preview : Build website locally for checking. +preview : $(DST_PAGES) + +# Pattern for slides (different parameters and template). +motivation.html : motivation.md _layouts/slides.html + pandoc -s -t html \ + --template=_layouts/slides \ + -o $@ $< + +# Pattern to build a generic page. +%.html : %.md _layouts/page.html + pandoc -s -t html \ + --template=_layouts/page \ + --filter=tools/blockquote2div.py \ + $(INCLUDES) \ + -o $@ $< + +## commands : Display available commands. +commands : Makefile + @sed -n 's/^##//p' $< + +## settings : Show variables and settings. +settings : + @echo 'SRC_PAGES:' $(SRC_PAGES) + @echo 'DST_PAGES:' $(DST_PAGES) + +## clean : Clean up temporary and intermediate files. +clean : + @rm -rf $$(find . -name '*~' -print) + +# very-clean : Remove generated HTML. +very-clean : + @rm -f $(DST_PAGES) diff --git a/README.md b/README.md index bc178cb77..99e7f8cf5 100644 --- a/README.md +++ b/README.md @@ -38,24 +38,21 @@ lesson is `data-cleanup`. 6. Build the HTML pages for your lesson: ~~~ - $ cd data-cleanup/pages # or just 'cd pages' if you are already in data-cleanup $ make preview ~~~ - Note that this step requires you to have installed Pandoc - (described below). Note also that it is *not* optional: you - *must* build the web pages for your lesson yourself and push - them to GitHub, rather than relying on GitHub to build them - for you. + This step requires you to have installed Pandoc (described below). + It is *not* optional: you *must* build the web pages for your + lesson yourself and push them to GitHub, rather than relying on + GitHub to build them for you. 7. Commit your changes *and the HTML pages in the root directory of your lesson repository* and push to the `gh-pages` branch of your repository: ~~~ - $ cd data-cleanup # or 'cd ..' if you are in the 'pages' directory - $ git add pages/changed-files.md - $ git add *.html + $ cd data-cleanup + $ git add changed-files.md *.html $ git commit -m "Explanatory message" $ git push origin gh-pages ~~~ @@ -83,8 +80,8 @@ the `gh-pages` branch of their lesson website. To do this: pip install pandocfilters ~~~ -3. To convert Markdown pages in the `pages` directory into HTML pages - in the root directory, go into the `pages` directory and run: +3. To convert Markdown files into HTML pages in the root directory, go + into the root directory of your lesson and run: ~~~ $ make preview diff --git a/pages/discussion.md b/discussion.md similarity index 100% rename from pages/discussion.md rename to discussion.md diff --git a/pages/index.md b/index.md similarity index 100% rename from pages/index.md rename to index.md diff --git a/pages/instructors.md b/instructors.md similarity index 100% rename from pages/instructors.md rename to instructors.md diff --git a/pages/motivation.md b/motivation.md similarity index 100% rename from pages/motivation.md rename to motivation.md diff --git a/pages/Makefile b/pages/Makefile deleted file mode 100644 index 8939a6497..000000000 --- a/pages/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# Directories. -SRC_DIR = . -DST_DIR = .. - -# Files. -SRC_PAGES = $(wildcard *.md) -DST_PAGES = $(patsubst %.md,$(DST_DIR)/%.html,$(SRC_PAGES)) - -# Inclusions. -INCLUDES = \ - -Vheader="$$(cat ../_includes/header.html)" \ - -Vbanner="$$(cat ../_includes/banner.html)" \ - -Vfooter="$$(cat ../_includes/footer.html)" \ - -Vjavascript="$$(cat ../_includes/javascript.html)" - -# Default action is to show what commands are available. -all : commands - -## preview : Build website locally for checking. -preview : $(DST_PAGES) - -# Pattern for slides (different parameters and template). -$(DST_DIR)/motivation.html : $(SRC_DIR)/motivation.md ../_layouts/slides.html - pandoc -s -t html \ - --template=../_layouts/slides \ - -o $@ $< - -# Pattern to build a generic page. -$(DST_DIR)/%.html : $(SRC_DIR)/%.md ../_layouts/page.html - pandoc -s -t html \ - --template=../_layouts/page \ - --filter=../tools/blockquote2div.py \ - $(INCLUDES) \ - -o $@ $< - -## commands : Display available commands. -commands : Makefile - @sed -n 's/^##//p' $< - -## update : Update the shared files from the GitHub repo holding them. -# FIXME: need to create that repo. -update : - git pull --rebase=false https://github.com/swcarpentry/lesson-template-shared.git master - -## settings : Show variables and settings. -settings : - @echo 'SRC_DIR:' $(SRC_DIR) - @echo 'DST_DIR:' $(DST_DIR) - @echo 'SRC_PAGES:' $(SRC_PAGES) - @echo 'DST_PAGES:' $(DST_PAGES) - -## clean : Clean up temporary and intermediate files. -clean : - @rm -rf $$(find .. -name '*~' -print) - -# very-clean : Remove generated HTML. -very-clean : - @rm -f $(DST_PAGES) diff --git a/pages/reference.md b/reference.md similarity index 100% rename from pages/reference.md rename to reference.md From da626812e4360258c1f76c89feb11b0f496e5a54 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Tue, 9 Dec 2014 00:21:49 -0200 Subject: [PATCH 0119/1182] Add id4glossary.py into Makefile --- pages/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/Makefile b/pages/Makefile index 8939a6497..8c8ccaf14 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -30,6 +30,7 @@ $(DST_DIR)/%.html : $(SRC_DIR)/%.md ../_layouts/page.html pandoc -s -t html \ --template=../_layouts/page \ --filter=../tools/blockquote2div.py \ + --filter=../tools/id4glossary.py \ $(INCLUDES) \ -o $@ $< From 0428c4998ad6eb4246e89d5b683c551aba21cb6d Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Tue, 9 Dec 2014 00:15:24 -0200 Subject: [PATCH 0120/1182] Store Pandoc's filter at tools/filters --- pages/Makefile | 4 ++-- tools/{ => filters}/blockquote2div.py | 0 tools/{ => filters}/id4glossary.py | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename tools/{ => filters}/blockquote2div.py (100%) rename tools/{ => filters}/id4glossary.py (100%) diff --git a/pages/Makefile b/pages/Makefile index 8c8ccaf14..d30b47e17 100644 --- a/pages/Makefile +++ b/pages/Makefile @@ -29,8 +29,8 @@ $(DST_DIR)/motivation.html : $(SRC_DIR)/motivation.md ../_layouts/slides.html $(DST_DIR)/%.html : $(SRC_DIR)/%.md ../_layouts/page.html pandoc -s -t html \ --template=../_layouts/page \ - --filter=../tools/blockquote2div.py \ - --filter=../tools/id4glossary.py \ + --filter=../tools/filters/blockquote2div.py \ + --filter=../tools/filters/id4glossary.py \ $(INCLUDES) \ -o $@ $< diff --git a/tools/blockquote2div.py b/tools/filters/blockquote2div.py similarity index 100% rename from tools/blockquote2div.py rename to tools/filters/blockquote2div.py diff --git a/tools/id4glossary.py b/tools/filters/id4glossary.py similarity index 100% rename from tools/id4glossary.py rename to tools/filters/id4glossary.py From 5b9d0b9af17159ac10422d4136ee65798a622858 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Tue, 9 Dec 2014 08:08:10 -0500 Subject: [PATCH 0121/1182] Clearing up status of notebooks and R Markdown files --- DESIGN.md | 13 +++++++------ LAYOUT.md | 10 ++++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index cde70fe8b..cbac57dc0 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -64,12 +64,13 @@ this template is organized the way it is: order for the lesson to be displayed properly on GitHub. It's also considered bad practice to put generated files in the - same directory as source files. We do it because some source - files, such as R Markdown and IPython Notebook files, are - executable, and contain paths to things like images and data - files. If we put our source files in a sub-directory, those paths - won't work (or conversely, if we put our generated files in a - different directory, the paths won't work there). + same directory as source files. We do it because some authors may + use auxiliary source files such as R Markdown and IPython Notebook + files which are executable, and contain paths to things like + images and data files. If we put our source files in a + sub-directory, those paths won't work (or conversely, if we put + our generated files in a different directory, the paths won't work + there). 7. In order to display properly, our generated HTML pages need artwork, CSS style files, and a few bits of Javascript. We could diff --git a/LAYOUT.md b/LAYOUT.md index b3353bafd..c9b7043a5 100644 --- a/LAYOUT.md +++ b/LAYOUT.md @@ -7,9 +7,9 @@ submodules or clever tricks with symbolic links). 1. `README.md`: initially a copy of this file. It should be overwritten with short description of the lesson. -2. Other files in the root directory: the source of the lesson's - web pages (and possibly also things like IPython Notebooks and - R Markdown files that those pages are generated from). +2. Other files in the root directory: the source of the lesson's web + pages (and possibly auxiliary files like IPython Notebooks and R + Markdown files). 3. `code/`, `data/`, and `fig/`: sub-directories containing sample code, data files, and figures. See "Code, Data, and Figures" @@ -43,7 +43,9 @@ plots, and diagrams used in the lessons must go in a `fig/` directory. directory, not the `data` directory). 2. IPython Notebooks and R Markdown files, which are both code and - the source for web pages, should go in the root directory. + the source for web pages, should go in the root directory. These + will not be checked by our validation tool, or indexed by other + tools we plan to build. 3. We strongly prefer SVG for line drawings, since they are smaller, scale better, and are easier to edit. Screenshots and other raster From e4cb65971cc48b1d621b3e5ed041a32c40ca7563 Mon Sep 17 00:00:00 2001 From: Aaron O'Leary Date: Wed, 10 Dec 2014 13:23:58 +0000 Subject: [PATCH 0122/1182] fill in missing '$ ' in prompt --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 99e7f8cf5..70d89c7d0 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ the `gh-pages` branch of their lesson website. To do this: filters for Pandoc: ~~~ - pip install pandocfilters + $ pip install pandocfilters ~~~ 3. To convert Markdown files into HTML pages in the root directory, go From 7d3bc32215cf957e9f20e09bc9686dd00261afea Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Wed, 10 Dec 2014 15:00:53 -0500 Subject: [PATCH 0123/1182] Update validator for changes in directory structure --- tools/check | 15 +++++++++++---- tools/test_check.py | 19 +++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/tools/check b/tools/check index 12a402cfd..23261b6a7 100755 --- a/tools/check +++ b/tools/check @@ -59,8 +59,7 @@ class MarkdownValidator(object): if filename: # Expect Markdown files to be in same directory as the input file self.markdown_dir = os.path.dirname(filename) - self.lesson_dir = os.path.abspath( # Parent directory of lesson - os.path.join(self.markdown_dir, os.pardir)) + self.lesson_dir = self.markdown_dir with open(filename, 'rU') as f: self.markdown = f.read() else: @@ -68,7 +67,7 @@ class MarkdownValidator(object): self.lesson_dir = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir)) - self.markdown_dir = os.path.join(self.lesson_dir, "pages") + self.markdown_dir = self.lesson_dir self.markdown = markdown ast = self._parse_markdown(self.markdown) @@ -217,7 +216,8 @@ class MarkdownValidator(object): if re.match(r"^[\w,\s-]+\.(html?)", dest, re.IGNORECASE): # HTML files in same folder are made from Markdown; special tests - expected_md_fn = os.path.splitext(dest)[0] + os.extsep + "md" + fn = dest.split("#")[0] # Split anchor name from filename + expected_md_fn = os.path.splitext(fn)[0] + os.extsep + "md" expected_md_path = os.path.join(self.markdown_dir, expected_md_fn) if not os.path.isfile(expected_md_path): @@ -531,6 +531,9 @@ LESSON_TEMPLATES = {"index": (IndexPageValidator, "^index"), "license": (LicensePageValidator, "^LICENSE"), "discussion": (DiscussionPageValidator, "^discussion")} +# List of files in the lesson directory that should not be validated at all +SKIP_FILES = ("DESIGN.md", "FAQ.md", "LAYOUT.md", "README.md") + def identify_template(filepath): """Identify template @@ -546,6 +549,10 @@ def identify_template(filepath): def validate_single(filepath, template=None): """Validate a single Markdown file based on a specified template""" + if os.path.basename(filepath) in SKIP_FILES: + # Silently pass certain non-lesson files without validating them + return True + template = template or identify_template(filepath) if template is None: logging.error( diff --git a/tools/test_check.py b/tools/test_check.py index 451cf78c4..2f0966f68 100644 --- a/tools/test_check.py +++ b/tools/test_check.py @@ -7,6 +7,9 @@ # Make log messages visible to help audit test failures check.start_logging(level=logging.DEBUG) +MARKDOWN_DIR = os.path.abspath( + os.path.join(os.path.dirname(__file__), os.pardir)) + class BaseTemplateTest(unittest.TestCase): """Common methods for testing template validators""" @@ -22,7 +25,7 @@ def _create_validator(self, markdown): class TestAstHelpers(BaseTemplateTest): - SAMPLE_FILE = '../pages/index.md' + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, 'index.md') VALIDATOR = check.MarkdownValidator def test_link_text_extracted(self): @@ -38,7 +41,7 @@ def test_link_text_extracted(self): class TestIndexPage(BaseTemplateTest): """Test the ability to correctly identify and validate specific sections of a markdown file""" - SAMPLE_FILE = "../pages/index.md" + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "index.md") VALIDATOR = check.IndexPageValidator def test_sample_file_passes_validation(self): @@ -250,7 +253,7 @@ def test_non_html_links_are_path_sensitive(self): class TestTopicPage(BaseTemplateTest): """Verifies that the topic page validator works as expected""" - SAMPLE_FILE = "../pages/01-one.md" + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "01-one.md") VALIDATOR = check.TopicPageValidator def test_sample_file_passes_validation(self): @@ -260,7 +263,7 @@ def test_sample_file_passes_validation(self): class TestMotivationPage(BaseTemplateTest): """Verifies that the instructors page validator works as expected""" - SAMPLE_FILE = "../pages/motivation.md" + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "motivation.md") VALIDATOR = check.MotivationPageValidator def test_sample_file_passes_validation(self): @@ -270,7 +273,7 @@ def test_sample_file_passes_validation(self): class TestReferencePage(BaseTemplateTest): """Verifies that the reference page validator works as expected""" - SAMPLE_FILE = "../pages/reference.md" + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "reference.md") VALIDATOR = check.ReferencePageValidator def test_missing_glossary_definition(self): @@ -329,7 +332,7 @@ def test_sample_file_passes_validation(self): class TestInstructorPage(BaseTemplateTest): """Verifies that the instructors page validator works as expected""" - SAMPLE_FILE = "../pages/instructors.md" + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "instructors.md") VALIDATOR = check.InstructorPageValidator def test_sample_file_passes_validation(self): @@ -338,7 +341,7 @@ def test_sample_file_passes_validation(self): class TestLicensePage(BaseTemplateTest): - SAMPLE_FILE = '../pages/LICENSE.md' + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "LICENSE.md") VALIDATOR = check.LicensePageValidator def test_sample_file_passes_validation(self): @@ -354,7 +357,7 @@ def test_modified_file_fails_validation(self): class TestDiscussionPage(BaseTemplateTest): - SAMPLE_FILE = '../pages/discussion.md' + SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "discussion.md") VALIDATOR = check.DiscussionPageValidator def test_sample_file_passes_validation(self): From 3eaab252ad43a066d016390b8e70449efe212208 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Thu, 11 Dec 2014 20:29:12 -0500 Subject: [PATCH 0124/1182] Removing example files (they belong in the gh-pages branch) --- 01-one.md | 41 ------ 02-two.md | 37 ------ DESIGN.md | 86 ------------ FAQ.md | 41 ------ LAYOUT.md | 345 ------------------------------------------------ README.md | 170 ------------------------ code/script.sh | 3 - data/data.csv | 2 - discussion.md | 10 -- fig/example.svg | 31 ----- index.md | 22 --- instructors.md | 38 ------ motivation.md | 21 --- reference.md | 14 -- 14 files changed, 861 deletions(-) delete mode 100644 01-one.md delete mode 100644 02-two.md delete mode 100644 DESIGN.md delete mode 100644 FAQ.md delete mode 100644 LAYOUT.md delete mode 100644 README.md delete mode 100755 code/script.sh delete mode 100644 data/data.csv delete mode 100644 discussion.md delete mode 100644 fig/example.svg delete mode 100644 index.md delete mode 100644 instructors.md delete mode 100644 motivation.md delete mode 100644 reference.md diff --git a/01-one.md b/01-one.md deleted file mode 100644 index ca4dc268d..000000000 --- a/01-one.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -layout: page -title: Lesson Title -subtitle: Topic Title One -minutes: 10 ---- -> ## Learning Objectives -> -> * Learning objective 1 -> * Learning objective 2 - -Paragraphs of text --- possibly including **definitions** --- -mixed with: - -~~~ {.python} -some code: - to be displayed -~~~ -~~~ {.output} -output -from -program -~~~ -~~~ {.error} -error reports from program (if any) -~~~ - -and possibly including: - -> ## Callout Box {.callout} -> -> An aside of some kind. - -or an image from the `figs` directory: - -![this is the image's title](fig/example.svg "this is the image's alt text") - -> ## Challenge Title {.challenge} -> -> Description of a single challenge. -> There may be several challenges. diff --git a/02-two.md b/02-two.md deleted file mode 100644 index 0412d1bb1..000000000 --- a/02-two.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: page -title: Lesson Title -subtitle: Topic Title Two -minutes: 10 ---- -> ## Learning Objectives -> -> * Learning objective 1 -> * Learning objective 2 - -Paragraphs of text --- possibly including **definitions** --- -mixed with: - -~~~ {.python} -some code: - to be displayed -~~~ -~~~ {.output} -output -from -program -~~~ -~~~ {.error} -error reports from program (if any) -~~~ - -and possibly including: - -> ## Callout Box {.callout} -> -> An aside of some kind. - -> ## Challenge Title {.challenge} -> -> Description of a single challenge. -> There may be several challenges. diff --git a/DESIGN.md b/DESIGN.md deleted file mode 100644 index cbac57dc0..000000000 --- a/DESIGN.md +++ /dev/null @@ -1,86 +0,0 @@ -## Background and Design - -There are a few things you need to know in order to understand why -this template is organized the way it is: - -1. Git uses the term *clone* to mean "a copy of a repository". - GitHub uses the term *fork* to mean, "a copy of a GitHub-hosted - repo that is also hosted on GitHub", and the term *clone* to mean - "a copy of a GitHub-hosted repo that's located on someone else's - machine". In both cases, the duplicate has a remote called - `origin` that points to the original repo; other remotes can be - added manually. - -2. A user on GitHub can only have one fork of a particular repo. - This is a problem for us because an author may be involved in - writing several lessons, each of which has its own website repo. - Those website repositories ought to be forks of this one, but - since GitHub doesn't allow that, we've had to find a workaround. - -3. If a repository has a branch called `gh-pages` (which stands for - "GitHub pages"), then GitHub uses the HTML and Markdown files in - that branch to create a website for the repository. If the - repository's URL is `http://github.com/darwin/finches`, the URL - for the website is `http://darwin.github.io/finches`. - -4. We use Markdown for writing pages because it's simple to learn, - and isn't tied to any specific language (the ReStructured Text - format popular in the Python world, for example, is a complete - unknown to R programmers). If authors want to use something else - to author their lessons (e.g., IPython Notebooks), it's up to them - to generate and commit Markdown formatted according to the rules - below. - - **Note:** we do *not* prescribe what tools instructors should use - when actually teaching. The IPython Notebook, Python IDEs like - Spyder, and the GOCLI (Good Ol' Command Line Interpreter) are all - equally welcome up on stage --- all we specify is the format of - the lesson notes. - -5. We use Pandoc to process pages instead of Jekyll (GitHub's default - conversion tool) because Pandoc supports a much richer dialect of - Markdown than Jekyll. Like Jekyll, Pandoc looks for a header at - the top of each page formatted like this: - - ~~~ - --- - variable: value - other_variable: other_value - --- - ...stuff in the page... - ~~~ - - and inserts the values of those variables into the page when - formatting this. Lesson authors will usually not have to worry - about this. - -6. Using Pandoc instead of Jekyll means that we have to compile our - Markdown into HTML on our own machines and commit it to the - `gh-pages` branch of the lesson's GitHub repository. - - It's considered bad practice to put computer-generated files under - version control, but the HTML pages put into the lesson's root - directory by Pandoc *must* be committed to version control in - order for the lesson to be displayed properly on GitHub. - - It's also considered bad practice to put generated files in the - same directory as source files. We do it because some authors may - use auxiliary source files such as R Markdown and IPython Notebook - files which are executable, and contain paths to things like - images and data files. If we put our source files in a - sub-directory, those paths won't work (or conversely, if we put - our generated files in a different directory, the paths won't work - there). - -7. In order to display properly, our generated HTML pages need - artwork, CSS style files, and a few bits of Javascript. We could - load these from the web, but that would make offline authoring - difficult. Instead, each lesson's repository has a copy of these - files, and a way of updating them (and only them) on demand. - -One final note: we try not to put HTML inside Markdown because it's -ugly to read and write, and error-prone to process. Instead, we put -things that ought to be in `
` blocks, like the learning -objectives and challenge exercises, in blockquotes indented with `>`, -and do a bit of post-processing to attach the right CSS classes to -these blocks. diff --git a/FAQ.md b/FAQ.md deleted file mode 100644 index c8639f558..000000000 --- a/FAQ.md +++ /dev/null @@ -1,41 +0,0 @@ -## FAQ - -* *Where can I get help?* - - Mail [admin@software-carpentry.org](mailto:admin@software-carpentry.org), - or join our [discussion list](http://lists.software-carpentry.org/mailman/listinfo/discuss_lists.software-carpentry.org) - and ask for help there. - -* *Where can I report problems or suggest improvements?* - - Please - [file an issue](https://github.com/swcarpentry/lesson-template/issues?q=is%3Aopen+is%3Aissue) - or [mail us](mailto:admin@software-carpentry.org). - -* *Why does the lesson repository have to be created from scratch? Why not fork `lesson-template` on GitHub?* - - Because any particular user can only have one fork of a repository, - but instructors frequently need to work on several workshops at once. - -* *Why use Pandoc? Why not some other markup language and some other converter?* - - Because it supports a richer dialect of Markdown than Jekyll - (the converter that GitHub uses by default). - In particular, Pandoc can do tables and allows us to add styles to headings. - -* *What do the [labels](https://github.com/swcarpentry/lesson-template/issues?q=is%3Aopen+is%3Aissue) mean?* - - * `bug`: something is wrong in our tools or documentation - * `discussion`: marks issues used for conversations about specific problems and questions - * `duplicate`: marks an issue that was closed as redundant (include the number of the original issue in the closing comment) - * `enhancement`: asks for, or adds, a new feature or new information - * `filed-by-newcomer`: issue or pull request was filed by someone who is relatively new to GitHub and/or this project, and would appreciate guidance as well as feedback - * `getting-started`: issue or pull request is suitable for someone new to GitHub and/or this project - * `help-wanted`: a question or request for assistance - * `left-as-was`: marks an issue closed because the item in question will be left as it was - * `suitable-for-newcomer`: issue or pull request is a good starting point for someone who is relatively new to GitHub and/or this project - * `work-in-progress`: a pull request that is not yet ready for review - -## Debugging - -Please add notes about problems and solutions below. diff --git a/LAYOUT.md b/LAYOUT.md deleted file mode 100644 index c9b7043a5..000000000 --- a/LAYOUT.md +++ /dev/null @@ -1,345 +0,0 @@ -# Lesson Layout - -Each lesson is stored in a directory laid out as described below. That -directory is a self-contained Git repository (i.e., there are no -submodules or clever tricks with symbolic links). - -1. `README.md`: initially a copy of this file. It should be - overwritten with short description of the lesson. - -2. Other files in the root directory: the source of the lesson's web - pages (and possibly auxiliary files like IPython Notebooks and R - Markdown files). - -3. `code/`, `data/`, and `fig/`: sub-directories containing sample - code, data files, and figures. See "Code, Data, and Figures" - below. - -4. `css/`, `img/`, `js/`, and `deck.js/`: style sheets, artwork, and - Javascript used in the lesson's web site. See "Support Files" - below. - -5. `_layouts/` and `_includes/`: page templates and inclusions. See - "Support Files" below. - -6. `tools/`: tools for managing lessons. See "Tools" below. - -# Code, Data, and Figures - -All of the software samples used in the lesson must go in a directory -called `code/`. Stand-alone data files must go in a directory called -`data/`. Groups of related data files must be put together in a -sub-directory of `data/` with a meaningful (short) name. Figures, -plots, and diagrams used in the lessons must go in a `fig/` directory. - -**Notes:** - -1. This mirrors the layout a scientist would use for actual work. - However, it may cause novice learners problems. If a program is - in `code/a.py`, and contains a reference to a data file - `../data/b.csv`, then if the user runs the program from the root - directory using `python code/a.py`, it will be unable to find the - data file (since the program's working directory will be the root - directory, not the `data` directory). - -2. IPython Notebooks and R Markdown files, which are both code and - the source for web pages, should go in the root directory. These - will not be checked by our validation tool, or indexed by other - tools we plan to build. - -3. We strongly prefer SVG for line drawings, since they are smaller, - scale better, and are easier to edit. Screenshots and other raster - images must be PNG or JPEG format. - -# Support Files - -Files used to display the lesson, such as artwork, CSS, and -Javascript, are stored in `img/`, `css/`, and `js/` directories of -their own, while the `deck.js/` directory contains files used to make -HTML slideshows. We keep website artwork in the `img/` directory -separate from figures used in the lesson (which are stored in `fig/`) -to make it simple to update the former automatically. Most authors -should not need to modify any of the support files themselves. - -The `_layouts/` directory holds the page templates used to translate -Markdown to HTML, while the `_includes/` directory holds snippets of -HTML that are used in several page layouts. These directories have -underscores at the start of their names to be consistent with Jekyll's -naming conventions, but the files they contain are for Pandoc. - -# Tools - -The `tools/` directory contains tools to help create and maintain -lessons: - -* `tools/check`: make sure that everything is formatted properly, and - print error messages identifying problems if it's not. - -# Pages - -The root directory holds the content of the lesson, and must contain: - -1. `Makefile`: contains commands to check, preview, and update the - repository. Authors should not need to modify this file. - -2. `index.md`: the home page for the lesson. (See "Home Page" below.) - -3. `dd-slug.md`: the topics in the lesson. `dd` is a sequence number - such as `01`, `02`, etc., and `slug` is an abbreviated single-word - mnemonic for the topic. Thus, `03-filesys.md` is the third topic in - this lesson, and is about the filesystem. (Note that we use hyphens - rather than underscores in filenames.) See "Topics" below. - -4. `motivation.md`: slides for a short introductory presentation (three - minutes or less) explaining what the lesson is about and why people - would want to learn it. See "Introductory Slides" below. - -5. `reference.md`: a cheat sheet summarizing key terms and commands, - syntax, etc., that can be printed and given to learners. See - "Reference Guide" below. - -6. `discussion.md`: notes about more advanced ideas that would - distract from the main lesson, and pointers to where to go next. - See "Discussion Page" below. - -7. `instructors.md`: the instructor's guide for the lesson. See - "Instructor's Guide" below. - -Note that the lesson's title is repeated in several files. We could -put this in the Makefile, and insert it into pages when compiling, but -then authors would have to edit the Makefile (which we want to avoid). -We could also put it in some sort of configuration file, but again, -we're trying to avoid those. - -## Home Page - -`index.md` must be structured as follows: - - --- - layout: lesson - title: Lesson Title - --- - Paragraph(s) of introductory material. - - > ## Prerequisites {.prereq} - > - > What learners need to know before tackling this lesson. - - ## Topics - - 1. [Topic Title 1](01-slug.html) - 2. [Topic Title 2](02-slug.html) - - ## Other Resources - - * [Motivation](motivation.html) - * [Reference Guide](reference.html) - * [Next Steps](discussion.html) - * [Instructor's Guide](instructors.html) - -**Notes:** - -1. The description of prerequisites is prose for human consumption, - not a machine-comprehensible list of dependencies. We may - supplement the former with the latter once we have more experience - with this lesson format and know what we actually want to do. - -2. Software installation and configuration instructions *aren't* in - the lesson, since they may be shared with other lessons. They will - be stored centrally on the Software Carpentry web site and linked - from the lessons that need them. - -## Topics - -Each topic page must be structured as follows: - - --- - layout: page - title: Lesson Title - subtitle: Topic Title - minutes: 10 - --- - > ## Learning Objectives - > - > * Learning objective 1 - > * Learning objective 2 - - Paragraphs of text --- possibly including **definitions** --- - mixed with: - - ~~~ {.python} - some code: - to be displayed - ~~~ - - and: - - ~~~ {.output} - output - from - program - ~~~ - - and: - - ~~~ {.error} - error reports from programs (if any) - ~~~ - - and possibly including some of these: - - > ## Callout Box {.callout} - > - > An aside of some kind. - - and one or more of these: - - > ## Challenge Title {.challenge} - > - > Description of a single challenge. - > There may be several challenges. - -**Notes:** - -1. The "expected time" heading is called minutes to encourage people - to create topics that are short (10-15 minutes at most). - -2. There are no sub-headings inside a topic other than the ones - shown. (If a topic needs sub-headings, it should be broken into - two or more topics.) - -3. Every challenge should relate explicitly back to a learning - objective. - -4. Definitions of terms are marked in **bold** (like `**this**`). - Nothing else should be marked as bold text --- use *italics* for - for all other emphasis. - -## Motivational Slides - -Every lesson must include a short slide deck suitable for a short -presentation (3 minutes or less) that the instructor can use to explain -to learners how knowing the subject will help them. The slides must -be laid out like this: - - --- - layout: slides - title: Why Make? - --- -
- ## Why This Topic? -
- -
- ## Some Other Point -
- - -**Notes:** - -1. This is the one place where we *must* use HTML tags in our Markdown - (to delimit slides). Everything inside the section markers should - be Markdown if possible. - -2. We use [deck.js](http://imakewebthings.com/deck.js/) for our slides - as it is simpler and prettier than alternatives like - [reveal.js](http://lab.hakim.se/reveal-js/). - -## Reference Guide - -The reference guide is a cheat sheet for learners to print, doodle on, -and take away. Its format is deliberately unconstrained for now, -since we'll need to see a few before we can decide how they ought to -be laid out (or whether they need to be laid out the same way at all). - -The last section of the reference guide must be a glossary laid out as -a definition list: - - --- - layout: page - title: Lesson Title - subtitle: Reference - --- - ...commands and examples... - - ## Glossary - - Key Word 1 - : Definition of first term - - Key Word 2 - : Definition of second term - -## Discussion Page - -The discussion page - - --- - layout: page - title: Lesson Title - subtitle: Discussion - --- - * First point of general discussion. - - This may span several paragraphs. - - * Second point of general discussion. - -## Instructor's Guide - -Learners may go through lessons outside of class, so it seems best to -keep material for instructors in a separate document, rather than -interleaved in the lesson itself. Its structure is: - - --- - layout: page - title: Lesson Title - subtitle: Instructor's Guide - --- - ## Legend - - One or more paragraphs laying out the lesson's legend (i.e., the story - behind its running example). - - ## Overall - - * Point - - * Point - - ## [Topic Title 1](01-slug.html) - - * Point - - * Point - - 1. Discussion of first challenge. - - 2. Discussion of second challenge. - - ## [Topic Title 2](02-slug.html) - - * Point - - * Point - - 1. Discussion of first challenge. - - 2. Discussion of second challenge. - -**Notes:** - -1. The topic headings must match the topic titles. (Yes, we could - define these as variables in a configuration file and refer to those - variables everywhere, but in this case, repetition will be a lot - easier to read, and our validator can check that the titles line - up.) - -2. The points can be anything: specific ways to introduce ideas, common - mistakes learners make and how to get out of them, or anything else. - -3. Full solutions to the challenges do not have to be presented, but - every challenge should be discussed, and that discussion should - mention how long it typically takes to do. (Those estimates do - not go in the challenge itself, since they can increase learners' - stress levels.) diff --git a/README.md b/README.md deleted file mode 100644 index 70d89c7d0..000000000 --- a/README.md +++ /dev/null @@ -1,170 +0,0 @@ -lesson-template -=============== - -This repository is the template for creating -[Software Carpentry](http://software-carpentry.org) lessons. Do *not* -fork this repository directly on GitHub. Instead, follow the -instructions below to create a lesson repository, and -[the layout instructions](LAYOUT.md) to create a lesson. - -## Manual Setup - -We will assume that your user ID is `mcurie` and the name of your -lesson is `data-cleanup`. - -1. Create an empty repository on GitHub called `data-cleanup`. - -2. Clone the template repository to your computer in a directory with - the same name as your lesson identifier: - - ~~~ - $ git clone -b gh-pages -o upstream https://github.com/swcarpentry/lesson-template.git data-cleanup - ~~~ - -3. Go into that directory using - - ~~~ - $ cd data-cleanup - ~~~ - -4. Add your GitHub repository as a remote called `origin` using - - ~~~ - $ git remote add origin https://github.com/mcurie/data-cleanup - ~~~ - -5. Create and edit files (explained below). - -6. Build the HTML pages for your lesson: - - ~~~ - $ make preview - ~~~ - - This step requires you to have installed Pandoc (described below). - It is *not* optional: you *must* build the web pages for your - lesson yourself and push them to GitHub, rather than relying on - GitHub to build them for you. - -7. Commit your changes *and the HTML pages in the root directory of - your lesson repository* and push to the `gh-pages` branch of your - repository: - - ~~~ - $ cd data-cleanup - $ git add changed-files.md *.html - $ git commit -m "Explanatory message" - $ git push origin gh-pages - ~~~ - -8. Tell us where your lesson is so that we can use it and help you improve it. - -Note that SSH cloning (as opposed to the HTTPS cloning used above) -will also work for those who have set up SSH keys with GitHub. - -## Dependencies - -Because people may choose to use the IPython Notebook, R Markdown, or -some other format for parts of their lessons, and because Jekyll (the -tool GitHub uses to build HTML pages) only supports an impoverished -form of Markdown, we require lesson authors to build the HTML pages -for their lessons on their machines with Pandoc and commit those to -the `gh-pages` branch of their lesson website. To do this: - -1. [Install Pandoc](http://www.johnmacfarlane.net/pandoc/installing.html) - -2. Install pandocfilters, a Python module that helps with writing - filters for Pandoc: - - ~~~ - $ pip install pandocfilters - ~~~ - -3. To convert Markdown files into HTML pages in the root directory, go - into the root directory of your lesson and run: - - ~~~ - $ make preview - ~~~ - - You can run `make` on its own to get a list of other things it will - do for you. - -## Why Use a Template? - -We organize our lessons in a standard way so that: - -1. To give guidance to people who aren't experienced instructional - designers. Requiring learning objectives, challenges, and a short - glossary tells people what they ought to create. - -2. It's easy to find things in lessons written by different people. - -3. People using lessons written by different people can easily given - them the same look and feel. - -4. Contributors know where to put things when they are extending or - modifying lessons. - -5. Content can be checked mechanically. - -Instead of putting the whole lesson in one page, authors should create -one short page per topic. Each topic should take 10-15 minutes to -cover, and that coverage to include: - -1. Explain the topic's objectives. - -2. Perform the material. (We expect instructors to code live, *not* - to put lesson notes or slides on the screen.) - -3. Do one or more challenges depending on time. - -Along with the lesson materials themselves, each lesson must contain: - -* *Introductory slides* to give learners a sense of where the next - two or three hours are going to take them. - -* A *reference guide* that learners can use during the lesson and take - away afterward. This must include a glossary of terms, not only to - help learners, but also to help lesson authors summarize what the - lesson actually covers. - -* A *discussion page* that mentions more advanced ideas and tells - learners where to go next. - -* An *instructor's guide* that presents the lesson's legend (or back - story), summarizes our experiences with the lesson, and discusses - solutions to the challenge exercises. We ask everyone who teaches - for us to review and update the instructor's guide for each lesson - they taught after each workshop. - - Note that the this means the solutions to the lesson's challenge - exercises will be up on the web. We have chosen to do this - because we believe in openness, and because there's no point - trying to hide something that's in a publicly-readable repository. - -Authors may retain copyright on their lessons, but we ask that all -lessons be published under the Creative Commons - Attribution (CC-BY) -license, or put in the public domain (CC-0), to permit remixing. - -## For More Information - -Please see the following for more information on: - -* [layout out your lesson](LAYOUT.md) -* [background and design](DESIGN.md) -* [FAQ](FAQ.md) - -## Getting Help - -Mail us at [admin@software-carpentry.org](mailto:admin@software-carpentry.org), -or join our [discussion list](http://lists.software-carpentry.org/mailman/listinfo/discuss_lists.software-carpentry.org) -and ask for help there. - -## Giving Help - -We are committed to offering a pleasant setup experience for our -learners and organizers. If you find bugs in our instructions, or -would like to suggest improvements, please -[file an issue](https://github.com/swcarpentry/lesson-template/issues?q=is%3Aopen+is%3Aissue) -or [mail us](mailto:admin@software-carpentry.org). diff --git a/code/script.sh b/code/script.sh deleted file mode 100755 index 72787bdfe..000000000 --- a/code/script.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash -# script.sh: A shell script -echo "Hello world!" diff --git a/data/data.csv b/data/data.csv deleted file mode 100644 index 53b80f6b0..000000000 --- a/data/data.csv +++ /dev/null @@ -1,2 +0,0 @@ -header1, header2 -0, 0 \ No newline at end of file diff --git a/discussion.md b/discussion.md deleted file mode 100644 index b0e8c331f..000000000 --- a/discussion.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: page -title: Lesson Title -subtitle: Discussion ---- -* First point of general discussion. - - This may span several paragraphs. - -* Second point of general discussion. diff --git a/fig/example.svg b/fig/example.svg deleted file mode 100644 index 746e5eb9e..000000000 --- a/fig/example.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - -Working -Directory -Stage -(Index) -files that -that you “see” -files to go -in next -commit -files that have -been -committed -LocalRepository - diff --git a/index.md b/index.md deleted file mode 100644 index f113f1af0..000000000 --- a/index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: page -title: Lesson Title ---- -Paragraph of introductory material. - -> ## Prerequisites -> -> A short paragraph describing what learners need to know -> before tackling this lesson. - -## Topics - -1. [Topic Title One](01-one.html) -2. [Topic Title Two](02-two.html) - -## Other Resources - -* [Motivation](motivation.html) -* [Reference Guide](reference.html) -* [Next Steps](discussion.html) -* [Instructor's Guide](instructors.html) diff --git a/instructors.md b/instructors.md deleted file mode 100644 index 739f572a0..000000000 --- a/instructors.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -layout: page -title: Lesson Title -subtitle: Instructor's Guide ---- -## Legend - -One or more paragraphs laying out the lesson's legend (i.e., the story -behind its running example). - -## Overall - -* FIXME - -* FIXME - -## [Topic Title One](01-one.html) - -* Point - -* Point - -* Be sure to describe what learners are expected to do during the - topic (watch, type along, pair program, etc.) - -1. Discussion of first challenge. - -2. Discussion of second challenge. - -## [Topic Title Two](02-two.html) - -* Point - -* Point - -1. Discussion of first challenge. - -2. Discussion of second challenge. diff --git a/motivation.md b/motivation.md deleted file mode 100644 index e1d51986f..000000000 --- a/motivation.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -layout: slides -title: Why Topic? ---- -
-## Why Topic? -
- -
-## More Explanation - -* With -* Bullet -* Points -
- -
-## Next Steps - -Here we go! -
diff --git a/reference.md b/reference.md deleted file mode 100644 index fe72b8d9e..000000000 --- a/reference.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: page -title: Lesson Title -subtitle: Reference ---- -...commands and examples... - -## Glossary - -Key Word 1 -: Definition of first term - -Key Word 2 -: Definition of second term From 0b3706702f647e252bd6a7a068c03bd5d717e550 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sat, 13 Dec 2014 16:42:48 -0200 Subject: [PATCH 0125/1182] Improve message for glossary error --- tools/check | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/check b/tools/check index 23261b6a7..a57169695 100755 --- a/tools/check +++ b/tools/check @@ -426,13 +426,14 @@ class ReferencePageValidator(MarkdownValidator): ```definition_lists``` extension. That syntax isn't supported by the CommonMark parser, so we identify - terms manually.""" + terms manually.""" + glossary_keyword = glossary_entry[0] if len(glossary_entry) < 2: logging.error( "In {0}:" - "Glossary entry must have at least two lines- " + "Glossary entry \"{}\" must have at least two lines- " "a term and a definition.".format( - self.filename)) + glossary_keyword, self.filename)) return False entry_is_valid = True @@ -441,17 +442,19 @@ class ReferencePageValidator(MarkdownValidator): if not re.match("^: ", line): logging.error( "In {0}:" + "At glossary entry \"{}\" " "First line of definition must " "start with ': '.".format( - self.filename)) + glossary_keyword, self.filename)) entry_is_valid = False elif line_index > 1: if not re.match("^ ", line): logging.error( "In {0}:" + "At glossary entry \"{}\" " "Subsequent lines of definition must " "start with ' '.".format( - self.filename)) + glossary_keyword, self.filename)) entry_is_valid = False return entry_is_valid From 715ba9b12537e65b3f9bef0d3f74dfd52201f300 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Mon, 15 Dec 2014 16:33:53 -0500 Subject: [PATCH 0126/1182] Fix problem where tests crash completely on core branch --- tools/test_check.py | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/tools/test_check.py b/tools/test_check.py index 2f0966f68..cde660a17 100644 --- a/tools/test_check.py +++ b/tools/test_check.py @@ -1,6 +1,10 @@ #! /usr/bin/env python -import imp, logging, os, unittest +import imp +import logging +import os +import unittest + check = imp.load_source("check", # Import non-.py file os.path.join(os.path.dirname(__file__), "check")) @@ -8,7 +12,7 @@ check.start_logging(level=logging.DEBUG) MARKDOWN_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), os.pardir)) + os.path.join(os.path.dirname(__file__), os.pardir)) class BaseTemplateTest(unittest.TestCase): @@ -16,9 +20,6 @@ class BaseTemplateTest(unittest.TestCase): SAMPLE_FILE = "" # Path to a file that should pass all tests VALIDATOR = check.MarkdownValidator - def setUp(self): - self.sample_validator = self.VALIDATOR(self.SAMPLE_FILE) - def _create_validator(self, markdown): """Create validator object from markdown string; useful for failures""" return self.VALIDATOR(markdown=markdown) @@ -45,7 +46,8 @@ class TestIndexPage(BaseTemplateTest): VALIDATOR = check.IndexPageValidator def test_sample_file_passes_validation(self): - res = self.sample_validator.validate() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.validate() self.assertTrue(res) def test_headers_missing_hrs(self): @@ -89,11 +91,13 @@ def test_headers_fail_because_invalid_content(self): # TESTS INVOLVING SECTION TITLES/HEADINGS def test_index_has_valid_section_headings(self): """The provided index page""" - res = self.sample_validator._validate_section_heading_order() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator._validate_section_heading_order() self.assertTrue(res) def test_index_fail_when_section_heading_absent(self): - res = self.sample_validator.ast.has_section_heading("Fake heading") + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.ast.has_section_heading("Fake heading") self.assertFalse(res) def test_fail_when_section_heading_is_wrong_level(self): @@ -122,7 +126,6 @@ def test_fail_when_section_heading_is_wrong_level(self): * [Instructor's Guide](instructors.html)""") self.assertFalse(validator._validate_section_heading_order()) - def test_fail_when_section_headings_in_wrong_order(self): validator = self._create_validator("""--- layout: lesson @@ -182,7 +185,8 @@ def test_fail_when_prereq_section_has_incorrect_heading_level(self): # TESTS INVOLVING LINKS TO OTHER CONTENT def test_file_links_validate(self): - res = self.sample_validator._validate_links() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator._validate_links() self.assertTrue(res) def test_html_link_to_extant_md_file_passes(self): @@ -206,7 +210,6 @@ def test_inpage_anchor_passes_validation(self): SQLite uses the integers 0 and 1 for the former, and represents the latter as discussed [earlier](#a:dates).""") self.assertTrue(validator._validate_links()) - def test_missing_markdown_file_fails_validation(self): """Fail validation when an html file is linked without corresponding markdown file""" @@ -257,7 +260,8 @@ class TestTopicPage(BaseTemplateTest): VALIDATOR = check.TopicPageValidator def test_sample_file_passes_validation(self): - res = self.sample_validator.validate() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.validate() self.assertTrue(res) @@ -267,7 +271,8 @@ class TestMotivationPage(BaseTemplateTest): VALIDATOR = check.MotivationPageValidator def test_sample_file_passes_validation(self): - res = self.sample_validator.validate() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.validate() self.assertTrue(res) @@ -326,7 +331,8 @@ def test_glossary(self): self.assertTrue(validator._validate_glossary()) def test_sample_file_passes_validation(self): - res = self.sample_validator.validate() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.validate() self.assertTrue(res) @@ -336,7 +342,8 @@ class TestInstructorPage(BaseTemplateTest): VALIDATOR = check.InstructorPageValidator def test_sample_file_passes_validation(self): - res = self.sample_validator.validate() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.validate() self.assertTrue(res) @@ -345,7 +352,8 @@ class TestLicensePage(BaseTemplateTest): VALIDATOR = check.LicensePageValidator def test_sample_file_passes_validation(self): - res = self.sample_validator.validate() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.validate() self.assertTrue(res) def test_modified_file_fails_validation(self): @@ -361,7 +369,8 @@ class TestDiscussionPage(BaseTemplateTest): VALIDATOR = check.DiscussionPageValidator def test_sample_file_passes_validation(self): - res = self.sample_validator.validate() + sample_validator = self.VALIDATOR(self.SAMPLE_FILE) + res = sample_validator.validate() self.assertTrue(res) From a8525eb922bec5e394904434480351ccacb45356 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Mon, 15 Dec 2014 16:55:53 -0500 Subject: [PATCH 0127/1182] Minimize number of tests that fail on core branch. --- tools/test_check.py | 50 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/tools/test_check.py b/tools/test_check.py index cde660a17..003e26e82 100644 --- a/tools/test_check.py +++ b/tools/test_check.py @@ -1,5 +1,13 @@ #! /usr/bin/env python +""" +Unit and functional tests for markdown lesson template validator. + +Some of these tests require looking for example files, which exist only on +the gh-pages branch. Some tests may therefore fail on branch "core". +""" + + import imp import logging import os @@ -91,13 +99,33 @@ def test_headers_fail_because_invalid_content(self): # TESTS INVOLVING SECTION TITLES/HEADINGS def test_index_has_valid_section_headings(self): """The provided index page""" - sample_validator = self.VALIDATOR(self.SAMPLE_FILE) - res = sample_validator._validate_section_heading_order() + validator = self._create_validator("""## Topics + +1. [Topic Title One](01-one.html) +2. [Topic Title Two](02-two.html) + +## Other Resources + +* [Motivation](motivation.html) +* [Reference Guide](reference.html) +* [Next Steps](discussion.html) +* [Instructor's Guide](instructors.html)""") + res = validator._validate_section_heading_order() self.assertTrue(res) def test_index_fail_when_section_heading_absent(self): - sample_validator = self.VALIDATOR(self.SAMPLE_FILE) - res = sample_validator.ast.has_section_heading("Fake heading") + validator = self._create_validator("""## Topics + +1. [Topic Title One](01-one.html) +2. [Topic Title Two](02-two.html) + +## Other Resources + +* [Motivation](motivation.html) +* [Reference Guide](reference.html) +* [Next Steps](discussion.html) +* [Instructor's Guide](instructors.html)""") + res = validator.ast.has_section_heading("Fake heading") self.assertFalse(res) def test_fail_when_section_heading_is_wrong_level(self): @@ -185,12 +213,15 @@ def test_fail_when_prereq_section_has_incorrect_heading_level(self): # TESTS INVOLVING LINKS TO OTHER CONTENT def test_file_links_validate(self): + """Verify that all links in a sample file validate. + Involves checking for example files; may fail on "core" branch""" sample_validator = self.VALIDATOR(self.SAMPLE_FILE) res = sample_validator._validate_links() self.assertTrue(res) def test_html_link_to_extant_md_file_passes(self): - """Verify that an HTML link with corresponding MD file will pass""" + """Verify that an HTML link with corresponding MD file will pass + Involves checking for example files; may fail on "core" branch""" validator = self._create_validator("""[Topic Title One](01-one.html)""") self.assertTrue(validator._validate_links()) @@ -199,6 +230,8 @@ def test_html_link_with_anchor_to_extant_md_passes(self): For now this just tests that the regex handles #anchors. It doesn't validate that the named anchor exists in the md file + + Involves checking for example files; may fail on "core" branch """ validator = self._create_validator("""[Topic Title One](01-one.html#anchor)""") self.assertTrue(validator._validate_links()) @@ -230,7 +263,8 @@ def test_malformed_website_link_fails_validator(self): self.assertFalse(validator._validate_links()) def test_finds_image_asset(self): - """Image asset is found""" + """Image asset is found in the expected file location + Involves checking for example files; may fail on "core" branch""" validator = self._create_validator( """![this is the image's title](fig/example.svg "this is the image's alt text")""") self.assertTrue(validator._validate_links()) @@ -242,7 +276,9 @@ def test_image_asset_not_found(self): self.assertFalse(validator._validate_links()) def test_non_html_link_finds_csv(self): - """Look for CSV file in appropriate folder""" + """Look for CSV file in appropriate folder + Involves checking for example files; may fail on "core" branch + """ validator = self._create_validator( """Use [this CSV](data/data.csv) for the exercise.""") self.assertTrue(validator._validate_links()) From 8c0819becaa18bf7c4db1f8fc2a8a8eaf52afa8b Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Fri, 19 Dec 2014 01:22:57 -0500 Subject: [PATCH 0128/1182] Minor changes to make error messages consistent, and possibly less crashy. Still need unit tests to trigger this code. --- tools/check | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/check b/tools/check index a57169695..5ab68670e 100755 --- a/tools/check +++ b/tools/check @@ -431,7 +431,7 @@ class ReferencePageValidator(MarkdownValidator): if len(glossary_entry) < 2: logging.error( "In {0}:" - "Glossary entry \"{}\" must have at least two lines- " + "Glossary entry '{1}' must have at least two lines- " "a term and a definition.".format( glossary_keyword, self.filename)) return False @@ -442,7 +442,7 @@ class ReferencePageValidator(MarkdownValidator): if not re.match("^: ", line): logging.error( "In {0}:" - "At glossary entry \"{}\" " + "At glossary entry '{1}' " "First line of definition must " "start with ': '.".format( glossary_keyword, self.filename)) @@ -451,7 +451,7 @@ class ReferencePageValidator(MarkdownValidator): if not re.match("^ ", line): logging.error( "In {0}:" - "At glossary entry \"{}\" " + "At glossary entry '{1}' " "Subsequent lines of definition must " "start with ' '.".format( glossary_keyword, self.filename)) From 9ca87a7c2aefcdcb97e19e82589e7e00758bdb9f Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 19 Dec 2014 09:57:11 -0200 Subject: [PATCH 0129/1182] Add Unit Test target to Makefile --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index badebe2a0..9eb364088 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,11 @@ motivation.html : motivation.md _layouts/slides.html $(INCLUDES) \ -o $@ $< +## unittest : Run unit test (for Python 2 and 3) +unittest: tools/check tools/validation_helpers.py tools/test_check.py + cd tools/ && python2 test_check.py + cd tools/ && python3 test_check.py + ## commands : Display available commands. commands : Makefile @sed -n 's/^##//p' $< From fc06f3dd0be3669867a6262ca430df5adfbd595e Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sat, 20 Dec 2014 22:38:53 -0200 Subject: [PATCH 0130/1182] Make filter for id at definitions general This solves #77 by add id attribute to every item of a definition. --- tools/filters/id4glossary.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tools/filters/id4glossary.py b/tools/filters/id4glossary.py index 686cfa1d9..0c8e2caf0 100755 --- a/tools/filters/id4glossary.py +++ b/tools/filters/id4glossary.py @@ -24,12 +24,11 @@ def keyword2html(keyword_node): def id4glossary(key, value, format, meta): """Add id to keywords at glossary.""" - if "subtitle" in meta and pf.stringify(meta['subtitle']) == 'Reference': - if key == "DefinitionList": - for definition in value: - definition[0] = keyword2html(definition[0]) - return {"t": key, - "c": value} + if key == "DefinitionList": + for definition in value: + definition[0] = keyword2html(definition[0]) + return {"t": key, + "c": value} if __name__ == '__main__': pf.toJSONFilter(id4glossary) From 7ea01bb385bc1f7aeb88f10d65f2634e57795173 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Sat, 20 Dec 2014 20:53:11 -0500 Subject: [PATCH 0131/1182] Cleaning up nav bar --- swc-bootstrap.css | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/swc-bootstrap.css b/swc-bootstrap.css index 9ffe36897..923db6b5c 100644 --- a/swc-bootstrap.css +++ b/swc-bootstrap.css @@ -30,8 +30,8 @@ min-height: 40px; } -code { - color: #333333; +.navbar .nav > li > a { + padding: 10px; } .navbar-inverse .nav > li > a { @@ -102,6 +102,10 @@ code { background-image: linear-gradient(180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); } +code { + color: #333333; +} + .container { max-width:920px; } @@ -110,7 +114,6 @@ blockquote p { font-size:14px; } - /* GitHub Ribbon */ #github-ribbon a { @@ -152,7 +155,6 @@ blockquote p { top:auto; } - /* Media Queries */ @media (max-width: 979px){ From 63f21365c6c36f32678fb6cbcc75675c66d111f6 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 21 Dec 2014 00:38:52 -0200 Subject: [PATCH 0132/1182] Fix unittest for changes on motivation.md --- tools/check | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/check b/tools/check index 5ab68670e..c7dbf9d3a 100755 --- a/tools/check +++ b/tools/check @@ -406,7 +406,8 @@ class TopicPageValidator(MarkdownValidator): class MotivationPageValidator(MarkdownValidator): """Validate motivation.md""" DOC_HEADERS = {"layout": vh.is_str, - "title": vh.is_str} + "title": vh.is_str, + "subtitle": vh.is_str} # TODO: How to validate? May be a mix of reveal.js (HTML) + markdown. From 2f4703e8b7fb4858731d405ff06390e447f623c4 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 22 Dec 2014 21:14:57 -0500 Subject: [PATCH 0133/1182] Setting layout for LICENSE correctly --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 1587431cd..e45096b27 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,5 +1,5 @@ --- -layout: lesson +layout: page title: Licenses --- ### Instructional Material From 62150c7454b4ece86019c2cbfce58900e6346362 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 22 Dec 2014 21:16:27 -0500 Subject: [PATCH 0134/1182] Correcting URLs in footer. The original plan was to put the URL for this repository in a configuration file that authors could edit when creating actual lessons. However, it looks like Pandoc only does one level of variable expansion, so variables inside `_includes/footer.html` (which is itself interpolated as a variable) aren't expanded. Instead, we will tell authors to edit `_includes/footer.html` in the `README.md` in the `gh-pages` branch. --- _includes/footer.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index db00b1b05..0c661f6fe 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,6 +1,6 @@ From 940140d0823caa0b6d17fb54de1d359a5c5eeb68 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Thu, 25 Dec 2014 19:40:54 -0700 Subject: [PATCH 0135/1182] Add requirements.txt necessary to build and run validator --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..8551c266d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +CommonMark +pandocfilters \ No newline at end of file From 0fdd4ea863cc5510d6688079737e4b8a80ca0047 Mon Sep 17 00:00:00 2001 From: Bill Mills Date: Tue, 30 Dec 2014 22:06:23 -0800 Subject: [PATCH 0136/1182] added some challenge CSS --- css/swc.css | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/css/swc.css b/css/swc.css index b29dc3f6d..73bb72681 100644 --- a/css/swc.css +++ b/css/swc.css @@ -18,11 +18,6 @@ div.chapter h2 { font-style: italic; } -/* Objectives and key points */ -.objectives, .keypoints { - background-color: azure; -} - /* Things to fix. */ .fixme { text-decoration: underline; @@ -124,6 +119,14 @@ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { padding: 0em 1em; } +/* Challenges */ +.challenge { + background-color: #CCFFCC; + border: 5px solid #CCFFCC; + margin: 1em 0; + padding: 0em 1em; +} + /* Things to fix. */ .fixme { text-decoration: underline; From 0c6a3e6d2bdf207b9fb12f3f7d8355ca953d334e Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sat, 3 Jan 2015 16:04:26 -0200 Subject: [PATCH 0137/1182] Update License.md md5sum on tools/check based on 2f4703e --- tools/check | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/check b/tools/check index c7dbf9d3a..a9b75f98c 100755 --- a/tools/check +++ b/tools/check @@ -499,7 +499,7 @@ class LicensePageValidator(MarkdownValidator): def _run_tests(self): """Skip the base tests; just check md5 hash""" # TODO: This hash is specific to the license for english-language repo - expected_hash = '258aa6822fa77f7c49c37c3759017891' + expected_hash = 'cd5742b6596a1f2f35c602ad43fa24b2' m = hashlib.md5() try: m.update(self.markdown) From d1378e3a766284e8616586123e21709b2f356930 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Sun, 4 Jan 2015 00:52:46 -0500 Subject: [PATCH 0138/1182] Add .py extension Fix typo --- tools/{check => check.py} | 16 +--------------- tools/test_check.py | 5 +---- 2 files changed, 2 insertions(+), 19 deletions(-) rename tools/{check => check.py} (98%) diff --git a/tools/check b/tools/check.py similarity index 98% rename from tools/check rename to tools/check.py index a9b75f98c..b3e1143fc 100755 --- a/tools/check +++ b/tools/check.py @@ -20,21 +20,7 @@ import re import sys -try: - # Code tested with CommonMark version 0.5.4; API may change - import CommonMark -except ImportError: - ERROR_MESSAGE = """This program requires the CommonMark python package. -Install using - - # pip install commonmark - -or - - # easy_install commonmark -""" - print(ERROR_MESSAGE) - sys.exit(1) +import CommonMark import validation_helpers as vh diff --git a/tools/test_check.py b/tools/test_check.py index 003e26e82..158a0b762 100644 --- a/tools/test_check.py +++ b/tools/test_check.py @@ -7,14 +7,11 @@ the gh-pages branch. Some tests may therefore fail on branch "core". """ - -import imp import logging import os import unittest -check = imp.load_source("check", # Import non-.py file - os.path.join(os.path.dirname(__file__), "check")) +import check # Make log messages visible to help audit test failures check.start_logging(level=logging.DEBUG) From cca6a251782f93244bd776bdf36b1fedd6305798 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Sat, 20 Dec 2014 22:51:48 -0500 Subject: [PATCH 0139/1182] Logging output improvements. Provide more informative messages when YAML headers are missing. --- tools/check.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tools/check.py b/tools/check.py index b3e1143fc..7841422f0 100755 --- a/tools/check.py +++ b/tools/check.py @@ -102,8 +102,8 @@ def _validate_one_doc_header_row(self, text): if not validate_header: logging.error( "In {0}: " - "Document header field for label {1} " - "does not follow expected format".format(self.filename, label)) + "Contents of document header field for label {1} " + "do not follow expected format".format(self.filename, label)) return validate_header # Methods related to specific validation. Can override specific tests. @@ -113,18 +113,29 @@ def _validate_doc_headers(self): Pass only if the header of the document contains the specified sections with the expected contents""" - # Header section should be wrapped in hrs + # Test: Header section should be wrapped in hrs has_hrs = self._validate_hrs() - # Labeled sections in the actual headers should match expected format + # Test: Labeled sections in the actual headers should match expected format header_node = self.ast.children[1] test_headers = [self._validate_one_doc_header_row(s) for s in header_node.strings] - # Must have all expected header lines, and no others. + # Test: Must have all expected header lines, and no others. only_headers = (len(header_node.strings) == len(self.DOC_HEADERS)) - # Headings must appear in the order expected + # If expected headings are missing, print an informative message + heading_labels = [s.split(":")[0] + for s in header_node.strings] + missing_headings = [h for h in self.DOC_HEADERS + if h not in heading_labels] + + for h in missing_headings: + logging.error("In {0}: " + "Header section is missing expected " + "row {1}".format(self.filename, h)) + + # Test: Headings must appear in the order expected valid_order = self._validate_section_heading_order() return has_hrs and all(test_headers) and only_headers and valid_order @@ -330,8 +341,8 @@ def _validate_links(self, links_to_skip=('motivation.html', return super(IndexPageValidator, self)._validate_links(links_to_skip) def _run_tests(self): - tests = [self._validate_intro_section()] parent_tests = super(IndexPageValidator, self)._run_tests() + tests = [self._validate_intro_section()] return all(tests) and parent_tests @@ -383,9 +394,9 @@ def _validate_has_no_headings(self): return False def _run_tests(self): + parent_tests = super(TopicPageValidator, self)._run_tests() tests = [self._validate_has_no_headings(), self._validate_learning_objective()] - parent_tests = super(TopicPageValidator, self)._run_tests() return all(tests) and parent_tests @@ -647,7 +658,3 @@ def main(parsed_args_obj): if __name__ == "__main__": parsed_args = command_line() main(parsed_args) - - #### Sample of how validator is used directly - # validator = HomePageValidator('../index.md') - # print validator.validate() From 3509227604839949856dd9a7cfd0bf47314e3deb Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Sun, 4 Jan 2015 00:30:12 -0500 Subject: [PATCH 0140/1182] Use PyYAML for doc header validation per gvwilson --- requirements.txt | 3 ++- tools/check.py | 31 ++++++++++++++++++------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/requirements.txt b/requirements.txt index 8551c266d..91bbdcbe8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ CommonMark -pandocfilters \ No newline at end of file +pandocfilters +PyYAML \ No newline at end of file diff --git a/tools/check.py b/tools/check.py index 7841422f0..f298d97e2 100755 --- a/tools/check.py +++ b/tools/check.py @@ -21,6 +21,7 @@ import sys import CommonMark +import yaml import validation_helpers as vh @@ -87,9 +88,8 @@ def _validate_hrs(self): valid = False return valid - def _validate_one_doc_header_row(self, text): + def _validate_one_doc_header_row(self, label, content): """Validate a single row of the document header section""" - label, content = text.split(":", 1) if label not in self.DOC_HEADERS: logging.warning( "In {0}: " @@ -116,29 +116,34 @@ def _validate_doc_headers(self): # Test: Header section should be wrapped in hrs has_hrs = self._validate_hrs() - # Test: Labeled sections in the actual headers should match expected format header_node = self.ast.children[1] - test_headers = [self._validate_one_doc_header_row(s) - for s in header_node.strings] + header_text = '\n'.join(header_node.strings) + + # Parse headers as YAML. Don't check if parser returns None or str. + header_yaml = yaml.load(header_text) + if not isinstance(header_yaml, dict): + logging.error("In {0}: " + "Expected YAML markup with labels " + "{1}".format(self.filename, self.DOC_HEADERS.keys())) + return False + + # Test: Labeled YAML should match expected format + test_headers = [self._validate_one_doc_header_row(k, v) + for k, v in header_yaml.items()] # Test: Must have all expected header lines, and no others. - only_headers = (len(header_node.strings) == len(self.DOC_HEADERS)) + only_headers = (len(header_yaml) == len(self.DOC_HEADERS)) # If expected headings are missing, print an informative message - heading_labels = [s.split(":")[0] - for s in header_node.strings] missing_headings = [h for h in self.DOC_HEADERS - if h not in heading_labels] + if h not in header_yaml] for h in missing_headings: logging.error("In {0}: " "Header section is missing expected " "row {1}".format(self.filename, h)) - # Test: Headings must appear in the order expected - valid_order = self._validate_section_heading_order() - - return has_hrs and all(test_headers) and only_headers and valid_order + return has_hrs and all(test_headers) and only_headers def _validate_section_heading_order(self, ast_node=None, headings=None): """Verify that section headings appear, and in the order expected""" From 5c906ad12f1e719208da03d4c40201aee453a22b Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Sun, 4 Jan 2015 00:31:25 -0500 Subject: [PATCH 0141/1182] Clean up YAML header unit tests: update to reflect the newest templates --- tools/test_check.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tools/test_check.py b/tools/test_check.py index 158a0b762..0451c8444 100644 --- a/tools/test_check.py +++ b/tools/test_check.py @@ -60,7 +60,6 @@ def test_headers_missing_hrs(self): layout: lesson title: Lesson Title -keywords: ["some", "key terms", "in a list"] Another section that isn't an HR """) @@ -71,7 +70,6 @@ def test_headers_missing_a_line(self): """One of the required headers is missing""" validator = self._create_validator("""--- layout: lesson -keywords: ["some", "key terms", "in a list"] ---""") self.assertFalse(validator._validate_doc_headers()) @@ -80,16 +78,14 @@ def test_headers_fail_with_other_content(self): validator = self._create_validator("""--- layout: lesson title: Lesson Title -keywords: ["some", "key terms", "in a list"] otherline: Nothing ---""") self.assertFalse(validator._validate_doc_headers()) - def test_headers_fail_because_invalid_content(self): + def test_fail_when_headers_not_yaml_dict(self): + """Fail when the headers can't be parsed to a dict of YAML data""" validator = self._create_validator("""--- -layout: lesson -title: Lesson Title -keywords: this is not a list +This will parse as a string, not a dictionary ---""") self.assertFalse(validator._validate_doc_headers()) @@ -155,7 +151,6 @@ def test_fail_when_section_headings_in_wrong_order(self): validator = self._create_validator("""--- layout: lesson title: Lesson Title -keywords: ["some", "key terms", "in a list"] --- Paragraph of introductory material. @@ -182,7 +177,6 @@ def test_pass_when_prereq_section_has_correct_heading_level(self): validator = self._create_validator("""--- layout: lesson title: Lesson Title -keywords: ["some", "key terms", "in a list"] --- Paragraph of introductory material. @@ -197,7 +191,6 @@ def test_fail_when_prereq_section_has_incorrect_heading_level(self): validator = self._create_validator("""--- layout: lesson title: Lesson Title -keywords: ["some", "key terms", "in a list"] --- Paragraph of introductory material. @@ -292,6 +285,16 @@ class TestTopicPage(BaseTemplateTest): SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "01-one.md") VALIDATOR = check.TopicPageValidator + def test_headers_fail_because_invalid_content(self): + """The value provided as YAML does not match the expected datatype""" + validator = self._create_validator("""--- +layout: lesson +title: Lesson Title +subtitle: A page +minutes: not a number +---""") + self.assertFalse(validator._validate_doc_headers()) + def test_sample_file_passes_validation(self): sample_validator = self.VALIDATOR(self.SAMPLE_FILE) res = sample_validator.validate() From b67d798abfebd1007601b99446ee159c0b9c2ed6 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 4 Jan 2015 17:30:42 -0200 Subject: [PATCH 0142/1182] Fix Makefile for tools/check.py --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9eb364088..26734bace 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ motivation.html : motivation.md _layouts/slides.html -o $@ $< ## unittest : Run unit test (for Python 2 and 3) -unittest: tools/check tools/validation_helpers.py tools/test_check.py +unittest: tools/check.py tools/validation_helpers.py tools/test_check.py cd tools/ && python2 test_check.py cd tools/ && python3 test_check.py From 8fd487b3aa42e7a960d75cb07237ff4d48e689b2 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Mon, 5 Jan 2015 20:09:34 -0500 Subject: [PATCH 0143/1182] Fix for issues identified in #114. --- tools/check.py | 42 +++++++++++++++++++----------------------- tools/test_check.py | 8 ++++++++ 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/tools/check.py b/tools/check.py index f298d97e2..62eaf1e22 100755 --- a/tools/check.py +++ b/tools/check.py @@ -141,7 +141,7 @@ def _validate_doc_headers(self): for h in missing_headings: logging.error("In {0}: " "Header section is missing expected " - "row {1}".format(self.filename, h)) + "row '{1}'".format(self.filename, h)) return has_hrs and all(test_headers) and only_headers @@ -371,9 +371,9 @@ def _validate_learning_objective(self): if node_tests is False: logging.error( "In {0}: " - "Learning Objectives should not be empty.".format( - self.filename)) - + "Page should contain a blockquoted section with level 2 " + "title 'Learning Objectives'. Section should not " + "be empty.".format(self.filename)) return node_tests def _validate_has_no_headings(self): @@ -385,17 +385,13 @@ def _validate_has_no_headings(self): if len(heading_nodes) == 0: return True + # Individual heading msgs are logged by validate_section_heading_order logging.error( "In {0}: " "The topic page should not have sub-headings " "outside of special blocks. " "If a topic needs sub-headings, " "it should be broken into multiple topics.".format(self.filename)) - for n in heading_nodes: - logging.warning( - "In {0}: " - "The following sub-heading should be removed: {1}".format( - self.filename, n.strings[0])) return False def _run_tests(self): @@ -433,10 +429,10 @@ def _validate_glossary_entry(self, glossary_entry): glossary_keyword = glossary_entry[0] if len(glossary_entry) < 2: logging.error( - "In {0}:" - "Glossary entry '{1}' must have at least two lines- " - "a term and a definition.".format( - glossary_keyword, self.filename)) + "In {0}: " + "Glossary entry '{1}' must have at least two lines- " + "a term and a definition.".format( + self.filename, glossary_keyword)) return False entry_is_valid = True @@ -444,20 +440,20 @@ def _validate_glossary_entry(self, glossary_entry): if line_index == 1: if not re.match("^: ", line): logging.error( - "In {0}:" - "At glossary entry '{1}' " - "First line of definition must " - "start with ': '.".format( - glossary_keyword, self.filename)) + "In {0}: " + "At glossary entry '{1}' " + "First line of definition must " + "start with ': '.".format( + self.filename, glossary_keyword)) entry_is_valid = False elif line_index > 1: if not re.match("^ ", line): logging.error( - "In {0}:" - "At glossary entry '{1}' " - "Subsequent lines of definition must " - "start with ' '.".format( - glossary_keyword, self.filename)) + "In {0}: " + "At glossary entry '{1}' " + "Subsequent lines of definition must " + "start with ' '.".format( + self.filename, glossary_keyword, )) entry_is_valid = False return entry_is_valid diff --git a/tools/test_check.py b/tools/test_check.py index 0451c8444..99cf94577 100644 --- a/tools/test_check.py +++ b/tools/test_check.py @@ -295,6 +295,14 @@ def test_headers_fail_because_invalid_content(self): ---""") self.assertFalse(validator._validate_doc_headers()) + def test_topic_page_should_have_no_headings(self): + """Requirement according to spec; may be relaxed in future""" + validator = self._create_validator(""" +## Heading that should not be present + +Some text""") + self.assertFalse(validator._validate_has_no_headings()) + def test_sample_file_passes_validation(self): sample_validator = self.VALIDATOR(self.SAMPLE_FILE) res = sample_validator.validate() From 7c022a19060978cf3f77d6f79d51760325493675 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 5 Jan 2015 22:49:27 -0800 Subject: [PATCH 0144/1182] Adding trailing newline to requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8551c266d..b57184c85 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ CommonMark -pandocfilters \ No newline at end of file +pandocfilters From 36000796206aed75ff4ff385874df55cedc65d0c Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Mon, 5 Jan 2015 23:07:11 -0800 Subject: [PATCH 0145/1182] Adding rule for building R Markdown files --- Makefile | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 26734bace..adb2b74de 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,12 @@ # Files. -SRC_PAGES = $(wildcard *.md) +MARKDOWN = $(wildcard *.md) +EXCLUDES = README.md LAYOUT.md FAQ.md DESIGN.md +SRC_PAGES = $(filter-out $(EXCLUDES), $(MARKDOWN)) DST_PAGES = $(patsubst %.md,%.html,$(SRC_PAGES)) +# Pandoc filters +FILTERS = $(wildcard tools/filters/*.py) + # Inclusions. INCLUDES = \ -Vheader="$$(cat _includes/header.html)" \ @@ -22,7 +27,7 @@ motivation.html : motivation.md _layouts/slides.html -o $@ $< # Pattern to build a generic page. -%.html : %.md _layouts/page.html +%.html : %.md _layouts/page.html $(FILTERS) pandoc -s -t html \ --template=_layouts/page \ --filter=tools/filters/blockquote2div.py \ @@ -30,6 +35,10 @@ motivation.html : motivation.md _layouts/slides.html $(INCLUDES) \ -o $@ $< +# Pattern to convert R Markdown to Markdown. +%.md: %.Rmd $(R_CHUNK_OPTS) + Rscript -e "knitr::knit('$$(basename $<)', output = '$$(basename $@)')" + ## unittest : Run unit test (for Python 2 and 3) unittest: tools/check.py tools/validation_helpers.py tools/test_check.py cd tools/ && python2 test_check.py From a7db9986902ffaa3cf569501a8698490b3924fa1 Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Sun, 4 Jan 2015 10:45:14 -0200 Subject: [PATCH 0146/1182] Small improvements to CSS - Remove extra space before title of boxes - Remove background color of boxes when printing - Add "Input", "Output" and "Error" tips for code blocks when printing - Avoid duplicate lines --- css/swc.css | 72 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/css/swc.css b/css/swc.css index 73bb72681..388eadc8d 100644 --- a/css/swc.css +++ b/css/swc.css @@ -8,6 +8,10 @@ h1, h2 { margin-bottom: 10px; } +h1:first-child, h2:first-child { + margin-top: 10px; +} + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { color: inherit; } @@ -111,20 +115,25 @@ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { color: inherit; } -/* Objectives and key points */ +/* Objectives, Callout Box and Challenges */ +.objectives, .keypoints, .callout, .challenge { + margin: 1em 0; + padding: 0em 1em; +} + .objectives, .keypoints { background-color: azure; border: 5px solid azure; - margin: 1em 0; - padding: 0em 1em; } -/* Challenges */ +.callout { + background-color: #EEE; + border: 5px solid #EEE; +} + .challenge { background-color: #CCFFCC; border: 5px solid #CCFFCC; - margin: 1em 0; - padding: 0em 1em; } /* Things to fix. */ @@ -146,14 +155,6 @@ blockquote { width: 90%; } -/* Callout Box */ -.callout { - background-color: #EEE; - border: 5px solid #EEE; - margin: 1em 0; - padding: 0em 1em; -} - /* Tables used for displaying choices in challenges. */ table.choices tr td { vertical-align : top; @@ -165,7 +166,8 @@ table.outlined { } /* Code sample */ -pre.sourceCode{ +pre.sourceCode, +pre.input { color: ForestGreen; } pre.output { @@ -187,6 +189,22 @@ pre.error { line-height: 13pt; } + /* Objectives, Callout Box and Challenges */ + .objectives, .keypoints { + background-color: unset; + border: 5px solid; + } + + .callout { + background-color: unset; + border: 5px solid; + } + + .challenge { + background-color: unset; + border: 5px solid; + } + p,ul,ol,li,pre,code { font-size: 8pt; line-height: 9pt; @@ -195,7 +213,29 @@ pre.error { code { padding: 0px; border: 0px; - background: none; + background: unset; + } + + pre.sourceCode::before, + pre.input::before. { + content: "Input:"; + } + + pre.output::before { + content: "Output:"; + } + + pre.error::before { + content: "Error:"; + } + + pre.sourceCode code, + pre.input code, + pre.output code, + pre.error code { + display: block; + margin-top: 1em; + margin-left: 2em; } #github-ribbon { From 5ce0625754c47af2e44d888f009625d147704989 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Sun, 4 Jan 2015 20:59:36 -0500 Subject: [PATCH 0147/1182] Changes to link text validation per #58 and #90. Validate link text in index.md (always), or only in headings (reference.md and instructors.md) Demote msg level when http links skipped Strip anchor from filenames in error messages --- tools/check.py | 113 +++++++++++++++++++++++++----------- tools/test_check.py | 46 +++++++++++++++ tools/validation_helpers.py | 12 +++- 3 files changed, 134 insertions(+), 37 deletions(-) diff --git a/tools/check.py b/tools/check.py index 62eaf1e22..dda03f80a 100755 --- a/tools/check.py +++ b/tools/check.py @@ -10,7 +10,6 @@ Call at command line with flag -h to see options and usage instructions. """ -from __future__ import print_function import argparse import glob @@ -203,33 +202,31 @@ def _validate_section_heading_order(self, ast_node=None, headings=None): return (len(missing_headings) == 0) and \ valid_order and no_extra and correct_level - def _validate_one_link(self, link_node): - """Logic to validate a single external asset (image or link) - + # Link validation methods + def _validate_one_html_link(self, link_node, check_text=False): + """ Any local html file being linked was generated as part of the lesson. Therefore, file links (.html) must have a Markdown file in the expected folder. The title of the linked Markdown document should match the link text. - - For other assets (links or images), just verify that a file exists """ dest, link_text = self.ast.get_link_info(link_node) - if re.match(r"^[\w,\s-]+\.(html?)", dest, re.IGNORECASE): - # HTML files in same folder are made from Markdown; special tests - fn = dest.split("#")[0] # Split anchor name from filename - expected_md_fn = os.path.splitext(fn)[0] + os.extsep + "md" - expected_md_path = os.path.join(self.markdown_dir, - expected_md_fn) - if not os.path.isfile(expected_md_path): - logging.error( - "In {0}: " - "The document links to {1}, but could not find " - "the expected markdown file {2}".format( - self.filename, dest, expected_md_path)) - return False + # HTML files in same folder are made from Markdown; special tests + fn = dest.split("#")[0] # Split anchor name from filename + expected_md_fn = os.path.splitext(fn)[0] + os.extsep + "md" + expected_md_path = os.path.join(self.markdown_dir, + expected_md_fn) + if not os.path.isfile(expected_md_path): + logging.error( + "In {0}: " + "The document links to {1}, but could not find " + "the expected markdown file {2}".format( + self.filename, fn, expected_md_path)) + return False + if check_text is True: # If file exists, parse and validate link text = node title with open(expected_md_path, 'rU') as link_dest_file: dest_contents = link_dest_file.read() @@ -247,37 +244,68 @@ def _validate_one_link(self, link_node): self.filename, dest, link_text, dest_page_title)) return False - elif not re.match(r"^((https?|ftp)://)", dest, re.IGNORECASE)\ + return True + + def _validate_one_link(self, link_node, check_text=False): + """Logic to validate a single link to a file asset + + Performs special checks for links to a local markdown file. + + For links or images, just verify that a file exists. + """ + dest, link_text = self.ast.get_link_info(link_node) + + if re.match(r"^[\w,\s-]+\.(html?)", dest, re.IGNORECASE): + # Validate local html links have matching md file + return self._validate_one_html_link(link_node, + check_text=check_text) + elif not re.match(r"^((https?|ftp)://.+)", dest, re.IGNORECASE)\ and not re.match(r"^#.*", dest): # If not web URL, and not anchor on same page, then # verify that local file exists dest_path = os.path.join(self.lesson_dir, dest) + dest_path = dest_path.split("#")[0] # Split anchor from filename if not os.path.isfile(dest_path): + fn = dest.split("#")[0] # Split anchor name from filename logging.error( "In {0}: " "Could not find the linked asset file " "{1} in {2}. If this is a URL, it must be " "prefixed with http(s):// or ftp://.".format( - self.filename, dest, dest_path)) + self.filename, fn, dest_path)) return False else: - logging.warning( + logging.debug( "In {0}: " "Skipped validation of link {1}".format(self.filename, dest)) return True - def _validate_links(self, links_to_skip=()): + def _partition_links(self): + """Fetch links in document. If this template has special requirements + for link text (eg only some links' text should match dest page title), + filter the list accordingly. + + Default behavior: don't check the text of any links""" + check_text = [] + no_check_text = self.ast.find_external_links() + + return check_text, no_check_text + + def _validate_links(self): """Validate all references to external content This includes links AND images: these are the two types of node that CommonMark assigns a .destination property""" - links = self.ast.find_external_links() + check_text, no_check_text = self._partition_links() valid = True - for link_node in links: - if link_node.destination not in links_to_skip: - res = self._validate_one_link(link_node) - valid = valid and res + for link_node in check_text: + res = self._validate_one_link(link_node, check_text=True) + valid = valid and res + + for link_node in no_check_text: + res = self._validate_one_link(link_node, check_text=False) + valid = valid and res return valid def _run_tests(self): @@ -309,6 +337,11 @@ class IndexPageValidator(MarkdownValidator): DOC_HEADERS = {'layout': vh.is_str, 'title': vh.is_str} + def _partition_links(self): + """Check the text of every link in index.md""" + check_text = self.ast.find_external_links() + return check_text, [] + def _validate_intro_section(self): """Validate the intro section @@ -339,12 +372,6 @@ def _validate_intro_section(self): self.filename)) return intro_section and prereqs_tests - def _validate_links(self, links_to_skip=('motivation.html', - 'reference.html', - 'discussion.html', - 'instructors.html')): - return super(IndexPageValidator, self)._validate_links(links_to_skip) - def _run_tests(self): parent_tests = super(IndexPageValidator, self)._run_tests() tests = [self._validate_intro_section()] @@ -418,6 +445,15 @@ class ReferencePageValidator(MarkdownValidator): "title": vh.is_str, "subtitle": vh.is_str} + def _partition_links(self): + """For reference.md, only check that text of link matches + dest page subtitle if the link is in a heading""" + all_links = self.ast.find_external_links() + check_text = self.ast.find_external_links( + parent_crit=self.ast.is_heading) + dont_check_text = [n for n in all_links if n not in check_text] + return check_text, dont_check_text + def _validate_glossary_entry(self, glossary_entry): """Validate glossary entry @@ -491,6 +527,15 @@ class InstructorPageValidator(MarkdownValidator): "title": vh.is_str, "subtitle": vh.is_str} + def _partition_links(self): + """For instructors.md, only check that text of link matches + dest page subtitle if the link is in a heading""" + all_links = self.ast.find_external_links() + check_text = self.ast.find_external_links( + parent_crit=self.ast.is_heading) + dont_check_text = [n for n in all_links if n not in check_text] + return check_text, dont_check_text + class LicensePageValidator(MarkdownValidator): """Validate LICENSE.md: user should not edit this file""" diff --git a/tools/test_check.py b/tools/test_check.py index 99cf94577..05a802365 100644 --- a/tools/test_check.py +++ b/tools/test_check.py @@ -202,6 +202,18 @@ def test_fail_when_prereq_section_has_incorrect_heading_level(self): self.assertFalse(validator._validate_intro_section()) # TESTS INVOLVING LINKS TO OTHER CONTENT + def test_should_check_text_of_all_links_in_index(self): + """Text of every local-html link in index.md should + match dest page title""" + validator = self._create_validator(""" +## [This link is in a heading](reference.html) +[Topic Title One](01-one.html#anchor)""") + links = validator.ast.find_external_links() + check_text, dont_check_text = validator._partition_links() + + self.assertEqual(len(dont_check_text), 0) + self.assertEqual(len(check_text), 2) + def test_file_links_validate(self): """Verify that all links in a sample file validate. Involves checking for example files; may fail on "core" branch""" @@ -303,6 +315,18 @@ def test_topic_page_should_have_no_headings(self): Some text""") self.assertFalse(validator._validate_has_no_headings()) + def test_should_not_check_text_of_links_in_topic(self): + """Never check that text of local-html links in topic + matches dest title """ + validator = self._create_validator(""" +## [This link is in a heading](reference.html) +[Topic Title One](01-one.html#anchor)""") + links = validator.ast.find_external_links() + check_text, dont_check_text = validator._partition_links() + + self.assertEqual(len(dont_check_text), 2) + self.assertEqual(len(check_text), 0) + def test_sample_file_passes_validation(self): sample_validator = self.VALIDATOR(self.SAMPLE_FILE) res = sample_validator.validate() @@ -385,6 +409,28 @@ class TestInstructorPage(BaseTemplateTest): SAMPLE_FILE = os.path.join(MARKDOWN_DIR, "instructors.md") VALIDATOR = check.InstructorPageValidator + def test_should_selectively_check_text_of_links_in_topic(self): + """Only verify that text of local-html links in topic + matches dest title if the link is in a heading""" + validator = self._create_validator(""" +## [Reference](reference.html) + +[Topic Title One](01-one.html#anchor)""") + check_text, dont_check_text = validator._partition_links() + + self.assertEqual(len(dont_check_text), 1) + self.assertEqual(len(check_text), 1) + + def test_link_dest_bad_while_text_ignored(self): + validator = self._create_validator(""" +[ignored text](nonexistent.html)""") + self.assertFalse(validator._validate_links()) + + def test_link_dest_good_while_text_ignored(self): + validator = self._create_validator(""" +[ignored text](01-one.html)""") + self.assertTrue(validator._validate_links()) + def test_sample_file_passes_validation(self): sample_validator = self.VALIDATOR(self.SAMPLE_FILE) res = sample_validator.validate() diff --git a/tools/validation_helpers.py b/tools/validation_helpers.py index 6acc11c3d..864d362a6 100644 --- a/tools/validation_helpers.py +++ b/tools/validation_helpers.py @@ -121,21 +121,27 @@ def get_link_info(self, link_node): return dest, link_text - def find_external_links(self, ast_node=None): + def find_external_links(self, ast_node=None, parent_crit=None): """Recursive function that locates all references to external content under specified node. (links or images)""" ast_node = ast_node or self.data + if parent_crit is None: + # User can optionally provide a function to filter link list + # based on where link appears. (eg, only links in headings) + # If no filter is provided, accept all links in that node. + parent_crit = lambda n: True # Link can be node itself, or hiding in inline content links = [n for n in ast_node.inline_content - if self.is_external(n)] + if self.is_external(n) and parent_crit(ast_node)] if self.is_external(ast_node): links.append(ast_node) # Also look for links in sub-nodes for n in ast_node.children: - links.extend(self.find_external_links(n)) + links.extend(self.find_external_links(n, + parent_crit=parent_crit)) return links From 7c92facbbac3f0ea0e9d5230be16c74806ef4c99 Mon Sep 17 00:00:00 2001 From: Andy Boughton Date: Mon, 5 Jan 2015 14:31:28 -0500 Subject: [PATCH 0148/1182] Remove .DS_Store from .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index db21e46dc..8d2fae7bb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ *~ *.pyc -.DS_Store _site From fae85a08f9d2c36557fe2d8442d2986aba1ee1cc Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Tue, 13 Jan 2015 22:41:02 -0500 Subject: [PATCH 0149/1182] Improving support for R Markdown. 1. Adding `tools/chunk-options.R` with support for Pandoc-based conversion of R Markdown to plain Markdown. 2. Modifying `Makefile` to handle any R Markdown files that are present. Changes have been checked by @jdblischak in the `r-novice-inflammation` project. --- Makefile | 39 +++++++++++++++++++++++---------------- tools/chunk-options.R | 26 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 tools/chunk-options.R diff --git a/Makefile b/Makefile index adb2b74de..8a4c81448 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,13 @@ -# Files. -MARKDOWN = $(wildcard *.md) -EXCLUDES = README.md LAYOUT.md FAQ.md DESIGN.md -SRC_PAGES = $(filter-out $(EXCLUDES), $(MARKDOWN)) -DST_PAGES = $(patsubst %.md,%.html,$(SRC_PAGES)) +# R Markdown files. +SRC_RMD = $(wildcard ??-*.Rmd) +DST_RMD = $(patsubst %.Rmd,%.md,$(SRC_RMD)) -# Pandoc filters -FILTERS = $(wildcard tools/filters/*.py) +# All Markdown files (hand-written and generated). +SRC_MD = $(wildcard *.md) $(DST_RMD) +DST_HTML = $(patsubst %.md,%.html,$(SRC_MD)) + +# All outputs. +DST_ALL = $(DST_HTML) # Inclusions. INCLUDES = \ @@ -14,11 +16,14 @@ INCLUDES = \ -Vfooter="$$(cat _includes/footer.html)" \ -Vjavascript="$$(cat _includes/javascript.html)" +# Chunk options for knitr (used in R conversion). +R_CHUNK_OPTS = tools/chunk-options.R + # Default action is to show what commands are available. all : commands ## preview : Build website locally for checking. -preview : $(DST_PAGES) +preview : $(DST_ALL) # Pattern for slides (different parameters and template). motivation.html : motivation.md _layouts/slides.html @@ -27,7 +32,7 @@ motivation.html : motivation.md _layouts/slides.html -o $@ $< # Pattern to build a generic page. -%.html : %.md _layouts/page.html $(FILTERS) +%.html : %.md _layouts/page.html pandoc -s -t html \ --template=_layouts/page \ --filter=tools/filters/blockquote2div.py \ @@ -35,23 +40,25 @@ motivation.html : motivation.md _layouts/slides.html $(INCLUDES) \ -o $@ $< -# Pattern to convert R Markdown to Markdown. -%.md: %.Rmd $(R_CHUNK_OPTS) - Rscript -e "knitr::knit('$$(basename $<)', output = '$$(basename $@)')" - ## unittest : Run unit test (for Python 2 and 3) unittest: tools/check.py tools/validation_helpers.py tools/test_check.py cd tools/ && python2 test_check.py cd tools/ && python3 test_check.py +# Pattern to convert R Markdown to Markdown. +%.md: %.Rmd $(R_CHUNK_OPTS) + Rscript -e "knitr::knit('$$(basename $<)', output = '$$(basename $@)')" + ## commands : Display available commands. commands : Makefile @sed -n 's/^##//p' $< ## settings : Show variables and settings. settings : - @echo 'SRC_PAGES:' $(SRC_PAGES) - @echo 'DST_PAGES:' $(DST_PAGES) + @echo 'SRC_RMD:' $(SRC_RMD) + @echo 'DST_RMD:' $(DST_RMD) + @echo 'SRC_MD:' $(SRC_MD) + @echo 'DST_HTML:' $(DST_HTML) ## clean : Clean up temporary and intermediate files. clean : @@ -59,4 +66,4 @@ clean : # very-clean : Remove generated HTML. very-clean : - @rm -f $(DST_PAGES) + @rm -f $(DST_MD) diff --git a/tools/chunk-options.R b/tools/chunk-options.R new file mode 100644 index 000000000..fd4f6b531 --- /dev/null +++ b/tools/chunk-options.R @@ -0,0 +1,26 @@ +# These settings control the behavior of all chunks in the novice R materials. +# For example, to generate the lessons with all the output hidden, simply change +# `results` from "markup" to "hide". +# For more information on available chunk options, see +# http://yihui.name/knitr/options#chunk_options + +library("knitr") +opts_chunk$set(tidy = FALSE, results = "markup", comment = NA, + fig.align = "center") + +# The hooks below add html tags to the code chunks and their output so that they +# are properly formatted when the site is built with jekyll. +hook_in <- function(x, options) { + stringr::str_c("\n\n~~~{.r}\n", + paste0(x, collapse="\n"), + "\n~~~\n\n") +} + +hook_out <- function(x, options) { + stringr::str_c("\n\n~~~{.output}\n", + paste0(x, collapse="\n"), + "\n~~~\n\n") +} + +knit_hooks$set(source = hook_in, output = hook_out, warning = hook_out, + error = hook_out, message = hook_out) \ No newline at end of file From 846339af086d68526e497e366b07ae0fe3ffbe0a Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Fri, 16 Jan 2015 20:03:53 -0200 Subject: [PATCH 0150/1182] Change filters since classes must be explicit --- tools/filters/blockquote2div.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/tools/filters/blockquote2div.py b/tools/filters/blockquote2div.py index 6797c8647..844fc1111 100755 --- a/tools/filters/blockquote2div.py +++ b/tools/filters/blockquote2div.py @@ -51,15 +51,6 @@ # trigger the blockquote to be converted to a div. SPECIAL_CLASSES = ['callout', 'challenge', 'prereq', 'objectives'] -# These are titles of blockquotes that will cause the blockquote to -# be converted into a div. They are 'title': 'class' pairs, where the -# 'title' will create a blockquote with the corresponding 'class'. -SPECIAL_TITLES = {'prerequisites': 'prereq', - 'learning objectives': 'objectives', - 'objectives': 'objectives', - 'challenge': 'challenge', - 'callout': 'callout'} - def find_header(blockquote): """Find attributes in a blockquote if they are defined on a @@ -105,11 +96,8 @@ def blockquote2div(key, value, format, meta): id, classes, kvs = attr ltitle = pf.stringify(inlines).lower() - if ltitle in SPECIAL_TITLES: - classes.append(SPECIAL_TITLES[ltitle]) - return pf.Div(attr, blockquote) - elif len(classes) == 1 and classes[0] in SPECIAL_CLASSES: + if len(classes) == 1 and classes[0] in SPECIAL_CLASSES: remove_attributes(blockquote) # a blockquote is just a list of blocks, so it can be # passed directly to Div, which expects Div(attr, blocks) From 7e40a6ed4ebbd77ca0cacbf3bb9b3eff9b8c781d Mon Sep 17 00:00:00 2001 From: Raniere Silva Date: Mon, 19 Jan 2015 00:46:36 -0200 Subject: [PATCH 0151/1182] Validator should check for required files --- tools/check.py | 58 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/tools/check.py b/tools/check.py index dda03f80a..f490302b0 100755 --- a/tools/check.py +++ b/tools/check.py @@ -667,6 +667,45 @@ def command_line(): return parser.parse_args() +def check_required_files(dir_to_validate): + """Check if required files exists.""" + REQUIRED_FILES = ["01-*.md", + "discussion.md", + "index.md", + "instructors.md", + "LICENSE.md", + "motivation.md", + "README.md", + "reference.md"] + valid = True + + for required in REQUIRED_FILES: + req_fn = os.path.join(dir_to_validate, required) + if not glob.glob(req_fn): + logging.error( + "Missing file {0}.".format(required)) + valid = False + + return valid + +def get_files_to_validate(file_or_path): + """Generate list of files to validate.""" + files_to_validate = [] + dir_to_validate = None + + for fn in file_or_path: + if os.path.isdir(fn): + search_str = os.path.join(fn, "*.md") + files_to_validate.extend(glob.glob(search_str)) + dir_to_validate = fn + elif os.path.isfile(fn): + files_to_validate.append(fn) + else: + logging.error( + "The specified file or folder {0} does not exist; " + "could not perform validation".format(fn)) + + return files_to_validate, dir_to_validate def main(parsed_args_obj): if parsed_args_obj.debug: @@ -678,16 +717,15 @@ def main(parsed_args_obj): template = parsed_args_obj.template all_valid = True - for fn in parsed_args_obj.file_or_path: - if os.path.isdir(fn): - res = validate_folder(fn, template=template) - elif os.path.isfile(fn): - res = validate_single(fn, template=template) - else: - res = False - logging.error( - "The specified file or folder {0} does not exist; " - "could not perform validation".format(fn)) + + files_to_validate, dir_to_validate = get_files_to_validate(parsed_args_obj.file_or_path) + + # If user ask to validate only one file don't check for required files. + if dir_to_validate: + all_valid = all_valid and check_required_files(dir_to_validate) + + for fn in files_to_validate: + res = validate_single(fn, template=template) all_valid = all_valid and res From 0f3be25bd371746da697e69a83cfb66086255586 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Wed, 21 Jan 2015 10:02:21 -0500 Subject: [PATCH 0152/1182] Excluding unwanted files from build --- .gitignore | 4 ++++ Makefile | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8d2fae7bb..47a456944 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +README.html +LAYOUT.html +FAQ.html +DESIGN.html *~ *.pyc _site diff --git a/Makefile b/Makefile index 8a4c81448..4bc9e7c64 100644 --- a/Makefile +++ b/Makefile @@ -3,12 +3,17 @@ SRC_RMD = $(wildcard ??-*.Rmd) DST_RMD = $(patsubst %.Rmd,%.md,$(SRC_RMD)) # All Markdown files (hand-written and generated). -SRC_MD = $(wildcard *.md) $(DST_RMD) +ALL_MD = $(wildcard *.md) $(DST_RMD) +EXCLUDE_MD = README.md LAYOUT.md FAQ.md DESIGN.md +SRC_MD = $(filter-out $(EXCLUDE_MD),$(ALL_MD)) DST_HTML = $(patsubst %.md,%.html,$(SRC_MD)) # All outputs. DST_ALL = $(DST_HTML) +# Pandoc filters. +FILTERS = $(wildcard tools/filters/*.py) + # Inclusions. INCLUDES = \ -Vheader="$$(cat _includes/header.html)" \ @@ -32,7 +37,7 @@ motivation.html : motivation.md _layouts/slides.html -o $@ $< # Pattern to build a generic page. -%.html : %.md _layouts/page.html +%.html : %.md _layouts/page.html $(FILTERS) pandoc -s -t html \ --template=_layouts/page \ --filter=tools/filters/blockquote2div.py \ From fdbfa2e80b9b6bcc6d120932d06569b2922fe499 Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Wed, 21 Jan 2015 10:07:25 -0500 Subject: [PATCH 0153/1182] Taking out stale target --- Makefile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Makefile b/Makefile index 4bc9e7c64..61fcfb94a 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,3 @@ settings : ## clean : Clean up temporary and intermediate files. clean : @rm -rf $$(find . -name '*~' -print) - -# very-clean : Remove generated HTML. -very-clean : - @rm -f $(DST_MD) From cea740b920c3eb0acc9326ad680a89c7a4335c5f Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Wed, 21 Jan 2015 11:17:15 -0500 Subject: [PATCH 0154/1182] Removing unused variable left over from merge --- tools/filters/blockquote2div.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/filters/blockquote2div.py b/tools/filters/blockquote2div.py index 844fc1111..828f74c48 100755 --- a/tools/filters/blockquote2div.py +++ b/tools/filters/blockquote2div.py @@ -95,8 +95,6 @@ def blockquote2div(key, value, format, meta): id, classes, kvs = attr - ltitle = pf.stringify(inlines).lower() - if len(classes) == 1 and classes[0] in SPECIAL_CLASSES: remove_attributes(blockquote) # a blockquote is just a list of blocks, so it can be From 1fdc82b1f98f973c94e0aef2fc02a2667cec0a3b Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Wed, 21 Jan 2015 11:34:04 -0500 Subject: [PATCH 0155/1182] Teaching .gitignore to ignore Mac .DS_Store --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 47a456944..fd2e75da4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ DESIGN.html *~ *.pyc _site +.DS_Store From d848f5183ed7f257ddd1de9e7f12db6ba2313ee9 Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 21 Jan 2015 21:14:36 +0000 Subject: [PATCH 0156/1182] Separate out some specific workshop classes. The workshop template is mostly plain bootstrap, so getting it work alongside the site CSS seems mostly straightforward. We only need to add in a .workshop class to the body, and a .card class to the .container in the workshop. Everything else is bootstrap content. This commit also removes the banner.html include since this did not seem to be removed in the main site, but was referenced in the CSS. Removing it makes it clear the .banner class is only needed in the workshop, not here. --- swc-workshop-and-lesson.css | 32 ++++++++++++++++++++++++++++++++ swc.css | 24 ------------------------ 2 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 swc-workshop-and-lesson.css diff --git a/swc-workshop-and-lesson.css b/swc-workshop-and-lesson.css new file mode 100644 index 000000000..80fdaa88a --- /dev/null +++ b/swc-workshop-and-lesson.css @@ -0,0 +1,32 @@ +body.workshop { + background-color: #BEC3C6; + margin: 20px 0; +} + +.card { + background-color: white; +} + +/* Top banner of every page. */ +div.banner { + background-color: #FFFFFF; + width: 100%; + height: 90px; + margin: 0px; + padding: 0; + border-bottom: 1px solid #A6A6A6; +} + +/* Padding around image in top banner. */ +div.banner a img { + padding: 20px 25px; +} + +/* Footer of every page. */ +div.footer { + clear: both; + background: url("/img/main_shadow.png") repeat-x scroll center top #FFFFFF; + padding: 4px 10px 7px 10px; + border-top: 1px solid #A6A6A6; + text-align: right; +} \ No newline at end of file diff --git a/swc.css b/swc.css index a2463d2bd..17e038c62 100644 --- a/swc.css +++ b/swc.css @@ -85,21 +85,6 @@ body.stylesheet { margin: 20 auto; } -/* Top banner of every page. */ -div.banner { - background-color: #FFFFFF; - width: 100%; - height: 90px; - margin: 0px; - padding: 0; - border-bottom: 1px solid #A6A6A6; -} - -/* Padding around image in top banner. */ -div.banner a img { - padding: 20px 25px; -} - /* Explanatory call-out boxes. */ div.box { width: 54em; @@ -130,15 +115,6 @@ div.files { padding: 10px; } -/* Footer of every page. */ -div.footer { - clear: both; - background: url("/img/main_shadow.png") repeat-x scroll center top #FFFFFF; - padding: 4px 10px 7px 10px; - border-top: 1px solid #A6A6A6; - text-align: right; -} - .swc-blue-bg { /*background-color: #20267D;*/ /* svg colour is slightly different? */ From 2898c67414556d67c088618f4d2579c8c11e1d6f Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Wed, 21 Jan 2015 20:19:24 -0500 Subject: [PATCH 0157/1182] Merging @r-gaia-cs improvements --- _layouts/slides.html | 7 + ...WihjSQC0oHJ9TCYBsxEYwM7FgeyaSgU71cLG0.woff | Bin 0 -> 13348 bytes css/slideshow.css | 727 ++ js/deckjs-custom.js | 10500 ++++++++++++++++ 4 files changed, 11234 insertions(+) create mode 100644 css/local-fonts/zhcz-_WihjSQC0oHJ9TCYBsxEYwM7FgeyaSgU71cLG0.woff create mode 100644 css/slideshow.css create mode 100644 js/deckjs-custom.js diff --git a/_layouts/slides.html b/_layouts/slides.html index 61718627f..0048eaf21 100644 --- a/_layouts/slides.html +++ b/_layouts/slides.html @@ -9,6 +9,13 @@ + + + diff --git a/css/local-fonts/zhcz-_WihjSQC0oHJ9TCYBsxEYwM7FgeyaSgU71cLG0.woff b/css/local-fonts/zhcz-_WihjSQC0oHJ9TCYBsxEYwM7FgeyaSgU71cLG0.woff new file mode 100644 index 0000000000000000000000000000000000000000..256e12d245969f29b5e4eb2632cc1f84b737ee2a GIT binary patch literal 13348 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 literal 0 HcmV?d00001 diff --git a/css/slideshow.css b/css/slideshow.css new file mode 100644 index 000000000..e7e5e8385 --- /dev/null +++ b/css/slideshow.css @@ -0,0 +1,727 @@ +/* This theme is generated by deck.js-theme-builder. */ +/* https://github.com/twitwi/deck.js-theme-builder */ +/* Resets and base styles from HTML5 Boilerplate */ +div, span, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, +small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, figcaption, figure, +footer, header, hgroup, menu, nav, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, q:before, q:after { + content: ""; + content: none; +} + +ins { + background-color: #ff9; + color: #000; + text-decoration: none; +} + +mark { + background-color: #ff9; + color: #000; + font-style: italic; + font-weight: bold; +} + +del { + text-decoration: line-through; +} + +abbr[title], dfn[title] { + border-bottom: 1px dotted; + cursor: help; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} + +input, select { + vertical-align: middle; +} + +select, input, textarea, button { + font: 99% sans-serif; +} + +pre, code, kbd, samp { + font-family: monospace, sans-serif; +} + +a { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +a:hover, a:active { + outline: none; +} + +ul, ol { + margin-left: 2em; + vertical-align: top; +} + +ol { + list-style-type: decimal; +} + +nav ul, nav li { + margin: 0; + list-style: none; + list-style-image: none; +} + +small { + font-size: 85%; +} + +strong, th { + font-weight: bold; +} + +td { + vertical-align: top; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +textarea { + overflow: auto; +} + +input[type="radio"] { + vertical-align: text-bottom; +} + +input[type="checkbox"] { + vertical-align: bottom; +} + +label, +input[type="button"], +input[type="submit"], +input[type="image"], +button { + cursor: pointer; +} + +button, input, select, textarea { + margin: 0; +} + +input:invalid, textarea:invalid { + border-radius: 1px; + -moz-box-shadow: 0px 0px 5px red; + -webkit-box-shadow: 0px 0px 5px red; + box-shadow: 0px 0px 5px red; +} +input:invalid .no-boxshadow, textarea:invalid .no-boxshadow { + background-color: #f0dddd; +} + +button { + width: auto; + overflow: visible; +} + +select, input, textarea { + color: #444444; +} + +a { + color: #607890; +} +a:hover, a:focus { + color: #036; +} +a:link { + -webkit-tap-highlight-color: #fff; +} + +/* End HTML5 Boilerplate adaptations */ +h1 { + font-size: 4.5em; +} + +h1, .vcenter { + font-weight: bold; + text-align: center; + padding-top: 1em; + max-height: 100%; +} +.csstransforms h1, .csstransforms .vcenter { + padding: 0 48px; + position: absolute; + left: 0; + right: 0; + top: 50%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + transform: translate(0, -50%); +} + +.vcenter h1 { + position: relative; + top: auto; + padding: 0; + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; +} + +h2 { + font-size: 2.25em; + font-weight: bold; + padding-top: .5em; + margin: 0 0 .66666em 0; + border-bottom: 3px solid #888; +} + +h3 { + font-size: 1.4375em; + font-weight: bold; + margin-bottom: .30435em; +} + +h4 { + font-size: 1.25em; + font-weight: bold; + margin-bottom: .25em; +} + +h5 { + font-size: 1.125em; + font-weight: bold; + margin-bottom: .2222em; +} + +h6 { + font-size: 1em; + font-weight: bold; +} + +img, iframe, video { + display: block; + max-width: 100%; +} + +video, iframe, img { + display: block; + margin: 0 auto; +} + +p, blockquote, iframe, img, ul, ol, pre, video { + margin-bottom: 1em; +} + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 1em; + border: 1px solid #888; +} + +em { + font-style: italic; +} + +li { + padding: .25em 0; + vertical-align: middle; +} +li > ol, li > ul { + margin-bottom: inherit; +} + +.deck-container { + font-size: 16px; + line-height: 1.25; + color: #444; +} + +.slide { + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} + +/* colors */ +/* extras, all together for now */ +@font-face { + font-family: 'Montserrat'; + font-style: normal; + font-weight: 400; + src: local("Montserrat-Regular"), url(local-fonts/zhcz-_WihjSQC0oHJ9TCYBsxEYwM7FgeyaSgU71cLG0.woff) format("woff"), url(http://fonts.gstatic.com/s/montserrat/v6/zhcz-_WihjSQC0oHJ9TCYBsxEYwM7FgeyaSgU71cLG0.woff) format("woff"); +} + +.timekeeper { + font-family: monospace; +} + +.deck-container { + font-family: 'Montserrat', 'Arial', 'Sans'; +} + +/* sizes */ +.deck-container { + font-size: 30px; +} + +h1 { + font-size: 1.75em; +} + +h2 { + margin: 0; + padding: 0 10px; + font-size: 1.5em; +} + +.deck-container > .slide { + padding-top: 3em; +} + +h2 { + position: absolute; + top: 0; + left: 0; + width: 100%; +} + +.deck-container > .slide.noh2, .deck-container > .slide.noH2 { + padding-top: 0; +} + +h2 { + text-align: center; +} + +.deck-container > .slide > ul > li ul, .deck-container > .slide > ul > li ol, .deck-container > .slide > ol > li ul, .deck-container > .slide > ol > li ol { + line-height: 0.85em; + margin-bottom: 0px; +} +.deck-container > .slide > ul > li ul > li ul, .deck-container > .slide > ul > li ul > li ol, .deck-container > .slide > ul > li ol > li ul, .deck-container > .slide > ul > li ol > li ol, .deck-container > .slide > ol > li ul > li ul, .deck-container > .slide > ol > li ul > li ol, .deck-container > .slide > ol > li ol > li ul, .deck-container > .slide > ol > li ol > li ol { + margin-bottom: 0px; +} +.deck-container > .slide > ul > li ul > li ul > li, .deck-container > .slide > ul > li ul > li ol > li, .deck-container > .slide > ul > li ol > li ul > li, .deck-container > .slide > ul > li ol > li ol > li, .deck-container > .slide > ol > li ul > li ul > li, .deck-container > .slide > ol > li ul > li ol > li, .deck-container > .slide > ol > li ol > li ul > li, .deck-container > .slide > ol > li ol > li ol > li { + margin: 0.2em; + font-size: 0.8em; + margin-bottom: 0px; +} +.deck-container > .slide > ul > li ul > li, .deck-container > .slide > ul > li ol > li, .deck-container > .slide > ol > li ul > li, .deck-container > .slide > ol > li ol > li { + margin: 0.2em; + font-size: 0.85em; + margin-bottom: 0px; +} +.deck-container > .slide > ul li, .deck-container > .slide > ol li { + margin: 0; + padding: 0; + margin-top: 0.5em; + padding-left: 0em; +} +.deck-container > .slide > ul { + list-style: disc outside none; +} +.deck-container > .slide > ul > li ul { + list-style: square outside none; +} + +blockquote { + font-size: 2em; + font-style: italic; + padding: 1em 2em; + color: #000; + border-left: 5px solid #ccc; +} +blockquote p { + margin: 0; +} +blockquote cite { + font-size: .5em; + font-style: normal; + font-weight: bold; + color: #888; +} + +a, a:hover, a:focus, a:active, a:visited { + text-decoration: none; +} +a:hover, a:focus { + text-decoration: underline; +} + +.deck-prev-link, .deck-next-link { + background: #ccc; + font-family: serif; +} +.deck-prev-link, .deck-prev-link:hover, .deck-prev-link:focus, .deck-prev-link:active, .deck-prev-link:visited, .deck-next-link, .deck-next-link:hover, .deck-next-link:focus, .deck-next-link:active, .deck-next-link:visited { + color: #fff; +} +.deck-prev-link:hover, .deck-prev-link:focus, .deck-next-link:hover, .deck-next-link:focus { + background: #c00; + text-decoration: none; +} + +.deck-menu > .slide { + /* matching toplevel slides... ideally, we would expect them to have an additional class */ + background: #eee; +} +.deck-menu > .deck-current, .deck-menu > .deck-child-current { + outline-offset: 20px; + outline: 10px solid #f88; +} +.no-touch .deck-menu .slide:hover { + outline-offset: 20px; + outline: 10px solid red; + background: #ddf; +} + +.deck-container { + background: white; + color: #1f2969; + font-weight: normal; +} +.deck-container:not(.no-status) > .slide { + background: url(../img/software-carpentry-banner.png) bottom 10px left 10px no-repeat; + background-size: 150px; +} +.deck-container .slide :not(h1):not(h2) { + /* TODO: the original style mispelled the font name, so it was using Helvetica for everything but the titles, this line does the same. */ + font-family: 'Helvetica', 'Arial', 'sans'; +} + +.deck-container .slide { + margin: 0; + padding: 160px 50px; + /* text-align: justify;*/ +} + +.slide.no-bullets ol, .slide.no-bullets ul { + list-style: none; +} + +.slide .center { + text-align: center; +} + +.slide .left { + float: left; + width: 50%; +} + +.slide .right { + float: left; + width: 50%; +} + +.slide .c1 { + width: 8.33333% !important; +} + +.slide .c2 { + width: 16.66667% !important; +} + +.slide .c3 { + width: 25% !important; +} + +.slide .c4 { + width: 33.33333% !important; +} + +.slide .c5 { + width: 41.66667% !important; +} + +.slide .c6 { + width: 50% !important; +} + +.slide .c7 { + width: 58.33333% !important; +} + +.slide .c8 { + width: 66.66667% !important; +} + +.slide .c9 { + width: 75% !important; +} + +.slide .c10 { + width: 83.33333% !important; +} + +.slide .c11 { + width: 91.66667% !important; +} + +.slide .c12 { + width: 100% !important; +} + +.slide .C1 { + width: 4.16667% !important; +} + +.slide .C2 { + width: 8.33333% !important; +} + +.slide .C3 { + width: 12.5% !important; +} + +.slide .C4 { + width: 16.66667% !important; +} + +.slide .C5 { + width: 20.83333% !important; +} + +.slide .C6 { + width: 25% !important; +} + +.slide .C7 { + width: 29.16667% !important; +} + +.slide .C8 { + width: 33.33333% !important; +} + +.slide .C9 { + width: 37.5% !important; +} + +.slide .C10 { + width: 41.66667% !important; +} + +.slide .C11 { + width: 45.83333% !important; +} + +.slide .C12 { + width: 50% !important; +} + +.slide .C13 { + width: 54.16667% !important; +} + +.slide .C14 { + width: 58.33333% !important; +} + +.slide .C15 { + width: 62.5% !important; +} + +.slide .C16 { + width: 66.66667% !important; +} + +.slide .C17 { + width: 70.83333% !important; +} + +.slide .C18 { + width: 75% !important; +} + +.slide .C19 { + width: 79.16667% !important; +} + +.slide .C20 { + width: 83.33333% !important; +} + +.slide .C21 { + width: 87.5% !important; +} + +.slide .C22 { + width: 91.66667% !important; +} + +.slide .C23 { + width: 95.83333% !important; +} + +.slide .C24 { + width: 100% !important; +} + +.slide .clearboth { + clear: both; +} + +.slide .right { + float: right; + width: 50%; +} + +div.figure p.caption { + color: #141a41; + text-align: center; + font-size: 80%; +} + +.slide .darker { + color: #141a41; +} + +.slide.media-left > *:not(h2):not(img):not(blockquote):not(pre):not(div), .slide.media-left > div:not(.figure) { + margin-left: 400px; +} +.slide.media-left > div.figure, .slide.media-left > img, .slide.media-left > blockquote, .slide.media-left > pre { + float: left; + width: 50%; + box-sizing: border-box; +} + +.slide.media-right > *:not(h2):not(img):not(blockquote):not(pre):not(div), .slide.media-right > div:not(.figure) { + margin-right: 400px; +} +.slide.media-right > div.figure, .slide.media-right > img, .slide.media-right > blockquote, .slide.media-right > pre { + float: right; + width: 50%; + box-sizing: border-box; +} + +.slide.image-stripes > div { + overflow: hidden; + align-content: center; +} +.slide.image-stripes img { + height: 400px; + max-width: none; + position: relative; + left: 50%; + transform: translate(-50%, 0); +} + +h1, h2 { + color: #2b3990; + font-size: 70px; + line-height: 1em; + font-weight: normal; +} + +h2 { + border-bottom: none; + font-size: 60px; + position: absolute; + left: 0; + right: 0; + bottom: 480px; + top: auto; +} + +h3 { + color: #888; +} + +pre { + border-color: #ccc; +} + +code { + color: #555; +} + +blockquote { + font-size: 20px; +} + +a { + transition: color 200ms; +} +a, a:focus, a:active, a:visited { + color: #1f2969; +} +a:hover { + color: #6877d2; + text-decoration: none; +} + +.slide.title-slide { + text-align: center; + padding-top: 325px; +} +.slide.title-slide h1 { + padding-bottom: 50px; + bottom: 50%; + top: auto; + height: auto; + transform: none; +} +.slide.title-slide img.logo { + position: absolute; + padding-top: 100px; + left: 0; + right: 0; + top: 50%; + align: center; +} + +.progress-bar { + background: #2b3990; + opacity: 0.5; + transition: width 500ms; +} + +/* #20267b? */ diff --git a/js/deckjs-custom.js b/js/deckjs-custom.js new file mode 100644 index 000000000..41a0e5ab4 --- /dev/null +++ b/js/deckjs-custom.js @@ -0,0 +1,10500 @@ +/* + This is a packed deck.js with some extensions and styles. + It has been generated from version d8c74bcc860ba175ab020fd69656abee3fc057f3 . + It includes: + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck/extensions/includedeck/load.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//jquery.min.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//modernizr.custom.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//core/deck.core.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/smarkdown/markdown.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/smarkdown/deck.smarkdown.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/fit/deck.fit.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//libs/display-latex2.user.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/simplemath/deck.simplemath.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/clone/deck.clone.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/goto/deck.goto.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/progress/deck.progress.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/navigation/deck.navigation.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/menu/deck.menu.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/step/deck.step.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/events/deck.events.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/anim/deck.anim.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//libs/jquerysvg/jquery.svg.min.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//libs/jquerysvg/jquery.svganim.min.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/svg/deck.svg.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/metadata/deck.metadata.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/attribution/deck.attribution.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/container-styling/deck.container-styling.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/timekeeper/deck.timekeeper.js + browsercast/popcorn.js + browsercast/deck.browsercast.js + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/style-chunks/core.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/fit/deck.fit-fs.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/clone/deck.clone.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/goto/deck.goto.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/progress/deck.progress.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/navigation/deck.navigation.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/menu/deck.menu.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/attribution/deck.attribution.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/timekeeper/deck.timekeeper.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/style-chunks/simple.css + /home/twilight/projects/deck.browsercast.js-demo/tmpdeck//extensions/style-chunks/comments.css + browsercast/deck.browsercast.css + browsercast/player.css +*/ + + +/*! + * Includedeck. + * + * Copyright (c) 2013-2014 Rémi Emonet. + * Licensed under the MIT license. + * https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt + * + * The goal of this extension is to simplify include of deck.js, + * its profiles/themes and the extensions. + * + * The first goal is not performance of loading (still it should + * allow the display of a message while loading) but on ease of + * use and extensibility (i.e., includedeck does not need to know + * about all existing extensions, even if by default it does know + * some of them). + * + */ + + + +var head_conf = { + +}; + +if (typeof ACTUALLY_EXPORT_A_LIST_OF_FILES == 'undefined') +// this is head.load.min.js (v1.0.3) from http://headjs.com/site/download.html +/*! head.load - v1.0.3 */ +(function(n,t){"use strict";function w(){}function u(n,t){if(n){typeof n=="object"&&(n=[].slice.call(n));for(var i=0,r=n.length;i)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
t
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("