moving files around to remove folder redundancy
This commit is contained in:
		
							parent
							
								
									064ff70453
								
							
						
					
					
						commit
						415b690d1e
					
				| 
		 Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB  | 
| 
		 Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB  | 
| 
						 | 
				
			
			@ -9,6 +9,7 @@
 | 
			
		|||
 | 
			
		||||
    <link rel="manifest" href="site.webmanifest">
 | 
			
		||||
    <link rel="apple-touch-icon" href="icon.png">
 | 
			
		||||
    <link rel="icon" type="image/icon" href="favicon.ico">
 | 
			
		||||
 | 
			
		||||
    <link rel="stylesheet" href="vendor/grayscale/grayscale.min.css">
 | 
			
		||||
    <!-- build:css css/styles.css -->
 | 
			
		||||
| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
 | 
			
		||||
        Built your next revolutionary <em>Single Page Application</em> (SPA) starting right here:
 | 
			
		||||
 | 
			
		||||
        <blockquote>/public/tags/home.tag.html</blockquote>
 | 
			
		||||
        <blockquote>/app/tags/home.tag.html</blockquote>
 | 
			
		||||
 | 
			
		||||
        This <strong>seed</strong> kicks your development into high gear with all tools you'll <em>need</em>, and very <em>little</em> you don't.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,630 @@
 | 
			
		|||
/* Grayscale.css v:0.8.1 | MIT LICENSE | https://github.com/n2geoff/grayscale */
 | 
			
		||||
 | 
			
		||||
/* CSS Reset */
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  font-family: georgia, serif;
 | 
			
		||||
  font-size: 16px;
 | 
			
		||||
  line-height: 1.4em;
 | 
			
		||||
  color: #2A2A2A;
 | 
			
		||||
  -webkit-font-smoothing: antialiased;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
*,
 | 
			
		||||
*:before,
 | 
			
		||||
