diff --git a/_assets/css/styles.css b/_assets/css/styles.css index 35bc825f..d83c0832 100644 --- a/_assets/css/styles.css +++ b/_assets/css/styles.css @@ -1,79 +1,74 @@ body { - font-family: 'Roboto', sans-serif; - padding-top: 7.8em; - background-color: #f8f8f8; + font-family: 'Roboto', sans-serif; + padding-top: 7.8em; + background-color: #f8f8f8; } * { - box-sizing: border-box; + box-sizing: border-box; } *, *:hover, *:active, *:focus { - outline: 0 + outline: 0 } a { - text-decoration: none; + text-decoration: none; } img { - max-width: 100%; + max-width: 100%; } audio, video { - width: 100%; + width: 100%; } pre { - padding: 1em; - border: 1px solid #e6e6e6; - border-radius: 0.5em; - background-color: #f5f5f5; - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; + padding: 1em; + border: 1px solid #e6e6e6; + border-radius: 0.5em; + background-color: #f5f5f5; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; } button { - border: 0; - padding: .5em 1em; - margin-left: .5em; - border-radius: .1em; - cursor: pointer; - background: #2196f3; - color: #fff; - border: 1px solid rgba(0, 0, 0, 0.05); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); - transition: .1s ease all; + border: 0; + padding: .5em 1em; + margin-left: .5em; + border-radius: .1em; + cursor: pointer; + background: #2196f3; + color: #fff; + border: 1px solid rgba(0, 0, 0, 0.05); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); + transition: .1s ease all; } button:hover { - background-color: #1E88E5; + background-color: #1E88E5; } .mobile-only { - display: none !important; + display: none !important; } .container { - width: 95%; - max-width: 960px; - margin: 1em auto 0; + width: 95%; + max-width: 960px; + margin: 1em auto 0; } i.spin { - animation: 1s spin linear infinite; -} - -.pdf { - width: 100%; - height: calc(100vh - 13em); + animation: 1s spin linear infinite; } @@ -82,30 +77,30 @@ i.spin { * * * * * * * * * * * * * * * */ #editor .source { - display: none; + display: none; } #editor .content { - background: #fff; - padding: 1em 0; + background: #fff; + padding: 1em 0; } #editor #ace, #editor h2, #editor .frontmatter { - width: 95%; - max-width: 960px; - margin: 1em auto 0; + width: 95%; + max-width: 960px; + margin: 1em auto 0; } #editor h2 { - margin: 1.5em auto 1em; - color: rgba(0, 0, 0, 0.3); - font-weight: 500; + margin: 1.5em auto 1em; + color: rgba(0, 0, 0, 0.3); + font-weight: 500; } #editor .ace_gutter { - background-color: #fff; + background-color: #fff; } @@ -114,124 +109,124 @@ i.spin { * * * * * * * * * * * * * * * */ .frontmatter { - column-count: 3; - column-gap: 1em; - column-fill: balance; - /* display: flex; */ - /* flex-wrap: wrap; */ - /* justify-content: space-between; */ - /* flex-grow: 1; */ + column-count: 3; + column-gap: 1em; + column-fill: balance; + /* display: flex; */ + /* flex-wrap: wrap; */ + /* justify-content: space-between; */ + /* flex-grow: 1; */ } .frontmatter label { - display: block; - width: calc(100% - 1em); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; + display: block; + width: calc(100% - 1em); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; } .frontmatter label, .frontmatter h3 { - font-weight: 500; - margin: 0 0; - color: rgba(0, 0, 0, 0.6); + font-weight: 500; + margin: 0 0; + color: rgba(0, 0, 0, 0.6); } .frontmatter input, .frontmatter textarea { - display: block; - width: 100%; - border: 0; - margin-top: .5em; - padding: 0; - line-height: 1; + display: block; + width: 100%; + border: 0; + margin-top: .5em; + padding: 0; + line-height: 1; } .frontmatter .block, .frontmatter fieldset[data-type="array"], .button { - position: relative; - background: #fff; - border-radius: .2em; - border: 1px solid rgba(0, 0, 0, 0.075); - padding: .5em; - break-inside: avoid; - margin: 0 0 1em; - width: 100%; - display: inline-block; + position: relative; + background: #fff; + border-radius: .2em; + border: 1px solid rgba(0, 0, 0, 0.075); + padding: .5em; + break-inside: avoid; + margin: 0 0 1em; + width: 100%; + display: inline-block; } .frontmatter fieldset[data-type="object"] { - position: relative; - margin: 0; + position: relative; + margin: 0; } .frontmatter .button { - background-color: #2196f3; - color: #fff; - cursor: pointer; - text-align: center; + background-color: #2196f3; + color: #fff; + cursor: pointer; + text-align: center; } [data-type="array-item"] { - position: relative; + position: relative; } [data-type="array-item"] .action { - top: 0; - right: 0; + top: 0; + right: 0; } .frontmatter textarea { - resize: none; + resize: none; } [data-type="array-item"] input { - width: calc(100% - 1em); + width: calc(100% - 1em); } .block .action, fieldset .action { - position: absolute; - top: .5em; - right: .5em; + position: absolute; + top: .5em; + right: .5em; } .block>.action, fieldset>.action { - opacity: 0; + opacity: 0; } .block:hover>.action, fieldset:hover>.action { - opacity: 1; + opacity: 1; } .block .action.add, fieldset .action.add { - right: 1.5em; + right: 1.5em; } .frontmatter .action i { - padding: 0; - font-size: 1em; + padding: 0; + font-size: 1em; } fieldset { - border: 0; - padding: 0; + border: 0; + padding: 0; } .frontmatter>fieldset h3, .frontmatter>.group h3 { - font-size: 1.5em; - margin-bottom: .5em; + font-size: 1.5em; + margin-bottom: .5em; } fieldset h3, .group h3 { - font-size: 0.9em; + font-size: 0.9em; } @@ -240,55 +235,55 @@ fieldset h3, * * * * * * * * * * * * * * * */ .action { - display: inline-block; - cursor: pointer; - transition: 0.2s ease all; - border: 0; - margin: 0; - color: #546E7A; - border-radius: 50%; - background: transparent; - padding: 0; - box-shadow: 0 0 0 0; - vertical-align: middle; - text-align: left; + display: inline-block; + cursor: pointer; + transition: 0.2s ease all; + border: 0; + margin: 0; + color: #546E7A; + border-radius: 50%; + background: transparent; + padding: 0; + box-shadow: 0 0 0 0; + vertical-align: middle; + text-align: left; } .action.disabled { - opacity: 0.2; - cursor: not-allowed; + opacity: 0.2; + cursor: not-allowed; } .action i { - padding: 0.4em; - -webkit-transition: 0.2s ease-in-out all; - transition: 0.2s ease-in-out all; - border-radius: 50%; + padding: 0.4em; + -webkit-transition: 0.2s ease-in-out all; + transition: 0.2s ease-in-out all; + border-radius: 50%; } .action:hover { - background-color: rgba(0, 0, 0, .1); + background-color: rgba(0, 0, 0, .1); } .action ul { - position: absolute; - top: 0; - color: #7d7d7d; - list-style: none; - margin: 0; - padding: 0; - flex-direction: column; - display: flex; + position: absolute; + top: 0; + color: #7d7d7d; + list-style: none; + margin: 0; + padding: 0; + flex-direction: column; + display: flex; } .action ul li { - line-height: 1; - padding: .7em; - transition: .1s ease background-color; + line-height: 1; + padding: .7em; + transition: .1s ease background-color; } .action ul li:hover { - background-color: rgba(0, 0, 0, 0.04); + background-color: rgba(0, 0, 0, 0.04); } @@ -297,32 +292,32 @@ fieldset h3, * * * * * * * * * * * * * * * */ .floating { - position: fixed; - bottom: 1em; - right: 1em; + position: fixed; + bottom: 1em; + right: 1em; } .floating .action { - background-color: #2196f3 !important; - color: #fff; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); + background-color: #2196f3 !important; + color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); } #newdir { - position: fixed; - bottom: 1.3em; - right: 5em; - transition: .2s ease all; - opacity: 0; - border: 0; - box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); - padding: .5em; - width: 22em; - border-radius: .2em; + position: fixed; + bottom: 1.3em; + right: 5em; + transition: .2s ease all; + opacity: 0; + border: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); + padding: .5em; + width: 22em; + border-radius: .2em; } #newdir.enabled { - opacity: 1; + opacity: 1; } @@ -331,80 +326,82 @@ fieldset h3, * * * * * * * * * * * * * * * */ header { - z-index: 1000; - background-color: #fff; - border-bottom: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - position: fixed; - top: 0; - left: 0; - width: 100%; - padding: 0; + z-index: 1000; + background-color: #fff; + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + position: fixed; + top: 0; + left: 0; + width: 100%; + padding: 0; } header a, header a:hover { - color: inherit; + color: inherit; } header>div { - display: flex; - width: 100%; - padding: 0.5em 0.5em 0.5em 1em; - align-items: center; + display: flex; + width: 100%; + padding: 0.5em 0.5em 0.5em 1em; + align-items: center; } header .action span { - display: none; + display: none; } header>div div { - vertical-align: middle; - position: relative; + vertical-align: middle; + position: relative; } #logout { - border-radius: 0; - margin-left: auto; - padding: .15em; + border-radius: 0; + margin-left: auto; + padding: .15em; } #click-overlay { - display: none; - position: fixed; - cursor: pointer; - top: 0; - left: 0; - height: 100%; - width: 100%; + display: none; + position: fixed; + cursor: pointer; + top: 0; + left: 0; + height: 100%; + width: 100%; } #click-overlay.active { - display: block; + display: block; } + /* SIDEBAR */ #sidebar { - position: fixed; - left: 0; - width: 20%; -} -#sidebar .action { - width: 100%; - display: block; - border-radius: 0; - font-size: 1.1em; - padding: .5em; + position: fixed; + left: 0; + width: 20%; } -#sidebar .action > * { - vertical-align: middle; +#sidebar .action { + width: 100%; + display: block; + border-radius: 0; + font-size: 1.1em; + padding: .5em; +} + +#sidebar .action>* { + vertical-align: middle; } main { - width: 78%; - margin-left: 20%; + width: 78%; + margin-left: 20%; } @@ -413,13 +410,13 @@ main { * * * * * * * * * * * * * * * */ #top-bar { - height: 4em; + height: 4em; } -#top-bar svg { - height: 2.5em; - margin-right: 1em; - vertical-align: middle; +#top-bar svg { + height: 2.5em; + margin-right: 1em; + vertical-align: middle; } @@ -428,128 +425,128 @@ main { * * * * * * * * * * * * * * * */ #search { - position: relative; - display: flex; - height: 100%; - padding: 0.75em; - vertical-align: middle; - border-radius: 0.3em; - background-color: #f5f5f5; - transition: .1s ease all; - width: 100%; - max-width: 25em; + position: relative; + display: flex; + height: 100%; + padding: 0.75em; + vertical-align: middle; + border-radius: 0.3em; + background-color: #f5f5f5; + transition: .1s ease all; + width: 100%; + max-width: 25em; } #search.active { - background-color: #fff; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); + background-color: #fff; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); } #search.active i, #search.active input { - color: #212121; + color: #212121; } #search i, #search input { - vertical-align: middle; + vertical-align: middle; } #search i { - margin-right: 0.3em; - user-select: none; + margin-right: 0.3em; + user-select: none; } #search input { - width: 100%; - border: 0; - outline: 0; - background-color: transparent; + width: 100%; + border: 0; + outline: 0; + background-color: transparent; } #search.active div { - visibility: visible; - opacity: 1; - top: 100%; + visibility: visible; + opacity: 1; + top: 100%; } #search ul { - padding: 0; - margin: 0; - list-style: none; + padding: 0; + margin: 0; + list-style: none; } #search li { - margin-bottom: .5em; + margin-bottom: .5em; } #search>div { - position: absolute; - top: 0; - width: 100%; - left: 0; - z-index: 999999; - background-color: #fff; - text-align: left; - color: #ccc; - box-shadow: 0 2px 3px rgba(0, 0, 0, .06), 0 2px 2px rgba(0, 0, 0, .12); - padding: .5em; - border-bottom-left-radius: .3em; - border-bottom-right-radius: .3em; - transition: .1s ease all; - visibility: hidden; - opacity: 0; - overflow-x: hidden; - overflow-y: auto; - max-height: 50vh; + position: absolute; + top: 0; + width: 100%; + left: 0; + z-index: 999999; + background-color: #fff; + text-align: left; + color: #ccc; + box-shadow: 0 2px 3px rgba(0, 0, 0, .06), 0 2px 2px rgba(0, 0, 0, .12); + padding: .5em; + border-bottom-left-radius: .3em; + border-bottom-right-radius: .3em; + transition: .1s ease all; + visibility: hidden; + opacity: 0; + overflow-x: hidden; + overflow-y: auto; + max-height: 50vh; } #search>div div { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; } #search>div p { - width: 100%; - text-align: center; - display: none; - margin: 0; - max-width: none; + width: 100%; + text-align: center; + display: none; + margin: 0; + max-width: none; } #search.ongoing p { - display: block; + display: block; } #search.active div i, #sidebar #search.active div i { - color: #ccc; - text-align: center; - margin: 0 auto; - display: table; + color: #ccc; + text-align: center; + margin: 0 auto; + display: table; } #search::-webkit-input-placeholder { - color: rgba(255, 255, 255, .5); + color: rgba(255, 255, 255, .5); } #search:-moz-placeholder { - opacity: 1; - color: rgba(255, 255, 255, .5); + opacity: 1; + color: rgba(255, 255, 255, .5); } #search::-moz-placeholder { - opacity: 1; - color: rgba(255, 255, 255, .5); + opacity: 1; + color: rgba(255, 255, 255, .5); } #search:-ms-input-placeholder { - color: rgba(255, 255, 255, .5); + color: rgba(255, 255, 255, .5); } @@ -558,58 +555,58 @@ main { * * * * * * * * * * * * * * * */ #bottom-bar { - border-top: 1px solid rgba(0, 0, 0, 0.075); - height: 3.8em; + border-top: 1px solid rgba(0, 0, 0, 0.075); + height: 3.8em; } #bottom-bar>div:first-child>* { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } #bottom-bar>div:first-child>i { - margin-right: .3em; + margin-right: .3em; } #bottom-bar>*:first-child { - margin-right: auto; - max-width: calc(100% - 25em); - width: 100%; + margin-right: auto; + max-width: calc(100% - 25em); + width: 100%; } #bottom-bar p { - text-overflow: ellipsis; - overflow: hidden; - width: calc(100% - 3em); - white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + width: calc(100% - 3em); + white-space: nowrap; } #more { - display: none; + display: none; } #file-only { - display: inline-block; - border-right: 1px solid rgba(0, 0, 0, 0.075); - padding-right: .3em; - margin-right: .3em; - transition: .2s ease opacity, visibility; - visibility: visible; + display: inline-block; + border-right: 1px solid rgba(0, 0, 0, 0.075); + padding-right: .3em; + margin-right: .3em; + transition: .2s ease opacity, visibility; + visibility: visible; } #file-only.disabled { - opacity: 0; - visibility: hidden; + opacity: 0; + visibility: hidden; } #download ul.active { - top: 0; - right: 0; + top: 0; + right: 0; } #more ul.active { - right: .5em; - top: 4.5em; + right: .5em; + top: 4.5em; } @@ -618,534 +615,6 @@ main { * * * * * * * * * * * * * * * */ .dropdown { - position: fixed; - top: -100%; - right: -100%; - visibility: hidden; - display: flex; - flex-direction: column; - border-radius: .1em; - border-top-left-radius: 0; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - background: #fff; - z-index: 9999999; -} - -.dropdown.active { - visibility: visible; -} - -.dropdown .action { - padding: .7em; -} - -.dropdown i { - padding: 0; - vertical-align: middle; -} - -.dropdown span { - display: inline-block; - margin-left: .5em; - font-size: .9em; -} - - -/* * * * * * * * * * * * * * * * - * BREADCRUMBS * - * * * * * * * * * * * * * * * */ - -#previous { - margin-left: -.5em; -} - -#breadcrumbs { - min-width: 7em; -} - -#breadcrumbs.active { - top: 0; - left: 0; - right: auto; -} - - -/* * * * * * * * * * * * * * * * - * LISTING * - * * * * * * * * * * * * * * * */ - -#listing { - max-width: calc(100% - 1.2em); - width: 100%; -} - -#listing h2 { - margin: 0 0 0 0.5em; - font-size: .9em; - color: rgba(0, 0, 0, 0.38); - font-weight: 500; -} - -#listing .item div:last-of-type * { - text-overflow: ellipsis; - overflow: hidden; -} - -#listing>div { - display: flex; - padding: 0; - flex-wrap: wrap; - justify-content: flex-start; - position: relative; -} - -#listing .item { - background-color: #fff; - position: relative; - display: flex; - flex-wrap: nowrap; - color: #6f6f6f; - transition: .1s ease all; - align-items: center; - cursor: pointer; -} - -#listing .item div:last-of-type { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -#listing .item p { - margin: 0; -} - -#listing .item .size, -#listing .item .modified { - font-size: 0.9em; -} - -#listing .item .name { - font-weight: bold; -} - -#listing .item i { - font-size: 4em; - margin-right: 0.1em; - vertical-align: bottom; -} - -#listing h2.message, -.message { - text-align: center; - font-size: 3em; - margin: 1em auto; - display: block !important; - width: 95%; - color: rgba(0, 0, 0, 0.2); - font-weight: 500; -} - -.message i { - font-size: inherit; - vertical-align: middle; -} - - -/* * * * * * * * * * * * * * * * - * LISTING - MOSAIC * - * * * * * * * * * * * * * * * */ - -#listing.mosaic { - margin-top: 1em; -} - -#listing.mosaic .item { - width: calc(33% - 1em); - margin: .5em; - padding: 0.5em; - border-radius: 0.2em; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); -} - -#listing.mosaic .item:hover { - box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; -} - -#listing.mosaic .header { - display: none; -} - -#listing.mosaic .item div:first-of-type { - width: 5em; -} - -#listing.mosaic .item div:last-of-type { - width: calc(100% - 5vw); -} - - -/* * * * * * * * * * * * * * * * - * LISTING - DETAIL * - * * * * * * * * * * * * * * * */ - -#listing.list { - flex-direction: column; - padding-top: 3.25em; - width: 100%; - max-width: 100%; - margin: 0; -} - -#listing.list .item { - width: 100%; - margin: 0; - border: 1px solid rgba(0, 0, 0, 0.1); - padding: 1em; - border-top: 0; -} - -#listing.list h2 { - display: none; -} - -#listing .item[aria-selected=true] { - background: #2196f3 !important; - color: #fff !important; -} - -#listing.list .item div:first-of-type { - width: 3em; -} - -#listing.list .item div:first-of-type i { - font-size: 2em; -} - -#listing.list .item div:last-of-type { - width: calc(100% - 3em); - display: flex; - align-items: center; -} - -#listing.list .item .name { - width: 50%; -} - -#listing.list .item .size { - width: 25%; -} - -#listing .item.header { - display: none !important; - background-color: #ccc; -} - -#listing.list .header i { - font-size: 1.5em; - vertical-align: middle; - margin-left: .2em; -} - -#listing.list .item.header { - display: flex !important; - background: #f8f8f8; - position: fixed; - width: 78%; - top: 7.8em; - left: 20%; - z-index: 999; - padding: .85em; - border: 0; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); -} - -#listing.list .item.header>div:first-child { - width: 0; -} - -#listing.list .item.header .name { - margin-right: 3em; -} - -#listing.list .header { - display: flex; - background: #fafafa; - position: fixed; - width: 100%; - top: 7.8em; - left: 0; - z-index: 999; -} - -#listing.list .header a { - color: inherit; -} - -#listing.list .item.header>div:first-child { - width: 0; -} - -#listing.list .name { - font-weight: normal; -} - -#listing.list .item.header .name { - margin-right: 3em; -} - -#listing.list .header span { - vertical-align: middle; -} - -#listing.list .header i { - opacity: 0; - transition: .1s ease all; -} - -#listing.list .header p:hover i, -#listing.list .header .active i { - opacity: 1; -} - -#listing.list .item.header .active { - font-weight: bold; -} - - -/* * * * * * * * * * * * * * * * - * MULTIPLE SELECTION DIALOG * - * * * * * * * * * * * * * * * */ - -#multiple-selection { - position: fixed; - bottom: -4em; - left: 0; - z-index: 99999999; - width: 100%; - background-color: #2196f3; - height: 4em; - display: flex !important; - padding: 0.5em 0.5em 0.5em 1em; - justify-content: space-between; - align-items: center; - transition: .2s ease all; -} - -#multiple-selection.active { - bottom: 0; -} - -#multiple-selection * { - margin: 0; -} - -#multiple-selection p, -#multiple-selection i { - color: #fff; -} - - -/* * * * * * * * * * * * * * * * - * PROMPT * - * * * * * * * * * * * * * * * */ - -.overlay, -.prompt, -.help { - opacity: 0; - z-index: -1; - transition: .1s ease opacity, z-index; -} - -.overlay.active, -.prompt.active, -.help.active { - z-index: 9999999; - opacity: 1; -} - -.overlay { - background-color: rgba(0, 0, 0, 0.5); - position: fixed; - top: 0; - left: 0; - height: 0; - width: 0; -} - -.overlay.active { - height: 100%; - width: 100%; -} - -.prompt, -.help { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 99999999; - background: #fff; - border: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - padding: 2em; - max-width: 25em; - width: 90%; - max-height: 95%; -} - -.prompt h3, -.help h3 { - margin: 0; - font-weight: 500; - font-size: 1.5em; -} - -.prompt p, -.help p { - font-size: .9em; - color: rgba(0, 0, 0, 0.8); - margin: .5em 0 1em; -} - -.prompt input { - width: 100%; - border: 1px solid #dadada; - line-height: 1; - padding: .3em; -} - -.prompt code { - word-wrap: break-word; -} - -.prompt div, -.help div { - margin-top: 1em; - display: flex; - justify-content: flex-start; - flex-direction: row-reverse; -} - -.prompt .cancel { - background-color: #ECEFF1; - color: #37474F; -} - -.prompt .cancel:hover { - background-color: #e9eaeb; -} - - -/* * * * * * * * * * * * * * * * - * PROMPT - MOVE * - * * * * * * * * * * * * * * * */ - -.prompt .file-list { - flex-direction: initial; - max-height: 50vh; - overflow: auto; -} - -.prompt .file-list ul { - list-style: none; - margin: 0; - padding: 0; - width: 100%; -} - -.prompt .file-list ul li { - width: 100%; - user-select: none; -} - -.prompt .file-list ul li[aria-selected=true] { - background: #2196f3 !important; - color: #fff !important; - transition: .1s ease all; -} - -.prompt .file-list ul li:hover { - background-color: #e9eaeb; - cursor: pointer; -} - -.prompt .file-list ul li:before { - content: "folder"; - color: #6f6f6f; - vertical-align: middle; - padding: 0 .25em; - line-height: 2em; -} - -.prompt .file-list ul li[aria-selected=true]:before { - color: white; -} - - -/* * * * * * * * * * * * * * * * - * HELP * - * * * * * * * * * * * * * * * */ - -.help { - max-width: 24em; - visibility: hidden; - top: -100%; - left: -100%; -} - -.help.active { - visibility: visible; - top: 50%; - left: 50%; -} - -.help ul { - padding: 0; - margin: 1em 0; - list-style: none; -} - - -/* * * * * * * * * * * * * * * * - * FOOTER * - * * * * * * * * * * * * * * * */ - -footer { - font-size: 0.6em; - margin: 2em 0 2em; - text-align: center; - color: grey; -} - -footer a, -footer a:hover { - color: inherit; -} - - -/* * * * * * * * * * * * * * * * - * MEDIA QUERIES * - * * * * * * * * * * * * * * * */ - -@media screen and (max-width: 850px) { - .frontmatter { - column-count: 2; - } -} - -@media screen and (max-width: 650px) { - body { - transition: .2s ease padding; - } - .mobile-only { - display: inherit !important; - } - #bottom-bar>*:first-child { - max-width: calc(100% - 16em) !important; - } - #main-actions { position: fixed; top: -100%; right: -100%; @@ -1157,49 +626,644 @@ footer a:hover { box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); background: #fff; z-index: 9999999; - } - #main-actions.active { - right: .5em; - top: 4.5em; +} + +.dropdown.active { visibility: visible; - } - #main-actions .action { +} + +.dropdown .action { padding: .7em; - border-radius: 0; - align-items: center; - } - #main-actions .action:hover { - background-color: rgba(0, 0, 0, 0.04); - } - #main-actions i { +} + +.dropdown i { padding: 0; vertical-align: middle; - } - #main-actions .action:hover i { - padding: 0; - background-color: transparent; - } - #main-actions span { +} + +.dropdown span { display: inline-block; margin-left: .5em; font-size: .9em; - } - #listing.list .item .size, - #listing.list .item .modified { - display: none; - } - #listing.list .item .name { +} + + +/* * * * * * * * * * * * * * * * + * BREADCRUMBS * + * * * * * * * * * * * * * * * */ + +#previous { + margin-left: -.5em; +} + +#breadcrumbs { + min-width: 7em; +} + +#breadcrumbs.active { + top: 0; + left: 0; + right: auto; +} + + +/* * * * * * * * * * * * * * * * + * LISTING * + * * * * * * * * * * * * * * * */ + +#listing { + max-width: calc(100% - 1.2em); width: 100%; - } - .frontmatter { - column-count: 1; - } +} + +#listing h2 { + margin: 0 0 0 0.5em; + font-size: .9em; + color: rgba(0, 0, 0, 0.38); + font-weight: 500; +} + +#listing .item div:last-of-type * { + text-overflow: ellipsis; + overflow: hidden; +} + +#listing>div { + display: flex; + padding: 0; + flex-wrap: wrap; + justify-content: flex-start; + position: relative; +} + +#listing .item { + background-color: #fff; + position: relative; + display: flex; + flex-wrap: nowrap; + color: #6f6f6f; + transition: .1s ease all; + align-items: center; + cursor: pointer; +} + +#listing .item div:last-of-type { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +#listing .item p { + margin: 0; +} + +#listing .item .size, +#listing .item .modified { + font-size: 0.9em; +} + +#listing .item .name { + font-weight: bold; +} + +#listing .item i { + font-size: 4em; + margin-right: 0.1em; + vertical-align: bottom; +} + +#listing h2.message, +.message { + text-align: center; + font-size: 3em; + margin: 1em auto; + display: block !important; + width: 95%; + color: rgba(0, 0, 0, 0.3); + font-weight: 500; +} + +.message i { + font-size: inherit; + vertical-align: middle; +} + + +/* * * * * * * * * * * * * * * * + * LISTING - MOSAIC * + * * * * * * * * * * * * * * * */ + +#listing.mosaic { + margin-top: 1em; +} + +#listing.mosaic .item { + width: calc(33% - 1em); + margin: .5em; + padding: 0.5em; + border-radius: 0.2em; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#listing.mosaic .item:hover { + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; +} + +#listing.mosaic .header { + display: none; +} + +#listing.mosaic .item div:first-of-type { + width: 5em; +} + +#listing.mosaic .item div:last-of-type { + width: calc(100% - 5vw); +} + + +/* * * * * * * * * * * * * * * * + * LISTING - DETAIL * + * * * * * * * * * * * * * * * */ + +#listing.list { + flex-direction: column; + padding-top: 3.25em; + width: 100%; + max-width: 100%; + margin: 0; +} + +#listing.list .item { + width: 100%; + margin: 0; + border: 1px solid rgba(0, 0, 0, 0.1); + padding: 1em; + border-top: 0; +} + +#listing.list h2 { + display: none; +} + +#listing .item[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; +} + +#listing.list .item div:first-of-type { + width: 3em; +} + +#listing.list .item div:first-of-type i { + font-size: 2em; +} + +#listing.list .item div:last-of-type { + width: calc(100% - 3em); + display: flex; + align-items: center; +} + +#listing.list .item .name { + width: 50%; +} + +#listing.list .item .size { + width: 25%; +} + +#listing .item.header { + display: none !important; + background-color: #ccc; +} + +#listing.list .header i { + font-size: 1.5em; + vertical-align: middle; + margin-left: .2em; +} + +#listing.list .item.header { + display: flex !important; + background: #f8f8f8; + position: fixed; + width: 78%; + top: 7.8em; + left: 20%; + z-index: 999; + padding: .85em; + border: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header { + display: flex; + background: #fafafa; + position: fixed; + width: 100%; + top: 7.8em; + left: 0; + z-index: 999; +} + +#listing.list .header a { + color: inherit; +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .name { + font-weight: normal; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header span { + vertical-align: middle; +} + +#listing.list .header i { + opacity: 0; + transition: .1s ease all; +} + +#listing.list .header p:hover i, +#listing.list .header .active i { + opacity: 1; +} + +#listing.list .item.header .active { + font-weight: bold; +} + + +/* PREVIEWER */ + +#previewer { + background-color: rgba(0, 0, 0, 0.9); + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9999; + overflow: hidden; +} + +#previewer .bar { + width: 100%; + text-align: right; + display: flex; + padding: 0.5em 0.5em 0.5em 1em; + height: 3.7em; +} + +#previewer .action:first-of-type { + margin-right: auto; +} + +#previewer .action i { + color: #fff; +} + +#previewer .action:hover { + background-color: rgba(255, 255, 255, 0.3) +} + +#previewer .action span { + display: none; +} + +#previewer .preview { + margin: 2em auto 4em; + max-width: 80%; + text-align: center; + height: calc(100vh - 9.7em); +} + +#previewer .preview pre { + text-align: left; + overflow: auto; +} + +#previewer .preview pre, +#previewer .preview video, +#previewer .preview img { + /* max-height: 80vh; */ + height: 100%; + margin: 0; +} + +#previewer .pdf { + width: 100%; + height: 100%; +} + +#previewer h2.message { + color: rgba(255,255,255,0.5) +} + + +/* * * * * * * * * * * * * * * * + * MULTIPLE SELECTION DIALOG * + * * * * * * * * * * * * * * * */ + +#multiple-selection { + position: fixed; + bottom: -4em; + left: 0; + z-index: 99999999; + width: 100%; + background-color: #2196f3; + height: 4em; + display: flex !important; + padding: 0.5em 0.5em 0.5em 1em; + justify-content: space-between; + align-items: center; + transition: .2s ease all; +} + +#multiple-selection.active { + bottom: 0; +} + +#multiple-selection * { + margin: 0; +} + +#multiple-selection p, +#multiple-selection i { + color: #fff; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT * + * * * * * * * * * * * * * * * */ + +.overlay, +.prompt, +.help { + opacity: 0; + z-index: -1; + transition: .1s ease opacity, z-index; +} + +.overlay.active, +.prompt.active, +.help.active { + z-index: 9999999; + opacity: 1; +} + +.overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + top: 0; + left: 0; + height: 0; + width: 0; +} + +.overlay.active { + height: 100%; + width: 100%; +} + +.prompt, +.help { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 99999999; + background: #fff; + border: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + padding: 2em; + max-width: 25em; + width: 90%; + max-height: 95%; +} + +.prompt h3, +.help h3 { + margin: 0; + font-weight: 500; + font-size: 1.5em; +} + +.prompt p, +.help p { + font-size: .9em; + color: rgba(0, 0, 0, 0.8); + margin: .5em 0 1em; +} + +.prompt input { + width: 100%; + border: 1px solid #dadada; + line-height: 1; + padding: .3em; +} + +.prompt code { + word-wrap: break-word; +} + +.prompt div, +.help div { + margin-top: 1em; + display: flex; + justify-content: flex-start; + flex-direction: row-reverse; +} + +.prompt .cancel { + background-color: #ECEFF1; + color: #37474F; +} + +.prompt .cancel:hover { + background-color: #e9eaeb; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT - MOVE * + * * * * * * * * * * * * * * * */ + +.prompt .file-list { + flex-direction: initial; + max-height: 50vh; + overflow: auto; +} + +.prompt .file-list ul { + list-style: none; + margin: 0; + padding: 0; + width: 100%; +} + +.prompt .file-list ul li { + width: 100%; + user-select: none; +} + +.prompt .file-list ul li[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; + transition: .1s ease all; +} + +.prompt .file-list ul li:hover { + background-color: #e9eaeb; + cursor: pointer; +} + +.prompt .file-list ul li:before { + content: "folder"; + color: #6f6f6f; + vertical-align: middle; + padding: 0 .25em; + line-height: 2em; +} + +.prompt .file-list ul li[aria-selected=true]:before { + color: white; +} + + +/* * * * * * * * * * * * * * * * + * HELP * + * * * * * * * * * * * * * * * */ + +.help { + max-width: 24em; + visibility: hidden; + top: -100%; + left: -100%; +} + +.help.active { + visibility: visible; + top: 50%; + left: 50%; +} + +.help ul { + padding: 0; + margin: 1em 0; + list-style: none; +} + + +/* * * * * * * * * * * * * * * * + * FOOTER * + * * * * * * * * * * * * * * * */ + +footer { + font-size: 0.6em; + margin: 2em 0 2em; + text-align: center; + color: grey; +} + +footer a, +footer a:hover { + color: inherit; +} + + +/* * * * * * * * * * * * * * * * + * MEDIA QUERIES * + * * * * * * * * * * * * * * * */ + +@media screen and (max-width: 850px) { + .frontmatter { + column-count: 2; + } +} + +@media screen and (max-width: 650px) { + body { + transition: .2s ease padding; + } + .mobile-only { + display: inherit !important; + } + #bottom-bar>*:first-child { + max-width: calc(100% - 16em) !important; + } + #main-actions { + position: fixed; + top: -100%; + right: -100%; + visibility: hidden; + display: flex; + flex-direction: column; + border-radius: .1em; + border-top-left-radius: 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: #fff; + z-index: 9999999; + } + #main-actions.active { + right: .5em; + top: 4.5em; + visibility: visible; + } + #main-actions .action { + padding: .7em; + border-radius: 0; + align-items: center; + } + #main-actions .action:hover { + background-color: rgba(0, 0, 0, 0.04); + } + #main-actions i { + padding: 0; + vertical-align: middle; + } + #main-actions .action:hover i { + padding: 0; + background-color: transparent; + } + #main-actions span { + display: inline-block; + margin-left: .5em; + font-size: .9em; + } + #listing.list .item .size, + #listing.list .item .modified { + display: none; + } + #listing.list .item .name { + width: 100%; + } + .frontmatter { + column-count: 1; + } } @media screen and (max-width: 450px) { - #bottom-bar p { - display: none !important; - } + #bottom-bar p { + display: none !important; + } } @@ -1208,8 +1272,8 @@ footer a:hover { * * * * * * * * * * * * * * * */ @keyframes spin { - 100% { - -webkit-transform: rotate(-360deg); - transform: rotate(-360deg); - } -} + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } +} \ No newline at end of file diff --git a/_assets/js/app.js b/_assets/js/app.js new file mode 100644 index 00000000..ec233215 --- /dev/null +++ b/_assets/js/app.js @@ -0,0 +1,122 @@ +'use strict' + +var data = (window.data || window.alert('Something is wrong, please refresh!')) +var ssl = (window.location.protocol === 'https:') + +// Remove the last directory of an url +var removeLastDirectoryPartOf = function (url) { + var arr = url.split('/') + if (arr.pop() === '') { + arr.pop() + } + return (arr.join('/')) +} + +var search = new window.Vue({ + el: '#search', + data: { + hover: false, + focus: false, + scrollable: null, + box: null, + input: null + }, + mounted: function () { + this.scrollable = document.querySelector('#search > div') + this.box = document.querySelector('#search > div div') + this.input = document.querySelector('#search input') + this.reset() + }, + methods: { + reset: function () { + if (data.user.AllowCommands && data.user.Commands.length > 0) { + this.box.innerHTML = `Search or use one of your supported commands: ${data.user.Commands.join(", ")}.` + } else { + this.box.innerHTML = 'Type and press enter to search.' + } + }, + supported: function () { + let value = this.input.value + let pieces = value.split(' ') + + for (let i = 0; i < data.user.Commands.length; i++) { + if (pieces[0] === data.user.Commands[0]) { + return true + } + } + + return false + }, + click: function (event) { + event.currentTarget.classList.add('active') + this.$el.querySelector('input').focus() + }, + keyup: function (event) { + let el = event.currentTarget + + if (el.value.length === 0) { + this.reset() + return + } + + if (!this.supported() || !data.user.AllowCommands) { + this.box.innerHTML = 'Press enter to search.' + } else { + this.box.innerHTML = 'Press enter to execute.' + } + }, + submit: function (event) { + this.box.innerHTML = '' + this.$el.classList.add('ongoing') + + let url = window.location.host + window.location.pathname + + if (document.getElementById('editor')) { + url = removeLastDirectoryPartOf(url) + } + + let protocol = ssl ? 'wss:' : 'ws:' + + if (this.supported() && data.user.AllowCommands) { + let conn = new window.WebSocket(`${protocol}//${url}?command=true`) + + conn.onopen = () => { + conn.send(this.input.value) + } + + conn.onmessage = (event) => { + this.box.innerHTML = event.data + this.scrollable.scrollTop = this.scrollable.scrollHeight + } + + conn.onclose = (event) => { + this.$el.classList.remove('ongoing') + // TODO: if is listing! + // listing.reload() + } + + return + } + + this.box.innerHTML = '' + + let ul = this.box.querySelector('ul') + let conn = new window.WebSocket(`${protocol}//${url}?search=true`) + + conn.onopen = () => { + conn.send(this.input.value) + } + + conn.onmessage = (event) => { + ul.innerHTML += `
  • ${event.data}
  • ` + this.scrollable.scrollTop = this.scrollable.scrollHeight + } + + conn.onclose = () => { + this.$el.classList.remove('ongoing') + } + } + } +}) + +console.log(search) \ No newline at end of file diff --git a/_assets/js/common.js b/_assets/js/common_old.js similarity index 79% rename from _assets/js/common.js rename to _assets/js/common_old.js index b95d21c7..7ca05b74 100644 --- a/_assets/js/common.js +++ b/_assets/js/common_old.js @@ -1,7 +1,10 @@ 'use strict' +var data = (window.data || window.alert('Something is wrong, please refresh!')) + +/* var tempID = '_fm_internal_temporary_id' -var ssl = (window.location.protocol === 'https:') + var templates = {} var selectedItems = [] var overlay @@ -34,14 +37,6 @@ Document.prototype.getCookie = function (name) { return document.cookie.replace(re, '$1') } -// Remove the last directory of an url -var removeLastDirectoryPartOf = function (url) { - var arr = url.split('/') - if (arr.pop() === '') { - arr.pop() - } - return (arr.join('/')) -} function getCSSRule (rules) { for (let i = 0; i < rules.length; i++) { @@ -136,15 +131,15 @@ buttons.setDone = function (name, success = true) { var webdav = {} webdav.convertURL = function (url) { - return window.location.origin + url.replace(baseURL + '/', webdavURL + '/') + return window.location.origin + url.replace(data.baseURL + '/', data.webdavURL + '/') } webdav.move = function (oldLink, newLink) { return new Promise((resolve, reject) => { let request = new window.XMLHttpRequest() - let destination = newLink.replace(baseURL + '/', webdavURL + '/') + let destination = newLink.replace(data.baseURL + '/', data.webdavURL + '/') - destination = window.location.origin + destination.substring(prefixURL.length) + destination = window.location.origin + destination.substring(data.baseURL.length) request.open('MOVE', webdav.convertURL(oldLink), true) request.setRequestHeader('Destination', destination) @@ -276,7 +271,7 @@ var preventDefault = function (event) { function logoutEvent (event) { let request = new window.XMLHttpRequest() - request.open('GET', window.location.pathname, true, 'username', 'password') + request.open('GET', window.location.pathname, true, 'data.username', 'password') request.send() request.onreadystatechange = function () { if (request.readyState === 4) { @@ -439,132 +434,6 @@ function deleteEvent (event) { return false } -function resetSearchText () { - let box = document.querySelector('#search > div div') - - if (user.AllowCommands) { - box.innerHTML = `Search or use one of your supported commands: ${user.Commands.join(", ")}.` - } else { - box.innerHTML = 'Type and press enter to search.' - } -} - -function searchEvent (event) { - if (this.value.length === 0) { - resetSearchText() - return - } - - let value = this.value, - search = document.getElementById('search'), - scrollable = document.querySelector('#search > div'), - box = document.querySelector('#search > div div'), - pieces = value.split(' '), - supported = false - - user.Commands.forEach(function (cmd) { - if (cmd == pieces[0]) { - supported = true - } - }) - - if (!supported || !user.AllowCommands) { - box.innerHTML = 'Press enter to search.' - } else { - box.innerHTML = 'Press enter to execute.' - } - - if (event.keyCode === 13) { - box.innerHTML = '' - search.classList.add('ongoing') - - let url = window.location.host + window.location.pathname - - if (document.getElementById('editor')) { - url = removeLastDirectoryPartOf(url) - } - - let protocol = ssl ? 'wss:' : 'ws:' - - if (supported && user.AllowCommands) { - let conn = new window.WebSocket(`${protocol}//${url}?command=true`) - - conn.onopen = function () { - conn.send(value) - } - - conn.onmessage = function (event) { - box.innerHTML = event.data - scrollable.scrollTop = scrollable.scrollHeight - } - - conn.onclose = function (event) { - search.classList.remove('ongoing') - listing.reload() - } - - return - } - - box.innerHTML = '' - - let ul = box.querySelector('ul') - let conn = new window.WebSocket(`${protocol}//${url}?search=true`) - - conn.onopen = function () { - conn.send(value) - } - - conn.onmessage = function (event) { - ul.innerHTML += '
  • ' + event.data + '
  • ' - scrollable.scrollTop = scrollable.scrollHeight - } - - conn.onclose = function (event) { - search.classList.remove('ongoing') - } - } -} - -function setupSearch () { - let search = document.getElementById('search') - let searchInput = search.querySelector('input') - let searchDiv = search.querySelector('div') - let hover = false - let focus = false - - resetSearchText() - - searchInput.addEventListener('focus', event => { - focus = true - search.classList.add('active') - }) - - searchDiv.addEventListener('mouseover', event => { - hover = true - search.classList.add('active') - }) - - searchInput.addEventListener('blur', event => { - focus = false - if (hover) return - search.classList.remove('active') - }) - - search.addEventListener('mouseleave', event => { - hover = false - if (focus) return - search.classList.remove('active') - }) - - search.addEventListener('click', event => { - search.classList.add('active') - search.querySelector('input').focus() - }) - - searchInput.addEventListener('keyup', searchEvent) -} - function closeHelp (event) { event.preventDefault() @@ -620,7 +489,7 @@ document.addEventListener('DOMContentLoaded', function (event) { templates.message = document.querySelector('#message-template') templates.move = document.querySelector('#move-template') - if (user.AllowEdit) { + if (data.user.AllowEdit) { buttons.delete.addEventListener('click', deleteEvent) } diff --git a/_assets/js/vue.js b/_assets/js/vue.js new file mode 100644 index 00000000..510e4b56 --- /dev/null +++ b/_assets/js/vue.js @@ -0,0 +1,9613 @@ +/*! + * Vue.js v2.3.0 + * (c) 2014-2017 Evan You + * Released under the MIT License. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.Vue = factory()); +}(this, (function () { 'use strict'; + +/* */ + +// these helpers produces better vm code in JS engines due to their +// explicitness and function inlining +function isUndef (v) { + return v === undefined || v === null +} + +function isDef (v) { + return v !== undefined && v !== null +} + +function isTrue (v) { + return v === true +} + +/** + * Check if value is primitive + */ +function isPrimitive (value) { + return typeof value === 'string' || typeof value === 'number' +} + +/** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ +function isObject (obj) { + return obj !== null && typeof obj === 'object' +} + +var toString = Object.prototype.toString; + +/** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ +function isPlainObject (obj) { + return toString.call(obj) === '[object Object]' +} + +function isRegExp (v) { + return toString.call(v) === '[object RegExp]' +} + +/** + * Convert a value to a string that is actually rendered. + */ +function _toString (val) { + return val == null + ? '' + : typeof val === 'object' + ? JSON.stringify(val, null, 2) + : String(val) +} + +/** + * Convert a input value to a number for persistence. + * If the conversion fails, return original string. + */ +function toNumber (val) { + var n = parseFloat(val); + return isNaN(n) ? val : n +} + +/** + * Make a map and return a function for checking if a key + * is in that map. + */ +function makeMap ( + str, + expectsLowerCase +) { + var map = Object.create(null); + var list = str.split(','); + for (var i = 0; i < list.length; i++) { + map[list[i]] = true; + } + return expectsLowerCase + ? function (val) { return map[val.toLowerCase()]; } + : function (val) { return map[val]; } +} + +/** + * Check if a tag is a built-in tag. + */ +var isBuiltInTag = makeMap('slot,component', true); + +/** + * Remove an item from an array + */ +function remove (arr, item) { + if (arr.length) { + var index = arr.indexOf(item); + if (index > -1) { + return arr.splice(index, 1) + } + } +} + +/** + * Check whether the object has the property. + */ +var hasOwnProperty = Object.prototype.hasOwnProperty; +function hasOwn (obj, key) { + return hasOwnProperty.call(obj, key) +} + +/** + * Create a cached version of a pure function. + */ +function cached (fn) { + var cache = Object.create(null); + return (function cachedFn (str) { + var hit = cache[str]; + return hit || (cache[str] = fn(str)) + }) +} + +/** + * Camelize a hyphen-delimited string. + */ +var camelizeRE = /-(\w)/g; +var camelize = cached(function (str) { + return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) +}); + +/** + * Capitalize a string. + */ +var capitalize = cached(function (str) { + return str.charAt(0).toUpperCase() + str.slice(1) +}); + +/** + * Hyphenate a camelCase string. + */ +var hyphenateRE = /([^-])([A-Z])/g; +var hyphenate = cached(function (str) { + return str + .replace(hyphenateRE, '$1-$2') + .replace(hyphenateRE, '$1-$2') + .toLowerCase() +}); + +/** + * Simple bind, faster than native + */ +function bind (fn, ctx) { + function boundFn (a) { + var l = arguments.length; + return l + ? l > 1 + ? fn.apply(ctx, arguments) + : fn.call(ctx, a) + : fn.call(ctx) + } + // record original fn length + boundFn._length = fn.length; + return boundFn +} + +/** + * Convert an Array-like object to a real Array. + */ +function toArray (list, start) { + start = start || 0; + var i = list.length - start; + var ret = new Array(i); + while (i--) { + ret[i] = list[i + start]; + } + return ret +} + +/** + * Mix properties into target object. + */ +function extend (to, _from) { + for (var key in _from) { + to[key] = _from[key]; + } + return to +} + +/** + * Merge an Array of Objects into a single Object. + */ +function toObject (arr) { + var res = {}; + for (var i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); + } + } + return res +} + +/** + * Perform no operation. + */ +function noop () {} + +/** + * Always return false. + */ +var no = function () { return false; }; + +/** + * Return same value + */ +var identity = function (_) { return _; }; + +/** + * Generate a static keys string from compiler modules. + */ +function genStaticKeys (modules) { + return modules.reduce(function (keys, m) { + return keys.concat(m.staticKeys || []) + }, []).join(',') +} + +/** + * Check if two values are loosely equal - that is, + * if they are plain objects, do they have the same shape? + */ +function looseEqual (a, b) { + var isObjectA = isObject(a); + var isObjectB = isObject(b); + if (isObjectA && isObjectB) { + try { + return JSON.stringify(a) === JSON.stringify(b) + } catch (e) { + // possible circular reference + return a === b + } + } else if (!isObjectA && !isObjectB) { + return String(a) === String(b) + } else { + return false + } +} + +function looseIndexOf (arr, val) { + for (var i = 0; i < arr.length; i++) { + if (looseEqual(arr[i], val)) { return i } + } + return -1 +} + +/** + * Ensure a function is called only once. + */ +function once (fn) { + var called = false; + return function () { + if (!called) { + called = true; + fn.apply(this, arguments); + } + } +} + +var SSR_ATTR = 'data-server-rendered'; + +var ASSET_TYPES = [ + 'component', + 'directive', + 'filter' +]; + +var LIFECYCLE_HOOKS = [ + 'beforeCreate', + 'created', + 'beforeMount', + 'mounted', + 'beforeUpdate', + 'updated', + 'beforeDestroy', + 'destroyed', + 'activated', + 'deactivated' +]; + +/* */ + +var config = ({ + /** + * Option merge strategies (used in core/util/options) + */ + optionMergeStrategies: Object.create(null), + + /** + * Whether to suppress warnings. + */ + silent: false, + + /** + * Show production mode tip message on boot? + */ + productionTip: "development" !== 'production', + + /** + * Whether to enable devtools + */ + devtools: "development" !== 'production', + + /** + * Whether to record perf + */ + performance: false, + + /** + * Error handler for watcher errors + */ + errorHandler: null, + + /** + * Ignore certain custom elements + */ + ignoredElements: [], + + /** + * Custom user key aliases for v-on + */ + keyCodes: Object.create(null), + + /** + * Check if a tag is reserved so that it cannot be registered as a + * component. This is platform-dependent and may be overwritten. + */ + isReservedTag: no, + + /** + * Check if an attribute is reserved so that it cannot be used as a component + * prop. This is platform-dependent and may be overwritten. + */ + isReservedAttr: no, + + /** + * Check if a tag is an unknown element. + * Platform-dependent. + */ + isUnknownElement: no, + + /** + * Get the namespace of an element + */ + getTagNamespace: noop, + + /** + * Parse the real tag name for the specific platform. + */ + parsePlatformTagName: identity, + + /** + * Check if an attribute must be bound using property, e.g. value + * Platform-dependent. + */ + mustUseProp: no, + + /** + * Exposed for legacy reasons + */ + _lifecycleHooks: LIFECYCLE_HOOKS +}); + +/* */ + +var emptyObject = Object.freeze({}); + +/** + * Check if a string starts with $ or _ + */ +function isReserved (str) { + var c = (str + '').charCodeAt(0); + return c === 0x24 || c === 0x5F +} + +/** + * Define a property. + */ +function def (obj, key, val, enumerable) { + Object.defineProperty(obj, key, { + value: val, + enumerable: !!enumerable, + writable: true, + configurable: true + }); +} + +/** + * Parse simple path. + */ +var bailRE = /[^\w.$]/; +function parsePath (path) { + if (bailRE.test(path)) { + return + } + var segments = path.split('.'); + return function (obj) { + for (var i = 0; i < segments.length; i++) { + if (!obj) { return } + obj = obj[segments[i]]; + } + return obj + } +} + +var warn = noop; +var tip = noop; +var formatComponentName; + +{ + var hasConsole = typeof console !== 'undefined'; + var classifyRE = /(?:^|[-_])(\w)/g; + var classify = function (str) { return str + .replace(classifyRE, function (c) { return c.toUpperCase(); }) + .replace(/[-_]/g, ''); }; + + warn = function (msg, vm) { + if (hasConsole && (!config.silent)) { + console.error("[Vue warn]: " + msg + ( + vm ? generateComponentTrace(vm) : '' + )); + } + }; + + tip = function (msg, vm) { + if (hasConsole && (!config.silent)) { + console.warn("[Vue tip]: " + msg + ( + vm ? generateComponentTrace(vm) : '' + )); + } + }; + + formatComponentName = function (vm, includeFile) { + if (vm.$root === vm) { + return '' + } + var name = typeof vm === 'string' + ? vm + : typeof vm === 'function' && vm.options + ? vm.options.name + : vm._isVue + ? vm.$options.name || vm.$options._componentTag + : vm.name; + + var file = vm._isVue && vm.$options.__file; + if (!name && file) { + var match = file.match(/([^/\\]+)\.vue$/); + name = match && match[1]; + } + + return ( + (name ? ("<" + (classify(name)) + ">") : "") + + (file && includeFile !== false ? (" at " + file) : '') + ) + }; + + var repeat = function (str, n) { + var res = ''; + while (n) { + if (n % 2 === 1) { res += str; } + if (n > 1) { str += str; } + n >>= 1; + } + return res + }; + + var generateComponentTrace = function (vm) { + if (vm._isVue && vm.$parent) { + var tree = []; + var currentRecursiveSequence = 0; + while (vm) { + if (tree.length > 0) { + var last = tree[tree.length - 1]; + if (last.constructor === vm.constructor) { + currentRecursiveSequence++; + vm = vm.$parent; + continue + } else if (currentRecursiveSequence > 0) { + tree[tree.length - 1] = [last, currentRecursiveSequence]; + currentRecursiveSequence = 0; + } + } + tree.push(vm); + vm = vm.$parent; + } + return '\n\nfound in\n\n' + tree + .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm) + ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)") + : formatComponentName(vm))); }) + .join('\n') + } else { + return ("\n\n(found in " + (formatComponentName(vm)) + ")") + } + }; +} + +function handleError (err, vm, info) { + if (config.errorHandler) { + config.errorHandler.call(null, err, vm, info); + } else { + { + warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm); + } + /* istanbul ignore else */ + if (inBrowser && typeof console !== 'undefined') { + console.error(err); + } else { + throw err + } + } +} + +/* */ +/* globals MutationObserver */ + +// can we use __proto__? +var hasProto = '__proto__' in {}; + +// Browser environment sniffing +var inBrowser = typeof window !== 'undefined'; +var UA = inBrowser && window.navigator.userAgent.toLowerCase(); +var isIE = UA && /msie|trident/.test(UA); +var isIE9 = UA && UA.indexOf('msie 9.0') > 0; +var isEdge = UA && UA.indexOf('edge/') > 0; +var isAndroid = UA && UA.indexOf('android') > 0; +var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); +var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; + +var supportsPassive = false; +if (inBrowser) { + try { + var opts = {}; + Object.defineProperty(opts, 'passive', ({ + get: function get () { + /* istanbul ignore next */ + supportsPassive = true; + } + } )); // https://github.com/facebook/flow/issues/285 + window.addEventListener('test-passive', null, opts); + } catch (e) {} +} + +// this needs to be lazy-evaled because vue may be required before +// vue-server-renderer can set VUE_ENV +var _isServer; +var isServerRendering = function () { + if (_isServer === undefined) { + /* istanbul ignore if */ + if (!inBrowser && typeof global !== 'undefined') { + // detect presence of vue-server-renderer and avoid + // Webpack shimming the process + _isServer = global['process'].env.VUE_ENV === 'server'; + } else { + _isServer = false; + } + } + return _isServer +}; + +// detect devtools +var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + +/* istanbul ignore next */ +function isNative (Ctor) { + return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) +} + +var hasSymbol = + typeof Symbol !== 'undefined' && isNative(Symbol) && + typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); + +/** + * Defer a task to execute it asynchronously. + */ +var nextTick = (function () { + var callbacks = []; + var pending = false; + var timerFunc; + + function nextTickHandler () { + pending = false; + var copies = callbacks.slice(0); + callbacks.length = 0; + for (var i = 0; i < copies.length; i++) { + copies[i](); + } + } + + // the nextTick behavior leverages the microtask queue, which can be accessed + // via either native Promise.then or MutationObserver. + // MutationObserver has wider support, however it is seriously bugged in + // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It + // completely stops working after triggering a few times... so, if native + // Promise is available, we will use it: + /* istanbul ignore if */ + if (typeof Promise !== 'undefined' && isNative(Promise)) { + var p = Promise.resolve(); + var logError = function (err) { console.error(err); }; + timerFunc = function () { + p.then(nextTickHandler).catch(logError); + // in problematic UIWebViews, Promise.then doesn't completely break, but + // it can get stuck in a weird state where callbacks are pushed into the + // microtask queue but the queue isn't being flushed, until the browser + // needs to do some other work, e.g. handle a timer. Therefore we can + // "force" the microtask queue to be flushed by adding an empty timer. + if (isIOS) { setTimeout(noop); } + }; + } else if (typeof MutationObserver !== 'undefined' && ( + isNative(MutationObserver) || + // PhantomJS and iOS 7.x + MutationObserver.toString() === '[object MutationObserverConstructor]' + )) { + // use MutationObserver where native Promise is not available, + // e.g. PhantomJS IE11, iOS7, Android 4.4 + var counter = 1; + var observer = new MutationObserver(nextTickHandler); + var textNode = document.createTextNode(String(counter)); + observer.observe(textNode, { + characterData: true + }); + timerFunc = function () { + counter = (counter + 1) % 2; + textNode.data = String(counter); + }; + } else { + // fallback to setTimeout + /* istanbul ignore next */ + timerFunc = function () { + setTimeout(nextTickHandler, 0); + }; + } + + return function queueNextTick (cb, ctx) { + var _resolve; + callbacks.push(function () { + if (cb) { + try { + cb.call(ctx); + } catch (e) { + handleError(e, ctx, 'nextTick'); + } + } else if (_resolve) { + _resolve(ctx); + } + }); + if (!pending) { + pending = true; + timerFunc(); + } + if (!cb && typeof Promise !== 'undefined') { + return new Promise(function (resolve, reject) { + _resolve = resolve; + }) + } + } +})(); + +var _Set; +/* istanbul ignore if */ +if (typeof Set !== 'undefined' && isNative(Set)) { + // use native Set when available. + _Set = Set; +} else { + // a non-standard Set polyfill that only works with primitive keys. + _Set = (function () { + function Set () { + this.set = Object.create(null); + } + Set.prototype.has = function has (key) { + return this.set[key] === true + }; + Set.prototype.add = function add (key) { + this.set[key] = true; + }; + Set.prototype.clear = function clear () { + this.set = Object.create(null); + }; + + return Set; + }()); +} + +/* */ + + +var uid = 0; + +/** + * A dep is an observable that can have multiple + * directives subscribing to it. + */ +var Dep = function Dep () { + this.id = uid++; + this.subs = []; +}; + +Dep.prototype.addSub = function addSub (sub) { + this.subs.push(sub); +}; + +Dep.prototype.removeSub = function removeSub (sub) { + remove(this.subs, sub); +}; + +Dep.prototype.depend = function depend () { + if (Dep.target) { + Dep.target.addDep(this); + } +}; + +Dep.prototype.notify = function notify () { + // stabilize the subscriber list first + var subs = this.subs.slice(); + for (var i = 0, l = subs.length; i < l; i++) { + subs[i].update(); + } +}; + +// the current target watcher being evaluated. +// this is globally unique because there could be only one +// watcher being evaluated at any time. +Dep.target = null; +var targetStack = []; + +function pushTarget (_target) { + if (Dep.target) { targetStack.push(Dep.target); } + Dep.target = _target; +} + +function popTarget () { + Dep.target = targetStack.pop(); +} + +/* + * not type checking this file because flow doesn't play well with + * dynamically accessing methods on Array prototype + */ + +var arrayProto = Array.prototype; +var arrayMethods = Object.create(arrayProto);[ + 'push', + 'pop', + 'shift', + 'unshift', + 'splice', + 'sort', + 'reverse' +] +.forEach(function (method) { + // cache original method + var original = arrayProto[method]; + def(arrayMethods, method, function mutator () { + var arguments$1 = arguments; + + // avoid leaking arguments: + // http://jsperf.com/closure-with-arguments + var i = arguments.length; + var args = new Array(i); + while (i--) { + args[i] = arguments$1[i]; + } + var result = original.apply(this, args); + var ob = this.__ob__; + var inserted; + switch (method) { + case 'push': + inserted = args; + break + case 'unshift': + inserted = args; + break + case 'splice': + inserted = args.slice(2); + break + } + if (inserted) { ob.observeArray(inserted); } + // notify change + ob.dep.notify(); + return result + }); +}); + +/* */ + +var arrayKeys = Object.getOwnPropertyNames(arrayMethods); + +/** + * By default, when a reactive property is set, the new value is + * also converted to become reactive. However when passing down props, + * we don't want to force conversion because the value may be a nested value + * under a frozen data structure. Converting it would defeat the optimization. + */ +var observerState = { + shouldConvert: true, + isSettingProps: false +}; + +/** + * Observer class that are attached to each observed + * object. Once attached, the observer converts target + * object's property keys into getter/setters that + * collect dependencies and dispatches updates. + */ +var Observer = function Observer (value) { + this.value = value; + this.dep = new Dep(); + this.vmCount = 0; + def(value, '__ob__', this); + if (Array.isArray(value)) { + var augment = hasProto + ? protoAugment + : copyAugment; + augment(value, arrayMethods, arrayKeys); + this.observeArray(value); + } else { + this.walk(value); + } +}; + +/** + * Walk through each property and convert them into + * getter/setters. This method should only be called when + * value type is Object. + */ +Observer.prototype.walk = function walk (obj) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length; i++) { + defineReactive$$1(obj, keys[i], obj[keys[i]]); + } +}; + +/** + * Observe a list of Array items. + */ +Observer.prototype.observeArray = function observeArray (items) { + for (var i = 0, l = items.length; i < l; i++) { + observe(items[i]); + } +}; + +// helpers + +/** + * Augment an target Object or Array by intercepting + * the prototype chain using __proto__ + */ +function protoAugment (target, src) { + /* eslint-disable no-proto */ + target.__proto__ = src; + /* eslint-enable no-proto */ +} + +/** + * Augment an target Object or Array by defining + * hidden properties. + */ +/* istanbul ignore next */ +function copyAugment (target, src, keys) { + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + def(target, key, src[key]); + } +} + +/** + * Attempt to create an observer instance for a value, + * returns the new observer if successfully observed, + * or the existing observer if the value already has one. + */ +function observe (value, asRootData) { + if (!isObject(value)) { + return + } + var ob; + if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { + ob = value.__ob__; + } else if ( + observerState.shouldConvert && + !isServerRendering() && + (Array.isArray(value) || isPlainObject(value)) && + Object.isExtensible(value) && + !value._isVue + ) { + ob = new Observer(value); + } + if (asRootData && ob) { + ob.vmCount++; + } + return ob +} + +/** + * Define a reactive property on an Object. + */ +function defineReactive$$1 ( + obj, + key, + val, + customSetter +) { + var dep = new Dep(); + + var property = Object.getOwnPropertyDescriptor(obj, key); + if (property && property.configurable === false) { + return + } + + // cater for pre-defined getter/setters + var getter = property && property.get; + var setter = property && property.set; + + var childOb = observe(val); + Object.defineProperty(obj, key, { + enumerable: true, + configurable: true, + get: function reactiveGetter () { + var value = getter ? getter.call(obj) : val; + if (Dep.target) { + dep.depend(); + if (childOb) { + childOb.dep.depend(); + } + if (Array.isArray(value)) { + dependArray(value); + } + } + return value + }, + set: function reactiveSetter (newVal) { + var value = getter ? getter.call(obj) : val; + /* eslint-disable no-self-compare */ + if (newVal === value || (newVal !== newVal && value !== value)) { + return + } + /* eslint-enable no-self-compare */ + if ("development" !== 'production' && customSetter) { + customSetter(); + } + if (setter) { + setter.call(obj, newVal); + } else { + val = newVal; + } + childOb = observe(newVal); + dep.notify(); + } + }); +} + +/** + * Set a property on an object. Adds the new property and + * triggers change notification if the property doesn't + * already exist. + */ +function set (target, key, val) { + if (Array.isArray(target) && typeof key === 'number') { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + return val + } + if (hasOwn(target, key)) { + target[key] = val; + return val + } + var ob = (target ).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + "development" !== 'production' && warn( + 'Avoid adding reactive properties to a Vue instance or its root $data ' + + 'at runtime - declare it upfront in the data option.' + ); + return val + } + if (!ob) { + target[key] = val; + return val + } + defineReactive$$1(ob.value, key, val); + ob.dep.notify(); + return val +} + +/** + * Delete a property and trigger change if necessary. + */ +function del (target, key) { + if (Array.isArray(target) && typeof key === 'number') { + target.splice(key, 1); + return + } + var ob = (target ).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + "development" !== 'production' && warn( + 'Avoid deleting properties on a Vue instance or its root $data ' + + '- just set it to null.' + ); + return + } + if (!hasOwn(target, key)) { + return + } + delete target[key]; + if (!ob) { + return + } + ob.dep.notify(); +} + +/** + * Collect dependencies on array elements when the array is touched, since + * we cannot intercept array element access like property getters. + */ +function dependArray (value) { + for (var e = (void 0), i = 0, l = value.length; i < l; i++) { + e = value[i]; + e && e.__ob__ && e.__ob__.dep.depend(); + if (Array.isArray(e)) { + dependArray(e); + } + } +} + +/* */ + +/** + * Option overwriting strategies are functions that handle + * how to merge a parent option value and a child option + * value into the final value. + */ +var strats = config.optionMergeStrategies; + +/** + * Options with restrictions + */ +{ + strats.el = strats.propsData = function (parent, child, vm, key) { + if (!vm) { + warn( + "option \"" + key + "\" can only be used during instance " + + 'creation with the `new` keyword.' + ); + } + return defaultStrat(parent, child) + }; +} + +/** + * Helper that recursively merges two data objects together. + */ +function mergeData (to, from) { + if (!from) { return to } + var key, toVal, fromVal; + var keys = Object.keys(from); + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + toVal = to[key]; + fromVal = from[key]; + if (!hasOwn(to, key)) { + set(to, key, fromVal); + } else if (isPlainObject(toVal) && isPlainObject(fromVal)) { + mergeData(toVal, fromVal); + } + } + return to +} + +/** + * Data + */ +strats.data = function ( + parentVal, + childVal, + vm +) { + if (!vm) { + // in a Vue.extend merge, both should be functions + if (!childVal) { + return parentVal + } + if (typeof childVal !== 'function') { + "development" !== 'production' && warn( + 'The "data" option should be a function ' + + 'that returns a per-instance value in component ' + + 'definitions.', + vm + ); + return parentVal + } + if (!parentVal) { + return childVal + } + // when parentVal & childVal are both present, + // we need to return a function that returns the + // merged result of both functions... no need to + // check if parentVal is a function here because + // it has to be a function to pass previous merges. + return function mergedDataFn () { + return mergeData( + childVal.call(this), + parentVal.call(this) + ) + } + } else if (parentVal || childVal) { + return function mergedInstanceDataFn () { + // instance merge + var instanceData = typeof childVal === 'function' + ? childVal.call(vm) + : childVal; + var defaultData = typeof parentVal === 'function' + ? parentVal.call(vm) + : undefined; + if (instanceData) { + return mergeData(instanceData, defaultData) + } else { + return defaultData + } + } + } +}; + +/** + * Hooks and props are merged as arrays. + */ +function mergeHook ( + parentVal, + childVal +) { + return childVal + ? parentVal + ? parentVal.concat(childVal) + : Array.isArray(childVal) + ? childVal + : [childVal] + : parentVal +} + +LIFECYCLE_HOOKS.forEach(function (hook) { + strats[hook] = mergeHook; +}); + +/** + * Assets + * + * When a vm is present (instance creation), we need to do + * a three-way merge between constructor options, instance + * options and parent options. + */ +function mergeAssets (parentVal, childVal) { + var res = Object.create(parentVal || null); + return childVal + ? extend(res, childVal) + : res +} + +ASSET_TYPES.forEach(function (type) { + strats[type + 's'] = mergeAssets; +}); + +/** + * Watchers. + * + * Watchers hashes should not overwrite one + * another, so we merge them as arrays. + */ +strats.watch = function (parentVal, childVal) { + /* istanbul ignore if */ + if (!childVal) { return Object.create(parentVal || null) } + if (!parentVal) { return childVal } + var ret = {}; + extend(ret, parentVal); + for (var key in childVal) { + var parent = ret[key]; + var child = childVal[key]; + if (parent && !Array.isArray(parent)) { + parent = [parent]; + } + ret[key] = parent + ? parent.concat(child) + : [child]; + } + return ret +}; + +/** + * Other object hashes. + */ +strats.props = +strats.methods = +strats.computed = function (parentVal, childVal) { + if (!childVal) { return Object.create(parentVal || null) } + if (!parentVal) { return childVal } + var ret = Object.create(null); + extend(ret, parentVal); + extend(ret, childVal); + return ret +}; + +/** + * Default strategy. + */ +var defaultStrat = function (parentVal, childVal) { + return childVal === undefined + ? parentVal + : childVal +}; + +/** + * Validate component names + */ +function checkComponents (options) { + for (var key in options.components) { + var lower = key.toLowerCase(); + if (isBuiltInTag(lower) || config.isReservedTag(lower)) { + warn( + 'Do not use built-in or reserved HTML elements as component ' + + 'id: ' + key + ); + } + } +} + +/** + * Ensure all props option syntax are normalized into the + * Object-based format. + */ +function normalizeProps (options) { + var props = options.props; + if (!props) { return } + var res = {}; + var i, val, name; + if (Array.isArray(props)) { + i = props.length; + while (i--) { + val = props[i]; + if (typeof val === 'string') { + name = camelize(val); + res[name] = { type: null }; + } else { + warn('props must be strings when using array syntax.'); + } + } + } else if (isPlainObject(props)) { + for (var key in props) { + val = props[key]; + name = camelize(key); + res[name] = isPlainObject(val) + ? val + : { type: val }; + } + } + options.props = res; +} + +/** + * Normalize raw function directives into object format. + */ +function normalizeDirectives (options) { + var dirs = options.directives; + if (dirs) { + for (var key in dirs) { + var def = dirs[key]; + if (typeof def === 'function') { + dirs[key] = { bind: def, update: def }; + } + } + } +} + +/** + * Merge two option objects into a new one. + * Core utility used in both instantiation and inheritance. + */ +function mergeOptions ( + parent, + child, + vm +) { + { + checkComponents(child); + } + + if (typeof child === 'function') { + child = child.options; + } + + normalizeProps(child); + normalizeDirectives(child); + var extendsFrom = child.extends; + if (extendsFrom) { + parent = mergeOptions(parent, extendsFrom, vm); + } + if (child.mixins) { + for (var i = 0, l = child.mixins.length; i < l; i++) { + parent = mergeOptions(parent, child.mixins[i], vm); + } + } + var options = {}; + var key; + for (key in parent) { + mergeField(key); + } + for (key in child) { + if (!hasOwn(parent, key)) { + mergeField(key); + } + } + function mergeField (key) { + var strat = strats[key] || defaultStrat; + options[key] = strat(parent[key], child[key], vm, key); + } + return options +} + +/** + * Resolve an asset. + * This function is used because child instances need access + * to assets defined in its ancestor chain. + */ +function resolveAsset ( + options, + type, + id, + warnMissing +) { + /* istanbul ignore if */ + if (typeof id !== 'string') { + return + } + var assets = options[type]; + // check local registration variations first + if (hasOwn(assets, id)) { return assets[id] } + var camelizedId = camelize(id); + if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } + var PascalCaseId = capitalize(camelizedId); + if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } + // fallback to prototype chain + var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; + if ("development" !== 'production' && warnMissing && !res) { + warn( + 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, + options + ); + } + return res +} + +/* */ + +function validateProp ( + key, + propOptions, + propsData, + vm +) { + var prop = propOptions[key]; + var absent = !hasOwn(propsData, key); + var value = propsData[key]; + // handle boolean props + if (isType(Boolean, prop.type)) { + if (absent && !hasOwn(prop, 'default')) { + value = false; + } else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) { + value = true; + } + } + // check default value + if (value === undefined) { + value = getPropDefaultValue(vm, prop, key); + // since the default value is a fresh copy, + // make sure to observe it. + var prevShouldConvert = observerState.shouldConvert; + observerState.shouldConvert = true; + observe(value); + observerState.shouldConvert = prevShouldConvert; + } + { + assertProp(prop, key, value, vm, absent); + } + return value +} + +/** + * Get the default value of a prop. + */ +function getPropDefaultValue (vm, prop, key) { + // no default, return undefined + if (!hasOwn(prop, 'default')) { + return undefined + } + var def = prop.default; + // warn against non-factory defaults for Object & Array + if ("development" !== 'production' && isObject(def)) { + warn( + 'Invalid default value for prop "' + key + '": ' + + 'Props with type Object/Array must use a factory function ' + + 'to return the default value.', + vm + ); + } + // the raw prop value was also undefined from previous render, + // return previous default value to avoid unnecessary watcher trigger + if (vm && vm.$options.propsData && + vm.$options.propsData[key] === undefined && + vm._props[key] !== undefined) { + return vm._props[key] + } + // call factory function for non-Function types + // a value is Function if its prototype is function even across different execution context + return typeof def === 'function' && getType(prop.type) !== 'Function' + ? def.call(vm) + : def +} + +/** + * Assert whether a prop is valid. + */ +function assertProp ( + prop, + name, + value, + vm, + absent +) { + if (prop.required && absent) { + warn( + 'Missing required prop: "' + name + '"', + vm + ); + return + } + if (value == null && !prop.required) { + return + } + var type = prop.type; + var valid = !type || type === true; + var expectedTypes = []; + if (type) { + if (!Array.isArray(type)) { + type = [type]; + } + for (var i = 0; i < type.length && !valid; i++) { + var assertedType = assertType(value, type[i]); + expectedTypes.push(assertedType.expectedType || ''); + valid = assertedType.valid; + } + } + if (!valid) { + warn( + 'Invalid prop: type check failed for prop "' + name + '".' + + ' Expected ' + expectedTypes.map(capitalize).join(', ') + + ', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.', + vm + ); + return + } + var validator = prop.validator; + if (validator) { + if (!validator(value)) { + warn( + 'Invalid prop: custom validator check failed for prop "' + name + '".', + vm + ); + } + } +} + +var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/; + +function assertType (value, type) { + var valid; + var expectedType = getType(type); + if (simpleCheckRE.test(expectedType)) { + valid = typeof value === expectedType.toLowerCase(); + } else if (expectedType === 'Object') { + valid = isPlainObject(value); + } else if (expectedType === 'Array') { + valid = Array.isArray(value); + } else { + valid = value instanceof type; + } + return { + valid: valid, + expectedType: expectedType + } +} + +/** + * Use function string name to check built-in types, + * because a simple equality check will fail when running + * across different vms / iframes. + */ +function getType (fn) { + var match = fn && fn.toString().match(/^\s*function (\w+)/); + return match ? match[1] : '' +} + +function isType (type, fn) { + if (!Array.isArray(fn)) { + return getType(fn) === getType(type) + } + for (var i = 0, len = fn.length; i < len; i++) { + if (getType(fn[i]) === getType(type)) { + return true + } + } + /* istanbul ignore next */ + return false +} + +var mark; +var measure; + +{ + var perf = inBrowser && window.performance; + /* istanbul ignore if */ + if ( + perf && + perf.mark && + perf.measure && + perf.clearMarks && + perf.clearMeasures + ) { + mark = function (tag) { return perf.mark(tag); }; + measure = function (name, startTag, endTag) { + perf.measure(name, startTag, endTag); + perf.clearMarks(startTag); + perf.clearMarks(endTag); + perf.clearMeasures(name); + }; + } +} + +/* not type checking this file because flow doesn't play well with Proxy */ + +var initProxy; + +{ + var allowedGlobals = makeMap( + 'Infinity,undefined,NaN,isFinite,isNaN,' + + 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + + 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + + 'require' // for Webpack/Browserify + ); + + var warnNonPresent = function (target, key) { + warn( + "Property or method \"" + key + "\" is not defined on the instance but " + + "referenced during render. Make sure to declare reactive data " + + "properties in the data option.", + target + ); + }; + + var hasProxy = + typeof Proxy !== 'undefined' && + Proxy.toString().match(/native code/); + + if (hasProxy) { + var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta'); + config.keyCodes = new Proxy(config.keyCodes, { + set: function set (target, key, value) { + if (isBuiltInModifier(key)) { + warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key)); + return false + } else { + target[key] = value; + return true + } + } + }); + } + + var hasHandler = { + has: function has (target, key) { + var has = key in target; + var isAllowed = allowedGlobals(key) || key.charAt(0) === '_'; + if (!has && !isAllowed) { + warnNonPresent(target, key); + } + return has || !isAllowed + } + }; + + var getHandler = { + get: function get (target, key) { + if (typeof key === 'string' && !(key in target)) { + warnNonPresent(target, key); + } + return target[key] + } + }; + + initProxy = function initProxy (vm) { + if (hasProxy) { + // determine which proxy handler to use + var options = vm.$options; + var handlers = options.render && options.render._withStripped + ? getHandler + : hasHandler; + vm._renderProxy = new Proxy(vm, handlers); + } else { + vm._renderProxy = vm; + } + }; +} + +/* */ + +var VNode = function VNode ( + tag, + data, + children, + text, + elm, + context, + componentOptions +) { + this.tag = tag; + this.data = data; + this.children = children; + this.text = text; + this.elm = elm; + this.ns = undefined; + this.context = context; + this.functionalContext = undefined; + this.key = data && data.key; + this.componentOptions = componentOptions; + this.componentInstance = undefined; + this.parent = undefined; + this.raw = false; + this.isStatic = false; + this.isRootInsert = true; + this.isComment = false; + this.isCloned = false; + this.isOnce = false; +}; + +var prototypeAccessors = { child: {} }; + +// DEPRECATED: alias for componentInstance for backwards compat. +/* istanbul ignore next */ +prototypeAccessors.child.get = function () { + return this.componentInstance +}; + +Object.defineProperties( VNode.prototype, prototypeAccessors ); + +var createEmptyVNode = function () { + var node = new VNode(); + node.text = ''; + node.isComment = true; + return node +}; + +function createTextVNode (val) { + return new VNode(undefined, undefined, undefined, String(val)) +} + +// optimized shallow clone +// used for static nodes and slot nodes because they may be reused across +// multiple renders, cloning them avoids errors when DOM manipulations rely +// on their elm reference. +function cloneVNode (vnode) { + var cloned = new VNode( + vnode.tag, + vnode.data, + vnode.children, + vnode.text, + vnode.elm, + vnode.context, + vnode.componentOptions + ); + cloned.ns = vnode.ns; + cloned.isStatic = vnode.isStatic; + cloned.key = vnode.key; + cloned.isCloned = true; + return cloned +} + +function cloneVNodes (vnodes) { + var len = vnodes.length; + var res = new Array(len); + for (var i = 0; i < len; i++) { + res[i] = cloneVNode(vnodes[i]); + } + return res +} + +/* */ + +var normalizeEvent = cached(function (name) { + var passive = name.charAt(0) === '&'; + name = passive ? name.slice(1) : name; + var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first + name = once$$1 ? name.slice(1) : name; + var capture = name.charAt(0) === '!'; + name = capture ? name.slice(1) : name; + return { + name: name, + once: once$$1, + capture: capture, + passive: passive + } +}); + +function createFnInvoker (fns) { + function invoker () { + var arguments$1 = arguments; + + var fns = invoker.fns; + if (Array.isArray(fns)) { + for (var i = 0; i < fns.length; i++) { + fns[i].apply(null, arguments$1); + } + } else { + // return handler return value for single handlers + return fns.apply(null, arguments) + } + } + invoker.fns = fns; + return invoker +} + +function updateListeners ( + on, + oldOn, + add, + remove$$1, + vm +) { + var name, cur, old, event; + for (name in on) { + cur = on[name]; + old = oldOn[name]; + event = normalizeEvent(name); + if (isUndef(cur)) { + "development" !== 'production' && warn( + "Invalid handler for event \"" + (event.name) + "\": got " + String(cur), + vm + ); + } else if (isUndef(old)) { + if (isUndef(cur.fns)) { + cur = on[name] = createFnInvoker(cur); + } + add(event.name, cur, event.once, event.capture, event.passive); + } else if (cur !== old) { + old.fns = cur; + on[name] = old; + } + } + for (name in oldOn) { + if (isUndef(on[name])) { + event = normalizeEvent(name); + remove$$1(event.name, oldOn[name], event.capture); + } + } +} + +/* */ + +function mergeVNodeHook (def, hookKey, hook) { + var invoker; + var oldHook = def[hookKey]; + + function wrappedHook () { + hook.apply(this, arguments); + // important: remove merged hook to ensure it's called only once + // and prevent memory leak + remove(invoker.fns, wrappedHook); + } + + if (isUndef(oldHook)) { + // no existing hook + invoker = createFnInvoker([wrappedHook]); + } else { + /* istanbul ignore if */ + if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { + // already a merged invoker + invoker = oldHook; + invoker.fns.push(wrappedHook); + } else { + // existing plain hook + invoker = createFnInvoker([oldHook, wrappedHook]); + } + } + + invoker.merged = true; + def[hookKey] = invoker; +} + +/* */ + +function extractPropsFromVNodeData ( + data, + Ctor, + tag +) { + // we are only extracting raw values here. + // validation and default values are handled in the child + // component itself. + var propOptions = Ctor.options.props; + if (isUndef(propOptions)) { + return + } + var res = {}; + var attrs = data.attrs; + var props = data.props; + if (isDef(attrs) || isDef(props)) { + for (var key in propOptions) { + var altKey = hyphenate(key); + { + var keyInLowerCase = key.toLowerCase(); + if ( + key !== keyInLowerCase && + attrs && hasOwn(attrs, keyInLowerCase) + ) { + tip( + "Prop \"" + keyInLowerCase + "\" is passed to component " + + (formatComponentName(tag || Ctor)) + ", but the declared prop name is" + + " \"" + key + "\". " + + "Note that HTML attributes are case-insensitive and camelCased " + + "props need to use their kebab-case equivalents when using in-DOM " + + "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"." + ); + } + } + checkProp(res, props, key, altKey, true) || + checkProp(res, attrs, key, altKey, false); + } + } + return res +} + +function checkProp ( + res, + hash, + key, + altKey, + preserve +) { + if (isDef(hash)) { + if (hasOwn(hash, key)) { + res[key] = hash[key]; + if (!preserve) { + delete hash[key]; + } + return true + } else if (hasOwn(hash, altKey)) { + res[key] = hash[altKey]; + if (!preserve) { + delete hash[altKey]; + } + return true + } + } + return false +} + +/* */ + +// The template compiler attempts to minimize the need for normalization by +// statically analyzing the template at compile time. +// +// For plain HTML markup, normalization can be completely skipped because the +// generated render function is guaranteed to return Array. There are +// two cases where extra normalization is needed: + +// 1. When the children contains components - because a functional component +// may return an Array instead of a single root. In this case, just a simple +// normalization is needed - if any child is an Array, we flatten the whole +// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep +// because functional components already normalize their own children. +function simpleNormalizeChildren (children) { + for (var i = 0; i < children.length; i++) { + if (Array.isArray(children[i])) { + return Array.prototype.concat.apply([], children) + } + } + return children +} + +// 2. When the children contains constructs that always generated nested Arrays, +// e.g.