*:after {
 | 
			
		||||
  box-sizing: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html,
 | 
			
		||||
body {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body,
 | 
			
		||||
html,
 | 
			
		||||
span,
 | 
			
		||||
div {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  font-weight: normal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ol,
 | 
			
		||||
ul {
 | 
			
		||||
  list-style: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
img,
 | 
			
		||||
embed,
 | 
			
		||||
iframe,
 | 
			
		||||
object,
 | 
			
		||||
audio,
 | 
			
		||||
video {
 | 
			
		||||
  height: auto;
 | 
			
		||||
  max-width: 100%;
 | 
			
		||||
  border: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table {
 | 
			
		||||
  border-collapse: collapse;
 | 
			
		||||
  border-spacing: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Blockquote */
 | 
			
		||||
 | 
			
		||||
.blockquote,
 | 
			
		||||
.quote {
 | 
			
		||||
  border-left: 0.4em solid #E6E6E6;
 | 
			
		||||
  background-color: #F9F9F9;
 | 
			
		||||
  margin-left: 0;
 | 
			
		||||
  margin-right: 0;
 | 
			
		||||
  padding: 1em 1.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.blockquote *:last-child,
 | 
			
		||||
.quote *:last-child {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Buttons */
 | 
			
		||||
 | 
			
		||||
.button,
 | 
			
		||||
a.button,
 | 
			
		||||
.button[type="submit"],
 | 
			
		||||
.button[type="reset"],
 | 
			
		||||
.button[type="button"] {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  zoom: 1;
 | 
			
		||||
  line-height: normal;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  vertical-align: top;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  -webkit-user-select: none;
 | 
			
		||||
  -moz-user-select: none;
 | 
			
		||||
  -ms-user-select: none;
 | 
			
		||||
  user-select: none;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  font-family: inherit;
 | 
			
		||||
  font-size: 1em;
 | 
			
		||||
  padding: .5em 1em;
 | 
			
		||||
  background-color: #F9F9F9;
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
  border: 1px solid #c6c6c6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button.is-link {
 | 
			
		||||
  color: #101111;
 | 
			
		||||
  border-color: transparent;
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button.is-link:hover {
 | 
			
		||||
  background-image: none;
 | 
			
		||||
  text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button.is-rounded {
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button:hover,
 | 
			
		||||
.button[type="submit"]:hover,
 | 
			
		||||
.button[type="reset"]:hover,
 | 
			
		||||
.button[type="button"]:hover {
 | 
			
		||||
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(0,0,0,0)', endColorstr='#1a000000',GradientType=0);
 | 
			
		||||
  background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button:active,
 | 
			
		||||
.button[type="submit"]:active,
 | 
			
		||||
.button[type="reset"]:active,
 | 
			
		||||
.button[type="button"]:active {
 | 
			
		||||
  box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) inset;
 | 
			
		||||
  border-color: #000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button:focus,
 | 
			
		||||
.button[type="submit"]:focus,
 | 
			
		||||
.button[type="reset"]:focus,
 | 
			
		||||
.button[type="button"]:focus {
 | 
			
		||||
  outline: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-disabled,
 | 
			
		||||
.is-disabled:hover,
 | 
			
		||||
.is-disabled:active,
 | 
			
		||||
.is-disabled:focus {
 | 
			
		||||
  border: 1px solid #c6c6c6;
 | 
			
		||||
  background-image: none;
 | 
			
		||||
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
 | 
			
		||||
  filter: alpha(opacity=40);
 | 
			
		||||
  opacity: 0.40;
 | 
			
		||||
  cursor: not-allowed;
 | 
			
		||||
  box-shadow: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.button,
 | 
			
		||||
a.button:active,
 | 
			
		||||
a.button:visited {
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  color: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Card Component */
 | 
			
		||||
 | 
			
		||||
.card {
 | 
			
		||||
  -webkit-box-orient: vertical;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: column;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
  -webkit-box-flex: 0;
 | 
			
		||||
  -ms-flex: 0 1 calc(50% - 0.5em);
 | 
			
		||||
  flex: 0 1 calc(50% - 0.5em);
 | 
			
		||||
  margin-bottom: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card-header {
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  padding: .5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card-content {
 | 
			
		||||
  padding: 1em .5em;
 | 
			
		||||
  min-height: 100px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card-footer {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-align: stretch;
 | 
			
		||||
  -ms-flex-align: stretch;
 | 
			
		||||
  align-items: stretch;
 | 
			
		||||
  border-top: 1px solid #dbdbdb;
 | 
			
		||||
  -webkit-box-flex: 1;
 | 
			
		||||
  -ms-flex: 1;
 | 
			
		||||
  flex: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card-footer .card-footer-item {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-flex: 1;
 | 
			
		||||
  -ms-flex: 1 0 0;
 | 
			
		||||
  flex: 1 0 0;
 | 
			
		||||
  -webkit-box-align: center;
 | 
			
		||||
  -ms-flex-align: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  -webkit-box-pack: center;
 | 
			
		||||
  -ms-flex-pack: center;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  padding: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card.is-shadowed {
 | 
			
		||||
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Forms */
 | 
			
		||||
 | 
			
		||||
.field,
 | 
			
		||||
.textarea {
 | 
			
		||||
  font-size: 1em;
 | 
			
		||||
  height: 36px;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  padding: 6px 10px;
 | 
			
		||||
  /* The 6px vertically centers text on FF, ignored by Webkit */
 | 
			
		||||
  background-color: #F9F9F9;
 | 
			
		||||
  border: 1px solid #E6E6E6;
 | 
			
		||||
  box-shadow: none;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.textarea {
 | 
			
		||||
  min-height: 6em;
 | 
			
		||||
  padding-top: 6px;
 | 
			
		||||
  padding-bottom: 6px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.field[type="checkbox"],
 | 
			
		||||
.field[type="radio"] {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  bottom: -3px;
 | 
			
		||||
  height: 16px;
 | 
			
		||||
  width: 16px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.field:hover,
 | 
			
		||||
.textarea:hover {
 | 
			
		||||
  border: 1px solid #c6c6c6;
 | 
			
		||||
  outline: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.field:focus,
 | 
			
		||||
.textarea:focus {
 | 
			
		||||
  border: 1px solid #787878;
 | 
			
		||||
  background-color: #FFF;
 | 
			
		||||
  outline: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.field-group,
 | 
			
		||||
.group {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -ms-flex-pack: distribute;
 | 
			
		||||
  justify-content: space-around;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.stack {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-orient: vertical;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: column;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.addon {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-pack: start;
 | 
			
		||||
  -ms-flex-pack: start;
 | 
			
		||||
  justify-content: flex-start;
 | 
			
		||||
  padding: 0 1em;
 | 
			
		||||
  line-height: 2em;
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.label,
 | 
			
		||||
.legend {
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: 0.5em 0;
 | 
			
		||||
  font-weight: 600;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fieldset {
 | 
			
		||||
  margin: .5em;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  border-width: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Layout Container */
 | 
			
		||||
 | 
			
		||||
.layout {
 | 
			
		||||
  margin: 0 auto;
 | 
			
		||||
  zoom: 1;
 | 
			
		||||
  letter-spacing: normal;
 | 
			
		||||
  word-spacing: normal;
 | 
			
		||||
  vertical-align: top;
 | 
			
		||||
  text-rendering: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.container {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-orient: vertical;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: column;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  -ms-flex-wrap: nowrap;
 | 
			
		||||
  flex-wrap: nowrap;
 | 
			
		||||
  -webkit-box-pack: start;
 | 
			
		||||
  -ms-flex-pack: start;
 | 
			
		||||
  justify-content: flex-start;
 | 
			
		||||
  -webkit-box-align: stretch;
 | 
			
		||||
  -ms-flex-align: stretch;
 | 
			
		||||
  align-items: stretch;
 | 
			
		||||
  -ms-flex-line-pack: stretch;
 | 
			
		||||
  align-content: stretch;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.page {
 | 
			
		||||
  width: 90%;
 | 
			
		||||
  max-width: 1140px;
 | 
			
		||||
  margin: 0 auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Flex-Based Grid Solution */
 | 
			
		||||
 | 
			
		||||
.row {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-orient: horizontal;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: row;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  -ms-flex-wrap: nowrap;
 | 
			
		||||
  flex-wrap: nowrap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.column {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-orient: vertical;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: column;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  -webkit-box-pack: justify;
 | 
			
		||||
  -ms-flex-pack: justify;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
  -webkit-box-flex: 1;
 | 
			
		||||
  -ms-flex: 1;
 | 
			
		||||
  flex: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.expand {
 | 
			
		||||
  -webkit-box-flex: 1;
 | 
			
		||||
  -ms-flex: 1 1 auto;
 | 
			
		||||
  flex: 1 1 auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Precent-Based Grid Solution */
 | 
			
		||||
 | 
			
		||||
.column-100,
 | 
			
		||||
.column-20,
 | 
			
		||||
.column-25,
 | 
			
		||||
.column-33,
 | 
			
		||||
.column-50,
 | 
			
		||||
.column-67 {
 | 
			
		||||
  display: inline;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  *margin-left: -0.04em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.column-20 {
 | 
			
		||||
  width: 20%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.column-25 {
 | 
			
		||||
  width: 25%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.column-33 {
 | 
			
		||||
  width: 33.33%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.column-50 {
 | 
			
		||||
  width: 50%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.column-67 {
 | 
			
		||||
  width: 67.67%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.column-100 {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Navigation */
 | 
			
		||||
 | 
			
		||||
.navbar {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-orient: horizontal;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: row;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-item {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-orient: horizontal;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: row;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  margin: 0 .5em;
 | 
			
		||||
  -webkit-box-align: bottom;
 | 
			
		||||
  -ms-flex-align: bottom;
 | 
			
		||||
  align-items: bottom;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Tables */
 | 
			
		||||
 | 
			
		||||
.table {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  border-spacing: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table thead tr th {
 | 
			
		||||
  border-bottom: 2px solid #c6c6c6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table th,
 | 
			
		||||
.table td {
 | 
			
		||||
  padding: .5em 0;
 | 
			
		||||
  text-align: left;
 | 
			
		||||
  border-bottom: 1px solid #c6c6c6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table tr th:first-child,
 | 
			
		||||
.table tr td:first-child {
 | 
			
		||||
  padding-left: .5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table.is-striped tbody tr:nth-child(odd) {
 | 
			
		||||
  background-color: #E6E6E6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table.is-condensed th,
 | 
			
		||||
table.is-condensed td {
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table.is-bordered td {
 | 
			
		||||
  border: 1px solid #E6E6E6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table.is-bordered th {
 | 
			
		||||
  border: 1px solid #E6E6E6;
 | 
			
		||||
  border-bottom: 2px solid #E6E6E6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Typeography */
 | 
			
		||||
 | 
			
		||||
p {
 | 
			
		||||
  line-height: 1.4em;
 | 
			
		||||
  margin-top: 1.4em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Utilities */
 | 
			
		||||
 | 
			
		||||
.is-right {
 | 
			
		||||
  float: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-left {
 | 
			
		||||
  float: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-centered {
 | 
			
		||||
  margin: auto;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-inline {
 | 
			
		||||
  display: inline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-block {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-bordered {
 | 
			
		||||
  border: 1px solid #E6E6E6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-divider,
 | 
			
		||||
hr {
 | 
			
		||||
  border-top: 1px solid #E6E6E6;
 | 
			
		||||
  border-top: 1px solid #E6E6E6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-well {
 | 
			
		||||
  padding: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-wall {
 | 
			
		||||
  padding: 0 .5em 0 .5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-wide {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  margin: inherit 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-tall {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  margin: 0 inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-fit {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-borderless {
 | 
			
		||||
  border: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-clear {
 | 
			
		||||
  clear: both;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-small {
 | 
			
		||||
  font-size: .8em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-large {
 | 
			
		||||
  font-size: 1.2em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-hidden {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-upper {
 | 
			
		||||
  text-transform: uppercase;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-lower {
 | 
			
		||||
  text-transform: lowercase;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-title {
 | 
			
		||||
  text-transform: capitalize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-indented {
 | 
			
		||||
  margin-left: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-muted {
 | 
			
		||||
  color: #c6c6c6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Grayscale */
 | 
			
		||||
 | 
			
		||||
.is-white {
 | 
			
		||||
  background-color: #FFF;
 | 
			
		||||
  color: #2A2A2A;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-lightest {
 | 
			
		||||
  background-color: #F9F9F9;
 | 
			
		||||
  color: #2A2A2A;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-lighter {
 | 
			
		||||
  background-color: #E6E6E6;
 | 
			
		||||
  color: #2A2A2A;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-light {
 | 
			
		||||
  background-color: #c6c6c6;
 | 
			
		||||
  color: #2A2A2A;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-gray {
 | 
			
		||||
  background-color: #acacac;
 | 
			
		||||
  color: #101111;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-dark {
 | 
			
		||||
  background-color: #787878;
 | 
			
		||||
  color: #F9F9F9;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-darker {
 | 
			
		||||
  background-color: #545454;
 | 
			
		||||
  color: #F9F9F9;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-darkest {
 | 
			
		||||
  background-color: #2A2A2A;
 | 
			
		||||
  color: #F9F9F9;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-black {
 | 
			
		||||
  background-color: #101111;
 | 
			
		||||
  color: #F9F9F9;
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
/* Colors */
 | 
			
		||||
 | 
			
		||||
.is-primary {background-color: steelblue; color: #F9F9F9;}
 | 
			
		||||
.is-secondary {background-color: #264863; color: #F9F9F9;}
 | 
			
		||||
.is-accent {background-color: lightsteelblue; color: #2A2A2A;}
 | 
			
		||||
.is-dangerous {background-color: indianred; color: #F9F9F9;}
 | 
			
		||||
.is-safe {background-color: darkseagreen; color: #2A2A2A;}
 | 
			
		||||
.is-warning {background-color: khaki; color: #2A2A2A;}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,486 @@
 | 
			
		|||
var route = (function () {
 | 
			
		||||
  'use strict';
 | 
			
		||||
 | 
			
		||||
  var observable = function(el) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Extend the original object or create a new empty one
 | 
			
		||||
     * @type { Object }
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    el = el || {};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Private variables
 | 
			
		||||
     */
 | 
			
		||||
    var callbacks = {},
 | 
			
		||||
      slice = Array.prototype.slice;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Public Api
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    // extend the el object adding the observable methods
 | 
			
		||||
    Object.defineProperties(el, {
 | 
			
		||||
      /**
 | 
			
		||||
       * Listen to the given `event` ands
 | 
			
		||||
       * execute the `callback` each time an event is triggered.
 | 
			
		||||
       * @param  { String } event - event id
 | 
			
		||||
       * @param  { Function } fn - callback function
 | 
			
		||||
       * @returns { Object } el
 | 
			
		||||
       */
 | 
			
		||||
      on: {
 | 
			
		||||
        value: function(event, fn) {
 | 
			
		||||
          if (typeof fn == 'function')
 | 
			
		||||
            { (callbacks[event] = callbacks[event] || []).push(fn); }
 | 
			
		||||
          return el
 | 
			
		||||
        },
 | 
			
		||||
        enumerable: false,
 | 
			
		||||
        writable: false,
 | 
			
		||||
        configurable: false
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Removes the given `event` listeners
 | 
			
		||||
       * @param   { String } event - event id
 | 
			
		||||
       * @param   { Function } fn - callback function
 | 
			
		||||
       * @returns { Object } el
 | 
			
		||||
       */
 | 
			
		||||
      off: {
 | 
			
		||||
        value: function(event, fn) {
 | 
			
		||||
          if (event == '*' && !fn) { callbacks = {}; }
 | 
			
		||||
          else {
 | 
			
		||||
            if (fn) {
 | 
			
		||||
              var arr = callbacks[event];
 | 
			
		||||
              for (var i = 0, cb; cb = arr && arr[i]; ++i) {
 | 
			
		||||
                if (cb == fn) { arr.splice(i--, 1); }
 | 
			
		||||
              }
 | 
			
		||||
            } else { delete callbacks[event]; }
 | 
			
		||||
          }
 | 
			
		||||
          return el
 | 
			
		||||
        },
 | 
			
		||||
        enumerable: false,
 | 
			
		||||
        writable: false,
 | 
			
		||||
        configurable: false
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Listen to the given `event` and
 | 
			
		||||
       * execute the `callback` at most once
 | 
			
		||||
       * @param   { String } event - event id
 | 
			
		||||
       * @param   { Function } fn - callback function
 | 
			
		||||
       * @returns { Object } el
 | 
			
		||||
       */
 | 
			
		||||
      one: {
 | 
			
		||||
        value: function(event, fn) {
 | 
			
		||||
          function on() {
 | 
			
		||||
            el.off(event, on);
 | 
			
		||||
            fn.apply(el, arguments);
 | 
			
		||||
          }
 | 
			
		||||
          return el.on(event, on)
 | 
			
		||||
        },
 | 
			
		||||
        enumerable: false,
 | 
			
		||||
        writable: false,
 | 
			
		||||
        configurable: false
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Execute all callback functions that listen to
 | 
			
		||||
       * the given `event`
 | 
			
		||||
       * @param   { String } event - event id
 | 
			
		||||
       * @returns { Object } el
 | 
			
		||||
       */
 | 
			
		||||
      trigger: {
 | 
			
		||||
        value: function(event) {
 | 
			
		||||
          var arguments$1 = arguments;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          // getting the arguments
 | 
			
		||||
          var arglen = arguments.length - 1,
 | 
			
		||||
            args = new Array(arglen),
 | 
			
		||||
            fns,
 | 
			
		||||
            fn,
 | 
			
		||||
            i;
 | 
			
		||||
 | 
			
		||||
          for (i = 0; i < arglen; i++) {
 | 
			
		||||
            args[i] = arguments$1[i + 1]; // skip first argument
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          fns = slice.call(callbacks[event] || [], 0);
 | 
			
		||||
 | 
			
		||||
          for (i = 0; fn = fns[i]; ++i) {
 | 
			
		||||
            fn.apply(el, args);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          if (callbacks['*'] && event != '*')
 | 
			
		||||
            { el.trigger.apply(el, ['*', event].concat(args)); }
 | 
			
		||||
 | 
			
		||||
          return el
 | 
			
		||||
        },
 | 
			
		||||
        enumerable: false,
 | 
			
		||||
        writable: false,
 | 
			
		||||
        configurable: false
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return el
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Simple client-side router
 | 
			
		||||
   * @module riot-route
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  var RE_ORIGIN = /^.+?\/\/+[^/]+/,
 | 
			
		||||
    EVENT_LISTENER = 'EventListener',
 | 
			
		||||
    REMOVE_EVENT_LISTENER = 'remove' + EVENT_LISTENER,
 | 
			
		||||
    ADD_EVENT_LISTENER = 'add' + EVENT_LISTENER,
 | 
			
		||||
    HAS_ATTRIBUTE = 'hasAttribute',
 | 
			
		||||
    POPSTATE = 'popstate',
 | 
			
		||||
    HASHCHANGE = 'hashchange',
 | 
			
		||||
    TRIGGER = 'trigger',
 | 
			
		||||
    MAX_EMIT_STACK_LEVEL = 3,
 | 
			
		||||
    win = typeof window != 'undefined' && window,
 | 
			
		||||
    doc = typeof document != 'undefined' && document,
 | 
			
		||||
    hist = win && history,
 | 
			
		||||
    loc = win && (hist.location || win.location), // see html5-history-api
 | 
			
		||||
    prot = Router.prototype, // to minify more
 | 
			
		||||
    clickEvent = doc && doc.ontouchstart ? 'touchstart' : 'click',
 | 
			
		||||
    central = observable();
 | 
			
		||||
 | 
			
		||||
  var
 | 
			
		||||
    started = false,
 | 
			
		||||
    routeFound = false,
 | 
			
		||||
    debouncedEmit,
 | 
			
		||||
    current,
 | 
			
		||||
    parser,
 | 
			
		||||
    secondParser,
 | 
			
		||||
    emitStack = [],
 | 
			
		||||
    emitStackLevel = 0;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Default parser. You can replace it via router.parser method.
 | 
			
		||||
   * @param {string} path - current path (normalized)
 | 
			
		||||
   * @returns {array} array
 | 
			
		||||
   */
 | 
			
		||||
  function DEFAULT_PARSER(path) {
 | 
			
		||||
    return path.split(/[/?#]/)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Default parser (second). You can replace it via router.parser method.
 | 
			
		||||
   * @param {string} path - current path (normalized)
 | 
			
		||||
   * @param {string} filter - filter string (normalized)
 | 
			
		||||
   * @returns {array} array
 | 
			
		||||
   */
 | 
			
		||||
  function DEFAULT_SECOND_PARSER(path, filter) {
 | 
			
		||||
    var f = filter
 | 
			
		||||
      .replace(/\?/g, '\\?')
 | 
			
		||||
      .replace(/\*/g, '([^/?#]+?)')
 | 
			
		||||
      .replace(/\.\./, '.*');
 | 
			
		||||
    var re = new RegExp(("^" + f + "$"));
 | 
			
		||||
    var args = path.match(re);
 | 
			
		||||
 | 
			
		||||
    if (args) { return args.slice(1) }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Simple/cheap debounce implementation
 | 
			
		||||
   * @param   {function} fn - callback
 | 
			
		||||
   * @param   {number} delay - delay in seconds
 | 
			
		||||
   * @returns {function} debounced function
 | 
			
		||||
   */
 | 
			
		||||
  function debounce(fn, delay) {
 | 
			
		||||
    var t;
 | 
			
		||||
    return function () {
 | 
			
		||||
      clearTimeout(t);
 | 
			
		||||
      t = setTimeout(fn, delay);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Set the window listeners to trigger the routes
 | 
			
		||||
   * @param {boolean} autoExec - see route.start
 | 
			
		||||
   */
 | 
			
		||||
  function start(autoExec) {
 | 
			
		||||
    debouncedEmit = debounce(emit, 1);
 | 
			
		||||
    win[ADD_EVENT_LISTENER](POPSTATE, debouncedEmit);
 | 
			
		||||
    win[ADD_EVENT_LISTENER](HASHCHANGE, debouncedEmit);
 | 
			
		||||
    doc[ADD_EVENT_LISTENER](clickEvent, click);
 | 
			
		||||
 | 
			
		||||
    if (autoExec) { emit(true); }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Router class
 | 
			
		||||
   */
 | 
			
		||||
  function Router() {
 | 
			
		||||
    this.$ = [];
 | 
			
		||||
    observable(this); // make it observable
 | 
			
		||||
    central.on('stop', this.s.bind(this));
 | 
			
		||||
    central.on('emit', this.e.bind(this));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function normalize(path) {
 | 
			
		||||
    return path.replace(/^\/|\/$/, '')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function isString(str) {
 | 
			
		||||
    return typeof str == 'string'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Get the part after domain name
 | 
			
		||||
   * @param {string} href - fullpath
 | 
			
		||||
   * @returns {string} path from root
 | 
			
		||||
   */
 | 
			
		||||
  function getPathFromRoot(href) {
 | 
			
		||||
    return (href || loc.href).replace(RE_ORIGIN, '')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Get the part after base
 | 
			
		||||
   * @param {string} href - fullpath
 | 
			
		||||
   * @returns {string} path from base
 | 
			
		||||
   */
 | 
			
		||||
  function getPathFromBase(href) {
 | 
			
		||||
    var base = route._.base;
 | 
			
		||||
    return base[0] === '#'
 | 
			
		||||
      ? (href || loc.href || '').split(base)[1] || ''
 | 
			
		||||
      : (loc ? getPathFromRoot(href) : href || '').replace(base, '')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function emit(force) {
 | 
			
		||||
    // the stack is needed for redirections
 | 
			
		||||
    var isRoot = emitStackLevel === 0;
 | 
			
		||||
    if (MAX_EMIT_STACK_LEVEL <= emitStackLevel) { return }
 | 
			
		||||
 | 
			
		||||
    emitStackLevel++;
 | 
			
		||||
    emitStack.push(function() {
 | 
			
		||||
      var path = getPathFromBase();
 | 
			
		||||
      if (force || path !== current) {
 | 
			
		||||
        central[TRIGGER]('emit', path);
 | 
			
		||||
        current = path;
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (isRoot) {
 | 
			
		||||
      var first;
 | 
			
		||||
      while (first = emitStack.shift()) { first(); } // stack increses within this call
 | 
			
		||||
      emitStackLevel = 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function click(e) {
 | 
			
		||||
    if (
 | 
			
		||||
      e.which !== 1 // not left click
 | 
			
		||||
      || e.metaKey || e.ctrlKey || e.shiftKey // or meta keys
 | 
			
		||||
      || e.defaultPrevented // or default prevented
 | 
			
		||||
    ) { return }
 | 
			
		||||
 | 
			
		||||
    var el = e.target;
 | 
			
		||||
    while (el && el.nodeName !== 'A') { el = el.parentNode; }
 | 
			
		||||
 | 
			
		||||
    if (
 | 
			
		||||
      !el || el.nodeName !== 'A' // not A tag
 | 
			
		||||
      || el[HAS_ATTRIBUTE]('download') // has download attr
 | 
			
		||||
      || !el[HAS_ATTRIBUTE]('href') // has no href attr
 | 
			
		||||
      || el.target && el.target !== '_self' // another window or frame
 | 
			
		||||
      || el.href.indexOf(loc.href.match(RE_ORIGIN)[0]) === -1 // cross origin
 | 
			
		||||
    ) { return }
 | 
			
		||||
 | 
			
		||||
    var base = route._.base;
 | 
			
		||||
 | 
			
		||||
    if (el.href !== loc.href
 | 
			
		||||
      && (
 | 
			
		||||
        el.href.split('#')[0] === loc.href.split('#')[0] // internal jump
 | 
			
		||||
        || base[0] !== '#' && getPathFromRoot(el.href).indexOf(base) !== 0 // outside of base
 | 
			
		||||
        || base[0] === '#' && el.href.split(base)[0] !== loc.href.split(base)[0] // outside of #base
 | 
			
		||||
        || !go(getPathFromBase(el.href), el.title || doc.title) // route not found
 | 
			
		||||
      )) { return }
 | 
			
		||||
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Go to the path
 | 
			
		||||
   * @param {string} path - destination path
 | 
			
		||||
   * @param {string} title - page title
 | 
			
		||||
   * @param {boolean} shouldReplace - use replaceState or pushState
 | 
			
		||||
   * @returns {boolean} - route not found flag
 | 
			
		||||
   */
 | 
			
		||||
  function go(path, title, shouldReplace) {
 | 
			
		||||
    // Server-side usage: directly execute handlers for the path
 | 
			
		||||
    if (!hist) { return central[TRIGGER]('emit', getPathFromBase(path)) }
 | 
			
		||||
 | 
			
		||||
    path = route._.base + normalize(path);
 | 
			
		||||
    title = title || doc.title;
 | 
			
		||||
    // browsers ignores the second parameter `title`
 | 
			
		||||
    shouldReplace
 | 
			
		||||
      ? hist.replaceState(null, title, path)
 | 
			
		||||
      : hist.pushState(null, title, path);
 | 
			
		||||
    // so we need to set it manually
 | 
			
		||||
    doc.title = title;
 | 
			
		||||
    routeFound = false;
 | 
			
		||||
    emit();
 | 
			
		||||
    return routeFound
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Go to path or set action
 | 
			
		||||
   * a single string:                go there
 | 
			
		||||
   * two strings:                    go there with setting a title
 | 
			
		||||
   * two strings and boolean:        replace history with setting a title
 | 
			
		||||
   * a single function:              set an action on the default route
 | 
			
		||||
   * a string/RegExp and a function: set an action on the route
 | 
			
		||||
   * @param {(string|function)} first - path / action / filter
 | 
			
		||||
   * @param {(string|RegExp|function)} second - title / action
 | 
			
		||||
   * @param {boolean} third - replace flag
 | 
			
		||||
   */
 | 
			
		||||
  prot.m = function(first, second, third) {
 | 
			
		||||
    if (isString(first) && (!second || isString(second))) { go(first, second, third || false); }
 | 
			
		||||
    else if (second) { this.r(first, second); }
 | 
			
		||||
    else { this.r('@', first); }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Stop routing
 | 
			
		||||
   */
 | 
			
		||||
  prot.s = function() {
 | 
			
		||||
    this.off('*');
 | 
			
		||||
    this.$ = [];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Emit
 | 
			
		||||
   * @param {string} path - path
 | 
			
		||||
   */
 | 
			
		||||
  prot.e = function(path) {
 | 
			
		||||
    this.$.concat('@').some(function(filter) {
 | 
			
		||||
      var args = (filter === '@' ? parser : secondParser)(normalize(path), normalize(filter));
 | 
			
		||||
      if (typeof args != 'undefined') {
 | 
			
		||||
        this[TRIGGER].apply(null, [filter].concat(args));
 | 
			
		||||
        return routeFound = true // exit from loop
 | 
			
		||||
      }
 | 
			
		||||
    }, this);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Register route
 | 
			
		||||
   * @param {string} filter - filter for matching to url
 | 
			
		||||
   * @param {function} action - action to register
 | 
			
		||||
   */
 | 
			
		||||
  prot.r = function(filter, action) {
 | 
			
		||||
    if (filter !== '@') {
 | 
			
		||||
      filter = '/' + normalize(filter);
 | 
			
		||||
      this.$.push(filter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.on(filter, action);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  var mainRouter = new Router();
 | 
			
		||||
  var route = mainRouter.m.bind(mainRouter);
 | 
			
		||||
 | 
			
		||||
  // adding base and getPathFromBase to route so we can access them in route.tag's script
 | 
			
		||||
  route._ = { base: null, getPathFromBase: getPathFromBase };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Create a sub router
 | 
			
		||||
   * @returns {function} the method of a new Router object
 | 
			
		||||
   */
 | 
			
		||||
  route.create = function() {
 | 
			
		||||
    var newSubRouter = new Router();
 | 
			
		||||
    // assign sub-router's main method
 | 
			
		||||
    var router = newSubRouter.m.bind(newSubRouter);
 | 
			
		||||
    // stop only this sub-router
 | 
			
		||||
    router.stop = newSubRouter.s.bind(newSubRouter);
 | 
			
		||||
    return router
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Set the base of url
 | 
			
		||||
   * @param {(str|RegExp)} arg - a new base or '#' or '#!'
 | 
			
		||||
   */
 | 
			
		||||
  route.base = function(arg) {
 | 
			
		||||
    route._.base = arg || '#';
 | 
			
		||||
    current = getPathFromBase(); // recalculate current path
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /** Exec routing right now **/
 | 
			
		||||
  route.exec = function() {
 | 
			
		||||
    emit(true);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Replace the default router to yours
 | 
			
		||||
   * @param {function} fn - your parser function
 | 
			
		||||
   * @param {function} fn2 - your secondParser function
 | 
			
		||||
   */
 | 
			
		||||
  route.parser = function(fn, fn2) {
 | 
			
		||||
    if (!fn && !fn2) {
 | 
			
		||||
      // reset parser for testing...
 | 
			
		||||
      parser = DEFAULT_PARSER;
 | 
			
		||||
      secondParser = DEFAULT_SECOND_PARSER;
 | 
			
		||||
    }
 | 
			
		||||
    if (fn) { parser = fn; }
 | 
			
		||||
    if (fn2) { secondParser = fn2; }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Helper function to get url query as an object
 | 
			
		||||
   * @returns {object} parsed query
 | 
			
		||||
   */
 | 
			
		||||
  route.query = function() {
 | 
			
		||||
    var q = {};
 | 
			
		||||
    var href = loc.href || current;
 | 
			
		||||
    href.replace(/[?&](.+?)=([^&]*)/g, function(_, k, v) { q[k] = v; });
 | 
			
		||||
    return q
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /** Stop routing **/
 | 
			
		||||
  route.stop = function () {
 | 
			
		||||
    if (started) {
 | 
			
		||||
      if (win) {
 | 
			
		||||
        win[REMOVE_EVENT_LISTENER](POPSTATE, debouncedEmit);
 | 
			
		||||
        win[REMOVE_EVENT_LISTENER](HASHCHANGE, debouncedEmit);
 | 
			
		||||
        doc[REMOVE_EVENT_LISTENER](clickEvent, click);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      central[TRIGGER]('stop');
 | 
			
		||||
      started = false;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Start routing
 | 
			
		||||
   * @param {boolean} autoExec - automatically exec after starting if true
 | 
			
		||||
   */
 | 
			
		||||
  route.start = function (autoExec) {
 | 
			
		||||
    if (!started) {
 | 
			
		||||
      if (win) {
 | 
			
		||||
        if (document.readyState === 'interactive' || document.readyState === 'complete') {
 | 
			
		||||
          start(autoExec);
 | 
			
		||||
        } else {
 | 
			
		||||
          document.onreadystatechange = function () {
 | 
			
		||||
            if (document.readyState === 'interactive') {
 | 
			
		||||
              // the timeout is needed to solve
 | 
			
		||||
              // a weird safari bug https://github.com/riot/route/issues/33
 | 
			
		||||
              setTimeout(function() { start(autoExec); }, 1);
 | 
			
		||||
            }
 | 
			
		||||
          };
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      started = true;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /** Prepare the router **/
 | 
			
		||||
  route.base();
 | 
			
		||||
  route.parser();
 | 
			
		||||
 | 
			
		||||
  return route;
 | 
			
		||||
 | 
			
		||||
}());
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
var route=function(){"use strict";var e=function(u){u=u||{};var o={},l=Array.prototype.slice;Object.defineProperties(u,{on:{value:function(e,t){if(typeof t=="function"){(o[e]=o[e]||[]).push(t)}return u},enumerable:false,writable:false,configurable:false},off:{value:function(e,t){if(e=="*"&&!t){o={}}else{if(t){var n=o[e];for(var r=0,i;i=n&&n[r];++r){if(i==t){n.splice(r--,1)}}}else{delete o[e]}}return u},enumerable:false,writable:false,configurable:false},one:{value:function(e,t){function n(){u.off(e,n);t.apply(u,arguments)}return u.on(e,n)},enumerable:false,writable:false,configurable:false},trigger:{value:function(e){var t=arguments;var n=arguments.length-1,r=new Array(n),i,a,f;for(f=0;f<n;f++){r[f]=t[f+1]}i=l.call(o[e]||[],0);for(f=0;a=i[f];++f){a.apply(u,r)}if(o["*"]&&e!="*"){u.trigger.apply(u,["*",e].concat(r))}return u},enumerable:false,writable:false,configurable:false}});return u};var r=/^.+?\/\/+[^/]+/,t="EventListener",n="remove"+t,i="add"+t,a="hasAttribute",f="popstate",u="hashchange",o="trigger",l=3,s=typeof window!="undefined"&&window,c=typeof document!="undefined"&&document,h=s&&history,p=s&&(h.location||s.location),d=P.prototype,v=c&&c.ontouchstart?"touchstart":"click",m=e();var b=false,g=false,y,w,$,_,A=[],S=0;function x(e){return e.split(/[/?#]/)}function K(e,t){var n=t.replace(/\?/g,"\\?").replace(/\*/g,"([^/?#]+?)").replace(/\.\./,".*");var r=new RegExp("^"+n+"$");var i=e.match(r);if(i){return i.slice(1)}}function N(e,t){var n;return function(){clearTimeout(n);n=setTimeout(e,t)}}function O(e){y=N(q,1);s[i](f,y);s[i](u,y);c[i](v,B);if(e){q(true)}}function P(){this.$=[];e(this);m.on("stop",this.s.bind(this));m.on("emit",this.e.bind(this))}function T(e){return e.replace(/^\/|\/$/,"")}function E(e){return typeof e=="string"}function j(e){return(e||p.href).replace(r,"")}function k(e){var t=L._.base;return t[0]==="#"?(e||p.href||"").split(t)[1]||"":(p?j(e):e||"").replace(t,"")}function q(t){var e=S===0;if(l<=S){return}S++;A.push(function(){var e=k();if(t||e!==w){m[o]("emit",e);w=e}});if(e){var n;while(n=A.shift()){n()}S=0}}function B(e){if(e.which!==1||e.metaKey||e.ctrlKey||e.shiftKey||e.defaultPrevented){return}var t=e.target;while(t&&t.nodeName!=="A"){t=t.parentNode}if(!t||t.nodeName!=="A"||t[a]("download")||!t[a]("href")||t.target&&t.target!=="_self"||t.href.indexOf(p.href.match(r)[0])===-1){return}var n=L._.base;if(t.href!==p.href&&(t.href.split("#")[0]===p.href.split("#")[0]||n[0]!=="#"&&j(t.href).indexOf(n)!==0||n[0]==="#"&&t.href.split(n)[0]!==p.href.split(n)[0]||!D(k(t.href),t.title||c.title))){return}e.preventDefault()}function D(e,t,n){if(!h){return m[o]("emit",k(e))}e=L._.base+T(e);t=t||c.title;n?h.replaceState(null,t,e):h.pushState(null,t,e);c.title=t;g=false;q();return g}d.m=function(e,t,n){if(E(e)&&(!t||E(t))){D(e,t,n||false)}else if(t){this.r(e,t)}else{this.r("@",e)}};d.s=function(){this.off("*");this.$=[]};d.e=function(n){this.$.concat("@").some(function(e){var t=(e==="@"?$:_)(T(n),T(e));if(typeof t!="undefined"){this[o].apply(null,[e].concat(t));return g=true}},this)};d.r=function(e,t){if(e!=="@"){e="/"+T(e);this.$.push(e)}this.on(e,t)};var F=new P;var L=F.m.bind(F);L._={base:null,getPathFromBase:k};L.create=function(){var e=new P;var t=e.m.bind(e);t.stop=e.s.bind(e);return t};L.base=function(e){L._.base=e||"#";w=k()};L.exec=function(){q(true)};L.parser=function(e,t){if(!e&&!t){$=x;_=K}if(e){$=e}if(t){_=t}};L.query=function(){var r={};var e=p.href||w;e.replace(/[?&](.+?)=([^&]*)/g,function(e,t,n){r[t]=n});return r};L.stop=function(){if(b){if(s){s[n](f,y);s[n](u,y);c[n](v,B)}m[o]("stop");b=false}};L.start=function(e){if(!b){if(s){if(document.readyState==="interactive"||document.readyState==="complete"){O(e)}else{document.onreadystatechange=function(){if(document.readyState==="interactive"){setTimeout(function(){O(e)},1)}}}}b=true}};L.base();L.parser();return L}();
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										16
									
								
								gulpfile.js
								
								
								
								
							
							
						
						
									
										16
									
								
								gulpfile.js
								
								
								
								
							| 
						 | 
				
			
			@ -9,7 +9,7 @@ const gulp = require('gulp'),
 | 
			
		|||
 | 
			
		||||
// build riotjs tags (components)
 | 
			
		||||
gulp.task('tags', () => {
 | 
			
		||||
    return gulp.src('./src/public/tags/**/*.tag.html')
 | 
			
		||||
    return gulp.src('./app/tags/**/*.tag.html')
 | 
			
		||||
        .pipe(concat('tags.js'))
 | 
			
		||||
        .pipe(riot({compact: true, whitespace: false}))
 | 
			
		||||
        .pipe(minify({ext: {min: '.min.js'}}))
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ gulp.task('tags', () => {
 | 
			
		|||
 | 
			
		||||
// combine javascript files
 | 
			
		||||
gulp.task('javascript', () => {
 | 
			
		||||
    return gulp.src('./src/public/js/**/*.js')
 | 
			
		||||
    return gulp.src('./app/js/**/*.js')
 | 
			
		||||
        .pipe(concat('combined.js'))
 | 
			
		||||
        .pipe(minify({ext: {min: '.min.js'}}))
 | 
			
		||||
        .pipe(gulp.dest('./dist/js'));
 | 
			
		||||
| 
						 | 
				
			
			@ -26,20 +26,20 @@ gulp.task('javascript', () => {
 | 
			
		|||
 | 
			
		||||
// move fonts
 | 
			
		||||
gulp.task('fonts', () => {
 | 
			
		||||
    return gulp.src('./src/public/fonts/**/*.ttf')
 | 
			
		||||
    return gulp.src('./app/fonts/**/*.ttf')
 | 
			
		||||
        .pipe(gulp.dest('./dist/fonts'));
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// move images
 | 
			
		||||
// TODO: minimize
 | 
			
		||||
gulp.task('images', () => {
 | 
			
		||||
    return gulp.src('./src/public/images/**/*')
 | 
			
		||||
    return gulp.src('./app/images/**/*')
 | 
			
		||||
        .pipe(gulp.dest('./dist/images'));
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// combine css
 | 
			
		||||
gulp.task('css', () => {
 | 
			
		||||
    return gulp.src('./src/public/css/*.css')
 | 
			
		||||
    return gulp.src('./app/css/*.css')
 | 
			
		||||
        .pipe(concat('styles.css'))
 | 
			
		||||
        .pipe(cssmin())
 | 
			
		||||
        .pipe(gulp.dest('./dist/css'));
 | 
			
		||||
| 
						 | 
				
			
			@ -47,19 +47,19 @@ gulp.task('css', () => {
 | 
			
		|||
 | 
			
		||||
// move vendor deps
 | 
			
		||||
gulp.task('vendor', () => {
 | 
			
		||||
    return gulp.src('./src/public/vendor/**/*.min.*')
 | 
			
		||||
    return gulp.src('./app/vendor/**/*.min.*')
 | 
			
		||||
        .pipe(gulp.dest('./dist/vendor'));
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// move public files
 | 
			
		||||
gulp.task('public', () => {
 | 
			
		||||
    return gulp.src('./src/public/*.*')
 | 
			
		||||
    return gulp.src('./app/*.*')
 | 
			
		||||
        .pipe(gulp.dest('./dist'));
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// build index
 | 
			
		||||
gulp.task('index', () => {
 | 
			
		||||
    return gulp.src(['./src/public/*.html'])
 | 
			
		||||
    return gulp.src(['./app/*.html'])
 | 
			
		||||
        .pipe(ref())
 | 
			
		||||
        .pipe(gulp.dest('./dist'));
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue